Revit二次开发实战04(元素搜集过滤器FilteredElementCollector)
Revit二次开发实战
FilteredElementCollector元素搜集过滤器
1、创建搜集器 |
FilteredElementCollector(Document);搜集文档中所有元素; FilteredElementCollector(Document,List<ElementId>);在指定id集合中搜集; FilteredElementCollector(Document,ElementId viewId);在指定视图中搜集; |
2、调用过滤函数 |
OfCategoryId(new ElementId(BuiltInCategory.OST_Doors)); OfCategory(BuiltInCategory.OST_Doors); OfClass(typeof(Wall)); WherePasses(new RoomFilter()); WherePasses(intersectsFilter); |
源码
using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Architecture; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RevitHello { [Transaction(TransactionMode.Manual)] class CElement : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //获取当前UI文档 UIDocument uidoc = commandData.Application.ActiveUIDocument; //获取当前文档 Document doc = uidoc.Document; //创建搜集过滤器 //■构造函数1,搜集文档中所有元素 FilteredElementCollector collector1 = new FilteredElementCollector(doc); //按照类别进行过滤 FilteredElementCollector filtered1 = collector1.OfCategory(BuiltInCategory.OST_Doors); ShowElements(filtered1, uidoc, "filtered1"); //选择多个对象,并获取其id集合 var refs = uidoc.Selection.PickObjects(ObjectType.Element); List<ElementId> ids = new List<ElementId>(); refs.ToList().ForEach(r => ids.Add(r.ElementId)); //■构造函数2,搜集集合中的元素 FilteredElementCollector collector2 = new FilteredElementCollector(doc, ids); //按照类别Id进行过滤 所有的门 FilteredElementCollector filtered2 = collector2.OfCategoryId(new ElementId(BuiltInCategory.OST_Doors)); ShowElements(filtered2, uidoc, "filtered2"); //获取当前文档的当前视图 View view = uidoc.ActiveView; //■构造函数3,搜集视图中的元素 FilteredElementCollector collector3 = new FilteredElementCollector(doc, view.Id); //按照class的Type类型进行过滤 FilteredElementCollector filtered3 = collector3.OfClass(typeof(Wall)); ShowElements(filtered3, uidoc, "filtered3"); FilteredElementCollector collector4 = new FilteredElementCollector(doc); List<Room> filtered4 = collector4.WherePasses(new RoomFilter()).Cast<Room>().ToList(); ShowElements(filtered4, uidoc, "filtered4"); //获取一个包围盒,并过滤出与该包围盒相交的元素 var refe = uidoc.Selection.PickObject(ObjectType.Element, new DoorSelectionFilter()); var ele = doc.GetElement(refe); var box = ele.get_BoundingBox(view); BoundingBoxIntersectsFilter intersectsFilter = new BoundingBoxIntersectsFilter(new Outline(box.Min, box.Max)); FilteredElementCollector collector5 = new FilteredElementCollector(doc); var filtered5 = collector5.WherePasses(intersectsFilter).ToElements(); ShowElements(filtered5, uidoc, "filtered5"); return Result.Succeeded; } //把输出元素集合信息封装成一个函数 void ShowElements(IEnumerable<Element> elements, UIDocument uidoc, string title) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"Count={elements.Count()}"); List<ElementId> ids = new List<ElementId>(); elements.ToList().ForEach((e) => { sb.AppendLine($"Id={e.Id},Name={e.Name},Category={e.Category.Name}"); ids.Add(e.Id); }); //高亮显示所有过滤的对象 uidoc.Selection.SetElementIds(ids); //对话框显示所有过滤对象的信息 TaskDialog.Show(title, sb.ToString()); } } class DoorSelectionFilter : ISelectionFilter { public bool AllowElement(Element elem) { if (elem.Category.Id.IntegerValue==(int)BuiltInCategory.OST_Doors) return true; return false; } public bool AllowReference(Reference reference, XYZ position) { return true; } } }
分类:
.NET Framework
, Revit二次开发
标签:
.NET Framework
, Revit二次开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律