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

2755

被折叠的 条评论
为什么被折叠?



