Preview:
list = [('tail_01_setup_jnt','tail_01_IK_ctrl_grp'),('tail_03_setup_jnt','tail_02_IK_ctrl_grp'),('tail_05_setup_jnt','tail_03_IK_ctrl_grp'),('tail_01_setup_jnt','tail_01_IK_jnt'),('tail_02_setup_jnt','tail_02_IK_jnt'),('tail_03_setup_jnt','tail_03_IK_jnt'),('tail_04_setup_jnt','tail_04_IK_jnt'),('tail_05_setup_jnt','tail_05_IK_jnt'),('tail_01_setup_jnt','tail_01_length_jnt'),('tail_02_setup_jnt','tail_02_length_jnt'),('tail_03_setup_jnt','tail_03_length_jnt'),('tail_04_setup_jnt','tail_04_length_jnt'),('tail_05_setup_jnt','tail_05_length_jnt'),('tail_01_setup_jnt','tail_start_length_jnt'),('tail_05_setup_jnt','tail_end_length_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
        
    cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
    cmds.rename('tail_crv')
    
    nameOfLoc = ['tail_01_loc','tail_02_loc','tail_03_loc','tail_04_loc','tail_05_loc']
    for each in nameOfLoc:
        cmds.spaceLocator(n=each)

    toGetLocPos = [('tail_01_loc.translateY',0),('tail_02_loc.translateY',2.5),('tail_03_loc.translateY',5),('tail_04_loc.translateY',7.5),('tail_05_loc.translateY',10)]
    for each in toGetLocPos:
        cmds.setAttr(each[0],each[1])

    toConnectLoc = [('tail_01_loc.worldPosition[0]','tail_crv.controlPoints[0]'),('tail_02_loc.worldPosition[0]','tail_crv.controlPoints[1]'),('tail_03_loc.worldPosition[0]','tail_crv.controlPoints[2]'),('tail_04_loc.worldPosition[0]','tail_crv.controlPoints[3]'),('tail_05_loc.worldPosition[0]','tail_crv.controlPoints[4]')]
    for each in toConnectLoc:
        cmds.connectAttr(each[0],each[1])
        
    list = [('tail_01_setup_jnt','tail_01_loc'),('tail_02_setup_jnt','tail_02_loc'),('tail_03_setup_jnt','tail_03_loc'),('tail_04_setup_jnt','tail_04_loc'),('tail_05_setup_jnt','tail_05_loc')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
        
    list = [('tail_01_IK_ctrl','tail_01_loc'),('tail_01_IK_ctrl','tail_02_loc'),('tail_02_IK_ctrl','tail_02_loc'),('tail_02_IK_ctrl','tail_03_loc'),('tail_02_IK_ctrl','tail_04_loc'),('tail_03_IK_ctrl','tail_04_loc'),('tail_03_IK_ctrl','tail_05_loc')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo=True)
    
    cmds.select('tail_01_IK_jnt','tail_05_IK_jnt','tail_crv')
    cmds.ikHandle(n='tail_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
    
    list = [('multiplyDivide','tail_stretch_01_mult'),('multiplyDivide','tail_stretch_02_mult')]
    for each in list:
        cmds.shadingNode(each[0],n=each[1],asUtility=1)
        
    cmds.setAttr('tail_stretch_01_mult.operation',2)
    cmds.arclen('tail_crv',ch = True)
        
    toConnectAttr = [('tail_03_IK_ctrl.rotateX','tail_ikh.twist'),('curveInfo1.arcLength','tail_stretch_01_mult.input1X'),('tail_stretch_01_mult.outputX','tail_stretch_02_mult.input1X'),('tail_02_length_jnt.translateX','tail_stretch_02_mult.input2X'),('tail_stretch_02_mult.outputX','tail_02_IK_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_03_IK_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_04_IK_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_05_IK_jnt.translateX'),('tail_end_length_jnt.translateX','tail_stretch_01_mult.input2X')]
    for each in toConnectAttr:
        cmds.connectAttr(each[0],each[1])
    
    #create IKFK tail
    list = ['tail_01_bln_jnt','tail_02_bln_jnt','tail_03_bln_jnt','tail_04_bln_jnt','tail_05_bln_jnt']
    for each in list:
        cmds.joint(n=each)
    
    list = [('tail_01_setup_jnt','tail_01_bln_jnt'),('tail_02_setup_jnt','tail_02_bln_jnt'),('tail_03_setup_jnt','tail_03_bln_jnt'),('tail_04_setup_jnt','tail_04_bln_jnt'),('tail_05_setup_jnt','tail_05_bln_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
            
    list = [('tail_01_FK_jnt','tail_01_bln_jnt'),('tail_02_FK_jnt','tail_02_bln_jnt'),('tail_03_FK_jnt','tail_03_bln_jnt'),('tail_04_FK_jnt','tail_04_bln_jnt'),('tail_05_FK_jnt','tail_05_bln_jnt'),('tail_01_IK_jnt','tail_01_bln_jnt'),('tail_02_IK_jnt','tail_02_bln_jnt'),('tail_03_IK_jnt','tail_03_bln_jnt'),('tail_04_IK_jnt','tail_04_bln_jnt'),('tail_05_IK_jnt','tail_05_bln_jnt')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo=True)
    
    cmds.curve(n='tail_ik_fk_switch',d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
    cmds.group(n='tail_ik_fk_switch_grp')
    cmds.setAttr('tail_ik_fk_switch.visibility',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.translateX',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.translateY',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.translateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.rotateX',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.rotateY',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.rotateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.scaleX',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.scaleY',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.overrideEnabled' ,True) 
    cmds.setAttr('tail_ik_fk_switch.overrideColor' ,15)
    cmds.addAttr('tail_ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
    cmds.parentConstraint('tail_01_bln_jnt','tail_ik_fk_switch_grp')
    cmds.shadingNode('reverse',n='tail_ik_rev',asUtility=1)
    
    toConnectAttr = [('tail_ik_fk_switch.IKFK','tail_01_bln_jnt_parentConstraint1.tail_01_FK_jntW0'),('tail_ik_fk_switch.IKFK','tail_ik_rev.inputX'),('tail_ik_rev.outputX','tail_01_bln_jnt_parentConstraint1.tail_01_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_02_bln_jnt_parentConstraint1.tail_02_FK_jntW0'),('tail_ik_rev.outputX','tail_02_bln_jnt_parentConstraint1.tail_02_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_03_bln_jnt_parentConstraint1.tail_03_FK_jntW0'),('tail_ik_rev.outputX','tail_03_bln_jnt_parentConstraint1.tail_03_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_04_bln_jnt_parentConstraint1.tail_04_FK_jntW0'),('tail_ik_rev.outputX','tail_04_bln_jnt_parentConstraint1.tail_04_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_05_bln_jnt_parentConstraint1.tail_05_FK_jntW0'),('tail_ik_rev.outputX','tail_05_bln_jnt_parentConstraint1.tail_05_IK_jntW1'),('tail_ik_rev.outputX','tail_01_IK_ctrl_grp.visibility'),('tail_ik_rev.outputX','tail_02_IK_ctrl_grp.visibility'),('tail_ik_rev.outputX','tail_03_IK_ctrl_grp.visibility'),('tail_ik_fk_switch.IKFK','tail_01_FK_ctrl_grp.visibility')]
    for each in toConnectAttr:
        cmds.connectAttr(each[0],each[1])
    
    #create group
    list = ['jnt_grp','extra','ctrl_grp','rename']
    for each in list:
        cmds.group(n=each,em=True)
    
    list = [('tail_01_setup_jnt','extra'),('tail_01_FK_ctrl_grp','ctrl_grp'),('tail_01_FK_jnt','jnt_grp'),('tail_01_IK_ctrl_grp','ctrl_grp'),('tail_02_IK_ctrl_grp','ctrl_grp'),('tail_03_IK_ctrl_grp','ctrl_grp'),('tail_01_IK_jnt','jnt_grp'),('tail_start_length_jnt','extra'),('tail_01_length_jnt','extra'),('tail_crv','extra'),('tail_01_loc','extra'),('tail_02_loc','extra'),('tail_03_loc','extra'),('tail_04_loc','extra'),('tail_05_loc','extra'),('tail_ikh','extra'),('extra','rename'),('jnt_grp','rename'),('ctrl_grp','rename')]
    for each in list:
        cmds.parent(each[0],each[1])
    
    cmds.setAttr('extra.visibility',0)
    
def createLocator():
    
    list = ['start_loc','end_loc']
    for each in list:
        cmds.spaceLocator(n=each)
        cmds.setAttr (each +'.rotateX',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.rotateY',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.rotateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('start_loc.translateX',-5)
    cmds.setAttr('end_loc.translateX',10)
    
def createMotionPath():
    def progressBarWindow():
        # this command opens the window
        window = cmds.window('MotionPathSetupProgress',title='Building')
        cmds.columnLayout()
        
        cmds.progressBar('MotionPathSetupProgress',maxValue=10, width=300)
        
        cmds.showWindow( window )
        
    progressBarWindow()
    
    # the command to find value
    list = ['start_loc','end_loc']
    
    for each in list:
        cmds.setAttr(each + '.visibility',0)

    def vector_sub(p1,p2):
        x = p1[0] - p2[0]
        y = p1[1] - p2[1]
        z = p1[2] - p2[2]
        return [x,y,z]

    def vector_add(p1,p2):
        x = p1[0] + p2[0]
        y = p1[1] + p2[1]
        z = p1[2] + p2[2]
        return [x,y,z]

    def vector_div(p,f):
        x = p[0] / f
        y = p[1] / f
        z = p[2] / f
        return [x,y,z]

    def vector_mult(p,f):
        x = p[0] * f
        y = p[1] * f
        z = p[2] * f
        return [x,y,z]
        
    p1 = cmds.xform(list[0], q=1, ws=1, t=1)
    p2 = cmds.xform(list[1], q=1, ws=1, t=1)
    print(p2)
    n = cmds.intField('numbersOfLocator',q=1,value=1)
    direction = vector_sub(p2,p1)
    direction = vector_div(direction,n)
    points = []
    
    for i in range(n):
        p = vector_add(p1,vector_mult(direction,i))
        points.append(p)
    points.append(p2)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to find motion path in between value
    plus = n
    mpInBetween = 1/plus
    
    # the command to create curve
    crv = cmds.curve(d=1, p=[p1,p2])
    cmds.rename('mp_crv')
    cmds.setAttr('.template',1)
    cmds.rebuildCurve('mp_crv',d=2, rt=0, s=n-1)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)

    # the command to create joints
    cmds.joint(n='main_mp_0_jnt',p=[0,0,0])

    number = len(points)
    for each in range(number):
        cmds.joint(n='main_mp_%s_jnt'%(each+1),p=points[each])
        cmds.parent(w=True)
        forDel = cmds.aimConstraint('end_loc','main_mp_%s_jnt'%(each+1),mo=False)
        cmds.delete(forDel)
        
    m=n+1
    
    for each in range(number):
        cmds.parent('main_mp_%s_jnt'%(m-each),'main_mp_%s_jnt'%(n-each))
    
    cmds.parent('main_mp_1_jnt',w=True)
    cmds.delete('main_mp_0_jnt')
    forDel = cmds.orientConstraint('main_mp_1_jnt','main_mp_%s_jnt'%(n+1))
    cmds.delete(forDel)
    cmds.makeIdentity('main_mp_1_jnt',apply=True,translate=True,rotate=True)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to create controllers
    number = len(points)
    for each in range(number):
        ctrl = cmds.curve(n='mp_%s_ctrl'%(each+1),d=1, p=[(0, 0.5, 0.5),(0, -0.5, 0.5),(0, -0.5, -0.5),(0, 0.5, -0.5),(0, 0.5, 0.5)])
        cmds.setAttr (ctrl +'.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr (ctrl +'.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr (ctrl +'.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr (ctrl + ".overrideEnabled" ,True) 
        cmds.setAttr (ctrl + ".overrideColor" ,18)
        cmds.setAttr (ctrl +'.visibility',keyable = False, cb = False, lock = True)
        grp = cmds.group(n='mp_%s_ctrl_grp'%(each+1))
        forDel = cmds.parentConstraint('main_mp_%s_jnt'%(each+1),grp,mo=False)
        cmds.delete(forDel)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to create locator
    number = len(points)
    for each in range(number):
        cmds.spaceLocator(n='aim_up_%s_loc'%(each+1))
        cmds.setAttr('.visibility',0)
        forDel = cmds.parentConstraint('main_mp_%s_jnt'%(each+1),'aim_up_%s_loc'%(each+1),mo=False)
        cmds.delete(forDel)
        cmds.setAttr('aim_up_%s_loc.translateY'%(each+1),2.5)
        cmds.parent('aim_up_%s_loc'%(each+1),'mp_%s_ctrl'%(each+1))
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=2)
    
    # the command to create node and motion path 
    number = len(points)
    for each in range(number):
        jnt = cmds.joint(n='mp_%s_jnt'%(each+1),p=points[each])
        cmds.setAttr('.visibility',0)
        cmds.shadingNode('plusMinusAverage',n = 'mp_%s_plm'%(each+1),asUtility=1)
        cmds.shadingNode('plusMinusAverage',n = 'mp_sec_%s_plm'%(each+1),asUtility=1)
        cmds.pathAnimation('mp_%s_jnt'%(each+1), c='mp_crv',fm=True,wut='objectrotation',wuo='aim_up_%s_loc'%(each+1),f=True,fa='x',ua='y')
        cmds.cutKey('motionPath%s'%(each+1), attribute='uValue', clear = True)
        cmds.connectAttr('mp_%s_ctrl.rotateY'%(each+1),'motionPath%s.upTwist'%(each+1))
        cmds.connectAttr('mp_%s_ctrl.rotateZ'%(each+1),'motionPath%s.sideTwist'%(each+1))
        
    cmds.parent('mp_1_jnt',w=True)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to set value on each motion path
    number = len(points)
    for each in range(number):
        cmds.setAttr('motionPath%s.uValue'%(each+1),mpInBetween*each)
    
    # the command to create extra controller
    cmds.curve(d=1, p=[(0.25, 0, 1.5),(-0.25, 0, 1.5),(-0.25, 0, 0.25),(-1.5, 0, 0.25),(-1.5, 0, -0.25),(-0.25, 0, -0.25),(-0.25, 0, -1.5),(0.25, 0 ,-1.5),(0.25, 0, -0.25),(1.5, 0, -0.25),(1.5, 0, 0.25,),(0.25, 0 ,0.25),(0.25, 0, 1.5)])
    cmds.rename('mp_extra_ctrl')
    cmds.setAttr ('mp_extra_ctrl'+'.translateX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.translateY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.translateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.rotateX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.rotateY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.rotateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.scaleX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.scaleY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+ ".overrideEnabled" ,True) 
    cmds.setAttr ('mp_extra_ctrl'+ ".overrideColor" ,29)
    cmds.setAttr ('mp_extra_ctrl'+'.visibility',keyable = False, cb = False, lock = True)
    cmds.addAttr('mp_extra_ctrl',sn='motionPath', min = 0, max=10 , k=1, dv=10)
    cmds.group(n='mp_extra_ctrl_grp')
    forDel = cmds.parentConstraint('main_mp_2_jnt','mp_extra_ctrl_grp')
    cmds.delete(forDel)

    # the command to search CV and create cluster
    targetCurve = 'mp_crv'
    curveCVs = cmds.ls('{0}.cv[:]'.format(targetCurve), fl = True)
    for cv in curveCVs:
        cmds.cluster(cv,n='cl1')
        cmds.setAttr('.visibility',0)
    cmds.shadingNode('multiplyDivide',n = 'mp_mult',asUtility=1)
    cmds.setAttr('mp_mult.input2X',10)
    cmds.setAttr('mp_mult.operation',2)
    cmds.connectAttr('mp_extra_ctrl.motionPath','mp_mult.input1X')
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=2)
    
    # the command to set and connect node
    number = len(curveCVs)
    for each in range(number):
        cmds.setAttr('mp_%s_plm.operation'%(each+1), 2)
        cmds.connectAttr('mp_mult.outputX','mp_%s_plm.input1D[0]'%(each+1))
        cmds.setAttr('mp_%s_plm.input1D[1]'%(each+1),1)
        cmds.connectAttr('mp_%s_plm.output1D'%(each+1),'mp_sec_%s_plm.input1D[0]'%(each+1))
        cmds.connectAttr('motionPath%s.uValue'%(each+1),'mp_sec_%s_plm.input1D[1]'%(each+1))
        forDel = cmds.parentConstraint('main_mp_%s_jnt'%(each+1),'cl%sHandle'%(each+1),mo=False)
        cmds.delete(forDel)
        cmds.parent('cl%sHandle'%(each+1),'mp_%s_ctrl'%(each+1))
        cmds.cutKey('mp_%s_plm'%(each+1), attribute='input1D[1]',clear = True)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to connect node
    number = len(curveCVs)
    for each in range(number):
        cmds.disconnectAttr('motionPath%s.uValue'%(each+1),'mp_sec_%s_plm.input1D[1]'%(each+1))
        cmds.connectAttr('mp_sec_%s_plm.output1D'%(each+1),'motionPath%s.uValue'%(each+1))
        forDel = cmds.parentConstraint('mp_%s_jnt'%(each+1),'main_mp_%s_jnt'%(each+1),mo=True)
        cmds.delete(forDel)
    
    cmds.makeIdentity('main_mp_1_jnt',apply=True,translate=True,rotate=True)
    
    number = len(curveCVs)
    for each in range(number):
        cmds.parentConstraint('mp_%s_jnt'%(each+1),'main_mp_%s_jnt'%(each+1),mo=True)
        
    # the command to create group    
    list = ['ctrl_grp','jnt_grp','setup_grp','mp_grp','setup_jnt_grp']
    for each in list:
        cmds.group(n=each,em=True)
        
    # the command to create main controller
    cmds.circle(n='mp_main_ctrl',r=1,nrx = 90)
    cmds.setAttr ('mp_main_ctrl'+'.scaleX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_main_ctrl'+'.scaleY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_main_ctrl'+'.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_main_ctrl'+ ".overrideEnabled" ,True) 
    cmds.setAttr ('mp_main_ctrl'+ ".overrideColor" ,29)
    cmds.setAttr ('mp_main_ctrl'+'.visibility',keyable = False, cb = False, lock = True)
    cmds.group(n='mp_main_ctrl_grp')
    forDel = cmds.parentConstraint('main_mp_1_jnt','mp_main_ctrl_grp')
    cmds.delete(forDel)
    cmds.parent('ctrl_grp','mp_main_ctrl')
    cmds.parent('mp_extra_ctrl_grp','mp_main_ctrl')
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to group controllers and joints
    number = len(curveCVs)
    for each in range(number):
        cmds.parent('mp_%s_ctrl_grp'%(each+1),'ctrl_grp')
        cmds.parent('mp_%s_jnt'%(each+1),'setup_jnt_grp')
    
    # the command to group everything
    list = [('start_loc','setup_grp'),('end_loc','setup_grp'),('mp_crv','setup_grp'),('setup_jnt_grp','setup_grp'),('main_mp_1_jnt','jnt_grp'),('setup_grp','mp_grp'),('jnt_grp','mp_grp'),('mp_main_ctrl_grp','mp_grp')]
    for each in list:
        cmds.parent(each[0],each[1])
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=2)
    
    def progressBarWindowClose():
        # the command to close the progress bar
        cmds.deleteUI('MotionPathSetupProgress',window=True)
        
    progressBarWindowClose()

#create quadruped setup joint function#
def BuildQuadrupedSetupJoint():
    nameOfJoint = [('spine_01_setup_jnt',(0, 95, -25),(0,0,0)),('spine_02_setup_jnt',(0, 95, 0),(0,0,0)),('spine_03_setup_jnt',(0, 95, 25),(0,0,0)),('l_leg_01_setup_jnt',(10, 85, -35),(0,0,-90)),('l_leg_02_setup_jnt',(10, 60, -35),(0,0,0)),('l_leg_03_setup_jnt',(10, 30, -35),(0,0,0)),('l_leg_04_setup_jnt',(10, 10, -35),(0,0,0)),('l_leg_05_setup_jnt',(10, 0, -35),(0,0,0)),('l_leg_rock_out_setup_jnt',(15, 0, -35),(0,0,0)),('l_leg_rock_in_setup_jnt',(5, 0, -35),(0,0,0)),('l_leg_heel_setup_jnt',(10, 0, -45),(0,0,0)),('r_leg_01_setup_jnt',(-10, 85, -35),(0,0,0)),('r_leg_02_setup_jnt',(-10, 60, -35),(0,0,0)),('r_leg_03_setup_jnt',(-10, 30, -35),(0,0,0)),('r_leg_04_setup_jnt',(-10, 10, -35),(0,0,0)),('r_leg_05_setup_jnt',(-10, 0, -35),(0,180,0)),('r_leg_rock_out_setup_jnt',(-15, 0, -35),(0,0,0)),('r_leg_rock_in_setup_jnt',(-5, 0, -35),(0,0,0)),('r_leg_heel_setup_jnt',(-10, 0, -45),(0,0,0)),('l_shoulder_setup_jnt',(10, 90, 35),(0,-180,0)),('l_arm_01_setup_jnt',(10, 70, 35),(0,0,0)),('l_arm_02_setup_jnt',(10, 50, 35),(0,0,0)),('l_arm_03_setup_jnt',(10, 25, 35),(0,0,0)),('l_arm_04_setup_jnt',(10, 5, 35),(0,0,0)),('l_arm_05_setup_jnt',(10, 0, 35),(0,0,0)),('l_arm_rock_in_setup_jnt',(5, 0, 35),(0,0,0)),('l_arm_rock_out_setup_jnt',(15, 0, 35),(0,0,0)),('l_arm_heel_setup_jnt',(10, 0, 25),(0,0,0)),('r_shoulder_setup_jnt',(-10, 90, 35),(0,0,0)),('r_arm_01_setup_jnt',(-10, 70, 35),(0,0,0)),('r_arm_02_setup_jnt',(-10, 50, 35),(0,0,0)),('r_arm_03_setup_jnt',(-10, 25, 35),(0,0,0)),('r_arm_04_setup_jnt',(-10, 5, 35),(0,0,0)),('r_arm_05_setup_jnt',(-10, 0, 35),(0,180,0)),('r_arm_rock_in_setup_jnt',(-5, 0, 35),(0,0,0)),('r_arm_rock_out_setup_jnt',(-15, 0, 35),(0,0,0)),('r_arm_heel_setup_jnt',(-10, 0, 25),(0,0,0)),('neck_01_setup_jnt',(0, 105, 35),(0,-180,0)),('neck_02_setup_jnt',(0, 105, 45),(0,0,0)),('head_setup_jnt',(0, 105, 55),(0,0,0)),('head_setup_end_jnt',(0, 105, 75),(0,0,0)),('tail_01_setup_jnt',(0, 95, -35),(0,90,90)),('tail_02_setup_jnt',(0, 95, -45),(0,0,0)),('tail_03_setup_jnt',(0, 95, -55),(0,0,0)),('tail_04_setup_jnt',(0, 95, -65),(0,0,0)),('tail_05_setup_jnt',(0, 95, -75),(0,0,0))]
    for each in nameOfJoint:
        cmds.joint(n=each[0],p=each[1],o=each[2])
        
    toParentJoint = [('l_leg_01_setup_jnt','spine_01_setup_jnt'),('r_leg_01_setup_jnt','spine_01_setup_jnt'),('l_leg_rock_out_setup_jnt','l_leg_04_setup_jnt'),('l_leg_rock_in_setup_jnt','l_leg_04_setup_jnt'),('l_leg_heel_setup_jnt','l_leg_04_setup_jnt'),('r_leg_rock_out_setup_jnt','r_leg_04_setup_jnt'),('r_leg_rock_in_setup_jnt','r_leg_04_setup_jnt'),('r_leg_heel_setup_jnt','r_leg_04_setup_jnt'),('l_shoulder_setup_jnt','spine_03_setup_jnt'),('l_arm_rock_out_setup_jnt','l_arm_04_setup_jnt'),('l_arm_rock_in_setup_jnt','l_arm_04_setup_jnt'),('l_arm_heel_setup_jnt','l_arm_04_setup_jnt'),('r_shoulder_setup_jnt','spine_03_setup_jnt'),('r_arm_rock_out_setup_jnt','r_arm_04_setup_jnt'),('r_arm_rock_in_setup_jnt','r_arm_04_setup_jnt'),('r_arm_heel_setup_jnt','r_arm_04_setup_jnt'),('neck_01_setup_jnt','spine_03_setup_jnt'),('tail_01_setup_jnt','spine_01_setup_jnt')]
    for each in toParentJoint:
        cmds.parent(each[0],each[1])
        
    toSetJointRotation = [('l_leg_01_setup_jnt.rotateY',-15),('l_leg_02_setup_jnt.rotateY',30),('l_leg_03_setup_jnt.rotateY',-30),('r_leg_01_setup_jnt.rotateY',-15),('r_leg_02_setup_jnt.rotateY',30),('r_leg_03_setup_jnt.rotateY',-30),('l_shoulder_setup_jnt.rotateY',-30),('l_arm_01_setup_jnt.rotateY',70),('l_arm_02_setup_jnt.rotateY',-45),('l_arm_03_setup_jnt.rotateY',10),('r_shoulder_setup_jnt.rotateY',-30),('r_arm_01_setup_jnt.rotateY',70),('r_arm_02_setup_jnt.rotateY',-45),('r_arm_03_setup_jnt.rotateY',10),('neck_01_setup_jnt.rotateY',-50),('neck_02_setup_jnt.rotateY',-20),('head_setup_jnt.rotateY',-10)]
    for each in toSetJointRotation:
        cmds.setAttr(each[0],each[1])
        
    nameOfLoc = [('l_leg_PV_setup_loc'),('r_leg_PV_setup_loc'),('l_arm_PV_setup_loc'),('r_arm_PV_setup_loc')]
    for each in nameOfLoc:
        cmds.spaceLocator(n=each)

    toParentLoc = [('l_leg_PV_setup_loc','l_leg_02_setup_jnt'),('r_leg_PV_setup_loc','r_leg_02_setup_jnt'),('l_arm_PV_setup_loc','l_arm_02_setup_jnt'),('r_arm_PV_setup_loc','r_arm_02_setup_jnt')]
    for each in toParentLoc:
        cmds.parent(each[0],each[1])
    
    toGetLocPos = [('l_leg_PV_setup_loc'),('r_leg_PV_setup_loc'),('l_arm_PV_setup_loc'),('r_arm_PV_setup_loc')]
    for each in toGetLocPos:
        cmds.setAttr(each+'.translateX',0)
        cmds.setAttr(each+'.translateY',0)
        cmds.setAttr(each+'.translateZ',0)
        cmds.setAttr(each+'.rotateX',0)
        cmds.setAttr(each+'.rotateZ',0)
    cmds.setAttr('l_leg_PV_setup_loc'+'.translateZ',25)
    cmds.setAttr('r_leg_PV_setup_loc'+'.translateZ',25)
    cmds.setAttr('l_arm_PV_setup_loc'+'.translateZ',-20)
    cmds.setAttr('r_arm_PV_setup_loc'+'.translateZ',-20)
    
#mirror quadruped setup joint#
def MirrorQuadrupedSetupJoint():
    cmds.mirrorJoint('l_leg_01_setup_jnt',mb = True,myz = True,sr = ('l_','r_mirror_'))
    forDel = cmds.parentConstraint('r_mirror_leg_01_setup_jnt','r_leg_01_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_01_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_01_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_leg_02_setup_jnt','r_leg_02_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_02_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_02_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_leg_03_setup_jnt','r_leg_03_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_03_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_03_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_leg_04_setup_jnt','r_leg_04_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_04_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_04_setup_jnt.rotateY',180)
    
    cmds.mirrorJoint('l_shoulder_setup_jnt',mb = True,myz = True,sr = ('l_','r_mirror_'))
    forDel = cmds.parentConstraint('r_mirror_shoulder_setup_jnt','r_shoulder_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_shoulder_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_shoulder_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_01_setup_jnt','r_arm_01_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_01_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_01_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_02_setup_jnt','r_arm_02_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_02_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_02_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_03_setup_jnt','r_arm_03_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_03_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_03_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_04_setup_jnt','r_arm_04_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_04_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_04_setup_jnt.rotateY',180)
    
    list = [('r_mirror_leg_heer_mirror_setup_jnt','r_leg_heel_setup_jnt'),('r_mirror_leg_rock_in_setup_jnt','r_leg_rock_in_setup_jnt'),('r_mirror_leg_rock_out_setup_jnt','r_leg_rock_out_setup_jnt'),('r_mirror_leg_05_setup_jnt','r_leg_05_setup_jnt'),('r_mirror_arm_heer_mirror_setup_jnt','r_arm_heel_setup_jnt'),('r_mirror_arm_rock_in_setup_jnt','r_arm_rock_in_setup_jnt'),('r_mirror_arm_rock_out_setup_jnt','r_arm_rock_out_setup_jnt'),('r_mirror_arm_05_setup_jnt','r_arm_05_setup_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
        
    cmds.delete('r_mirror_shoulder_setup_jnt','r_mirror_leg_01_setup_jnt')

#create quadruped setup rig function#
def BuildQuadrupedSetupRig():
    def progressBarWindow():
        # this command opens the window
        window = cmds.window('QuadrupedProgress',title='Building')
        cmds.columnLayout()
        
        cmds.progressBar('QuadrupedProgressBar',maxValue=10, width=300)
        
        cmds.showWindow( window )
        
    progressBarWindow()
        
    cmds.setAttr('spine_01_setup_jnt.visibility',0)
    
    def spineSetup():
        # FKspine #
        nameOfController = [('spine_01_FK_ctrl','spine_01_FK_ctrl_grp'),('spine_02_FK_ctrl','spine_02_FK_ctrl_grp'),('spine_03_FK_ctrl','spine_03_FK_ctrl_grp')]
        for each in nameOfController:
            cmds.curve(n=each[0],d=1, p=[(12.5, 12.5, 0),(-12.5, 12.5, 0),(-12.5, -12.5, 0),(12.5, -12.5, 0),(12.5, 12.5, 0)])
            cmds.group(n=each[1])

        cmds.circle(n='world_ctrl',r=50, nry = 90)
        cmds.setAttr('world_ctrl.overrideEnabled' ,True) 
        cmds.setAttr('world_ctrl.overrideColor' ,29)
        cmds.setAttr ('world_ctrl.visibility',keyable = False, cb = False, lock = True)
        cmds.group(n='world_ctrl_grp')
        cmds.curve(n='cog_ctrl',d=1, p=[(-3, 0, 18),(-18, 0, 3),(-18, 0, 6),(-24, 0, 0),(-18, 0, -6),(-18, 0, -3),(-3, 0, -18),(-3, 0, -18),(-6, 0, -18),(0, 0, -24),(6, 0, -18),(3, 0, -18),(18, 0, -3),(18, 0, -3),(18, 0, -6),(24, 0, 0),(18, 0, 6),(18, 0, 3),(3, 0, 18),(3, 0, 18),(6, 0, 18),(0, 0, 24),(-6, 0, 18),(-3, 0, 18)])
        cmds.group(n='cog_ctrl_grp',em=1)
        cmds.parent('cog_ctrl','cog_ctrl_grp')
        
        nameOfJoint = [('spine_01_FK_jnt'),('spine_02_FK_jnt'),('spine_03_FK_jnt')]
        for each in nameOfJoint:
            cmds.joint(n=each)
            cmds.parent(w=True)
            
        toGetPos = [('spine_01_setup_jnt','cog_ctrl_grp'),('spine_02_setup_jnt','spine_02_FK_ctrl_grp'),('spine_03_setup_jnt','spine_03_FK_ctrl_grp'),('spine_01_setup_jnt','spine_01_FK_ctrl_grp'),('spine_01_setup_jnt','spine_01_FK_jnt'),('spine_02_setup_jnt','spine_02_FK_jnt'),('spine_03_setup_jnt','spine_03_FK_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
        cmds.makeIdentity('spine_01_FK_jnt',apply=True,translate=True,rotate=True)
        
        toParentCon = [('spine_01_FK_ctrl','spine_01_FK_jnt'),('spine_02_FK_ctrl','spine_02_FK_jnt'),('spine_03_FK_ctrl','spine_03_FK_jnt'),('cog_ctrl','spine_01_FK_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
        
        toParent = [('spine_03_FK_jnt','spine_02_FK_jnt'),('spine_02_FK_jnt','spine_01_FK_jnt'),('spine_03_FK_ctrl_grp','spine_02_FK_ctrl'),('spine_02_FK_ctrl_grp','spine_01_FK_ctrl'),('spine_01_FK_ctrl_grp','world_ctrl')]
        for each in toParent:
            cmds.parent(each[0],each[1])
            
        toLockAttr = [('spine_01_FK_ctrl'),('spine_02_FK_ctrl'),('spine_03_FK_ctrl'),('cog_ctrl')]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
            
        # IKspine #
        cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
        cmds.rename('spine_crv')
        nameOfLoc = ['spine_01_loc','spine_02_loc','spine_03_loc','spine_04_loc','spine_05_loc']
        for each in nameOfLoc:
            cmds.spaceLocator(n=each)
    
        toGetLocPos = [('spine_01_loc.translateY',0),('spine_02_loc.translateY',2.5),('spine_03_loc.translateY',5),('spine_04_loc.translateY',7.5),('spine_05_loc.translateY',10)]
        for each in toGetLocPos:
            cmds.setAttr(each[0],each[1])
    
        toConnectLoc = [('spine_01_loc.worldPosition[0]','spine_crvShape.controlPoints[0]'),('spine_02_loc.worldPosition[0]','spine_crvShape.controlPoints[1]'),('spine_03_loc.worldPosition[0]','spine_crvShape.controlPoints[2]'),('spine_04_loc.worldPosition[0]','spine_crvShape.controlPoints[3]'),('spine_05_loc.worldPosition[0]','spine_crvShape.controlPoints[4]')]
        for each in toConnectLoc:
            cmds.connectAttr(each[0],each[1])
            
        toCreateIKspineController = [('spine_01_IK_ctrl','spine_01_IK_ctrl_grp'),('spine_02_IK_ctrl','spine_02_IK_ctrl_grp'),('spine_03_IK_ctrl','spine_03_IK_ctrl_grp')]
        for each in toCreateIKspineController:
            cmds.circle(n=each[0],r=10,nrz = 90)
            cmds.group(n=each[1])
        cmds.delete('world_ctrl','spine_01_IK_ctrl','spine_02_IK_ctrl','spine_03_IK_ctrl',constructionHistory = True)
        
        toCreateJoint = ['spine_IK_chest_jnt','spine_IK_root_jnt','spine_IK_01_jnt','spine_IK_02_jnt','spine_IK_03_jnt','spine_IK_04_jnt','spine_IK_05_jnt','spine_01_length_jnt','spine_02_length_jnt','spine_03_length_jnt','spine_04_length_jnt','spine_05_length_jnt','spine_start_length_jnt','spine_end_length_jnt']
        for each in toCreateJoint:
            cmds.joint(n=each)
            
        cmds.group(n='spine_IK_jnt_grp',em=True)
        cmds.parent('spine_IK_01_jnt','spine_IK_jnt_grp')
        cmds.orientConstraint('cog_ctrl','spine_IK_jnt_grp')
            
        cmds.parent('spine_IK_root_jnt','spine_IK_chest_jnt','spine_01_length_jnt','spine_start_length_jnt',w=True)
        
        toGetPos = [('spine_01_setup_jnt','spine_IK_01_jnt'),('spine_01_setup_jnt','spine_IK_02_jnt'),('spine_02_setup_jnt','spine_IK_02_jnt'),('spine_02_setup_jnt','spine_IK_03_jnt'),('spine_02_setup_jnt','spine_IK_04_jnt'),('spine_03_setup_jnt','spine_IK_04_jnt'),('spine_03_setup_jnt','spine_IK_05_jnt'),('spine_01_setup_jnt','spine_01_IK_ctrl_grp'),('spine_02_setup_jnt','spine_02_IK_ctrl_grp'),('spine_03_setup_jnt','spine_03_IK_ctrl_grp'),('spine_01_setup_jnt','spine_start_length_jnt'),('spine_03_setup_jnt','spine_end_length_jnt'),('spine_01_setup_jnt','spine_01_length_jnt'),('spine_01_setup_jnt','spine_01_loc'),('spine_02_setup_jnt','spine_03_loc'),('spine_03_setup_jnt','spine_05_loc'),('spine_01_setup_jnt','spine_IK_root_jnt'),('spine_03_setup_jnt','spine_IK_chest_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        forDelspine_02_lenghtJntParentCon = cmds.parentConstraint('spine_01_setup_jnt','spine_02_length_jnt',mo=False)
        forDelspine_02_lenghtJntParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_02_length_jnt',mo=False)
        forDelspine_03_lenghtJntParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_03_length_jnt',mo=False)
        forDelspine_04_lenghtJntParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_04_length_jnt',mo=False)
        forDelspine_04_lenghtJntParentCon = cmds.parentConstraint('spine_03_setup_jnt','spine_04_length_jnt',mo=False)
        forDelspine_05_lenghtJntParentCon = cmds.parentConstraint('spine_03_setup_jnt','spine_05_length_jnt',mo=False)
        cmds.delete(forDelspine_02_lenghtJntParentCon)
        cmds.delete(forDelspine_03_lenghtJntParentCon)
        cmds.delete(forDelspine_04_lenghtJntParentCon)
        cmds.delete(forDelspine_05_lenghtJntParentCon) 
        forDelspine_02_locParentCon = cmds.parentConstraint('spine_01_setup_jnt','spine_02_loc',mo=False)
        forDelspine_02_locParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_02_loc',mo=False)
        forDelspine_04_locParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_04_loc',mo=False)
        forDelspine_04_locParentCon = cmds.parentConstraint('spine_03_setup_jnt','spine_04_loc',mo=False)
        cmds.delete(forDelspine_02_locParentCon)
        cmds.delete(forDelspine_04_locParentCon)
        
        toParentCon = [('spine_03_IK_ctrl','spine_IK_chest_jnt'),('spine_01_IK_ctrl','spine_IK_root_jnt'),('spine_01_IK_ctrl','spine_01_loc'),('spine_02_IK_ctrl','spine_03_loc'),('spine_03_IK_ctrl','spine_05_loc'),('spine_01_IK_ctrl','spine_02_loc'),('spine_02_IK_ctrl','spine_02_loc'),('spine_02_IK_ctrl','spine_04_loc'),('spine_03_IK_ctrl','spine_04_loc'),('spine_03_IK_ctrl','spine_02_IK_ctrl_grp'),('spine_01_IK_ctrl','spine_02_IK_ctrl_grp'),('cog_ctrl','spine_01_IK_ctrl_grp'),('cog_ctrl','spine_03_IK_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.select('spine_IK_01_jnt','spine_IK_05_jnt','spine_crv')
        cmds.ikHandle(n='spine_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
        
        createNode = [('multiplyDivide','spine_twist_mult'),('plusMinusAverage','spine_twist_pma'),('multiplyDivide','spine_stretch_01_mult'),('multiplyDivide','spine_stretch_02_mult')]
        for each in createNode:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
            
        toSetNode = [('spine_twist_mult.input2X',-1),('spine_stretch_01_mult.operation',2),('spine_stretch_01_mult.operation',2)]
        for each in toSetNode:
            cmds.setAttr(each[0],each[1])
        
        cmds.arclen('spine_crv',ch = True)
            
        toConnectAttr = [('spine_01_IK_ctrl.rotateZ','spine_twist_mult.input1X'),('spine_03_IK_ctrl.rotateZ','spine_twist_pma.input1D[0]'),('spine_01_IK_ctrl.rotateZ','spine_ikh.roll'),('spine_twist_pma.output1D','spine_ikh.twist'),('spine_twist_mult.outputX','spine_twist_pma.input1D[1]'),('curveInfo1.arcLength','spine_stretch_01_mult.input1X'),('spine_stretch_01_mult.outputX','spine_stretch_02_mult.input1X'),('spine_02_length_jnt.translateZ','spine_stretch_02_mult.input2X'),('spine_stretch_02_mult.outputX','spine_IK_02_jnt.translateZ'),('spine_stretch_02_mult.outputX','spine_IK_03_jnt.translateZ'),('spine_stretch_02_mult.outputX','spine_IK_04_jnt.translateZ'),('spine_stretch_02_mult.outputX','spine_IK_05_jnt.translateZ'),('spine_end_length_jnt.translateZ','spine_stretch_01_mult.input2X')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
        
        toCreateGroup = ['spine_IK_setup_jnt_grp','spine_IK_ctrl_grp','spine_IK_loc_grp','spine_IK_setup_grp']
        for each in toCreateGroup:
            cmds.group(n=each,em=True)
            
        toParent = [('spine_01_loc','spine_IK_loc_grp'),('spine_02_loc','spine_IK_loc_grp'),('spine_03_loc','spine_IK_loc_grp'),('spine_04_loc','spine_IK_loc_grp'),('spine_05_loc','spine_IK_loc_grp'),('spine_01_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_02_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_03_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_01_length_jnt','spine_IK_setup_jnt_grp'),('spine_start_length_jnt','spine_IK_setup_jnt_grp'),('spine_ikh','spine_IK_setup_grp'),('spine_crv','spine_IK_setup_grp'),('spine_IK_setup_jnt_grp','spine_IK_setup_grp'),('spine_IK_loc_grp','spine_IK_setup_grp'),('spine_IK_ctrl_grp','world_ctrl')]
        for each in toParent:
            cmds.parent(each[0],each[1])
        
        cmds.scaleConstraint('world_ctrl','spine_IK_setup_jnt_grp',mo=True)
        
        #set IKFK spine controller attributes#
        listOfSpineController = ['cog_ctrl','spine_01_IK_ctrl','spine_02_IK_ctrl','spine_03_IK_ctrl','spine_01_FK_ctrl','spine_02_FK_ctrl','spine_03_FK_ctrl']
        for each in listOfSpineController:
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
        
        #create IKFK spine bind joint#
        nameOfSpineBindJoint = ['spine_01_bln_jnt','spine_02_bln_jnt','spine_03_bln_jnt']
        for each in nameOfSpineBindJoint:
            cmds.joint(n=each)
            
        cmds.parent('spine_01_bln_jnt',w=True)
        cmds.group(n='spine_01_bln_jnt_grp')
        cmds.scaleConstraint('world_ctrl','spine_01_bln_jnt_grp',mo=True)
            
        toGetSpineBindJointPos = [('spine_01_setup_jnt','spine_01_bln_jnt'),('spine_02_setup_jnt','spine_02_bln_jnt'),('spine_03_setup_jnt','spine_03_bln_jnt')]
        for each in toGetSpineBindJointPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        toParentConIKFKspine = [('spine_01_FK_jnt','spine_01_bln_jnt'),('spine_IK_root_jnt','spine_01_bln_jnt'),('spine_02_FK_jnt','spine_02_bln_jnt'),('spine_IK_03_jnt','spine_02_bln_jnt'),('spine_03_FK_jnt','spine_03_bln_jnt'),('spine_IK_chest_jnt','spine_03_bln_jnt')]    
        for each in toParentConIKFKspine:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.curve(n='spine_ik_fk_switch',d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
        cmds.group(n='spine_ik_fk_switch_grp')
        cmds.setAttr('spine_ik_fk_switch.visibility',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.translateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.translateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.translateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.rotateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.rotateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.rotateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.overrideEnabled' ,True) 
        cmds.setAttr('spine_ik_fk_switch.overrideColor' ,15)
        cmds.parent('spine_ik_fk_switch_grp', 'world_ctrl')
        cmds.addAttr('spine_ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
        cmds.parentConstraint('spine_02_bln_jnt','spine_ik_fk_switch_grp')
        cmds.shadingNode('reverse',n='spine_ik_rev',asUtility=1)
        
        toConnectAttr = [('spine_ik_fk_switch.IKFK','spine_01_bln_jnt_parentConstraint1.spine_01_FK_jntW0'),('spine_ik_fk_switch.IKFK','spine_ik_rev.inputX'),('spine_ik_rev.outputX','spine_01_bln_jnt_parentConstraint1.spine_IK_root_jntW1'),('spine_ik_fk_switch.IKFK','spine_02_bln_jnt_parentConstraint1.spine_02_FK_jntW0'),('spine_ik_rev.outputX','spine_02_bln_jnt_parentConstraint1.spine_IK_03_jntW1'),('spine_ik_fk_switch.IKFK','spine_03_bln_jnt_parentConstraint1.spine_03_FK_jntW0'),('spine_ik_rev.outputX','spine_03_bln_jnt_parentConstraint1.spine_IK_chest_jntW1'),('spine_ik_rev.outputX','spine_IK_ctrl_grp.visibility'),('spine_ik_fk_switch.IKFK','spine_01_FK_ctrl_grp.visibility')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])

        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        
    spineSetup()
    
    def leftRightFKsetup(side):
        nameOfFKcontroller = [('%s_FK_leg_01_ctrl'%(side),'%s_FK_leg_01_ctrl_grp'%(side)),('%s_FK_leg_02_ctrl'%(side),'%s_FK_leg_02_ctrl_grp'%(side)),('%s_FK_leg_03_ctrl'%(side),'%s_FK_leg_03_ctrl_grp'%(side)),('%s_FK_leg_04_ctrl'%(side),'%s_FK_leg_04_ctrl_grp'%(side)),('%s_FK_arm_01_ctrl'%(side),'%s_FK_arm_01_ctrl_grp'%(side)),('%s_FK_arm_02_ctrl'%(side),'%s_FK_arm_02_ctrl_grp'%(side)),('%s_FK_arm_03_ctrl'%(side),'%s_FK_arm_03_ctrl_grp'%(side)),('%s_FK_arm_04_ctrl'%(side),'%s_FK_arm_04_ctrl_grp'%(side)),('%s_shoulder_ctrl'%(side),'%s_shoulder_ctrl_grp'%(side))]
        for each in nameOfFKcontroller:
            ctrl = cmds.circle(n=each[0],r=5,nrx = 90)
            cmds.delete(ctrl,constructionHistory = True)
            cmds.group(n=each[1])
            
        nameOfJoint = [('%s_FK_leg_01_jnt'%(side)),('%s_FK_leg_02_jnt'%(side)),('%s_FK_leg_03_jnt'%(side)),('%s_FK_leg_04_jnt'%(side)),('%s_FK_arm_01_jnt'%(side)),('%s_FK_arm_02_jnt'%(side)),('%s_FK_arm_03_jnt'%(side)),('%s_FK_arm_04_jnt'%(side)),('%s_shoulder_jnt'%(side))]
        for each in nameOfJoint:
            cmds.joint(n=each)
            cmds.parent(w = True)
            
        togetPos = [('%s_leg_01_setup_jnt'%(side),'%s_FK_leg_01_jnt'%(side)),('%s_leg_02_setup_jnt'%(side),'%s_FK_leg_02_jnt'%(side)),('%s_leg_03_setup_jnt'%(side),'%s_FK_leg_03_jnt'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_FK_leg_04_jnt'%(side)),('%s_leg_01_setup_jnt'%(side),'%s_FK_leg_01_ctrl_grp'%(side)),('%s_leg_02_setup_jnt'%(side),'%s_FK_leg_02_ctrl_grp'%(side)),('%s_leg_03_setup_jnt'%(side),'%s_FK_leg_03_ctrl_grp'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_FK_leg_04_ctrl_grp'%(side)),('%s_arm_01_setup_jnt'%(side),'%s_FK_arm_01_jnt'%(side)),('%s_arm_02_setup_jnt'%(side),'%s_FK_arm_02_jnt'%(side)),('%s_arm_03_setup_jnt'%(side),'%s_FK_arm_03_jnt'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_FK_arm_04_jnt'%(side)),('%s_arm_01_setup_jnt'%(side),'%s_FK_arm_01_ctrl_grp'%(side)),('%s_arm_02_setup_jnt'%(side),'%s_FK_arm_02_ctrl_grp'%(side)),('%s_arm_03_setup_jnt'%(side),'%s_FK_arm_03_ctrl_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_FK_arm_04_ctrl_grp'%(side)),('%s_shoulder_setup_jnt'%(side),'%s_shoulder_jnt'%(side)),('%s_shoulder_setup_jnt'%(side),'%s_shoulder_ctrl_grp'%(side))]
        for each in togetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toParent = [('%s_FK_leg_04_ctrl_grp'%(side),'%s_FK_leg_03_ctrl'%(side)),('%s_FK_leg_03_ctrl_grp'%(side),'%s_FK_leg_02_ctrl'%(side)),('%s_FK_leg_02_ctrl_grp'%(side),'%s_FK_leg_01_ctrl'%(side)),('%s_FK_leg_04_jnt'%(side),'%s_FK_leg_03_jnt'%(side)),('%s_FK_leg_03_jnt'%(side),'%s_FK_leg_02_jnt'%(side)),('%s_FK_leg_02_jnt'%(side),'%s_FK_leg_01_jnt'%(side)),('%s_FK_arm_04_ctrl_grp'%(side),'%s_FK_arm_03_ctrl'%(side)),('%s_FK_arm_03_ctrl_grp'%(side),'%s_FK_arm_02_ctrl'%(side)),('%s_FK_arm_02_ctrl_grp'%(side),'%s_FK_arm_01_ctrl'%(side)),('%s_FK_arm_04_jnt'%(side),'%s_FK_arm_03_jnt'%(side)),('%s_FK_arm_03_jnt'%(side),'%s_FK_arm_02_jnt'%(side)),('%s_FK_arm_02_jnt'%(side),'%s_FK_arm_01_jnt'%(side)),('%s_FK_arm_01_ctrl_grp'%(side),'%s_shoulder_ctrl'%(side))]
        for each in toParent:
            cmds.parent(each[0],each[1])
            cmds.makeIdentity('%s_FK_leg_01_jnt'%(side),'%s_FK_arm_01_jnt'%(side),'%s_shoulder_jnt'%(side),apply=True,translate=True,rotate=True)
        
        toParentCon = [('%s_FK_leg_01_ctrl'%(side),'%s_FK_leg_01_jnt'%(side)),('%s_FK_leg_02_ctrl'%(side),'%s_FK_leg_02_jnt'%(side)),('%s_FK_leg_03_ctrl'%(side),'%s_FK_leg_03_jnt'%(side)),('%s_FK_leg_04_ctrl'%(side),'%s_FK_leg_04_jnt'%(side)),('%s_FK_arm_01_ctrl'%(side),'%s_FK_arm_01_jnt'%(side)),('%s_FK_arm_02_ctrl'%(side),'%s_FK_arm_02_jnt'%(side)),('%s_FK_arm_03_ctrl'%(side),'%s_FK_arm_03_jnt'%(side)),('%s_FK_arm_04_ctrl'%(side),'%s_FK_arm_04_jnt'%(side)),('%s_shoulder_ctrl'%(side),'%s_shoulder_jnt'%(side)),('spine_03_bln_jnt','%s_shoulder_ctrl_grp'%(side)),('spine_01_bln_jnt','%s_FK_leg_01_ctrl_grp'%(side))]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
            
        toLockAttr = [('%s_FK_leg_01_ctrl'%(side)),('%s_FK_leg_02_ctrl'%(side)),('%s_FK_leg_03_ctrl'%(side)),('%s_FK_leg_04_ctrl'%(side)),('%s_shoulder_ctrl'%(side)),('%s_FK_arm_01_ctrl'%(side)),('%s_FK_arm_02_ctrl'%(side)),('%s_FK_arm_03_ctrl'%(side)),('%s_FK_arm_04_ctrl'%(side))]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
        
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        
    leftRightFKsetup('l')
    leftRightFKsetup('r')
    
    def tailSetup():
        # FK tail 
        nameOfController = [('tail_FK_01_ctrl','tail_FK_01_ctrl_grp'),('tail_FK_02_ctrl','tail_FK_02_ctrl_grp'),('tail_FK_03_ctrl','tail_FK_03_ctrl_grp'),('tail_FK_04_ctrl','tail_FK_04_ctrl_grp'),('tail_FK_05_ctrl','tail_FK_05_ctrl_grp')]
        for each in nameOfController:
            ctrl = cmds.circle(n=each[0],r=5,nrx = 90)
            cmds.delete(ctrl,constructionHistory = True)
            cmds.group(n = each[1])
            
        nameOfJoint = [('tail_FK_01_jnt'),('tail_FK_02_jnt'),('tail_FK_03_jnt'),('tail_FK_04_jnt'),('tail_FK_05_jnt')]
        for each in nameOfJoint:
            cmds.joint(n = each)
            cmds.parent(w = True)
              
        toGetPos = [('tail_01_setup_jnt','tail_FK_01_ctrl_grp'),('tail_02_setup_jnt','tail_FK_02_ctrl_grp'),('tail_03_setup_jnt','tail_FK_03_ctrl_grp'),('tail_04_setup_jnt','tail_FK_04_ctrl_grp'),('tail_05_setup_jnt','tail_FK_05_ctrl_grp'),('tail_01_setup_jnt','tail_FK_01_jnt'),('tail_02_setup_jnt','tail_FK_02_jnt'),('tail_03_setup_jnt','tail_FK_03_jnt'),('tail_04_setup_jnt','tail_FK_04_jnt'),('tail_05_setup_jnt','tail_FK_05_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toParent = [('tail_FK_05_ctrl_grp','tail_FK_04_ctrl'),('tail_FK_04_ctrl_grp','tail_FK_03_ctrl'),('tail_FK_03_ctrl_grp','tail_FK_02_ctrl'),('tail_FK_02_ctrl_grp','tail_FK_01_ctrl'),('tail_FK_05_jnt','tail_FK_04_jnt'),('tail_FK_04_jnt','tail_FK_03_jnt'),('tail_FK_03_jnt','tail_FK_02_jnt'),('tail_FK_02_jnt','tail_FK_01_jnt')]
        for each in toParent:
            cmds.parent(each[0],each[1])
            cmds.makeIdentity('tail_FK_01_jnt',apply=True,translate=True,rotate=True)
            
        toParentCon = [('tail_FK_01_ctrl','tail_FK_01_jnt'),('tail_FK_02_ctrl','tail_FK_02_jnt'),('tail_FK_03_ctrl','tail_FK_03_jnt'),('tail_FK_04_ctrl','tail_FK_04_jnt'),('tail_FK_05_ctrl','tail_FK_05_jnt'),('spine_01_bln_jnt','tail_FK_01_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
            
        toLockAttr = [('tail_FK_01_ctrl'),('tail_FK_02_ctrl'),('tail_FK_03_ctrl'),('tail_FK_04_ctrl'),('tail_FK_05_ctrl')]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
        
        # IK tail
        list = ['tail_IK_01_jnt','tail_IK_02_jnt','tail_IK_03_jnt','tail_IK_04_jnt','tail_IK_05_jnt','tail_start_length_jnt','tail_end_length_jnt','tail_01_length_jnt','tail_02_length_jnt','tail_03_length_jnt','tail_04_length_jnt','tail_05_length_jnt']
        for each in list:
            cmds.joint(n=each)
            
        list = [('tail_IK_01_ctrl','tail_IK_01_ctrl_grp'),('tail_IK_02_ctrl','tail_IK_02_ctrl_grp'),('tail_IK_03_ctrl','tail_IK_03_ctrl_grp')]
        for each in list:
            cmds.curve(n=each[0],d=1, p=[(-2.5, -5, 5),(-2.5, 5, 5),(2.5, 5, 5),(2.5, -5, 5),(2.5, -5, -5),(2.5, 5, -5),(-2.5, 5, -5),(-2.5, -5, -5),(-2.5, -5, 5),(2.5, -5, 5),(2.5, 5, 5),(2.5, 5, -5),(2.5, -5, -5),(-2.5, -5, -5),(-2.5, 5, -5),(-2.5, 5, 5)])
            cmds.group(n=each[1])
        
        list = [('tail_01_setup_jnt','tail_IK_01_jnt'),('tail_02_setup_jnt','tail_IK_02_jnt'),('tail_03_setup_jnt','tail_IK_03_jnt'),('tail_04_setup_jnt','tail_IK_04_jnt'),('tail_05_setup_jnt','tail_IK_05_jnt'),('tail_01_setup_jnt','tail_IK_01_ctrl_grp'),('tail_03_setup_jnt','tail_IK_02_ctrl_grp'),('tail_05_setup_jnt','tail_IK_03_ctrl_grp'),('tail_01_setup_jnt','tail_01_length_jnt'),('tail_02_setup_jnt','tail_02_length_jnt'),('tail_03_setup_jnt','tail_03_length_jnt'),('tail_04_setup_jnt','tail_04_length_jnt'),('tail_05_setup_jnt','tail_05_length_jnt'),('tail_01_setup_jnt','tail_start_length_jnt'),('tail_05_setup_jnt','tail_end_length_jnt')]
        for each in list:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
        cmds.rename('tail_crv')
        
        nameOfLoc = ['tail_01_loc','tail_02_loc','tail_03_loc','tail_04_loc','tail_05_loc']
        for each in nameOfLoc:
            cmds.spaceLocator(n=each)
    
        toGetLocPos = [('tail_01_loc.translateY',0),('tail_02_loc.translateY',2.5),('tail_03_loc.translateY',5),('tail_04_loc.translateY',7.5),('tail_05_loc.translateY',10)]
        for each in toGetLocPos:
            cmds.setAttr(each[0],each[1])
    
        toConnectLoc = [('tail_01_loc.worldPosition[0]','tail_crv.controlPoints[0]'),('tail_02_loc.worldPosition[0]','tail_crv.controlPoints[1]'),('tail_03_loc.worldPosition[0]','tail_crv.controlPoints[2]'),('tail_04_loc.worldPosition[0]','tail_crv.controlPoints[3]'),('tail_05_loc.worldPosition[0]','tail_crv.controlPoints[4]')]
        for each in toConnectLoc:
            cmds.connectAttr(each[0],each[1])
            
        list = ['tail_setup_grp','tail_jnt_grp','tail_ctrl_grp','tail_IK_ctrl_grp','tail_IK_jnt_grp','tail_IK_setup_jnt_grp']
        for each in list:
            cmds.group(n=each,em=True)
  
        cmds.orientConstraint('tail_IK_01_ctrl','tail_IK_jnt_grp',mo=True)
        
        list = [('tail_01_setup_jnt','tail_01_loc'),('tail_02_setup_jnt','tail_02_loc'),('tail_03_setup_jnt','tail_03_loc'),('tail_04_setup_jnt','tail_04_loc'),('tail_05_setup_jnt','tail_05_loc')]
        for each in list:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        list = [('tail_IK_01_ctrl','tail_01_loc'),('tail_IK_01_ctrl','tail_02_loc'),('tail_IK_02_ctrl','tail_02_loc'),('tail_IK_02_ctrl','tail_03_loc'),('tail_IK_02_ctrl','tail_04_loc'),('tail_IK_03_ctrl','tail_04_loc'),('tail_IK_03_ctrl','tail_05_loc'),('tail_IK_01_ctrl','tail_IK_02_ctrl_grp'),('tail_IK_03_ctrl','tail_IK_02_ctrl_grp'),('spine_01_bln_jnt','tail_IK_ctrl_grp')]    
        for each in list:
            cmds.parentConstraint(each[0],each[1],mo=True)
        cmds.select('tail_IK_01_jnt','tail_IK_05_jnt','tail_crv')
        cmds.ikHandle(n='tail_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
        
        createNode = [('multiplyDivide','tail_stretch_01_mult'),('multiplyDivide','tail_stretch_02_mult')]
        for each in createNode:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
            
        toSetNode = [('tail_stretch_01_mult.operation',2),('tail_stretch_01_mult.operation',2)]
        for each in toSetNode:
            cmds.setAttr(each[0],each[1])
        
        cmds.arclen('tail_crv',ch = True)
            
        toConnectAttr = [('tail_IK_03_ctrl.rotateX','tail_ikh.twist'),('curveInfo2.arcLength','tail_stretch_01_mult.input1X'),('tail_stretch_01_mult.outputX','tail_stretch_02_mult.input1X'),('tail_02_length_jnt.translateX','tail_stretch_02_mult.input2X'),('tail_stretch_02_mult.outputX','tail_IK_02_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_IK_03_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_IK_04_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_IK_05_jnt.translateX'),('tail_end_length_jnt.translateX','tail_stretch_01_mult.input2X')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
            
        # IKFK tail setup
        list = ['tail_bln_01_jnt','tail_bln_02_jnt','tail_bln_03_jnt','tail_bln_04_jnt','tail_bln_05_jnt']
        for each in list:
            cmds.joint(n=each)
            
        list = [('tail_01_setup_jnt','tail_bln_01_jnt'),('tail_02_setup_jnt','tail_bln_02_jnt'),('tail_03_setup_jnt','tail_bln_03_jnt'),('tail_04_setup_jnt','tail_bln_04_jnt'),('tail_05_setup_jnt','tail_bln_05_jnt')]
        for each in list:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        list = [('tail_FK_01_jnt','tail_bln_01_jnt'),('tail_FK_02_jnt','tail_bln_02_jnt'),('tail_FK_03_jnt','tail_bln_03_jnt'),('tail_FK_04_jnt','tail_bln_04_jnt'),('tail_FK_05_jnt','tail_bln_05_jnt'),('tail_IK_01_jnt','tail_bln_01_jnt'),('tail_IK_02_jnt','tail_bln_02_jnt'),('tail_IK_03_jnt','tail_bln_03_jnt'),('tail_IK_04_jnt','tail_bln_04_jnt'),('tail_IK_05_jnt','tail_bln_05_jnt')]
        for each in list:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.curve(n='tail_ik_fk_switch',d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
        cmds.group(n='tail_ik_fk_switch_grp')
        cmds.setAttr('tail_ik_fk_switch.visibility',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.translateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.translateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.translateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.rotateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.rotateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.rotateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.overrideEnabled' ,True) 
        cmds.setAttr('tail_ik_fk_switch.overrideColor' ,15)
        cmds.parent('tail_ik_fk_switch_grp', 'world_ctrl')
        cmds.addAttr('tail_ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
        cmds.parentConstraint('tail_bln_01_jnt','tail_ik_fk_switch_grp')
        cmds.shadingNode('reverse',n='tail_ik_rev',asUtility=1)
        
        toConnectAttr = [('tail_ik_fk_switch.IKFK','tail_bln_01_jnt_parentConstraint1.tail_FK_01_jntW0'),('tail_ik_fk_switch.IKFK','tail_ik_rev.inputX'),('tail_ik_rev.outputX','tail_bln_01_jnt_parentConstraint1.tail_IK_01_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_02_jnt_parentConstraint1.tail_FK_02_jntW0'),('tail_ik_rev.outputX','tail_bln_02_jnt_parentConstraint1.tail_IK_02_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_03_jnt_parentConstraint1.tail_FK_03_jntW0'),('tail_ik_rev.outputX','tail_bln_03_jnt_parentConstraint1.tail_IK_03_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_04_jnt_parentConstraint1.tail_FK_04_jntW0'),('tail_ik_rev.outputX','tail_bln_04_jnt_parentConstraint1.tail_IK_04_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_05_jnt_parentConstraint1.tail_FK_05_jntW0'),('tail_ik_rev.outputX','tail_bln_05_jnt_parentConstraint1.tail_IK_05_jntW1'),('tail_ik_rev.outputX','tail_IK_ctrl_grp.visibility'),('tail_ik_fk_switch.IKFK','tail_FK_01_ctrl_grp.visibility')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
        
        # create tail group
        list = [('tail_IK_01_jnt','tail_IK_jnt_grp'),('tail_start_length_jnt','tail_IK_setup_jnt_grp'),('tail_01_length_jnt','tail_IK_setup_jnt_grp'),('tail_IK_01_ctrl_grp','tail_IK_ctrl_grp'),('tail_IK_02_ctrl_grp','tail_IK_ctrl_grp'),('tail_IK_03_ctrl_grp','tail_IK_ctrl_grp'),('tail_IK_ctrl_grp','tail_ctrl_grp'),('tail_FK_01_ctrl_grp','tail_ctrl_grp'),('tail_ik_fk_switch_grp','tail_ctrl_grp'),('tail_FK_01_jnt','tail_jnt_grp'),('tail_IK_01_jnt','tail_jnt_grp'),('tail_bln_01_jnt','tail_jnt_grp'),('tail_IK_setup_jnt_grp','tail_jnt_grp'),('tail_IK_jnt_grp','tail_jnt_grp'),('tail_crv','tail_setup_grp'),('tail_01_loc','tail_setup_grp'),('tail_02_loc','tail_setup_grp'),('tail_03_loc','tail_setup_grp'),('tail_04_loc','tail_setup_grp'),('tail_05_loc','tail_setup_grp'),('tail_IK_jnt_grp','tail_setup_grp'),('tail_IK_setup_jnt_grp','tail_setup_grp'),('tail_ikh','tail_setup_grp')]
        for each in list:
            cmds.parent(each[0],each[1])
            
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        
    tailSetup()
    
    def neckSetup():
        nameOfController = [('neck_01_ctrl','neck_01_ctrl_grp'),('neck_02_ctrl','neck_02_ctrl_grp'),('head_ctrl','head_ctrl_grp')]
        for each in nameOfController:
            cmds.curve(n=each[0],d=1, p=[(12.5, 12.5, 0),(-12.5, 12.5, 0),(-12.5, -12.5, 0),(12.5, -12.5, 0),(12.5, 12.5, 0)])
            cmds.group(n=each[1])
            
        nameOfJoint = [('neck_01_jnt'),('neck_02_jnt'),('head_jnt')]
        for each in nameOfJoint:
            cmds.joint(n=each)
            cmds.parent(w=True)
            
        toGetPos = [('neck_01_setup_jnt','neck_01_ctrl_grp'),('neck_02_setup_jnt','neck_02_ctrl_grp'),('head_setup_jnt','head_ctrl_grp'),('neck_01_setup_jnt','neck_01_jnt'),('neck_02_setup_jnt','neck_02_jnt'),('head_setup_jnt','head_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toParent = [('head_ctrl_grp','neck_02_ctrl'),('neck_02_ctrl_grp','neck_01_ctrl'),('head_jnt','neck_02_jnt'),('neck_02_jnt','neck_01_jnt')]
        for each in toParent:   
            cmds.parent(each[0],each[1])
            cmds.makeIdentity('neck_01_jnt',apply=True,translate=True,rotate=True)
            
        toParentCon = [('neck_01_ctrl','neck_01_jnt'),('neck_02_ctrl','neck_02_jnt'),('head_ctrl','head_jnt'),('spine_03_bln_jnt','neck_01_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
            
        toLockAttr = [('neck_01_ctrl'),('neck_02_ctrl'),('head_ctrl')]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
        
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)

    neckSetup()
    
    def leftRightIKsetup(side):
        nameOfJoint = [('%s_IK_leg_01_jnt'%(side)),('%s_IK_leg_02_jnt'%(side)),('%s_IK_leg_03_jnt'%(side)),('%s_IK_leg_04_jnt'%(side)),('%s_IK_arm_01_jnt'%(side)),('%s_IK_arm_02_jnt'%(side)),('%s_IK_arm_03_jnt'%(side)),('%s_IK_arm_04_jnt'%(side))]
        for each in nameOfJoint:
            cmds.joint(n=each)
        
        list = [('%s_IK_leg_roll_ctrl'%(side),'%s_IK_leg_roll_ctrl_grp'%(side)),('%s_IK_arm_roll_ctrl'%(side),'%s_IK_arm_roll_ctrl_grp'%(side))]
        for each in list:
            cmds.curve(d=1, p=[(0.5, 0.5, 0.5),(-0.5, 0.5, 0.5),(-1, 0, 0.5),(-1, 0, 1),(-1.5, -0.5, 0),(-1, 0, -1),(-1, 0, -0.5),(-0.5, 0.5, -0.5),(0.5, 0.5, -0.5),(1, 0, -0.5),(1, 0, -1),(1.5, -0.5, 0),(1, 0, 1),(1, 0, 1),(1, 0, 0.5),(0.5, 0.5, 0.5)],n=each[0])
            cmds.group(n=each[1])
        
        nameOfIKfootController = [('%s_IK_leg_ctrl'%(side),'%s_IK_leg_ctrl_grp'%(side)),('%s_IK_arm_ctrl'%(side),'%s_IK_arm_ctrl_grp'%(side))]
        for each in nameOfIKfootController:
            cmds.curve(n=each[0],d=1, p=[(-5, -5, 5),(-5, 5, 5),(5, 5, 5),(5, -5, 5),(5, -5, -5),(5, 5, -5),(-5, 5, -5),(-5, -5, -5),(-5, -5, 5),(5, -5, 5),(5, 5, 5),(5, 5, -5),(5, -5, -5),(-5, -5, -5),(-5, 5, -5),(-5, 5, 5)])
            cmds.group(n=each[1])
            
        nameOfPVcontroller = [('%s_leg_PV_ctrl'%(side),'%s_leg_PV_ctrl_grp'%(side)),('%s_arm_PV_ctrl'%(side),'%s_arm_PV_ctrl_grp'%(side))]
        for each in nameOfPVcontroller:
            cmds.curve(n=each[0],d = 1, p = [(0, 5, 0), (0, 0, 5), (0, -5, 0), (0, 0, -5), (0, 5, 0), (5, 0, 0), (0, -5, 0), (-5, 0, 0), (0, 0, 5), (5, 0, 0), (0, 0, -5), (-5, 0, 0), (0, 5, 0)])
            cmds.group(n=each[1])
            
        toGetControllerPos = [('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_ctrl_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_ctrl_grp'%(side)),('%s_leg_PV_setup_loc'%(side),'%s_leg_PV_ctrl_grp'%(side)),('%s_arm_PV_setup_loc'%(side),'%s_arm_PV_ctrl_grp'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_roll_ctrl_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_roll_ctrl_grp'%(side))]
        for each in toGetControllerPos:
            forDel = cmds.pointConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toGetJointPos = [('%s_leg_01_setup_jnt'%(side),'%s_IK_leg_01_jnt'%(side)),('%s_leg_02_setup_jnt'%(side),'%s_IK_leg_02_jnt'%(side)),('%s_leg_03_setup_jnt'%(side),'%s_IK_leg_03_jnt'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_04_jnt'%(side)),('%s_arm_01_setup_jnt'%(side),'%s_IK_arm_01_jnt'%(side)),('%s_arm_02_setup_jnt'%(side),'%s_IK_arm_02_jnt'%(side)),('%s_arm_03_setup_jnt'%(side),'%s_IK_arm_03_jnt'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_04_jnt'%(side))]
        for each in toGetJointPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        list = [('%s_IK_leg_roll_ctrl'%(side)),('%s_IK_arm_roll_ctrl'%(side))]
        for each in list:
            cmds.setAttr (each+'.translateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.translateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.translateZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
        
        toLockPVcontroller = [('%s_leg_PV_ctrl'%(side)),('%s_arm_PV_ctrl'%(side))]
        for each in toLockPVcontroller:
            cmds.setAttr (each+'.rotateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.rotateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.rotateZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
            cmds.addAttr (each,sn='follow', min = 0, max=1 ,k=1)
            
        toLockIKcontroller = [('%s_IK_leg_ctrl'%(side)),('%s_IK_arm_ctrl'%(side))]
        for each in toLockIKcontroller:
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
            cmds.addAttr (each,sn='stretch',at = 'bool',k=1)
            cmds.addAttr (each,sn='heelLift' ,k=1)
            cmds.addAttr (each,sn='toeLift' ,k=1)
            cmds.addAttr (each,sn='footRock' ,k=1)
            
        nameOfLoc = [('%s_leg_heel_loc'%(side)),('%s_leg_toe_lift_loc'%(side)),('%s_leg_roll_out_loc'%(side)),('%s_leg_roll_in_loc'%(side)),('%s_arm_heel_loc'%(side)),('%s_arm_toe_lift_loc'%(side)),('%s_arm_roll_out_loc'%(side)),('%s_arm_roll_in_loc'%(side)),('%s_leg_PV_aim_loc'%(side)),('%s_leg_PV_aim_up_loc'%(side)),('%s_leg_PV_aim_base_loc'%(side)),('%s_leg_PV_aim_world_loc'%(side)),('%s_arm_PV_aim_loc'%(side)),('%s_arm_PV_aim_up_loc'%(side)),('%s_arm_PV_aim_base_loc'%(side)),('%s_arm_PV_aim_world_loc'%(side))]
        for each in nameOfLoc:
            cmds.spaceLocator(n=each)
        
        toGetGrp = [('%s_IK_leg_loc_grp'%(side)),('%s_IK_arm_loc_grp'%(side)),('%s_IK_leg_jnt_grp'%(side)),('%s_IK_arm_jnt_grp'%(side)),('%s_IK_arm_PV_loc_grp'%(side)),('%s_IK_leg_PV_loc_grp'%(side)),('%s_IK_leg_grp'%(side)),('%s_IK_arm_grp'%(side))]
        for each in toGetGrp:
            cmds.group(n=each,em=True)
            
        toGetPos = [('%s_leg_05_setup_jnt'%(side),'%s_leg_toe_lift_loc'%(side)),('%s_leg_heel_setup_jnt'%(side),'%s_leg_heel_loc'%(side)),('%s_leg_rock_out_setup_jnt'%(side),'%s_leg_roll_out_loc'%(side)),('%s_leg_rock_in_setup_jnt'%(side),'%s_leg_roll_in_loc'%(side)),('%s_arm_05_setup_jnt'%(side),'%s_arm_toe_lift_loc'%(side)),('%s_arm_heel_setup_jnt'%(side),'%s_arm_heel_loc'%(side)),('%s_arm_rock_out_setup_jnt'%(side),'%s_arm_roll_out_loc'%(side)),('%s_arm_rock_in_setup_jnt'%(side),'%s_arm_roll_in_loc'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_loc_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_loc_grp'%(side)),('spine_01_bln_jnt','%s_leg_PV_aim_up_loc'%(side)),('%s_IK_leg_01_jnt'%(side),'%s_leg_PV_aim_base_loc'%(side)),('%s_IK_leg_04_jnt'%(side),'%s_leg_PV_aim_loc'%(side)),('%s_leg_PV_ctrl'%(side),'%s_leg_PV_aim_world_loc'%(side)),('spine_03_bln_jnt','%s_arm_PV_aim_up_loc'%(side)),('%s_IK_arm_01_jnt'%(side),'%s_arm_PV_aim_base_loc'%(side)),('%s_IK_arm_04_jnt'%(side),'%s_arm_PV_aim_loc'%(side)),('%s_arm_PV_ctrl'%(side),'%s_arm_PV_aim_world_loc'%(side))]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        list = [('%s_arm_heel_loc'%(side),'%s_IK_arm_loc_grp'%(side)),('%s_leg_heel_loc'%(side),'%s_IK_leg_loc_grp'%(side))]
        for each in list:
            forDel = cmds.orientConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        cmds.parent('%s_IK_leg_01_jnt'%(side),'%s_IK_leg_jnt_grp'%(side))
        cmds.parent('%s_IK_arm_01_jnt'%(side),'%s_IK_arm_jnt_grp'%(side))
        cmds.makeIdentity('%s_IK_leg_01_jnt'%(side),'%s_IK_arm_01_jnt'%(side),apply=True,translate=True,rotate=True)
        cmds.addAttr ('%s_IK_leg_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow') 
        cmds.addAttr ('%s_IK_leg_ctrl'%(side)+'.follow', e=True, en = 'world:pelvis:')
        cmds.addAttr ('%s_IK_arm_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow') 
        cmds.addAttr ('%s_IK_arm_ctrl'%(side)+'.follow', e=True, en = 'world:shoulder:')
        cmds.ikHandle(n='%s_leg_upr_ikh'%(side), sj='%s_IK_leg_01_jnt'%(side), ee='%s_IK_leg_03_jnt'%(side),sol='ikRPsolver')
        cmds.ikHandle(n='%s_leg_lwr_ikh'%(side), sj='%s_IK_leg_03_jnt'%(side), ee='%s_IK_leg_04_jnt'%(side),sol='ikRPsolver')
        cmds.ikHandle(n='%s_arm_upr_ikh'%(side), sj='%s_IK_arm_01_jnt'%(side), ee='%s_IK_arm_03_jnt'%(side),sol='ikRPsolver')
        cmds.ikHandle(n='%s_arm_lwr_ikh'%(side), sj='%s_IK_arm_03_jnt'%(side), ee='%s_IK_arm_04_jnt'%(side),sol='ikRPsolver')
        cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_IK_arm_01_jnt'%(side),mo = True)
        cmds.poleVectorConstraint('%s_arm_PV_ctrl'%(side),'%s_arm_upr_ikh'%(side))
        cmds.poleVectorConstraint('%s_leg_PV_ctrl'%(side),'%s_leg_upr_ikh'%(side))
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter