Maya Script Pymel – ポーズコピーツール

リグの付いていないジョイントに対して、移動、回転、スケール値をコピーしたい。
という必要がありました。
以前そんな感じのツールを作ったなぁ、と使ってみると、使えない、、
キーが打たれていないとダメそうだったので、キーを打って再実行。
やはり使えない、、酷い、、
こんなツールを上げていたとは、、

 

で、自分の作ったツールを解析するよりも、新たに作ってしまおう。
と、キーのあるなしに関係なく、アトリビュートの値をコピーするだけのツールを作りました。
折角なので、ガワの部分は以前の物をちょっと拝借しました。

import pymel.core as pm

class PoseCopyTool(object):
	def __init__(self):
		self.NAME = "_pose_copy_tool"
		self.TITLE = "Pose Copy Tool"
		self.WIN = ""
	
	def create(self):
		try:
			pm.deleteUI(self.NAME)
		except:pass
		
		with pm.window(self.NAME,t=self.TITLE,w=240,h=100) as self.WIN:
			with pm.columnLayout(adj=1):
				with pm.rowLayout(nc=3,cw3=[70,80,70]):
					self.MirCB = pm.checkBox(l="Mirror",v=1,cc=pm.Callback(self.check_box_cb))
					self.hirCB = pm.checkBox(l="Hierarchy",v=0)
					self.wolCB = pm.checkBox(l="World",v=0)
				with pm.rowLayout(nc=2,cw2=[90,180]):
					self.tText = pm.text(l="Flip Transrate")
					self.cbT = pm.checkBoxGrp(ncb=3,la3=["X","Y","Z"],va3=[1,0,0],cw3=[60,60,60])
				with pm.rowLayout(nc=2,cw2=[90,180]):
					self.rText = pm.text(l="Flip Rotate")
					self.cbR = pm.checkBoxGrp(ncb=3,la3=["X","Y","Z"],va3=[1,0,0],cw3=[60,60,60])
				with pm.rowLayout(nc=2,cw2=[90,180]):
					self.sText = pm.text(l="Flip Scale")
					self.cbS = pm.checkBoxGrp(ncb=3,la3=["X","Y","Z"],va3=[1,0,0],cw3=[60,60,60])
				pm.button(l="Apply",c=pm.Callback(self.main_cb))
	
	def check_box_cb(self):
		if self.MirCB.getValue():
			self.tText.setLabel("Flip Transrate")
			self.rText.setLabel("Flip Rotate")
			self.sText.setLabel("Flip Scale")
		else:
			self.tText.setLabel("Transrate")
			self.rText.setLabel("Rotate")
			self.sText.setLabel("Scale")
			
	def main_cb(self):
		a = 0.5
		sel = [x for x in pm.ls(os=1) if type(x) == pm.nt.Joint or type(x) == pm.nt.Transform]
		if len(sel)!=2:
			pm.system.displayWarning("Select 2 JointNode or TransformNode")
			return
		if self.hirCB.getValue():
			sel = [[x,y] for x,y in zip(pm.ls(sel[0],dag=1,type=pm.nt.Transform),pm.ls(sel[1],dag=1,type=pm.nt.Transform))]
		else:
			sel = [sel]
		for par in sel:
			src,tgt = par[0],par[1]
			if self.wolCB.getValue():
				srcTra = src.getTranslation("world")
			else:
				srcTra = src.getTranslation()
			srcRot = src.getRotation()
			srcSca = src.getScale()
			[tgt.sx.unlock(),tgt.sy.unlock(),tgt.sz.unlock(),tgt.tx.unlock(),tgt.ty.unlock(),tgt.tz.unlock(),tgt.rx.unlock(),tgt.ry.unlock(),tgt.rz.unlock()]
			if self.MirCB.getValue():
				cbValT = [cmp(a,self.cbT.getValue1()),cmp(a,self.cbT.getValue2()),cmp(a,self.cbT.getValue3())]
				cbValR = [cmp(a,self.cbR.getValue1()),cmp(a,self.cbR.getValue2()),cmp(a,self.cbR.getValue3())]
				cbValS = [cmp(a,self.cbS.getValue1()),cmp(a,self.cbS.getValue2()),cmp(a,self.cbS.getValue3())]
				if self.wolCB.getValue():
					tgt.setTranslation([x*y for x,y in zip(srcTra,cbValT)],"world")
				else:
					tgt.setTranslation([x*y for x,y in zip(srcTra,cbValT)])
				tgt.setRotation([x*y for x,y in zip(srcRot,cbValR)])
				tgt.setScale([x*y for x,y in zip(srcSca,cbValS)])
			else:
				if self.wolCB.getValue():
					tgtTra = tgt.getTranslation("world")
				else:
					tgtTra = tgt.getTranslation()
				tgtRot = tgt.getRotation()
				tgtSca = tgt.getScale()
				cbValT = [self.cbT.getValue1(),self.cbT.getValue2(),self.cbT.getValue3()]
				cbValR = [self.cbR.getValue1(),self.cbR.getValue2(),self.cbR.getValue3()]
				cbValS = [self.cbS.getValue1(),self.cbS.getValue2(),self.cbS.getValue3()]
				if self.wolCB.getValue():
					tgt.setTranslation([y if z else x for (x,y,z) in zip(tgtTra,srcTra,cbValT)],"world")
				else:
					tgt.setTranslation([y if z else x for (x,y,z) in zip(tgtTra,srcTra,cbValT)])
				tgt.setRotation([y if z else x for (x,y,z) in zip(tgtRot,srcRot,cbValR)])
				tgt.setScale([y if z else x for (x,y,z) in zip(tgtSca,srcSca,cbValS)])
				

pct = PoseCopyTool()
pct.create()

作っていて思い出したのは、cmp関数、これを作っている時にこんな処理ができたらなぁ、と思っていたのを思い出しました。
状況に合わせて1か-1を掛けたいときにとても便利。
ミラーしない時はチェックボックスの値を使って三項演算子で処理を切り替え。
変数の名前をもっと分かりやすく書くべきだ。と自分で突っ込みながらも、面倒なのでこれでよし。
また気が向くことがあったら、その辺はやろう。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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