-
-
Save BigRoy/5db5b73ea6fc8d84cec48bec1cb6217f to your computer and use it in GitHub Desktop.
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)) | |
Firstly, thank you for this clear summary.
I was wondering if you've used this is in a scripted environment before?
The playblast overwrite settings only seem to apply when playblasting manually.
As soon as I run the python or mel playblast command it seems to fall back on the actual viewport settings.
I've tested this in maya 2022 and 2025. Nobody seems to have mentioned this behaviour before, as far as I can find.
So I was wondering what your experience is with the override.
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:
whatIs performPlayblast;
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2026/scripts/others/performPlayblast.mel
Looking through that code it continues to go through doPlayblastArgList
which is in another file:
whatIs doPlayblastArgList;
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2026/scripts/others/doPlayblastArgList.mel
Which ends up going through setModelEditorPlayblastViewVars
and (yay!) global proc setPlayblastViewVars
in that file.
And more specifically wraps the playblasting like:
getModelEditorViewVars($modelEd);
setModelEditorPlayblastViewVars($modelEd);
$result = evalEcho($cmd); // <--- this is the playblast call
restoreModelEditorViewVars($modelEd);
return fromNativePath($result);
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,
// Ensure the commands are loaded
source doPlayblastArgList;
// Run the (active viewport) initialization
setPlayblastViewVars();
That should then run it... but it seems as usual, that nobody at Autodesk even tried running that global procedure, because:
// Error: file: C:/Program Files/Autodesk/Maya2026/scripts/others/doPlayblastArgList.mel line 285: Cannot find procedure "setModelEditorPlayblastViewVars".
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:
modelEditor -e -dynamics `optionVar -query playblastShowDynamics` $modelEd;
modelEditor -e -dynamics `optionVar -query playblastShowParticleInstancers` $modelEd;
Which should be:
modelEditor -e -dynamics `optionVar -query playblastShowDynamics` $modelEd;
modelEditor -e -particleInstancers `optionVar -query playblastShowParticleInstancers` $modelEd;
:)
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.
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!
More details on the
optionVar
command in Maya documentation.Messing a lot with Maya playblasts? Also look into maya-capture!