循环语句 for

来源:互联网 发布:淘宝中差评处理掉毛 编辑:程序博客网 时间:2020/10/20 17:07

for循环可以逐个计算一列数值,集合,数组等等,刚刚说的数组正好派上了用场。
语法:for <var_name> ( in | = ) <sequence> ( do | collect ) <expr>
<var_name>是循环中的每一个单独的变量,<sequence>是循环的源数值,<expr>是表达式,|号左右表示可选项。看实例吧:

例一:for i in 1 to 10 do print i --输出1到10
print 输出函数,后面接所有类型数值,如:print selection[1].name --输出选择的第一个物体的名字
刚才那句执行的顺序是:首先赋值i=1,然后执行print i就输出1,再i进行自加,变成了2,又执行print i输出2...一直到i=10输出10才算完。这样就进行了循环。而且是每隔

1个数值输出一个值,下面来扩展:
例二:for i in 1 to 10 by 2 do print i --每隔两个数来输出i,于是我们就得到了奇数1,3,5,7,9。by就是控制每隔多少数值再执行do后面的表达式。默认不用by,则都是

每隔1个数值执行一下。
下面来看这句程序:
例三:for i in selection do i.name += "new"
selection 即所有选择的物体,相当于美元符号“$”,但是用法有时候不同。selection.count即选择物体数量,selection[i]即选择中的第i个物体,selection类似于一个

数组。上面那句的意思是,把所有选择物体的名字后面加一个"new",你再看看你选择的物体名称。上面那句还可写成:
for i in $ do i.name += "new"  在程序中建议尽量使用selection,因为如果你没有选择物体,那么这句就出错。
这两句是直接访问数组元素,从第一个开始,而不像前面的for i in 1 to 10 。。。还要数元素序号。这一句就跟平常简单的英文会话一样,可以翻译成:如果i(变量)在

selection(选择物体)里面,那么就do(做)什么什么。
例四:for i in lights do i.on = false 这句意思是说,把场景所有灯光关掉,i.on是开,i.off是关,跟日常开关一样。有人也许会问,你怎么知道所有灯光是用lights表

示呢?MAX工具栏上有个过滤器,想必大家都用过,里面有All,Geometry,Shapes,Lights,Cameras,Helpers等,比如你想改所有for i in cameras do ...就是对所有摄像机操作了。但是All在脚本里并不是所有物体。再回来看例四,你打个有目标点的灯光试试,再用那句就会出错了,因为lights把灯光目标点也算在内,而目标点是没有开关的啊,那怎么办呢?这就要把它过滤掉。再来看

例五:for i in lights where classof i != targetobject do i.on = false 这里面加了一句where classof i != targetobject这句相当一个过滤器,当变量i在lights

里面逐个执行的时候,先要过这一关,如果classof i != targetobject返回true就继续执行do后面的语句,如果返回false就直接跳到下一个元素。这里用到了maxscript的比较运算符!=,maxscript比较运算符即把两个数据进行比较,返回true或者false,所有比较运算符有:

比较运算在线手册 : http://www.cgplusplus.com/online-reference/maxscript-reference/source/comparison_expressions.htm

假设a和b是分别要比较的两个数据,下面即把a,b进行比较:
a == b  --相等,如果相等就返回true,不相等就返回false,下面道理相同
a != b  --不等于
a > b   --a大于b
a < b   --a小于b
a >= b  --a大于或等于b
a <= b  --a小于或等于b
例如:1 > 2 返回false,1 >= 1 返回true

这里还用到了类别运算classof,classof是用来判断一个max节点的类别的,用法是直接classof + 节点,如果我们不知道一个物体的类别,就直接选择它然后classof $,即
判断选择物体的类别,比如上面我本来不知道灯光目标点的类别,于是我选择一个目标点,再运行classof $,就返回了它的类别targetobject,这样,就可以过滤掉所有类别是targetobject的物体,以免出错。
下面来讲一个重命名脚本,我们看到一些脚本里都有重命名功能,其实这个功能要写出来非常的简单,简单到让人惊讶。上面已经牛刀小试,例三:for i in selection do

i.name += "new"就是一个重命名功能,是在所有选择物体后面加个"new"。真正的重命名脚本如下:
例五:for i in objects do i.name = uniquename "cgplusplus"
这里无非是用到一uniquename,uniquename在线手册
最下面有它的功能。

它的原理跟你创建物体的命名一样,把物体以所给字符串为基础进行命名,后面跟数字序号。比如我执行上面那两句之后,再看场景中的物体名字分别变成了

cgplusplus01,cgplusplus02,cgplusplus03...
objects --即场景所有物体,objects.count即场景所有物体数量。objects[i]即场景中的第i个物体。objects也类似一个数组。
再把上面那句改一下:
例六:

newName = "cgplusplus"
for i in objects do i.name = newName + "_" + i.name

这里就是将所有物体objects的名称加个前缀“cgplusplus_”,这个下划线"_"并没有先赋值,这里是想说,newName + "_" + i.name这一句可以是任意的字符串,可以用加号
进行调整。上面是先把名称"cgplusplus"赋给变量newName再调用它,建议大家以后也这样做先赋值再调用,因为这样程序修改起来非常方便。
下面进行扩展:
例七:for i in cameras do i.name = uniquename "MyCamera" --把场景摄像机名字改成MyCamera01,MyCamera02,MyCamera03...
例八:for b in $box* do b.name = uniquename "MyBox" --把场景所有名称以“box”开头的物体重命名,$box就是名称为box的物体,后面加一个通配符“*”就表示任意字
符,$box*就是指名称以“box”开头的物体。注意变量b前后要一致,小心都写成了i。
例九:for vl in lights where classof vl == VRayLight do vl.subdivs = 12 --把场景中所有VRayLight的细分调到12
例十:for g in geometry do g.wirecolor = red --把所有几何体的线框色改成红色,颜色常量请查看第二节。
我想这例子够多了,只要你肯动脑筋,就可以在工作和学习中使用一句简单的语句,就实现很强大的功能。循环语句还有while...do没讲,以后用到再讲吧.
这些讲的都是用maxscript listener执行脚本,可能有些人想学习怎么样把他们写成界面,按钮然后来使用吧?别急,后面我会讲到,把这几节基础内容搞清楚了,后面学起
来简单很多。写教程的确很费脑筋,希望我的工作没有白费,对想学习max脚本而无处入门的同仁给以光亮。也希望大家继续支持我,谢谢。

 

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