2015-10-23 1 views
1

У меня есть сценарий, который просит пользователя выбрать ось симметрии, используя флажки. Затем я хочу использовать этот результат в другой функции для создания инструмента зеркалирования. До сих пор, когда я пытаюсь запросить флажок Я получаю следующее сообщение об ошибке:maya python получение и использование результата checkbox

RuntimeError: file line 81: Object xAxisBox not found

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

xAxisBox = cmds.checkBox(l="x") 
    yAxisBox = cmds.checkBox(l="y") 
    zAxisBox = cmds.checkBox(l="z") 
    btAxis=cmds.button(label = "Do the thing!", command = "Blendy();") 

    def Blendy(): 

    xCheck = cmds.checkBox('xAxisBox', query=True, value = True) 
    yCheck = cmds.checkBox('yAxisBox', query=True, value = True) 
    zCheck = cmds.checkBox('zAxisBox', query=True, value = True) 
    print xCheck 
    print yCheck 
    print zCheck 
+1

Это в целом более безопасным и гибким, чтобы передать функции команды непосредственно, как объект питона, а не с помощью строки. Этот код не будет работать, если вы обернете его внутри функции. Подробнее здесь: http://techartsurvival.blogspot.com/2014/04/maya-callbacks-cheat-sheet.html – theodox

ответ

3

У меня нет майя, поэтому я не могу проверить это для вас, но, глядя на ответ на another question, похоже, что вы должны использовать фактические переменная питон без кавычек (т.е. xAxisBox вместо 'xAxisBox'), как это:

xCheck = cmds.checkBox(xAxisBox, query=True, value = True) 
0

Если вы используете CMDS вы можете ссылаться на HARDCODED имена Ui:

xAxisBox = cmds.checkBox("xAxisBox", l="x") 
yAxisBox = cmds.checkBox("yAxisBox", l="y") 
zAxisBox = cmds.checkBox("zAxisBox", l="z") 
btAxis = cmds.button(label="Do the thing!", command=Blendy) 

def Blendy(): 

    xCheck = cmds.checkBox('xAxisBox', query=True, value=True) 
    yCheck = cmds.checkBox('yAxisBox', query=True, value=True) 
    zCheck = cmds.checkBox('zAxisBox', query=True, value=True) 
    print xCheck 
    print yCheck 
    print zCheck 

но с pymel вы можете попробовать это без жесткого кодирования:

xAxisBox = pm.checkBox(l="x") 
yAxisBox = pm.checkBox(l="y") 
zAxisBox = pm.checkBox(l="z") 
btAxis = pm.button(
    label="Do the thing!", 
    command=pm.Callback(Blendy, 
         xAxis, yAxis, zAxis) 
    ) 

def Blendy (xbox, ybox, zbox): 

    xCheck = cmds.checkBox(str(xbox), query=True, value=True) 
    yCheck = cmds.checkBox(str(ybox), query=True, value=True) 
    zCheck = cmds.checkBox(str(zbox), query=True, value=True) 
    print xCheck 
    print yCheck 
    print zCheck 

вы можете импортировать pymel import pymel.core as pm

, но если вы будете использовать pymel я рекомендовал бы, чтобы переписал Blendy функции, как:

def Blendy(xbox, ybox, zbox): 
    print xbox.getValue(), ybox.getValue(), zbox.getValue() 

и, наконец, вы можете использовать класс для хранения значений

и ответ от neelz с другого ресурса:с помощью модуля partial схема, как с Callback:

from functools import partial 
cmds.checkBox(onCommand=partial(func_without_parenthesizes, arg, arg)) 
+0

если вам нужно передать ключевые аргументы Callback вы можете сделать это так: ybox = cmds.checkBox ( onCommand = pm.Callback (cmds.checkBox, xbox, ** {"e": True, "value": True}), offCommand = pm.Callback (cmds.checkBox, xbox, ** { "e": True, "value": False}) ) – bafly