用户定义的attachEmployeeReactorToAllEmployee()实用程序函数的实现:

NOTE: 如前所述,我们使用addReactor()/ removeReactor()将瞬态反应器添加/删除到对象中。 在这里,我们将反应堆附加到所有EMPLOYEE块参考对象。 请记住,一个以上的打开图形可以包含EMPLOYEE块引用。 AsdkDataManager类管理CDocData类,每个文档只有一个CDocData类。 在CDocData的构造函数中,我们将调用用户定义的函数attachEmployeeReactorToAllEmployee()。 当前AutoCAD会话中的每个打开的图形,以及创建新图形或打开现有图形时,都将调用此方法。 该函数将负责为每个图形附加/删除AsdkEmployeeReactor对象。.

  1. 将对象反应器连接到图形中已存在的所有“ EMPLOYEE”参考上。 编写函数: 

Acad :: ErrorStatus attachEmployeeReactorToAllEmployee(bool attach)将: 

  1. 获取块表(AcDbDatabase :: getBlockTable())。
  2. 获取模型空间记录(AcDbBlockTable :: getAt(),ACDB_MODEL_SPACE)。
  3. 获取一个块表记录迭代器(AcDbBlockTableRecordIterator,AcDbBlockTableRecord :: newIterator())。
  4. 遍历模型空间记录并检索实体(AcDbBlockTableRecordIterator :: getEntity())。 如果检索到的块引用实体不是EMPLOYEE对象,则只需返回. 
  5. 如果检索到的实体是“ EMPLOYEE”块引用,则附加全局对象反应堆(AcDbObject :: addReactor()),或者如果参数“ attach”为false,则删除已附加的对象反应堆(AcDbObject :: removeReactor())。
  6. 最后,不要忘记删除迭代器并关闭对象. 
  1. 在CDocData构造函数中调用attachEmployeeReactorToAllEmployee(). 


用户定义的detachAllEmployeeReactors()实用程序函数的实现:

  1. 如果卸载应用程序,则必须分离附加到EMPLOYEE块引用实体的所有对象反应堆。 实现detachAllEmployeeReactors()来执行此操作. 

void detachAllEmployeeReactors()。 该功能将: 

    < li> 获取一个AcApDocumentIterator(acDocManager-> newAcApDocumentIterator())。 acDocManager是全局宏,用于检索AcApDocManager,该AcApDocManager负责AutoCAD会话中的所有文档。 有关详细信息,请参考ObjectARX联机帮助中的AcApDocManager。. 
  1. 存储指向当前文档的指针,以便您可以在迭代后重置文档(acDocManager->curDocument())。
  2. 遍历所有文档,使每个文档成为当前文档,然后调用attachEmployeeReactorToAllEmployee(false)。
  3. 迭代后,将当前文档重置为迭代之前的当前文档.
  1. 如果您的应用程序卸载,则调用detachAllEmployeeReactors(). 

尝试自己实现上述所有功能。 不要忘记ObjectARX联机帮助以获取快速参考。 如果卡住,则可以打开 Step07解决的项目 并研究Step07项目的DocData.cpp文件中的代码.

 

NEXT: 为应用程序添加并实现数据库反应器

Implementing utility functions
Copyright ? 2013 Autodesk, Inc.