<< TOP

Maya 2016~ Python; カスタム アウトライナ
Maya 2016~ Python ; CustomOutliner
プロローグ; Prologue  

 MayaPython で便利な新機能付きのカスタムアウトライナを作成し、幾つかの講演で興味があるか聞いてみたところ、たくさんの欲しいリクエストを頂いたので、ここに記事として公開することになりました。
もちろん、Pythonの機能紹介を基本としたページですが、ツールだけをダウンロードして利用することも可能です。


このツールの当初は、Maya2016からサポートされたアウトライナ内のカラー表示機能を利用したモノだったのですが、既存アウトライナに追加機能を組み合わせることでビュー内表示物との操作性が非常に優れたGUIに発展しました。

ちょっとした工夫でユーザーフレンドリーなMayaウィンドウが完成しました。


※Maya2016から対応した機能なので、それ以前のバージョンではカラー表示と変更が行えません。

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

 Please use this information as your own risk.
Windows7 Professional 64Bit、Intel Core i7-3930K (3.20GHz,6コア/12スレッド)
メモリ16GB、NVIDIA GeForce GTX970 4GB




 アトリビュートエディタ内の機能項目(Maya2016以降~)

 アウトライナ カラーを使用
Maya2016のアトリビュートエディタを見ると、▼ ディスプレイ 内に
 [レ] アウトライナ カラーを使用 と
その下にはその時使用する カラーの設定 があるのがわかります。 
その項目を有効にして色を任意に設定して既存のアウトライナ ウィンドウを表示すると、
ビュー画面のワイヤーカラーとは関係なく、アウトライナ内だけに色設定できることが確認出来ます。


 
その下の ▼描画オーバーライド 内の [レ] オーバーライド有効化 を有効にして色を設定すればビュー画面のワイヤーカラーが変更出来ます。
アウトライナの表示と同色にすればより分り易くなりますね。

 RGBカラー / インデックスカラー
 で、ふと、この操作を行った時に気が付いたと思うのですが、上のアウトライナの色設定は RGBカラーだったのに対して、
下のビュー画面の色設定は インデックスカラー がデフォルトになっています。
もちろん下のビュー画面の色設定は インデックスカラー から RGBカラーに 変更することは出来るのですが、
皆が使っているデフォルトの状態をいちいち変更するのはとても面倒なことになりそうです。
そこで、後で紹介するスクリプト記述部分では、カスタムのアウトライナGUI上での色変更はインデックスカラー設定になっており
インデックスカラー値からRGBカラー値への変換を行う処理を行って アウトライナ色を変更しています。





 アウトライナ カラーは .outlinerColor
 では、アトリビュートエディタで行った操作のログからコマンドが推測できるか見てみましょう。
スクリプトエディタ内 ヒストリ > [レ] すべてのコマンドのエコー を一時的に有効にします。
(いつも有効だとウザイです)
 [レ] アウトライナ カラーを使用 を 有効/無効 にすると以下ログが出ます。
続いて色を変えてみたログです。


setAttr pCone1.useOutlinerColor false;AEdagNodeCommonRefreshOutliners();
setAttr pCone1.useOutlinerColor true;AEdagNodeCommonRefreshOutliners();
AEoutlinerColorSet pCone1.outlinerColor;

これで大体の感じはわかります。
cmds.getAttr と cmds.setAttrアウトライナ カラーの設定が 有効か無効か が取得、設定ができるはずです。

で、アウトライナ色を設定しているであろう Mel の 
AEoutlinerColorSet って何?と思う時は、
スクリプトエディタで
 whatIs AEoutlinerColorSet って記述して実行し、コマンドを探します。
コマンドではなくスクリプトとして何処かのファイルに書かれている場合は そのファイルのフルパスが返って来ます。



すると
、C:/Program Files/Autodesk/Maya2017/scripts/AETemplates/AEdagNodeCommon.mel
に書かれている って返って来るのでテキストで覗いて見ます。

任意のテキストエディタで ”AEoutlinerColorSet” という言葉で検索をかけると、以下の行が見つかります。

global proc AEoutlinerColorSet( string $plug )
{
string $colorGrp = getOutlinerColorGrp($plug);
float $rgb[] = `colorSliderGrp -q -rgbValue $colorGrp`;
setAttr $plug -type float3 $rgb[0] $rgb[1] $rgb[2];
AEdagNodeCommonRefreshOutliners();
}

すると、なんだ、また cmds.setAttr でRGB値を設定してるだけやん、とわかります。
なので pCone1 のアウトライナ色を設定するには たった2行です。

cmds.setAttr("pCone1.useOutlinerColor", 1)
cmds.setAttr("pCone1.outlinerColor",0,0,1)



 オーバーライドカラーは .overrideColor
 [レ] オーバーライド有効化 を 有効/無効 にすると以下ログが出ます。
続いて色を変えてみたログです。こちらはインデックスカラーの場合です。
試しにインデックスカラーをRGBカラーにしてみると4行目が表示されます。
(本当はもっといっぱい表示されますが、欲しい情報は以下の通りになります。他はGUIの設定等になります)

setAttr "pCone1.overrideEnabled" 0;
setAttr "pCone1.overrideEnabled" 1;
changeObjColor pCone1.overrideColor;
changeObjLayerColorType pCone1.overrideRGBColors

で、オーバーライド色を設定しているであろう Mel の changeObjColorchangeObjLayerColorType
スクリプトエディタで
 whatIs を打ってみると、実は同じファイルを見ていて、
C:/Program Files/Autodesk/Maya2017/scripts/AETemplates/AEdrawInfo.mel を返します。
これは結構解くのか難しいのですが、結論を先に書きますと またもや
cmds.setAttr で設定しています。
そして インデックスカラーの設定値は 0~31の実数が有効範囲ですが、
デフォルトで表示の 0 は グレー色 ではなく"色設定無し"という意味であって、1~31が色のある設定値です。
なので pCone1 のオーバーライド色を設定するには たった3行です。
(17番は黄色です)

cmds.setAttr("pCone1.overrideEnabled", 1)
cmds.setAttr("pCone1.overrideRGBColors", 0)
cmds.setAttr("pCone1.overrideColor", 17)



 
colorIndex
ここまで理解出来て、後は 両方の色を同時に設定したい 場合の対応ですが、
上図の通り、アウトライナ色の設定はRGBカラーがデフォルトで、オーバーレイ色はインデックスカラーがデフォルトになっています。
そこで、インデックスカラー値を指定したら コマンドではアウトライナをRGB色値に変えて設定する、にしたいと思います。
幸い、colorIndex というコマンドがあり、インデックスカラー番号を指定すると RGB値を返してくれるようになっています。

colorIndex
http://help.autodesk.com/cloudhelp/2017/JPN/Maya-Tech-Docs/CommandsPython/colorIndex.htmll

なので pCone1 のオーバーライド色用のインデックスカラー値からアウトライナ色を指定してみると、こうなります。
 
(インデックスカラー17番は黄色ですが、RGB値に変換した値をプリントすると (1.0,1.0,0.0) と黄色になっています。)

color_rbg = cmds.colorIndex(17, q=True )
print color_rbg
cmds.setAttr("pCone1.useOutlinerColor", 1)
cmds.setAttr("pCone1.outlinerColor",color_rbg[0],color_rbg[1],color_rbg[2])






  アウトライナ のウィンドウについて
  既に公開している カスタムグラフエディタ カスタムハイパーグラフ と同様に、カスタムのアウトライナも
Windowの中にPanelを作ってOutlinerを表示しますので、複数表示が可能になります。
コマンドを調べてみるとアウトライナは 、outlinerEditor というコマンドがあり、
Python 例の部分を見るとばっちりサンプルが載っています。


outlinerEditor
   http://help.autodesk.com/cloudhelp/2017/JPN/Maya-Tech-Docs/CommandsPython/outlinerEditor.html

import maya.cmds as cmds
# Create a new regular outliner in its own window
#
cmds.window()
cmds.frameLayout( labelVisible=False )
panel = cmds.outlinerPanel()
outliner = cmds.outlinerPanel(panel, query=True,outlinerEditor=True)
cmds.outlinerEditor( outliner, edit=True, mainListConnection='worldList',
selectionConnection='modelList', showShapes=False, showReferenceNodes=False,
showReferenceMembers=False, showAttributes=False, showConnected=False,
showAnimCurvesOnly=False, autoExpand=False, showDagOnly=True,
ignoreDagHierarchy=False, expandConnections=False, showNamespace=True,
showCompounds=True, showNumericAttrsOnly=False, highlightActive=True,
autoSelectNewObjects=False, doNotSelectNewObjects=False, transmitFilters=False,
showSetMembers=True, setFilter='defaultSetFilter',ignoreHiddenAttribute=False, 
ignoreOutlinerColor=False )
cmds.showWindow()



 アウトライナ用のオプションがたくさん設定されていますが、一番最後に追加されている設定、ignoreOutlinerColor=False が、
Maya2016から追加された色を変えられるオプションで、Maya2016以前のMayaのバージョンで実行すると エラーを起こします。
なので、ツール起動時にMayaのバージョンを調べMaya2016以前だった場合はこの行の無い方で設定し、
更に注意文を表示するようにしました。

そして、上記サンプルで注目すべき点は、アウトライナscriptedPanel ではなく、専用の outlinerPanel を使用しているところです。

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

グラフエディタ も ハイパーグラフ も scriptedPanel でしたので、新たなパネルです。
試しに scriptedPanel で記述してみると、、

outlinergraphmenu = 'custom_outlinerpanel' + bangou #(==枚数 )
cmds.scriptedPanel(outlinergraphmenu, label=outlinergraphmenu, type='outlinerPanel',parent=pane1)
↑ XX typeでエラーが出て、駄目なようです。

cmds.outlinerPanel(outlinergraphmenu, label=outlinergraphmenu, parent=pane1)
↑ こう書くと許してくれるみたいです。

最後の考察は、以前にも遭遇した、
複数のパネルを作成した後、Mayaビュー画面には表示していなくてもMayaシーンデータ的にはパネルがまだ残っていて、
どんどん溜まっていく~、という部分です。
ここは、getPanel の Type で 'outlinerPanel' を指定できるので、
表示していない(invisiblePanels=True) 'outlinerPanel' があったら消す、にしますが、
慎重に Try 文の中に記述しました。 
(最初からデフォルトとして存在する 'outlinerPanel1' は例外扱いにします。)

invis_panel = cmds.getPanel(invisiblePanels=True)
custom_outlinerpanel = cmds.getPanel(type='outlinerPanel')
try:
if 'outlinerPanel1' in custom_outlinerpanel:
custom_outlinerpanel.remove('outlinerPanel1')
except:
pass

try:
for c_outlinerp in custom_outlinerpanel:
if c_outlinerp in invis_panel:
cmds.deleteUI(c_outlinerp,panel=True)
except:
pass




 カスタム アウトライナ 操作について
 カスタム アウトライナの機能を紹介します。 単にツールが使いたい方はここから見ればツールを理解出来ます。
公開するツールは Python 形式で書かれています。
用意した CustomOutliner.py をそのままスクリプトエディタ上にドラッグ&ドロップして、最後の行に

custom_outliner()

を追記して、上の [すべて実行] というボタン を押せば起動します。
後は シェルフ に登録するなり、メニューを作って起動するなり、自由に設定できます。



1) アウトライナ内色設定
基本的にMayaで色が設定出来るオブジェクトなら色設定が出来るハズです。
ポリゴン、ロケータ、カーブ、ナーブス、ジョイントカメラ、ライト などですが、元々色設定の無い セット などには色が付けられません。
また、ビュー画面で非表示設定になっているものは、アウトライナ上も暗く表示されます。



 [ Apply ]  オブジェクトを選択して、スライダーで好みの色を選び、[ Apply ] ボタンを押して色を設定します。

 [ Select ]  選択したオブジェクトと同じ色を持つものを選択状態にします。オブジェクトの種類や階層に関係ありません。
上図例では水色の
Camera1を選択して [Select] ボタンを押すと locator1 も選択状態になります。
(※ 異なる方法で色設定した場合は、見た目が同じ色に見えても微妙に異なる色の為選択できない場合があります。
その場合は、下記 [Copy]>[Apply] で色再設定してみてください。)

 [ Copy ]  選択したオブジェクトの色を コピーする色 に設定し、色選択スライダーも動きます。
この後に別のオプジェクトを選択して [Apply] を押すと確実に同じ色を設定出来ます。

 [ Reset ]  選択したオブジェクトの色を破棄します。(デフォルトに戻る、グレー表示)



2)アウトライナ内色とビュー画面ワイヤーカラーの同時設定
   [レ] Change Color in Viewpot 有効にしてアウトライナで色指定すると、
ビュー画面のワイヤーカラー(描画オーバーライド)も同色が設定されます。
後は上記操作と同じです。[Reset] を押せばビュー画面の色も破棄されます。


Tips1;アウトライナで設定した色を後からビュー画面にも設定したい場合、
[Copy] > [Select] > [レ] Change Color in Viewport > [Apply]
という手順で同じ色設定しているオプジェクトのビュー画面色を一度で全てに設定することが出来ます。


Tips2; [Select] ボタンの使い道として、オブジェクトの種類や階層に関係なく同色のものを選択出来ることから、
例えばキャラクターのRig制御用アイコンや骨に特定の色を設定しておけば、
複数異なる階層下にあっても一度に選択出来る、という使い方も考えられます。


3)アウトライナ内の表示位置変更ツール(階層内に留まる、階層内ループ操作)
   左下 [Up] [Down] のボタンは、アウトライナ内での表示順番を変更できるツールです。
マウス操作はまだしも、ペンでMayaを操作している場合に、
アウトライナ内のオブジェクト順番の入れ替え操作ミスが起こりやすい、との意見から生まれた機能です。



   [ Up ] [ Down ]  選択したオブジェクトの表示位置を 上げ/下げ します。ただし、親の外に出ません。子の中にも入りません。

上図例は、
locator1 の子である nurbsSphere1 [Up] を実行すると、一番下に表示されます。
その後、[Up] を押す毎に上に行き、一番上まで行って、また下に表示されます。その階層内でのみ上下ループ表示することがわかります。

         親の locator1 をずーーと [Up] を押すと、一番上まで行って、アウトライナ内の下に表示されます。(ただしセットは一番下に表示されたままです。)
         シーン内がかなり込み入って来た時に、表示順番変更を間違いなく入れ替えることが出来ます。




 CustomOutliner.py と 既知の制限・注釈
 既知の制限・注釈
    今のところありません。
    起動コマンドは 以下の通りです。

    import CustomOutliner
    CustomOutliner.custom_outliner()

 twitter ware @SI_UsersNotes

Custom Outliner (Maya2016~)
V3.2 CustomOutliner_V3_2.zip 2.70 KB 2017/11/11




次回も Mayaスクリプトの予定・・・
乞う、ご期待!! Stay tuned ..