表示されないMelコマンドを知る方法:中級編

クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチームの敵か味方か迷う武将といえば松永弾正、戦国大好き人間の中林です。

過去のブログ「Mel スクリプトエディタに表示されないコマンドを知る方法:初心者編」よりも少し踏み込んだ内容になります。
また、この記事は僕が現時点の作業でよく使っているMaya2018が基準になってます。Mayaバージョンによってはアドレスや行数、Melの内容が変わることをご了承ください。

スクリプトエディタで入手できるコマンドは3種類

スクリプトエディタで入手できるコマンドには実は大別して3つの種類があります。これはwhatIs コマンドで確認できます。
1・Command
2・Mel スクリプト
3・Run Time Command
1は下記のコマンドリファレンスに載っている、いわゆる生のコマンドです。lsやらselectやらで普通に使っている事が多いとおもいます。
http://help.autodesk.com/cloudhelp/2020/JPN/Maya-Tech-Docs/Commands/
しかし、2と3は実は僕たちがMelコマンドを組み合わせて組んでいるMelと同じで、Mayaから提供されているMelで組まれたスクリプト群です。

whatIsコマンドでアドレスが出るスクリプト

説明がしやすいので先に『Mel スクリプト』の説明をします。
Lambertシェーダーを作った時のcreateRenderNodeCB -asShader "surfaceShader" lambert ""をwhatIsコマンドで試してみます。

whatIs createRenderNodeCB;
// 結果: Mel procedure found in: C:/Program Files/Autodesk/Maya2018/scripts/others/createRenderNode.mel // 

このアドレスから辿って分かる通りmelファイルです。さらにファイルを開くと分かりますがMelコマンドを並べたスクリプトです。
最近はPythonのツールが少し増えてきましたが、それでも基本的にMayaはMelコマンドでできてます。
実際に解析してみるとMelコマンドでこんな使い方もあるのかと新発見することも多いです。

whatIsコマンドで『Run Time Command』が出るコマンド

ハイパーシェードを開くコマンドでwhatIs HypershadeWindow;を実行すると『Run Time Command』と表示されます。
実はこの『Run Time Command』もMelとして解析できます。
C:\Program Files\Autodesk\Maya2018\scripts\startup\defaultRunTimeCommands.mel
このMelファイルを開いてHypershadeWindowで検索かけるとtearOffRestorePanel ~のコマンドで実行されてると分かります。
これをwhatIsコマンドで試すと

whatIs tearOffRestorePanel;
// 結果: Mel procedure found in: C:/Program Files/Autodesk/Maya2018/scripts/startup/tearOffRestorePanel.mel // 

とアドレスを辿ってMelファイルを知ることができます。
なので『Run Time Command』もちゃんと解析すればMelコマンドで組まれたスクリプトと分かります。

スクリプトエディタで表示されるけど、されてないコマンド

僕がアーティストに頼まれて作るツールで良く上がる要望は最後にデータをきれいにするために未使用ノードの削除をして欲しいとあります。
これはハイパーシェードの「編集>未使用ノードの削除(Edit > Delete Unused Nodes)」を実行して入手したコマンドがこちらになります。
hyperShadePanelMenuCommand("hyperShadePanel1", "deleteUnusedNodes")
もちろん、これをスクリプトエディタで実行しても未使用ノードが消えるので間違えではありませんが”hyperShadePanel1″という文字列が気になります。正直、パネルの名前がバージョンによって変わる可能性は否めません。
なので、whatIsコマンドでさらに詳しく調べると

whatIs hyperShadePanelMenuCommand;
// 結果: Mel procedure found in: C:/Program Files/Autodesk/Maya2018/scripts/others/hyperShadePanel.mel // 

hyperShadePanel.melをdeleteUnusedNodesで検索かけると6836行目にMLdeleteUnused;と書いてあります。このを実行しても未使用ノードを消せます。
スクリプトエディタでhyperShadePanelMenuCommand("hyperShadePanel1", "deleteUnusedNodes")と表示されるけど、MLdeleteUnused;と表示されてないコマンドが影にあることが分かります。
前者でも後者でも処理は同じですが後者の方が無意味に変数を渡す必要がないのでスッキリしてます。だから、僕は後者を使っています。

whatIsコマンドをどこまで掘り下げるか

whatIs MLdeleteUnused;
// 結果: Mel procedure found in: C:/Program Files/Autodesk/Maya2018/scripts/others/MLdeleteUnused.mel //

実はMLdeleteUnused;もwhatIsコマンドで掘り下げれば内容が分かります。ただこちらは処理が複雑で無理にこれから処理を最小化をする必要は無いと思ってます。
ただし、処理によっては実は簡単だった例もありますし、自分の中では予想外のフラグや変数の使い方をしている場合もあります。
参考になるmelスクリプトが5000弱ファイルもあるの、たまにはwhatIsでコマンドを調べてスクリプトエディタに表示されないコマンドを掘り下げて知るのもありだと思います。

ちなみに、初心者編と中級編と続きましたが上級編はありません。書いている僕自身が道半ばの中級者なので上級編は書きようがありません(爆)
ただし、TAを続けているとハイポリモデルの頂点ウェイトの移植などのMelだけでは処理の重い作業が出てきます。その時に処理を軽くするためにPythonやC++でMelコマンドの中身を解析し始める事が上級者への入り口だと思ってます。

オレはようやくのぼりはじめたばかりだからな。このはてしなく遠いMaya坂をよ……。

Author: 中林 伸和