具有返回变量功能Maya Python的ScriptJob

问题描述 投票:0回答:1

我遇到了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个回答
0
投票
可以通过三种方法将参数传递给回调函数。

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)轻松删除它。
© www.soinside.com 2019 - 2024. All rights reserved.