それぞれのリアクタ イベントに対して、イベントが発生したときに呼び出される関数を考える必要があります。次の疑似コードは、ポリラインの頂点の 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