链接用户界面
 
 
 

目前,窗口中的用户界面不会执行任何操作:移动滑块和单击复选框没有任何作用。在本节中,将学习如何将用户界面链接到之前使用的 makeRoll 过程:

在下列步骤中,将修改用户界面脚本。

GettingStartedMaya2012LessonData\MEL 项目目录中的 mel 子目录内,会提供名为 mel_Lesson_4_finished.mel 的用户界面脚本的完整版本。

显示当前选定对象

makeRoll 过程对当前选定对象不起作用。将修改该脚本,这样 textField 控件将显示当前选定对象的名称。

若要返回当前选定对象的名称,请将 ls 命令 (list) 与 selection 一起使用。因为可以在 Maya 中选择多个对象,所以从 ls 命令返回的结果不是一个字符串,而是一个字符串数组,即使仅选中一个对象时也是如此。数组是一个有序的值列表,这些值用于将相同数据类型的多个项目存储在一个变量内。makeRoll 过程无法将字符串数组作为参数,因此必须修改 ls -selection 所返回的数据。

注意有关 ls 命令的详细信息,请参见“MEL 命令参考”中的 ls

有关 arrays 的详细信息,请参见《Maya 用户手册》中的“数组”

在接下来的部分中,还将创建一个新的“tempMEL”选项卡,以便在学习命令时有一个位置来测试这些命令。

将当前选定对象的名称存储为变量

  1. 创建一个新的 MEL 选项卡(“脚本编辑器”(Script Editor)中的“命令 > 新建选项卡”(Command > New Tab))。
  2. 将该选项卡重命名为 tempMEL“脚本编辑器”(Script Editor)中的“命令 > 重命名选项卡”(Command > Rename Tab))。
  3. “tempMEL”选项卡中键入以下命令:
    select -allDagObjects;
    

    该命令会选择所有场景对象。

  4. “tempMEL”选项卡中键入以下命令:
    $all_selected_objects =`ls -selection`;
    

    该命令会列出当前选定对象并将其名称输出到某个变量。

  5. “tempMEL”选项卡中键入以下命令:
    print $all_selected_objects;
    

    该命令会将存储对象列表输出到“脚本编辑器”(Script Editor)

  6. 执行“tempMEL”选项卡中的这些命令。

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

    roll_Cube pPlane1
    

变量 $all_selected_objects 是一个字符串数组。即,在该变量内存储多个字符串。数组中的值称为元素。

注意

在编程中会经常使用数组来管理大型数据集。如果未将数组用于存储大型数据集,则需要为每个数据元素创建一个变量,使脚本很难维护并占用大量内存。有关数组的详细信息,请参见《Maya 用户手册》中的“数组”

在本示例中,仅需要将 roll_Cube 过程应用到场景中的一个对象。通过使用方括号 ([]),可以引用数组的单个元素。

将当前选择减少到一个对象

  1. 将下列命令添加到“MEL2”选项卡中的用户界面脚本的顶部:
    select -allDagObjects;
    string $all_selected_objects[]=`ls -selection`;
    
  2. 在“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 开始计数。

    文本字段现在会显示在场景中创建的第一个对象。

链接复选框

与按钮类似,复选框也可以使用命令标志。复选框具有比按钮更多的功能,因此命令标志是不同的。复选框有三个可能的命令标志;changeCommandonCommandoffCommand

可以使用带有 edit 标志的 checkBox 命令在用户界面中更改复选框的状态。

在用户界面中更改元素的值

  1. 在“tempMEL”选项卡中,通过执行以下命令,更改“make roll”窗口的复选框的状态:
    checkBox -edit -value 0 $box_sim_checkbox;
    

    先前启用的“Box Simulation”复选框现在被禁用。可以使用值 1 重复该命令来重新启用该复选框。

    这显示了带有命令的 edit 标志的用法,该命令作为某个命令标志的参数,而使用该命令标志可更改值。

    现在将使用 changeCommand 标志来保持两个复选框同步,这样会在一个复选框更改了状态时,会将另一个复选框设定为相反的状态。

  2. 在“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 过程。

若要获取控件的值,必须使用查询标志。通过查询标志,命令可以返回场景中的属性值。

在用户界面中查询值

  1. 通过向右拖动滑块,或者通过在直径滑块的文本字段中键入值,可以将直径滑块的值更改为 10.1。
  2. 通过在“tempMEL”选项卡中键入以下命令,输出直径滑块的值:
    print ("The diameter is: " + `floatSliderGrp -query -value $diameter_float`);
    

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

    The diameter is: 10.1
    

    使用查询标志可以将值输出到“脚本编辑器”(Script Editor)

我们将在脚本中添加一个新过程,该过程会将 makeRoll 命令与从用户界面查询到的参数值一起使用。然后,“执行”按钮将使用该过程。

为“执行”按钮创建过程

  1. 将以下内容添加到“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`;
    }
    
  2. 用户界面的每个参数是通过查询用户界面元素来定义的。

现在可以设定“执行”按钮来调用刚创建的过程。

将“执行”命令链接到过程

  1. 在“MEL2”选项卡中,用以下内容替换 -command "print (\"something\");"; 行。
    -command ("makeRoll_calback "+$obj_name_text+" "+$ground_int+" "+$box_sim_checkbox+" "+$diameter_float);
    

参数 $obj_name_textground_intbox_sim_checkboxdiameter_float 为该过程提供执行 makeRoll 脚本所需的值。

现在用户界面具备了全部功能。

GettingStartedMaya2012LessonData\MEL 项目目录中,会提供名为 mel_Lesson__4_finished.mel 的用户界面脚本的完整版本。