RevitAPIではモデル内の要素を取得する方法が重要です。
その中でもFilteredElementCollectorクラスは広く使われます。
本記事ではWhereメソッドを活用したフィルタリングの方法を解説します。
Revitアドイン開発をLancersにて承っております。
詳しくは下の記事にまとめています。

FilteredElementCollectorとは
FilteredElementCollectorは、Revitモデル内の要素を取得するためのクラスです。
このクラスを使うと、特定のカテゴリやパラメータを持つ要素を絞り込むことができます。
以下のコードは、すべての要素を取得する基本的な使い方です。
FilteredElementCollector collector = new FilteredElementCollector(doc); ICollection<Element> elements = collector.ToElements();
このコードでは、モデル内のすべての要素を取得しています。

Whereメソッドの概要
WhereメソッドはFilteredElementCollectorで収集した要素に対して条件を追加するためのメソッドです。
このメソッドを使うと条件に合致する要素だけを取得できます。
Whereメソッドの基本的な構文は以下のようになります。
collector.Where(e => 条件式);
この条件式の部分で要素のプロパティをチェックできます。
Whereメソッドの基本的な使い方
Whereメソッドを使うと特定の条件に合致する要素のみを取得できます。
例えば、名前が"ドア"を含む要素を取得する場合次のように記述します。
FilteredElementCollector collector = new FilteredElementCollector(doc); var filteredElements = collector.Where(e => e.Name.Contains("ドア"));
このコードでは、すべての要素の中から、名前に"ドア"を含む要素を抽出しています。
Whereメソッドの条件設定のコツ
Whereメソッドを使用するときは条件を適切に指定することが重要です。
条件を明確に設定することで検索結果を効率的に取得できます。
例えば、要素のカテゴリが"壁"のものだけを取得する場合、次のように記述します。
FilteredElementCollector collector = new FilteredElementCollector(doc); var walls = collector.Where(e => e.Category.Name == "壁");
このコードでは、カテゴリ名が"壁"の要素のみを取得しています。
複数条件を組み合わせる方法
Whereメソッドを使うと、複数の条件を組み合わせることもできます。
例えば"壁"カテゴリで、かつ名前が"コンクリート"を含む要素を取得する場合は、以下のように記述します。
FilteredElementCollector collector = new FilteredElementCollector(doc); var concreteWalls = collector.Where(e => e.Category.Name == "壁" && e.Name.Contains("コンクリート"));
このように、「&&(AND条件)」や「||(OR条件)」を組み合わせることで、より柔軟な検索が可能になります。
Whereメソッドの使用例(コード付き)
実際にWhereメソッドを活用して、壁のリストを取得するコードを紹介します。
public void Sample() { Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument; Autodesk.Revit.DB.Document doc = uidoc.Document; FilteredElementCollector collector = new FilteredElementCollector(doc); var walls = collector.OfClass(typeof(Wall)).Where(e => e.Category.Name == "壁").ToList(); foreach (var wall in walls) { TaskDialog.Show("Wall Info", wall.Name); } }
このコードでは、カテゴリが"壁"の要素を取得し、それぞれの名前を表示しています。
Whereメソッドの注意点と制限
Whereメソッドを使用する際には、以下の点に注意が必要です。
- 処理速度の影響:フィルタリング対象が多いと処理が遅くなる可能性があります。
- メモリ使用量:大量の要素を扱うと、メモリ消費が増える場合があります。
- 条件の適用範囲:Whereメソッドはすでに収集した要素に対してのみ適用されます。
OfClassやOfCategoryなど適切な条件設定を行い、パフォーマンスを考慮した使い方を心掛けましょう。


FilteredElementCollectorの応用テクニック
Whereメソッドと他のメソッドを組み合わせることで、より高度な検索が可能になります。
例えば、パラメータ値を条件にする場合、次のように記述できます。
FilteredElementCollector collector = new FilteredElementCollector(doc); var elements = collector.Where(e => e.LookupParameter("Height").AsDouble() > 3.0);
このコードでは、高さが3.0フィート以上の要素のみを取得しています。
FilteredElementCollectorのWhereの使い方まとめ
本記事ではFilteredElementCollectorのWhereメソッドについて解説しました。
Whereメソッドを使うと特定の条件に合致する要素を効率的に取得できます。
また、複数条件の組み合わせや応用テクニックを活用することで、より柔軟な検索が可能です。
RevitAPIを活用して、効率的なデータ取得を実現しましょう!
RevitAPI独学用教材
最後に教材等を紹介します。
RevitAPIを理解してプログラムを作れるようになるには、C#の知識が必要です。
下記、オススメの参考書です。
プログラムが初心者にオススメのC#教材
プログラムの基礎知識がある人にオススメのC#教材
美しいコードを書きたい人はこちら
Revitアドイン作ります
のんびり学習してる余裕などない!という方にご案内です。
スキル、資格等の詳細はプロフィールをご覧ください。
ご質問などもお気軽にメッセージしていただければと思います。
詳しくは下の記事にまとめています。

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