hi all,I write a custom node with a plug that can retrieve particle node's world position attribute (a vector array attibute) and for debuging i print out the array length of this attribute in compute(). Everything goes well during developing except when closing the scene and reopen it. We all know that as scene opened the compute() will be forced to run once, and i notice the first time evaluation of compute() give out a wrong array length (length = 0) but actually i already have several particle in scene. Why i get wrong array length in first compute() evaluation but correct array length after that ?
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
kPluginNodeId = OpenMaya.MTypeId(0x87013)
kPluginNodeTypeName = "Test"
class Test(OpenMayaMPx.MPxNode):
frameAttr = OpenMaya.MObject()
particleInAttr = OpenMaya.MObject()
particleOutAttr = OpenMaya.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, dataBlock):
if(plug == Test.particleOutAttr):
inputHandle = dataBlock.inputValue(Test.frameAttr)
frame = inputHandle.asFloat()
print "Frame:", frame
inputHandle = dataBlock.inputValue(Test.particleInAttr)
inParticlePos = inputHandle.data()
vectorArrayFn = OpenMaya.MFnVectorArrayData(inParticlePos)
inPosArray = vectorArrayFn.array()
particleAmount = inPosArray.length()
# Why 0 when open file ???
print "Particle Amount:", inPosArray.length()
def nodeCreator():
return OpenMayaMPx.asMPxPtr(Test())
def nodeInitializer():
tAttr = OpenMaya.MFnTypedAttribute()
nAttr = OpenMaya.MFnNumericAttribute()
Test.frameAttr = nAttr.create("frame", "frm", OpenMaya.MFnNumericData.kFloat)
nAttr.setKeyable(False)
nAttr.setReadable(False)
Test.addAttribute(Test.frameAttr)
vectorArrayDataFn = OpenMaya.MFnVectorArrayData()
inVectorArray = OpenMaya.MVectorArray()
vectorArrayDataFn.create(inVectorArray)
Test.particleInAttr = tAttr.create("particleInPos", "ptip", OpenMaya.MFnData.kVectorArray, vectorArrayDataFn.object())
tAttr.setReadable(False)
tAttr.setHidden(True)
Test.addAttribute(Test.particleInAttr)
outVectorArray = OpenMaya.MVectorArray()
vectorArrayDataFn.create(outVectorArray)
Test.particleOutAttr = tAttr.create("particleOutPos", "ptop", OpenMaya.MFnData.kVectorArray, vectorArrayDataFn.object())
tAttr.setWritable(False)
tAttr.setHidden(True)
Test.addAttribute(Test.particleOutAttr)
Test.attributeAffects(Test.frameAttr, Test.particleOutAttr)
Test.attributeAffects(Test.particleInAttr, Test.particleOutAttr)
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode(kPluginNodeTypeName, kPluginNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write("Failed to register node: %s" % kPluginNodeTypeName)
raise
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode(kPluginNodeId)
except:
sys.stderr.write("Failed to deregister node: %s" % kPluginNodeTypeName)
raise