Selectionクラスを使って、モデル上の要素をクリック選択、範囲選択することができます。
できます。
Selectionクラスでは、ISelectionFilterというインターフェースを使って選択要素にフィルタをかけることができます。
ここではその手法を紹介します。
Selectionクラスの使い方は下の記事をご覧ください。
ISelectionFilterの要素選択|モデルの準備
部材選択のプログラムなので、まずはRevit内で適当に要素を配置してしたモデルを準備します^^
フィルタのかかった選択をするので、
- 異なるカテゴリ
- 異なるファミリ
- 異なるタイプ
など、いろんな要素が配置されていれば分かりやすいかと思います。
選択要素のフィルタリング
ISelectionFilterのサンプルプログラム
ISelectionFilterのプログラムはcsファイルを別で作っておいたほうが分かりやすいです。
まずは新規csファイルをクラスで作成します。
次に、作成したcsファイルに下のコードをコピペします。
using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
namespace TestMacro
{
/// <summary>
/// Description of SelectionFilter.
/// </summary>
public class SelectionFilter : ISelectionFilter
{
public bool AllowElement(Element element)
{
if (element.Name == "選択したいタイプ名をここに入力")
{
return true;
}
return false;
}
public bool AllowReference(Reference refer, XYZ point)
{
return false;
}
}
}
ここで、8行目の「namespace」は「ThisApplication.cs」と同じものに書き換えます。
namespace TestMacro
上記のコードでは、特定タイプ名の要素をフィルタリングできるようにしています。
18行目の、
if (element.Name == "選択したいタイプ名をここに入力")
の""内に、配置した要素から適当なタイプ名を選んで書換えてみてください^^
要素選択メインのプログラム
ThisApplicarion.csには以下のコードをコピペします。
public void Sample()
{
UIDocument uidoc = this.ActiveUIDocument;
ISelectionFilter selectionFilter = new SelectionFilter();
List<ElementId> elementIdList = uidoc.Selection.PickElementsByRectangle(selectionFilter).Select(x => x.Id).ToList();
uidoc.Selection.SetElementIds(elementIdList);
}
これは選択部材をハイライト表示するプログラムです。
5行目の、
ISelectionFilter selectionFilter = new SelectionFilter();
で、前節で作成した選択フィルタを呼び出しています。
これを実行すれば、先ほど作ったタイプ名で要素を絞った選択ができますよ^^
その他選択フィルタのサンプル
最初に作ったISelectionFilterのコードを書き換えることで、異なるフィルタリングができます。
using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
namespace TestMacro
{
/// <summary>
/// Description of SelectionFilter.
/// </summary>
public class SelectionFilter : ISelectionFilter
{
public bool AllowElement(Element element)
{
if (element.Name == "選択したいタイプ名をここに入力")
{
return true;
}
return false;
}
public bool AllowReference(Reference refer, XYZ point)
{
return false;
}
}
}
18行目をフィルタリングしたい項目によって、下表のように書き換えます。
| カテゴリ | element.Category.Name == "選択したいカテゴリ名をここに入力" |
|---|---|
| ファミリ | (element as FamilyInstance).Symbol.FamilyName == "選択したいファミリ名" |
ISelectionFilterで選択要素をフィルタ|まとめ
以上、ISelectionFilterインターフェースを使ったフィルタリングのサンプル紹介でした。
選択部材を絞り込めることで、プログラムでできることの幅が広がりそうですね。
RevitAPI独学用教材
最後に教材等を紹介します。
RevitAPIを理解してプログラムを作れるようになるには、C#の知識が必要です。
下記、オススメの参考書です。
プログラムが初心者にオススメのC#教材
プログラムの基礎知識がある人にオススメのC#教材
美しいコードを書きたい人はこちら
Revitアドイン作ります
のんびり学習してる余裕などない!という方にご案内です。
スキル、資格等の詳細はプロフィールをご覧ください。
ご質問などもお気軽にメッセージしていただければと思います。
詳しくは下の記事にまとめています。
最後まで読んでいただき、ありがとうございました^^
以上です。






