ここからさらに具体的に、特定のタイプ名や特定のファミリ名に絞って取得することはできますか??
LINQはC#のお話になるのでRevitAPIからは脱線しますが、とても便利な機能なので使いこなせたらコーディングの幅がかなり広がりますよ!
というわけで、ここではWhereメソッドについて紹介します。
そもそものFilteredElementCollectorクラスの使い方は下記の記事をご覧ください。
https://kizarukun.com/revitapi-filteredelementcollector
Whrereメソッドについて
RevitAPIではなく.NET Frameworkで定義されたメソッドです。
FilteredElementCollectorクラスは.NET FrameworkのIEnumerableインターフェイスを継承しているので、Enumerableクラスのメソッドを組み合わせることができちゃうんですね。
Whrereメソッドのサンプル
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を先頭に持ってきます。
部材取得に関わる部分
.OfCategory(BuiltInCategory.OST_StructuralColumns)
.WhereElementIsNotElementType()
.Where(element => element.Name == “タイプ名”)
.ToList();
そこにOfCategoryメソッドで構造柱にのみ部材を絞っています。
部材取得に関わる部分
.OfCategory(BuiltInCategory.OST_StructuralColumns)
.WhereElementIsNotElementType()
.Where(element => element.Name == “タイプ名”)
.ToList();
さらにWhereElementIsNotElementTypeメソッドで部材をFamilyInstanceクラスに限定します。
部材取得に関わる部分
.OfCategory(BuiltInCategory.OST_StructuralColumns)
.WhereElementIsNotElementType()
.Where(element => element.Name == “タイプ名”)
.ToList();
https://kizarukun.com/revitapi-filteredelementcollector-ofcategory
ここまで絞ってさらなる絞り込み、WhereメソッドでFamilyInstanceクラスの構造柱から特定のタイプ名に限定しています。
部材取得に関わる部分
.OfCategory(BuiltInCategory.OST_StructuralColumns)
.WhereElementIsNotElementType()
.Where(element => element.Name == “タイプ名”)
.ToList();
で、最後にListに格納しています。
部材取得に関わる部分
.OfCategory(BuiltInCategory.OST_StructuralColumns)
.WhereElementIsNotElementType()
.Where(element => element.Name == “タイプ名”)
.ToList();
Whereメソッドその他の例
サンプルではタイプ名に絞りましたが、その他にもいくつか例を挙げてみます。
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メソッドまとめ
以上、LINQのWhereメソッドの使い方の紹介でした。
最後まで読んでいただき、ありがとうございました!