Revit獲取元素的巢狀族

5YWo發表於2024-03-19

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中的幾種族了:系統族,可載入族,內建族。

系統族:就是一些基本建築圖元(不懂,問號臉),從開發角度看,就是有專屬類的元素,如WallColumnDuct等等。

可載入族:就是FamilyInstance這一類,需要使用者自個兒建的,可以到處放的。族例項嘛,重點在例項,匯入到專案裡,可以在專案文件中找到,也就是像上面說的“存在於專案的專案瀏覽器族列表中”。

內建族:其實就是特殊的FamilyInstance,只存在於族文件中。從專案文件的層面看,這玩意兒就是目標例項本身的一部分,所以使用獲取子元件方法獲取當然找不到。

之前還在Revit社群說到獲取巢狀族這個問題,寫這篇記錄時才發現回答得有問題,回頭就去給刪咯...


總結

使用類方法獲取巢狀族就夠了,進入族編輯態找巢狀族,屬於是特殊需求下的特殊處理方式。

相關文章