ダイアログボックスの第1歩として、文字を表示するダイアログボックスを作ってみましょう。
予備知識
DCL (ダイアログコントロール言語)とは
DCLファイルはAutoLISPから呼び出すので検索パス内のフォルダに保存する必要があります。
検索パス内のフォルダについて。
内容
- TITLE というタイトルを付ける
- HELLO WORLD と表示する
- OKボタン/Cancelボタンを置く
- OKボタンを押したらコマンドラインに”OKを押しました”と表示
- Cancelボタンを押したらコマンドラインに”キャンセルを押しました”と表示
DCL
まずは、”見た目”を作るDCL部分です。
内容
- ダイアログ名はTEST
- タイトルはTITLE
- テキストを表示、キーは ”TX”
- OK/キャンセルボタンを表示
DCL プログラム
検索パス内のフォルダに、JagaDCL.dcl という名前のファイルで保存してください。
//以降-改行まではコメントアウトで、コンピューターは読み込まない、人間用のメモです。
TEST :dialog
{label = "TITLE"; //ダイアログボックス名は test。 TITLEというラベルを付ける。
:text { key = "TX"; } // "TX" というキーの文字を表示させる。
ok_cancel; // Ok Cancel ボタンを置く
} // dialog の終わり
DCLの説明
TEST :dialog
TEST の部分は、ダイアログボックスの名前です。
AutoLISPで呼び出す時に使う物で、表示はされません。
ファイルを読み込んでからダイアログボックス名を探すので、同じファイル内に同じ名前のダイアログボックスを作らないでください。別のファイル内ならOKです。
{ label = “TITLE”;
ラベルの”TITLE“はダイアログボックス一番上に表示される文字列です。
DCLでは、; (セミコロン)は必要なものなので消さないでください。
ダイアログボックス名と、表示するラベルは大文字小文字どちらでもいいです。
しかし、ダイアログボックス名は、呼び出すAutoLISP側と大文字小文字が合っていないと呼び出せません。
:text { key = “TX”; }
そして、text を使って、”TX”がキーの文字列をここに表示させます。
このキーで、AutoLISP側とやり取りをします。
キー名は、ダイアログボックス名と同じように、大文字小文字はどちらでもよいですが、AutoLISP側と合うようにしてください。
ok_cancel;
そして、最後に ok_cancel; です。
本来はボタンを定義するときは、ボタン、表示名、キーなどを設定する必要がありますが、Ok / Cancel ボタンにはすでにに定義されたものがあって、ok_cancel; だけで設定できます。
OKボタンのキーは”accept” Cancelボタンのキーは”cancel”です。
AutoLISP
これが、TESTダイアログボックスのためのAutoLISPプログラムです。
内容
- JagaDCL.dcl を検索パス探してロード。
- JagaDCL.dcl内から、ダイアログボックス “TEST”を探す。
- もし見つからなかったら中止する。
- 見つかれば、キーが”TX”のテキストタイルに”HELLO WORLD”を入れる。
- キーが”accept”のタイル(OKボタン) が押されたらダイアログボックスを閉じて 1 を戻すように設定する。
- キーが”cancel”のタイル(Cancelボタン) が押されたらダイアログボックスを閉じて 0 を戻すように設定する。
- ダイアログボックスを開く
- ダイアログボックスが閉じられたときに戻り値を変数Act に入れる
- Actが0なら、”キャンセルキーを押しました”とコマンドラインに表示、Actが1なら、”OKを押しました”とコマンドラインに表示
AutoLISP
(defun c:test (/ dcl_id Act)
(setq dcl_id (load_dialog "JagaDCL.dcl")) ;
(if (not (new_dialog "TEST" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));if
;-----------------------------------------------------------
(set_tile "TX" "HELLO WORLD" )
;-----------------------------------------------------------
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
;-----------------------------------------------------------
(setq Act (start_dialog))
(unload_dialog dcl_id)
;-----------------------------------------------------------
(cond
((= Act 0)(princ "キャンセルキーを押しました"))
((= Act 1)(princ "OKを押しました"))
);cond
;----------------------------------------------------------
(princ));defun
AutoLISP プログラム
(defun c:test (/ dcl_id Act)
この部分はいつものAutoLISPコマンドと同じです。このダイアログボックスを出すコマンド名はtest です。
(setq dcl_id (load_dialog “JagaDCL.dcl”)) ;
関数 load_dialogは、DCLファイルをロードする機能があります。
終わった後にアンロードする関数 unload_dialog とセットで使います。
load_dialogは、正常に指定したファイルがロードされるとダイアログボックスのID番号を戻すので、その戻り値を変数dcl_idに入れておきます。
(if (not (new_dialog “test” dcl_id))
(progn
(princ “***ダイアログボックスが見つかりません***”)
(exit)
));if
(new_dialog “TestDB” dcl_id)で、ロードしたdcl_idファイルから、TESTと名前の付いたダイアログボックスを探します。
もし見つからなかった場合は、その後の処理が悪影響を及ぼす可能性もあるので、関数exitで、このコマンドtestを終了させます。
(set_tile “TX” “HELLO WORLD” )
関数 set_tile は ダイアログボックスのタイルの値を設定する機能があります。
引数はキーと値です。
DCL側で、キー“TX”にしたタイルに”HELLO WORLD“と値を入れます。
(action_tile “accept” “(done_dialog 1)”)
(action_tile “cancel” “(done_dialog 0)”)
OKボタンのキーは”accept” Cancelボタンのキーは”cancel”です。
関数 action_tile は、このタイルが選択された場合のアクションを設定する機能があります。キーでDCLのタイルと紐づけします。
OKタイル(キーは accept )を選択すると、関数 done_dialogで、ダイアログボックスを閉じて1が戻ります。
Cancel タイルを選択すると、関数 done_dialogで、ダイアログボックスを閉じて0が戻ります。
ここでは、アクションの (関数…..) に ” ” がついて文字列になっているので気を付けてください。
(setq Act (start_dialog))
DCLファイルを読み込み、指定のダイアログボックスのコード探し、各タイルの機能を設定して、ここでやっとstart_dialogでダイアログボックスが開きます。
そして、ユーザーがOK/Cancelを選択したら、先ほどaction_tileで設定した通りにダイアログボックスが閉じられて、1か0が戻るので、戻り値を変数 Act に入れます。
(unload_dialog dcl_id)
ロードしたDCLファイルとアンロードします。
(cond
((= Act 0)(princ “キャンセルキーを押しました”))
((= Act 1)(princ “OKを押しました”))
);cond
関数cond を使って、それぞれのボタンが選択された場合にAutoLISPで実行するコードを指定しています。
以上、一通りの流れです。少々ややこしく見えますが、
DCLのタイルに値を設定する。閉じるときにそれぞれのタイルの値を受け取る。
ワンパターンなので、ある程度自分のテンプレートができてしまえば、AutoLISPコマンドを作ることに比べたら、ダイアログボックスを作る作業はシンプルだと思います。
(今回はユーザーが入力する部分が無かったので、DCLから値を受け取る部分はありません。)
まとめ
- ダイアログボックスは、DCLで見た目、AutoLISPで動き、の両方が必要。
- DCL側で、それぞれのタイルのキー名で、AutoLISPとやり取りする。
- load_dialogは、DCLファイルをロードする関数で、アンロードするunload_dialogとセットで使う。
- new_dialogは、ロードしたDCLファイルからダイアログボックスを読み込む関数。
- set_tileは、タイルの値を設定する関数。
- action_tileは、タイルが選択されたときのアクションを設定する関数。
- start_dialogは、全ての設定ができた後に、ダイアログボックスを開く関数。
- done_dialogは、ダイアログボックスを閉じる関数。通常、タイルのアクションとして設定しておく。