Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save BigRoy/5db5b73ea6fc8d84cec48bec1cb6217f to your computer and use it in GitHub Desktop.
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
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))
@BigRoy
Copy link
Author

BigRoy commented May 20, 2025

@BertPlasschaert

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.

@BertPlasschaert
Copy link

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