mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-02 00:44:52 +01:00
Improve lib.polyConstraint performance when Select tool is not the active tool context
This commit is contained in:
parent
d9bdf007b8
commit
b30629866a
1 changed files with 46 additions and 11 deletions
|
|
@ -745,6 +745,33 @@ def namespaced(namespace, new=True):
|
|||
cmds.namespace(set=original)
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def maintained_selection_api():
|
||||
"""Maintain selection using the Maya Python API.
|
||||
|
||||
Warning: This is *not* added to the undo stack.
|
||||
|
||||
"""
|
||||
original = om.MGlobal.getActiveSelectionList()
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
om.MGlobal.setActiveSelectionList(original)
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def tool(context):
|
||||
"""Set a tool context during the context manager.
|
||||
|
||||
"""
|
||||
original = cmds.currentCtx()
|
||||
try:
|
||||
cmds.setToolTo(context)
|
||||
yield
|
||||
finally:
|
||||
cmds.setToolTo(original)
|
||||
|
||||
|
||||
def polyConstraint(components, *args, **kwargs):
|
||||
"""Return the list of *components* with the constraints applied.
|
||||
|
||||
|
|
@ -763,17 +790,25 @@ def polyConstraint(components, *args, **kwargs):
|
|||
kwargs.pop('mode', None)
|
||||
|
||||
with no_undo(flush=False):
|
||||
with maya.maintained_selection():
|
||||
# Apply constraint using mode=2 (current and next) so
|
||||
# it applies to the selection made before it; because just
|
||||
# a `maya.cmds.select()` call will not trigger the constraint.
|
||||
with reset_polySelectConstraint():
|
||||
cmds.select(components, r=1, noExpand=True)
|
||||
cmds.polySelectConstraint(*args, mode=2, **kwargs)
|
||||
result = cmds.ls(selection=True)
|
||||
cmds.select(clear=True)
|
||||
|
||||
return result
|
||||
# Reverting selection to the original selection using
|
||||
# `maya.cmds.select` can be slow in rare cases where previously
|
||||
# `maya.cmds.polySelectConstraint` had set constrain to "All and Next"
|
||||
# and the "Random" setting was activated. To work around this we
|
||||
# revert to the original selection using the Maya API. This is safe
|
||||
# since we're not generating any undo change anyway.
|
||||
with tool("selectSuperContext"):
|
||||
# Selection can be very slow when in a manipulator mode.
|
||||
# So we force the selection context which is fast.
|
||||
with maintained_selection_api():
|
||||
# Apply constraint using mode=2 (current and next) so
|
||||
# it applies to the selection made before it; because just
|
||||
# a `maya.cmds.select()` call will not trigger the constraint.
|
||||
with reset_polySelectConstraint():
|
||||
cmds.select(components, r=1, noExpand=True)
|
||||
return cmds.polySelectConstraint(*args,
|
||||
mode=2,
|
||||
returnSelection=True,
|
||||
**kwargs)
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue