MDataHandle.setFloat()不会更改Plug值

问题描述 投票:0回答:1

使用Maya Python API 2.0,我正在尝试进行一个更改插件值的回调。但是,我尝试过的方法都没有奏效。

我尝试过使用MPlug.setFloat()方法,但这并没有导致预期的结果;我发现插件的值没有变化。我认为这没用,因为我需要在更改其值后清理插头。因此,我尝试使用MPlug.asDataHandle()方法获取插件的数据句柄,然后使用数据句柄的datablock()方法,以便使用数据句柄和数据块来设置插件的值并清理它。但是,在使用MDataHandle.datablock()时,我收到一条错误消息“RuntimeError:(kFailure):Unexpected Internal Failure”。

现在我正在尝试以下方法,它使用数据句柄来设置插件的值并清理它:

def setPlugFloatValue(node, plugName, val):
    fnSet = OpenMaya.MFnDependencyNode(node)
    plug = fnSet.findPlug(plugName,True)
    handle = plug.asMDataHandle()
    handle.setFloat(val)
    handle.setClean()

上述函数旨在查找节点中的某个插件,然后使用其数据句柄设置其值并进行清理。在我的程序中,回调使用此函数来更改节点子节点的translateX,translateY和translateZ插件。回调在应用它的节点的转换值发生变化时运行。在我用于测试此回调的场景中,我将回调应用于多边形网格对象,其中一个子对象也是多边形网格对象。因此,当我翻译父对象时,我希望其子代的翻译值能够改变。但是当我在翻译其父对​​象后选择子对象时,其翻译值没有改变。

python maya
1个回答
0
投票

尝试了你的例子,并在插头上使用setFloat(),看起来工作正常。

import maya.api.OpenMaya as OpenMaya

def setPlugFloatValue(node, plugName, val):
    fnSet = OpenMaya.MFnDependencyNode(node)
    plug = fnSet.findPlug(plugName,True)
    plug.setFloat(val)

def applyToSelectedObjects():
    sl_list = OpenMaya.MGlobal.getActiveSelectionList()
    iterator = OpenMaya.MItSelectionList(sl_list)

    while not iterator.isDone():
        obj = iterator.getDependNode()
        setPlugFloatValue(obj, "translateX", -2.0)
        iterator.next()

applyToSelectedObjects()

也许你的问题是别的吗?您也可以尝试使用setMDistance(),但它在我的测试中没有任何区别。

distance = OpenMaya.MDistance(val)
plug.setMDistance(distance)
© www.soinside.com 2019 - 2024. All rights reserved.