"""begin jf_pruneWeight.py Jean-Francois Fortin -=WHAT IT DOES=- prune weights to a number of joint choose,it will take the lowest weight and redistribute it. Good for video game where u can`t have move then 4 joint per vertex. -=RETURN=- -=NONE=- -=EXAMPLES=- -=REQUIRES=- -=NONE=- -=UPDATES=- end """ import maya.cmds as cmds import maya.mel as mel def pruneWeight(): if cmds.window( 'pruneWeightToJnt',ex=True): cmds.deleteUI('pruneWeightToJnt') cmds.window('pruneWeightToJnt',title='prune weight') cmds.columnLayout( adj=True ) cmds.frameLayout(lv=0,borderStyle='etchedIn') cmds.columnLayout( adj=True ) cmds.intSliderGrp( 'numOfJoint',label='joint size',field=True,value=0,max=10 ) cmds.setParent('..') cmds.setParent('..') cmds.frameLayout(lv=0,borderStyle='etchedIn') cmds.button(l='prune',c ="pruneWeightCmd()" ) cmds.showWindow( 'pruneWeightToJnt' ) def pruneWeightCmd(): start = cmds.timerX() removeJoint = cmds.intSliderGrp('numOfJoint',q=True,v=True) mesh = cmds.ls(sl=True) skinCluster = mel.eval("findRelatedSkinCluster(\"" + mesh[0] + "\");" ) vtx = cmds.polyListComponentConversion(mesh[0],tv=True) cmds.select( vtx ) verts = cmds.ls( sl=True,fl=True ) vertsNum = len( verts ) up = 0 cmds.progressWindow(title='Prunning',progress=up,status='pruning: ',isInterruptable=True ) for i in range (0,len( verts )): up+=1 jointIndices = [] weightValues = [] jointToKeep = [] wDic = {} wDicSorted = {} jointAssign = cmds.skinCluster(verts[i],q=True,inf=True) weightAssign = cmds.skinPercent( skinCluster,verts[i],query=True, value=True ) for r in range(0,len( weightAssign )): wDic[r] = weightAssign[r] wDicSorted = sorted(wDic.items(),key=lambda y:(-y[1],-y[0]),reverse=True ) weightAssign.sort() weightValues = [ li[1] for li in wDicSorted ] jointIndices = [ ind[0] for ind in wDicSorted ] weightAssign.extend([ w[0] for w in wDicSorted ]) sizeToRemove = (len(weightValues) - 1 ) - removeJoint if(len( weightValues) > 0 and sizeToRemove > 0): for a in range( (len(weightValues)-1),sizeToRemove,-1 ): if weightValues[a] == weightAssign[a]: jointToKeep.append( jointAssign[jointIndices[a]]) diff = list(set(jointAssign).difference(set(jointToKeep))) for dif in diff: cmds.skinPercent(skinCluster,verts[i],transformValue=[dif,0] ) cmds.progressWindow(edit=True,progress=( up*100/vertsNum ),status=('prunning: '+`up`+' verts')) cmds.progressWindow(endProgress=True) cmds.select(cl=True) totalTime = cmds.timerX(startTime=start) print "Total time: ", totalTime