一半君的总结纸

听话只听一半君

#30 如何创建并编辑工具架按钮(Shelf buttons)?

首先, 你必须找到Maya自带工具架的名字,这很容易,Maya把自己UI的名字都存在了g开头的全局变量里。对于工具架来说则是 $gShelfTopLevel:

global string $gShelfTopLevel;
print $gShelfTopLevel;
// Result: MayaWindow|mayaMainWindowForm|formLayout2|formLayout22|ShelfLayout //

工具架的名字表面上看起来是shelfLayout,但他其实不是,他实际上是一个tabLayout; 只有tabLayout才能创建出像工具架那样有一排标签,让你可以选择切换的界面.

这个tabLayout的“子界面”(”child array”)是由shelfLayout组成的数组,每一个标签(shelf tab)对应你工具架上的一套按钮:

// 得到Shelves组成的数组 (就是你在Maya里看到的那一排标签)
tabLayout -q -childArray $gShelfTopLevel;
// Result: Animation Colouring Polygon Primitives Render Tools //

// 现在可以查询"Polygon"工具架(shelf)上具体有哪些按钮
shelfLayout -q -childArray "Polygons";
// Result: toolButton2 toolButton3 shelfButton54 shelfButton55 //

如果你想要编辑工具架上的一个按钮,首先你得判断下他是”shelfButton” 还是”toolButton”, 因为编辑这两种按钮所需要用的命令是不同的.
(下面的例子只是举例,你的工具架上肯定没有叫shelfButton54的)

objectTypeUI "toolButton2";
// Result: toolButton //

// 说明这是一个 toolButton - 你得用 ‘toolButton’ 命令来查询
// 当按下这个按钮的时候,什么Tool被激活了.
toolButton -q -tool "toolButton2";
// Result: polyCreateFacetCtx1 //

objectTypeUI "shelfButton54";
// Result: shelfButton //

// 这说明了这是一个 shelfButton - 你必须使用 ‘shelfButton’ 命令来查询
// 这个按钮会运行什么命令字符串(command string).
shelfButton -q -command "shelfButton54";
// Result: performPolyCollapse 0 //

如果你想加一个自己的按钮到工具架上,你可以用‘shelfButton’命令来加, 同时你得指定加到哪个标签(也就是上面查询得到的shelfLayout),上,你加到哪个shelfLayout上,那这个shelfLayout就被称为这个shelfButton的parent layout.

如果你想看看一个工具架的完整定义, 你可以打开Maya的自带工具架的配置文件看看. 这些配置文件以”shelf_”开头,然后加上工具架的名字,他们其实都是 MEL 脚本(script),而且文件扩展名当然也就是 “.mel” 了. 例如:

%MAYA_APP_DIR%\2014-x64\prefs\shelves\shelf_Polygon.mel

The definition stored for “shelfButton54” above is:

shelfButton
   -enable 1
   -width 34
   -height 34
   -manage 1
   -visible 1
   -annotation "Collapse: Collapse the selected edges or faces"
   -label "Collapse"
   -image1 "polyCollapseEdge.xpm"
   -style "iconOnly"
   -command "performPolyCollapse 0"
;

ps:如果你在上面的目录里没找到shelf_Polygons.mel,那你可以在工具架最左侧的倒三角图标那里点左键,然后选择Save All Shelves
saveAllShelves
举个简单的例子,如果你想给 “Tools” 工具架(假设这个Shelf tab是你自己加的)加一个按钮, 功能是清空当前的选择(什么都不选):


global string $gShelfTopLevel;

string $shelves[] = `tabLayout -q -childArray $gShelfTopLevel`;
// Result: Animation Colouring Polygon Primitives Render Tools //

// Note: $shelves[5] == "Tools"

// 现在加按钮
string $myButton = `shelfButton
-parent $shelves[5] // 把 parent Shelf 设为 "Tools"
-enable 1
-width 34
-height 34
-manage 1
-visible 1
-annotation "Clear the selection list"
-label "Select None"
-image1 "select.xpm"
-style "iconOnly"
-command "select -clear"`;

上面这个命令可以想写多长都行,只要双引号里的部分语法正确就可以,可以随便换行.

我们新创建的按钮存在 $myButton 里了,所以你可以在他创建之后通过这个变量来访问他.

‘deleteUI’ 命令可以把上面新建的按钮删掉:

deleteUI $myButton;

如果你想删一个已经有的按钮,但是又不知道他的ui叫什么名字,你可以查询这个 shelfLayout 的child array,然后再看每个按钮对应的command 或者 label是什么,或者看 comment 是什么,随便猜也能猜到是哪个了.

string $shelfButtons[] = `shelfLayout -q -childArray $shelves[5]`;

for ( $button in $shelfButtons )
{
   string $label;

   // 假设这是一个 shelfButton
   if ( `objectTypeUI -isType "shelfButton" $button` )
   {
      $label = `shelfButton -q -label $button`;

      // 如果这个按钮的label就是我们要找的,
      // 就删掉这个按钮.
      if ( "Select None" == $label )
         deleteUI $button;
   }
}

当你添加 (或者删除) Shelf button之后, 新的配置会存在 Maya的 Shelf Preferences里,我没找到原文里说的设置的地方,也许他那时候用的Maya版本和现在的好多地方已经不一样了,我只知道如果把这里不要勾,那Maya就不会保存Shelf的更改了:

dontSavePref

如果要强制保存 Shelf Preferences, 那可以用下面的:

global string $gShelfTopLevel;
saveAllShelves $gShelfTopLevel;

Tuesday, March 20, 2001

加强版:

lz写到这里突然想起个和shelf有关的乱搞,比如下面这个:
怎么才能让shelf变成能显示两排图标?

如果你是个鼠标民工,shelf上按钮多到不行了(像我这样),而平时又不用菜单,只用快捷键或者shelf,当你图标够多的时候,shelf的右侧会有一个scrollbar,你可以滚鼠标滚轮到下一排,下面的截图是lz把Maya窗口故意缩小了来模拟这种现象

shelfOneRow

那么你可以这样,刚才上面讲了$gShelfTopLevel其实是个tabLayout,所以我们可以

// 先看看shelf的高度是多少
tabLayout -q -h $gShelfTopLevel;
// Result: 67 //

// 看看随便乱改一个可以改高么
tabLayout -e -h 200 $gShelfTopLevel;
// Result: 67 //

shelfTooHigh

确实可以高,不过这个太高了也, 那么我怎么知道该改多高呢?显然不是67*2,因为67还包含了上面的tab的高度的

// 我先改回去
tabLayout -e -h 67 $gShelfTopLevel;
// Result: 67 //

// 然后lz框选中下面这两行,多运行几次,直到你觉得刚好是两行的高度的时候不就行了么
tabLayout -e -h (`tabLayout -q -h  $gShelfTopLevel`+5)  $gShelfTopLevel;
print (`tabLayout -q -h  $gShelfTopLevel`+"\n");

// lz按到第7次的时候觉得差不多了
tabLayout -e -h (`tabLayout -q -h  $gShelfTopLevel`+5)  $gShelfTopLevel;
print (`tabLayout -q -h  $gShelfTopLevel`+"\n");
72
...
tabLayout -e -h (`tabLayout -q -h  $gShelfTopLevel`+5)  $gShelfTopLevel;
print (`tabLayout -q -h  $gShelfTopLevel`+"\n");
102
// 显然当高度是102的时候,刚好是两排,那说明每排的高度是102-67=35

shelfTwoRow

好吧,那如何和上面今天学到的修改shelf button的内容联系起来呢?我把加多一行和减少一行的代码变成proc好了,然后再放到Shelf上,上面已经猜到了每行高度是35,所以

global proc changeShelfHeight(int $mode){
    // mode=1表示加 一行,0表示减一行
    global string $gShelfTopLevel;
    int $currentHeight = `tabLayout -q -h  $gShelfTopLevel`;
    int $defaultHeight = 67;
    int $rowHeight = 35;
    if ($mode==1)
        tabLayout -e -h ($currentHeight+$rowHeight) $gShelfTopLevel;
    else if ($mode==0){
        int $newHeight = $currentHeight - $rowHeight;
        // 总不能把高度减的比默认的一排还少了吧
        if ($newHeight>=$defaultHeight)
            tabLayout -e -h $newHeight $gShelfTopLevel;
    }

}

// 下面运行一下试试

// 这将会把shelf的高度增加一排
changeShelfHeight(1)

// 这将会把shelf的高度减少一排
changeShelfHeight(0)

好吧我也觉得我很无聊,那怎么能让他变得好用点呢,下面我们给shelf加两个按钮

global string $gShelfTopLevel;
// 得到所有的tab 存在数组里
string $shelves[] = `tabLayout -q -childArray $gShelfTopLevel`;

// 得到当前的tab是哪个
int $selectedTabIndex=`tabLayout -q -sti $gShelfTopLevel`;

// 上面的tab的序号是从1开始的,所以在数组里的位置要减1
string $shelfIndex  = $selectedTabIndex-1

// 把当前ui的parent设置成当前的tab,这样我新建一个shelfButton的时候,他会自动加到此layout里
eval("setParent($shelves["+$shelfIndex+"])");

// 点这个按钮加一排
shelfButton
    -label "+"
    -imageOverlayLabel "+"
    -image1 "commandButton.png"
    -command "changeShelfHeight(1)";

// 点这个按钮减一排
shelfButton
    -label "-"
    -imageOverlayLabel "-"
    -image1 "commandButton.png"
    -command "changeShelfHeight(0)";

至此lz已经成功的证明了lz已经疯了
shelfButtons

Related How-To’s

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: