This commit is contained in:
2025-11-23 23:31:18 +08:00
parent d60cdc52fd
commit 9f7667a475
710 changed files with 252869 additions and 6 deletions

View File

@@ -0,0 +1,89 @@
from copy import deepcopy
PYTHON = 'python'
MEL = 'mel'
PYTHON_TARGETS_VARIABLE = """\
import animation_tools.dwpicker as dwpicker
__targets__ = [{targets}]
if dwpicker.get_shape('{shape_id}'):
__shape__ = dwpicker.get_shape('{shape_id}').options
else:
__shape__ = None
{code}
"""
MEL_TARGETS_VARIABLE = """\
string $targets[] = {{{targets}}};
{code}
"""
DEFERRED_PYTHON = """\
from maya import cmds
cmds.evalDeferred(\"\"\"{code}\"\"\", lowestPriority=True)
"""
DEFERRED_MEL = """\
evalDeferred "{code}" -lowestPriority;"""
STACK_UNDO_PYTHON = """\
from maya import cmds
cmds.undoInfo(openChunk=True)
{code}
cmds.undoInfo(closeChunk=True)
"""
STACK_UNDO_MEL = """\
undoInfo -openChunk;
{code}
undoInfo -closeChunk;
"""
EXECUTION_WARNING = """\
Code execution failed for {object}: "{name}"
{error}.
"""
def execute_code(
language, code, shape=None, deferred=False, compact_undo=False):
return EXECUTORS[language](code, shape, deferred, compact_undo)
def execute_python(
code, shape=None, deferred=False, compact_undo=False):
if compact_undo:
code = STACK_UNDO_PYTHON.format(code=code)
if deferred:
code = DEFERRED_PYTHON.format(code=code)
targets = (shape.targets() or []) if shape else []
targets = ', '.join(('"{}"'.format(target) for target in targets))
shape_id = shape.options['id'] if shape else None
code = PYTHON_TARGETS_VARIABLE.format(
targets=targets, shape_id=shape_id, code=code)
exec(code, globals())
def execute_mel(code, shape=None, deferred=False, compact_undo=False):
from maya import mel
if compact_undo:
code = STACK_UNDO_MEL.format(code=code)
if deferred:
print('Eval deferred not supported for mel command.')
# code = DEFERRED_MEL.format(code=code)
targets = (shape.targets() or []) if shape else []
if targets:
targets = ', '.join(
'"{}"'.format(target) for target in shape.targets())
code = MEL_TARGETS_VARIABLE.format(targets=targets, code=code)
mel.eval(code.replace(u'\u2029', '\n'))
EXECUTORS = {
PYTHON: execute_python,
MEL: execute_mel,
}