热烈欢迎新会员,新手报到帖maxscript BUG和技巧收集场景助手3.0下载飞浪脚本零起点入门
返回列表 发帖

欢迎捐助本站:支付宝账号 cgplusplus@qq.com,谢谢支持!

[原创]飞浪脚本零起点入门系列(六) MAXScript的条件选择语句和找面数为0的物体

声明:本教程为CG++原创,转载请注明出处,谢谢合作:)

 查看上一节: MAXScript的数组,循环语句和重命名脚本写法

飞浪脚本零起点入门系列(六) MAXScript的条件选择语句和找面数为0的物体

本节关键词: if...then...[else]    if...do    case...of

前面讲过数组,讲过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后面的语句就不继续执行了。
再来看:
if a > 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语句)
这些是为了使大家更清楚的明白if和case语句的原理,希望大家踊跃的试试。你做了哪一道题,请在下面写上题目内容以及你的答案。如果你一眼就能看穿这些程序,就帮助下其他刚入门的同学。第一个回答正确的加2金币,5题共10金币。请大家继续支持此系列教程。

下一节:maxscript卷展栏和对话框--rollout和createdialog语句初探

[此贴子已经被作者于2009-2-4 18:08:10编辑过]

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
日思日睿,笃志笃行!

欢迎捐助本站:支付宝账号 cgplusplus@qq.com,谢谢支持!

[em69]&nbsp;&nbsp;

[此贴子已经被作者于2008-11-12 14:06:12编辑过]

TOP

欢迎捐助本站:支付宝账号 cgplusplus@qq.com,谢谢支持!

很好的教程,好好的复习了一遍.

TOP

速度真快

慢慢看哦.

TOP

终于等到了
学习+收藏
谢谢飞浪大哥

TOP

我顶,使劲顶!

TOP

1 obj=#()
for i in geometry do
( if $.material == undefined
do ($.isSeleted==true
append obj i
)
)
请飞浪老师赐教。这是我写的第一个maxscript.

TOP

应该是$.isSeleted=true
是一个等号。

TOP

不错,勇于尝试才能有进步~

程序有待改进,赋值,for循环再看看,另外我上面那个$.material == undefined只是个例子,实际应用要变换一下。加油~

日思日睿,笃志笃行!

TOP

交作业!跟上飞浪老师的讲课进度!

第1题:找出所有没有上材质的物体

obj = #()
for i in geometry do
(
if i.material == undefined then append obj i
)
select obj

第2题:收集场景中所有的standard材质(不太明白,是说找出所有材质是standard的物体吗?)

obj = #()
for i in geometry where classof i.material == standard do append obj i
select obj


第3题:调场景中所有VRayLight的细分到20

for i in lights where classof i == vraylight do i.subdivs=20


第4题:把场景中所有Teapot的线框颜色改成红色

$teapot*.wirecolor = red

第5题:判断一个box的长,大于、等于或小于100的情况,然后输出相应字符串(先选择一个box物体再执行以下语句)

i = $.length
case of
(
( i > 100 ): print "长度大于100"
( i < 100 ): print "长度小于100"
default: print "长度等于100"
)



[此贴子已经被作者于2008-11-14 11:41:56编辑过]

TOP

返回列表