【MS CE C#】获取instance.GetRelationshipInstances()结果为空,但是软件资源管理器中可以查看

如题,获取instance.GetRelationshipInstances()结果是空的,但是在资源管理器中可以看到

Parents
  • 003.dgn

    郭老师,代码就是用的 IECInstance的GetRelationshipInstances();

  • 如下代码是我根据那个贴子中的代码改造的,可以获取您这里的关联开孔信息:

    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例子找了一个方法,

    MstnExamples/DgnEC/DgnECCrudExample/ManagedExample/DgnECManagedCrudExample.cs

    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属性。

Reply
  • 牛!SDK下的这些EC例子都忘了,我是在c#的DgnECManager下找了FindRelatedInstances没有查到类似的函数,以为又缺少了,看起来c#跟c/c++的SDK在EC这一块有很多不一样的地方。不过这个例子都是查的Model中所有的只当ECClass的实例,可以改动一下FindInstancesScope.CreateScope有好几个函数重载,可以调用那个第一个参数是Element类型的重载去读取。这样就可以读取到指定元素上的EC属性了,而不是整个Model或者整个Dgn File下的所有EC属性。

Children
No Data