視頻連接v.bimcc.com/course/35/tasks
常用過濾器:過濾器、選擇過濾器
一、過濾器
建立一個(gè)簡單的過濾器實(shí)例。
在之前的類庫中新建Class3.cs
1.前期的初始化,如圖。

2.常用的東西

第一個(gè)是過濾后的元素收集器。
第二個(gè)是基于Class的過濾器。(class指的是C#中class的概念,如FamilyInstance、Family、FamilySymbol、Wall、Hosts等)
第三個(gè)是基于Category的屬性的過濾器。
3.在API文檔中可以看到收集器的使用方法

第一個(gè)是全文件搜索,第二個(gè)是全文件的可見元素搜索,第三個(gè)是在文檔的ICollection集合中搜索。
這里一般用第一個(gè)構(gòu)造方法。
FilteredElementCollector columCollection = new FilteredElementCollector(doc);
4.在API文檔中看到過濾器的使用方法

這里用第一個(gè)構(gòu)造方法。
通過查找api,可以看到BuiltInCategory是一個(gè)枚舉類型,其中每一個(gè)Member對(duì)應(yīng)了一種Category。

那怎么把Member和Category對(duì)應(yīng)起來呢?
通過 lookup中的Snoop?Current Selection

查看當(dāng)前選中的FamilyInstance的Category屬性。
其中Built-in category屬性即為所要的值。
將其復(fù)制到代碼中:
ElementCategoryFilter columFilter = new ElementCategoryFilter(BuiltInCategory.OST_StructuralColumns);
那么ClassFiter也是類似的方法
ElementClassFilter familyInstanceFilter = new ElementClassFilter(typeof(FamilyInstance));
這里為什么要 CategoryFilter和ClassFilter同時(shí)使用呢?
我們最后再講。
5.將過濾器用到收集器上
columCollection.WherePasses(columFilter).WherePasses(familyInstanceFilter);
//還有一種簡便的操作 columCollection.OfCategory(BuiltInCategory.OST_StructuralColumns); 這樣不用定義categoryfilter
6.選中的操作
前面添加using Autodesk.Revit.UI.Selection;
//將過濾得到的圖元轉(zhuǎn)化為Id
IList<ElementId>elId = new List<ElementId>();
foreach (Element el in columCollection)
{
elId.Add(el.Id);
}
//將圖元設(shè)置為選中狀態(tài)
uidoc.Selection.SetElementIds(elId);??
最后生成的插件效果

回到前面的問題
為什么要 CategoryFilter和ClassFilter同時(shí)使用
以圖中的混凝土柱400x400為例。

在模型中 混凝土柱familyInstance的BuiltInCategory 為OST_StructuralColumns
而項(xiàng)目瀏覽器中 400x400這個(gè)familysymbol的BuiltInCategory 同樣為OST_StructuralColumns
而再上層 混凝土柱這個(gè)family familycategory中的BuiltInCategory也是 OST_StructuralColumns
所以 圖中有8個(gè)familyInstance柱子 , 1個(gè)familysymbol ,1個(gè)family ,只用CategoryFilter過濾器的話會(huì)得到10個(gè)結(jié)果
可以添加測試代碼如圖


可以看到結(jié)果果然是10個(gè)。
二、邏輯過濾器
ElementLogicalFilter
其中包括兩個(gè)過濾器 and和or
LogicalAndFilter
LogicalOrFilter
用法很簡單,以and的構(gòu)造為例
LogicalAndFilter doorInstancesFilter = new LogicalAndFilter(familyInstanceFilter, doorsCategoryfilter);//這里將兩個(gè)過濾后的集合合并
將兩個(gè)過濾器寫在參數(shù)列表里就行了,其他的用法和過濾器相同。
邏輯過濾器用于提高效率,減少wherepasses次數(shù)。
三、快/慢速過濾器 ElementQuickFilter/ElementSlowFilter


Revit為了性能考慮只將一部分屬性加載進(jìn)內(nèi)存。
過濾在內(nèi)存中這部分屬性的是快速過濾器,過濾其他屬性的是慢速過濾器。
一般優(yōu)先用快速過濾器,如果一定要用到慢速,則可以先用快速過濾器縮小過濾范圍。
四、選擇過濾器
在執(zhí)行命令的過程中,讓用戶自行選擇構(gòu)件或構(gòu)建集。
//創(chuàng)建 WallSelectionFilter 繼承自ISelectionFilter 生成默認(rèn)函數(shù)
//AllowElement函數(shù)中,添加選擇判斷部分

主函數(shù)部分如圖,只有兩行

插件運(yùn)行結(jié)果如圖??梢钥吹街荒芸蜻x到"400x400"的FamilyInstance
