Bentley二次开发教程12-元素管理-遍历方法介绍

在这里插入图片描述

遍历方法介绍

引言

我们进行元素类型筛选时,一般来说需要使用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()方法遍历时暴露出以下三个问题

  1. 无法区分普通单元与智能实体——因为他们的元数类型均为CellHeader
  2. 无法区分参数化实体与参数化单元——因为他们的元数类型均为106
  3. 无法区分独立元素与内嵌于参数化实体中的元素
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的案例中,我们使用以上方法,可以过滤掉参数化实体中内嵌的实体元素,获得独立的实体元素集
在这里插入图片描述
在这里插入图片描述

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值