期間限定キャンペーン!! 詳しくはこちら

AUTO LISP入門5 : いろんなタイルで入力を便利に

  • URLをコピーしました!

DCLにおける「タイル」とは?
DCL(Dialog Control Language)では、ダイアログボックスのインターフェースを構成する部品を「タイル」と呼びます。これは、ユーザーに入力や選択を促すための機能で、用途に応じて使い分けることができます。たとえば、テキスト入力用のタイルや、複数の選択肢から選ばせたい場合のリストボックスなどがあります。
ここでは、代表的なタイルの種類とその役割について簡単に紹介します。

目次

edit_box

機能・役割使用例・備考
文字列を入力する欄名前や数値の入力に使用

構文例

: edit_box {
  key = "username";
  label = "名前";
  value = "";
}

対応するLISPコード例

(setq dcl_id (load_dialog "sample.dcl"))
(if (not (new_dialog "main" dcl_id))
  (exit)
)
(action_tile "username" "(setq user_input $value)")
(start_dialog)
(unload_dialog dcl_id)

button

機能・役割使用例・備考
ボタンを表示し、クリックで処理を実行実行、閉じるなど

構文例

: button {
  key = "run";
  label = "実行";
}

対応するLISPコード例

(action_tile "run" "(do-something)")

toggle

機能・役割使用例・備考
ON/OFFの切り替えスイッチチェックボックス的な使い方

構文例

: toggle {
  key = "enable";
  label = "有効にする";
  value = "0"; ; 初期状態はOFF
}

対応するLISPコード例

(defun c:sample ()
  (setq dcl_id (load_dialog "sample.dcl"))
  (if (not (new_dialog "sample" dcl_id))
    (progn
      (unload_dialog dcl_id)
      (princ)
    )
  )

  ;; ユーザー名の取得
  (action_tile "username" "(setq user_input $value)")

  ;; トグルの状態取得
  (action_tile "enable" "(setq toggle_state $value)")

  ;; 実行ボタンでダイアログ終了
  (action_tile "run" "(done_dialog 1)")

  ;; OK/Cancelの処理
  (setq result (start_dialog))

  (unload_dialog dcl_id)

  ;; 結果に応じた処理(例)
  (if (= result 1)
    (progn
      (prompt (strcat "\n名前: " user_input))
      (prompt (strcat "\n有効状態: " (if (= toggle_state "1") "ON" "OFF")))
    )
  )

  (princ)
)

list_box

機能・役割使用例・備考
複数の選択肢を表示し、1つを選択プリセット選択など

構文例

sample : dialog {
  label = "動物選択";
  : list_box {
    key = "options";
    label = "好きな動物を選んでください";
    height = 3;
    width = 20;
    value = "0"; ; 初期選択(インデックス)
  }
  ok_cancel;
}

対応するLISPコード例

(defun c:sample ()
  (setq dcl_id (load_dialog "sample.dcl"))
  (if (not (new_dialog "sample" dcl_id))
    (progn
      (unload_dialog dcl_id)
      (princ)
    )
  )

  ;; リストボックスに選択肢を追加
  (start_list "options")
  (add_list "いぬ")
  (add_list "ねこ")
  (add_list "くま")
  (end_list)

  ;; 初期選択(インデックス0 = "いぬ")
  (set_tile "options" "0")

  ;; 選択されたインデックスを取得
  (action_tile "options" "(setq selected_index $value)")

  ;; ダイアログ開始
  (setq result (start_dialog))
  (unload_dialog dcl_id)

  ;; OKが押された場合のみ処理
  (if (= result 1)
    (progn
      (setq animal_list '("いぬ" "ねこ" "くま"))
      (setq selected_animal (nth (atoi selected_index) animal_list))
      (prompt (strcat "\n選択された動物は: " selected_animal))
    )
  )

  (princ)
)

popup_list

機能・役割使用例・備考
ドロップダウン形式の選択肢コンパクトな選択UI

構文例

sample : dialog {
  label = "動物選択";
  : popup_list {
    key = "options";
    label = "好きな動物を選んでください";
    height = 3;
    width = 20;
    value = "0";
  }
  ok_cancel;
}

対応するLISPコード例

(defun c:sample ()
  (setq dcl_id (load_dialog "sample.dcl"))
  (if (not (new_dialog "sample" dcl_id))
    (progn
      (unload_dialog dcl_id)
      (princ)
    )
  )

  ;; 選択肢を追加
  (start_list "options")
  (mapcar 'add_list '("いぬ" "ねこ" "くま"))
  (end_list)

  ;; 初期選択(インデックス0 = "いぬ")
  (set_tile "options" "0")

  ;; ダイアログ開始
  (setq result (start_dialog))
  (unload_dialog dcl_id)

  ;; OKが押された場合のみ処理
  (if (= result 1)
    (progn
      (setq selected_index (get_tile "options"))
      (setq selected_animal (nth (atoi selected_index) '("いぬ" "ねこ" "くま")))
      (prompt (strcat "\n選択された動物は: " selected_animal))
    )
  )

  (princ)
)

radio_button

機能・役割使用例・備考
複数の選択肢から1つだけ選ぶ(ラジオボタン)グループ化して使う

構文例

sample : dialog {
  label = "動物選択";
  : radio_column {
    label = "好きな動物を選んでください";
    : radio_button {
      key = "dog";
      label = "いぬ";
    }
    : radio_button {
      key = "cat";
      label = "ねこ";
    }
    : radio_button {
      key = "bear";
      label = "くま";
    }
  }
  ok_cancel;
}

対応するLISPコード例

(defun c:sample ()
  (setq dcl_id (load_dialog "sample.dcl"))
  (if (not (new_dialog "sample" dcl_id))
    (progn (unload_dialog dcl_id) (princ))
  )

  ;; 各ラジオボタンの選択状態を取得
  (action_tile "dog" "(setq selected_animal \"いぬ\")")
  (action_tile "cat" "(setq selected_animal \"ねこ\")")
  (action_tile "bear" "(setq selected_animal \"くま\")")

  ;; ダイアログ開始
  (setq result (start_dialog))
  (unload_dialog dcl_id)

  ;; OKが押された場合のみ表示
  (if (= result 1)
    (prompt (strcat "\n選択された動物は: " selected_animal))
  )

  (princ)
)

slider

機能・役割使用例・備考
スライダーで数値を調整数値の直感的な調整に便利

構文例

sample : dialog {
  label = "スライダー選択";
  : slider {
    key = "myslider";
    label = "数値を選んでください";
    min_value = 0;
    max_value = 10;
    small_increment = 1;
    big_increment = 2;
    value = "5"; // 初期値
  }
  ok_cancel;
}

対応するLISPコード例

(defun c:sample ()
  (setq dcl_id (load_dialog "sample.dcl"))
  (if (not (new_dialog "sample" dcl_id))
    (progn (unload_dialog dcl_id) (princ))
  )

  ;; スライダーの値を取得
  (action_tile "myslider" "(setq slider_value $value)")

  ;; ダイアログ開始
  (setq result (start_dialog))
  (unload_dialog dcl_id)

  ;; OKが押された場合のみ表示
  (if (= result 1)
    (prompt (strcat "\n選択された値は: " slider_value))
  )

  (princ)
)

DCLタイルのまとめ

AutoCADのダイアログ設計において、**タイル(tile)**はUI部品の基本単位です。各タイルはユーザーとのインタラクションを担い、入力・選択・表示などの役割を果たします。以下に代表的なタイルとその特徴を紹介します。

📝 入力系タイル

  • edit_box
    文字列入力用のテキストボックス。key を使って値を取得・設定できる。
  • slider
    数値を範囲内で選択するためのスライダー。min_valuemax_valuevalue などで制御。
  • image_button
    画像付きのボタン。視覚的な操作性を高めたい場合に有効。

🔘 選択系タイル

  • popup_list
    ドロップダウン形式の選択肢。start_listadd_listend_list で選択肢を追加。
  • list_box
    複数行の選択肢を表示。height で表示行数を調整可能。
  • radio_column / radio_row
    ラジオボタンを縦または横に並べる。複数の radio_button を内包する必要がある。
  • toggle
    ON/OFFのスイッチ。value = "1" でON、"0" でOFF。

🖱 操作系タイル

  • button
    任意のラベル付きボタン。action_tile でクリック時の処理を定義。
  • ok_cancel
    OKとキャンセルの標準ボタンセット。自動でダイアログ終了処理を行う。

📐 レイアウト系タイル

  • boxed_column / boxed_row
    枠付きの縦・横レイアウト。グループ化に便利。
  • spacer
    空白スペースを挿入。UIの見た目調整に使用。

🧠 補足

DCLでは、タイル定義は必ず {} で囲む必要があります。構文ミスの多くはこの括弧の不足によるものです。

各タイルには必ず key を設定し、AutoLISP側で get_tileaction_tile を使って値を取得・制御します。

label はユーザーに表示される説明文です。

  • タイル:UI部品そのもの(edit_box, button など)
  • key:AutoLISPからそのタイルを操作するための名前タグ

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次