Получение, хранение, установка и изменение атрибутов преобразования через 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 и знать, над чем работать. Есть и другие способы сделать это (классы самые сложные и сложные), но это минималистский способ сделать это. Здесь есть более глубокое погружение о том, как это сделать.