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)