DCL

提供:GizmoLabs - だいたい CAD LISP なサイト
DCLサンプル

DCL (Dialog Control Language)はダイアログ ボックスを作成するものである。

ダイアログ ボックスは、ダイアログ コントロール言語(DCL)で書かれた ASCII ファイルで定義し、主に LISP プログラムで利用する。 ボタンや編集ボックスなどのダイアログ ボックスの要素を「タイル」と呼び、各タイルのサイズと機能は、個々のタイルの属性でコントロールする。 ダイアログ ボックスのサイズと各部のレイアウトは、最小限の位置情報を使用して自動的に設定される。

AutoCAD の Visual LISP では、ダイアログ ボックスを表示するためのツールを備えている。 AutoCAD互換CADの中でAutoLISP互換を謳っているものは大抵、DCLによるダイアログ表示もサポートされている。 参考:バージョン履歴とサポートAPI


LISPからダイアログボックスを使用する一般的な手順

  1. load_dialog で DCL ファイルをロードする。
  2. new_dialog で、表示するダイアログ ボックスを呼び出す。(この時、new_dialog が返す値を必ずチェックし、呼び出しが失敗していないか確認する。失敗した状態で start_dialog を呼び出すと、予測できない結果になる可能性がある。)
  3. ダイアログのタイル値やリスト、イメージなどの設定を初期化したり、action_tile タイルの挙動を設定したりする。この時使用するダイアログ関数は set_tilemode_tilestart_listadd_listend_liststart_imagevector_imagefill_imageslide_imageend_imageclient_data_tile となる。
  4. start_dialog でダイアログを呼び出す。この時点でコントロールがダイアログ ボックスに切り替わる。
  5. (ユーザの操作により アクション(コールバック)内からユーザ入力を処理する。get_tileget_attrset_tilemode_tile などが処理される。
  6. ユーザが終了ボタン(あるいは終了処理)を選択したときに done_dialog が呼び出される。これにより、start_dialog が値を返す。ここで、unload_dialog を呼び出し、DCL ファイルをロード解除する。


サンプルコード <syntaxhighlight lang="lisp" line>

; ALLCONTROL.DCL 内の allct_dlg というダイアログを読み込み表示するサンプル

(defun viewdcl ( / dcl_id)

 (setq dclfile "ALLCONTROL.DCL")
 (setq dcl_id (load_dialog dclfile)) 
 (if (new_dialog "allct_dlg" dcl_id) 
   (progn 
     ; ダイアログの挙動・設定を記述 ation_tile mode_tile set_tile など
     (start_dialog) ; ダイアログ表示
     (unload_dialog dcl_id)  ; ダイアログのアンロード
   ) 
   (princ (strcat "error:" dclfile "ファイルがみつかりません。"))
 ) 

) </syntaxhighlight>

  • DCL ファイルには複数のダイアログを保存しておくことが出来るので、メモリに余裕があればすべてのダイアログ ボックスを一度にロードしておき、特定のダイアログ ボックスを逐次 new_dialog にて呼び出すことができる。厳しいメモリ環境を考慮するなら複数の DCL ファイルを作成し、load_dialogと unload_dialog を使用してダイアログ ボックスのセットをメモリから極力削除した形の方法が望ましい。となっているが、今となってはダイアログで消費されるメモリなどたかが知れてるので、ロードしたままでも問題にはなりにくいと思われる。

タイルの種類

タイルの種類は、以下の通り。(すべて小文字な点に注意)

DCLファイルの雛形

ひな形です。 dcl_settings の行はDCLの監査機能を有効にしています。

<syntaxhighlight lang="lisp" line> dcl_settings : default_dcl_settings { audit_level = 3; } // HELLO.DCL

hello : dialog {

 label = "サンプル ダイアログ ボックス";
 : text {
     label = "Hello, world";
 }
 : button {
     key = "accept";
     label = "OK";
     is_default = true;
     fixed_width=true;
     alignment=centered;
 }

} </syntaxhighlight>

タイルの属性

タイルの属性は、以下の通り。

全体の属性
属性名 適用タイル
alignment
fixed_height
fixed_width
height
width
すべてのタイル


アクションタイルの属性
属性名 適用タイル
action
is_enabled
is_tab_stop
key
mnemonic
button; edit_box; image_button; list_box; popup_list; radio_button; slider; toggle; radio_column; radio_row


タイルクラスタの属性
属性名 適用タイル
children_alignment
children_fixed_height
children_fixed_width
row; column; radio_row; radio_column; boxed_row; boxed_column; boxed_radio_row; boxed_radio_column.


特定のタイルで使用する属性
属性名 適用タイル
allow_accept edit_box; image_button; list_box
aspect_ration image; image_button.
big_increment slider.
color image; image_button.
edit_limit edit_box.
edit_width edit_box; popup_list.
fixed_width_font edit_box; popup_list.
initial_focus dialog.
is_bold text.
is_cancel button.
is_default button.
label boxed_row; boxed_column; boxed_radio_row; boxed_radio_column; button; dialog; edit_box; list_box; popup_list; radio_button; text; toggle.
layout slider.
list list_box; popup_list.
max_value slider.
min_value slider.
multiple_select list_box.
password_char edit_box.
small_increment slider.
tabs list_box; popup_list.
tab_truncate list_box; popup_list
value text; all active tiles (except buttons and image_buttons).

互換CADでのDCL表示サンプル

以下は同じDCLファイルを各互換CADで表示したサンプルである。 見て分かるように、同じDCLでも解釈が異なるため、各コントロールの左右やレイアウトは全く同じにはならない。