签到天数: 37 天 连续签到: 1 天 [LV.5]经常光顾
|
An short introduction to RhinoScript
假 使从字面上来直译,RhinoScript可以翻译为「犀牛脚本」。RhinoScript是架构在VB(Visual Basic)语言之上的Rhino专属程序语言,大致上又可分做Marco与Script两大部分。以下简单地说明Marco与Script两者之间的差 别。
Marcos = Static (fixed, linear sequence)
Scripts = Dynamic (non-linear)
‧flow control (skipping and repeating lines)
‧variable control (logical and mathematical operations)
‧input and output (user interaction)
简单地说,在Rhino中的 Marcos (可以称做宏)就像是一个口令一个动作的叫Rhino帮我们执行「动作」(actions)。Marco 的命令行是线性、静态的,意思就是说,如果我们下了一百条指令,Rhino就会从第一条、第二条、第三条、、、这样一路执行到第一百条命令,无法跳跃也无法重复执行某个命令。相对而言,Scripts
则是动态且非线性的。首先,透过 Flow Control
我们可以跳过或者重复某些命令行,而Variable Control
则可以让我们创造出逻辑与数学的运算,Input and Output (I/O)则是使用者与Rhino之间的互动,使用者可以送进许多种类型的资料 (data),再经过运算之后以许多种数据形态输出。
本文的主要目的在于说明 Marcos
与 Scripts 之间的差别,之后将进一步对 Scripts 的语法、功能与运用方式做进一步的说明与提供范例。
02=Introduction to RhinoScript (Syntax)
An Short Intorduction to RhinoSricpt
在 了解 Marcos 与 Scripts 之间的差别之后,我们首先开始来介绍一点简单的「语法」(syntax)。在计算机程序语言中的语法,其实就跟我们学英文或其他外国语言一般,我们需要背单 字也需要学文法,而在此的语法就有点像是文法。因此,语法就是一种「成套」(a set)的规则组合。于是乎,当然也就会有所谓合法与不合法的语法,只不过,一般日常生活中,如果我们说出不合文法的语句,人基本上还可以透过上下文来猜 懂。但是,计算机就没这么聪明了,如果我们写出不合语法的命令行,计算机不但不会去猜,根本就不理会,只会告诉我们:「描述方式有误」、「语法不合规定」等警 告句,告诉我们必须回头去检查到底是哪句命令行说错了。
RhinoScript 所使用的VB语言的语法基本上算是简单的,已经非常接近日常的口语,这算是非信息背景用户的一大福音(版主也是这两个月才真的开始学程序)。所以,以下我们就来简单说明一下在Rhino中会用到的几种基本语法。
如果我们要画一条线,我们大概会这么说:「画一条线,起点在坐标(0,0,0)的位置,端点在(10,0,0)的位置。」同样地,在Rhino的Marco命令行我们可以这么下指令(请开启ToolsCommandsMarco Editor):
_Line 0,0,0 10,0,0
然而,如果我们不是在Marco中,而是在Script的环境下(请开启ToolsRhinoScriptEdit),会有两种说法。一种就像是直接在Rhino工作接口中的Command列下指令一般,可以这样讲:
Rhino.Command "_Line 0,0,0 10,0,0"
另一种讲法,则是呼叫RhinoScript中内部建构的许多Methods(超过200种),所以我们应该写成:
Call Rhino.AddLine(Array(0,0,0), Array(10,0,0))
基 本上,本文的目的不在于将所有指令或者Rhino内建的Methods解说完毕,用意只在于很简单地说明在计算机语言中的语法与日常用语中文法的关系。差别 只在于,「计算机还挺很忠心的,我们叫他做啥,他就会做啥」(这是陈教授的名言之一)。所以,如果指令下了,Rhino却没反应,决不是Rhino有错,赶 紧回头检查自己的命令行是否下错了。
此外,如果要详细了解VB的语法可以参考网络上的Microsoft教学手册,可以免费下载 并且有中文版。如果想详细了解RhinoScript中所有Methods的语法,请开启 HelpPlug-insRhinoScript,这里头详细记载了每个Mehods的用途、语法以及回传 (return)值等说明,当然,如果各位不心急的话,之后我们也会一一提到。
03=Introduction to RhinoScript(Loops-1)
An short introduction to RhinoScript
在 了解RhinoScript的基本语法之后,我们这次要说明的是VB中的「循环」(Loops)种类与概念。VB的循环基本上可以分为三种:(1) For...Next (计数循环)、(2) Do...Loop (条件式循环)、(3) For Each...In...Next (数组循环)。三种循环的特色与用法各有不同,端看在何种需要来选择。举例来说,计数循环顾名思义就是指当我们已经知道某一个数量时所使用;而条件式循环 则是循环本身具有条件的设定功能,透过条件的符合与不符合判断可以决定进入循环或者离开循环;数组循环则是将在一个「数组」(array)中的对象一一取 出来执行某些命令动作。将上述的循环种类与表达方式整理如下:
(1) 计数循环 For...Next
(2) 条件式循环 Do While...Loop (前侧式)
Do Until...Loop (前侧式)
Do...Loop While (后测式)
Do...Loop Until (后测式)
Do...Loop (无穷)
While...Wend (如果为真)
(3) 数组循环 For Each...In...Next
接下来,我们就一一说明上述的循环运用方式以及提供简易的范例。先从计数循环说起,如果我们执行下列程序,我们可以在Rhino工作接口的Command列看到Rhino当我们印出"1"。
Dim A: A=1
Call Rhino.Print(A)
以此类堆,如果我们要依序印出"1 2 3 4 5 6 7 8",当然可以很辛苦地这么写:
Dim A: A=1
Dim B: B=2
Dim C: C=3
Dim D: D=4
Dim E: E=5
Dim F: F=6
Dim G: G=7
Dim H: H=8
Call Rhino.Print(A)
Call Rhino.Print(B)
Call Rhino.Print(C)
Call Rhino.Print(D)
Call Rhino.Print(E)
Call Rhino.Print(F)
Call Rhino.Print(G)
Call Rhino.Print(H)
但是计算机如果真的只能这么笨地一个口令一个动作,那我会请各位现在就放弃吧!这时候如果我们运用计数循环,为得到同样的结果,可以改成这么写:
Dim i
For i = 1 To 8
Call Rhino.Print(i)
Next
这就是所谓的计数循环,当我们已知某个数量(从1到8),就可以利用计数循环重复执行某个动作,而在此所定义的 "i" 是个变量,每次重新进入循环时,"i" 值会被替换为下一个数字。
因此,如果我们很快地将计数循环结合RhinoScript Methods,试着执行下列的指令看看:
Dim StratPoint, EndPoint
Dim i
For i = 0 To 10
StartPoint = Array ( i*10, 0, 0)
EndPoint = Array ( i*10, 10, 0)
Call Rhino.AddLine(StartPoint, EndPoint)
Next
我 们可以很快地得到11条线,每条线的长度都是10,间距也都是10,第一条线的起点为(0,0,0)终点为(0,10,0),每个下一条线则是间距上一条 线10的单位的并行线。如果善加利用计数循环与函数规则,就可以做出许多复杂的形体,不仅可省下许多力气,也可能会产生出一些出乎意料的形体。这次只是简 单地介绍了计数循环的最基本用法,之后我们分别会再说明其他种类循环的基本用法,并且提供一些比较复杂的循环组合运用方式。
04=Intorduction to RhinoScript (Loops-2 & Comparisons)
An Short Introduction to Rhinoscript
本文接着要说明上文所提到的条件式循环,但因为这会运用到VB语言中的「比较」(comparisons)功能,因此,一开始我们将先就此部分做说明。在VB中的比较式其实已经非常接近一般的数学式,详细如下:
A = B A and B are equal
A <> B A and B are not equal
A > B A is greater then B
A >= B A is greater then or equal to B
A < B A is less then B
A <= B A is less then or equal to B
有了上述比较式的概念,我们就可以开始说明条件式循环了。首先,我们说明两个前侧式循环:Do While...Loop 以及 Do Until...Loop。如果我们用口语的方式来翻译,会像是下面的说法:
Do While...Loop 当符合***,就一直做
Do Until...Loop 一直做,直到符合***为止
上 述口语翻译中的***其实就是一个条件式,因此,Do While...Loop 的意思就是,当条件式成立时就进入循环,直到条件式式不成立才离开循环接着下一个命令行执行下去。而Do Until...Loop 则是如果一开始条件式不成立就进入循环,不断重复到条件式成立才离开循环接着下一个命令行执行下去。这两个循环的正式语法如下:
Do While <condition>
Statement(s)
Loop
------------------------------------
Do Until <condition>
Statement(s)
Loop
而 另外两个后测式循环的语法基本上与前测式循环类似,唯一的差别只在于进入循环的先后顺序,在一般状态下前测式与后测式循环是不具差别的,但若要细微地控制 进入循环的时间点就必须要特别留意了。举例来说,Do While...Loop 是先判断条件式是否成立,若成立才进入循环的「叙述区块」(statements),而Do...Loop While 则是先进入循环中的叙述区块,再判断条件式是否成立,若成立则重复进入循环,若不成立则离开循环。两个后测式循环的语法如下:
Do
Statement(s)
Loop While <condition>
-------------------------------------
Do
Statement(s)
Loop Until <condition>
还 有两个循环我们还没介绍,由于Do...Loop 这个无限循环一般来说在RhinoScript 很少使用,另一方面也经常会造成问题与困扰,所在此将不做说明。但是,另一个 While...Wend 则经常使用,甚至应该说很好用,所以大家可以特别注意一下,其口语翻译如下:
Whlie...Wend 当***为真就做,一直到***为假
在 此的***依旧是个条件式,整个循环的运作过程就是当条件式为「真」(True),则进入循环中的叙述区块,接着当进行到 Wend 的语句时,再回去检查一开始的条件式是否依旧为真,若为真就一直重复这些动作,直到当条件式为「假」(False)则离开循环接着下一个命令行执行下 去。其正式语法如下:
Whlie <condition>
Statement(s)
Wend
接下来,我们要对计数循环与条件式循环做个简单的比较来说明两者的适用时机。请比较下列两个循环:
Dim i
For i = 0 To 10
Call Rhino.Print(i)
Next
-------------------------------------------
Dim n: n = 1
Do While n<=10
Call Rhino.Print(n)
n = n+1
Loop
若 各位有实际测试,应该会发现到得到的结果是相同的。那么,For...Next 循环与Do...Loop 循环的差别究竟在哪里?我们可以发现,For...Next 循环一开始就必须知道循环的执行次数,而 Do...Loop 循环则不用知道循环的执行次数。也就是说,当我们可以确认循环的执行次数时,将建议使用计数循环。但是,有些时候我们无法得知循环的执行次数,这时候就应 该用条件式循环。此外,循环彼此还可以互相搭配,产生循环内还有循环,也就是所谓的「巢状循环」(Nested Loop),这类相对目前来说比较复杂的运用之后我们会在实际范例中进行说明。
05=Introduction to RhinoScript (Textflie Layout)
An Short Introduction to RhinoScript
在 进入其他VB语言与RhinoScript的说明之前,先提示一点轻松但是却重要的提醒。由于其实写程序就跟做设计很类似,设计者如果没有良好的档案管理 方法,经常会图纸乱丢又乱塞,等到某天想要用时却找不到,就算找到了也忘记这张图到底是何时完成的,或者忘了最后的版本是谁修正的。当我们程序越写越多时 也会面临到上述的情形,因此,保持良好的工作习惯以及建立正确的档案管理统对日后不仅有莫大的帮助也是不可或缺的必备功课。
另一方 面, 一个程序除了要让计算机读得懂之外,常常也要让朋友或者是其他使用者能够阅读,于是乎,有一些共通的标注方式,就变成不同用户要读懂程序的重要媒 介。一般来说,一个较为完整的VBScript会由四个部分所组成:(1) Option Explicit area (语句区块)、(2) Main subroutine (主要的子程序)、(3) Addtional subroutines and functions (附加的子程序与函数式)、(4) Execution commenting (执行批注),其详细说明如下:
(1) Option Explicit area
在 VB语言中,当我们在程序的一开始加上了Option Explicit 这个语句,表示我们在模块中的所有变量都必须以 Dim, ReDim, Public, Private, Static 等语句 (这些语句我们之后会另行说明) 来加以宣告。若有出现未宣告的变量,在模块的编译阶段会以错误方式警示告知。Option Explicit 必须放在所有程序 (Subs, Functions) 之前,加上它的好处是:可以帮我们检查是否输入错误的变量名称,或是有某些变量被重复定义。另外,一般来说,我们会在这个区加上一些「批注 列」(commenting lists)来说明作者、建档日期以及参考来源。在VB语言中,当我们在某段字符串前方加上撇号 (apostrophe,即 ' ),VB就会略过这段字符串不读,也就是成为单纯的叙述文字。Option Exlicit 语法范例如下:
Option Explicit
'Script written by <insert name>
'Script copyrighted by <insert company name>
'Script version <insert date, time>
(2) Main subroutine
VB语言中的 Main subroutine 由四个部分所组成,语法如下:
Sub Main()
<Variable declaration area>
<Code(conditional statemenets, loops and I/O code)>
End Sub
上面这个范例句是没有其他子程序 (Subs) 的情况,若有其他的子程序,在 Sub Main( ) 与 End Sub 之间则放放进呼叫其他子程序的语句。
(3) Additional subroutines and functions
在 VB语言中,Subs 与 Functions 几乎可以做相同的事。但是,Functions 可以有「回传值」(returns) 来做运算的动作,而 Subs 则无法。因此,通常我们将一些数值的运算交给 Functions 来做。另外,在 VB中 Function 可以自己呼叫自己,也就是可以做出「递归」(recursion) 运算,而且呼叫 Function 时可以在其左方直接加上一些函数表达式 (像是:Sqr、Cos 或 Chr 等) ,使 Function 就如同是内建函数一般。比较详细的 Function 实际使用方式之后会进一步说明,在此仅作初步介绍。最后,我们经常会在 Sub 或 Function 的名称左方看见一对括号,这表示可以送入变量,在 VB 中, Sub 与 Function 都可以送入变量,而当我们即使不送入变量时,也会以空的括号来表示。
(4) Excution commenting
通 常我们会在模块中将某些重要的程序做批注,批注的方式请参照本文一开始所提到的 commenting 。做批注的好处是提醒自己日后在程序越写越复杂时,方便检查与阅读,另外也提供其他用户了解程序内容的用途。此外,一个好的程序撰写者经常会在一个复杂 程序的最后端加入一系列的步骤分解批注,用以说明整个程序执行过程的每个「步骤」(step) 用途。
最 后,一个RhinoScript的档案会被存成 " *.rvb " 的文件格式,在此的 " rvb " 即是代表 " RhinoVisualBasic " 。本文主要是说明RhinoScript 档案的格式与良好的完整程序架构,内文中所碰触到的一些新知识若有位详细说明之处,都会在之后陆续提供详细的解说。
06=Introduction to RhinoScript (Oprators & Functions)
An Short Introduction to RhinoScript
这次我们要简单介绍几个在VB语言中经常出现的几种不同类型的「码」(code)。在说明之前,请先看下列例子:
A = 10 + 20
B = 10 + 20 * 0.5
A = Sin(10 + 20) + Sqr(0.5)
B = Tan(10 + 20) / Log(0.5)
在这面的这几个式子中出现了四种类型VB语言码:(1) Numbers (数值)、(2) Variables (变数)、(3) Operators (运算符)、(4) Functions (函数)。
(1) Numbers & (2) Variables
在 VB中,数字可以是整数或具有小数点,同时也可是正数或负数。式子中的 A,B 我们称为变量,在VB语言中所有变量都必须被宣告,而宣告的方式有很多种,最常用的宣告语句是 Dim ,在VB中 Dim 的意思基本上就像是定义。当我们在宣告陈述区写下 Dim A,B,表示计算机会为我们预先留下内存的位置给 A,B 这两个变量。有时后我们也会看见有人这样写:Dim A As String,这样的写法是事先告诉计算机这个变量的数据类型,差别在于因为不同的数据类型计算机为我们预先留下的内存位数 (bits) 是不同的。不过,这时候我们还不需要了解的如此深入,只要知道变量的宣告方式即可,其他的知识大略有个概念即可。另外,上面范例式中的 " = ",在数学式中是表示「等于」的概念,但是在计算机语言中用「等于」来解释会出现问题。譬如说,如果我们写下 N = N+1 的式子,这在数学中是不成立的,因为如果我们将 N 以 1 带入,那 1 = 1+1 当然就不成立。因此,在计算机语言中 " = " 的概念是:将 " = " 右边的答案或结果代入左边的变量。我们用下面的例子做个简单的练习:
Dim A
A = 10 + 20
A = A +1
Call Rhino.Print(A)
我 们会发现答案是 31。为什么?因为VB语言的程序代码是由上往下读的,例子中第一行的意思是:宣告一个 A 变量;第二行的意思是:将 10+20 的结果代入 A,所以这时候的 A 是 30;第三行的意思是:将 A 加 1 之后再带入 A 所以最后 A 是 30+1 也就是 31。
(3) Operators
再 来要说明的就不这么复杂了,在VB语言中的运算符大致可以分为三类:数学运算符、逻辑运算符、布尔值 (boolean values) 运算符。逻辑运算符在先前的文章中已经做过说明本文就不再重复,数学运算符则相当容易理解,基本上数学运算符的功能跟数学上的方法相同只需要了解其在于 VB中表达与运用的方式即可。另外,布尔值运算符在此只做简单的介绍,详细的用法及概念会在之后详细说明。
+ add two values
- substract two values
* mutiply two values
/ divide two values
\ divide two values but return only whole numbers
^ raise a number to the power of an exponent
Mod arithmetic modulus
------------------------------------------------------------------------
And performs a logical conjunction
Eqv performs a logical equivalence
Imp performs a logical implication
Not performs a logical negation
Or performs a logical disjunction
Xor performs a logical exclusion
我们以下用几个简单的例子来练习数学运算符的运用:(1) 试求 2 的 1 到 10 次方的值各为多少?(2) 试求 10 除以 3 的余数为何?这两题在 RhinoScript 中的写法如下:
Dim A, i
For i = 1 To 10
A = 2 ^ i
Call Rhino.Print(A)
Next
------------------------------------------
Dim A
A = 10 Mod 3
Call Rhino.Print(A)
(4) Functions
最后,本文将简单说明几个常用的数学函数,在VB语言中数学函式可以代入变量,所以在一开始的范例式中我们可以看见 Sin(10 + 20 ), Tan(10 + 20) 等函数式。以下将介绍几个经常使用的数学函式在VB中的符号:
Sin() Sine of a number
Cos() Cosine of a number
Atn() ArcTangent of a number
Log() Natural logarithm of a number larger than 0
Sqr() Square root of any positive number
Abs() Absolute (positive) value of any number
在 理解本文介绍的内容之后,我们将有机会在RhinoScript中轻易地建立某些数学关系,也就是某种以数学为基础的规则。简单地说,如果某些生物现象、 运动状态可以被数学关系所描述,我们就能找到其中的规则或说是一种「模式」(pattern) ,因此也就让演算成为可能。
07=Introduction to RhinoSrcipt (Conditional Statements)
An Short Introduction to RhinoScript
在之前最早的介绍中,我们有提到过 Rhino 中 Marcos 与 Scripts 之间的差异。简单的说,前者是线性序列的,而后者则是一种非线性序列的、动态的程序。Scripts 之所以可以达到非线性序列的原因主要来自 Flow Control,如果我们用最简单的方式来解释 Flow Control,它是可以使某些「命令行」(lists) 重复执行或是跳过某些命令行不执行的功能。在VB语言中的 Flow Control 主要来自两者:Loops, Conditional Statements。Loops 就是之前我们已经介绍过的循环,透过循环我们可以让某些命令行不断重复执行。本文要说明的则是 Conditional Statements,就字面上的解释我们可以称之为条件陈述。简单地说,透过 Conditional Statements 我们可以使得某些命令行执行或者跳过不执行,关键就在于是否符合或不符合我们所设下的条件。在VB语言中的 Conditional Statements 主要分为两种:(1) If...Then、(2) Select Case,以下就上述两者做进一步说明。
(1) If...Then
就字面上来口译,If...Then 就是「如果***,就***」。也就是说,当程序符合某个我们所设下的条件时,就执行某个 (些) 命令行,如果不符合就跳过某个 (些) 命令行而接着继续读码。一个典型的 If...Then 语法如下:
If <condition> Then
Statement(s)
Else
Statements
End If
上述式子可以口译为「如果符合***,就做***,如果不符合就做***」。以下我们用个例子来练习,试求某数为奇数或偶数:
Sub Check_Number(N)
If (N Mod 2 = 0) Then
Call Rhino.Print(N & " is an even number")
Else
Call Rhino.Print(N & " is an odd number")
End If
End Sub
Call Check_Number(1)
Call Check_Number(2)
Call Check_Number(3)
Call Check_Number(4)
上 面这个式子一开始设定了一个 Sub 叫做 Check_Number,这个 Sub 可以送入一个数值 N。当 N 送入之后进入一个 If...Then 的条件语句,如果送入的 N 除以 2 余数为 0,则打印 N is an even number,如果不符和上述条件则打印 N is an odd number。我们从这个式子中发现并不是每行的命令行都被执行,而是选择执行某命令行跳过某命令行,这就是本文一开始提到 Flow Control 的特性。到目前为止,如果能够善用 Loops 与 If...Then 其实已经可以写出很多有趣的小程序,也就是说,当能够活用 Loops 与 If...Then 已经可以算是个会写程序的人了。
(2) Select Case
如果说 If...Then 比较像是非此即彼,那么 Select Case 则是可以设定多种条件,所以当我们的条件状态在三种以上时,基本上我们会建议使用 Select Case。我们直接用范例来说明 Select Case 的使用方式,以下的式子是求出某数值除以3之后的余数为何。
Sub Remainder(N)
Select Case (N Mod 3)
Case 0 Call Rhino.Print("the remainder of " & N & "divided by 3 is 0")
Case 1 Call Rhino.Print("the remainder of " & N & "divided by 3 is 1")
Case 2 Call Rhino.Print("the remainder of " & N & "divided by 3 is 2")
End Select
End Sub
Call Remainder(6)
Call Remainder(7)
Call Remainder(8)
上 述的式子一开始设定了一个名为 Remainder 的 Sub,这个 Sub 必须送入一个变量 N。当变量 N 送入之后,求出 N 除以 3 的余数,如果余数为 0 则打印 the remainder of N divied by 3 is 0,如果余数为 1 则打印 the remainder of N divied by 3 is 1,如果余数为 2 则打印 the remainder of N divied by 3 is 2。这个例子很简单地说明了当条件状态不只两个 (非此即彼) 的时候,该如何运用 Select Case 的方式。
本文介绍的两个 Conditonal Statements 功能,各位可以自行设定一些简单的数学题目或是逻辑关系加以进一步练习,因为在日后的实战演练中,我们将经常地使用此两者与 Loops 之间的交互运用。
08=Introduction to RhinoScript (Array-1)
An Short Introduction to RhinoScript
终于,我们要开始介绍 Array,假使能够把 Array 再搞懂,RhinoScript 中有关VB语言的基本知识就几乎都说明完毕了。Array 我们可以称之为数组,在数学中经常称为矩阵,基本上 Array 就是将某些数据放入一个集合之中的概念。譬如说,我们都知道一个笛卡尔坐标的点可以用 X, Y, Z 轴的坐标值来表示,即 Point A (0,0,0),这时候的 (0,0,0) 就是一个 Array。然而,上述的这个 Array 里头有三个位置,各自存放着不同的数据。Array 里头的数据,我们可以透过 Index 呼叫出来,就此例来说,在RhinoScript中我们应该表示成: Point A = Array(0,0,0),因此,如果我们要得到 Point A 的 X 坐标值则会是 Point A (0),依此类推,Point A 的 Y, Z 坐标值则为 Point A(1), Point A(2)。
大 家一开始可能会有疑问,为何 Array 中的第一个资料的 Index 为 0?这是VB中的规则,不需要去怀疑也不要问为什么,只要记住就好,之后有机会的话会慢慢体会到,这样做有它本身的用意与好处。如果各位过去数学还不差的 话,应该对矩阵还有点印象。在数学中,矩阵可以是一维的、二维的(有点像是矩形排列)、三维的(有点像是立方体排列),那可不可能超过三维?当然可能,四 维、五维、六维、、、原则上维度是无限的。大家或许会觉得很奇怪,超过三维以上的东西是什么?要怎么画出来?这会牵扯到物理与数学之间的差异,在此不多做 详细解释,但我们只要简单地知道数学中的维度不像物理实证一般,它仅是一种数据排列的方式,所以超过三维以上的矩阵是存在的。相同地,在VB中也允许超过 三维以上的数组,不过因为我们毕竟不是真的如同计算机科学的专家写数据库,在 RhinoScript 的实际操作中其实使用到五维以上的机会并不多。以下就用一些实例来说明一维、二维及三维数组的运用:
(1) 1D Array
Array 的维度表示,放在Array名称之后的括号之中,举例来说:Array A(3) 表示这是个一维的数组,数组中有 4 个可以储存数据的位置;Array B(3,3) 则表示这是个二维的数组,数组中有 4*4 = 16 个可以储存数据的位置;依此类推,其他维度就不再赘述。那么,在 RhinoScript 中 Array 要如何宣告?试看下列式子:
Dim A
A = Array(1, 2, 3, 5, 8, 13, 21, 34, 55)
这个式子一开始宣告一个变量 A,之后将 A 指定为一个一维的数组,数组中含有 9 个数据。这时候,如果我们要印出数组中的第 5 个数据,那我们要这么做:
Call Rhino.Print(A(4))
奇 怪,明明说要印出第 5 个数据,怎么在数组中的 Index 却是放进 4 这个数字?这在一开始我们就说明了,在VB中 Array 的 Index 第一个设定为 0。所以,要找第 5 个数据,其 Index 就会是 4。再试一次,如果我要从这个数组中印出 21 这个数字,那应该怎么呼叫?会像是下面的方式:
Call Rhino.Print(A(6))
希望透过这样简单的例子,各位可以了解到 Array 的数据储存型态,以及数据的呼叫方式。假使各位还是不理解,姑且就背起来吧!否则,我们就无法进入下一阶段的说明。
(2) 2D Array
在进入二维数组说明之前,我们先假设已经在 RhinoScript 中制作了一个二维数组叫做 B,其数据的存放方式如下图:
这 是一个二维的数组,其数据的储存型态会有点像是 Excel 中的字段,所以,如果像图中所示,我们总共储存了 16 个数据,维度分别是 4 与 4,B 这个数组即可以 B(4, 4) 的方式表示。那么如果我们呼叫 B(0, 1) 就会得到 3,呼叫 B(3, 3) 就会得到 49。相反地,若是我们要得到 25 则要呼叫 B (2, 2)。希望透过这样的方式,可以让各位理解 Array 的数据型态与数据排列方式。如果各位还是不清楚,我们在之后的实战演练中会不断出现 Array 的应用,到时或许会有更进一步的认识。
最 后,本文将用一个简单的例子来做 Array, For...Loop, If...Then 的综合练习。很简单地,请在 RhinoScript 中 做一个一维数组,数组中要依序储存 1, 2, 3, 4, 5, 6, 7, 8, 9 共九个数值,之后,请利用 For...Loop 与 If...Then 的组合,使 Rhino 印出数组中的奇数,若为偶数则乘以 2 之后再印出。这个简单练习的式子如下:
Sub Main()
Dim A, i
A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
For i = 0 To 8
If (A(i) Mod 2 <> 0) Then
Call Rhino.Print(A(i))
Else
Call Rhino.Print(A(i)*2)
End If
Next
End Sub
Call Main()
上面这个例子基本上结合了目前已经介绍过的许多VB中的基本知识与功能,如果各位有不懂的地方,请回到之前的文章中寻找答案,本文就不再详细说明,也算是作为一个小小的自我测试练习。
|
|