使用系统事件和 scriptJob

 
 
 

可以使用 MEL 创建在发生特定系统事件时运行的脚本。使用 scriptJob 命令可完成此操作。Maya 会定义大量系统事件,您可以将脚本附加到这些事件中。正常使用 Maya 就会触发这些事件。有些事件会在选择发生更改时、打开新文件时以及拾取新工具时告知您。

可以使用以下带有 -listEvents 标志的 scriptJob 命令获取所有事件的完整列表:scriptJob -listEvents;这些事件的名称通常不需解释;详细说明可在 scriptJob 文档中找到。

还有另一种系统事件,称为条件。条件与事件类似,只是条件还具有 True 或 False 值。例如,有些条件可在选择某些内容或动画播放时告知您。可以使用以下带有 -listConditions 标志的 scriptJob 命令获取所有条件的完整列表:

scriptJob -listConditions;

无论条件的状态是从 True 更改为 False,还是从 False 更改为 True,条件都会触发其附加的脚本。您可以随时使用 isTrue 命令测试其状态。

最终,当对象的属性值发生更改时,会创建一个事件。将脚本附加到事件或条件时,条件不会马上运行。在触发事件或条件时,会将脚本添加到队列中,并在下次系统处于空闲状态时运行脚本。无论在繁忙期间触发了多少次事件或条件,在下次系统处于空闲状态时,脚本都仅运行一次。

重要说明:只有在使用图形用户界面运行 Maya 时,scriptJob 才起作用。

它们在批处理模式或提示模式下不起作用。可以使用它们来自定义您的用户界面。在运行动画期间,不要尝试使用它们使情况发生,因为它们在播放或批渲染期间不会执行。请改用表达式。

示例

举个例子,假设要编写脚本,只要没有选择其他内容,该脚本就会选择特定对象。下面是用于选择对象的脚本:

select -r myObject;

您可能希望在不选择任何内容时运行此脚本。存在一个名为“SomethingSelected”的条件,如果选择某些内容,则该条件为 True。如果该条件变为 False,则需要运行您的脚本。下面是用于执行该操作的命令:

scriptJob -conditionFalse "SomethingSelected" "select -r myObject";

再举个例子,假设您希望对象始终处于选中状态。您具有的 scriptJob 在每次选择发生更改时都会运行,而且可确保对象位于适当的位置:

scriptJob -event "SelectionChanged" "select -add myObject";

在本示例中,您希望在场景中的对象升高得太远时以警告形式通知您。您可能具有适当的脚本,只要对象发生更改,该脚本就会转换对象的 Y 值:

global proc checkY(){
 float $y = `getAttr myObject.ty`;
 if ( $y > 10.0 ){
 window;
 columnLayout;
 text -l "Object is too far up!";
 showWindow;
 }
 }
 scriptJob -attributeChange "myObject.ty" "checkY";

删除作业

使用 scriptJob 命令将脚本附加到事件或条件时,该命令将返回唯一的“作业编号”。您可以使用此编号来删除(消除)已创建的作业。假设以上示例返回的数字为 17。要停止该脚本使其不再运行,可以使用带有 -kill 标志的 scriptJob 命令,如下所示:

scriptJob -kill 17;

要获得在系统中运行的所有 scriptJobs 的完整列表,请使用以下 -listJobs 标志:

scriptJob -listJobs;

这将返回作业编号列表,后跟 scriptJob 命令用于在第一个位置创建作业的所有标志和参数。

可以采用多种方式导致作业自动消除(删除)本身。如果在 -runOnce 标志设置为 True 时创建作业,则作业只会运行一次,随后便删除其本身。

您可以使用 -parent 标志将作业附加到 UI 的特定元素,以便在删除 UI 元素时,也一同删除作业。下一个示例可创建一个窗口。scriptJob 用于更新窗口中的文本,这些文本说明是否已选定某些内容。在删除窗口时,作业将被自动消除:

global proc updateSelWind(){
 if ( `isTrue SomethingSelected` ){
 text -edit -label "Something is selected." selText;
 } else {
 text -edit -label "Nothing is selected." selText;
 }
 }
 string $windowName = `window`;
 columnLayout;
 text selText;
 updateSelWind;
 showWindow $windowName;
 scriptJob
 -parent $windowName // attach the job to the window
 -conditionChange "SomethingSelected" "updateSelWind";

查看作业运行

通常,运行的作业不会显示在“脚本编辑器”(Script Editor)窗口中。但是,您可以通过在“脚本编辑器”(Script Editor)“编辑”(Edit)菜单中启用“回显所有命令”选项,使他它们显示。

请参见

有关使用事件和条件的详细信息,请参见 scriptJobisTrueconditiondimWhen 的文档。