【MSCE c#】tekla建立的模型导出成ifc格式后,ms查看属性相关问题

如下图红色框内所示,我是用ms up17 打开,是可以看到的。但是用ms up15打开  这些红色框体里的属性都看不到。

并且用获取ec属性也获取不到。我想通过二次开发获取这个属性,应该怎么做?

Parents
  • U17上通过EC方式也读取不到这些属性么?能否提供这个文件供我们分析,可将多余元素删除掉,只留这一个元素即可。

  • 我目前是用的up15 做的程序去读的  麻烦郭工提供下up17的sdk呢 。。再问问哈   up17sdk还是用vs2017  开发吗

  • 郭老师,我测试了 c#版本的up17 二次开发程序,没法通过获取ec属性获取到。麻烦你这边看看 那种属性是什么样的存在,如何获取。 测试文件如下

    20221018.dgn

  • 元素之间应该是存在依赖关系。看下图

    郭老师正在探索如何通过编程手段处理这种关系。推测是要用到ECRelationshipClass



  • 这些属性获取起来还是比较麻烦的,如下c/c++示例代码演示了获取“格栅板”的属性:

    ElementAgenda selectset;
    	SelectionSetManager::GetManager().BuildAgenda(selectset);
    	if (selectset.GetCount() < 1)
    	{
    		return;
    	}
    	EditElementHandle& eeh = selectset[0]; 
    	DgnFileP dgnFile = ISessionMgr::GetActiveDgnFile();
    	SchemaInfo schemaInfo(ECN::SchemaKey(L"IFC2x3", 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"IfcRelDefinesProperties_RelatedObjects")->GetRelationshipClassP();
    	ECN::ECRelationshipClassP pRRelaClass = pSchema->GetClassP(L"IfcRelDefinesByPropertiesProperties_RelatingPropertyDefinition")->GetRelationshipClassP();
    	ECN::ECClassP pVolClass = pSchema->GetClassP(L"IfcPlate");
    	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_Backward);
    	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 instance = *iter;
    		QueryRelatedClassSpecifierPtr qrcsCur = QueryRelatedClassSpecifier::Create(*pRRelaClass);
    		DgnECInstanceIterable dgnECInsIterCur = DgnECManager::GetManager().FindRelatedInstances(*instance, *qrcsCur, insCreateCon);
    		for (DgnECInstanceIterable::const_iterator iterCur = dgnECInsIterCur.begin(); iterCur != dgnECInsIterCur.end(); ++iterCur)
    		{
    			DgnECInstancePtr instanceCur = *iterCur; 
    			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);
    			}
    		}
    	}

    您可以试着改写成c#的。

    Answer Verified By: 瑞 胡 

Reply
  • 这些属性获取起来还是比较麻烦的,如下c/c++示例代码演示了获取“格栅板”的属性:

    ElementAgenda selectset;
    	SelectionSetManager::GetManager().BuildAgenda(selectset);
    	if (selectset.GetCount() < 1)
    	{
    		return;
    	}
    	EditElementHandle& eeh = selectset[0]; 
    	DgnFileP dgnFile = ISessionMgr::GetActiveDgnFile();
    	SchemaInfo schemaInfo(ECN::SchemaKey(L"IFC2x3", 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"IfcRelDefinesProperties_RelatedObjects")->GetRelationshipClassP();
    	ECN::ECRelationshipClassP pRRelaClass = pSchema->GetClassP(L"IfcRelDefinesByPropertiesProperties_RelatingPropertyDefinition")->GetRelationshipClassP();
    	ECN::ECClassP pVolClass = pSchema->GetClassP(L"IfcPlate");
    	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_Backward);
    	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 instance = *iter;
    		QueryRelatedClassSpecifierPtr qrcsCur = QueryRelatedClassSpecifier::Create(*pRRelaClass);
    		DgnECInstanceIterable dgnECInsIterCur = DgnECManager::GetManager().FindRelatedInstances(*instance, *qrcsCur, insCreateCon);
    		for (DgnECInstanceIterable::const_iterator iterCur = dgnECInsIterCur.begin(); iterCur != dgnECInsIterCur.end(); ++iterCur)
    		{
    			DgnECInstancePtr instanceCur = *iterCur; 
    			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);
    			}
    		}
    	}

    您可以试着改写成c#的。

    Answer Verified By: 瑞 胡 

Children