Skip to content

Instantly share code, notes, and snippets.

@mechanoboyu
Last active August 12, 2023 12:34
Show Gist options
  • Save mechanoboyu/b980236f494d01d9d7fd293019489925 to your computer and use it in GitHub Desktop.
Save mechanoboyu/b980236f494d01d9d7fd293019489925 to your computer and use it in GitHub Desktop.
図面内の任意の範囲を指定すると、そこから名前の無いグループを、一括選択します。
(vl-load-com)
;**************************************************************************;
; 関数名:sel_grp
; ファイル名:select-unnamed-group-specified-selection.lsp
; 作成日:2023/8/12
; 作成:Noboyu
;
; 内容:図面内の任意の範囲を指定すると、そこから名前の無いグループを、一括選択します。
;
; 開発環境:BricsCAD v17 Windows版
;
; 参考にしたドキュメントなど詳細は、以下に掲載しています。
; * https://www.noboyu.com/lisp-unnamed-group-specified-selection/#ref
;
; 注記: 1. バグ出しは出来ていないので、
; 使用される際は、元図はバックアップの上、まずは簡単な図面でテストして下さい。
; 2. このコードを保存する際は、必ずエンコードを「Shift-Jis」に指定して下さい。
;**************************************************************************;
;
;図面全体から取得したグループと、ユーザの選択範囲の要素をそれぞれ比較し、
;共通する要素の図形リストを作る関数
(defun selbnd(/ bnd)
(prompt "名前のないグループを取得したい範囲を、選択して下さい。\n")(terpri)
;ユーザーが範囲の図形を選択する
(setq bnd (ssget))
(setq index 0)
;選択セットの空箱をつくる。
(setq sbox (ssadd))
;Mainで作った選択セットssの図形の個数を得る
(setq len (sslength ss))
;選択セットssとユーザーが選択したbndとを比較し、
;一致している図形だけを集めて、新しい選択セットsboxを作る。
(repeat len
(setq x (ssname ss index))
(if (not (not (ssmemb x bnd)))
(ssadd x sbox)
)
(setq index (1+ index))
)
(setq bnd nil)
)
;;Main ;;
(defun c:sel_grp (/ a1 gname newGRPNameList sbox)
;実行前に何かが選択されていたら、解除する
(sssetfirst nil nil)
;図面全体からグループオブジェクトを取得する
(setq grp (vla-get-groups (vla-get-activedocument (vlax-get-acad-object))))
;名前にアスタリスクが入っているグループ(=名前なしグループ)の名前を取得する
(vlax-for entry grp
(setq gname (vla-get-name entry))
(if (wcmatch gname "*`**")
(setq newGRPNameList (cons gname newGRPNameList))
)
)
;図面全体から、グループに属する図形名のリストを得る
(setq grp1 (dictsearch (namedobjdict) "ACAD_GROUP"))
;選択セットの空箱をつくる。
(setq ss (ssadd))
;グループごとに所属する図形を取得し、それらを順次選択セットに追加する。
;最終的には、選択セットssには、図面全体の分のグループが格納される。
(foreach grpname newGRPNameList
(setq a1 (dictsearch (cdr (assoc -1 grp1)) grpname))
(while (/= (assoc 340 a1) nil)
(setq ent (assoc 340 a1))
(setq ss (ssadd (cdr ent) ss))
(setq a1 (subst (cons 0 "") ent a1)) ;選択セットに入れた終わった図形名は、空のドットペアで上書き
)
)
(selbnd)
;目的のグループを、選択した状態で表示する
(sssetfirst nil sbox)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment