でも、取得したいカテゴリが複数ある場合ってOfCategoryメソッドは使えるの?
複数カテゴリのElementを取得したいときはElementMulticategoryFilterクラスを使います。
ここではElementMulticategoryFilterクラスの基本的な使い方を紹介します!
なおFilteredElementCollectorクラス、OfCategoryメソッドの使い方は下記の記事をご覧いただければ幸いです。


もくじ
ElementMulticategoryFilterについて
これといったメソッドやプロパティはありません。
ただただ複数のカテゴリをフィルタリングするためだけに使います。
フィルタ作成のサンプルコードを下記に記します。
サンプルコード
こんな感じで使います。
複数クラスのフィルタ作成
BuiltInCategory.OST_Walls,
BuiltInCategory.OST_Floors
};
ElementMulticategoryFilter elementMulticategoryFilter = new ElementMulticategoryFilter(builtInCategoryList);
サンプルコードの解説
まずはフィルタにかけるカテゴリのListを作成します。
ListはBuiltInCategoryの列挙型で初期化します。
ここではサンプルとして、Listの中身を壁カテゴリ(BuiltInCategory.OST_Walls)と床カテゴリ(BuiltInCategory.OST_Floors)を設定しています。
BuiltInCategory.OST_Walls,
BuiltInCategory.OST_Floors
};
ElementMulticategoryFilter elementMulticategoryFilter = new ElementMulticategoryFilter(builtInCategoryList);
そして、作成したbuiltInCategoryListを引数にして、ElementMulticategoryFilterクラスのオブジェクトを生成しました。
BuiltInCategory.OST_Walls,
BuiltInCategory.OST_Floors
};
ElementMulticategoryFilter elementMulticategoryFilter = new ElementMulticategoryFilter(builtInCategoryList);
上記コードでは壁カテゴリと床カテゴリをのフィルタが作成されています。
BuiltInCategoryと日本語カテゴリ名の対応はこちらでご確認ください!

ElementMulticategoryFilterのサンプルソースコード
それでは、ElementMulticategoryFilterクラスを用いた複数カテゴリのElement取得について、一連のサンプルソースコードを見ていきます。
コードは壁カテゴリ(BuiltInCategory.OST_Walls)と床カテゴリ(BuiltInCategory.OST_Floors)の取得を記しています。
ソースコード
Sample
{
UIApplication uiapp = this.ActiveUIDocument.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Autodesk.Revit.ApplicationServices.Application app =
uiapp.Application as Autodesk.Revit.ApplicationServices.Application;
Autodesk.Revit.DB.Document doc = uidoc.Document;
List<BuiltInCategory> builtInCategoryList = new List<BuiltInCategory>(){
BuiltInCategory.OST_Walls,
BuiltInCategory.OST_Floors
};
ElementMulticategoryFilter elementMulticategoryFilter = new ElementMulticategoryFilter(builtInCategoryList);
FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
List<Element> elementList = new List<Element>();
elementList = filteredElementCollector.WherePasses(elementMulticategoryFilter).WhereElementIsNotElementType().ToList();
string result = “”;
foreach(Element element in elementList)
{
result += element.GetType().Name + “_” + element.Category.Name + “_” + element.Name + “\n”;
}
TaskDialog.Show(“Message”, result);
}
解説
ElementMulticategoryFilterクラスの使い方で解説したように、まずは取得したいカテゴリのオブジェクトelementMulticategoryFilterを作成しました。
あとはOfCategoryメソッドを使ったElement取得と同じ流れです。
ここではOfCategoryメソッドの代わりにFilteredElementCollectorクラスのWherePassesメソッドを使っています。
使い方としては.WherePasses(elementMulticategoryFilter)のように、作成したフィルタを引数に入れて使用するメソッドです。
ElementMulticategoryFilterまとめ
取得したいカテゴリが単独か複数かで使用するクラスやメソッドが変わってきてややこしいですね。
でも使い方さえ覚えてしまえば、そんなに難しい使い分けでもありません。
最後まで読んでいただき、ありがとうございました!
以上です。