元素过滤器的使用方式:
FilteredElementCollector collection = new FilteredElementCollector(RevitDoc);
ElementFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_StackedWalls);
collection.OfClass(typeof(Wall)).WherePasses(filter);
ICollection<ElementId> foundIds = collection.ToElementIds();
FilteredElementCollector提供了一系列的方法,允许用户设置査询和过滤所需的元素集:
•通用方法WherePasses(),在收集器中应用单一的ElementFilter。该方法可以在结果中重复使用来增加不同的过滤器(filter)。
•快捷方法,比如ofClass(),ofCategoryId(),ownedByView()。
•并集、交集等运算-方法,比如UnionWith()和IntersectWith()。
这些方法返回收集器本身,并允许不同的过滤器链式调用。
过滤完后可以用两种方式取出所需元素:
方法①:foreach
FilteredElementCollector collector = new FilteredElementCollector(m_doc);
// 查询并遍历文档中所有的Level
collector.WherePasses(new
ElementCategoryFilter(BuiltInCategory.OST_Levels)).WhereElementIsNotElementType();
foreach(Level level in collector)
{
TaskDialog.Show("Level Name", level.Name);
}
方法②:LINQ
FilteredElementCollector collector = new FilteredElementCollector(m_doc);
// 首先使用一个内建的过滤器来减少后面使用LINQ查询的元素数量
collector.WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Levels));
// LINQ查询:找到名字为"Level 1"的标高
var levelElements = from element in collector
where element.Name == "Level 1"
select element;
List<Autodesk.Revit.DB.Element> levels = levelElements.ToList<Autodesk.Revit.DB.Element>();
ElementId level1Id = levels[0].Id;