選択中のオブジェクト・コンポーネント名をリストで返す
Mayaを触っていればわかると思いますが、ツールを実行する前にまずは処理を行う対象を選択しますね。Maya上で選択されているオブジェクトや頂点、エッジ、面の名前を取得するにはls関数を使用します。
#-*- encoding: utf-8
import maya.cmds as cmds
mesh = cmds.ls(sl = True) #slはselectionの略
print(mesh)
試しにSphereオブジェクトを作成し、オブジェクトを選択した状態で上記のコマンドを実行すると以下のような結果が表示されます。
#オブジェクトを選択した場合
[u'pSphere1']
#オブジェクトのバーテックスを選択した場合(数字は各頂点のインデックス)
[u'pSphere.vtx[0]']
#オブジェクトのエッジを選択した場合(数字は各エッジのインデックス)
[u'pSphere.e[0]']
#オブジェクトのフェイスを選択した場合(数字は各フェイスのインデックス)
[u'pSphere.f[0]']
選択したものの名前を取得する上でもう一つ重要なのが選択順です。
上記のコードのように引数selection(sl)を有効にした場合、オブジェクト単位では選択順にリストを返しますが、頂点やエッジ、フェイスは複数選択しても選択順で返してくれません。また、選択したコンポーネントのインデックスが連続した数字である場合、それらをまとめた一つの文字列で返します。
#pSphere.vtx[4],pSphere.vtx[2],pSphere.vtx[0]の順で選択した場合
[u'pSphere1.vtx[0]', u'pSphere1.vtx[2]', u'pSphere1.vtx[4]']
#pSphere.vtx[2],pSphere.vtx[1],pSphere.vtx[0]の順で選択した場合
[u'pSphere1.vtx[0:2]']
ちなみに、pSphere1.vtx[0:2]のようにまとめた形にも利点があります。
Maya提供の関数は呼び出しに若干時間がかかり、処理の中で頻繁に呼び出すとかなり重くなります。コンポーネント一つ一つに処理を行う場合にはそのような状況が発生しますが、pSphere1.vtx[0:2]のようにまとまった形で引数に値を渡すことで関数を呼び出す回数が減るので、処理スピードを大幅に改善することができます。
選択中のコンポーネント名を選択順で返す
コンポーネントの選択順リストを取得するためには関数lsの引数に「orderedSelection(os)」と関数selectPrefを用います。
#-*- encoding: utf-8
import maya.cmds as cmds
cmds.selectPref(tso = True) #tsoはtrackSelectionOrderの略
component = cmds.ls(os = True)
print(component)
ls関数の引数「orderedSelection(os)」は有効にすることでコンポーネントを選択順でリストしますが、それはselectPref関数のtrackSelectionOrder(tso)の値に依存します。これが有効になっていない場合はls関数の引数「selection(sl)」を有効にした場合と同じ結果になります。
上記に示したコンポーネント選択例で再実行すると以下のような結果になります。
#pSphere.vtx[4],pSphere.vtx[2],pSphere.vtx[0]の順で選択した場合
[u'pSphere1.vtx[4]', u'pSphere1.vtx[2]', u'pSphere1.vtx[0]']
#pSphere.vtx[2],pSphere.vtx[1],pSphere.vtx[0]の順で選択した場合
[u'pSphere1.vtx[2]', u'pSphere1.vtx[1]', u'pSphere1.vtx[0]']
ちなみに、「cmds.selectPref(tso = True)」で有効にした値は、「windows > Settings/Preferences > Preferences」を開き、「Categories > settings > Selection > Modifiers」の中にある「Track selection order」です。