如题,获取instance.GetRelationshipInstances()结果是空的,但是在资源管理器中可以看到
请提供测试代码及测试文件。
003.dgn
郭老师,代码就是用的 IECInstance的GetRelationshipInstances();
郭老师,请问具体是哪个帖子
抱歉,忘记贴链接了: RE: 【MSCE c#】tekla建立的模型导出成ifc格式后,ms查看属性相关问题
如下代码是我根据那个贴子中的代码改造的,可以获取您这里的关联开孔信息:
ElementAgenda selectset; SelectionSetManager::GetManager().BuildAgenda(selectset); if (selectset.GetCount() < 1) { return; } EditElementHandle& eeh = selectset[0]; DgnFileP dgnFile = ISessionMgr::GetActiveDgnFile(); SchemaInfo schemaInfo(ECN::SchemaKey(L"WISDRI_TZ", 1, 0), *dgnFile); DgnECManagerR ecMan = DgnECManager::GetManager(); ECN::ECSchemaPtr pSchema = ecMan.LocateSchemaInDgnFile(schemaInfo, ECN::SchemaMatchType::SCHEMAMATCHTYPE_LatestCompatible); if (pSchema.IsNull()) { mdlDialog_dmsgsPrint(L"Can't find BaseElementSchema schema"); return; } ECN::ECRelationshipClassP pRelaClass = pSchema->GetClassP(L"FOUNDATION_HAS_HOLE_CLASS")->GetRelationshipClassP(); ECN::ECClassP pVolClass = pSchema->GetClassP(L"FOUNDATION_CLASS"); DgnElementECInstancePtr pInstance = ecMan.FindInstanceOnElement(eeh, *pVolClass, true); //polymorphic=true is important if (pInstance.IsNull()) { mdlDialog_dmsgsPrint(L"pInstance is null"); return; } QueryRelatedClassSpecifierPtr qrcs = QueryRelatedClassSpecifier::Create(*pRelaClass, NULL, ECN::STRENGTHDIRECTION_Forward); DgnECInstanceCreateOptions options = DgnECInstanceCreateOptions(); DgnECInstanceCreateContext insCreateCon(options); DgnECInstanceIterable dgnECInsIter = DgnECManager::GetManager().FindRelatedInstances(*pInstance, *qrcs, insCreateCon); for (DgnECInstanceIterable::const_iterator iter = dgnECInsIter.begin(); iter != dgnECInsIter.end(); ++iter) { DgnECInstancePtr instanceCur = *iter; WPrintfString wStrCur(L"Class__%s", instanceCur->GetClass().GetFullName()); mdlDialog_dmsgsPrint(wStrCur); ECPropertyIterable ecPropIter = instanceCur->GetClass().GetProperties(); for (ECPropertyIterable::const_iterator iterCCur = ecPropIter.begin(); iterCCur != ecPropIter.end(); ++iterCCur) { ECValue curECValue; instanceCur->GetValue(curECValue, (*iterCCur)->GetName().GetWCharCP()); WPrintfString wStr(L"Property__%s Value__%s", (*iterCCur)->GetName().GetWCharCP(), curECValue.ToString().GetWCharCP()); mdlDialog_dmsgsPrint(wStr); } } return;
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
Answer Verified By: Liaoyuan Zhang
郭老师,我在SDK例子找了一个方法,
IECClass ecWidgetClass = ecSimpleSchema.GetClass(schema_widget); IECClass ecWidgetHasGadgetClass = ecSimpleSchema.GetClass("WidgetHasGadgets"); IECRelationshipClass widgetRelationshipClass = ecWidgetHasGadgetClass as IECRelationshipClass; // Gets the relationship class DgnModel activeDgnModel = GetDefaultModel(); //create query to get the widget class and its relationship with gadget class ECQuery widgetHasGadgetQuery = new ECQuery(ecSimpleSchema.GetClass(schema_gadget)); widgetHasGadgetQuery.SelectClause.SelectAllProperties = true; QueryRelatedClassSpecifier queryRelatedClassSpecifier = new QueryRelatedClassSpecifier(widgetRelationshipClass, false, RelatedInstanceDirection.Backward, ecWidgetClass, false); RelatedInstanceSelectCriteria relatedSelectCriterion = new RelatedInstanceSelectCriteria(queryRelatedClassSpecifier, true); widgetHasGadgetQuery.SelectClause.SelectedRelatedInstances.Add(relatedSelectCriterion); //Creating scope FindInstancesScope scope = FindInstancesScope.CreateScope(activeDgnModel, new FindInstancesScopeOption(DgnECHostType.Element, true)); DgnECInstanceCollection instanceCollection = dgnECManager.FindInstances(scope, widgetHasGadgetQuery);
牛!SDK下的这些EC例子都忘了,我是在c#的DgnECManager下找了FindRelatedInstances没有查到类似的函数,以为又缺少了,看起来c#跟c/c++的SDK在EC这一块有很多不一样的地方。不过这个例子都是查的Model中所有的只当ECClass的实例,可以改动一下FindInstancesScope.CreateScope有好几个函数重载,可以调用那个第一个参数是Element类型的重载去读取。这样就可以读取到指定元素上的EC属性了,而不是整个Model或者整个Dgn File下的所有EC属性。