Created
August 6, 2021 12:50
-
-
Save BigRoy/5db5b73ea6fc8d84cec48bec1cb6217f to your computer and use it in GitHub Desktop.
Maya Playblast Option Vars for "Playblast Display" options for viewport and some examples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from maya import cmds | |
# List all optionVars starting with "playblast" | |
# The ones for the Playblast Display start with "playblastShow" | |
# And the "playblastOverrideViewport" enables/disables them all together | |
vars = sorted([var for var in cmds.optionVar(list=True) if var.startswith("playblast")]) | |
for var in vars: | |
print var | |
# Set an optionVar | |
cmds.optionVar(intValue=("playblastOverrideViewport", True)) | |
# You can also set multiple at a time | |
options = { | |
"playblastOverrideViewport": True, | |
"playblastShowCVs": True, | |
"playblastShowCameras": True, | |
"playblastShowClipGhosts": True, | |
"playblastShowControllers": True, | |
"playblastShowDeformers": True, | |
"playblastShowDimensions": True, | |
"playblastShowDynamicConstraints": True, | |
"playblastShowDynamics": True, | |
"playblastShowFluids": True, | |
"playblastShowFollicles": True, | |
"playblastShowGreasePencil": True, | |
"playblastShowGrid": True, | |
"playblastShowHUD": True, | |
"playblastShowHairSystems": True, | |
"playblastShowHandles": True, | |
"playblastShowHoldOuts": True, | |
"playblastShowHulls": True, | |
"playblastShowIKHandles": True, | |
"playblastShowImagePlane": True, | |
"playblastShowJoints": True, | |
"playblastShowLights": True, | |
"playblastShowLocators": True, | |
"playblastShowMotionTrails": True, | |
"playblastShowNCloths": True, | |
"playblastShowNParticles": True, | |
"playblastShowNRigids": True, | |
"playblastShowNURBSCurves": True, | |
"playblastShowNURBSSurfaces": True, | |
"playblastShowOrnaments": True, | |
"playblastShowParticleInstancers": True, | |
"playblastShowPivots": True, | |
"playblastShowPlanes": True, | |
"playblastShowPluginShapes": True, | |
"playblastShowPolyMeshes": True, | |
"playblastShowSelectionHighlighting": True, | |
"playblastShowStrokes": True, | |
"playblastShowSubdivSurfaces": True, | |
"playblastShowTextures": True | |
} | |
cmds.optionVar(intValue=options.items()) | |
# Changing the values doesn't automatically update the show menu. | |
# You can force that with: | |
from maya import mel | |
mel.eval("rebuildShowMenu;") | |
# ---- | |
# Note that there are also "plugin display options" like 'gpuCache' | |
# for example. Those are stored in the optionVar "playblastShowPluginObjects" | |
# The option var might not exist - so be aware of that. | |
if cmds.optionVar(exists="playblastShowPluginObjects"): | |
# Note that this is an "EXCLUDE" list. So anything it returns | |
# are the filters that are disabled for showing | |
exclude = cmds.optionVar(query="playblastShowPluginObjects") | |
print exclude | |
# Enabling all plug-ins filters thus is as easy as clearing that optionVar's value | |
# So use EITHER of the following: | |
cmds.optionVar(clearArray="playblastShowPluginObjects") | |
cmds.optionVar(remove="playblastShowPluginObjects") | |
# And disabling all plug-in filters for showing can be done with | |
filters = cmds.pluginDisplayFilter(query=True, listFilters=True) | |
for filter in filters: | |
cmds.optionVar(stringValueAppend=("playblastShowPluginObjects", filter)) | |
Maya Playblast Show Overrides apply in Python context manager
Here's an example setup of writing a context manager to apply the playblast show overrides:
from maya import cmds
import contextlib
# This may need to account for backwards compatibility
# for an older maya release e.g. not supporting a particular
# modelEditor flag.
KWARG_TO_OPTIONVAR = {
"polymeshes": "playblastShowPolyMeshes",
"subdivSurfaces": "playblastShowSubdivSurfaces",
"planes": "playblastShowPlanes",
"lights": "playblastShowLights",
"cameras": "playblastShowCameras",
"joints": "playblastShowJoints",
"ikHandles": "playblastShowIKHandles",
"deformers": "playblastShowDeformers",
"dynamics": "playblastShowDynamics",
"particleInstancers": "playblastShowParticleInstancers",
"fluids": "playblastShowFluids",
"hairSystems": "playblastShowHairSystems",
"follicles": "playblastShowFollicles",
"nCloths": "playblastShowNCloths",
"nParticles": "playblastShowNParticles",
"nRigids": "playblastShowNRigids",
"dynamicConstraints": "playblastShowDynamicConstraints",
"locators": "playblastShowLocators",
"dimensions": "playblastShowDimensions",
"pivots": "playblastShowPivots",
"handles": "playblastShowHandles",
"textures": "playblastShowTextures",
"strokes": "playblastShowStrokes",
"motionTrails": "playblastShowMotionTrails",
"pluginShapes": "playblastShowPluginShapes",
"manipulators": "playblastShowManipulators",
"clipGhosts": "playblastShowClipGhosts",
"bluePencil": "playblastShowBluePencil",
"cv": "playblastShowCVs",
"hulls": "playblastShowHulls",
"grid": "playblastShowGrid",
"hud": "playblastShowHUD",
"hos": "playblastShowHoldOuts",
"sel": "playblastShowSelectionHighlighting",
"imagePlane": "playblastShowImagePlane",
}
def get_playblast_show_overrides() -> dict:
kwargs = {}
for kwarg, optionvar in KWARG_TO_OPTIONVAR.items():
if cmds.optionVar(exists=optionvar):
kwargs[kwarg] = cmds.optionVar(query=optionvar)
# Special behavior for `playblastShowPluginObjects`
plugin_objects = {}
if cmds.optionVar(exists="playblastShowPluginObjects"):
plugin_filters = cmds.pluginDisplayFilter(query=True, listFilters=True)
exclude = cmds.optionVar(query="playblastShowPluginObjects")
plugin_objects[filter] = show
for plugin in plugin_filters:
state = filter not in exclude
plugin_objects[plugin] = state
kwargs["pluginObjects"] = plugin_objects
return kwargs
def apply_overrides(model_editor: str, overrides: dict):
overrides = dict(overrides) # copy
plugin_objects = overrides.pop("pluginObjects", {})
for key, value in overrides.items():
cmds.modelEditor(model_editor, edit=True, **{key: value})
for plugin, state in plugin_objects.items():
cmds.modelEditor(panel, edit=True, pluginObjects=(plugin, state))
def get_model_editor_state(model_editor: str) -> dict:
kwargs = {}
for kwarg in KWARG_TO_OPTIONVAR:
value = cmds.modelEditor(model_editor, query=True, **{kwarg: True})
kwargs[kwarg] = value
# Incldue special plugin objects
plugins = cmds.pluginDisplayFilter(query=True, listFilters=True)
plugin_objects = {}
for plugin in plugins:
state = cmds.modelEditor(model_editor, query=True, queryPluginObjects=plugin)
plugin_objects[plugin] = state
kwargs["pluginObjects"] = plugin_objects
return kwargs
@contextlib.contextmanager
def apply_playblast_overrides(model_editor, force=False):
if not force and not cmds.optionVar(query="playblastOverrideViewport"):
yield
return
original_state = get_model_editor_state(model_editor)
overrides = get_playblast_show_overrides()
try:
apply_overrides(model_editor, overrides)
yield
finally:
apply_overrides(model_editor, original_state)
# Example usage
model_editor = cmds.playblast(activeEditor=True)
with apply_playblast_overrides(model_editor):
cmds.playblast()
However, this reaches a point where using something like maya-capture
library may make more sense.
Thank you for the extremely quick reply and for looking into it!
I'm glad that it's not just me that was surprised that this was not considered / tested.
Now I understand what is actually going on, and the solution you provided is exactly what I needed!
Thank you!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Testing in Maya 2026 I can confirm that behavior.
If you run mel script
performPlayblast 3;
it does apply the override.So let's figure out what it does:
Looking through that code it continues to go through
doPlayblastArgList
which is in another file:Which ends up going through
setModelEditorPlayblastViewVars
and (yay!) global procsetPlayblastViewVars
in that file.And more specifically wraps the playblasting like:
There is the unfortunate side effect that
setModelEditorPlayblastViewVars
is not a global procedure and hence can't be called from outside that mel script (AAARGH!).Anyway,
That should then run it... but it seems as usual, that nobody at Autodesk even tried running that global procedure, because:
Which is due to the global procedure being defined before the local procedure.
So yeah, non trivial to use... and buggy at best.
Also, it seems that show dynamics / particle instancers overrides isn't even correctly applied because the MEL script code does:
Which should be:
:)
If you want to use the 'show override' option vars in your custom logic, I'd recommend writing a context manager of your own in Python.