summaryrefslogtreecommitdiffstats
path: root/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel
diff options
context:
space:
mode:
Diffstat (limited to 'tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel')
-rw-r--r--tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel381
1 files changed, 381 insertions, 0 deletions
diff --git a/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel
new file mode 100644
index 0000000..c939c2d
--- /dev/null
+++ b/tools/MayaTools/Maya4.0/scripts/SimpsonsArt/forceUniqueNames.mel
@@ -0,0 +1,381 @@
+//===========================================================================
+// Copyright ©2002 Radical Entertainment Ltd. All rights reserved.
+//
+// Created: 26 March, 2002
+//
+// Description: Forces unique names for all nodes in the scene, and ensures
+// that each Shape node derives its name (and numerical suffix)
+// from its Transform.
+//
+// Constraints:
+//
+// Creator: Bryan Ewert
+//
+//===========================================================================
+
+//===========================================================================
+// version
+//===========================================================================
+// Description: Returns the current version for this MEL script.
+// Used for version control.
+//
+// Constraints:
+//
+//===========================================================================
+proc float version()
+{
+ return ( 1.1 ); // 01 May 2002
+}
+
+//===========================================================================
+// depth
+//===========================================================================
+// Description: Determines the depth of the specified DAG; e.g. the depth
+// for "|group1|transform2|transformShape2" is 3.
+//
+// Constraints:
+//
+// Parameters: string $node: The full path to the node.
+//
+// Return: (int): The depth of the path.
+//
+//===========================================================================
+proc int depth( string $node )
+{
+ int $depth = 0;
+
+ if ( `objExists $node` )
+ {
+ string $longA[] = `ls -l $node`;
+
+ string $tokens[];
+ $depth = `tokenize $longA[0] "|" $tokens`;
+ }
+
+ return $depth;
+}
+
+//===========================================================================
+// nameNoPath
+//===========================================================================
+// Description: Returns the short name for the specified node.
+// "|group1|transform2|transformShape2" would return
+// "transformShape2"
+//
+// Constraints: The pathless name may not be unique, and may not be
+// sufficient for Maya to resolve the DAG! This name is
+// intended for use in a rename operation, and not for
+// performing edit operations on the object.
+//
+// Parameters: string $node: The full path to the node.
+//
+// Return: (string): The short path for the node.
+//
+//===========================================================================
+proc string nameNoPath( string $node )
+{
+ return `match "[^|]*$" $node`;
+}
+
+//===========================================================================
+// isUnique
+//===========================================================================
+// Description: Determines if the specified node has a unique name.
+//
+// Constraints:
+//
+// Parameters: string $node: Name of the node (may be full path, may not).
+//
+// Return: (int): TRUE (non-zero) if name is unique; else FALSE (zero).
+//
+//===========================================================================
+proc int isUnique( string $node )
+{
+ int $isUnique = true;
+
+ string $noPath = nameNoPath( $node );
+ string $wildcard = ( "*" + $noPath );
+ string $potentials[] = `ls $wildcard`;
+
+ int $numMatches = 0;
+ for ( $p in $potentials )
+ {
+ string $tokens[];
+ int $numTokens = `tokenize $p "|" $tokens`;
+ if ( $tokens[$numTokens-1] == $noPath )
+ {
+ $numMatches++;
+ }
+ }
+
+ $isUnique = ( $numMatches < 2 );
+
+ return $isUnique;
+}
+
+//===========================================================================
+// getUniqueName
+//===========================================================================
+// Description: Builds a unique name for the specified node by generating
+// a numerical suffix for the node. An existing numerical
+// suffix is stripped and replaced if the node's name is not
+// already unique.
+//
+// Constraints: The returned name does _not_ contain a path and may not be
+// sufficient for Maya to resolve the DAG! This name is
+// intended for use in a rename operation, and not for
+// performing edit operations on the object.
+//
+// Parameters: string $node: The full path to the node.
+//
+// Return: (string): A unique name for the node.
+//
+//===========================================================================
+proc string getUniqueName( string $node )
+{
+ string $shortNode = nameNoPath( $node );
+ string $unique = $shortNode;
+
+ if ( !isUnique( $shortNode ) )
+ {
+ // strip numeric suffix
+ string $suffix = `match "[0-9]*$" $shortNode`;
+ int $sizeShortNode = `size $shortNode`;
+ int $sizeSuffix = `size $suffix`;
+ $shortNode = `substring $shortNode 1 ( $sizeShortNode - $sizeSuffix )`;
+
+ if ( !`objExists $shortNode` )
+ {
+ $unique = $shortNode;
+ }
+ else
+ {
+ string $newNode;
+ int $u = 1;
+ do
+ {
+ $newNode = ( $shortNode + ($u++) );
+ } while ( `objExists $newNode` );
+
+ $unique = $newNode;
+ }
+ }
+
+ return $unique;
+}
+
+//===========================================================================
+// getShape
+//===========================================================================
+// Description: Returns the shape node, if any, for the specified transform.
+//
+// Constraints: Considers only a single shape.
+//
+// Parameters: string $xform: The transform node.
+//
+// Return: (string): The shape node.
+//
+//===========================================================================
+proc string getShape( string $xform )
+{
+ string $shapes[];
+
+ $shapes[0] = $xform;
+
+ string $isTransform[] = `ls -transforms $xform`;
+
+ if ( `size $isTransform` > 0 )
+ // If given node is not a transform, assume it is a shape
+ // and pass it through
+ {
+ $shapes = `listRelatives -fullPath -shapes $xform`;
+ }
+
+ return $shapes[0];
+}
+
+//===========================================================================
+// getShapeName
+//===========================================================================
+// Description: Derives a name for the shape node given the specified
+// transform name. For example if the $node specified is
+// "pCube23" the shape name will be "pCubeShape23".
+//
+// Constraints: No checking is done to verify that $node is a transform.
+//
+// Parameters: string $node: The name for the transform node.
+//
+// Return: (string): The name for the shape node.
+//
+//===========================================================================
+proc string getShapeName( string $node )
+{
+ string $numeric = `match "[0-9]+$" $node`;
+
+ int $strlen = `size $node`;
+ int $numlen = `size $numeric`;
+ string $alpha = `substring $node 1 ( $strlen - $numlen )`;
+
+ string $shapeName = ( $alpha + "Shape" + $numeric );
+
+ return $shapeName;
+}
+
+//===========================================================================
+// performRename
+//===========================================================================
+// Description: Does the work for the rename operation -- generates unique
+// names for the transform and shape nodes, assesses whether
+// the names are non-unique and, if necessary, renames the
+// nodes.
+//
+// Constraints: Read-only nodes (such as Maya's startup cameras) are a real
+// pain in the keister because there is no way to detect them
+// reliably ('ls -readOnly' doesn't work for this). Currently
+// the workaround is to assess whether my "unique" name is
+// the same as Maya's current name and, if so, don't bother
+// attempting a rename operation.
+//
+// Parameters: string $node: The full path to the node being renamed.
+//
+// Return: (int): TRUE (non-zero) if successful; else FALSE.
+// TRUE doesn't necessary mean it was renamed; it may
+// also mean it did not need to be renamed.
+//
+//===========================================================================
+proc int performRename( string $node )
+{
+ int $bSuccess = false;
+
+ if ( `objExists $node` )
+ {
+ string $unique = getUniqueName( $node );
+ string $shape = getShape( $node );
+
+ if ( $shape != "" )
+ {
+ string $uniqueShape = getShapeName( $unique );
+ if ( $uniqueShape != nameNoPath( $shape ) )
+ {
+ eval( "rename " + $shape + " " + $uniqueShape );
+ }
+ }
+
+ if ( $unique != nameNoPath( $node ) )
+ {
+ eval( "rename " + $node + " " + $unique );
+ }
+
+ $bSuccess = true;
+ }
+
+ return $bSuccess;
+}
+
+//===========================================================================
+// performUniqueNames
+//===========================================================================
+// Description: Recursive procedure for assessing the scene and looping
+// through the transform nodes. The renaming is performed
+// from the top-down, and if a top-level node is renamed the
+// path to its children will no longer be valid. The cheap
+// way around this is to detect an invalid path and signal
+// a recursive call to this function. The number of retries
+// is capped to prevent any possibility of infinite recursion.
+//
+// Constraints:
+//
+// Parameters: int $progress: The current progress; i.e. the number of
+// nodes successfully processed so far.
+// int $retry: Number of retries (recursions) remaining.
+//
+// Return: (none)
+//
+//===========================================================================
+proc performUniqueNames( int $progress, int $retry )
+{
+ $retry = max( $retry, 0 );
+
+ int $bSuccess = true;
+
+ string $transforms[] = `ls -long -transforms`;
+ int $depth[];
+ int $maxDepth = 0;
+
+ for ( $t = 0; $t < `size $transforms`; $t++ )
+ {
+ $depth[$t] = depth( $transforms[$t] );
+ $maxDepth = max( $maxDepth, $depth[$t] );
+ }
+
+ for ( $d = 1; $d <= $maxDepth; $d++ )
+ {
+ for ( $t = 0; $t < `size $transforms`; $t++ )
+ {
+ if ( $depth[$t] == $d )
+ {
+ $bSuccess = performRename( $transforms[$t] ) && $bSuccess;
+
+ if ( $bSuccess ) $progress++;
+ }
+
+ progressWindow -e -progress $progress;
+ }
+ }
+
+ if ( !$bSuccess && $retry ) performUniqueNames( $progress, --$retry );
+}
+
+//===========================================================================
+// forceUniqueNames
+//===========================================================================
+// Description: Entry point for this script.
+//
+// Forces unique names for all nodes in the scene, and ensures
+// that each Shape node derives its name (and numerical suffix)
+// from its Transform.
+//
+// Constraints:
+//
+// Parameters: (none)
+//
+// Return: (none)
+//
+//===========================================================================
+global proc forceUniqueNames()
+{
+ int $numRetries = 8;
+
+ waitCursor -state on;
+
+ string $transforms[] = `ls -l -type "transform"`;
+
+ int $allProgress = ( `size $transforms` );
+ int $progress = 0;
+ int $progressThreshold = 256; // no progress window for fewer items.
+
+ if ( $allProgress > $progressThreshold )
+ {
+ progressWindow
+ -ii false // not interruptable, sorry.
+ -min 0
+ -max $allProgress
+ -title "Force Unique Names"
+ -status "Scanning for non-unique names."
+ ;
+ }
+
+ performUniqueNames( $progress, $numRetries );
+
+ if ( $allProgress > $progressThreshold )
+ {
+ progressWindow -endProgress;
+ }
+
+ waitCursor -state off;
+}
+
+
+/*
+source forceUniqueNames; forceUniqueNames;
+*/