3 桥梁.dgn附件中dgn内的元素id为786的智能实体,在采用
DgnECManager.Manager.GetElementProperties(ele, ECQueryProcessFlags.SearchAllIntrinsic)
耗时截图如下:
我是想获取某个EC属性的值,因此采用这种方式遍历找到对应的属性,然后并进行取值的等后续操作,请问有什么办法能够优化此元素获取IDgnECInstance的性能吗?
可以直接获取元素上指定ECClass的ECInsatce:
FindInstancesScope scope = FindInstancesScope.CreateScope(ele, new FindInstancesScopeOption(DgnECHostType.Element, true)); IECSchema schema = DgnECManager.Manager.LocateSchemaInScope(scope, "DgnElementSchema", 0, 0, SchemaMatchType.Latest); if (schema == null) { return; } IECClass ecclass = schema.GetClass("NamedViewElement"); if (ecclass == null) { return; } ECQuery query = new ECQuery(ecclass); IDgnECInstance ecIns= DgnECManager.FindECInstanceOnElement(ele, ecclass); var dataTime = ecIns.GetDateTime("ModifiedTime");
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
Answer Verified By: 霄男 宿
我的意思是,如果我不知道我要获取的属性在哪个ECSchema和具体ECClass下,还有什么办法能够在遍历的同时提高性能吗?
可以考虑改用c/c++来做,不过不敢保证效率能提高多少,只有真正测试一下才知道。既然不知道在哪个ECClass下边,那就绕不开要遍历一下所有的属性。
好的,谢谢了~我想知道这个元素遍历很慢是元素类型导致的还是因为其上的ECInstance较多导致的?还是个例?
本身EC机制就挺复杂的,读取EC属性时,还要获取,解析ECClass、ECSchema,有些ECClass结构还特别复杂,解析完了,还有再去解析二进制的ECInstance数据,所以这一部分就挺耗时的,如果某个元素上ECInstance又特别多的话,那肯定是比较耗时的。
好的,明白了~谢谢~那我试试能不能维护一个静态的字典,存储下来某种元素对应的ECClass集合,然后下次遇到这类元素时,直接到我存储的集合里遍历,然后创建dgnEcIns。