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 獲取其基本信息。