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