为了账号安全,请及时绑定邮箱和手机立即绑定

具有返回变量函数 Maya Python 的 ScriptJob

具有返回变量函数 Maya Python 的 ScriptJob

Go
千万里不及你 2022-10-25 14:42:57
我在使用 Maya 的 scriptJob 命令时遇到问题:如果我将 scriptJob 设置为不带参数的函数,一切正常,但如果我需要将变量传递给将由 scriptJob 执行的函数,则会返回此错误:#Error: TypeError: file <maya console> line 5: Invalid arguments for flag 'ac'.  Expected ( string, string or function ), got [ str, NoneType ]#代码非常简单,我只想了解为什么会这样。import maya.cmds as cmdsdef a():    cube = "pCube1"    cmds.scriptJob(ac = ["pCube2.translateY", delete(cube)])    return cubedef delete(cube):    cmds.delete(cube)cube = a()a()希望您能够帮助我。
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

有 3 种方法可以将参数传递给回调函数。


1:

您可以使用partial. 这通常用于自定义接口事件,例如Qt传递参数,您可以在此处执行相同的概念:


from functools import partial

import maya.cmds as cmds



def delete_cube(cube):

    if cmds.objExists(cube):

        cmds.delete(cube)



cube = "pCube1"

cid = cmds.scriptJob(ac=["pCube2.translateY", partial(delete_cube, cube)])

2:

与第一种方法类似,另一种流行的方法是使用lambda. 唯一的好处是它是一个内置命令,不需要导入任何模块,但它的语法可能一目了然不太可读:


import maya.cmds as cmds



def delete_cube(cube):

    if cmds.objExists(cube):

        cmds.delete(cube)



cube = "pCube1"

cid = cmds.scriptJob(ac=["pCube2.translateY", lambda x=cube: delete_cube(x)])

3:

或者您可以将其作为字符串传递,但如果参数本身是字符串,则需要正确格式化参数,包括其引号:


import maya.cmds as cmds



def delete_cube(cube):

    if cmds.objExists(cube):

        cmds.delete(cube)



cube = "pCube1"

cid = cmds.scriptJob(ac=["pCube2.translateY", "delete_cube('{}')".format(cube)])

您不一定必须使用,您可以使用or.format连接字符串。就我个人而言,我更喜欢第一种方法,因为它感觉更干净,更省事。+%partial

一些结束语:

  • 在您的回调函数中,您应该包含一个条件检查,cmds.objExists以确保您要删除的内容确实存在,否则它将引发错误。

  • 不要忘记将结果捕获到cmds.scriptJob一个变量中,以便您以后可以轻松地删除它cmds.scriptJob(kill=cid)


查看完整回答
反对 回复 2022-10-25
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信