RevitAPI

【RevitAPI・C#】FilteredElementCollectorにWhereメソッドを適用

FilteredElementCollectorクラスのOfClassメソッドやOfCategoryメソッドを使って、モデル中から特定のクラスやカテゴリの部材を取得できました。
ここからさらに具体的に、特定のタイプ名特定のファミリ名に絞って取得することはできますか??
指定した条件を満たす部材を取得したいときは、.NET FrameworkLINQよりWhereメソッドを使うと便利です!

LINQC#のお話になるのでRevitAPIからは脱線しますが、とても便利な機能なので使いこなせたらコーディングの幅がかなり広がりますよ!

というわけで、ここではWhereメソッドについて紹介します。

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

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

Whrereメソッドについて

RevitAPIではなく.NET Frameworkで定義されたメソッドです。

FilteredElementCollectorクラスは.NET FrameworkIEnumerableインターフェイスを継承しているので、Enumerableクラスのメソッドを組み合わせることができちゃうんですね。

ややこしい話は置いといて、使い方はサンプルを見てみましょう!

Whrereメソッドのサンプル

というわけでWhereメソッドを使った部材選択のサンプルがこちら

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;
      
      
      FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
      List<Element> elementList = new List<Element>();
      elementList =
        filteredElementCollector
        .OfCategory(BuiltInCategory.OST_StructuralColumns)
        .WhereElementIsNotElementType()
        .Where(element => element.Name == "タイプ名")
        .ToList();
      
      string result = "";
      foreach(Element element in elementList)
      {
        result += element.Name + "\n";
      }
      TaskDialog.Show("Message", result);
    }

モデル上の構造柱から特定タイプ名の部材のみを取得するコードです。

     箇所でWhereメソッドを使っています。

"タイプ名"ダブルクォーテーション内に特定のタイプ名を入れてお試しください。

サンプルの解説

部材取得の解説

部材取得に関わるところを詳しく見ていきましょう。

まずはFilteredElementCollectorクラスのオブジェクトfilteredElementCollectorを先頭に持ってきます。

部材取得に関わる部分

        filteredElementCollector
        .OfCategory(BuiltInCategory.OST_StructuralColumns)
        .WhereElementIsNotElementType()
        .Where(element => element.Name == "タイプ名")
        .ToList();

そこにOfCategoryメソッドで構造柱にのみ部材を絞っています。

部材取得に関わる部分

        filteredElementCollector
        .OfCategory(BuiltInCategory.OST_StructuralColumns)
        .WhereElementIsNotElementType()
        .Where(element => element.Name == "タイプ名")
        .ToList();

さらにWhereElementIsNotElementTypeメソッドで部材をFamilyInstanceクラスに限定します。

部材取得に関わる部分

        filteredElementCollector
        .OfCategory(BuiltInCategory.OST_StructuralColumns)
        .WhereElementIsNotElementType()
        .Where(element => element.Name == "タイプ名")
        .ToList();
OfCategoryメソッド、WhereElementIsNotElementTypeメソッドの詳しい使い方はこちらをどうぞ
【RevitAPI・FilteredElementCollector】OfCategoryでカテゴリフィルタ ここではOfCategoryメソッドについての解説、および使い方のサンプルとしてソースコードをいくつかご紹介します。 ...

ここまで絞ってさらなる絞り込み、WhereメソッドでFamilyInstanceクラスの構造柱から特定のタイプ名に限定しています。

部材取得に関わる部分

        filteredElementCollector
        .OfCategory(BuiltInCategory.OST_StructuralColumns)
        .WhereElementIsNotElementType()
        .Where(element => element.Name == "タイプ名")
        .ToList();

で、最後にListに格納しています。

部材取得に関わる部分

        filteredElementCollector
        .OfCategory(BuiltInCategory.OST_StructuralColumns)
        .WhereElementIsNotElementType()
        .Where(element => element.Name == "タイプ名")
        .ToList();

Whereメソッドその他の例

サンプルではタイプ名に絞りましたが、その他にもいくつか例を挙げてみます。

SampleWhereメソッド部分を書き換えるだけでOKです。

Whereメソッドサンプル

特定する条件 .Whereメソッド
タイプ名 .Where(element => element.Name == "タイプ名")
ファミリ名 .Where(element => (element as FamilyInstance).Symbol.FamilyName == "ファミリ名")
インプレイス以外 .Where(element => (element as FamilyInstance).Symbol.Family.IsInPlace == false)
ピン止めされていない .Where(element => element.Pinned == false)

*ファミリ名は"ファミリ名"ダブルクォーテーション内に特定のファミリ名に書き換えます。

Whereメソッドまとめ

以上、LINQWhereメソッドの使い方の紹介でした。

Whereメソッドまでマスターできたら、欲しい部材は対外ゲットできるっす!

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

 

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

COMMENT

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

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