Ben Traje
← Back to maya

Automating Maya Display Layers: Rename and Group Objects with Python

18 Sep 26 (1mo ago)

Managing display layers in Autodesk Maya can quickly become disorganized, especially when handling complex scenes or rigs. Standardizing naming conventions and organizing hierarchies are essential steps in a professional 3D pipeline.

In this guide, we will look at a concise Python solution using maya.cmds to automate two tedious tasks: standardizing display layer names and auto-grouping the objects within them.

1. Standardizing Layer Names

Consistency is key in production. The following script iterates through all display layers in your Maya scene, converts their names to lowercase, and appends a _layer suffix. It also includes safety checks to ignore the locked defaultLayer and any referenced layers.

import maya.cmds as cmds

def rename_layers_lowercase_suffix():
    layers = cmds.ls(type='displayLayer')
    
    print("--- Processing Layers ---")

    for layer in layers:
        # Skip default and referenced layers
        if layer == "defaultLayer" or cmds.referenceQuery(layer, isNodeReferenced=True):
            continue

        lower_name = layer.lower()

        # Add suffix safely to avoid duplicates like "prop_layer_layer"
        if not lower_name.endswith("_layer"):
            new_name = f"{lower_name}_layer"
        else:
            new_name = lower_name

        if layer != new_name:
            try:
                if cmds.objExists(new_name):
                    print(f"Skipping {layer}: '{new_name}' already exists.")
                else:
                    cmds.rename(layer, new_name)
                    print(f"Renamed: {layer} -> {new_name}")
            except RuntimeError as e:
                print(f"Error renaming {layer}: {e}")

rename_layers_lowercase_suffix()

2. Auto-Grouping Objects by Layer

Once your layers are neatly named, you might want to translate that organization into your Outliner hierarchy.

This second script iterates through your newly renamed layers, strips the _layer suffix to find the base name, creates an empty group named basename_grp, and automatically parents all objects from the layer into this new group.

import maya.cmds as cmds

def group_layer_objects():
    layers = cmds.ls(type='displayLayer')
    
    print("--- Grouping Layer Objects ---")

    for layer in layers:
        if layer == "defaultLayer" or cmds.referenceQuery(layer, isNodeReferenced=True):
            continue

        # Extract base name by removing "_layer" suffix
        if layer.endswith("_layer"):
            base_name = layer[:-6]
        else:
            base_name = layer
            
        grp_name = f"{base_name}_grp"

        # Retrieve objects assigned to the layer
        layer_members = cmds.editDisplayLayerMembers(layer, query=True, fullNames=True)
        if not layer_members:
            continue

        # Filter for transform nodes (ignore shapes)
        objects_to_move = cmds.ls(layer_members, type='transform', long=True)
        if not objects_to_move:
            continue

        # Create the group at world origin if it doesn't exist
        if not cmds.objExists(grp_name):
            cmds.group(empty=True, name=grp_name)
            print(f"Created Group: {grp_name}")
        
        # Parent objects to the new group
        try:
            cmds.parent(objects_to_move, grp_name)
            print(f"Moved {len(objects_to_move)} objects into {grp_name}")
        except Exception as e:
            print(f"Could not move objects for {layer}. Error: {e}")

group_layer_objects()

Why Use This Workflow?

By utilizing these two scripts, 3D artists and riggers can instantly conform messy scenes to strict naming conventions and clean up the Outliner hierarchy without dragging and dropping dozens of items manually.