使用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插件。回调在应用它的节点的转换值发生变化时运行。在我用于测试此回调的场景中,我将回调应用于多边形网格对象,其中一个子对象也是多边形网格对象。因此,当我翻译父对象时,我希望其子代的翻译值能够改变。但是当我在翻译其父对象后选择子对象时,其翻译值没有改变。
尝试了你的例子,并在插头上使用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)