Mayaのシェルフアイコンをクリックで変更してみた

クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチームの好きな武将は真田信之、戦国大好き人間の中林です。

今回はコロンブスの卵的な内容ですが、Mayaのシェルフアイコンをクリックやリアルタイムで変更してみたので、その時の苦労した点などをまとめてみます。
※今回の内容はMaya2017を元に編集してます。シェルフのタブの内容に関してはバージョンで変化します。

blob.jpg

そもそものキッカケは?

ことの始まりはアーティストがツールがオンのつもりで作業をしていたら、実はオフだったというミスが多発しているとの相談でした。単純にこれだけなら僕の経験から「ヘッドアップディスプレイ」に情報出すやツールの情報をウィンドウを作るなどの幾つかの腹案はありました。
しかし、アーティストの何気ない一言で運命が変わりました。「分かりやすい場所で表示されればなんでも良いよ。例えばシェルフとかでも」
シェルフアイコンって簡単に変えられたっけと思いつつ、見たことがなかったので試して見ることにしました。

実はクリックして切り替えるだけだったら簡単

僕自身はシェルフなんてメニューから「Ctrlキー+Shiftキー+左クリック」で登録するかmelの起動コマンドを放りこむか、とMayaの機能で作ってました。
なのでMelからシェルフを登録した経験はありませんでした。
それでも、すぐにshelfButtonコマンドが見つかりました。

shelfButton -p "シェルフの格納タブ" -image1 "アイコン画像" 
            -c "アイコンを切り替える処理" "任意のボタン名"; 
shelfButton -e -image1 "切り替えたいアイコン" "任意のボタン名";

これだけでmelからシェルフに登録できました。-commandや-doubleClickCommandなどでクリックをしたら実行する処理にアイコンの入れ替える命令を入れるのなら慣れていいる人には簡単です。
シェルフの格納タブも以下のグローバル変数とコマンドで見つかりました。

global string $gShelfTopLevel;  // Maya標準機能
tabLayout -q -childArray $shelfTabLayout;
 CurvesSurfaces
 Polygons
 Sculpting
 Rigging
 Animation
 Rendering
 FX
 FXCaching
 Custom
 Arnold
 Bifrost
 MASH
 MotionGraphics
 XGen

どこかで見た名前がズラッと並んでるので、カスタムどころか好きなタブに入れたい放題です。
これだけで、もうアイコンをクリックするだけで切り替わるシェルフアイコンは完成です。
ここまでは余裕でいったので、この日は気分良く帰れました。

……そして、翌日Mayaを起動した時に悪夢が始まりました。
当然のように、登録したシェルフアイコンをクリックしても切り替わりませんでした。
ここからは苦労した2点を紹介します。

1・切り替わらない原因

スクリプトエディタを見ると"任意のボタン名"が見つからないとエラー表示されました。登録したアイコンは確かにそこにあるのに!!

shelfLayout -q -childArray "シェルフの格納タブ"

実はこちらの命令でタブ内のボタンの名前が返ってくるのですが結果が「shelfButton2(状態によって変化)」と見慣れない名前が……
結論からいうとシェルフアイコンのボタン名はMayaを開くたびに自動生成をされてしまうことです。
それじゃ、この「shelfButton2」を使えば良いかというとそうは問屋は降ろさない。この名前はシェルフタブを開いた瞬間に決まるとです。
例えば
➀カスタムタブにシェルフのアイコンを登録
➁ポリゴンタブに変更してMayaを終了
➂起動時はポリゴンタブが開いている
➃この段階で名前を見るとポリゴンタブのシェルフアイコンだけに名前が順番に割り振られる。
 この段階では開いてないタブには名前がついていない。
➄カスタムタブに変更した時点で登録したシェルフに名前が付けられる。
そう、Mayaを起動するたびに名前が変わるどころかシェルフタブを強制的に開かないとシェルフボタンの名前が作られないです。

個人的にはシェルフアイコンを-label付きで登録、その時にoptionVarコマンドにシェルフタブ名を保存。必要な時に無理やりシェルフタブを開いて-labelから逆算してボタン名を取得するようにしました。

2・Mayaを落とした時に特定のアイコンに戻す

デフォルトのままだとMayaを落とした時に表示されたシェルフアイコンが次回の起動時に表示されます。
仮にオン状態の時にMayaを再起動すると、オンで見張るべきツールは立ち上がってないけど表示がオンと矛盾してしまいます。
僕個人で使う分にはoptionVarと「userSetup.mel」を組み合わせて起動時にオンオフ状態とツール同期させることはできます。
ただ不特定多数のアーティストさんに「userSetup.mel」を配布して設定してもらうのは現実的ではありません。
やはり、Mayaを落とした時にオフ状態にしていくのが分かりやすいと方法を調べました。

scriptJobコマンドを調べるとeventに都合の良いイベントがあります。
quitApplication:ユーザが、MEL コマンドの quit、または終了(Exit)メニュー項目を使用して、終了を選択したとき

scriptJob -event "quitApplication" "shelfButton -e -image1 \"オフのアイコン\"" "ボタン名";

早速、こちらを使って上記のscriputJobを作りましたがボタンがオフのアイコンに変わってくれません。
悩んだ末に"quitApplication"が効いているのかscriputJob -listJobsコマンドでMayaのデフォルト機能で使っているものを参考にしようと探しました。

XXX:  "-event" "quitApplication" "muButtonCleanUp"
XXX:  "-parent" "scriptEditorPanel1" "-event" "quitApplication" "removeScriptEditorPanel scriptEditorPanel1";

使っている命令は2点だけでしたが収穫は大でした。
なにげに『scriptEditor』はscriputJobで落として次の起動時には表示されないようにしてたんですね。脇道ですが興味深かったです。
で、もう1つのmuButtonCleanUpコマンドですが普通に実行するとシェルフボタンの情報をshelvesフォルダ内に保存してます。
scriptJobは末尾に追加されてるので「シェルフボタンの保存⇒シェルフボタンの変更」の順番に処理をされるのでオフアイコンへの変更を保存できませんでした。

scriptJob -event "quitApplication" "shelfButton -e -image1 \"オフアイコン\"" "ボタン名";
scriptJob -event "quitApplication" "muButtonCleanUp";

なので、シェルフボタンの変更の後ろに改めて登録することで無事にMayaを落とすたびにオフアイコンにすることができました。

この2点を抑えれば、melに詳しい人ならクリックするたびにシェルフアイコンが変わるボタンを作ることはできると思います。

シェルフのアイコンが変わるメリット

今までは簡単な2択のツールでもボタンのオンオフを付けたUIを作ってました。これをUIなしで実行できる上に実行状態か簡単に分かるようになります。
他にもMaya2016以前ではプリファレンスを開かないと確認が難しかった時間のfps設定の確認がアイコンを複数用意することで、いつでも確認できるように作ることが可能です。
シェルフのアイコンを変えるシステムは様々な可能性を秘めています。

今回、最も重要だったこと

シェルフアイコンのクリック切り替え自体は最初に書いた通りにアイデアを見つければ誰でも実行できるコロンブスの卵です。
では、見つけたのは僕ですか? いいえ、キッカケはアーティストの一言です。そうです、今回のシェルフアイコンを変化させるというアイデアはアーティストとのコミュニケーションから見つかったものです。
テクニカルアーティストとして重要なことは、アーティストとどれだけ密にコミュニケーションをとって要望を引き出し見逃さないかだ、と今回の件で改めて思いました。

Author: 中林 伸和