Maya Script Python – ポリゴンメッシュノードの選別

現在の選択から、特定のノードのみを抽出して処理をしたいときは良くあるかと思います。
というか、自分が良くあるのですが、久しぶりにそういった場面に遭遇すると、前にどこかに書いたなぁ、
と古いコードを漁る事を良くします。

 

なので、一層のこと記事にしよう。ということで書いておきます。
まずはpymel。

import pymel.core as pm

def get_mesh_node_list_pymel():
	sel = [x for x in pm.ls(sl=1,type=pm.nt.Transform)if x.getShape() and type(x.getShape())==pm.nt.Mesh]
	return sel

print get_mesh_node_list_pymel()

選別するだけの関数にしていますが、いつもの使い方では関数の最初の一行をコピペして使いまわしています。
pymelだと記述が簡単なので、その部分だけ関数化するのもなぁ。ということでそんな使い方です。
今回は小分けにする、ということでその部分だけを関数化してみました。だからちょっと変です。

 

続いてMayaコマンド

import maya.cmds as cmds

def get_mesh_node_list_cmds():
	sel = cmds.ls(sl=1,type="transform")
	nSel = []
	for s in sel:
		if cmds.nodeType(s) == "mesh" or cmds.nodeType(s) == "transform" and "mesh" in [cmds.nodeType(x) for x in cmds.listHistory(s,f=1)]:
			nSel.append(s)
	return nSel

print get_mesh_node_list_cmds()

さすがにちょっと長いです。ここまで長くなると、関数にノードの名前を渡して関数内で選別して返した方が良いですねぇ。
ノードの編集だけだとpymelの方が楽で良いのですが、たまに処理するノードの数が膨大になると、pymelだと厳しい時があります。
そんな時にMayaコマンドで書きなおして使ったりします。

 

そして最後にMayaAPI2.0

def get_mesh_node_list_om2(meshName):
	meshFn = []
	selList = om2.MSelectionList()
	selList.add(meshName)
	mesh = selList.getDependNode(0)
	if mesh.apiType() == om2.MFn.kTransform:
		dagPath = selList.getDagPath(0)
		dagFn = om2.MFnDagNode(dagPath)
		child = dagFn.child(0)
		if child.apiType() != om2.MFn.kMesh:
			return meshFn
		mesh = child
	meshFn = om2.MFnMesh(mesh)
	return meshFn

sel = cmds.ls(sl=1)
if sel:
	mSel = get_mesh_node_list_om2(sel[0])
	if mSel:
		print mSel.name()

全てをAPIでやるのではなく、起点はMayaコマンドです。
多分これが一番手っ取り早いかな?lsコマンドを実行しているだけだし。そんなに遅くはならないでしょう。多分。

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です