当我们需要对模型中的元素分组时,就需要使用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();//将椭圆元素写入模型
#endregion
string groupName = "TestGroupName";//设置NamedGroup名称
string groupDescription = "TestGroupDescription";//设置NamedGroup描述
NamedGroupFlags flags = new NamedGroupFlags();//声明NamedGroup设置
NamedGroup group = new NamedGroup(groupName,groupDescription, flags, dgnmodelRef);//声明NamedGroup
NamedGroupMemberFlags 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();//将椭圆元素写入模型
#endregion
string groupName1 = "TestGroupName1";//设置NamedGroup名称
string groupDescription1 = "TestGroupDescription1";//设置NamedGroup描述
NamedGroupFlags flags1 = new NamedGroupFlags();//声明NamedGroup设置
NamedGroup group1 = new NamedGroup(groupName1, groupDescription1, flags1, dgnmodelRef);//声明NamedGroup
NamedGroupMemberFlags 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);//声明NamedGroup
NamedGroupMemberFlags 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");//根据名称获取对应的NamedGroup
if (group!=null)//判断是否成功获得指定NamedGroup
{
NamedGroupStatus status= group.DeleteFromFile();//将指定NamedGroup删除
MessageBox.Show("Name Group Delete Status:\n" + status);//输出结果
}
}
本案例中采用上方创建NamedGroup命令,生成了带有NamedGroup属性的元素,使用删除NamedGroup命令后,名为"TestGroupName"的NamedGroup被删除,元素上的NamedGroup属性被移除。
图32 命令执行前
图33 命令执行结果