217 lines
6.7 KiB
Python
217 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import maya.cmds as cmds
|
|
import maya.mel as mel
|
|
|
|
import mocaphelperutility
|
|
import math
|
|
|
|
def createLoc(strname,cd = (0,0,0),rot = (0,0,0),roo = "xyz"):
|
|
locname = cmds.spaceLocator(name = strname)
|
|
mocaphelperutility.setWorldPos(locname,cd)
|
|
mocaphelperutility.setWorldRot(locname,rot,roo)
|
|
return locname
|
|
|
|
def reposition(objA,objB):
|
|
tempp = mocaphelperutility.getWorldPos(objB)
|
|
tempr = mocaphelperutility.getWorldRot(objB)
|
|
temproo = mocaphelperutility.getRotOrder(objB)
|
|
mocaphelperutility.setWorldPos(objA,tempp)
|
|
mocaphelperutility.setWorldRot(objA,tempr,temproo)
|
|
|
|
|
|
def checkConstraint(obj):
|
|
parent = cmds.parentConstraint(obj, targetList = True ,q = True )
|
|
point = cmds.pointConstraint(obj, targetList = True ,q = True )
|
|
orient = cmds.orientConstraint(obj, targetList = True ,q = True )
|
|
if parent == None and point == None and orient == None:
|
|
return False
|
|
else:
|
|
conslist = [parent,point,orient]
|
|
return conslist
|
|
|
|
def deleteAllConstraint(obj):
|
|
cmds.delete(obj,cn=True)
|
|
|
|
def createPointConstraint(ctrlobj,targetobj,maintainoffset = False):
|
|
name = cmds.pointConstraint(ctrlobj,targetobj,mo = maintainoffset)
|
|
return name
|
|
|
|
def createOrientConstraint(ctrlobj,targetobj,maintainoffset = False):
|
|
name = cmds.orientConstraint(ctrlobj,targetobj,mo = maintainoffset)
|
|
return name
|
|
|
|
def createParentConstraint(ctrlobj,targetobj,maintainoffset = False):
|
|
name = cmds.parentConstraint(ctrlobj,targetobj,mo = maintainoffset)
|
|
return name
|
|
'''
|
|
def deletePointConstraint(ctrlobj,targetobj):
|
|
cmds.pointConstraint(ctrlobj,targetobj,remove = True)
|
|
|
|
def deleteParentConstraint(ctrlobj,targetobj):
|
|
cmds.parentConstraint(ctrlobj,targetobj,remove = True)
|
|
|
|
def deleteOrientConstraint(ctrlobj,targetobj):
|
|
cmds.orientConstraint(ctrlobj,targetobj,remove = True)
|
|
'''
|
|
def bake(objs,mintime,maxtime,type = "all"):
|
|
# if smartbake == True:
|
|
if type == "all":
|
|
cmds.bakeResults(objs,t =(mintime,maxtime),simulation = True)
|
|
else:
|
|
if type == "parent":
|
|
atb = ["tx","ty","tz","sx","sy","sz","rx","ry","rz"]
|
|
|
|
elif type == "point":
|
|
atb = ["tx","ty","tz"]
|
|
|
|
elif type == "orient":
|
|
atb = ["rx","ry","rz"]
|
|
|
|
elif type == "onlyscale":
|
|
atb = ["sx","sy","sz"]
|
|
|
|
else:
|
|
raise Exception("bake error:type unidentified:",type)
|
|
cmds.bakeResults(objs,t =(mintime,maxtime),at = atb)
|
|
|
|
def smartbake(objs,mintime,maxtime,type = "all"):
|
|
if type == "all":
|
|
cmds.bakeResults(objs,t =(mintime,maxtime),smart = True,simulation = True)
|
|
else:
|
|
if type == "parent":
|
|
atb = ["tx","ty","tz","sx","sy","sz","rx","ry","rz"]
|
|
|
|
elif type == "point":
|
|
atb = ["tx","ty","tz"]
|
|
|
|
elif type == "orient":
|
|
atb = ["rx","ry","rz"]
|
|
|
|
elif type == "onlyscale":
|
|
atb = ["sx","sy","sz"]
|
|
|
|
else:
|
|
raise Exception("bake error:type unidentified")
|
|
cmds.bakeResults(objs,t =(mintime,maxtime),smart = True,at = atb)
|
|
|
|
|
|
def deleteInrange(objs,start,end):
|
|
if cmds.keyframe(objs,q = True) == None :
|
|
raise Exception("ref has no keys!")
|
|
else:
|
|
mocaphelperutility.cutKey(objs,start+0.01,end-0.01)
|
|
# mocaphelperutility.autoKetTangent(objs,start,start)
|
|
# mocaphelperutility.autoKetTangent(objs,end,end)
|
|
|
|
def deleteOutrange(objs,start,end):
|
|
if cmds.keyframe(objs,q = True) == None :
|
|
raise Exception("ref has no keys!")
|
|
|
|
framelist = set(cmds.keyframe(objs,q = True))
|
|
minframe = min(framelist)
|
|
maxframe = max(framelist)
|
|
if minframe < start:
|
|
mocaphelperutility.cutKey(objs,minframe,start-0.01)
|
|
# mocaphelperutility.autoKetTangent(objs,start,start)
|
|
if maxframe > end:
|
|
mocaphelperutility.cutKey(objs,end+0.01,maxframe)
|
|
# mocaphelperutility.autoKetTangent(objs,end,end)
|
|
|
|
|
|
def offsetFrame(objs,offset):
|
|
cmds.keyframe(objs,e = True,tc = float(offset),o = "over",relative = True)
|
|
|
|
def stickyDelete(ui):
|
|
objs = mocaphelperutility.getSelectedNodes()
|
|
fromframe = eval(ui.ui.arb_fromEdit.text())
|
|
curframe = mocaphelperutility.getCurrentFrame()
|
|
if fromframe != curframe:
|
|
mocaphelperutility.cutKey(objs,fromframe,curframe,True)
|
|
mocaphelperutility.autoKetTangent(objs,fromframe,curframe)
|
|
ui.ui.arb_fromEdit.setText(str(curframe))
|
|
ui.ui.arb_toEdit.setText(str(curframe))
|
|
else:
|
|
raise Exception("from == curframe")
|
|
|
|
|
|
def bakeAtoB(A,B,start,end,type,maintainoffset = False,smart = False):
|
|
print("type == ",type)
|
|
if type == "parent" or type == "all":
|
|
cons = createParentConstraint(A,B,maintainoffset)
|
|
elif type == "point":
|
|
cons = createPointConstraint(A,B,maintainoffset)
|
|
elif type == "orient":
|
|
cons = createOrientConstraint(A,B,maintainoffset)
|
|
elif type == "onlyscale":
|
|
cons = createParentConstraint(A,B,maintainoffset)
|
|
|
|
if smart:
|
|
smartbake(B,start,end,type)
|
|
else:
|
|
bake(B,start,end,type)
|
|
|
|
mocaphelperutility.deleteObj(cons)
|
|
|
|
|
|
def pinCurPos(objs,mintime,maxtime):
|
|
min = mintime
|
|
max = maxtime
|
|
if min > max:
|
|
min = maxtime
|
|
max = mintime
|
|
if min == max:
|
|
raise Exception("min == max.")
|
|
|
|
|
|
cdlist = []
|
|
# cmds.currentTime(min)
|
|
for obj in objs:
|
|
|
|
pos = mocaphelperutility.getWorldPos(obj)
|
|
rot = mocaphelperutility.getWorldRot(obj)
|
|
cdlist.append([pos,rot])
|
|
for i in range(int(math.floor(min)),int(math.ceil(max)+1)):
|
|
|
|
cmds.currentTime(float(i))
|
|
cmds.setKeyframe(objs,at = ["tx","ty","tz","rx","ry","rz"])
|
|
for i in range(len(objs)):
|
|
pos = cdlist[i][0]
|
|
rot = cdlist[i][1]
|
|
cmds.xform(objs[i],ws = True,translation = pos,rotation = rot)
|
|
|
|
|
|
def pinParentPos(objs,mintime,maxtime):
|
|
|
|
leng = len(objs)
|
|
if leng <= 1:
|
|
raise Exception("not enough obj selected,at least 2.")
|
|
min = mintime
|
|
max = maxtime
|
|
if min > max:
|
|
min = maxtime
|
|
max = mintime
|
|
if min == max:
|
|
raise Exception("min == max.")
|
|
|
|
|
|
# cmds.currentTime(min)
|
|
consobj = objs[:-1]
|
|
beconsobj = objs[-1]
|
|
|
|
pos = mocaphelperutility.getWorldPos(beconsobj)
|
|
rot = mocaphelperutility.getWorldRot(beconsobj)
|
|
roo = mocaphelperutility.getRotOrder(beconsobj)
|
|
loc = createLoc("mocaphelper_arb_pinparent_temp_loc",pos,rot,roo)[0]
|
|
createParentConstraint(consobj,loc,True)
|
|
bake(loc,min,max,type="parent")
|
|
|
|
|
|
|
|
for i in range(int(math.floor(min)),int(math.ceil(max)+1)):
|
|
|
|
cmds.currentTime(float(i))
|
|
cmds.setKeyframe(beconsobj,at = ["tx","ty","tz","rx","ry","rz"])
|
|
reposition(beconsobj,loc)
|
|
|
|
mocaphelperutility.deleteObj(loc)
|
|
mocaphelperutility.selectNodes(beconsobj) |