ボタンと関数を紐づけして、ボタンが押されたときに実行するアクションを設定します。
DCL側でアクションを指定する方法、AutoLISP側でアクションを指定する方法2種類紹介します。
予備知識
ダイアログボックスにボタンを表示させるだけのコードを紹介した記事です。
今回はこのボタンを押すとアクションが起きるように実行する処理を加えていきます。
紐づけする処理
以下の自作関数 hello をボタンを押したときのアクションとして紐づけします。
まずはこの関数を読み込んでおいてください。
(defun hello ()
(alert "Hello World")
)
内容はalert を使ってメッセージボックスを出すだけのプログラムです。
右側がボタン付きダイアログボックスです。
左側がボタンを押されたときに、問題なく hello が実行されたら出てくるメッセージボックスです。
方法1 DCL側でボタンタイルにaction属性を使う
DCL
DCLは、AutoLISPプログラムから呼び出すので、JagaDCL.dclという名前で、サポートファイルの検索パス内のフォルダに保存してください。
Test_button1:dialog {label= "Button Dialog Box";
:button {label="Hello World"; key="Hello"; action="(hello)";}
ok_cancel;
}
ボタンタイルにアクション属性が付いています。
:button {label=”Hello World”; key=”Hello”; action=”(hello)”;}
この場合、ボタンを押したら 関数 hello を実行するという意味です。
DCLにAutoLISP関数を入れるとき、関数名には( )だけではなく、” ” も付くので気を付けて下さい。
AutoLISP
AutoLISP側ですが、アクションをDCL側で設定したので、ダイアログボックス部分はボタンを表示させるだけの時と同じです。
コマンド名は test 1 です。
(defun c:test1 (/ dcl_id Act)
(setq dcl_id (load_dialog "JagaDCL.dcl")) ;
(if (not (new_dialog "Test_button1" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));if
;-----------------------------------------------------------
;-----------------------------------------------------------
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
;-----------------------------------------------------------
(setq Act (start_dialog))
(unload_dialog dcl_id)
;-----------------------------------------------------------
;----------------------------------------------------------
(princ));defun
方法2 AutoLISP側で関数 Action_tileを使う
AutoLISP関数 Action_tileを使ってボタンを押されたときに実行される関数を指定する方法です。
コマンド名は test2 です。
DCL
Test_button2:dialog {label= "Button Dialog Box";
:button {label="Hello World"; key="Hello";}
ok_cancel;
}
AutoLISP
(defun c:test2 (/ dcl_id Act)
(setq dcl_id (load_dialog "JagaDCL.dcl")) ;
(if (not (new_dialog "Test_button2" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));if
;-----------------------------------------------------------
(action_tile "Hello" "(hello)")
;-----------------------------------------------------------
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
;-----------------------------------------------------------
(setq Act (start_dialog))
(unload_dialog dcl_id)
;-----------------------------------------------------------
;----------------------------------------------------------
(princ));defun
DCL側の action=”(hello)”; を消し、AutoLISP側に (action_tile “Hello” “(hello)”) が加わっただけです。
結果は同じで、ボタンを押すと、関数 hello が実行されます。
自分がわかりやすい書き方を使えばいいと思います。
でも、いろんな書き方を知っておくと、誰かが作ったAutoLISPを解読するときに役に立ちます。
まとめ
- actionは、ダイアログボックスのタイルにアクションを加えるDCLのタイル属性。
- そのタイルから実行したい関数名を紐づけする。
- AutoLISP側で 関数 action_tile を使ってもタイルとアクションを紐づけできる。
参考記事
画像タイルにアクションをつける記事です。
AutoLISP関数 Action_tileについてもう少し詳しく書いています。
サポートファイルの検索パス内のフォルダに保存がよくわからない方はこちらの記事を参考にしてください。
Comments