Hi Enrico,
actually you can access to all geometry data also from a MPxNode, maybe is
also more easy.
In my opinion if you don't need build a deformer, is better use a node.
A rivet node, is also quite simple to do, you need just few geometry datas
so, my suggestion it's go with a node =)
For access to all mesh functions you need get an handle to your MObject, in
my case aInMesh:

[CODE]
# inputMesh
aInMesh = OpenMaya.MObject()
[/CODE]

For example this is my compute node:
[CODE]
# Node compute
    def compute(self, plug, data):
        thisNode = uberRivetNode.thisMObject(self)

        inputMeshPlug = OpenMaya.MPlug(thisNode, uberRivetNode.aInMesh)

        if not inputMeshPlug.isConnected():
            return OpenMaya.kNotImplemented

        ...
        ...

        # Get handle to inputMesh
        inputMesh = data.inputValue(uberRivetNode.aInMesh).asMesh()
[/CODE]

[CODE]
# Get handle to inputMesh
inputMesh = data.inputValue(uberRivetNode.aInMesh).asMesh()
[/CODE]

And after you can get mesh functions with:

[CODE]
fnMesh = OpenMaya.MFnMesh(inputMesh)
[/CODE]

If you have any questions, just ask

Cheers

Leonardo







2014-07-30 1:21 GMT+02:00 Enrico Losavio <[email protected]>:

> Hi everyone!
>
> I'm trying to write a sort of River node, but I ran into some difficulties
> (obviously :) ) and any help would be greatly appreciated!
>
> Basically i want a DG node that can
>
>    - accept geometry as an input
>    - retrieve mesh information
>    - make up his own calculations based on the mesh information and a few
>    custom attributes
>    - have an array of MPoints (or k3Double i guess) as output to be piped
>    into each locator
>    - have the output updated every time an attribute or the mesh itself
>    changes
>
> As far as I know, the MPxDeformerNode is the only way to access the
> geometry data. But I don't want to deform the mesh, just query information.
> And yet I don't fully understand how the push-pull mechanism works in this
> case. In a custom DG node i would use the "if plug == attribute" to force
> the evaluation, but in this case...?
> I've already jot down the basic structure for the node, but it doesn't
> work as it should.
> In Maya I loaded the plugin, applied the deformer to a simple cube, and
> fed each value of the array into the Translate attribute of specifically
> created locators (that thus went in the correct position, one on each
> vertex)
> If I tweak the mesh, the locators remain in the same position, don't
> follow the vertices. If I change the value of the positionOffset attribute,
> nothing happens.
> But I noticed that if i tweak the mesh and then change the value of the
> attribute, the position of all the locators suddenly updates as though the
> mesh is read properly, but the positionOffset value remains the previous
> one.
>
> Here's a simplified version of the code I wrote...:
>
> class AttachToMesh(OMMPx.MPxDeformerNode):
>
>
>     mObj_positionOffset = OM.MObject()
>     mObj_outPosition = OM.MObject()
>
>
>     def __init__(self):
>         OMMPx.MPxDeformerNode.__init__(self)
>
>
>     def deform(self, dataBlock, geoIterator, matrix, geometryIndex):
>
>         # RETRIEVE GEOMETRY DATA
>         input = OMMPx.cvar.MPxDeformerNode_input
>         dataHandleInputArray = dataBlock.outputArrayValue(input)
>         dataHandleInputArray.jumpToElement(geometryIndex)
>         dataHandleInputElement = dataHandleInputArray.outputValue()
>
>         inputGeom = OMMPx.cvar.MPxDeformerNode_inputGeom
>         dataHandleInputGeom = dataHandleInputElement.child(inputGeom)
>         inMesh = dataHandleInputGeom.asMesh()
>
>
>         # POSITION OFFSET
>         dataHandlePositionOffset = dataBlock.inputValue(AttachToMesh.
> mObj_positionOffset)
>         positionOffsetValue = dataHandlePositionOffset.asFloat()
>
>         # OUT POSITION
>         dataHandleArrayOutPosition = dataBlock.outputArrayValue(
> AttachToMesh.mObj_outPosition)
>         dataBuilderOutPosition = dataHandleArrayOutPosition.builder()
>
>         vertexPosition = OM.MPoint()
>         mFnMesh = OM.MFnMesh(inMesh)
>
>         normals = OM.MFloatVectorArray()
>         mFnMesh.getVertexNormals(False, normals)
>
>
>         while not geoIterator.isDone():
>
>
>             vertexPosition.x = geoIterator.position().x + ( normals[
> geoIterator.index()].x * positionOffsetValue )
>             vertexPosition.y = geoIterator.position().y + ( normals[
> geoIterator.index()].y * positionOffsetValue )
>             vertexPosition.z = geoIterator.position().z + ( normals[
> geoIterator.index()].z * positionOffsetValue )
>
>             dataHandleOutPosition = dataBuilderOutPosition.addElement(
> geoIterator.index())
>             dataHandleOutPosition.set3Double(vertexPosition.x,
> vertexPosition.y, vertexPosition.z)
>
>             geoIterator.next()
>
>         dataHandleArrayOutPosition.set(dataBuilderOutPosition)
>
>         #here I'm not sure which setClean function I'm supposed to use...
> in this case I chose dataBlock.setClean
>         #dataHandleArrayOutPosition.setAllClean()
>
>         dataBlock.setClean(AttachToMesh.mObj_outPosition)
>
>
> def nodeInitializer():
>     mFnAttr = OM.MFnNumericAttribute()
>
>
>     AttachToMesh.mObj_positionOffset = mFnAttr.create("positionOffset",
> "posOff", OM.MFnNumericData.kFloat, 0.0)
>     mFnAttr.setKeyable(1)
>
>     AttachToMesh.mObj_outPosition = mFnAttr.create("outPosition", "outPos"
> , OM.MFnNumericData.k3Double, 0.0)
>     mFnAttr.setKeyable(0)
>     mFnAttr.setWritable(0)
>     mFnAttr.setArray(1)
>     mFnAttr.setUsesArrayDataBuilder(1)
>
>     AttachToMesh.addAttribute(AttachToMesh.mObj_outPosition)
>
>     AttachToMesh.attributeAffects(AttachToMesh.mObj_positionOffset,
> AttachToMesh.mObj_outPosition)
>
>
>
> Thank you in advance for any reply!!
>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Python Programming for Autodesk Maya" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/python_inside_maya/1e1a201e-452c-4f97-bb73-4abc120f5430%40googlegroups.com
> <https://groups.google.com/d/msgid/python_inside_maya/1e1a201e-452c-4f97-bb73-4abc120f5430%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/CAGw4rjsWfHnVRy3yb8Zk4b8J2dpBUkDv9DeiSwf4fG4vyhC%2BqQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to