※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

選択する

ISelectionFilterによる選択要素のフィルタリング

ISelectionFilter要素選択

Selectionクラスを使って、モデル上の要素をクリック選択、範囲選択することができます。

それじゃあ。選択する要素をこのカテゴリだけ、みたいな絞り込みはできない?

できます。

Selectionクラスでは、ISelectionFilterというインターフェースを使って選択要素にフィルタをかけることができます。

ここではその手法を紹介します。

ISelectionFilterの要素選択|モデルの準備

部材選択のプログラムなので、まずはRevit内で適当に要素を配置してしたモデルを準備します^^

フィルタのかかった選択をするので、

  • 異なるカテゴリ
  • 異なるファミリ
  • 異なるタイプ

など、いろんな要素が配置されていれば分かりやすいかと思います。

選択要素のフィルタリング

ISelectionFilterのサンプルプログラム

ISelectionFilterのプログラムはcsファイルを別で作っておいたほうが分かりやすいです。

まずは新規csファイルをクラスで作成します。

参考
SharpDevelopでcs作成
SharpDevelop(シャープデベロップ)のcsファイル追加手順|RevitAPISharpDevelop(シャープデベロップ)に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;
    }
    
  }
}
※上記コードを新規csファイルにコピペでそのまま使えます。

ここで、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);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

 

これは選択部材をハイライト表示するプログラムです。

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#教材

少し踏み込んだ内容まで学習でき、C#の知識が深まります。

美しいコードを書きたい人はこちら

個人的には、プログラマーひとり一冊は持っておくべきと思っている名作です^^
スポンサーリンク



Revitアドイン作ります

のんびり学習してる余裕などない!という方にご案内です。

ランサーズにてRevitのアドイン作成を承っております!

スキル、資格等の詳細はプロフィールをご覧ください。

ご質問などもお気軽にメッセージしていただければと思います。

詳しくは下の記事にまとめています。

【開発依頼】あなただけのRevitアドインを真心込めて作ります!RevitAPIを使ったアドイン開発を承ります。1から学習してアドイン作る余裕がない、外注でアドイン作成を依頼したい、という方はご利用をご検討いただければと思います^^...

最後まで読んでいただき、ありがとうございました^^

以上です。