Python в Maya - значение флажка Query

Я супер новичок в Python, и у меня есть небольшой проект свободного времени. И я не могу найти решение следующей проблемы:

Я настроил графический интерфейс, как это:

flWin = mc.window(title="Foot Locker", wh=(210,85))
mc.columnLayout()
mc.text(label='Frame Range')
rangeField = mc.intFieldGrp(numberOfFields=2,value1=0, value2=0)
mc.rowColumnLayout(numberOfRows=2)
translateBox = mc.checkBox(label='Translation',value=True)
mc.button(label="Bake it!", w=60, command="Bake()")
rotateBox = mc.checkBox(label='Rotation',value=True)
mc.button(label='Key it!', w=60, command='Key()')
scaleBox = mc.checkBox(label='Scale')
mc.showWindow(flWin)

а затем позже, внутри функции 'Bake' id, как запросить флажки, чтобы сделать разные вещи, в зависимости от того, какие флажки установлены... как это:

    translateValue = mc.checkBox(translateBox, query=True)
    rotateValue = mc.checkBox(rotateBox, query=True)
    scaleValue = mc.checkBox(scaleBox, query=True)

    if scaleValue = True:          
        if rotateValue = True:     
            if translateValue = True:
                mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint')
                mc.scaleConstraint('LockCator', Selection, n='selectionScale')

            else:
               mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint', skipTranslate=True) 
               mc.scaleConstraint('LockCator', Selection, n='selectionScale')


bla bla bla... you get the trick...

когда я пытаюсь запустить скрипт, я получаю сообщение о том, что в строке указан неверный синтаксис if scaleValue = True:

я также попытался использовать это:

mc.attributeQuery(translateBox,value=True) 

но это дает мне ошибку, говоря, что значение является недопустимым флагом... я не знаю, что это значит.

Некоторая помощь здесь будет принята с благодарностью! Спасибо, парни!

2 ответа

Вы были близки, флаг запроса просто говорит команде, что вы хотите получить данные, а не устанавливать, что бы вы ни ставили в очередь, должно также появиться в той же команде, вы просто пропускаете v=True флаг для полей.

translateValue = mc.checkBox(translateBox, query=True, value=True)
rotateValue = mc.checkBox(rotateBox, query=True, value=True)
scaleValue = mc.checkBox(scaleBox, query=True, value=True)

Кроме того, если вы объединяете свои команды if, поскольку ваше значение может быть только true или false, вы можете просто написать if (scaleValue): что то же самое, что писать if scaleValue == True:

if (scaleValue):
    if (rotateValue):     
        if (translateValue):
            mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint')
            mc.scaleConstraint('LockCator', Selection, n='selectionScale')
        else:
            mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint', skipTranslate=True) 
            mc.scaleConstraint('LockCator', Selection, n='selectionScale')

Еще лучше, поскольку вы делаете в основном то же самое для этих цепочек, мы можем упростить это:

skipTrans = True if scaleValue and rotateValue and translateValue else False
mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint', skipTranslate=skipTrans) 
mc.scaleConstraint('LockCator', Selection, n='selectionScale')

Выше точно так же, как код выше этого кода.

Надеюсь, что это поможет, как и @jonathon, то, как вы написали свой пользовательский интерфейс, может стать очень запутанным и трудным для чтения, безусловно, прочитанным в QT Designer, это замечательная программа.

Если я правильно понимаю ваш вопрос, все, что вам нужно сделать, это включить оба query а также value флаги, например:

import maya.cmds as mc

flWin = mc.window(title="Foot Locker", wh=(210,85))
mc.columnLayout()
mc.text(label='Frame Range')
rangeField = mc.intFieldGrp(numberOfFields=2,value1=0, value2=0)
mc.rowColumnLayout(numberOfRows=2)
translateBox = mc.checkBox(label='Translation',value=True)
mc.button(label="Bake it!", w=60, command="Bake()")
rotateBox = mc.checkBox(label='Rotation',value=True)
mc.button(label='Key it!', w=60, command='Key()')
scaleBox = mc.checkBox(label='Scale')
mc.showWindow(flWin)

print mc.checkBox(scaleBox, q=True, v=True)

возвращается True

при запросе элемента пользовательского интерфейса необходимо перевести команду в режим запроса, а затем также указать значение для запроса, в данном случае это значение. Таким образом, у вас были все элементы, но не одновременно!

Это странное поведение, я знаю, но когда вы понимаете, как работает MEL и его эквивалентная команда, это имеет больше смысла.

Также, если я правильно помню, теперь вы можете использовать PySide (библиотеку Python Qt) внутри Python Maya, что звучит как гораздо лучшая идея для программного создания пользовательского интерфейса. Если вам нужен более простой способ создания пользовательского интерфейса Maya, вы также можете использовать Qt Designer для создания .ui файл, который Maya может загрузить во время выполнения.

Например, чтобы создать окно из пользовательского интерфейса:

# first delete window if it already exists
if (cmds.window('window_name', exists=True)):
    cmds.deleteUI('window_name')
window = cmds.loadUI('my_window.ui'))
cmds.showWindow(window)

Чтобы сделать запрос к пользовательскому интерфейсу, просто убедитесь, что в Qt Designer заданы уникальные имена для элементов пользовательского интерфейса, а затем сделайте запрос, как вы делали до сих пор.

Для получения дополнительной информации об использовании Qt Designer с Maya смотрите эту замечательную страницу:

http://www.creativecrash.com/maya/tutorials/scripting/mel/c/using-qt-designer-for-mel-interfaces

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