このレッスンでは、いくつかの新しい関数を定義する必要があります。このレッスンでは、新しいコードのすべての面を詳細に説明するのではなく、概要とコードの背後にある概念を説明します。レッスンの最後に、レッスン 1 で実行したサンプル プログラムと同一の庭園の歩道アプリケーションの作成に必要なすべてのソース コードが完成します。
レッスン 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 つの潜在的な問題を予測する必要があります。
グローバル変数を再初期化しなかった場合、または正しいデータ構造(この場合はリスト)を使用しなかった場合は、予期しない動作になります。リアクタの場合、予期しない動作は、AutoCAD セッションにとって致命的になる可能性があります。
次に、ユーザが 1 つの削除コマンドで 2 つの庭園の歩道を削除したときに発生する一連のイベントを示します。グローバル変数の処理方法に注意してください。
アプリケーションは、ポリラインの 1 つに対するコールバック gp:outline-erased を受け取ります。そのリアクタ ポインタを、null グローバル *reactorsToRemove* に追加します。
アプリケーションは、2 番目のポリラインに対するコールバック gp:outline-erased を受け取ります。そのリアクタ ポインタを、既に最初のリアクタ ポインタが格納されたグローバル *reactorsToRemove* に追加します。
アプリケーションには、グローバル *reactorsToRemove* に加えて、修正されるすべてのポリラインのポインタを格納するグローバル *polyToChange* があります。アプリケーションの別の 2 つのグローバル変数については、このレッスンで後ほど紹介します。