"""begin jf_optimizeWeight.py Jean-Francois Fortin -=WHAT IT DOES=- round the decimal value of every vertex weight on a selected mesh. Another great tools for video game where everything improvement make a difference at runtime. -=RETURN=- -=NONE=- -=EXAMPLES=- jf_optimizeWeight 3 will round off to a third decimal. -=REQUIRES=- -=NONE=- -=UPDATES=- end""" import maya.cmds as cmds import maya.mel as mel import maya.OpenMaya as OpenMaya def jf_optimizeWeight(num): nodes = cmds.ls(sl=True) decimal = num if len(nodes) < 1: OpenMaya.MGlobal.displayError('Select at least one polygon mesh') return for node in nodes: skinCluster = mel.eval("findRelatedSkinCluster(\"" + node + "\");" ) num = cmds.getAttr(( skinCluster +'.weightList' ),size=True ) for a in range(num): total = 0 weightAr = [] maxWeight = -1.0 maxIndex = -1 skinWeights = cmds.getAttr(skinCluster+'.weightList['+`a`+'].weights' ) weightSize = len(skinWeights[0]) for j in range( weightSize ): weight = round( skinWeights[0][j],decimal ) if (weight > maxWeight): maxWeight = weight maxIndex = len(weightAr) weightAr.append(weight) total+=weight if total > 1: toRemove = total-1 weightAr[maxIndex] = maxWeight - toRemove elif total < 1: toAdd = 1-total weightAr[maxIndex] = maxWeight + toAdd position = cmds.listAttr(( skinCluster+'.weightList['+`a`+'].weights' ),multi=True ) for j in range( len(position )): cmds.setAttr((skinCluster+'.'+position[j]),float(weightAr[j] ))