maxscript函数

举报
wh_bn 发表于 2021/12/16 01:04:20 2021/12/16
【摘要】 函数function 函数作为程序中不可分割的一部分,扮演着极其重要的角色。maxscript中的函数定义如下: (function | fn) <name> { <parameter> } = <expr> 例如一个简单的函数: fn p = print localtime 运行之后...

函数function

函数作为程序中不可分割的一部分,扮演着极其重要的角色。maxscript中的函数定义如下:
(function | fn) <name> { <parameter> } = <expr>
例如一个简单的函数:
fn p = print localtime
运行之后得到:p(),这样这个函数就定义成功了,调用的时候你只需要执行一下p(),就会运行此函数“=”号后面的内容,
此函数的意思是输出当前时间。
接下具体来看,fn是声明这是一个函数,就跟rollout 表示创建一个栏一样。fn是缩写,全写是function就是函数的意思,
所以刚才那个函数也可以写成:
function p = print localtime
p是函数的名字,“=”号后面是函数内容,可以是任意代码块(block)。所以一个函数至少需要四个部分,即声明fn,
函数名称,“=”号和后面的代码。
可以这样理解,所谓函数就是能完成一定功能的代码块,只不过把它写成函数后可以随便调用,像print也是一个函数,它
的功能是maxscript已经写好了的。
再看下面这个函数:
fn ranMtlColor col =
(
if classof col == color then
for i in
meditmaterials where classof i == standardmaterial do i.diffuse = col
)

这个函数多了一个部分,就是函数名称ranMtlColor 加了个参数col,这个col是函数的一个变量,只是个形式参数,它只在
此函数内有效,运行此函数,得到ranMtlColor ()表示创建函数成功,然后调用函数:
ranMtlColor red
这次调用的时候函数名称后面带了一个参数,这是个实际参数,red是颜色值红色,当然你也可以用(color 255 0 0)来表示。
这个函数的意义是把材质编辑器中的所有standard材质的固有色调成红色。
这样,你就可以随意修改颜色了,如
ranMtlColor blue
ranMtlColor (color 34 64 123)
形式参数也可以先赋个值,即初始化。如:
fn ranMtlColor col:(color 255 0 0) =
(
if classof col == color then
for i in meditmaterials where classof i == standardmaterial do i.diffuse = col
)

创建这个函数后,因为col已经给了个初始值(color 255 0 0),这样调用函数的时候可以直接执行ranMtlColor()而不带参数,
这样就默认颜色(color 255 0 0),如果想修改此参数则调用如下:
ranMtlColor col:(color 0 255 0)

 

return表达式

有时候函数不一定要执行完才返回结果,这个我们可以用retuen提前返回,如:
fn myfunction num =
( if classof num == integer and num >= 1 then
 for i in 1 to num do
 ( if i == 50 then return "提前返回"
 )
 format "完全执行/n"
)

运行函数,然后调用:
myfunction 10 --得到结果"完全执行"
myfunction 100 --得到结果"提前返回",因为当i等于50的时候,直接跳出了函数返回 "提前返回",所以i就在50的时候停止
循环了,这样在计算大量数据时可以节约很多运算量。

当然函数也可以返回指定的结果,如:
fn calcN n =
( sum=0
 if classof n == integer and n >= 1 then
 (  for i = 1 to n do sum+=i 
 )
 sum
)

这个函数是把正整数累加,即1+2+3+...+n
如:执行calcN 100,得到正确答案5050,执行calcN -1得到0,那么就可以弹出对话框说输入数据不规范了。

 

函数自身调用--递归函数
函数可以自己调用自己,看下面的例子:
fn ranMtlColor mat col =
(
 if classof mat == Standardmaterial then mat.diffuse = col
 else if classof mat == Multimaterial then
 for j in mat do ranMtlColor j col --调用自己
 else ( )
)
这样做可以减少代码重复,并且循环到最里面的元素。这个函数作用是把多维子材质的所有standard子材质固有色改成指定颜色。
或者你觉得可以一句搞定没必要这么复杂,但是你看一下下面这个材质:
m = Multimaterial ()
m[1]=Multimaterial ()
meditMaterials[1] = m
多维子材质套多维子材质,还可以再往里加,如果用这个函数:
ranMtlColor meditMaterials[1] red
一下搞定里面所有的standard材质。
递归函数可以用在材质转换,文件夹读取等等脚本里面。

函数可以互相调用,但要注意的是,在脚本里面后面的函数可以调用前面的函数,前面的不能调用后面的,函数里面的变量都属于
局部变量,当然特殊声明global除外。
函数道理不难懂,就是把你平时写的一段代码给安上一个名称,下次直接喊那个名字,就执行你那段代码,你可以把你在rollout
里面的按钮都写成函数(当然是需要的时候),在on ... pressed do时直接调用函数。活用函数,往往能得到意想不到的效果。

 

转帖:http://www.cgplusplus.com/bbs/dispbbs.asp?boardid=2&Id=520

文章来源: blog.csdn.net,作者:fengda2870,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fengda2870/article/details/5360148

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。