RevitAPI

【RevitAPI・C#】FilteredElementCollectorで単一部材の選択

FilteredElementCollectorクラスで条件に一致する部材を取得し、ElementクラスのListに格納することができました。
ここで取得したいElementが複数ではなく単一の場合はFilteredElementCollectorクラスは使用可能なの?

可能です!

複数部材でToListメソッドを使用していたものを、単独部材の場合はFirstElementメソッドやFirstメソッドに置き換えるだけです。

簡単ですよ。

ここではサンプルを確認しながら、FilteredElementCollectorクラスでの単一Elementの取得方法を解説します。

なおFilteredElementCollectorクラスの使い方は下記の記事をご覧ください。

【RevitAPI】FilteredElementCollectorで部材を取得する ここではFilteredElementCollectorクラスを使った部材取得のサンプルコードを紹介します。 なおSe...

単一Element取得のためのメソッド

先述のようにFirstElementメソッドやFirstメソッドが単一Elementの取得に有効です。

単一Elementの取得に有効なメソッド

メソッド 解説
FirstElement FilteredElementCollectorクラスのメソッド
First .NET FrameworkよりEnumerableクラスのメソッド
詳しくはサンプルのソースコードを通して解説します。

FirstElementメソッド

サンプルソースコード

下記Sample1FirstElementメソッドを使用したサンプルのソースコードです。

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);
      Element element = filteredElementCollector.OfClass(typeof(Wall)).FirstElement();
      
      TaskDialog.Show(“Message”, element.GetType().Name + “_” + element.Name);
    }

解説

FilteredElementCollectorクラスで複数の部材を取得する場合はElementクラスのList型でオブジェクトを生成していました。

ここではElementクラス単品取得なので、Elementクラスのオブジェクトelementを生成しています。

そしてFilteredElementCollectorクラスのオブジェクトfilteredElementCollectorにあれこれ条件を指定して、最後にFirstElementメソッドを使います。

FirstElementメソッドは条件に一致する、最初のElementを取得できます

Sample1の場合、ドキュメント中からElementを壁に絞って、その中から1つ目のElementを取得しています。

Whereメソッドを組み合わせると、特定タイプ名の壁を単一選択、ってこともできますね。

Whereメソッドの使い方は下記をご覧ください!

【RevitAPI・C#】FilteredElementCollectorにWhereメソッドを適用 LINQはC#のお話になるのでRevitAPIからは脱線しますが、とても便利な機能なので使いこなせたらコーディングの幅が...

Firstメソッド

サンプルソースコード

下記Sample2Firstメソッドを使用したサンプルのソースコードです。

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);
      Element element = filteredElementCollector.OfClass(typeof(Wall)).First(element => element.Name == “タイプ名”);


      
      TaskDialog.Show(“Message”, element.GetType().Name + “_” + element.Name);
    }

解説

基本的にはSample1と同じです。

Sample1FirstElementメソッドを使用していた箇所をFirstメソッドに置き換えているだけです。

Firstメソッドは引数なしで使用した場合、条件に一致する最初のElementを取得できます

FirstElementメソッドと同じ効果ですね。

Firstメソッドの特徴としては、Sample2のように引数をラムダ式で描くことでWhereメソッドと組み合わせたような使い方もできます。

Sample2の場合、ドキュメント中からElement“タイプ名”という名前の壁に絞って、その中から1つ目のElementを取得しています。

これをFirstElementメソッドを使ってやろうとするとWhereメソッドも使用することになるので、Firstメソッドよりもひと手間かかるわけですね。

単一Element取得まとめ

以上、FilteredElementCollectorクラスでの単一Elementの取得方法の紹介でした。

FilteredElementCollectorクラスを使っているので、Elementをシングルで取得したいのに、いったんドキュメント内の全要素取得することになります。
ちょっとイケてない気もしますね笑

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

 

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

COMMENT

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

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