RevitAPI

【RevitAPI・Selection】ISelectionFilterで選択フィルタ作成

Selectionクラスで選択する部材を絞りたい!
ISelectionFilterインターフェイスを使って選択フィルタを作ることができますよ
ここではサンプルのソースコードを紹介しますね

なお、Selectionクラスについてはこちらをご確認ください。

【RevitAPI】Selectionで部材選択 RevitAPIを使って部材を選択したい プログラム側で条件指定して選択ではなくて 人が目で見てポチポチっと気軽...

準備

部材選択のマクロなので、まずはRevit内に適当に部材を配置してください。
選択に絞り込みをかけるので、異なるカテゴリ、ファミリ、タイプ、様々な部材を配置すると実感しやすいです。

サンプルの実行

アイテムの追加

SelectionFilter.csとでも.cs名を名付けて新しいクラスを作成します。

クラスの作成についてはこちらを確認ください。

【RevitAPI】SharpDevelopでアイテム作成はじめに オリジナルでクラスやフォームを作成するときには、それに対応した新しいアイテムを作成することになります。 ここではその手...

 

SelectionFilter.csのデフォルトのソースコードを下記のように書き換えます。

using以降

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;
    }
    
  }
}

特定タイプ名の部材のみ選択できるようにしていますので、上記"選択したいタイプ名をここに入力"ダブルクォーテーション内を選択したいタイプ名に書き換えます

サンプルマクロ

ThisApplication.csに戻って、Sampleをコーディングします。

Sample

    public void Sample()
    {
      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;
      
      
      ISelectionFilter selectionFilter = new SelectionFilter();
      IList<Element> elementList = uidoc.Selection.PickElementsByRectangle(selectionFilter);
      string elementIds = "";
      foreach(Element element in elementList)
      {
        elementIds += element.Id.ToString() + "\n";
      }
      TaskDialog.Show("Message", elementIds);
    }

マクロの実行

マクロを実行すると、SelectionFilter.csで指定したタイプ名の部材のみしか選択できなくなっています。

注意

ThisApplication.csSelectionFilter.csの「namespace TestMacro」の       部分は一致していなければエラーとなります。

色々な絞り込み

サンプルではタイプ名で絞りましたが、ほかの条件でもフィルタリングできます。
カテゴリ名やファミリ名のサンプルを示します。

SelectionFilter.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;
    }
    
  }
}

                     箇所を以下のように書き換えます。

カテゴリ名 (element as FamilyInstance).Symbol.FamilyName == "選択したいファミリ名をここに入力"
ファミリ名 element.Category.Name == "選択したいカテゴリ名をここに入力"

まとめ

ISelectionFilterを使って様々な条件での部材選択ができるようになりました。
原則的にはここで記したSelectionFilter.cs                     箇所を書き換えるだけなので、いろいろお試しください。

 

以上です。

 

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



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



COMMENT

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

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