Esempio n. 1
0
 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)
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)
Esempio n. 6
0
 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
Esempio n. 8
0
    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
Esempio n. 9
0
 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')
Esempio n. 11
0
    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)
Esempio n. 12
0
 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")
Esempio n. 13
0
    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)
Esempio n. 15
0
    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")
Esempio n. 16
0
 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)
Esempio n. 18
0
 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
Esempio n. 20
0
    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
Esempio n. 21
0
 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)
Esempio n. 27
0
    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)
Esempio n. 28
0
 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)
Esempio n. 31
0
    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)
Esempio n. 32
0
    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)
Esempio n. 33
0
 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)