initget と getkword を使って選択肢がついたコマンドを作ります。
予備知識
コチラの記事で作ったコマンドに、さらに選択肢を付け加えます。
この記事では、条件式 の関数 if と cond を使います。
コマンドの内容
既存コマンドREVCLOUD[雲マーク]を使って、円、ポリライン、線分などの図形を円弧の長さ5の雲マークにするコマンドです。
画層選択プロンプトを付けて、
- 改定番号付き画層
- 印刷しない下書き画層
- 画層変更をしない(現在の画層のまま)
の3つの選択肢を付けます。
このようにコマンドラインに選択肢が出てきて、番号を入力するか、クリックで選択できます。
さらに、ダイナミック入力をオンにしているときは、カーソル下に選択肢がでてきてクリックで選択できます。
円、ポリライン、線分などの 図形を選択すると雲マークになります。
雲マークは画層を選択された画層に変更します。
選択された画層が図面にない場合は、選択肢3に設定変更されて現在の画層のままになります。
AutoLISP プログラム
コマンド名は test です。
(defun c:test (); / LySel Nm )
;;;;;選択肢を付けて 1 2 3のどれかを変数LySelに入れる;;;;
(initget 1 "1 2 3")
(setq LySel (getkword "画層選択: [1 Jaga_Rev-# / 2 Jaga-No_Plot / 3 画層変更なし]"))
;;;;;雲作成;;;;
;-----画層名設定 もし画層Nmが無いなら現在の画層----
(cond
((= LySel "1") (setq Nm (strcat "Jaga_Rev-"(getstring "改訂番号:"))))
((= LySel "2") (setq Nm "Jaga-No_Plot"))
);cond
(if Nm
(if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら
(progn
(alert (strcat "画層 " Nm " が無いので現在の画層を使います"))
(setq LySel "3")
));progn if
); if Nm
;-----雲作成----
(command-s "._REVCLOUD" "_A" 5 5 "_O" pause "_N")
;-----雲を設定された画層に変更----
(if (/= LySel "3")
(command-s "._CHANGE" (entlast) "" "_P" "_LA" Nm "")
);if
(princ));defun
AutoLISP の説明
関数 initget 選択肢
(initget 1 "1 2 3")
関数 initget は次のユーザ入力で使用するキーワードを設定する関数です。
intget の 右となりの数字はユーザー入力の許可/禁止に関するコード(省略可)です。
1 は、何も入力しないことを禁止します。
ここでは、ユーザーにどれかを選んでもらいたいので 1 を入れました。
その他のコードについては、公式ヘルプページを参考にしてください。
その次の文字列が選択肢です。ここでは、”1 2 3″ にしました。
(setq LySel (getkword "画層選択: [1 Jaga_Rev-# / 2 Jaga-No_Plot / 3 画層変更なし]"))
関数 getkword では、ユーザーが入力したキーワードが戻り値になります。
関数の次が、プロンプトメッセージです。選択肢を / で仕切って [ ] で囲みます。
コマンド実行時、以下のようにコマンドライン、カーソル下(ダイナミック入力ON時)に表示されます、
選択された画層を設定
(cond ((= LySel "1") (setq Nm (strcat "Jaga_Rev-"(getstring "改訂番号:")))) ((= LySel "2") (setq Nm "Jaga-No_Plot")) );cond
関数cond を使って選択されたのが1番の改訂番号付きの画層であれば、改訂番号をユーザー入力して 画層名を「Jaga_Rev- 改定番号」に設定。
2番の印刷されない下書きが画層なら、 画層名を「 Jaga-No_Plot 」に設定。
どちらも、変数Nmに画層名が入ります。
(if Nm (if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら (progn (alert (strcat "画層 " Nm " が無いので現在の画層を使います")) (setq LySel "3") ));progn if ); if Nm
変数Nmに入れた画層が無ければ、画層を選択肢3の画層変更なし(現在の画層)に変更します。
(command-s "._REVCLOUD" "_A" 5 5 "_O" pause "_N")
そして、選択した 円、ポリライン、線分などの 図形を、コマンドREVCLOUDを使って、円弧の長さ5の雲マークにします。
(if (/= LySel "3") (command-s "._CHANGE" (entlast) "" "_P" "_LA" Nm "") );if
条件式 if を使って、「選択肢3 画層変更なし」では無いなられば、 雲マークの画層を変数Nmに入っている画層名にします。
まとめ
- initget は次のユーザ入力で使用するキーワードを設定する関数。
- intget 1つ目の引数はユーザー入力の許可/禁止に関するコード(省略可)
- getkword では、ユーザーが入力したキーワードを得る関数。
カスタマイズ例
特定の画層を使うコマンドは、”画層が無ければ作る。” ようにした方が利便性が上がります。
雲マークを入れる画層が非表示/フリーズしていた場合、雲マークを作っても表示されないので、特定の画層を使うコマンドは、使う画層が非表示/フリーズになっていたら表示/解凍にするようにした方がいいです。
いろいろカスタマイズした雲マークサンプルコマンドがこちらです。