ObjectARX_反应器

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;
		}
	}
}

 

转载于:https://my.oschina.net/u/2930533/blog/1576909

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值