RevitAPI

【RevitAPI】Selectionで部材選択

  • RevitAPIを使って部材を選択したい
  • プログラム側で条件指定して選択ではなくて
  • 人が目で見てポチポチっと気軽に選択できるような

そんな時にはSelectionクラスが有効です。
ここではSelectionクラスを使った部材選択マクロのサンプルを紹介します。

Selectionクラスのサンプル実行

部材選択のマクロなので、まずはRevit内に適当に部材を配置してみてください。
それぞれの場合でサンプルを実行してみます。

実行結果がわかるように、選択部材のIDをダイアログ表示するようにしています。

単部材の選択

Sample1を実行してみます。

Sample1

    public void 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

    public void 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

    public void 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は少し複雑なので別ページで解説しています。

【RevitAPI・Selection】ISelectionFilterで選択フィルタ作成 なお、Selectionクラスについてはこちらをご確認ください。 https://kizarukun.com/revi...

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クラスまとめ

どの選択マクロを使うにしても、ユーザーの意思で部材を選んでいます。
あんまりプログラミングの恩恵を受けている感はありませんね笑

プログラム側で部材を選択したいときは、こちらをご覧ください。

【RevitAPI】FilteredElementCollectorで部材を取得する ここではFilteredElementCollectorクラスを使った部材取得のサンプルコードを紹介します。 なおSe...

部材選択自体はRevitの通常操作でも当然できるので、
Selectionクラスを単独で使う機会はまぁないでしょうね。

ISelectionFilterまで使いこなせれば、優秀なツールも作れそうな気もします。

 

以上です。

 

↓↓C#初心者の僕が独学でお世話になった本↓↓



↓↓プログラミング初心者の僕がコーディング学習でお世話になった本↓↓



COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください