Correct . However it is expensive(for a dev) to do it that way when you know 
you can just use one unsigned int that get assigned in every call of 
setdepdirty()  , and it goes also with the fact that you only have to worry 
about one attribute change at a time , and it is not necessary to store every 
indices like that , the use of MArrayDataHandle::jumpToArrayElement() with 
MArrayDataHandle::elementIndex() is a recommended combo to iterate over the 
array of compounds/element even in the documentation , and you will need to 
call MDataBlock::inputArrayValue() once you are in compute anyway so … this 
m_element_index thing is just here so I know what element is tingling so that I 
don’t have to do expensive complete calculations, it’s lazy evaluation if you 
want


Sent from Mail for Windows 10

From: Rob Engle
Sent: Saturday, March 17, 2018 7:40 PM
To: Python Programming for Autodesk Maya
Subject: Re: [Maya-Python] Why most people use boolean flags insteadofcatching 
the MPlug ?

My question is slightly off topic to this thread but motivated by the posted 
code sample...

I was under the impression that setDependentsDirty can be called any number of 
times with different arguments before compute is called (if ever). This would 
mean that storage of m_element_index (or caching of any information from 
setDependentsDirty) would need to store more than just the one call.  This 
could be solved by making m_element_index an array of cached values and compute 
handling all of them.  Is this right?

Rob

On Saturday, March 17, 2018 at 7:03:16 AM UTC-7, justin hidair wrote:
 
/*in the boolean flag case :
lets say aDistance and aAmount are both child of a compound in an array of 
compound*/
MStatus myclass::setDependentsDirty(const MPlug &plug, MPlugArray &affect)
{
                mayastream << "dirtying. .." << "\n";
 
        if(plug.isChild() && plug.attribute() == aDistance )
        {
                e_distance_change= true ;
                /*get index to target this attribute specifically will be
                useful with MArrayDataHandle*/
                m_element_idx = plug.parent().logicalIndex();
        }
        else
        if(plug.isChild() && plug.attribute() == aAmount )
        {
                
                e_amount_change= true ;
                /*get index to target this attribute specifically will be
               useful with MArrayDataHandle*/
                m_element_idx = plug.parent().logicalIndex();
        }
 
    return MPxNode::setDependentsDirty(plug , affect );
    
}
MStatus myclass::compute(...)
{
    //typical moves:
    cmp_array = datablock.inputArrayValue(aArray);
    if( e_distance_change == true )
    {
    /*    perform targeted calculations
            use cmp_array.jumpToElement(m_element_idx)*/
    }
    else
    if(e_amount_change == true )
    {
        /*perform targeted calculations
            use cmp_array.jumpToElement(m_element_idx)*/
 
    }
//...
}
 
/*in the use Plug case :
lets say aDistance and aAmount are both child of a compound in an array of 
compound*/
MStatus myclass::setDependentsDirty(const MPlug &plug, MPlugArray &affect)
{
                mayastream << "dirtying. .." << "\n";
 
        m_dirty_plug = plug;     
                /*just one line and we can use the plug however we want
                the benefit is we also have all the methods of MPlug
                like .isConnected and so on , aslong as the method stay ) const 
                we can use it in compute without a problem...
                we can use this to get index in array : 
                m_dirty_plug.parent().logicalIndex();
                now to compute() ... */
 
    return MPxNode::setDependentsDirty(plug , affect );
    
}
MStatus myclass::compute(...)
{
    //things I never saw:
    cmp_array = datablock.inputArrayValue(aArray);
    if(m_dirty_plug.isChild() && m_dirty_plug.attribute() == aDistance )  
    {
        /*perform targeted calculations
        use all the cool const methods of MPlug
        use cmp_array.jumpToElement(m_dirty_plug.parent().logicalIndex())*/
    }
    else
    if(m_dirty_plug.isChild() && m_dirty_plug.attribute() == aAmount)
    {
        /*perform targeted calculations
        use all the cool const methods of MPlug
        use cmp_array.jumpToElement(m_dirty_plug.parent().logicalIndex())*/
 
    }
    /*...
    optionnaly at the end you can if you want reset  m_dirty_plug with 
    m_dirty_plug.setMObject(MObject::kNullObj) but it's not really required 
because it
    will be reassigned ... it allow to use .isNull() in particular cases tho
    lot of things you can do with just a plug instead of 4 boolean flags, it's 
also 
    way easier to maintain*/
}
 
 
-- 
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 python_inside_maya+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/07e1f6bd-6c6e-4225-8d2f-6c85e758676a%40googlegroups.com.
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 python_inside_maya+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/5aad739d.04191c0a.a6f51.09e0%40mx.google.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to