MDataHandle.setFloat()不会更改插件值

时间:2019-04-13 18:37:09

标签: python maya

使用Maya Python API 2.0,我正在尝试进行回调以更改插头的值。但是,我尝试过的所有方法都没有用。

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

现在我正在尝试以下操作,它使用数据句柄设置插件的值并对其进行清理:

df <- data.frame(id = sample(10e2),
                 V1 = sample(1:15, 10e2, replace = TRUE),
                 V2 = sample(2:16, 10e2, replace = TRUE),
                 V3 = sample(3:17, 10e2, replace = TRUE))

system.time({
  similar <- proxy::simil(df[, -1L], method="myfun")

  res <- combn(df$id, 2L)
  res <- data.frame(id_x=res[2L,], id_y=res[1L,])
  res$similar <- as.integer(similar)
})

   user  system elapsed 
   7.84    0.05    7.92

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

1 个答案:

答案 0 :(得分: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)