でもコンポーネントファミリでは「柱」や「梁」などに絞った取得ができません。。
コンポーネントファミリの要素を取得したいとき、どうすればよいでしょうか??
この場合はカテゴリで要素を絞りたいので、OfCategoryメソッドを使うのが有効です!
ここではOfCategoryメソッドについての解説、および使い方のサンプルとしてソースコードをいくつかご紹介します。
FilteredElementCollectorクラスとOfClassメソッドの詳細については下記の記事をご覧いただければ幸いです!


もくじ
OfCategoryメソッドについて
OfClassメソッドと同様にFilteredElementCollectorクラスのメソッドです。
FilteredElementCollectorクラスで生成したオブジェクトに対して
OfClassメソッドがクラスを絞るメソッドならOfCategoryメソッドはカテゴリで絞るメソッドです。
OfCategoryメソッドでは引数にBuiltInCategoryを入れてカテゴリを絞ります。
BuiltInCategoryと日本語カテゴリ名の対応は下記の記事よりご確認願います。

ターゲットのコンポーネントファミリは構造柱としています。
OfCategoryメソッドの単独使用
まずはFilteredElementCollectorクラスで生成したオブジェクトfilteredElementCollectorにOfCategoryメソッドのみを適用してみます。
以下、サンプルのソースコードとその解説を示します。
サンプルソースコード
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でFamilyInstanceとFamilySymbolが取得されているはずです。
FamilySymbolクラスはシンボルとして存在する(=プロジェクトブラウザでファミリタイプとして登録されている)コンポーネントファミリ
だと考えていただければ理解しやすいかと思います。

というわけで、どちらかのクラスのみを取得したいときはOfClassメソッドとの併用になります。
OfCategoryメソッド:OfClassメソッドの併用
FamilyInstanceクラスとFamilySymbolクラスのそれぞれの場合でコンポーネントファミリを取得するサンプルを示します。
ただただSample1にOfClassメソッドを加えているだけなので解説するまでもありませんね笑
FamilyInstance取得のサンプル
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
{
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を取得します。
なのでWhereElementIsNotElementTypeメソッドでFamilyInstanceクラスを取得
WhereElementIsElementTypeメソッドでFamilySymbolクラスを取得、ということになります。
OfClassメソッドと効果は同じなので使いやすい方を使う、で良いと思います。
WhereElementIsNotElementTypeメソッド
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
{
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メソッドの基本的な使い方解説を終わります。
最後まで読んでいただき、ありがとうございました!
C#初心者の僕が独学でお世話になった本
プログラミング初心者の僕がコーディング学習でお世話になった本