我遇到了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()
希望你能帮助我。
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)
轻松删除它。