1. 什么是零件?
指将一个或者多个大的完整的图元按照需要分割成许多小的零件,对整体图元没有实质的影响。
- l零件的特点
所创建的零件对图元没有任何影响,只是显示一个效果;
零件可以单独列入明细表、进行标记、过滤和导出。
- l零件的使用条件
需要展示某种效果或者样式的图元可以使用零件。
- 可创建零件的元素
墙(不包括叠层墙和幕墙);
基础墙;
楼板(不包括多层的形状编辑楼板);
屋顶;
天花板;
结构楼板基础;
楼板边缘;
封檐带;
檐沟;
结构框架;
柱;
结构柱。
可以进行零件创建的图元有
- 分割零件
参照相交:将其他层的参照设置为选定好的那层;
分割零件中的添加:添加的是已经创建成零件的图元;
编辑草图的时候要先选择工作平面。
有间隙地分割零件(可以通过楔形槽 : 楔形槽、槽口 : 槽口、斜踏板 : 斜踏板对零件进行分隔)
排除零件
合并零件(材质、类型、阶段完全相同的零件才能合并;)
分割零件和编辑分区
2.零件的创建
零件的创建,主要通过零件的专用API:PartUtils类来实现。通常的步骤就是,创建一个零件对象,然后对零件对象进行分隔等操作。其主要函数如下表:
编号 |
函数名称 |
说明 |
1 |
AreElementsValidForCreateParts |
标识给定元素们是否可用于创建零件。主要判断当前元素可不可以被创建为零件,非常简单粗暴。 |
2 |
ArePartsValidForDivide |
判断提供的成员是否都可以被分割,就是看看零件们能不能被分隔 |
3 |
ArePartsValidForMerge |
判断传入的零件们是否可以合并 |
4 |
CreateMergedPart |
对零件进行合并 |
5 |
CreateParts(Document, ICollection<(Of <<'(ElementId>)>>)) |
使用原始元素创建一组新零件。案例看3.1 |
6 |
CreateParts(Document, ICollection<(Of <<'(LinkElementId>)>>)) |
使用原始元素创建一组新零件。案例看3.1 |
7 |
DivideParts |
用零件创建分割的零件。案例看3.2 |
8 |
FindMergeableClusters |
将一组元素分隔为对合并有效的子集。 |
9 |
GetAssociatedPartMaker(Document, ElementId) |
获取元素的关联零件生成器PartMaker。 |
10 |
GetAssociatedPartMaker(Document, LinkElementId) |
获取元素的关联零件生成器PartMaker。 |
11 |
GetAssociatedParts(Document, ElementId, Boolean, Boolean) |
返回与给定元素关联的所有零件。 |
12 |
GetAssociatedParts(Document, LinkElementId, Boolean, Boolean) |
返回与给定元素关联的所有零件 |
13 |
GetChainLengthToOriginal |
计算最长的分割/合并链的长度,以到达作为测试零件源的原始非零件元素。 |
14 |
GetMergedParts |
获取指定合并零件所有的源元素集合 |
15 |
GetPartMakerMethodToDivideVolumeFW |
获取允许访问PartMaker的分割体积属性的对象。 |
16 |
GetSplittingCurves(Document, ElementId) |
标识用于创建零件的曲线。 |
17 |
GetSplittingCurves(Document, ElementId, Plane%) |
标识用于创建零件及其所在平面的曲线。 |
18 |
GetSplittingElements |
获取创建当前零件所有的参照对象(参照平面、标高、轴网)。 |
19 |
HasAssociatedParts(Document, ElementId) |
检查元素是否有关联的零件。 |
20 |
HasAssociatedParts(Document, LinkElementId) |
检查元素是否有关联的零件。 |
21 |
IsMergedPart |
是合并的零件 |
22 |
IsPartDerivedFromLink |
判断当前零件是否从链接模型中生成 |
23 |
IsValidForCreateParts |
标识给定元素是否可用于创建零件。 |
3 案例说明
3.1 零件的创建CreateParts
传入需要创建零件的对象,直接可以创建零件
Floor floor = elem as Floor; if (floor != null) { List<ElementId> list = new List<ElementId>(); list.Add(floor.Id); //将当前楼板转换为零件 PartUtils.CreateParts(floor.Document, list); }
3.2 零件的分割DivideParts函数
通过以上函数,可以对已经存在的零件对象进行分隔,其代码如下:
List<ElementId> list = (from element in partsToDivide select element.Id).ToList<ElementId>(); //对当前元素进行拆分 if (!refPlanes.none<ElementId>()) { PartUtils.DivideParts(document, list, refPlanes, new List<Curve>(), sketchPlane.Id); } else { PartUtils.DivideParts(document, list, new List<ElementId>(), arrayDividerCurves, sketchPlane.Id); }
通过分隔零件,会获取一个PartMaker 对象,这个对象我们可以简单的认为是零件的修理器,可以对分隔的零件进行相应的处理.
PartMaker解释如下:PartMaker是一个元素,它获取一些源元素(例如,一堵墙及其所有层)并从中创建一个或多个零件。创建这些部件所依据的逻辑非常重要,PartMaker使用各种PartMakerMethods(当前只有PartMakerMethodToDivideVolumes )来表示这些逻辑。此元素管理为一个或多个原始元素生成部分元素的策略。
通俗的讲PartMaker是一个Element元素,他是用于记录当前零件的分隔策略的,其具有各种PartMakerMethods的方法,来实现对构件进行分隔,我们可以通过这个类的一些属性,查找零件分隔的基本策略:
其包含一个核心成员PartMakerMethodToDivideVolumes 对象,其包含着当前体积拆分的基本策略
1、获取一个零件分隔区域体积处理方法,如通过楔形槽 : 楔形槽、槽口 : 槽口、斜踏板 : 斜踏板对零件进行分隔的关键细节
//获取当前的PartMaker PartMaker associatedPartMaker = PartUtils.GetAssociatedPartMaker(part.Document, part.Id); //获取当前创建类 if (associatedPartMaker != null) { PartMakerMethodToDivideVolumes partMakerMethodToDivideVolumeFW = PartUtils.GetPartMakerMethodToDivideVolumeFW(associatedPartMaker); if (partMakerMethodToDivideVolumeFW != null) { //设置当前的间隙 if (!partMakerMethodToDivideVolumeFW.DivisionGap.Eq(dGap, -1.0)) { partMakerMethodToDivideVolumeFW.DivisionGap = dGap; } //假如族不为空 if (!string.IsNullOrEmpty(sFamilyName) && !string.IsNullOrEmpty(sSymbolName)) { string familiesPath = FamiliesProvider.GetFamiliesPath(FamilyGroup.Profils); Category category = (BuiltInCategory.OST_DivisionProfile).getCategory(part.Document); FamilySymbol symbol = this.elementToDivide.Document.getSymbol(sFamilyName, sSymbolName, familiesPath, LoadBehaviour.OverwriteWithParam, category, CategoryBehaviour.Ignore); //指定当前的族元素 partMakerMethodToDivideVolumeFW.ProfileType = symbol.Id; partMakerMethodToDivideVolumeFW.ProfileMatch = condOrient; } } }
上表指定的API中具有GetSplittingElements、GetSplittingCurves两个函数,其实最终也是从PartMakerMethodToDivideVolumes 获取其基本信息。