<< TOP

【GTMF2014ネタ】; 最新Mayaワークグループ設定について
(Maya 2014、2015)
A new way to set WORKGROUP in Maya

    プロローグ; 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 ^ _^ ;;
Windows7 Professional 64Bit、Intel Core i7-3930K (3.20GHz,6コア/12スレッド)
メモリ16GB、NVIDIA GeForce GTX560 Ti 2GB (メモリ2GB)
@SI_UsersNotes



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

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

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

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

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

       

     これらの問いに関して、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

       複数の設定が可能
        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プログラムよりはるかにユーザーフレンドリー、決まった書き方で誰でも理解しやすい。
         特定の人しか解らないようなことにはしない。(誰々が居ないと解りませんj状態を無くす)

       目的やインストール場所に合わせてすぐに追加設定  >>  カスタマイズが楽
      • 環境変数やパスの 変更・追加 をいとも簡単に設定出来る。
         一時配信停止や試験やリトライをやりやすくする。(時間が無い時こそ柔軟な設置機能が必要)

       ユーザーパス以外からのインストールを可能にする  >>  ツール群の配信/受け取りが簡単
      • ツール管理者の用意したツール群と各ユーザーが個人的に設定しているツール間の関連性を良くする。
         ヘビー 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.  青矢印 ③→④ と、 実行 されていきます。

    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 という場所の事です。


     ※ 良い参考ファイルは・・
      上記のような事が解ったような気分で、改めて インストール済みの メンタルレイ用 .mod設定ファイルを見ると、
      MODULE設定の非常に良いサンプルになっていると気が付きます。ローカル言語分けも設定されています。
       C:\Program Files\Common Files\Autodesk Shared\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-x64\Project01_MAYA2015_Startup.py と 設定されます。



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




     この 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 に表示されてしまいます。


     それでは、各設定 を説明します。

    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 です。 
     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 が表示されています。


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



 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の例として ソース付きで解説しています。


    では、まず始めに、便利なメインメニューからの プルダウンメニュー の紹介からです。



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



     この 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 )

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



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

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



 QT Designer ;Python


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

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

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

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

      使用可能なウェジットタイプ と それに関連付けられたMayaコマンド 表
          CharacterizationTool characterizationToolUICmd
          QCheckBox checkBox
          QComboBoxoptionMenu
          QDialog window
          QLabeltext
          QLineEdit textField
          QListWidgettextScrollList
          QMainWindow window
          QMenumenu
          QProgressBar progressBar
          QPushButtonbutton
          QRadioButton radioButton
          QSliderintSlider
          QTextEdit scrollField
          QWidgetcontrol
          TopLevelQWidget window

 ★ 作成出来るフォーム、3つ
     QT Designer で作成できるフォームは3種類あります。
    1. MainWindow メインウィンドー
      メニューバー、 ドッキング可能なウィジェット、Eツールバー、 ステータスバー、などです。

    2. CustomWidget カスタムウェジット
      親ウェジットには組み込まれずウィンドウに各種ツールバーはないです。

    3. Dialog ダイアログ
      オプションウィンドウ、などです。

 ★ シグナル と スロット
    QT Designer の上のメインメニューで 左から7番目のボタンを押すと、この シグナルとスロット の設定画面になります。



    これは、オブジェクト同士をグラフィカルに動作割り当てが出来る仕組みを提供します。
    ただし、やはり思惑通りには関連が付けられないこともあって、うーんって悩みどころ多数です、
    上図例では、一旦ジョグダイアルと下にあるスピンボックスとを関連付けてからテキストボックスと関連付けています。

 ★ ダイナミックプロパティー
    Mayaコマンドとリンクさせる仕組みを作ります。
    +command、+dragCommand Python 用で、-command、-dragCommand Mel 用です。



    上図例は、ボタンを押すと、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のメインメニューからの プルダウンメニュー から起動出来るように設定している、
    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 にロードしている点です。



    あ、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 コマンド では、どのような初期状態で表示するかを記述しておきます。



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



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

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


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



     
    という訳で、次回 は またきっとMayaでしょう。

      乞う、ご期待!! Stay tuned ..