Mel的使用

  虽然接触 Maya 开发已经快接近两年了,但是发现自己其实并不会 Mel 语言!很多 Maya 中的命令也不知道怎么查询,有时候需要优化 Maya 自带功能时,不管是阅读还是修改都带来了极大的障碍。因此还是抽个时间把 Maya 文档中的 Mel 模块看一遍才行。

  下面记录一些知识重点!


查询命令 whatIs

  有时候我们不知道 Maya 做了什么具体操作,通常会打开脚本编辑器中的“Echo All Commands”,来查看执行过程中调用的命令。

  我们可以用 whatIs 查询命令。whatIs 命令将返回一个字符串,表示该参数是一个命令、程序、脚本或未知。如果给它一个脚本名称,它将返回脚本路径。

  以 Maya 的添加分段功能为例,键入命令:

SubdividePolygon;``` ,运行后返回结果: ```// Result: Run Time Command``` 。我们可以找到
SubdividePolygon 命令在文件中的部分如下所示: ```Mel runTimeCommand -default true -annotation (uiRes("m_defaultRunTimeCommands.kSubdividePolygonAnnot")) -category ("Menu items.Modeling.Edit Mesh") -command ("performPolySubdivide \"\" 0") SubdividePolygon;

再次键入命令查询 whatIs performPolySubdivide; ,运行后返回结果 // Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2018/scripts/others/performPolySubdivide.mel // ,在这里我们就找到具体的执行文件了。


拖拽属性到脚本编辑器

  Maya 可以使用鼠标中键将属性从“属性编辑器”(Attribute Editor)拖放到“脚本编辑器”(Script Editor)。node.attributeName 会直接添加到“脚本编辑器”(Script Editor)中。


Source Script

  执行文本文件的内容。

  在调用自定义的 mel 的方法前,需要先定义,也就是先把方法运行声明一次。使用任意文件名保存脚本,然后使用 source 命令将其源化。脚本源化后,可以按任意顺序调用其任何全局程序。

  可以点击脚本编辑器中的 按钮源化脚本。如果在源化脚本之后更改了脚本,那么 Maya 不会自动拾取该更改。您需要使用“文件 > 源化脚本”(File > Source Script)重新运行脚本。

  如果不确定是否需要源化脚本,则可在调用之前测试函数在 MEL 中是否可用:

if (!`exists myLocalProc`){
    source "xxx.mel";
}
myLocalProc;

注意: MEL 脚本和 mayaAscii 文件是不同的。如果将 .ma 文件重命名为 .mel 文件并源化该文件,则可能会出错。或者,如果将 .mel 脚本重命名为 .ma 文件并打开该文件,则可能会出错,或者甚至会使 Maya 崩溃。Maya 在读取文件时会执行一些特殊操作以提高性能,并非所有命令都与此兼容。


脚本编辑器自动补全

  开启 Command -> Command Completion ,键入时自动完成命令名称。如果启用“显示工具提示帮助”(Show Tooltip Help),则命令名称将在您键入时自动显示。如果禁用“显示工具提示帮助”(Show Tooltip Help),则必须按住 Ctrl+空格键才能显示它们。

  开启 Command -> Object Path Completion ,键入时自动完成对象路径名称。如果启用“显示工具提示帮助”(Show Tooltip Help),则命令名称将在您键入时自动显示。如果禁用“显示工具提示帮助”(Show Tooltip Help),则必须按住 Ctrl+空格键才能显示它们。


判断存在性

  • 命令和脚本: exists
    如果参数为有效的命令、子程序或脚本,exists 命令将返回 true。

    if (exists("sphere")) {
        sphere; // make a sphere
    }
  • 对象: objExists
    如果对象存在且包含某个明确的名称,objExists 函数将返回 true。

    sphere -name "george";
    // Result: george makeNurbSphere1 //
    print(objExists("george"));
    1
    print(objExists("martha"));
    0
  • 节点上的属性: attributeExists
    使用 attributeExists 检查节点上是否存在给定属性。命令的形式为attributeExists("attributeName","nodeName")

    if (attributeExists("visibility","mySphere")) {
        setAttr mySphere.visibility on;
    }

快速终止当前 Maya

evalDeferred -lp "$i = `getpid`";
evalDeferred -lp "system(\"taskkill /PID \"  + $i +\" /f\")";

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!