Mayaツール開発入門!コマンド調査テクニック

はじめまして。COYOTE 3DCG STUDIO TAのやまたくです。

今回は簡単なツール開発を行いながらコマンド調査のテクニックを解説します。

私が初めてツールを作成した時、
「コマンドの調べ方がわからない!!」
と困っていたので、これからツール作成を始める方のお役に立てれば嬉しいです。

想定読者

  • ツール作成に興味があり、MEL,Pythonを始めたばかりの方
  • ツールを作ってみたいが、どうやって作ればいいか分からない方

特に、「コマンドの調べ方がわからない!!」という点を中心に解説します。

作成するツール

依頼者から、
「アセットのエクスポート、インポートを楽にできるようにしたい」
と要望を頂きました。UIにエクスポートボタン、インポートボタンがあれば良いそうです。

完成イメージ

file
それではさっそく、ツール制作に移って行きましょう!

制作の流れ

  • 作業手順確認
  • 技術検証
  • ツール作成
  • ツールの改良

作業手順確認

依頼者にどのような手順でエクスポート、インポートしているのかを確認します。

  • オブジェクトを選択し、File>Export Selection。 デフォルト設定のまま書き出し。
  • File>import 読み込み。
    Remove duplicate shading networks にチェック
    Maerge into selected namespace and rename incoming objects that match にチェック

では次に作業手順をコードに落とし込めるのか技術検証をしていきます!

技術検証

①Mayaでコマンドを実行、Script Editorで確認

File>Export Selectionコマンドを実行すると、
Script Editor上半分の履歴ペインに下記のコマンドが表示されます。

file -force -options "v=0;" -typ "mayaBinary" -pr -es ""保存先パス"";

Script Editor下半分の入力ペインに先ほどのコマンドをコピペします。

file
上図、水色の文字列(file)がMaya独自のコマンドです。

②fileコマンドをドキュメントで確認

Maya独自のコマンドをドキュメントで確認します。
help>MEL command help を開く。
file

検索フォームに「file」と入力。
fileコマンドのドキュメントページが出てきました!
file

先ほどのMELコマンドのfile以下に「-」がついている文字列は「フラグ」です。
次はドキュメントからfileコマンドのフラグを確認します。

③フラグの意味を一つずつ確認

  • -force:
    アクションを強制的に実行させます。

  • -options:
    現在設定されているファイル オプションを設定/照会します。

  • -type(-typ):
    このファイルのタイプを設定します。

  • -preserveReferences(-pr):
    このようなリファレンスがコピーとしてではなく、実際のリファレンスとして読み込み/書き出しされるように、さまざまな読み込み/書き出しフラグを変更します。

  • exportSelected(-es):
    選択したオブジェクトを指定したファイルに書き出します。

試しにFile>Export Selectionのオプションを開き、
「Preserve references」のチェックを外して書き出すと、
-prフラグがなくなっていることが確認できました。

ん? 「include Options」のHistory等のフラグが見当たりませんが、
反映されているのでしょうか?
確認していきます。
file
今度は「include Options」のチェックを全て外して書き出してみます。

file -force -options "v=0;" -typ "mayaBinary" -pr -es ""保存先パス"";

結果は先ほどの書き出しコマンドと同じでした。

では、チェックを外したまま書き出しコマンドを実行してファイルを開いてみます。

History、Textureがない状態で書き出されています。
どうやら、「include Options」のフラグを調べて追加してあげる必要がありそうです。

④include Options フラグを追加

fileコマンドのフラグを確認していきます。
「include Options」の一つである「History」で文字列検索してみましょう。
file

-constructionHistory というフラグが見つかりました!

  • -constructionHistory(-ch):
    exportSelected と一緒に使用し、アタッチされたコンストラクション ヒストリを書き出しに含めるかどうかを指定します。

先ほどの書き出しコマンドに-chを追加して、ヒストリが含まれるか確認します。

せっかくですので、Pythonコマンド化して実行してみましょう!
MELからPythonへのコマンド変換はこちらの記事に詳細が書かれています。

超初心者向け、MelからPythonへのコマンド変更方法

cmds.file(""保存先パス"", force=True, options="v=0;", typ="mayaBinary", pr=True, es=True, ch=True)

ヒストリ付きでの書き出しができました!
では同様に他のフラグも追加していきましょう!

  • -channels(-chn)
  • -expressions(-exp)
  • -constraints(-con)
  • -shader(-sh)

Pythonコマンドは下記の様になります。

cmds.file(""保存先パス"", force=True, options="v=0;", typ="mayaBinary", pr=True, es=True, ch=True, chn=True, exp=True, con=True, sh=True)

⑤importを検証

まずはFile>importをデフォルト設定で実行し、コマンドを確認します。

file -import -type "mayaBinary" -ignoreVersion -ra true -mergeNamespacesOnClash false -namespace "hoge" -options "v=0;p=17;f=0" -pr -importTimeRange "combine” “保存先パス”;

次に、

  • 「Remove duplicate shading networks 」にチェック
  • 「Maerge into selected namespace and rename incoming objects that match」 にチェック

再度File>importを実行します。

file -import -type "mayaBinary" -ignoreVersion -ra true -rdn -mergeNamespacesOnClash true -namespace ":" -options "v=0;p=17;f=0" -pr -importTimeRange "combine" “保存先パス”;

コマンドの差分を抽出すると、下記の様になりました。

  • -rdn
  • -mergeNamespacesOnClash true -namespace ":"

先ほどと同じ手順で、コマンドのフラグを確認していきましょう!

⑥フラグの意味を一つずつ確認

  • -import:
    指定したファイルを読み込みます。

  • -type(-typ):
    このファイルのタイプを設定します。

  • -ignoreVersion:
    正式にサポートされているバージョンより前または後のバージョンのファイルを開くために使用します。

  • -renameAll(-ra):
    true の場合、既存のノードとクラッシュする名前のノードだけでなく、新たに作成されたすべてのノードの名前を変更します。

  • -removeDuplicateNetworks(-rdn):
    これを設定すると、読み込まれたネットワークと同じネットワークが現在のシーンで検出された場合に、読み込まれたネットワークを除去します。

  • -mergeNamespacesOnClash:
    mergeNamespacesOnClash が true の場合、既存の「ref」というネームスペースは再利用されて pSphere1 はこの既存のネームスペースに移動されます。このネームスペースに「pSphere1」という名前のオブジェクトがさらにある場合、読み込まれたものは数字が増分され(「pSphere2」)名前変更されます。

  • -namespace:
    読み込みと参照中に、すべてのオブジェクトをグループ化するために使用されるネームスペース名です。

  • -options:
    現在設定されているファイル オプションを設定/照会します。

  • -preserveReferences(-pr):
    このようなリファレンスがコピーとしてではなく、実際のリファレンスとして読み込み/書き出しされるように、さまざまな読み込み/書き出しフラグを変更します。

  • -importTimeRange:
    タイム レンジを読み込み、文字列によって指定される 3 つの異なる方法のうちの 1 つの方法で Maya の再生範囲に適用するために使用します。

今回は設定の変更が反映されている様なので、
importコマンドをPythonへ変換して実行してみましょう!

cmds.file(""保存先パス"", i=True, type="mayaBinary", ignoreVersion=True, ra=True, rdn=True, mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0", pr=True, importTimeRange="combine")

想定通りにimportが行われました!

設定をデフォルトに戻したり、様々なファイルをimportして動作確認を行います。

おや?デフォルト設定に戻すと「removeDuplicateNetworks」が機能しなくなってしまいました。

⑦原因を調査

「removeDuplicateNetworks」が機能しなくなった原因を調査していきたいと思います。
調査する際のコツは、機能した時としなかった時の差を比較することです。

デフォルトとの差は何か…、

  • 「Remove duplicate shading networks」にチェック

  • 「Maerge into selected namespace and rename incoming objects that match」 にチェック

では「Remove duplicate shading networks」に再びチェックを入れ、
File>importコマンドを実行します。

「removeDuplicateNetworks」が機能しました!
どうやらチェックのON,OFFに関係がありそうです。

「removeDuplicateNetworks」フラグの説明を注意深く確認します。

  • -removeDuplicateNetworks(-rdn):
    optionVar removeDuplicateShadingNetworksOnImport を 0 に設定すると(またはファイル > オプションの読み込み(File > Import options)から重複したシェーディング ネットワークの除去(Remove duplicated shading networks)オプションを無効にする)、このフラグによる削除からシェーディング ネットワークが除外されます。

この文言が怪しそうです。

どうすればoptionVarの値を取得できるのでしょうか?

分からないことはWEB検索をします。「maya optionVar 取得」などで検索してみます!

弊社のブログがありましたので読んでみます。

Melのglobal変数とoptionVarでメニューの値を保存

なるほど、optionVar -q "名前”で取得できるようです。取得してみましょう!

optionVar -q "removeDuplicateShadingNetworksOnImport"

「Remove duplicate shading networks 」にチェックなし, 0
「Remove duplicate shading networks 」にチェックあり, 1 が帰ってきました。

import直前に、
optionVar "removeDuplicateShadingNetworksOnImport”を1にして実行するように変更します。

optionVarに整数を入れたい場合、
optionVar -iv "名前" 整数;
と入力します。Python化して実行してみましょう!

cmds.optionVar(iv=('removeDuplicateShadingNetworksOnImport', 1))

cmds.file(""保存先パス"", i=True, type="mayaBinary", ignoreVersion=True, ra=True, rdn=True, mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0", pr=True, importTimeRange="combine")

想定通りにimportが行われました!
問題なさそうなので、技術検証の次はツールの作成に取り掛かります!

ツール作成

①UI作成

UIの作成についてはまだでしたので、作成方法を調べておきたいと思います!

WEBで「maya python UI」「maya mel UI」などと検索します。

ボタン2つのUIは下記のスクリプトで生成できます。

toolWindow = cmds.window(title="toolWindow")
cmds.columnLayout(adjustableColumn=True, parent=toolWindow)
cmds.button(label="Export", command="export関数()")
cmds.button(label="Import", command="import関数()")
cmds.showWindow(toolWindow)


cmds.buttonの「command」フラグで自作関数を呼び出せます。

UIについては、ボタンの間隔が近く操作しづらいので、スペースとサイズ調整をします。
windowコマンド、columnLayoutコマンド、buttonコマンドのフラグを一つずつ確認していき、
目的に合いそうなフラグを試していきます。

探した結果、
columnLayoutの「rowSpacing」フラグ、
buttonの「height」フラグを使用しました!

toolWindow = cmds.window(title="toolWindow")
cmds.columnLayout(adjustableColumn=True, rowSpacing=5, parent=toolWindow)
cmds.button(label="Export", command="export関数()", height=40)
cmds.button(label="Import", command="import関数()", height=40)
cmds.showWindow(toolWindow)

file

②エクスポート、インポート関数作成

技術検証したコマンドを関数化します!

(保存先は仮で"C:/Windows/Temp/ExportImportObjects.mb”を指定)

def exportObjcts():
    cmds.file("C:/Windows/Temp/ExportImportObjects.mb", force=True,
    options="v=0;", typ="mayaBinary", pr=True, es=True,
    ch=True, chn=True, exp=True, con=True, sh=True)

def importObjcts():
    cmds.optionVar(iv=('removeDuplicateShadingNetworksOnImport', 1))

    cmds.file("C:/Windows/Temp/ExportImportObjects.mb", i=True,
    type="mayaBinary", ignoreVersion=True, ra=True, rdn=True,
    mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0",
    pr=True, importTimeRange="combine")

③UIと関数を合体

UIと関数を合体させてMaya上で確認します!

toolWindow = cmds.window(title="toolWindow")
cmds.columnLayout(adjustableColumn=True, rowSpacing=5, parent=toolWindow)
cmds.button(label="Export", command="exportObjcts()", height=40)
cmds.button(label="Import", command="importObjcts()", height=40)
cmds.showWindow(toolWindow)

def exportObjcts():
    cmds.file("C:/Windows/Temp/ExportImportObjects.mb", force=True,
    options="v=0;", typ="mayaBinary", pr=True, es=True,
    ch=True, chn=True, exp=True, con=True, sh=True)

def importObjcts():
    cmds.optionVar(iv=('removeDuplicateShadingNetworksOnImport', 1))

    cmds.file("C:/Windows/Temp/ExportImportObjects.mb", i=True,
    type="mayaBinary", ignoreVersion=True, ra=True, rdn=True,
    mergeNamespacesOnClash=True, namespace=":", options="v=0;p=17;f=0",
    pr=True, importTimeRange="combine")

ボタンを押すとエクスポートとインポートが行われました!

まだまだ不十分な箇所はありますが、依頼者に確認してもらいます!

ツールを改良

ツールは作成したら終了ではありません。
使ってもらいながら不便な所を継続して改良していかなければ、
「せっかく作ったのに使われていない…」と言う結果になってしまいます。
(ツールを継続的に改良する大切さはこちらの記事でも紹介しています)

Photoshop内製ツール紹介『CRPS_指定ファイル保存』

本ツールも意見をもらいながら改良していき、現在は下記の様になりました。
file file

  • アセットを数種類読み込みたいので、ボタンを追加。
  • 何をエクスポートしたか分からなくなるので、ボタンラベルにオブジェクト名を表示。
  • エクスポートのパターンとして、
    「選択したオブジェクトをrootに置きたい」場合と
    「階層はそのままで良い」場合があるのでエクスポート設定を追加。

簡単ではありますがツール制作の流れは以上です。

コマンド調査テクニック補足

●Maya上で調べる

①Script Editorを開きコマンドを実行。

  • ポイント1.一度undoしてコマンドを確認。
  • ポイント2.ヒストリ>すべてのコマンドをエコー(history>Echo All Commands)にチェックを入れる。

詳細記事はこちら→表示されないMelコマンドを知る方法:初心者編

②コマンドをドキュメントで確認。
フラグや一番下の例からコマンドを理解していきます。

–ドキュメントを検索しても見つからない場合…

③whatIs “検索したいコマンド” でMELスクリプトパスが出てくるので、
MELソースコードを確認。

詳細記事はこちら→表示されないMelコマンドを知る方法:中級編

–「Run Time Command」と出た場合

④Windows>settings/preferences>Hotkey Editorを開き、コマンドを検索。
新たなコマンドを見つけたら②「ドキュメントで確認」
これを繰り返していけばコマンドの正体が見えてきます!

詳細記事はこちら→表示されないMelコマンドを知る方法:追加編

●WEB検索する

ドキュメントを読んだが不明な箇所があれば、WEB検索をして分かりやすい解説を探します。

●既存のツールから学ぶ

既存のツールのコードから多くを学ばさせて頂いてます。
下記リンクは私が参考にさせて頂いているサイトです。
CG自習部屋 Mayaの時間
3D人-3dnchu-
MODELING HAPPY
HIGHEND3D
UnitBus
MayaEmbeddedLanguage-note

おわりに

今回は、TAになりたての頃、
「このコマンドってどうやって調べるんだ?」「ドキュメントが見当たらない…」
などコマンドの調べ方で困っていたのでそれを中心に解説させて頂きました!

私も未熟ですが、これからTAを目指される方にこの記事が助けになれば嬉しく思います。


COYOTE 3DCG STUDIO

公式HP:https://3d.crdg.jp/

COYOTE 3DCG STUDIOはクリーク・アンド・リバー社が運営するゲーム専門3DCG制作集団です。
キャラモデル、背景モデル、3Dアニメーション、テクニカルアーティストによるツール開発などを得意としています。
新規立ち上げにおけるコンサルティングから量産制作まで幅広く対応可能な体制を保有しており、出向にも柔軟に対応しております。


yamamoto takuya

COYOTE 3DCG STUDIO ツール作成・パイプライン系TA。
Maya, Photoshop, Unityのツール開発やサーバー管理を行っています。
Qtを使ったUI作成が好きです。
老後は猫と暮らしたい。

投稿者記事

  1. 【SVN】SVNコミットとChatworkを連携!

    2024-07-30

  2. 【PySide】QToolButton ボタン色が反映されない解決法

    2024-05-28

  3. 【Photoshop】起動時にスクリプトを実行する方法

    2023-08-29

  4. 【PySide】QtDesignerでDrag and DropできるWidget設定

    2023-06-28

関連記事

  1. Filedialog設定で変わる!? FBX Export挙動の話

    2023-12-07

  2. Substance 3D Painter PythonAPI をつかってみよう

    2022-08-31

  3. Mayaのリファレンス機能、
    ちゃんと理解して使えば怖くない!
    -前編-

    2021-12-21

  4. 処理負荷検証の話

    2022-12-14

スキルレーダーチャート

テクニカルアーティスト専用
スキルレーダーチャート
どなたでも無料でご利用いただけます。

ABOUT

TECH COYOTE​

テクニカルアーティストの為のまとめサイトです。​
本サイトでは、ツール開発、業務効率化等について情報発信をしていきます。

COYOTE 3DCG STUDIO

C&R Creative Studios

難易度別

RECENT TWEET

ページ上部へ戻る