CAD二次開發(fā)電子教案-第2章數(shù)據(jù)類型函數(shù)課件_第1頁
CAD二次開發(fā)電子教案-第2章數(shù)據(jù)類型函數(shù)課件_第2頁
CAD二次開發(fā)電子教案-第2章數(shù)據(jù)類型函數(shù)課件_第3頁
CAD二次開發(fā)電子教案-第2章數(shù)據(jù)類型函數(shù)課件_第4頁
CAD二次開發(fā)電子教案-第2章數(shù)據(jù)類型函數(shù)課件_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第2章 數(shù)據(jù)類型、表達(dá)式和函數(shù) AutoLISP的數(shù)據(jù)類型豐富,除了一般程序設(shè)計(jì)語言具有的整型、實(shí)型、字符串等類型之外,還有表、函數(shù)、文件描述符、AutoCAD選擇集、AutoCAD圖元名、VLA對象、函數(shù)分頁表和外部函數(shù)等數(shù)據(jù)類型。2.1 數(shù)據(jù)類型1. 整型(INT) 整型即整數(shù),整數(shù)由數(shù)字和正負(fù)號組成,正號可省略。整數(shù)為32位帶符號的數(shù)字,其范圍從2147483648到2147483647。 2. 實(shí)型(REAL) 實(shí)型數(shù)是帶小數(shù)點(diǎn)的數(shù)。在-1和1之間的實(shí)數(shù)必須以0開頭,例如:.5是錯(cuò)誤的,應(yīng)該寫成0.5。實(shí)數(shù)用雙精度的浮點(diǎn)數(shù)表示,并且至少有14位有效位數(shù)的精度。注意,Visual LIS

2、P不顯示所有的有效位。 3. 字符串(STR) 字符串又被稱為字符常數(shù),它是由雙引號括起來的字符序列。字符串中字母的大、小寫和空格符都是有意義的。 字符串中字符的個(gè)數(shù)(不包括雙引號)稱為字符串的長度。字符串的最大長度為100,如果超過100,第100個(gè)字符后面的字符將是無效的。字符串可以是空的,即,稱為空串,其長度為0。 任何字符都可以用nnn的格式表示,其中反斜杠“”是ASCII碼的前導(dǎo)標(biāo)識字符,nnn是該字符八進(jìn)制的ASCII碼。例如,字符串ABCD也可表示為101102123104。一些常用的控制字符,象反斜杠、雙引號,除了可以用 nnn的格式表示之外,還可以用“”轉(zhuǎn)義字符的格式表示為“

3、”、“”等特殊字符,見下表。表2-1常用控制字符的表示方法控制字符 用“”為前導(dǎo)字符 用“”為前導(dǎo)的ASCII碼表示反斜杠“” 134雙引號“” 042Esc鍵 e 033換行 n 012回車鍵 r 015Tab鍵 t 011注意,其中的字符e,n,r,t必須小寫。 4. 表 表以左圓括號開始,以配對的右圓括號結(jié)束,表可以是空的,可以有若干個(gè)元素;元素可以是簡單的,也可以是復(fù)雜的,還可以是其它的表。例如:(+ 1 2 3)、(sin (* 0.5 pi)、(A B)、(A B) C (C D)、(0 LINE)、(10 1.5 2.6 0.0)、()都是合法的表。 表中元素的個(gè)數(shù)稱為表的長度。

4、例如,表(+ 1 2 3)的長度為4、表(sin (* 0.5 pi)的長度為2、表(A B) C (C D)的長度為3、表()的長度為0。 用表可以方便地構(gòu)造出復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如,(1.5 3.6)可以表示為一個(gè)X等于1.5、Y等于3.6的二維點(diǎn),(2.5 2.0 1.0)可以表示為一個(gè)X等于2.5、Y等于2.0、Z等于1.0的三維點(diǎn)。 6. 文件描述符(FILE) 文件描述符是AutoLISP賦于被打開文件的標(biāo)識號,它類似于文件指針。下面的例子是以“讀”的方式打開文件myfile.dat,并將該文件的描述符賦予符號f1。(setq f1 (open myfile.dat r) 返回7.

5、圖元名(ENAME) 圖元名是AutoCAD為圖形對象指定的16進(jìn)制的數(shù)字標(biāo)識。 AutoLISP通過該標(biāo)識,找到該圖形對象在圖形數(shù)據(jù)庫中的位置,以便對其進(jìn)行訪問或編輯。 8. 選擇集(PICKSET) 選擇集是一個(gè)或多個(gè)圖形對象命名的集合??梢酝ㄟ^AutoLISP程序建立選擇集、向指定的選擇集添加或移去圖形對象,通過選擇集可以對其內(nèi)指定的成員進(jìn)行訪問或編輯。9. VLA 對象 VLA 對象是ActiveX 應(yīng)用程序的主要組成部分。 不僅直線、圓弧、多義線和圓等都被稱為VLA對象,圖層、組、塊、視圖、視口、圖形的模型空間、圖紙空間、線型和尺寸標(biāo)注樣式等也被稱為VLA對象,甚至連AutoCAD本

6、身也被認(rèn)為是VLA對象。 在AutoLISP中,符號的大小寫等價(jià),符號的長度沒有限制,且所有的字符都是有意義的。 如果一個(gè)符號的長度不超過6,就用節(jié)點(diǎn)本身來存儲;如果符號的長度超過6,這樣的符號就不能用節(jié)點(diǎn)來存儲,而是在節(jié)點(diǎn)中存放一個(gè)指向?qū)嶋H存儲符號名的指針。這將會多占用存儲空間,且減慢了執(zhí)行速度。因此,符號的長度最好不要超過6。 2.2.2 變量的數(shù)據(jù)類型 AutoLISP變量屬于符號,是指存儲靜態(tài)數(shù)據(jù)的符號。 數(shù)據(jù)類型是變量的重要的特征,因?yàn)樗P(guān)系到存放變量值的存儲空間的大小。多數(shù)的計(jì)算機(jī)語言都在為變量賦值前對變量做顯式或隱式的說明。AutoLISP無須對變量做事先的類型說明,變量被賦予值

7、的類型即為變量的類型。 用setq函數(shù)對變量賦值,例如,(setq a 5),賦值后的結(jié)果是:變量a是整型的,因?yàn)?是整型的;同樣的原因,(setq b 2.5)之后, b是實(shí)型的,(setq c ABC)之后,c就是字符串類型的。 在程序運(yùn)行過程中,同一變量在不同的時(shí)刻可以被賦予不同類型的值,因此在程序運(yùn)行過程中,變量的數(shù)據(jù)類型是可以被改變的。 例如,在一個(gè)程序里有以下兩行:(setq a 5)當(dāng)前的變量a是整型的。(setq a ABC) 當(dāng)前的變量a是字符串類型的。 用type函數(shù)了解變量的類型,例如,(type a ) 返回INT,顯示變量a是整型的;(type b)返回REAL,顯示

8、變量b是實(shí)型的,(type c) 返回STR,顯示變量c是字符串類型的。 2.2.4 預(yù)定義的符號 AutoLISP對變量nil、T、Pause和Pi進(jìn)行了預(yù)定義,用戶可以在編寫AutoLISP程序時(shí)直接使用。(1) nil 如果變量沒有被賦值,它的值為nil。nil與空和0不同的是,它既不是空串,也不是0值,它表示尚無定義。引用未被賦值的變量是錯(cuò)誤的。例如,變量x尚未被賦值,(+ 1 x)就會出現(xiàn)error: bad argument type(壞的參數(shù)類型錯(cuò))。 將nil賦給某一有定義的變量,其結(jié)果是:取消該變量的定義,并釋放其所占存儲空間。 nil作為邏輯變量的值,表示不成立,相當(dāng)于其他

9、程序設(shè)計(jì)語言的false。 (2)T T為常量,它作為邏輯變量的值,表示成立,相當(dāng)于其他程序設(shè)計(jì)語言的true。(3)PAUSE PAUSE與command函數(shù)配合使用,用于暫停,等候用戶輸入。(4)PI PI被定義為常量 。 每個(gè)變量都占用一些內(nèi)存空間。為了節(jié)省存儲空間,可重復(fù)使用變量名,或者將不再使用的變量設(shè)為nil,以便釋放該變量所占的內(nèi)存空間。 2.2.5 顯示變量的值 要想在AutoCAD命令提示區(qū)顯示變量的值,必須在變量名前添加驚嘆號!。例如了解前面已賦值的變量x、v的值,操作如下:Command:!x1.5Command:!vCenterCommand:!znil(假定變量z尚未

10、被定義) 2.2.6 在交互方式下將變量的值傳遞給AutoCAD 在變量前加一個(gè)感嘆號“!”,即可將表達(dá)式的值傳遞給AutoCAD。例如: Command:(setq p (20 10) r 5) Command:circle Specify center point for circle or 3P/2P/Ttr(tan tan radius):! p Specify radius of circle or Diameter::!r 即可畫出圓心的坐標(biāo)為(20,10)半徑為5的圓。R 2.3 表達(dá)式 AutoLISP處理的對象是符號表達(dá)式(簡稱表達(dá)式)。表達(dá)式相當(dāng)于其他編程語言中程序的語句。

11、2.3.1 表達(dá)式的構(gòu)成 表達(dá)式是由原子或表構(gòu)成的。原子可細(xì)分為數(shù)原子、串原子和符號原子。數(shù)或串原子的值是數(shù)或串本身,符號原子的值是賦給該符號的值。例如:5、12.5、“ABC是單個(gè)原子構(gòu)成的表達(dá)式。 多數(shù)情況下,表達(dá)式以表的形式存在,其格式如下: (函數(shù)名 變元) 變元的數(shù)量可能為0,也可能任意多個(gè),這取決于具體函數(shù)。每個(gè)參數(shù)還可以是一個(gè)表達(dá)式。 表達(dá)式形式的表,左圓括號之后的第一個(gè)元素必須是函數(shù)名。 2.3.2 表達(dá)式的前綴表示法 大多數(shù)計(jì)算機(jī)語言的表達(dá)式采用中綴表示法,即運(yùn)算符在操作數(shù)中間。如,x=2.5,y=1+2。 AutoLISP采用前綴表示法,將函數(shù)名放在所有操作數(shù)之前。如,(s

12、etq x 2.5),(setq y(+ 1 2)。 若將x=(a+b)*c 改寫為AutoLISP表達(dá)式,則為: (setq x(* (+ a b) c) 前綴表示法使得運(yùn)算和函數(shù)調(diào)用的形式得到了統(tǒng)一。前面提到,在AutoLISP語言里,運(yùn)算符也屬于函數(shù)。 2.3.3 表達(dá)式的求值過程 在LISP語言中,函數(shù)之間不存在是否優(yōu)先的關(guān)系,運(yùn)算的先后順序只能通過表的層次來實(shí)現(xiàn),最里層的表最先被求值,把求值的結(jié)果返回給外層表,直至求值完畢。 例如,表達(dá)式(setq x(* (+ a b) c),先求出最內(nèi)層a與b之和,然后求出a、b之和與 c的積,將求得的積賦給x,最后返回x的值。 可以在Comma

13、nd:提示下,輸入一個(gè)表達(dá)式,AutoCAD將計(jì)算該表達(dá)式并返回計(jì)算結(jié)果。AutoCAD至多顯示6位小數(shù)。 例如,在Command:提示下,鍵入(sin 0.5)之后回車,將返回0.479426。 如果輸入的或者從文件中讀入的表達(dá)式不正確,將顯示出錯(cuò)信息,最常見的出錯(cuò)信息是:(_ 表示缺少與左圓括號匹配的右圓括號,“(”的個(gè)數(shù)即為缺少右圓括號的數(shù)量。如果出現(xiàn)該信息,輸入與所提示的左圓括號相等的右圓括號既可。由于所缺的右圓括號不一定都是最后的,所以可能產(chǎn)生錯(cuò)誤的結(jié)果。 如果遺漏了與左端雙引號匹配的右端的雙引號,顯示的出錯(cuò)信息為: (_ 在這種情況下輸入匹配的雙引號也不一定使表達(dá)式能正常求值。此時(shí)

14、只能按Esc鍵終止當(dāng)前的輸入,重新輸入表達(dá)式。 如果第一個(gè)元素是一個(gè)表,該表不是調(diào)用而是定義函數(shù),若語法正確,首先定義這個(gè)函數(shù),然后繼續(xù)表達(dá)式求值。 如果第一個(gè)元素既不是函數(shù)名,也不是定義函數(shù),將停止求值并顯示出錯(cuò)信息。 例如(25 a b c),將停止求值并顯示“error: bad function: 25”,因?yàn)?5是非法的函數(shù)名,所以顯示25是壞函數(shù)的出錯(cuò)信息。 又比如(fx a b c) ,將停止求值并顯示“error: no function definition: FX” ,指出沒有定義fx這個(gè)函數(shù)。 用quote函數(shù)可以禁止對表求值。 對于不需求值而直接整體引用的表,例如將一個(gè)

15、表示三維點(diǎn)的表(3 2 1)賦給變量p,如果表達(dá)式為(setq p(3 2 1), 將中斷求值過程并顯示“error: bad function: 3”出錯(cuò)信息。因?yàn)槭紫葘?nèi)層表求值,而內(nèi)層表的第1個(gè)元素“3”不是函數(shù)名,所以停止求值。此時(shí)應(yīng)該用quote函數(shù),將表達(dá)式改為(setq p (quote(3 2 1),這樣就不再對表(3 2 1)求值,而是將將表(3 2 1)整體賦給變量p,使之表示一個(gè)3維的點(diǎn)。 quote是AutoLISP程序中使用最多的函數(shù),因此該函數(shù)可用一個(gè)單引號“”表示。例如(quote (10 20)可以表示為(10 20)。如果將(10 20)這個(gè)2維點(diǎn)賦給變量p2

16、,可寫成: (setq p2 (10 20) 1. 符號 創(chuàng)建一個(gè)符號,例如(setq radius 10),至少需要3個(gè)節(jié)點(diǎn)。一個(gè)節(jié)點(diǎn)鏈接到符號原子表的鏈尾并指向存放符號名的節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)存放符號名和存放符號值的指針,最后一個(gè)節(jié)點(diǎn)存放符號的值,見圖(a)。 如果符號的長度超過6字符,例如(setq fillet_radius 5),需要申請存放符號名的存儲空間,用原來存放符號名的半個(gè)節(jié)點(diǎn)作為指向存放符號名的指針,見圖(b)。顯然要多占用一些存儲空間。 2. 字符串 字符串在內(nèi)存中是以連續(xù)的空間存儲的。3. 表 表通過一組節(jié)點(diǎn)來存儲。這些節(jié)點(diǎn)用右指針指向各自下一個(gè)元素的地址,最后一個(gè)節(jié)點(diǎn)的右指

17、針為空,用左指針指向各自的元素。 下圖依次是表(A B C D)、(A (B C)(D E) 和(setq x(+ (* a)(d)的存儲結(jié)構(gòu)。 4. 點(diǎn)對(dotted pair) 點(diǎn)對是一種特殊的表。若表只有兩個(gè)元素,且每個(gè)元素都是原子,這樣的表可以用點(diǎn)對表示。點(diǎn)對的形式為(原子 . 原子),如(0 . LINE)、(8 . A1)、(40 . 15.0)。用一個(gè)結(jié)點(diǎn)存放點(diǎn)對,結(jié)點(diǎn)的左指針指向第一個(gè)元素,右指針指向第二個(gè)元素。圖是只有兩個(gè)元素(元素為原子)的表的存儲結(jié)構(gòu),圖(b)是點(diǎn)對的存儲結(jié)構(gòu)。從圖中不難得出結(jié)論,兩個(gè)元素都是原子的表,用點(diǎn)對會節(jié)省存儲空間。點(diǎn)對的另一個(gè)特點(diǎn)是簡化了某些函

18、數(shù)對表的運(yùn)算。由于點(diǎn)對具有這些優(yōu)點(diǎn),因此是AutoLISP常用的數(shù)據(jù)結(jié)構(gòu)。 2.5 函數(shù) 前面提到,一般計(jì)算機(jī)語言所說的函數(shù),AutoLISP照常稱之為函數(shù);一般計(jì)算機(jī)語言里的子程序、過程、運(yùn)算符、程序流程控制的關(guān)鍵字,在AutoLISP里都被稱之為函數(shù)。 AutoLISP將函數(shù)分為內(nèi)部和外部函數(shù)。AutoLISP提供的或用AutoLISP定義的函數(shù)為內(nèi)部函數(shù)。用ADS、ADSRX或ARX定義的函數(shù)為外部函數(shù)。2.5.1 定義AutoLISP函數(shù) 定義函數(shù)用defun函數(shù)。格式如下: (defun 函數(shù)名 (變元. / 局部變量. ) 表達(dá)式 .) 函數(shù)名:函數(shù)名和變量名的命名規(guī)則相同,是代表

19、一個(gè)函數(shù)的符號,不應(yīng)與現(xiàn)有的AutoLISP函數(shù)同名,否則現(xiàn)有函數(shù)的功能被新定義函數(shù)的功能所取代。 變元:變元即該函數(shù)的參數(shù),變元的數(shù)量根據(jù)實(shí)際需要而定,可以沒有變元,但不能省略一對括號“()”。 局部變量:在定義函數(shù)時(shí),除了用到函數(shù)的參數(shù)之外,還可能用到其他一些變量。在該域列舉這些變量的名字,這些變量就成為局部變量。局部變量是指局限于該函數(shù)內(nèi)部所用的變量,它只在該函數(shù)調(diào)用期間得到定義,函數(shù)調(diào)用結(jié)束,局部變量的值均為nil,同時(shí)釋放其所占存儲空間。如果不作聲明,它們將成為全程變量,即使函數(shù)調(diào)用結(jié)束,仍然保留各自的值,可被其他函數(shù)所存取,直至退出當(dāng)前的圖形文件。進(jìn)行局部變量聲明不僅可以節(jié)省存儲空

20、間,而且可以避免函數(shù)之間相互干擾。局部變量與變元之間用除號隔開,即使沒有變元,也可以有局部變量說明,但前面要有除號。 表達(dá)式:表達(dá)式的數(shù)量不限,用于描述該函數(shù)的運(yùn)算。 函數(shù)的返回值:最后一個(gè)表達(dá)式的返回值即為該函數(shù)的返回值。 【例2-1】定義一個(gè)加10函數(shù),源代碼如下:(defun add10(x) (setq x(+ 10 x)或者:(defun add10(x) (+ 10 x) 該函數(shù)的函數(shù)名是add10,只有一個(gè)變元x,沒有局部變量說明,它返回表達(dá)式(setq x(+ 10 x)或(+ 10 x)的值(二者是相等的)。 【例2-2】定義一個(gè)已知圓柱體的半徑和高度,計(jì)算其體積的函數(shù)。源代

21、碼如下: (defun volume(r h / v) (setq v(* r r pi h) ) 該函數(shù)的函數(shù)名是volume ,有兩個(gè)變元r(半徑)和h(高度),有一個(gè)局部變量v,它返回表達(dá)式(setq v(* r r pi h)的值。 2.5.2 調(diào)用AutoLISP函數(shù) AutoLISP以表的形式調(diào)用函數(shù),其格式如下: (函數(shù)名 變元) 表的第一個(gè)元素是函數(shù)名,其余是該函數(shù)所要求的變元,變元的數(shù)量可能為0,也可能任意多個(gè),這取決于具體函數(shù)。例如, (sqrt 4),調(diào)用的函數(shù)名為sqrt(求平方根),函數(shù)的變元是4、只有一個(gè)變元; (+ 1 2 3),調(diào)用的函數(shù)名為“+”(加),函數(shù)的

22、變元是1、2、3,共有3個(gè)變元。 每個(gè)變元還可以是一個(gè)表達(dá)式。例如: (sqrt (+ 1 2 3)。 每調(diào)用一個(gè)函數(shù),都會得到函數(shù)的返回值。例如, (sqrt 4) , 返回2 (+ 1 2 3) , 返回6 有些函數(shù)返回邏輯常數(shù)T或nil,例如, ( 1 2), 返回T; (not 1),返回nil。 調(diào)用自定義的函數(shù)與調(diào)用系統(tǒng)提供的函數(shù)的格式相同。例如, (add10 3) (setq y(add10 (+ 2 3) (volume 12.5 20)1) 2.5.3 遞歸調(diào)用AutoLISP函數(shù) AutoLISP可以在一個(gè)函數(shù)的內(nèi)部定義另一個(gè)函數(shù),可以遞歸定義和調(diào)用函數(shù)?!纠?-3】定義

23、階乘函數(shù) 階乘的定義是,0的階乘等于1,n的階乘等于n(n-1)的階乘。程序的源代碼如下: (defun factorial(x) (if (= x 0) 1 (* x (factorial (- x 1) ) ) 2.5.4 調(diào)用AutoCAD命令 AutoLISP用command函數(shù)調(diào)用AutoCAD命令,其格式如下:(command “AutoCAD命令” 命令所需的數(shù)據(jù) )【例2-4】繪制以(2,4)為圓心,5為半徑的圓。(command circle 2,4 5)或者(command circle (2 4) 5)【例2-5】已知p1、p2、p3為不在同一直線上的三個(gè)點(diǎn),利用這三個(gè)點(diǎn)畫圓。(command circle 3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論