https://wenku.baidu.com/view/b7eab761ddccda38376bafce.html
1.文档管理反应器
class ArxDocReactor:public AcApDocManagerReactor
{
public:
// Fired when a document is first instantiated no database is available.
virtual void documentCreateStarted(AcApDocument* pDocCreating);
// 当一个文档被成功创建时,就会被触发
virtual void documentCreated(AcApDocument* pDocCreating);
//文档被激活和它的上下文成功切换时触发这个反应器
virtual void documentActivated(AcApDocument* pActivatedDoc);
};
void ArxDocReactor::documentCreateStarted( AcApDocument* pDocCreating )
{
if (NULL == pDocCreating)
return;
CString strPath = pDocCreating->fileName();
}
void ArxDocReactor::documentCreated( AcApDocument* pDocCreating )
{
if (NULL == pDocCreating)
return;
CString strPath = pDocCreating->fileName();
if (strPath.IsEmpty())
return;
//后缀
CString strExt = strPath.Right(4).MakeLower();
if (_T(".dwg") != strExt && _T(".dxf") != strExt)
return;
//是否是总部打开dwg特殊处理
if (!CPowerLineLayCommand::IsLoadDwg())
return;
//Drawing1,Drawing2等,不是一个路径
int nFind = strPath.ReverseFind('\\');
if (-1 == nFind)
return ;
//如果是dxf,转成dwg
bool bSuc = false;
CString strDwgPath;
if (_T(".dxf") == strExt)
{
HHDxfToDwg(strPath,strDwgPath,bSuc);
if (bSuc && !strDwgPath.IsEmpty())
strPath = strDwgPath;
}
//处理png背景图
CAcModuleResourceOverride useThisRes;
CLoadDWGDrawingDlg dlg;
/*dlg.UpdatePngPath(pDocCreating->database(),strPath);*/
//获得dwg的标识
CString strId;
CQKQuery query(pDocCreating->database());
query.GetDictdata(_T("FLAG"),_T("XRecord"),strId);
if (strId.IsEmpty())
{
strId = GenGUID();
query.SetDictdata(_T("FLAG"),_T("XRecord"),strId);
}
//把dwg的标识以及路径保存到数据库
dlg.SavePathToDB(strPath,strId);
}
void ArxDocReactor::documentActivated(AcApDocument* pActivatedDoc)
{
CString sDatabasePath=pActivatedDoc->fileName();
sDatabasePath.Replace(_T(".dwg"),_T(""));
sDatabasePath.Replace(_T(".DWG"),_T(""));
CString strProName = _T("");
if (sDatabasePath.GetLength()-sDatabasePath.ReverseFind('\\')>1)
{
strProName = sDatabasePath.Right(sDatabasePath.GetLength()-sDatabasePath.ReverseFind('\\')-1);
}
CAdoRecordSet adoRecorset(CAppInitTools::GetGlobeDbConn());
CString strSql;
strSql.Format(_T("select ef_Id, ef_type from t_project where ef_name = '%s'"), strProName);
if(adoRecorset.Open(strSql)&&adoRecorset.GetRecordCount()>0)
{
CString strProId = _T("");
long nType(1);
adoRecorset.GetCollect(_T("ef_Id"),strProId);
adoRecorset.GetCollect(_T("ef_type"),nType);
adoRecorset.Close();
CDBQueryTools::SetProjectName(strProName);
CDBQueryTools::SetProjectID(strProId);
//判断工程类别
CSettingManager* pManager = ISettingManager::GetSettingManagerPtr();
if (pManager!=NULL)
{
pManager->LoadSetting();
}
}
else
{
CString strInfo=_T("无法获取工程当前工作线路.....");
if (CDBQueryTools::GetPdPro())
{
strInfo = _T("配电设计");
}
//CDBQueryTools::SetProjectName(g_strProName);
//CDBQueryTools::SetProjectID(g_strProId);
//无法加载设置,空白的
acedGetAcadFrame()->SetWindowText(strInfo);
}
AcDbDatabase* pDataBase = pActivatedDoc->database();
HHDevDlgPop(pDataBase);
//切换菜单
CString strId;
CQKQuery query(pDataBase);
query.GetDictdata(_T("FLAG"),_T("XRecord"),strId);
CAcModuleResourceOverride useThisRes;
CLoadDWGDrawingDlg dlg;
if (dlg.CheckIsLoad(strId))
CPowerLineLayCommand::HHSwitchCUITo(_T("线路设计"));
else
CPowerLineLayCommand::HHSwitchCUITo(_T("载入图纸"));
}
2.编译反应器
class ArxEditorReactor : public AcEditorReactor
{
public:
virtual void endDwgOpen(const char* filename);
//开始执行一个命令
virtual void commandWillStart(const ACHAR* cmdStr);
//命令结束后,执行另外一个命令等处理
virtual void commandEnded(const ACHAR *pCommand);
void commandCancelled(const ACHAR* cmdStr);
// 粘贴
virtual void endDeepClone(AcDbIdMapping& idMap);
//! 关闭dwg时删除数据库实实在在表EF_ISDEL为1的数据
virtual void databaseToBeDestroyed(AcDbDatabase* dwg);
}
void ArxEditorReactor::commandWillStart(const ACHAR* cmdStr)
{
//退出cad时,清空数据库的垃圾数据
if (_tcsicmp(cmdStr, _T("QUIT")) == 0)
{
CAdoRecordSet RecordSet(CAppInitTools::GetGlobeDbConn());
CString strSql;
strSql.Format(_T("SELECT EF_FLAGID FROM T_DWGDATAPATH WHERE EF_ISLOAD = 0"));
if (!RecordSet.Open(strSql))
return;
CString strId;
CLoadDWGDrawingDlg dlg;
for (; !RecordSet.IsEOF(); RecordSet.MoveNext())
{
RecordSet.GetCollect(_T("EF_FLAGID"), strId);
dlg.ClearDwgPathToId(strId);
}
RecordSet.Close();
}
if (_tcsicmp(cmdStr, _T("ERASE")) != 0)
return;
//delete后删除
}
void ArxEditorReactor::commandEnded(const ACHAR *pCommand)
{
__super::commandEnded(pCommand);
if (_tcsicmp(pCommand, _T("MOVE")) == 0)
{
//修改杆塔标注引线的连接位置
AcDbObjectIdArray idArr;
if (Acad::eOk != acedGetCurrentSelectionSet(idArr))
return;
COnDevMove devMove(acdbCurDwg());
for (int nIndex = 0; nIndex < idArr.length(); ++nIndex)
devMove.AfterDevMove(idArr[nIndex]);
}
//因工程简图命令需要切换当前文档,并同时使用cad的命令,所以将工程简图拆分为两个命令
else if (CString(_T("HHPJS")).CompareNoCase(pCommand) == 0)
acDocManager->sendStringToExecute(curDoc(), _T("\003\003HHPJSIS\n"));
//设计成果输出拆分为两个命令
else if (CString(_T("HHDRE")).CompareNoCase(pCommand) == 0)
acDocManager->sendStringToExecute(curDoc(), _T("\003\003HHDREFF\n"));
//江西版设计成果输出 执行完成后进行路径图分幅
else if (CString(_T("HHJXDRE")).CompareNoCase(pCommand) == 0)
acDocManager->sendStringToExecute(curDoc(), _T("\003\003HHJXDREFF\n"));
//旋转内框时,要处理扩展数据中的角度
if (_tcsicmp(pCommand, _T("ROTATE")) == 0)
{
AcDbObjectIdArray idArr;
if (Acad::eOk != acedGetCurrentSelectionSet(idArr))
return;
CQKQueryLayer mQkq(NULL);
mQkq.AddQuery(idArr, HH_NK_LN, XD_FRAME, HH_FRAME);
AcDbObjectIdArray arrInnerIds(mQkq.GetAllIds());
ModifyInnerFramAngle(arrInnerIds);
}
//首次启动软件后,判断数据库是否需要加密
CString strCommand(pCommand);
std::vector<CString> arrCommands;
arrCommands.push_back(_T("COMMANDLINE"));
for (int nIndex = 0; nIndex < (int)arrCommands.size(); ++nIndex)
{
if (strCommand.CompareNoCase(arrCommands[nIndex]) == 0)
{
//调用加密
CPowerLineLayCommand::EncryptDataBaseWithNotice();
break;
}
}
}