def rig_createFkChain(self, topNode=None): ''' Create Fk controls and attributes and SH joint chain ''' # Get the root locators rootLocs = pm.listRelatives('HairRig_MainCnt', children=True)[1:] # Per chain index = 0 for chainName, numJnts in zip(self.chainNames, self.chainNumJnts): # Chain grp chainGrp = pm.group(n=chainName + '_hr_fk_grp', parent=topNode, em=True) pm.delete(pm.parentConstraint(rootLocs[index], chainGrp, mo=0)) # Get locator names locNames = [ '%s_loc%s' % (chainName, num) for num in range(int(numJnts)) if num != 0 ] locNames.insert(0, '%s_rootLoc' % chainName) # Get locator positions positions = [] for loc in locNames: positions.append(pm.xform(loc, q=1, ws=1, t=1)) # Draw fk joint chain fkJnts = [] pm.select(chainGrp, replace=True) for i in range(len(positions)): fkJnts.append( pm.joint(name=chainName + '_hr_fkJnt_%s' % i, p=positions[i])) index = index + 1 # Create Fk controls and attributes label = chainName control = 'HairRig_MainCnt' fkControl = pm.circle(nr=(0, 0, 1), c=(0, 0, 0), ch=False)[0] aim = 'Z' twist = 'Y' up = 'X' # Create main attributes on control pm.select(control, r=True) attList = pm.attributeInfo(control, all=True) if (label not in attList): try: pm.addAttr(longName=label, k=True) pm.setAttr(control + '.' + label, lock=True) except: pass #Attribute already exists #Get data for current limb startJnt = pm.listRelatives(chainGrp, children=True)[0] pm.select(pm.listRelatives(chainGrp, children=True)[0], hi=True) endJnt = pm.ls(sl=1)[-1] #Get full chain chain = [] #Get the hierarchy of startJnt, then store it until endJnt is found try: pm.select(startJnt, r=True, hi=True) sel = pm.ls(sl=True, fl=True, type='joint') tempChain = sel for each in tempChain: if each == endJnt: chain.append(each) break else: chain.append(each) except: pass #Store parent of chain parent = pm.listRelatives(chain[0], parent=True) #Unparent joints for each in chain: try: pm.parent(each, w=True) except: pass #Create duplicate joints above orig joints, then store duplicate joint names dupJoints = [] for joint in chain: offName = joint + '_off' jnt = pm.duplicate(joint, rr=True, po=True, n=offName) dupJoints.append(jnt) #Rebuild heirarchy x = 0 while x < len(chain): pm.parent(chain[x], dupJoints[x]) if x != 0: pm.parent(dupJoints[x], chain[x - 1]) x = x + 1 # Add dynamic switch attribute pm.addAttr(control, longName=chainName + '_dynamic', k=True, min=0, max=1) #Adding Curl atts on controller x = 0 while x < len(chain): pm.addAttr(control, longName=chainName + '_curl_' + str(x + 1), k=True) x = x + 1 #Adding spread atts on controller x = 0 while x < len(chain): pm.addAttr(control, longName=chainName + '_spread_' + str(x + 1), k=True) x = x + 1 #Twist pm.addAttr(control, longName=chainName + '_Twist', k=True) #Connect attributes to dupJoints rotate's ( aim = curl, up = spread ) x = 0 pm.connectAttr(control + '.' + chainName + '_Twist', str(dupJoints[x][0]) + '.rotate' + twist) while x < len(chain): pm.connectAttr( control + '.' + chainName + '_curl_' + str(x + 1), str(dupJoints[x][0]) + '.rotate' + aim) pm.connectAttr( control + '.' + chainName + '_spread_' + str(x + 1), str(dupJoints[x][0]) + '.rotate' + up) x = x + 1 #Create fk controllers on joints #Duplicate FK control, parent it to chain joints, delete left over transform node for each in chain: #Duplicate control tempCnt = pm.duplicate(fkControl) #Select the shape tempShp = pm.pickWalk(tempCnt, direction='down') pm.parent(tempShp, each, r=True, s=True) pm.delete(tempCnt) pm.parent(dupJoints[0], chainGrp) pm.delete(fkControl) pm.parentConstraint('HairRig_MainCnt', chainGrp, mo=True)
def rig_createFkChain(self, topNode=None): ''' Create Fk controls and attributes and SH joint chain ''' # Get the root locators rootLocs = pm.listRelatives('HairRig_MainCnt',children=True)[1:] # Per chain index = 0 for chainName, numJnts in zip(self.chainNames, self.chainNumJnts): # Chain grp chainGrp = pm.group(n=chainName+'_hr_fk_grp', parent=topNode, em=True) pm.delete(pm.parentConstraint(rootLocs[index],chainGrp,mo=0)) # Get locator names locNames = ['%s_loc%s'%(chainName,num) for num in range(int(numJnts)) if num != 0] locNames.insert(0,'%s_rootLoc'%chainName) # Get locator positions positions = [] for loc in locNames: positions.append(pm.xform(loc,q=1,ws=1,t=1)) # Draw fk joint chain fkJnts = [] pm.select(chainGrp,replace=True) for i in range(len(positions)): fkJnts.append(pm.joint(name=chainName+'_hr_fkJnt_%s'%i, p=positions[i])) index = index + 1 # Create Fk controls and attributes label = chainName control = 'HairRig_MainCnt' fkControl = pm.circle( nr=(0, 0, 1), c=(0, 0, 0), ch=False )[0] aim = 'Z' twist = 'Y' up = 'X' # Create main attributes on control pm.select(control,r=True) attList = pm.attributeInfo(control,all=True) if(label not in attList): try: pm.addAttr(longName=label,k=True) pm.setAttr(control + '.' + label, lock=True) except: pass #Attribute already exists #Get data for current limb startJnt = pm.listRelatives(chainGrp,children=True)[0] pm.select(pm.listRelatives(chainGrp,children=True)[0], hi=True) endJnt = pm.ls(sl=1)[-1] #Get full chain chain = [] #Get the hierarchy of startJnt, then store it until endJnt is found try: pm.select(startJnt,r=True,hi=True) sel = pm.ls(sl=True,fl=True,type='joint') tempChain = sel for each in tempChain: if each == endJnt: chain.append(each) break else: chain.append(each) except: pass #Store parent of chain parent = pm.listRelatives( chain[0], parent=True) #Unparent joints for each in chain: try: pm.parent(each,w=True) except: pass #Create duplicate joints above orig joints, then store duplicate joint names dupJoints = [] for joint in chain: offName = joint + '_off' jnt = pm.duplicate(joint,rr=True,po=True,n=offName) dupJoints.append(jnt) #Rebuild heirarchy x = 0 while x < len(chain): pm.parent(chain[x],dupJoints[x]) if x != 0: pm.parent(dupJoints[x],chain[x-1]) x = x + 1 # Add dynamic switch attribute pm.addAttr( control, longName=chainName + '_dynamic', k=True, min=0, max=1 ) #Adding Curl atts on controller x= 0 while x < len(chain): pm.addAttr(control, longName=chainName + '_curl_' + str(x+1),k=True) x = x + 1 #Adding spread atts on controller x= 0 while x < len(chain): pm.addAttr(control, longName=chainName + '_spread_' + str(x+1),k=True) x = x + 1 #Twist pm.addAttr(control, longName=chainName + '_Twist',k=True) #Connect attributes to dupJoints rotate's ( aim = curl, up = spread ) x = 0 pm.connectAttr( control + '.' + chainName + '_Twist' , str(dupJoints[x][0]) + '.rotate' + twist ) while x < len(chain): pm.connectAttr( control + '.' + chainName + '_curl_' + str(x+1) , str(dupJoints[x][0]) + '.rotate' + aim ) pm.connectAttr( control + '.' + chainName + '_spread_' + str(x+1), str(dupJoints[x][0]) + '.rotate' + up ) x = x + 1 #Create fk controllers on joints #Duplicate FK control, parent it to chain joints, delete left over transform node for each in chain: #Duplicate control tempCnt = pm.duplicate(fkControl) #Select the shape tempShp = pm.pickWalk(tempCnt,direction='down') pm.parent(tempShp,each,r=True,s=True) pm.delete(tempCnt) pm.parent( dupJoints[0], chainGrp ) pm.delete( fkControl ) pm.parentConstraint( 'HairRig_MainCnt', chainGrp, mo=True )
def build(side=None, label='Fingers', control=None, parentJnt=None, curl='Z', twist='X', spread='Y', fkNormal=(1.0, 0.0, 0.0), radius=0.3): pymelLogger.debug('Starting: build()...') if side == None: raise Exception('Make sure side: %s is valid ' % side) if side == Names.prefixes['left']: fingerJnts = Names.joints_leftFingers_list elif side == Names.prefixes['right']: fingerJnts = Names.joints_rightFingers_list else: raise Exception('Make sure side: %s is valid ' % side) # Is the last joint of the chain going to be skinned ? hasEndJnt = 0 # or last joint should not be considered ? hasEndJnt = 1 hasEndJnt = 1 # hard coding it, by default last joint will not be considered rList = createJnts( side, fingerJnts, hasEndJnt) # [ startJnts, endJnts, attNames, newJnts, originalJnts ] startJnts = rList[0] endJnts = rList[1] attNames = rList[2] newJnts = rList[3] originalJnts = rList[4] # Create main attributes on control pm.select(control, r=True) attList = pm.attributeInfo(control, all=True) if (label not in attList): try: pm.addAttr(longName=label, k=True) pm.setAttr(control + '.' + label, lock=True) except: pass #Attribute already exists @ todo - Catch specific exemption # Create controller vis switch pm.addAttr(longName='Control_Vis', k=True, min=0, max=1, dv=1) # Create spread all pm.addAttr(longName='spread_all', k=True, min=-10.0, max=10.0) # Create tenson all pm.addAttr(longName='tension_all', k=True, min=0.0, max=10.0) # Create tenson all pm.addAttr(longName='curl_all', k=True) chainParent = '' offsetGrpsLists = [] ######################################################## ######################################################## ######################################################## # spread hard coded calculation # jntLen = len(startJnts) startValue = -50 endValue = 50 range = -(startValue) + endValue increment = range / jntLen startV = startValue endV = endValue spreadList = [] if jntLen % 2 == 0: centerIndex = jntLen / 2 index = 1 while index < jntLen + 1: if index < centerIndex: spreadList.append([startV, endV]) startV = startV + increment endV = endV - increment if index > centerIndex: spreadList.append([startV, endV]) startV = startV + increment endV = endV - increment index = index + 1 else: centerIndex = (jntLen + 1) / 2 index = 1 while index < jntLen + 1: if index < centerIndex: spreadList.append([startV, endV]) startV = startV + increment endV = endV - increment if index == centerIndex: spreadList.append([0, 0]) startV = 0 + increment endV = 0 - increment if index > centerIndex: spreadList.append([startV, endV]) startV = startV + increment endV = endV - increment index = index + 1 ######################################################## ######################################################## ######################################################## print 'spread list ', spreadList # Iterate the attNames, startJnts, endJnts at the same time. for (name, startJnt, endJnt, spr) in zip(attNames, startJnts, endJnts, spreadList): #Get full chain chain = [] #Get the hierarchy of startJnt, then store it until endJnt is found try: pm.select(startJnt, r=True, hi=True) sel = pm.ls(sl=True, fl=True, type='joint') tempChain = sel for each in tempChain: if each == endJnt: chain.append(each) break else: chain.append(each) except: pass #Store parent of chain if it has one try: chainParent = pm.listRelatives(chain[0], parent=True) except: pass offsetGrps = [ '_crv_jnt', '_cntrl_jnt', '_tension_jnt', '_curl_jnt', '_all_jnt', 'offsetGrp' ] offsetGrpList = [] for joint in chain: # create offset groups for finger controls ctrlName = joint.replace('_' + Names.suffixes['fk'], '_' + Names.suffixes['control']) ctrlPos = pm.xform(joint, query=True, translation=True, ws=1) ctrlRot = pm.xform(joint, query=True, ro=True, ws=1) offsetGrp = Control.create(name=ctrlName, offsets=len(offsetGrps), shape='circle_01', size=radius, color=getSideColor(side), pos=ctrlPos, parent=None, rot=ctrlRot, typ='body') offsetGrpList.append(offsetGrp) # parent contraint ctrl to fk jnt pm.parentConstraint(offsetGrp.listRelatives(ad=1)[0].getParent(), joint, mo=True) # set Control_Vis attr!!! pm.connectAttr( control + '.' + 'Control_Vis', offsetGrp.listRelatives(ad=1)[0].getParent() + '.visibility') ### hard coding it for now! until better solution and more time cntrlJoints = [] curlJoints = [] tensionJoints = [] allJoints = [] for off in offsetGrpList: for elem in off.listRelatives(ad=1): if '_offsetE' in str(elem): cntrlJoints.append(elem) elif '_offsetB' in str(elem): allJoints.append(elem) elif '_offsetD' in str(elem): curlJoints.append(elem) elif '_offsetC' in str(elem): tensionJoints.append(elem) print cntrlJoints print curlJoints print tensionJoints print allJoints offsetGrpList.reverse() index = 0 for grp in offsetGrpList: if index + 1 == len(offsetGrpList): break grp.setParent(offsetGrpList[index + 1].listRelatives(ad=1)[0].getParent()) index = index + 1 offsetGrpList.reverse() offsetGrpsLists.append(offsetGrpList) # Adding Curl attrs on controller x = 0 while x < len(chain): pm.addAttr(control, longName=name + '_curl_' + str(x + 1), k=True) x = x + 1 # Adding spread attr on controller pm.addAttr(control, longName=name + '_spread', k=True) # Twist pm.addAttr(control, longName=name + '_twist', k=True) # Tension pm.addAttr(control, longName=name + '_tension', k=True) # Connect attributes to cntrlJoints rotate's ( aim = curl, up = spread ) x = 0 pm.connectAttr(control + '.' + name + '_twist', str(cntrlJoints[0]) + '.rotate' + twist) pm.connectAttr(control + '.' + name + '_spread', str(cntrlJoints[0]) + '.rotate' + spread) while x < len(chain): pm.connectAttr(control + '.' + name + '_curl_' + str(x + 1), str(cntrlJoints[x]) + '.rotate' + curl) x = x + 1 #SDK attributes to curl All x = 0 while x < len(curlJoints): pm.connectAttr(control + '.curl_all', str(curlJoints[x]) + '.rotate' + curl) x = x + 1 #SDK attributes to tensionJoints rotate's ( aim = curl ) x = 0 while x < len(tensionJoints): # Root joint curls back if x == 0: pm.setDrivenKeyframe(tensionJoints[x], cd=control + '.' + name + '_tension', at="rotate%s" % curl, dv=0, v=0) pm.setDrivenKeyframe(tensionJoints[x], cd=control + '.' + name + '_tension', at="rotate%s" % curl, dv=10, v=60) x += 1 continue # All oher joints curl forword pm.setDrivenKeyframe(tensionJoints[x], cd=control + '.' + name + '_tension', at="rotate%s" % curl, dv=0, v=0) pm.setDrivenKeyframe(tensionJoints[x], cd=control + '.' + name + '_tension', at="rotate%s" % curl, dv=10, v=-50) x = x + 1 # SDK All tension x = 0 while x < len(allJoints): # all_tension if x == 0: pm.setDrivenKeyframe(allJoints[x], cd=control + '.tension_all', at="rotate%s" % curl, dv=0, v=0) pm.setDrivenKeyframe(allJoints[x], cd=control + '.tension_all', at="rotate%s" % curl, dv=10, v=60) x += 1 continue # All other joints curl forward pm.setDrivenKeyframe(allJoints[x], cd=control + '.tension_all', at="rotate%s" % curl, dv=0, v=0) pm.setDrivenKeyframe(allJoints[x], cd=control + '.tension_all', at="rotate%s" % curl, dv=10, v=-50) x += 1 # SDK All spread #pm.connectAttr( control + '.spread_all', str(allJoints[0]) + '.rotate' + spread ) x = 0 while x < len(allJoints): # spread_all if x == 0: pm.setDrivenKeyframe(allJoints[x], cd=control + '.spread_all', at="rotate%s" % spread, dv=-10, v=spr[0]) pm.setDrivenKeyframe(allJoints[x], cd=control + '.spread_all', at="rotate%s" % spread, dv=10, v=spr[1]) x += 1 continue """ # All other joints curl forward pm.setDrivenKeyframe( allJoints[x], cd=control + '.spread_all', at= "rotate%s"%spread, dv = 0, v = 0 ) pm.setDrivenKeyframe( allJoints[x], cd=control + '.spread_all', at= "rotate%s"%spread, dv = 10, v = 50 ) """ x += 1 pm.select(clear=True) _connectToSH(newJnts, originalJnts) # connecting to hand jnt if passed if parentJnt: _connectToHandJnt(parentJnt, newJnts, offsetGrpsLists) pymelLogger.debug('End: build()...')
def build( side=None, label='Fingers',control=None, parentJnt=None, curl='Z',twist='X',spread='Y', fkNormal=(1.0, 0.0, 0.0), radius=0.3): pymelLogger.debug('Starting: build()...') if side == None: raise Exception('Make sure side: %s is valid '%side) if side == Names.prefixes['left']: fingerJnts = Names.joints_leftFingers_list elif side == Names.prefixes['right']: fingerJnts = Names.joints_rightFingers_list else: raise Exception('Make sure side: %s is valid '%side) # Is the last joint of the chain going to be skinned ? hasEndJnt = 0 # or last joint should not be considered ? hasEndJnt = 1 hasEndJnt = 1 # hard coding it, by default last joint will not be considered rList = createJnts( side, fingerJnts, hasEndJnt ) # [ startJnts, endJnts, attNames, newJnts, originalJnts ] startJnts = rList[0] endJnts = rList[1] attNames = rList[2] newJnts = rList[3] originalJnts = rList[4] # Create main attributes on control pm.select(control,r=True) attList = pm.attributeInfo(control,all=True) if(label not in attList): try: pm.addAttr(longName=label,k=True) pm.setAttr(control + '.' + label, lock=True) except: pass #Attribute already exists @ todo - Catch specific exemption # Create controller vis switch pm.addAttr(longName='Control_Vis',k=True, min=0, max=1,dv=1) # Create spread all pm.addAttr(longName='spread_all',k=True, min=-10.0, max=10.0) # Create tenson all pm.addAttr(longName='tension_all',k=True, min=0.0, max=10.0) # Create tenson all pm.addAttr(longName='curl_all',k=True) chainParent = '' offsetGrpsLists = [] ######################################################## ######################################################## ######################################################## # spread hard coded calculation # jntLen = len(startJnts) startValue=-50 endValue=50 range = -(startValue) + endValue increment = range / jntLen startV = startValue endV = endValue spreadList=[] if jntLen%2==0: centerIndex = jntLen/2 index=1 while index < jntLen+1: if index < centerIndex: spreadList.append( [startV,endV] ) startV = startV + increment endV = endV - increment if index > centerIndex: spreadList.append( [startV,endV] ) startV = startV + increment endV = endV - increment index = index + 1 else: centerIndex = (jntLen+1)/2 index=1 while index < jntLen+1: if index < centerIndex: spreadList.append( [startV,endV] ) startV = startV + increment endV = endV - increment if index == centerIndex: spreadList.append([0,0]) startV = 0 + increment endV = 0 - increment if index > centerIndex: spreadList.append( [startV,endV] ) startV = startV + increment endV = endV - increment index = index + 1 ######################################################## ######################################################## ######################################################## print 'spread list ', spreadList # Iterate the attNames, startJnts, endJnts at the same time. for (name,startJnt,endJnt,spr) in zip(attNames,startJnts,endJnts,spreadList): #Get full chain chain = [] #Get the hierarchy of startJnt, then store it until endJnt is found try: pm.select(startJnt,r=True,hi=True) sel = pm.ls(sl=True,fl=True,type='joint') tempChain = sel for each in tempChain: if each == endJnt: chain.append(each) break else: chain.append(each) except: pass #Store parent of chain if it has one try: chainParent = pm.listRelatives(chain[0],parent=True) except: pass offsetGrps = ['_crv_jnt','_cntrl_jnt','_tension_jnt','_curl_jnt','_all_jnt','offsetGrp'] offsetGrpList = [] for joint in chain: # create offset groups for finger controls ctrlName = joint.replace( '_' + Names.suffixes['fk'], '_' + Names.suffixes['control'] ) ctrlPos = pm.xform(joint, query = True, translation = True, ws=1) ctrlRot = pm.xform(joint, query = True, ro = True, ws=1) offsetGrp = Control.create( name=ctrlName, offsets=len(offsetGrps), shape='circle_01', size=radius, color=getSideColor(side), pos=ctrlPos, parent=None,rot=ctrlRot, typ='body' ) offsetGrpList.append(offsetGrp) # parent contraint ctrl to fk jnt pm.parentConstraint( offsetGrp.listRelatives(ad=1)[0].getParent(), joint, mo=True ) # set Control_Vis attr!!! pm.connectAttr(control +'.'+ 'Control_Vis', offsetGrp.listRelatives(ad=1)[0].getParent() + '.visibility') ### hard coding it for now! until better solution and more time cntrlJoints = [] curlJoints = [] tensionJoints = [] allJoints = [] for off in offsetGrpList: for elem in off.listRelatives(ad=1): if '_offsetE' in str(elem): cntrlJoints.append(elem) elif '_offsetB' in str(elem): allJoints.append(elem) elif '_offsetD' in str(elem): curlJoints.append(elem) elif '_offsetC' in str(elem): tensionJoints.append(elem) print cntrlJoints print curlJoints print tensionJoints print allJoints offsetGrpList.reverse() index = 0 for grp in offsetGrpList: if index+1 == len(offsetGrpList): break grp.setParent(offsetGrpList[index+1].listRelatives(ad=1)[0].getParent()) index = index + 1 offsetGrpList.reverse() offsetGrpsLists.append( offsetGrpList ) # Adding Curl attrs on controller x= 0 while x < len(chain): pm.addAttr(control, longName=name + '_curl_' + str(x+1),k=True) x = x + 1 # Adding spread attr on controller pm.addAttr(control, longName=name + '_spread',k=True) # Twist pm.addAttr(control, longName= name + '_twist',k=True) # Tension pm.addAttr(control, longName= name + '_tension',k=True) # Connect attributes to cntrlJoints rotate's ( aim = curl, up = spread ) x = 0 pm.connectAttr( control + '.' + name + '_twist' , str(cntrlJoints[0]) + '.rotate' + twist ) pm.connectAttr( control + '.' + name + '_spread', str(cntrlJoints[0]) + '.rotate' + spread ) while x < len(chain): pm.connectAttr( control + '.' + name + '_curl_' + str(x+1) , str(cntrlJoints[x]) + '.rotate' + curl ) x = x + 1 #SDK attributes to curl All x = 0 while x < len(curlJoints): pm.connectAttr( control + '.curl_all', str(curlJoints[x]) + '.rotate' + curl ) x = x + 1 #SDK attributes to tensionJoints rotate's ( aim = curl ) x = 0 while x < len(tensionJoints): # Root joint curls back if x == 0: pm.setDrivenKeyframe( tensionJoints[x], cd=control + '.' + name + '_tension', at= "rotate%s"%curl, dv = 0, v = 0 ) pm.setDrivenKeyframe( tensionJoints[x], cd=control + '.' + name + '_tension', at= "rotate%s"%curl, dv = 10, v = 60 ) x += 1 continue # All oher joints curl forword pm.setDrivenKeyframe( tensionJoints[x], cd=control + '.' + name + '_tension', at= "rotate%s"%curl, dv = 0, v = 0 ) pm.setDrivenKeyframe( tensionJoints[x], cd=control + '.' + name + '_tension', at= "rotate%s"%curl, dv = 10, v = -50 ) x = x + 1 # SDK All tension x = 0 while x < len(allJoints): # all_tension if x == 0: pm.setDrivenKeyframe( allJoints[x], cd=control + '.tension_all', at= "rotate%s"%curl, dv = 0, v = 0 ) pm.setDrivenKeyframe( allJoints[x], cd=control + '.tension_all', at= "rotate%s"%curl, dv = 10, v = 60 ) x += 1 continue # All other joints curl forward pm.setDrivenKeyframe( allJoints[x], cd=control + '.tension_all', at= "rotate%s"%curl, dv = 0, v = 0 ) pm.setDrivenKeyframe( allJoints[x], cd=control + '.tension_all', at= "rotate%s"%curl, dv = 10, v = -50 ) x += 1 # SDK All spread #pm.connectAttr( control + '.spread_all', str(allJoints[0]) + '.rotate' + spread ) x = 0 while x < len(allJoints): # spread_all if x == 0: pm.setDrivenKeyframe( allJoints[x], cd=control + '.spread_all', at= "rotate%s"%spread, dv = -10, v = spr[0] ) pm.setDrivenKeyframe( allJoints[x], cd=control + '.spread_all', at= "rotate%s"%spread, dv = 10, v = spr[1] ) x += 1 continue """ # All other joints curl forward pm.setDrivenKeyframe( allJoints[x], cd=control + '.spread_all', at= "rotate%s"%spread, dv = 0, v = 0 ) pm.setDrivenKeyframe( allJoints[x], cd=control + '.spread_all', at= "rotate%s"%spread, dv = 10, v = 50 ) """ x += 1 pm.select(clear=True) _connectToSH( newJnts, originalJnts ) # connecting to hand jnt if passed if parentJnt: _connectToHandJnt( parentJnt, newJnts, offsetGrpsLists) pymelLogger.debug('End: build()...')