如下图红色框内所示,我是用ms up17 打开,是可以看到的。但是用ms up15打开 这些红色框体里的属性都看不到。
并且用获取ec属性也获取不到。我想通过二次开发获取这个属性,应该怎么做?
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: 瑞 胡
郭老师,DgnECInstanceIterable dgnECInsIter = DgnECManager::GetManager().FindRelatedInstances(*instance, *qrcs, insCreateCon); 我目前没有成功改成c#版本的 应该怎么做呢?
c++的代码我是测试通过了。但是现状是up15 和 up17的sdk不一样。我得做两个版本的程序去处理,比较难维护。
c#版本的目前是通用的。所以我只想再up15上做了程序 up17也一样可用。
瑞 胡 said:现状是up15 和 up17的sdk不一样。我得做两个版本的程序去处理,比较难维护。
Update15已经无法从Bentley的官网上下载到了。可以要求使用Update15的用户升级到17上去。当然,您也可以做一个安装程序,将您程序的U15和U17都打包进去,依靠安装程序去检测用户机器上的MS版本,然后将对应版本的程序复制到用户的机器上即可。
符老师,up17有离线版本安装包吗 在线装很受网络限制呀。
您可以在联网的机器上自行制作离线包。制作方法见下文:
如何创建MicroStation离线安装包