Wednesday, February 3, 2010

MEL: Working With Multiple Level Namespaces

I learned a great trick today concerning Maya scenes with objects that have multiple levels of namespaces.

Namespaces in general are a bit difficult to work with as they tend to break scripts if you don't constantly check for them, so this trick is a simple and very useful way to check for them and prevent errors.

Let's say you have an object you want to select called, "r_hand_CTRL". You want to select it, but you need to test for namespaces because it might actually be named "Char:r_hand_CTRL" in your Maya scene. Or for more fun let's say it's named, "Post:Char:r_hand_CTRL".

Selecting r_hand_CTRL isn't going to work as it doesn't exist if it's prefixed with namespaces, so we have to search for what the namespaces are. Maya's namespace MEL commands are annoying and difficult to use. So here is a trick.

// Define Control
string $ctrl = "r_hand_CTRL" ;

// This int is used below to prevent an infinite loop
int $i = 0 ;

// Loop until it finds all the namespaces
// Stop at ten if it still can't find it
// Hopefully you don't have more than ten recursive namespaces
// May the Gods help you if you do.

// Check forever until the object exists, or $i = 10
while(!`objExists $ctrl` || $i == 10) {

// Append *: until it can find the object
$ctrl = ("*:"+$ctrl) ;

// Increment $i so we don't do this infinitely
$i++ ;

}

// Note: You could also use a FOR loop. But I didn't here.

// Now that we know $ctrl exists, we can do whatever we want with it
select -r $ctrl ;

I've already used this trick like forty times, it's awesome. Enjoy!

Edit: Since learning this, people have mentioned that you can just use the following command to find your object:

ls -recursive 1 "myObject" ;

Quite handy, and much more useful than what we worked on above! I wish I had the entire MEL docs memorized.... :)

8 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. Looks like you figured it out. :)

    ReplyDelete
  3. I'm not as familiar with with statements.
    I was trying to do something like this to find certain joints in a rig to select them for export across multiple character files. The joints might not always be in the file, and when I use the while statement it goes into an infinite loop. I couldn't figure out how to do this with a for statement. Is there some way I can have it sort through selected joints only to attempt the name switch? The if statement doesn't seem to pull it off either, unless I'm missing something there.

    ReplyDelete
  4. Actually, I may have found something better.
    `ls -recursive 1 "r_hand_CTRL"`;

    Just gotta figure out how to make it work in an if statement now.

    ReplyDelete
  5. Have you tried the FOR loop?

    for($joint in `ls -sl`) print $joint ;

    ReplyDelete
  6. `ls -recursive 1 "r_hand_CTRL"`; : This works buddy
    thanks
    TheArtOfSource

    ReplyDelete
  7. The argument -recursive works as long as you are in root namespace!
    Let's say you have 1 root namespace "test_1" with 2 child namespace "test_a" "test_b", and a transform node "ME" inside each namespace. That gives you:
    :test_1:ME
    :test_1:test_a:ME
    :test_1:test_b:ME
    Now set namespace "test_b" as current, and run you command...
    It will only find the node "ME" in and below "test_b".

    ReplyDelete

Scripting Topics

MEL (41) Maya (39) Scripting (32) Scripts (21) programming (14) Free Mel Scripts (8) MaxScript (7) Coding (6) Rigging (5) tutorial (5) 3ds Max (4) Python (4) Tricks (4) faceware (4) image metrics (4) Learn (3) Namespace (3) Namespacing (3) animation (3) facial (3) webinar (3) Code (2) GDC (2) Game Developers Conference (2) Multiple Namespaces (2) Print Selected Objects (2) Recursive (2) Removing Namespace (2) Return (2) Set Driven Keys (2) TOkenize (2) Tips (2) Toggle Background Color with MEL (2) animation tools (2) animators resource (2) deformers (2) learning (2) maya tools (2) mesh (2) modeling (2) nodes (2) procedure (2) script swell (2) transforms (2) Animschool (1) Attribute (1) Background Color (1) Beer (1) Blur (1) Character Setup (1) Check if an object exists (1) Class (1) Command Line (1) Constraints (1) Create SDK (1) Create a directory with mel (1) Data (1) Export (1) FilterString (1) Fix (1) Floating Slider Time (1) Functions (1) Get Maya Version MEL (1) Get Parent (1) Google (1) Holiday (1) How To Write To A Text File (1) Import (1) Incremental Save (1) Index (1) Joint Chain (1) Make Set Driven Keys (1) Maya Version (1) Modules (1) Objects (1) Orient Constraint (1) PYMEL (1) Parent (1) Parent Constraint (1) Point Constraint (1) Position (1) Print (1) Print Current Selection (1) Print Random Quotes (1) Print Selection (1) Print Vertices (1) Progress Bar (1) Progress Window (1) PyQT (1) Removing Spaces From Names (1) Scene File Name (1) Select Connections (1) Select Outgoing Nodes (1) Split Bones (1) Split Joints (1) St. Patrick's Day (1) String Array (1) System (1) Transfer UVs (1) Viewport (1) White Space (1) Windows Username (1) Zero Out Attributes (1) animButtonState (1) arrays (1) articles (1) auto key (1) better (1) blendshapes (1) break (1) confirm dialog (1) continue (1) convention (1) e3 (1) efficiency (1) error (1) eval (1) executable (1) fclose (1) fopen (1) fprint (1) games (1) improving (1) infinite loop (1) joints (1) listHistory (1) listRelatives (1) logic (1) loops (1) milestone (1) nodeType (1) objExists (1) recursion (1) rotates (1) rotations (1) schools (1) sculpting (1) setAttr (1) shout outs (1) source (1) source a script with a variable (1) speed (1) tech-artists.org (1) translates (1) video (1) warning (1) world matrix (1) worldMatrix (1)
 
Script Swell - Blogged