ラジオタイルを使用して、ラジオボタンで画層を選ぶコマンドを作成します。
元のコマンド
雲マークを作成し、その画層を変更をするコマンドを使います。
画層変更には3つの選択肢があり、この部分をダイアログボックスにします。
詳しいコマンドの内容はコチラの記事を。
(defun c:test ( / Nm)
(initget 1 "1 2 3")
(setq LySel (getkword "画層選択: [1 Jaga_Rev-# / 2 Jaga-No_Plot / 3 画層変更なし]"))
(cond
((= LySel "1") (setq Nm (strcat "Jaga_Rev-"(getstring "改訂番号:")))
(if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら
(command-s "._-LAYER" ; 画層管理コマンド
"_N" Nm ; 新規作成
"_L" "continuous" Nm ; 線種設定 continuous
"_C" 3 Nm ; 色設定 3 緑
"_P" "P" Nm ; 印刷設定 P印刷
"") ;
);if
); LySel 1
((= LySel "2") (setq Nm "Jaga-No_Plot")
(if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら
(command-s "._-LAYER" ; 画層管理コマンド
"_N" Nm ; 新規作成
"_L" "continuous" Nm ; 線種設定 continuous
"_C" 171 Nm ; 色設定 71
"_P" "N" Nm ; 印刷設定 しない
"") ;
);if
); LySel 2
);cond
(command-s "._REVCLOUD" "_A" 5 5 "_O" pause "_N")
(if (/= LySel "3")
(command-s "._CHANGE" (entlast) "" "_P" "_LA" Nm "")
);if
(princ));defun
ダイアログボックスにする、画層変更の3つの選択肢の部分はこの2行です。
(initget 1 "1 2 3") (setq LySel (getkword "画層選択: [1 Jaga_Rev-# / 2 Jaga-No_Plot / 3 画層変更なし]"))
3つの選択肢
[1 Jaga_Rev-# / 2 Jaga-No_Plot / 3 画層変更なし]
から選択された値を変数LySel に入れる処理にラジオボタンを使います。
DCL
作成するダイアログボックスの見た目
DCL
Test_Radio :dialog
{label = "Layer";
//--------------------------------------------------------
:radio_column{ key="LySel";
:radio_button{ label=" Jaga_Rev-#"; key="1";}
:radio_button{ label=" Jaga-No_Plot"; key="2";}
:radio_button{ label=" Do not Change"; key="3";}
}
//--------------------------------------------------------
ok_cancel;
}
DCL の説明
:radio_column{ key="LySel";
キー名LySelのラジオ列を定義します。
:radio_button{ label=" Jaga_Rev-#"; key="1";} :radio_button{ label=" Jaga-No_Plot"; key="2";} :radio_button{ label=" Do not Change"; key="3";}
ラジオ列の中に、3つのラジオボタンを入れ、それぞれキー名 “1” “2””3″としました。
選択されたボタンのキーが、ラジオ列(LySel) の値になります。
AutoLISP
ダイアログボックス部分
まずは、このダイアログボックスを表示し、値を受け取って閉じるまでの部分です。
(defun c:test ( / dcl_id Act )
(setq dcl_id (load_dialog "JagaDCL.dcl"))
(if (not (new_dialog "Test_Radio" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));progn if
;-----------------------------------------------------------
(set_tile "LySel" "1")
;-----------------------------------------------------------
(action_tile "accept" "(Test_GetVar)(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
;-----------------------------------------------------------
(setq Act (start_dialog))
(unload_dialog dcl_id)
;-----------------------------------------------------------
(cond
((= Act 0) (princ "ユーザーキャンセル"))
((= Act 1) (cloud LySel))
);cond
;----------------------------------------------------------
(princ))
;===========================================
(defun Test_GetVar ()
(setq LySel (get_tile "LySel"))
)
(set_tile "LySel" "1")
ダイアログボックスを開いたときにとりあえずオプション1を選択しておきます。
(action_tile "accept" "(Test_GetVar)(done_dialog 1)")
“accept” はOKボタンのキーです。OKが押されたら、自作関数Test_GetVarを実行し、ダイアログボックスをを閉じ、閉じるときの戻り値を1に設定します。
(defun Test_GetVar () (setq RadioTest (get_tile "LySel")) )
OKが押されたときに実行される自作関数Test_GetVarです。
get_tileで、キー”LySel”のタイルから値を得て、変数 LySelに値を入れます
(cond ((= Act 0) (princ "ユーザーキャンセル")) ((= Act 1) (Cloud LySel)) );cond
条件式 cond を使い、
Actに入ったダイアログボックスの戻り値が 0 (キャンセルボタンで終了)なら、 ユーザーキャンセルとコマンドラインに表示。
Act に入ったダイアログボックスの戻り値が1 (OKボタンで終了)なら、下記の自作関数Cloud に引数として変数LySelに入った値を渡して実行します。
処理実行部分
ダイアログボックスから値を受け取って、実際に処理する部分です。
値を受け取ってからは、元のコマンドを同じです。
コマンドの内容は上記であげた記事を参考にしてください。
(defun Cloud (LySel / Nm)
(cond
((= LySel "1") (setq Nm (strcat "Jaga_Rev-"(getstring "改訂番号:")))
(if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら
(command-s "._-LAYER" ; 画層管理コマンド
"_N" Nm ; 新規作成
"_L" "continuous" Nm ; 線種設定 continuous
"_C" 3 Nm ; 色設定 3 緑
"_P" "P" Nm ; 印刷設定 P印刷
"") ;
);if
); LySel 1
((= LySel "2") (setq Nm "Jaga-No_Plot")
(if (null (tblsearch "layer" Nm)) ; もし画層Nmが無いなら
(command-s "._-LAYER" ; 画層管理コマンド
"_N" Nm ; 新規作成
"_L" "continuous" Nm ; 線種設定 continuous
"_C" 171 Nm ; 色設定 71
"_P" "N" Nm ; 印刷設定 しない
"") ;
);if
); LySel 2
);cond
(command-s "._REVCLOUD" "_A" 5 5 "_O" pause "_N")
(if (/= LySel "3")
(command-s "._CHANGE" (entlast) "" "_P" "_LA" Nm "")
);if
(princ));defun
たった2行のコードが、こんなに長くなるの⁈
とお思いかもしれません。このコマンドならダイアログボックスにするよりも、getkwordの選択肢の方が楽だし使い勝手もいいかもしれません。
もし、ユーザー入力部分が複数ある場合は、何度もコマンドラインに出てくるよりは、ダイアログボックスの方が選択できる要素が一覧できて便利です。
例えばこのコマンドなら、改訂番号、円弧の長さ、画層の選択、この3つをユーザー入力したいとなれば、ダイアログボックスの方が使いやすいかなと思います。
改訂番号、円弧の長さ、画層の選択のダイアログボックスを付けて、画層がフリーズ非表示になっていたときも想定したこのコマンドのサンプルも、後日記事にしたいと思います。
まとめ
- ラジオタイルは、列(行)タイルradio_column (row) とボタンタイルradio_buttonタイルで形成されている。
- 複数の選択肢の中から、1つだけを選ぶ項目に使う。
Comments