サポートチケットを作成する
フォローする

Q100385:カタナのコールバックとイベントハンドラ

概要

この記事では、Katanaでコールバックまたはイベントハンドラを登録する方法について説明し、利用可能なコールバックとイベントタイプ、およびそれらのコールバック関数に必要な入力引数に関する情報の入手先について詳しく説明します。
コールバックとイベントのドキュメントはKatana開発者ガイドにもあります。以下の記事では、それらがどのように実装されているかについていくつかの実用的な例を示します。

詳しくは

コールバックはKatana環境に追加されたPythonコードの一部で、さまざまなイベント(ノードの作成やスクリプトのロードなど)がKatanaで発生したときに自動的に実行されます。

イベントは、ユーザーの操作、またはマウスのクリック、キーの押下などの他の原因の結果として発生する操作です。 イベントハンドラは、 イベントを処理するために使用されるルーチンであり、プログラマはイベントが発生したときに実行されるコードを書くことができます( https://www.computerhope.com/jargon.htmからの定義)。

コールバックは特定の状況(例えばファイルを保存する直前)でKatanaによって引き起こされ、呼び出しコードは続行する前にコールバックが実行されるのを待ちます。例えばユーザーがプロジェクトを保存する前に変更することを可能にします。

逆に、イベントはKatanaのイベントシステムによってキューに入れられ、「後で」処理されます。つまり、コールバックはより即時的ですが、通常は非常に高速である必要があります。そうしないと、動作中にUIがフリーズする危険性があります。

コールバックとイベントハンドラはどちらも、新しいKatanaプロジェクトを作成するときにプロジェクト設定を変更したり、特定のノードパラメータの値の変更に対応したりするなど、さまざまな状況で役立ちます。

コールバック

Katanaでは、コールバックは、起動中のソフトウェア、ロード中のKatanaプロジェクト、作成中のノードなど、さまざまな状況で使用できます。利用可能なコールバックの全リストを見るには、Pythonタブで以下のコードを実行してください。

from Katana import Callbacks
print dir(Callbacks.Type)


どのキーワード引数が各コールバックタイプに渡されるかを調べるために、呼び出されたときに入力引数を出力する次のコールバックを登録できます。

def Hello(**kwargs):
    for i in kwargs.keys():
        print i


これらの引数は、コールバック関数内でアクセスすることができます。たとえば、次のようになります。

def Hello(**kwargs):
   print(kwargs.get('filename'))

from Katana import Callbacks Callbacks.addCallback(Callbacks.Type.onSceneLoad, Hello)

イベントハンドラ

Katanaには、登録済みハンドラーがlistenできるさまざまなイベントタイプがあります。利用可能なすべてのイベントタイプのリストを見るには、Pythonタブで以下を実行してください。

import Utils.EventModule
print Utils.EventModule.GetAllRegisteredEventTypes()

各イベントタイプにどの入力引数が存在するかを調べるには、特定のイベントに対して次のハンドラを登録します。イベントが発生すると、ハンドラは引数を出力します。

def eventHandler(eventType, eventID, **kwargs):
    for i in kwargs.keys():
        print i


入力引数がわかったら、イベントハンドラ関数内で使用できます。以下は、ユーザー設定の変更を監視するために登録することができ、設定の名前とその新しい値を出力するイベントハンドラの例です。

def PrefChangedCallback(eventType, eventID, prefKey, prefValue):
    print prefKey, "preference changed to:", prefValue

Utils.EventModule.RegisterEventHandler(PrefChangedCallback, 'pref_changed')

ノードパラメータ変更のイベントハンドラ

たとえば、イベントハンドラ関数が特定のノードパラメータの変更にのみ反応する必要がある場合は、「 parameter_finalizeValue 」イベントを監視するように登録できます。変更されたパラメータの名前は、それが関連するものかどうかを判断するためにハンドラ関数内でチェックすることができます。

def myParamCallback(eventType, eventID, node, param):
    if (node.getName() == "CameraCreate") and (param.getName() == 'fov'):
        print("FOV for the following camera changed to " + repr(param.getValue(0)) + ": " + node.getParameter('name').getValue(0))

Utils.EventModule.RegisterEventHandler(myParamCallback, "parameter_finalizeValue")

イベントハンドラは、必ずしもイベントがキューに入れられた直後に実行されるわけではありません。何らかのコードが特定のイベントの処理とイベントハンドラの実行に依存している場合は、次の呼び出しが必要になることがあります。

Utils.EventModule.ProcessAllEvents() 


コールバックとイベントハンドラの詳細については、Katana開発者ガイドのコールバックとイベントのセクションも参照してください。

Katanaの起動時にコールバックまたはイベントハンドラを登録する


Katanaの起動時に、コールバックまたはイベントハンドラは次のように自動的に登録されます。

  • コールバックまたはイベントハンドラ関数に単一のPython関数で実行させたいすべてのアクションを定義し、以下のコード例に示すようにこれを登録します。

from Katana import Utils, Callbacks

def PrefChangedCallback(eventType, eventID, prefKey, prefValue):
    print prefKey, "preference changed to:", prefValue

Utils.EventModule.RegisterEventHandler(PrefChangedCallback, 'pref_changed')
def Hello(**kwargs): print(kwargs.get('filename'))
Callbacks.addCallback(Callbacks.Type.onSceneLoad, Hello) 

  • これをコピーしてテキストエディタに貼り付け、ファイルを保存します。

  • このとき、ファイルの名前をinit.pyに変更し、ファイル拡張子が.pyで異なることを確認するために、ファイルの拡張子がファイルブラウザに表示されるようにします。

  • $ KATANA_RESOURCES環境変数で定義されたパスの下の.katanaフォルダーまたはStartupフォルダーにファイルを配置します。


KATANA _RESOURCESの詳細については、 Katanaオンラインヘルプの対応するトピックを参照してください。

次にKatanaが起動されると、指定されたアクションが発生したときにコールバック関数が実行され、関連するイベントがキューに入って処理されたときにイベントハンドラ関数が実行されます。上記の例の場合、設定が変更されるか、またはKatanaプロジェクトがロードされると、新しい設定値またはプロジェクトファイルパスがそれぞれ端末に出力されます。

さらなる助け


コールバックまたはイベントハンドラの設定で問題が発生した場合は、サポートチケットを開いて、これまでに行った問題とトラブルシューティングの手順についてお知らせください。


サポートチケットを開く方法の詳細については、 Q100064:サポートチケットの引き上げ方法を参照してください。

この記事は役に立ちましたか?
/

We're sorry to hear that!

Please tell us why.
2人中2人がこの記事が役に立ったと言っています

コメント