Maya Script Python リスト内包表記でのウェイトの四捨五入 その2

前回に引き続き、リスト内包表記をテストしてみました。
コードを見なおしているうちに、ここはもっとまとめられるのではないか?
という事に気が付き、色々といじくり回してみました。
 

大分すっきりしました。相変わらず可読性は低いです。

import maya.cmds as cmds
import maya.mel
import math

def round_weight_test():
	oSel = cmds.ls( selection=True )
	oShp = oSel[0]
	gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' )
	oVcount = cmds.polyEvaluate( oSel, v=True )
	oSkt = cmds.listHistory( oShp )
	oCls = cmds.ls( oSkt, type= "skinCluster" )[0]
	oMxc = cmds.getAttr( oCls+".maxInfluences" )
	oVtx = cmds.ls( oShp + ".vtx[*]", fl=True )
	oRoundLen = 2
	cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Rounding...', maxValue=oVcount )
	[[cmds.progressBar(gMainProgressBar,e=1,s=1),cmds.skinPercent(oCls,v1,nrm=0,zri=1,tv=zip(*l1))] if sum(l1[1])==1.0 else [cmds.progressBar(gMainProgressBar,e=1,s=1),cmds.skinPercent(oCls,v1,nrm=0,zri=1,tv=zip(l1[0],[round(1.0-sum(l1[1][:-1]),oRoundLen) if i==len(l1[1])-1 else x for i,x in enumerate(l1[1])]))]
	for (v1,l1) in [[v,zip(*sorted(dict(zip(cmds.skinPercent(oCls,v,q=1,t= None),[round(w,oRoundLen) for w in cmds.skinPercent(oCls,v,q=1,v=1) if w>0.0])).items(),key=lambda x:x[1])[-oMxc:])]
	for v in oVtx]]
	cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
round_weight_test()

しかし、驚いたことに、前回の物よりも実行速度が遅くなる、、
分岐を減らしたからだろうか?短くすれば良い。というものでもないようです。
ああ、悔しい。
 

ウェイトエディタを更新しました。
前回のままだと、恐らく一つのシーンに同一名のオブジェクトがあるとうまく機能しないかと思います。
一応機能するようにしましたが、四捨五入はできるだけオブジェクト単位でしたほうが良いかと思います。
何でMayaはオブジェクトがシェイプノードとトランスフォームノードにわかれているのだろうか。
名前が取得しにくいです。
オブジェクトとしての移動値とそれ以外。という感じなのでしょうか。扱いにくいなぁ、、
もっとスマートな方法があるのだろうか。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です