タイルにアクションを割り当てる

DCL 定義は、静的なダイアログ ボックスを定義する以外に何も行いません。action_tile 関数を使用して、この静的なダイアログ ボックスと動的な AutoLISP コードを、次のコードが示すように関連付けます。

;; Assign actions (the functions to be invoked) to dialog buttons
(action_tile
  "gp_lw"
  "(setq plineStyle \"Light\")"
)
(action_tile
  "gp_hw"
  "(setq plineStyle \"Pline\")"
)
(action_tile
  "gp_actx"
  "(setq objectCreateMethod \"ActiveX\")"
)
(action_tile
  "gp_emake"
  "(setq objectCreateMethod \"Entmake\")"
)
(action_tile
  "gp_cmd"
  "(setq objectCreateMethod \"Command\")"
)
(action_tile "cancel" "(done_dialog) (setq UserClick nil)")
(action_tile
  "accept"
  (strcat "(progn (setq tileRad (atof (get_tile \"gp_trad\")))"
       "(setq tileSpace (atof (get_tile \"gp_spac\")))"
       "(done_dialog) (setq UserClick T))"
  )
)

ダブル クォーテーションで囲まれている AutoLISP コードに注目してください。AutoLISP の action_tile 関数を書く場合、「ここで、この文字列を記憶し、ユーザが君を選択したらそれを私に返せ」とタイルに命令するつもりでコードを書きます。文字列(ダブルクォーテーション マークに囲まれたものすべて)は、ユーザがタイルを選択しない限り活動しません。タイルが選択されると、その文字列は AutoCAD に渡され、AutoLISP コードに変換されて実行されます。

たとえば、[lightweight]ラジオ ボタンに関連付けられた次の action_tile 式を考えてください。

(action_tile
   "gp_lw"
   "(setq plineStyle \"Light\")"
)

このコードは、ラジオ ボタンに文字列 "(setq plineStyle ¥"Light¥")" を割り当てています。このボタンをユーザがクリックすると、この文字列は AutoCAD に返され、次の AutoLISP 式に変換されます。

(setq plineStyle "Light")

もう 1 つ、コードを見てください。次のコードは、[OK]ボタンに割り当てられる action_tile 式です。

(action_tile
    "accept"
    (strcat "(progn (setq tileRad (atof (get_tile \"gp_trad\")))"
      "(setq tileSpace (atof (get_tile \"gp_spac\")))"
      "(done_dialog) (setq UserClick T))"
)

ユーザが[OK]ボタンをクリックすると、そのボタンに割り当てられた長い文字列が AutoCAD に渡され、次の AutoLISP コードに変換されます。

(progn 
   (setq tileRad (atof (get_tile "gp_trad")))
   (setq tileSpace (atof (get_tile "gp_spac")))
   (done_dialog)
   (setq UserClick T)
)

このコードは、次のことを行います。まず、キーの値が gp_trad (タイルの半径)と gp_spac (タイル間隔)のタイルから、現在の値を取得します。次に atof で、数値文字列を実数に変換します。done_dialog 関数でダイアログが終了し、値 T (真)が変数 UserClick に割り当てられます。

これで、ボタンへのアクションの割り当てが終了しました。次は、動作の中にそれをすべて組み込みます。