在设置DependentsDirty()期间,脏插头仍然具有旧值

Dirtied plug still has the old value during setDependentsDirty()

本文关键字:DependentsDirty 设置 期间      更新时间:2023-10-16

当我弄脏一个输入插件(例如mFileAttr)时,setDependentsDirty()会被正确调用,但fileName插件的值仍然是旧值!我只看到它在通过compute()后才会更新。我如何访问setDependentsDirty()函数中的新值,因为它确实是由插件值更新触发的?

MStatus FNode::setDependentsDirty(const MPlug& plug, MPlugArray& plugArray) {
    if (plug == mFileAttr)
    { 
        MPlug fileNamePlug(thisMObject(), plug);
        MString fileName = fileNamePlug.asString();
    }
    return MPxNode::setDependentsDirty(plug, plugArray); }

编辑:只是为了澄清,读取插头值本身plug.asString(),它仍然保持旧值。

如果你仔细查看文档,你会发现为什么你没有得到更新的值

"重要提示:由于setDependentsDirty()方法是在脏传播期间调用的,因此您必须小心不要在例程中执行任何依赖关系图计算。相反,如果您想知道plug的值,请使用MDataBlock::outputValue(),因为它不会导致计算(从而导致递归)。通常用户将要实现的方法应该只涉及固定的关系。在极少数情况下,您需要查看plug值,请注意{MDataBlock::outputValue()}的警告,并使用包含在脏传播开始之前已知最新值的plug。"