• Bentley二次开发教程26-工程属性-ItemType操作实际案例


    ItemType操作实际案例

    ItemType作为EC的简化版,其操作更加便捷,同时拥有可视化的操作界面,对于使用软件的人来说对于ItemType的创建,删除,修改,更新操作更加便捷。因此对于第一次接触工程属性或工程属性构成较为简单的使用场景下,我们推荐使用ItemType进行工程属性的赋予。

    创建ItemType

    创建ItemType的方式与我们在图形界面中的创建方式基本一致,遵循的方法为:创建ItemTypeLibrary,创建ItemType,为ItemType添加属性,如有需要可添加默认属性值,设置完成后将ItemTypeLibrary中的信息进行更新。
    在这里插入图片描述

    public static void CreateItemType(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//根据声明名称获取对应的ItemTypeLibrary
        if (null == itemTypeLibrary)//判断文件中是否存在同名ItemTypeLibrary
        {
            itemTypeLibrary = ItemTypeLibrary.Create(itemLibName, dgnFile);//若不存在则进行创建
        }           
        itemTypeLibrary.AddItemType(itemTypeName);//在ItemTypeLibrary中创建名为testItemTypeName的ItemType
        ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);//获取创建的ItemType            
    
        CustomProperty intProperty = itemType.AddProperty("IntProperty");//对该ItemType添加名为IntProperty的属性
        intProperty.Type = CustomProperty.TypeKind.Integer;//设置IntProperty的属性类型
        CustomProperty strProperty = itemType.AddProperty("StrProperty");//对该ItemType添加名为StrProperty的属性
        strProperty.Type = CustomProperty.TypeKind.String;//设置StrProperty的属性类型
        strProperty.DefaultValue = "test string";//为StrProperty设置默认值,若不进行设置则默认为空
        bool result= itemTypeLibrary.Write();//将ItemTypeLibrary中的信息进行写入更新           
    
        if (result)//判断写入是否成功
        {
            MessageBox.Show("Input ItemType Success");//若成功输出输入ItemType成功的提示框
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在本案例中,首先在文件中查看是否存在同名的(“testLib”)的ItemTypeLibrary,若不存在则执行创建操作。然后在指定库中添加名为"testItemTypeName"的ItemType,并对其中的属性及默认属性值进行设置,完成后更新信息。
    在这里插入图片描述

    删除ItemType

    当我们需要删除ItemTypeLibrary中指定的ItemType时,需要使用RemoveItemType( )方法达到相应的效果。步骤为首先在文件中获得指定名称的ItemTypeLibrary中的ItemType,然后执行删除操作。

    public static void DeleteItemType(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//根据声明名称获取对应的ItemTypeLibrary
        if (null == itemTypeLibrary)//判断文件中是否存在同名ItemTypeLibrary
        {
            MessageBox.Show("Can't find itemType library!");//若文件中不存在同名ItemTypeLibrary,则对话框提示未找到ItemTypeLibrary的提示框
            return;//返回
        }
        ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);//通过名称在ItemTypeLibrary中查找对应的ItemType
        bool result = itemTypeLibrary.RemoveItemType(itemType);//删除ItemTypeLibrary中的指定ItemType
        if (result)//判断在ItemTypeLibrary是否将指定ItemType成功删除
        {
            MessageBox.Show("Remove ItemType Success");//若删除成功则在对话框中输出移除ItemType成功的提示
        }
        itemTypeLibrary.Write();//将ItemTypeLibrary中的信息进行写入更新
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在本案例中,首先获得名为"testLib"的ItemTypeLibrary中名为"testItemTypeName"的ItemType,随后对指定名称的ItemType执行删除操作。
    执行前
    执行后

    删除ItemTypeLibrary

    当我们需要删除整个ItemTypeLibrary时,需要使用Delete()方法达到相应的效果。步骤为首先在文件中获得指定名称的ItemTypeLibrary,然后执行删除操作。在本案例中,名为"testLib"的ItemTypeLibrary被成功删除。

    public static void DeleteItemTypeLib(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//根据声明名称获取对应的ItemTypeLibrary
        if (null == itemTypeLibrary)//判断文件中是否存在同名ItemTypeLibrary
        {
            MessageBox.Show("Can't find itemType library!");//若文件中不存在同名ItemTypeLibrary,则对话框提示未找到ItemTypeLibrary的提示框
            return;//返回
        }            
        SchemaDeleteStatus status= itemTypeLibrary.Delete();//删除指定的ItemTypeLibrary
        MessageBox.Show("ItemTypeLib remove status:\n"+status.ToString());//在对话框中输出ItemTypeLibrary的删除结果
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    删除前
    删除后

    挂接ItemType

    当我们创建成功ItemType及其属性后,若想对象真正表现工程属性的特征,那么就需要将工程属性挂接到模型中。关于挂接ItemType的操作方法为首先获得需要进行挂接的对象与用于挂接的ItemType,声明元素的CustomItemHost后对其添加ItemType实例,并可对其中的属性值进行设置,设置完成后更新ItemType信息。

    扩展知识:

    DomainClass:
    域类从用户或应用程序提供的ECClass(例如,由CustomItemType定义)获得。ECClass中可用于参数化建模的所有ECProperties(即可转换为ParameterType enum定义的类型之一)将成为“域”参数。域参数支持比本地(“工作”)参数更有限的修改,尤其是它们的名称和类型不能修改,因为它们是由用户的ECSchema定义的。域参数的范围和可见性可以修改,其值可以通过表达式定义。提供的实例的属性值将提供每个域参数的初始值。这些值也将应用于所有IParameterSets。

    public static void AttachItemTypeToElem(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
    
        #region Create ConeElement
        DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
    
        DPoint3d topCenter = new DPoint3d(0, 0, 100000);//定义顶部圆锥(台)圆心坐标
        DPoint3d bottomCenter = DPoint3d.Zero;//定义底部圆锥(台)圆心坐标
    
        ConeElement cone = new ConeElement(dgnModel, null, 50000, 100000, topCenter, bottomCenter, DMatrix3d.Identity, true);//定义圆锥(台)元素        
        #endregion
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//根据声明名称获取对应的ItemTypeLibrary
        if (null == itemTypeLibrary)//判断文件中是否存在同名ItemTypeLibrary
        {
            MessageBox.Show("Can't find ItemType Library");//若文件中不存在同名ItemTypeLibrary,则对话框提示未找到ItemTypeLibrary的提示框
            return;//返回
        }
        ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);//根据声明名称获取对应的ItemType
    
        CustomItemHost host = new CustomItemHost(cone, true);//声明元素的CustomItemHost
        IDgnECInstance item = host.ApplyCustomItem(itemType, true);//对CustomItemHost添加ItemType得到EC实例
        item.SetValue("IntProperty", 123);//设置属性值
        item.SetValue("StrProperty", "CCCC");
        
        //Set Domain class on Item type.
        EditParameterDefinitions defs = EditParameterDefinitions.GetForModel(dgnModel);//获得模型中的参数定义
        DgnECInstanceEnabler enabler = DgnECManager.Manager.ObtainInstanceEnabler(dgnFile, itemType.ECClass);//获得文件中使用指定EC类的EC实例
        if (null != enabler && enabler.SupportsCreateInstanceOnElement)//判断是否是否支持对元素挂接EC实例
            defs.SetDomainParameters(enabler.SharedWipInstance);//对参数定义设置域参数
    
        item.ScheduleChanges(cone);//对圆锥(台)元素更新ItemType信息
        cone.AddToModel();//将圆锥(台)写入模型                      
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    挂接前
    挂接后
    属性挂接结果

    读取元素挂接属性

    当我们需要根据工程属性中的参数执行不同操作时,需要查看其属性值,而查看属性值的方法是首先找到需要查询的元素,获得其EC实例,然后从对应ItemType中获得属性名称,根据属性名称查看EC实例中该属性的属性值。

    public static void ReadItemTypeOnElem(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
    
        ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得当前模型中的所有图形元素
        foreach (Element elem in elems)//遍历模型中的所有图形元素
        {
            CustomItemHost host = new CustomItemHost(elem, true);//声明CustomItemHost
            IDgnECInstance item = host.GetCustomItem(itemLibName, itemTypeName);//获得CustomItemHost中指定ItemTypeLibrary中的ItemType的EC实例
            ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//从文件中中获得指定名称的ItemTypeLibrary
            ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);//根据声明名称获取对应的ItemType
            CustomProperty property = itemType.GetPropertyByName("StrProperty");//根据声明名称获取对应的CustomProperty
            string internalName = property.InternalName;//获得属性内部名称
            IECPropertyValue val = item.GetPropertyValue(internalName);//根据属性名称获得属性值
            MessageBox.Show(val != null ? val.StringValue : "val==null");//在对话框中输出属性值
        }                        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在本案例中,对挂接名为"testLib"的ItemTypeLibrary中名为"testItemTypeName"的ItemType中"StrProperty"值进行查看,从结果可以获得其属性值为"CCCC"。
    在这里插入图片描述
    在这里插入图片描述

    取消挂接ItemType

    当我们需要对挂接在元素上的工程属性取消挂接时,需要使用ScheduleDelete( )移除元素上的ItemType,实现的步骤大致为获取需要取消工程属性挂接的元素,获得其对应的EC实例,在EC实例中删除元素后对元素进行更新。

    public static void DetachItemTypeOnElem(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
    
        DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
        ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得当前模型中的所有图形元素
        foreach (Element elem in elems)//遍历模型中的所有图形元素
        {
            Element newElem = elem;//声明元素
            CustomItemHost host = new CustomItemHost(newElem, true);//声明元素的CustomItemHost
            IDgnECInstance item = host.GetCustomItem(itemLibName, itemTypeName);//获得CustomItemHost中指定ItemTypeLibrary中的ItemType的EC实例
    
            item.ScheduleDelete(newElem);//移除元素的ItemType
            newElem.ReplaceInModel(elem);//将元素取代
        }            
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    在这里插入图片描述

    修改工程属性值

    当我们需要修改工程属性值时,大致的步骤为首先获得元素上挂接的EC实例,然后再对应的ItemTypeLibrary中获得对应的ItemType与需要修改的属性,对其属性值进行设置,设置完成后修改元素上挂接的ItemType并对元素执行更新操作。

    public static void ChangeItemTypeValueOnElem(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
    
        ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得当前模型中的所有图形元素
        foreach (Element elem in elems)//遍历模型中的所有图形元素
        {
            Element newElem = elem;//声明元素
    
            CustomItemHost host = new CustomItemHost(elem, true);//声明元素的CustomItemHost
            IDgnECInstance item = host.GetCustomItem(itemLibName, itemTypeName);//获得CustomItemHost中指定ItemTypeLibrary中的ItemType的EC实例
            if (item!=null)//判断是否存在指定要求的EC实例
            {
                ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//从文件中中获得指定名称的ItemTypeLibrary
                ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);//根据声明名称获取对应的ItemType
                CustomProperty property = itemType.GetPropertyByName("StrProperty");//根据声明名称获取对应的CustomProperty
                string internalName = property.InternalName;//获得属性内部名称
                IECPropertyValue val = item.GetPropertyValue(internalName);//根据属性名称获得属性值
    
                val.StringValue = "Changed string";//设置属性值
                item.ScheduleChanges(elem);//修改元素的ItemType
                newElem.ReplaceInModel(elem);//将元素取代
            }                           
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述
    在这里插入图片描述

    添加ItemType属性

    当我们的工程属性有变动需要执行添加ItemType属性操作时,我们就需要使用AddProperty( )来对已有的ItemType添加指定的属性,此时所有元素挂接了的该ItemType都会同步更新。

    public static void AddItemTypeProperty(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//从文件中中获得指定名称的ItemTypeLibrary
        if (null == itemTypeLibrary)//判断是否成功获取ItemTypeLibrary
        {
            MessageBox.Show("Find item type lib failure,please check");//对话框输出未找到指定ItemTypeLibrary
            return;//返回
        }
        ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);//根据声明名称获取对应的ItemType
        if (null == itemType)//判断是否成功获取ItemType
        {
            MessageBox.Show("Find item type failure,please check");//对话框输出未找到指定ItemType
            return;//返回
        }            
        CustomProperty douProperty = itemType.AddProperty("DoubleProperty");//在ItemType添加属性
        douProperty.Type = CustomProperty.TypeKind.Double;//设置属性类型
        douProperty.DefaultValue = 0.01;//设置属性默认值
        bool result = itemTypeLibrary.Write();//将修改后的ItemTypeLibrary更新写入
        if (result)//判断是否写入成功
        {
            MessageBox.Show("Add ItemType Property Success");//对话框输出添加ItemType属性成功
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在本案例中,在名为"testItemTypeName"的ItemType中添加了一个名为"DoubleProperty"的double类属性,并设置其默认值为0.01,此时,元素上挂接了该ItemType也同步执行了添加属性的更新。
    在这里插入图片描述
    在这里插入图片描述

    移除ItemType属性

    当我们的工程属性有变动需要执行移除ItemType属性操作时,我们就需要使用RemoveProperty( )来对已有的ItemType移除指定的属性,此时所有元素挂接的该ItemType都会同步更新。

    public static void RemoveItemTypeProperty(string unparsed)
    {
        string itemLibName = "testLib";//设置ItemTypeLibrary的名称
        string itemTypeName = "testItemTypeName";//设置ItemType的名称
        string propertyName = "StrProperty";//设置属性名称
    
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//从文件中中获得指定名称的ItemTypeLibrary
        if (null == itemTypeLibrary)//判断是否成功获取ItemTypeLibrary
        {
            MessageBox.Show("Find item type lib failure,please check");//对话框输出未找到指定ItemTypeLibrary
            return;//返回
        }
        ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);//根据声明名称获取对应的ItemType
        if (null == itemType)//判断是否成功获取ItemType
        {
            MessageBox.Show("Find item type failure,please check");//对话框输出未找到指定ItemType
            return;//返回
        }
        CustomProperty property = itemType.GetPropertyByName(propertyName);//在ItemType中根据名称获得CustomProperty
        if (null==property)//判断是否存在指定CustomProperty
        {
            MessageBox.Show("Find item type property failure,please check");//对话框输出
            return;//返回
        }
        itemType.RemoveProperty(property);//移除ItemType上的指定属性
        bool result = itemTypeLibrary.Write();//将修改后的ItemTypeLibrary更新写入
        if (result)//判断写入是否成功
        {
            MessageBox.Show("Remove ItemType Property Success");//在对话框中输出移除ItemType属性成功
        }            
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在本案例中,在名为"testItemTypeName"的ItemType中移除了一个名为"StrProperty"的属性,此时,元素上挂接的该ItemType也同步执行了移除属性的更新。
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    前端面试 10个前端小知识
    02-MySQL-基础-增删改查
    Vue常见面试题 - 01
    基于未知环境碰撞冲突预测的群机器人多目标搜索研究
    【C语言易错点】循环结构
    「PHP系列」PHP E-mail 注入/防止注入
    @Resource和@Autowired的区别
    YOLO9000: Better, Faster, Stronger (Yolov2)论文详细解读
    Redis的持久化之RDB和AOF
    用免费GPU线上优化猫狗识别实践
  • 原文地址:https://blog.csdn.net/weixin_43602823/article/details/138164446