ある文字列を含む名前全てを検索したいときなどに「*」アスタリスクを用いることがあります。
例えば、「BCD*」と検索をする場合、以下のような結果になります。
「ABCD」、「BCDE」、「ABCDE」、「BCDEF」、「CDEF」、
アスタリスク「*」を用いて名前を取得
Maya関数lsを用います。
#-*- encoding: utf-8
import maya.cmds as cmds
#オブジェクトを作成
cmds.polySphere(n = 'A_pSphere')
cmds.polySphere(n = 'B_pSphere')
cmds.polySphere(n = 'C_pSphere_hoge')
cmds.polyCube(n = 'pCube')
#検索
result = cmds.ls('*pSphere')
print(result)
上記コードの実行結果は以下の通りです。
[u'A_pSphere', u'B_pSphere']
ちなみに、「A_pSphere*」と検索した場合、「[u’A_pSphere’, u’A_pSphereShape’]」という結果になります。オブジェクトを作成するとトランスフォーム情報を格納する「トランスフォームノード」とその子に形状情報である「シェイプノード」が作成されます(アウトライナーの[Display]→[Shapes]にチェックを入れると実際の構成がわかります)。つまり、オブジェクト名の後ろに「*」を付けて検索すると上記のようにシェイプノードも一緒に検出されてしまうわけです。
アスタリスク「*」を用いてオブジェクトタイプごとで名前を取得
ls関数の引数群の中にオブジェクトタイプ等を指定するものがあります。
#-*- encoding: utf-8
import maya.cmds as cmds
#オブジェクトを作成
cmds.polySphere(n = 'pSphere_mesh')
cmds.joint( p=(0, 0, 0) ,n = 'pSphere_joint')
#検索
result = cmds.ls('pSphere*', geometry = True)
print(result)
上記コードの実行結果は以下の通りです。
[u'pSphere_meshShape']
最初に「pShere」と名前が共通するメッシュとジョイントのを作成しました。そこからlsの引数に「geometry = True」を渡すことでメッシュのシェイプノードのみを検索することができました。
処理を行う上ではシェイプノード名でも問題はありませんが、名前に「~Shape」が付かないトランスフォームノード名の方を取得したい場合もあります。
アウトライナー上の名前(トランスフォームノード名)を取得する方法
3D空間上に配置できるオブジェクト(ジョイント以外)は、必ずトランスフォームノードの子にシェイプノードという構成で作成されます。これは「Outliner」→「Display」→「Shapes」にチェックを入れることで確認することができます。
つまり、上の方法でシェイプノード名を取得し、その親を調べればアウトライナー上と同じ名前が取得できるわけです。
#-*- encoding: utf-8
import maya.cmds as cmds
#オブジェクトを作成
cmds.joint( p=(0, 0, 0) ,n = 'pSphere_joint')
cmds.polySphere(n = 'pSphere_mesh')
#検索
result = cmds.ls('pSphere*',geometry = True)
result = cmds.listRelatives(result,parent = True)#階層を調べる関数
print(result)
上記コードの実行結果は以下の通りです。
[u'pSphere_mesh']
関数listRelatives()はオブジェクトの親や子を調べることができます。第一引数にシェイプノードを渡し、第二引数にparent = Trueを渡すことで、親階層であるトランスフォームノードを返しました。