通过这中过滤器,可以从整个文档中或者从文档中的一个视图 筛选元素。
这个过滤器又可以分为
- 快速过滤器 ElementQuickFilter
- 慢速过滤器 ElementSlowFilter
- 逻辑过滤器 ElementLogicalFilter
1.快速过滤器
快速过滤器不在内存中展开元素细节,筛选速度较快。
-快速过滤器 共16种
BoundingBoxContainsPointFilter
BoundingBoxIntersectsFilter
BoundingBoxIsInsideFilter
ElementCategoryFilter
ElementClassFilter
ElementDesignOptionFilter
ElementIsCurveDrivenFilter
ElementIsElementTypeFilter
ElementMulticategoryFilter
ElementMulticlassFilter
ElementOwnerViewFilter
ElementStructuralTypeFilter
ElementWorksetFilter
ExclusionFilter
ExtensibleStorageFilter
FamilySymbolFilter
我想过滤当前文档中的所有墙,怎么做呢。
案例如下:
ElementClassFilter filter= new ElementClassFilter(typeof(Wall));
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.WherePasses(filter);
var walls = collector.Cast<Wall>().ToList();
那么代码中的walls 就是你要获取的所有的墙了。
2.慢速过滤器
-慢速过滤器 共18种
RoomFilter
RoomTagFilter
AreaFilter
AreaTagFilter
CurveElementFilter
ElementIntersectsFilter
ElementLevelFilter
ElementParameterFilter
ElementPhaseStatusFilter
FamilyInstanceFilter
SpaceFilter
SpaceTagFilter
PrimaryDesignOptionMemberFilter
FamilyStructuralMaterialTypeFilter
StructuralInstanceUsageFilter
StructuralMaterialTypeFilter
StructuralWallUsageFilter
SelectableInViewFilter
慢速过滤器主要是用来筛选一些比较特殊的元素,例如房间空间等 ;还能找到与特定元素相交的元素
例1:筛选所有的房间
RoomFilter rfilter = new RoomFilter()
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.WherePasses(rfilter);
var rooms = collector.Tolist();
获取的rooms 就是我们要获取的房间了。
例2:找到与某个元素相交的元素
到这里不得不讲一下 ElementIntersectsFilter 他又分为
——ElementIntersectsSolidFilter
——ElementIntersectsElementFilter
所以这里我们用ElementIntersectsElementFilter 来过滤指定元素
代码如下
var elem = sel.PickObject().GetElement(doc);
ElementIntersectsElementFilter filter= new ElementIntersectsElementFilter(elem);
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.WherePasses(filter);
var targets = collector.ToList(); //targets 就是与elem 相交的元素s
类似的 ElementIntersectsSolidFilter 可以自己试一下。
3.逻辑过滤器
其中逻辑过滤器ElementLogicalFilter 分为
——LogicalAndFilter
——LogicalOrFilter
如果既想获取文档中的楼板 又想 获取文档中的墙,怎么做呢?
那就得用到逻辑过滤器了,用逻辑或过滤器LogicalOrFilter。
案例如
//首先创建两个单独的过滤器
ElementClassFilter wallfilter = new ElementClassFilter(typeof(Wall));
ElementClassFilter floorfilter = new ElementClassFilter(typeof(Floor));
//然后用逻辑或过滤器将以上两个过滤器组合
var andfilter = new LogicalOrFilter(wallfilter,floorfilter);
FilteredElementCollector collector = new FilteredElementCollector(doc);
//应用过滤器
collector.WherePasses(filter);
var wallandfloor = collector.ToList();
wallandfloor 就是你要过滤的墙和楼板了。