【AutoCAD LISP】特定の条件にあった図形だけを選択する方法

2022年2月18日

くり2

LISP で赤色の円だけ選択したいんだけど…

どうやるのかなぁ?

こんにちは、メモだよ!!管理人です。

今回は、そんなあなたに、AutoCAD で LISP を使用して、特定の条件にあった図形だけを選択する方法を紹介します。

例えば、図面の中の赤色の円だけを選択するといったことができます。

それ以外にも、いろいろできるので、これから紹介する方法を参考にいろいろ試してみてくださいね。😄

 

vla-select 関数で、フィルタを指定して特定の図形を選択

vla-select 関数にフィルタを設定できます。

5 番目の引数で、フィルタ タイプを指定します。

6 番目の引数で、フィルタ データを指定します。

タイプとデータは、DXF リファレンス で確認できます。

例えば、DXF グループ コード(番号順)リファレンス で、グループ コード 0 が、「図形タイプを表すテキスト文字列」ということがわかります。

そして、図形に共通のグループ コード(DXF) で、グループ コード 62 が、「色番号」ということがわかります。

最初は何がなんだかわからないと思いますが、そのうち慣れてくると思います。

(defun c:SelectRedCircles ()
  ; AutoCAD のオブジェクトを取得
  (setq acadObject (vlax-get-acad-object))

  ; アクティブなドキュメントを取得
  (setq activeDocument (vla-get-activedocument acadObject))

  ; 選択セットのオブジェクトを取得
  (setq selectionSets (vla-get-selectionsets activeDocument))
  
  ; すでにこれから作成する選択セットと同じ名前があるか確認し、あれば削除
  (setq selectionSetName "RedCIrcle")
  (deleteSelectionSet selectionSets selectionSetName)
  
  ; 新しい選択セットを追加
  (setq ssRedCircle (vla-add selectionSets selectionSetName))
  
  ; フィルタ タイプ用のセーフ配列を作成(インデックスは 0 から 3)
  (setq filterType (vlax-make-safearray vlax-vbinteger '(0 . 3)))
  
  ; セーフ配列に DXF グループ コード -4(条件演算子)、0(図形タイプ)、62(色番号)を設定
  (vlax-safearray-put-element filterType 0 -4)
  (vlax-safearray-put-element filterType 1 0)
  (vlax-safearray-put-element filterType 2 62)
  (vlax-safearray-put-element filterType 3 -4)
  
  ; フィルタ データ用のセーフ配列を作成(インデックスは 0 から 3)
  (setq filterData (vlax-make-safearray vlax-vbvariant '(0 . 3)))
  
  ; セーフ配列に "Circle"(円)と 1(赤色)を AND の条件で設定
  (vlax-safearray-put-element filterData 0 "<AND")
  (vlax-safearray-put-element filterData 1 "Circle")
  (vlax-safearray-put-element filterData 2 1)
  (vlax-safearray-put-element filterData 3 "AND>")
  
  ; 設定した選択セットとフィルタを使用して図形を選択
  (vla-select ssRedCircle acSelectionSetAll nil nil filterType filterData)
  
  ; 選択した図形をハイライト
  (vla-highlight ssRedCircle :vlax-true)
  
  (princ)
)

; 選択セットに、すでに名前があるか確認する関数
(defun HasSelectionSet(selectionSets name / selectionSet selectionName)
  (setq selectionSet nil)
  
  (vlax-for item selectionSets
      (setq selectionName (vlax-get-property item 'Name))
      (if (equal name selectionName)
        (setq selectionSet item)
      )
  )

  selectionSet
)

; 選択セットに、すでに名前があったら削除する関数
(defun DeleteSelectionSet(selectionSets name / selectionSet)
  (if (setq selectionSet (hasSelectionSet selectionSets name))
    (vla-delete selectionSet)
  )
  
  (princ)
)

この LISP をロードして、SelectRedCircles コマンドを実行してみてください。

やったー!!

赤色の円だけを選択して、それがハイライトされた!!

赤色の円だけをハイライトできた

では、キーポイントを見ていきましょう。

  ; 選択セットのオブジェクトを取得
  (setq selectionSets (vla-get-selectionsets activeDocument))
  
  ; すでにこれから作成する選択セットと同じ名前があるか確認し、あれば削除
  (setq selectionSetName "RedCIrcle")
  (deleteSelectionSet selectionSets selectionSetName)
  
  ; 新しい選択セットを追加
  (setq ssRedCircle (vla-add selectionSets selectionSetName))

ここでは、選択セットを作成しています。

以下の記事で図形の選択について詳しく書いているので、参考にしてください。

参考【AutoCAD LISP】LISP で図形を選択する方法

AutoCAD で、LISP を使用して図形を選択して、その図形を変数に代入する方法を紹介します。

続きを見る

  ; フィルタ タイプ用のセーフ配列を作成(インデックスは 0 から 3)
  (setq filterType (vlax-make-safearray vlax-vbinteger '(0 . 3)))
  
  ; セーフ配列に DXF グループ コード -4(条件演算子)、0(図形タイプ)、62(色番号)を設定
  (vlax-safearray-put-element filterType 0 -4)
  (vlax-safearray-put-element filterType 1 0)
  (vlax-safearray-put-element filterType 2 62)
  (vlax-safearray-put-element filterType 3 -4)
  
  ; フィルタ データ用のセーフ配列を作成(インデックスは 0 から 3)
  (setq filterData (vlax-make-safearray vlax-vbvariant '(0 . 3)))
  
  ; セーフ配列に "Circle"(円)と 1(赤色)を AND の条件で設定
  (vlax-safearray-put-element filterData 0 "<AND")
  (vlax-safearray-put-element filterData 1 "Circle")
  (vlax-safearray-put-element filterData 2 1)
  (vlax-safearray-put-element filterData 3 "AND>")

フィルタは、フィルタ タイプフィルタ データ というもので設定します。

フィルタ タイプは、DXF のグループ コードを指定します。

例えば、AND や OR などの条件演算子の DXF のグループ コードは -4 です。

図形タイプ(線分(Line)や円(Circle)などの図形の種類)の DXF のグループ コードは 0 です。

図形の色の DXFのグループ コードは 62 です

なので、セーフ配列の変数 filterType に -4、0、62、-4 を設定しています。

 

フィルタ データは、フィルタ タイプに対するデータになります。

条件演算子を AND にするときは、最初に "<AND" をいれます。

円の図形タイプは "Circle" です。

また、赤色の色番号は 1 です。

AND を閉じるために、最後に "AND>" をいれます。

なので、セーフ配列の変数 filterData に "<AND"、"Circle"、"1"、"AND>" を設定しています。

  ; 設定した選択セットとフィルタを使用して図形を選択
  (vla-select ssRedCircle acSelectionSetAll nil nil filterType filterData)

設定したフィルタを使用して、図形を選択しています。

選択された図形は、変数 ssRedCircle に配置されます。

  ; 選択した図形をハイライト
  (vla-highlight ssRedCircle :vlax-true)

最後に vlas-highlight 関数を使用して、選択セットに配置された図形をハイライトしています。

-API
-