示例#1
0
def mirror(objects):    
    '''check which side to mirror'''        
    
    for obj in objects:
        
        if obj.find(cn.type['r']) != -1:
            side = cn.type['r'], cn.type['l']
        
        if obj.find(cn.type['l']) != -1:
            side = cn.type['l'], cn.type['r']        
        
        if pymel.nodeType(obj) == 'joint':
            
            pymel.mirrorJoint(obj, mirrorYZ=True, mb=True, sr=(side))
            
        if obj.find(cn.type['ctrl']) != -1:
             
            d = pymel.duplicate(obj)
            n = obj.replace(side[0],side[1])
            
            
            pymel.rename(d, n)
            
            if d[0].find('IKFK')== -1:                
                d[0].scaleX.set(-1)
                #d[0].scaleY.set(-1)
                pymel.makeIdentity(d[0], a=True)
                pymel.delete(obj, ch=True)
    def createJoints(self):
        points = [
            pm.PyNode(guide).getRotatePivot(space='world')
            for guide in self.starter_Shoulder
        ]
        self.shoulder_chain = Joint.Joint.point_base(
            *points,
            name='{Side}__{Basename}'.format(**self.nameStructure),
            chain=True,
            padding=2)
        self.clavicule_joint, self.shoulder_joint, = self.shoulder_chain.joints

        pm.PyNode(self.clavicule_joint).rename(
            '{Side}__{Basename}_{Parts[0]}_END'.format(**self.nameStructure))
        pm.PyNode(self.shoulder_joint).rename(
            '{Side}__{Basename}_{Parts[1]}_END'.format(**self.nameStructure))
        adb.AutoSuffix(self.shoulder_chain.joints)

        ## orient joint
        if self.side == NC.RIGTH_SIDE_PREFIX:
            mirror_chain_1 = pm.mirrorJoint(self.clavicule_joint, mirrorYZ=1)
            Joint.Joint(mirror_chain_1).orientAxis = '-Y'

            mirror_chain_3 = pm.mirrorJoint(mirror_chain_1[0],
                                            mirrorBehavior=1,
                                            mirrorYZ=1)
            pm.delete(mirror_chain_1, self.clavicule_joint)
            self.shoulder_chain = Joint.Joint(mirror_chain_3)
            self.clavicule_joint, self.shoulder_joint, = self.shoulder_chain.joints

            pm.PyNode(self.clavicule_joint).rename(
                '{Side}__{Basename}_{Parts[0]}_END'.format(
                    **self.nameStructure))
            pm.PyNode(self.shoulder_joint).rename(
                '{Side}__{Basename}_{Parts[1]}_END'.format(
                    **self.nameStructure))
            adb.AutoSuffix(self.shoulder_chain.joints)
        else:
            self.shoulder_chain.orientAxis = '-Y'

        pm.parent(self.clavicule_joint, self.shoulder_MOD.OUTPUT_GRP)
        self.shoulderOffsetGrp = adb.makeroot_func(self.clavicule_joint,
                                                   suff='Offset',
                                                   forceNameConvention=True)

        self.shoulder_chain.radius = self.config['JOINTS']["Result_JNT"][
            'radius']
        self.nameStructure['Suffix'] = NC.VISRULE
        moduleBase.ModuleBase.setupVisRule(
            [self.clavicule_joint], self.shoulder_MOD.VISRULE_GRP,
            '{Side}__{Basename}_Clavicule_JNT__{Suffix}'.format(
                **self.nameStructure), True)

        return self.shoulder_chain.joints
 def generateHands(self, _wristTwist=False):
     # TODO: orient hand bone away from elbow
     self.r_hand = []
     self.r_thumbJoints = []
     self.r_indexJoints = []
     self.r_midJoints = []
     self.r_ringJoints = []
     self.r_pinkyJoints = []
     delta = self.loc_r_hand.t.get()
     localPos = self.loc_r_hand.localPosition.get()
     self.r_hand = pm.joint(p=delta + localPos, n='bind_r_hand')
     pm.parent(self.r_hand, self.r_armJoints[-1])
     self.r_hand.jointOrient.set(0, 0, 0)
     self.r_thumbJoints = self.generateFinger(self.handLocators[1],
                                              self.handLocators[2], 'thumb',
                                              'r', 1)
     self.r_indexJoints = self.generateFinger(self.handLocators[3],
                                              self.handLocators[4], 'index',
                                              'r')
     self.r_midJoints = self.generateFinger(self.handLocators[5],
                                            self.handLocators[6], 'mid',
                                            'r')
     self.r_ringJoints = self.generateFinger(self.handLocators[7],
                                             self.handLocators[8], 'ring',
                                             'r')
     self.r_pinkyJoints = self.generateFinger(self.handLocators[9],
                                              self.handLocators[10],
                                              'pinky', 'r')
     pm.parent(self.r_thumbJoints[0], self.r_hand)
     pm.parent(self.r_indexJoints[0], self.r_hand)
     pm.parent(self.r_midJoints[0], self.r_hand)
     pm.parent(self.r_ringJoints[0], self.r_hand)
     pm.parent(self.r_pinkyJoints[0], self.r_hand)
     self.r_arm_ikHandle = pm.ikHandle(n='ik_r_arm',
                                       sj=self.r_armJoints[1],
                                       ee=self.r_armJoints[3],
                                       sol='ikRPsolver')
     self.l_armJoints = pm.mirrorJoint(self.r_armJoints[0],
                                       mb=1,
                                       mxy=1,
                                       sr=('_r_', '_l_'))
     self.l_arm_ikHandle = pm.ikHandle(n='ik_l_arm',
                                       sj=self.l_armJoints[1],
                                       ee=self.l_armJoints[3],
                                       sol='ikRPsolver')
     self.l_hand = self.l_armJoints[4]
     self.l_thumbJoints = self.l_armJoints[5:8]
     self.l_indexJoints = self.l_armJoints[8:12]
     self.l_midJoints = self.l_armJoints[12:16]
     self.l_ringJoints = self.l_armJoints[16:20]
     self.l_pinkyJoints = self.l_armJoints[20:24]
     if _wristTwist:
         twistEnds = []
         twistEnds.append(self.l_armJoints[2])
         twistEnds.append(self.l_armJoints[3])
         self.generateTwistSystem(twistEnds, self.l_hand)
         twistEnds = []
         twistEnds.append(self.r_armJoints[2])
         twistEnds.append(self.r_armJoints[3])
         self.generateTwistSystem(twistEnds, self.r_hand, True)
 def generateLegs(self):
     self.r_legJoints = []
     self.generateLimb('l', 'r_leg', self.legLocators, self.r_legJoints,
                       self.spineJoints[len(self.spineJoints) - 1], False)
     self.r_footJoints = []
     self.generateLimb('l', 'r_foot', self.footLocators, self.r_footJoints,
                       self.r_legJoints[-1], False)
     l_legJoints_raw = pm.mirrorJoint(self.r_legJoints[0],
                                      mb=1,
                                      mxy=1,
                                      sr=('r_', 'l_'))
     i = 2
     self.l_legJoints = l_legJoints_raw[:i + 1]
     l_footJointsRaw = l_legJoints_raw[2 + 1:]
     self.l_footJoints = []
     for i in l_footJointsRaw:
         if pm.nodeType(i) == 'joint':
             self.l_footJoints.append(i)
     self.l_leg_ikHandle = pm.ikHandle(n='ik_l_leg',
                                       sj=self.l_legJoints[0],
                                       ee=self.l_legJoints[-1],
                                       sol='ikRPsolver')
     self.r_leg_ikHandle = pm.ikHandle(n='ik_r_leg',
                                       sj=self.r_legJoints[0],
                                       ee=self.r_legJoints[-1],
                                       sol='ikRPsolver')
 def generateLimb(self,
                  _limbSide,
                  _limbName,
                  _limbLocators,
                  _limbJtArray,
                  _rootJt,
                  _mirror=True,
                  _prefix='bind'):
     # Pass this the name of the limb, eg. 'r_arm'
     # Pass it the list of locators created for that limb
     # Pass it an empty list, and it will add that limbs bones to the list
     # Generate limb bones -------------------------------------------------
     for i in _limbLocators:
         delta = i.t.get()
         trans = i.localPosition.get()
         splitLocName = str(_limbLocators[_limbLocators.index(i)])[3:]
         newJt = pm.joint(p=(trans + delta), n=_prefix + splitLocName)
         _limbJtArray.append(newJt)
         pm.parent(w=1)
     # Orient limb bones --------------------------------------------------
     i = 0
     while i < len(_limbJtArray):
         if i < len(_limbJtArray) - 1:
             # TODO: work out why the reorienting shit doesn't work in the
             # aimAt method
             _limbJtArray[i].jointOrient.set([0, 0, 0])
             self.aimAt(_limbJtArray[i], _limbJtArray[i + 1])
             rotVal = _limbJtArray[i].rotate.get()
             _limbJtArray[i].jointOrient.set(rotVal)
             _limbJtArray[i].r.set([0, 0, 0])
         else:
             _limbJtArray[i].jointOrient.set([0, 0, 0])
         i = i + 1
     # Parent the joints ---------------------------------------------------
     j = 0
     while j < len(_limbJtArray):
         if j < len(_limbJtArray) - 1:
             pm.parent(_limbJtArray[j + 1], _limbJtArray[j])
         j = j + 1
     pm.parent(_limbJtArray[0], _rootJt)
     _limbJtArray[-1].jointOrient.set([0, 0, 0])
     if _mirror:
         pm.mirrorJoint(_limbJtArray[0],
                        mb=1,
                        mxy=1,
                        sr=('_r_', '_' + _limbSide + '_'))
示例#6
0
def mirrorJnt(revjntnamelist, sfx, sfx_r):
    sfx = "_L"
    jntnamelistL = []
    revjntnamelistL = []
    for jnt in jntnamelist[0:-1]:
        newname = pm.rename(jnt, str(jnt) + sfx)
        jntnamelistL.append(newname)
    for jnt in revjntnamelist:
        newname = pm.rename(jnt, str(jnt) + sfx)
        revjntnamelistL.append(newname)

    pm.mirrorJoint(pm.ls(revjntnamelistL[0]),
                   mirrorBehavior=True,
                   searchReplace=(sfx, sfx_r))
    pm.mirrorJoint(pm.ls(jntnamelistL[0]),
                   mirrorBehavior=True,
                   searchReplace=(sfx, sfx_r))
示例#7
0
    def mirror_joint_pressed(self, sender, option):
        src = option['search'].text()
        re = option['replace'].text()

        if sender == self.ui.mj_change_btn:
            option['search'].setText(re)
            option['replace'].setText(src)

        if sender == self.ui.mj_mirror_btn:
            joint_selected = pm.ls(os=True, type='joint')

            pm.mirrorJoint(joint_selected,
                           mirrorBehavior=option['fnBehave'].isChecked(),
                           mirrorXY=option['acrossXY'].isChecked(),
                           mirrorXZ=option['acrossXZ'].isChecked(),
                           mirrorYZ=option['acrossYZ'].isChecked(),
                           searchReplace=(src, re))
示例#8
0
def buildJoints():

    orientSkeleton()

    # Set twist translations
    for jnt in pm.ls('*Twist_R', type='joint'):
        jnt.translateY.set(0)
        jnt.translateZ.set(0)

    # Set control joint translations
    matchCtrlTranslations()

    # Mirror joints
    for jnt in 'Eye_R', 'CTRLIKArm_R', 'CTRLIKLeg_R', 'CTRLPoleArm_R', 'CTRLPoleLeg_R':
        pm.mirrorJoint(jnt, searchReplace=('_R', '_L'))

    for jnt in 'Clavicle_R', 'Hip_R', 'BreastBase_R', 'ButtockBase_R':
        pm.mirrorJoint(jnt, searchReplace=('_R', '_L'), mirrorBehavior=True)
示例#9
0
	def _mirrorJoint(self , list = None):
		'''
		cerate mirror joint 
		@list : list , is list
		'''
		if list[0].name().find('R') is -1 :
			
			mirrorName =  [pm.mirrorJoint(a , mirrorYZ = 1 ,mirrorBehavior =1 ,searchReplace =('L' , 'R'))[0] for a in list]
			pm.select(mirrorName)
			mirrorNameList = pm.selected()
			OpenMaya.MGlobal_clearSelectionList()
			return mirrorNameList
		if list[0].name().find('L') is -1 :
			mirrorName =  [pm.mirrorJoint(a , mirrorYZ = 1 ,mirrorBehavior =1 ,searchReplace =('R' , 'L'))[0] for a in list]
			pm.select(mirrorName)
			mirrorNameList = pm.selected()
			OpenMaya.MGlobal_clearSelectionList()
			return mirrorNameList	
示例#10
0
def mirrorRotate(transforms=None, axis=pcfg.default_mirror_axis, swap=None):
    """
    Mirrors the given transforms across the given axis set up to be used as a mirror rotate transform.

    Args:
        transforms (list): Transforms to mirror across given axis.

        axis (string): Name of axis to mirror across.

        swap (list): Words to search and replace. Will search for first index, and replace with second index.

    Returns:
        (list): Joints that were mirrored. Note that all their children get mirrored as well.
    """
    mirrored_transforms = []
    transforms = myu.validateSelect(transforms)
    options = {
        'mxy': False,
        'myz': False,
        'mxz': False,
        'mb': True,
        'sr': swap
    }

    if axis == 'x':
        options['myz'] = True
    elif axis == 'y':
        options['mxz'] = True
    elif axis == 'z':
        options['mxy'] = True
    else:
        pm.error('No valid axis given. Pick "x", "y", or "z".')

    for transform in transforms:
        name = transform.nodeName()

        if not swap:
            if name.endswith(pcfg.left_suffix):
                options['sr'] = [pcfg.left_suffix, pcfg.right_suffix]
            elif name.endswith(pcfg.right_suffix):
                options['sr'] = [pcfg.right_suffix, pcfg.left_suffix]
            else:
                options['sr'] = ['', '']

        mirrored_joint = pm.mirrorJoint(transform, **options)[0]
        mirrored_joint = pm.PyNode(mirrored_joint)
        mirrored_transforms.append(mirrored_joint)
        joint_parent = mirrored_joint.getParent()

        if joint_parent:
            pm.parent(mirrored_joint, w=True)
            parent([mirrored_joint, joint_parent])

    return mirrored_transforms
示例#11
0
 def mirrorJoint(self, metaJoint):
     """
     Mirror the meta joint on YZ axis
     @param metaJoint: The meta joint being mirrored
     """
     mirrorKwargs = {"mirrorYZ": True}
     if self.mirrorMode == "Behaviour":
         mirrorKwargs["mirrorBehavior"] = True
     mirroredJoint = pm.mirrorJoint(metaJoint.pynode, **mirrorKwargs)[0]
     metaJoint.snap(mirroredJoint)
     libUtilities.freeze_rotation(metaJoint.pynode)
     pm.delete(mirroredJoint)
示例#12
0
 def mirrorJoint(self, metaJoint):
     """
     Mirror the meta joint on YZ axis
     @param metaJoint: The meta joint being mirrored
     """
     mirrorKwargs = {"mirrorYZ": True}
     if self.mirrorMode == "Behaviour":
         mirrorKwargs["mirrorBehavior"] = True
     mirroredJoint = pm.mirrorJoint(metaJoint.pynode, **mirrorKwargs)[0]
     metaJoint.snap(mirroredJoint)
     libUtilities.freeze_rotation(metaJoint.pynode)
     pm.delete(mirroredJoint)
示例#13
0
def mirror_joints(mir_xy=False,
                  mir_yz=True,
                  mir_xz=False,
                  search='lt',
                  replace='rt'):
    selection = pm.ls(sl=True, type='transform')

    for each in selection:
        joint_chain = pm.ls(each, dag=True)
        if pm.nodeType(joint_chain[0]) == 'joint':
            pm.mirrorJoint(joint_chain[0],
                           mirrorBehavior=True,
                           mirrorXY=mir_xy,
                           mirrorYZ=mir_yz,
                           mirrorXZ=mir_xz,
                           searchReplace=[search, replace])
            pm.select(cl=True)
        else:
            print(
                "You tried to mirror an object that isn't a joint. This tool only functions on joints."
            )
示例#14
0
def _mirror( topJoint ):
    grp = pm.group( topJoint )

    grp.setRotatePivot( (0,0,0) )
    original = pm.select( grp.getChildren()[0], r=1)
    mirrored = [ Joint(m) for m in pm.mirrorJoint( mirrorYZ=1, mirrorBehavior=1 ) ]

    pm.parent( mirrored[0], w=1 )

    pm.delete( original, grp )
    for m in mirrored:
        m.rename( m[:-1] )

    return mirrored
示例#15
0
def mirrorRig(side):
    selection = pm.ls(sl=1)
    if len(selection):
        anim_root = selection[0]
        parent_anim_root = anim_root.getParent()
        name = anim_root.name().replace(side + '_', 'r_')
        dup = None
        if side == 'l':
            dup = pm.duplicate()
            pm.parent(dup, 'anim_spine4')
            mirrored = pm.mirrorJoint(mirrorYZ=1,
                                      mirrorBehavior=1,
                                      searchReplace=("l_", "r_"))
            search = pm.ls(parent_anim_root.name().replace('l_', 'r_'))
            if len(search):
                pm.parent(mirrored[0], search[0])
                pm.delete(dup)
                pm.rename(mirrored[0], name)
                mirrorNodes(anim_root, side)
        elif side == 'r':
            # implement
            pass
示例#16
0
def mirrorJointsYZ(*args):
	pm.mirrorJoint(myz = True, mb = True, sr = ("lt_", "rt_"))
示例#17
0
def build_skeleton(side=None, joint_list=None):

    pm.select(deselect=True)

    armJointNames = [
        '_scapula_jnt', '_shoulder_jnt', '_elbow_jnt', '_hand_jnt',
        '_hand_end_jnt'
    ]
    legJointNames = [
        '_hip_jnt', '_knee_jnt', '_ankle_jnt', '_foot_back_jnt', '_foot_jnt',
        '_foot_end_jnt'
    ]

    armMatches = filter(lambda s: 'arm' in str(s), joint_list)
    legMatches = filter(lambda s: 'leg' in str(s), joint_list)
    spineMatches = filter(lambda s: 'spine' in str(s), joint_list)

    if len(armMatches) > 1:
        # create joints
        for i in range(len(joint_list)):
            pm.joint(name=side + armJointNames[i],
                     p=(pm.PyNode(joint_list[i]).getTranslation('world')))

        # orient joints
        for i in range(len(joint_list)):
            pm.select(side + armJointNames[i])
            pm.joint(e=True,
                     oj='yxz',
                     secondaryAxisOrient='zup',
                     ch=True,
                     zso=True)

        # mirror joints
        pm.select(side + armJointNames[0])
        pm.mirrorJoint(mirrorYZ=True,
                       mirrorBehavior=True,
                       searchReplace=("L_", "R_"))

    elif len(legMatches) > 1:
        # create joints
        for i in range(len(joint_list)):
            print joint_list[i]
            if not joint_list[i] == side + '_leg_3_rigHelper':
                pm.joint(name=side + legJointNames[i],
                         p=(pm.PyNode(joint_list[i]).getTranslation('world')))

        # orient joints
        for i in range(len(joint_list)):
            if not legJointNames[i] == '_foot_back_jnt':
                pm.select(side + legJointNames[i])
                pm.joint(e=True,
                         oj='yxz',
                         secondaryAxisOrient='zup',
                         ch=True,
                         zso=True)

        # mirror joints
        pm.select(side + legJointNames[0])
        pm.mirrorJoint(mirrorYZ=True,
                       mirrorBehavior=True,
                       searchReplace=("L_", "R_"))

    elif len(spineMatches) > 1:
        # spine names
        spineNameList = [
            'COG_jnt', 'spine01_jnt', 'spine02_jnt', 'spine03_jnt',
            'spine04_jnt', 'spine05_jnt', 'spine06_jnt', 'spine07_jnt',
            'spine08_jnt', 'spine09_jnt', 'spine10_jnt'
        ]

        spineTopNameList = [
            'head_end_jnt', 'head_jnt', 'neck_jnt', 'chest_jnt'
        ]

        # create joints, we discard the last one, so the head is not created
        for i in range(int(len(joint_list) - 1)):
            pm.joint(name=spineNameList[i],
                     p=(pm.PyNode(joint_list[i]).getTranslation('world')))

        # orient joints

        for i in range(int(len(joint_list) - 1)):
            pm.select(spineNameList[i])
            pm.joint(e=True,
                     oj='yxz',
                     secondaryAxisOrient='zup',
                     ch=True,
                     zso=True)

        # rename the last 4 joints to match the rigging naming convention
        pm.select('COG_jnt')
        spineJointList = pm.listRelatives(ad=True, c=True)

        for i in range(4):
            pm.rename(spineJointList[i], spineTopNameList[i])
示例#18
0
        def createJoints():
            points = [
                pm.PyNode(guide).getRotatePivot(space='world')
                for guide in self.starter_Foot
            ]
            self.foot_chain = Joint.Joint.point_base(
                *points,
                name='{Side}__{Basename}'.format(**self.nameStructure),
                chain=True,
                padding=2)
            self.footAnkle_joint, self.footBall_joint, self.footToes_joint, self.footHeel_joint, = self.foot_chain.joints

            # Parenting the joints
            pm.parent(self.footHeel_joint, self.footAnkle_joint)
            pm.PyNode(self.footAnkle_joint).rename(
                '{Side}__{Basename}_{Parts[0]}_END'.format(
                    **self.nameStructure))
            pm.PyNode(self.footBall_joint).rename(
                '{Side}__{Basename}_{Parts[1]}_END'.format(
                    **self.nameStructure))
            pm.PyNode(self.footToes_joint).rename(
                '{Side}__{Basename}_{Parts[2]}_END'.format(
                    **self.nameStructure))
            pm.PyNode(self.footHeel_joint).rename(
                '{Side}__{Basename}_{Parts[3]}_END'.format(
                    **self.nameStructure))
            adb.AutoSuffix(self.foot_chain.joints)

            pm.parent(self.footAnkle_joint, self.Foot_MOD.OUTPUT_GRP)
            self.footOffsetGrp = self.createPivotGrps(
                self.footAnkle_joint,
                name='{Basename}_Offset'.format(**self.nameStructure))

            ## orient joint
            if self.side == NC.RIGTH_SIDE_PREFIX:
                mirror_chain_1 = pm.mirrorJoint(self.footAnkle_joint,
                                                mirrorYZ=1)
                mirror_chain_3 = pm.mirrorJoint(mirror_chain_1[0],
                                                mirrorBehavior=1,
                                                mirrorYZ=1)
                pm.delete(self.footAnkle_joint, mirror_chain_1)
                self.foot_chain = Joint.Joint(mirror_chain_3)
                self.footAnkle_joint, self.footBall_joint, self.footToes_joint, self.footHeel_joint = self.foot_chain.joints

                pm.PyNode(self.footAnkle_joint).rename(
                    '{Side}__{Basename}_{Parts[0]}_END'.format(
                        **self.nameStructure))
                pm.PyNode(self.footBall_joint).rename(
                    '{Side}__{Basename}_{Parts[1]}_END'.format(
                        **self.nameStructure))
                pm.PyNode(self.footToes_joint).rename(
                    '{Side}__{Basename}_{Parts[2]}_END'.format(
                        **self.nameStructure))
                pm.PyNode(self.footHeel_joint).rename(
                    '{Side}__{Basename}_{Parts[3]}_END'.format(
                        **self.nameStructure))
                adb.AutoSuffix(self.foot_chain.joints)

            pm.makeIdentity(self.footOffsetGrp.getChildren(),
                            n=0,
                            t=1,
                            apply=True,
                            pn=1)
            adb.makeroot_func(self.footOffsetGrp,
                              suff='Output',
                              forceNameConvention=1)
            Transform(self.footOffsetGrp).pivotPoint = Transform(
                self.footAnkle_joint).worldTrans

            self.foot_chain.radius = 1.0
            self.nameStructure['Suffix'] = NC.VISRULE
            moduleBase.ModuleBase.setupVisRule(
                [self.footAnkle_joint], self.Foot_MOD.VISRULE_GRP,
                '{Side}__{Basename}_JNT__{Suffix}'.format(
                    **self.nameStructure), True)
            return self.foot_chain.joints
示例#19
0
def build():
	side = 'L'

	armHelpersList      = []
	shoulderHelpersList = []
	legHelpersList      = []
	spineHelpersList    = []
	footHelperList      = []
	neckHelperList      = []
	headHelperList      = []

	# spine helper list generation
	for i in range(len(pm.ls('M_spine*_rigHelper'))-2):
		spineHelpersList.append('M_spine%s_rigHelper' %str(i))

	# head helper list generation
	for i in reversed(range(len(pm.ls('M_spine*_rigHelper')))):
		if i > 3:
			headHelperList.append('M_spine%s_rigHelper' %str(i))
	headHelperList.reverse()

	# neck helper list generation
	for i in range(len(pm.ls('M_spine*_rigHelper'))):
		if i > 2 and i < 5:
			neckHelperList.append('M_spine%s_rigHelper' %str(i))

	armHelpersList      = pm.ls(side + '_arm1_rigHelper', side + '_arm2_rigHelper', side + '_arm3_rigHelper')
	shoulderHelpersList = (side + '_arm0_rigHelper', side + '_arm1_rigHelper')
	legHelpersList      = pm.ls(side + '_leg*rigHelper')

	handHelperListLeft  = (side + '_arm3_rigHelper', side + '_arm4_rigHelper')
	handHelperListRight = ('R' + '_arm3_rigHelper', side + '_arm4_rigHelper')
	footHelperList      = pm.ls(side + '_leg_2_rigHelper', side + '_leg_4_rigHelper', side + '_leg_5_rigHelper')

	armJnts   = generateJoints(side=side, baseName='arm', helperList=armHelpersList, discardLast=0)
	legJnts   = generateJoints(side=side, baseName='leg', helperList=legHelpersList, discardLast=3)
	handJnts  = generateJoints(side=side, baseName='hand', helperList=handHelperListLeft, discardLast=0)
	footJnts  = generateJoints(side=side, baseName='foot', helperList=footHelperList, discardLast=0)

	spineJnts = generateJoints(side='M', baseName='spine', helperList=spineHelpersList, discardLast=0)
	neckJnts  = generateJoints(side='M', baseName='neck', helperList=neckHelperList, discardLast=0)
	headJnts  = generateJoints(side='M', baseName='head', helperList=headHelperList, discardLast=0)

	# orient joints
	# for i1, i2, i3, i4, i5. i6, i7 in zip(spineJnts, armJnts, legJnts, handJnts, footJnts, neckJnts, headJnts):
	# 	pm.select(jnt)
	# 	pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)

	for jnt in spineJnts:
		pm.select(jnt)
		pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)

	for jnt in armJnts:
		pm.select(jnt)
		pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)

	for jnt in legJnts:
		pm.select(jnt)
		pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)

	for jnt in handJnts:
		pm.select(jnt)
		pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)

	for jnt in footJnts:
		pm.select(jnt)
		pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)

	for jnt in neckJnts:
		pm.select(jnt)
		pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)

	for jnt in headJnts:
		pm.select(jnt)
		pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True)


	#  mirror joints
	for jnt in [armJnts[0], legJnts[0], footJnts[0], handJnts[0]]:
		pm.select(jnt)
		pm.mirrorJoint(mirrorYZ=True, mirrorBehavior=True, searchReplace=("L_", "R_"))
示例#20
0
	def bipedLimb_pack( self, ctrlSize=1.0, FKIKMode='FKIK', mirror=True, numOfSegs=6, bendy=True, mode='arm', *args ):

		try:# if in UI mode, get number of joints from UI
			ctrlSize = pm.floatSliderGrp( self.spineSizeF, q=True, value=True)
			selectedMode = pm.radioCollection( self.characterModeRC, q=True, select=True)
			mode = pm.radioButton( selectedMode, q=True, label=True ).lower()
			numOfSegs = pm.intSliderGrp( self.numOfJntsIS, q=True, value=True)
			bendy = pm.checkBox( self.bendyCB, q=True, value=True )		
		except:
			pass
		
		bipedLimbJnts = []
		FKIKstuff = []
		OSbipedLimbJnts = []	
		OSFKIKstuff = []	
		
		#============================================================================
		# find some info for naming and control sizes

		side = self.BipedLimbInitJnts[0].name()[0]
		limbLen = Dist( self.BipedLimbInitJnts[0] , self.BipedLimbInitJnts[1] )
		
		otherSide = 'R'
		if side == 'R':
			otherSide = 'L'	
		
		
		#============================================================================
		# getting info from selected objects
		if mode == 'arm':
			firstInitJnt 	= 	self.BipedLimbInitJnts[0]
			secondInitJnt 	= 	self.BipedLimbInitJnts[1]
			thirdInitJnt 	=	self.BipedLimbInitJnts[2]
			forthInitJnt 	= 	self.BipedLimbInitJnts[3]

			armPos 		= 	self.worldPos( firstInitJnt )
			elbowPos  	= 	self.worldPos( secondInitJnt )
			handPos  	= 	self.worldPos( thirdInitJnt )
			handEndPos  = 	self.worldPos( forthInitJnt )

		elif mode == 'leg':
			firstInitJnt 		= 	self.BipedLimbInitJnts[0]
			secondInitJnt 		= 	self.BipedLimbInitJnts[1]
			thirdInitJnt 		=	self.BipedLimbInitJnts[2]
			heelInitJnt 	    = 	self.BipedLimbInitJnts[3]
			forthInitJnt 	    = 	self.BipedLimbInitJnts[4]
			toeEndInitJnt 	    = 	self.BipedLimbInitJnts[5]
			outsideInitJnt 	    = 	self.BipedLimbInitJnts[6]
			insideInitJnt 	    = 	self.BipedLimbInitJnts[7]
			
			upLegPos 			= 	self.worldPos( firstInitJnt )
			kneePos      		= 	self.worldPos( secondInitJnt )
			anklePos      		= 	self.worldPos( thirdInitJnt )
			ballPos         	= 	self.worldPos( forthInitJnt )
			toeEndPos      	 	= 	self.worldPos( toeEndInitJnt )
			heelPos        	 	= 	self.worldPos( heelInitJnt )
			outsidePos      	= 	self.worldPos( outsideInitJnt )
			insidePos       	= 	self.worldPos( insideInitJnt )

			


		#============================================================================
		# create arm or leg joints
		if mode == 'arm':
			pm.select ( cl = True )
			upLimbJnt =pm.joint ( p = armPos  , name = ( side + "_upArm_jnt" ) )

			midLimbJnt = pm.joint ( p = elbowPos , name = ( side + "_elbow_jnt" ) )
			pm.joint( upLimbJnt, e=True, zso=True, oj='xyz', sao='yup')

			butLimbJnt = pm.joint ( p = handPos , name = ( side + "_hand_jnt" ) )
			pm.joint( midLimbJnt,  e=True, zso=True, oj='xyz', sao='yup')

			handEndJnt = pm.joint ( p = handEndPos , name = ( side + "_hand_end_jnt" ) )
			pm.joint( butLimbJnt,  e=True, zso=True, oj='xyz', sao='yup')

			bipedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, handEndJnt ]

		elif mode == 'leg':
			pm.select ( cl = True )
			upLimbJnt =pm.joint ( p = upLegPos  , name = ( side + "_upLeg_jnt" ) )

			midLimbJnt = pm.joint ( p = kneePos , name = ( side + "_knee_jnt" ) )
			pm.joint( upLimbJnt, e=True, zso=True, oj='xzy', sao='xup')

			butLimbJnt = pm.joint ( p = anklePos , name = ( side + "_ankle_jnt" ) )
			pm.joint( midLimbJnt,  e=True, zso=True, oj='xzy', sao='xup')

			ballJnt = pm.joint ( p = ballPos , name = ( side + "_ball_jnt" ) )
			pm.joint( butLimbJnt,  e=True, zso=True, oj='xzy', sao='xup')
			
			toeEndJnt = pm.joint ( p = toeEndPos , name = ( side + "_toeEnd_jnt" ) )
			pm.joint( ballJnt,  e=True, zso=True, oj='xzy', sao='xup')
			
			pm.select(clear=True)
			heelJnt = pm.joint ( p = heelPos , name = ( side + "_heel_jnt" ) )

			pm.select(clear=True)
			outsideJnt = pm.joint ( p = outsidePos , name = ( side + "_outside_jnt" ) )

			pm.select(clear=True)
			insideJnt = pm.joint ( p = insidePos , name = ( side + "_inside_jnt" ) )
			
			bipedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, ballJnt, toeEndJnt, heelJnt,outsideJnt,insideJnt ]


				
		#============================================================================
		# find the pole vector position
		# orient joints and set preferred angle
		
		# find pole vector position
		PVposition = FindPVposition( objs= (upLimbJnt, midLimbJnt, butLimbJnt) )

		if mode == 'arm': # arm mode .................................................
			
			if PVposition: # arm is bent!
				# create and position aim locator
				aimLoc = pm.spaceLocator()
				PVposition = FindPVposition( objs= (upLimbJnt, midLimbJnt, butLimbJnt) )
				aimLoc.translate.set( PVposition )
			
			else: # arm is not bent!
				# create and position aim locator
				aimLoc = pm.spaceLocator()
				pm.parent( aimLoc, midLimbJnt )
				pm.makeIdentity( aimLoc, t=True, r=True, s=True )
				aimLoc.translateZ.set( -limbLen*1.5 )
				pm.parent( aimLoc, w=True)
				aimLoc.rotate.set( 0,0,0 )

			# rotate the aim to match the rotation of the arm
			pm.delete( pm.aimConstraint( midLimbJnt, aimLoc, worldUpType="object", aimVector=(1,0,0), upVector=(0,1,0), worldUpObject= butLimbJnt  ) )

			# orient joints according to aim locator
			for jnt in ( upLimbJnt, midLimbJnt, butLimbJnt ):
				OriJnt( jnt=jnt, upAim=aimLoc , aimAxis='-z' )
				
			# set preferred angle
			midLimbJnt.preferredAngleY.set( -90 )
			
			poleVectorTransform = None
			footRotate = None
			

			

		elif mode == 'leg': # leg mode .................................................
			
			if PVposition: # leg is bent!
				# create and position aim locator
				aimLoc = pm.spaceLocator()
				PVposition = FindPVposition( objs= (upLimbJnt, midLimbJnt, butLimbJnt) )
				aimLoc.translate.set( PVposition )
				
			else: # leg is not bent!
				PVposition = self.PVbyToeJnt( upLimbJnt, midLimbJnt, toeEndJnt )
				# create and position aim locator
				aimLoc = pm.spaceLocator()
				aimLoc.translate.set( PVposition ) # position aim in front of the foot
				
			# rotate the aim to match the rotation of the arm
			pm.delete( pm.aimConstraint( midLimbJnt, aimLoc, worldUpType="object", aimVector=(1,0,0), upVector=(0,1,0), worldUpObject= butLimbJnt  ) )

			# orient joints according to aim locator
			for jnt in bipedLimbJnts[:-4]:
				OriJnt( jnt=jnt, upAim=aimLoc , aimAxis='-y' )

			# set preferred angle
			midLimbJnt.preferredAngleZ.set( 90 )
			
			# find foot Y rotation to pass to rigIK and rigFKIK
			footRotateY = ProjectedAim( objs=( butLimbJnt , toeEndJnt ) )
			footRotate = ( 0, footRotateY, 0 )					

		# pole vector transformations to be passed to rigIK and rigFKIK
		PVposition = pm.xform( aimLoc, q=True, ws=True, t=True )
		PVrotation = pm.xform( aimLoc, q=True, ws=True, ro=True )
		poleVectorTransform = ( PVposition, PVrotation )
		
		

		#============================================================================
		# If mirror is ON
		if mirror == True:
			# mirror joints
			OSjnts =  pm.mirrorJoint( upLimbJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) )
			if mode=='leg':
				OSjnts.append( pm.mirrorJoint( heelJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) )
				OSjnts.append( pm.mirrorJoint( outsideJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) )
				OSjnts.append( pm.mirrorJoint( insideJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) )
			OSbipedLimbJnts = pm.ls( OSjnts )

			# transforms of mirrored pole vector
			OSaimLoc = MirrorObjLikeJnt( aimLoc )[0]
			OSPVposition = pm.xform( OSaimLoc, q=True, ws=True, t=True )
			OSPVrotation = pm.xform( OSaimLoc, q=True, ws=True, ro=True )
			OSpoleVectorTransform = ( OSPVposition, OSPVrotation )
			
			# transforms of mirrored hand or foot control
			footNull = pm.group(em=True)
			if mode=='leg':
				footNull.translate.set( anklePos )
				footNull.rotate.set( footRotate )
			elif mode=='arm':
				footNull.translate.set( handPos )
			
			OShandTransforms = MirrorObjLikeJnt( objs=footNull, returnValue=True )
			OSfootRotate = OShandTransforms[0][1]
			pm.delete( footNull )


		#============================================================================
		# create IK, FK rigs and blend them
		
		
		# FK mode =============
		if FKIKMode == 'FK':
			RigFK( jnts = OSbipedLimbJnts, side = side )
			# other side
			if mirror:
				RigFK( jnts = OSbipedLimbJnts, side=otherSide )

			

		# IK mode =============
		elif FKIKMode == 'IK':
			armRigStuff = RigIK( 		  jnts=bipedLimbJnts
										, mode=mode
										, side = side
										, poleVectorTransform=poleVectorTransform
										, footRotate=footRotate
										, rigHandOrFoot=True
										, ctrlSize = ctrlSize )
			
			
			# other side
			if mirror:
				OSarmRigStuff = RigIK( 		  jnts=OSbipedLimbJnts 
											, mode=mode
											, side=otherSide
											, poleVectorTransform=OSpoleVectorTransform
											, mirrorMode=True
											, footRotate=OSfootRotate
											, rigHandOrFoot=True
											, ctrlSize = ctrlSize )
				

		# FKIK mode =============
		elif FKIKMode == 'FKIK':
			# for i in ( bipedLimbJnts, mode, side, poleVectorTransform, footRotate ):
				# print i
			# return None			
			FKIKstuff = RigFKIK( 		  jnts=bipedLimbJnts
										, mode=mode
										, side=side
										, poleVectorTransform=poleVectorTransform
										, footRotate=footRotate
										, rigHandOrFoot=True
										, ctrlSize = ctrlSize )
			
			# other side
			if mirror:
				OSFKIKstuff = RigFKIK( 		  jnts=OSbipedLimbJnts
											, mode=mode
											, side=otherSide
											, poleVectorTransform=OSpoleVectorTransform
											, mirrorMode=True
											, footRotate=(0,0,0)
											, rigHandOrFoot=True )
				
				'''
				OSFKIKstuff = RigFKIK( 		  jnts=OSbipedLimbJnts
											, mode=mode
											, side=otherSide
											, poleVectorTransform=OSpoleVectorTransform
											, mirrorMode=True
											, footRotate=OSfootRotate
											, rigHandOrFoot=True )
				'''
		
		
		#============================================================================
		# rig bendy limbs
		bendies = RigBendyLimb( jnts=bipedLimbJnts[:3]
								, bendyCtrl=FKIKstuff[3]
								, numOfSegs= numOfSegs
								, side=side )
		if mirror:
			OSbendies = RigBendyLimb( jnts=OSbipedLimbJnts[:3]
									, bendyCtrl=OSFKIKstuff[3]
									, numOfSegs= numOfSegs
									, isMirroredJoint=True
									, side=otherSide )
		
		# clean up
		pm.delete( self.BipedLimbInitJnts, aimLoc )
		bendies[-1].setParent( FKIKstuff[-1] )
		if mirror:
			pm.delete( OSaimLoc )
			OSbendies[-1].setParent( OSFKIKstuff[-1] )
示例#21
0
def MirrorObjLikeJnt( objs=None, returnValue=False ):
	
	if objs==None:
		objs = pm.ls( sl=True )
	else:
		objs = pm.ls( objs )
	
	
	newObjs = []
	values = []
		
	for obj in objs:
		nameSpaceAndName = obj.name().split(":")
		if len( nameSpaceAndName ) > 1:
			objNameSpace = nameSpaceAndName[0]
			objName = nameSpaceAndName[1]
		else:
			objName = obj.name()		
		if objName[:2]==('L_'):
			side = 'L'
			otherSide = 'R'
		elif objName[:2]==('R_'):
			side = 'R'
			otherSide = 'L'			
		else:
			side = ''
			otherSide = ''		
		
		origParent = obj.getParent()
		
		scale = obj.scale.get()
		obj.scale.set( 1,1,1 )
		
		pm.select( obj )

		jnt = pm.joint()

		pm.parent( jnt , w=True )
		pm.parent( obj, jnt )

		newJntStrings = pm.ls( pm.mirrorJoint( jnt, mirrorYZ=True, mirrorBehavior=True ) )
		for newJntString in newJntStrings:
			newName = newJntString.replace( side, otherSide  )[:-1]
			try:
				pm.rename( newJntString , newName )
			except:
				pass
		
		obj.scale.set( scale )
		
		newJnt = newJntStrings[0]
		newObj = newJntStrings[1]

		if not origParent:
			pm.parent( obj		, world=True )
			pm.parent( newObj	, world=True )
		else:
			pm.parent( obj		, origParent )
			pm.parent( newObj	, origParent )

		pm.delete( jnt , newJnt )
		reverseShape.ReverseShape( newObj )
		newObjs.append( newObj )
		newObj.scale.set( scale )		
		if returnValue:
			pos = pm.xform( newObj, q=True, ws=True, t=True )
			rot = pm.xform( newObj, q=True, ws=True, ro=True )
			values.append( (pos,rot) )
			
	if returnValue:
		pm.delete(newObjs)
		return values
	else:
		return newObjs
示例#22
0
def QuadrupedLimb_pack( **kwargs ):
	FKIKMode = kwargs.setdefault( 'FKIKMode', 'FKIK' )
	mirror = kwargs.setdefault( 'mirror', True )
	numOfSegs = kwargs.setdefault( 'numOfSegs',10 )
	bendy = kwargs.setdefault( 'bendy', True  )
	mode = kwargs.setdefault( 'mode', 'arm' )

	quadrupedLimbJnts = []
	FKIKstuff = []
	OSquadrupedLimbJnts = []	
	OSFKIKstuff = []	
	
	#============================================================================
	# find some info for naming and control sizes

	side = QuadrupedLimbInitJnts[0].name()[0]
	limbLen = GNL.dist.Dist( QuadrupedLimbInitJnts[0] , QuadrupedLimbInitJnts[1] )
	
	otherSide = 'R'
	if side == 'R':
		otherSide = 'L'	
	
	
	#============================================================================
	# def for rigging the hand  
	def RigHand( butLimbJnt, endLimbJnt, father ):
		side = butLimbJnt.name()[0]
		handIKStuff = pm.ikHandle(  sj = butLimbJnt, ee = endLimbJnt, solver = "ikSCsolver"  )
		handIK = pm.rename ( handIKStuff[0] , ( side + "_hand_ikh") )
		pm.parent( handIK, father )
		father.scale >> butLimbJnt.scale		
		LockHideAttr( objs = handIKStuff, attr='vv' )

		
	#============================================================================
	# def for rigging single chain joints
	def RigSingleChain( startJnt, endJnt, father ):
		side = startJnt.name()[0]
		IKStuff = pm.ikHandle(  sj = startJnt, ee = endJnt, solver = "ikSCsolver"  )
		IK = pm.rename ( IKStuff[0] , ( side + "_sc_ikh") )
		pm.parent( IK, father )
		father.scale >> startJnt.scale		
		GNL.lockHideAttr.LockHideAttr( objs = IKStuff, attr='vv' )
				


	#============================================================================
	# getting info from selected objects
	if mode == 'arm':
		firstInitJnt 	= 	QuadrupedLimbInitJnts[0]
		secondInitJnt 	= 	QuadrupedLimbInitJnts[1]
		thirdInitJnt 	=	QuadrupedLimbInitJnts[2]
		forthInitJnt 	= 	QuadrupedLimbInitJnts[3]

		armPos 		= 	WorldPos( firstInitJnt )
		elbowPos  	= 	WorldPos( secondInitJnt )
		handPos  	= 	WorldPos( thirdInitJnt )
		handEndPos  = 	WorldPos( forthInitJnt )

	elif mode == 'leg':
		firstInitJnt 	= 	QuadrupedLimbInitJnts[0]
		secondInitJnt 	= 	QuadrupedLimbInitJnts[1]
		thirdInitJnt 	=	QuadrupedLimbInitJnts[2]
		heelInitJnt 	    = 	QuadrupedLimbInitJnts[3]
		forthInitJnt 	    = 	QuadrupedLimbInitJnts[4]
		toeEndInitJnt 	    = 	QuadrupedLimbInitJnts[5]
	
		upLegPos 		= 	WorldPos( firstInitJnt )
		kneePos      	= 	WorldPos( secondInitJnt )
		anklePos      	= 	WorldPos( thirdInitJnt )
		heelPos         = 	WorldPos( heelInitJnt )
		ballPos         = 	WorldPos( forthInitJnt )
		toeEndPos        = 	WorldPos( toeEndInitJnt )

	#============================================================================
	# create arm or leg joints
	if mode == 'arm':
		pm.select ( cl = True )
		upLimbJnt =pm.joint ( p = armPos  , name = ( side + "_upArm_jnt" ) )

		midLimbJnt = pm.joint ( p = elbowPos , name = ( side + "_elbow_jnt" ) )
		pm.joint( upLimbJnt, e=True, zso=True, oj='xyz', sao='yup')

		butLimbJnt = pm.joint ( p = handPos , name = ( side + "_hand_jnt" ) )
		pm.joint( midLimbJnt,  e=True, zso=True, oj='xyz', sao='yup')

		endLimbJnt = pm.joint ( p = handEndPos , name = ( side + "_hand_end_jnt" ) )
		pm.joint( butLimbJnt,  e=True, zso=True, oj='xyz', sao='yup')

		quadrupedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, endLimbJnt ]

	elif mode == 'leg':
		pm.select ( cl = True )
		upLimbJnt =pm.joint ( p = upLegPos  , name = ( side + "_upLeg_jnt" ) )

		midLimbJnt = pm.joint ( p = kneePos , name = ( side + "_knee_jnt" ) )
		pm.joint( upLimbJnt, e=True, zso=True, oj='xzy', sao='xup')

		butLimbJnt = pm.joint ( p = anklePos , name = ( side + "_ankle_jnt" ) )
		pm.joint( midLimbJnt,  e=True, zso=True, oj='xzy', sao='xup')

		endLimbJnt = pm.joint ( p = ballPos , name = ( side + "_ball_jnt" ) )
		pm.joint( butLimbJnt,  e=True, zso=True, oj='xzy', sao='xup')
		
		toeEndJnt = pm.joint ( p = toeEndPos , name = ( side + "_toeEnd_jnt" ) )
		pm.joint( endLimbJnt,  e=True, zso=True, oj='xzy', sao='xup')
		
		quadrupedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, endLimbJnt, toeEndJnt ]

	#============================================================================
	# orient joints and set preferred angle
	if midLimbJnt.jointOrientX.get() != 0: # arm is bent
		aimLoc = pm.spaceLocator()
		upArmHandMidPos = FindPosBetween( percent=50, base=upLimbJnt, tip=butLimbJnt )
		aimLoc.translate.set( upArmHandMidPos )
		pm.delete( pm.aimConstraint( midLimbJnt, aimLoc, worldUpType="object", aimVector=(1,0,0), upVector=(0,1,0), worldUpObject= butLimbJnt  ) )
		pm.move( aimLoc, ( limbLen*2.0, 0, 0 ), wd=True, os=True, relative=True )
		for jnt in ( upLimbJnt, midLimbJnt, butLimbJnt ):
			RIG.oriJnt.OriJnt( jnt=jnt, upAim=aimLoc , aimAxis='-z' )
		
		if mode == 'arm':
			midLimbJnt.preferredAngleY.set( -90 )
		elif mode == 'leg':
			midLimbJnt.preferredAngleZ.set( 90 )
	
	else:
		aimLoc = pm.spaceLocator()
		pm.parent( aimLoc, secondInitJnt )
		pm.makeIdentity( aimLoc, t=True, r=True, s=True )
		if mode == 'arm':
			midLimbJnt.preferredAngleY.set( -90 )
			aimLoc.translateZ.set( -limbLen*1.5 )
		elif mode == 'leg':
			aimLoc.translateY.set( -limbLen*1.5 )
			midLimbJnt.preferredAngleZ.set( 90 )
		pm.parent( aimLoc, w=True)
	
	aimLoc.rotate.set( 0,0,0 )
	
	#============================================================================
	# If mirror is ON
	if mirror == True:
		# mirror joints and pole vector loc
		OSjnts = pm.mirrorJoint( upLimbJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) )
		OSjnts = pm.ls( OSjnts )
		OSupLimbJnt = OSjnts[0]
		OSmidLimbJnt = OSjnts[1]
		OSbutLimbJnt = OSjnts[2]
		OSendLimbJnt =  OSjnts[3]
		OSquadrupedLimbJnts = [ OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt, OSendLimbJnt ]
		
		
		
		OSaimLoc = pm.duplicate( aimLoc )[0]
		OSaimLoc.translateX.set( -OSaimLoc.translateX.get() )

	#============================================================================
	# create IK, FK joints
	
	
	# FK mode =============
	if FKIKMode == 'FK':
	
		RigFK( jnts = ( upLimbJnt, midLimbJnt, butLimbJnt ), side = side )
		pm.delete( aimLoc )
		
		# other side
		if mirror:
			RigFK( jnts = ( OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt ), side=otherSide )
			pm.delete( OSaimLoc )


	# IK mode =============
	elif FKIKMode == 'IK':
	
		armRigStuff = RigIK( jnts = ( upLimbJnt, midLimbJnt, butLimbJnt ), mode=mode,  aim = aimLoc , side = side  )
		RigHand( butLimbJnt, endLimbJnt, armRigStuff[0] )
		
		# other side
		if mirror:
			OSarmRigStuff = RigIK( jnts = ( OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt ), mode=mode,  aim = OSaimLoc , side=otherSide )
			RigHand( OSbutLimbJnt, OSendLimbJnt, OSarmRigStuff[0] )


	# FKIK mode =============
	elif FKIKMode == 'FKIK':
		FKIKstuff = RigFKIK( jnts = ( upLimbJnt, midLimbJnt, butLimbJnt ), mode=mode,  aim = aimLoc , side=side )
		RigHand( FKIKstuff[1][2], FKIKstuff[1][3], FKIKstuff[2][0] )

		
		# other side
		if mirror:
			OSFKIKstuff = RigFKIK( jnts = ( OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt ), mode=mode,  aim = OSaimLoc , side=otherSide )
			RigHand( OSFKIKstuff[1][2], OSFKIKstuff[1][3], OSFKIKstuff[2][0] )
			# reverse finger ctrl and elbow ctrl shapes
			# ReverseShape( OSFKIKstuff[3], 'x' )
			# ReverseShape( OSFKIKstuff[2][1], 'z' )
			# ReverseShape( OSFKIKstuff[2][1], 'x' )
	#============================================================================
	pm.delete( QuadrupedLimbInitJnts )
	
	RigBendyLimb( jnts=quadrupedLimbJnts[:3], bendyCtrl=FKIKstuff[3], numOfSegs= numOfSegs )
	if mirror:
		RigBendyLimb( jnts=OSquadrupedLimbJnts[:3], bendyCtrl=OSFKIKstuff[3], numOfSegs= numOfSegs, isMirroredJoint=True )