Have you set up the node's attribute dependencies?
On Fri, Aug 13, 2010 at 9:04 AM, susanta <[email protected]> wrote:
> No luck :(. tried to connect currentChainLength (which is the output
> of my node) to another locator's tx plug....only get evalution once
> (opening file, or selecting my node in Attribute editor....i.e.
> external querry to worldMatrix plug)...here is the rough test code...
>
> class ChainLengthCalc(omx.MPxNode):
> kPluginNodeTypeName = "ChainLengthCalc"
> kPluginNodeTypeId = om.MTypeId(0xd1a9257)
> evalIndex = 0
> def __init__(self):
> omx.MPxNode.__init__(self)
>
> def compute(self,plug,dataBlock):
> if plug == self.currentChainLength:
> print "hello"
> ChainLengthCalc.evalIndex+=1
> currentLength = ChainLengthCalc.evalIndex
> ##self._getChainLength()
> outHandle =
> dataBlock.outputValue(self.currentChainLength)
> outHandle.setMDistance(om.MDistance(currentLength))
> dataBlock.setClean(self.currentChainLength)
> return om.MStatus.kSuccess
> return m.MStatus.kUnknownParameter
>
>
> @classmethod
> def creator(cls):
> return omx.asMPxPtr( cls() )
>
> @classmethod
> def initialize(cls):
> unitAttr = om.MFnUnitAttribute()
> cls.currentChainLength = \
> unitAttr.create("currentChainLength", "ccl",
> om.MFnUnitAttribute.kDistance, 0)
> unitAttr.setKeyable(False)
> unitAttr.setWritable(True)
> cls.addAttribute(cls.currentChainLength)
>
>
> mAttr = om.MFnMatrixAttribute()
> cls.drivingBoneMatrixAttr = mAttr.create( "drivingBoneMatrix",
> "dbm")
> mAttr.setStorable(True)
> mAttr.setWritable(True)
> cls.addAttribute(cls.drivingBoneMatrixAttr)
> cls.attributeAffects(cls.drivingBoneMatrixAttr,
> cls.currentChainLength)
>
> On Aug 13, 4:20 pm, Chad Vernon <[email protected]> wrote:
> > You need to have the output connected to something or else Maya will
> never
> > request a node compute. It only calculates nodes when it needs to. You
> > should be able to just use the worldMatrix just fine.
> >
> > Chad
> >
> > On Fri, Aug 13, 2010 at 8:11 AM, susanta <[email protected]> wrote:
> > > "worldmatrix is only updated on demand.."
> >
> > > Yea, That also I have speculated...
> >
> > > "Try instead hooking up to matrix and parentmatrix plugs of the node
> > > whose worldmatrix you want. They should get pushed to your node and
> > > then you can just concatenate them in compute() to get the world
> > > matrix."
> >
> > > My problem is little bit typical :). this is not about computing world
> > > matrix...say like, my node is connected in this order: NodeA -> NodeB-
> > > > NodeC->.......-> NodeD->MyNode. Now what I want to achieve, instaed
> > > of using any callback system use DAG system, to evalute myNode's
> > > compute block while any of the node in the hierarchy is changing
> > > trasform matrix. Now if I plugin parentmatrix / matrix from nodeD, I
> > > think if nodeD is affected then only it will evalute mynode....but not
> > > for other nodes up in the hierarchy. So to find a clean way I have
> > > tried to use worldMatrix of NodeD (as worldMatrix change is true for
> > > change in any depth) as I not want to plug with all other node's
> > > matrix in the hierarchy. But seems like I'm wrong :(...need to find a
> > > better solution. Any way thanks man.
> >
> > > On Aug 13, 3:10 pm, Adam Mechtley <[email protected]> wrote:
> > > > Iirc, worldmatrix is only updated on demand (eg, you getAttr on it or
> on
> > > a plug that depends on it). Try instead hooking up to matrix and
> > > parentmatrix plugs of the node whose worldmatrix you want. They should
> get
> > > pushed to your node and then you can just concatenate them in compute()
> to
> > > get the world matrix.
> >
> > > > Sent from my iPhone
> >
> > > > On Aug 13, 2010, at 6:44, susanta <[email protected]> wrote:
> >
> > > > > Hi Guys,
> >
> > > > > I'm trying to create a custom MPX node, which is doing some
> > > > > calculation based on a bone's scale in a hierarchy. So far my
> compute
> > > > > code is working properly. I want to run the compute block always if
> > > > > the any bone in the hierarchy got new world matrix (either by pos,
> rot
> > > > > or scale change). But what I'm getting here, worldmatrix attribute
> of
> > > > > a node not getting changed always untill you querry from outside
> (eg.
> > > > > through MEL). Below is my test code....I have a input matrix plug
> > > > > which connected to worlMatrix of a tranformNode. I expect when I'm
> > > > > scaling or moving position of the transform node...compute block of
> my
> > > > > node should get called...but not getting desired result...am I
> missing
> > > > > somthing?
> >
> > > > > Thanks
> > > > > Susanta
> >
> > > > > class ChainLengthCalc(omx.MPxNode):
> > > > > kPluginNodeTypeName = "ChainLengthCalc"
> > > > > kPluginNodeTypeId = om.MTypeId(0xd1a9257)
> > > > > def __init__(self):
> > > > > omx.MPxNode.__init__(self)
> >
> > > > > def compute(self,plug,dataBlock):
> > > > > if plug == self.currentChainLength:
> > > > > print "hello"
> > > > > return om.MStatus.kSuccess;
> > > > > return m.MStatus.kUnknownParameter;
> >
> > > > > @classmethod
> > > > > def creator(cls):
> > > > > return omx.asMPxPtr( cls() )
> >
> > > > > @classmethod
> > > > > def initialize(cls):
> > > > > unitAttr = om.MFnUnitAttribute()
> > > > > cls.currentChainLength = \
> > > > > unitAttr.create("currentChainLength", "ccl",
> > > > > om.MFnUnitAttribute.kDistance, 0)
> > > > > unitAttr.setKeyable(False)
> > > > > unitAttr.setWritable(False)
> > > > > cls.addAttribute(cls.currentChainLength)
> >
> > > > > mAttr = om.MFnMatrixAttribute()
> > > > > cls.drivingBoneMatrixAttr = mAttr.create(
> "drivingBoneMatrix",
> > > > > "dbm")
> > > > > mAttr.setStorable(True)
> > > > > mAttr.setWritable(True)
> > > > > cls.addAttribute(cls.drivingBoneMatrixAttr)
> >
> > > > > cls.attributeAffects(cls.drivingBoneMatrixAttr,
> > > > > cls.currentChainLength)
> >
> > > > > --
> > > > >http://groups.google.com/group/python_inside_maya
> >
> > > --
> > >http://groups.google.com/group/python_inside_maya
> >
> >
>
> --
> http://groups.google.com/group/python_inside_maya
>
--
http://groups.google.com/group/python_inside_maya