EC读取OBD构件属性


ECMstn中往元素上添加自定义属性的一种方式,通过这种方式添加的自定义属性在编程时都可以通过EC编程接口读取到。Mstn中往元素上添加自定义属性的方式有很多种(几种添加自定义属性的技术介绍可以参考这篇文章:Addin给元素添加自定义Linkage数据),那么EC这种方式有什么特别之处呢?EC添加自定义属性的好处在于数据共享,自定义属性的数据格式定义跟元素一起保存在了所在的Dgn文件中。这样我们通过代码使用EC这种方式添加的自定义属性,其他人员即使没有我们的程序也可以通过Dgn文件中保存的自定义属性数据格式的定义去获取解析我们添加的自定义属性。但是在有些基于Mstn的软件产品开发的时间比较早,在开发之初还没有诞生EC这项技术。所以在这些软件中自己定义了一套添加自定义属性的系统,例如我们这里要讨论的OBDOpenBuilding Designers)。在OBD中定义了一套名为“Catalog”的数据定义系统,数据格式都是通过外部*.xml文件定义的,这些*.xml文件保存在工作空间下。OBD软件启动打开Dgn文件以后,OBD特有的程序会加载这些外部的*.xml文件,进而去解析元素上添加的自定义属性。我们基于OBD做二次开发时,想要读取这些构件上的这些自定义业务属性时,也要通过OBD SDK专有的接口函数去读取。这就需要我们学习研究OBD SDK中这些接口函数的用法,而且还有详细了解“Catalog”这套系统。不过在最近几个版本的OBD中已经增加了这套属性转换位EC属性的功能,我们可以直接通过元素属性对话框查看到以前只能在OBD特有的“Building Element Info”对话框中查看到的“Catalog”这套系统定义的属性,如下图所示:

有了这个特性以后我们再去读取OBD中构件通过“Catalog”系统添加的属性时,就不需要再通过OBD SDK特有的接口函数了。因为只要在元素属性对话框中看到的属性,都是可以通过EC编程接口去获取的。具体实现代码如下所示:

public static void GetAllECProperties(Element ele)
        {
            DgnECInstanceCollection dgnECInstanceCol = DgnECManager.Manager.GetHistoricalElementProperties(ele);
            foreach (var curECIns in dgnECInstanceCol)
            {
                foreach (var curECPropVal in curECIns)
                {
                    try
                    {
                        string curstr = curECPropVal.StringValue;
                        string curDisplay = curECPropVal.Property.DisplayLabel;
                        ECPropertyPane.GetCategoryInformation(out string cateDisLabel, out _, out _, curECPropVal.Property,
                            curECIns.ClassDefinition);
                        MessageCenter.Instance.ShowInfoMessage(cateDisLabel + "___" + curDisplay + "___" + curstr, "", false);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            return;
        }

这段代码获取了元素上的所有EC属性,并将属性值、属性名、属性分组名显示在了消息中心,如下图所示: