燃热厂站工程解决方案-数字院-张三 - MS版.dgn
该文件中存在一个全名为OpenPlant_3D.01.08的ECSchema
我尝试了很多个获取ECSchema的方法,目前测试只有如下API能够获取成功
FindInstancesScope scope = FindInstancesScope.CreateScope(file, new FindInstancesScopeOption(DgnECHostType.File, false)); eCSchema = DgnECManager.Manager.LocateSchemaInScope(scope, schemaName, versionMajor, versionMinor, SchemaMatchType.Exact);
此外我还尝试了如下API,都无法成功获取到:
DgnECManager.Manager.LocateDeliveredSchema(schemaName, versionMajor, versionMinor, SchemaMatchType.Exact, file);
DgnECManager.Manager.LocateSchema(schemaName,versionMajor,versionMinor,SchemaMatchType.LatestCompatible,null,null);
ECObjects.LocateSchema(schemaName,versionMajor,versionMinor,SchemaMatchType.LatestCompatible,null,null);
ECObjects.LocateSchema(schemaFullName,SchemaMatchType.LatestCompatible,null,null);
请问一下具体的原因呢?
LocateDeliveredSchema不工作的原因应该是该函数是用于定位外部的Schema文件的。
后面三个LocateSchema不工作,推测应该是后面的两个null导致的找不到schema。在您代码的第一行,如果将new FindInstancesScopeOption(DgnECHostType.File, false)改成new FindInstancesScopeOption()也会导致找不到这个schema。您这个文件中的所有schema都有这个特点,必须指定File才能找到。请问这些schema都是怎样被导入进来的?
这些Schema是我在OPM中用“ecx schema export”Keyin导出的,然后我把文件存成了imodel,然后再合并到一个空的ms打开的dgn中,然后在这个dgn中用“ecx schema import”Keyin导入的之前导出的ECSchema,当然有部分ECSchema导入失败,但大部分是成功的。
请看帮助中对DeliveredSchema的解释:
可知,这个DeliveredSchema指的是未保存在DGN文件中的schema。至于为何该函数还需要提供一个dgnFile参数。我推测是用作他用的。
嗯~好吧~那我是不是可以理解DgnECManager.Manager.LocateSchemaInScope()方法是目前稳定能够获取到所有ECSchema的方法嘛?还是有什么其他更通用的方法?
是的。这个方法在SDK的例子中也在大量使用。现在还需要进一步研究是,为何您的DGN中的schema用new FindInstancesScopeOption()就定位不到,必须要写成new FindInstancesScopeOption(xxx, false)。
嗯……那就很奇怪了,我就是用KeyIn导入的ECSchema,可能是ECSchema自身的问题?
符老师,FindInstancesScopeOption没有不带参数的默认构造函数吧。通过反编译可以大概看出来LocateSchemaInScope内部是通过多种方式去找Schema的,包括Deliverd Schema,shared schema和xml schema,用这个方法是比较稳的。
感谢你的分享
xiangeboy said:FindInstancesScopeOption没有不带参数的默认构造函数吧
确实。是我记晕了。