使用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插件。应用于节点的转换值更改时,将运行回调。在用于测试此回调的场景中,我将该回调应用于一个多边形网格对象,并带有一个孩子,该孩子也是一个多边形网格对象。因此,当我翻译父对象时,我希望它的子对象的翻译值会改变。但是当我在转换其父对象之后选择子对象时,其转换值没有改变。
答案 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)