我们在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底部的消息中心,如下所示: