ElementTemplates读取


我们在dgn文件中可以预定制一套元素模板(Element Templates)来给元素附加各种属性,那么在程序中如何读取元素模板信息呢?在Mstn C#的编程接口中给我们提供了名为“ElementTemplateMgr”的类型,在这个类型下边有各种各样的成员函数来获取元素模板信息。如下代码演示了如何获取指定dgn文件中的所有元素模板信息。

        public static void TraverseElementTemplateNode(SimpleDataTreeNodeCollection nodeCol)
        {
            foreach(var curNode in nodeCol)
            {
                XDataTreeNode curXDataNode = curNode.Tag as XDataTreeNode;
                if (null != curXDataNode)
                {
                    ECInstanceList curECInsList = curXDataNode.ECInstanceList;
                    if (null != curECInsList)
                    {
                        foreach (var curECIns in curECInsList)
                        {
                            foreach (var curECPropVal in curECIns)
                            {
                                try
                                {
                                    if (curECPropVal.IsArray)
                                    {
                                        IECArrayValue curECArrVal = curECPropVal as IECArrayValue;
                                        for (int i = 0; i < curECArrVal.Count; i++)
                                        {
                                            IECPropertyValue ccurECPropVal = curECArrVal[i];
                                            if (ccurECPropVal.IsStruct)
                                            {
                                                IECStructValue ecStruVal = ccurECPropVal as IECStructValue;
                                                IEnumerator<IECPropertyValue> enumPropVal = ecStruVal.GetEnumerator();
                                                while (enumPropVal.MoveNext())
                                                {
                                                    if (enumPropVal.Current.IsStruct)
                                                    {
                                                        IECStructValue curEcStruVal = enumPropVal.Current as IECStructValue;
                                                        IEnumerator<IECPropertyValue> curEnumPropVal = curEcStruVal.GetEnumerator();
                                                        while (curEnumPropVal.MoveNext())
                                                        {
                                                            IECPropertyValue ccurEcVal = curEcStruVal.GetPropertyValue(curEnumPropVal.Current.AccessString);
                                                            MessageCenter.Instance.ShowInfoMessage(curEnumPropVal.Current.StringValue + "___" + curEnumPropVal.Current.AccessString, "", false);
                                                        }
                                                        continue;
                                                    }
                                                    MessageCenter.Instance.ShowInfoMessage(enumPropVal.Current.StringValue + "___" + enumPropVal.Current.AccessString, "", false);
                                                }
                                            }
                                        }
                                        continue;
                                    }
                                }
                                catch (Exception)
                                {
                                }
                            }
                        }
                    }
                }
                TraverseElementTemplateNode(curNode.Nodes);
            }
        }
        public static void GetElementTemplateInformation()
        {
            string dgnFileFullPath = @"C:\ProgramData\Bentley\MicroStation CONNECT Edition\Configuration\WorkSpaces\Example\WorkSets\MetroStation\Standards\Dgnlib\MetroStation.dgnlib";
            DgnDocument dgnDoc = DgnDocument.CreateForLocalFile(dgnFileFullPath);
            DgnFileOwner dgnFileOwner = DgnFile.Create(dgnDoc, DgnFileOpenMode.ReadOnly);
            DgnFile dgnFile = dgnFileOwner.DgnFile;
            dgnFile.LoadDgnFile(out _);
            dgnFile.FillDictionaryModel();
            SimpleDataTreeNodeCollection collection = Bentley.MstnPlatformNET.XDataTree.ElementTemplateMgr.GenerateTreeOfAvailableTemplates(dgnFile);
            TraverseElementTemplateNode(collection);
            dgnFile.Release();
        }

读取外部dgn文件的内容时,我们需要创建外部dgn文件对应的DgnFile实例。这里我们根据外部dgn文件的全路径依次创建了DgnDocument,DgnFileOwner实例,最后通过DgnFileOwner的“DgnFile“属性得到了DgnFile类型的实例。在真正开始读取文件中的内容前,我们通过调用DgnFile的”LoadDgnFile“,”FillDictionaryModel“函数,将元素模板数据所在的”DictionaryModel“加载到内存中。接下来通过ElementTemplateMgr.GenerateTreeOfAvailableTemplates函数获取到了外部文件中的元素模板。由于元素模板是通过树状结构图组织起来的,所以我们只获取到了第一层的节点集合。我们这里通过一个递归函数” TraverseElementTemplateNode“遍历到了元素模板的所有节点并将元素模板的属性全部输出到Mstn底部的消息中心,如下所示: