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

Reply via email to