Preview:
from maya import cmds, OpenMaya

def ui():
    if cmds.workspaceControl("Rig Tools",ex = True):
        cmds.deleteUI("Rig Tools")
    myWin = cmds.workspaceControl("Rig Tools")
    myWin = cmds.tabLayout()
    cmds.scrollLayout(': : : : : : : : : : : : : : : : : : : : : : : : Tools : : : : : : : : : : : : : : : : : : : : : : : :',hst=16,vst=16,w=340)
    cmds.columnLayout(adj = True)
    cmds.showWindow("Rig Tools")
    
    cmds.frameLayout(label='Rig Help', collapsable=True, collapse=True,w=330)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to create locator, group, joint, parent and scale constraint.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=5)
    cmds.button('1',vis=False,w=20)
    cmds.button(label='Create Locators', command=create_locator_on_selection,w=139)
    cmds.button('2',vis=False)
    cmds.button(label="Create Group", command=create_group_on_selection,w=139)
    cmds.button('3',vis=False)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button('4',vis=False)
    cmds.button("Create Joint",c = "jnt()")
    cmds.button('6',vis=False)
    cmds.button("Parent Scale Constraint",c="parentscale()")
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    #Controller tab
    cmds.frameLayout(label='Controller', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nr=4)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='Shape', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout( nc=1 )
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to create different type of controller.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=5)
    cmds.button(w=20,vis=False)
    cmds.button("cube",command=create_cube_on_selection,w = 130)
    cmds.button(w=20,vis=False)
    cmds.button("circle",command=create_circle_on_selection,w = 130)
    cmds.button(w=20,vis=False)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button("square",command=create_square_on_selection)
    cmds.button(w=20,vis=False)
    cmds.button("cross",command=create_x_on_selection)
    cmds.button(w=20,vis=False)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button("pyramid",command=create_pyramid_on_selection)
    cmds.button(w=20,vis=False)
    cmds.button("trianglecube",command=create_trianglecube_on_selection)
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #Color tab
    cmds.frameLayout(label='Color', collapsable=True, collapse=True,w=310)  
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to change color of selected controller.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.gridLayout(nr=1,nc=10,cellWidthHeight=(31,20))
    backgroundColor = [((0.348,0.057,0.064),"DarkRed()"),((0.081,0.115,0.404),"darkBlue()"),((0.100,0.031,3.658),"blue()"),((0.052,0.013,0.114),"black()"),((0.531,0.091,0.768),"purple()"),((0.288,0.145,0.088),"brown()"),((0.096,0.058,0.049),"darkBrown()"),((0.333,0.089,0.016),"darkOrange()"),((1.240,0.106,0.018),"red()"),((0.294,5.113,0.000),"lightGreen()"),((8.423,2.724,0.000),"yellow()"),((0.423,1.213,8.659),"lightBlue()"),((2.320,0.606,0.574),"pink()"),((1.094,0.572,0.285),"lightOrange()"),((0.175,0.402,0.174),"darkGreen()"),((0.443,0.469,0.104),"darkYellow()"),((0.210,0.448,0.198),"green()"),((0.350,0.109,0.219),"darkPink()"),((0.208,0.096,0.447),"darkPurple()"),((0.147,0.211,0.456),"navy()")]
    for each in backgroundColor:
        cmds.iconTextButton(bgc=each[0],c=each[1])
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    #Lock attributes tab
    cmds.frameLayout(label='Attributes Lock / Unlock', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to lock or unlock attributes of selected controller.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=5)
    cmds.button('1',vis=False,w=17)
    cmds.button("lock / unlock translate",c = "LockTranslate()",w=134)
    cmds.button('2',vis=False,w=17)
    cmds.button("lock / unlock rotate",c = "LockRotate()",w=134)
    cmds.button('3',vis=False,w=17)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button('4',vis=False,w=17)
    cmds.button("lock / unlock scale",c = "LockScale()")
    cmds.button('5',vis=False,w=17)
    cmds.button("lock / unlock visibility",c = "LockVisibility()")
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    #Mirror controller tab
    cmds.frameLayout(label='Mirror', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to mirror controller.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=7)
    cmds.button(w=10,vis=False)
    cmds.button("Left To Right",c = "MirrorFromLeft()",w=90)
    cmds.button(w=10,vis=False)
    cmds.button("Right To Left",c = "MirrorFromRight()",w=90)
    cmds.button(w=10,vis=False)
    cmds.button("Selected",c = "MirrorFromSelected()",w=90)
    cmds.button(w=10,vis=False)
    cmds.separator(h=5,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #Connect attributes tab
    cmds.frameLayout(label='Connect Attr', collapsable=True, collapse=True)  
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to connect atrribute of selected object.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=7)
    cmds.button(w=10,vis=False)
    cmds.button("Connect Translate",c = "ConnectTanslate()",w=96)
    cmds.button(w=10,vis=False)
    cmds.button("Connect Rotate",c = "ConnectRotate()",w=96)
    cmds.button(w=10,vis=False)
    cmds.button("Connect Scale",c = "ConnectScale()",w=96)
    cmds.button(w=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #follicle tab
    cmds.frameLayout(label='Create Follicle', collapsable=True, collapse=True) 
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Select a plane and locators then click "Create Follicles".',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=3)
    cmds.button(w=63,vis=False)
    cmds.button("Create Follicles",c = 'createFollicles()',w=200)
    cmds.button(w=63,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Rename', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nr=5)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    #rename tab#
    cmds.frameLayout(label='Search And Replace', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to search and replace name of selected object.',al='left')
    cmds.rowColumnLayout(nc=4)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.text(label='Search:',w=70,al='left')
    cmds.button(w=20,vis=False)
    cmds.textField('search_field',w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.text(label='Replace:',al='left')
    cmds.button(w=20,vis=False)
    cmds.textField('replace_field')
    cmds.button(vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label='Rename', command='search_replace()')
    cmds.button(vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    # Prefix UI elements
    cmds.frameLayout(label='Add Prefix', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add prefix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text(label='Prefix:',w=70,al='left')
    cmds.button(w=20,vis=False)
    cmds.textField('prefix_field',w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label='Add Prefix',c='addPrefix()')
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    # Suffix UI elements
    cmds.frameLayout(label='Add Suffix', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add suffix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text(label='Suffix:',w=70,al = 'left')
    cmds.button(w=20,vis=False)
    cmds.textField('suffix_field',w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label='Add Suffix',c='addSuffix()')
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #add suffix name#
    cmds.frameLayout(label='Add Prefix or Suffix Name', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add suffix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=7)
    cmds.button(w=10,vis=False)
    cmds.button(label='_jnt',c='addSuffixJnt()',w=88)
    cmds.button(w=10,vis=False)
    cmds.button(label='_grp',c='addSuffixGrp()',w=88)
    cmds.button(w=10,vis=False)
    cmds.button(label='_ctrl',c='addSuffixCtrl()',w=88)
    cmds.button(w=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #add number suffix name#
    cmds.frameLayout(label='Add Number Suffix Name', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add number suffix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text(label="Start number:",al='left')
    cmds.button(w=20,vis=False)
    cmds.intField('startNumField',value=1, minValue=1,w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.text(label="Increment:",al='left')
    cmds.button(w=20,vis=False)
    cmds.intField('incrementField',value=1, minValue=1)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label="Add Suffix", command='add_suffix()')
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #Auto rig tab
    cmds.frameLayout(label='Auto Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nr=4)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='Biped', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout( nc=1 )
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=3)
    cmds.text('Biped Setup:',al='left')
    cmds.button("SetupJoint",c = "setupjoint()",w = 150)
    cmds.button(w = 150,vis=0)
    cmds.separator(h=25,w=100)
    cmds.separator()
    cmds.separator()
    cmds.text('Mirror Setup:',al='left')
    cmds.button("MirrorSetupJoint",c = "mirrorSetupjoint()",w = 90)
    cmds.button(w = 150,vis=0)
    cmds.separator(h=25)
    cmds.separator()
    cmds.separator()
    cmds.text('Build Setup:',al='left')
    cmds.button("BuildSetup",c = "buildsetup()",w = 90)
    cmds.button(w = 150,vis=0)
    cmds.separator(h=25)
    cmds.separator()
    cmds.separator()
    cmds.text('Bendy Setup:',al='left')
    cmds.checkBox('bendyArm', label='BendyArm')
    cmds.button(w = 150,vis=0)
    cmds.button(w = 150,vis=0)
    cmds.checkBox('bendyLeg', label='BendyLeg')
    cmds.separator(vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Extra Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.rowColumnLayout(nr=3)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='IK Spring Rig', collapsable=True, collapse=True,w=285)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text('IK Spring Setup:',al='left')
    cmds.button(w=40,vis=False)
    cmds.button("BuildIKSpringSetupJoint",c = "BuildIKSpringSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=40,vis=False)
    cmds.button("BuildIKSpringSetupRig",c = "BuildIKSpringSetupRig()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Tail Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Tail Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildTailSetupJoint",c = "BuildTailSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildTailSetupRig",c = "BuildTailSetupRig()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Motion Path Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=3)
    cmds.text('Path Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("MotionPathSetupLocator",c = "createLocator()",w = 150)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Joints Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.intField('numbersOfLocator',min=1,value=1)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildMotionPathSetupRig",c = "createMotionPath()",w = 150)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Quadruped Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout( nc=1 )
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Quadruped Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildQuadrupedSetupJoint",c = "BuildQuadrupedSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Mirror Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("MirrorQuadrupedSetupJoint",c = "MirrorQuadrupedSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildQuadrupedRig",c = "BuildQuadrupedSetupRig()",w = 150)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Facial', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.rowColumnLayout(nr=3)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='Eyelid', collapsable=True, collapse=True,w=285)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Eye Locator Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Eye Placement",c = "create_display_eye()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eye Upper Lid Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Upper Eyelid Vertex",c = "store_vertex_ids()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eye Lower Lid Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Lower Eyelid Vertex",c = "store_lower_vertex_ids()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eyelid Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Build Eyelid",c = "create_joints_and_parent_joints()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.text('Eyelid Curve Reverse:',al='left')
    cmds.button(w=20,vis=False)
    cmds.checkBox('reversecrv', label='Reverse Curve')
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eyelid Rename:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Left Eyelid",c = "rename_left()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=20,vis=False)
    cmds.separator(h=20,vis=False)
    cmds.button("Right Eyelid",c = "rename_right()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Lip', collapsable=True, collapse=True,w=285)
    global head_joint_field
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Head Joint Name:',al='left')
    cmds.button(w=5,vis=False)
    head_joint_field = cmds.textField(placeholderText="Enter Head Joint Name")
    cmds.button(w=20,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label="Store Selected", command=store_head_joint_name)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Lip Upper Curve Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Upper Lip Edge",c = "create_upper_lip_edge()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Lip Lower Curve Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Lower Lip Edge",c = "create_lower_lip_edge()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Lip Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Build Lip Setup",c = "build_lip_setup()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Eyebrow and Cheek', collapsable=True, collapse=True,w=285)
    cmds.rowColumnLayout(nc=1)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Inner Eyebrow Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_inner_eyebrow_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Middle Eyebrow Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_middle_eyebrow_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Outer Eyebrow Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_outer_eyebrow_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Cheek Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_cheek_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Build All", command=build_all,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    
    #locator function#
def create_locator(position):
    locator = cmds.spaceLocator()[0]
    cmds.move(position[0], position[1], position[2], locator)
    return locator

def create_locator_with_values(selected_object):
    position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
    rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
    locator_name = '{}_loc'.format(selected_object)
    locator = create_locator(position)
    cmds.rotate(rotation[0], rotation[1], rotation[2], locator)
    cmds.rename(locator, locator_name)
    return locator

def create_locator_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_locator_with_values(selected_object)
    else:
        create_locator([0, 0, 0])

    #group function#
def create_group_with_values(selected_object=None):
    group_name = selected_object + "_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    cmds.group(empty=True, name=group_name)
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_group_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_values(selected_object)
    else:
        cmds.group(em=True)

    #joint function#
def jnt():
    selected = cmds.ls(sl = True)
    if selected:
        for each in selected:
            cmds.select(each)
            newJoint = cmds.joint(n=each+'_jnt')
            cmds.parent(newJoint,w = True)
    else:
        cmds.joint()
        
    #parentscale function#    
def parentscale():
    lst = cmds.ls(sl = True)
    cmds.parentConstraint(lst,mo = True)
    cmds.scaleConstraint(lst,mo = True)

    #cube function#
def create_group_with_cube_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    cube = cmds.curve(d=1, p=[(-0.5, -0.5, 0.5),(-0.5, 0.5, 0.5),(0.5, 0.5, 0.5),(0.5, -0.5, 0.5),(0.5, -0.5, -0.5),(0.5, 0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, -0.5, 0.5),(0.5, -0.5, 0.5),(0.5, 0.5, 0.5),(0.5, 0.5, -0.5),(0.5, -0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, 0.5, 0.5)])
    cmds.parent(cube,group)
    cmds.rename(cube,selected_object + '_ctrl')
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_cube_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_cube_values(selected_object)
    else:
        cmds.curve(d=1, p=[(-0.5, -0.5, 0.5),(-0.5, 0.5, 0.5),(0.5, 0.5, 0.5),(0.5, -0.5, 0.5),(0.5, -0.5, -0.5),(0.5, 0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, -0.5, 0.5),(0.5, -0.5, 0.5),(0.5, 0.5, 0.5),(0.5, 0.5, -0.5),(0.5, -0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, 0.5, 0.5)])
        cmds.group()
        
    #circle function#
def create_group_with_circle_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    curvecircle = cmds.circle()[0]
    cmds.delete(curvecircle,constructionHistory = True)
    cmds.parent(curvecircle,group)
    cmds.rename(curvecircle,selected_object + '_ctrl')
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_circle_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_circle_values(selected_object)
    else:
        ctrl = cmds.circle()
        cmds.group()
        cmds.delete(ctrl,constructionHistory = True)
        
    #square function#
def create_group_with_square_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    square = cmds.curve(d=1, p=[(0.5, 0, 0.5),(-0.5, 0, 0.5),(-0.5, 0, -0.5),(0.5, 0, -0.5),(0.5, 0, 0.5)])
    cmds.parent(square,group)
    cmds.rename(square,selected_object + '_ctrl')
    
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_square_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_square_values(selected_object)
    else:
        cmds.curve(d=1, p=[(0.5, 0, 0.5),(-0.5, 0, 0.5),(-0.5, 0, -0.5),(0.5, 0, -0.5),(0.5, 0, 0.5)])
        cmds.group()
        
    #X function#
def create_group_with_x_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    x = 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.parent(x,group)
    cmds.rename(x,selected_object + '_ctrl')
    
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_x_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_x_values(selected_object)
    else:
        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.group()
        
    #pyramid function#
def create_group_with_pyramid_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    pyramid = cmds.curve(d=1, p=[(1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, -1), (1, -0.75, -1), (0, 0.5, 0), (1, -0.75, -1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (-1, -0.75, -1)])
    cmds.parent(pyramid,group)
    cmds.rename(pyramid,selected_object + '_ctrl')
    
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_pyramid_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_pyramid_values(selected_object)
    else:
        cmds.curve(d=1, p=[(1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, -1), (1, -0.75, -1), (0, 0.5, 0), (1, -0.75, -1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (-1, -0.75, -1)])
        cmds.group()

    #trianglecube function#
def create_group_with_trianglecube_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    trianglecube = cmds.curve(d = 1, p = [(0, 0.5, 0), (0, 0, 0.5), (0, -0.5, 0), (0, 0, -0.5), (0, 0.5, 0), (0.5, 0, 0), (0, -0.5, 0), (-0.5, 0, 0), (0, 0, 0.5), (0.5, 0, 0), (0, 0, -0.5), (-0.5, 0, 0), (0, 0.5, 0)])
    cmds.parent(trianglecube,group)
    cmds.rename(trianglecube,selected_object + '_ctrl')
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_trianglecube_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_trianglecube_values(selected_object)
    else:
        cmds.curve(d = 1, p = [(0, 0.5, 0), (0, 0, 0.5), (0, -0.5, 0), (0, 0, -0.5), (0, 0.5, 0), (0.5, 0, 0), (0, -0.5, 0), (-0.5, 0, 0), (0, 0, 0.5), (0.5, 0, 0), (0, 0, -0.5), (-0.5, 0, 0), (0, 0.5, 0)])
        cmds.group()
        
#dark red function#
def DarkRed():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,4)
		
#dark blue function#
def darkBlue():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,5)
    
#blue function#
def blue():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,6)
		
#black function#
def black():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,8)
		
#pink function#
def purple():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,9)
		
#brown function#
def brown():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,10)
		
#dark brown function#
def darkBrown():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,11)
		
#dark orange function#
def darkOrange():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,12)
		
#red function#
def red():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,13)
		
#light green function#
def lightGreen():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,14)
		
#yellow function#
def yellow():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,17)

#lightblue function#
def lightBlue():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,18)
		
#pink function#
def pink():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,20)
		
#light orange function#
def lightOrange():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,21)
		
#dark green function#
def darkGreen():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,7)
		
#dark yellow function#
def darkYellow():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,25)
		
#green function#
def green():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,26)
		
#dark pink function#
def darkPink():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,31)
		
#dark purple function#
def darkPurple():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,30)

#navy function#
def navy():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,29)

	#lock translate function#
def LockTranslate():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.translateX',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.translateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.translateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.translateZ',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.translateX',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.translateY',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.translateZ',keyable = True, cb = False, lock = False)

	#lock rotate function#
def LockRotate():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.rotateX',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.rotateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.rotateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.rotateZ',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.rotateX',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.rotateY',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.rotateZ',keyable = True, cb = False, lock = False)

	#lock scale function#
def LockScale():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.scaleX',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.scaleZ',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.scaleX',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.scaleY',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.scaleZ',keyable = True, cb = False, lock = False)


	#lock visibility function#
def LockVisibility():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.visibility',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.visibility',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.visibility',keyable = True, cb = False, lock = False)
    	
    #connect tanslation function#
def ConnectTanslate():
    selection = cmds.ls(selection=True)
    if len(selection) != 2:
        cmds.warning("Please select exactly two objects.")
    else:
        source_obj = selection[0]
        destination_obj = selection[1]
        
    attrs = ["translateX", "translateY", "translateZ"]
    
    for attr in attrs:
        cmds.connectAttr(source_obj + "." + attr, destination_obj + "." + attr)
        
    #connect roration function#
def ConnectRotate():
    selection = cmds.ls(selection=True)
    if len(selection) != 2:
        cmds.warning("Please select exactly two objects.")
    else:
        source_obj = selection[0]
        destination_obj = selection[1]
        
    attrs = ["rotateX", "rotateY", "rotateZ"]
    
    for attr in attrs:
        cmds.connectAttr(source_obj + "." + attr, destination_obj + "." + attr)
        
    #connect scaling function#
def ConnectScale():
    selection = cmds.ls(selection=True)
    if len(selection) != 2:
        cmds.warning("Please select exactly two objects.")
    else:
        source_obj = selection[0]
        destination_obj = selection[1]
        
    attrs = ["scaleX", "scaleY", "scaleZ"]
    
    for attr in attrs:
        cmds.connectAttr(source_obj + "." + attr, destination_obj + "." + attr)
        
    # Mirror controllers function
def MirrorFromLeft():
    # Define your left and right prefixes
    left_prefix = "l_"
    right_prefix = "r_"

    # Get a list of NURBS curves with the left prefix
    left_curves = cmds.ls(left_prefix + "*", type="nurbsCurve")

    # Specify the names of the curves to skip
    curves_to_skip = ["r_elbow_direction_crvShape", "l_elbow_direction_crvShape","r_knee_direction_crvShape","l_knee_direction_crvShape","r_lwr_bendy_arm_crvShape","l_lwr_bendy_arm_crvShape","r_lwr_bendy_leg_crvShape","l_lwr_bendy_leg_crvShape","r_upr_bendy_arm_crvShape","l_upr_bendy_arm_crvShape","r_upr_bendy_leg_crvShape","l_upr_bendy_leg_crvShape"]

    # Iterate through the left curves
    for left_curve in left_curves:
        # Check if the curve is in the list of curves to skip
        if left_curve in curves_to_skip:
            print(f"Skipping {left_curve}.")
            continue

        # Construct the corresponding right curve name
        right_curve = left_curve.replace(left_prefix, right_prefix)

        # Check if the right curve exists
        if cmds.objExists(right_curve):
            # Retrieve the CVs from the left curve
            left_cvs = cmds.getAttr(f"{left_curve}.cv[*]")

            # Get the number of CVs
            num_cvs = len(left_cvs)

            # Apply the copied CVs to the right curve
            for i in range(num_cvs):
                target_cv_attr = "{0}.cv[{1}]".format(right_curve, i)
                cmds.setAttr(target_cv_attr, *left_cvs[i], type="double3")

            print("CVs copied from '{0}' to '{1}'.".format(left_curve, right_curve))
        else:
            cmds.warning("Corresponding right curve '{0}' not found for '{1}'. Skipping.".format(right_curve, left_curve))

    print("CV copy completed.")
    
def MirrorFromRight():
    # Define your left and right prefixes
    left_prefix = "l_"
    right_prefix = "r_"

    # Get a list of NURBS curves with the left prefix
    right_curves = cmds.ls(right_prefix + "*", type="nurbsCurve")

    # Specify the names of the curves to skip
    curves_to_skip = ["r_elbow_direction_crvShape", "l_elbow_direction_crvShape","r_knee_direction_crvShape","l_knee_direction_crvShape","r_lwr_bendy_arm_crvShape","l_lwr_bendy_arm_crvShape","r_lwr_bendy_leg_crvShape","l_lwr_bendy_leg_crvShape","r_upr_bendy_arm_crvShape","l_upr_bendy_arm_crvShape","r_upr_bendy_leg_crvShape","l_upr_bendy_leg_crvShape"]

    # Iterate through the left curves
    for right_curve in right_curves:
        # Check if the curve is in the list of curves to skip
        if right_curve in curves_to_skip:
            print(f"Skipping {right_curve}.")
            continue

        # Construct the corresponding right curve name
        left_curve = right_curve.replace(right_prefix, left_prefix)

        # Check if the right curve exists
        if cmds.objExists(left_curve):
            # Retrieve the CVs from the left curve
            right_cvs = cmds.getAttr(f"{right_curve}.cv[*]")

            # Get the number of CVs
            num_cvs = len(right_cvs)

            # Apply the copied CVs to the right curve
            for i in range(num_cvs):
                target_cv_attr = "{0}.cv[{1}]".format(left_curve, i)
                cmds.setAttr(target_cv_attr, *right_cvs[i], type="double3")

            print("CVs copied from '{0}' to '{1}'.".format(right_curve, left_curve))
        else:
            cmds.warning("Corresponding left curve '{0}' not found for '{1}'. Skipping.".format(left_curve, right_curve))

    print("CV copy completed.")
def MirrorFromSelected():
    # Get the selected control shapes (NURBS curves)
    selected_objects = cmds.ls(selection=True)

    # Ensure there are exactly two selected control shapes
    if len(selected_objects) != 2:
        cmds.warning("Please select exactly two NURBS curves to copy from and copy to.")
    else:
        # Sort the selected objects
        selected_objects.sort()

        # Extract CVs from the first selected control shape
        source_cvs = cmds.getAttr(f"{selected_objects[0]}.cp[*]")

        # Extract the number of CVs in the source curve
        num_cvs = len(source_cvs)

        # Apply the copied CVs to the second selected control shape
        for i in range(num_cvs):
            target_cv_attr = "{0}.cp[{1}]".format(selected_objects[1], i)
            cmds.setAttr(target_cv_attr, *source_cvs[i])

        print("CVs copied from '{0}' to '{1}'.".format(selected_objects[0], selected_objects[1]))
 
    #create follicles function#    
def createFollicles(*args):
    sel = cmds.ls(selection=True)
    if len(sel) < 2:
        cmds.warning('Please select a plane and at least one locator.')
        return
    plane = sel[0]
    locators = sel[1:]

    minX, minY, minZ, maxX, maxY, maxZ = cmds.xform(plane, q=True, ws=True, bb=True)
    width = maxX - minX
    height = maxZ - minZ
    
    for loc in locators:
        posX, posY, posZ = cmds.xform(loc, q=True, ws=True, translation=True)
        
        u = (posX - minX) / width
        v = (posZ - minZ) / height
        follicleX = u * width + minX
        follicleY = maxY
        follicleZ = v * height + minZ
        
        follicle = cmds.createNode('follicle')
        cmds.connectAttr('%s.outMesh' % plane, '%s.inputMesh' % follicle)
        cmds.connectAttr('%s.worldMatrix[0]' % plane, '%s.inputWorldMatrix' % follicle)
        cmds.setAttr('%s.parameterU' % follicle, u)
        cmds.setAttr('%s.parameterV' % follicle, v)
        
        cmds.move(follicleX, follicleY, follicleZ, follicle)
        cmds.setAttr('%s.visibility' % follicle, 0)
        
        follicleTransform = cmds.listRelatives(follicle, parent=True)[0]
        cmds.connectAttr('%s.outTranslate' % follicle, '%s.translate' % follicleTransform)
        cmds.connectAttr('%s.outRotate' % follicle, '%s.rotate' % follicleTransform)
        
    #rename function#
def search_replace():
    selection = cmds.ls(selection=True)

    search_text = cmds.textField('search_field', query=True, text=True)
    replace_text = cmds.textField('replace_field', query=True, text=True)

    for node in selection:
        new_name = node.replace(search_text, replace_text)
        cmds.rename(node, new_name)
    
    cmds.textField('search_field',edit=True,text = '')
    cmds.textField('replace_field',edit=True,text = '')
    #prefix and suffix functions#
def addPrefix():
    selection = cmds.ls(selection=True)
    prefix = cmds.textField('prefix_field', query=True, text=True)
    for node in selection:
        new_name = prefix + node
        cmds.rename(node, new_name)
    cmds.textField('prefix_field',edit=True,text = '')
    
def addSuffix():
    selection = cmds.ls(selection=True)
    suffix = cmds.textField('suffix_field', query=True, text=True)
    for node in selection:
        new_name = node + suffix
        cmds.rename(node, new_name)
    cmds.textField('suffix_field',edit=True,text = '')

def addSuffixJnt():
    selection = cmds.ls(selection=True)
    for node in selection:
        new_name = node + '_jnt'
        cmds.rename(node, new_name)
        
def addSuffixGrp():
    selection = cmds.ls(selection=True)
    for node in selection:
        new_name = node + '_grp'
        cmds.rename(node, new_name)
        
def addSuffixCtrl():
    selection = cmds.ls(selection=True)
    for node in selection:
        new_name = node + '_ctrl'
        cmds.rename(node, new_name)
        
    #add number suffix function#   
def add_suffix():
    start_num = cmds.intField('startNumField', query=True, value=True)
    increment = cmds.intField('incrementField', query=True, value=True)
    
    selected_objects = cmds.ls(selection=True)
    for i, obj in enumerate(selected_objects):
        new_suffix = "_{:02d}".format(start_num + i*increment)
        new_name = obj + new_suffix
        cmds.rename(obj, new_name)
        
    #build IK spring setup joint#
def BuildIKSpringSetupJoint():
    nameOfIKSpringSetupJnt = [('ikSpring_01_setup_jnt',(0,0,0)),('ikSpring_02_setup_jnt',(5,0,0)),('ikSpring_03_setup_jnt',(10,0,0)),('ikSpring_04_setup_jnt',(15,0,0)),('ikSpring_05_setup_jnt',(20,0,0))]
    for each in nameOfIKSpringSetupJnt:
        cmds.joint(n=each[0],p=each[1])
    
    cmds.setAttr('ikSpring_01_setup_jnt.rotateY',30)
    cmds.setAttr('ikSpring_02_setup_jnt.rotateY',-60)
    cmds.setAttr('ikSpring_03_setup_jnt.rotateY',60)
    cmds.setAttr('ikSpring_04_setup_jnt.rotateY',-60)
    
    #build IK spring setup rig#        
def BuildIKSpringSetupRig():
    def ControllerAttr(controllerName,visKeyableOrnot,scaleXKeyableOrnot,scaleYKeyableOrnot,scaleZKeyableOrnot,rotateXKeyableOrnot,rotateYKeyableOrnot,rotateZKeyableOrnot,visLockOrnot,scaleXLockOrnot,scaleYLockOrnot,scaleZLockOrnot,rotateXLockOrnot,rotateYLockOrnot,rotateZLockOrnot,colorEnableOrnot,colorNumber,translateXKeyableOrnot,translateYKeyableOrnot,translateZKeyableOrnot,translateXLockOrnot,translateYLockOrnot,translateZLockOrnot):
        cmds.setAttr ((controllerName) +'.visibility',keyable = visKeyableOrnot, cb = False, lock = visLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleX',keyable = scaleXKeyableOrnot, cb = False, lock = scaleXLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleY',keyable = scaleYKeyableOrnot, cb = False, lock = scaleYLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleZ',keyable = scaleZKeyableOrnot, cb = False, lock = scaleZLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateX',keyable = rotateXKeyableOrnot, cb = False, lock = rotateXLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateY',keyable = rotateYKeyableOrnot, cb = False, lock = rotateYLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateZ',keyable = rotateZKeyableOrnot, cb = False, lock = rotateZLockOrnot)
        cmds.setAttr ((controllerName) +'.translateX',keyable = translateXKeyableOrnot, cb = False, lock = translateXLockOrnot)
        cmds.setAttr ((controllerName) +'.translateY',keyable = translateYKeyableOrnot, cb = False, lock = translateYLockOrnot)
        cmds.setAttr ((controllerName) +'.translateZ',keyable = translateZKeyableOrnot, cb = False, lock = translateZLockOrnot)
        cmds.setAttr ((controllerName) + '.overrideEnabled' ,colorEnableOrnot) 
        cmds.setAttr ((controllerName) + '.overrideColor' ,colorNumber)
        
    nameOfIKSpringSetupRigUprJnt = [('ik_upr_01_jnt'),('ik_upr_02_jnt'),('ik_upr_03_jnt')]
    for each in nameOfIKSpringSetupRigUprJnt:
        cmds.joint(n=each)
        
        
    toGetPosUprJnt = [('ikSpring_01_setup_jnt','ik_upr_01_jnt'),('ikSpring_02_setup_jnt','ik_upr_02_jnt'),('ikSpring_03_setup_jnt','ik_upr_03_jnt')]
    for each in toGetPosUprJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
    orientConForDel = cmds.orientConstraint('ikSpring_02_setup_jnt','ik_upr_03_jnt',mo=False)
    cmds.delete(orientConForDel)
    cmds.makeIdentity( 'ik_upr_01_jnt', apply=True, translate=True, rotate=True )
    
    nameOfIKSpringSetupRigLwrJnt = [('ik_lwr_01_jnt'),('ik_lwr_02_jnt'),('ik_lwr_03_jnt')]
    for each in nameOfIKSpringSetupRigLwrJnt:
        cmds.joint(n=each)
        cmds.parent(w=True)
    
    toGetPosLwrJnt = [('ikSpring_03_setup_jnt','ik_lwr_01_jnt'),('ikSpring_04_setup_jnt','ik_lwr_02_jnt'),('ikSpring_05_setup_jnt','ik_lwr_03_jnt')]
    for each in toGetPosLwrJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
        
    nameOfFKSetupJnt = [('fk_01_jnt'),('fk_02_jnt'),('fk_03_jnt'),('fk_04_jnt'),('fk_05_jnt')]
    for each in nameOfFKSetupJnt:
        cmds.joint(n=each)
        cmds.parent(w=True)
    
    toGetPosFKJnt = [('ikSpring_01_setup_jnt','fk_01_jnt'),('ikSpring_02_setup_jnt','fk_02_jnt'),('ikSpring_03_setup_jnt','fk_03_jnt'),('ikSpring_04_setup_jnt','fk_04_jnt'),('ikSpring_05_setup_jnt','fk_05_jnt')]
    for each in toGetPosFKJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
        
    nameOfIKSpringSetupRigJnt = [('ikSpring_01_jnt'),('ikSpring_02_jnt'),('ikSpring_03_jnt'),('ikSpring_04_jnt'),('ikSpring_05_jnt')]
    for each in nameOfIKSpringSetupRigJnt:
        cmds.joint(n=each)
        cmds.parent(w=True)
        
    toGetPosIKSpringJnt = [('ikSpring_01_setup_jnt','ikSpring_01_jnt'),('ikSpring_02_setup_jnt','ikSpring_02_jnt'),('ikSpring_03_setup_jnt','ikSpring_03_jnt'),('ikSpring_04_setup_jnt','ikSpring_04_jnt'),('ikSpring_05_setup_jnt','ikSpring_05_jnt')]
    for each in toGetPosIKSpringJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
    
    toParent = [('fk_05_jnt','fk_04_jnt'),('fk_04_jnt','fk_03_jnt'),('fk_03_jnt','fk_02_jnt'),('fk_02_jnt','fk_01_jnt'),('ik_lwr_03_jnt','ik_lwr_02_jnt'),('ik_lwr_02_jnt','ik_lwr_01_jnt'),('ikSpring_05_jnt','ikSpring_04_jnt'),('ikSpring_04_jnt','ikSpring_03_jnt'),('ikSpring_03_jnt','ikSpring_02_jnt'),('ikSpring_02_jnt','ikSpring_01_jnt')]
    for each in toParent:
        cmds.parent(each[0],each[1])
        cmds.makeIdentity( 'ik_lwr_01_jnt','fk_01_jnt','ikSpring_01_jnt', apply=True, translate=True, rotate=True )
    #ik Rig#
    cmds.ikHandle(n='upr_ikh', sj='ik_upr_01_jnt', ee='ik_upr_03_jnt')
    cmds.ikHandle(n='lwr_ikh', sj='ik_lwr_01_jnt', ee='ik_lwr_03_jnt')
    cmds.ikHandle(n='spring_ikh', sj='ikSpring_01_jnt', ee='ikSpring_05_jnt',sol='ikSpringSolver')
    cmds.curve(d=1, p=[(-1, -1, 1),(-1, 1, 1),(1, 1, 1),(1, -1, 1),(1, -1, -1),(1, 1, -1),(-1, 1, -1),(-1, -1, -1),(-1, -1, 1),(1, -1, 1),(1, 1, 1),(1, 1, -1),(1, -1, -1),(-1, -1, -1),(-1, 1, -1),(-1, 1, 1)])
    cmds.rename('ik_mid_ctrl')
    ControllerAttr('ik_mid_ctrl',False,False,False,False,False,False,False,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    cmds.group()
    cmds.rename('ik_mid_ctrl_grp')
    parentCon = cmds.parentConstraint('ik_upr_03_jnt','ik_mid_ctrl_grp',mo = False)
    cmds.delete(parentCon)
    cmds.curve(d=1, p=[(-1, -1, 1),(-1, 1, 1),(1, 1, 1),(1, -1, 1),(1, -1, -1),(1, 1, -1),(-1, 1, -1),(-1, -1, -1),(-1, -1, 1),(1, -1, 1),(1, 1, 1),(1, 1, -1),(1, -1, -1),(-1, -1, -1),(-1, 1, -1),(-1, 1, 1)])
    cmds.rename('ik_inr_ctrl')
    ControllerAttr('ik_inr_ctrl',False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    cmds.group()
    cmds.rename('ik_inr_ctrl_grp')
    parentCon = cmds.parentConstraint('ik_lwr_03_jnt','ik_inr_ctrl_grp',mo = False)
    cmds.delete(parentCon)
    cmds.curve(d=1, p=[(-2, -2, 2),(-2, 2, 2),(2, 2, 2),(2, -2, 2),(2, -2, -2),(2, 2, -2),(-2, 2, -2),(-2, -2, -2),(-2, -2, 2),(2, -2, 2),(2, 2, 2),(2, 2, -2),(2, -2, -2),(-2, -2, -2),(-2, 2, -2),(-2, 2, 2)])
    cmds.rename('ik_ctrl')
    ControllerAttr('ik_ctrl',False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    cmds.group()
    cmds.rename('ik_ctrl_grp')
    parentCon = cmds.parentConstraint('ik_lwr_03_jnt','ik_ctrl_grp',mo = False)
    cmds.delete(parentCon)
    cmds.pointConstraint('ik_ctrl','spring_ikh',mo = True)
    cmds.parentConstraint('ikSpring_05_jnt','ik_inr_ctrl_grp',mo = True)
    cmds.parentConstraint('ikSpring_03_jnt','ik_mid_ctrl_grp',mo = True)
    cmds.pointConstraint('ik_mid_ctrl','upr_ikh',mo = True)
    cmds.pointConstraint('ik_inr_ctrl','lwr_ikh',mo = True)
    cmds.pointConstraint('ik_mid_ctrl','ik_lwr_01_jnt',mo = True)
    cmds.orientConstraint('ik_inr_ctrl','ik_lwr_03_jnt',mo = True)
    
    #fk Rig#
    nameOfFKctrl = [('fk_01_ctrl','fk_01_ctrl_grp'),('fk_02_ctrl','fk_02_ctrl_grp'),('fk_03_ctrl','fk_03_ctrl_grp'),('fk_04_ctrl','fk_04_ctrl_grp'),('fk_05_ctrl','fk_05_ctrl_grp')]
    for each in nameOfFKctrl:
        FKctrl = cmds.circle(n=each[0],r=1,nrx = 90)
        cmds.group(n=each[1])
        ControllerAttr(each[0],False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    
    toGetPosOfFKctrl = [('ikSpring_01_setup_jnt','fk_01_ctrl_grp'),('ikSpring_02_setup_jnt','fk_02_ctrl_grp'),('ikSpring_03_setup_jnt','fk_03_ctrl_grp'),('ikSpring_04_setup_jnt','fk_04_ctrl_grp'),('ikSpring_05_setup_jnt','fk_05_ctrl_grp')]
    for each in toGetPosOfFKctrl:
        parentCon = cmds.parentConstraint(each[0],each[1],mo = False)
        cmds.delete(parentCon)
        
    toGetParent = [('fk_05_ctrl_grp','fk_04_ctrl'),('fk_04_ctrl_grp','fk_03_ctrl'),('fk_03_ctrl_grp','fk_02_ctrl'),('fk_02_ctrl_grp','fk_01_ctrl')]
    for each in toGetParent:
        cmds.parent(each[0],each[1])
        
    parentCon = [('fk_01_ctrl','fk_01_jnt'),('fk_02_ctrl','fk_02_jnt'),('fk_03_ctrl','fk_03_jnt'),('fk_04_ctrl','fk_04_jnt'),('fk_05_ctrl','fk_05_jnt')]
    for each in parentCon:
        cmds.parentConstraint(each[0],each[1],mo = True)
        
    #IKFK Setup Rig#
    nameOfIKFKSetupJnt = [('bln_01_jnt'),('bln_02_jnt'),('bln_03_jnt'),('bln_04_jnt'),('bln_05_jnt')]
    for each in nameOfIKFKSetupJnt:
        cmds.joint(n=each)
        cmds.parent(w = True)
        
    toGetPosOfIKFKjnt = [('ikSpring_01_setup_jnt','bln_01_jnt'),('ikSpring_02_setup_jnt','bln_02_jnt'),('ikSpring_03_setup_jnt','bln_03_jnt'),('ikSpring_04_setup_jnt','bln_04_jnt'),('ikSpring_05_setup_jnt','bln_05_jnt')]
    for each in toGetPosOfIKFKjnt:
        parentCon = cmds.parentConstraint(each[0],each[1])
        cmds.delete(parentCon)
        
    toGetParent = [('bln_05_jnt','bln_04_jnt'),('bln_04_jnt','bln_03_jnt'),('bln_03_jnt','bln_02_jnt'),('bln_02_jnt','bln_01_jnt')]
    for each in toGetParent:
        cmds.parent(each[0],each[1])
        cmds.makeIdentity( 'bln_01_jnt', apply=True, translate=True, rotate=True )
        
    parentConIKFKjnt = [('ik_upr_01_jnt','bln_01_jnt'),('ik_upr_02_jnt','bln_02_jnt'),('ik_lwr_01_jnt','bln_03_jnt'),('ik_lwr_02_jnt','bln_04_jnt'),('ik_lwr_03_jnt','bln_05_jnt'),('fk_01_jnt','bln_01_jnt'),('fk_02_jnt','bln_02_jnt'),('fk_03_jnt','bln_03_jnt'),('fk_04_jnt','bln_04_jnt'),('fk_05_jnt','bln_05_jnt')]
    for each in parentConIKFKjnt:
        cmds.parentConstraint(each[0],each[1],mo = True)
    
    cmds.curve(d=1, p=[(0.5, 0, 2.25),(-0.5, 0, 2.25),(-0.5, 0, 0.5),(-2.25, 0, 0.5),(-2.25, 0, -0.5),(-0.5, 0, -0.5),(-0.5, 0, -2.25),(0.5, 0 ,-2.25),(0.5, 0, -0.5),(2.25, 0, -0.5),(2.25, 0, 0.5,),(0.5, 0 ,0.5),(0.5, 0, 2.25)])
    cmds.rename('ik_fk_switch')
    ControllerAttr('ik_fk_switch',False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,15,False,False,False,True,True,True)
    cmds.group()
    cmds.rename('ik_fk_switch_grp')
    cmds.addAttr('ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
    cmds.parentConstraint('bln_05_jnt', 'ik_fk_switch_grp')
    cmds.shadingNode('reverse',n = 'ik_fk_rev',asUtility=1)
    
    toConect = [('ik_fk_switch.IKFK','bln_01_jnt_parentConstraint1.fk_01_jntW1'),('ik_fk_switch.IKFK','bln_02_jnt_parentConstraint1.fk_02_jntW1'),('ik_fk_switch.IKFK', 'bln_03_jnt_parentConstraint1.fk_03_jntW1'),('ik_fk_switch.IKFK', 'bln_04_jnt_parentConstraint1.fk_04_jntW1'),('ik_fk_switch.IKFK', 'bln_05_jnt_parentConstraint1.fk_05_jntW1'),('ik_fk_rev.outputX', 'bln_01_jnt_parentConstraint1.ik_upr_01_jntW0'),('ik_fk_rev.outputX', 'bln_02_jnt_parentConstraint1.ik_upr_02_jntW0'),('ik_fk_switch.IKFK', 'ik_fk_rev.inputX'),('ik_fk_rev.outputX', 'bln_03_jnt_parentConstraint1.ik_lwr_01_jntW0'),('ik_fk_rev.outputX', 'bln_04_jnt_parentConstraint1.ik_lwr_02_jntW0'),('ik_fk_rev.outputX', 'bln_05_jnt_parentConstraint1.ik_lwr_03_jntW0'),('ik_fk_switch.IKFK','fk_01_ctrl_grp.visibility'),('ik_fk_rev.outputX','ik_mid_ctrl_grp.visibility'),('ik_fk_rev.outputX','ik_inr_ctrl_grp.visibility'),('ik_fk_rev.outputX','ik_ctrl_grp.visibility')]
    for each in toConect:
        cmds.connectAttr(each[0],each[1])
        
    toHide = [('ikSpring_01_setup_jnt.visibility'),('ik_lwr_01_jnt.visibility'),('fk_01_jnt.visibility'),('ikSpring_01_jnt.visibility'),('ik_upr_01_jnt.visibility'),('upr_ikh.visibility'),('lwr_ikh.visibility'),('spring_ikh.visibility')]
    for each in toHide:
        cmds.setAttr(each,0)
        
    createGroup = ('rig_grp','jnt_grp','rename')
    for each in createGroup:
        cmds.group(w=1,n=each,em=1)
        
    toGroup = [('ikSpring_01_setup_jnt','rig_grp'),('ik_lwr_01_jnt','rig_grp'),('fk_01_jnt','rig_grp'),('ikSpring_01_jnt','rig_grp'),('upr_ikh','rig_grp'),('lwr_ikh','rig_grp'),('spring_ikh','rig_grp'),('fk_01_ctrl_grp','rig_grp'),('ik_mid_ctrl_grp','rig_grp'),('ik_inr_ctrl_grp','rig_grp'),('ik_ctrl_grp','rig_grp'),('ik_fk_switch_grp','rig_grp'),('bln_01_jnt','jnt_grp'),('jnt_grp','rename'),('rig_grp','rename')]
    for each in toGroup:
        cmds.parent(each[0],each[1])

#create tail setup joint function#
def BuildTailSetupJoint():
    list = [('tail_01_setup_jnt',(0, 0, 0)),('tail_02_setup_jnt',(10, 0, 0)),('tail_03_setup_jnt',(20, 0, 0)),('tail_04_setup_jnt',(30, 0, 0)),('tail_05_setup_jnt',(40, 0, 0))]
    for each in list:
        cmds.joint(n=each[0],p=each[1])
        
#create tail setup rig function#
def BuildTailSetupRig():
    #create FK tail setup
    list = ['tail_01_FK_jnt','tail_02_FK_jnt','tail_03_FK_jnt','tail_04_FK_jnt','tail_05_FK_jnt']
    for each in list:
        cmds.joint(n=each)
    
    list = [('tail_01_FK_ctrl','tail_01_FK_ctrl_grp'),('tail_02_FK_ctrl','tail_02_FK_ctrl_grp'),('tail_03_FK_ctrl','tail_03_FK_ctrl_grp'),('tail_04_FK_ctrl','tail_04_FK_ctrl_grp'),('tail_05_FK_ctrl','tail_05_FK_ctrl_grp')]
    for each in list:
        ctrl = cmds.circle(n=each[0],r=5,nrx = 90)
        cmds.delete(ctrl,constructionHistory = True)
        cmds.group(n=each[1])
    
    cmds.parent('tail_01_FK_jnt',w=True)
    
    list = [('tail_01_setup_jnt','tail_01_FK_ctrl_grp'),('tail_02_setup_jnt','tail_02_FK_ctrl_grp'),('tail_03_setup_jnt','tail_03_FK_ctrl_grp'),('tail_04_setup_jnt','tail_04_FK_ctrl_grp'),('tail_05_setup_jnt','tail_05_FK_ctrl_grp'),('tail_01_setup_jnt','tail_01_FK_jnt'),('tail_02_setup_jnt','tail_02_FK_jnt'),('tail_03_setup_jnt','tail_03_FK_jnt'),('tail_04_setup_jnt','tail_04_FK_jnt'),('tail_05_setup_jnt','tail_05_FK_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
    
    list = [('tail_05_FK_ctrl_grp','tail_04_FK_ctrl'),('tail_04_FK_ctrl_grp','tail_03_FK_ctrl'),('tail_03_FK_ctrl_grp','tail_02_FK_ctrl'),('tail_02_FK_ctrl_grp','tail_01_FK_ctrl')]
    for each in list:
        cmds.parent(each[0],each[1])
        
    list = [('tail_01_FK_ctrl','tail_01_FK_jnt'),('tail_02_FK_ctrl','tail_02_FK_jnt'),('tail_03_FK_ctrl','tail_03_FK_jnt'),('tail_04_FK_ctrl','tail_04_FK_jnt'),('tail_05_FK_ctrl','tail_05_FK_jnt')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo=True)
    
    #create IK tail
    list = ['tail_01_IK_jnt','tail_02_IK_jnt','tail_03_IK_jnt','tail_04_IK_jnt','tail_05_IK_jnt','tail_01_length_jnt','tail_02_length_jnt','tail_03_length_jnt','tail_04_length_jnt','tail_05_length_jnt','tail_start_length_jnt','tail_end_length_jnt']
    for each in list:
        cmds.joint(n=each)
        
    list = [('tail_01_IK_ctrl','tail_01_IK_ctrl_grp'),('tail_02_IK_ctrl','tail_02_IK_ctrl_grp'),('tail_03_IK_ctrl','tail_03_IK_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])
        
    cmds.parent('tail_01_IK_jnt','tail_start_length_jnt','tail_01_length_jnt',w=True)
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