CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. スクリプト
  5. Maya 2016~ Python;カスタムアウトライナ
SUITE USERS NOTES
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
ritaro_ml



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

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

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



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


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

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

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

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


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


で、オーバーライド色を設定しているであろう Mel の changeObjColor changeObjLayerColorType
スクリプトエディタで
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)

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


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

なので 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])

Set_OverrideOutlinerColor



アウトライナのウィンドウについて
既に公開しているカスタムグラフエディタカスタムハイパーグラフと同様に、カスタムのアウトライナも 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()

custom_ourliner_07
アウトライナ用のオプションがたくさん設定されていますが、一番最後に追加されている設定、 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()

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

custom_ourliner_09

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

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

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


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

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


2)アウトライナ内色とビュー画面ワイヤーカラーの同時設定
[レ] Change Color in Viewpot 有効にしてアウトライナで色指定すると、ビュー画面のワイヤーカラー(描画オーバーライド)も同色が設定されます。後は上記操作と同じです。 [Reset] を押せばビュー画面の色も破棄されます。
custom_ourliner_11
Tips1; アウトライナで設定した色を後からビュー画面にも設定したい場合、
[Copy] > [Select] > [レ] Change Color in Viewport > [Apply]
という手順で同じ色設定しているオプジェクトのビュー画面色を一度で全てに設定することが出来ます。

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



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

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

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

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




CustomOutliner.py と 既知の制限・注釈
という訳で皆様のリクエストの カスタムアウトライナ のツールを公開します。
(Pyファイルは シェルフにボタン登録する か、 プルダウンメニューに登録して実行します。)
あくまでも自己責任でお使いください。Use as your own risk.

既知の制限・注釈

今のところありません。
起動コマンドは以下の通りです。


import CustomOutliner
CustomOutliner.custom_outliner()



twitter ware @SI_UsersNotes

Custom Outliner (Maya 2016~
V3.2 CustomOutliner_V3_2.zip 2.70 KB 2017/11/11

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

Twitter

ページの先頭へ