Tuesday, July 13, 2010

MEL/PyMEL: Get Top Most Parent Of An Object

Here is a function I use often that will give you the top-most parent of any object. I use it when I want to perform a function on an entire heirarchy but don't want to worry about needing to select the top most object. I can just grab any of them, hit a button and it grabs the top (using the function here) and then selects or grabs the entire hierarchy. I'm kind of OCD about saving every possible second.

Mel Version:
// **********************************************************
// Return Top Parent Of Any Node
global proc string jgReturnTopParent (string $obj) {

string $a[] = {} ;
string $b ;
$a = `listRelatives -p $obj` ;
while(size($a) > 0) {
$b = $a[0] ;
$a = `listRelatives -p $a[0]` ;
}
return $b ;

}

PyMel Version:
##################################################
## Return Top Parent Of Any Node
def jgReturnTopParent(obj):

# Imports
import pymel.core as pm

# Get First Parent
varA = pm.listRelatives(obj,p=True)

# Loop All Parents
while(len(varA) > 0):

varB = varA[0]
varA = pm.listRelatives(varA[0],p=True)

return varB

Update: Thanks to Scott Englert for pointing out in the comments that MEL and PyMel both have built in functions for this already.

MEL command that comes with Maya:

rootOf($obj);

PyMEL method of dag nodes:
obj.root()

Cheers Scott!

6 comments:

  1. There are already shortcuts written into Maya and PyMEL for these so you do not need to write a new function.

    MEL command that comes with Maya:
    rootOf($obj);

    PyMEL method of dag nodes:
    obj.root()

    Simple and easy, one line and you don't have to carry around extra functions around.

    Cheers!

    ReplyDelete
  2. Haha...I should have known. Thanks for pointing that out Scott, updated!

    ReplyDelete
  3. Sorry to hit up an old post, but when I've tried using obj.root() on a joint, it returns an invalid result. To get the joints root I had to use obj[0].root().

    from pymel.core import *
    obj = ls(sl=True)
    obj[0].root()

    Tried using obj="joint6" as well with errors as well. Just getting used to PyMel, so it may be me entirely. :)

    ReplyDelete
    Replies
    1. This is due to the command "ls" returning a list, not a single object.

      Delete
    2. This is due to the command "ls" returning a list, not a single object.

      Delete

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