用户定义的attachEmployeeReactorToAllEmployee()实用程序函数的实现:
NOTE:
如前所述,我们使用addReactor()/ removeReactor()将瞬态反应器添加/删除到对象中。 在这里,我们将反应堆附加到所有EMPLOYEE块参考对象。 请记住,一个以上的打开图形可以包含EMPLOYEE块引用。 AsdkDataManager类管理CDocData类,每个文档只有一个CDocData类。 在CDocData的构造函数中,我们将调用用户定义的函数attachEmployeeReactorToAllEmployee()。 当前AutoCAD会话中的每个打开的图形,以及创建新图形或打开现有图形时,都将调用此方法。 该函数将负责为每个图形附加/删除AsdkEmployeeReactor对象。.
- 将对象反应器连接到图形中已存在的所有“ EMPLOYEE”参考上。 编写函数:
Acad :: ErrorStatus attachEmployeeReactorToAllEmployee(bool attach)将:
- 获取块表(AcDbDatabase :: getBlockTable())。
- 获取模型空间记录(AcDbBlockTable ::
getAt(),ACDB_MODEL_SPACE)。
- 获取一个块表记录迭代器(AcDbBlockTableRecordIterator,AcDbBlockTableRecord
:: newIterator())。
- 遍历模型空间记录并检索实体(AcDbBlockTableRecordIterator
:: getEntity())。 如果检索到的块引用实体不是EMPLOYEE对象,则只需返回.
- 如果检索到的实体是“
EMPLOYEE”块引用,则附加全局对象反应堆(AcDbObject :: addReactor()),或者如果参数“
attach”为false,则删除已附加的对象反应堆(AcDbObject :: removeReactor())。
- 最后,不要忘记删除迭代器并关闭对象.
- 在CDocData构造函数中调用attachEmployeeReactorToAllEmployee().
用户定义的detachAllEmployeeReactors()实用程序函数的实现:
-
如果卸载应用程序,则必须分离附加到EMPLOYEE块引用实体的所有对象反应堆。 实现detachAllEmployeeReactors()来执行此操作.
void detachAllEmployeeReactors()。 该功能将:
< li> 获取一个AcApDocumentIterator(acDocManager-> newAcApDocumentIterator())。 acDocManager是全局宏,用于检索AcApDocManager,该AcApDocManager负责AutoCAD会话中的所有文档。 有关详细信息,请参考ObjectARX联机帮助中的AcApDocManager。.
- 存储指向当前文档的指针,以便您可以在迭代后重置文档(acDocManager->curDocument())。
- 遍历所有文档,使每个文档成为当前文档,然后调用attachEmployeeReactorToAllEmployee(false)。
- 迭代后,将当前文档重置为迭代之前的当前文档.
- 如果您的应用程序卸载,则调用detachAllEmployeeReactors().
尝试自己实现上述所有功能。 不要忘记ObjectARX联机帮助以获取快速参考。
如果卡住,则可以打开 Step07解决的项目
并研究Step07项目的DocData.cpp文件中的代码.
|