如何在Mel中调用Python及图标保存问题
我在寻找在mel脚本中调用python函数的方法时遇到了一些麻烦。
基本上,我有几个Mel脚本,其中一个是在Maya中创建一个新的工具架,里面有几个灯光工具按钮(比如聚光灯、区域灯等)。
因为我在编程方面还是个新手,更别提我到目前为止只学习过python,而对mel几乎一无所知。这对我来说是个很大的障碍。我尽量不对任何脚本进行太多修改,以减少混淆和可能出现的错误。
在我的启动代码中,有几个按钮使用了.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"; } }
我想把命令从"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";
最后,每当我尝试测试我的代码,看看图标图片是否正确,以及它是否执行了正确的功能……如果我仅仅通过
shelfButton
运行代码(顺便说一下,这是在Mel中),它会在我的脚本编辑器的底部创建一个按钮(就像下面的另一个停靠窗口),而不是在我现有的工具架或新的工具架中。对此有什么建议吗?
感谢大家对我提出的问题给予的任何建议。提前谢谢你们!
1 个回答
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()"里面;弄清楚正确的转义方式确实让人烦恼。