MEL是来源于UNIX壳脚本的一种语言。因此,MEL在很大程度上是依靠执行命令来完成操作(如执行UNIX壳中的命令),而不像其他语言那样操纵数据结构、调用函数或使用面向对象的方法。        

用于控制Maya的大多数命令类似于 UNIX 命令行实用程序:通过许多选项来修改自身行为的独立小程序。        

认识到MEL起源于壳脚本,有助于解其更加独特的功能。        

快速概述

指定和值              

MEL 中的指定运算符是等号 (=)。MEL 还具有类似于 C 和 Java 语言的快捷指定运算符(+=-=/=*=++--等)。              

MEL 是一种强类型语言 (strongly typed language),但在多数情况下允许隐式声明和键入。当声明一个变量时,便同时声明了其类型,并可以选择指定一个初始值。              

变量名称以 $ 开头,后面带一个字母,然后是包含字母/数字/下划线的任意组合。与 PERL 不同的是,所有类型的变量(标量和复合)均以 $ 开始。              

MEL 具有常用整数 (Int)、浮点 (float) 和 字符串数据类型。它还包含向量数据类型,这是浮点的三元值(在处理 3D 数据时非常有用)、数组(变量大小的列表,其中所有元素都是同一类型)和矩阵(矩阵是固定大小的浮点二维表)。数组中的所有项目必须是同一类型。              

int $a = 5; float $b = 3.456; vector $v = <<1.2, 3.4, 6.5>>; float $ar[] = {1.2, 3.4, 4.5}; // An array of floats matrix $mtx[3][2]; // A 3x2 matrix of floats

无法在 MEL 中创建数组的数组。              

MEL 会尽可能自动转化类型。              

控制及循环语句和运算符              

MEL 的控制语句非常类似于 C 和 Java 语言。              

if (?$a == $b) { ... } else if ($a > $b) { ... } else { ... } $a = ($b > 10) ? $c : ($c - 10); switch ($color) { case "blue": ... break; case $c1: ... break; default: ... break; } while ($a < size($arry)) { ... } do { ... } while ($a > 0); int $i; for ($i = 10; $i > 0; $i--) { print($i+"... "); } print("Blastoff!!!"); string $arry[3] = {"red","green","blue"}; for ($k in $arry) { ... }

定义和调用步骤              

可以使用以下语法创建用户定义的步骤:              

global proc <return type> <name>(<arg list>) { ... return <exp>; } global proc float squareAndAdd(float $x, float $y) { return $x * $x + $y; } square(5.0, 2.0); 27

如果省略全局关键字,该步骤仅在其已被定义的脚本文件中可用。              

如果步骤不返回值,则省略返回类型关键字,且不包含 return 语句。              

global proc msg() { print("Hello world "); }

注释

MEL 使用前面带有 // 的 C++ 式 行 释,以及由 /**/ 包围的自由形式注释。

MELisms

MEL 编程的一些特性会难倒经验丰富的程序员以及初学者。

 MEL 中的每个语句必须以分号 (;) 结束。

if ($a > $b) {print("Hello");}; // Both semicolons are required!

与某些脚本语言/环境不同(但与 Logo 语言类似),声明一个可返回值的表达式并不会自动在 MEL 中打印值。这样做反倒会导致错误。

3 + 5; // Error: 3 + 5; // // Error: Syntax error // print(3+5); 8

在 MEL 中,经常会使用相同的命令来创建操作、编辑现有操作并查询有关现有操作的信息。在每种情况下,标志都会控制命令所要进行的操作(创建、编辑或查询)。

// Create a sphere named "mySphere" with radius 5 sphere -radius 5 -name "mySphere"; // Edit the radius of mySphere sphere -edit -radius 3 "mySphere"; // Print the radius of mySphere sphere -query -radius

在 MEL 中,可按照命令语法(类似于 UNIX 壳命令)和函数语法键入命令。使用命令语法,可以省略单字字符串周围的引号,并使用空格而不是逗号来分隔参数。

setAttr("mySphere1.translateX",10); // Function syntax setAttr mySphere1.translateX 10; // Command syntax

函数语法会自动返回值。若要使用命令语法获取返回值,必须将命令扩在反引号中。

$a = getAttr("mySphere.translateX"); // Function syntax $b = `getAttr mySphere.translateY`; // Command syntax

,