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

選択する

FilteredElementCollectorで要素選択

FilteredElementCollector

Revitドキュメント内の要素を選択する方法を紹介します。

モデル上からポチポチとクリック選択するのはSelectionクラスを使えばOKですが、せっかくRevitAPIを使うのならプログラムを使って要素選択したいですよね。

そんな時はFilteredElementCollectorを使うのが有効です。

ここではFilteredElementCollectorを使った要素選択についての紹介します。

FilteredElementCollectorについて

FilteredElementCollectorクラスは、Revitドキュメントより要素を検索します。

検索対象はElementクラスです。

Elementクラスとは

Revit内に配置・入力できる、

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

はすべてElementです。

よって、FilteredElementCollectorを使うとほとんどすべての要素が選択可能となります。

FilteredElementCollectorの使い方

FilteredElementCollectorには主に2通りの使い方があります。

FilteredElementCollector(Document) ドキュメントの中からElementを選択する
FilteredElementCollector(Document, ElementId) 指定したビューの中からElementを選択する

モデル全体から選択するのか、ビューを絞って選択するのか、って感じですね。

FilteredElementCollectorで要素選択

サンプルとしてFilteredElementCollectorで壁を選択するプログラムを作成してみました。

  • FilteredElementCollector(Document)
  • FilteredElementCollector(Document, ElementId)

の両方の場合で示します。

FilteredElementCollector(Document)

public void Sample1()
{
  UIDocument uidoc = this.ActiveUIDocument;
  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);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

FilteredElementCollector(Document, ElementId)

public void Sample2()
{
  UIDocument uidoc = this.ActiveUIDocument;
  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);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

サンプルプログラムの解説

どちらのプログラムもすべての壁を選択しています。

違いはモデル全体から選択しているのか、そのビューから選択しているのかです。

そして、選択した壁のIDと名前を表示するようにしています。

どちらのプログラムも10行目以降はIDと名前表示に関わるコードです。

要素選択は6~8行目で完了しています^^

両者の違いは6行目の、

Sample1 FilteredElementCollector(doc)
Sample2 FilteredElementCollector(doc, doc.ActiveView.Id)

この部分ですね。

doc.ActiveView.Idで現在のビューIDを取得できます。

というわけでSample2は、現在のビューに絞って壁を選択しています。

OfClassメソッド

8行目の、

elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

で「OfClass(typeof(Wall))」を使って、選択した要素を壁だけに絞っています。

ToListメソッド

最後に、

elementList = filteredElementCollector.OfClass(typeof(Wall)).ToList();

で「ToList()」を使って、選択要素をListクラスのインスタンス「elementList」に格納しています。

これによって、選択した複数要素がList<T>として扱えるので便利です^^

FilteredElementCollectorまとめ

以上、FilteredElementCollectorクラスの紹介でした。

紹介したのは超初級のサンプルなので、さすがにこれだけでは使えるものではないと思います^^;;

いろいろ条件を絞って試してみてください!

RevitAPI独学用教材

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

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

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

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

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

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

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

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

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



Revitアドイン作ります

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

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

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

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

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

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

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

以上です。