1. 程式人生 > >revit 二次開發之基於族獲得實例

revit 二次開發之基於族獲得實例

相關 space typeof cef doc 過濾 list eric category

Revit並沒有直接開放基於族獲取實例元素的過濾器。不過有兩個相關的過濾器,一個是FamilySymbolFilter(ElementId familyId),可以基於族ID過濾出所有這個族的族類型,另一個是FamilyInstanceFilter(Document document,ElementId familySymbolId),可以基於族類型ID過濾出所有這個族類型的實例元素。結合使用兩者就能基於族獲取實例元素,以下為代碼:

 1 using System.Text;
 2 using System.Threading.Tasks;
 3 using Autodesk.Revit.DB;
4 using Autodesk.Revit.UI; 5 using Autodesk.Revit.ApplicationServices; 6 using Autodesk.Revit.UI.Selection; 7 using Autodesk.Revit.Attributes; 8 using System.Windows.Forms; 9 using System; 10 using System.Collections.Generic; 11 using System.Linq; 12 using System.Diagnostics; 13 using System.IO;
14 15 16 17 namespace Xincubus 18 { 19 [Transaction(TransactionMode.Manual)] 20 public class TestParameterPass : IExternalCommand 21 { 22 public Result Execute(ExternalCommandData document, ref string message, ElementSet elements) 23 { 24 UIApplication uiapp = document.Application;
25 Document doc = uiapp.ActiveUIDocument.Document; 26 string test = ""; 27 string familyName = "檢查井"; 28 //收集所有族 29 FilteredElementCollector familiyCollector = new FilteredElementCollector(doc); 30 familiyCollector.OfClass(typeof(Family)).ToElements(); 31 ElementId familyID = new ElementId(-1); 32 //尋找特定名稱的族 33 foreach (var family in familiyCollector) 34 { 35 if (family.Name == familyName) 36 { 37 familyID = family.Id; 38 } 39 } 40 if (familyID != new ElementId(-1)) 41 { 42 //收集族類型 43 familiyCollector = new FilteredElementCollector(doc); 44 familiyCollector.WherePasses(new FamilySymbolFilter(familyID)); 45 } 46 //收集以上族類型的族 47 List<Element> familyInstances = new List<Element>(); 48 foreach (var familySymbol in familiyCollector) 49 { 50 FilteredElementCollector collector = new FilteredElementCollector(doc); 51 collector.OfCategory(BuiltInCategory.OST_MechanicalEquipment).WhereElementIsNotElementType(); 52 collector.WherePasses(new FamilyInstanceFilter(doc, familySymbol.Id)); 53 familyInstances.AddRange(collector); 54 } 55 56 57 58 59 60 61 62 63 test += familyInstances.Count.ToString(); 64 MessageBox.Show("項目中共有" + test + "" + familyName + "的族實例"); 65 return Result.Succeeded; 66 } 67 } 68 }

當然,也可遍歷所有收集器中的實例元素,依靠 FamilyInstance.Symbol.Family來篩選出需要的元素。

鑒於FamilyInstanceFilter(Document document,ElementId familySymbolId)是一個慢速過濾器,遍歷法應該也滿不了多少。

revit 二次開發之基於族獲得實例