※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

選択する

【FilteredElementCollector】カテゴリでフィルタリング【OfCategory】

FilteredElementCollectorクラスを使ってRevitドキュメント内すべてのElementが取得できます。

全部のElementじゃ多いからさらに絞りたい!例えばカテゴリごとに絞り込むことはできないの?

というように取得するElementをもっと限定したい時もあるかと思いますが、もちろん可能です!

FilteredElementCollectorから、さらに特定カテゴリのみに絞って要素取得するにはOfCategoryメソッドを使用すればOKです。

ここではその手法を紹介していきます^^

OfCategoryメソッドについて

OfCategoryはFilteredElementCollectorクラスのメソッドです。

下記コード8行目のように、OfCategory()のカッコ内に取得したいBuiltInCategoryを入力します。

OfCategoryメソッドの使い方
public void Sample1()
{
  Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument;
  Autodesk.Revit.DB.Document doc = uidoc.Document;
  
  FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
  List<Element> StructuralColumns = new List<Element>();
  StructuralColumns = filteredElementCollector.OfCategory(BuiltInCategory.OST_StructuralColumns).ToList();
}
※上記コードをThisApplication.csにコピペでそのまま使えます。
ここではBuiltInCategory.OST_StructuralColumns(構造柱カテゴリ)を取得しています。

OfCategoryメソッドの要素選択サンプル

OfCategoryメソッドを使ったサンプルをいくつか紹介します。

各サンプルで取得要素のカテゴリ名とタイプ名を表示するようにしています。

OfCategory()のカッコ内を変えるだけなので簡単ですね^^

レベル線

public void Sample2()
{
  Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument;
  Autodesk.Revit.DB.Document doc = uidoc.Document;
  
  FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
  List<Element> Levels = new List<Element>();
  Levels = filteredElementCollector.OfCategory(BuiltInCategory.OST_Levels).ToList();
  
  string message = "";
  foreach(Element element in Levels)
  {
    message += element.Category.Name + "_" + element.Name + "\n";
  }
  TaskDialog.Show("Message", message);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

ビュー

public void Sample3()
{
  Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument;
  Autodesk.Revit.DB.Document doc = uidoc.Document;
  
  FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
  List<Element> Views = new List<Element>();
  Views = filteredElementCollector.OfCategory(BuiltInCategory.OST_Views).ToList();
  
  string message = "";
  foreach(Element element in Views)
  {
    message += element.Category.Name + "_" + element.Name + "\n";
  }
  TaskDialog.Show("Message", message);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

部屋

public void Sample4()
{
  Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument;
  Autodesk.Revit.DB.Document doc = uidoc.Document;
  
  FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
  List<Element> Rooms = new List<Element>();
  Rooms = filteredElementCollector.OfCategory(BuiltInCategory.OST_Rooms).ToList();
  
  string message = "";
  foreach(Element element in Rooms)
  {
    message += element.Category.Name + "_" + element.Name + "\n";
  }
  TaskDialog.Show("Message", message);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

 

OfCategoryメソッドと他メソッドの組み合わせ

OfCategoryメソッドでカテゴリをフィルタリングするとドキュメント中のすべてのカテゴリを取得します。

そうすると例えばFamilyInstanceクラスのみを取得したいときも同カテゴリのFamilySymbolクラスまで取得するようなことになります。

  • FamilyInstanceクラスはインスタンスとして存在する(=ビュー上に"モノ"として配置されている)コンポーネントファミリ
  • FamilySymbolクラスはシンボルとして存在する(=プロジェクトブラウザでファミリタイプとして登録されている)コンポーネントファミリ
FamilyInstanceとFamilySymbolの違い

これを回避してどちらかのクラスのみ取得したいときには、OfCategoryメソッドとOfClassメソッドを組み合わせればよいです。

OfClassメソッドについてはこちら
RevitAPI-OfClass
【FilteredElementCollector】OfClassでクラスでフィルタRevitAPIでドキュメント内の要素をクラスでフィルタリングして取得する方法を紹介します。FilteredElementCollectorクラスのOfClassメソッドで超簡単です^^...

インスタンス(FamilyInstanceクラス)とタイプ(FamilySymbolクラス)でそれぞれ構造柱を取得するサンプルを下記に示します。

FamilyInstance

public void Sample5()
{
  Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument;
  Autodesk.Revit.DB.Document doc = uidoc.Document;
  
  FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
  List<Element> StructuralColumns = new List<Element>();
  StructuralColumns = filteredElementCollector.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_StructuralColumns).ToList();
  
  string message = "";
  foreach(Element element in StructuralColumns)
  {
    message += element.Category.Name + "_" + element.Name + "\n";
  }
  TaskDialog.Show("Message", message);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

FamilySymbol

public void Sample6()
{
  Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument;
  Autodesk.Revit.DB.Document doc = uidoc.Document;
  
  FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
  List<Element> StructuralColumns = new List<Element>();
  StructuralColumns = filteredElementCollector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralColumns).ToList();
  
  string message = "";
  foreach(Element element in StructuralColumns)
  {
    message += element.Category.Name + "_" + element.Name + "\n";
  }
  TaskDialog.Show("Message", message);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

 

こんな感じでFilteredElementCollectorクラスのメソッドを必要に応じて繋げていけば、欲しい要素のみに絞り込んで取得することができますね^^

OfCategoryメソッドまとめ

以上、FilteredElementCollectorのOfCategoryメソッドの使い方でした。

RevitAPI独学用教材

最後に教材等を紹介します。

RevitAPIを理解してプログラムを作れるようになるには、C#の知識が必要です。

下記、オススメの参考書です。

プログラムが初心者にオススメのC#教材

イラストでの解説が分かりやすく、初めてのプログラミング学習にピッタリです。

プログラムの基礎知識がある人にオススメのC#教材

少し踏み込んだ内容まで学習でき、C#の知識が深まります。

美しいコードを書きたい人はこちら

個人的には、プログラマーひとり一冊は持っておくべきと思っている名作です^^
スポンサーリンク



Revitアドイン作ります

のんびり学習してる余裕などない!という方にご案内です。

ランサーズにてRevitのアドイン作成を承っております!

スキル、資格等の詳細はプロフィールをご覧ください。

ご質問などもお気軽にメッセージしていただければと思います。

詳しくは下の記事にまとめています。

【開発依頼】あなただけのRevitアドインを真心込めて作ります!RevitAPIを使ったアドイン開発を承ります。1から学習してアドイン作る余裕がない、外注でアドイン作成を依頼したい、という方はご利用をご検討いただければと思います^^...

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

以上です。