Revit二開–過濾器之篩選過濾器
通過這中過濾器,可以從整個文檔中或者從文檔中的一個視圖 篩選元素。
這個過濾器又可以分爲
- 快速過濾器 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 就是你要過濾的牆和樓板了。