MayaAPIのすゝめ 第4稿
MayaAPIのすゝめ 第4稿
みなさんお久しぶり。4回目のMayaAPIのすゝめです。
コマンドサンプル書くのがめんどくさかったので
前回から間が開いてしまいましたがようやくAPIのコマンド実装について触れていきたいと思います。
以前にも触れましたが基本的にMayaAPIで実行した処理は元に戻すの待ち行列に入らないので、コマンド化してUndo処理とRedo処理を自分で書いてやらないといけません。
まずは最低限で記述した簡単なサンプルで解説したいと思います。
※API1.0でも同様にかけますが今回はAPI2.0での実装となります。
↓こちら
こちらを.pyファイルとして
C:\Users\[ユーザ名]\Documents\maya\plug-ins
に置くとカスタムコマンドとしてMayaに認識されます。(ない場合は自分でフォルダ作成)
成功すればプラグインマネージャに現れますのでロードしてください。
さてこのコマンド、まずはちゃんと動くか試してみましょう。
実行コマンドは
cmds.testCommand(w=list, nm=bool)
です。
試しに複数のバリエーションの引数でちゃんとアンドゥできるか実験です。
履歴が一つにまとまらないように一行ずつ実行してみてください。
cmds.testCommand(w=[0, 0, 0], nm=True)
cmds.testCommand(w=[1, 1, 1], nm=False)
cmds.testCommand(w=[2, 2, 2], nm=True)
redoItに記述したprint文が出力されます。
では3回Undoしてみましょう。
正しく逆順でundoItのprint文が出力されました。
ばっちりですね。
コマンド登録や引数の与え方はサンプル書き換えで簡単にできると思いますが、処理の実行系統がわかりにくいのでちょっと解説しておきます。
処理実行時に呼び出されたコマンドは今回の実装の場合
・doIt(実行関数の呼び出し)
↓
・parseArguments(引数を解析してクラスのメンバ変数に格納)
↓
・redoIt(クラスのメンバ変数を参照して処理実行)
となっています。
重要なのはparseArgumentsでメンバ変数に格納しておくというところで、
Undo時は undoIt(self)
Redo時は redoIt(self)
のみが1回だけ呼び出されます。
この時に保有しているメンバ変数の値で実行されるようにしておくと正しくUndo/Redoできるようになります。
次回はコマンドを利用してウェイトエディタにUndo/Redoを実装していきたいと思います。
SIウェイトエディタでは引数として渡せない値の通信や処理の高速化のためにUI側のメンバ変数やグローバル変数のデータを利用してます。
Undo/Redo時にUIに値の反映するのはスクリプトジョブ使ってたり。
正直めっちゃめんどくさいです。
その辺の解説も(できれば)交えていきたいですね。
ではでは今回はこの辺で、アディオスアミーゴ。