标题: 零起点入门MAXScript(第六节) [打印本页] 作者: 有空 时间: 2015-12-2 10:23 标题: 零起点入门MAXScript(第六节) 这一节聊聊选择语句
If Expression(if表达式)
语法形式有两种类型:
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"。
如果改一下:
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 ... then,这样修改程序比较方便。
比如:
if a < b then print "a<b" else () --else后面接一个空语句(),虽然不执行任何操作,但是如果后期想修改,直接在()里面添加内容即可,反之用if ... do,后面就不能再加其他选择了。
Case Expression(Case表达式)
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 "打开的"
false:print "关闭的"
--true和false都是<factor>,即可供选择的因子
)
此程序的执行是这样的,首先执行$.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,即执行默认的程序。