Sponsored links

【AutoLISP DCL】ボタンタイル button にアクションを付ける

Sponsored links
ダイアログボックス
Sponsored links

ボタンと関数を紐づけして、ボタンが押されたときに実行するアクションを設定します。

DCL側でアクションを指定する方法、AutoLISP側でアクションを指定する方法2種類紹介します。

Sponsored links

予備知識

ダイアログボックスにボタンを表示させるだけのコードを紹介した記事です。
今回はこのボタンを押すとアクションが起きるように実行する処理を加えていきます。

紐づけする処理

以下の自作関数 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 が実行されます。

Jagaimo
Jagaimo
2つ方方法はは書き方は違ってもどれも同じ働きをします。
自分がわかりやすい書き方を使えばいいと思います。
でも、いろんな書き方を知っておくと、誰かが作ったAutoLISPを解読するときに役に立ちます。 
 
 
 
 

まとめ

  • actionは、ダイアログボックスのタイルにアクションを加えるDCLのタイル属性。
  • そのタイルから実行したい関数名を紐づけする。
  • AutoLISP側で 関数 action_tile を使ってもタイルとアクションを紐づけできる。

参考記事

画像タイルにアクションをつける記事です。
AutoLISP関数 Action_tileについてもう少し詳しく書いています。

サポートファイルの検索パス内のフォルダに保存がよくわからない方はこちらの記事を参考にしてください。

Comments