【AutoCAD】GUIカスタマイズ入門2(dcl) -20分-

AutoCAD

概要

ダイアログに文字列、整数、実数を入力します。

DCL

全ソース

//--------------------------------------
// MyEditBoxes
//--------------------------------------
MyEditBoxes : dialog {
  key = "Title";
  label = "";
  initial_focus = "Edit1";
  spacer;
//文字列の入力画面
  : row {
    fixed_width = true;
    : column {
      width = 24.76;
      fixed_width = true;
      spacer;
      : text {
        key = "Text1";
        label = "";
      }
    }
    : edit_box {
      key = "Edit1";AutoLispで値を取り出す際の識別子
      edit_width = 9.42;
      fixed_width = true;
    }
  }

//整数の入力画面
  : row {
    fixed_width = true;
    : column {
      width = 24.76;
      fixed_width = true;
      spacer;
      : text {
        key = "Text2";
        label = "";
      }
    }
    : edit_box {
      key = "Edit2";AutoLispで値を取り出す際の識別子
      edit_width = 9.42;
      fixed_width = true;
    }
  }

//実数の入力画面
  : row {
    fixed_width = true;
    : column {
      width = 24.76;
      fixed_width = true;
      spacer;
      : text {
        key = "Text3";
        label = "";
      }
    }
    : edit_box {
      key = "Edit3";AutoLispで値を取り出す際の識別子
      edit_width = 9.42;
      fixed_width = true;
    }
  }
  spacer;
  ok_cancel;
}

解説

以下を、参照ください。

AutoLisp

全ソース

;-------------------------------------------------------------------
; c:MyEditBoxes - Dialog to edit text, integers, and real numbers
; Syntax: MyEditBoxes
;--------------------------------------------------------------------
(defun c:MyEditBoxes (/ Dcl_Id% Edit1$ Edit2$ Edit3$ Return#)
  (print "MyEditBoxes")

 
  (setq Dcl_Id% (load_dialog "test01.dcl"))
  (new_dialog "MyEditBoxes" Dcl_Id%)
 

     
  (set_tile "Title" "My Edit Boxes")
  (set_tile "Text1" "Enter First Name")
  (set_tile "Edit1" "Jon")
  (set_tile "Text2" "Enter your Age")
  (set_tile "Edit2" "27")
  (set_tile "Text3" "Enter a Real Number")
  (set_tile "Edit3" "3.14")
  

  (action_tile "cancel" "(done_dialog 0)")  
  (action_tile "accept" "(getVariable)(done_dialog 1)")

  (setq Return# (start_dialog))
 
  
  (if (= Return# 1) 
    (progn
      (print "--OKを押しました")
      (print (strcat "edt1 = " Edit1$ ))
      (print (strcat "edt2 = " Edit2$ ))
      (print (strcat "edt3 = " Edit3$ )) 
      (print "--パラメータを取得しました")          
    )  
  )

                       
  ; Unload Dialog
  (unload_dialog Dcl_Id%)

)

(defun getVariable()
	(setq Edit1$ (get_tile "Edit1"))
	(setq Edit2$ (get_tile "Edit2"))
	(setq Edit3$ (get_tile "Edit3"))		
)

ダイアログのイベントハンドラ

  • action_tile に”accept”、”cancel”に done_dialog を設定します。
  •  コールバックはdone_dialogと、OKの場合は1をキャンセルの場合には0を明示的に定義しなければなりません。
  • OKボタン(accept)がクリックされた場合、getVariable関数を使ってローカル変数Edit1$~Edit3$に値を設定します。
  • ダイアログの表示を行い(start_dialog)、ダイアログの終了結果をReturn#に受け取ります。Return#は action_tileで定義した番号です。
  (action_tile "cancel" "(done_dialog 0)")  
  (action_tile "accept" "(getVariable)(done_dialog 1)")

  (setq Return# (start_dialog))
(defun getVariable()
	(setq Edit1$ (get_tile "Edit1"))
	(setq Edit2$ (get_tile "Edit2"))
	(setq Edit3$ (get_tile "Edit3"))		
)
  • Return# を受け取って、処理を分岐します。
  • progn 関数を使用すると、1 つの式しか指定できない箇所で複数の式を評価できます。
  • strcatは文字列連結の関数です。
  (if (= Return# 1) 
    (progn
      (print "--OKを押しました")
      (print (strcat "edt1 = " Edit1$ ))
      (print (strcat "edt2 = " Edit2$ ))
      (print (strcat "edt3 = " Edit3$ )) 
      (print "--パラメータを取得しました")          
    )  
  )

printの使用例は、以下を参照ください。

Common Lisp 入門
xyzzy,xyzzy Lisp,Common Lisp,入門

表示名の設定

  • ダイアログのタイトルに ” My Edit Boxes” を設定します。
  • 1項目(Text1)に表示名”Enter First Name”を設定、”Edit1″に”Jon”を設定します。
  • 2項目(Text2)に表示名”Enter your Ager Age”を設定、”Edit2″に”27”を設定します。
  • 3項目(Text3)に表示名”Enter a Real Number”を設定、”Edit3″に”3.14”を設定します。
  (set_tile "Title" "My Edit Boxes")
  (set_tile "Text1" "Enter First Name")
  (set_tile "Edit1" "Jon")
  (set_tile "Text2" "Enter your Age")
  (set_tile "Edit2" "27")
  (set_tile "Text3" "Enter a Real Number")
  (set_tile "Edit3" "3.14")

実行

実行方法は、こちらを参考にしてください。

実行結果

"--OKを押しました"
"edt1 = Jon"
"edt2 = 27"
"edt3 = 3.14"
"--パラメータを取得しました" nil

参考

AutoLISP