「DCL」の版間の差分

提供:GizmoLabs - だいたい CAD LISP なサイト
 
 
(同じ利用者による、間の52版が非表示)
1行目: 1行目:
DCL (Dialog Control Language)はダイアログ ボックスを作成するものである。
{{AutoLISP}}
[[File:Formsizer.png|thumb|DCLサンプル]]DCL (Dialog Control Language)はダイアログ ボックスを作成するものである。


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


AutoCAD の Visual LISP では、ダイアログ ボックスを表示するためのツールを備えている。
AutoCAD の Visual LISP では、ダイアログ ボックスを表示するためのツールを備えている。
AutoCAD 互換 CAD の中で AutoLISP 互換を謳っているものは大抵、DCL によるダイアログ表示もサポートされている。 参考:[[バージョン履歴とサポートAPI]]
* IJCAD では、DCL の処理でエラーが起こると CAD が死ぬので注意が必要。(エラー処理が弱い。)
* 別途のアドオンで [[OpenDCL]] っていうオープンソースな拡張があり、こちらは Windows の一般的なフォームが使えるものでモードレスダイアログやパレットなども作れる。AutoCAD, BricsCADなどで利用可能。


== LISPからダイアログボックスを使用する一般的な手順 ==
== LISPからダイアログボックスを使用する一般的な手順 ==
16行目: 24行目:




* DCL ファイルには複数のダイアログを保存しておくことが出来るので、メモリに余裕があればすべてのダイアログ ボックスを一度にロードしておき、特定のダイアログ ボックスを逐次 new_dialog にて呼び出すことができる。厳しいメモリ環境を考慮するなら複数の DCL ファイルを作成し、load_dialogと unload_dialog を使用してダイアログ ボックスのセットをメモリから極力削除した形の方法が望ましい。となっているが、今となってはダイアログせ消費されるメモリなどたかが知れてるので、積極的にまとめてしまっていいと思う。
* 参考: LISPの[[ダイアログ ボックス関数]]
 
サンプルコード
<pre class="brush:autolisp;">
; 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 "ファイルがみつかりません。"))
  )
)
</pre>
 
 
* DCL ファイルには複数のダイアログを保存しておくことが出来るので、メモリに余裕があればすべてのダイアログ ボックスを一度にロードしておき、特定のダイアログ ボックスを逐次 new_dialog にて呼び出すことができる。厳しいメモリ環境を考慮するなら複数の DCL ファイルを作成し、load_dialogと unload_dialog を使用してダイアログ ボックスのセットをメモリから極力削除した形の方法が望ましい。となっているが、今となってはダイアログで消費されるメモリなどたかが知れてるので、ロードしたままでも問題にはなりにくいと思われる。


== タイルの種類 ==
== タイルの種類 ==
タイルの種類は、以下の通り。
タイルの種類は、以下の通り。(すべて小文字な点に注意)
 
<div class="mcol3">
; 標準のボタン (サブアセンブリ)
; 標準のボタン (サブアセンブリ)
:* [[ok_only]]
:* [[ok_only]]
30行目: 59行目:


; 定義済みのアクティブ タイル
; 定義済みのアクティブ タイル
:* [[button]]
:* [[button (autolisp)|button]]
:* [[edit_box]]
:* [[edit_box]]
:* [[list_box]]
:* [[list_box]]
:* [[multi_edit_box]] *intellicad only
:* [[popup_list]]
:* [[popup_list]]
:* [[radio_button]]
:* [[radio_button]]
61行目: 91行目:
:* [[radio_row]]
:* [[radio_row]]
:* [[row]]
:* [[row]]
</div>
<gallery caption="DCLタイル・ギャラリー" widths="240px" heights="160px">
File:Dcl_boxed_row.png|boxed_row
File:Dcl_boxed_column.png|boxed_column
File:Dcl_button.png|button
File:Dcl_edit_box.png|edit_box
File:Dcl_image.png|image
File:Dcl_list_box.png|list_box
File:Dcl_popup_list.png|popup_list
File:Dcl_slider.png|slider
File:Dcl_boxed_radio_column.png|boxed_radio_column
File:Dcl_boxed_radio_row.png|boxed_radio_row
File:Dcl_text.png|text
File:Dcl_toggle.png|toggle
</gallery>
==DCLファイルの雛形==
ひな形です。
dcl_settings の行はDCLの監査機能を有効にしています。
<pre class="brush:autolisp;">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;
  }
}
</pre>


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


; 全体の属性
{| class="wikitable"
: 属性名 :
! colspan=2 |  全体の属性
::* alignment
|-
::* fixed_height
! 属性名 !!  適用タイル
::* fixed_width
|-
::* height
| [[alignment]]<br /> [[fixed_height]]<br /> [[fixed_width]]<br /> [[height]]<br /> [[width]] || すべてのタイル
::* width
|}
:: 適用タイル :
:* すべてのタイル




; アクションタイルの属性
{| class="wikitable"
: 属性名 :
! colspan=2 | アクションタイルの属性
::* action
|-
::* is_enabled
! 属性名 !!  適用タイル
::* is_tab_stop
|-
::* key
| [[action]]<br /> [[is_enabled]]<br />[[is_tab_stop]]<br />[[key]]<br /> [[mnemonic]] || button; edit_box; image_button; list_box; popup_list; radio_button; slider; toggle; radio_column; radio_row
::* mnemonic
|}
:: 適用タイル :
 
::* button; edit_box; image_button; list_box; popup_list; radio_button; slider; toggle; radio_column; radio_row


{| class="wikitable"
! colspan=2 | タイルクラスタの属性
|-
! 属性名 !!  適用タイル
|-
| [[children_alignment]] <br /> [[children_fixed_height]]<br /> [[children_fixed_width]]
|| row; column; radio_row; radio_column; boxed_row; boxed_column; boxed_radio_row; boxed_radio_column.
|}


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


{| class="wikitable"
{| class="wikitable"
100行目: 167行目:
! 属性名 !!  適用タイル  
! 属性名 !!  適用タイル  
|-
|-
| allow_accept || edit_box; image_button; list_box  
| [[allow_accept]] || edit_box; image_button; list_box  
|-
|-
| aspect_ration || image; image_button.  
| [[aspect_ration]] || image; image_button.  
|-
|-
| big_increment || slider.  
| [[big_increment]] || slider.  
|-
|-
| color || image; image_button.  
| [[color]] || image; image_button.  
|-
|-
| edit_limit || edit_box.  
| [[edit_limit]] || edit_box.  
|-
|-
| edit_width || edit_box; popup_list.  
| [[edit_width]] || edit_box; popup_list.  
|-
|-
| fixed_width_font || edit_box; popup_list.  
| [[fixed_width_font]] || edit_box; popup_list.  
|-
|-
| initial_focus || dialog.  
| [[initial_focus]] || dialog.  
|-
|-
| is_cancel || button.  
| [[is_bold]] || text.  
|-
|-
| is_default || button.  
| [[is_cancel]] || button.  
|-
|-
| label || boxed_row; boxed_column; boxed_radio_row; boxed_radio_column; button; dialog; edit_box; list_box; popup_list; radio_button; text; toggle.  
| [[is_default]] || button.  
|-
|-
| layout || slider.  
| [[Label_(autolisp)|label]] || boxed_row; boxed_column; boxed_radio_row; boxed_radio_column; button; dialog; edit_box; list_box; popup_list; radio_button; text; toggle.  
|-
|-
| list || list_box; popup_list.  
| [[layout]] || slider.
|-
| [[list_(DCL)|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属性。
 
{| class="wikitable"
! colspan=2 | タイルクラスタの属性
|-
|-
| max_value || slider.
! 属性名 !!  適用タイル
|-
|-
| min_value || slider.
| [[bcad_font]] || list_box
|-
|-
| multiple_select || list_box.
| [[bcad_height]] || すべてのタイル。height の代わり
|-
|-
| password_char || edit_box.
| [[bcad_width]] || すべてのタイル。width の代わり
|-
|-
| small_increment || slider.
| [[bcad_label]] || label の代わり
|-
|-
| tabs || list_box; popup_list.
| [[bcad_win_wrap]] || list_box
|-
|-
| tab_truncate || list_box; popup_list
| [[bcad_skip_next_child]] || すべてのタイル。
|-
|-
| value || text; all active tiles (except buttons and image_buttons).
|}
|}
BricsCAD 特有の挙動をするタイル属性
* [[fixed_width]]
* [[fixed_height]]
* [[label]]
* [[tab_truncate]]
== 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 の方が見やすい状態だったりする。
<gallery caption="DCL表示の比較" widths="240px" heights="160px">
File:Dcl_ac2011.png|AutoCAD2011
File:Dcl_ijcad7.png|IJCAD 7
File:Dcl_ijcadx.png|IJCADX
File:Dcl_bricscadv11.png|BricsCAD v11
File:Dcl_gstercad2011.png|GstarCAD 2010
File:Dcl_zwcad2010.png|ZWCAD2010
</gallery>

2023年6月3日 (土) 10:50時点における最新版

DCLサンプル

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

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

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


  • IJCAD では、DCL の処理でエラーが起こると CAD が死ぬので注意が必要。(エラー処理が弱い。)
  • 別途のアドオンで OpenDCL っていうオープンソースな拡張があり、こちらは Windows の一般的なフォームが使えるものでモードレスダイアログやパレットなども作れる。AutoCAD, BricsCADなどで利用可能。


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 ファイルをロード解除する。


サンプルコード

; 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 を使用してダイアログ ボックスのセットをメモリから極力削除した形の方法が望ましい。となっているが、今となってはダイアログで消費されるメモリなどたかが知れてるので、ロードしたままでも問題にはなりにくいと思われる。

タイルの種類

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

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 の方が見やすい状態だったりする。