具有 return 个变量的 ScriptJob 函数 maya Python

ScriptJob with return variables function maya Python

我 运行 遇到了 Maya 的 scriptJob 命令的问题:如果我为一个没有参数的函数创建一个 scriptJob,一切正常,但如果我需要将一个变量传递给该函数,它将由 scriptJob 执行它 returns 这个错误:

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

希望你能帮助我。

有 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) 轻松删除它。