Получение, хранение, установка и изменение атрибутов преобразования через PyMel

Я работаю над тем, что получает и сохраняет преобразования объекта, перемещенного пользователем, а затем позволяет пользователю нажать кнопку, чтобы вернуться к значениям, установленным пользователем.

До сих пор я выяснил, как получить атрибут и установить его. Тем не менее, я могу получить и установить только один раз. Есть ли способ сделать это несколько раз в скрипте, запущенном один раз? Или я должен продолжать повторять сценарий? Это жизненно важный вопрос для меня, чтобы кристально ясно.

в принципе:

btn1 = button(label="Get x  Shape", parent = layout, command ='GetPressed()')    
btn2 = button(label="Set x Shape", parent = layout, command ='SetPressed()')
def GetPressed():
    print gx #to see value
    gx = PyNode( 'object').tx.get() #to get the attr
def SetPressed(): 
    PyNode('object').tx.set(gx) #set the attr???

Я не на 100% о том, как сделать это правильно, или я иду правильным путем?

Спасибо

1 ответ

Вы не передаете переменную gx так SetPressed() потерпит неудачу, если вы запустите его как написано (это может работать спорадически, если вы попытались выполнить gx = ... линия непосредственно в слушателе, прежде чем запустить все это - но это будет ошибочно). Вам нужно будет указать значение в вашем SetPressed() функция, так что операции набора есть что работать.

Кроме того, использование имен строк для вызова функций кнопок не является хорошим способом - ваш код будет работать при выполнении из слушателя, но не будет работать, если он объединен в функцию: когда вы используете имя строки для функций Maya найдет их только в том случае, если они живут в глобальном пространстве имен - вот куда отправляются ваши команды слушателя, но из других функций их трудно достать.

Вот минимальный пример того, как сделать это, сохранив все функции и переменные внутри другой функции:

import maya.cmds as cmds
import pymel.core as pm

def example_window():

    # make the UI

    with pm.window(title = 'example') as w:
        with pm.rowLayout(nc =3 ) as cs:
            field = pm.floatFieldGrp(label = 'value', nf=3)
            get_button = pm.button('get')
            set_button = pm.button('set')

    # define these after the UI is made, so they inherit the names
    # of the UI elements

    def get_command(_):
        sel = pm.ls(sl=True)
        if not sel:
            cmds.warning("nothing selected")
            return
        value = sel[0].t.get() + [0]
        pm.floatFieldGrp(field, e=True, v1= value[0], v2 = value[1], v3 = value[2])


    def set_command(_):
        sel = pm.ls(sl=True)
        if not sel:
            cmds.warning("nothing selected")
            return
        value = pm.floatFieldGrp(field, q=True, v=True)
        sel[0].t.set(value[:3])


    # edit the existing UI to attech the commands.  They'll remember the UI pieces they
    # are connected to 

    pm.button(get_button, e=True, command = get_command)
    pm.button(set_button, e=True, command = set_command)

    w.show()

#open the window
example_window()

В общем, именно такая штука самая сложная в работе с Maya GUI - вам нужно убедиться, что все функции, обработчики и т. Д. Видят друг друга и могут обмениваться информацией. В этом примере функция делится информацией, определяя обработчики после того, как UI существует, чтобы они могли наследовать имена частей UI и знать, над чем работать. Есть и другие способы сделать это (классы самые сложные и сложные), но это минималистский способ сделать это. Здесь есть более глубокое погружение о том, как это сделать.

Другие вопросы по тегам