MEL How-To #101 | ||
| ||
How do I find a window and query its child layout and controls?You can get a list of all MEL windows using the "lsUI" command, and filtering its results to display only windows with its '-type' flag: string $allWindows[] = `lsUI -type "window"`; // Result: CommandWindow MayaWindow // From this list you can query the string used as the title for each window: window -q -title $allWindows[0]; // Result: Script Editor // If you want to go the other way - that is, knowing the title you want to find the window's UI name:
proc string findWindowByTitle( string $windowTitle )
{
// Default empty string to denote that no matching window was found.
//
string $windowUI = "";
string $allWindows[] = `lsUI -type "window"`;
for ( $w in $allWindows )
{
// Compare the specified title with that queried from each window.
//
if ( $windowTitle == `window -q -title $w` )
{
// Found it!
//
$windowUI = $w;
break;
}
}
return $windowUI;
}
An example run: string $windowUI = findWindowByTitle( "Script Editor" ); print ( "The window titled \"" + $windowTitle + "\" is: " + $windowUI + "\n" ); // Result: The window titled "Script Editor" is: CommandWindow // The next logical step is to use the name of the window UI to query its child controls. Here's where you run into a bit of a snag. The "window" command does not have the expected '-childArray' flag, and there's no direct way to query the layout or controls used in the window. Therefore, it is necessary to perform a reverse lookup to find the layout.
global proc string findWindowLayout( string $windowUI )
{
// Brute force: Get a list of all control layouts, and see which
// is a child of the specified window.
//
string $controls[] = `lsUI -l -controlLayouts`;
// Create a wildcard pattern used by the "gmatch" command.
//
string $pattern = $windowUI + "*";
// Default empty string to denote that no matching layout was found.
//
string $layout = "";
for ( $ui in $controls )
{
// Compare the wildcard pattern against the name of this control.
//
if ( `gmatch $ui $pattern` )
{
// Found it!
//
string $tokens[];
int $numTokens = `tokenize $ui "|" $tokens`;
if ( $numTokens > 1 )
{
// This returns a path to the control, specifying the window as the parent.
// It's advisable to always reference UI controls by their full path.
//
$layout = $tokens[0] + "|" + $tokens[1];
break;
}
}
}
return $layout;
}
An example usage:
string $windowUI = "MayaWindow";
string $layout = findWindowLayout( $windowUI );
if ( "" != $layout )
{
// Found a layout.
//
print ( "Layout for window \"" + $windowUI + "\": " + $layout + "\n" );
// List the child controls.
//
string $ca[] = `layout -q -ca $layout`;
print ( "Layout controls:\n" );
for ( $c in $ca )
{
// Always expand UI control names to their full path.
//
print ( $layout + "|" + $c + "\n" );
}
}
else
{
print ( "Layout for \"" + $windowUI + "\" not found.\n" );
}
Layout for window "MayaWindow": MayaWindow|mayaMainWindowForm Layout controls: MayaWindow|mayaMainWindowForm|formLayout1 MayaWindow|mayaMainWindowForm|formLayout2 MayaWindow|mayaMainWindowForm|formLayout3 MayaWindow|mayaMainWindowForm|TimeSliderForm MayaWindow|mayaMainWindowForm|formLayout4 MayaWindow|mayaMainWindowForm|formLayout5 MayaWindow|mayaMainWindowForm|formLayout6 MayaWindow|mayaMainWindowForm|formLayout7 Now that you have each layout you can query each's children. You don't need to know the type of layout referred to by the path; you can use the generic "layout" command to query the child array. string $ca[] = `layout -q -childArray $layout`; Howver, if you want to query any properties for a layout that are specific to its type, the generic "layout" command will not suffice. Here you can use the "objectTypeUI" command to query the layout's type, followed by a series of queries (or edits) for the types you will support.
if ( `layout -q -exists $layout` )
{
string $layoutType = `objectTypeUI $layout`;
switch ( $layoutType )
{
case "formLayout":
{
// Process with "formLayout" command.
//
break;
}
case "frameLayout":
{
// Process with "frameLayout" command.
//
break;
}
case "shelfLayout":
{
// Process with "shelfLayout" command.
//
break;
}
default:
{
// Not supported...
}
}
Here's an example of using findWindowLayout() to print a hierarchical representation of the family of layouts that comprise Maya's main window:
proc printLayoutHierarchy( string $layout, string $parent, int $tab )
{
string $bars = "| | | | | | | | | | | | | | | | | | | | | | | | | | | ";
// Note: You _must_ specify the full path for a control in order to
// avoid ambiguous queries (and in this case, an infinite loop).
//
string $path = ( $parent + "|" + $layout );
if ( `layout -q -exists $path` )
{
// Print a pseudo-tree representation.
//
if ( $tab > 1 ) print ( `substring $bars 1 (($tab-1)*2)` );
if ( $tab > 0 ) print ( "+ " );
print ( $layout + "\n" );
// Query the children of this layout.
//
string $ca[] = `layout -q -ca $path`;
// And recurse...
//
for ( $c in $ca )
{
printLayoutHierarchy( $c, $path, $tab+1 );
}
}
}
// Find the path of the layout control for Maya's main window.
//
string $windowUI = "MayaWindow";
string $path = findWindowLayout( $windowUI );
// Split this into its path and layout name (short form).
//
string $layout = `match "[^|]*$" $path`;
string $parent = `substitute "|[^|]*$" $path ""`;
// Build a hierarchical tree for this layout.
//
printLayoutHierarchy( $layout, $parent, 0 );
Here's an example of its output:
mayaMainWindowForm + formLayout1 | + formLayout12 | | + formLayout13 | | | + formLayout40 | | | | + formLayout41 | | | | | + presetForm | | | | | + masksForm | | | | | + selectMaskForm | | | | | | + hierarchyIcons | | | | | | | + hierPickMenuLayout | | | | | | + objectMaskIcons | | | | | | | + objPickMenuLayout | | | | | | + componentMaskIcons | | | | | | | + compPickMenuLayout | | | | | + snapIcons | | | | | + historyLayout | | | | | | + formLayout42 | | | | | | + formLayout43 | | | | + formLayout44 + formLayout2 | + formLayout14 | | + formLayout15 | | | + formLayout49 | | | | + frameLayout4 | | | | | + formLayout50 | | | | + ShelfLayout | | | | | + Admin | | | | | + Animation | | | | | + Colouring | | | | | + Develop | | | | | + LevelTools | | | | | + Polygon | | | | | + Primitives | | | | | + Render | | | | | + Tools | | | | | + UI + formLayout3 | + viewPanes | | + modelPanel1 | | + modelPanel2 | | + modelPanel3 | | + modelPanel4 | + formLayout8 | | + formLayout26 | | | + formLayout27 | | | | + frameLayout6 | | | | | + gridLayout2 | | | | + frameLayout7 | | | | | + ToolboxConfigurationGrid | | | | | | + ToolboxConfigurationForm | | | | | | | + ToolboxContentFrame0 | | | | | | | + ToolboxContentFrame1 | | | | | | | + ToolboxContentFrame2 | | | | | | | + ToolboxContentFrame3 | + formLayout9 | | + formLayout28 | | | + formLayout29 | | | | + formLayout34 | | | | | + AEmenuBarLayout | | | | | | + AErootLayout | | | | | | | + AENothingSelectedLayout | | | | | | | + AEbaseFormLayout | | | | | | | | + AEheaderLayout | | | | | | | | | + AEtabLayout | | | | | | | | + AEnodeNameHeaderLayout | | | | | | | | + AEcontrolFormLayout | | | | | | | + AEselectAndCloseButtonLayout | + formLayout10 | | + formLayout30 | | | + formLayout31 | | | | + tabLayout1 | | | | | + columnLayout1 | + formLayout11 | | + formLayout32 | | | + formLayout33 | | | | + formLayout35 | | | | + ChannelsLayersPaneLayout | | | | | + formLayout36 | | | | | | + menuBarLayout1 | | | | | | | + frameLayout1 | | | | | + formLayout37 | | | | | | + menuBarLayout2 | | | | | | | + formLayout38 | | | | | | | | + DisplayLayerUITabLayout | | | | | | | | | + DisplayLayerTab | | | | | | | | | | + LayerEditorDisplayLayerLayout | | | | | | | | | + RenderLayerTab | | | | | | | | | | + LayerEditorRenderLayerLayout | | | | + formLayout39 + TimeSliderForm | + formLayout16 | | + formLayout17 | | | + formLayout45 | | | | + frameLayout2 | | | | + gridLayout1 + formLayout4 | + formLayout18 | | + formLayout19 | | | + formLayout46 | | | | + frameLayout3 | | | | + formLayout47 + formLayout5 | + formLayout20 | | + formLayout21 | | | + formLayout48 | | | | + commandLine1 + formLayout6 | + formLayout22 | | + formLayout23 | | | + frameLayout5 | | | | + formLayout51 + formLayout7 | + formLayout24 | | + formLayout25 Related How-To's19 Feb 2005 | ||
| Copyright ©2005 by Bryan Ewert, maya@ewertb.com Maya is a Registered Trademark of Alias |