RevitAPI

【RevitAPI】ElementMulticategoryFilterで複数カテゴリの取得

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

なおFilteredElementCollectorクラス、OfCategoryメソッドの使い方は下記の記事をご覧いただければ幸いです。

【RevitAPI】FilteredElementCollectorで部材を取得する ここではFilteredElementCollectorクラスを使った部材取得のサンプルコードを紹介します。 なおSe...
【RevitAPI・FilteredElementCollector】OfCategoryでカテゴリフィルタ ここではOfCategoryメソッドについての解説、および使い方のサンプルとしてソースコードをいくつかご紹介します。 ...

ElementMulticategoryFilterについて

名前のまんま、指定した複数のカテゴリをフィルタリングするためのクラスです。

これといったメソッドやプロパティはありません。
ただただ複数のカテゴリをフィルタリングするためだけに使います。

フィルタ作成のサンプルコードを下記に記します。

サンプルコード

こんな感じで使います。

複数クラスのフィルタ作成

      List<BuiltInCategory> builtInCategoryList = new List<BuiltInCategory>(){
        BuiltInCategory.OST_Walls,
        BuiltInCategory.OST_Floors
      };
    ElementMulticategoryFilter elementMulticategoryFilter = new ElementMulticategoryFilter(builtInCategoryList);

サンプルコードの解説

まずはフィルタにかけるカテゴリのListを作成します。
ListはBuiltInCategoryの列挙型で初期化します。

ここではサンプルとして、Listの中身を壁カテゴリ(BuiltInCategory.OST_Walls)と床カテゴリ(BuiltInCategory.OST_Floors)を設定しています。

      List<BuiltInCategory> builtInCategoryList = new List<BuiltInCategory>(){
        BuiltInCategory.OST_Walls,
        BuiltInCategory.OST_Floors
      };
    ElementMulticategoryFilter elementMulticategoryFilter = new ElementMulticategoryFilter(builtInCategoryList);

そして、作成したbuiltInCategoryListを引数にして、ElementMulticategoryFilterクラスのオブジェクトを生成しました。

      List<BuiltInCategory> builtInCategoryList = new List<BuiltInCategory>(){
        BuiltInCategory.OST_Walls,
        BuiltInCategory.OST_Floors
      };
    ElementMulticategoryFilter elementMulticategoryFilter = new ElementMulticategoryFilter(builtInCategoryList);
たったこれだけのコードでカテゴリフィルタの出来上がりです。
上記コードでは壁カテゴリと床カテゴリをのフィルタが作成されています。

BuiltInCategoryと日本語カテゴリ名の対応はこちらでご確認ください!

【RevitAPI】BuiltInCategory日本語名の一覧 BuiltInCategory日本語名取得のために:usingの追加 結果はcsvにでも出したい。 SaveFileDial...

ElementMulticategoryFilterのサンプルソースコード

それでは、ElementMulticategoryFilterクラスを用いた複数カテゴリのElement取得について、一連のサンプルソースコードを見ていきます。

コードは壁カテゴリ(BuiltInCategory.OST_Walls)と床カテゴリ(BuiltInCategory.OST_Floors)の取得を記しています。

ソースコード

Sample

    public void 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 elementMulticategoryFilternew 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まとめ

取得したいカテゴリが単独か複数か使用するクラスやメソッドが変わってきてややこしいですね。
でも使い方さえ覚えてしまえば、そんなに難しい使い分けでもありません。

OfCategoryメソッドやOfClassメソッドでカテゴリやクラスの絞り込み、さらにはそれらを単独で指定するのか複数で指定するのか、以上を使いこなせれば取得するElementをかなり絞り込めそうですね。

最後まで読んでいただき、ありがとうございました!

以上です。

 

C#初心者の僕が独学でお世話になった本
プログラミング初心者の僕がコーディング学習でお世話になった本

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください