《COMPLETE MAYA PRO GRAMMIN G VOLUME II》 1 入门介绍

1.1示例文件

你可以在以下网址找到本书的所有示例文件;
www.davidgould.com
网站中包含了以下内容:
1) MEL脚本,C++源代码,以及书中例子的生成文件;
2) 额外的MEL脚本例子
3) 额外的c++源代码例子
4) 本书的一些错误改进
5) 不断更新的一些内容
6) 更新的其他有关网站以及在线资源

1.1.1 示例插件的编译

Maya和c++的编译器总是不断发布着新版本。比起提供有可能过时的指令,本书选择在以下的网站提供读者完整配套文件的下载或者编译:
www.davidgould.com
在这里你能找到c++源码,以在你自己的电脑上编译你需要的插件。同时也附有从头创建你自己插件的方法。

1.1.2 MEL脚本的获取

对于获取的MEL脚本,maya必须能找到他们。它们可能包含了源代码的完整路径,但如果有多个MEL脚本,那么更改MAYA_SCRIPT_PATH环境变量或许会更好。这个变量只需要简单地更新,如下所示的就是用来包含示例的MEL脚本目录的方法:
1. 打开脚本编辑器。
2. 执行下面的命令初始化$exampleScripts来包含示例的MEL脚本目录的路径。
比如:
   string $exampleScripts = "C./DavidGould/MEL Scripts".
当你在windows中用反斜杠指定路径,一定要使用双反斜杠。一个反斜杠会被解释为转义。下面举例说明了用反斜杠来指点同样的路径。
string $exampleScripts- "C-\\DavidGould\\MEL Scripts";
maya会自动把反斜杠转换为正斜杠
3. 执行下面的操作:
string $newScriptPath-$exampleScripts + ..... +'getenv "MAYA_SCRIPT_PATH"'-
putenv "MAYA_SCRIPT PATH" $newScriptPath;
第一行初始化了举例的MEL脚本的$newScript ptPath变量,然后为当前的设置追加了MAYASCRIPT_PATH变量。
第二行使用了putenv命令来设置路径的MAYA_SCRIPT_PATH变量。


通过对MAYASCRIPT_PATH的更新,你也可以更新其他的MEL脚本。比如对于foobar.mel脚本,可以用下面的方法执行:
source foobar.mel;
没开启一次maya都要进行前面提到的步骤。所以,如果maya重启了,那么你需要执行前面的步骤。


1.2在脚本编辑器执行mel代码

在本书中有很多mel的代码片段,相信很多读者都想吧他们输入到脚本编辑器并运行他们,这基本适用于大多数情况。但是,有时你会遇到这种问题——你执行不同模块的mel代码中,有名字相同但数据类型不同的变量。你可以用下面的例子来解决这个问题:


1.打开脚本编辑器
2.执行下面的代码:
$myVar = 1.0
会显示下面的结果:
/ / Result: 1 / /
这时为了建立一个$myVar的变量并初始化
3.下面让我们看看如果在mel代码中有不同数据类型的同名变量时会发生什么
$myVar = " hi "
这会产生一个错误
/ / Warning" Converting string " hi" to a float value of 0. / /
/ / Result: 0 / /
4.执行下面的代码:
whatIs “$myVar”
由此打印它的的数据类型
// Result : float variable //
问题在于尽管你执行的是另外一个mel代码片段,但是$myVar仍然存在,之所以将它初始化成一个string类型失败,是因为它早已被声明为了一个float。一个变量只能被声明一种数据类型(string,float,int等),而且不能被改变。
       最根本的问题在于,所有在脚本编辑器里被声明的变量都会自动被声明为全局变量,哪怕你并不想这么做。所以,执行下面这种声明:
 $myVar = 1.0
它看起来似乎在脚本中声明一个局部变量。下面这种写法在脚本编辑器里也是等价的:
global $myVar = 1.0
这个变量会在后台变为全局变量。若是一个变量被声明为了全局变量,那么我们是没有办法删除它的。唯一的方法就是,重启maya,由此来移除所有的全局变量然后从头开始。注意,这种问题在程序中也会存在,任何程序或者扩展在脚本编辑器里声明的变量也会被自动声明为全局变量。
我们需要找到一种声明局部变量的方法。遗憾的是,我们并没有一个关键字(和global相反)用于声明局部变量。尽管如此,还是有一种隐藏的声明局部变量的方法。在使用代码块的时候,一个变量会在后台被声明为局部变量。在代码块结尾这些变量会被自动删除。这恰恰保证了在运行mel代码的时候,我们不再会定义同名变量。这也就结局了对全局变量命名空间的“污染”,你只需要去学习或者使用它。
5.重启maya并在此打开脚本编辑器。
6.执行以下的代码:
{
$myVar = 1.0 ;
print $myVar ;
}


$myVar会被打印出来:
1(这个是打印结果哦)
因为变量的声明被隔在了代码块的大括号中,所有在函数块中声明的变量都会自动声明为局部函数。当后大括号(})出现时,所有在代码块中声明的函数都会被删除。这也意味着,$myVar变量在代码块之后将不复存在,也不会被添加到全局变量的列表中了。
7.执行下面的代码:
{
$myVar = ‘hi’;
print $myVar ;
}


然后就会打印出:
hi
这次就不会报错,因为这个函数是一个局部变量,并且在代码块结束的时候就被删除了。


因此,一条黄金规则:如果你想在脚本编辑器里执行mel代码,那么把它封装在一个代码块里以保证能正常运行。很多时候你会想知道一个变量是不是全局变量,下面的mel代码的目的就是检测变量是否是全局的(如果是返回True,如果不是返回False):
global proc int isGlobal( sting $var )
{
string $ globals [ ] = 'env' ;
for ( $glob in $globals )
{
if ( $glob == $var )
return true;
}
return false;
}


这段代码可以方便地检测$myVar是不是全局变量
isGlobal(“$myVar”)
会返回0(也就是false)。记得给变量名字加上引号(”),这表示这个你传递的是这个变量的名字而不是它的值。同时这个小程序(脚本)作用于全局,你可以在maya中的任何地方调用它,包括在脚本中,脚本编辑器中等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值