从 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-10-29 17:10
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.