RevitAPI

【RevitAPI】FilteredElementCollectorで部材を取得する

Selectionクラスのように手動で部材を選択するんじゃなくて、
指定した条件に合致する部材をプログラム側で一括で取得したい!
そんな時はFilteredElementCollectorクラスを使うのが有効です。

ここではFilteredElementCollectorクラスを使った部材取得のサンプルコードを紹介します。
なおSelectionクラスを使った部材取得は下記記事をご覧いただければ幸いです。

【RevitAPI】Selectionで部材選択 RevitAPIを使って部材を選択したい プログラム側で条件指定して選択ではなくて 人が目で見てポチポチっと気軽...
【RevitAPI・Selection】ISelectionFilterで選択フィルタ作成 なお、Selectionクラスについてはこちらをご確認ください。 https://kizarukun.com/revi...

FilteredElementCollectorとは?

Filterする条件にあうElementをCollectするクラスですね。
・・・はい?

まぁざっくり言うと、ドキュメント内のElementから
指定した条件に合致するものをゴソッと取得するクラスです。

・・・Element。。

Elementとは?

ElementはRevitドキュメントで基本となっているクラスです。

  • 壁・床などのシステムファミリ
  • ドアや窓などのコンポーネントファミリ
  • 通芯やレベル
  • マテリアル
  • 伏図や断面図などのビュー

これらはElementクラスを祖先に進化したものです。

ほうほう、、って、ぜんぶやん
はい。ブラウザ上に見えているものは、祖先まで遡るとだいたいElementクラスです。
ファミリやビューは、Elementクラスを祖先に別系統に進化していると考えてください。

*ドキュメント内のすべての祖先がElementクラスというわけではありません。

FilteredElementCollectorのコンストラクタ

ファミリとかビューとか一見まったく違うようなものでもElementの血は流れています。
なのでFilteredElementCollectorで取得できるわけですね。

コンストラクタには以下のオーバーロードがあり、どこからElementを取得するのかが変わってきます。

コンストラクタ
FilteredElementCollector(Document);
FilteredElementCollector(Document, ElementId);
FilteredElementCollector(Document, ICollection(ElementId));

FilteredElementCollector(Document)はドキュメント全体からElementを取得します。
FilteredElementCollector(Document, ElementId)は指定したビューからElementを取得します。

ここではFilteredElementCollector(Document, ICollection(ElementId))
は省略します。

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

FilteredElementCollectorで全てのElementを取得したら、そこから欲しいものだけが残るように「ふるい」にかけます。
超シンプルなサンプルとして、壁ファミリを取得するソースコードを用意しました。

取得した壁のIDと名前を表示するようにしています。

FilteredElementCollector(Document)

Sample1を実行するとドキュメントにある壁すべてを取得します。

Sample1

    public void Sample1()
    {
      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;
      
      
      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();
      
      string result = "";
      foreach(Element element in elementList)
      {
        result += element.Id + "_" + element.Name + "\n";
      }
      TaskDialog.Show("Message", result);
    }

FilteredElementCollector(Document, ElementId)

Sample2を実行すると現在のビューにある壁すべてを取得します。

Sample2

    public void Sample2()
    {
      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;
      
      
      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc, doc.ActiveView.Id);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();
      
      string result = "";
      foreach(Element element in elementList)
      {
        result += element.Id + "_" + element.Name + "\n";
      }
      TaskDialog.Show("Message", result);
    }

サンプルソースコードの解説

それぞれのサンプルでFilteredElementCollectorに関わるコードは

Sample1

      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

Sample2

      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc, doc.ActiveView.Id);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

の部分です。
これをざっくりと解説します。

FilteredElementCollectorクラスのオブジェクト生成

Sample1

      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

Sample2

      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc, doc.ActiveView.Id);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

FilteredElementCollectorクラスのオブジェクトfilteredElementCollectorを生成するとき

  • new FilteredElementCollector(doc)でドキュメント内から
  • new FilteredElementCollector(doc, doc.ActiveView.Id)で現在のビュー内から

それぞれ、すべてのElementを取得しています。

doc.ActiveView.Idは現在のビューIDを取得する時に使います。

これ以降の処理はSample1Sample2も同じです。

OfClassメソッド

Sample1

      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

filteredElementCollectorはすべてのElementを抱えているので、これを壁ファミリのElementだけに限定します。
そこでFilteredElementCollectorクラスのメソッドから、指定したクラスを取得できるOfClassメソッドを使います。

壁ファミリはWallクラスなので、.OfClass(typeof(Wall))と記述しています。

OfClassメソッドの使い方については下記の記事をご覧いただければ幸いです。

【RevitAPI・FilteredElementCollector】OfClassでクラスフィルタ なお、FilteredElementCollectorクラスの基本的な使い方については下記の記事を読んでいただければ幸い...

ToListメソッド

Sample1

      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

OfClassメソッドでfilteredElementCollectorが壁ファミリにのみ限定されました。
これをLINQのToListメソッドでList型に変換します。

そしてelementListElementクラスで生成したList)に代入して、
壁ファミリだけを取得したListの出来上がりです。

FilteredElementCollectorまとめ

以上、超初級のFilteredElementCollectorクラスのサンプルでした。

あとはこのListをforeachなどでループさせて、
Elementひとつずつに煮るなり焼くなり
お好きな処理をどうぞ。

以上です。

 

↓↓C#初心者の僕が独学でお世話になった本↓↓



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



COMMENT

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

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