如何在Mel中调用Python及图标保存问题

0 投票
1 回答
3980 浏览
提问于 2025-04-17 22:06

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

基本上,我有几个Mel脚本,其中一个是在Maya中创建一个新的工具架,里面有几个灯光工具按钮(比如聚光灯、区域灯等)。

因为我在编程方面还是个新手,更别提我到目前为止只学习过python,而对mel几乎一无所知。这对我来说是个很大的障碍。我尽量不对任何脚本进行太多修改,以减少混淆和可能出现的错误。

  1. 在我的启动代码中,有几个按钮使用了.xpm和.png作为图标。在最后几行,扩展名最开始是.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中),它会在我的脚本编辑器的底部创建一个按钮(就像下面的另一个停靠窗口),而不是在我现有的工具架或新的工具架中。对此有什么建议吗?

感谢大家对我提出的问题给予的任何建议。提前谢谢你们!

1 个回答

0

Mel确实有一个逻辑或运算符 ||,但它只对数字进行逻辑或测试,并且只返回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()"里面;弄清楚正确的转义方式确实让人烦恼。

撰写回答