CAD 4种反应器

本文详细介绍了CAD中的四种反应器:文档反应器、编辑器反应器和数据库反应器。文档反应器在用户命令输入时触发,编辑器反应器则在命令开始和结束时响应,数据库反应器在创建实体时执行。通过实现相应的虚函数并添加到反应器管理器中,可以监控和控制CAD操作。

CAD中4种反应器:按照执行的先后顺序分别为  文档反应器、编辑器反应器、数据库反应器。

文档反应器当用户输入命令和命令结束之时,文档反应器函数documentLockModeChanged(XXXXX, const char* pGlobalCmdName)函数将会被调用。

命令输入完成之后,pGlobalCmdName的值为该命令,命令结束之时pGlobalCmdName的值为#+该命令

用户可以在该函数中执行相关操作。

创建过程:第一步,新建一个类继承于AcApDocManagerReactor类,并在类中实现虚函数documentLockModeChanged。

                    第二部,在InitApplication中添加文档反应器,并用g_docReactor = new CMyDocReactor();  acDocManager->addReactor(g_docReactor);

                    第三部,在UnloadApplication中删除文档反应器,acDocManager->removeReactor(g_docReactor); delete g_docReactor;


编辑器反应器当执行用户命令之前和之后,分别会触发编辑器反应器函数commandWillStart(const char* cmdStr) commandEnded(const char* cmdStr)

创建过程:第一步,新建一个类继承于AcEditorReactor类,并在类中实现虚函数commandWillStart、commandEnded。

                    第二部,在InitApplication中添加文档反应器,并用g_editorReactor = new CMyEditorReactor();  acedEditor->addReactor(g_editorReactor);

                    第三部,在UnloadApplication中删除文档反应器,acedEditorManager->removeReactor(g_docReactor); delete g_editorReactor;


数据库反应器当创建实体时,会触发数据库反应器的虚函数objectAppended函数。在函数中我们可以设置和修改实体的属性。

创建过程:第一步,在InitApplication函数中初始化

								             g_dbReactor = new CMyDbReactor;
									     AcApDocumentIterator* it = acDocManager->newZcApDocumentIterator();
									     for (; !it->done();it->step())
									     {
									     	it->document()->database()->addReactor(g_dbReactor);
									     }
									     delete it;

                   第二部,在文档反应器中完成数据库的添加和删除操作。两个函数分别为documentCreated和documentToBeDestroyed


对象反应器,当修改或删除实体的时候,我们可以将实体与对象反应器关联起来,进行后续一些操作。

class CMyObjectReactor :
	public AcDbObject
{
public:
	CMyObjectReactor();
	~CMyObjectReactor();
	ACRX_DECLARE_MEMBERS(CMyObjectReactor);
	//需要该宏来载入
	Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
	Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler);

	void modified(const ZcDbObject* dbObj);

	virtual void erased(const ZcDbObject* dbObj, ZSoft::Boolean pErasing /* = true */);

	void SetLinkEntId(AcDbObjectId entId);
private:
	AcDbObjectId m_entId;
};
定义时需要加入以下宏。
ACRX_DXF_DEFINE_MEMBERS(CMyObjectReactor, AcDbObject, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 0, MYOBJECTREACTOR, UseReactor);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值