DCL
DCL (Dialog Control Language)はダイアログ ボックスを作成するものである。
ダイアログ ボックスは、ダイアログ コントロール言語(DCL)で書かれた ASCII ファイルで定義し、主に LISP プログラムで利用する。 ボタンや編集ボックスなどのダイアログ ボックスの要素を「タイル」と呼び、各タイルのサイズと機能は、個々のタイルの属性でコントロールする。 ダイアログ ボックスのサイズと各部のレイアウトは、最小限の位置情報を使用して自動的に設定される。
AutoCAD の Visual LISP では、ダイアログ ボックスを表示するためのツールを備えている。 AutoCAD 互換 CAD の中で AutoLISP 互換を謳っているものは大抵、DCL によるダイアログ表示もサポートされている。 参考:バージョン履歴とサポートAPI
- IJCAD では、DCL の処理でエラーが起こると CAD が死ぬので注意が必要。(エラー処理が弱い。)
- 別途のアドオンで OpenDCL っていうオープンソースな拡張があり、こちらは Windows の一般的なフォームが使えるものでモードレスダイアログやパレットなども作れる。AutoCAD, BricsCADなどで利用可能。
LISPからダイアログボックスを使用する一般的な手順
- load_dialog で DCL ファイルをロードする。
- new_dialog で、表示するダイアログ ボックスを呼び出す。(この時、new_dialog が返す値を必ずチェックし、呼び出しが失敗していないか確認する。失敗した状態で start_dialog を呼び出すと、予測できない結果になる可能性がある。)
- ダイアログのタイル値やリスト、イメージなどの設定を初期化したり、action_tile タイルの挙動を設定したりする。この時使用するダイアログ関数は set_tile、mode_tile、start_list、add_list、end_list、start_image、vector_image、fill_image、slide_image、end_image、client_data_tile となる。
- start_dialog でダイアログを呼び出す。この時点でコントロールがダイアログ ボックスに切り替わる。
- (ユーザの操作により アクション(コールバック)内からユーザ入力を処理する。get_tile、get_attr、set_tile、mode_tile などが処理される。
- ユーザが終了ボタン(あるいは終了処理)を選択したときに done_dialog が呼び出される。これにより、start_dialog が値を返す。ここで、unload_dialog を呼び出し、DCL ファイルをロード解除する。
- 参考: LISPのダイアログ ボックス関数
サンプルコード
; 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 "ファイルがみつかりません。")) ) )
- DCL ファイルには複数のダイアログを保存しておくことが出来るので、メモリに余裕があればすべてのダイアログ ボックスを一度にロードしておき、特定のダイアログ ボックスを逐次 new_dialog にて呼び出すことができる。厳しいメモリ環境を考慮するなら複数の DCL ファイルを作成し、load_dialogと unload_dialog を使用してダイアログ ボックスのセットをメモリから極力削除した形の方法が望ましい。となっているが、今となってはダイアログで消費されるメモリなどたかが知れてるので、ロードしたままでも問題にはなりにくいと思われる。
タイルの種類
タイルの種類は、以下の通り。(すべて小文字な点に注意)
- 標準のボタン (サブアセンブリ)
- 定義済みのアクティブ タイル
-
- button
- edit_box
- list_box
- multi_edit_box *intellicad only
- popup_list
- radio_button
- toggle
- slider
- image_button
- 文字クラスタ
DCLファイルの雛形
ひな形です。 dcl_settings の行はDCLの監査機能を有効にしています。
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; } }
タイルの属性
タイルの属性は、以下の通り。
全体の属性 | |
---|---|
属性名 | 適用タイル |
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). |
BricsCAD の DCLサポートと独自性
BricsCADのDCLエンジンは、AutoCADのDCL定義を超えて様々な属性をサポートし、柔軟性、快適性、GUIの見栄えを向上させている。 他の多くのCADシステムとは異なり、BricsCAD の DCLエンジン実装は OSネイティブのGUIシステム(WindowsのMFCなど)ではなく、WxWidgetsクロスプラットフォームGUIシステムを使用しており、OSのネイティブGUIシステムに対応し、さらに、サポートするOS間で一貫した動作と外観を確保するためにいくつかの追加機能を提供している。その結果、レイアウト処理に関連するいくつかの(本当に)小さな違いがあるが、BricsCADのDCLエンジンで利用できるいくつかの高度な機能もある。
すべての追加機能は、同じDCL定義が他のDCL対応CADシステムでも適切に動作するように、追加のDCL属性を使用して後方互換性のある方法で実装されている。 DCL構文規則で定義されているように、DCL属性はオプションでカスタマイズ可能な<key value>ペアであるため、追加属性の使用はDCL構文規則と互換性があり、遵守されている。
以下は、BricsCAD固有のDCL属性。
タイルクラスタの属性 | |
---|---|
属性名 | 適用タイル |
bcad_font | list_box |
bcad_height | すべてのタイル。height の代わり |
bcad_width | すべてのタイル。width の代わり |
bcad_label | label の代わり |
bcad_win_wrap | list_box |
bcad_skip_next_child | すべてのタイル。 |
BricsCAD 特有の挙動をするタイル属性
DCL ファイルの文法監査
AutoCAD と多くの 互換 CAD では、DCL ファイルの文法監査を 0 から 3 の 4 レベルで行うことができる。(下記の文法監査レベルを参照)。監査を実行しようとすると、DCL ファイルで問題になりそうなコードや不要なコードが検出される。監査は、DCL をロードするときに行われる。DCL ファイルの監査レベルを設定するには、DCL ファイル内の任意の場所(通常最初の行)に、次のような行を挿入する。
dcl_settings : default_dcl_settings { audit_level = 3; }
DCL ファイルで include 指示文を使用して 他の DCL ファイルを参照する場合は、1 ファイルに 1 つの dcl_settings のみ使用する。定義した監査レベルは、インクルードされるすべてのファイルに適用される。
文法監査レベル
- レベル … 説 明
- 0 … チェックを行わない。DCL ファイルを監査してから一度も変更してない場合にのみ使用することが推奨されている。
- 1 … エラー表示。CAD の終了につながる DCL のバグを検出する。監査にはほとんど時間がかからない。エラーには、未定義のタイルの使用やプロトタイプの循環定義などがある。このチェック レベルが既定の設定。
- 2 … 警告表示。ダイアログ ボックスのレイアウトや動作が要求どおりにならない原因となるような DCL バグを検出する。DCL ファイルを変更したときは、少なくとも 1 回は、このレベルで監査する必要がある。この警告レベルの監査によって、必要な属性の不足や不適切な属性値などの誤りを見つけることができる。
- 3 … ヒント表示。不要な属性定義を検出する。監査機能を最大限活用するために、開発中は audit_level を 3 にしておくことが推奨されている。これで問題が出なくなったら、DCL ファイルからdcl_settings 行を削除するか、0 に設定していい状態といえる。
互換CADでのDCL表示サンプル
以下は同じDCLファイルを各互換CADで表示したサンプルである。 見て分かるように、同じDCLでも解釈が異なるため、各コントロールの左右やレイアウトは全く同じにはならない。 バージョンによっては、AutoCAD よりも互換 CAD の方が見やすい状態だったりする。