遍历方法介绍
引言
我们进行元素类型筛选时,一般来说需要使用Element的MSElementType属性对元素加以区别,其中对MicroStation软件中所有的元素均进行定义
public enum MSElementType {
None = 0,
CellHeader = 2,
Line = 3,
LineString = 4,
GroupData = 5,
Shape = 6,
TextNode = 7,
DigSetData = 8,
DgnFileHeader = 9,
LevSym = 10,
Curve = 11,
ComplexString = 12,
ComplexShape = 14,
Ellipse = 15,
Arc = 16,
Text = 17,
Surfce = 18,
Solid = 19,
BsplinePole = 21,
PointString = 22,
Cone = 23,
BsplineSurface = 24,
BsurfBoundary = 25,
BsplineKnot = 26,
BsplineCurve = 27,
BsplineWeight = 28,
Dimension = 33,
SharedCellDefinition = 34,
SharedCellInstance = 35,
Multiline = 36,
Tag = 37,
DgnStoreComponent = 38,
DgnStoreHeader = 39,
Type44 = 44,
MicroStation = 66,
RasterHeader = 87,
RasterComponent = 88,
RasterReference = 90,
RasterReferenceComponent = 91,
RasterHierarchy = 92,
RasterHierarchyComponent = 93,
RasterFrame = 94,
TableEntry = 95,
Table = 96,
ViewGroup = 97,
View = 98,
LevelMask = 99,
ReferenceAttachment = 100,
MeshHeader = 105,
MaxElements = 113
}
对于MicroStation中的大多数元素,比如说普通实体,线元素,标签元素,弧元素等均可以被成功识别,但是对于某些元素,仅凭MSElenetType属性无法对元素类型进行区分。在文件名为ElementTpy的案例中,模型中建立了较为常用的元素,我们首先获取模型中的元素并对元素进行遍历,通过输出结果我们可以发现,采用GetGraphicElements()方法遍历时暴露出以下三个问题
- 无法区分普通单元与智能实体——因为他们的元数类型均为CellHeader
- 无法区分参数化实体与参数化单元——因为他们的元数类型均为106
- 无法区分独立元素与内嵌于参数化实体中的元素
public static void DistinguishElementType(string unparsed)//Case:ElementType
{
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型控件
ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得当前模型中的所有图形元素
string elemTypes = null;//声明字符串
foreach (Element elem in elems)//遍历模型中的所有图形元素
{
elemTypes = elemTypes + "ElementId = " + elem.ElementId + " Element type = " + elem.ElementType + '\n';//输出图形元素的元素ID和元素类型
}
MessageBox.Show(elemTypes);//输出字符串结果
}
遍历区分智能实体与普通单元
若需要获得智能实体,那么仅凭MSElementType就只能获取到智能实体和普通单元的集合,在此基础上,我们可以使用元素的TypeName作进一步的区分,保证获得到的是智能实体
public static void DistinguishTypeofCellHeader(string unparsed)//Case:DistinguishCellHeader
{
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型
ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得当前模型中的所有图形元素
string elemTypes = "Smart Solid:\n";//声明字符串
foreach (Element elem in elems)//遍历模型中的所有图形元素
{
if (elem.ElementType == MSElementType.CellHeader &&
elem.TypeName.Contains("Smart Solid"))//根据元素类型为CellHeader和元素类型名称判断是否为智能实体
{
elemTypes = elemTypes + "ElementId = " + elem.ElementId + " Element type = " + elem.ElementType + '\n';//输出图形元素的元素ID和元素类型
}
}
MessageBox.Show(elemTypes);//输出字符串结果
}
在文件名为DistinguishCellHeader的案例中,模型创建了两个智能实体与五个普通单元,采用元素中ElementType和TypeName两个属性便可成功识别出智能实体
遍历区分参数化实体与参数化单元
若需要获得参数化实体,那么仅凭MSElementType就只能获取到参数化实体与参数化单元的集合,在此基础上,我们可以使用元素的TypeName作进一步的区分,保证获得到的是参数化实体
public static void DistinguishTypeofExtendedHeader(string unparsed)//Case:DistinguishExtendedHeader
{
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型控件
ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得当前模型中的所有图形元素
string elemTypes = "Parametric Solid/Surface:\n";//声明字符串
foreach (Element elem in elems)//遍历模型中的所有图形元素
{
if ((int)elem.ElementType == 106 &&
elem.TypeName == "Parametric Solid/Surface")//根据元素类型为106和元素类型名称判断是否为参数化实体/面
{
elemTypes = elemTypes + "ElementId = " + elem.ElementId + " Element type = " + elem.ElementType + '\n';//输出图形元素的元素ID和元素类型
}
}
MessageBox.Show(elemTypes);//输出字符串结果
}
在文件名为DistinguishExtendedHeader的案例中建立了4个参数化单元与3个参数化实体,在这里便可以使用TypeName进行区分,获取参数化实体
遍历区分独立实体与内嵌实体
在进行元素筛选遍历时,若参数化实体中使用普通实体进行切割,那么在元素集中,会将二者同时识别为实体,但是内嵌于参数化实体中的实体往往并不是我们所需要获得的,同时,内嵌实体的获取还会打打影响元素筛选的准确性。因此,如何区分独立实体与内嵌实体便显得十分重要。在这里,我们是用元素中的IsInvisible属性判断元素是否为内嵌元素。当前,我们可以看到IsInvisible是可读可写的,因此采用这种方法并不是十分严谨,后续我们还会介绍其他方法如何更加有效的区分两者,这种方法对于一般情况下是适用的
public static void DistinguishNestingElements(string unparsed)//Case:ElementType
{
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型控件
ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得当前模型中的所有图形元素
string elemTypes = "Solid:\n";//声明字符串
foreach (Element elem in elems)//遍历模型中的所有图形元素
{
if (elem.ElementType == MSElementType.Solid &&
elem.IsInvisible == false)//根据元素类型为Solid和元素是否可见判断(注:该筛选方案不严谨,因有方法可修改元素是否可见)
{
elemTypes = elemTypes + "ElementId = " + elem.ElementId + " Element type = " + elem.ElementType + '\n';//输出图形元素的元素ID和元素类型
}
}
MessageBox.Show(elemTypes);//输出字符串结果
}
在文件名为ElementType的案例中,我们使用以上方法,可以过滤掉参数化实体中内嵌的实体元素,获得独立的实体元素集