MAYAスクリプト[ls]でまとまって出力されたコンポーネントを展開する方法


 

頂点を選択してlsコマンドで受け取った時にvtx[0:3]のように
各頂点番号で受け取れない問題があります。このようなときに各頂点を受け取れるように展開することが出来るコマンドが[filterExpand]です。filterExpandコマンド自体は展開以外にフィルタをかけることもできます。
今回は展開を中心にフィルタの使い方も少し紹介したいと思います。コマンドもMELとPython両方の書き方を記したいと思います。

filterExpandコマンド

コマンドの使い方は

filterExpandコマンドと頂点やエッジ、UVなどに対応したセレクションマスク番号を組み合わせて使います。

セレクションマスク番号はコンポーネントに基づいていて

ポリゴン頂点なら31
ポリゴンエッジは32
ポリゴン頂点フェースは70
の様に番号が対応しています。この番号とfilterExpand コマンドを組み合わせます。
filterExpand -selectionMask 31

ポリゴン頂点を展開

ポリキューブの頂点を選択します。

string $vtxName[] = `ls -sl `;
// Result: pCube1.vtx[0:7] //
import maya.cmds as cmds

vtxName = cmds.ls(sl=True)
[u’pCube1.vtx[0:7]’]
pCube1.vtx[0:7]となって0番から7番まで取得できましたが、
[0:7]と纏まってます。
これを展開したいと思います。

展開


string $vtxName[] = `ls -sl `;
string $vtxNo[] = `filterExpand  -selectionMask 31 $vtxName`;
print($vtxNo);
pCube1.vtx[0]
pCube1.vtx[1]
pCube1.vtx[2]
pCube1.vtx[3]
pCube1.vtx[4]
pCube1.vtx[5]
pCube1.vtx[6]
pCube1.vtx[7]
import maya.cmds as cmds

vtxName = cmds.ls(sl=True)
vtxNo = cmds.filterExpand(vtxName , selectionMask= 31)
print(vtxNo)
[u’pCube1.vtx[0]’, u’pCube1.vtx[1]’, u’pCube1.vtx[2]’, u’pCube1.vtx[3]’, u’pCube1.vtx[4]’, u’pCube1.vtx[5]’, u’pCube1.vtx[6]’, u’pCube1.vtx[7]’]
filterExpandコマンドにセレクションマスクの31番[selectionMask 31]を使って展開しました。
31番はポリゴン頂点の番号です。
[0:7]と纏まっていたのが
pCube1.vtx[0]
pCube1.vtx[1]
pCube1.vtx[2]
…..
と展開されました。

ポリゴン頂点フェースを展開

今度はポリゴン頂点フェースを展開してみます。

ポリゴン頂点を選択します。

string $vtxName[] = `ls -sl `;
string $vtxface[] = `polyListComponentConversion -tvf  $vtxName`;
print($vtxface);
// Result: pCube1.vtxFace[4][1:2] pCube1.vtxFace[4][5] //
import maya.cmds as cmds

vtxName = cmds.ls(sl=True)
vtxface = cmds.polyListComponentConversion(vtxName, tvf=True)
print(vtxface)
[u’pCube1.vtxFace[4][1:2]’, u’pCube1.vtxFace[4][5]’]

[polyListComponentConversion -tvf]でポリゴン頂点フェースを取得しました。

結果は

pCube1.vtxFace[4][1:2]
pCube1.vtxFace[4][5]

と纏まって返されました。

これも展開します。

展開

string $vtxName[] = `ls -sl `;
string $vtxface[] = `polyListComponentConversion -tvf  $vtxName`;
string $vtxfaceNo[] = `filterExpand  -selectionMask 70 $vtxface`;
print($vtxfaceNo);
// Result: pCube1.vtxFace[4][1] pCube1.vtxFace[4][2] pCube1.vtxFace[4][5] //
import maya.cmds as cmds

vtxName = cmds.ls(sl=True)
vtxface = cmds.polyListComponentConversion(vtxName, tvf=True)
vtxfaceNo = cmds.filterExpand(vtxface,  selectionMask = 70 )
print(vtxfaceNo)
[u’pCube1.vtxFace[4][1]’, u’pCube1.vtxFace[4][2]’, u’pCube1.vtxFace[4][5]’]
[filterExpand  -selectionMask 70]

ポリゴン頂点フェースのセレクションマスク 70番を使って展開します。

結果は

pCube1.vtxFace[4][1]
pCube1.vtxFace[4][2]

pCube1.vtxFace[4][5]

と綺麗に展開されました。

セレクションマスクでフィルターする

頂点とエッジ両方を選択しました。
複数のコンポーネントが選択された状態で指定した情報のみを取得します。
vtxName = cmds.ls(sl=True)
vtxNo = cmds.filterExpand(vtxName , selectionMask= 31)
print(vtxNo)
[u’pCube1.vtx[4]’]
頂点のみが返されました。
vtxName = cmds.ls(sl=True)
vtxNo = cmds.filterExpand(vtxName , selectionMask= 32)
print(vtxNo)
[u’pCube1.e[2]’, u’pCube1.e[6]’, u’pCube1.e[8]’]
エッジのみが返されました。
この様に複数のタイプのコンポーネントが選択された状態から
特定のコンポーネントのみを取得したい場合にフィルターをかけることが出来ます。

セレクションマスク一覧

filterExpandのセレクションマスクは他にも多数あります。
ハンドル 0
Nurbs カーブ 9
Nurbs サーフェス 10
Nurbs カーブ オンサーフェス 11
ポリゴン 12
ロケータ XYZ 22
方向ロケータ 23
ロケータ UV 24
Control Vertex (CV) 28
エディット ポイント 30
ポリゴン頂点 31
ポリゴンエッジ 32
ポリゴン フェース 34
ポリゴン UV 35
サブディビジョン メッシュ ポイント 36
サブディビジョン メッシュ エッジ 37
サブディビジョン メッシュ フェース 38
カーブ パラメータ ポイント 39
カーブ ノット 40
サーフェス パラメータ ポイント 41
サーフェス ノット 42
サーフェス範囲 43
トリム サーフェス エッジ 44
サーフェス アイソパラム 45
ラティス ポイント 46
パーティクル 47
スケール ピボット 49
回転ピボット 50
セレクション ハンドル 51
サブディビジョン サーフェス 68
ポリゴン頂点フェース 70
NURBS サーフェスのフェース 72
サブディビジョン メッシュ UV 73