「AutoCAD でリアクターを使うときのガイドライン」の版間の差分
(ページの作成:「{{AutoLISP}} ==AutoCAD でリアクターを使うときのガイドライン== リアクターを使用する場合は、以下のガイドラインに従う必要が…」) |
編集の要約なし |
||
1行目: | 1行目: | ||
{{AutoLISP}} | {{AutoLISP}} | ||
リアクターを使用する場合は、以下のガイドラインに従う必要がある。 | リアクターを使用する場合は、以下のガイドラインに従う必要がある。 | ||
40行目: | 39行目: | ||
==== リアクターを設定する前に、リアクターがまだ設定されていないことを確認する。==== | ==== リアクターを設定する前に、リアクターがまだ設定されていないことを確認する。==== | ||
AutoCAD がモーダルダイアログを表示している間は、イベントは発生しないことを覚えておくこと。 | そうしないと、同じイベントに対して複数のコールバックを呼び出すことになってしまう。 | ||
==== AutoCAD がモーダルダイアログを表示している間は、イベントは発生しないことを覚えておくこと。==== | |||
== 関連事項 == | == 関連事項 == | ||
* [[リアクタ関数]] | * [[リアクタ関数]] | ||
* [[IJCAD でリアクターを使うときのガイドライン]] | |||
* [[BricsCAD でリアクターを使うときのガイドライン]] | |||
[[Category:AutoLISP]] | [[Category:AutoLISP]] |
2020年12月23日 (水) 16:57時点における版
リアクターを使用する場合は、以下のガイドラインに従う必要がある。 このガイドラインに違反するリアクターは、リアクターの内部実装が変更された場合、アプリケーションにとって予測できない結果をもたらす可能性がある。
リアクターの通知の順序に依存しない。
いくつかの例外を除いて、リアクター通知のシーケンスに依存しないことが推奨される。 例えば、OPENコマンドは BeginCommand、BeginOpen、EndOpen、EndCommand イベントをトリガするが、これらのイベントはその順番で発生するとは限らない。 安全に信頼できる唯一のイベントシーケンスは、Begin イベントが対応する End イベントの前に発生するということになる。 例えば、commandWillStart() は常に commandEnded() の前に発生し、beginInsert() は常に endInsert() の前に発生する。 将来的に新しい通知が導入されたり、既存の通知が再配置されたりした結果、シーケンスが変更された場合、より複雑なシーケンスに依存すると、アプリケーションに問題が生じる可能性がある。
通知間の関数呼び出しのシーケンスに依存しない。
特定の通知の間に特定の関数が呼び出されることは保証されていない。例えば、オブジェクトA に対して :vlr-erased という通知を受け取った場合、それはオブジェクトAが消去されたことを意味する。 A で :vlr-erased 通知を受け取った後、B で :vlr-erased 通知を受け取った場合、それはオブジェクト A と B の両方が消去されたことを意味する。 シーケンスに頼るのではなく、システムの状態を示すリアクタに頼ること。
リアクターのコールバック関数でインタラクティブ関数を使用しない(例えば、getPoint や entsel を使用してはいけない)。
リアクターコールバック関数内からインタラクティブ関数を実行しようとすると、イベントがトリガーされた時点でも AutoCAD がコマンドを処理している可能性があるため、深刻な問題が発生する可能性がある。そのため、getPoint、entsel、getkword などの入力取得メソッドや、選択セット操作、コマンド関数の使用は避けること。
イベントハンドラ内からダイアログボックスを起動しない。
ダイアログ ボックスは対話的な機能とみなされ、AutoCAD の現在の操作に干渉する可能性がある。しかし、メッセージ ボックスやアラート ボックスは対話的な機能とはみなされず、安全に発行することができる。
イベント通知を発行したオブジェクトを更新しない。
オブジェクトがコールバック関数をトリガする原因となっているイベントは、コールバック関数が呼び出されたときにまだ進行中であり、オブジェクトはまだ AutoCAD で使用されている可能性がある。 したがって、同じオブジェクトのコールバック関数からオブジェクトを更新しようとしないこと。ただし、イベントのトリガーとなったオブジェクトから情報を安全に読み取ることはできる。 例えば、タイルで埋め尽くされた床があり、床の境界線にリアクターを取り付けたとして、床のサイズを変更すると、リアクターのコールバック関数は自動的にタイルを追加または減算して新しい領域を埋める。 この関数は境界線の新しい領域を読み取ることができるが、境界線自体の変更を試みることはできない。
同じイベントをトリガするコールバック関数からアクションを実行しない。
リアクターのコールバック関数で同じイベントをトリガーとするアクションを実行すると、無限ループが発生する。 たとえば、BeginOpen のイベント内から図面を開こうとすると、AutoCAD は、開いている図面の最大数に達するまで、さらに多くの図面を開き続けてしまう。
リアクターを設定する前に、リアクターがまだ設定されていないことを確認する。
そうしないと、同じイベントに対して複数のコールバックを呼び出すことになってしまう。