Revit开发中我们经常需要使用到过滤器从文档中获取到我们想要的元素,Revit中提供的过滤器分为三类:快速过滤器、慢速过滤器及逻辑过滤器。
快速过滤器顾名思义就是过滤的速度更快,只检查记录的元素并防止元素在内存中展开,这种过滤器可以提高迭代的效率并减少内存的消耗;而慢速过滤先在内存中获取和展开元素,再进行查询,因此在效率上会比较低;由两个及以上的过滤器逻辑组成的过滤器。 接下来将介绍快速过滤器的使用。
1、类别过滤器
/// <summary>
/// 类别过虑器,获取所有的标高
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public List<ElementId> CategoryFilter(Document doc)
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
ElementCategoryFilter elementCategoryFilter = new ElementCategoryFilter(BuiltInCategory.OST_Levels);
collector = collector.WherePasses(elementCategoryFilter);
//等同于
//collector = collector.OfCategory(BuiltInCategory.OST_Levels);
return collector.ToElementIds().ToList();
}
2、类过滤器
/// <summary>
/// 类过滤器,获取所有的墙
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public List<ElementId> ClassFilter(Document doc)
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
ElementClassFilter elementClassFilter = new ElementClassFilter(typeof(Wall));
collector = collector.WherePasses(elementClassFilter);
//等同于
//collector = collector.OfClass(typeof(Wall));
return collector.ToElementIds().ToList();
}
3、匹配元素类型过滤器
/// <summary>
/// 匹配元素类型过滤器,筛选所有属于元素类型的元素
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public List<ElementId> IsElementTypeFilter(Document doc)
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
ElementIsElementTypeFilter elementIsElementTypeFilter = new ElementIsElementTypeFilter();
collector = collector.WherePasses(elementIsElementTypeFilter);
//等同于
//collector = collector.WhereElementIsElementType();
return collector.ToElementIds().ToList();
}
4、排除过滤器
/// <summary>
/// 排除过滤器,排除所有的墙元素
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
public List<ElementId> MyExclusionFilter(Document doc)
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
FilteredElementCollector wallCollector = collector.OfClass(typeof(Wall));
ExclusionFilter exclusionFilter = new ExclusionFilter(wallCollector.ToElementIds());
collector = collector.WherePasses(exclusionFilter);
return collector.ToElementIds().ToList();
}
5、族类型过滤器
/// <summary>
/// 族类型过滤器
/// </summary>
/// <param name="doc"></param>
/// <param name="familySymbolId"></param>
/// <returns></returns>
public List<ElementId> MyFamilySymbolFilter(Document doc, ElementId familySymbolId)
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
FamilySymbolFilter familySymbolFilter = new FamilySymbolFilter(familySymbolId);
collector = collector.WherePasses(familySymbolFilter);
return collector.ToElementIds().ToList();
}