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 関数を使用して、選択セットに配置された図形をハイライトしています。