Bentley二次开发教程25-工程属性-EC属性操作方法

发布于:2024-04-28 ⋅ 阅读:(236) ⋅ 点赞:(0)

工程属性操作方法

EC属性操作方法

因为Schema文件导入后没有像ItemType的操作界面,因此若需要了解文件中ECSchema的导入情况,需要使用keyin命令:ecx schema list显示在提示栏中,或使用ecx schema export导出文件查看。

导入Schema文件

字符串创建

我们可以使用字符串编写Schema文件信息,然后使用ECSchema阅读器对字符串执行反序列化获得Schema文件。

public static void ImportSchemaToDgnFile1(string unparsed)
{
    DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
    ImportSchemaOptions options = new ImportSchemaOptions();//声明导入Schema选项            
    IECSchema TestSchema =DefineECSchema1();//定义Schema
    SchemaImportStatus impStatus = DgnECManager.Manager.ImportSchema(TestSchema, dgnFile, options);//导入ECSchema
    MessageBox.Show("Schema Import Status:\n"+impStatus);//对话框输出导入是否成功
}

public static IECSchema DefineECSchema1()
{
    string schemaXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
    + "<ECSchema schemaName=\"ComplexSchema\" nameSpacePrefix=\"ComplexSchema\" version=\"1.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.2.0\">"
    + "  <ECClass typeName=\"Contact\" isStruct=\"True\" isDomainClass=\"False\">"
    + "    <ECProperty propertyName=\"Name\" typeName=\"string\" /> "
    + "    <ECProperty propertyName=\"Age\" typeName=\"int\" /> "
    + "    <ECArrayProperty propertyName=\"PhoneNumber\" typeName=\"string\" /> "
    + "  </ECClass>"
    + "  <ECClass typeName=\"StructClass\" isStruct=\"True\" isDomainClass=\"False\">"
    + "    <ECProperty propertyName=\"StringProperty\" typeName=\"string\" /> "
    + "    <ECProperty propertyName=\"IntProperty\" typeName=\"int\" /> "
    + "    <ECArrayProperty propertyName=\"ArrayProperty\" typeName=\"string\" minOccurs=\"1\" maxOccurs=\"1\" /> "
    + "    <ECArrayProperty propertyName=\"ContactData\" typeName=\"Contact\" isStruct=\"True\" /> "
    + "  </ECClass>"
    + "  <ECClass typeName=\"ComplexClass\" isDomainClass=\"True\">"
    + "    <ECProperty propertyName=\"IntProperty\" typeName=\"int\" />"
    + "    <ECProperty propertyName=\"StringProperty\" typeName=\"string\" /> "
    + "    <ECProperty propertyName=\"DoubleProperty\" typeName=\"double\" /> "
    + "    <ECProperty propertyName=\"DateTimeProperty\" typeName=\"dateTime\" />"
    + "    <ECProperty propertyName=\"BooleanProperty\" typeName=\"boolean\" />"
    + "    <ECProperty propertyName=\"APoint2d\" typeName=\"point2d\" />"
    + "    <ECProperty propertyName=\"APoint3d\" typeName=\"point3d\" />"
    + "    <ECProperty propertyName=\"ALong\"   typeName=\"long\" />"
    + "    <ECProperty propertyName=\"ABinary\" typeName=\"binary\" />"
    + "    <ECArrayProperty propertyName=\"SimpleArrayProperty\" typeName=\"string\"/>"
    + "    <ECArrayProperty propertyName=\"FixedArrayProperty\" typeName=\"string\" minOccurs=\"1\" maxOccurs=\"1\" />"
    + "    <ECArrayProperty propertyName=\"StructArrayProperty\" typeName=\"StructClass\" isStruct=\"True\" />"
    + "    <ECArrayProperty propertyName=\"FixedStructArrayProperty\" typeName=\"StructClass\" minOccurs=\"1\" maxOccurs=\"1\" isStruct=\"True\" />"
    + "    <ECStructProperty propertyName=\"StructProperty\" typeName=\"StructClass\" />"
    + "  </ECClass>"
    + "</ECSchema>";//设置EC Schema

    ECSchemaXmlStringReader xmlReader = new ECSchemaXmlStringReader(schemaXml);//声明ECSchema阅读器
    IECSchema deserializedSchema = xmlReader.Deserialize();//将EC Schema阅读器读取到的信息反序列化
    return deserializedSchema;//返回ECSchema
}
在本案例中,名为ComplexSchema,版本为1.0的Schema文件被成功加载。

在这里插入图片描述

代码创建

使用该方法可以使用代码的方法一次创建Schema与其中的EC类及属性。

public static void ImportSchemaToDgnFile2(string unparsed)
{
    DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
    ImportSchemaOptions options = new ImportSchemaOptions();//声明导入Schema选项 
    IECSchema testSchema = DefineECSchema2();//定义Schema
    SchemaImportStatus impStatus = DgnECManager.Manager.ImportSchema(testSchema, dgnFile, options);//导入ECSchema
    MessageBox.Show("Schema Import Status:\n" + impStatus);//对话框输出导入是否成功
}

public static IECSchema DefineECSchema2()
{
    IECSchema schema = new ECSchema("ComplexSchema2", 1, 1, "");//声明ECSchema
    //create the Project class
    ECClass prjClass = new ECClass("ProjectClass");//创建EC类
    prjClass.Add(new ECProperty("ProjectID", Bentley.ECObjects.ECObjects.IntegerType));//在EC类中添加EC属性
    prjClass.Add(new ECProperty("ProjectName", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性
    prjClass.Add(new ECProperty("ProjectCost", Bentley.ECObjects.ECObjects.DoubleType));//在EC类中添加EC属性
    prjClass.IsCustomAttribute = false;//设置EC类是否为自定义属性
    prjClass.IsDomainClass = true;//设置EC类是否是域类
    schema.AddClass(prjClass);//在ECSchema中添加EC类

    //create the Member class
    ECClass memberClass = new ECClass("MemberClass");//声明EC类
    memberClass.Add(new ECProperty("MemberName", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性
    memberClass.Add(new ECProperty("MemberID", Bentley.ECObjects.ECObjects.IntegerType));//在EC类中添加EC属性
    memberClass.Add(new ECProperty("MemberRole", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性
    memberClass.IsCustomAttribute = false;//设置EC类是否为自定义属性
    memberClass.IsDomainClass = true;//设置EC类是否是域类
    schema.AddClass(memberClass);//在ECSchema中添加EC类
    return schema;//返回ECSchema
}

在本案例中,名为ComplexSchema2,版本为1.1的Schema文件被成功加载。
在这里插入图片描述

文件导入

使用该方法可以从外部Schema文件中获得工程属性信息并导入文件中。使用这种方法时需要确定导入Schema文件的路径与名称,然后导入文件即可。

public static void ImportSchemaToDgnFile3(string unparsed)
    {
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        ImportSchemaOptions options = new ImportSchemaOptions();//声明导入Schema选项  
        string searchpath = @"E://工作相关//20211213MS案例直播//直播资料//Part6//ECAndItemTypeIntroduction//Schema//";//设置ECSchema存放路径
        IECSchemaLocater SearchPathLocater = new SearchPathSchemaFileLocater(searchpath);//根据存放路径获取ECSchema
        Bentley.ECObjects.ECObjects.AddSchemaLocater(SearchPathLocater);//在EC对象中添加ECSchema定位器
        string schemafullname = "ComplexSchema";//设置ECSchema全名
        IECSchema testSchema =
        Bentley.ECObjects.ECObjects.LocateSchema(schemafullname, SchemaMatchType.Exact, null, null);//根据名称定位ECSchema
        if(null==testSchema)//判断是否成功获得ECSchema
        {
            MessageBox.Show("Schema not found, please check");//对话框输出未获得指定ECSchema
            return;//返回
        }
        SchemaImportStatus impStatus = DgnECManager.Manager.ImportSchema(testSchema, dgnFile, options);//导入ECSchema
        MessageBox.Show("Schema Import Status:\n" + impStatus);//在对话框中输出ECSchema导入状态
    }    

在本案例中,名为ComplexSchema的Schema文件被成功加载。
在这里插入图片描述

创建EC实例

元素上创建EC实例

当我们导入Schema文件后,若要对元素赋予EC实例,那么首先需要找到需要赋予的ECSchema,再根据类名找到赋予元素的EC类,可在赋予前对EC类中的EC属性值进行修改,修改完成后在元素上创建EC实例。

public static void CreateECInstanceOnElem(string unparsed)
{
    try
    {
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        string schemafullname = "ComplexSchema";//设置ECSchema全名
        IECSchema testSchema =
        Bentley.ECObjects.ECObjects.LocateSchema(schemafullname, SchemaMatchType.Exact, null, null);//根据名称定位ECSchema
        if (null == testSchema)//判断是否成功获得ECSchema
        {
            MessageBox.Show("Schema not found, please check");//对话框输出未获得指定ECSchema
            return;//返回
        }
        IECClass ecClass = testSchema.GetClass("ComplexClass");//获得指定名称的EC类
        DgnECInstanceEnabler instanceEnabler = DgnECManager.Manager.ObtainInstanceEnabler(dgnFile, ecClass);//获得EC实例启动器

        StandaloneECDInstance instance = instanceEnabler.SharedWipInstance;
        instance.SetInteger("IntProperty", 100);
        IECArrayValue arrayValue = null;
        if (null != (arrayValue = instance["FixedStructArrayProperty"] as IECArrayValue))
        {
            IECStructValue structValue;
            structValue = arrayValue[0] as IECStructValue;
            structValue["StringProperty"].StringValue = "MyStrVal1";
            structValue["IntProperty"].IntValue = 11;
            structValue = arrayValue[1] as IECStructValue;
            structValue["StringProperty"].StringValue = "MyStrVal2";
            structValue["IntProperty"].IntValue = 22;
        }

        #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);//定义圆锥(台)元素  
        cone.AddToModel();//将圆锥(台)写入模型  
        #endregion

        IDgnECInstance instanceOnElement = instanceEnabler.CreateInstanceOnElement(cone, instance, false);//在元素上创建EC实例              
        StatusInt status = instanceOnElement.ScheduleChanges(cone);//更新元素上的EC实例
        if (status == StatusInt.Success)//判断是否更新成功
        {
            MessageBox.Show("Create EC On Element Success");//对话框输出创建成功的信息
        }
    }
    catch (Exception ex)
    {
        MessageCenter.Instance.StatusMessage = ex.Message;//输出错误状态信息
        MessageCenter.Instance.StatusWarning = ex.Message;//输出错误警告信息
    }
}

在本案例中可以发现名为"ComplexClass"的EC类生成实例被成功附加在元素上。
在这里插入图片描述

模型上创建EC实例

当我们导入Schema文件后,若要对模型赋予EC实例,那么首先需要找到需要赋予的ECSchema,再根据类名找到赋予元素的EC类,可在赋予前对EC类中的EC属性值进行修改,修改完成后在模型上创建EC实例。

public static void CreateECInstanceOnModel(string unparsed)
{
    try
    {
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
        string schemafullname = "ComplexSchema";//设置ECSchema全名
        IECSchema testSchema =
        Bentley.ECObjects.ECObjects.LocateSchema(schemafullname, SchemaMatchType.Exact, null, null);//根据名称定位ECSchema
        if (null == testSchema)//判断是否成功获得ECSchema
        {
            MessageBox.Show("Schema not found, please check");//对话框输出未获得指定ECSchema
            return;//返回
        }
        IECClass ecClass = testSchema.GetClass("ComplexClass");//获得指定名称的EC类
        DgnECInstanceEnabler instanceEnabler = DgnECManager.Manager.ObtainInstanceEnabler(dgnFile, ecClass);//获得EC实例启动器
        IDgnECInstance instanceOnModel = instanceEnabler.CreateInstanceOnModel(dgnModel, instanceEnabler.SharedWipInstance);//在模型上创建EC实例 
        StatusInt status= instanceOnModel.WriteChanges();//更新模型上的EC实例
        if (status==StatusInt.Success)//判断EC实例是否更新成功
        {
            MessageBox.Show("Create EC On Model Success");//对话框输出结果
        }
    }
    catch (Exception ex)
    {
        MessageCenter.Instance.StatusMessage = ex.Message;//输出错误状态信息
        MessageCenter.Instance.StatusWarning = ex.Message;//输出错误警告信息
    }
}     

在本案例中可以发现名为"ComplexClass"的EC类生成实例被成功附加在模型上。
在这里插入图片描述

文件上创建EC实例

当我们导入Schema文件后,若要对文件赋予EC实例,那么首先需要找到需要赋予的ECSchema,再根据类名找到赋予元素的EC类,可在赋予前对EC类中的EC属性值进行修改,修改完成后在文件上创建EC实例。

public static void CreateECInstanceOnFile(string unparsed)
{
    try
    {
        DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        string schemafullname = "ComplexSchema";//设置ECSchema全名
        IECSchema testSchema =
        Bentley.ECObjects.ECObjects.LocateSchema(schemafullname, SchemaMatchType.Exact, null, null);//根据名称定位ECSchema
        if (null == testSchema)//判断是否成功获得ECSchema
        {
            MessageBox.Show("Schema not found, please check");//对话框输出未获得指定ECSchema
            return;//返回
        }
        IECClass ecClass = testSchema.GetClass("ComplexClass");//获得指定名称的EC类
        DgnECInstanceEnabler instanceEnabler = DgnECManager.Manager.ObtainInstanceEnabler(dgnFile, ecClass);//获得EC实例启动器
        IDgnECInstance instanceOnFile = instanceEnabler.CreateInstanceOnFile(dgnFile, instanceEnabler.SharedWipInstance);//在文件上创建EC实例 
        StatusInt status = instanceOnFile.WriteChanges();//更新文件上的EC实例
        if (status == StatusInt.Success)//判断EC实例是否更新成功
        {
            MessageBox.Show("Create EC On File Success");//对话框输出结果
        }
    }
    catch (Exception ex)
    {
        MessageCenter.Instance.StatusMessage = ex.Message;//输出错误状态信息
        MessageCenter.Instance.StatusWarning = ex.Message;//输出错误警告信息
    }
}

在本案例中可以发现名为"ComplexClass"的EC类生成实例被成功附加在文件上。
在这里插入图片描述

更新ECSchema

当我们需要修改ECSchema时,我们可以使用DgnECManager.Manager.UpdateSchema( )的方法对Schema中的内容进行修改。

public static void UpdateSchema(string unparsed)
{
    DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
    DgnECConnectionOptions options = new DgnECConnectionOptions();//声明EC连接选项
    string schemafullname = "ComplexSchema";//设置ECSchema全名
    IECSchema testSchema =
    Bentley.ECObjects.ECObjects.LocateSchema(schemafullname, SchemaMatchType.Exact, null, null);//根据名称定位ECSchema
    if (null == testSchema)//判断是否成功获得ECSchema
    {
        MessageBox.Show("Schema not found, please check");//对话框输出未获得指定ECSchema
        return;//返回
    }
    IECClass ecClass = testSchema.GetClass("ComplexClass");//获得指定名称的EC类
    ecClass.Add(new ECProperty("MemberName", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性
    ecClass.Add(new ECProperty("MemberID", Bentley.ECObjects.ECObjects.IntegerType));//在EC类中添加EC属性
    ecClass.Add(new ECProperty("MemberRole", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性

    ecClass.Remove("IntProperty");//在EC类中移除指定EC属性
    ecClass.Remove("StringProperty");//在EC类中移除指定EC属性

    UpdateSchemaOptions uoption = new UpdateSchemaOptions();//声明ECSchema更新选项
    SchemaUpdateStatus ustatus = DgnECManager.Manager.UpdateSchema(testSchema, dgnFile, uoption);//更新ECSchema
    if (ustatus == SchemaUpdateStatus.Success)//判断是否更新成功
    {
        MessageBox.Show("Data update success");//对话框输出数据更新成功
    }
    else
    {
        MessageBox.Show("Data update failure:\n" + ustatus.ToString());//对话框输出更新失败原因
    }            
}

在本案例中我们对比可以发现,在名为"ComplexClass"EC类中,移除了IntProperty与StringProperty属性,添加了MemberName,MemberID与MemberRole属性。
更新前
更新后

修改EC实例属性值

当我们需要修改元素上挂接的EC实例中的属性值时,首先得到获得需要修改属性值的元素,然后找到执行EC类上的指定属性,对其值进行修改。

public static void ChangeECInstancePropertyValueOnElem(string unparsed)
{
    DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
    ModelElementsCollection elems = dgnModel.GetGraphicElements();//获得模型空间中的图形元素
    foreach (Element elem in elems)//遍历图形元素
    {
        DgnECInstanceCollection instCol = DgnECManager.Manager.GetElementProperties(elem, ECQueryProcessFlags.SearchAllClasses);//获得元素EC实例集
        foreach (IDgnECInstance instance in instCol)//遍历属性集中的EC实例
        {
            if (instance.ClassDefinition.Name == "ComplexClass")//根据实例类名称条件筛选
            {
                instance.SetString("StringProperty", "Test for Change EC Instance Property on Element");//设置属性值
                instance.WriteChanges();//更新文件上的EC实例
            }
        }                
    }
}

本案例中,名为"StringProperty"的EC属性将原来为空的属性值修改为"Test for Change EC Instance Property on Element"的字符串。
在这里插入图片描述
在这里插入图片描述

移除元素上的EC实例

当我们移除元素上挂接的EC实例时,首先需要找到需要移除EC实例的元素,然后获取对应的EC实例后使用Delete( )执行EC实例删除的操作。

public static void RemoveECInstanceOnElem(string unparsed)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
    ModelElementsCollection elems= dgnModel.GetGraphicElements();//获得模型空间中的图形元素
    foreach (Element elem in elems)//遍历图形元素
    {
        DgnECInstanceCollection instCol = DgnECManager.Manager.GetElementProperties(elem, ECQueryProcessFlags.SearchAllClasses);//获得元素EC实例集
        foreach (IDgnECInstance instance in instCol)//遍历属性集中的EC实例
        {
            if (instance.ClassDefinition.Name == "ComplexClass")//根据实例类名称条件筛选
            {
                DeleteDgnECInstanceStatus state =instance.Delete();//删除EC实例
                MessageBox.Show("Remove EC Instance On Elem Status:\n" + state.ToString());//对话框输出删除结果                        
            }
        }
    }
}

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

创建ECRelationship

当我们需要建立EC类之间的关系时,就需要使用ECRelationship。首先我们需要在Schema文件中对用于关联的EC类与对应的ECRelationship进行定义,定义完成后才能实现对ECRelationship的挂接操作。为了说明问题,我们举一个较为简单的例子,下方的Schema文件中定义了三个EC类,分别名为"Widget",“Gadget1"与"Gadget2”。而下方的ECRelationshipClass中将三者之间的关系进行定义,即名为"Widget"拥有"Gadget1"与"Gadget2"。

<?xml version="1.0" encoding="utf-8"?>
<ECSchema schemaName="Simple" nameSpacePrefix="demo" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.2.0">
  <ECClass typeName="Widget" isDomainClass="True">
    <ECProperty propertyName="Manufacturer" typeName="string" />
  </ECClass>
  <ECClass typeName="Gadget1" isDomainClass="True">
    <ECProperty propertyName="Manufacturer" typeName="string" />
  </ECClass>
  <ECClass typeName="Gadget2" isDomainClass="True">
    <ECProperty propertyName="Manufacturer" typeName="string" />
  </ECClass>
  <ECRelationshipClass typeName="WidgetHasGadgets" description="WidgetHasGadgets" isDomainClass="True" strength="referencing" strengthDirection="forward">
    <Source cardinality="(1,1)" roleLabel="has Gadgets" polymorphic="False">
      <Class class="Widget" />
    </Source>
    <Target cardinality="(1,N)" roleLabel="are held by Widget" polymorphic="False">
      <Class class="Gadget1" />
      <Class class="Gadget2" />
    </Target>
  </ECRelationshipClass>
</ECSchema>
#region Create ECInstanceRelationship
        LineElement gadgetLine = CreateLine(0, 0, 0, 100);//创建线元素

        IECClass ecGadgetClass1 = ecSimpleSchema.GetClass("Gadget1");//在ECSchema中获取指定名称的EC类

        DgnECInstanceEnabler gadgetEnabler1 = dgnECManager.ObtainInstanceEnabler(activeDgnFile, ecGadgetClass1);//获得EC实例启动器
        ECDInstance gadgetWipInstance1 = gadgetEnabler1.SharedWipInstance;//获得EC实例
        gadgetWipInstance1.SetAsString("Manufacturer", "Sample App Gadget Manufacturer1");//设置对应属性值  
        gadgetInstance1 = gadgetEnabler1.CreateInstanceOnElement(gadgetLine, gadgetWipInstance1, false);//在元素上创建EC实例

        IECClass ecGadgetClass2 = ecSimpleSchema.GetClass("Gadget2");
        DgnECInstanceEnabler gadgetEnabler2 = dgnECManager.ObtainInstanceEnabler(activeDgnFile, ecGadgetClass2);//获得EC实例启动器
        ECDInstance gadgetWipInstance2 = gadgetEnabler2.SharedWipInstance;//获得EC实例
        gadgetWipInstance2.SetAsString("Manufacturer", "Sample App Gadget Manufacturer2");//设置对应属性值  
        gadgetInstance2 = gadgetEnabler2.CreateInstanceOnElement(gadgetLine, gadgetWipInstance2, false);//在元素上创建EC实例

        MessageCenter.Instance.StatusMessage = "Success_GadgetCreate";//输出EC实例创建成功的信息
    }
    catch (Exception ex)
    {
        MessageCenter.Instance.StatusWarning = ex.Message;//输出错误信息
    }
}

/// <summary>
/// creating relationship between gadget and widget instance.
/// </summary>
public static void CreatingWidgetGadgetRelationship(IECSchema ecSimpleSchema)
{
    try
    {
        DgnFile activeDgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
        DgnECManager dgnECManager = DgnECManager.Manager;//获取DgnECManager
        if (null == dgnECManager)//判断DgnECManager是否存在
            return;//返回
        if (null == ecSimpleSchema)//判断ECSchema是否存在
        {
            MessageCenter.Instance.StatusWarning = "ERROR_SCHEMANOTFOUND";//输出未找到ECSchema的提示
            return;//返回
        }
        string widgetHasGadgetClassName = "WidgetHasGadgets"; //设置ECRelationship名称,其中ECRelationship名称已经存在ECShema中
        IECRelationshipClass widgetHasGadgetRelationshipClass = ecSimpleSchema.GetClass(widgetHasGadgetClassName) as IECRelationshipClass;//获得ECRelationship                
        DgnECRelationshipEnabler relationshipEnabler = dgnECManager.ObtainDgnECRelationshipEnabler(activeDgnFile, widgetHasGadgetRelationshipClass);//为IECRelationshipClass-DgnFile对创建ECRelationship启动器
        if (null == relationshipEnabler)//判断ECRelationship启动器是否成功激活
        {
            MessageCenter.Instance.StatusWarning = "ERROR_REL_ENABLER";//输出ECRelationship启动器不可用的提示
            return;//返回
        }

        IECRelationshipInstance relationshipInstance = relationshipEnabler.CreateRelationshipOnElement(widgetInstance, gadgetInstance1);//在元素上创建ECRelationship实例
        if (null == relationshipInstance)//判断ECRelationship实例是否存在
        {
            MessageCenter.Instance.StatusWarning = "ERROR_REL_INSTANCE";//输出ECRelationship实例获取失败的提示
            return;//返回
        }
        relationshipInstance = relationshipEnabler.CreateRelationshipOnElement(widgetInstance, gadgetInstance2);//在元素上创建ECRelationship实例
        if (null == relationshipInstance)//判断ECRelationship实例是否存在
        {
            MessageCenter.Instance.StatusWarning = "ERROR_REL_INSTANCE";//输出ECRelationship实例获取失败的提示
            return;//返回
        }
    }
    catch (Exception ex)
    {
        MessageCenter.Instance.StatusWarning = ex.Message;//输出错误信息
    }
}

private static LineElement CreateLine(int x1, int y1, int x2, int y2)
{
    DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型空间
    DSegment3d segment = new DSegment3d(x1, y1, x2, y2);//创建直线几何
    LineElement line = new LineElement(dgnModel, null, segment);//创建线元素
    line.AddToModel();//将线元素写入模型
    return line;//返回线元素
}
#endregion
#endregion   

在这里插入图片描述