こんにちは!Rhinoです。
早速ですが、Mayaのアウトライナーを使用することは多いと思います。ですが、オブジェクトを判別しづらいと思うことはないでしょうか?
僕はどのレイヤーにどのオブジェクトが入っているのかが分かりづらいと思うことがあって、選択しているレイヤーカラーをアウトライナー内のオブジェクトカラーに割り当てるスクリプトを書いみました。
# -*- coding: utf-8 -*-
import maya.cmds as cmds
import maya.mel as mel
currentLayer = cmds.editDisplayLayerGlobals( q=True, cdl=True )
layerColorIndex = cmds.getAttr( currentLayer + ".color" )
colorRGB = cmds.colorIndex( layerColorIndex, q=True )
layerMembers = cmds.editDisplayLayerMembers( currentLayer, q=True, fn=True )
for m in layerMembers:
state = cmds.getAttr( m + ".useOutlinerColor" )
if state == False:
cmds.setAttr( m + ".useOutlinerColor", True )
cmds.setAttr( m + ".outlinerColor", colorRGB[0], colorRGB[1], colorRGB[2], type="double3" )
mel.eval( "AEdagNodeCommonRefreshOutliners();" )
レイヤーカラーを取得
まずはレイヤーカラーを取得してみたいと思います。
カレントレイヤーを取得します。
currentLayer = cmds.editDisplayLayerGlobals( q=True, cdl=True )
レイヤーのcolorアトリビュートにアクセスして色を取得します。
但しこれはカラーバレットのインデックスになっているので注意が必要です。
layerColorIndex = cmds.getAttr( currentLayer + ".color" )
後でオブジェクトカラーに割り当てるためにこの時点でRGBカラーに変換しておきます。
colorRGB = cmds.colorIndex( layerColorIndex, q=True )
レイヤーのメンバーに色を割り当てる
カレントレイヤーのメンバーを取得します。
レイヤーに収められているオブジェクト類ですね。
今回はオブジェクトかどうかの判別など複雑なことは行っておりませんので、オブジェクト以外もレイヤーに収める場合があれば一度フィルタリングしてあげる必要があります。
layerMembers = cmds.editDisplayLayerMembers( currentLayer, q=True, fn=True )
アウトライナーでオブジェクカラーを表示するにはuseOutlinerColorプロパティをオンにする必要がありますので分岐しておきます。
state = cmds.getAttr( m + ".useOutlinerColor" )
if state == False:
cmds.setAttr( m + ".useOutlinerColor", True )
予め取得しておいたRGBカラーをメンバーのoutlinerColorプロパティに割り当てます。
cmds.setAttr( m + ".outlinerColor", colorRGB[0], colorRGB[1], colorRGB[2], type="double3" )
アウトライナーの描画をリフレッシュ
カラーを割り当てればスクリプトは完成なのですが、アウトライナー内でカラーが反映されていないように見えます。オブジェクトを選択すれば描画更新されて反映されるので、少々面倒なので描画のリフレッシュも書いておきます。
これにはMelコマンドを使用しました。
mel.eval( "AEdagNodeCommonRefreshOutliners();" )
今回は親子関係が結ばれているオブジェクトなどいくつかの条件は無視した簡単なものですが、ご参考になれば幸いです。
では、また!
コメント