CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. スクリプト
  5. 最新Mayaワークグループ設定について
SUITE USERS NOTES
【GTMF2014ネタ】;最新Mayaワークグループ設定について
(Maya 2014、2015)
A new way to set WORKGROUP in Maya

Maya_03_01
プロローグ;Prologue
GTMF2014講演ネタになります。

その後の運用で、どうもシェリフだけは Maya.env で運用した方が都合が良いんじゃないかということで、
そこの部分だけは講演時と少し変えてお伝えしたいと思います。
シェリフだけはなんか扱いが難しいみたいなんです・・・。

ワークグループの設定...についてなので、多少 TA プログラマー向けかの内容かな とも思われますが、
プロジェクトの中で誰かがツール群や開発環境の管理運営をしなければならないので、
その時、Mayaの ワークグループの設定 についてまとまった情報があると
とっても重宝するのではないかと思われます。
きっと、そのことに直面しているツール管理者にとっては願っても無いページになることでしょう!

ただし、ここで紹介している Module設定の機能 は Maya2013以降のものです。
これから新しいMayaバージョンで ワークグループを作り直すぞ!
って時にご覧になると良いかもしれません。

なお、このサイトに掲載している事例の決まり事ですが、
使用に関しては自己責任でよろしくお願い申し上げます。
(Maya2014、2015で動作確認)

Only Japanese , at the moment. If you want this page to be in English
please Tweet or Mail me hard ^ _^ ;;

 >Maya開発環境の悩み事
 >MAYA_MODULE_PATH について
 >MODULE設定が出来る事
 >MODULE設定の利点
 >MODULE設定が出来ない事
 >Mayaワークグループ設定;相関図
 >① 解説 Maya.env
 >② 解説 Pro1_Toolset.mod >③ 解説 userSetup.py
 >④ 解説 Project01_MAYA2015_Startup.py
 >Module設定で配信したツール環境例;Python
 >QT Designer ;Python
 >あとがき

Windows7 Professional 64Bit、Intel Core i7-3930K(3.20GHz,6コア/12スレッド)
メモリ16GB、NVIDIA GeForce GTX560 Ti 2GB(メモリ2GB)



Maya 開発環境の悩み事
それではまず、 Maya の開発環境を管理運営していて、直面しているであろう悩み事から
求める Maya ワークグループについて考えていきたいと思います。思いあたるところありますでしょうか。

複数のプラットフォームで Maya を動かしている
これは、 Maya が Windows64bit / Windows32bit / Mac / Linux で動いているわけですから、
それぞれに対応が必要になるということになります。

複数のプロジェクト用ツールを同時作成している
大きな会社さんではツールを専門に作っている部署が、会社全体用の共通ツールの配信とプロジェクト単位で配信しているツールを
同時に提供する場合もあるだろうし、小さなチーム単位でツールを作っている場合でも、グループ間で共通ツールや各個人専用ツールの
管理配信を同時にしているかも知れません。
またはその混合で、会社全体の専門チームツールと各個別ローカルツールも、更にアウトソーシング用ツールもあるかも知れませんね。

異なる Maya のバージョン用のツールがある
上記とも関連しますが、同時に動いているプロジェクトが異なる Maya バージョンをベースにしている など考えられます。

PYTHONPATH の設定問題を簡単に解決したい
PCの環境設定に PYTHONPATH が設置してある場合、 Maya.env に記述した PYTHONPATH は無視される、
という大きな問題を解決する最も簡単な方法はなんなのか、と悩んでいたりします。
非常に長いMelプログラムや Python からの Path 追加設定やバッチファイルで Maya を起動する、などが例としてありますが・・。
(誰が見ても解りやすく、簡単に設定・修正出来る共通ルールに基づいた設定が欲しいということです)
gtmf2014_040
これらの問いに関して、1つのアンサーになればと考えて書いているページになります。

では早速その答えになりそうな 最新 Maya ワークグループ設定の仕組みをご紹介していこうと思います。



MAYA_MODULE_PATH について
最新 Maya ワークグループ設定では、 MAYA_MODULE_PATH という Maya の環境変数を使います。
ドキュメントでは、次のような記述があります。

MAYA_MODULE_PATH (日本語ドキュメント)
http://help.autodesk.com/view/MAYAUL/2015/JPN/?guid=Environment_Variables_File_path_variables

Maya モジュール ファイルへの検索パスを定義します。
モジュールファイルには、モジュールとして配布されているプラグインのインストール場所が記述されています。
Maya ではこのインストール場所のサブディレクトリを、パス変数である
MAYA_PLUG_IN_PATH、MAYA_PRESET_PATH、MAYA_SCRIPT_PATH、PYTHONPATH、および XBMLANGPATH に付加します。

という記述はあるのですが、具体的な運用例、詳細な説明は記載されていません。
もう少し追求してみましょう。

MAYA_MODULE_PATH は MayaV6.0(2003)以前からある古い環境変数(Environment Variables)です。
配布型のプラグインなどを Maya に認識させる変数として使用されてきました。

しかし、実は、この変数は Maya2013 において、すっごい変化が起こっているのです。

  その新しく機能が追加された MAYA_MODULE_PATH について、改めて出来る事を解説していきます。



■MODULE設定が出来る事

一括で \scripts \plug-ins \icons \presets のパスを設定する
これは、ドキュメント通りです。例えば、 Maya.env に以下のように書いていた部分が、もっと簡単に設定出来ます。

MAYA_SHELF_PATH = %MAYA_WORKGROUP1%\2015-x64\shelves
MAYA_SCRIPT_PATH = %MAYA_WORKGROUP1%\2015-x64\scripts;
MAYA_PLUG_IN_PATH = %MAYA_WORKGROUP1%\2015-x64\plug-ins;
PYTHONPATH = %MAYA_WORKGROUP1%\2015-x64\python;
XBMLANGPATH =%MAYA_WORKGROUP1%\2015-x64\icons;
           
MAYA_SHELF_PATH = %MAYA_WORKGROUP1%\2015-x64\shelves
MAYA_MODULE_PATH = %MAYA_WORKGROUP1%\Project01\Modules
gtmf2014_041

複数の設定が可能
MODULE設定 は、幾つでも設定出来ます。
会社やプロジェクト全体で使うツール群と各人の個別ツール群などを一緒に設定できます。
また、 userSetup.py (Mel) Maya が起動時に検索した最初のファイルしか認識しないのですが、
そのことも踏まえてうまく活用出来ます。

設定ファイルは共有ディレクトリー/パスに置いて管理できる
MODULE設定の書かれたファイルは単なるテキストファイルです。
このファイルを配布ツール用のサーバとは別の共有ディレクトリーに置くことで、
ツール管理者同士は書き込み修正できるように設定出来ます。
もちろん一般のユーザーには MODULE設定ファイルを操作して欲しくなければ、
書き込み権限を設定すれば良いだけです。

Mayaのバージョン、OS(Bit)、言語毎にパスを設定できる
MODULE設定に書いておけば、 Maya を起動した時点で、
Maya のバージョン、 Maya を起動したパソコンのOSの種類、Mayaの言語 毎に環境変数や参照パスやを再設定できます。
Mayaの言語は、英語/日本語/簡体字中国語を認識し、
例えば同じツール群なのに、説明文だけ各国に応じた文章になる等が実現できます。(もちろんツールの中身も変えられますが)

ツール群の配布/受け取りを楽にする
ツール群がまるまる入ったディレクトリー構造を1つの圧縮ファイルにして配布/受け取りを行い、
あとは MODULE設定 ファイルの設置とMaya.env /userSetup.py (Mel)に多少の設定を記述すれば
インストールは完了です。
アウトソーシングする先にツール環境を提供する場合も、外部から依頼で先方と同じ環境を構築する場合でも、
ぐ~んと楽になるはずです。


同じような事を述べるのですが、視点を変えて、
今度は開発環境について総合的な判断をする方(例えばテクニカル・ディレクターへの説明として、
MODULE設定についての利点を述べる、というかたちで以下に再度まとめてみました。



■MODULE設定の利点 >> TDへの説明?

MODULE用の設定ファイルの内容は解りやすい >> 管理しやすい
  • 大掛かりで複雑な Melプログラムよりはるかにユーザーフレンドリー、決まった書き方で誰でも理解しやすい。
    特定の人しか解らないようなことにはしない。(誰々が居ないと解りません状態を無くす)
目的やインストール場所に合わせてすぐに追加設定 >> カスタマイズが楽
  • 環境変数やパスの変更・追加をいとも簡単に設定出来る。
    一時配信停止や試験やリトライをやりやすくする。(時間が無い時こそ柔軟な設置機能が必要)
ユーザーパス以外からのインストールを可能にする >> ツール群の配信/受け取りが簡単
  • ツール管理者の用意したツール群と各ユーザーが個人的に設定しているツール間の関連性を良くする。
    ヘビー Maya ユーザーさん程、 userSetup.py (Mel)にたくさんの設定を既にしているので、
    その機能をツール配信者が奪ったり、制限したりすればユーザーは不自由になってしまいます。
  • ツール群の入ったディレクトリー構造一式を1ファイルに圧縮し、解凍したディレクトリーを MAYA_MODULE_PATH に指定すればインストールは完了する。
    共同開発は当たり前なので、ツール環境の共通化も出来て当たり前、を簡単に実現できる。

    出来ない事もちゃんと把握することで、目的達成をやりやすくしましょう。



■MODULE設定が出来ない事

Mayaが見に行く場所を追加しているに過ぎない
  • MODULE設定有効/無効そして追加という記述なので、差し引いたり、特別な選別機能を持たせたりは出来ない。
起動コードや認証を自動的に行う訳ではない
  • パスを通したり、環境変数を追加したりすることだけしかできないので、何かを起動したりプラグインを自動ロードしたりという対応はしない。
複数プロジェクト間で自動的な切り替えなどはできない
  • 複雑な条件分岐は出来ない。
    ただし、こうは出来る >> そもそも MODULE設定ファイルが置いてある場所の設定 Maya.env に記載がプロジェクト毎に違う。
自動的にパス設定しない例がある >>  Maya.env で設定)
  • OS依存のバイナリーパスの解決を行わない。(ライブラリーやDLLはOS側の設定)
  • メンタルレイの環境変数 MI_CUSTOM_SHADER_PATH,MI_LIBRARY_PATH は Maya.env での設定でとなっている。
    ただし、Maya自体のメンタルレイはモジュールによって設定しているので えっ!! と思う
    C:\Program Files\Common Files\Autodesk Shared\Modules\Maya\2015 の mentalray.mod です。
  • 追記で認識しない環境変数MAYA_SHELF_PATH
    プロローグにも書いた通り、シェリフのパスを通す事は出来るが、 Maya が起動時に認識しない。



Mayaワークグループ設定;相関図
MODULE設定ファイルを使用したワークグループ設定で、各ファイルの保存場所とその役割についての相関図です。

Maya が起動する時に認識していく順番が①→②→③→④です。

  1. 赤矢印①→②→は、環境変数を設定したりパスを通したりしているだけです。
    ピンクの点線矢印は、複数のModule設定を施した場合を示しています。

  2. 青矢印③→④ と、 実行されていきます。
gtmf2014_042
Maya.env は、ユーザーのディレクトリーの Maya のバージョンの下にあります。 (PC環境変数に MAYA_APP_DIR が設定されていればそのディレクトリーのバージョンの下)
具体的に言えば、Maya2015 で Windows7 64Bit の場合 C:\Users\ritaro\Documents\maya\2015-x64 内です。

ここでは Maya が最初に見つけた実行ファイル userSetup.py が、
ユーザーのディレクトリーのスクリプトの Path が通っている \2015-x64\ja_JP\prefs\scripts 内にあります。
(PCの環境変数に MAYA_APP_DIR が設定されていればそのディレクトリーバージョンの下の\ja_JP\ prefs\scripts 内)
具体的に言えば、Maya2015 の Windows7 64Bit でフォルトのユーザーのディレクトリーのスクリプトの通っている場所というのは、
C:\Users\ritaro(ユーザー名)\Documents\maya\2015-x64\ja_JP\prefs\scripts 内です。

Python でこれら関連するディレクトリーを取得する方法を紹介しておきます。(なにかと便利かも・・)

  • まず、Mayaのバージョン。
import maya.cmds as cmds

print(cmds.about(version=True))

# 結果: 2015 #


  • ユーザーのディレクトリーとMayaのバージョンの組み合わせで Maya.env の場所、userSetup.pyの場所
import maya.cmds as cmds
import os

print(os.environ.get('MAYA_APP_DIR'))
# 結果: C:/Users/ritaro/Documents/maya #

print(os.environ.get('MAYA_APP_DIR') + '/' + cmds.about(version=True) + '-x64/')
# 結果: C:/Users/ritaro/Documents/maya/2015-x64/ #

print(os.environ.get('MAYA_APP_DIR') + '/' + cmds.about(version=True) + '-x64/ja_JP/prefs/scripts')
# 結果: C:/Users/ritaro/Documents/maya/2015-x64/ja_JP/prefs/scripts #


  • スクリプトのパスが通っている場所は他にもたくさんあります。調べ方は
import maya.cmds as cmds
import os

print(os.environ.get('MAYA_SCRIPT_PATH'))
# 結果: F:/user_maya/Maya2015/scripts;
    C:/Users/ritaro/Documents/maya/2015-x64/ja_JP/prefs/scripts;
    W:/Maya/2015-x64/scripts;---


それでは、各番号毎①→②→③→④に設定ファイルの中身を解説していきます。



解説 Maya.env >> 相関図参照
PCのシステムの環境変数としてMAYA_WORKGROUP1 ,変数値 W:\Mayaというのが設定されている例です。

MAYA_SHELF_PATH = %MAYA_WORKGROUP1%\2015-x64\shelves
MAYA_MODULE_PATH  = %MAYA_WORKGROUP1%\Project01\Modules
ここにMODULE設定が施されています。

注目して欲しいのは、設定しているMAYA_MODULE_PATHは、ファイル名ではなく、ディレクトリー名である点です。
つまり、ここに複数のMODULE設定用のファイルを置くことが可能です。
もし、プロジェクト毎に設定する MODULE設定 を分けたい場合は、このディレクトリー名 を変更するしかないです。
ただ、そのディレクトリーの中には、幾つか他と同じファイルが置いてあってもかまわない、とは言えます。

そしてGTMF発表時には書いてなかったのですが、MAYA_SHELF_PATHが書いてあります。
シェリフだけはどうしても Maya.env に書いてあった方が都合が良いようです。
また、最初の行に書いてあった方が良いようです。複数の設定が既に書いてある場合でも、最初の行に記述してください。

  • シェリフについて
Mayaシェリフを単独では保存せず、既存のもの全部を保存する仕組みになっています。
シェリフを編集して保存しようとした場合、ワークグループのシェリフも保存対象になります。
もし、シェリフ に関して起動時や起動後に何らかのエラーが表示されていたら、
それはユーザー設定ファイルの記述に同名の シェリフ が複数登録されている、なんて現象かも知れません。
<編集は慎重に!!>
ユーザーのディレクトリーの prefs の下に userPrefs.mel というファイルがあり、shelfFile で検索をかけると
1906行目あたりに -sv "shelfFile1" "shelf_General" なんて番号と名前が登録されています。
ここに同じ名前が違う番号にも登録されていたら、大きい方の番号の行を削除してあげると直ることがあります。



解説 Pro1_Toolset.mod >> 相関図 参照
PCのシステムの環境変数としてMAYA_WORKGROUP1 ,変数値 W:\Mayaというのが設定されている例です。

+ MAYAVERSION:2014 PLATFORM:win64 Maya_toolset 1.0 ${MAYA_WORKGROUP1}\2014-x64
PYTHONPATH +:= python
ANIMTOOL_PLUGIN := plug-ins
PYTHONSTARTUP := python/Project01_MAYA2014_Startup.py
QTMENU := python/qtmenu
# [r] scripts: scripts

+ MAYAVERSION:2015 PLATFORM:win64 Maya_toolset 1.0 ${MAYA_WORKGROUP1}\2015-x64
PYTHONPATH +:= python
ANIMTOOL_PLUGIN := plug-ins
PYTHONSTARTUP := python/Project01_MAYA2015_Startup.py
QTMENU := python/qtmenu
# [r] scripts: scripts

おまたせしました!! MODULE設定用のファイル Pro1_Toolset.mod の中身です。

1つのファイルに幾つもの分岐条件を記述することが出来ます。
上記例では、同じモジュール名(例:Maya_toolset)が Mayaのバージョン毎に見に行くディレクトリーが変えてあるものになります。
実はもっと多くの条件で見に行く場所を変えることができます。
では、さっそく、その解説です。


+ MAYAVERSION:2015 PLATFORM:win64 Maya_toolset 1.0 ${MAYA_WORKGROUP1}\2015-x64

たった1行だけで、色々と面白い条件を設定出来ます。

+ MAYAVERSION:2015

★ Mayaのバージョン
+(有効)
-(無効)
注釈;Maya2013以降~
PLATFORM:win64

★ OS(bit)
PLATFORM:win32
PLATFORM:win64
PLATFORM:mac
PLATFORM:linux
LOCALE:ja_JP

★ ローカル言語
LOCALE:en_US(英語)
LOCALE:ja_JP(日本語)
LOCALE:zh_CN(簡体字中国語)
Maya_toolset 1.0 ${MAYA_WORKGROUP1}\2015-x64

★ MayaUI上に表示される MODULEの名前MODULEのバージョン番号、Mayaのバージョン毎のツール群へのパス

面白いのは最初の + - だけで有効/無効になることです。
何かツールサーバーのセットアップ中に、メンテナンスや修正が必要で今はユーザーにアクセスして欲しくない時、
ここを - にしておけばロードされません。

ローカル言語は、例えばUIが他の言語になるディレクトリーを見に行かせる という設定が出来ます。


続いてそれ以下の行の説明です。

PYTHONPATH +:= python
ANIMTOOL_PLUGIN := plug-ins
PYTHONSTARTUP := python/Project01_MAYA2015_Startup.py
QTMENU := python/qtmenu

この中で重要な1つは、PYTHONSTARTUPの行で、青矢印③→④ へとつながる流れを設定している部分です。

 Modules設定ファイル は Module内から 環境変数の設定をしている、と うすうす解って来ていると思います 。
Maya.env でも当然環境変数の設定をしています。
では、何が違うのでしょうか。

例えば既存のパスにこのワークグループ・ツール群内の /bin というディレクトリーを追加したい場合、
Maya.env では、以下のように書くと思いますが、

PATH=%PATH%;%MAYA_WORKGROUP1%\2015-x64\bin;

Modules設定ファイルの場合は 以下のように書きます。

 PATH+:=bin 

で、Modules設定ファイルの方がはるかに便利だ(柔軟だ)と気が付くでしょう。

=という記号が付いてる各行には、その前にも記号が付いていたりします。
この記号がとても大切な意味 を持っています。

=
単一変数設定 指定したパス値のみ
+=
既存変数に追加設定 既存パス値に指定パス値を追加
:=
Module内の変数で単一変数設定 Module内の指定パス値のみ
+:=
Module内の変数を追加設定 既存パス値にModule内の指定パス値を追加

一番良く使うのは下の2つです。

:= は、モジュール内のディレクトリーをその指定した環境変数にするという意味です。

例えば、 ANIMTOOL_PLUGIN という環境変数は MAYA_WORKGROUP1 2015-x64\plug-ins ということで、
もっと具体的に言えば MAYA_WORKGROUP1 W:\Maya と CP環境変数で設定していたので、
ANIMTOOL_PLUGIN W:\Maya\2015-x64\plug-ins というディレクトリーだ、と単一変数の設定をした事になります。

+:= は、おまちかね、 PYTHONPATH の行に書かれていますね。

既存の PYTHONPATH モジュール内のディレクトリーを追加しなさいという意味になります。
もっと具体的に言えば
W:\Maya\2015-x64\pythonというディレクトリーを既存のPYTHONPATH に追加した事になります。

なんと簡単で便利なことでしょうか!! たった3文字 +:= で、 PYTHONPATH 問題を解決してしまいました。


# [r] scripts: scripts

最後に1行残っています。今はコメントアウトしてありますが、# を外せば有効になります。

この [r] は、モジュール内のファイル *.mod が置いてある
ディレクトリー直下のサブディレクトリーもパス設定出来る という意味です。

もっと具体的に言えば、
Maya.env MAYA_MODULE_PATH
MAYA_WORKGROUP1 の \Project01\Modules と設定したので、
W:\Maya\Project01\Modules\scripts という場所の事です。
gtmf2014_043

※良い参考ファイルは・・
上記のような事が解ったような気分で、改めて インストール済みの メンタルレイ用 .mod設定ファイルを見ると、
MODULE設定の非常に良いサンプルになっていると気が付きます。ローカル言語分けも設定されています。
C:\Program Files\Common Files\AutodeskShared\Modules\Maya\2015\mentalray.mod です。(Maya2015版)



解説 userSetup.py    >> 相関図参照
Maya が最初に見つけた実行ファイル userSetup.py が、
ユーザーのディレクトリーのスクリプトのPathが通っている \2015-x64\ja_JP\prefs\scripts 内にあります。
Modules設定を付け加える為、以下のように記述されています。

import maya.cmds as cmds
import maya.mel as mel
import os

filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    exec(open(filename).read())

ここまで来て、ようやく Maya が実行するもの の説明になります。

userSetup.py にはユーザーさんが 既に何かを設定している場合もあるでしょう。
その使い勝手を ツール管理者 が奪ってはいけません。
何故なら、Maya は最初に発見した userSetup.py ファイル1つしか起動時に実行しないからです。貴重なんです。

そこで、下の3行だけ、追記のお邪魔をさせてもらいます。

ここでは、② 解説Pro1_Toolset.mod環境変数を設定した PYTHONSTARTUP に実行ファイルがあったら、それを実行しろ と書いてあります。

PYTHONSTARTUP の場所は Module設定ファイル Pro1_Toolset.mod で MayaのバージョンやOSやローカル言語毎に異なる場所が設定されます。
つまり、たった3行追記されるだけで、この実行ファイルは条件分岐先のものを実行します。

例として、Maya2015 を起動した場合、 PYTHONSTARTUP は、 W:\Maya\2015-64\Project01_MAYA2015_Startup.py と設定されます。



解説 Project01_MAYA2015_Startup.py    >> 相関図参照
ここで始めて用意しているツール群を準備設定をする実行ファイルが実行されます。
Project01_MAYA2015_Startup.py は、Mayaのバージョン毎の \python ディレクトリーにあります。( __init__.py も忘れずに ^_^;;)

Maya_03_02
この Project01_MAYA2015_Startup.py 実行ファイルについて解説します。

import maya.utils
import maya.cmds as cmds
import maya.mel as mel
import os

print "Project01 for MAYA2015"
print "Startup !!"
print "."
print "."

cmds.loadPlugin( (os.environ.get('ANIMTOOL_PLUGIN')) + '/*.py' )

import menu.Pro1_MainMenu
def SetPro1_MainMenu():
    menu.Pro1_MainMenu.ST_Pro1_MainMenu()
maya.utils.executeDeferred( SetPro1_MainMenu )

def setfps():
#    cmds.currentUnit( time='ntscf')
    cmds.currentUnit( time='ntsc')
    cmds.playbackOptions(min=1, max=100, ast=1, aet=100)
    cmds.currentTime(1)
maya.utils.executeDeferred( setfps )


最初の4つのプリント文はMayaが起動した時に最初に表示される白いウィンドー Output Window に表示されるものです。
(Mayaを起動した時、設定した正しい起動ファイルが読み込まれたのか確認することが出来ます。とても大事・・・)

ここで解る事は、Mayaのメイン画面が表示される はるか以前に、最速で実行されている、という事です。
つまり、次に解説する事なのですが、Mayaのメイン画面やGUIに関わるような機能をこの段階で用意しようとして実行しても、
まだMayaのメイン画面すらが整っていない段階なので、 ランタイムのエラーとなってこの Output Window に表示されてしまいます。
Maya_03_03
 それでは、各設定 を説明します。

cmds.loadPlugin( (os.environ.get('ANIMTOOL_PLUGIN')) + '/*.py' )

このWebページを作成する段階では、シェリフのプラグインの使用をやめていますが。
この ツール群にある plug-ins というディレクトリー内にある*.pyというプラグインファイル自動的にロードしろっていう設定になります。便利です。

ANIMTOOL_PLUGIN は、Pro1_Toolset.mod で設定しています。

import menu.Pro1_MainMenu
def SetPro1_MainMenu():
    menu.Pro1_MainMenu.ST_Pro1_MainMenu()
maya.utils.executeDeferred( SetPro1_MainMenu )

ここでの最大の注目のコマンドは executeDeferred です。
(ドキュメント maya.utils項目参照 http://help.autodesk.com/view/MAYAUL/2015/JPN/?guid=GUID-9B5AECBB-B212-4C92-959A-22599760E91A

 executeDeferred = Mayaが起動で忙しいと実行しない!! です。

つまり、Mayaがメイン画面の設定をし終わった後に、メニューやFPSの設定等を実行しなさい、という実行延滞機能を実現します。

上記行は、具体的には 
W:\Maya\2015-x64\python\menu\Pro1_MainMenu.py 内の def ST_Pro1_MainMenu(): を Mayaが起動し終わったら実行しなさい、
ということで、メインメニュー画面からのプルダウンメニューを設定してる スクリプト・ファイル を示しています。
このプルダウンメニューを設定しているスクリプトは後で詳しく記述しています。


def setfps():
#    cmds.currentUnit( time='ntscf')
    cmds.currentUnit( time='ntsc')
    cmds.playbackOptions(min=1, max=100, ast=1, aet=100)
    cmds.currentTime(1)
maya.utils.executeDeferred( setfps )

ここも executeDeferred で実行しています。
これは、Mayaを起動した時の FPS と 下の再生範囲を 1~100 に設定しています。
今は 30FPS に設定されていますが、下の行と入れ違いでコメントアウトすることで 60FPS になります。
また、起動した時のフレーム値は 1 に設定しています。


参考画像これは MAYA_MODULE_PATH 上にある modファイルを検索してGUI表示してくれるというユーザー作成のPythonスクリプトです。
既存のツールでも多言語対応しているのが解るのと同時に、今回自分が設定した Modules が表示されています。
ModuleEditor

ここまで記述しておきながら、じゃ~、実際の画面はどうなっているのか、と聞かれそうなので、
次は実際の画面とスクリプトの中身を公開していきます。



Module設定で配信したツール環境例;Python
上記のような Module設定 で用意したツールは、Maya上では実際どのようなものかの例です。
(MelのGUIはユーザー様が記述したものを参考にメインメニューからの起動例として、使わせて頂きました。よろしくお願いいたします。)

以下の図に紹介しているツール群は、ツール用のサーバーから起動時に読み込まれて Maya に組み込まれているものです。
シェリフ と そのアイコン と その内部のツール、Mainメニューからティアオフ出来るプルダウンメニューとそこから起動した各種GUIです。
GUIも色々な種類があり、 Mel の GUI、 Python の GUI、 QT Designer で作成した GUI もたくさんの種類があります。
単独の GUI/メイン画面にドッキング出来る GUI/用意したウィンド内で複数ドッキングできる GUI など様々あります。
そして、既存グラフエディタ・パネルにPythonでカスタムなGUIをくっ付けた オリジナルなグラフエディタ などもあります。

これらは全てまとまった階層構造以下にある訳ですから、圧縮して1つのファイルにしてしまえば、いっぺんに配信することも出来ます。

以下のページでは、 QT Designer で作成した  GridControl というツールを GUIの例として ソース付きで解説しています。


では、まず始めに、便利なメインメニューからのプルダウンメニューの紹介からです。
Maya_03_04_s
このプルダウンメニュー用の Pythonファイル Pro1_MainMenu.py 
Project01_MAYA2015_Startup.py によってMaya起動時に実行されるように設定されています。
ツールサーバー用の階層構造内の python ディレクトリーは PYTHONPATH が通っているディレクトリーで、
そのサブディレクトリー menu 内にファイルが置いてあります。
具体的には W:\Maya\2015-x64\python\menu 内に Pro1_MainMenu.py が置いてあります。
Maya_03_05
この Pro1_MainMenu.pyの記述内容です。

import maya.cmds as cmds
import maya.mel as mel

import menu.Pro1_ToolsMenu01
import menu.qt_GridControl
import menu.qt_GridControl_dock
import menu.qt_menu_test02
import menu.qt_menu_SliderFrame
import menu.CustomGraphEditor

def ST_Pro1_MainMenu():
    cmds.setParent( 'MayaWindow' )

    cmds.menu( label=u'Pro1MainMenu', tearOff=True )

    cmds.menuItem( label=u'MEL GUI Test',boldFont=True, command='mel.eval("source MELGUITest;MELGUITest;")')
    cmds.menuItem( divider=True )
    cmds.menuItem( label=u'Open Pro1_ToolsMenu01',boldFont=True, command='menu.Pro1_ToolsMenu01.OpenPro1_ToolsMenu01()')
    cmds.menuItem( divider=True )

    cmds.menuItem( subMenu=True, label='Pro1_Tools', tearOff=True )
    cmds.menuItem( label='qt_GridControl', command='menu.qt_GridControl.Open_qt_GridControl()' )
    cmds.menuItem( label='qt_GridControlDock', command='menu.qt_GridControl_dock.Open_qt_GridControlDock()' )
    cmds.menuItem( label='qt_menu_test02', command='menu.qt_menu_test02.Open_qt_menu_test02()' )

    cmds.setParent( '..', menu=True )
    cmds.menuItem( divider=True )
    cmds.menuItem( subMenu=True, label='Pro1_ModelTools', tearOff=True)
    cmds.menuItem( divider=True )

    cmds.setParent( '..', menu=True )
    cmds.menuItem( divider=True )
    cmds.menuItem( subMenu=True, label='Pro1_WeightTools', tearOff=True)
    cmds.menuItem( divider=True )

    cmds.setParent( '..', menu=True )
    cmds.menuItem( divider=True )
    cmds.menuItem( subMenu=True, label='Pro1_AnimeTools', tearOff=True)
    cmds.menuItem( label='SliderFrame', command='menu.qt_menu_SliderFrame.Open_qt_menu_SliderFrame()' )
    cmds.menuItem( label='CustomGraphEditor', command='menu.CustomGraphEditor.custom_graph_editor()' )
    cmds.menuItem( divider=True )

表示されるメニューはこんな感じで、点線の部分でそれぞれティアオフします。
Maya_03_06

各行を見れば、割と簡単な記述ですね。
Mel Python で出来たGUIは、その起動すべき関数さえ指定してあげれば起動します。
Mel の GUIの場合は Pythonから Mel を動かすので、 mel.eval("source MELGUITest;MELGUITest;")')という記述でOKです。
メニューのフォントを太くする boldFont=True なんて記述もありますね。

あとは qt で作成したGUIは少し書き方がことなるので、少し QT Designer の紹介と共にご記述したいと思います。



QT Designer ;Python
gtmf2014_051
  QT Designer は、デフォルトでインストールされていて、グラフィカルインターフェイスを作成できるツールです。

どこにあるかと言えば、 Maya 2015 では、
C:\Program Files\Autodesk\Maya2015\bin\
gtmf2014_050
になります。

ただし、 Maya 側のコマンドが全てのメニューに対応していないのと、思い通りにはならない場合もあるので、万能ではありません。
Maya 対応リストは、以下スクリプトを実行すると表示されます。

import maya.cmds as cmds
for t in cmds.loadUI(listTypes=True):
   print(t)

使用可能なウェジットタイプとそれに関連付けられたMayaコマンド表
CharacterizationTool characterizationToolUICmd
QCheckBox checkBox
QComboBox optionMenu
QDialog window
QLabel text
QLineEdit textField
QListWidget textScrollList
QMainWindow window
QMenu menu
QProgressBar progressBar
QPushButton button
QRadioButton radioButton
QSlider intSlider
QTextEdit scrollField
QWidget control
TopLevelQWidget

★ 作成出来るフォーム、3つ
QT Designer で作成できるフォームは3種類あります。
  1. MainWindow メインウィンドー
    メニューバー、ドッキング可能なウィジェット、Eツールバー、ステータスバー、などです。
  2. CustomWidget カスタムウェジット
    親ウェジットには組み込まれずウィンドウに各種ツールバーはないです。
  3. Dialog ダイアログ
    オプションウィンドウ、などです。
★ シグナル と スロット
QT Designer の上のメインメニューで左から7番目のボタンを押すと、このシグナルとスロットの設定画面になります。
Maya_03_07
これは、オブジェクト同士をグラフィカルに動作割り当てが出来る仕組みを提供します。
ただし、やはり思惑通りには関連が付けられないこともあって、うーんって悩みどころ多数です、
上図例では、一旦ジョグダイアルと下にあるスピンボックスとを関連付けてからテキストボックスと関連付けています。

★ ダイナミックプロパティー
Mayaコマンドとリンクさせる仕組みを作ります。
+command、+dragCommand Python 用で、 -command、-dragCommand Mel 用です。
Maya_03_08
上図例は、ボタンを押すと、Mayaのシーンにあるグリッドの表示/非表示が行われ
スライダーをスクラブするとグリッドの大きさが変化します。
このMaya用のコマンドを書き込む欄が1行しかなくて狭いので、
通常は外部に .py ファイルにコマンド内容を書いて置き、そこを見にいくように記述します。
この例では、qtmenu というディレクトリーに  GridControl1.py というファイルがあり、その中の変数を見にいくように記述されています。
そのGridControl1.pyの中身は以下の通りです。

import maya.cmds as cmds

def runToggleGrid():
    cmds.ToggleGrid()

def runGridSize(num):
    cmds.grid(size=num)

つまり、QT Designer で作成した GUI のファイル GridControl.uiとそのプログラム GridControl1.py はセットで用意します。
Maya_03_09
そして前述の Mayaのメインメニューからの プルダウンメニューから起動出来るように設定している、
qt_GridControl.py には次のように記述されています。

import maya.cmds as cmds
import maya.mel as mel
import os

def Open_qt_GridControl():
    if cmds.window ('GridControl',exists=True) == True:
        cmds.deleteUI ('GridControl')
    GridControl = cmds.loadUI(uiFile=(os.getenv('QTMENU')) + '/GridControl.ui')
    cmds.showWindow (GridControl)
    cmds.window(GridControl, edit=True, topLeftCorner=[200, 150] )
    import qtmenu.GridControl1
    reload(qtmenu.GridControl1)

ここでの注目は、 loadUI コマンドを使用して GridControl.ui を Maya にロードしている点です。

■ loadUI http://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/loadUI.html


あ、QTMENU という 環境変数が出て来てますが、もうお分かりですよね、 Module設定ファイル Pro1_Toolset.mod で設定している場所です。
具体的には W:\Maya\2015-x64\python\qtmenuということです。そこにGridControl.uiが置いてあります。


そして、同じ GridControl.ui ファイルを利用して Mayaのメイン画面にドッキング可能な GUIとしてロードすることも出来ます。
例えば、別ファイル qt_GridControl_dock.py に以下のように記述します。

import maya.cmds as cmds
import maya.mel as mel
import os

def Open_qt_GridControlDock():
    if cmds.window ('GridControlDock',exists=True) == True:
        cmds.deleteUI ('GridControlDock')
    GridControlDock = cmds.loadUI(uiFile=(os.getenv('QTMENU')) + '/GridControl.ui')
    # cmds.showWindow (GridControlDock)
    import qtmenu.GridControl1
    reload(qtmenu.GridControl1)
    cmds.window( GridControlDock, edit=True, topLeftCorner=[200, 100] )
    layout1=cmds.paneLayout(configuration="single", parent=GridControlDock, width=250, height=150)
    cmds.dockControl(allowedArea="all", area="right", floating=1, content=layout1, label="GridControlDock")
    cmds.control(GridControlDock, edit=True, parent=layout1)

ここでの注目は、showWindow コマンドをコメントアウトして、 dockControl コマンドを最後に設定している点です。
この dockControl コマンドでは、どのような初期状態で表示するかを記述しておきます。

■  dockControl http://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/dockControl.html


でもね、苦労してドッキングメニューを作成しても、メニューウィンドを移動させるとドッキングしようとするので、うざい!! って評判は今一です。
普通に表示するメニューの方がよろしいようで・・?~_~;;



あとがき
という内容が、 GTMF2014 の後半20分で説明した、ワークグループ設定について、でした。
え、20分でやるには膨大すぎるって、まーTA向けのをフルでやりたい気持ちがあったのですが・・。

最初は理解に時間を要するかも知れませんが、一旦動き出せば便利な方法だなと理解してもらえると思います。
誰かが作った Module設定ツール群をもらったとしたら、たった5分でセットアップは完了です。
ぜひチャレンジしてみてください。


では、最後に、 QT Designer で作成した
フローティング・ウィンドに4つのドッキングメニューを統合した GUI画像をお見せして終わりにしたいと思います。
Webページも閲覧出来ますし、タイムスライダー、シーンのロードとネームスペースの取得、キャラクターの骨選択ツールにもなっています。
Maya_03_10s

という訳で、次回はまたきっと Mayaでしょう。 What's Next ...
乞う、ご期待!! Stay tuned ..
戻る 次へ

Twitter

ページの先頭へ