ssget で作った複数の図形の選択セット。そのまま既存コマンドで使えるときには変数に入れてそのまま編集できますが、まとめて編集できない場合、図形名を1つ1つ取り出して処理していきます。
予備知識
関数 ssget は、選択した図形をまとめて、”選択セット”を作る機能があります。
詳しくはコチラの記事を。
関数 sslength 選択セットの中の図形の数
AutoLISP関数 sslength は、選択セットに入った図形の数を得る機能があります。
引数は選択セット、戻り値は引数の選択セットの図形の数です。
(sslengh (ssget))
とコマンドラインに入力して試してみてください。
選択した図形の数が戻り値としてコマンドラインに表示されます。
関数 ssname 選択セットの中の図形の名前
AutoLISP関数 ssname は、選択セットの中の図形の図形名を得る機能があります。
引数は選択セットと数字。引数の選択セットの数字番目の図形名が戻り値です。
1番目の図形名を取得する数字は0ですので注意してください。
(ssname (ssget) 0)
で、ssget で選択した図形の1番目の図形名が取得できます。
関数 repeat 繰り返す
関数 repeat は引数で渡した数の回数繰り返しをする機能があります。
例えば、(repeat 10 (処理1) (処理2)) とコマンドラインに入れたら、処理1と2を10回繰り返します。
今回は、選択セットの図形の数繰り返したいので、
(repeat 図形の数 …………………….. )
と、使います。
一連の流れ
選択セットにした複数の図形を一つ一つ編集していく一連の流れです。
- 関数ssget で複数の図形を選んで選択セットを作る
- 関数sslength 図形の数を得てObjNumに入れる
- カウント用変数Cntに0を入れる
- 関数ssname選択セットからCnt個目の図形名を得て変数Objに入れる
- Objにある図形名を使って編集
- Cnt に1を足して4に戻り次の図形名を得て繰り返す。
AutoLISP ルーティン
上記の流れをAutolISPにするとこうなります。
(setq Objs (ssget)) ; 図形を選択して選択セットを作る
(setq ObjNum (sslength Objs)) ;選択セットに入った図形の数をObjNumに入れる
(setq Cnt 0) ;Cnt に0を入れる
(repeat ObjNum ; 図形の数だけ繰り返す ここから--------------
(setq Obj (ssname Objs Cnt)) ; 選択セットのCnt番目の図形をObjに入れる
Obj(図形名)を使った処理
(setq Cnt (1+ Cnt)) ; Cnt に1を足す
);repeat 図形の数だけ繰り返す---------------ここまで
コマンド例
コマンドの内容
上の選択セットを1つづつ編集していくルーティンを、実際にコマンド関数に入れます。
コチラの記事に出てきた、図形を選択して、その図形の画層の色を変更するコマンド。
これをssget で複数の図形の選択ができるようにします。
図形名から画層名を得てその画層の色を変更していくので、選択セットそのままではできません。
選択セットから1つづつ図形名を得て、複数選択した図形すべての画層の色を赤色に変えていくコマンドに変更したものがこちらです。
AutoLISP プログラム
(defun c:test (/ Objs ObjNum Cnt Obj LyX Coltx)
(setq Objs (ssget)) ; 図形を選択して選択セットを作る
(setq ObjNum (sslength Objs)) ;選択セットに入った図形の数をObjNumに入れる
(setq Cnt 0) ;Cnt に0を入れる
(repeat ObjNum ; 図形の数だけ繰り返す ここから--------------
(setq Obj (ssname Objs Cnt)) ; 選択セットのCnt番目の図形をObjに入れる
(setq LyX (cdr (assoc 8 (entget Obj)))) ;図形の画層名をLyXに入れる
(command-s "._LAYER" "_C" 1 LyX "" ) ;画層管理コマンドで画層の色を変える
(setq Cnt (1+ Cnt)) ; Cnt に1を足す
);repeat 図形の数だけ繰り返す---------------ここまで
(princ)) ;
まとめ
- sslength は、選択セットに入った図形の数を得る
- ssnameは、選択セットから1つの図形名を得る。
- ssname の引数は選択セットと数字。数字番目の図形名を得る。
- 変数Cntに0を入れて、
(repeat ObjNum (setq Obj (ssname Objs Cnt)………………. (setq Cnt (1+ Cnt)))
で、一つ一つ図形を編集できるルーティンになる。
関連記事
選択した図形の画層を色を変えるサンプルコマンド。
この記事の例で使った選択した図形の画層の色を変えるコマンドをさらに便利にしたコマンドです。
コマンド実行前に図形を選択する暗黙選択や、共通の部分を自作関数にして色だけ変えた類似コマンドを作りやすくなっています。