You could try setting the weights directly in the weightList[i].weight attribute of the deformer.
On Tue, Jan 26, 2010 at 8:55 AM, Brandon Harris <[email protected]>wrote: > actually ran into an issue similar to this one some skin weight tools > I was building. My errors seemed to come from maya attempting to > redraw the nurbs surface when the weights were changing, but I haven't > had the chance to explore the issue further. Would be good to get some > information from some more experienced API guys. Mine was using the > mfnSkinCluster and only crashed on multiple nurbs surface and most of > the time was only if I was using soft selection. > > Brandon L. Harris > > On Jan 25, 5:19 am, "Imre \"Public\" Tuske" <[email protected]> > wrote: > > Hiya, > > > > I'm currently working on (actually, finished) a small tool that transfers > > deformer weights from one deformer node to another (between objects of > > non-identical topologies, similar to the Transfer Attributes tool). > > > > I have a pointCloud class (i omit its code, but its very simple) which I > use > > for storing the deformer weights for each point. Then I have the > following: > > > > > --------------------------------------------------------------------------------------------------------------------------------- > > > > import pointCloud as PC # my own point cloud class > > > > > from maya.OpenMaya import * > > > > from maya.OpenMayaAnim import * > > > > > > > > > def getDeformerWeightsToPC(pc, deformer_name): > > > > """Get all per-vertex deformer weights to a point cloud.""" > > > > #assert type(pc) is pointCloud > > > > assert type(pc) is PC.pointCloud > > > > assert type(deformer_name) is str > > > > > print "getDeformerWeightsToPC() ..." > > > try: > > > > sel = MSelectionList() > > > > sel.add(deformer_name) > > > > > obj = MObject() > > > > sel.getDependNode(0, obj) > > > > > f = MFnWeightGeometryFilter(obj) > > > > num_connections = f.numOutputConnections() > > > > > for c in range(num_connections): > > > i = f.indexForOutputConnection(c) > > > shape_path = MDagPath() > > > > f.getPathAtIndex(i, shape_path) > > > > it = MItGeometry(shape_path) > > > > > print i, shape_path.fullPathName(), it.count() > > > w = MFloatArray() > > > while not it.isDone(): > > > > comp = it.currentItem() > > > > > p = it.position(MSpace.kWorld) > > > > p = (p[0], p[1], p[2]) > > > > f.getWeights(i, comp, w) > > > > > pc.addPoint(p, float(w[0])) > > > it.next() > > > pc.setName(deformer_name) > > > > > except Exception, e: > > > > print "failed to get weights from deformer:", type(e), e > > > > pass > > > > > > > > > def setDeformerWeightsFromPC(pc, deformer_name): > > > > assert type(pc) is PC.pointCloud > > > > assert type(deformer_name) is str > > > > > print "setDeformerWeightsToPC() ..." > > > try: > > > > sel = MSelectionList() > > > > sel.add(deformer_name) > > > > > obj = MObject() > > > > sel.getDependNode(0, obj) > > > > > f = MFnWeightGeometryFilter(obj) > > > > num_connections = f.numOutputConnections() > > > > > W = MFloatArray(1, 0.0) > > > for c in range(num_connections): > > > i = f.indexForOutputConnection(c) > > > shape_path = MDagPath() > > > > f.getPathAtIndex(i, shape_path) > > > > it = MItGeometry(shape_path) > > > > > print i, shape_path.fullPathName(), it.count() > > > while not it.isDone(): > > > > comp = it.currentItem() > > > > > print comp, comp.apiTypeStr() > > > p = it.position(MSpace.kWorld) > > > > p = (p[0], p[1], p[2]) > > > > > W[0] = pc.getValue(p) > > > > f.setWeight(shape_path, i, comp, W) > > > > > it.next() > > > > > except Exception, e: > > > > print "failed to set weights from deformer:", type(e), e > > > > pass > > > > > > > > > def transferDeformerWeights(): > > > > """A test function.""" > > > > > print "transferDeformerWeights() !!!" > > > pc = PC.pointCloud() > > > > getDeformerWeightsToPC(pc, "cluster1") > > > > setDeformerWeightsFromPC(pc, "cluster2") > > > > > --------------------------------------------------------------------------------------------------------------------------------- > > > > The above code works properly between polygon meshes. However once I try > to > > run it where I try to transfer TO (ie. do ::setWeights() on) nurbs > surfaces > > or curves _sharing the same deformer_, the code crashes Maya (it does an > > emergency save, which usually shows that the code ran successfully for > the > > first few CVs). > > > > So it crashes when I try it on: > > - a deformer, applied to multiple nurbs objects (be it curves or > surfaces); > > - if I run the function _more than once_ for a single nurbs object with a > > single deformer on it. > > > > Any help or idea would be appreciated > > > > imre > > > > -- > > [ Imre Tuske > > |http://blueriviera.wordpress.com/|<http://blueriviera.wordpress.com/%7C>mailto: > > [email protected] ] > > > > " On a horse made of crystal he patrolled the land > > With a mason ring and schnauzer in his perfect hands " > > -- > http://groups.google.com/group/python_inside_maya -- http://groups.google.com/group/python_inside_maya
