总结一下常用的过滤器API和写法。
一 过滤器的使用思路
1.new一个FilteredElementCollector(收集器);
2.对它运用一个或多个ElementFilter;
3.获取过滤出来的Element或ID 。
二 FilterElementCollector
FilterElementCollector的三种构造方法:
//1.收集器的三种构造方法
//普通
FilteredElementCollector elements1=new FilteredElementCollector(doc);
//ids
List<ElementId> ids=new List<ElementId>();
FilteredElementCollector elements2 =new FilteredElementCollector(doc,ids);
Element element = elements2.ToElements().FirstOrDefault();
//指定视图,不指定视图则收集收集所有视图的元素
ElementId viewId = null;
FilteredElementCollector elements3=new FilteredElementCollector(doc, viewId);
三 ElementFilter
继承于ElementFilter的三类过滤器。
快速过滤器(Quickfilters):
只检查记录的元素并防止元素在内存中展开。这种过滤器可以提高迭代的效率并且减少内存的消耗。
慢速过滤器(Slowfilters):
先在内存中获取和展开元素,再进行查询,因此在效率上会比较低。推荐的方法是慢速过滤器和快速过滤器结合起来用,这样会减少展开元素的数量。
逻辑过滤器(Logicalfilters):
由两个及以上的过滤器逻辑组成的过滤器。逻辑与LogicalAndFilter或逻辑或LogicalOrFilter
常见的一些过滤器:
1.房间过滤器:RoomFilter
2.元素相交过滤器:BoundingBoxIntersectsFilter
3.元素包含过滤器:BoundingBoxlsInsideFilter
4.元素类别过滤器:ElementCategoryFilter等同于OfCategory()
用法:
1.new过滤器如RoomFilter roomFilter= new RoomFilter();
2.放入WherePasses()如WherePasses(roomFilter)
//2.根据收集器得到各种类型
FilteredElementCollector collector = new FilteredElementCollector(doc);
StringBuilder stringBuilder = new StringBuilder();
//通过类过滤
IList<Element> eles = collector.ToElements();
IList<Element> familyInstances = collector.OfClass(typeof(FamilyInstance)).ToElements();
IList<Element> familySymbols = collector.OfClass(typeof(FamilySymbol)).ToElements();
IList<Element> families = collector.OfClass(typeof(Family)).ToElements();
//通过类型过滤
IList<Element> windows = collector.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilyInstance)).ToElements();
//通过WherePasses()和过滤器
RoomFilter roomFilter = new RoomFilter();
List<Room> roomList=collector.WherePasses(roomFilter).Cast<Room>().ToList();
//注意房间明细表,若在实例中删除房间,在房间明细表也会统计房间数量
foreach (Room room in roomList)
{
if (room.Level.Name.Equals("标高 2") && room.Location != null)
{
stringBuilder.AppendLine(room.Name.ToString());
}
}
TaskDialog.Show("房间", stringBuilder.ToString());
//3.元素相交过滤器
//得到房间
Room room1=doc.GetElement(new ElementId(1101806)) as Room;
//得到房间的编辑框
BoundingBoxXYZ boundingBoxXYZ = room1.get_BoundingBox(uIDocument.ActiveView);
//通过边界框创建一个OutLine
Outline outline = new Outline(boundingBoxXYZ.Min, boundingBoxXYZ.Max);
//通过outLine创建一个元素边界过滤器
BoundingBoxIntersectsFilter boundingBoxIntersectsFilter = new BoundingBoxIntersectsFilter(outline);
FilteredElementCollector col = new FilteredElementCollector(doc);
IList<Element> eleList= col.WherePasses(boundingBoxIntersectsFilter).ToElements();
foreach (Element ele in eleList)
{
stringBuilder.AppendLine(ele.Name.ToString());
}
TaskDialog.Show("元素", stringBuilder.ToString());
//3.元素包含过滤器
//4.元素类别过滤器
ElementCategoryFilter elementCategoryFilter1 = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
ElementCategoryFilter elementCategoryFilter2 = new ElementCategoryFilter(BuiltInCategory.OST_Wire);
FilteredElementCollector elements4 = new FilteredElementCollector(doc);
四 用泛型和扩展方法写一个过滤器
在做二开的时候经常能碰到写过滤器,每次都要根据需求重写一遍过滤器和收集器着实有些麻烦,这里用泛型和扩展方法封装一个过滤器 ,方便重复使用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
namespace Revit_CreatInstane
{
public static class FilteredTool
{
//用扩展方法和泛型封装过滤器
public static List<T> SpeedFilter<T>(this Document document)
{
List<T> elements =new FilteredElementCollector(document).OfClass(typeof(T)).Cast<T>().ToList();
return elements;
}
public static List<T> SpeedFilter<T>(this Document document,BuiltInCategory builtInCategory)
{
List<T> elements = new FilteredElementCollector(document).OfCategory(builtInCategory).OfClass(typeof(T)).Cast<T>().ToList();
return elements;
}
}
}
五 Revit内建过滤器
内建过滤器 | 类型 | 符合条件值 | 快捷方法 |
LogicalAndFilter | 逻辑 | 必须符合两个或两个以上的过滤器的 元素 | WherePasses():添加另外一个过 滤 器 ; IntersectWith():合并两个独立的 过滤器的集合 |
LogicalOrFilter | 逻辑 | 必须符合两个或两个以上的过滤器中 的其中一个过滤器的元素 | UnionWith():合并两个独立的过 滤器的集合 |
ElementCategoryFilter | 快 | 符合传入类别ID的元素 | OfCategoryld() |
ElementMulticategoryFilter | 快 | 符合任意一个传入类别ID的元素 | 无 |
ElementClassFilter | 快 | 符合传入类的元素 | OfClass() |
ElementMulticlassFilter | 快 | 符合任意一个传入类的元素 | 无 |
ElementIsElement TypeFilter | 快 | 是元素类型的元素 | WhereElementIsElement Type(), WhereElementIsNotElement Type() |
ElementOwnerViewFilter | 快 | 是视图相关的元素 | OwnedByView(), WhereElementIs ViewIndependent() |
ElementDesignOptionFilter | 快 | 符合在特定设定选项的元素 | ContainedInDesignOption() |
ElementIsCurveDrivenFilter | 快 | 是由线驱动的元素 | WhereElementlsCurveDriven() |
ElementStructuralTypeFilter | 快 | 符合给定结构类型的元素 | 无 |
ElementWorksetFilter | 快 | 符合在给定工作集里面的元素 | 无 |
FamilySymbolFilter | 快 | 特定的族类型 | 无 |
ExclusionFilter | 快 | 除传入过滤器的元素外的所有元素 | Excluding() |
BoundingBoxIntersectsFilter | 快 | 其边界盒与给定的轮廓(outline)相交 的元素 | 无 |
BoundingBoxIsInsideFilter | 快 | 其边界盒在给定轮廓(outline)内的 元素 | 无 |
BoundingBoxContainsPointFilter | 快 | 其边界盒包含了给定点的元素 | 无 |
FamilyInstanceFilter | 慢 | 特定族类型的实例 | 无 |
ElementLevelFilter | 慢 | 和指定标高(level)联系的元素 | 无 |
ElementPhaseStatusFilter | 慢 | 和指定阶段状态联系的元素 | 无 |
ElementParameterFilter | 慢 | 符合一个或多个参数值的元素 | 无 |
ElementIntersectsElementFilter | 慢 | 使用冲突检测来查找符合与传入的元 素在几何上相交的元素 | 无 |
ElementIntersectsSolidFilter | 慢 | 使用接口检测来查找符合与传入的实 体在几何(solid)上相交的元素 | 无 |
PrimaryDesignOptionMemberFilter | 慢 | 主选项所拥有的元素 | 无 |
StructurallnstanceUsageFilter | 慢 | 属于传入的结构实例用法 (StructurallnstanceUsage)的族实例 | 无 |
StructuralWallUsageFilter | 慢 | 属于传入结构墙用法 (StructuralWallUsage)的墙 | 无 |
StructuralMaterialTypeFilter | 慢 | 属于传入结构材料类型 (StructuralMaterialType)的族实例 | 无 |
RoomFilter | 慢 | 房间元素 | 无 |
SpaceFilter | 慢 | 空间元素 | 无 |
AreaFilter | 慢 | 面积元素 | 无 |
RoomTagFilter | 慢 | 房间标签元素 | 无 |
SpaceTagFilter | 慢 | 空间标签元素 | 无 |
AreaTagFilter | 慢 | 面积标签元素 | 无 |
CurveElementFilter | 慢 | 属于或者不属于(inverted)传人线类 型的线型元素 | 无 |