Как использовать intField для установки значений в переменную

Представляя, что я новичок в python, я попытаюсь использовать команду intField, чтобы установить количество итераций для этого атрибута: "aiSubdivIterations".

Сценарий должен работать так: когда я запускаю сценарии, он открывает окно, в котором я могу установить свое значение, и когда я нажимаю ввод, он должен автоматически устанавливать то же значение в слоте "aiSubdivIterations".

import maya.cmds as pm

def aiSetIter(iterValue):   
    objSelect= pm.ls(sl=1, dag=True, leaf=True)
    for obj in objSelect:
        pm.setAttr( obj + '.aiSubdivIterations', iterValue)

pm.window(title = 'Interations')
pm.columnLayout ('mainColumn', adjustableColumn = True)
pm.gridLayout ('nameGridLayout01', numberOfRowsColumns = (2,2), cellWidthHeight = (80,30), parent = 'mainColumn')
pm.text (label = 'number')
pm.intField (minValue=0, maxValue=10, step=1, vcc = 'aiSetIter(iterValue)')
pm.showWindow()

Может ли кто-нибудь помочь сделать этот скрипт работающим?

заранее спасибо

Flavia

1 ответ

Самый простой для работы вашего сценария - просто указать функцию, которую вы хотите вызвать (без аргументов и остальной части кода без изменений):

pm.intField('valueField', minValue=0, maxValue=10, step=1, vcc=aiSetIter)

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

Если вам нужно, чтобы ваша функция вызывалась при каждом изменении значения, вы также хотите добавить флаг "changeCommand" (или "cc"):

pm.intField('valueField', minValue=0, maxValue=10, step=1, vcc=aiSetIter, cc=aiSetIter)

Для более сложных сценариев вы можете рассмотреть лямбда-функции (вы можете прочитать здесь хороший пост об этом); это позволит отложить оценку вашей функции. Ниже приведен очень простой пример лямбда-функции, которая извлекает текущее время, когда изменяется значение intField, и передает его вместе с самим значением в myLambdaFunc:

import maya.cmds as pm
import time

def myLambdaFunc(iterValue, now):
    print iterValue, now

lambdafunc = lambda arg: myLambdaFunc(arg, time.time())

pm.window(title='Iterations')
pm.columnLayout ('mainColumn', adjustableColumn=True)
pm.gridLayout ('nameGridLayout01', numberOfRowsColumns=(2,2), cellWidthHeight=(80,30), parent='mainColumn')
pm.text (label='number')
pm.intField('valueField', minValue=0, maxValue=10, step=1, vcc=lambdafunc, cc=lambdafunc)
pm.showWindow(win)

РЕДАКТИРОВАТЬ:

Небольшая интеграция, так как я столкнулся с этим только сейчас: https://theodox.github.io/2014/maya_callbacks_cheat_sheet

Это полезная и исчерпывающая статья theodox о пользовательском интерфейсе Maya и обратных theodox, найденная через него; Стоит прочитать.

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