「DCL」の版間の差分

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


6行目: 7行目:


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


== LISPからダイアログボックスを使用する一般的な手順 ==
== LISPからダイアログボックスを使用する一般的な手順 ==
16行目: 20行目:
# (ユーザの操作により アクション(コールバック)内からユーザ入力を処理する。[[get_tile]]、[[get_attr]]、[[set_tile]]、[[mode_tile]] などが処理される。  
# (ユーザの操作により アクション(コールバック)内からユーザ入力を処理する。[[get_tile]]、[[get_attr]]、[[set_tile]]、[[mode_tile]] などが処理される。  
# ユーザが終了ボタン(あるいは終了処理)を選択したときに [[done_dialog]] が呼び出される。これにより、[[start_dialog]] が値を返す。ここで、[[unload_dialog]] を呼び出し、DCL ファイルをロード解除する。
# ユーザが終了ボタン(あるいは終了処理)を選択したときに [[done_dialog]] が呼び出される。これにより、[[start_dialog]] が値を返す。ここで、[[unload_dialog]] を呼び出し、DCL ファイルをロード解除する。
* 参考: LISPの[[ダイアログ ボックス関数]]


サンプルコード
サンプルコード
<pre class="brush: autolisp;">
<syntaxhighlight lang="lisp" line>
  ; ALLCONTROL.DCL 内の allct_dlg というダイアログを読み込み表示するサンプル
  ; ALLCONTROL.DCL 内の allct_dlg というダイアログを読み込み表示するサンプル
(defun viewdcl ( / dcl_id)  
(defun viewdcl ( / dcl_id)
   (setq dcl_id (load_dialog "ALLCONTROL.DCL"))  
   (setq dclfile "ALLCONTROL.DCL")
  (setq dcl_id (load_dialog dclfile))  
   (if (new_dialog "allct_dlg" dcl_id)  
   (if (new_dialog "allct_dlg" dcl_id)  
     (progn  
     (progn  
29行目: 37行目:
       (unload_dialog dcl_id)  ; ダイアログのアンロード
       (unload_dialog dcl_id)  ; ダイアログのアンロード
     )  
     )  
     (princ "error: ALLCONTROL.DCL ファイルがみつかりません。")  
     (princ (strcat "error:" dclfile "ファイルがみつかりません。"))
   )  
   )  
)  
)  
</pre>
</syntaxhighlight>


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


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


; 定義済みのアクティブ タイル
; 定義済みのアクティブ タイル
:* [[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]]
79行目: 88行目:
:* [[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の監査機能を有効にしています。
<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>


== タイルの属性 ==
== タイルの属性 ==
88行目: 136行目:
! 属性名 !!  適用タイル  
! 属性名 !!  適用タイル  
|-
|-
| alignment<br /> fixed_height<br /> fixed_width<br /> height<br /> width || すべてのタイル
| [[alignment]]<br /> [[fixed_height]]<br /> [[fixed_width]]<br /> [[height]]<br /> [[width]] || すべてのタイル
|}
|}


97行目: 145行目:
! 属性名 !!  適用タイル  
! 属性名 !!  適用タイル  
|-
|-
| 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
| [[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
|}
|}


106行目: 154行目:
! 属性名 !!  適用タイル  
! 属性名 !!  適用タイル  
|-
|-
| children_alignment <br /> children_fixed_height<br /> children_fixed_width
| [[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.  
|| row; column; radio_row; radio_column; boxed_row; boxed_column; boxed_radio_row; boxed_radio_column.  
|}
|}
116行目: 164行目:
! 属性名 !!  適用タイル  
! 属性名 !!  適用タイル  
|-
|-
| 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_bold]] || text.  
|-
|-
| is_cancel || button.  
| [[is_cancel]] || button.  
|-
|-
| is_default || 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.  
| [[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.  
| [[layout]] || slider.  
|-
|-
| list || list_box; popup_list.  
| [[list_(DCL)|list]] || list_box; popup_list.  
|-
|-
| max_value || slider.  
| [[max_value]] || slider.  
|-
|-
| min_value || slider.  
| [[min_value]] || slider.  
|-
|-
| multiple_select || list_box.  
| [[multiple_select]] || list_box.  
|-
|-
| password_char || edit_box.  
| [[password_char]] || edit_box.  
|-
|-
| small_increment || slider.  
| [[small_increment]] || slider.  
|-
|-
| tabs || list_box; popup_list.  
| [[tabs]] || list_box; popup_list.  
|-
|-
| tab_truncate || list_box; popup_list  
| [[tab_truncate]] || list_box; popup_list  
|-
|-
| value || text; all active tiles (except buttons and image_buttons).  
| [[value]] || text; all active tiles (except buttons and image_buttons).  
|}
|}
== 互換CADでのDCL表示サンプル ==
以下は同じDCLファイルを各互換CADで表示したサンプルである。
見て分かるように、同じDCLでも解釈が異なるため、各コントロールの左右やレイアウトは全く同じにはならない。
<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>

2021年4月3日 (土) 12:45時点における版

DCLサンプル

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

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

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

  • 別途のアドオンで OpenDCL っていうオープンソースな拡張があり、こちらは Windows の一般的なフォームが使えるものでモードレスダイアログやパレットなども作れる。


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でも解釈が異なるため、各コントロールの左右やレイアウトは全く同じにはならない。