Maya Script API2.0 – シーン中のノードを取得

色々と調べてみても、API2.0を使った任意のノードの取得の仕方が分からない。
getActiveSelectionListで、現在の選択を取得するか、getSelectionListByNameで名前を元にセレクションリストを
作成するくらいの事しか、書かれていない。
そもそもMItがないのでどうすることもできないし、API1.0との混在もできないのでどうしようもない。
で、考えた苦肉の策が、

import maya.OpenMaya as om
import maya.api.OpenMaya as om2

def get_mesh_om():
	dagPath = om.MDagPath()
	dagIter = om.MItDag(om.MItDag.kDepthFirst, om.MFn.kMesh)
	fnMash = []
	
	selList = om2.MSelectionList()
	print "{0:-^50}".format("API1.0")
	##API1.0
	while not dagIter.isDone():
		dagIter.getPath(dagPath)
		dagNodeFn = om.MFnDagNode(dagPath)
		if dagPath.hasFn(om.MFn.kMesh):
			fnM = om.MFnMesh(dagPath)
			selList.add(fnM.fullPathName())
			print fnM.fullPathName()
		dagIter.next()
	##API1.0
	
	print "{0:-^50}".format("API2.0")
	##API2.0
	for x in range(selList.length()):
		mDag = selList.getDagPath(x)
		if mDag.hasFn(om2.MFn.kMesh):
			fnMash = om2.MFnMesh(mDag)
			print fnMash.fullPathName()
	##API2.0
get_mesh_om()

自分で書いていて、ホントかよ、と突っ込んでしまったが、API1.0で所得した物を文字列として2.0に渡している。
DAGノードであれば、これでいいが、DGノードの場合はそうも行かない。
なので、こんな感じ。

import maya.api.OpenMaya as om2
import maya.cmds as cmds

def get_material_om(args):
	selList = om2.MSelectionList()
	[selList.add(x) for x in args]
	for x in range(selList.length()):
		mDg = selList.getDependNode(x)
		if mDg.hasFn(om2.MFn.kLambert):
			fn = om2.MFnDependencyNode(mDg)
			print fn.name()

get_material_om(cmds.ls(mat=1))

Mayaコマンドで取得したものを文字列として2.0に渡している。
因みにこれではランバートを指定していても、PhongやBlinnもリストされる。
それらはランバートが元になっているからだろうか?良く分からない。

 

その場合は、渡すときにMayaコマンドで選別しておいて渡すべきだろうか?
もうそこまで考えると、頭がおかしくなりそうだ、、
うーん、何か方法がありそうだけど全くわからない。

 

そこで、Mayaコマンドで情報を取得してAPIに渡すときに役に立ちそうな機能。

import maya.cmds as cmds

selDict = {}
sel = cmds.ls(sl=1,fl=1)
vtxs = cmds.ls(cmds.polyListComponentConversion(sel,tv=1),fl=1,l=1)
for v in vtxs:
	name = v.split(".",1)[0]
	selDict[name] = set([x[x.rindex("[")+1:-1] for x in vtxs if name == x.split(".",1)[0]])
print selDict

こうすることにより選択をノードの名前とコンポーネントのインデックスに分けた辞書を作ることができる。
インデックスはset集合にしているので恐らく符合させるときに早く処理できるだろう。
しかし、全くスマートではない。

 

本当にAPI2.0だけでできないのかなぁ、、

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

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

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

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