yslog

ゆるめに技術ブログかきます。Maya_Python

MayaAPIのすゝめ 第4稿

MayaAPIのすゝめ 第4稿

みなさんお久しぶり。4回目のMayaAPIのすゝめです。

コマンドサンプル書くのがめんどくさかったので

前回から間が開いてしまいましたがようやくAPIのコマンド実装について触れていきたいと思います。

以前にも触れましたが基本的にMayaAPIで実行した処理は元に戻すの待ち行列に入らないので、コマンド化してUndo処理とRedo処理を自分で書いてやらないといけません。

まずは最低限で記述した簡単なサンプルで解説したいと思います。

※API1.0でも同様にかけますが今回はAPI2.0での実装となります。

↓こちら

MayaAPI2.0のコマンド作成サンプル

こちらを.pyファイルとして

C:\Users\[ユーザ名]\Documents\maya\plug-ins

に置くとカスタムコマンドとしてMayaに認識されます。(ない場合は自分でフォルダ作成)

f:id:ys_45:20190512230229p:plain

成功すればプラグインマネージャに現れますのでロードしてください。

f:id:ys_45:20190512230444p:plain

さてこのコマンド、まずはちゃんと動くか試してみましょう。

実行コマンドは

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)

f:id:ys_45:20190512231225p:plain

redoItに記述したprint文が出力されます。

では3回Undoしてみましょう。

f:id:ys_45:20190512231522p:plain

正しく逆順でundoItのprint文が出力されました。

ばっちりですね。

コマンド登録や引数の与え方はサンプル書き換えで簡単にできると思いますが、処理の実行系統がわかりにくいのでちょっと解説しておきます。

処理実行時に呼び出されたコマンドは今回の実装の場合

・doIt(実行関数の呼び出し)

parseArguments(引数を解析してクラスのメンバ変数に格納)

・redoIt(クラスのメンバ変数を参照して処理実行)

となっています。

重要なのはparseArgumentsでメンバ変数に格納しておくというところで、

Undo時は undoIt(self)

Redo時は redoIt(self)

のみが1回だけ呼び出されます。

この時に保有しているメンバ変数の値で実行されるようにしておくと正しくUndo/Redoできるようになります。

 

 

次回はコマンドを利用してウェイトエディタにUndo/Redoを実装していきたいと思います。

SIウェイトエディタでは引数として渡せない値の通信や処理の高速化のためにUI側のメンバ変数やグローバル変数のデータを利用してます。

Undo/Redo時にUIに値の反映するのはスクリプトジョブ使ってたり。

正直めっちゃめんどくさいです。

その辺の解説も(できれば)交えていきたいですね。

 

ではでは今回はこの辺で、アディオスアミーゴ。