こんにちは!Rhinoです。
今日は昔からMayaにある機能の1つであるHypershadeでマテリアルからオブジェクトを選択する機能「Select Objects with Material」をちょっとカスタマイズしたようなPythonスクリプトを書いてみましたので、そのご紹介をしたいと思います。
「Select Objects with Material」は便利なのですが、シーン中のオブジェクトをすべて選択してしまいます。そこが不満に思われたことはないでしょうか?
そこで、あるノード以下で、特定のマテリアルを持つオブジェクトを選択するようなものを作ってみようと思いました。
こんな感じのものです。
コード
スクリプトの内容は以下のようになっています。
マテリアル側からlistConnectionsを使用する方法もありそうですが、今回はオブジェクトとマテリアルを比較するという単純な方法にしました。
import maya.cmds as cmds
#子供ノードを再帰で探索
def getAllChildren( nodes ):
result = []
children = cmds.listRelatives( nodes, c=True, f=True, type='transform' )
while children:
result.extend( children )
children = getAllChildren( children )
if not children:
break
return result
#選択するマテリアルは1つ
selectMaterial = cmds.ls( sl=True, fl=True, mat=True )[0]
selectObjects = cmds.ls( sl=True, fl=True, o=True, type='transform' )
objectsWithMaterial = []
children = getAllChildren( selectObjects )
#選択したオブジェクトもGroupでなければリストに追加
for o in selectObjects:
if cmds.listRelatives( o, s=True, pa=True ):
children.append( o )
for c in children:
shape = cmds.listRelatives( c, s=True, pa=True )[0]
#シェーディングエンジンからマテリアルを取得
material = cmds.listConnections( '{}.surfaceShader'.format( cmds.listConnections( shape, d=True, type='shadingEngine' )[0] ) )[0]
if material == selectMaterial:
objectsWithMaterial.append( c )
cmds.select( cl=True )
cmds.select( objectsWithMaterial )
もっと良い方法があったかもしれませんが、ご参考になれば幸いです。
では、また!
コメント