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


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

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


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

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

 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



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

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

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が、
Maya 2016から追加された色を変えられるオプションで、Maya 2016以前のMayaのバージョンで実行するとエラーを起こします。
なので、ツール起動時にMayaのバージョンを調べMaya 2016以前だった場合はこの行の無い方で設定し、
更に注意文を表示するようにしました。


そして、上記サンプルで注目すべき点は、アウトライナ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シーンデータ的にはパネルがまだ残っていて、
どんどん溜まっていく~、という部分です。
ここは、getPanelType'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]を押すと、一番上まで行って、アウトライナ内の下に表示されます。(ただしセットは一番下に表示されたままです。)
シーン内がかなり込み入って来た時に、表示順番変更を間違いなく入れ替えることが出来ます。




検索表示のフラット化 V4.0
ユーザ様からの情報で....、アウトライナーの検索機能を使うとその結果が階層の表示になっていて、
目的のノード名まで展開しないと見れないようになっているのはdisplayMode"DAG"になっているから。
で、そのdisplayMode"List”にするとフラットな表示になる、ってことを知りました。
この変更はコマンドで outlinerEditor を編集すればよいのですが、
ボタンを設定して任意に変更出来たら便利だと思い、その機能分を更新したいと思います。
Python3 対応のスクリプトとして公開いたします。<Maya 2026で動作検証しています。>


outlinerEditor
https://help.autodesk.com/cloudhelp/2026/JPN/Maya-Tech-Docs/CommandsPython/outlinerEditor.html
-displayMode(dm)
Listモードでは、インデントなしのフラットなリストになります。
DAGモードでは、インデントされ、モデルの階層構造が表示されます。

ということで、まずはGUIとして下の欄に”FLAT”というボタンを追加してみます。


  cmds.button("Up",label='Up',bgc=[0.7,0.35,0.35],align='left',width=40,command=move_node_up)
  cmds.text(' ',align='left',width=1)
  cmds.button("List",label='FLAT',align='left',width=80,
    bgc=[0.2,0.2,0.2],command=lambda x:display_mode(outliner_panel_name))


custom_ourliner_14.jpg
そして、”FLAT”ボタンを押したら、ボタンの色とdisplayModeが変わるようにします。

もう一度”FLAT”ボタンを押すと元の色と元のdisplayModeに戻るようにします。

def display_mode(outliner_panel_name):
    if cmds.outlinerEditor(outliner_panel_name, q=True, displayMode=True ) == "DAG":
        cmds.outlinerEditor(outliner_panel_name, edit=True, displayMode='List' )
        cmds.button("List",edit=True,bgc=[0.7,0.2,0.2])
    else:
        cmds.outlinerEditor(outliner_panel_name, edit=True, displayMode='DAG' )
        cmds.button("List",edit=True,bgc=[0.2,0.2,0.2])


カスタムのアウトライナーは複数表示できますが、操作したFLATボタンのあるアウトライナーにだけ反応して、検索した(以下例;Right)結果をフラットに表示します。
custom_ourliner_15



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

既知の制限・注釈

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


import CustomOutliner
CustomOutliner.custom_outliner()



twitter ware @SI_UsersNotes

Custom Outliner(Maya 2016~
V4.0 CustomOutliner_V4.0.zip2.70 KB 2025/7/13

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

お気軽にお問い合わせください

Daikin CG News お申し込み

CGクリエイター向けのセミナー・イベントやキャンペーン、製品情報をメールマガジンでお届けします。(登録無料)

Twitter

ページの先頭へ