Advertisement
sacredgeometry

Rig-a-majigger

Jan 16th, 2012
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 27.53 KB | None | 0 0
  1. #--------------------------------------------------------------------------------------
  2. # Rigger Tools CLASS BASED 0.03a
  3. # Brian Williams / lostrecordsuk@gmail.com / 2011
  4. #--------------------------------------------------------------------------------------
  5. #--------------------------------------------------------------------------------------
  6. # Importing
  7. #--------------------------------------------------------------------------------------
  8.  
  9. from pymel.core import *
  10. import maya.cmds as mc
  11.  
  12. #--------------------------------------------------------------------------------------
  13. # TO-DO: Master
  14. #--------------------------------------------------------------------------------------
  15. '''  
  16. -CUSTOM ATTRS: On shape node so you can share them with other nodes (ie FK/IK blend attr)
  17.  
  18. #--------------------------------------------------------------------------------------
  19. # Ideas
  20. #--------------------------------------------------------------------------------------
  21.  
  22. -Console GUI which shows mouseover information for buttons and printouts on errors etc
  23.     I tried this and it works but it isnt great I will think of a better way to do it another time.
  24.  
  25. '''
  26. #--------------------------------------------------------------------------------------
  27.  
  28. class RiggerTool():
  29.    
  30.     def __new__(self):
  31.         pass
  32.        
  33.         '''
  34.         if window(self.mainWin, exists=True):
  35.             deleteUI(self.mainWin)
  36.             window(title='Rig Tool', widthHeight=(defaultWidth+3,600), mxb=False)  
  37.         '''          
  38.    
  39.     def __init__(self):
  40.        
  41.         # Vars
  42.         self.fr_LayoutColour = (.5,.5,.5)
  43.         self.menuColour = (.43,.43,.43)
  44.         defaultWidth = 231
  45.         self.defaultWidth = defaultWidth
  46.         self.defaultCpntWidth = defaultWidth-22
  47.        
  48.         #--------------------------------------------------------------------------------------
  49.         # GUI
  50.         #--------------------------------------------------------------------------------------                
  51.         self.mainWin = window(t='Rig-A-Majiger', widthHeight=(defaultWidth+3,750), mxb=False)
  52.         self.myLayout = scrollLayout( bgc=(.15,.15,.15))       
  53.        
  54.         #--------------------------------------------------------------------------------------
  55.         # Selection Tools
  56.         #--------------------------------------------------------------------------------------
  57.         self.mainToolsFrameLayout = frameLayout(cll=False, w=self.defaultCpntWidth, l='Main Tools', p=self.myLayout, bgc=self.fr_LayoutColour)
  58.        
  59.         self.txt_Spacer = text(label='', al='left', w=self.defaultCpntWidth,p=self.myLayout)
  60.         self.txt_SelectionTools = text(label=' Selection Tools', al='left', w=self.defaultCpntWidth,p=self.myLayout)
  61.        
  62.         self.SelectPCRCLayout = rowColumnLayout(nc=2, cw=[(1, self.defaultCpntWidth/2), (2, self.defaultCpntWidth/2)], p=self.myLayout)
  63.         self.btn_selectParent = button(label = 'Select Parent', parent=self.SelectPCRCLayout, w=self.defaultCpntWidth/2)
  64.         self.btn_selectChild = button(label = 'Select Child', parent=self.SelectPCRCLayout, w=self.defaultCpntWidth/2)
  65.        
  66.         self.btn_selectHierarchy = button(label = 'Select Hierarchy', parent=self.myLayout, w=self.defaultCpntWidth)
  67.        
  68.         text(label='', al='left', w=self.defaultCpntWidth,p=self.myLayout)
  69.         self.txt_AlignmentTools = text(label=' Alignment Tools', al='left',p=self.myLayout)
  70.        
  71.         self.btn_CenterToScene = button(label = 'Center Of Scene', parent=self.myLayout, w=self.defaultCpntWidth)
  72.         self.btn_CenterToComp = button(label = 'Center To Component', parent=self.myLayout, w=self.defaultCpntWidth)
  73.        
  74.         text(label='', al='left', w=self.defaultCpntWidth, p=self.myLayout)
  75.         self.txt_JointTools = text(label=' Joint Tools', al='left', w=self.defaultCpntWidth, p=self.myLayout)
  76.         #--------------------------------------------------------------------------------------
  77.         # Joint Tools GUI
  78.         #--------------------------------------------------------------------------------------
  79.         self.SelectCDJoLayout = rowColumnLayout(nc=2, cw=[(1, self.defaultCpntWidth/2), (2, self.defaultCpntWidth/2)], p=self.myLayout)
  80.         self.btn_CreateJoints = button(label = 'Create Joints', parent=self.SelectCDJoLayout, w=self.defaultCpntWidth/2)
  81.         self.btn_DeleteJoints = button(label = 'Delete Joints', parent=self.SelectCDJoLayout, w=self.defaultCpntWidth/2)
  82.        
  83.        
  84.         # Mirror Joint Tools GUI
  85.         #--------------------------------------------------------------------------------------
  86.         self.btn_MirrorJoints = button(label = 'Mirror Joints', parent=self.myLayout, w=self.defaultCpntWidth)
  87.        
  88.        
  89.         # Align Joint Tools GUI
  90.         #--------------------------------------------------------------------------------------
  91.         self.btn_orientJoints = button(en= False, label = 'Orient Joints', parent=self.myLayout, w=self.defaultCpntWidth)
  92.         self.btn_BuildIKWithPole = button(label = 'Build IKRP With Pole Vector', parent=self.myLayout, w=self.defaultCpntWidth)
  93.  
  94.         # Joint Tool Options
  95.         #--------------------------------------------------------------------------------------
  96.         self.mirrorJointsFrameLayout = frameLayout(cll=True, w=self.defaultCpntWidth, l='Options', p=self.myLayout, cl=True, bgc=self.menuColour)
  97.  
  98.         text(label='Mirror Joint', al='left', w=self.defaultCpntWidth,p=self.mirrorJointsFrameLayout)
  99.         self.rc_MirrorJointXYZ = radioCollection(p=self.mirrorJointsFrameLayout)
  100.         self.mirrorJointRowLayout = rowLayout(p=self.mirrorJointsFrameLayout,w=self.defaultCpntWidth,nc=3)
  101.         self.rb_MirrorJoint_X = radioButton( label='X', cl=self.rc_MirrorJointXYZ, sl=True,p=self.mirrorJointRowLayout)
  102.         self.rb_MirrorJoint_Y = radioButton( label='Y', cl=self.rc_MirrorJointXYZ,p=self.mirrorJointRowLayout)
  103.         self.rb_MirrorJoint_Z = radioButton( label='Z', cl=self.rc_MirrorJointXYZ,p=self.mirrorJointRowLayout)
  104.        
  105.         self.mirrorOffsetRCLayout = rowColumnLayout(nc=2, cw=[(1, 50), (2, 40)], p=self.mirrorJointsFrameLayout)
  106.         self.txt_mirrorOffset = text(label=' Offset:', al='left', w=self.defaultCpntWidth-20,p=self.mirrorOffsetRCLayout)
  107.         self.intField_mirrorOffset = intField(p=self.mirrorOffsetRCLayout)
  108.         #text(label='Allign Joint', al='left', w=self.defaultCpntWidth,p=self.mirrorJointsFrameLayout)
  109.  
  110.         #--------------------------------------------------------------------------------------
  111.         # Utility Tools GUI
  112.         #--------------------------------------------------------------------------------------    
  113.         text(label='', al='left', w=self.defaultCpntWidth, p=self.myLayout)
  114.         self.txt_NameTools = text(label=' Utility Tools', al='left', w=self.defaultCpntWidth, p=self.myLayout) 
  115.        
  116.         # Rename Joints GUI
  117.         #--------------------------------------------------------------------------------------
  118.         self.RenameJointSpacer = columnLayout(parent=self.myLayout,w=self.defaultCpntWidth )
  119.        
  120.         self.btn_RenameJoints = button(l='Rename Tool', parent=self.RenameJointSpacer, w=self.defaultCpntWidth-1)
  121.         self.btn_SubmitRename = button(label = 'Submit', parent=self.RenameJointSpacer, w=self.defaultCpntWidth, vis=False)
  122.  
  123.         self.renameJointsFrameLayout = frameLayout(label='Rename Tool',cll=False, w=self.defaultCpntWidth, p=self.RenameJointSpacer, vis=False, bgc=self.fr_LayoutColour)
  124.                
  125.         self.txtRenameUpdaterLayout = rowColumnLayout(nc=2, cw=[(1, 175), (2, 30)], p=self.renameJointsFrameLayout)
  126.         self.renameJointsUpdate = button(label = 'Update Preview', p=self.txtRenameUpdaterLayout, w=160)
  127.         self.renameJointsReset = button(label = 'x', p=self.txtRenameUpdaterLayout, w=20)
  128.        
  129.         self.txtNumNamerLayout = rowColumnLayout(nc=4, cw=[(1, 70), (2, 30), (3, 70), (4, 30)], p=self.renameJointsFrameLayout)
  130.         self.txt_numberNameerLable = text(label=' Number:', al='left', w=self.defaultCpntWidth,p=self.txtNumNamerLayout)
  131.         self.numberNamerToggleBox = checkBox(self.txtNumNamerLayout, l=' ')
  132.         self.txt_numberNamerBufferLable = text(label='  Digits:', al='left', w=self.defaultCpntWidth,p=self.txtNumNamerLayout)
  133.         self.intField_number = intField(w=20, p=self.txtNumNamerLayout)
  134.        
  135.         self.txtRenameTrimEndsCLayout = rowColumnLayout(nc=4, cw=[(1, 70), (2, 30), (3,70), (4,30)], p=self.renameJointsFrameLayout)
  136.         self.txt_TrimStart = text(label=' Trim Start:', al='left', w=self.defaultCpntWidth,p=self.txtRenameTrimEndsCLayout)
  137.         self.intField_TrimStart = intField(w=20, p=self.txtRenameTrimEndsCLayout)
  138.         self.txt_TrimStart = text(label='  Trim end:', al='left', w=self.defaultCpntWidth,p=self.txtRenameTrimEndsCLayout)
  139.         self.intField_TrimEnd = intField(w=20, p=self.txtRenameTrimEndsCLayout)
  140.        
  141.         self.txtRenamePrefixCLayout = rowColumnLayout(nc=2, cw=[(1, 40), (2, 50)], p=self.renameJointsFrameLayout)
  142.         self.txt_RenamePrefix = text(label=' Prefix:', al='left', w=self.defaultCpntWidth,p=self.txtRenamePrefixCLayout)
  143.         self.txtField_RenamePrefix = textField(w=self.defaultCpntWidth-43, p=self.txtRenamePrefixCLayout)
  144.        
  145.         self.txtRenameNameCLayout = rowColumnLayout(nc=2, cw=[(1, 40), (2, 50)], p=self.renameJointsFrameLayout)
  146.         self.txt_RenameName = text(label=' Name:', al='left', w=self.defaultCpntWidth,p=self.txtRenameNameCLayout)
  147.         self.txtField_RenameName = textField(w=self.defaultCpntWidth-43, p=self.txtRenameNameCLayout)      
  148.        
  149.         self.txtRenameSuffixCLayout = rowColumnLayout(nc=2, cw=[(1, 40), (2, 50)], p=self.renameJointsFrameLayout)
  150.         self.txt_RenameSuffix = text(label=' Suffix:', al='left', w=self.defaultCpntWidth,p=self.txtRenameSuffixCLayout)
  151.         self.txtField_RenameSuffix = textField(w=self.defaultCpntWidth-43,p=self.txtRenameSuffixCLayout)
  152.            
  153.         self.txt_FindReplace = text(label=' Find                       Replace', al='left', w=self.defaultCpntWidth,p=self.renameJointsFrameLayout)
  154.         self.txtRenameFindReplaceCLayout = rowColumnLayout(nc=2, cw=[(1, 102), (2, 102)], p=self.renameJointsFrameLayout)
  155.         self.txtField_RenameFind = textField(w=20, p=self.txtRenameFindReplaceCLayout)
  156.         self.txtField_RenameReplace = textField(w=20, p=self.txtRenameFindReplaceCLayout)
  157.        
  158.         self.txt_RenameJoints = text(label=' Preview', al='left', w=self.defaultCpntWidth,p=self.renameJointsFrameLayout)
  159.        
  160.         # Advanced Name GUI
  161.         #--------------------------------------------------------------------------------------
  162.         self.ADVNameSpacer = columnLayout(parent=self.myLayout,w=self.defaultCpntWidth )
  163.        
  164.         self.btn_ADVName = button(label = 'Advanced Name Tool', parent=self.ADVNameSpacer, w=self.defaultCpntWidth-1, en=False)
  165.         self.btn_ADVNameSubmit = button(label = 'Submit', parent=self.ADVNameSpacer, w=self.defaultCpntWidth,vis=False)
  166.        
  167.         self.ADVNameFrameLayout = frameLayout(l='Advanced Name Tool',cll=False, w=self.defaultCpntWidth, p=self.ADVNameSpacer, vis=False, bgc=self.fr_LayoutColour)
  168.         self.btn_ADVUpdate = button(label = 'Update Preview', p=self.ADVNameFrameLayout, w=self.defaultCpntWidth)
  169.         self.txt_Spacer = text(label='', al='left', w=self.defaultCpntWidth,p=self.ADVNameFrameLayout)
  170.        
  171.         self.ADVNameTrimSpacer = columnLayout(parent=self.ADVNameFrameLayout,w=self.defaultCpntWidth )
  172.        
  173.         self.txt_sFormater = text(label=' String Formatter', al='left', w=self.defaultCpntWidth,p=self.ADVNameTrimSpacer)
  174.         self.txtField_sFormater = textField(w=self.defaultCpntWidth, p=self.ADVNameTrimSpacer)
  175.        
  176.         self.txt_ADVPreview = text(label=' Preview', al='left', w=self.defaultCpntWidth,p=self.ADVNameFrameLayout)
  177.         #--------------------------------------------------------------------------------------
  178.        
  179.         #--------------------------------------------------------------------------------------
  180.         # Draws Window and GUI Widgets
  181.         #--------------------------------------------------------------------------------------
  182.         self.btn_selectParent.setCommand(self.selectParent)
  183.         self.btn_selectChild.setCommand(self.selectChild)
  184.         self.btn_selectHierarchy.setCommand(self.selectHierarchy)
  185.        
  186.         self.btn_CenterToScene.setCommand(self.centerToScene)
  187.         self.btn_CenterToComp.setCommand(self.centerToComp)
  188.        
  189.         self.btn_CreateJoints.setCommand(self.createJoints)
  190.         self.btn_DeleteJoints.setCommand(self.deleteJoints)
  191.         self.btn_MirrorJoints.setCommand(self.jointMirror)
  192.        
  193.         self.btn_BuildIKWithPole.setCommand(self.BuildIKWithPole)
  194.        
  195.         self.renameJointsUpdate.setCommand(self.updatePreview)
  196.         self.renameJointsReset.setCommand(self.resetPreview)
  197.        
  198.         self.btn_RenameJoints.setCommand(self.renameJoints)
  199.         self.btn_SubmitRename.setCommand(self.renameJointsSubmit)
  200.        
  201.         self.btn_ADVName.setCommand(self.advName)
  202.         self.btn_ADVNameSubmit.setCommand(self.advNameSubmit)
  203.         #--------------------------------------------------------------------------------------
  204.         self.mainWin.show()
  205.         #--------------------------------------------------------------------------------------
  206.    
  207. #--------------------------------------------------------------------------------------
  208. # Main Methods
  209. #--------------------------------------------------------------------------------------
  210. # Selection Tools
  211. #--------------------------------------------------------------------------------------
  212.    
  213.     # Scrolls through Parents until reaches the top of Hierarchy then Stops
  214.     def selectParent(self,*args):
  215.         if len(ls(sl=True)) == 0:
  216.             print '>>>>>>>>>> Incorrect selection: Please select a bone/joint'
  217.         else:
  218.             self.selectHierarchy()
  219.             select(ls(sl=True)[0])
  220.             print '>>>>>>>>>> Current Selection is ROOT: Parent'
  221.    
  222.     def selectChild(self,*args):
  223.         if len(ls(sl=True)) == 0:
  224.             print '>>>>>>>>>> Incorrect selection: Please select a bone/joint'
  225.         else:
  226.             self.selectHierarchy()
  227.             select( ls(sl=True)[-1:])
  228.             print '>>>>>>>>>> Current Selection is ROOT: Child'    
  229.    
  230.     # Selects the whole hierarchy no matter which joint is selected
  231.     def selectHierarchy(self, *args):
  232.         if len(ls(sl=True)) == 0:
  233.             print '>>>>>>>>>> Incorrect selection: Please select a bone/joint'
  234.         else:
  235.             curSel = listRelatives(ls(sl=True), p=True)
  236.            
  237.             while len(curSel) > 0
  238.                 curParent = curSel[0]
  239.                 curSel = listRelatives(curSel[0],p=True)  
  240.            
  241.                 select(curParent)
  242.             select(hi=True)
  243.        
  244.     #--------------------------------------------------------------------------------------
  245.     # Allignment Tools
  246.     #--------------------------------------------------------------------------------------
  247.    
  248.     # This centers any object to the middle of the scene without altering the Y position
  249.     def centerToScene(*args):
  250.         if len(ls(sl=True)) == 0:
  251.             print '>>>>>>>>>> Incorrect selection: Selection was empty!'
  252.            
  253.         elif len(ls(sl=True)) > 1:
  254.             select(ls(sl=True)[0])
  255.             xform(ls(sl=True)[0], t=(0, xform(q=True,ws=True, t=True)[1],0), ws=True )
  256.             makeIdentity( apply=True, t=1, r=1, s=1, n=0 )     
  257.                        
  258.         else:          
  259.             xform(ls(sl=True)[0], t=(0, xform(q=True,ws=True, t=True)[1],0), ws=True )
  260.             makeIdentity( apply=True, t=1, r=1, s=1, n=0 )
  261.    
  262.     # This centers any object to the center of the bounding box of a selection of components
  263.     def centerToComp(*args):
  264.         if len(ls(sl=True, o=True)) == 2:
  265.             bBox = polyEvaluate(bc=True)
  266.    
  267.             centerPosition = ((bBox[0][0] + bBox[0][1]) / 2, (bBox[1][0] + bBox[1][1]) / 2, (bBox[2][0] + bBox[2][1]) / 2)
  268.    
  269.             xform(ls(sl=True, o=True)[1], ws=True, t=(centerPosition))
  270.             select(cl=True)
  271.             print '>>>>>>>>>> Object move complete'
  272.    
  273.         else:
  274.             print '>>>>>>>>>> Incorrect selection: Select components then shift select the object you want moved'
  275.    
  276.     #--------------------------------------------------------------------------------------
  277.     # Joint Tools
  278.     #--------------------------------------------------------------------------------------
  279.    
  280.     # This Mirrors a Joint Chain
  281.     '''
  282.     TO-DO
  283.     -Add toggle for local and worldspace move
  284.     -Fix Multi Joint Selection <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  285.     -add toggle for auto hierachy selection
  286.    
  287.     - FIX BROKEN DELETE JOINT LOGIC
  288.     '''
  289.    
  290.     def createJoints(self, *args):
  291.         runtime.JointTool()
  292.        
  293.     def deleteJoints(self, *args):
  294.         jList = []
  295.  
  296.         selChain = None
  297.        
  298.         curSelJoint = ls(sl=True)
  299.        
  300.         #Selects boneChain and puts it into an array/list
  301.         self.selectHierarchy()
  302.         jointChain = ls(sl=True)
  303.        
  304.         select(curSelJoint)
  305.        
  306.         if len(jointChain) is not 0:
  307.            
  308.             if curSelJoint[0] == jointChain[0]:
  309.                 delete()
  310.            
  311.             elif curSelJoint[0] == jointChain[len(jointChain)-1]:
  312.                 select(curSelJoint)
  313.                 delete()
  314.             else:
  315.                 pickWalk(d='Up')
  316.                 jList.append(ls(sl=True)[0])
  317.                
  318.                 select(curSelJoint)
  319.                 jList.append(ls(sl=True)[0])
  320.                
  321.                 select(curSelJoint)
  322.                 pickWalk(d='Down')
  323.                 jList.append(ls(sl=True)[0])
  324.                
  325.                 select(jList[0])
  326.                 parent(jList[2])
  327.                
  328.                 select(curSelJoint)
  329.                 delete()
  330.         else:
  331.             print('>>>>>>>>>> Incorrect selection: Please select a bone/joint')
  332.  
  333.  
  334.    
  335.     def jointMirror(self, *args):
  336.        
  337.         if len(ls(sl=True, type='joint')) == 0:
  338.             print '>>>>>>>>>> Incorrect selection: Please select a bone/joint'
  339.         else:
  340.             self.selectHierarchy()
  341.            
  342.             selectedJoints = ls(sl=True)
  343.            
  344.             self.selectParent()
  345.            
  346.             duplicate(rc=True) 
  347.            
  348.             self.selectHierarchy()
  349.            
  350.             dupedJoints = ls(sl=True)
  351.        
  352.        
  353.             for i in range(len(dupedJoints)):
  354.                 currentJointPos = xform(selectedJoints[i], ws=True, translation=True, q=True)
  355.                
  356.                 if self.rb_MirrorJoint_X.getSelect():
  357.                    
  358.                     xform(dupedJoints[i], ws=True, t=(-currentJointPos[0]+self.intField_mirrorOffset.getValue(),currentJointPos[1],currentJointPos[2]))
  359.                
  360.                 elif self.rb_MirrorJoint_Y.getSelect():
  361.                     xform(dupedJoints[i], ws=True, t=(currentJointPos[0],-currentJointPos[1]+self.intField_mirrorOffset.getValue(),currentJointPos[2]))
  362.                
  363.                 elif self.rb_MirrorJoint_Z.getSelect():
  364.                     xform(dupedJoints[i], ws=True, t=(currentJointPos[0],currentJointPos[1],-currentJointPos[2]+self.intField_mirrorOffset.getValue()))
  365.                
  366.         select(cl=True)
  367.         self.intField_mirrorOffset.setValue(0)
  368.    
  369.     #--------------------------------------------------------------------------------------
  370.    
  371.     txtFieldArrayRenamer = []
  372.    
  373.     #--------------------------------------------------------------------------------------
  374.  
  375.     def BuildIKWithPole (self, *args):
  376.        
  377.         if len(ls(sl=True)) is 0:
  378.             print '>>>>>>>>>> Nothing Selected: Please select a middle joint.'
  379.         else:
  380.        
  381.             jointChain = []
  382.             tempChain = []
  383.            
  384.             # Saves the first selected joint (Should be the poleVector Control joint)
  385.             selJoint = ls(sl=True)
  386.            
  387.             #---------------------------------------------------------------------
  388.             # Builds tempChain with the selected joint and surrounded ones
  389.             #---------------------------------------------------------------------
  390.            
  391.             pickWalk(d='Up')
  392.             tempChain.append(ls(sl=True)[0])
  393.            
  394.             select(selJoint)
  395.             tempChain.append(ls(sl=True)[0])
  396.                        
  397.             select(selJoint)
  398.             pickWalk(d='Down')
  399.             tempChain.append(ls(sl=True)[0])
  400.             #---------------------------------------------------------------------         
  401.                        
  402.             for i in tempChain:
  403.                     if i not in jointChain:
  404.                         jointChain.append(i)
  405.                                
  406.             if len(jointChain) != 3:
  407.                 print '>>>>>>>>>> Joint chain is not compatible. Please choose a middle joint.'
  408.                 select(cl=True)
  409.             else:
  410.                 #---------------------------------------------------------------------
  411.                 # Builds IKRP & pole Vector
  412.                 #---------------------------------------------------------------------             
  413.                
  414.                 select(cl=True)
  415.                
  416.                 select(jointChain[0].rotatePivot, r=True)
  417.                 select(jointChain[2].rotatePivot, add=True)
  418.                 ikHandle(sol='ikRPsolver')
  419.                 self.aimPole(selJoint)
  420.                
  421.                
  422.                 #--------------------------------------------------------------------- 
  423.                
  424.     def aimPole(self, selJointP):
  425.    
  426.         IK_Handle = ls(sl=True)[0]
  427.         vec = IK_Handle.poleVector.get()
  428.                    
  429.         myrot=[]
  430.         xAngle=0.0
  431.         zAngle=0.0
  432.         xyLength=0.0
  433.         vecLength=0.0
  434.            
  435.         xyLength=float(util.sqrt(  ( (vec[0]) * (vec[0]) ) + ( (vec[1]) * (vec[1]) ) ))
  436.         vecLength=float(util.sqrt( ( (vec[0]) * (vec[0]) ) + ( (vec[1]) * (vec[1]) ) + ( (vec[2]) * (vec[2]) ) ))  
  437.    
  438.         if xyLength == 0:
  439.             if (vec[0]) > 0:
  440.                 zAngle = util.radians( 90 )
  441.             else:
  442.                 zAngle = util.radians( -90 )       
  443.         else:
  444.             zAngle = float(util.acos((vec[1]) / xyLength))
  445.        
  446.         xAngle = float(util.acos(xyLength / vecLength))
  447.        
  448.         if (vec[2]) > 0:
  449.             xAngle = xAngle
  450.         else:
  451.             xAngle = -xAngle
  452.                
  453.         myrot.append(util.degrees(xAngle))
  454.            
  455.         if (vec[0]) > 0:
  456.             zAngle = -zAngle
  457.         else:
  458.             zAngle = zAngle
  459.         myrot.append(util.degrees( zAngle ))
  460.                
  461.         pVec = spaceLocator(name=str(selJointP[0][:]) + '_pVec')
  462.         xform(ro=(myrot[0], 0, myrot[1]))
  463.    
  464.         startjoint=str(ikHandle(IK_Handle,q=1,startJoint=1))
  465.        
  466.         endeffector=str(ikHandle(IK_Handle,q=1,endEffector=1))
  467.        
  468.        
  469.         pointConstraint(startjoint,endeffector, pVec,name='tempconstraint')
  470.         delete("tempconstraint")
  471.        
  472.         poleVectorConstraint(pVec,IK_Handle)
  473.        
  474.         del(pVec)
  475.        
  476.     #--------------------------------------------------------------------------------------
  477.     # Utility Tools
  478.     #--------------------------------------------------------------------------------------
  479.    
  480.     # This renames joints and allows the ability to add a suffix and prefix.
  481.     def renameJoints(self, *args):
  482.        
  483.         self.intField_number.setValue(1)
  484.         self.selChain = []
  485.        
  486.         if len(ls(sl=True)) == 0:
  487.             print '>>>>>>>>>> Empty Selection!'
  488.         else:
  489.             self.selectHierarchy()
  490.             self.selChain = ls(sl=True)
  491.            
  492.             # makes the textfields and populates them with joint names
  493.             for i in self.selChain:
  494.                 self.txtFieldArrayRenamer.append(textField(p=self.renameJointsFrameLayout))
  495.                 self.txtFieldArrayRenamer[len(self.txtFieldArrayRenamer)-1].setText(i)
  496.            
  497.             self.renameJointsFrameLayout.setVisible(val=True)
  498.            
  499.             self.btn_RenameJoints.setVisible(False)
  500.             self.btn_SubmitRename.setVisible(True)
  501.             self.btn_ADVName.setVisible(False)
  502.            
  503.            
  504.     def renameJointsSubmit(self, *args):
  505.         boneItrCount = 0
  506.        
  507.        
  508.         # FIX THIS BUY MAKING self.selChain copy the data from ls(sl=True instead of just pointing to it)
  509.         if not objExists(self.selChain[0]):
  510.             for i in self.txtFieldArrayRenamer:
  511.                     deleteUI(i)
  512.             self.renameJointsFrameLayout.setVisible(val=False)
  513.             self.btn_RenameJoints.setEnable(True)
  514.             print '>>>>>>>>>> Joint Chain was deleted: Rename was not completed'
  515.            
  516.         else:      
  517.        
  518.             self.renameJointsFrameLayout.setVisible(val=False)
  519.             for i in self.txtFieldArrayRenamer:
  520.                 if len(i.getText()) == 0:
  521.                     rename(self.selChain[boneItrCount], self.selChain[boneItrCount])
  522.                     deleteUI(i)
  523.                     boneItrCount += 1
  524.                 else:
  525.                     rename(self.selChain[boneItrCount],i.getText())
  526.                     deleteUI(i)
  527.                     boneItrCount += 1
  528.                
  529.        
  530.         # Resets the array and re-enables the Rename Joint button
  531.         boneItrCount = 0
  532.         self.txtFieldArrayRenamer[:] = []
  533.         self.selChain[:] = []
  534.         self.txtField_RenamePrefix.setText('')
  535.         self.txtField_RenameSuffix.setText('')
  536.         self.txtField_RenameName.setText('')
  537.         self.txtField_RenameFind.setText('')
  538.         self.txtField_RenameReplace.setText('')
  539.         self.intField_number.setValue(1)
  540.         self.intField_TrimStart.setValue(0)
  541.         self.intField_TrimEnd.setValue(0)      
  542.         self.numberNamerToggleBox.setValue(False)
  543.         self.btn_SubmitRename.setVisible(False)
  544.         self.btn_RenameJoints.setVisible(True)
  545.         self.btn_ADVName.setVisible(True)
  546.        
  547.     def resetPreview (self, *args):
  548.         for i in range(len(self.txtFieldArrayRenamer)):
  549.             self.txtFieldArrayRenamer[i].setText(self.selChain[i])
  550.        
  551.     def updatePreview (self, *args):
  552.        
  553.         counter = 1
  554.        
  555.         for i in range(len(self.txtFieldArrayRenamer)):
  556.            
  557.            
  558.             if len(self.txtField_RenameName.getText()) == 0:
  559.                
  560.                 if self.numberNamerToggleBox.getValue() == True:               
  561.                
  562.                     self.txtFieldArrayRenamer[i].setText(self.selChain[i])
  563.                    
  564.                     self.txtFieldArrayRenamer[i].setText(self.trimName(self.txtFieldArrayRenamer[i].getText(),self.intField_TrimStart.getValue(),self.intField_TrimEnd.getValue()))
  565.    
  566.                     self.txtFieldArrayRenamer[i].setText(self.txtField_RenamePrefix.getText() + self.txtFieldArrayRenamer[i].getText() + self.txtField_RenameSuffix.getText() + '_' + str(counter).zfill(self.intField_number.getValue()+1))
  567.                    
  568.                     counter += 1
  569.                
  570.                 elif self.numberNamerToggleBox.getValue() == False:
  571.                    
  572.                     self.txtFieldArrayRenamer[i].setText(self.selChain[i])
  573.                    
  574.                     self.txtFieldArrayRenamer[i].setText(self.trimName(self.txtFieldArrayRenamer[i].getText(),self.intField_TrimStart.getValue(),self.intField_TrimEnd.getValue()))
  575.    
  576.                     self.txtFieldArrayRenamer[i].setText(self.txtField_RenamePrefix.getText() + self.txtFieldArrayRenamer[i].getText() + self.txtField_RenameSuffix.getText())
  577.             else:
  578.                 if self.numberNamerToggleBox.getValue() == True:               
  579.                
  580.                     self.txtFieldArrayRenamer[i].setText(self.selChain[i])
  581.                    
  582.                     self.txtFieldArrayRenamer[i].setText(self.trimName(self.txtFieldArrayRenamer[i].getText(),self.intField_TrimStart.getValue(),self.intField_TrimEnd.getValue()))
  583.    
  584.                     self.txtFieldArrayRenamer[i].setText(self.txtField_RenamePrefix.getText() + self.txtField_RenameName.getText() + self.txtField_RenameSuffix.getText() + '_' + str(counter).zfill(self.intField_number.getValue()+1))
  585.                    
  586.                     counter += 1
  587.                
  588.                 elif self.numberNamerToggleBox.getValue() == False:
  589.                    
  590.                     self.txtFieldArrayRenamer[i].setText(self.selChain[i])
  591.                    
  592.                     self.txtFieldArrayRenamer[i].setText(self.trimName(self.txtFieldArrayRenamer[i].getText(),self.intField_TrimStart.getValue(),self.intField_TrimEnd.getValue()))
  593.    
  594.                     self.txtFieldArrayRenamer[i].setText(self.txtField_RenamePrefix.getText() + self.txtField_RenameName.getText() + self.txtField_RenameSuffix.getText())
  595.                
  596.         # Searches and Replaces whats in the replace txtField with whats in the Find txtField
  597.         for i in range(len(self.txtFieldArrayRenamer)):
  598.             self.txtFieldArrayRenamer[i].setText(self.txtFieldArrayRenamer[i].getText().replace(self.txtField_RenameFind.getText(), self.txtField_RenameReplace.getText()))
  599.            
  600.     #--------------------------------------------------------------------------------------
  601.    
  602.     # This Allows you to trim the front or back off names (i.e. bad suffix/prefix's).
  603.     def advName(self,*args):
  604.        
  605.         self.selChain = []
  606.        
  607.         if len(ls(sl=True)) == 0:
  608.             print '>>>>>>>>>> Empty selection!'
  609.         else:
  610.             self.selectHierarchy()
  611.             self.selChain = ls(sl=True)
  612.            
  613.             # makes the textfields and populates them with joint names
  614.             for i in self.selChain:
  615.                 self.txtFieldArrayRenamer.append(textField(p=self.ADVNameFrameLayout))
  616.                 self.txtFieldArrayRenamer[len(self.txtFieldArrayRenamer)-1].setText(i)
  617.            
  618.             self.ADVNameFrameLayout.setVisible(val=True)
  619.            
  620.             self.btn_ADVName.setVisible(False)
  621.             self.btn_ADVNameSubmit.setVisible(True)
  622.             self.btn_RenameJoints.setVisible(False)
  623.            
  624.    
  625.     def advNameSubmit(self, *args):
  626.         boneItrCount = 0       
  627.        
  628.         # FIX THIS BY MAKING self.selChain copy the data from ls(sl=True instead of just pointing to it)
  629.         if not objExists(self.selChain[0]):
  630.             for i in self.txtFieldArrayRenamer:
  631.                     deleteUI(i)
  632.             self.ADVNameFrameLayout.setVisible(val=False)
  633.             self.btn_RenameJoints.setEnable(True)
  634.             print '>>>>>>>>>> Joint Chain was deleted: Rename was not completed'
  635.            
  636.         else:      
  637.        
  638.             self.ADVNameFrameLayout.setVisible(val=False)
  639.             for i in self.txtFieldArrayRenamer:
  640.                 if len(i.getText()) == 0:
  641.                     rename(self.selChain[boneItrCount], self.selChain[boneItrCount] + self.txtField_sFormater.getText())
  642.                     deleteUI(i)
  643.                     boneItrCount += 1
  644.                 else:
  645.                     rename(self.selChain[boneItrCount], i.getText() + self.txtField_sFormater.getText())
  646.                     deleteUI(i)
  647.                     boneItrCount += 1
  648.        
  649.        
  650.         # Resets the array and re-enables the Rename Joint button
  651.         self.txtFieldArrayRenamer[:] = []
  652.         self.selChain[:] = []
  653.         self.txtField_sFormater.setText('')
  654.         self.btn_RenameJoints.setVisible(True)
  655.         self.btn_ADVName.setVisible(True)
  656.         self.btn_ADVNameSubmit.setVisible(False)
  657.        
  658.        
  659.     def trimName(self, nameForProcess='', trimStart=0, trimEnd=0):
  660.        
  661.         if trimStart == 0 and trimEnd ==0:
  662.             return nameForProcess
  663.         elif trimStart == 0 and not trimEnd == 0:
  664.             return nameForProcess[: -trimEnd]
  665.         elif not trimStart == 0 and trimEnd == 0:
  666.             return nameForProcess[trimStart:]
  667.         else:
  668.             return nameForProcess[trimStart:-trimEnd]
  669.        
  670.     #--------------------------------------------------------------------------------------
  671.  
  672.  
  673. testApp = RiggerTool()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement