MAXScript的条件选择语句和找面数为0的物体

来源:互联网 发布:概预算软件破解版 编辑:程序博客网 时间:2024/05/23 18:36

前面讲过数组,讲过for循环,程序里面还有一个重要的组成部分,那就是今天要讲的条件选择语句。大家知道程序是非常严格的,对就是对,错就是错,不像哲学那么似是而非,那么如何通过程序语句判断对错呢?首先登场的是程序语句的一个重量级语句:
If Expression (If 表达式) 

If Expression在线参考手册http://www.cgplusplus.com/online-reference/maxscript-reference/source/if_expression.htm

语法形式有两种类型:
if <expr> then <expr> [else <expr> ]  或者
if <expr> do <expr>
<expr>是表达式,if后面的<expr>必须返回布尔常量true或者false,即对或者错。then,else,do后面的<expr>可以是任何其他的maxscript表达式。中括号表示可选择。
一个简单的例子:
a = 1
b = 2
if a < b then print "a小于b" --这句执行是这样的:首先执行if后面的表达式: a<b 返回结果对(true),是正确的就继续执行后面的print "a大于b"就输出了字符串"a大于b"。如果把它改一下:
if a > b then print "a大于b"  --首先判断 a > b 返回错(false),那么then后面的语句就不继续执行了。
再来看:
ifa > b then print "a大于b" else print "a小于b" --跟上面一样,不执行then后面的语句,但是程序自动找到了后面的else,而执行else后面的语句。这句翻译过来是:如果a>b,那么执行print "a大于b"否则执行print "a小于b"。这样就可以通过判断一个语句的true或者false来执行相关操作了。
下面讲一个maxscript计算面数的函数:
getPolygonCount <node> --计算节点<node>的面数和顶点数,返回一个数组。
例如,选择一个茶壶,执行 getPolygonCount $ 即计算此茶壶的面数和点数,返回结果是:
#(1024, 530)
这个数组里面,第一个值表示此节点的面数,第二个值表示节点的顶点数,通过前面讲过的数组我们知道,调取此物体的面数可以这样做:
a = getPolygonCount $ --获取选择节点的面数和点数
a[1] --返回物体的面数
我们看到有些脚本里面有选择面数为0的物体,那么这个脚本是怎么写的呢?
例子:
obj = #()
for i in geometry do
(
    a = getPolygonCount i
    if a[1] == 0 then append obj i
)
if obj.count !=0 then select obj else print "没有找到面数为0的物体!"
逐行解释:
obj = #() --先定义一个空数组,用来收集面数为0的物体
for i in geometry do
(    --在所有的几何体中逐个寻找
    a = getPolygonCount i --获取节点i的面数和点数
    if a[1] == 0 then append obj i --如果i的面数为0,那么就把它加入到数组obj中
)
if obj.count !=0 then select obj else print "没有找到面数为0的物体!"
--如果收集的物体个数不为0就选择收集的物体,否则,输出"没有找到面数为0的物体!"
如果你选择一个灯光,然后用getPolygonCount $也可以返回此灯光的面数和顶点数,不过结果是#(0,0),即没有面数,嘿嘿!
再回来看最开始那个例子,可以改成这样的:
a = 1
b = 2
if a < b do print "a小于b"  --把then换成了do,效果一样的,那么then和do有什么不同呢?
if...then和if...do不同点是,if...then后面接表达式后还可以接else执行其他语句,而do后面只能接一个表达式,别无他的选择了。所以在maxscript的编写中,建议扔掉if...do语句而用if...then,这样在程序的修改上有大大的好处。比如你写个语句:
if a < b then print "a<b" else () --else后面接一个空语句(),虽然不执行任何操作,但是如果后期想修改,直接在()里面添加内容即可,如果用if...do,后面就不能再加其他的选择了,你又要改成if...then...else。

Case Expression  (Case 表达式)

Case Expression在线手册http://www.cgplusplus.com/online-reference/maxscript-reference/source/case_expression.htm

Case表达式语法形式:
case [ <expr> ] of ( <cases> )
[ <expr> ]是可选表达式,<cases>是一系列可能会执行的内容
<cases>语法是:
<factor>: <expr>
default: <expr>
例如,选择一个灯光,执行下列语句:
case $.enabled of
(
    true: print "打开的"
    false: print "关闭的"
)
逐行解释:
case $.enabled of
(    --$.enabled是灯光打开或关闭的参数,可以读取,也可以设置,如果你单独执行一
    --下$.enabled,就可以看到选择灯光的打开状态,是true或者false
    true: print "打开的"
    --true和false都是<factor>,即可供选择的因子
    false: print "关闭的"
)
此程序的执行是这样的,首先执行$.enabled得到此灯光的开关状态,比如说关闭(false),然后到下面的因子中逐行往下寻找false的因子,当遇到第一个false时,就执行此false后面的表达式然后结束此case语句。但是如果一直不到false怎么办呢?那么结果就是undefined,为避免此类情况发生,我们可以再最后面加一个<factor>即default,如果找不到任何正确的<factor>,就可以执行默认的表达式。
例如:
a = 1;b = 1;
case of
(
    (a > b): print "a大于b"
    (a < b): print "a小于b"
    default: print "其他"
)
这个例子里面,case后面直接用of而省略了表达式,如果这样写,那么下面的每个<factor>就要返回布尔常量,如(a >b)返回false,(a < b)也返回了false,这样这两个后面的程序都不会执行,到最后default,即执行默认的程序。
下面请大家自己动手,写一些简单常用的程序,请用到if语句:
1、找所有没有上材质的物体(提示:没材质的判断方法为:$.material == undefined)
2、收集场景中所有的standard材质(提示:用classof判断材质类型,见第五节)
3、调场景中所有VRayLight的细分到20
4、把场景中所有类型为Teapot的线框颜色改成红色
5、判断一个box的长,大于、等于或小于100的情况,然后输出相应字符串(请用case语句)

 

转帖:http://www.cgplusplus.com/bbs/dispbbs.asp?BoardID=2&ID=174&replyID=&skin=1

原创粉丝点击