搜索

搜索

在线
客服

在线客服服务时间: 9:00-20:00

选择下列客服马上在线沟通:

快速
发帖

客服
热线

021-50343443
7*8小时客服服务热线

关注
微信

关注微信公众号
顶部
开启左侧

[插件脚本] 零起点入门MAXScript(第六节)

[复制链接]
有空 发表于 2015-12-2 10:23:10 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
这一节聊聊选择语句
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,即执行默认的程序。


下面请大家自已动手,写一些简单常用的程序,请用到 if 语句:
1、找所有没有上材质的物体(提示:没材质的判断方法为:$.material == undefined)
2、收集场景中所有的standard材质(提示:用classof判断材质类型,见第五节)
3、调场景中所有VRayLight的细分到20
4、把场景中所有类型为teapot的线框颜色改成红色
5、判断一个box的长,大于、等于或小于100的情况,然后输出相应字符串(请用case语句)
这些是为了使大家更清楚的明白if 和case语句的原理。
出售提现 接单赚钱 积分转换 推广 充值 赞助VIP 新手帮助
 
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 淡定 神作 路过 感恩
您需要登录后才可以回帖 登录 | 现在注册

本版积分规则


0关注

3粉丝

142帖子

排行榜
作者专栏

精品资源出售,数据快速变现

项目交易合作,保障双方权益

COLOR旗下综合交易服务平台

  • 公众号

    官方微信公众号,欢迎您的加入。

    扫码关注
  • 微信客服

    微信客服,有问题请找我。

    扫码联系
  • QQ客服
广告图片

自由者CG期待您来加入

Copyright   ©2014-现在  自由者CGPowered by©Discuz!技术支持:迪恩网络    ( 沪ICP备11008872号 )