Q100385: Pythonを使用して Katana でコールバックとイベントハンドラーを登録し、ユーザーのアクションに基づいてカスタム機能を追加する方法

まとめ

この記事では、 Katanaでコールバックまたはイベント ハンドラーを登録する方法を説明し、使用可能なコールバックとイベントの種類、およびそれらのコールバック関数に予想される入力引数に関する情報がどこで見つかるかについて詳しく説明します。
コールバックとイベントに関するドキュメントは、 Katana開発者ガイドにも記載されています。以下の記事では、それらの実装方法の実践的な例をいくつか紹介します。

詳細情報

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

イベントとは、マウスのクリックやキーの押下など、ユーザーの操作やその他のソースの結果として発生するアクションです。イベントハンドラーは、イベントを処理するために使用されるルーチンであり、プログラマーはイベント発生時に実行されるコードを記述できます。

コールバックは特定の状況 (ファイルを保存する直前など) で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)

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


これらの引数には、次のようにコールバック関数内でアクセスできます。

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

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

イベントハンドラ

Katanaには、登録されたハンドラーがリッスンできる様々なイベントタイプがあります。利用可能なすべてのイベントタイプのリストを表示するには、Pythonタブで次のコマンドを実行してください。

 from Katana import Utils
print ( sorted ( Utils . EventModule . GetAllRegisteredEventTypes ()))

各イベントタイプにどのような入力引数が存在するかを確認するには、特定のイベントに対して以下のハンドラを登録します。イベントがトリガーされると、ハンドラは引数を出力します。以下は、「node_create」イベントタイプの入力引数を出力する例です。

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

Utils.EventModule.RegisterEventHandler(node_CreateCallback, 'node_create')


入力引数が分かれば、イベントハンドラ関数内で使用できます。以下は、ユーザー設定の変更をリッスンし、設定名と新しい値を出力するように登録できるイベントハンドラの例です。

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起動時にコールバックまたはイベント ハンドラーを自動的に登録できます。

  • コールバックまたはイベント ハンドラー関数で実行するすべてのアクションを 1 つの 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 であり、.txt などではないことを確認するためです。

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


KATANA _RESOURCESの詳細については、 Katanaインストール ガイドの対応するトピックを参照してください。

Katana次回起動されると、指定されたアクションが発生したときにコールバック関数が実行され、関連するイベントがキューに追加され処理されたときにイベントハンドラー関数が実行されます。上記の例では、設定が変更されたとき、またはKatanaプロジェクトが読み込まれたときに、新しい設定値またはプロジェクトファイルパスがターミナルに出力されます。

さらなる支援

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

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


サポートチケットを開く方法の詳細については、 Q100064「サポートチケットの発行方法」を参照してください。

    私たちはそれを聞いて申し訳ございません

    理由をお聞かせください