RevitAPI

【RevitAPI・FilteredElementCollector】OfCategoryでカテゴリフィルタ

FilteredElementCollectorクラスのOfClassメソッドを使ってシステムファミリの「壁」や「床」が取得できました。
でもコンポーネントファミリでは「柱」や「梁」などに絞った取得ができません。。
コンポーネントファミリの要素を取得したいとき、どうすればよいでしょうか??
コンポーネントファミリの取得はOfClassメソッドのみでは限界がありますよね。
この場合はカテゴリで要素を絞りたいので、OfCategoryメソッドを使うのが有効です!

ここではOfCategoryメソッドについての解説、および使い方のサンプルとしてソースコードをいくつかご紹介します。

FilteredElementCollectorクラスとOfClassメソッドの詳細については下記の記事をご覧いただければ幸いです!

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

OfCategoryメソッドについて

OfClassメソッドと同様にFilteredElementCollectorクラスのメソッドです。

FilteredElementCollectorクラスで生成したオブジェクトに対して
OfClassメソッドがクラスを絞るメソッドならOfCategoryメソッドはカテゴリで絞るメソッドです。

名前のまんまですね。

OfCategoryメソッドでは引数にBuiltInCategoryを入れてカテゴリを絞ります。

BuiltInCategoryと日本語カテゴリ名の対応は下記の記事よりご確認願います。

【RevitAPI】BuiltInCategory日本語名の一覧 BuiltInCategory日本語名取得のために:usingの追加 結果はcsvにでも出したい。 SaveFileDial...
それでは簡単なサンプルを見ながら解説していきます!
ターゲットのコンポーネントファミリは構造柱としています。

OfCategoryメソッドの単独使用

まずはFilteredElementCollectorクラスで生成したオブジェクトfilteredElementCollectorOfCategoryメソッドのみを適用してみます。

以下、サンプルのソースコードとその解説を示します。

サンプルソースコード

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.OfCategory(BuiltInCategory.OST_StructuralColumns).ToList();
      
      string result = “”;
      foreach(Element element in elementList)
      {
        result += element.GetType().Name + “_” + element.Category.Name + “_” + element.Name + “\n”;
      }
      TaskDialog.Show(“Message”, result);
    }

解説

構造柱はBuiltInCategoryでOST_StructuralColumnsであり                  のようなコーディングとなります。

ここではクラスも絞らずにいきなりOfCategoryメソッドを適用しています。

なのでこれを実行するとelement.GetType().NameでFamilyInstanceFamilySymbolが取得されているはずです。

FamilyInstanceクラスはインスタンスとして存在する(=ビュー上に”モノ”として配置されている)コンポーネントファミリ
FamilySymbolクラスはシンボルとして存在する(=プロジェクトブラウザでファミリタイプとして登録されている)コンポーネントファミリ
だと考えていただければ理解しやすいかと思います。

というわけで、どちらかのクラスのみを取得したいときはOfClassメソッドとの併用になります。

OfCategoryメソッド:OfClassメソッドの併用

FamilyInstanceクラスとFamilySymbolクラスのそれぞれの場合でコンポーネントファミリを取得するサンプルを示します。

ただただSample1OfClassメソッドを加えているだけなので解説するまでもありませんね笑

FamilyInstance取得のサンプル

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);
      List<Element> elementList = new List<Element>();
      elementList = filteredElementCollector.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_StructuralColumns).ToList();
      
      string result = “”;
      foreach(Element element in elementList)
      {
        result += element.GetType().Name + “_” + element.Category.Name + “_” + element.Name + “\n”;
      }
      TaskDialog.Show(“Message”, result);
    }

FamilySymbol取得のサンプル

Sample3

    public void Sample3()
    {
      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(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralColumns).ToList();
      
      string result = “”;
      foreach(Element element in elementList)
      {
        result += element.GetType().Name + “_” + element.Category.Name + “_” + element.Name + “\n”;
      }
      TaskDialog.Show(“Message”, result);
    }

OfCategoryメソッド:その他メソッドとの併用

先述のOfClassメソッドでFamilyInstanceクラスあるいはFamilySymbolクラスを取得する方法を示しました。

その他にもFilteredElementCollectorクラスには便利なメソッドがあります。

ここでは、ElementTypeかどうかを判断するWhereElementIsNotElementTypeメソッドとWhereElementIsElementTypeメソッドを使ってみます。

こちらも名前の通り、WhereElementIsNotElementTypeメソッドはElementTypeではないものを取得します。

そしてWhereElementIsElementTypeメソッドはElementTypeを取得します。

ElementType=ファミリタイプと考えていただいて支障ありません。
なのでWhereElementIsNotElementTypeメソッドでFamilyInstanceクラスを取得
WhereElementIsElementTypeメソッドでFamilySymbolクラスを取得、ということになります。

OfClassメソッドと効果は同じなので使いやすい方を使う、で良いと思います。

WhereElementIsNotElementTypeメソッド

Sample4

    public void Sample4()
    {
      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().ToList();
      
      string result = “”;
      foreach(Element element in elementList)
      {
        result += element.GetType().Name + “_” + element.Category.Name + “_” + element.Name + “\n”;
      }
      TaskDialog.Show(“Message”, result);
    }

WhereElementIsElementTypeメソッド

Sample5

    public void Sample5()
    {
      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).WhereElementIsElementType().ToList();
      
      string result = “”;
      foreach(Element element in elementList)
      {
        result += element.GetType().Name + “_” + element.Category.Name + “_” + element.Name + “\n”;
      }
      TaskDialog.Show(“Message”, result);
    }

OfCategoryメソッドまとめ

以上でOfCategoryメソッドの基本的な使い方解説を終わります。

OfClassメソッド等その他のメソッドと併用することで、取得したいElementを絞り込めますね!

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

 

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



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



COMMENT

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

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