Maya自定义推/放松脚本

时间:2017-07-05 11:51:37

标签: python maya mel

我正在尝试制作一个复制/模仿Maya Sculpt Geometry Tool的自定义脚本。基本上我有2个单选按钮,Push和Relax [显然模仿了雕刻参数的推动和放松],一个值滑块[复制最大位移滑块]。收音机和重置按钮工作正常但是我在编码滑块方面遇到了问题。这个有什么帮助吗?提前谢谢。

请参阅图片以获得进一步说明。 Click here for image

这是我的代码:

import maya.cmds as cmds
import maya.mel as mel


if cmds.window("cusWin", exists = True):
    cmds.deleteUI("cusWin")



customwindow = cmds.window("cusWin",t= "Push/Relax", wh = (200, 117), s= False, mnb= False, mxb= False)
cmds.frameLayout( label='Push/Relax Modifier', borderStyle='in', cll= False)
cmds.columnLayout(adj = True, columnOffset= ("both", 3))


cmds.radioCollection()
cmds.radioButton(l = "Push", onc= "mel.eval('artUpdatePuttyOperation artPuttyCtx push ;')")
cmds.radioButton(l = "Relax", onc= "mel.eval('artUpdatePuttyOperation artPuttyCtx relax ;')")

cmds.separator(style= "none", h= 3)

DynFsgCol1 = 30
DynFsgCol2 = 50
DynFsgCol3 = 100

valSlider = cmds.floatSliderGrp(l = "Value", field = True, min = 0, max= 5, precision = 4, cw3= (DynFsgCol1, DynFsgCol2, DynFsgCol3 ))
cmds.separator(style= "none", h= 3)

cmds.rowColumnLayout(numberOfColumns=2, columnWidth=[(1,98),(2,100)], columnOffset=[(1,'left',1),(2,'right',95)])
cmds.button(l = "Apply", w= 92, c= 'slider()')
cmds.button(l = "Reset", w= 91, c= 'resetButton()')

cmds.showWindow( customwindow )


def slider():
    valueSlider = cmds.floatSliderGrp(valSlider, q= True, value= True)
    mel.eval('artPuttyCtx -e -maxdisp valueSlider `currentCtx`;')

def resetButton():
    mel.eval('resetTool artPuttyContext;')

1 个答案:

答案 0 :(得分:0)

这里有两件不同的事情。

首先,通过使用字符串形式的回调,您将无法控制函数的范围。最好直接传递python对象。这个版本使用回调看起来像你打算做的那样:     import maya.cmds as cmds     导入maya.mel as mel

if cmds.window("cusWin", exists = True):
    cmds.deleteUI("cusWin")



customwindow = cmds.window("cusWin",t= "Push/Relax", wh = (200, 117), s= False, mnb= False, mxb= False)
cmds.frameLayout( label='Push/Relax Modifier', cll= False)
cmds.columnLayout(adj = True, columnOffset= ("both", 3))


cmds.radioCollection()
push = lambda _: cmds.artPuttyCtx(cmds.currentCtx(), e = True,  mtm='push')
relax = lambda _: cmds.artPuttyCtx(cmds.currentCtx(), e = True, mtm='relax')



cmds.radioButton(l = "Push", onc= push)
cmds.radioButton(l = "Relax", onc=relax)

cmds.separator(style= "none", h= 3)

DynFsgCol1 = 30
DynFsgCol2 = 50
DynFsgCol3 = 100

valSlider = cmds.floatSliderGrp(l = "Value", field = True, min = 0, max= 5, precision = 4, cw3= (DynFsgCol1, DynFsgCol2, DynFsgCol3 ))
cmds.separator(style= "none", h= 3)
cmds.rowColumnLayout(numberOfColumns=2, columnWidth=[(1,98),(2,100)], columnOffset=[(1,'left',1),(2,'right',95)])

# put the defs here, where the names of the slider are known
def slider(*_):
    valueSlider = cmds.floatSliderGrp(valSlider, q = True, value = True)
    cmds.artPuttyCtx(cmds.currentCtx(), e = True,  maxdisp = valueSlider)

def resetButton(*_):
    cmds.resetTool(cmds.currentCtx())

cmds.button(l = "Apply", w= 92, c= slider)
cmds.button(l = "Reset", w= 91, c= resetButton)

cmds.showWindow( customwindow )

需要注意的是,定义内容的顺序允许您引用您所创建的控件的名称。 (顺便说一下,你需要处理Maya传递的按钮和滑块回调的无意义参数)。如果你想在未来使这个工具变得更加复杂,那么如果你必须同时使用两种语言,则更难以清理悬挂的梅尔脚本也是一个好主意。在这种情况下,artUpdatePuttyOperation看起来像是在雕刻工具UI打开时定义的,因此如果您在没有UI的情况下运行此脚本,我认为它不会正常工作。

第二个问题是,您没有明确设置artPuttyCtx setTool,因此除非用户已经创建了正确的上下文并将其激活,否则这将无效。