0

我在寻找在 mel 脚本中调用 python 函数的方法时遇到了一些麻烦。

基本上,我有一些 Mel scipts,其中一个在 Maya 中创建了一个新架子,其中有一些照明工具按钮(spotLight、areaLights 等)

由于我在脚本方面还是个菜鸟,更何况我目前只学过python,至于mel,我知之甚少。这对我来说是一个很大的障碍。我尽量不要过多地编辑任何脚本,以减少混乱和我发生的任何错误。

  1. 在我的启动代码中,有几个按钮使用 .xpm 和 .png 作为其图标。在最后几行中,ext 最初是 .xpm 并且我将其更改为 .png 在我意识到我仍然需要一些 .xpm 图标后被认为是错误的。那么 MEL 中有 OR 函数吗?

    global proc shelf_lighting() {
    
        if (Dpublishmel("objGetMultiConfigs \"objkind\" \""+$show+"\" \"\" \"\" \"maya\" 1", $result)) {
            string $kindRows[] = stringToStringArray($result[0], ";;");
            $objkinds = $kindRows;
        }
    
        string $aboutString = `about -v`;
        string $aboutStringArr[] = stringToStringArray($aboutString, " ");
    
        string $versionStringTemp = $aboutStringArr[0];
        string $versionString = match("[0-9]+[\.]*[0-9]+", $versionStringTemp);
        float $version = $versionString;
    
        string $pycmd = "evalDeferred \"python(\\\"^1s\\\")\"";
    
        string $ext = ".png";
            if ( int($version) > 2009 ) {
                $ext = ".png";
            }
    }
    
  2. 我正在尝试从"source \"rexLightFuncs.mel\";\nrexSpotLightCreate \"\";"`;更改命令 到如下代码所示的那个。这是一个 python 函数,我正在尝试将它合并到 mel

    import DLightBuild.DLightBuild as build
    light=build.DLightBuild();light.createLight('spotLight');
    

    这个 python 命令的文件来自 /tools/utils/maya/python/DLightBuild,包含 .py 文件 - DLightBuild,由于某种原因,它不起作用,因为我从我在谷歌某处看到的一个例子中得出这个搜索。

    $spotLightButton = `shelfButton
        -enableCommandRepeat 1
        -enable 1
        -width 34
        -height 34
        -manage 1
        -visible 1
        -label "Create a Spot Light"
        -image1 "spotLight.png"
        -style "iconOnly"
        -command "import sys;sys.path.insert(0, \"/tools/utils/maya/python/DLightBuild/\");import DLightBuild.DLightBuild as build;reload(build);light=build.DLightBuild(); light.createLight('spotLight')" 
    -sourceType "python";
    
  3. 最后,每当我尝试对我的代码进行测试运行时,查看图标图像是否正确以及它是否正在执行正确的功能......如果我只是shelfButton按照代码第二部分中看到的那样运行它(顺便说一句,在 Mel 中),它在我的 scriptEditor 末尾创建了一个按钮(它就像下面的另一个停靠窗口),而不是在我现有的架子或新架子中。对此有何建议?

感谢为提出的任何问题提供的任何建议。提前谢谢了

4

1 回答 1

0

Mel 确实有一个逻辑或运算符 ||,但它只对数字进行逻辑 OR 测试并且只返回 1 或 0,所以它没有太大帮助;要检查 img 或 png 扩展名,就像

 int $is_valid = gmatch($filename, "*.png") || gmatch($filename, "*.xbm");

你总是可以像这样将 mel 包裹在 python 中:

import maya.mel as mel
mel.eval("your mel command here as a string");

从 mel 调用 python 你可以做

python ("python goes here as a string");

像这样混合 python 和 mel 总是很烦人,您可能需要考虑硬着头皮将旧的 Mel 脚本转换为 python,这样您就不必永远忍受这种情况。一旦你完成了一些转换,就非常简单了,在 99% 的情况下,python 版本更简单、更干净。

因此,在您的示例中,您可以将当前命令包装在“python()”中;制定正确的转义是一件令人烦恼的事情。

于 2014-03-13T16:54:08.593 回答