2023/12/14 訂正を追記
addCheckCallback と addCheckFileCallback の部分で、API2.0 の方だとエラーが出て処理されないと書いていましたが、自分がドキュメントをきちんと読めておらず、コールバックで実行する関数内で return True or False が書かれていれば問題なく処理が行われました。
addCheck ~ と関数名にもある通り、読み込みや書き出し前のチェックで使うためのコールバックで、そこで実行される関数内で任意のチェック処理を入れ、そこで問題があった場合に return False をすることで処理しようとしていた読み込みや書き出しを中断する事ができるようにする仕組みでした。
この記事は Maya Advent Calendar 2020 の19日目の記事です。
明日も自分の記事で「【Maya/Python】MayaからUVアニメーションをUnityへエクスポートする」です。
今回は OpenMaya API 2.0 の MSceneMessage クラスにある様々なコールバックのタイミングについてまとめていきます。
maya.cmds にある scriptJob と似たようなものですね。
ちなみに今年の2月にも MSceneMessage を使った「【Maya/Python】インポート時に追加されたノードを選択状態にする」という記事も書いていますのでご興味あればご覧下さい。
MSceneMessage についての公式のリファレンスページはこちらです。
検証に使っているのはMaya2019です。
MSceneMessage の基本的な書き方としては
import maya.api.OpenMaya as om2
om2.MSceneMessage.addCallback(message, function, clientData=None)このような感じです。
Callback関数に必要な各引数は下記のようなものです。
message
>リファレンスの Static Public Attributes のところに書かれているものを指定します。
これにより、 message によってどのタイミングで実行したいか決めれます。
※関数によっては指定しないものもあります。
function
>messageで指定したタイミングで実行したい関数を指定します。
clientData
>初期値が None と設定されているので必ずしも何かをセットする必要はありません。
例えば、1つの関数を異なるタイミング(message)で共有する場合に、
clientData にそれぞれ別のデータをセットして処理を変えたりできます。
om2.MSceneMessage.addCallback(om2.MSceneMessage.kBeforeOpen, addCallbackFunc, ”aaaa”)
om2.MSceneMessage.addCallback(om2.MSceneMessage.kAfterOpen, addCallbackFunc, "bbbb")
def addCallbackFunc(*args):
for i in range(len(args)):
print("args[%s] : %s : %s"%(i, args[i], type(args[i])))
if type(args[i]) is list:
for x in args[i]:
print(x)
例えば、この関数をセットしたとすると、シーンを開いたときにScriptEditorには
args[0] : aaaa : <type 'str'>
args[0] : bbbb : <type 'str'>
と表示されます。
このようにコールバックにセットする第三引数の clientData にセットしたものが渡されます。
addCallback() はclientDataしか渡されませんが、他のデータも渡されるものもあります。
●OpenMaya.MSceneMessage.addCallback()
●OpenMaya.MSceneMessage.addCheckCallback()
※Maya2019で試しましたが、maya.api.OpenMaya (API 2.0) の方だとなぜかエラーが出て
コールバック時にセット関数が処理が処理されないので maya.OpenMaya (API 1.0) で試しています。
※ 呼び出す関数側で、任意のチェック処理を入れてエラーだったら return False, そうでなければ return True を返す必要があります。
・「ファイル > 新規シーン」でシーンを開いた場合のコールバック
kBeforeNewCheck
・「ファイル > 読み込み」で読み込んだ場合のコールバック
kBeforeImportCheck
・「ファイル > シーンを開く」でシーンを開いた場合のコールバック
kBeforeOpenCheck
・「ファイル > シーンを保存」などで保存した場合のコールバック
kBeforeSaveCheck
・リファレンスエディターで「リファレンスの作成」を行った場合のコールバック
kBeforeCreateReferenceCheck
・リファレンスエディターでOFFからON(Load)した場合のコールバック
kBeforeLoadReferenceCheck
・「ファイル > 選択の書き出し」などでファイルを出力した場合のコールバック
kBeforeExportCheck
●OpenMaya.MSceneMessage.addCheckFileCallback()
※Maya2019で試しましたが、maya.api.OpenMaya (API 2.0) の方だとなぜかエラーが出て
コールバック時にセット関数が処理が処理されないので maya.OpenMaya (API 1.0) で試しています。
※ 呼び出す関数側で、任意のチェック処理を入れてエラーだったら return False, そうでなければ return True を返す必要があります。
●OpenMaya.MSceneMessage.addCheckReferenceCallback()
・リファレンスエディターでOFFからON(Load)した場合のコールバック
kBeforeLoadReferenceCheck
★第一引数は MObject、第二引数は MFileObject が渡されます。
●OpenMaya.MSceneMessage.addConnectionFailedCallback()
シーンファイルを読み込んだ際に接続できなかったノード(MPlug)があったり、競合する接続があった場合のコールバック
こちらは他と異なり、message 部分を入力しません。
om2.MSceneMessage.addConnectionFailedCallback(function, clientData=None )
例えば、このコールバックを設定していると、
Mental ray のプラグインが Maya 2018 以降なくなったため、
古いバージョンのMayaのシーンファイルを最近のバージョンで読み込む際にこれが呼ばれます。
●OpenMaya.MSceneMessage.addReferenceCallback()
・リファレンスエディターで「リファレンスの作成」を行った場合のコールバック
kAfterCreateReferenceAndRecordEdits
・リファレンスエディターでONからOFF(Unload)した場合のコールバック
kBeforeUnloadReference
kAfterUnloadReference
・リファレンスエディターでOFFからON(Load)した場合のコールバック
kBeforeLoadReference
kBeforeLoadReferenceAndRecordEdits
kAfterLoadReference
kAfterLoadReferenceAndRecordEdits
・リファレンスエディターで「リファレンスの除去」を行った場合のコールバック
kBeforeRemoveReference
・リファレンスエディターで「ファイル > リファレンスからオブジェクトを読み込み」を行った場合のコールバック
kBeforeImportReference
★第一引数は MObject、第二引数は MFileObject が渡されます。
●OpenMaya.MSceneMessage.addStringArrayCallback()
・プラグインをロードする場合のコールバック
kBeforePluginLoad
★第一引数は list が渡されます。(プラグイン名)
kAfterPluginLoad
★第一引数は list が渡されます。(list[0] プラグインパス と list[1] プラグイン名)
・プラグインをアンロードする場合のコールバック
kBeforePluginUnload
★第一引数は list が渡されます。(プラグイン名)
kAfterPluginUnload
★第一引数は list が渡されます。(list[0] プラグイン名 と list[1] プラグインパス)※ kAfterPluginLoadと逆
コメントをお書きください