https://wenku.baidu.com/view/b7eab761ddccda38376bafce.htmlhtml
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.編譯反應器app
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; } } }