当我们需要对模型中的元素分组时,就需要使用NamedGroup功能,不同于单元,他们的元素并没有那么强的组合关系,同时,组与组之间可以实现嵌套,体现元素间的层级关系。
创建NamedGroup
NamedGroup的创建流程为声明NamedGroup后添加成员,然后将NamedGroup写入模型。
public static void CreateNamedGroup(string unparsed)
{DgnModelRef dgnmodelRef = Session.Instance.GetActiveDgnModelRef();//获得当前激活的dgn模型DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的dgn模型double uorMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;//获得当前模型中的单位#region DPoint3d[] ptArr = new DPoint3d[5];//声明面片元素端点集ptArr[0] = new DPoint3d(-15 * uorMeter, -5 * uorMeter, 0 * uorMeter);//声明端点坐标ptArr[1] = new DPoint3d(-15 * uorMeter, 5 * uorMeter, 0 * uorMeter);ptArr[2] = new DPoint3d(-5 * uorMeter, 5 * uorMeter, 0 * uorMeter);ptArr[3] = new DPoint3d(-5 * uorMeter, -5 * uorMeter, 0 * uorMeter);ptArr[4] = new DPoint3d(-15 * uorMeter, -5 * uorMeter, 0 * uorMeter);ShapeElement shapeEle = new ShapeElement(dgnModel, null, ptArr);//声明形元素shapeEle.AddToModel();//将形元素写入模型DPlacementZX dPlaceZX = DPlacementZX.Identity;//声明椭圆放置平面dPlaceZX.Origin = new DPoint3d(-10 * 10000, 0, 0);//设置平面原点DEllipse3d ellipse = new DEllipse3d(dPlaceZX, 5 * uorMeter, 5 * uorMeter, Angle.Zero, Angle.TWOPI);//声明几何椭圆EllipseElement elliElem = new EllipseElement(dgnModel, null, ellipse);//声明椭圆元素elliElem.AddToModel();//将椭圆元素写入模型#endregionstring groupName = "TestGroupName";//设置NamedGroup名称string groupDescription = "TestGroupDescription";//设置NamedGroup描述NamedGroupFlags flags = new NamedGroupFlags();//声明NamedGroup设置NamedGroup group = new NamedGroup(groupName,groupDescription, flags, dgnmodelRef);//声明NamedGroupNamedGroupMemberFlags memberFlags1 = new NamedGroupMemberFlags();//声明NamedGroup成员设置memberFlags1.GroupPropagate = NamedGroupPropagationFlags.Always;//当此元素属于其他组时,是否遍历这些组group.AddMember(shapeEle.ElementId,dgnmodelRef, memberFlags1);//将NamedGroup成员添加到NamedGroup中NamedGroupMemberFlags memberFlags2 = new NamedGroupMemberFlags();//声明NamedGroup成员设置memberFlags2.GroupPropagate = NamedGroupPropagationFlags.Always;//当此元素属于其他组时,是否遍历这些组group.AddMember(elliElem.ElementId, dgnmodelRef, memberFlags2);//将NamedGroup成员添加到NamedGroup中NamedGroupStatus status= group.WriteToFile(true);//将NamedGroup写入文件MessageBox.Show("Name Group Create Status:\n"+status);//输出写入结果
}
本案例中,首先在文件中创建了一个形元素和一个椭圆元素,然后创建了一个NamedGroup,并将刚才创建的两个元素加入到NamedGroup中。当我们删除NamedGroup中的元素时NamedGroup中的信息也会同步更新。
图28 命令执行结果
图29 NamedGroups界面
创建带有层级关系的NamedGroup
当我们需要对模型中的元素进行从属关系分类管理时,可能会使用到具有层级关系表达功能的NamedGroup。在NamedGroup中进行添加时,我们不仅可以添加元素,同时也可以添加NamedGroup,以便对元素或元素集进行管理。
public static void CreateNamedGroupWithHierarchy(string unparsed){DgnModelRef dgnmodelRef = Session.Instance.GetActiveDgnModelRef();//获得当前激活的dgn模型DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的dgn模型double uorMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;//获得当前模型中的单位#region DPoint3d[] ptArr = new DPoint3d[5];//声明面片元素端点集ptArr[0] = new DPoint3d(-15 * uorMeter, -5 * uorMeter, 0 * uorMeter);//声明端点坐标ptArr[1] = new DPoint3d(-15 * uorMeter, 5 * uorMeter, 0 * uorMeter);ptArr[2] = new DPoint3d(-5 * uorMeter, 5 * uorMeter, 0 * uorMeter);ptArr[3] = new DPoint3d(-5 * uorMeter, -5 * uorMeter, 0 * uorMeter);ptArr[4] = new DPoint3d(-15 * uorMeter, -5 * uorMeter, 0 * uorMeter);ShapeElement shapeEle = new ShapeElement(dgnModel, null, ptArr);//声明形元素shapeEle.AddToModel();//将面片元素写入模型DPlacementZX dPlaceZX = DPlacementZX.Identity;//声明椭圆放置平面dPlaceZX.Origin = new DPoint3d(-10 * 10000, 0, 0);//设置平面原点DEllipse3d ellipse = new DEllipse3d(dPlaceZX, 5 * uorMeter, 5 * uorMeter, Angle.Zero, Angle.TWOPI);//声明几何椭圆EllipseElement elliElem = new EllipseElement(dgnModel, null, ellipse);//声明椭圆元素elliElem.AddToModel();//将椭圆元素写入模型#endregionstring groupName1 = "TestGroupName1";//设置NamedGroup名称string groupDescription1 = "TestGroupDescription1";//设置NamedGroup描述NamedGroupFlags flags1 = new NamedGroupFlags();//声明NamedGroup设置NamedGroup group1 = new NamedGroup(groupName1, groupDescription1, flags1, dgnmodelRef);//声明NamedGroupNamedGroupMemberFlags memberFlags1 = new NamedGroupMemberFlags();//当此元素属于其他组时,是否遍历这些组memberFlags1.GroupPropagate = NamedGroupPropagationFlags.Always;//当此元素属于其他组时,是否遍历这些组group1.AddMember(shapeEle.ElementId, dgnmodelRef, memberFlags1);//将NamedGroup成员添加到NamedGroup中group1.WriteToFile(true);//将NamedGroup写入文件string groupName2 = "TestGroupName2";//设置NamedGroup名称string groupDescription2 = "TestGroupDescription2";//设置NamedGroup描述NamedGroupFlags flags2 = new NamedGroupFlags();//声明NamedGroup设置NamedGroup group2 = new NamedGroup(groupName2, groupDescription2, flags2, dgnmodelRef);//声明NamedGroupNamedGroupMemberFlags memberFlags2 = new NamedGroupMemberFlags();//当此元素属于其他组时,是否遍历这些组memberFlags2.GroupPropagate = NamedGroupPropagationFlags.Always;//当此元素属于其他组时,是否遍历这些组group2.AddMember(elliElem.ElementId, dgnmodelRef, memberFlags2);//将NamedGroup成员添加到NamedGroup中(元素)group2.AddMember(group1.GetElement().ElementId, dgnmodelRef, memberFlags2);//将NamedGroup成员添加到NamedGroup中(NamedGroup)group2.WriteToFile(true);//将NamedGroup写入文件}
在本案例中,首先在模型空间中创建了一个形元素与一个椭圆元素,将形元素添加到名为"TestGroupName1"的NamedGroup中,与上面的方法不同,本案例中将椭圆元素和名为"TestGroupName1"的NamedGroup添加到名为"TestGroupName2"的NamedGroup中,从而实现了对具有层级关系的元素进行管理。
图30 命令执行结果
图31 NamedGroups界面
删除NamedGroup
当我们需要删除NamedGroup,需要使用DeleteFromFile( )。大致的流程为遍历模型中的NamedGroup集合,找到指定名称的NamedGroup,然后调用方法删除NamedGroup。
public static void DeleteNamedGroup(string unparsed){DgnModelRef dgnModelRef= Session.Instance.GetActiveDgnModelRef();//获得当前激活的dgn模型NamedGroupCollection groups = new NamedGroupCollection(dgnModelRef);//获得模型中的NamedGroup集NamedGroup group= groups.FindByName("TestGroupName");//根据名称获取对应的NamedGroupif (group!=null)//判断是否成功获得指定NamedGroup{NamedGroupStatus status= group.DeleteFromFile();//将指定NamedGroup删除MessageBox.Show("Name Group Delete Status:\n" + status);//输出结果}}
本案例中采用上方创建NamedGroup命令,生成了带有NamedGroup属性的元素,使用删除NamedGroup命令后,名为"TestGroupName"的NamedGroup被删除,元素上的NamedGroup属性被移除。
图32 命令执行前
图33 命令执行结果