AutoLISP程序語言設計_第1頁
AutoLISP程序語言設計_第2頁
AutoLISP程序語言設計_第3頁
AutoLISP程序語言設計_第4頁
AutoLISP程序語言設計_第5頁
已閱讀5頁,還剩60頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、AutoLISP平程序語言設計1AutoLISP程序語言概述AutoLISP數據類型AutoLISP程序結構AutoLISP內部函數函數定義及裝載AutoLISP程序調試與編程實例21. AutoLISP語言簡介 LISP(list processing language)語言是一種計算機的表處理語言,是在人工智能學科領域中廣泛采用的一種程序設計語言。(Lisp 語言最早是在 20 世紀 50 年代末由麻省理工學院(MIT)為研究人工智能而開發的。) 美國AutoDesk公司在AutoCAD內部嵌入AutoLISP的目的是使用戶充分利用AutoCAD進行二次開發:實現直接增加和修改AutoCA

2、D命令,隨意擴大圖形編輯功能,建立圖形庫和數據庫并對當前圖形進行直接訪問和修改等。5.1 AutoLISP程序語言概述32. AutoLISP的特點(1)AutoLISP語言是在普通的LISP語言基礎上,又擴充了許多適用于CAD應用的功能而形成的一種程序設計語言。它是一種解釋性求值語言,速度較慢,難以保密,可用任何文字編輯軟件編輯,用純文本的格式保存。(2)AutoLISP語言中的一切成分都是以函數形式給出的,它沒有語句概念或其他語法結構。執行AutoLISP程序就是執行一些函數,再調用其它函數。(3)AutoLISP把數據和程序統一表達為表結構,故可把程序當作數據來處理,也可把數據當作程序來

3、執行。(4)AutoLISP語言中程序運行過程就是對函數求值的過程,是在對函數求值的過程中實現函數的功能。(5)AutoLISP語言的主要控制結構是采用遞歸方式。遞歸方式的使用,使得程序設計簡單易懂。 45.2 AutoLISP數據類型 AutoLISP主要有如下數據類型:整數 (INT)實型數 (REAL)符號原子 (SYM)字符串 (STR)表(及用戶定義的函數) (LIST)文件描述符 (FILE)AutoLISP的內部函數 (SUBR)AutoCAD的選擇集 (PICKSET)AutoCAD的實體名 (ENAME)函數分頁表 (PAGETB)55.2.1 整數 整數是由0,1,2,9,

4、+,-字符組成,不許出現其它字符,+號可有可無。例如:+256,103,-15,0。5.2.2 實型數 實型數是用雙精度的浮點數表示并且有至少14位有效精度,即整數后跟小數。 如果實數的絕對值小于1,小數點前必須加0,不要直接以小數點開頭。否則,計算機誤認為是點對而出錯。例如,“.4”是錯誤的表示,“0.4”才是正確的寫法。實型數也可以用科學計數法表示,即數字后可有一個可選擇的“e”或“E”,后跟數的指數。例如:0.12E9表示0.12109。65.2.3 符號原子符號原子可以包含除以下字符以外的任何可打印字符: ( ) 用作表的定義; 用作點對;也是一種表。 用作QUOTE函數的簡寫; ”

5、用作字符串常數的定界符; ; 用作程序的注釋標志。符號原子的長度沒有限制,但盡量不要超過6個字符,否則要占用額外的內存,降低運行速度。在AutoLISP中,符號的大小寫是等效的。例如,ABCD,Abcd,abcd,AbcD都表示一個符號原子。 AutoLISP中的任何符號都是有值的,即符號都要賦以一定的數值,或者說符號總是約束在一定值上。一般用賦值函數setq進行賦值。例如:(setq X 25.0) 意思是將25.0賦給x,這時x的當前約束值為25.0一個符號在使用前如沒有賦以任何值,則該符號的值為nil(空),它不占用內存空間。75.2.4 字符串字符串是由包括在一對雙引號內的一組字符組成

6、的。字符串包含任何可打印的字符。字符串中字母的大小寫及空格都是有意義的。字符串的最大長度為100個字符若字符串中沒有任何字符,則為空串“”。 字符串中可以包含ASC表中的任何字符,通用的表示格式為“nnn”,其中nnn是其字符的八進制ASC碼。例如,字符串“ABCD”也可表示為“101102103104”。由于反斜杠已作為前導的標識字符,在字符串中有特殊作用,如果字符串中要包含它,則必須用兩個相鄰的反斜杠來表示:“”,當然,反斜杠也可表示為“114”。由于雙引號已用作字符串的定界符,若需在字符串中包含雙引號,則可用“042”表示。 8 除可用“nnn”的形式表示ASC表中的控制字符外,在Aut

7、oLISP中,對于常用的控制字符有特定的簡單的表示形式,如下表所示。 常用的控制字符 必須注意,其中的字符e,n,r,t 必須小寫。例如,下面的表達式執行時都將提示在新的一行上顯示: (Prompt“nEnter first point:”) (Prompt“012Enter first point:”) 字符串常用于磁盤文件名,標識符的打印名等。95.2.5 表 AutoLISP廣泛地使用表。表提供了在一對符號中存儲大量相關數值的有效方法。 例如點的表示,二維點以表(X Y)表示,第一個數值是點的X坐標,第二個數值是點的Y坐標。三維點以表(X Y Z)表示,第一個數值是點的X坐標,第二個數值

8、是點的Y坐標,第三個數值是點的Z坐標。 例如(setq a 6.0)也是一個表,表中有三個元素,第一個元素setq為一函數名,第二個元素為一變量,第三個元素為一實數。10 在AutoLISP語言中,表有如下特點:(1)表是指放在一對相匹配的左、右括號中的一個或多個元素的有序集合。(2)表中的每一個元素可以是任何類型的表達式,即可以是數字、符號、字符串,也可以是表。(3)元素與元素之間要用空格隔開,注意元素與括弧之間可不用空格。如:(15(a b)c d),在此例中,表內有4個元素,其中第二個元素是表。(4)表可以是任意嵌套的,上例中即嵌套了一個表。表可以嵌套很多層,從外層向里依次稱為0層,1層

9、,2層(5)表中的元素是有順序的,為便于對表中元素進行存取,每個元素都有一個符號。從左向右,第一個元素序號為0,第i個元素序號是i-1。(6)表的大小為表的長度,即表中頂層元素的個數。沒有任何元素的表稱為空表。空表用()或nil表示。在AutoLISP中,nil是一個特殊的符號原子,它既是原子又是表。(7)表有兩種基本類型:標準表和引用表。標準表:第一個元素的值必須是一個合法的已經存在的AutoLisp函數定義,后跟調用該函數的參數。引用表:是在表的前面冠以引用符號(或Quote)對該表不求值。11命令: (setq x 20)20命令: (setq Y 24)24命令: !x ;查詢x的值2

10、0命令: !y24命令: (setq !a 20)20命令: !anil命令: !A20命令: (setq x 20)命令:!xnil126.文件描述符 文件描述是AutoLISP賦予被打開文件的標識號。當AutoLISP函數需要訪問一個文件時(讀該文件或者寫該文件),首先通過該文件描述符去識別并建立聯系。下面的例子打開文件“my”,使它可被其它函數讀取,并把該文件描述符的數值賦予符號fl。 (setq fl (open D:usermy W )13 符號:用作變量、函數的名字。 命名規則:不能只含數字,除下列字符以外的任何可打印字符組成:() . ; “ ” 符號長度無限制,但一般不超過6。

11、 變量的數據類型:不需要事先進行類型說明,變量被賦予值的類型就為變量的類型。 不能使用內部函數名和關鍵字作為變量名。 變量賦值:(setq 變量1 值1 變量2 值2.) 顯示變量的值:!變量名(同時將值傳遞給autocad)。5.2.6 變量14nil:變量沒有賦值,尚無定義。 將nil賦給某一有定義的變量,其結果是取消該變量的定義并釋放其所占存儲空間。 引用尚未賦值的變量是錯誤的。nil作為邏輯變量的值,表示不成立。T:邏輯成立。Pause:暫停,等待用戶輸入。Pi:。 5.2.7 預定義的符號155.3 AutoLISP的程序結構1. 表達式 (1)表達式含義:AutoLISP處理的對象

12、是符號表達式(簡稱表達式)。它相當于其它編程語言中的程序語句。 (2)表達式的構成:表達式由原子或表構成。多數情況下以表的形式存在,例如:(函數名 變元) (3)表達式前綴表示法 大多數計算機語言采用“中綴表示法”來表示程序語句,如在C語言中,給變量X賦值為25.,寫成如下語句: 25. 在該表示法中,運算符“=”放在兩個操作數“X”和“25.0”中間。這種表示法是大家都熟悉的。在AutoLISP語言中,采用的是“前綴表示法”,即把運算符放在操作數之前,而不是放在它們的中間,并把運算符(即函數名)和操作數(即調用函數的參數)用圓括號括起來,以表的形式表示。如上例,用AutoLISP表示: (s

13、etq X 25.0) 運算符(setq)放在操作數(X 25.0)之前。16再看下面的例子: X=(A+B)*C 這是一個“中綴表示法”表示的一個表達式,若用AutoLISP表示則為: (setq X ( * (+ A B)C) 其中“+”、“*”號在AutoLISP中仍用作加法和乘法函數的名字。 (4)表達式的求值規則 整型數、實型數和字符串以其本身的值作為求值結果。 符號以其當前的約束值作為求值結果。 表根據其第一個元素來進行求值。(+ ( * 2 3) ( / 6 3) 返回:8( fx a b c) 返回:error: no function definition: fx( 5 a

14、b c) 返回:error: bad function: 5( setq p (3 2 1) 返回:error: bad function: 3172.程序結構組成 (1)一個完整的AutoLISP程序往往是由一系列按順序排列的表達式組成。例如: (defun plus(x y) (+(* x y)x) ) (setq a 2.) (setq b 4.0) (setq c (plus a b) 這個簡單的AutoLISP程序由4個表達式(即表)組成。第一個表給出了X*Y+X的函數定義,第二、三表分別給變量A、B賦值,最后一個表是對定義的PLUS函數的調用。18(2)在AutoLISP程序中,一

15、個表達式可以分在多行中寫,也可以一行中寫幾個。一行由“回車”結束。如前所述,原子之間多個空格的作用和一個空格的作用相同,都起著分隔符的作用。如果不考慮打印或印刷限制的話,可以利用多個空格使程序的結構直觀,便于閱讀。例如已知函數: 用AutoLISP可以定義如下:(defun fun(x)(cond( x 0)1)(= x 0)2)( x 0)1) (= x 0)2) ( x 0)0) ) )19(3)在AutoLISP程序中可以用注釋。 注釋的作用是對程序作解釋。例如,題目的名稱、算法及使用方法,各函數的功能及調用參數的數據類型,長表達式的開始、結束標記等。注釋以一個分號“;”開始,并在一行的

16、末尾結束。注釋可以出現在程序的任何地方。注釋應該盡量的多,它并不減慢程序運行,但以后閱讀程序或修改代碼時,卻能節省大量的時間。 ;This program prints the ASCs(30-90)to the screen. ;usage;Command:pras (defun c:pras(/ as) (setq as 30) ;set AS to the first ASC (while(= as 90) ;loop (princ(chr as) ;print to screen (terpri) ;new line (setq as (+ as 1) ;set AS to the n

17、ext ASC ) ;end of WHILE )(4)AutoLISP程序一般是以后綴“.LSP”的ASC碼文本文件的形式存盤的,然后再調入內存求值。 205.4 AutoLISP內部函數基本函數圖形處理函數程序結構控制函數文件管理與I/O函數211.基本函數 (1)數值計算函數(2)邏輯運算函數(3)數據類型轉換函數(4)字符串處理函數(5)表處理函數22(1)數值計算函數 1)(+ ) 功能:求表中所有整數或實數的和。示例: Command:(+ 1.2 3.1 3.8) 8.1 2)(- ) 功能:求表中第一個數減去后面所有數的差,當表中只有一個數時,返回這個數的相反數。示例: Com

18、mand:(- 8.1 5) 3.1 Command:(- 0.25) -0.25 3)(* ) 功能:求表中所有數的積,示例: Command:(* 2 5) 10 4)(/ ) 功能:求表中第一個數除以后面所有數的商。示例: Command:(/ 10 5 2.0) 1.0 5)(1+ ) 功能:求一個整數或實數加1的和。示例: Command:(1+ 2.7) 3.723 6)(1- ) 功能:求一個整數或實數減1的差。示例: Command:(1- 2.7) 1.7 7)(abs ) 功能:求一個整數或實數的絕對值。示例: Command:(abs -3.14) 3.14 8)(sin

19、 ) 功能:求一個用弧度表示的角度的正弦值。示例: Command:(sin 0) 0.0 9)(cos ) 功能:求一個用弧度表示的角度的余弦值。示例: Command:(cos 0.0) 1.0 10)(atan ) 功能:求數1/數2或數1的反正切值。當數2為零時,函數值為 /2。示例: Command:(atan 0.707 0.707) 0.7854 Command:(atan 1.0 0) 1.570824 11)(sqrt ) 功能:求一個整數或實數的平方根。示例: Command:(sqrt 256) 16.0 12)(min ) 功能:求表中所有整數或實數的最小值。示例: C

20、ommand:(min 1.44 -1.2 -2.1 -3.6) -3.6 13)(max ) 功能:求表中所有整數或實數的最大值。示例: Command:(max -2.5 2.1 3.4) 3.4 14)(expt ) 功能:求底數的冪次方。示例: Command:(expt 2.0 3) 8.0 15)(log ) 功能:求一個數的自然對數。示例: Command:(log 2) 0.693147 16)(gcd ) 功能:求數1和數2兩個整數的最大公約數。示例: Command:(gcd 144 16) 16 17)(rem ) 功能:求數1除以數2的余數。示例: Command:(r

21、em 162 38) 1025 (2)邏輯運算函數 1)(= ) 功能:判斷是否相等,相等為T,否則為nil。示例: Command:(= 28 28.0) T 2)(/= ) 功能:判斷各原子是否不等,不等為T,否則為nil。示例: Command:(/= April May) T Command:(/= 20 20) nil 3)( ) 功能:判斷左邊的原子是否依次大于右邊的原子,大于則為T,否則為 nil。示例: Command:( 7 2 1) T Command:( 2 6 0) nil 4)( ) 功能:判斷左邊的原子是否依次小于右邊的原子,小于則為T,否則為 nil。示例: Co

22、mmand:( 1 1 2) nil Command:(= ) 功能:判斷左邊的原子是否依次大于或等于右邊的原子,大于或等于則為T,否則為nil。示例: Command:(= 2 1 1) T Command:(= 2 1 2) nil 6)( = ) 功能:判斷左邊的原子是否依次小于或等于右邊的原子,小于或等于則為T,否則為nil。示例: Command:(= 7 8 8) T Command:(= 1 3 2) nil 7)(and ) 功能:對所列的表達式進行邏輯“與”運算,有一個表達式結果為(nil)即為nil,否則為T。示例: Command:(setq a T) T Command

23、:(setq b nil) nil Command:(and a b) nil 8)(or ) 功能:對所列有的表達式進行邏輯“或”運算,當所有表達式都為(nil)即為nil,否則為T。示例: Command:(setq c nil) nil Command:(setq b nil) nil Command:(or b c) nil 27 9)(not ) 功能:對所列項求反,當該項值為nil時則為T,否則為nil。示例: Command:(setq b nil) nil Command:(not b) T 10)(atom ) 功能:判斷所列項是否為原子,當該項為表時,則為nil,否則為T。

24、示例: Command:(atom c) T Command:(setq a (1.2 5.0) (1.2 5.0) Command:(atom a) nil 11)(boundp ) 功能:判斷所列的原子是否有非nil值,若有則為T,否則為nil。示例: Command:(setq c nil) nil Command:(boundp c) nil Command:(setq a T) T Command:(boundp a) T 28 12)(listp ) 功能:判斷所列項是否為一個表,是則為T,否則為nil。示例: Command:(listp (a b c) T Command:(l

25、istp a) nil 13)(minusp ) 功能:判斷所列項是否為負數,是則為T,否則為nil。示例: Command:(minusp -3.2) T Command:(minusp 8.32) nil 14)(numberp ) 功能:判斷所列項是否為整型或實型數,是則為T,否則為nil。示例: Command:(numberp -3.26) T Command:(numberp Endpoint) nil 15)(null ) 功能:判斷所列項的值是否為nil,是則為T,否則為nil。示例: Command:(setq a T) T Command:(setq b nil) nil

26、Command:(null b) T Command:(null a) nil29 16)(member ) 功能:在表中求得從出現位置的內容,若不含有的內容,則為nil。示例: Command:(member a (d b a c e) (a c e) Command:(member ac (d b a c e) nil 17)(zerop ) 功能:判斷所列項的內容是否為零,是則為T,否則為nil。示例: Command:(zerop 0) T Command:(setq a 1) Command:(zerop a) nil 18)(eq ) 功能:判斷和是否完全相同,是則為T,否則為ni

27、l。示例: Command:(setq c a) Command:(eq c a) T Command:(eq(setq a (1 2)(setq b (1 2) nil 19)(equal ) 功能:判斷兩表達式的值是否相等,是則為T,否則為nil。示例: Command:(equal(setq a (1 2)(setq b (1 2) T30(3)數據類型轉換函數 1)(type ) 功能:判斷所列項的數據類型,其值為下列類型之一。 INT(整型數) REAL(實型數) SYM(符號) STR(字符串) LIST(表) SUBR(內部函數) FILE(文件描述符) 示例: Command:

28、(type (set a 25) LIST Command:(type *) SUBR Command:(type(setq f(open jq.txt r) FILE 2)(fix ) 功能:將實型數去掉小數部分化為整型數。示例: Command:(fix 2.13) 2 3)(flaot ) 功能:將整型數化為實型數。示例: Command:(flaot 2) 2.0 4)(itoa ) 功能:將整型數化為字符串。示例: Command:(itoa 28) 2831 5)(atoi ) 功能:將字符串化為整型數。示例: Command:(atoi 415) 415 6)(atof ) 功能

29、:將字符串化為實型數。示例: Command:(atof 5) 5.0 7)(rtos ) 功能:按著AutoCAD系統變量LUNITS和LUPREC定義的記數方式和精度將數轉化為字符串。示例:設LUNITS=2(十進制),LUPREC=4 Command:(rtos 3.7) 3.7000 8)(angtos ) 功能:按著AutoCAD系統變量LUNITS和LUPREC定義的記數方式和精度將弧度數轉化為字符串。示例:設LUNITS=0(度),LUPREC=4 Command:(angtos 3.14) 180 9)(ascii ) 功能:求出字符串第一個字符的ASCII值。示例: Comm

30、and:(ascii Access) 65 10)(chr ) 功能:求出整型數所代表的ASCII字符。示例: Command:(chr 65) A32(4)字符串處理函數 1)(strcat ) 功能:將所列的字符串合并為一個字符串。示例: Command:(strcat C A D) CAD 2)(strlen ) 功能:求出字符串的長度。示例: Command:(strlen AutoCAD) 7 3)(substr ) 功能:按要求求出字符串的一個子串。示例: Command:(substr AutoCAD 5 3) CAD33(5)表處理函數 1)(list ) 功能:用所列表達式組

31、成一個表。示例: Command:(list C A D) (C A D) Command:(list 1.2 2.3) (1.20 2.30) 2)(append ) 功能:將所列的合并成一個新表。示例: Command:(append (C) (A) (D) (C A D) 3)(cons ) 功能:將新元素加到表的開頭,形成一個新表。示例: Command:(cons C (A D) (C A D) Command:(cons (A C) (A D) (A C) A D) 4)(subst ) 功能:用新元素替換表中的舊元素。示例: Command:(subst M D (C A D)

32、(C A M) 5)(assoc ) 功能:在關聯表中求出指定關鍵字的子表。示例: Command:(setq alst (new 550) (old 162) (new 550)(old 162) Command:(assoc new alst) (new 550)34 6)(last ) 功能:求出表的最后一個元素。示例: Command:(last (Auto CAD) CAD Command:(last (Auto(CAD 14) (CAD 14) 7)(car ) 功能:求出表的第一個元素。示例: Command:(car (Auto (CAD 14) Auto 8)(cdr ) 功

33、能:求出表中去掉第一元素后的剩余表。示例: Command:(cdr (Auto (CAD 14)hz) (CAD 14)hz) 若已知一點pt:(setq pt(list 2.0 3.0 5.0),則可用三個函數分別得到該點的x、y、z分量值。 Command:(car pt);返回點變量pt的x分量2.0。 Command:(cadr pt);返回點變量pt的y分量3.0。 Command:(caddr pt);返回點變量pt的z分量5.0。 9)(nth ) 功能:求出表中第n個元素(表的第一個元素的序號為0)。示例: Command:(nth 2 (Auto (CAD 14) hz)

34、hz 10)(reverse ) 功能:求出表的倒置表。示例: Command:(reverse (CAD 14) hz) (hz(CAD 14)35 11)(length ) 功能:求出表中頂層元素的個數。示例: Command:(length (Auto (CAD 14) hz) 3 12)(foreach ) 功能:將表中元素逐一賦給變量并求表達式的值。示例: Command:(foreach x (1.0 2.0 3.0)(print x) 1.0 2.0 3.0 3.0 13)(mapcar ) 功能:將表中的各元素按函數的要求進行處理。示例: Command:(mapcar * (

35、1 2 3) (2 3 4) (2 6 12) 14)(apply ) 功能:按指定函數對表進行處理。示例: Command:(apply * (1 2 3) 6 15)(quote )或() 功能:給出沒有計算的表達式,也稱為禁止求值函數。示例: Command:(quote a) A Command:(setq a 1) (setq a 1) 36 2.圖形處理函數 (1)交互輸入函數 (2)求值函數 (3)AutoCAD命令函數37 (1)交互輸入函數 1)(getangle ) 功能:用相對基點拖動指定點或直接輸入的方法確定一個角度,該角度為相對角度,零度角總為x軸正向,角度增加的方向

36、由系統變量ANGDIR定義。示例: Command:(setq a(getangle Enter angle:) Enter angle:90 1.5708 Command:(setq a(getangle (0 0) Enter angle:) Enter angle:(拾取(0,1)點) 1.5708 2)(getdist ) 功能:用相對基點拖動指定點或直接輸入的方法確定一段距離。示例: Command:(setq d(getdist Enter distance) Enter distance:10 10.0 Command:(setq d(getdist (0 0)Enter dis

37、tance) Enter distance:(拾取(2,2)點) 2.82843 3)(getpoint ) 功能:用相對基點拖動指定點或直接輸入的方法確定一點。示例: Command:(setq P (getpoint Enter point) Enter point:(拾取(2,2)點) (2.0 2.0 0.0)38 4)(getint ) 功能:輸入一個整數。示例: Command:(setq n (getint Number of items:) Number of items:5 5 5)(getreal ) 功能:輸入一個實數。示例: Command:(setq x (getre

38、al scale factor:) scale factor:2.5 2.5 6)(getstring ) 功能:輸入一個字符串,當Cr為nil時,字符串不能含有空格。示例: Command:(setq s (getstring nil ATTRIBUTE NAME:) ATTRIBUTE NAME:city city Command:(setq s (getstring T CITY:) CITY:Beiging China Beiging China 7)(getcorner ) 功能:輸入與基點構成矩形對角線上的另一點。示例: Command:(setq s(getcorner (10

39、10) Enter a point:) Enter a point:(拾取(8,6)點) (8.0 6.0 0.0)398)(getorient ) 功能:用相對基點拖動指定點或直接輸入的方法確定一個角度,該角度為絕對角度,零度角和角度增加方向分別由ANGBASE和ANGDIR定義。示例: 設ANGBASE=90(y軸正向為角度起始方向),ANGDIR=1(順時針) Command:(setq a(getorient Enter angle:) Enter angle:45 0.7853989)(initget )功能:用規定的數據范圍和規定的上述get*函數可接受的關鍵字來對get*函數的各

40、種輸入自動進行檢查。其中位值為表中所列的整數或它們的和。 位值的含義整數意 義1不接受空串2不接受零值4不接受負值8不檢查繪圖界限16返回三維點示例:自動檢查輸入項數是否為正整數。 ;Define number of items in array(defun c:test() (setq n 0) (while(= n 1) (initget (+ 1 2 4) ) (setq n(getint nNumber of items:) ( if(= n 1) (prompt nNumber of items must be greater than 1) ) )40 10)(getkword 功

41、能:用來接受用戶輸入的關鍵字,并以字符串的形式返回。有效的關鍵字集必須預先在initget函數中進行定義。如果輸入的不是關鍵字,AutoCAD將要求重新輸入。 示例:接受用戶對提問用Yes(Y)或No(N)來進行回答。 ;Are objects to be rotated? (initget Yes No) (setq yn(getkword nRotate objects as they are copied?:) (if(= nul yn) (setq yn Y)41(2)求值函數 1)(distance ) 功能:求兩點之間的距離。示例: Command:(distance (1.0 2

42、.0) (2.0 1.0) 1.41421 2)(angle ) 功能:求點1至點2直線確立的角度(弧度)。示例: Command:(angle (1.0 2.0) (2.0 1.0) 5.49779 3)(polar ) 功能:求距基點的距離為d,方向為a的點。示例: Command:(polar (1.0 1.0) 0.785398 1.414214) (2.0 2.0) 4)(eval ) 功能:求表達式的二次求值結果。示例: Command:(setq x (+ 1 3) Command:(princ x) (+ 1 3) Command:(eval x) 442 (3)AutoCAD

43、命令函數 (Command 命令名) 功能:在AutoLISP程序中調用并執行AutoCAD命令。這是一個非常有用的函數,它提供了AutoLISP與AutoCAD之間的內部接口,使得AutoLISP程序可以具有AutoCAD的圖形功能,是開發應用系統時最常使用的工具。 其中命令名可以取除PLOT、PRPLOT、SKETCH、SCRIPT、DTEXT命令之外的所有命令,則是AutoCAD命令執行過程中需要的各種數據,可以是字符串、實型數、整型數或點,如點的坐標、距離或位移、角度、選項關鍵字、子命令名、文本等,參數的書寫格式是: 參數=AutoCAD的鍵盤輸入值 對于整數和實型數,可以省略雙引號;

44、對于點的坐標,還可以用表的形式來表示;回車鍵可以用來表示,兩個雙引號間不要有空格;而一個空字符串 ,則表示在鍵盤打入一個空格。示例: (Command LINE (2.0 3.0) (5.0 6.0) ) 在Command函數中,不能使用get*函數來互式輸入參數,但可以將get*函數放在相應的Command函數之前使用。示例: (setq P1 (2.0 3.0) (setq P2(getpoint Enter a point:) (Command LINE P1 P2 )433.程序結構控制函數 (1)(progn ) 功能:可按順序計算到的值,并返回最后一個表達式的值。示例: 當X的值大

45、于等于0時,計算y=3x+6和Z=x2+2x的值。 (if (= x 0) (progn (setq y(+ (* 3 x)6) (setq Z(+(* x x)(* x 2) ) (2)(if ) 功能:可根據條件計算表達式。當不是nil時,就計算,否則就計算,并返回所計算的表達式值。當不存在且為nil時,將返回nil。 它相當于其它高級語言中的IFTHENELSE語句,可實現選擇分支結構。注意if函數要求表達式為一個變元,因此,在需要計算多個時,可使用progn函數來進行擴展,以實現塊if分支選擇結構,示例見progn函數。示例: (if(= x 0)(setq y 1) (setq y

46、-1) )44(3)(cond ( ) ( ) ( ) 功能:按順序計算每一個子表的,若不為nil,則計算子表中的所有,并返回最后一個的值。如果對所有的計算均為nil,則函數的返回值為nil。 cond函數常用來構造多分支選擇結構,以在不同的條件下,獲得不同的值。示例: (cond( x 0)(setq y 1) (= x 0)(setq y 0) ( x 0)(setq y -1) )(4)(repeat ) 功能:可按照的要求重復計算后面的一系列,并返回最后的計算結果。repeat函數常用來構造已知重復次數的迭代結構。 示例:求s=12+22+32+42+1002 (setq s 0) (

47、setq n 1) (repeat 100 (setq s(+ s(* n n) (setq n(+ n 1) ) (print s)45(5)(while ) 功能:若不為nil,則計算后面的一系列,然后再判斷,這樣循環下去,直到為nil才終止,并返回最后一次計算的最后一個的值。如果一開始即為nil,則它們返回值也為nil。while函數常用來構造循環和多重循環結構。 示例:求s=1*2*100 (setq s 1) (setq n 1) (while (= n 100) (setq s(* s n) (setq n(+ n 1) ) (print s)464.文件管理與I/O函數 (1)(

48、load) 功能:用來裝入一個類型為LSP的AutoLISP程序文件,并計算文件中的所有值??梢圆粠ь愋兔?LSP,并可以包括驅動器名和目錄名前綴。 如果裝入成功,load函數將返回文件中最后定義的函數名或表達式的值,否則返回文件名或出錯信息。 示例:裝入構造常用三維形體的3D.LSP程序文件。 Command:(load 3D) c:3D 返回該文件中最后定義的一個函數名,表示3d.lsp裝入成功。47 (2)(open) 功能:用來打開一個ASCII文件,以便AutoLISP的I/O函數對其進行存取,它返回文件描述符,以供其它I/O函數使用,因此需要在打開文件的同時,將文件描述符賦給一個變

49、量。 可以包括盤符和目錄名,并需要帶上文件類型名。 是用小寫字母表示的r(表示讀)或w(表示寫或重寫)或a(表示添加)。 如果不存在,且為w或a將產生并打開一個新文件。 如果不存在,且為r將返回nil。 AutoLISP允許同時打開16個文件。示例: (setq f1(open old.TXT r) (setq f2(open new.TXT w) (setq f3(open A:userCAD1.TXT a) 注意:為添加數據而打開的文件,其文件尾部不能含有CTRL-C文件結束符(ASCII碼值為26),否則,當對文件進行讀操作時,會在文件結束符位置返回而使添加的數據不能讀出。48 (3)(

50、close) 功能:用來關閉一個用open函數打開的文件,其中是在打開文件時得到的。寫入文件的內容,只有在文件關閉后,才能被保存起來。示例: (close f1) (4)(read-char) 功能:用來從鍵盤輸入緩沖區中或從表示的已打開文件中讀入一個字符,并返回該字符的ASCII值。 若沒有指定文件描述符且鍵盤輸入緩沖區為空,則(read-char)將等待用戶鍵入一個字符或一些字符,并按回車鍵結束。read-char將按輸入次序逐個返回各字符的ASCII值(調用一次返回一個)。示例: (read-char f)或(read-char) (read-char) 從鍵盤輸入ABC 返回:65 (

51、read-char) 返回:66 (read-char) 返回:67 (read-char) Enter后返回ASC字符碼1049 (5)(read-line) 功能:用來鍵盤輸入緩沖區或從表示的已打開文件中,依序讀取一行字符串,當讀取結束后返回nil。同read-char一樣,read-line也可以在鍵盤輸入緩沖區為空時,等待用戶輸入一些數據(最后要用回車鍵結束),read-line最后將返回這個字符串。 示例:(read-line f)或(read-line) 若用戶鍵入“CAD”并回車后,read-line將直接返回“CAD”字符串。 (read 字符串) 功能:返回由一個字符串取得的

52、第一個列表或元素。 示例:(read Autolisp DCL ) 返回:Autolisp (read (1 2 3) (4 0) ) 返回:(1 2 3) (read 1.23 ) 返回:1.23 (read 10 20 ) 返回:10 (6)(write-char) 功能:用來將由所代表的字符寫到屏幕上或由表示的已打開文件中,并返回該字符的ASCII值。 示例:寫字符C到屏幕或文件f中。 (write-char 67) (write-char 67 f)50 (7)(write-line) 功能:用來將寫到屏幕上或表示的打開文件中,并返回該字符串。 示例:將字符串“AutoCAD R14.

53、0”寫到屏幕或文件f中。 (write-line AutoCAD R14.0) (write-line AutoCAD R14.0f) (8)(prompt) 功能:用來在命令通訊區顯示,并返回nil。示例: (prompt Please wait Loading 3D object.) (9)(prin1) 功能:用來在屏幕當前光標位置打印,如果含有一個為寫而打開的文件描述符,則將寫入該文件。 如果為字符串,則打印時字符串帶雙引號。如果含有控制字符,prin1將不做處理。打印后的光標停在最后一個字符的下一個位置上。示例: (prin1 CAD) ;屏幕打印CAD (prin1 OK!) ;屏

54、幕打印“OK!” (prin1 Line f) ;將“Line”寫入文件 (prin1 CADnR14.0) ;屏幕打印“CADnR14.0”51 (10)(print) 功能:與prin1函數相比,print函數在打印之前要先換行,并在新行的第一列位置開始打印,打印后還需要附加一個空格來結束。其它功能與prin1函數相同。 (11)(princ) 功能:與prin1函數相比,princ函數不僅從屏幕當前光標位置開始打印,而且能處理控制字符,其它功能與prin1函數相同。示例: (princ CADnR14.0);屏幕打印并換行 CAD R14.0525.5 函數定義及裝載 1.自定義函數 A

55、utoLISP程序是由一系列有序排列的標準表構成的。標準表的第一個元素是函數名,AutoLISP程序執行過程是通過調用AutoLISP函數來實現的。AutoLISP提供了用戶自己定義函數的功能,這就為用戶進行專業CAD的開發提供了有利條件。 用戶自定義函數的過程包括函數定義和函數調用兩部分。53(1)定義用戶函數DEFUN 格式: (defun ) 為所定義的函數的名稱,必須為符號原子。 是所定義的函數的參數,它包括兩部分,即形參和局部變量,兩部分用“/”隔開?!?”與前后參數之間必須有空格。由于形參和局部變量均可缺少,故有四種情況: 1)二者均有:( / )。 2)只有形參:( )。 3)只

56、有局部變量:(/ )。 4)二者均缺省為空表:( )。 為函數定義的內容,由一系列有序排列的標準表組成。 如前所述,當用戶函數用Load函數調入內存時,該用戶函數并不執行,只是產生一個函數的定義,返回該函數名,只有調用該函數時才執行函數內容,并返回該函數的值。54 (2)函數的調用 用戶函數的調用形式和系統內部函數調用一樣,也是通過一個標準表,表的第一個元素為用戶函數名,其它元素為實參。注意局部變量在函數調用時是不使用的。用戶函數調用時用實參代替形參,且參數的位置及數目應嚴格對應。 函數定義體中用到兩種變量:全局變量和局部變量。 全局變量:對于某一個函數,凡是沒有出現在參數表中(無論在“/”之

57、前或之后)的變量都是全局變量。(函數調用后,仍保留其當前的約束值。只要該變量不重新賦值或不退出AutoCAD,全局變量的值一直保存在內存中,且任何表達式均可使用它。) 局部變量是指出現在參數表中的變量,它包括參數表中的形參和局部變量兩部分,也就是說參數表中所列出的所有形參和局部變量都是該自定義函數的局部變量。(其約束值只局限于函數的內部,而在該函數外部是無效的)。55例: (defun jc(x y / a b) (setq a(+ x 15.0)b(+ y 10.0) (setq z(* a 2.0 b) ) jc函數中x、y、a、b為局部變量,z為全局變量。當調用該函數時: (jc 8 1

58、2) x、y、a、b的當前約束值分別為8、12、23.0、22.0,在jc函數調用過程中是有效的。如果在調用前局部變量未被賦值,當jc函數調用時,其當前約束值為nil。而全局變量z的值在jc函數調用后約束值保持不變,可供其它表達式使用。56設置變量的原則:盡量設置為局部變量,最大限度地減少全局變量的數目。其原因有二:自定義函數很多時,若大量采用全局變量時,很容易相互沖突,即相同符號的變量約束值,后面要沖掉前面的。為防止變量發生沖突,盡可能把這些變量定義為局部變量,避免相互影響,不同函數中局部變量可同名而互不干涉。全局變量永久占用內存空間,而局部變量占用的是內存“棧”的臨時空間,函數調用后釋放。

59、當程序很復雜,變量很多,若都使用全局變量,容易造成內存空間超界。572.增加AutoCAD命令的函數 可以用defun定義函數向AutoCAD增加新的命令。定義這些函數必須遵循下列規則: (1)函數必須具有形如“C:”的名字,字符使用大小寫均可?!癈:”作為名字的一部分必須存在,而“”則是用戶選擇的命令名。如果AutoCAD的內部命令已用UNDEFINE命令解除定義,“C:”函數可以和內部命令同名。這里的“C:”是表示命令行函數的前綴,并非指磁盤驅動器。 (2)必須用空變元表來定義函數,但允許有局部變量符號。 下面定義的是一個用多義線畫正方形的函數: (defun C:PSQUARE(/ pt

60、1 pt2 pt3 pt4 len) (setq pt1(getpoint Lower left corner:) (setq len(getdist pt1 Length of one side:) (setq pt2(polar pt1 0.0 len) (setq pt3(polar pt2(/ pi 2.0)len) (setq pt4(polar pt3 pi len) (command pline pt1 pt2 pt3 pt4 C) ) 像這樣的定義函數,在用load函數裝載(load PSQUARE)后,就可以在Command:提示行只輸入函數名的“PSQUARE”部分。58A

溫馨提示

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

評論

0/150

提交評論