def match(self, *args): jointsGrp = self.blueprintNamespace + ":blueprint_joints_grp" joints = utils.findJointChain(jointsGrp) joints.pop(0) jointsGrp = self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp" moduleJoints = utils.findJointChain(jointsGrp) moduleJoints.pop(0) if len(moduleJoints) > 1: moduleJoints.pop() index = 0 fkControls = [] for joint in moduleJoints: fkControl = joint+"_fkControl" fkControls.append(fkControl) if not cmds.getAttr(fkControl+".translateX", l=True): cmds.xform(fkControl, worldSpace=True, absolute=True, translation=cmds.xform(joints[index], q=True, ws=True, translation=True)) cmds.xform(fkControl, ws=True, a=True, rotation=cmds.xform(joints[index], q=True, ws=True, rotation=True)) index += 1 return (joints, fkControls)
def match(self, *args): characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.blueprintNamespace + ":" + self.moduleNamespace +":module_container" containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) ikJointsAll = utils.findJointChain(self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp") blueprintJointsAll = utils.findJointChain(self.blueprintNamespace + ":blueprint_joints_grp") ikJoints = [ikJointsAll[1], ikJointsAll[2], ikJointsAll[3]] blueprintJoints = [blueprintJointsAll[1], blueprintJointsAll[2], blueprintJointsAll[3]] ikHandleControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":ikHandleControl" if cmds.objExists(ikHandleControl): cmds.setAttr(ikHandleControl+".stretchiness", 1) endPos = cmds.xform(blueprintJoints[2], q=True, worldSpace=True, translation=True) cmds.xform(ikHandleControl, worldSpace=True, absolute=True, translation=endPos) twistControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":twistControl" utils.matchTwistAngle(twistControl+".rotateZ", ikJoints, blueprintJoints) for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def match(self, *args): characterContainer = self.characterNamespaceOnly + ':character_container' blueprintContainer = self.blueprintNamespace + ':module_container' moduleContainer = self.blueprintNamespace + ':' + self.moduleNamespace + ':module_container' containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) joints = utils.findJointChain(self.blueprintNamespace+':' + self.moduleNamespace+':joints_grp') blueprintJoints = utils.findJointChain(self.blueprintNamespace+':blueprint_joints_grp') ikHandleControl = self.blueprintNamespace + ':' + self.moduleNamespace + ':ikHandleControl' cmds.setAttr(ikHandleControl + '.stretchiness',1) endPos = cmds.xform(blueprintJoints[len(blueprintJoints)-1], q=1, worldSpace=True, translation=True) cmds.xform(ikHandleControl, worldSpace=True, absolute=True, translation=endPos) joints.pop(0) blueprintJoints.pop(0) utils.matchTwistAngle(ikHandleControl + '.twist', joints, blueprintJoints) for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def match(self, *args): # Unlock all the containers characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.blueprintNamespace + ":" + self.moduleNamespace +":module_container" containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) joints = utils.findJointChain(self.blueprintNamespace+":"+self.moduleNamespace+":joints_grp") blueprintJoints = utils.findJointChain(self.blueprintNamespace+":blueprint_joints_grp") ikHandleControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":ikHandleControl" cmds.setAttr(ikHandleControl+".stretchiness", 1) endPos = cmds.xform(blueprintJoints[ len(blueprintJoints)-1], q=True, ws=True, t=True) cmds.xform(ikHandleControl, ws=True, a=True, t=endPos) joints.pop(0) blueprintJoints.pop(0) utils.matchTwistAngle(ikHandleControl+".twist", joints, blueprintJoints) for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def match(self, *args): """ Identify and unlock the containers """ characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.blueprintNamespace + ":" + self.moduleNamespace + ":module_container" containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) """ Find the IK joint chain """ ikJoints = utils.findJointChain(self.blueprintNamespace+":"+self.moduleNamespace+":joints_grp") blueprintJoints = utils.findJointChain(self.blueprintNamespace+":blueprint_joints_grp") armControl = self.blueprintNamespace+":"+self.moduleNamespace+":armControl" tempChildTransform = cmds.group(empty=True) cmds.parent(tempChildTransform, armControl, relative=True) cmds.setAttr(tempChildTransform + ".translateZ", 5) ikHandPos = cmds.xform(ikJoints[4], q=True, worldSpace=True, translation=True) armControlPos = cmds.xform(armControl, q=True, worldSpace=True, translation=True) worldSpacePositionOffset = [ikHandPos[0] - armControlPos[0], ikHandPos[1] - armControlPos[1], ikHandPos[2] - armControlPos[2]] cmds.xform(tempChildTransform, worldSpace=True, relative=True, translation=worldSpacePositionOffset) cmds.parent(tempChildTransform, ikJoints[4], absolute=True) cmds.setAttr(tempChildTransform+".translateX", 0) cmds.setAttr(tempChildTransform+".translateZ", 0) cmds.parent(tempChildTransform, blueprintJoints[4], relative=True) cmds.xform(armControl, ws=True, absolute=True, translation=cmds.xform(blueprintJoints[3], q=True, ws=True, translation=True)) aimConstraint = cmds.aimConstraint(blueprintJoints[4], armControl, maintainOffset=False, aimVector=[1.0, 0.0, 0.0], upVector=[0.0, 0.0, 1.0], worldUpType="object", worldUpObject=tempChildTransform) cmds.delete(aimConstraint) cmds.delete(tempChildTransform) blueprint_handJointPos = cmds.xform(blueprintJoints[4], q=True, worldSpace=True, translation=True) ikHandPos = cmds.xform(ikJoints[4], q=True, worldSpace=True, translation=True) worldSpacePositionOffset = [blueprint_handJointPos[0] - ikHandPos[0], blueprint_handJointPos[1] - ikHandPos[1], blueprint_handJointPos[2] - ikHandPos[2]] cmds.xform(armControl, worldSpace=True, relative=True, translation=worldSpacePositionOffset) #self.matchRotationControl(ikJoints[5]+"_ryControl", ikJoints[4], blueprintJoints[4]) #self.matchRotationControl(ikJoints[5]+"_ryControl", ikJoints[3], blueprintJoints[3]) circleIK.CircleControlStretchyIK.match(self, args) for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def match(self, *args): characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.blueprintNamespace + ":" + self.moduleNamespace + ":module_container" containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) ikJoints = utils.findJointChain(self.blueprintNamespace+":"+self.moduleNamespace+":joints_grp") blueprintJoints = utils.findJointChain(self.blueprintNamespace+":blueprint_joints_grp") footControl = self.blueprintNamespace+":"+self.moduleNamespace+":footControl" tempChildTransform = cmds.group(empty=True) cmds.parent(tempChildTransform, footControl, relative=True) cmds.setAttr(tempChildTransform + ".translateZ", 5) ikToePos = cmds.xform(ikJoints[5], q=True, worldSpace=True, translation=True) footControlPos = cmds.xform(footControl, q=True, worldSpace=True, translation=True) worldSpacePositionOffset = [ikToePos[0] - footControlPos[0], ikToePos[1] - footControlPos[1], ikToePos[2] - footControlPos[2]] cmds.xform(tempChildTransform, worldSpace=True, relative=True, translation=worldSpacePositionOffset) cmds.parent(tempChildTransform, ikJoints[5], absolute=True) cmds.setAttr(tempChildTransform+".translateX", 0) cmds.setAttr(tempChildTransform+".translateZ", 0) cmds.parent(tempChildTransform, blueprintJoints[5], relative=True) cmds.xform(footControl, ws=True, absolute=True, translation=cmds.xform(blueprintJoints[4], q=True, ws=True, translation=True)) aimConstraint = cmds.aimConstraint(blueprintJoints[5], footControl, maintainOffset=False, aimVector=[1.0, 0.0, 0.0], upVector=[0.0, 0.0, 1.0], worldUpType="object", worldUpObject=tempChildTransform) cmds.delete(aimConstraint) cmds.delete(tempChildTransform) blueprint_toeJointPos = cmds.xform(blueprintJoints[5], q=True, worldSpace=True, translation=True) ikToePos = cmds.xform(ikJoints[5], q=True, worldSpace=True, translation=True) worldSpacePositionOffset = [blueprint_toeJointPos[0] - ikToePos[0], blueprint_toeJointPos[1] - ikToePos[1], blueprint_toeJointPos[2] - ikToePos[2]] cmds.xform(footControl, worldSpace=True, relative=True, translation=worldSpacePositionOffset) self.matchRotationControl(ikJoints[5]+"_ryControl", ikJoints[4], blueprintJoints[4]) self.matchRotationControl(ikJoints[5]+"_ryControl", ikJoints[3], blueprintJoints[3]) circleIK.CircleControlStretchyIK.match(self, args) for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def install_requirements(self): blueprintJointsGrp = self.blueprintNamespace + ":blueprint_joints_grp" blueprintJoints = utils.findJointChain(blueprintJointsGrp) if len(blueprintJoints) >= 6: return True else: cmds.confirmDialog(title="Interpolation-based Stretchy Spline", message="This control module can only be installed on spline blueprints with 5 joints or more", button=["Accept"], defaultButton="Accept") return False
def __init__(self, userSpecifiedName, hookObject, numberOfJoints=None, startJointPos=None, endJointPos=None): if numberOfJoints == None: jointsGrp = CLASS_NAME + "__" + userSpecifiedName + ":joints_grp" if not cmds.objExists(jointsGrp): numberOfJoints = 5 # default else: joints = utils.findJointChain(jointsGrp) joints.pop() numberOfJoints = len(joints) jointInfo = [] gameJntNames = [] if startJointPos == None: startJointPos = [0.0, 0.0, 0.0] if endJointPos == None: endJointPos = [0.0, 5.0, 0.0] jointIncrement = list(endJointPos) jointIncrement[0] -= startJointPos[0] jointIncrement[1] -= startJointPos[1] jointIncrement[2] -= startJointPos[2] jointIncrement[0] /= (numberOfJoints - 1) jointIncrement[1] /= (numberOfJoints - 1) jointIncrement[2] /= (numberOfJoints - 1) jointPos = startJointPos for i in range(numberOfJoints): jointName = "spine_" + str(i) + "_joint" gameJntName = "spine_" + str(i) + "_" jointInfo.append([jointName, list(jointPos)]) gameJntNames.append(gameJntName) jointPos[0] += jointIncrement[0] jointPos[1] += jointIncrement[1] jointPos[2] += jointIncrement[2] blueprintMod.Blueprint.__init__(self, CLASS_NAME, userSpecifiedName, jointInfo, hookObject, gameJntNames, altCtrl=0) self.canBeMirrored = False
def UI(self, parentLayout): armControl = self.blueprintNamespace+":"+self.moduleNamespace+":armControl" controlObjectInstance = controlObject.ControlObject(armControl) controlObjectInstance.UI(parentLayout) cmds.attrControlGrp(attribute=armControl+".stretchiness", label="Stretchiness") circleIK.CircleControlStretchyIK.UI(self, parentLayout) jointsGrp = self.blueprintNamespace+":"+self.moduleNamespace+":joints_grp" joints = utils.findJointChain(jointsGrp)
def UI(self,parentLayout): jointsGrp = self.blueprintNamespace + ':' + self.moduleNamespace + ':joints_grp' joints = utils.findJointChain(jointsGrp) joints.pop(0) joints.pop() for joint in joints: fkControl = joint + '_fkControl' controlObjectInstance = controlObject.ControlObject(fkControl) controlObjectInstance.UI(parentLayout) cmds.attrControlGrp(attribute=fkControl+'.stretch',label='Stretch')
def match(self, *args): jointsGrp = self.blueprintNamespace + ":blueprint_joints_grp" joint = utils.findJointChain(jointsGrp)[1] globalControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":globalControl" position = cmds.xform(joint, q=True, ws=True, translation=True) orientation = cmds.xform(joint, q=True, ws=True, rotation=True) #scale = cmds.getAttr(joint+".scaleX") cmds.xform(globalControl, ws=True, absolute=True, translation=position) cmds.xform(globalControl, ws=True, absolute=True, rotation=orientation)
def UI(self, parentLayout): jointsGrp = self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp" joints = utils.findJointChain(jointsGrp) joints.pop(0) joints.pop() for joint in joints: fkControl = joint + "_fkControl" controlObjectInstance = controlObject.ControlObject(fkControl) controlObjectInstance.UI(parentLayout) cmds.attrControlGrp(attribute=fkControl+".stretch", label="Stretch")
def UI(self, parentLayout): armControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":armControl" controlObjectInstance = controlObject.ControlObject(armControl) controlObjectInstance.UI(parentLayout) cmds.attrControlGrp(attribute=armControl + ".stretchiness", label="Stretchiness") circleIK.CircleControlStretchyIK.UI(self, parentLayout) jointsGrp = self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp" joints = utils.findJointChain(jointsGrp)
def match(self, *args): characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.blueprintNamespace + ":" + self.moduleNamespace + ":module_container" containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) ikJointsAll = utils.findJointChain(self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp") blueprintJointsAll = utils.findJointChain(self.blueprintNamespace + ":blueprint_joints_grp") ikJoints = [ikJointsAll[1], ikJointsAll[2], ikJointsAll[3]] blueprintJoints = [ blueprintJointsAll[1], blueprintJointsAll[2], blueprintJointsAll[3] ] ikHandleControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":ikHandleControl" if cmds.objExists(ikHandleControl): cmds.setAttr(ikHandleControl + ".stretchiness", 1) endPos = cmds.xform(blueprintJoints[2], q=True, worldSpace=True, translation=True) cmds.xform(ikHandleControl, worldSpace=True, absolute=True, translation=endPos) twistControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":twistControl" utils.matchTwistAngle(twistControl + ".rotateZ", ikJoints, blueprintJoints) for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def UI(self, parentLayout): jointsGrp = self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp" joints = utils.findJointChain(jointsGrp) joints.pop(0) joints.pop() for joint in joints: fkControl = joint + "_fkControl" controlObjectInstance = controlObject.ControlObject(fkControl) controlObjectInstance.UI(parentLayout) cmds.attrControlGrp(attribute=fkControl + ".stretch", label="Stretch")
def match(self, *args): jointsGrp = self.blueprintNamespace+":blueprint_joints_grp" joint = utils.findJointChain(jointsGrp)[1] globalControl = self.blueprintNamespace+":"+self.moduleNamespace+":globalControl" position = cmds.xform(joint, q=True, ws=True, translation=True) orientation = cmds.xform(joint, q=True, ws=True, rotation=True) #scale = cmds.getAttr(joint+".scaleX") cmds.xform(globalControl, ws=True, absolute=True, translation=position) cmds.xform(globalControl, ws=True, absolute=True, rotation=orientation) #cmds.setAttr(globalControl+".globalScale", scale)
def match(self,*args): jointsGrp = self.blueprintNamespace+':blueprint_joints_grp' joint = utils.findJointChain(jointsGrp)[1] globalControl = self.blueprintNamespace+':'+self.moduleNamespace+':globalControl' position = cmds.xform(joint, q=True, worldSpace=True, translation=True) orientation = cmds.xform(joint, q=True, worldSpace=True, rotation=True) scale = cmds.getAttr(joint+'.scaleX') cmds.xform(globalControl, worldSpace=True, absolute=True, translation=position) cmds.xform(globalControl, worldSpace=True, absolute=True, rotation=orientation) cmds.setAttr(globalControl+'.globalScale',scale)
def UI(self, parentLayout): jointsGrp = self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp" joints = utils.findJointChain(jointsGrp) joints.pop(0) numJoints = len(joints) if numJoints > 1: numJoints -= 1 for i in range(numJoints): fkControl = joints[i] + "_fkControl" controlObjectInstance = controlObject.ControlObject(fkControl) controlObjectInstance.UI(parentLayout)
def install_requirements(self): blueprintJointsGrp = self.blueprintNamespace + ":blueprint_joints_grp" blueprintJoints = utils.findJointChain(blueprintJointsGrp) if len(blueprintJoints) >= 6: return True else: cmds.confirmDialog( title="Interpolation-based Stretchy Spline", message= "This control module can only be installed on spline blueprints with 5 joints or more", button=["Accept"], defaultButton="Accept") return False
def __init__(self, userSpecifiedName, hookObject, numberOfJoints=None, startJointPos=None, endJointPos=None): if numberOfJoints == None: jointsGrp = CLASS_NAME + "__" + userSpecifiedName +":joints_grp" if not cmds.objExists(jointsGrp): numberOfJoints = 5 # default else: joints = utils.findJointChain(jointsGrp) joints.pop() numberOfJoints = len(joints) jointInfo = [] gameJntNames = [] if startJointPos == None: startJointPos = [0.0, 0.0, 0.0] if endJointPos == None: endJointPos = [0.0, 5.0, 0.0] jointIncrement = list(endJointPos) jointIncrement[0] -= startJointPos[0] jointIncrement[1] -= startJointPos[1] jointIncrement[2] -= startJointPos[2] jointIncrement[0] /= (numberOfJoints - 1) jointIncrement[1] /= (numberOfJoints - 1) jointIncrement[2] /= (numberOfJoints - 1) jointPos = startJointPos for i in range(numberOfJoints): jointName = "spine_"+str(i)+"_joint" gameJntName = "spine_"+str(i) + "_" jointInfo.append([jointName, list(jointPos)]) gameJntNames.append(gameJntName) jointPos[0] += jointIncrement[0] jointPos[1] += jointIncrement[1] jointPos[2] += jointIncrement[2] blueprintMod.Blueprint.__init__(self, CLASS_NAME, userSpecifiedName, jointInfo, hookObject, gameJntNames, altCtrl=0) self.canBeMirrored = False
def UI(self, parentLayout): footControl = self.blueprintNamespace+":"+self.moduleNamespace+":footControl" controlObjectInstance = controlObject.ControlObject(footControl) controlObjectInstance.UI(parentLayout) cmds.attrControlGrp(attribute=footControl+".stretchiness", label="Stretchiness") circleIK.CircleControlStretchyIK.UI(self, parentLayout) jointsGrp = self.blueprintNamespace+":"+self.moduleNamespace+":joints_grp" joints = utils.findJointChain(jointsGrp) ballJoint = joints[4] toeJoint = joints[5] for joint in [ballJoint, toeJoint]: jointControl = joint+"_ryControl" controlObjectInstance = controlObject.ControlObject(jointControl) controlObjectInstance.UI(parentLayout)
def __init__(self, userSpecifiedName, hookObject, numberOfJoints=None, startJointPos=None, endJointPos=None): if numberOfJoints == None: jointsGrp = CLASS_NAME + '__' + userSpecifiedName + ':joints_grp' if not cmds.objExists(jointsGrp): numberOfJoints = 5 #default else: joints = utils.findJointChain(jointsGrp) joints.pop() numberOfJoints = len(joints) jointInfo = [] if startJointPos == None: startJointPos = [0.0,0.0,0.0] if endJointPos == None: endJointPos = [0.0,15.0,0.0] jointIncrement = list(endJointPos) jointIncrement[0] -= startJointPos[0] jointIncrement[1] -= startJointPos[1] jointIncrement[2] -= startJointPos[2] jointIncrement[0] /= (numberOfJoints - 1) jointIncrement[1] /= (numberOfJoints - 1) jointIncrement[2] /= (numberOfJoints - 1) jointPos = startJointPos for i in range(numberOfJoints): jointName = 'spline_' + str(i) + '_joint' jointInfo.append([jointName,list(jointPos)]) jointPos[0] += jointIncrement[0] jointPos[1] += jointIncrement[1] jointPos[2] += jointIncrement[2] blueprintMod.Blueprint.__init__(self, CLASS_NAME ,userSpecifiedName, jointInfo,hookObject) self.canBeMirrored = False
def UI(self, parentLayout): rootControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":rootControl" if cmds.objExists(rootControl): controlObjectInstance = controlObject.ControlObject(rootControl) controlObjectInstance.UI(parentLayout) jointsGrp = self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp" joints = utils.findJointChain(jointsGrp) joints.pop(0) joints.pop(0) joints.pop() for joint in joints: offsetControl = joint + "_offsetControl" controlObjectInstance = controlObject.ControlObject(offsetControl) controlObjectInstance.UI(parentLayout) endControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":endControl" controlObjectInstance = controlObject.ControlObject(endControl) controlObjectInstance.UI(parentLayout)
def UI(self, parentLayout): rootControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":rootControl" if cmds.objExists(rootControl): controlObjectInstance = controlObject.ControlObject(rootControl) controlObjectInstance.UI(parentLayout) jointsGrp = self.blueprintNamespace+":"+self.moduleNamespace+":joints_grp" joints = utils.findJointChain(jointsGrp) joints.pop(0) joints.pop(0) joints.pop() for joint in joints: offsetControl = joint+"_offsetControl" controlObjectInstance = controlObject.ControlObject(offsetControl) controlObjectInstance.UI(parentLayout) endControl = self.blueprintNamespace + ":" + self.moduleNamespace + ":endControl" controlObjectInstance = controlObject.ControlObject(endControl) controlObjectInstance.UI(parentLayout)
def duplicateControlModule(self,withAnimation=True): characterContainer = self.characterNamespaceOnly + ':character_container' blueprintContainer = self.blueprintNamespace + ':module_container' moduleContainer = self.moduleContainer containers = [characterContainer, blueprintContainer,moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) cmds.namespace(setNamespace=self.blueprintNamespace + ':' + self.moduleNamespace) allAnimationNodes = cmds.namespaceInfo(listOnlyDependencyNodes=True) allAnimationNodes = cmds.ls(allAnimationNodes, type='animCurve') containedAnimationNodes = cmds.container(moduleContainer, q=True, nodeList=True) containedAnimationNodes = cmds.ls(containedAnimationNodes, type='animCurve') animationNodes = [] spaceSwitchAnimationNodes = [] for node in allAnimationNodes: if not node in containedAnimationNodes: animationNodes.append(node) else: if node.rpartition('_')[2] == 'currentSpace': spaceSwitchAnimationNodes.append(node) cmds.namespace(setNamespace=':') utils.addNodeToContainer(moduleContainer, animationNodes) cmds.namespace(addNamespace='TEMP') cmds.namespace(setNamespace='TEMP') cmds.duplicate(moduleContainer, inputConnections=True) cmds.namespace(setNamespace=':'+self.blueprintNamespace) moduleNamespaces = cmds.namespaceInfo(listOnlyNamespaces=True) baseModuleNamespace = self.moduleNamespace.rpartition('_')[0] + '_' baseNamespace = self.blueprintNamespace + ':' + baseModuleNamespace highestSuffix = utils.findHighestTrailingNumber(moduleNamespaces, baseNamespace) highestSuffix += 1 newModuleNamespace = baseModuleNamespace + str(highestSuffix) cmds.namespace(addNamespace=newModuleNamespace) cmds.namespace(setNamespace=':') cmds.namespace(moveNamespace=['TEMP',self.blueprintNamespace+':'+newModuleNamespace]) cmds.namespace(removeNamespace='TEMP') oldModuleNamespace = self.moduleNamespace self.moduleNamespace = newModuleNamespace newModuleContainer = self.blueprintNamespace + ':' + self.moduleNamespace + ':module_container' utils.addNodeToContainer(blueprintContainer, newModuleContainer) publishedNameList = [] publishedNames = cmds.container(newModuleContainer, q=True, publishName=True) for name in publishedNames: drivenAttribute = cmds.connectionInfo(newModuleContainer + '.' + name, getExactSource=True) publishedNameList.append((name,drivenAttribute)) for name in publishedNameList: cmds.container(newModuleContainer,edit=True, unbindAndUnpublish=name[1]) nameInfo = name[0].partition(oldModuleNamespace) newName = nameInfo[0] + self.moduleNamespace + nameInfo[2] cmds.container(newModuleContainer,edit=True,publishAndBind=[name[1],newName]) self.moduleContainer = moduleContainer oldPublishedNames = self.findAllNamesPublishedToOuterContainers() newPublishedNames = [] for name in oldPublishedNames: nameInfo = name.partition(oldModuleNamespace) newPublishedNames.append((nameInfo[0] + self.moduleNamespace + nameInfo[2])) self.publishedNames = list(newPublishedNames) self.moduleContainer = newModuleContainer self.publishModuleContainerNamesToOuterContainers() deleteNodes = [] moduleJointsGrp = self.blueprintNamespace + ':' + self.moduleNamespace + ':joints_grp' self.joints = utils.findJointChain(moduleJointsGrp) for joint in self.joints: if cmds.objExists(joint + '_multiplyRotationsWeight'): deleteNodes.append(joint + '_multiplyRotationsWeight') if cmds.objExists(joint + '_multiplyTranslationWeight'): deleteNodes.append(joint + '_multiplyTranslationWeight') if cmds.objExists(joint + '_multiplyScaleWeight'): deleteNodes.append(joint + '_multiplyScaleWeight') cmds.delete(deleteNodes, inputConnectionsAndNodes=False) utilityNodes = self.setupBlueprintWeightBasedBlending() utils.addNodeToContainer(newModuleContainer, utilityNodes) cmds.container(moduleContainer,edit=True, removeNode=animationNodes) cmds.container(blueprintContainer,edit=True, removeNode=animationNodes) cmds.container(characterContainer,edit=True, removeNode=animationNodes) newAnimationNodes = [] for node in animationNodes: nodeName = utils.stripAllNamespaces(node)[1] newAnimationNodes.append(self.blueprintNamespace+':'+self.moduleNamespace+':'+nodeName) newSpaceSwitchAnimationNodes = [] for node in newSpaceSwitchAnimationNodes: nodeName = utils.stripAllNamespaces(node)[1] newSpaceSwitchAnimationNodes.append(self.blueprintNamespace+':'+self.moduleNamespace+':'+nodeName) if withAnimation: cmds.container(newModuleContainer,edit=True, removeNode=newAnimationNodes) cmds.container(blueprintContainer,edit=True, removeNode=newAnimationNodes) cmds.container(characterContainer,edit=True, removeNode=newAnimationNodes) else: if len(newAnimationNodes) >0: cmds.delete(newAnimationNodes) if len(newSpaceSwitchAnimationNodes) > 0: cmds.delete(newSpaceSwitchAnimationNodes) containers.append(newModuleContainer) for c in containers: cmds.lockNode(c,lock=True,lockUnpublished=True)
def install_custom(self,joints,moduleGrp,moduleContainer, createHandleControl=True, poleVectorAtRoot=True): rootJoint = joints[1] hingeJoint = joints[2] endJoint = joints[3] containedNodes = [] twistRotationAimer = cmds.group(empty=True,n=rootJoint+'_twistRotationAimer') containedNodes.append(twistRotationAimer) containedNodes.append(cmds.pointConstraint(rootJoint,twistRotationAimer,maintainOffset=False, n=twistRotationAimer+'_pointConstraint')[0]) cmds.pointConstraint(endJoint,twistRotationAimer,maintainOffset=False) upVectorTarget = cmds.group(empty=True, n=rootJoint+'_twistRotationAimer_upVectorTarget') containedNodes.append(upVectorTarget) cmds.parent(upVectorTarget, hingeJoint,relative=True) cmds.setAttr(upVectorTarget+'.translateZ',cmds.getAttr(hingeJoint+'.translateX')) containedNodes.append(cmds.aimConstraint(endJoint, twistRotationAimer, maintainOffset=False, n=twistRotationAimer+'_aimConstraint', aimVector=[0.0,0.0,1.0],upVector=[1.0,0.0,0.0],worldUpType='object',worldUpObject=upVectorTarget)[0]) tempLocator = cmds.spaceLocator()[0] cmds.parent(tempLocator, twistRotationAimer,relative=True) cmds.setAttr(tempLocator+'.translateY',10) twistRotationAimerPos = cmds.xform(twistRotationAimer,q=True, worldSpace=True, translation=True) tempLocatorPos = cmds.xform(tempLocator,q=True, worldSpace=True, translation=True) offsetVector = [tempLocatorPos[0] - twistRotationAimerPos[0],tempLocatorPos[1] - twistRotationAimerPos[1],tempLocatorPos[2] - twistRotationAimerPos[2]] cmds.delete(tempLocator) ikNodes = utils.basic_stretchy_IK(rootJoint,endJoint,container=moduleContainer,scaleCorrectionAttribute=self.blueprintNamespace+':module_grp.hierarchicalScale') ikHandle = ikNodes['ikHandle'] rootPosLocator = ikNodes['rootLocator'] endPosLocator = ikNodes['endLocator'] poleVectorLocator = ikNodes['poleVectorObject'] stretchinessAttribute = ikNodes['stretchinessAttribute'] for node in [ikHandle,rootPosLocator,endPosLocator,poleVectorLocator]: cmds.parent(node,moduleGrp,absolute=True) if poleVectorAtRoot: poleVectorPos = cmds.xform(rootJoint,q=True,worldSpace=True,translation=True) else: poleVectorPos = cmds.xform(endJoint,q=True,worldSpace=True,translation=True) poleVectorPos[0] += offsetVector[0] poleVectorPos[1] += offsetVector[1] poleVectorPos[2] += offsetVector[2] cmds.xform(poleVectorLocator,worldSpace=True,absolute=True,translation=poleVectorPos) if createHandleControl: name = 'ikHandleControl' controlObjectInstance = controlObject.ControlObject() handleControlInfo = controlObjectInstance.create(name,'cubeLocator.ma',self,lod=1,translation=True,rotation=False,globalScale=False,spaceSwitching=True) handleControl = handleControlInfo[0] handleRootParent = handleControlInfo[1] cmds.parent(handleRootParent,moduleGrp,relative=True) cmds.xform(handleControl,worldSpace=True,absolute=True,translation=cmds.xform(endPosLocator,q=True,worldSpace=True,translation=True)) pointConstraint = cmds.pointConstraint(handleControl,endPosLocator, maintainOffset=False,n=endPosLocator+'_pointConstraint')[0] containedNodes.append(pointConstraint) cmds.select(handleControl) cmds.addAttr(at='float',minValue=0.0, maxValue=1.0, defaultValue=1.0,keyable=True,longName='stretchiness') cmds.connectAttr(handleControl+'.stretchiness',stretchinessAttribute) self.publishNameToModuleContainer(handleControl+'.stretchiness', 'stretchiness',publishToOuterContainers=True) rotationCancellation = cmds.group(empty=True,n=self.blueprintNamespace+':'+self.moduleNamespace+':twistRotationCancellation') containedNodes.append(rotationCancellation) cmds.parent(rotationCancellation, twistRotationAimer,relative=True) twistControlOffset = cmds.group(empty=True,n=self.blueprintNamespace + ':' + self.moduleNamespace + ':twistControlOffset') containedNodes.append(twistControlOffset) cmds.parent(twistControlOffset, rotationCancellation, relative=True) twistControlObjectInstance = controlObject.ControlObject() twistControlInfo = twistControlObjectInstance.create('twistControl','zAxisCircle.ma',self, lod=2,translation=False,rotation=[False,False,True],globalScale=False, spaceSwitching=False) twistControl = twistControlInfo[0] cmds.parent(twistControl,twistControlOffset,relative=True) cmds.connectAttr(twistControl+'.rotateZ',ikHandle+'.twist') pivotMultNode = cmds.shadingNode('multiplyDivide',asUtility=True,n=twistControl+'_invertOffset') containedNodes.append(pivotMultNode) cmds.connectAttr(twistControlOffset+'.translateX',pivotMultNode+'.input1X') cmds.setAttr(pivotMultNode+'.input2X',-1) cmds.connectAttr(pivotMultNode+'.output', twistControl+'.rotatePivot') multNode = cmds.shadingNode('multiplyDivide', asUtility=True, n=rotationCancellation+'_invertRotateZ') containedNodes.append(multNode) cmds.connectAttr(twistControl+'.rotateZ',multNode+'.input1X') cmds.setAttr(multNode+'.input2X',-1) cmds.connectAttr(multNode+'.outputX',rotationCancellation+'.rotateZ') cmds.parent(twistRotationAimer,moduleGrp, absolute=True) ikJoints = [joints[1],joints[2],joints[3]] jointName = utils.stripAllNamespaces(joints[1])[1] creationPoseRoot = self.blueprintNamespace+':creationPose_'+jointName creationPoseJoints = utils.findJointChain(creationPoseRoot) targetJoints = [creationPoseJoints[0],creationPoseJoints[1],creationPoseJoints[2]] utils.matchTwistAngle(twistControl+'.rotateZ',ikJoints,targetJoints) offsetNode = cmds.shadingNode('plusMinusAverage',asUtility=True,n=twistControl+'_twistOffset') containedNodes.append(offsetNode) cmds.setAttr(offsetNode+'.input1D[0]',cmds.getAttr(twistControl+'.rotateZ')) cmds.connectAttr(twistControl+'.rotateZ',offsetNode+'.input1D[1]') cmds.connectAttr(offsetNode+'.output1D',ikHandle+'.twist',force=True) utils.forceSceneUpdate() cmds.setAttr(twistControl+'.rotateZ',0) utils.addNodeToContainer(moduleContainer,containedNodes) self.publishNameToModuleContainer(twistControlOffset+'.translateX','twistControlOffset',publishToOuterContainers=True) cmds.setAttr(moduleGrp+'.lod',2) return (ikNodes)
def duplicateControlModule(self, withAnimation=True): # Unlock containers characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.moduleContainer containers = [ characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) # Find all the animation nodes and determine which are user created, space switch, etc. cmds.namespace(setNamespace=self.blueprintNamespace + ":" + self.moduleNamespace) allAnimationNodes = cmds.namespaceInfo(listOnlyDependencyNodes=True) # Get all the animation curves allAnimationNodes = cmds.ls(allAnimationNodes, type="animCurve") # Find all contained animation nodes containedAnimationNodes = cmds.container(moduleContainer, q=True, nodeList=True) containedAnimationNodes = cmds.ls(containedAnimationNodes, type="animCurve") animationNodes = [] spaceSwitchAnimationNodes = [] for node in allAnimationNodes: if not node in containedAnimationNodes: animationNodes.append(node) else: if node.rpartition("_")[2] == "currentSpace": spaceSwitchAnimationNodes.append(node) # Set namespace back to Root cmds.namespace(setNamespace=":") utils.addNodeToContainer(moduleContainer, animationNodes) # Create temp namespace to duplicate nodes into. cmds.namespace(addNamespace="TEMP") cmds.namespace(setNamespace="TEMP") # Duplicate the entire module container cmds.duplicate(moduleContainer, inputConnections=True) cmds.namespace(setNamespace=":"+self.blueprintNamespace) moduleNamespaces = cmds.namespaceInfo(listOnlyNamespaces=True) baseModuleNamespace = self.moduleNamespace.rpartition("_")[0] + "_" baseNamespace = self.blueprintNamespace + ":" + baseModuleNamespace highestSuffix = utils.findHighestTrailingNumber(moduleNamespaces, baseNamespace) highestSuffix += 1 newModuleNamespace = baseModuleNamespace + str(highestSuffix) # Add the new module namespace and set the default namespace back to root. cmds.namespace(addNamespace=newModuleNamespace) cmds.namespace(setNamespace=":") cmds.namespace(moveNamespace=["TEMP", self.blueprintNamespace+":"+newModuleNamespace]) cmds.namespace(removeNamespace="TEMP") oldModuleNamespace = self.moduleNamespace self.moduleNamespace = newModuleNamespace newModuleContainer = self.blueprintNamespace + ":" + self.moduleNamespace + ":module_container" utils.addNodeToContainer(blueprintContainer, newModuleContainer) # Generate a publish name list. Name of the attribute on the container and the name of the attribute it is driving. publishedNameList = [] publishedNames = cmds.container(newModuleContainer, q=True, publishName=True) for name in publishedNames: drivenAttribute = cmds.connectionInfo(newModuleContainer+"."+name, getExactSource=True) publishedNameList.append( (name, drivenAttribute) ) # Now loop through the attribute names and rename the names on the container. #unbind the attributes on the new container. # This seems to be failing on the first .visibility attribute. A maya command error is returned. # I am adding a try so I can get past this for now. No fing clue why I error out. for name in publishedNameList: try: cmds.container(newModuleContainer, edit=True, unbindAndUnpublish=name[1]) nameInfo = name[0].partition(oldModuleNamespace) newName = nameInfo[0] + self.moduleNamespace + nameInfo[2] # Now that we have the new attribute name, publish that name to our container. cmds.container(newModuleContainer, edit=True, publishAndBind=[name[1], newName]) except: pass self.moduleContainer = moduleContainer oldPublishedNames = self.findAllNamesPublishedToOuterContainers() newPublishedNames = [] for name in oldPublishedNames: nameInfo = name.partition(oldModuleNamespace) newPublishedNames.append( (nameInfo[0] + self.moduleNamespace + nameInfo[2])) # Loop through and publish attributes to outer container. self.publishedNames = list(newPublishedNames) self.moduleContainer = newModuleContainer self.publishModuleContainerNamesToOuterContainers() deleteNodes = [] moduleJointsGrp = self.blueprintNamespace+":"+self.moduleNamespace+":joints_grp" self.joints = utils.findJointChain(moduleJointsGrp) for joint in self.joints: if cmds.objExists(joint+"_multiplyRotationsWeight"): deleteNodes.append(joint+"_multiplyRotationsWeight") if cmds.objExists(joint+"_multiplyTranslationWeight"): deleteNodes.append(joint+"_multiplyTranslationWeight")\ if cmds.objExists(joint+"_multiplyScaleWeight"): deleteNodes.append(joint+"_multiplyScaleWeight") cmds.delete(deleteNodes, inputConnectionsAndNodes=False) utilityNodes = self.setupBlueprintWeightBasedBlending() utils.addNodeToContainer(newModuleContainer, utilityNodes)
def uninstall(self): characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.moduleContainer # Unlock containers containers = [ characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) containers.pop() blueprintJointsGrp = self.blueprintNamespace + ":blueprint_joints_grp" blueprintJoints = utils.findJointChain(blueprintJointsGrp) blueprintJoints.pop(0) settingsLocator = self.blueprintNamespace+":SETTINGS" connections = cmds.listConnections(blueprintJoints[0]+"_addRotations", source=True, destination=False) if len(connections) == 2: cmds.setAttr(blueprintJointsGrp+".controlModulesInstalled", False) publishedNames = cmds.container(moduleContainer, q=True, publishName=True) publishedNames.sort() for name in publishedNames: outerPublishedNames = cmds.container(characterContainer, q=True, publishName=True) if name in outerPublishedNames: cmds.container(characterContainer, edit=True, unbindAndUnpublish=blueprintContainer+"."+name) cmds.container(blueprintContainer, edit=True, unbindAndUnpublish=moduleContainer+"."+name) cmds.delete(moduleContainer) weightAttributeName = self.moduleNamespace +"_weight" cmds.deleteAttr(settingsLocator+"."+weightAttributeName) attributes = cmds.listAttr(settingsLocator, keyable=False) weightAttributes = [] for attr in attributes: if attr.find("_weight") != -1: weightAttributes.append(attr) totalWeight = 0 for attr in weightAttributes: totalWeight += cmds.getAttr(settingsLocator+"."+attr) cmds.setAttr(settingsLocator+".creationPoseWeight", 1-totalWeight) currentEntries = cmds.attributeQuery("activeModule", n=settingsLocator, listEnum=True) currentEntriesList = currentEntries[0].split(":") ourEntry = self.moduleNamespace currentEntriesString = "" for entry in currentEntriesList: if entry != ourEntry: currentEntriesString += entry + ":" if currentEntriesString == "": currentEntriesString = "None" cmds.addAttr(settingsLocator+".activeModule", edit=True, enumName=currentEntriesString) cmds.setAttr(settingsLocator+".activeModule", 0) cmds.namespace(setNamespace=self.blueprintNamespace) cmds.namespace(removeNamespace=self.moduleNamespace) cmds.namespace(setNamespace=":") for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def install_custom(self, joints, moduleGrp, moduleContainer, createHandleControl=True, poleVectorAtRoot=True): rootJoint = joints[1] hingeJoint = joints[2] endJoint = joints[3] containedNodes = [] twistRotationAimer = cmds.group(empty=True, n=rootJoint + "_twistRotationAimer") containedNodes.append(twistRotationAimer) containedNodes.append( cmds.pointConstraint(rootJoint, twistRotationAimer, maintainOffset=False, n=twistRotationAimer + "_pointConstraint")[0]) cmds.pointConstraint(endJoint, twistRotationAimer, maintainOffset=False) upVectorTarget = cmds.group(empty=True, n=rootJoint + "_twistRotationAimer_upVectorTarget") containedNodes.append(upVectorTarget) cmds.parent(upVectorTarget, hingeJoint, relative=True) cmds.setAttr(upVectorTarget + ".translateZ", cmds.getAttr(hingeJoint + ".translateX")) containedNodes.append( cmds.aimConstraint(endJoint, twistRotationAimer, maintainOffset=False, n=twistRotationAimer + "_aimConstraint", aimVector=[0.0, 0.0, 1.0], upVector=[1.0, 0.0, 0.0], worldUpType="object", worldUpObject=upVectorTarget)[0]) tempLocator = cmds.spaceLocator()[0] cmds.parent(tempLocator, twistRotationAimer, relative=True) cmds.setAttr(tempLocator + ".translateY", 10) twistRotationAimerPos = cmds.xform(twistRotationAimer, q=True, worldSpace=True, translation=True) tempLocatorPos = cmds.xform(tempLocator, q=True, worldSpace=True, translation=True) offsetVector = [ tempLocatorPos[0] - twistRotationAimerPos[0], tempLocatorPos[1] - twistRotationAimerPos[1], tempLocatorPos[2] - twistRotationAimerPos[2] ] cmds.delete(tempLocator) ikNodes = utils.basic_stretchy_IK( rootJoint, endJoint, container=moduleContainer, scaleCorrectionAttribute=self.blueprintNamespace + ":module_grp.hierarchicalScale") ikHandle = ikNodes["ikHandle"] rootPosLocator = ikNodes["rootLocator"] endPosLocator = ikNodes["endLocator"] poleVectorLocator = ikNodes["poleVectorObject"] stretchinessAttribute = ikNodes["stretchinessAttribute"] for node in [ ikHandle, rootPosLocator, endPosLocator, poleVectorLocator ]: cmds.parent(node, moduleGrp, absolute=True) if poleVectorAtRoot: poleVectorPos = cmds.xform(rootJoint, q=True, worldSpace=True, translation=True) else: poleVectorPos = cmds.xform(endJoint, q=True, worldSpace=True, translation=True) poleVectorPos[0] += offsetVector[0] poleVectorPos[1] += offsetVector[1] poleVectorPos[2] += offsetVector[2] cmds.xform(poleVectorLocator, worldSpace=True, absolute=True, translation=poleVectorPos) if createHandleControl: name = "ikHandleControl" controlObjectInstance = controlObject.ControlObject() handleControlInfo = controlObjectInstance.create( name, "cubeLocator.ma", self, lod=1, translation=True, rotation=True, globalScale=False, spaceSwitching=True) handleControl = handleControlInfo[0] handleRootParent = handleControlInfo[1] cmds.parent(handleRootParent, moduleGrp, relative=True) cmds.xform(handleControl, worldSpace=True, absolute=True, translation=cmds.xform(endPosLocator, q=True, worldSpace=True, translation=True)) pointConstraint = cmds.pointConstraint(handleControl, endPosLocator, maintainOffset=False, n=endPosLocator + "_pointConstraint")[0] containedNodes.append(pointConstraint) cmds.select(handleControl) cmds.addAttr(at="float", minValue=0.0, maxValue=1.0, defaultValue=1.0, keyable=True, longName="stretchiness") cmds.connectAttr(handleControl + ".stretchiness", stretchinessAttribute) self.publishNameToModuleContainer(handleControl + ".stretchiness", "stretchiness", publishToOuterContainers=True) rotationCancellation = cmds.group(empty=True, n=self.blueprintNamespace + ":" + self.moduleNamespace + ":twistRotationCancellation") containedNodes.append(rotationCancellation) cmds.parent(rotationCancellation, twistRotationAimer, relative=True) twistControlOffset = cmds.group(empty=True, n=self.blueprintNamespace + ":" + self.moduleNamespace + ":twistControlOffset") containedNodes.append(twistControlOffset) cmds.parent(twistControlOffset, rotationCancellation, relative=True) twistControlObjectInstance = controlObject.ControlObject() twistControlInfo = twistControlObjectInstance.create( "twistControl", "zAxisCircle.ma", self, lod=2, translation=False, rotation=[False, False, True], globalScale=False, spaceSwitching=True) twistControl = twistControlInfo[0] cmds.parent(twistControl, twistControlOffset, relative=True) cmds.connectAttr(twistControl + ".rotateZ", ikHandle + ".twist") pivotMultNode = cmds.shadingNode("multiplyDivide", asUtility=True, n=twistControl + "_invertOffset") containedNodes.append(pivotMultNode) cmds.connectAttr(twistControlOffset + ".translateX", pivotMultNode + ".input1X") cmds.setAttr(pivotMultNode + ".input2X", -1) cmds.connectAttr(pivotMultNode + ".output", twistControl + ".rotatePivot") multNode = cmds.shadingNode("multiplyDivide", asUtility=True, n=rotationCancellation + "_invertRotateZ") containedNodes.append(multNode) cmds.connectAttr(twistControl + ".rotateZ", multNode + ".input1X") cmds.setAttr(multNode + ".input2X", -1) cmds.connectAttr(multNode + ".outputX", rotationCancellation + ".rotateZ") cmds.parent(twistRotationAimer, moduleGrp, absolute=True) ikJoints = [joints[1], joints[2], joints[3]] jointName = utils.stripAllNamespaces(joints[1])[1] creationPoseRoot = self.blueprintNamespace + ":creationPose_" + jointName creationPoseJoints = utils.findJointChain(creationPoseRoot) targetJoints = [ creationPoseJoints[0], creationPoseJoints[1], creationPoseJoints[2] ] utils.matchTwistAngle(twistControl + ".rotateZ", ikJoints, targetJoints) offsetNode = cmds.shadingNode("plusMinusAverage", asUtility=True, n=twistControl + "_twistOffset") containedNodes.append(offsetNode) cmds.setAttr(offsetNode + ".input1D[0]", cmds.getAttr(twistControl + ".rotateZ")) cmds.connectAttr(twistControl + ".rotateZ", offsetNode + ".input1D[1]") cmds.connectAttr(offsetNode + ".output1D", ikHandle + ".twist", force=True) utils.forceSceneUpdate() cmds.setAttr(twistControl + ".rotateZ", 0) utils.addNodeToContainer(moduleContainer, containedNodes) self.publishNameToModuleContainer(twistControlOffset + ".translateX", "twistControlOffset", publishToOuterContainers=True) cmds.setAttr(moduleGrp + ".lod", 2) return (ikNodes)
def install_custom(self,joints,moduleGrp,moduleContainer): containedNodes = [] rootJoint = joints[1] endJoint = joints[len(joints) -1] ikNodes = utils.basic_stretchy_IK(rootJoint, endJoint, container=moduleContainer, scaleCorrectionAttribute=self.blueprintNamespace+':module_grp.hierarchicalScale') ikHandle = ikNodes['ikHandle'] rootLocator = ikNodes['rootLocator'] endLocator = ikNodes['endLocator'] poleVectorLocator = ikNodes['poleVectorObject'] stretchinessAttribute = ikNodes['stretchinessAttribute'] for node in [rootLocator, ikHandle, poleVectorLocator]: cmds.parent(node, moduleGrp, absolute=True) name = 'ikHandleControl' controlObjectInstance = controlObject.ControlObject() handleControlInfo = controlObjectInstance.create(name, 'cubeLocator.ma', self , lod=1, translation=True, rotation=True, globalScale=False, spaceSwitching=True) handleControl = handleControlInfo[0] handleRootParent = handleControlInfo[1] cmds.parent(handleRootParent, moduleGrp, relative=True) cmds.xform(handleControl, worldSpace=True, absolute=True, translation=cmds.xform(endLocator, q=True, worldSpace=True, translation=True)) cmds.parent(endLocator, handleControl, absolute=True) handleControlParent = cmds.listRelatives(handleControl, parent=True)[0] preTransform = cmds.group(empty=True, n=handleControl+'_preTransform') containedNodes.append(preTransform) cmds.parent(preTransform, handleControl, relative=True) cmds.parent(preTransform, handleControlParent, absolute=True) cmds.parent(handleControl, preTransform, absolute=True) cmds.select(handleControl) cmds.addAttr(at='float', minValue=0.0, maxValue=1.0, defaultValue=1.0, keyable=True, longName='stretchiness') cmds.addAttr(at='float', softMinValue=360.0, softMaxValue=360.0, defaultValue=0.0, keyable=True, longName='twist') cmds.connectAttr(handleControl+'.twist', ikHandle+'.twist') cmds.connectAttr(handleControl+'.stretchiness', stretchinessAttribute) self.publishNameToModuleContainer(handleControl+'.twist', 'twist', publishToOuterContainers=True) self.publishNameToModuleContainer(handleControl+'.stretchiness', 'stretchiness', publishToOuterContainers=True) jointName = utils.stripAllNamespaces(rootJoint)[1] ikJoints = utils.findJointChain(rootJoint) targetJoints = utils.findJointChain(self.blueprintNamespace+':creationPose_'+jointName) utils.matchTwistAngle(handleControl+'.twist',ikJoints,targetJoints) offsetNode = cmds.shadingNode('plusMinusAverage', asUtility=True, n=handleControl+'_twistOffset') containedNodes.append(offsetNode) cmds.setAttr(offsetNode+'.input1D[0]',cmds.getAttr(handleControl+'.twist')) cmds.connectAttr(handleControl+'.twist', offsetNode+'.input1D[1]') cmds.connectAttr(offsetNode+'.output1D', ikHandle+'.twist', force=True) cmds.setAttr(handleControl+'.twist',0.0) utils.addNodeToContainer(moduleContainer,containedNodes)
def uninstall(self): characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.moduleContainer # Unlock containers containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) containers.pop() blueprintJointsGrp = self.blueprintNamespace + ":blueprint_joints_grp" blueprintJoints = utils.findJointChain(blueprintJointsGrp) blueprintJoints.pop(0) settingsLocator = self.blueprintNamespace + ":SETTINGS" connections = cmds.listConnections(blueprintJoints[0] + "_addRotations", source=True, destination=False) if len(connections) == 2: cmds.setAttr(blueprintJointsGrp + ".controlModulesInstalled", False) publishedNames = cmds.container(moduleContainer, q=True, publishName=True) publishedNames.sort() for name in publishedNames: outerPublishedNames = cmds.container(characterContainer, q=True, publishName=True) if name in outerPublishedNames: cmds.container(characterContainer, edit=True, unbindAndUnpublish=blueprintContainer + "." + name) cmds.container(blueprintContainer, edit=True, unbindAndUnpublish=moduleContainer + "." + name) cmds.delete(moduleContainer) weightAttributeName = self.moduleNamespace + "_weight" cmds.deleteAttr(settingsLocator + "." + weightAttributeName) attributes = cmds.listAttr(settingsLocator, keyable=False) weightAttributes = [] for attr in attributes: if attr.find("_weight") != -1: weightAttributes.append(attr) totalWeight = 0 for attr in weightAttributes: totalWeight += cmds.getAttr(settingsLocator + "." + attr) cmds.setAttr(settingsLocator + ".creationPoseWeight", 1 - totalWeight) currentEntries = cmds.attributeQuery("activeModule", n=settingsLocator, listEnum=True) currentEntriesList = currentEntries[0].split(":") ourEntry = self.moduleNamespace currentEntriesString = "" for entry in currentEntriesList: if entry != ourEntry: currentEntriesString += entry + ":" if currentEntriesString == "": currentEntriesString = "None" cmds.addAttr(settingsLocator + ".activeModule", edit=True, enumName=currentEntriesString) cmds.setAttr(settingsLocator + ".activeModule", 0) cmds.namespace(setNamespace=self.blueprintNamespace) cmds.namespace(removeNamespace=self.moduleNamespace) cmds.namespace(setNamespace=":") for c in containers: cmds.lockNode(c, lock=True, lockUnpublished=True)
def duplicateControlModule(self, withAnimation=True): # Unlock containers characterContainer = self.characterNamespaceOnly + ":character_container" blueprintContainer = self.blueprintNamespace + ":module_container" moduleContainer = self.moduleContainer containers = [characterContainer, blueprintContainer, moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) # Find all the animation nodes and determine which are user created, space switch, etc. cmds.namespace(setNamespace=self.blueprintNamespace + ":" + self.moduleNamespace) allAnimationNodes = cmds.namespaceInfo(listOnlyDependencyNodes=True) # Get all the animation curves allAnimationNodes = cmds.ls(allAnimationNodes, type="animCurve") # Find all contained animation nodes containedAnimationNodes = cmds.container(moduleContainer, q=True, nodeList=True) containedAnimationNodes = cmds.ls(containedAnimationNodes, type="animCurve") animationNodes = [] spaceSwitchAnimationNodes = [] for node in allAnimationNodes: if not node in containedAnimationNodes: animationNodes.append(node) else: if node.rpartition("_")[2] == "currentSpace": spaceSwitchAnimationNodes.append(node) # Set namespace back to Root cmds.namespace(setNamespace=":") utils.addNodeToContainer(moduleContainer, animationNodes) # Create temp namespace to duplicate nodes into. cmds.namespace(addNamespace="TEMP") cmds.namespace(setNamespace="TEMP") # Duplicate the entire module container cmds.duplicate(moduleContainer, inputConnections=True) cmds.namespace(setNamespace=":" + self.blueprintNamespace) moduleNamespaces = cmds.namespaceInfo(listOnlyNamespaces=True) baseModuleNamespace = self.moduleNamespace.rpartition("_")[0] + "_" baseNamespace = self.blueprintNamespace + ":" + baseModuleNamespace highestSuffix = utils.findHighestTrailingNumber( moduleNamespaces, baseNamespace) highestSuffix += 1 newModuleNamespace = baseModuleNamespace + str(highestSuffix) # Add the new module namespace and set the default namespace back to root. cmds.namespace(addNamespace=newModuleNamespace) cmds.namespace(setNamespace=":") cmds.namespace(moveNamespace=[ "TEMP", self.blueprintNamespace + ":" + newModuleNamespace ]) cmds.namespace(removeNamespace="TEMP") oldModuleNamespace = self.moduleNamespace self.moduleNamespace = newModuleNamespace newModuleContainer = self.blueprintNamespace + ":" + self.moduleNamespace + ":module_container" utils.addNodeToContainer(blueprintContainer, newModuleContainer) # Generate a publish name list. Name of the attribute on the container and the name of the attribute it is driving. publishedNameList = [] publishedNames = cmds.container(newModuleContainer, q=True, publishName=True) for name in publishedNames: drivenAttribute = cmds.connectionInfo(newModuleContainer + "." + name, getExactSource=True) publishedNameList.append((name, drivenAttribute)) # Now loop through the attribute names and rename the names on the container. #unbind the attributes on the new container. # This seems to be failing on the first .visibility attribute. A maya command error is returned. # I am adding a try so I can get past this for now. No fing clue why I error out. for name in publishedNameList: try: cmds.container(newModuleContainer, edit=True, unbindAndUnpublish=name[1]) nameInfo = name[0].partition(oldModuleNamespace) newName = nameInfo[0] + self.moduleNamespace + nameInfo[2] # Now that we have the new attribute name, publish that name to our container. cmds.container(newModuleContainer, edit=True, publishAndBind=[name[1], newName]) except: pass self.moduleContainer = moduleContainer oldPublishedNames = self.findAllNamesPublishedToOuterContainers() newPublishedNames = [] for name in oldPublishedNames: nameInfo = name.partition(oldModuleNamespace) newPublishedNames.append( (nameInfo[0] + self.moduleNamespace + nameInfo[2])) # Loop through and publish attributes to outer container. self.publishedNames = list(newPublishedNames) self.moduleContainer = newModuleContainer self.publishModuleContainerNamesToOuterContainers() deleteNodes = [] moduleJointsGrp = self.blueprintNamespace + ":" + self.moduleNamespace + ":joints_grp" self.joints = utils.findJointChain(moduleJointsGrp) for joint in self.joints: if cmds.objExists(joint + "_multiplyRotationsWeight"): deleteNodes.append(joint + "_multiplyRotationsWeight") if cmds.objExists(joint + "_multiplyTranslationWeight"): deleteNodes.append(joint+"_multiplyTranslationWeight")\ if cmds.objExists(joint + "_multiplyScaleWeight"): deleteNodes.append(joint + "_multiplyScaleWeight") cmds.delete(deleteNodes, inputConnectionsAndNodes=False) utilityNodes = self.setupBlueprintWeightBasedBlending() utils.addNodeToContainer(newModuleContainer, utilityNodes)
def install_custom(self, joints, moduleGrp, moduleContainer): containedNodes = [] rootJoint = joints[1] endJoint = joints[len(joints)-1] ikNodes = utils.basic_stretchy_IK(rootJoint, endJoint, container=moduleContainer, scaleCorrectionAttribute=self.blueprintNamespace+":module_grp.hierarchicalScale") ikHandle = ikNodes["ikHandle"] rootLocator = ikNodes["rootLocator"] endLocator = ikNodes["endLocator"] poleVectorLocator = ikNodes["poleVectorObject"] stretchinessAttribute = ikNodes["stretchinessAttribute"] # Create controls and parent ikHandles for node in [rootLocator, ikHandle, poleVectorLocator]: cmds.parent(node, moduleGrp, absolute=True) name = "ikHandleControl" # controlObject class controlObjectInstance = controlObject.ControlObject() handleControlInfo = controlObjectInstance.create(name, "cubeLocator.ma", self, lod=1, translation=True, rotation=False, globalScale=False, spaceSwitching=True) handleControl = handleControlInfo[0] handleRootParent = handleControlInfo[1] cmds.parent(handleRootParent, moduleGrp, relative=True) cmds.xform(handleControl, worldSpace=True, absolute=True, translation=cmds.xform(endLocator, q=True, worldSpace=True, translation=True)) cmds.parent(endLocator, handleControl, absolute=True) # Create a pre-transform node that sits above the control object. handleControlParent = cmds.listRelatives(handleControl, parent=True)[0] preTransform = cmds.group(empty=True, n=handleControl+"_preTransform") containedNodes.append(preTransform) cmds.parent(preTransform, handleControl, relative=True) cmds.parent(preTransform, handleControlParent, absolute=True) cmds.parent(handleControl, preTransform, absolute=True) #Add attributes to control cmds.select(handleControl) cmds.addAttr(at="float", minValue=0.0, maxValue=1.0, defaultValue=1.0, keyable=True, longName="stretchiness") cmds.addAttr(at="float", softMinValue=-360.0, softMaxValue=360.0, defaultValue=0.0, keyable=True, longName="twist") #connect attrs cmds.connectAttr(handleControl+".twist", ikHandle+".twist") cmds.connectAttr(handleControl+".stretchiness", stretchinessAttribute) # Add attrs to container self.publishNameToModuleContainer(handleControl+".twist", "twist", publishToOuterContainers=True) self.publishNameToModuleContainer(handleControl+".stretchiness", "stretchiness", publishToOuterContainers=True) # 171 > jointName = utils.stripAllNamespaces(rootJoint)[1] ikJoints = utils.findJointChain(rootJoint) targetJoints = utils.findJointChain(self.blueprintNamespace+":creationPose_"+jointName) utils.matchTwistAngle(handleControl+".twist", ikJoints, targetJoints) offsetNode = cmds.shadingNode("plusMinusAverage", asUtility=True, n=handleControl+"_twistOffset") containedNodes.append(offsetNode) cmds.setAttr(offsetNode+".input1D[0]", cmds.getAttr(handleControl+".twist")) cmds.connectAttr(handleControl+".twist", offsetNode+".input1D[1]") cmds.connectAttr(offsetNode+".output1D", ikHandle+".twist", force=True) cmds.setAttr(handleControl+".twist", 0.0) # < 171 utils.addNodeToContainer(moduleContainer, containedNodes)
def install_custom(self, joints, moduleGrp, moduleContainer, createHandleControl=True, poleVectorAtRoot=True): rootJoint = joints[1] hingeJoint = joints[2] endJoint = joints[3] containedNodes = [] twistRotationAimer = cmds.group(empty=True, n=rootJoint+"_twistRotationAimer") containedNodes.append(twistRotationAimer) containedNodes.append(cmds.pointConstraint(rootJoint, twistRotationAimer, maintainOffset=False, n=twistRotationAimer+"_pointConstraint")[0]) cmds.pointConstraint(endJoint, twistRotationAimer, maintainOffset=False) upVectorTarget = cmds.group(empty=True, n=rootJoint+"_twistRotationAimer_upVectorTarget") containedNodes.append(upVectorTarget) cmds.parent(upVectorTarget, hingeJoint, relative=True) cmds.setAttr(upVectorTarget+".translateZ", cmds.getAttr(hingeJoint+".translateX")) containedNodes.append(cmds.aimConstraint(endJoint, twistRotationAimer, maintainOffset=False, n=twistRotationAimer+"_aimConstraint", aimVector=[0.0, 0.0, 1.0], upVector=[1.0, 0.0, 0.0], worldUpType="object", worldUpObject=upVectorTarget)[0]) tempLocator = cmds.spaceLocator()[0] cmds.parent(tempLocator, twistRotationAimer, relative=True) cmds.setAttr(tempLocator+".translateY", 10) twistRotationAimerPos = cmds.xform(twistRotationAimer, q=True, worldSpace=True, translation=True) tempLocatorPos = cmds.xform(tempLocator, q=True, worldSpace=True, translation=True) offsetVector = [tempLocatorPos[0] - twistRotationAimerPos[0], tempLocatorPos[1] - twistRotationAimerPos[1], tempLocatorPos[2] - twistRotationAimerPos[2]] cmds.delete(tempLocator) ikNodes = utils.basic_stretchy_IK(rootJoint, endJoint, container=moduleContainer, scaleCorrectionAttribute=self.blueprintNamespace+":module_grp.hierarchicalScale") ikHandle = ikNodes["ikHandle"] rootPosLocator = ikNodes["rootLocator"] endPosLocator = ikNodes["endLocator"] poleVectorLocator = ikNodes["poleVectorObject"] stretchinessAttribute = ikNodes["stretchinessAttribute"] for node in [ikHandle, rootPosLocator, endPosLocator, poleVectorLocator]: cmds.parent(node, moduleGrp, absolute=True) if poleVectorAtRoot: poleVectorPos = cmds.xform(rootJoint, q=True, worldSpace=True, translation=True) else: poleVectorPos = cmds.xform(endJoint, q=True, worldSpace=True, translation=True) poleVectorPos[0] += offsetVector[0] poleVectorPos[1] += offsetVector[1] poleVectorPos[2] += offsetVector[2] cmds.xform(poleVectorLocator, worldSpace=True, absolute=True, translation=poleVectorPos) if createHandleControl: name = "ikHandleControl" controlObjectInstance = controlObject.ControlObject() handleControlInfo = controlObjectInstance.create(name, "cubeLocator.ma", self, lod=1, translation=True, rotation=True, globalScale=False, spaceSwitching=True) handleControl = handleControlInfo[0] handleRootParent = handleControlInfo[1] cmds.parent(handleRootParent, moduleGrp, relative=True) cmds.xform(handleControl, worldSpace=True, absolute=True, translation=cmds.xform(endPosLocator, q=True, worldSpace=True, translation=True)) pointConstraint = cmds.pointConstraint(handleControl, endPosLocator, maintainOffset=False, n=endPosLocator+"_pointConstraint")[0] containedNodes.append(pointConstraint) cmds.select(handleControl) cmds.addAttr(at="float", minValue=0.0, maxValue=1.0, defaultValue=1.0, keyable=True, longName="stretchiness") cmds.connectAttr(handleControl+".stretchiness", stretchinessAttribute) self.publishNameToModuleContainer(handleControl+".stretchiness", "stretchiness", publishToOuterContainers=True) rotationCancellation = cmds.group(empty=True, n=self.blueprintNamespace+":"+self.moduleNamespace+":twistRotationCancellation") containedNodes.append(rotationCancellation) cmds.parent(rotationCancellation, twistRotationAimer, relative=True) twistControlOffset = cmds.group(empty=True, n=self.blueprintNamespace + ":" + self.moduleNamespace + ":twistControlOffset") containedNodes.append(twistControlOffset) cmds.parent(twistControlOffset, rotationCancellation, relative=True) twistControlObjectInstance = controlObject.ControlObject() twistControlInfo = twistControlObjectInstance.create("twistControl", "zAxisCircle.ma", self, lod=2, translation=False, rotation=[False, False, True], globalScale=False, spaceSwitching=True) twistControl = twistControlInfo[0] cmds.parent(twistControl, twistControlOffset, relative=True) cmds.connectAttr(twistControl+".rotateZ", ikHandle+".twist") pivotMultNode = cmds.shadingNode("multiplyDivide", asUtility=True, n=twistControl+"_invertOffset") containedNodes.append(pivotMultNode) cmds.connectAttr(twistControlOffset+".translateX", pivotMultNode+".input1X") cmds.setAttr(pivotMultNode+".input2X", -1) cmds.connectAttr(pivotMultNode+".output", twistControl+".rotatePivot") multNode = cmds.shadingNode("multiplyDivide", asUtility=True, n=rotationCancellation+"_invertRotateZ") containedNodes.append(multNode) cmds.connectAttr(twistControl+".rotateZ", multNode+".input1X") cmds.setAttr(multNode+".input2X", -1) cmds.connectAttr(multNode+".outputX", rotationCancellation+".rotateZ") cmds.parent(twistRotationAimer, moduleGrp, absolute=True) ikJoints = [joints[1], joints[2], joints[3]] jointName = utils.stripAllNamespaces(joints[1])[1] creationPoseRoot = self.blueprintNamespace+":creationPose_"+jointName creationPoseJoints = utils.findJointChain(creationPoseRoot) targetJoints = [creationPoseJoints[0], creationPoseJoints[1], creationPoseJoints[2]] utils.matchTwistAngle(twistControl+".rotateZ", ikJoints, targetJoints) offsetNode = cmds.shadingNode("plusMinusAverage", asUtility=True, n=twistControl+"_twistOffset") containedNodes.append(offsetNode) cmds.setAttr(offsetNode+".input1D[0]", cmds.getAttr(twistControl+".rotateZ")) cmds.connectAttr(twistControl+".rotateZ", offsetNode+".input1D[1]") cmds.connectAttr(offsetNode+".output1D", ikHandle+".twist", force=True) utils.forceSceneUpdate() cmds.setAttr(twistControl+".rotateZ", 0) utils.addNodeToContainer(moduleContainer, containedNodes) self.publishNameToModuleContainer(twistControlOffset+".translateX", "twistControlOffset", publishToOuterContainers=True) cmds.setAttr(moduleGrp+".lod", 2) return(ikNodes)
def uninstall(self): characterContainer = self.characterNamespaceOnly + ':character_container' blueprintContainer = self.blueprintNamespace + ':module_container' moduleContainer = self.moduleContainer containers = [characterContainer, blueprintContainer,moduleContainer] for c in containers: cmds.lockNode(c, lock=False, lockUnpublished=False) containers.pop() blueprintJointsGrp = self.blueprintNamespace + ':blueprint_joints_grp' blueprintJoints = utils.findJointChain(blueprintJointsGrp) blueprintJoints.pop(0) settingsLocator = self.blueprintNamespace + ':SETTINGS' connections = cmds.listConnections(blueprintJoints[0]+'_addRotations',source=True, destination=False) if len(connections) == 2: cmds.setAttr(blueprintJointsGrp + '.controlModulesInstalled',False) publishedNames = cmds.container(moduleContainer,q=True,publishName=True) publishedNames.sort() for name in publishedNames: outerPublishedNames = cmds.container(characterContainer, q=True,publishName=True) if name in outerPublishedNames: cmds.container(characterContainer, edit=True, unbindAndUnpublish=blueprintContainer+'.'+name) cmds.container(blueprintContainer, edit=True, unbindAndUnpublish=moduleContainer+'.'+name) cmds.delete(moduleContainer) weightAttributeName = self.moduleNamespace + '_weight' cmds.deleteAttr(settingsLocator + '.' + weightAttributeName) attributes = cmds.listAttr(settingsLocator,keyable=False) weightAttributes = [] for attr in attributes: if attr.find('_weight') != -1: weightAttributes.append(attr) totalWeight = 0 for attr in weightAttributes: totalWeight += cmds.getAttr(settingsLocator + '.' + attr) cmds.setAttr(settingsLocator+'.creationPoseWeight', 1-totalWeight) currentEntries = cmds.attributeQuery('activeModule',n=settingsLocator, listEnum=True) currentEntriesList = currentEntries[0].split(':') ourEntry = self.moduleNamespace currentEntriesString = '' for entry in currentEntriesList: if entry != ourEntry: currentEntriesString += entry + ':' if currentEntriesString == '': currentEntriesString = 'None' cmds.addAttr(settingsLocator + '.activeModule',edit=True,enumName=currentEntriesString) cmds.setAttr(settingsLocator + '.activeModule',0) cmds.namespace(setNamespace=self.blueprintNamespace) cmds.namespace(removeNamespace=self.moduleNamespace) cmds.namespace(setNamespace=':') for c in containers: cmds.lockNode(c,lock=True, lockUnpublished=True)