【Maya/Python】OpenMaya API2.0 の MSceneMessage クラス内のコールバックタイミング解説

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()

・「ファイル > 新規シーン」でシーンを開いた場合のコールバック
    kBeforeNew
    kAfterNew
・「ファイル > 読み込み」で読み込んだ場合
    kBeforeImport
    kBeforeFileRead
    kAfterFileRead
    kAfterSceneReadAndRecordEdits
    kAfterImport
・リファレンスエディターで「リファレンスの作成」を行った場合
    kBeforeCreateReference
    kBeforeCreateReferenceAndRecordEdits
    kBeforeFileRead
    kAfterFileRead
    kAfterSceneReadAndRecordEdits
    kAfterCreateReference
    kAfterCreateReferenceAndRecordEdits
・リファレンスエディターでOFFからON(Load)した場合
    kBeforeLoadReference
    kBeforeLoadReferenceAndRecordEdits
    kBeforeFileRead
    kAfterFileRead
    kAfterSceneReadAndRecordEdits
    kAfterLoadReference
    kAfterLoadReferenceAndRecordEdits
・リファレンスエディターでONからOFF(Unload)した場合のコールバック
    kBeforeUnloadReference
    kAfterUnloadReference
リファレンスエディターで「リファレンスの除去」を行った場合
    kBeforeRemoveReference
    kAfterRemoveReference
・「ファイル > 選択の書き出し」などでファイルを出力した場合
    kBeforeExport
    kExportStarted
    kAfterExport
・「ファイル > シーンを保存」などで保存した場合のコールバック
    kBeforeSave
    kAfterSave
・リファレンスエディターで「ファイル > リファレンスからオブジェクトを読み込み」を行った場合のコールバック
    kBeforeImportReference
    kAfterImportReference
・「ファイル > シーンを開く」でシーンを開いた場合のコールバック
    kBeforeOpen
    kBeforeFileRead
    kAfterFileRead
    kAfterSceneReadAndRecordEdits
    kAfterOpen
・レンダービューで使用するレンダラが「Mayaソフトウェア」になっている状態でレンダリングを行った場合のコールバック
    kBeforeSoftwareRender
    kBeforeSoftwareFrameRender
    kAfterSoftwareFrameRender
    kAfterSoftwareRender
・シーケンスレンダー中にEscキーで中断した場合のコールバック
    kSoftwareRenderInterrupted
・アウトライナーから右クリックメニューの「リファレンス > 選択項目をリファレンスとして書き出す」を行った場合のコールバック
    kBeforeExport
    kBeforeExportReference
    kExportStarted
    kAfterExportReference
    kAfterExport
・Mayaを起動した場合のコールバック
    kMayaInitialized
・Mayaを終了した場合のコールバック
    kMayaExiting

 

●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 を返す必要があります。

・「ファイル > 読み込み」で読み込んだ場合のコールバック
    kBeforeImportCheck
・「ファイル > シーンを開く」でシーンを開いた場合のコールバック
    kBeforeOpenCheck
・「ファイル > 選択の書き出し」などでファイルを出力した場合のコールバック
    kBeforeExportCheck
・リファレンスエディターで「リファレンスの作成」を行った場合のコールバック
    kBeforeCreateReferenceCheck
・リファレンスエディターでOFFからON(Load)した場合のコールバック
    kBeforeLoadReferenceCheck
★API1.0の場合は第二引数、API2.0の場合は第一引数に MFileObject が渡されます。

●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と逆