Skip to content

Instantly share code, notes, and snippets.

@utatsuya
Created August 29, 2015 14:19
Show Gist options
  • Save utatsuya/a95afe3c5523ab61e61b to your computer and use it in GitHub Desktop.
Save utatsuya/a95afe3c5523ab61e61b to your computer and use it in GitHub Desktop.
# python api2.0 setWeights(),setWeight()
# http://ueta.hateblo.jp/entry/2015/08/24/102937
import time
import maya.api.OpenMaya as OpenMaya2
import maya.api.OpenMayaAnim as OpenMayaAnim2
#_time = time.time
_time = time.clock
SKINCLUSTER = "skinCluster1"
MESHSHAPE = "TestMeshShape"
msg = "Python API 2.0"
startTime = _time()
def n( name ):
sellist = OpenMaya2.MGlobal.getSelectionListByName( name )
try:
return sellist.getDagPath(0)
except:
return sellist.getDependNode(0)
# スキンクラスタ取得
skinNode = n( SKINCLUSTER )
skinFn = OpenMayaAnim2.MFnSkinCluster( skinNode )
# シェイプの取得
meshPath = n( MESHSHAPE )
meshNode = meshPath.node()
# 取得対象の頂点
# 今回はすべての頂点を取得したいので[0,1,2,,,,,MaxVertex]となっている。
meshVerItFn = OpenMaya2.MItMeshVertex( meshNode )
indices = range( meshVerItFn.count() )
# 指定の頂点をコンポーネントとして取得する。
singleIdComp = OpenMaya2.MFnSingleIndexedComponent()
vertexComp = singleIdComp.create( OpenMaya2.MFn.kMeshVertComponent )
singleIdComp.addElements( indices )
# setWeights()で指定するためのインフルエンスIntArrayを作成
infDags = skinFn.influenceObjects()
infIndexes = OpenMaya2.MIntArray( len( infDags ) , 0 )
for x in xrange( len( infDags ) ):
infIndexes[x] = int( skinFn.indexForInfluenceObject( infDags[x] ) )
# すべてのウエイトの値を取得
s = _time()
weightData = skinFn.getWeights( meshPath , vertexComp )
get = _time() - s
print msg, "getWeights()", get, "s"
# 最初に取得したウエイトを再設定
s = _time()
skinFn.setWeights( meshPath , vertexComp , infIndexes , weightData[0] )
set = _time() - s
print msg, "setWeights()", set, "s"
total = _time() - startTime
print msg, "(Total Time)", total, "s"
print msg, "(etc)", (total - get - set), "s"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment