ScriptJob с функцией возврата переменных maya Python - PullRequest
0 голосов
/ 27 апреля 2020

У меня проблема с командой scriptJob из Maya: если я сделаю 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 Ответ

0 голосов
/ 28 апреля 2020

Существует 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, вы можете объединить строки с + или %. Лично я предпочитаю 1-й метод с partial, так как он выглядит чище с меньшим количеством суеты.

Несколько заключительных замечаний:

  • В функцию обратного вызова вы должны включить условную проверку с помощью cmds.objExists, чтобы убедиться, что то, что вы собираетесь удалить, действительно существует, в противном случае оно выдаст ошибку.
  • Не забудьте записать результат cmds.scriptJob в переменную, чтобы вы могли легко удалить его позже с cmds.scriptJob(kill=cid).
...