リアクタ関数

提供:GizmoLabs - だいたい CAD LISP なサイト

AutoLISP のリアクタ関数は、次の通り。

  • AutoCADにおいてリアクタ関数を使用できるようにするためには、事前に (vl-load-com) を実行して関数をロードしておく必要がある。


関 数 説 明
(vl-load-com) AutoLISP のリアクタ サポート関数とその他の拡張 AutoLISP 関数をロードする。
(vl-load-reactors) リアクタ サポート関数をロードする。(下位互換用)
(vlr-acdb-reactor data callbacks) データベース(グローバル)リアクタ オブジェクトを作成する。
(vlr-add obj) 無効なリアクタ オブジェクトを有効にする。
(vlr-added-p obj) リアクタ オブジェクトが有効かどうかを調べる。
(vlr-beep-reaction [args]) ブザー警告音を鳴らす。
(vlr-command-reactor data callbacks) コマンド イベントを通知する編集リアクタを作成する。
(vlr-current-reaction-name) リアクタのコールバックの中から呼び出された場合に、現在のイベントの名前(シンボル)を返す。
(vlr-data obj) リアクタに関連付けられているアプリケーション固有のデータを返す。
(vlr-data-set obj data) リアクタに関連付けられているアプリケーション固有のデータを上書きする。
(vlr-deepclone-reactor obj data) ディープ クローン イベントを通知する編集リアクタ オブジェクトを作成する。
(vlr-docmanager-reactor obj data) MDI 関連のイベントを通知するリアクタ オブジェクトを作成する。
(vlr-dwg-reactor obj data) 図面イベント(図面ファイルを開く、閉じるなど)を通知する編集リアクタ オブジェクトを作成する。
(vlr-dxf-reactor obj data) DXF ファイルの読み込みまたは書き出しに関するイベントを通知する編集リアクタ オブジェクトを作成する。
(vlr-editor-reactor data callbacks) 編集(グローバル)リアクタ オブジェクトを作成する。
(vlr-insert-reactor data callbacks) ブロック挿入に関するイベントを通知する編集リアクタ オブジェクトを作成する。
(vlr-linker-reactor data callbacks) リンカー(グローバル)リアクタ オブジェクトを作成する。
(vlr-lisp-reactor data callbacks) LISP イベントを通知する編集リアクタ オブジェクトを作成する。
(vlr-miscellaneous-reactor data callbacks) 他の編集リアクタ タイプに属さない編集リアクタ オブジェクトを作成する。
(vlr-mouse-reactor data callbacks) マウス イベント(ダブルクリックなど)を通知する編集リアクタ オブジェクトを作成する。
(vlr-notification reactor) リアクタのコールバック関数が、関連する名前空間がアクティブでないときに実行されるかどうかを調べる。
(vlr-object-reactor owners data callbacks) オブジェクト リアクタ オブジェクトを作成する。
(vlr-owner-add reactor owner) オブジェクト リアクタのオーナーリストにオブジェクトを追加する。
(vlr-owner-remove reactor owner) オブジェクト リアクタのオーナーリストからオブジェクトを除去する。
(vlr-owners reactor) オブジェクト リアクタのオーナーリストを返す。
(vlr-pers reactor) リアクタを不変リアクタする。
(vlr-pers-list [reactor]) 現在の図面内の不変リアクタのリストを返す。
(vlr-pers-p reactor) リアクタが不変リアクタかどうかを調べる。
(vlr-pers-release reactor) リアクタを一時リアクタにする。
(vlr-reaction-name reactor-type) 指定されたリアクタ タイプに対して可能なすべてのコールバック条件のリストを返す。
(vlr-reaction-set reactor event function) リアクタにコールバック関数を追加または置き換える。
(vlr-reactions reactor) リアクタのペアのリスト(event-name . callback_function)を返す。
(vlr-reactors [reactor-type...]) 指定されたタイプのリアクタのリストを返す。
(vlr-remove reactor) リアクタを無効にする。
(vlr-remove-all [reactor-type]) 指定されたタイプのすべてのリアクタを無効にする。
(vlr-set-notification reactor 'range) 関連する名前空間がアクティブでないときにリアクタのコールバック関数が実行されるかどうかを設定する。
(vlr-sysvar-reactor data callbacks) システム変数の変更を通知する編集リアクタ オブジェクトを作成する。
(vlr-toolbar-reactor data callbacks) ツールバーのビットマップの変更を通知する編集リアクタ オブジェクトを作成する。
(vlr-trace-reaction ) [トレース]ウィンドウに 1 つまたは複数のコールバックの引数を出力する定義済みのコールバック関数。
(vlr-type reactor) リアクタのタイプを表すシンボルを返す。
(vlr-types ) すべてのリアクタ タイプを返す。
(vlr-undo-reactor data callbacks) UNDO[元に戻す]イベントを通知する編集リアクタ オブジェクトを作成する。
(vlr-wblock-reactor data callbacks) ブロックの書き出しに関するイベントを通知する編集リアクタ オブジェクトを作成する。
(vlr-window-reactor data callbacks) AutoCAD ウィンドウの移動またはサイズ変更に関するイベントを通知する編集リアクタ オブジェクトを作成する。
(vlr-xref-reactor data callbacks) 外部参照のアタッチまたは修正に関するイベントを通知する編集リアクタ オブジェクトを作成する。


リアクタとは

リアクタは、作図エディタにアタッチ、または図面内の特定の図形にアタッチするオブジェクト。 リアクタ オブジェクトは、何かが起きたときに呼び出される「コールバック関数」。

リアクタの種類

リアクタには、多くの種類があり、各種類は、1 つまたは複数の CAD イベントに応答する。

リアクタの分類は次の通り。

  • 編集リアクタ … AutoCAD コマンドが呼び出されるたびに、アプリケーションに通知する。
  • リンカー リアクタ … ObjectARX アプリケーションがロードまたはロード解除されるたびに、アプリケーションに通知する。
  • データベース リアクタ … 図面データベース内の特定の図形またはオブジェクトと一致する。
  • ドキュメント リアクタ … 新しい図面ドキュメントを開く、異なるドキュメント ウィンドウをアクティブにする、ドキュメントのロック状態を変更するなど、現在の図面ドキュメントに対して MDI モードでの変更が行われたときに通知する。
  • オブジェクト リアクタ … 特定のオブジェクトが変更、複写、削除されたときに通知する。


  • 編集リアクタを除き、リアクタの種類は分類ごとに 1 つしかない。たとえば DXFリアクタは、DXF ファイルが読み込まれたときや書き出されたときにアプリケーションに通知し、マウスリアクタは、ダブルクリックなどのマウスイベントを通知する。
  • リアクタの分類内には、リアクタにアタッチ可能な多くの特定イベントがある。CAD を使用して、ユーザは多くの種類のアクションを実行できる。応答すべきアクションを決定するのは、ユーザの責任で、そのアクションが決まると、これから作成する「自動呼び出し」をイベントにアタッチし、次に、そのイベントが発生したときに起動されるコールバック関数を書くことができる。


AutoLISP リアクタのガイドライン

CAD でリアクタを使用するときは、リアクタが一連のガイドラインに従うようにする必要がある。 従っていないリアクタは、リアクタの内部実装が変更されたときにアプリケーションで予期しない結果が起きることがあえる。 互換 CAD でリアクタを使えるものも増えてきているが、AutoCAD と全く同じ動作をするとは限らないので注意が必要。 注: ActiveX のサポートは Windows のみ。

リアクタは、次のガイドラインに従う必要がある。

  1. リアクタの通知の順番を信頼しない。
    • ほとんどの場合に、リアクタの通知の順番を信頼しないことが推奨される。たとえば、OPEN[開く]コマンドを使用すると、BeginCommand、BeginOpen、EndOpen、EndCommand イベントが発生するが、これらのイベントはこの順番では発生するとは限らない。間違いなく信頼できる唯一のイベントの順番は、Begin イベントが、対応する End イベントの前に発生することのみで、たとえば、commandWillStart() は常に commandEnded() の前に発生し、beginInsert() は常に endInsert() の前に発生する。より複雑な順番を信頼すると、将来新しい通知が採用されたり、既存の通知が整理し直された結果としてその順番が変更されたときに、アプリケーションに問題が発生する可能性がある。
  2. 通知の間の関数呼び出しの順番を信頼しない。
    • 特定の関数が特定の通知の間に呼び出されることは保証されていない。たとえば、オブジェクト A に対して :vlr-erased 通知を受け取ると、それはすべてオブジェクト A が削除されることを意味する。A に対する :vlr-erased 通知の後に B に対する :vlr-erased 通知を受けると、それはすべてオブジェクト A と B の両方が削除されることを意味し、常に A の後に B が削除されることが保証されているわけではないため、アプリケーションを順番を前提として拘束すると、将来のリリースでアプリケーションが正常に動作しない可能性が非常に高くなる。順番を信頼するのではなく、システムの状態を知らせるリアクタを信頼するように作っていること。
  3. リアクタ コールバック関数の中で対話関数を使用しない(たとえば、getpoint 関数や entsel 関数を使用しない)。
    • リアクタ コールバック関数の中から対話関数を実行しようとすると、イベントが発生した時点で CAD がコマンドの処理を続けても、重大な問題が起こることがありえる。したがって、getpoint、entsel、getkword などのユーザ入力取得関数、選択セットの操作や command 関数を使用するのは避ける必要がある。
  4. イベント ハンドラの中からダイアログ ボックスを起動しないこと。
    • ダイアログ ボックスは対話関数とみなされ、CAD の現在の操作に干渉する場合がある。しかし、メッセージ ボックスや警告ボックスは、対話関数とはみなされず、問題なく実行できる。
  5. イベントの通知を呼び出すオブジェクトを更新しないこと。
    • オブジェクトにコールバック関数を起動させるイベントが実行中の可能性があり、コールバック関数が呼び出されたときに CAD で使用している可能性がある。したがって、同じオブジェクトに対してコールバック関数からオブジェクトを更新しないようにすること。ただし、イベントを発生するオブジェクトから情報を問題なく読み込むことはできる。たとえば、タイルで敷き詰められたフロアの境界にリアクタをアタッチするとして、フロアのサイズを変更するとリアクタ コールバック関数が自動的に追加または取り去られて新しい領域にタイルが敷き詰められる。関数は新しい境界の領域を読み込むことはできるが、境界のオブジェクト自体に対する変更を行うことはできない。
  6. 同じイベントを起動するコールバック関数からはアクションを実行しないこと。
    • 同じイベントを発生するリアクタ コールバック関数からアクションを実行すると、無限のループを作成することになる。たとえば、BeginOpen イベント内から図面を開こうとすると、CAD は開いた図面の最大数に達するまでさらに図面を開き続けてしまう。
  7. リアクタを設定する前にリアクタがないことを確認すること。
    • そうしないと、同じイベントに対して複数のコールバックを呼び出すことになってしまう。
  8. CAD がモーダル ダイアログを表示している間は、いかなるイベントも引き起こされないことを覚えておくこと。

AutoLISP の一時リアクタと不変リアクタ

作成できるリアクタには、一時リアクタ(既定)と不変リアクタの 2 つのタイプがある。 一時リアクタは、図面を閉じると失われ、不変リアクタは、図面とともに保存され、次回図面を開いたときにも存在する。

不変リアクタを作成または除去するには、次の関数を使用することができる。

  • vlr-pers - リアクタを不変リアクタにする例
(vlr-pers circleReactor)
#<VLR-Object-Reactor>
  • vlr-pers-list - 現在の図面内のすべて不変リアクタのリストまたは特定のタイプの不変リアクタのリストを返す例。
(vlr-pers-list)
(#<VLR-Object-Reactor> #<VLR-Object-Reactor> (#<VLR-Object-Reactor>)

(vlr-pers-list :VLR-DWG-Reactor)
nil
  • vlr-pers-p - リアクタが不変リアクタかどうかを調べる例
(vlr-pers-p circleReactor)
 #<VLR-Object-Reactor>
  • vlr-pers-release - リアクタを一時リアクタにする例。
(vlr-pers-release circleReactor)
#<VLR-Object-Reactor>