リアクタ処理全体を考える

このレッスンでは、いくつかの新しい関数を定義する必要があります。このレッスンでは、新しいコードのすべての面を詳細に説明するのではなく、概要とコードの背後にある概念を説明します。レッスンの最後に、レッスン 1 で実行したサンプル プログラムと同一の庭園の歩道アプリケーションの作成に必要なすべてのソース コードが完成します。

注: リアクタ ベースのアプリケーションを作成およびデバッグしている間は常に、AutoCAD® が不安定な状態になる可能性があります。これは、削除された図形からのリアクタの除去に失敗するなど、種々の状況で発生します。このため、レッスン 7 を始める前に、Visual LISP を閉じ、開いているすべてのファイルを保存し、AutoCAD を終了してから、両方のアプリケーションを再起動してください。

レッスン 6 で作成したプロジェクトをそのままロードすることから始めます。

庭園の歩道アプリケーションで、次の作業が残っています。

プログラムでグローバル変数を処理する方法を検討する必要もあります。グローバル変数が、AutoCAD 作図セッションの間ずっと値を保持していることが好都合なことはよくあります。しかし、リアクタの場合、これは当てはまりません。たとえば、庭園の歩道アプリケーションのユーザが、1 つの図面内に複数の庭園の歩道を描いたと考えてください。この後、ユーザは、まず一度に 1 つ、次は一度に 2 つというように歩道を削除し、1 つを除いてすべての歩道を削除したとします。

レッスン 5 で説明したグローバル変数 *reactorsToRemove* には、削除するポリラインのリアクタのポインタが格納されます。gp:outline-erased*reactorsToRemove* が宣言されたとき、ポリラインが削除されることを、イベントによって知ることができます。ポリラインは、イベント gp:command-ended が実行されるまで、実際には削除されません。

ユーザが最初にポリラインを削除したときは、期待どおりに動作します。gp:outline-erased に、リアクタのポインタが格納されます。gp:command-ended が実行されたとき、そのリアクタがアタッチされたポリラインに関連付けられているタイルが除去されます。次に、ユーザは 2 つの歩道を削除します。その結果、アプリケーションは、2 つの gp:outline‑erased 呼び出しを受け取ります。つまり削除されるポリラインごとに 1 つ受け取ります。ここでは、次の 2 つの潜在的な問題を予測する必要があります。

次に、ユーザが 1 つの削除コマンドで 2 つの庭園の歩道を削除したときに発生する一連のイベントを示します。グローバル変数の処理方法に注意してください。

アプリケーションには、グローバル *reactorsToRemove* に加えて、修正されるすべてのポリラインのポインタを格納するグローバル *polyToChange* があります。アプリケーションの別の 2 つのグローバル変数については、このレッスンで後ほど紹介します。