Пример #1
0
    def connectFromDefinition(self,
                              BSDefinition,
                              currentBlendShape,
                              blendShapeNode,
                              prefix,
                              extremeValue,
                              objectPrefix=''):
        if prefix != "":
            Side = self.getSideFromPrefix(prefix)
            #print "Connecting:%s.%s To %s.%s"% (self.NameConv.RMSetFromName(BSDefinition["control"],Side,Token = "Side" ), BSDefinition['blendShapes'][currentBlendShape]["connection"], blendShapeNode, prefix +currentBlendShape)
            control = self.NameConv.set_from_name(BSDefinition["control"],
                                                  Side,
                                                  Token="Side")
        else:
            control = BSDefinition["control"]

        if extremeValue > 0:
            RMRigTools.RMConnectWithLimits(
                "%s.%s" %
                (control,
                 BSDefinition['blendShapes'][currentBlendShape]["connection"]),
                "%s.%s" %
                (blendShapeNode, prefix + objectPrefix + currentBlendShape),
                [[0, 0], [extremeValue, 1]])
        else:
            RMRigTools.RMConnectWithLimits(
                "%s.%s" %
                (control,
                 BSDefinition['blendShapes'][currentBlendShape]["connection"]),
                "%s.%s" %
                (blendShapeNode, prefix + objectPrefix + currentBlendShape),
                [[extremeValue, 1], [0, 0]])
Пример #2
0
    def CreateJointChainSquareRig(self, JointChain, UDaxis="Y"):
        if self.NameConv.is_name_in_format(JointChain[0]):
            if self.NameConv.get_from_name(JointChain[0], "side") == "LF":
                sideVariation = 1
            else:
                sideVariation = -1
        else:
            sideVariation = 1

        if UDaxis in ["Y", "Z"]:
            BoxResetPoint, BoxControl = RMRigShapeControls.RMCreateBoxCtrl(
                JointChain[len(JointChain) - 1],
                ParentBaseSize=True,
                Xratio=.5,
                Yratio=.5,
                Zratio=.5)
            self.addChainParameters(BoxControl, len(JointChain) - 1)

            cmds.makeIdentity(BoxControl,
                              apply=True,
                              r=False,
                              t=True,
                              s=True,
                              n=0)

            cmds.parentConstraint(JointChain[len(JointChain) - 1],
                                  BoxResetPoint)

            RMRigTools.RMLockAndHideAttributes(BoxControl, "0000000000")

            if UDaxis == "Y":
                LRaxis = "Z"
            elif UDaxis == "Z":
                LRaxis = "Y"
            for eachjoint in range(len(JointChain) - 1):
                RMRigTools.RMConnectWithLimits(
                    BoxControl + ".UD" + str(eachjoint + 1),
                    JointChain[eachjoint] + (".rotate%s" % UDaxis),
                    [[-10, 100], [0, 0], [10, -100]])
                RMRigTools.RMConnectWithLimits(
                    BoxControl + ".LR" + str(eachjoint + 1),
                    JointChain[eachjoint] + (".rotate%s" % LRaxis),
                    [[-10, sideVariation * 100], [0, 0],
                     [10, sideVariation * -100]])
                RMRigTools.RMConnectWithLimits(
                    BoxControl + ".Twist" + str(eachjoint + 1),
                    JointChain[eachjoint] + ".rotateX",
                    [[-10, sideVariation * 100], [0, 0],
                     [10, sideVariation * -100]])
        else:
            print "Not Valid UD Axis Provided"
Пример #3
0
    def linkJointDefinition(self, Side, jointLinkDefinition):
        control = jointLinkDefinition['control']
        if Side in ["LF", "RH"]:
            control = self.NameConv.set_from_name(
                jointLinkDefinition['control'], Side, Token='Side')

        if cmds.objExists(control):
            for eachAttribute in jointLinkDefinition['order']:
                jointsList = self.returnJointsByControl(
                    eachAttribute, jointLinkDefinition['joints'])
                for eachJoint in jointsList:
                    JointName = eachJoint
                    if Side in ["LF", "RH"]:
                        JointName = self.NameConv.set_from_name(eachJoint,
                                                                Side,
                                                                Token='Side')
                    if cmds.objExists(JointName):

                        if jointLinkDefinition['joints'][eachJoint][
                                'value'] == None:
                            cmds.connectAttr(
                                '%s.%s' %
                                (control, jointLinkDefinition['joints']
                                 [eachJoint]['connection']),
                                '%s.%s' %
                                (JointName, jointLinkDefinition['joints']
                                 [eachJoint]['inputPlug']),
                                force=True)
                        else:
                            self.AddAttributes(
                                control, eachAttribute,
                                jointLinkDefinition['attributes']
                                [eachAttribute]['min'],
                                jointLinkDefinition['attributes']
                                [eachAttribute]['max'])
                            RMRigTools.RMConnectWithLimits(
                                '%s.%s' %
                                (control, jointLinkDefinition['joints']
                                 [eachJoint]['connection']), '%s.%s' %
                                (JointName, jointLinkDefinition['joints']
                                 [eachJoint]['inputPlug']),
                                jointLinkDefinition['joints'][eachJoint]
                                ['value'])
                    else:
                        print "Joint object doesnt exists:%s" % JointName
        else:
            print "Control object doesnt exists:%s" % control
            control = self.NameConv.set_from_name(
                jointLinkDefinition['control'], Side, Token='Side')


#if __name__=="__main__":
#    Manager = BSManager()
#    Manager.AppyBlendShapeDefinition( SkinedJoints)
Пример #4
0
    def CreateFingerSquareRig(self, Finger):

        if self.NameConv.get_from_name(Finger[0], "side") == "L":
            sideVariation = 1
        else:
            sideVariation = -1

        BoxResetPoint, BoxControl = RMRigShapeControls.RMCreateBoxCtrl(
            Finger[len(Finger) - 1],
            ParentBaseSize=True,
            Xratio=.5,
            Yratio=.5,
            Zratio=.5)
        self.RMaddFinguerControls(BoxControl)

        pm.makeIdentity(BoxControl, apply=True, r=False, t=True, s=True, n=0)
        pm.parentConstraint(Finger[len(Finger) - 1], BoxResetPoint)

        RMRigTools.RMLockAndHideAttributes(BoxControl, "0000000000")

        RMRigTools.RMConnectWithLimits("%s.MidUD" % BoxControl,
                                       "%s.rotateY" % Finger[0],
                                       [[-10, 100], [0, 0], [10, -100]])
        RMRigTools.RMConnectWithLimits(
            "%s.MidLR" % BoxControl, "%s.rotateZ" % Finger[0],
            [[-10, sideVariation * 120], [0, 0], [10, sideVariation * -127]])
        RMRigTools.RMConnectWithLimits(
            "%s.MidTwist" % BoxControl, "%s.rotateX" % Finger[0],
            [[-10, sideVariation * 90], [0, 0], [10, sideVariation * -90]])
        index = 1
        for eachjoint in range(0, len(Finger) - 1):
            RMRigTools.RMConnectWithLimits("%s.UD%s" % (BoxControl, index),
                                           "%s.rotateY" % Finger[eachjoint],
                                           [[-10, 100], [0, 0], [10, -100]])
            RMRigTools.RMConnectWithLimits("%s.LR%s" % (BoxControl, index),
                                           "%s.rotateZ" % Finger[eachjoint],
                                           [[-10, sideVariation * 120], [0, 0],
                                            [10, sideVariation * -127]])
            RMRigTools.RMConnectWithLimits(
                "%s.Twist%s" % (BoxControl, index),
                "%s.rotateX" % Finger[eachjoint],
                [[-10, sideVariation * 90], [0, 0], [10, sideVariation * -90]])
            index += 1
        self.fingerControlsReset.append(BoxResetPoint)
        self.fingerContols.append(BoxControl)
Пример #5
0
def AddRibbon(SknJointStructure,
              SknParentGroup,
              currentTwists,
              ToDeleteNodes,
              LookAtAxis="Y"):
    NameConv = nameConvention.NameConvention()
    ObjectTransformDiclist = RMUncategorized.ObjectTransformDic(currentTwists)
    for i in ToDeleteNodes:
        if cmds.objExists(i):
            cmds.delete(i)
    RMUncategorized.SetObjectTransformDic(ObjectTransformDiclist)

    TJArm = RMTwistJoints.RMTwistJoints()
    TJArm.RMCreateTwistJoints(SknJointStructure[0],
                              SknJointStructure[1],
                              NumberOfTB=2,
                              LookAtAxis=LookAtAxis)

    constraintTJArm = cmds.parentConstraint(SknParentGroup,
                                            TJArm.TwistControlResetPoint,
                                            mo=True)[0]
    constraintTJArm = NameConv.rename_based_on_base_name(
        SknJointStructure[1], constraintTJArm, {})

    Ribbon = RMRibbon.RMRibbon()
    Ribbon.RibbonCreation(SknJointStructure[0],
                          SknJointStructure[1],
                          foliculeNumber=4)

    for index in range(len(currentTwists)):
        cmds.parentConstraint(Ribbon.jointStructure[index],
                              currentTwists[index],
                              mo=True)
    for index in range(len(Ribbon.resetControls)):
        cmds.parentConstraint(TJArm.TwistJoints[index],
                              Ribbon.resetControls[index],
                              mo=True)

    cmds.addAttr(Ribbon.controls[0],
                 at="float",
                 ln="Volume",
                 hnv=1,
                 hxv=1,
                 h=0,
                 k=1,
                 smn=-10,
                 smx=10)
    cmds.addAttr(Ribbon.controls[1],
                 at="float",
                 ln="VolumeUp",
                 hnv=1,
                 hxv=1,
                 h=0,
                 k=1,
                 smn=-10,
                 smx=10)
    cmds.addAttr(Ribbon.controls[1],
                 at="float",
                 ln="VolumeLow",
                 hnv=1,
                 hxv=1,
                 h=0,
                 k=1,
                 smn=-10,
                 smx=10)
    cmds.addAttr(Ribbon.controls[2],
                 at="float",
                 ln="Volume",
                 hnv=1,
                 hxv=1,
                 h=0,
                 k=1,
                 smn=-10,
                 smx=10)

    RMRigTools.RMConnectWithLimits('%s.Volume' % Ribbon.controls[0],
                                   '%s.scaleY' % currentTwists[0],
                                   [[-10, 0], [0, 1], [10, 4]])
    RMRigTools.RMConnectWithLimits('%s.Volume' % Ribbon.controls[0],
                                   '%s.scaleZ' % currentTwists[0],
                                   [[-10, 0], [0, 1], [10, 4]])
    RMRigTools.RMConnectWithLimits('%s.VolumeUp' % Ribbon.controls[1],
                                   '%s.scaleY' % currentTwists[1],
                                   [[-10, 0], [0, 1], [10, 4]])
    RMRigTools.RMConnectWithLimits('%s.VolumeUp' % Ribbon.controls[1],
                                   '%s.scaleZ' % currentTwists[1],
                                   [[-10, 0], [0, 1], [10, 4]])
    RMRigTools.RMConnectWithLimits('%s.VolumeLow' % Ribbon.controls[1],
                                   '%s.scaleY' % currentTwists[2],
                                   [[-10, 0], [0, 1], [10, 4]])
    RMRigTools.RMConnectWithLimits('%s.VolumeLow' % Ribbon.controls[1],
                                   '%s.scaleZ' % currentTwists[2],
                                   [[-10, 0], [0, 1], [10, 4]])

    RMRigTools.RMConnectWithLimits('%s.Volume' % Ribbon.controls[2],
                                   '%s.scaleY' % currentTwists[3],
                                   [[-10, 0], [0, 1], [10, 4]])
    RMRigTools.RMConnectWithLimits('%s.Volume' % Ribbon.controls[2],
                                   '%s.scaleZ' % currentTwists[3],
                                   [[-10, 0], [0, 1], [10, 4]])
Пример #6
0
    def CreatePalmRig(self, PalmControl=None):

        if self.NameConv.get_from_name(self.GHS.palmJoint, "side") == "L":
            sideVariation = -1
        else:
            sideVariation = 1

        self.CreatePalmReferencePoints()

        if PalmControl == None:
            palmResetPoint, PalmControl = RMRigShapeControls.RMCircularControl(
                self.GHS.palmJoint)
        else:
            palmResetPoint = pm.group(empty=True, name="palmControl")
            self.NameConv.rename_based_on_base_name(self.GHS.palmJoint,
                                                    palmResetPoint,
                                                    name=palmResetPoint)
            RMRigTools.RMAlign(self.GHS.palmJoint, palmResetPoint, 3)

        self.PalmControl = PalmControl
        self.PalmResetPoint = palmResetPoint
        self.MainControl = palmResetPoint

        # palmResetPoint = self.NameConv.RMRenameSetFromName(palmResetPoint,"palmControls","Name")

        self.RMaddPalmControls(self.PalmControl)
        RMRigTools.RMLockAndHideAttributes(self.PalmControl, "0000000000")

        pinky = self.GHS.fingerJointsByName("pinky")
        if pinky:
            self.PalmFingerControlGrp[
                "pinky"] = self.name_conv.RMCreateGroupOnObj(pinky[0])
            RMRigTools.RMChangeRotateOrder(pinky, "yxz")
            RMRigTools.RMConnectWithLimits(
                "%s.Spread" % self.PalmControl,
                '%s.rotateZ' % self.PalmFingerControlGrp["pinky"],
                [[-10, sideVariation * 10], [0, 0], [10, sideVariation * -60]])
        ring = self.GHS.fingerJointsByName("ring")
        if ring:
            self.PalmFingerControlGrp[
                "ring"] = self.name_conv.RMCreateGroupOnObj(ring[0])
            RMRigTools.RMChangeRotateOrder(ring, "yxz")
            RMRigTools.RMConnectWithLimits(
                "%s.Spread" % self.PalmControl,
                '%s.rotateZ' % self.PalmFingerControlGrp["ring"],
                [[-10, sideVariation * 5], [0, 0], [10, sideVariation * -30]])
        middle = self.GHS.fingerJointsByName("middle")
        if middle:
            self.PalmFingerControlGrp[
                "middle"] = self.name_conv.RMCreateGroupOnObj(middle[0])
            RMRigTools.RMChangeRotateOrder(middle, "yxz")
            RMRigTools.RMConnectWithLimits(
                "%s.Spread" % self.PalmControl,
                '%s.rotateZ' % self.PalmFingerControlGrp["middle"],
                [[-10, 0], [0, 0], [10, sideVariation * -5]])
        index = self.GHS.fingerJointsByName("index")
        if index:
            self.PalmFingerControlGrp[
                "index"] = self.name_conv.RMCreateGroupOnObj(index[0])
            RMRigTools.RMChangeRotateOrder(index, "yxz")
            RMRigTools.RMConnectWithLimits(
                "%s.Spread" % self.PalmControl,
                '%s.rotateZ' % self.PalmFingerControlGrp["index"],
                [[-10, sideVariation * -5], [0, 0], [10, sideVariation * 30]])
        thumb = self.GHS.fingerJointsByName("thumb")
        if thumb:
            self.PalmFingerControlGrp[
                "thumb"] = self.name_conv.RMCreateGroupOnObj(thumb[0])
            RMRigTools.RMChangeRotateOrder(thumb, "yxz")
            RMRigTools.RMConnectWithLimits(
                "%s.Spread" % self.PalmControl,
                '%s.rotateZ' % self.PalmFingerControlGrp["thumb"],
                [[-10, sideVariation * -10], [0, 0], [10, sideVariation * 60]])

        for eachFingerName in self.fingerRoot:
            if eachFingerName != 'thumb':
                RMRigTools.RMConnectWithLimits(
                    "%s.PalmBend" % self.PalmControl,
                    '%s.rotateY' % self.PalmFingerControlGrp[eachFingerName],
                    [[-10, 90], [0, 0], [10, -90]])
                RMRigTools.RMConnectWithLimits(
                    "%s.Twist" % self.PalmControl,
                    '%s.rotateX' % self.PalmReferencePoints[eachFingerName],
                    [[-10, sideVariation * 45], [0, 0],
                     [10, sideVariation * -45]])

        RMRigTools.RMConnectWithLimits(
            "%s.PalmCup" % self.PalmControl,
            '%s.rotateX' % self.PalmReferencePoints["pinky"],
            [[0, 0], [10, sideVariation * 50]])
        RMRigTools.RMConnectWithLimits(
            "%s.PalmCup" % self.PalmControl,
            '%s.rotateX' % self.PalmReferencePoints["ring"],
            [[0, 0], [10, sideVariation * 25]])
        RMRigTools.RMConnectWithLimits(
            "%s.PalmCup" % self.PalmControl,
            '%s.rotateX' % self.PalmReferencePoints["middle"],
            [[0, 0], [10, sideVariation * 5]])
        RMRigTools.RMConnectWithLimits(
            "%s.PalmCup" % self.PalmControl,
            '%s.rotateX' % self.PalmReferencePoints["index"],
            [[0, 0], [10, sideVariation * -30]])
        RMRigTools.RMConnectWithLimits(
            "%s.PalmCup" % self.PalmControl,
            '%s.rotateX' % self.PalmReferencePoints["thumb"],
            [[0, 0], [10, sideVariation * -60]])
Пример #7
0
    def StandardFeetIKRig(self, StandarFeetPointsDic, FeetControl=None):
        self.StandardFeetPointsDic = StandarFeetPointsDic

        Side = self.NameConv.get_from_name(
            self.StandardFeetPointsDic["feet"][0], "side")
        self.rootIKJoints, StandardFeetIKJoints = self.StandardReverseFeetJointStructure(
            StandarFeetPointsDic)
        self.NameConv.rename_set_from_name(StandardFeetIKJoints,
                                           "IK",
                                           "name",
                                           mode="add")

        FootIn = self.StandardFeetPointsDic["limitIn"]
        FootOut = self.StandardFeetPointsDic["limitOut"]
        FootBK = self.StandardFeetPointsDic["limitBack"]

        Length = RMRigTools.RMPointDistance(
            self.StandardFeetPointsDic["feet"][2], FootBK)
        Width = RMRigTools.RMPointDistance(FootIn, FootOut)

        BallGrp = pm.group(empty=True,
                           name=self.NameConv.set_name_in_format(name="Ball",
                                                                 side=Side))
        BallLift = pm.group(empty=True,
                            name=self.NameConv.set_name_in_format(
                                name="BallLift", side=Side))
        TapGrp = pm.group(empty=True,
                          name=self.NameConv.set_name_in_format(name="TapGrp",
                                                                side=Side))
        TipGrp = pm.group(empty=True,
                          name=self.NameConv.set_name_in_format(name="TipGrp",
                                                                side=Side))
        SideInGrp = pm.group(empty=True,
                             name=self.NameConv.set_name_in_format(
                                 name="SideInGrp", side=Side))
        SideOutGrp = pm.group(empty=True,
                              name=self.NameConv.set_name_in_format(
                                  name="SideOutGrp", side=Side))
        FeetOrient = pm.group(empty=True,
                              name=self.NameConv.set_name_in_format(
                                  name="FeetOrient", side=Side))
        FeetPalmOrient = pm.group(empty=True,
                                  name=self.NameConv.set_name_in_format(
                                      name="FeetPalmOrient", side=Side))

        RMRigTools.RMAlign(StandardFeetIKJoints[1], BallGrp, 3)
        RMRigTools.RMAlign(StandardFeetIKJoints[1], BallLift, 3)

        RMRigTools.RMAlign(StandardFeetIKJoints[1], TipGrp, 3)
        RMRigTools.RMAlign(StandardFeetIKJoints[2], TipGrp, 1)
        RMRigTools.RMAlign(StandardFeetIKJoints[1], TapGrp, 3)

        RMRigTools.RMAlign(FootIn, SideInGrp, 3)
        RMRigTools.RMAlign(FootOut, SideOutGrp, 3)
        RMRigTools.RMAlign(FootBK, TapGrp, 3)
        RMRigTools.RMAlign(BallGrp, FeetPalmOrient, 3)
        RMRigTools.RMAlign(StandardFeetIKJoints[0], FeetOrient, 3)

        pm.xform(FeetOrient, objectSpace=True, relative=True, t=[0, 0, Width])
        pm.xform(FeetPalmOrient,
                 objectSpace=True,
                 relative=True,
                 t=[0, 0, Width])

        BallIK, BallIkEffector = pm.ikHandle(
            sj=StandardFeetIKJoints[0],
            ee=StandardFeetIKJoints[1],
            name="BallIK")  # solver="ikRPsolver",
        TipIK, TipIkEffector = pm.ikHandle(
            sj=StandardFeetIKJoints[1],
            ee=StandardFeetIKJoints[2],
            name="TipIK")  # solver="ikRPsolver",

        self.NameConv.rename_name_in_format(BallIK, side=Side)
        self.NameConv.rename_name_in_format(TipIK, side=Side)
        self.NameConv.rename_name_in_format(BallIkEffector, side=Side)
        self.NameConv.rename_name_in_format(TipIkEffector, side=Side)

        # pm.poleVectorConstraint (FeetOrient, BallIK)
        # pm.poleVectorConstraint (FeetPalmOrient, TipIK)

        pm.parent(BallIK, BallLift)
        pm.parent(TipIK, BallLift)
        pm.parent(BallLift, SideInGrp)
        pm.parent(BallGrp, SideInGrp)
        pm.parent(SideInGrp, SideOutGrp)
        pm.parent(SideOutGrp, TapGrp)
        pm.parent(TapGrp, TipGrp)
        pm.parent(FeetOrient, BallGrp)
        pm.parent(FeetPalmOrient, BallLift)

        TipData = self.rig_tools.RMCreateGroupOnObj(TipGrp)
        MainFeet = self.rig_tools.RMCreateGroupOnObj(TipData)

        self.NameConv.rename_set_from_name(MainFeet, "MainFeet", "name")

        if not FeetControl:
            fetControlReset, FeetControl = RMRigShapeControls.RMCreateBoxCtrl(
                StandarFeetPointsDic["feet"][0],
                customSize=Length,
                Yratio=.6,
                Zratio=.3,
                name="FeetControl")
            self.fetControlReset = fetControlReset

        # self.feetMainMoveIK = TipData
        pm.parentConstraint(FeetControl, TipData, mo=True)

        self.RMStandardRigAttributes(FeetControl)

        pm.makeIdentity(BallGrp, apply=True, t=1, r=1, s=1, n=0)
        pm.makeIdentity(BallLift, apply=True, t=1, r=1, s=1, n=0)
        pm.makeIdentity(TapGrp, apply=True, t=1, r=1, s=1, n=0)
        pm.makeIdentity(TipGrp, apply=True, t=1, r=1, s=1, n=0)
        pm.makeIdentity(SideInGrp, apply=True, t=1, r=1, s=1, n=0)
        pm.makeIdentity(SideOutGrp, apply=True, t=1, r=1, s=1, n=0)
        pm.makeIdentity(FeetOrient, apply=True, t=1, r=1, s=1, n=0)
        pm.makeIdentity(FeetPalmOrient, apply=True, t=1, r=1, s=1, n=0)

        # pm.parent (self.rootIKJoints, BallGrp)

        RMRigTools.RMConnectWithLimits("%s.ToeLift" % FeetControl,
                                       "%s.rotateZ" % BallLift,
                                       [[-10, -70], [0, 0], [10, 70]])
        RMRigTools.RMConnectWithLimits("%s.BallPivot" % FeetControl,
                                       "%s.rotateZ" % BallGrp,
                                       [[-10, 70], [0, 0], [10, -70]])
        RMRigTools.RMConnectWithLimits("%s.HeelPivot" % FeetControl,
                                       "%s.rotateZ" % TapGrp,
                                       [[-10, -70], [0, 0], [10, 70]])
        RMRigTools.RMConnectWithLimits("%s.ToePivot" % FeetControl,
                                       "%s.rotateZ" % TipGrp,
                                       [[-10, 70], [0, 0], [10, -70]])
        if (Side == "L"):
            RMRigTools.RMConnectWithLimits("%s.Tilt" % FeetControl,
                                           "%s.rotateX" % SideInGrp,
                                           [[-10, 70], [0, 0]])
            RMRigTools.RMConnectWithLimits("%s.Tilt" % FeetControl,
                                           "%s.rotateX" % SideOutGrp,
                                           [[0, 0], [10, -70]])
            RMRigTools.RMConnectWithLimits("%s.ToePivotSide" % FeetControl,
                                           "%s.rotateY" % TipGrp,
                                           [[-10, 70], [0, 0], [10, -70]])
        # RMRigTools.RMConnectWithLimits( "%s.ToePivot" , TipGrp + ".rotateZ", [[-10,-70],[0,0],[10,70]])
        else:
            RMRigTools.RMConnectWithLimits("%s.Tilt" % FeetControl,
                                           "%s.rotateX" % SideInGrp,
                                           [[-10, -70], [0, 0]])
            RMRigTools.RMConnectWithLimits("%s.Tilt" % FeetControl,
                                           "%s.rotateX" % SideOutGrp,
                                           [[0, 0], [10, 70]])
            RMRigTools.RMConnectWithLimits("%s.ToePivotSide" % FeetControl,
                                           "%s.rotateY" % TipGrp,
                                           [[-10, -70], [0, 0], [10, 70]])
        # RMRigTools.RMCreateGroupOnObj( FeetControl)

        pm.scaleConstraint(FeetControl, MainFeet)

        self.MainFeetKinematics = MainFeet
        self.IKAttachPoint = BallGrp
        self.StandardFeetIKJoints = StandardFeetIKJoints