Revit API 提供 FilteredElement Collector类来过滤文档的元素,该类提供多种预定义方法对元素进行过滤,这些预定义方法都继承自ElementFilter。
需要注意到是ElementFilter分为ElementQuick Filter 和 ElementSlowFilter。
由于Revit读取元素的方式继承于ElementQuickFilter的过滤器,在读取元素信息时只读取有限的元素信息,这些信息不需要把元素的所有信息装载到内存,所以速度更快。
而 ElememSlowFilter则需要更多的信息,会要求元素所有信息读取到内存。
因而,在使用过滤器查找元素时,请尽量先使用快速过滤器将大部分不符合条件的元素过滤掉,再使用慢速过滤器处理细节的过滤条件。
using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
namespace HelloRevit
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
public class Class1 : IExternalCommand
{
public Autodesk.Revit.UI.Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)
{
try
{
Document document = revit.Application.ActiveUIDocument.Document;
// 创建一个类过滤器来过滤出所有的FamilyInstance类的元素。
ElementClassFilter familyInstanceFilter = new ElementClassFilter(typeof(FamilyInstance));
// 创建一个类别过滤器来过滤出所有的内建类型为OST_Doors的元素。
ElementCategoryFilter doorsCategoryfilter = new ElementCategoryFilter(BuiltInCategory.OST_Doors);
// 创建一个逻辑过滤器来组合前面两个过滤器,实现过滤出所有Door元素。
LogicalAndFilter doorInstancesFilter = new LogicalAndFilter(familyInstanceFilter, doorsCategoryfilter);
FilteredElementCollector collector = new FilteredElementCollector(document);
ICollection<ElementId> doors = collector.WherePasses(doorInstancesFilter).ToElementIds();
String prompt = "The ids of the doors in the current document are:";
foreach (ElementId id in doors)
{
prompt += "\n\t" + id.IntegerValue;
}
TaskDialog.Show("Revit", prompt);
}
catch (Exception e)
{
message = e.Message;
return Autodesk.Revit.UI.Result.Failed;
}
return Autodesk.Revit.UI.Result.Succeeded;
}
}
}
=========【更多高级应用请关注公众号】========
===================================