Revit獲取元素的巢狀族
前言
在Revit外掛開發過程中,有時有獲取元素的巢狀族的需要,這裡記錄一下開發過程中,遇到的關於巢狀族獲取方面問題和處理方法。
獲取元素巢狀族
使用類方法獲取
首先我們知道,巢狀族只在FamilyInstance
型別元素中才存在。
透過檢視Revit API,可以發現該類下有個獲取族子元件的方法。
// FamilyInstance.GetSubComponentIds Method
public ICollection<ElementId> GetSubComponentIds()
同時,透過外掛RevitLookup
,也能直觀的看到元素的組成情況。
說到這裡,就有問題了。
開發過程中,發現這樣獲取到的不全,部分元素的巢狀族沒有全部獲取到。
檢查發現:只有當被引用巢狀的族存在於
專案
的專案瀏覽器
族列表中時,該族才能透過GetSubComponentIds
方法獲取到。
進入族編輯態檢索
通常情況下,上面的那種方法已經夠用了,但有時就是需要所有巢狀族都要拿到。這時就需要採用另一種方法了
進入族的編輯態,檢索
FamilyInstance
型別元素。
// 虛擬碼
Document familyDoc = document.EditFamily(familyInstance.Symbol.Family); // 進入元素族編輯態
FilteredElementCollector collector = new FilteredElementCollector(familyDoc); // 過濾器
List<FamilyInstance> instances = collector.OfClass(typeof(FamilyInstance)).Cast<FamilyInstance>().ToList();
當前文件是不是
族文件
,可以透過屬性IsFamilyDocument
判斷。
當然了,被巢狀族可能本身也含有巢狀族,若是需要,採用遞迴還是迭代方式獲取就看個人喜好了。
有何不同
既然存在這兩種方法,那麼有問題了,這兩種方法有什麼不同呢?
這就得提到Revit中的幾種族了:系統族,可載入族,內建族。
系統族:就是一些基本建築圖元(不懂,問號臉),從開發角度看,就是有專屬類的元素,如
Wall
、Column
、Duct
等等。可載入族:就是
FamilyInstance
這一類,需要使用者自個兒建的,可以到處放的。族例項嘛,重點在例項
,匯入到專案裡,可以在專案文件
中找到,也就是像上面說的“存在於專案的專案瀏覽器族列表中”。內建族:其實就是特殊的
FamilyInstance
,只存在於族文件
中。從專案文件的層面看,這玩意兒就是目標例項本身的一部分,所以使用獲取子元件方法獲取當然找不到。
之前還在Revit社群說到獲取巢狀族這個問題,寫這篇記錄時才發現回答得有問題,回頭就去給刪咯...
總結
使用類方法
獲取巢狀族就夠了,進入族編輯態找巢狀族,屬於是特殊需求下的特殊處理方式。