レッスン 6 で、オブジェクト リアクタ イベントとともに、2 つのコールバック関数を登録しました。gp:outline-erased 関数をリアクタ イベント :vlr-erased に関連付け、gp:outline-changed 関数をイベント :vlr‑modified に関連付けました。これらの関数が意図した動作を行うようにする必要があります。
(defun gp:outline-erased (outlinePoly reactor parameterList)
(setq *reactorsToRemove*
(cons reactor *reactorsToRemove*))
(princ)
) ;_ end of defun
ここで実行される操作は、1 つだけです。ポリラインにアタッチされたリアクタは、除去しなければならないすべてのリアクタのリストに保存されます。(重要: 図形にアタッチされたリアクタも、完全に独立したオブジェクトです。それらの図形との関係は、通常の AutoCAD 図形と同様に、注意深く管理する必要があります。)
(defun gp:outline-changed (outlinePoly reactor parameterList)
(if *lostAssociativity*
(setq *reactorsToRemove*
(cons reactor *reactorsToRemove*))
(setq *polytochange* outlinePoly
*reactorsToChange* (cons reactor *reactorsToChange*))
)
(princ)
)
ポリラインの輪郭を修正できる関数は、2 種類あります。最初の種類には、歩道とタイルの関連性を失わせるコマンドが含まれます。この状態は gp:command‑will‑start でチェックされ、それに応じてグローバル変数 *lostAssociativity* が設定されます。この場合、タイルを削除する必要があります。その後、歩道はユーザが管理することになります。もう 1 つの種類は、STRETCH[ストレッチ]コマンドのグリップ モードです。ユーザが新しい位置に頂点をドラッグし終えた後も、関連性は保持され、輪郭を長方形にする必要があります。
変数 *polyToChange* には、ポリライン自体の VLA-Object ポインタが格納されます。これは、ポリライン境界を再計算するときに、gp:command-ended 関数内で使用されます。