过滤器
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

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

被折叠的 条评论
为什么被折叠?



