範囲を指定して、そこから無名のグループを一括選択するAutoLISPのコードを書いてみたので、紹介します。
はじめに
ブログ読者の方から「AutoCADで、任意の範囲の無名のグループを一括選択できるコード」についてのお問合せを頂きました。
いざ取り組んでみると、思ったより苦戦してしまいました。せっかくなので、ブログ上に記録を残しておこうと思います。
動作デモ
動いている様子を紹介します。
まず、対象となる範囲の図形を選択します。すると、あとは勝手に無名のグループが勝手に選択されます。
- A~Fが無名のグループで、アは名前付きのグループです。
- 最終的に、四角形の中の無名グループのAとBだけが選択されたので、成功です。
コード
▼ コードは以下の通りです。もし表示されていない場合は、こちら
処理の流れ
「グループだけを選択したい」と聞いたとき、「普通にssgetのフィルターでパパっと取得できそう」だと軽く考えていました。
しかしドキュメントを読むと、AutoCADにおけるグループは「非グラフィカル オブジェクト」というタイプで、ssgetでは扱えません。
そこで、以下のように2ステップの方法で処理しました。
- まずは下記ドキュメントの指示通り、ディクショナリを検索して、グループに所属する図形名を取得します。この工程の最終的には、図面全体に存在するすべてのグループの図形が選択セットに入ります。
- 例: AutoCAD グループにアクセスする(AutoLISP) – AutoCAD 2024 Help
↑ ACAD_GROUP ディクショナリの図形定義リストを取得する……という方法が解説されています。 - How to add a group in a selection set from an AutoLISP function? – AutoCAD DevBlog
↑取得した図形定義リストの図形名を、順次選択セットに追加するコードが紹介されています。
今回のコードを書く際に参考にしました。
- 次に、ユーザーが選択した範囲の選択セット
bnd
と比較します。
比較した結果、同じ要素だけを別途用意した選択ボックスsbox
に追加し、最終的にそれらをハイライトします。
使い方
【重要】エディタにコピペし、文字コードを変更する
上記のコードをテキストエディタにコピペし、文字コードをShift-JISに指定して上書き保存して下さい。
この操作が無いと、動作しません。(Windows付属のメモ帳だったら、ANSIを選んでください)
▼ テキストエディタのMeryで開いて、文字コードを変更している様子です。
Lispファイルをロードする
先ほど作った.lspファイルを、新規dwgファイルの画面にロードします。
一度試すだけなら、.lspファイルをCAD画面にポイっとドラッグアンドドロップすれば、ロードされます。
その場合、以下のようなメッセージが出る場合があります。その際は内容を確認の上、「1回ロードする」を選んでおけばOKです。
コマンドを起動
コマンドラインに sel_grp
と打ち込んで、エンターキーを押します。
参考ドキュメント
- How to add a group in a selection set from an AutoLISP function? – AutoCAD DevBlog
https://adndevblog.typepad.com/autocad/2012/12/how-to-add-a-group-in-a-selection-set-from-an-autolisp-function.html
↑取得した図形定義リストの図形名を、順次選択セットに追加するコードが紹介されています。
今回のコードを書く際に参考にしました。 - 例: AutoCAD グループにアクセスする(AutoLISP)
https://help.autodesk.com/view/OARX/2024/JPN/?guid=GUID-74E761F9-08B1-4690-ADA0-396BC9431729
↑ ACAD_GROUP ディクショナリの図形定義リストを取得する……という方法が解説されています。 - 概要 – 非グラフィカル オブジェクトの処理(AutoLISP)
https://help.autodesk.com/view/OARX/2024/JPN/?guid=GUID-984A6964-E801-4C22-8E41-BF3D05CD122F - Groups プロパティ(ActiveX)
https://help.autodesk.com/view/OARX/2024/JPN/?guid=GUID-61422D1A-B391-4528-968A-04A7B7A590F2 - 選択セット操作関数リファレンス(AutoLISP)
https://help.autodesk.com/view/OARX/2024/JPN/?guid=GUID-43715289-5715-4F96-8D48-3169FA26777A - 概要 – 選択セット フィルタ リスト(AutoLISP)
https://help.autodesk.com/view/OARX/2024/JPN/?guid=GUID-7BE77062-C359-4D01-915B-69CF672C653B
さいごに
普段グループは使う機会がなかったので、勉強になりました。やっぱAutoCADではブロックの方が、扱いやすいですね。(ssget '((0 . "insert")))
ですぐに取得できます。
私事ですが、今AutoCADのライセンスが切れているので、互換CADのBricsCADで動作確認しました。多分AutoCADでも動くと思いますが、もし不具合あればコメント欄で教えて頂ければ幸いです。(すぐに対応できるかはわかりませんが……)
コメント
のぼゆ様
この度は本当にありがとうございました。まさしく思い通りの結果です!
やはり天才は違いますね・・・もう凄いとしか言えない。
まさかのGROUPがSSGETで対応出来なかったのがお手上げでした。
ブロックのがAUTOLISPでも扱いやすいですよね。
まだまだAUTOLISPを勉強中ですが、また何かありましたら今後も何卒宜しくお願い致します。
ブログの更新楽しみに待っています。
Sld_heta様
コメントありがとうございます。
お役に立てて良かったです。
私も今回、勉強になって面白かったです😊👍