コールバック関数を考える

それぞれのリアクタ イベントに対して、イベントが発生したときに呼び出される関数を考える必要があります。次の疑似コードは、ポリラインの頂点の 1 つを、ユーザが新しい位置にドラッグしたときに発生するイベントの論理シーケンスの概要です。

Defun gp:outline-changed
       Erase the tiles.
       Determine how the boundary changed.
       Straighten up the boundary.
       Redraw new tiles.
End function

しかし、複雑な部分もあります。ユーザがポリラインの頂点の輪郭をドラッグし始めたとき、AutoCAD は、イベント :vlr‑modified を発生させて、アプリケーションに通知します。しかし、この時点では、ユーザはポリラインの頂点の 1 つをドラッグし始めただけです。ここで gp:outline‑changed 関数をただちに呼び出すと、ユーザのドラッグ操作を中断させることになってしまいます。ユーザは、まだ頂点の新しい位置を選択していないので、その位置は不明です。そして最後に、ユーザがポリライン オブジェクトをドラッグしている間は、関数を使用してポリライン オブジェクトを修正することはできません。ポリライン オブジェクトが修正モードで開かれると、ユーザがオブジェクトの位置変更を完了するまで、開かれたままになります。

アプローチを変更する必要があります。更新した手順を、次に示します。

When the user begins repositioning a polyline vertex,
  Invoke the gp:outline-changed function
  Defun gp:outline-changed
    Set a global variable that stores a pointer to the polyline
    being modified by the user
  End function

When the command completes,
  Invoke the gp:command-ended function
  Defun gp:command-ended
           Erase the tiles
           Get information on the previous polyline vertex locations
           Get information on the new polyline vertex locations
           Redefine the polyline (straighten it up)
           Redraw the tiles
  End function

ユーザが歩道の輪郭の修正を終えると、編集リアクタが確立されている場合、AutoCAD はイベント :vlr‑commandEnded を発生させて、アプリケーションに通知します。

gp:outline-changed 関数と gp:command-ended 関数の間には連続性がないので、ユーザが変更したポリラインを識別するために、グローバル変数を使用する必要があります。アプリケーションでは、2 つの関数は互いに独立して呼び出され、実行されます。グローバル変数は、一方の関数で設定され、もう一方の関数からアクセスされる重要な情報を格納します。

ここで、ユーザが庭園の歩道の境界を削除したときに、何を行わなければならないかを考えてください。最終目標は、すべてのタイルを削除することです。次の疑似コードに、手順の概要を示します。

When the user begins to erase the boundary,
  Invoke the gp:outline-erased function
  Defun gp:outline-erased
     Set a global variable that stores a pointer to the reactor
     attached to the polyline currently being erased
  End function

When the erase is completed,
  Invoke the gp:command-ended function
  Defun gp:command-ended
     Erase the tiles that belonged to the now-deleted polyline
  End function