ObjectARX_反應器

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;
		}
	}
}
相關文章
相關標籤/搜索