Revit二次开发实战04(元素搜集过滤器FilteredElementCollector)|天天新视野

2023-05-21 22:13:29来源:博客园

Revit二次开发实战


(相关资料图)

FilteredElementCollector元素搜集过滤器

1、创建搜集器

FilteredElementCollector(Document);搜集文档中所有元素;

FilteredElementCollector(Document,List);在指定id集合中搜集;

FilteredElementCollector(Document,ElementId viewId);在指定视图中搜集;

2、调用过滤函数

OfCategoryId(newElementId(BuiltInCategory.OST_Doors));

OfCategory(BuiltInCategory.OST_Doors);

OfClass(typeof(Wall));

WherePasses(newRoomFilter());

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 ids = new List();            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 filtered4 = collector4.WherePasses(new RoomFilter()).Cast().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 elements, UIDocument uidoc, string title)        {                      StringBuilder sb = new StringBuilder();            sb.AppendLine($"Count={elements.Count()}");            List ids = new List();            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;        }    }}

关键词:

责任编辑:孙知兵

免责声明:本文仅代表作者个人观点,与太平洋财富网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有问题,请联系我们!

关于我们 - 联系方式 - 版权声明 - 招聘信息 - 友链交换 - 网站统计
 

太平洋财富主办 版权所有:太平洋财富网

中国互联网违法和不良信息举报中心中国互联网违法和不良信息举报中心

Copyright© 2012-2020 太平洋财富网(www.pcfortune.com.cn) All rights reserved.

未经过本站允许 请勿将本站内容传播或复制 业务QQ:3 31 986 683