RevitAPI

【RevitAPI】ElementMulticlassFilterで複数クラスの取得

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

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

【RevitAPI】FilteredElementCollectorで部材を取得する ここではFilteredElementCollectorクラスを使った部材取得のサンプルコードを紹介します。 なおSe...
【RevitAPI・FilteredElementCollector】OfClassでクラスフィルタ なお、FilteredElementCollectorクラスの基本的な使い方については下記の記事を読んでいただければ幸い...

ElementMulticlassFilterについて

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

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

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

サンプルコード

こんな感じで使います。

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

      List<Type> classList = new List<Type>(){
        typeof(Wall),
        typeof(Floor)
      };
      ElementMulticlassFilter elementMulticlassFilter = new ElementMulticlassFilter(classList);

サンプルコードの解説

まずはフィルタにかけるクラスのリストを作成します。
ここではTypeのList、classListにWallクラスとFloorクラスを入れて初期化しています。

      List<Type> classList = new List<Type>(){
        typeof(Wall),
        typeof(Floor)
      };
      ElementMulticlassFilter elementMulticlassFilter = new ElementMulticlassFilter(classList);

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

      List<Type> classList = new List<Type>(){
        typeof(Wall),
        typeof(Floor)
      };
      ElementMulticlassFilter elementMulticlassFilter = new ElementMulticlassFilter(classList);
たったこれだけのコードでクラスフィルタの出来上がりです。
上記コードでは壁と床をのフィルタが作成されています。

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

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

コードは壁(Wallクラス)と床(Floorクラス)の取得を記しています。

ソースコード

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<Type> classList = new List<Type>(){
        typeof(Wall),
        typeof(Floor)
      };
      ElementMulticlassFilter elementMulticlassFilternew ElementMulticlassFilter(classList);
      
      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.WherePasses(elementMulticlassFilter).ToList();
      
      string result = "";
      foreach(Element element in elementList)
      {
        result += element.GetType().Name + "_" + element.Name + "\n";
      }
      TaskDialog.Show("Message", result);
    }

解説

ElementMulticlassFilterクラスの使い方で解説したように、まずは取得したいクラスのオブジェクトelementMulticlassFilterを作成しました。

あとはOfClassメソッドを使ったElement取得と同じ流れです。

ここではOfClassメソッドの代わりにFilteredElementCollectorクラスのWherePassesメソッドを使っています。

使い方としては.WherePasses(elementMulticlassFilter)のように
作成したフィルタを引数に入れて使用するメソッドです。

ElementMulticlassFilterまとめ

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

そもそも取得したいElementを絞りたいのに、ここで複数クラスを指定しまくると部材が絞り込めません。
ご利用は計画的に。。

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

以上です。

 

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

COMMENT

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

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