【问题解决过程分享】如何在OPM的OpenPlant_3D Schema定义中获取MS级的元素属性


【用户问题】:如何在OPM的OpenPlant_3D Schema定义中获取MS级的元素的ElementID?写了this.GetElement().ElementID不工作。

【解决问题的过程】:

1、先了解如何在OPM的OpenPlant_3D Schema中定义表达式。练习了这篇文章中的步骤:如何在OpenPlant Modeler中将文件名添加到管件的属性中

2、关键点分析:需要用到ClassEditor中提供的Calculated ECProperty Specification(可计算的EC属性规范)。如下图所示是该文中的定义。能看到ECExpression中用到了两个关键函数GetFileNameWithoutExtension()和GetFile()。这两个函数的定义分别位于符号集(SymbolSet)System.Path和ActiveFile中。所以,需要在Required ECExpression SymbolSets下添加这两个符号集(本例中多出的两个符号集也可不添加)。

3、在ECExpression中直接写this.GetElement().ElementID不工作。后来意识到是没有能正确填写GetElement()函数所在的符号集。所以,进入到探索符号集的工作。

4、编程提取OPM中的所有符号集:写如下C#代码将OPM中所有的符号提供器(SymbolProvider)内容输出到d:\schema文件夹下:

public static void ListSymbolSets(string unparsed)
{
    IList<ECE.IECSymbolProvider> providerList = ECE.ECSymbolProviderManager.GlobalSymbolProviderManager.SymbolProviderList;
    foreach (var provider in providerList)
    {
        using (XmlTextWriter xwriter = new XmlTextWriter($"d:\\schema\\{provider.Name}.xml", System.Text.Encoding.UTF8))
        {
            xwriter.Formatting = Formatting.Indented;
            provider.DocumentSymbols(xwriter);
        }
    }
}

5、从输出的15个XML文件中能搜到GetElement()函数位于ItemsSymbolHelper,因而在OpenPlant_3D schema中写就如下的计算EC属性终于获得了元素ID。

在OPM中最终呈现的显示如下:

6、附件OPM-SymbolProviderList.zip是这15个XML文件的压缩包。每个SymbolProvider其实就是一个被加载的DLL库(两个名称不相同),该Provider中可定义一到多个SymbolSet,而每个SymbolSet中又含有一到多个Function。下表列出了ItemsSymbolHelper的情况:

符号集(SymbolSet) 函数(Function) SymbolProvider名 DLL文件
ItemsSymbolHelper GetElement, GetModel, GetFile, GetItem, GetRelatedItem, GetDisplayValue, GetDisplayString ItemsSymbolProvider Bentley.DgnPlatformNET.dll

以上每个函数的说明和调用形式都可以到ItemsSymbolProvider.XML文件中找到。比如:

7、直接查看这些XML文件确实不太直观,推荐您访问OPM或MS中的Named Expression对话框(Utilities选项卡下的Utilities组下可找到),在该对话框中选菜单Utilities > Report Symbol,就能打开一个网页,包含了大多数的SymbolSet名和其下的函数或属性名。点中某个函数或属性,就能展开详细的说明。如下图所示:

8、还有就是打开ItemType Expression定义对话框(Drawing工作流 > Content选项卡 > ItemType组的右下角小三角,创建一个ItemType库,创建一个ItemType,创建一个Property,保存。然后点击Property下Expression后的...),在这里能更加直观地获得表达式的写法帮助。如下图,可从GetElement()下直接选中ElementID

欢迎有志者将这些XML文件整理出来供大家更直观地查询。