/************************************************************ * * TOI Scene Cleaner * * Author: T. Welman, TOI TU Delft, october 2008 * version 1.0 * * This script provides a library of (custom) cleaning functions for * your Maya scene: * Remove Empty Groups, Remove shapes from layers, etc * * * Usage: * 1. Load the script (source script) * 2. Launch the interface using the command: toi_sceneCleaner(); * */ // make sure the windows are reset at load, so the UI is always up-to-date if ( `window -exists toi_sceneCleaner_window` ) { deleteUI toi_sceneCleaner_window; } global proc toi_sceneCleaner ( ) { if ( !`window -exists toi_sceneCleaner_window` ) { window -t "TOI Scene Cleaner" -w 300 -h 400 -retain toi_sceneCleaner_window; columnLayout -rs 5 toi_bt_controlsCol; radioButtonGrp -label "Use:" -nrb 2 -cw3 60 100 100 -la2 "Selection" "All" -sl 2 toi_sceneCleaner_mode; button -w 220 -label "Remove Empty Groups" -c "toi_sc_removeEmptyGroups()"; button -w 220 -label "Remove Shapes from layers" -c "toi_sc_removeShapesFromLayers()"; button -w 220 -label "Remove Groups from layers" -c "toi_sc_removeGroupsFromLayer()"; setParent ..; } showWindow toi_sceneCleaner_window; } global proc toi_sc_removeEmptyGroups () { int $mode = `radioButtonGrp -q -sl toi_sceneCleaner_mode`; string $transforms[]; if ( $mode == 1 ) { $transforms = `ls -long -transforms -sl`; } else if ( $mode == 2 ) { $transforms = `ls -long -transforms`; } toi_deleteEmptyGroups($transforms); } global proc toi_sc_removeShapesFromLayers () { int $mode = `radioButtonGrp -q -sl toi_sceneCleaner_mode`; string $shapes[]; if ( $mode == 1 ) { $shapes = `ls -long -sl -leaf -dag -shapes`; } else if ( $mode == 2 ) { $shapes = `ls -long -leaf -dag -shapes`; } toi_removeNodesFromLayer( $shapes ); } global proc toi_sc_removeGroupsFromLayer () { int $mode = `radioButtonGrp -q -sl toi_sceneCleaner_mode`; string $grps[],$tr,$transforms[]; int $c; if ( $mode == 1 ) { $transforms = `ls -long -sl -allPaths -dag -transforms`; } else if ( $mode == 2 ) { $transforms = `ls -long -allPaths -dag -transforms`; } for ( $tr in $transforms ) { if ( toi_nodeHasShapes($tr) == 0 ) { // node has no shape. We assume it's a group $grps[$c++] = $tr; } } toi_removeNodesFromLayer($grps); } global proc string[] toi_getNodeLayers ( string $node ) { return `listConnections -s 1 -d 0 -type displayLayer ($node+".drawOverride")`; } global proc int toi_nodeHasShapes ( string $node ) { /* determines if a node has shape children; can be used to determine whether it's a group */ string $rel[] = `listRelatives -children -shapes $node`; return size($rel); } global proc toi_removeNodesFromLayer ( string $nodes[] ) { string $node,$layer[]; for ( $node in $nodes ) { $layer = toi_getNodeLayers($node); if ( size($layer) > 0 && isConnected( ($layer[0]+".drawInfo") , ($node+".drawOverride") ) ) { disconnectAttr ($layer[0]+".drawInfo") ($node+".drawOverride"); } } } global proc toi_deleteEmptyGroups ( string $nodes[] ) { string $trname, $shapenodes[], $tr_wos[]; int $p = 0; // pointer for the array int $num_deleted = 1; waitCursor -state true; while ( $num_deleted > 0 ) { for ( $trname in $nodes ) { if ( objExists($trname) ) { //list the shapenodes for this transform $shapenodes = `listRelatives -shapes $trname`; if ( size($shapenodes) == 0 ) { $tr_wos[$p++] = $trname; } } } $num_deleted = toi_deleteEmptyTransforms($tr_wos); clear($tr_wos); $p = 0; } waitCursor -state false; } global proc int toi_deleteEmptyTransforms( string $obj[] ) { string $filter = "locator[0-9]+$"; // regexp tot filter out stuff (e.g: empty locator nodes(can go normally as well) string $objname; string $relatives[]; int $count=0; string $m; for ( $objname in $obj ) { $relatives = `listRelatives $objname`; if ( size($relatives) == 0 ) { //print ("\n" + size($relatives) + " relatives in " + $objname); $m = match($filter,$objname); if ( size($m) > 0 ) { //print ( "NOT deleting " + $objname + "\n" ); } else { print ( "// deleting " + $objname + "\n"); delete $objname; $count++; } } } return $count; }