AutoLISP DCL入門3:入力値をLISPで受け取って処理する

Autolisp

前回の記事では、DCLファイルで edit_box を使った入力フォームを作成しました。今回はその続きとして、ユーザーが入力した値をAutoLISP側で受け取り、処理する方法を解説します。


DCLとAutoLISPの連携の仕組み

DCLで定義した edit_box は、AutoLISPから操作するために key 属性を持っています。この key を使って、AutoLISP側で値を取得するには action_tile 関数を使います。


Step 1:DCLファイルの確認

まずは、前回作成した simpleedit.dcl を再確認しておきましょう。

inputdlg : dialog {
  label = "名前を入力してください";
  : edit_box {
    key = "username";
    label = "名前";
    value = "";
  }
  ok_cancel;
}
  • key = "username" がポイント。AutoLISP側でこの名前を使って値を取得します。

Step 2:AutoLISPで値を受け取る

以下のコードでは、username タイルから入力値を取得し、処理しています。

(defun C:getname ( / dcl_id result name )
  (setq dcl_id (load_dialog "simpleedit.dcl"))
  (if (not (new_dialog "inputdlg" dcl_id))
    (prompt "\nDCLの読み込みに失敗しました。")
  )

  ;; 入力値を取得するアクションを設定
  (action_tile "username" "(setq name $value)")

  ;; OKボタンでダイアログを終了
  (action_tile "accept" "(done_dialog 1)")
  ;; キャンセルボタンで終了
  (action_tile "cancel" "(done_dialog 0)")

  ;; ダイアログを表示
  (setq result (start_dialog))
  (unload_dialog dcl_id)

  ;; 入力結果を処理
  (if (= result 1)
    (progn
      (prompt (strcat "\n入力された名前は: " name))
      ;; ここに処理を追加可能(例:図面に文字を配置など)
      (command "_.text" "j" "mc" (getpoint "\n配置位置を指定: ") 2.5 0 name)
    )
    (prompt "\nキャンセルされました。")
  )
  (princ)
)

入力された名前を図面上に文字として配置するには、以下のような処理を追加できます:

(command "_.text" "j" "mc" (getpoint "\n配置位置を指定: ") 2.5 0 name)

これを progn の中に入れることで、入力された名前を図面に描画できます。こ


🔹 action_tile の基本説明

ここで初めて使ったaction_tileについて説明します。

action_tile は、DCLダイアログ内の各UI要素(ボタン、テキストボックスなど)に対して、ユーザーの操作に応じた処理をAutoLISP側で定義するための関数です。

この関数は、次のような構文で使用されます:

(action_tile "キー" "処理式")
  • キー はDCLファイルで定義されたUI要素の名前です。今回は”username”。
  • 処理式 は、ユーザーがそのUI要素を操作したときに実行されるAutoLISPコードです。

これにより、UIとAutoLISPのスクリプトを連携させることができます。

🔹 各行の役割と解説

  • (action_tile "username" "(setq name $value)") → DCL側で定義された edit_box のキー "username" に対応するアクションです。ユーザーが入力した文字列($value)をAutoLISP変数 name に代入します。
  • (action_tile "accept" "(done_dialog 1)") → OKボタンが押されたときに、done_dialog を呼び出してダイアログを終了します。戻り値として 1 が返されるため、後続の処理で「OKが押されたかどうか」を判定できます。
  • (action_tile "cancel" "(done_dialog 0)") → キャンセルボタンが押された場合の処理です。done_dialog0 を渡すことで、キャンセルされたことを示します。
  • (setq result (start_dialog)) → ダイアログを表示し、ユーザーの操作を待ちます。操作が完了すると、accept または cancel に応じた戻り値(1 または 0)が result に格納されます。
  • (unload_dialog dcl_id) → 使用したDCLダイアログをメモリから解放します。これにより、不要なリソースの消費を防ぎます。

まとめ

要素役割
keyDCL側の識別名(AutoLISPからアクセス)
action_tileタイルの値を取得・処理するための関数
$valueユーザーが入力した値(文字列)
start_dialogダイアログを表示し、ユーザー操作を待つ

この仕組みを理解すれば、複数の入力欄や選択肢を組み合わせた本格的なUI設計にも応用できます。

コメント

タイトルとURLをコピーしました