- RevitAPIを使って部材を選択したい
- プログラム側で条件指定して選択ではなくて
- 人が目で見てポチポチっと気軽に選択できるような
そんな時にはSelectionクラスが有効です。
ここではSelectionクラスを使った部材選択マクロのサンプルを紹介します。
もくじ
Selectionクラスのサンプル実行
部材選択のマクロなので、まずはRevit内に適当に部材を配置してみてください。
それぞれの場合でサンプルを実行してみます。
実行結果がわかるように、選択部材のIDをダイアログ表示するようにしています。
単部材の選択
Sample1を実行してみます。
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;
Reference reference = uidoc.Selection.PickObject(ObjectType.Element);
TaskDialog.Show(“Message”, reference.ElementId.ToString());
}
実行すると部材上にカーソルが乗っている場合のみ選択可能となります。
ここで部材を選択すると、選択部材のIDがダイアログで出てきます。
複数部材の選択
Sample2を実行してみます。
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;
IList<Reference> referenceList = uidoc.Selection.PickObjects(ObjectType.Element);
string referenceIds = “”;
foreach(Reference reference in referenceList)
{
referenceIds += reference.ElementId.ToString() + “\n”;
}
TaskDialog.Show(“Revit”, referenceIds);
}
部材上にカーソルが乗っているとき、カーソル横に+か-のマークが表示されます。
これより部材の選択・選択解除ができます。
適当に選択して終了ボタンを押すと、選択部材すべてのIDが表示されます。

範囲選択
Sample3を実行してみます。
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;
IList<Element> elementList = uidoc.Selection.PickElementsByRectangle();
string elementIds = “”;
foreach(Element element in elementList)
{
elementIds += element.Id.ToString() + “\n”;
}
TaskDialog.Show(“Message”, elementIds);
}
通常のRevit操作での範囲選択のようにドラッグで部材選択できるようになります。
選択後、選択部材すべてのIDが表示されます。
Selectionクラスのサンプル解説
一応解説しときます。
選択方法によるコードの違い
各サンプルでSelectionクラスを使って部材の選択をしています。
メソッドは選択方法によってそれぞれ変わります。
Sample3で使ったプロパティ
選択方法 | メソッド | 戻り値の型 |
クリック(単一部材) | PickObject | Reference |
クリック(複数部材) | PickObjects | IList<Reference> |
範囲選択 | PickElementsByRectangle | IList<Element> |
PickObjectおよびPickObjectsメソッド
オーバーロードは同じものを持っています。PickObjectを例に紹介します。
PickObject
PickObject(ObjectType) |
PickObject(ObjectType, ISelectionFilter) |
PickObject(ObjectType, String) |
PickObject(ObjectType, ISelectionFilter, String) |
PickObject(ObjectType)
ObjectTypeは列挙型で、部材をどのように選択するかを決定します。
ObjectType Enumeration
メンバー | 選択方法 |
Nothing | 何も選択できません |
Element | 通常の要素選択 |
PointOnElement | 要素上の点を選択する |
Edge | 要素をエッジで選択する |
Face | 要素を面で選択する |
LinkedElement | リンクファイルの要素を選択する |
PickObject(ObjectType, ISelectionFilter)
ObjectTypeで部材の選択方法を決定します。
さらにISelectionFilterで、選択部材にフィルタをかけることができます。
ISelectionFilterは少し複雑なので別ページで解説しています。

PickObject(ObjectType, String)
ObjectTypeで部材の選択方法を決定します。
さらにStringで指定した文字が、マクロ実行時に画面左下に出ます。
PickObject(ObjectType, ISelectionFilter, String)
PickObject(ObjectType, ISelectionFilter)とPickObject(ObjectType, String)の複合版の仕様です。
PickElementsByRectangleメソッド
以下のようなオーバーロードがあります。
PickElementsByRectangle
PickElementsByRectangle() |
PickElementsByRectangle(String) |
PickElementsByRectangle(ISelectionFilter) |
PickElementsByRectangle(ISelectionFilter, String) |
引数に出てくるStringとISelectionFilterの効果はPickObjectおよびPickObjectsメソッドと同様です。
Selectionクラスまとめ
どの選択マクロを使うにしても、ユーザーの意思で部材を選んでいます。
あんまりプログラミングの恩恵を受けている感はありませんね笑
プログラム側で部材を選択したいときは、こちらをご覧ください。

部材選択自体はRevitの通常操作でも当然できるので、
Selectionクラスを単独で使う機会はまぁないでしょうね。
ISelectionFilterまで使いこなせれば、優秀なツールも作れそうな気もします。
以上です。
↓↓C#初心者の僕が独学でお世話になった本↓↓
↓↓プログラミング初心者の僕がコーディング学習でお世話になった本↓↓