revit二次开发——过滤器基础

本文详细介绍了Revit API中关于元素过滤和收集的机制,包括FilteredElementCollector的使用,如不同构造函数、过滤器类型(快速、慢速、逻辑)以及结果集的获取方法。通过示例代码展示了如何应用各种过滤器,如类别过滤、类过滤、参数过滤等,以获取特定类型的元素或满足特定条件的元素集合。

一个简单的过滤器

过滤器

ElementQuickFilter。 快速过滤器仅对ElementRecord进行操作,是一个低内存占用的类,以一个有限接口来读取图元属性。被快速过滤器丢弃的图元不会展开到内存中。
ElementSlowFilter。 慢速过滤器首先需要获取图元并展开到内存中。因此,更为可取的方法是,将慢速过滤器与至少一个快速过滤器结合使用,尽量减少展开到内存的图元数量,以对照此过滤器设置的标准进行评价。
ElementI ogicalFilter.逻辑过滤器逻辑组合两个或更多过滤器。Revit 以使过滤器执行最快为优先评估条件,可能会将合成过滤器重新排序。

用来迭代以及过滤元素的主要类是收集器,它有三种构造方式

收集器的三种构造函数

构造函数 描述
FilteredElementCollector(Document document) 从一个文档构造,迭代会从文档所有的元索进行
FilteredElementCollector( Document document,ICollection< < Elementld > elementlds) 从一个文档和ElementID集合构造,迭代会从这传进来的集合中进行
FilteredElementCollector( Document document,Elementld viewld) 从一个文档和一个视图构造,迭代会从所有在传进来的视图中所见的元素中进行

1.1 过滤器

过滤器Revit API提供一种机制,用于过滤和迭代Revit文件中的图元。这是用于获取一组相关图元的最好方式,如文件中所有的墙或门。过滤器也可以用来寻找出一-组很具体的图元,如某一特定尺寸的所有的梁。
通过指定过滤器获取图元的基本步骤如下: .
(1)新建一个FilteredElementCollector;
(2)对它运用一个或多个过滤器;
(3)获取滤过的图元或图元ID (使用几种方法之一)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;

namespace DemoRevitFilter
{
   
   
    //属性,Revit 不会自动创建事务
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    //实现Revit API 中的 IExternalCommand 接口
    public class DemoRevitFilter : IExternalCommand
    {
   
   
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
   
   
            try
            {
   
   
                //通过commandData获取UIDocument
                UIDocument uidoc = commandData.Application.ActiveUIDocument;
                //通过uidoc获取revit当前文档
                Document doc = uidoc.Document;
                //创建图元过滤集
                FilteredElementCollector cltor = new FilteredElementCollector(doc);
                //声明并初始化参数msg
                string msg = string.Empty;
                //声明一个图元集合
                IList<Element> elementList = new List<Element>();


                //使用类别过滤器找到所有墙实例
                cltor.OfCategory(BuiltInCategory.OST_Walls);
                elementList = cltor.ToElements();

                //遍历得到名称和id
                foreach (Element ele in elementList)
                {
   
   
                    msg += ele.Name + ":" + ele.Id + "\n";
                }

                //输出显示
                TaskDialog.Show(this.GetType().Name, msg);

                return Autodesk.Revit.UI.Result.Succeeded;
            }
            catch (Exception ex)
            {
   
   
                message = ex.Message;
                return Autodesk.Revit.UI.Result.Failed;
            }
        }
    }
}

注意:初次创建该对象的时候,是没有应用任何的过滤器的,如果这时试图从该对象中
迭代或者获取元素列表,会有异常抛出。FilteredElementCollector提供了一.系列的方法,允许用户设置查询和过滤感兴趣的元素集:
●通用方法WherePasses( ),在收集器中应用单一的ElementFilter。该方法可以在结果中重复使用来增加不同的过滤器(filter)。
●快捷方法,不需要传初始化过滤器对象的易于使用的方法,相当于常用过滤器filter的快捷键。比如OfClass( ), OfCategoryId( ), OwnedByView( )。
●并集、交集等运算方法,比如UnionWith( )和IntersectWith( )。
这些方法返回收集器本身,并允许不同的过滤器链式调用。

1.2 结果集

FilteredElementCollector在应用过滤器后可直接ToElements, ToElementIds或者调用IEnumerable泛型接口支持的方法获得结果集,例如ToList()等等,请务必使用以上几种方式获得结果集

对FilteredElementCollector 应用-一个或多 个过滤器之后,过滤出的图元集可由以下三
种方式之一来检索:
(1)获取图元或图元ID的集合。
●ToElements(): 返回通过过滤器的所有图元。
●ToElementIds(): 返回通过过滤器所有图元的图元ID。
(2)获取匹配过滤器的第一个图元或图元ID。
●FirstElement(): 返回通过过滤器的第一个图元。
●FirstElementld(): 返回通过过滤器第一个图元的ID。
(3)获取图元ID或图元迭代器。
●GetElementIdIterator( ):返回通过过滤器的图元ID的FilteredElementIdIterator。
●GetElementIterator(): 返回通过过滤器的图元的FilteredElementIdIterator.
●GetEnumerator(): 返回一个lEnumerator<Element>枚举,其遍历通过的图元集。
每次应只使用这几组方法其中之一;如果再调用其他方法来提取图元,采集器会重置。
因而,如果先前已获得一个迭代器,若再调用其他方法来提取图元,则会被中止,而不会遍历更多图元。

//============代码片段3-34:元素过滤器============
FilteredElementCollector collection = new FilteredElementCollector(RevitDoc);
ElementFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_StackedWalls);
collection.OfClass(typeof(Wall)).WherePasses(filter);
ICollection<ElementId> foundIds = collection.ToElementIds();

//============代码片段3-35:元素过滤器============
FilteredElementCollector collector = new FilteredElementCollector(m_doc);
 // 查询并遍历文档中所有的Level
collector.WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Levels)).WhereElementIsNotElementType();
foreach(Level
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤影墨客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值