从 AutoCAD 对象的指针查找所有适用的接口需要几个步骤,如以下过程中所述。IPropertyManagerIUnknown 查找 AutoCAD 实体的 IPropertyManager 界面的步骤查询接口的对象:IAcadBaseObject IAcadBaseObject* pBase = NULL; if (FAILED(pObjUnkArray[i]->QueryInterface(IID_IAcadBaseObject, reinterpret_cast<LPVOID*>(&pBase)))) return E_FAIL; 使用指针获取对象 ID:IAcadBaseObject AcDbObjectId objectID = NULL; if (FAILED(pBase->GetObjectId(&objectID))) { pBase->Release(); return E_FAIL; } 打开对象表示的 AutoCAD 实体: AcDbEntity* pEnt = NULL; if (Acad::eOk != acadbOpenAcDbEntity(pEnt, objectID, AcDb::kForRead, Adesk::kTrue)) return E_FAIL; 通过调用实体指针来获取实体:AcRxClassAcRxObject::isA() AcRxClass* pClass = pEnt->isA(); 声明一个新对象以包含指针和索引变量:COleSafeArray COleSafeArray PropMgrArray; long n; 其余步骤在遍历对象的类层次结构的循环中进行迭代。以下代码提供了循环的框架: do { // perform steps 6-9 } while ((pClass = pClass->myParent()) != NULL); 获取指向以下各项的 OPM 协议扩展的指针:AcRxClass OPMPropertyExtension* pExtension = NULL; pExtension = GET_OPMEXTENSION_CREATE_PROTOCOL() ->CreateOPMObjectProtocol(pClass); 使用步骤 5 中返回的指针获取属性管理器: IPropertyManager* pManager = NULL; pManager = pExtension->GetPropertyManager(); 将属性管理器指针强制转换为:IUnknown* VARIANT vUnk = CComVariant(static_cast<IUnknown*>(pManager); 将属性管理器的指针添加到数组:IUnknown PropMgrArray.PutElement(&n, &vUnk); n++; 应应用类似于步骤 6–9 的过程来获取每个实例的属性源,如以下伪代码所示: COleSafeArray PropSrcArray; VARIANT vUnk; OPMPerInstancePropertyExt* pPiPex = NULL; pPiPex = GET_OPM_PERINSTANCE_CREATE_PROTOCOL()-> CreateOPMPerInstancePropertyExtension(pClass->name()); VARIANT* pNames; pPiPex->GetObjectPropertySourceNames(pNames); IPropertySource* pPropSrc = NULL; for (int i = 0; NULL != pNames[i]; i++) { pPropSrc = GET_OPM_PERINSTANCE_SOURCES()-> GetPropertySourceAt(pNames[i]); vUnk = CComVariant(static_cast<IUnknown*>(pPropSrc); PropSrcArray.PutElement(&n, &vUnk); n++; } 找到应用于某个对象的所有属性管理器和属性源后,将其指针添加到单个对象。然后,将其添加到作为方法的第二个参数传递的数组中。IUnknownSAFEARRAYSAFEARRAYReset() |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-1-8 19:40
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.