MDataHandle.setFloat () не меняет значение плагина - PullRequest
0 голосов
/ 13 апреля 2019

Используя Maya Python API 2.0, я пытаюсь сделать обратный вызов, который изменяет значение плагина. Однако ни один из методов, которые я пробовал, не работает.

Я пытался использовать метод MPlug.setFloat (), но это не привело к ожидаемым результатам; Я не нашел изменений в значении плагина. Я подумал, что это не сработало, потому что мне нужно было почистить вилку после изменения ее значения. Затем я попытался получить дескриптор данных плагина с помощью метода MPlug.asDataHandle (), а затем с помощью метода datablock () дескриптора данных, чтобы использовать дескриптор данных и блок данных для установки значения плагина и его очистки. Тем не менее я получил сообщение об ошибке «RuntimeError: (kFailure): неожиданный внутренний сбой» при использовании MDataHandle.datablock ().

Теперь я пытаюсь сделать следующее, используя дескриптор данных, чтобы установить значение плагина и очистить его:

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 дочерних узлов узла. Обратный вызов выполняется, когда значение translate узла, к которому он применяется, изменяется. В сцене, которую я использую для проверки этого обратного вызова, я применяю обратный вызов к объекту с полигональной сеткой, с одним дочерним объектом, который также является объектом с полигональной сеткой. Поэтому, когда я перевожу родительский объект, я ожидаю, что значения translate его потомка изменятся. Но когда я выбираю дочерний объект после перевода его родителя, его значения перевода не изменились.

1 Ответ

0 голосов
/ 17 апреля 2019

Пробовал ваш пример и использовал 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)
...