如何使用intField将值设置为变量

时间:2017-06-22 11:39:48

标签: python maya

介绍我是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 个答案:

答案 0 :(得分:0)

最简单的脚本工作方法是只指定要调用的函数(不带参数,其余代码保持不变):

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

您可以假设Maya的intField将通过自动传递它存储的值来调用指定的函数。 在上述情况下,您的功能将是called only when the UI is made visible or closed

如果您需要在每次值更改时调用您的函数,您也想添加"changeCommand" (or "cc") flag

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

对于更复杂的场景,您可能需要考虑 lambda函数(您可以阅读here一篇关于它的好文章);这将允许延迟评估您的功能。 下面是 lambda函数的一个超级简单示例,它检索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关于通过this找到的Maya用户界面和回调的有用且详尽的文章;值得一读。