1

我对 python 超级陌生,我有这个小业余时间项目正在进行。而且我找不到以下问题的解决方案:

我设置了一个这样的 GUI:

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) 

但这给了我一个错误,说“价值”是一个无效的标志……我不知道那是什么意思。

非常感谢这里的一些帮助!多谢你们!

4

2 回答 2

3

你已经接近了,查询标志只是告诉你想要获取数据的命令,而不是设置,无论你在做什么,都必须出现在同一个命令中,你只是缺少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 命令的地方,看到您的值只能是真或假,您可以简单地编写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 也提供的那样,您编写 UI 的方式可能会变得非常混乱且难以阅读,肯定会读入 QT Designer,这是一个很棒的程序。

于 2013-10-01T05:11:28.457 回答
0

如果我正确理解您的问题,您需要做的就是同时包含queryvalue标志,例如:

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

查询 UI 元素时,您需要将命令置于查询模式,然后还提供要查询的值,在本例中为值。所以你不是同时拥有所有元素!

我知道这种行为很奇怪,但是当您了解 MEL 及其等效命令的工作原理时,它就更有意义了。

另外,如果我没记错的话,您现在可以在 Maya python 中使用 PySide(一个 python Qt 库),这对于以编程方式创建 ui 来说是一个更好的主意。如果您追求更简单的方法来创建 Maya 用户界面,您还可以使用 Qt Designer 构建一个.uiMaya 可以在运行时加载的文件。

例如从 ui 文件创建一个窗口:

# 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)

要查询 ui,只需确保在 Qt Designer 中为 ui 元素提供唯一名称,然后像您迄今为止所做的那样查询它们。

有关将 Qt Designer 与 Maya 结合使用的更多信息,请参阅此页面:

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

于 2013-09-30T23:56:24.450 回答