随着用户界面脚本变得愈加复杂,因此可能会产生语法错误。如果用户界面脚本部分执行并在遇到某个错误时停止,那么该窗口仍存在,但不可见。如果修复该问题并希望再次执行脚本,那么必须赋予窗口一个新名称,或者删除隐藏的窗口。          

解决命名冲突

在下一节中,将使用条件语句来解决窗口命名冲突。使用条件语句可以根据某个变量的值或场景中某个对象的状态执行一段代码。

解决冲突的窗口名称

  1. 通过在“脚本编辑器”(Script Editor)的一个 MEL 选项卡中键入以下命令,创建一个窗口,该窗口包含一个在 showWindow 命令之前插入的脚本错误:                  

    window testwindow; fake_command; showWindow;

    会将一个错误输出到“脚本编辑器”(Script Editor)。                  

    // Error: line 2: Cannot find procedure "fake_command;". //                  

    将不会显示该窗口,但该窗口仍存在。                  

  2. “脚本编辑器”(Script Editor)的一个 MEL 选项卡中键入以下命令,创建另一个具有相同名称的窗口:                  

    window testwindow; showWindow;

    会将一个错误输出到“脚本编辑器”(Script Editor)。                  

    // Error: line 1: Object's name is not unique: testwindow //                  

    Maya 中的所有对象和用户界面元素必须具有唯一的名称。                  

查询窗口是否存在

  1. “脚本编辑器”(Script Editor)的输入区域中键入以下命令以删除隐藏的窗口:                  

    deleteUI testwindow;

  2. 通过键入以下命令检查窗口是否存在:                  

    window -exists testwindow;

    会将以下结果输出到“脚本编辑器”(Script Editor)。                  

    // Result: 0 //                  

    window 命令的 exists 标志更改了该命令,以使该命令根据窗口是否存在返回 1 或 0。

  3. “脚本编辑器”(Script Editor)中键入以下命令:                  

    deleteUI non_existing_window; sphere;

    会将一个错误输出到“脚本编辑器”(Script Editor)。                  

    // Error: line 1: Object not found: non_existing_window                  

    不会执行 sphere 命令,因为脚本在遇到脚本错误时已停止。                  

为了能够仅在现有用户界面存在时删除该界面,可以使用条件语句。

按条件删除窗口

  1. “脚本编辑器”(Script Editor)的一个 MEL 选项卡中,键入以下命令:                  

    window testwindow; fake_command; showWindow;

    由于存在脚本错误,窗口不可见,并且未执行 showWindow 命令。                  

  2. “脚本编辑器”(Script Editor)的一个 MEL 选项卡中,键入以下命令:                                

    if (`window -exists testwindow`==1) { deleteUI testwindow; } window -resizeToFitChildren 1 testwindow;

    columnLayout; text -label "This window deleted the other one"; showWindow;

    此处将介绍两个概念:                  

  • 使用 if 语句可以根据条件执行代码的某一部分。仅当对圆括号内的语句的求值为真时,才执行大括号内的这段代码。                

  • 圆括号中成对的反引号 (` `) 指示会首先对其内的命令求值。这是编写 MEL 代码的很有用的一部分:可以使某些命令(此处指条件语句)依赖于首先执行和求值的其他命令(此处指对窗口是否存在进行求值)。                  

    还有,if 语句和该求值意味着仅当窗口存在性查询的结果为“1”(窗口存在)时,才会删除窗口。否则,会跳过大括号内的这段代码。                  

存储控件名称

如果要引用用户界面中的某个控件,该控件必须有一个名称。可以使命令生成唯一的默认名称,然后可以将该名称存储为变量,而不必手动指定每个用户界面元素的名称。

所有用户界面命令都会返回其创建时的完整名称和路径。可以将返回值存储为一个变量,以引用在脚本中某个稍后的点处的控件。

将控件名称存储为变量

  1. “脚本编辑器”(Script Editor)的一个 MEL 选项卡中,键入以下命令:                              

    window -resizeToFitChildren 1 pick_me_window; columnLayout; $button_one=`button -label "Click Me!"

    -command "deleteUI $button_two"`; $button_two=`button -label "NO!, Click Me!!" -command "deleteUI

    $button_one"`; $button_close=`button -label "Close" -command "deleteUI pick_me_window"`; showWindow

    此处将再次使用反引号进行求值,尽管在这种情况下,将创建三个变量($button_one$button_two$button_close),这三个变量包含每次调用按钮命令的结果。                  

  2. 在窗口中按其中一个“单击我!”按钮以测试脚本。                  

    单击其中一个“单击我!”按钮会通过以下方式删除其他按钮:使用将按钮控件的名称存储为参数(button_onebutton_two)的变量调用 deleteUI 命令。                  

    (如果再次单击该按钮,将会发生错误,因为尝试要删除的按钮已被删除。)        

  3. 通过在窗口中按“关闭”(Close)按钮关闭窗口。                  

    创建了用户界面窗口之后,可以手动为该窗口指定一个唯一的名称。这是一个很好的做法,可确保无法打开用户界面的多个副本。对于更复杂的用户界面,同一用户界面的多个副本会相互干扰,或者会降低 Maya 的速度。                  

    注意通过使用 print 命令输出变量,可以查看用户界面元素的完整名称和路径。

    print $button_one;

    会将以下内容输出到“脚本编辑器”(Script Editor)

    pick_me_window|columnLayout2|button1

    这是用户界面控件的完整路径。因为要使用变量存储控件的名称和路径,所以无需键入完整的名称和路径来引用用户界面元素。

在本节中,学习了如何创建、删除窗口以及检查已命名窗口是否存在。在下一节中,会将更加复杂的窗口挂接到某个过程。

,