目前,窗口中的用户界面不会执行任何操作:移动滑块和单击复选框没有任何作用。在本节中,将学习如何将用户界面链接到之前使用的 makeRoll 过程:
用户界面中的 textField 将显示当前选定对象。
将链接窗口中的复选框,这样可以一次仅选中一个复选框。
该按钮将使用窗口中指定的参数执行 makeRoll 过程。
在下列步骤中,将修改用户界面脚本。
在 GettingStarted2014LessonDataMEL 项目目录中的 mel 子目录内,会提供名为 mel_Lesson_4_finished.mel 的用户界面脚本的完整版本。
显示当前选定对象
makeRoll 过程对当前选定对象不起作用。将修改该脚本,这样 textField 控件将显示当前选定对象的名称。
若要返回当前选定对象的名称,请将 ls 命令 (list) 与 selection 一起使用。因为可以在 Maya 中选择多个对象,所以从 ls 命令返回的结果不是一个字符串,而是一个字符串数组,即使仅选中一个对象时也是如此。数组是一个有序的值列表,这些值用于将相同数据类型的多个项目存储在一个变量内。makeRoll 过程无法将字符串数组作为参数,因此必须修改 ls -selection 所返回的数据。
注意有关 ls 命令的详细信息,请参见“MEL 命令参考”中的 ls。
有关 arrays 的详细信息,请参见《Maya 用户手册》中的“数组”。
在接下来的部分中,还将创建一个新的“tempMEL”选项卡,以便在学习命令时有一个位置来测试这些命令。
将当前选定对象的名称存储为变量
创建一个新的 MEL 选项卡(“脚本编辑器”(Script Editor)中的“命令 > 新建选项卡”(Command > New Tab))。
将该选项卡重命名为 tempMEL(“脚本编辑器”(Script Editor)中的“命令 > 重命名选项卡”(Command > Rename Tab))。
在“tempMEL”选项卡中键入以下命令:
select -allDagObjects;
该命令会选择所有场景对象。
在“tempMEL”选项卡中键入以下命令:
$all_selected_objects =`ls -selection`;
该命令会列出当前选定对象并将其名称输出到某个变量。
在“tempMEL”选项卡中键入以下命令:
print $all_selected_objects;
该命令会将存储对象列表输出到“脚本编辑器”(Script Editor)。
执行“tempMEL”选项卡中的这些命令。
会将以下内容输出到“脚本编辑器”(Script Editor):
roll_Cube pPlane1
变量 $all_selected_objects 是一个字符串数组。即,在该变量内存储多个字符串。数组中的值称为元素。
注意
在编程中会经常使用数组来管理大型数据集。如果未将数组用于存储大型数据集,则需要为每个数据元素创建一个变量,使脚本很难维护并占用大量内存。有关数组的详细信息,请参见《Maya 用户手册》中的“数组”。
在本示例中,仅需要将 roll_Cube 过程应用到场景中的一个对象。通过使用方括号 ([]),可以引用数组的单个元素。
将当前选择减少到一个对象
将下列命令添加到“MEL2”选项卡中的用户界面脚本的顶部:
select -allDagObjects;string $all_selected_objects[]=`ls -selection`;
在“MEL2”选项卡中,将位于原始脚本第 14 行的 text 标志的参数(可以使用“MEL”选项卡以供参考)从 "name_of_object" 更改为如下:
$all_selected_objects[0]
该命令现在显示为:
$obj_name_text = `textField -editable 0 -width 400 -text $all_selected_objects[0]`;
使用方括号(包含要从数组提取的元素的索引编号),可以对数组的元素进行访问。数组的索引编号从 0 开始计数。
文本字段现在会显示在场景中创建的第一个对象。
链接复选框
与按钮类似,复选框也可以使用命令标志。复选框具有比按钮更多的功能,因此命令标志是不同的。复选框有三个可能的命令标志;changeCommand、onCommand 和 offCommand:
无论何时复选框的状态发生改变,都会触发 changeCommand 标志。
可以使用带有 edit 标志的 checkBox 命令在用户界面中更改复选框的状态。
在用户界面中更改元素的值
在“tempMEL”选项卡中,通过执行以下命令,更改“make roll”窗口的复选框的状态:
checkBox -edit -value 0 $box_sim_checkbox;
先前启用的“Box Simulation”复选框现在被禁用。可以使用值 1 重复该命令来重新启用该复选框。
这显示了带有命令的 edit 标志的用法,该命令作为某个命令标志的参数,而使用该命令标志可更改值。
现在将使用 changeCommand 标志来保持两个复选框同步,这样会在一个复选框更改了状态时,会将另一个复选框设定为相反的状态。
在“MEL2”选项卡中,在现有复选框声明(字符串 $box_sim_checkbox 和字符串 $sphere_sim_checkbox)下方添加以下内容。该位置将大约为第 34 到第 35 行,具体取决于是否在文件开头添加了行。
checkBox -edit -changeCommand ("checkBox -edit -value (!#1) "+ $sphere_sim_checkbox)$box_sim_checkbox;
该块指示如果在“Box Simulation”复选框上触发了 changeCommand 标志,那么 Maya 会将“Sphere Simulation”复选框编辑为与其当前值相反的值(这样,如果禁用“Box Simulation”,Maya 就会自动启用“Sphere Simulation”)。
在 MEL 中,#1 是复选框的值的替代字符。Maya 运行该代码行之后,会使用复选框的值替换 #1。在编程中,符号 ! 表示“非”。因此,在以上代码中,Maya 会将“Sphere Simulation”复选框更改为非 (!) 当前值的任意值 (#1)。
最后,请添加以下内容。
checkBox -edit -changeCommand ("checkBox -edit -value (!#1) "+ $box_sim_checkbox) $sphere_sim_checkbox;
这与先前的行相同,但是在更改“Sphere Simulation”之后,会更改“Box Simulation”复选框。
执行该过程
makeRoll 过程需要参数才能执行。若要将该过程链接到窗口,必须从用户界面中的控件获取参数的值,并使用这些参数执行 makeRoll 过程。
若要获取控件的值,必须使用查询标志。通过查询标志,命令可以返回场景中的属性值。
在用户界面中查询值
通过向右拖动滑块,或者通过在直径滑块的文本字段中键入值,可以将直径滑块的值更改为 10.1。
通过在“tempMEL”选项卡中键入以下命令,输出直径滑块的值:
print ("The diameter is: " + `floatSliderGrp -query -value $diameter_float`);
会将以下内容输出到“脚本编辑器”(Script Editor):
The diameter is: 10.1
使用查询标志可以将值输出到“脚本编辑器”(Script Editor)。
我们将在脚本中添加一个新过程,该过程会将 makeRoll 命令与从用户界面查询到的参数值一起使用。然后,“执行”按钮将使用该过程。
为“执行”按钮创建过程
将以下内容添加到“MEL2”选项卡的顶部:
global proc makeRoll_calback (string $obj_name_text, string $ground_int, string $box_sim_checkbox, string $diameter_float){makeRoll `textField -query -text $obj_name_text` `intSliderGrp -query -value $ground_int` `checkBox -query -value $box_sim_checkbox` `floatSliderGrp -query -value $diameter_float`;}
用户界面的每个参数是通过查询用户界面元素来定义的。
现在可以设定“执行”按钮来调用刚创建的过程。
将“执行”命令链接到过程
在“MEL2”选项卡中,用以下内容替换 -command "print ("something");"; 行。
-command ("makeRoll_calback "+$obj_name_text+" "+$ground_int+" "+$box_sim_checkbox+" "+$diameter_float);
参数 $obj_name_text、ground_int、box_sim_checkbox 和 diameter_float 为该过程提供执行 makeRoll 脚本所需的值。
现在用户界面具备了全部功能。
在 GettingStarted2014LessonDataMEL 项目目录中,会提供名为 mel_Lesson_4_finished.mel 的用户界面脚本的完整版本。
,