【问题标题】:ScriptJob with return variables function maya Python具有返回变量函数 Maya Python 的 ScriptJob
【发布时间】:2020-08-10 21:11:34
【问题描述】:

我在使用 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 cmds

def a():
    cube = "pCube1"
    cmds.scriptJob(ac = ["pCube2.translateY", delete(cube)])
    return cube

def delete(cube):
    cmds.delete(cube)

cube = a()
a()

希望你能帮助我。

【问题讨论】:

    标签: python scripting maya mel


    【解决方案1】:

    有 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)])
    

    您不一定非得使用.format,您可以将字符串与+% 连接起来。就我个人而言,我更喜欢使用partial 的第一种方法,因为它感觉更干净,更少大惊小怪。

    一些结束语:

    • 在您的回调函数中,您应该使用cmds.objExists 进行条件检查,以确保您要删除的内容确实存在,否则会引发错误。
    • 不要忘记在变量中捕获cmds.scriptJob 的结果,以便以后使用cmds.scriptJob(kill=cid) 轻松删除它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多