株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 【Maya】特定のタイミングで処理を実行する仕組み

【Maya】特定のタイミングで処理を実行する仕組み

2016/3/28

Tag: ,,

こんにちわ、開発部の齊藤です

Mayaを使用している中で、特定のタイミングで実行したいという時があると思います
(例えば、”New Scene”をした後、”Save Scene”をする前、”Open Scene”した後などのタイミングに特定の処理を入れたい!)
そんな時に使える仕組みとプラグインの作り方を紹介します

MSceneMessageを使ってみる

Mayaには、シーンに何か処理をしたタイミングで実行して欲しい関数を登録する仕組みがあります
この仕組を利用するのに使うのが、MSceneMessageクラスです

まずはサンプルを動かしてみましょう
このサンプルは、”New Scene”をした後に、”After New Callback”を出力するというものです
下記のコードを、dftalk_scnmsg.pyで保存して下さい

from maya.OpenMaya import MSceneMessage


DF_AFTER_NEW_CALLBACK_ID = None


def after_new_callback(client_data):
    print '-'*10
    print "After New Callback"
    print "ClientData: %s" % client_data
    print '-'*10


def initializePlugin(mobject):
    global DF_AFTER_NEW_CALLBACK_ID
    DF_AFTER_NEW_CALLBACK_ID = MSceneMessage.addCallback(
        MSceneMessage.kAfterNew,
        after_new_callback,
        "after new client_data")

def uninitializePlugin(mobject):
    if not DF_AFTER_NEW_CALLBACK_ID is None:
        MSceneMessage.removeCallback(DF_AFTER_NEW_CALLBACK_ID)

dftalk_scnmsg.pyがある場所に環境変数:”MAYA_PLUG_IN_PATH”を設定して、Mayaを起動します
次に、Plug-in Managerから”dftalk_scnmsg.py”をロードします

これで準備が出来たので、”New Scene”を実行して下さい
“Script Editor”を開いて、下記の内容が表示されていれば成功です

----------
After New Callback
ClientData: after new client_data
----------

サンプルコード解説

今回の仕組みで重要なのが、特定のタイミングで実行して欲しい処理をMayaに登録する部分です
これは、プラグインがロードされたタイミングで実行される”initializePlugin”関数で行っています
今回の場合は下記の部分となり、登録には”MSceneMessage.addCallback”関数を使います

DF_AFTER_NEW_CALLBACK_ID = None

# --- <省略> ---#

def initializePlugin(mobject):
    global DF_AFTER_NEW_CALLBACK_ID
    DF_AFTER_NEW_CALLBACK_ID = MSceneMessage.addCallback(
        MSceneMessage.kAfterNew,
        after_new_callback,
        "after new client_data")

MSceneMessage.addCallback関数は3つの引数があります

addCallback(message, function, clientData=None)
・message: 呼び出すタイミング
・function: 呼び出したい関数
・clientData: 呼び出す関数に渡すデータ

呼び出すタイミングについて、今回は”New Scene”の後に呼び出して欲しいので、”MSceneMessage.kAfterNew”を指定しています
他の種類では、”New Scene”でシーンがクリアされる前に実行する”kBeforeNew”、シーンを開いた後に実行する”kAfterOpen”などがあります。詳しくはドキュメントを参照して下さい

呼び出したい関数は、指定したタイミングで実行される関数を指定します
最後の呼び出す関数に渡すデータは、ここで入力したデータが、実行される関数の引数に入ってきます。何か処理を変えたりなどに使えます

MSceneMessage.addCallback関数は、登録した際のIDを返します
プラグインをアンロードする際に、登録したコールバックは削除する必要があります。IDはこの削除に必要な為、必ず覚えておく必要があります
コールバックを削除する処理は、プラグインをアンロードした際に呼ばれる”uninitializePlugin”関数で行います

def uninitializePlugin(mobject):
    if not DF_AFTER_NEW_CALLBACK_ID is None:
        MSceneMessage.removeCallback(DF_AFTER_NEW_CALLBACK_ID)

コールバック削除には、”MSceneMessage.removeCallback”関数を使います
引数に登録したコールバックのIDを指定する事で、プラグインが登録したコールバックは削除されます
今回のサンプルプラグインをアンロードした後に”New Scene”をすると、プラグインが出力していた文字列が出なくなっているのを確認出来ます

最後

今回の仕組みを用いる事で、特定のタイミングで何か処理をしたいという事を、実装出来るようになりました
また、Pythonで書けるのでMayaのバージョンによってビルドし直す必要がありません

この利点を使って、例えば、シーンを開いたタイミングで、”開いたシーンファイルのパスを特定のファイルに追記する”
という仕組みを作れば、”最近開いたファイル”というのをMayaのバージョン間や複数PC間で共有化する事が出来ます
保存する前のタイミングを使えば、保存前にデータをチェックして、何か違反が有れば警告を出すという事が出来ます
このように様々な応用が考えられ、効率化をする仕組みの幅が広がるかと思います

ということで、特定のタイミングで何か処理をする仕組みを紹介しました
これがよりよい効率化に繋がればと思います


※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*