【问题标题】:MDataHandle.setFloat() isn't changing Plug valueMDataHandle.setFloat() 没有改变 Plug 值
【发布时间】:2019-04-17 21:41:52
【问题描述】:

使用 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】:

    尝试了您的示例并在插头上使用了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)
    

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多