Maya Script Pymel – マテリアルのパラメータをコピー

うーん、最近更新するとなると、スクリプトばかりになってしまっている、、

 

リアルタイムCGばかりやっているので、Mayaのマテリアルに付いては殆ど理解しておりません。
リアルタイムの場合は、Mayaで設定されているアトリビュートではなく、独自のアトリビュートなどを追加したものが使用されることが殆どです。
それ程度の知識ですが、マテリアルのアトリビュートの値を他のマテリアルに移したい。という必要性に駆られ、作りました。
というか、そもそもMayaにはそれ程度のツールもないのかな?
そういえば、そんな発想はなかった。MODOであれば、マテリアルを右クリックすれば済む話だが、Mayaにも同じような機能があるのだろうか?

 

探すよりも作ったほうが早い。ということで作りました。

import pymel.core as pm

def attr_copy():
	sel = pm.ls(os=1,mat=1)

	if not sel or len(sel) == 1:
		return

	srcMat,dstMat = sel[0],sel[1:]
	srcAttr = {}

	for x in srcMat.listAttr():
		attr = x.rsplit(".",1)[-1]
		try:
			if x.isMulti():
				for i in range(x.numElements()):
					attrN = "{0:}[{1:}]".format(attr,i)
					val = srcMat.attr(attrN).get()
					srcAttr[attrN] = val
			else:
				val = srcMat.attr(attr).get()
				srcAttr[attr] = val
		except:pass

	if not srcAttr:
		return

	for dm in dstMat:
		for x in dm.listAttr():
			attr = x.rsplit(".",1)[-1]
			if "reflectedColor" in attr:
				continue
			if x.isMulti():
				for i in range(x.numElements()):
					attrN = "{0:}[{1:}]".format(attr,i)
					if attrN in srcAttr.keys():
						try:
							dm.attr(attrN).set(srcAttr[attrN])
						except:pass
			else:
				if attr in srcAttr.keys():
					try:
						dm.attr(attr).set(srcAttr[attr])
					except:pass

attr_copy()

複数のマテリアルを選択し、実行すると、始めに選択されたマテリアルのアトリビュート値をそれ以降に選択されたマテリアルのアトリビュート値に転送します。
マテリアルの種類が違くても、同じアトリビュート名であれば転送できます。

 

気に入らないのが、29行目と30行目です。
何ですか「reflectedColor」というのは、その二行を削除しても動くには動くんですが、エラーが出ます。
何か分からないし、使わないからいいや、ということでパスです。

 

今回のツールで勉強になったのは、attr()メソッドでした。
今までアトリビュートの値を文字列として取得した場合、それを使うにはMayaコマンドに送って実行していました。
pm.setAttr(val)
の様な形です。
この場合、変数の型を指定する必要があり、面倒です。折角Pythonなんだからそんなものは動的にやってくれ、と不満を抱いておりました。
attr()メソッドを使えば、変数を入れて使うことができるようです。

 

Pythonのeval()関数も試してみたのですが、
eval(“mat.{0:}.set({1:})”.format(attr,val))
の様な形でしょうか、
eval()関数を使うと、グローバルの変数として使われるようで、関数内で使うことができませんでした。
詳しく調べていないので、良く分かりません。
ただ、eval()関数は、速度が遅いので、できれば使わない方がいい。という情報があったので、さほど調べませんでした。

 

ああ、Pymel便利だ。
こんなに簡単に作ることができることを喜ぶべきだろうか。そんな機能もデフォルトでないことを嘆くべきだろうか。
そもそも機能を探していないので、良く分かりません。
なんじゃそりゃ。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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