这一期写得非常艰难(虽然是十年前写的),因为讲编程基础语法最无聊。但我还是硬着头皮整理完格式并发出来了,我希望学生们自己看看弄明白,上课时就不用再讲这些东西了,就可以拿出宝贵的课堂时间来操练各种实战案例。
创意之代码以后还会发很多教程,除了CorelDraw、Rhino以外,还会有参数化软件(如Solidworks)的二次开发教程,目的都差不多,就是希望能跟同好们多讨论一些有价值的问题,而不是搞成一个编程培训班。
第3章 VBScript基础
本期结合Rhino的具体操作集中介绍一些RhinoScript编程中常用的VBScript基本语法知识。如果已经会用这种语言,那么本节可以跳过去了。
为了节省篇幅,这里只介绍与RhinScript有关的内容。VBScript语言结构简洁清晰,非常容易学,即使没有任何编程基础也可以很快上手。如果本章学会后认为有必要了解更多,以便在程序中增加一些有趣的花样,那么可以去查阅VBScript的帮助文档自学。
3.1 变量与数组
程序用变量用来保存信息,如数值、名称、模型、灯光、材质等等,并可以在必要的时候改变一个变量的值。
在VBScript中可以使用Dim语句定义一个变量:
Dim a
如果要定义多个变量,可使用同一个Dim语句,各变量间用逗号隔开:
Dim a, b, c,d
在VBScript中定义变量不需要指定变量类型,上面所定义的a、b、c、d可以是整数、浮点数、布尔值、字符串,特殊情况下甚至可以是数组。在RhinoScript程序中,变量还可以表示用户建立的物体,如点、线、曲面、灯光、材质等。
一个变量的具体类型是在赋值中确定的,VBScript使用等号“=”对变量赋值,下面是一些赋值语句:
a=7
b=3.1415926
c=”这是一个字符串变量”
d=Rhino.GetObject(“选择一个物体”)
上述语句中,a被赋予整数型变量,b被赋予浮点数变量,c被赋予字符串变量(字符串赋值要用双引号括起来)。d被赋予一个物体,Rhino.GetObject()是Rhino提供的选择物体函数,提示用户在场景中选择一个物体并将该物体作为函数返回值赋给变量d,以后用户就可以通过变量d对该物体进行操作,如移动、旋转、复制、隐藏、删除等。有关内容在后面的章节中还要详细讲解。
Option Explicit
该语句强制规定所有变量都必须用DIM语句定义后才能使用,否则给出错误提示。
数组是一系列编了序号的变量,数组必须定义后才能使用,定义数组也使用Dim语句:
Dim a(9)
上面的语句定义了一个具有10个元素的数组,因为VBScript的数组元素标号从0开始,所以定义a(9)就可以了。
数组中的每一个元素都是一个变量,可以单独进行赋值和操作。VBScript不要求数组中各变量的值保持类型一致,如:
a(0)=9 ’整数
a(1)=7.8 ’浮点数
a(2)=”这是一个数组变量” ’字符串
a(3)=a(0) a(1) ’浮点数
VBScript中的变量和数组可以在程序中任何位置定义。如果需要长度可变的数组,用下面两个语句实现:
Dim a()
Redim a(2)
第一句中的变量括号是空的,第二句用Redim重定义时再指定它的长度,以后还可以使用Redim改变数组长度。用Redim语句重新定义后,原数组中的数据将被丢弃。如果要保留原数据,可以使用带Preserve关键字的重定义语句:
Redim Preserve a(9)
这样,数组从a(0)到a(2)中的数据将被保留。
也可以定义二维数组:
Dim a(2,3)
a(0,0)=1
a(0,1)=2.5
a(1,0)=”二维数组”
a(1,1)=”Rhino”
二维数组同样也可以使用Redim语句进行重新定义。不过RhinoScript很少用到二维数组,即使表达曲面网格控制点也是用一维数组,所以这里就不多做介绍了。
3.2 运算符与表达式
VBScript中运算符的作用是对常量或变量的值进行运算得到一个新值。算术计算中的加减乘除号都是运算符,另外VBScript中还有一些通常的算术运算中没有的运算符。
VBScript中常用的运算符如下表所示。
类别
运算符
功能
例子
运算结果
数学运算符
相加
3 5
8
–
相减
12-7
5
*
相乘
4*8
32
/
除以
12/5
2.4
\
整除
12\5
2
^
指数
2^10
1024
MOD
取余数
12 MOD 5
2
连接运算符
&
字符串连接
“A”&“BC”
“ABC”
字符串连接
“A” “BC”
“ABC”
比较运算符
=
等于
12 7=19
TRUE
<>
不等于
12 7<>19
FALSE
<
小于
3<5
TRUE
>
大于
3>5
FALSE
<=
小于或等于
2 5<=7
TRUE
>=
大于或等于
2 5>=7
TRUE
逻辑运算符
AND
与
3>5 AND 3<5
FALSE
NOT
非
NOT 3>5
TRUE
OR
或
3>5 OR 3<5
TRUE
XOR
异或
3>5 XOR 3<5
TRUE
VBScript的运算符有四类:数学运算符、连接运算符、比较运算符和逻辑运算符。
数学运算符共有7个,用来进行值的数学运算,其原理比较简单,不再赘述。
连接运算符用来连接两个字符串,即将两个字符串合并为一个新的字符串。连接运算符有两个:“&”和“ ”,两者的使用方法完全一样。但是一般建议使用“&”而不是“ ”,因为“ ”同时也可作为数学运算符使用,当被操作的值不是字符串时可能会出现不希望的结果。而使用“&”进行运算时,如果值不是字符串,则强制性转为字符串然后连接,运算结果为字符串。
比较运算符用来对两个表达式进行比较,运算结果为布尔值,即“真”或者“假”,VBScript中用常量TRUE和FALSE来表示。如果比较结果是正确的,则返回“真”(True),如3<5的值为True。如果比较结果是错误的,则返回“假”(False),如3>=5的值为FALSE。
逻辑运算符有四个,常用于条件判断语句,它们对两个表达式进行逻辑运算,运算结果也是布尔值。
上面提到了表达式的概念。表达式是指由运算符连接起来的一系列变量、值或函数,下面是一些表达式的例子:
3 5 12/x
sin(180/5)^2 cos(180/5)^2
geometryType=”圆柱体”
A>0
A>=0 And A<=1
每个表达式都有一个值,就是运算符的运算结果。表达式可以像变量一样在程序语句中使用。
在一个表达式中进行多个运算时,每一部分都会按预先确定的顺序进行计算求解,这个顺序被称为运算符优先级。括号可改变优先级的顺序,强制优先处理表达式的某部分。括号内的操作总是比括号外的操作先被执行。但是在括号内,仍保持正常的运算符优先级。
当表达式有多种运算符时,先处理算术运算符,接着处理比较运算符,然后再处理逻辑运算符。所有比较运算符有相同的优先级,即按它们出现的顺序从左到右进行处理。算术运算符按下列优先级进行处理:指数运算(^)、负数(-)、乘除(*, /)、整除 (\)、求余数 (MOD)、加减 ( , -);逻辑运算符按下列优先级进行处理:相等(=)、不等(<>)、小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)。
3.3 子过程
子过程是一段用以完成某种任务的程序代码,一般用于将过长的程序分解成多个独立的部分,使程序结构清晰明了。下面的代码定义了一个名为mySub的子过程:
Sub mySub(myMessage)
MsgBox myMessage
End Sub
Sub 和 End Sub 两行之间是子过程的程序代码,mySub是子过程名,其后括号里的myMessage是子过程的参数,如果有多个参数,用逗号隔开。
在程序中调用上述子过程的语句为:
mySub “这是一个子过程”
“这是一个子过程”是参数myMessage的值,在子过程执行时它将替代子过程中的myMessage变量,即MsgBoxmyMessage语句的执行结果相当于下列语句:
MsgBox “这是一个子过程”
执行结果一样,只是对话框中的内容变成了“这是一个子过程”。
3.4常用函数
最常用的函数是数学函数,VBScript的数学运算函数有11个,如下表:
函数名
功能
例子
返回值
Abs
取绝对值
Abs(-0.5)
0.5
Atn
计算正切值
4*Atn(1)
3.1415926(弧度角)
Cos
计算余弦值
Cos(0)
1
Exp
e(自然对数底)
Exp(1)
e(2.718282)
Fix,Int
取整数部分
Int(99.9)
99
Log
自然对数
Log(1)
0
Rnd
返回一个随机数
Rnd
0.24
Sgn
返回数字的符号
Sgn(-15)
-1
Sin
计算正弦
Sin(3.1415926/2)
1
Sqr
开方
Sqr(9)
3
Tan
正切
Tan(3.1415926/4)
1
数学函数比较简单,也很容易理解,这里就不一一解释了,只对数学函数的应用作如下一些说明:
1)三角函数的参数或返回值如果是角度,则都使用弧度来表示,即用3.1415926来表示180度。我们可以借助这个特点来获得一个精确的圆周率值:4*Atn(1)。
2)Int 和 Fix 函数的功能都是删除参数的小数部分并返回以整数表示的结果。二者的区别在于如果参数为负数时,Int函数返回小于或等于参数的第一个负整数,而 Fix 函数在返回大于或等于参数的第一个负整数。例如,Int(-8.4)返回值为-9,而 Fix(-8.4)的返回值为-8。
3)Log函数计算出的是以e为底的自然对数,用数学公式来表达则写作“ln”,若要计算以n为底的x的对数,可用表达式Log(x) /Log(n)来实现。
4)Rnd函数一般不带参数使用,返回一个0与1之间的随机数,每次使用Rnd函数返回的随机数都是不同的。如果要返回一个A与B之间的随机数(A<B),可以使用表达式A (B-A)*Rnd来获取。
5)VBScript在上述11个数学函数的基础上派生了一批数学函数,如下表:
派生数学函数
函数表达式
正割
Sec(X) = 1 / Cos(X)
余割
Cosec(X) = 1 / Sin(X)
余切
Cotan(X) = 1 / Tan(X)
反正弦
Arcsin(X) = Atn(X / Sqr(-X * X 1))
反余弦
Arccos(X) = Atn(-X / Sqr(-X * X 1)) 2 * Atn(1)
反正割
Arcsec(X) = Atn(X / Sqr(X * X – 1)) Sgn((X) -1) * (2 * Atn(1))
反余割
Arccosec(X) = Atn(X / Sqr(X * X – 1)) (Sgn(X) – 1) * (2 * Atn(1))
反余切
Arccotan(X) = Atn(X) 2 * Atn(1)
双曲正弦
HSin(X) = (Exp(X) – Exp(-X)) / 2
双曲余弦
HCos(X) = (Exp(X) Exp(-X)) / 2
双曲正切
HTan(X) = (Exp(X) – Exp(-X)) / (Exp(X) Exp(-X))
双曲正割
HSec(X) = 2 / (Exp(X) Exp(-X))
双曲余割
HCosec(X) = 2 / (Exp(X) – Exp(-X))
双曲余切
HCotan(X) = (Exp(X) Exp(-X)) / (Exp(X) – Exp(-X))
反双曲正弦
HArcsin(X) = Log(X Sqr(X * X 1))
反双曲余弦
HArccos(X) = Log(X Sqr(X * X – 1))
反双曲正切
HArctan(X) = Log((1 X) / (1 – X)) / 2
反双曲正割
HArcsec(X) = Log((Sqr(-X * X 1) 1) / X)
反双曲余割
HArccosec(X) = Log((Sgn(X) * Sqr(X * X 1) 1) / X)
反双曲余切
HArccotan(X) = Log((X 1) / (X – 1)) / 2
以 N 为底的对数
LogN(X) = Log(X) / Log(N)
输入输出函数用于用户交互,供VBScript程序在执行过程中获取用户的输入数据和向用户显示运行结果。因为VBScript没有提供集成界面工具,所以输入输出函数就承担了用户交互的主要任务。
比较常用的输入输出函数有两个:MsgBox和InputBox。
MsgBox是VBScript的输出函数,它显示一个对话框,告知用户程序运行结果。最简单的MsgBox 函数就是弹出一个对话框,并在对话框中显示一个字符串,如:
MsgBox “Hello world!”
这个语句我们已经在第一个例子里见过了。
如果希望对话框上显示一个“确定”按钮,则可以再加一个参数:
MsgBox “Hello world!”, 0
第二个参数“0”表示在对话框上增加一个“确定”按钮:
第二个参数表示按钮的类型,其含义如下:
0——只显示确定按钮;
1——显示确定和取消按钮;
2——显示放弃、重试和忽略按钮;
3——显示是、否和取消按钮;
4——显示是和否按钮;
5——显示重试和取消按钮;
16——显示临界信息图标;
32——显示警告查询图标;
48——显示警告消息图标;
64——显示信息消息图标;
其他参数值的含义就不在此一一列举了,可以用关键词“MsgBox 函数”搜索光盘中的VBScript帮助文件弄清楚。
MsgBox的返回值是一个整数,代表用户按下的按钮,其含义如下:
1——按下的是确定按钮
2——按下的是取消按钮
3——按下的是放弃按钮
4——按下的是重试按钮
5——按下的是忽略按钮
6——按下的是是按钮
7——按下的是否按钮
用户当然清楚自己按下的是哪个按钮,返回值的意义是让程序知道用户按下了哪个按钮,以便进行不同的处理,如调用不同的函数。下面是一个有意思的程序,当用户按下一个按钮,程序把按钮上的字做成3D模型摆在场景当中。
Option Explicit
Sub show_button_pressed()
Dim button_pressed
button_pressed=MsgBox(“HelloWorld!”,1)
If button_pressed=1 Then Command “-TextObject 确定 0,0,0 ” ‘如果按下了确定按钮
If button_pressed=2 Then Command “-TextObject 取消 0,0,0 ” ‘如果按下了取消按钮
End Sub
Show_button_pressed
在show_button_pressed子过程中,首先定义了一个变量button_pressed,这个变量用于存储MsgBox执行后的返回值,也是用户按下的按钮编号。注意,当MsgBox函数的返回值需要赋给一个变量时,它的参数外面要加括号,这样就可以把这个函数的调用作为一个表达式来使用。
后面两个If……Then语句可以理解为“如果……就……”,后面还要详细讲解这种语句的用法,这里只要明白它的用途即可。第一个If……Then语句的作用是:如果button_pressed=1(按下的是确定按钮),就建立“确定”两个字的3D模型。Command”-TextObject 确定 0,0,0 ” 的作用是在场景中建立3D文字模型,“确定”为文字内容,“0,0,0”为文字模型左下角坐标。Command 函数的用法将在3.3节中作详细介绍,这里也只需明白它的用途即可。第二个If……Then语句的作用是:如果button_pressed=2(按下的是取消按钮),就建立“取消”两个字的3D模型。
脚本调用后,出现带两个按钮的对话框:
如果按下“确定按钮”,对话框消失,场景坐标原点处出现“确定”二字的3D模型:
如果按下的按钮是“取消”,则建立的3D文字模型为“取消”二字。文字模型的字体、厚度、斜度、笔画粗细等特征皆可在Command语句中指定,由于程序中没有这些特征作特别规定,因此Rhino全部采用默认值来建模。
如果还希望对话框上有个标题,则可以加上标题参数(也是一个字符串),即把上面程序中的MsgBox语句作如下修改:
Button_pressed=MsgBox(“Helloworld!”,0, “按钮文字3D模型”)
运行结果:
InputBox是VBScript的输入函数,其功能是获取用户输入。InputBox函数执行时弹出一个标准对话框,提示用户输入数据。它的返回值就是用户的输入。
下面是一个InputBox函数应用的例子程序,这个程序也是制作3D文字模型——用户输入什么Rhino就做什么:
Sub show3Dchar()
Dim characters
characters=InputBox(“请输入要建模的文字:” )
Rhino.Command “-TextObject ” & characters & ” 0,0,0 ”
End Sub
show3Dchar
InputBox的返回值被存储在characters变量中,Command函数则把characters变量中的内容做成3D模型。
上面的脚本程序加载后,出现一个带两个按钮的标准对话框:
InputBox和MsgBox一样也可以输入标题,并且还可以指定打开对话框时的默认输入。对上述程序中的InputBox函数作如下修改:
characters=InputBox(“请输入要建模的文字:”, “Rhino将建立任意输入文字的3D模型”, “Hello World !”)
执行后会出现如图对话框:
InputBox还有更详细的设定,读者可以查阅光盘中的VBScript帮助文档。
再介绍一个常用函数:Array函数。
Array函数的功能是把一系列数据或变量组成一个数组,它的参数是构成数组的元素,返回值是数组。
下面的语句把5个数字组成一个数组:
Dim arr1,arr2
Dim a,b,c,d,e
a=2.0
b=a^2
c=b*5.5
d=c-12.0
e=d/2.0
arr1=Array(a,b,c,d,e)
arr2=Array(2.0,a^2, b*5.5, c-12.0, d/2.0)
Array函数的参数可以是变量(数值变量或字符串变量)、常数、数组、表达式等。如果Array函数的返回值被赋予一个变量,则该变量就是数组名,如上例中的arr1和arr2。可以用数组元素编号对其中的元素进行操作,如arr1(0)的值为a,arr1(4)的值为e。
Array函数在RhinoScript最广泛的用途就表达坐标位置。坐标位置有三个坐标分量,因此用有三个元素的数组来表达。
3.5控制结构
3.5.1 条件结构
条件结构用If语句完成,即实现“如果……就……,否则……”这样一种程序语句的控制执行功能。
If语句有三种格式,下面逐一讲解。
If语句的第一种格式是最简单的,它的功能是实现“如果……就……”,其格式如下:
If 条件表达式 Then 语句组
如果条件表达式的值为真,则执行Then后面的语句,否则跳过去。如果语句组较长,一行写不下,则可以逐行列在后面,并在最后加上End If以结束IF语句。形式如下:
If 条件表达式 Then
语句组
End If
来看一个程序:
Sub createSphere(radius) ‘参数radius表示球体半径
If radius>0 Then ‘判断球体半径是否为正
Rhino.AddSphere Array(0,0,0), radius ‘以radius为半径在坐标原点建立球体
End If
End Sub
createSphereRhino.GetReal(“请输入球体半径”)
上述代码的功能是在坐标原点建立一个球体,球体半径由用户在命令行上输入,如图:
程序的If语句判断调用语句给的radius参数值是否为正,若是,则在坐标原点建立一个球体,否则跳过建立球体的语句。
上述代码中用到了两个Rhino函数:Rhino.AddSphere和Rhino.GetReal。Rhino.AddSphere函数的作用是在指定位置以指定半径建立一个球体,位置和半径为该函数的参数。Rhino.GetReal要求用户从命令行输入一个实数,并以该实数作为函数返回值,字符串“请输入球体半径”是显示在命令行的提示语。关于Rhino函数的使用方法,后面还要作详细介绍。
IF语句的第二种格式实现“如果……就……,否则……”,其格式如下:
If 条件表达式 Then
语句组1
Else
语句组2
End If
我们仍然沿用上一个程序代码。上一个程序在给出的radius参数小于零时跳过建立球体的语句,即什么也不做。现在我们加上一条语句,在条件表达式不为真(radius小于零)时显示一个提示框,以使用户明白为什么没有建立球体。
Sub createSphere(radius)
If radius>0 Then
Rhino.AddSphere Array(0,0,0), radius
Else ‘球体半径不为正
MsgBox“Sorry!输入的球体半径不为正,无法建立球体”
End If
End Sub
createSphereRhino.GetReal(“请输入球体半径”)
加载上述代码,并在命令行输入一个负值,如-10。则会得到如图提示:
If语句的第二种格式处理两种情况,当有多种情况需要处理时,就用到了If语句的第三种格式:
If 条件表达式1 Then
语句组1
ElseIf 条件表达式2
语句组2
ElseIf 条件表达式3
语句组3
……
Else
语句组 n 1
End If
该语句处理一个以上的条件,先检查条件表达式1,为真则执行语句组1,然后跳出IF语句执行End If后面的语句。如果条件表达式1为假,则跳过语句组1检查条件表达式2,依此类推。如果所有条件表达式都为假,则执行Else后的语句组n 1。
SubcreateSphere(radius)
If radius>100 Then ‘判断球体半径是否大于100
Rhino.AddSphere Array(0,0,0), radius ‘以radius为半径建立一个球体
ElseIf radius>50 Then ‘判断球体半径是否大于50
Rhino.AddSphere Array(0,0,radius/2), radius/2 ‘以radius/2为半径建立两个球体
Rhino.AddSphere Array(0,0,-radius/2), radius/2
ElseIf radius>0 Then
Rhino.AddSphere Array(0,0,radius/2), radius/4 ‘以radius/4为半径建立四个球体
Rhino.AddSphere Array(0,0,-radius/2), radius/4
Rhino.AddSphere Array(0,radius/2,0), radius/4
Rhino.AddSphere Array(0,-radius/2,0), radius/4
Else ‘球体半径不为正
MsgBox “Sorry!输入的球体半径不为正,无法建立球体!”
End If
End Sub
createSphereRhino.GetReal(“请输入球体半径”)
上述代码仍然沿用了前面建立球体的程序。它的功能是:输入半径大于100时,建立一个球体,输入半径在50到100之间时,建立两个球体,但半径缩小为给定半径参数的1/2,输入半径在0到50之间时,建立4个球体,半径缩小为给定半径参数的1/4。如果输入半径为负,仍如前显示错误信息。
3.5.2 循环结构
循环结构的用途是让程序重复执行一个语句组,直到达到指定重复次数或满足一定的条件为止。本节介绍两种常用的循环语句:计数循环语句和条件循环语句。
计数循环语句可以让程序重复执行语句组达到指定的次数,其格式如下:
For 循环变量=起始值 To 终止值 [Step 步长值]
语句组
Next
循环变量作为计数器使用,第一次循环时赋予初始值,循环语句组每被执行一次循环变量增加一个步长值,直到达到终止值,循环结束。“Step 步长值”可以省略不写,此时步长值默认为1。
Dim i, radius
radius=5 ‘球体的初始半径
Sub createBalls(n) ‘n为球体个数
Fori=1 To n ‘总共建立n个球体
Rhino.AddSphere Array(i*30,0,0), radius i ‘各球体在X轴上间隔30,半径依次 1
Next
End Sub
createBallsRhino.GetInteger(“请输入球体个数”)
上述代码的功能还是建立球体。程序加载后提示用户输入球体个数作为子过程createBalls的n参数的值。调用子过程后建立一系列(n个)球体,这些球体沿X轴排列,间隔为30,且半径依次 1。Rhino.AddSphere函数中Array(i*30,0,0)用来计算球体中心坐标,radius i用来计算每个球体的半径。i作为循环变量,其起始值为1,终止值为nu,步长取默认值1,因此循环次数为n次,也就是说Rhino.AddSphere语句要被执行n次,建立n个球体。程序运行结果如图(输入的球体个数为10)。
条件循环语句设定循环条件,循环执行语句组直至循环条件不再满足为止。其格式如下:
Do While 循环条件
语句组
Loop
当循环条件为真时,执行语句组,直至循环条件为假。
SubcreateRandomBalls(n)
Dimi, radius
i=0 ‘计数变量赋初值0
Do While i<n ‘总共建立n个球体
radius=10*Rnd 2 ‘随机产生球体半径,范围为2~12
Rhino.AddSphere Rhino.GetPoint(“现在球体个数:” CStr(i) “,输入新球体位置”), radius
i=i 1 ‘计数器加1
Loop
MsgBox CStr(n) ”个球体已经输入完毕!”
End Sub
createRandomBallsRhino.GetInteger(“请输入球体个数”)
上述代码建立若干个球体。球体的个数和位置由用户给定,球体的半径由随机函数产生。i为计数变量,每建立一个球体加1,当循环条件(i<n)不再满足时,循环结束,用户要求的球体数量已经建立完毕。
循环中,程序显示当前球体的个数并要求用户在命令行输入新就建球体的坐标值。当所建的球体已经达到用户输入的球体个数时,循环结束,显示一个对话框报告指定数量的球体已经输入完毕,如图:
3.5.3 选择结构
选择结构根据选择变量的值来决定执行不同的语句组。其格式为:
Select Case 选择变量
Case 值1
语句组1
Case 值2
语句组2
Case 值3
语句组3
……
Case Else
语句组n 1
End Select
执行SELECT语句时,先比较选择变量与后面各Case值,如果与某一Case值相同,则执行该Case的语句组。如果选择变量与任何一Case值都不相同,则执行Case Else后的语句组。Case语句组执行完毕后跳出选择语句执行End Select后的语句。
Sub createGeometry(geometryType)
Select Case geometryType
Case “圆柱体”
Rhino.AddCylinder Array(0,0,0), Array(0,0,20) , 5 ‘建立一个圆柱体
Case“圆锥体”
Rhino.AddCone Array(0,0,0),Array(0,0,20), 10 ‘建立一个圆锥体
Case“圆环体”
Rhino.AddTorus Array(0,0,0), 20, 5 ‘建立一个圆环体
Case Else
Rhino.AddSphere Array(0,0,0), 10 ‘建立一个球体
End Select
End Sub
createGeometryRhino.GetString(“请输入几何体类别”)
上述代码的功能是根据用户的输入建立相应的几何体。程序加载后,提示用户在命令行输入要建立的几何体类别,用户输入的字符串作为调用createGeometry函数的geometryType参数的值使用。在createGeometry函数中,Select语句以geometryType为选择变量。当用户输入“圆柱体”(输入时不加引号),选择变量geometryType与第一个Case的值相同,因此执行语句组1,建立一个圆柱体。输入“圆锥体”或“圆环体”时,分别执行相应的Case语句组。当输入的字符串不与任何一个Case的值相同时,执行Case Else,建立一个球体。几何体建立完毕后跳出。