版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、3.1 賦值函數(shù)3.2 數(shù)據(jù)類型轉(zhuǎn)換函數(shù)3.3 數(shù)學(xué)幾何函數(shù)3.4 關(guān)系邏輯函數(shù)3.5 條件分支函數(shù)3.6 循環(huán)函數(shù)3.7 表處理函數(shù)3.8 字符串處理函數(shù)3.9 交互式數(shù)據(jù)輸入函數(shù)3.10 打印輸出函數(shù)3.11 Command函數(shù)3.12 存取AutoCAD系統(tǒng)變量值函數(shù)3.13 自定義函數(shù)和子程序3.14 參數(shù)化編程實例 AutoLISP提供了大量的函數(shù),每個函數(shù)都實現(xiàn)特定的功能。通過調(diào)用AutoLISP函數(shù),并對這些函數(shù)做適當(dāng)?shù)慕M合和編排,就可以編寫一個AutoLISP程序,來完成用戶的特定的操作。AutoLISP語言是函數(shù)的語言,AutoLISP程序是由函數(shù)語句組成的。本節(jié)將介紹最常用
2、的AutoLISP函數(shù),以便使讀者比較快地學(xué)習(xí)和理解AutoLISP程序設(shè)計。詳細(xì)而全面的函數(shù)說明可以參見AutoLISP幫助。 格式:(setq ) 詳見5.2.4。 (float x)整型轉(zhuǎn)換為實型,x為整型數(shù),返回x的實型數(shù)。例如:(float 3) 返回3.0。 (itoa x)整型轉(zhuǎn)換為字符串,x為整型數(shù),把x轉(zhuǎn)化為字符串。例如:(itoa 53) 返回 53。 (fix x)實型轉(zhuǎn)換為整型,x為實型或整型數(shù),返回x的整型數(shù)。取整過程是直接截斷x的小數(shù)部分,而非四舍五入。例如:(fix 3.7) 返回3。 (rtos number mode precision )實型格式化函數(shù)rto
3、s,該函數(shù)把實型數(shù)number(也可為整型數(shù))按照指定的模式mode和精度precision轉(zhuǎn)換成字符串。中括號“ ”內(nèi)的參數(shù)可以不寫。參數(shù)number可以是整型或?qū)嵭统A?、變量或表達式。 參數(shù)mode為線性單位的格式編碼,與AutoCAD的線性格式相對應(yīng),具體對應(yīng)關(guān)系如表5-4所示。如果沒有指定mode的值,將采用系統(tǒng)變量LUNITS的值來指定當(dāng)前的線性單位格式。表5-4 rtos函數(shù)中mode的值與線性單位格式的對應(yīng)關(guān)系mode值 線性單位格式 示例 1科學(xué) 1.75E+04 2十進制小數(shù) 23.75 3工程(英尺 + 十進制英寸) 5-4.25 4建筑(英尺 + 分?jǐn)?shù)英寸) 1-5 1/
4、2 5分?jǐn)?shù) 17 1/2 參數(shù)precision指定數(shù)值的顯示精度,對于表5-4中前3種格式,該參數(shù)用來指定小數(shù)點后的小數(shù)位數(shù)。對于后兩種格式,用來設(shè)定最小分?jǐn)?shù)的分母。如果沒有指定precision的值,將采用系統(tǒng)變量LUPREC來設(shè)定當(dāng)前精度的值。例如:在命令行中輸入命令: (setq x 17.5)17.5命令: (setq fmtval (rtos x 1 4)1.7500E+01命令: (setq fmtval (rtos x 2 2)17.50命令: (setq fmtval (rtos x 3 2)1-5.5命令: (setq fmtval (rtos x 4 2)1-5 1/2命
5、令: (setq fmtval (rtos x 5 2)17 1/2 (angtos angle mode precision ) (angtos angle mode precision )角度格式化函數(shù)angtos,該函數(shù)把以弧度為單位的角度數(shù)值angle按照指定的角度格式mode和精度precision轉(zhuǎn)換成字符串,角度值angle的大小在0, 2之間。中括號“ ”內(nèi)的參數(shù)可以不寫。參數(shù)angle可以是整型或?qū)嵭统A俊⒆兞炕虮磉_式。參數(shù)mode為角度格式編碼,對應(yīng)的系統(tǒng)變量為ANNITS。Mode的取值為:0 十進制角度,1 度/分/秒,2 百分度,3 弧度,4 勘測單位角度。參數(shù)pre
6、cision指定轉(zhuǎn)換后小數(shù)點之后的小數(shù)位數(shù),對應(yīng)系統(tǒng)變量為AUPREC。例如:在命令行中輸入命令: (angtos 0.785398 0 4)45.0000命令: (angtos -0.785398 0 4)315.0000命令: (angtos -0.785398 4)S 45d E (atoi string) 字符串轉(zhuǎn)換為整型,string為字符串。例如:(atoi 80) 返回80。 (atof string) 字符串轉(zhuǎn)換為實型,string為字符串。例如:(atof -1.25) 返回-1.25。 (1)數(shù)學(xué)函數(shù) (+ x1 x2 ) 加運算,求x1 + x2 + 之和。 (- x1
7、x2 ) 減運算,求x1 - x2 - 之差。 (* x1 x2 )乘運算,求x1 * x2 * 之積。 (/ x1 x2 )除運算,求x1 / x2 / 之商。 (1+ x)增量運算,返回x + 1。 (1- x)減量運算,返回x - 1。 (abs x)絕對值函數(shù),求x的絕對值。 (sqrt x)平方根函數(shù),求x的平方根。 (expt x p)任意次方函數(shù),求xp的值。 (exp p)e的任意次方函數(shù),求ep的值。 (log x)自然對數(shù)函數(shù),求ln(x) 的值。 (sin x)正弦函數(shù),求sin(x) 的值,其中x為弧度。 (cos x)余弦函數(shù),求cos(x) 的值,其中x為弧度。 (
8、atan x y )反正切函數(shù),求atan(x) 或atan(x/y) 值,其中x,y為弧度。 (rem x y)余數(shù)函數(shù),求x/y的余數(shù),其中x,y為整型或?qū)嵭蛿?shù)。 (max x1 x2 )最大值函數(shù),求出x1,x2, 中的最大值。 (min x1 x2 )最小值函數(shù),求出x1,x2, 中的最小值。 (angle pt1 pt2)角度計算函數(shù),以弧度為單位返回點pt1和點pt2兩點連線與X軸正向之間的夾角,是從當(dāng)前構(gòu)造平面的X軸起,按逆時針方向計算的。如果pt1和pt2為三維點,則先將它們投影到當(dāng)前構(gòu)造平面上,再計算投影線與X軸正向之間的夾角。例如:在命令行中輸入命令: (angle (1.
9、0 1.0) (1.0 4.0)1.5708命令: (angle (1.0 1.0 2.0) (3.0 4.0 5.0)0.982794 (distance pt1 pt2)距離計算函數(shù),返回兩點之間的距離, pt1和pt2為兩個點的坐標(biāo)。例如:在命令行中輸入命令: (distance (50.0 44.5 20.0) (100.0 100.0 80.5)96.1275 (polar pt angle dist) 極坐標(biāo)函數(shù),求點坐標(biāo),已知一點pt,求距離為dist,角度(兩點連線與X軸正向之間的夾角)為angle的另一點Q的坐標(biāo),其中angle為弧度,如圖5-5所示。例如: 命令: (pol
10、ar (50 40) 0.785 50) (85.3694 75.3413) 圖5-5 Polar函數(shù) (inters p1 p2 p3 p4 onseg ) 求交點函數(shù),返回兩直線的交點坐標(biāo),其中p1、p2為第一條直線的端點,p3、p4為另一條直線的端點。如果設(shè)置了onseg參數(shù)且為nil,則認(rèn)為兩條直線是無限長的,對于圖5-6中的兩種情況都能求出交點。如果省略onseg參數(shù)或設(shè)置onseg為T(真值),則兩條直線段不延長,那么對于圖5-6,(a)情況可以求出交點,但(b)情況不能求出交點。例如: (setq a (1.0 1.0) b (9.0 9.0) c (4.0 1.0) d (4.
11、0 2.0) (inters a b c d); 返回nil (inters a b c d T); 返回nil (inters a b c d nil); 返回 (4.0 4.0)(a)交點在線段內(nèi) (b)交點在線段外 (1)關(guān)系函數(shù) (= x1 x2 ) 等于函數(shù),判斷參數(shù)x1,x2, 的值是否都相等。只有當(dāng)所有參數(shù)的值都相等時為真,返回值為T,否則為假,返回值為nil。如果函數(shù)僅有一個參數(shù),則返回真。如果沒有參數(shù),則提示出錯。其中,參數(shù)的類型為整型、實型或字符串型。例如:(= 10.5 10.5) 返回T,(= String string) 返回nil。 (/= x1 x2 ) 不等于函
12、數(shù),判斷參數(shù)x1,x2, 的值是否不相等。依次比較相鄰兩個參數(shù)的值,如果沒有兩個相鄰參數(shù)的值相等則返回T,否則返回nil。如果函數(shù)僅有一個參數(shù),則返回T。如果沒有參數(shù),則提示出錯。例如:(/= Str str) 返回T,(/= Str str str) 返回nil,(/= str 1.0) 返回T。 ( x1 x2 ) 大于函數(shù),判斷x1 x2 是否成立。若每個參數(shù)值都大于它右邊的參數(shù)值,則返回T,否則返回nil。如果函數(shù)僅有一個參數(shù),則返回T。如果沒有參數(shù),則提示出錯。例如:( 12 13) 返回nil,( abd abc) 返回T。 (= x1 x2 ) 大于等于函數(shù),用法同大于函數(shù),只是
13、進行的是大于等于判斷。 ( x1 x2 ) 小于函數(shù),判斷x1 x2 是否成立。若每個參數(shù)值都小于它右邊的參數(shù)值,則返回T,否則返回nil。如果函數(shù)僅有一個參數(shù),則返回T。如果沒有參數(shù),則提示出錯。例如:( 12 13) 返回T,( abc abd) 返回T。 ( x y) (setq z x) (setq z y) (progn expr1 expr2 )順序控制函數(shù),按順序?qū)Ρ磉_式進行求值,先執(zhí)行表達式expr1,再執(zhí)行表達式expr2,并返回第一個表達式的結(jié)果。如果沒有表達式,該函數(shù)返回nil。由于if函數(shù)在條件為真(或假)時只能執(zhí)行一條語句,所以progn函數(shù)常與if函數(shù)聯(lián)用,可實現(xiàn)執(zhí)
14、行多條語句。例5-2:下列程序?qū)崿F(xiàn)一元二次方程的求解,程序源文件可存為Sam5_2.lsp 求解一元二次方程ax2 + bx + c = 0 需要輸入方程的系數(shù)a,b,c(defun roots(a b c) (if (/= a 0); a 不等于 0 的情況 (progn (setq judge (- (* b b) (* 4.0 a c) ; 判別式j(luò)udge (if (= judge 0.0); 判別式是否大于0(progn (setq val (sqrt judge) (setq x1 (/ (- val b) (* 2 a) (setq x2 (/ (- 0 b val) (* 2
15、a) (print (list x1 x2)(princ 方程的根是復(fù)數(shù)) ) ) (progn (if (/= b 0) ; a 等于 0,b 不等于 0 的情況(progn (setq x (/ (- 0.0 c) b) (print x)(princ 不是方程) ) ) ) (princ) ; 結(jié)束,返回)在AutoCAD中加載該程序后,在命令行中輸入 (roots 1 2 4),程序運行后提示“方程的根是復(fù)數(shù)”;輸入 (roots 1 2 -4),程序返回 (1.23607 -3.23607),即方程x2 + 2x - 4 = 0的兩個根分別為1.23607,-3.23607。 (co
16、nd(testexpr1 expr11 expr12 )(testexpr2 expr21 expr22 ) )分支函數(shù),參數(shù)由表構(gòu)成,數(shù)目任意,每個參數(shù)表的第一項是條件表達式,后續(xù)各項是要求值的表達式。該函數(shù)按照順序檢查各條件是否成立,然后執(zhí)行第一個條件成立的那一組表達式,并返回該組中最后一個表達式的值。一旦有一個條件已經(jīng)成立,將不再對后面的條件進行處理。分支函數(shù)Cond相當(dāng)于case類型的函數(shù),下面這段程序處理用戶的輸入,當(dāng)用戶輸入y或Y時,返回T,當(dāng)用戶輸入n或N時,返回nil,假設(shè)用戶輸入的字符串已經(jīng)存儲在變量str中,程序如下:(cond(or (= str y) (= str Y)
17、 T)(or (= str n) (= str N) nil)(T nil) 程序的三種控制結(jié)構(gòu)順序控制、條件控制和循環(huán)控制結(jié)構(gòu),在理論上可以滿足任意功能的程序設(shè)計。在AutoLISP下,程序控制也是通過函數(shù)來實現(xiàn)的,前面已經(jīng)介紹了順序控制函數(shù)條件控制函數(shù)(5.3.5節(jié)),下面介紹AutoLISP的循環(huán)控制函數(shù)。 (while testexpr expr1 expr2 ) While函數(shù),先判斷條件表達式testexpr,若條件為真,則執(zhí)行循環(huán)體expr1,expr2,即按照順序執(zhí)行后續(xù)各求值表達式,然后再次判斷條件,一直循環(huán)執(zhí)行下去,直到條件是假為止。函數(shù)返回最后一個表達式的計算結(jié)果。 例5
18、-3:計算 sum = 1 + 2 + 3 + + 100。程序可存為Sam5_3.lsp,命令名為Sam5_3。(defun c:Sam5_3() (setq sum 0 index 1) (while (= index 100) (setq sum (+ sum index) (setq index (1+ index) ) (print sum) 運算結(jié)果顯示為5050。 (repeat int expr1 expr2 ) Repeat函數(shù),對循環(huán)體進行指定次數(shù)的求值運算。其中,參數(shù)int為一整型數(shù)據(jù),表示循環(huán)重復(fù)次數(shù),如果該參數(shù)大于0,則依次執(zhí)行循環(huán)體中的表達式expr1,expr2,
19、并返回最后一個表達式的計算結(jié)果。否則返回nil。 例5-4:計算 sum = 12 + 22 + + 102。程序可存為Sam5_4.lsp,命令名為Sam5_4。(defun c:Sam5_4() (setq sum 0 index 1) (repeat 10 (setq sum (+ sum (* index index) (setq index (1+ index) ) (print sum) 運算結(jié)果顯示為385。表處理函數(shù)主要對表進行構(gòu)造、分離、訪問和修改,并以表的形式為返回值(有的以表中的元素為返回值,如car,cdr系列函數(shù))。 (quote )引用函數(shù),禁止對表進行求值,直接返
20、回表本身。本函數(shù)的作用與表前加單引號完全相同,表前單引號是Quote函數(shù)的簡寫。例如:(setq a (quote (x y z) ; a = (x y z),相當(dāng)于 (setq a (x y z) (list expr1 expr2 )表構(gòu)造函數(shù),用各表達式的值按照順序組成一個表,并返回該表。參數(shù)個數(shù)不限。例如:(list (+ 10.0 0.5) 12.0 (sqrt 9.0) ; 返回表 (10.5 12.0 3.0) (cons new-item expr)表構(gòu)造函數(shù),限兩個參數(shù),將一個新元素(new-item,可以是原子,也可以是表)加入到表達式expr(原子或表)的開頭,返回兩參數(shù)
21、形成的表。例如:(cons a (b c d) 返回 (a b c d),(cons (a) (b c d) 返回 (a) b c d)。如果Cons函數(shù)的兩個參數(shù)都是原子,則返回點對。例如:(cons a 2) 返回 (A . 2) (append )表構(gòu)造函數(shù),把所有的表按照順序放在一起,作為一個新表返回。例如:(append (a b) (c d) 返回 (a b c d)。 (car )該函數(shù)返回的第一個元素,如果是空表,它返回nil。如果是點對,操作是一樣的。例如:(setq point (11.0 12.0 13.0) ; 設(shè)置點的坐標(biāo)(setq x (car point) ; 得
22、到點的X坐標(biāo),x = 11.0(setq t (car (0 . LINE) ; t = 0 (cdr )該函數(shù)返回的除第一個元素外的所有元素組成的新表,對原并沒有任何修改。例如:(cdr (a b c) ; 返回表 (b c)。(cdr (1 . Text) ; 返回Text 由由car和和cdr函數(shù)組合而成的函數(shù)函數(shù)組合而成的函數(shù) Car函數(shù)和Cdr函數(shù)組合,用來提取表中的不同位置的元素或得到表的任意位置的子表,組合深度可達到4級。組合函數(shù)的書寫采用縮寫格式,以c開頭,以r結(jié)尾,中間是a和d的組合,d表示去掉的第一個元素,a表示提取新表的第一個元素,如: (cadr ) 函數(shù),表示先去掉的
23、第一個元素形成一個新表,再提取新表的第一個元素,相當(dāng)于得到了原的第二個元素。 Car和Cdr組合函數(shù)一般用于提取點的坐標(biāo)值,如:(setq point (11.0 12.0 13.0) ; 設(shè)置點的坐標(biāo)(setq x (car point) ; 得到點的X坐標(biāo),x = 11.0(setq y (cadr point) ; 得到點的Y坐標(biāo),y = 12.0(setq z (caddr point) ; 得到點的Z坐標(biāo),z = 13.0 Car和Cdr組合函數(shù)其他寫法可以類推。 (last ) 該函數(shù)返回的最后一個元素,如果為空表,則返回nil。 例如:(last (a b c d e) ; 返回
24、e(setq point (11.0 12.0 13.0) ; 設(shè)置點的坐標(biāo)(setq z (last point) ; 得到點的Z坐標(biāo),z = 13.0 (nth n ) 該函數(shù)返回的第n個元素,其中參數(shù)n是元素的序號(整型數(shù))。表的元素序號從0開始,即0,1,2,3, 。如果參數(shù)n大于的最高元素序號,則返回nil。 例如:(nth 4 (a b c d e) 返回d。 (assoc ) 函數(shù)以為搜索條件,查找中包含的條目(元素),若找到則返回該條目,否則返回nil。 例如:(setq abox (name bos) (length 100.0) (width 80.0) (height 5
25、0.0)(setq lentbl (assoc length abox) ; 相當(dāng)于lentbl = (LENGTH 100.0)(setq atbl (assoc size abox) ; 相當(dāng)于atbl = nil Assoc函數(shù)一般用來檢索實體的數(shù)據(jù)(DXF組碼),在5.4.4實體數(shù)據(jù)處理一節(jié)中將有詳細(xì)介紹。 (length ) Length函數(shù)返回的長度,為一整型數(shù)。例如:(length (a b c d e) 返回5。 (reverse ) 該函數(shù)將的元素倒置后返回。例如:(reverse (a b c (d e) 返回 (D E) C B A)。 (subst newitem ol
26、ditem ) 該函數(shù)在表中搜索某舊項,并將表中出現(xiàn)的每一個舊項用新項代替,然后返回修改后所得的表。其中,參數(shù)newitem為新項,olditem為舊項。如果在中沒有找到olditem,該函數(shù)返回沒有被修改的表。例如: (setq sample (a b (b c) b) ; 注意,Subst函數(shù)把子表當(dāng)成主表的一個元素來處理 (subst qq b sample) ; 返回 (A QQ (B C) QQ) 與Assoc函數(shù)連用,Subst函數(shù)可以方便地替換關(guān)聯(lián)表中與某關(guān)鍵字相關(guān)的值,例如: (setq sample (0 . CIRCLE) (8 . 0) (10 100.0 120.0 0
27、.0) (setq old (assoc 8 sample) (setq new (8 . LAYER1) (subst new old sample); 把sample表中的 (8 . 0) 替換為 (8 . LAYER1) (foreach name expr1 expr2 ) 該函數(shù)將遍歷,將中每一個元素依次賦給name,并依次對表達式expr1,expr2, 求值,函數(shù)將返回最后一個expr表達式的結(jié)果。例如: (foreach n (x y z) (princ n) ; 等價于 (princ x) (princ y) (princ z) ,返回z (strcat str1 str2
28、) 該函數(shù)返回一個字符串,它是字符串str1、str2、 連接起來的。如果沒有參數(shù),則返回空字符串。如:(strcat AutoLISP for AutoCAD) 返回AutoLISP for AutoCAD。 (strlen str1 str2 ) 該函數(shù)返回字符串中字符的個數(shù)(不包括雙引號),返回值為整數(shù)。如果字符串有多個,則返回各字符串的總長度。例如: (strlen ) ; 返回0 (strlen AutoLISP for AutoCAD); 返回18 交互式數(shù)據(jù)輸入函數(shù)是AutoLISP提供的、用戶向AutoLISP程序輸入數(shù)據(jù)的接口。這類函數(shù)執(zhí)行時使機器暫停下來,等待用戶按提示輸入
29、數(shù)據(jù)。這類函數(shù)有時統(tǒng)稱為GetXXX函數(shù)。 (getint msg) 和和 (getreal msg) 函數(shù)執(zhí)行時系統(tǒng)暫停,等待用戶輸入數(shù)據(jù)。參數(shù)msg為提示字符串,將出現(xiàn)在命令行中(如果有的話)。Getint函數(shù)要求用戶輸入整數(shù),并返回該整數(shù);Getreal函數(shù)可輸入實數(shù)或整數(shù),但返回實數(shù)。提示字符串msg中允許使用控制字符。例如:(setq num (getint);要求用戶輸入一個整數(shù),但命令行沒有提示,整數(shù)將賦給num(setq num (getint n請輸入一個整數(shù):)(setq val (getreal n請輸入一個實數(shù):) (getstring cr msg) 函數(shù)等待用戶輸入
30、一個字符串并返回該字符串。如果提供了參數(shù)cr并且其值不為nil,則輸入的字符串可以包含空格且必須以Enter鍵結(jié)束;否則,輸入的字符串以空格或Enter鍵結(jié)束。參數(shù)msg為提示字符串,將出現(xiàn)在命令行中(如果有的話)。 Getstring函數(shù)能接受的字符串的最大長度為132個字符,如果輸入超過132個,則僅返回前面132個字符。 例如:(setq str1 (getstring T n請輸入你的學(xué)號:) (getpoint pt msg) (getcorner pt msg) (getdist pt msg) 這三個函數(shù)操作方式相似,參數(shù)pt為基點(二維點或三維點),參數(shù)msg為提示字符串。Ge
31、tpoint函數(shù)讓用戶輸入一個點并返回該點的坐標(biāo)值(x y z),如果提供了基點pt,系統(tǒng)會從pt點到當(dāng)前十字光標(biāo)畫一條橡皮線以提示用戶選擇點。 Getcorner函數(shù)與Getpoint函數(shù)類似,也返回點的坐標(biāo)值,但Getcorner函數(shù)必須提供參數(shù)pt作為基點,系統(tǒng)會從基點到當(dāng)前十字光標(biāo)畫一個矩形以提示用戶選擇點。 Getdist函數(shù)等待用戶輸入一個距離(即一個實數(shù))。用戶可以通過選擇兩個點來指定距離,如果提供了基點pt,用戶只需輸入第二點即可計算出距離值。Getdist函數(shù)會從pt點畫一條橡皮線以幫助用戶確定距離,并總是以實數(shù)形式返回距離值。 例如:(setq pt1 (getpoint
32、n請輸入第一點的位置:)(setq pt2 (getcorner pt1 n請輸入下一點的位置:)(setq dist (getdist pt2 n選擇點以確定距離:) (getangle pt msg) 該函數(shù)等待用戶輸入一個角度(以度為單位),返回角度的弧度值。參數(shù)pt為基點,參數(shù)msg為提示信息(字符串)。響應(yīng)該函數(shù),用戶可以直接輸入一個角度值,也可以輸入兩個點,函數(shù)將計算兩點連線的傾斜角度并返回,如果提供了基點pt,只需輸入第二點即可。在該函數(shù)中,角度的測量計算是以系統(tǒng)變量ANGBASE的當(dāng)前設(shè)置為零弧度按逆時針方向來測量的(忽略系統(tǒng)變量ANGDIR的設(shè)置)。 例如:(setq ang
33、 (getangle)(setq pt1 (getpoint n請輸入基點的位置:)(setq ang (getangle pt1 n請輸入角度方向的另一點:) (getorient pt msg) 該函數(shù)的功能與Getangle函數(shù)類似,不同之處在于該函數(shù)返回的弧度值不受系統(tǒng)變量ANGBASE和ANGDIR的影響,始終以水平右手方向為零弧度,按逆時針方向來測量。 (prompt msg)該函數(shù)在該函數(shù)在AutoCAD文本窗口中顯示一個字符串,用作提示信息。參文本窗口中顯示一個字符串,用作提示信息。參數(shù)數(shù)msg為字符串。函數(shù)承認(rèn)字符串中的控制字符,并總是返回為字符串。函數(shù)承認(rèn)字符串中的控制字符
34、,并總是返回nil。 (princ expr file-desc) (print expr file-desc) (prin1 expr file-desc)這些函數(shù)在命令行打印一個表達式的值(沒有指定這些函數(shù)在命令行打印一個表達式的值(沒有指定file-desc時)或?qū)r)或?qū)⒃摫磉_式的值寫入一個已打開的文件中(指定該表達式的值寫入一個已打開的文件中(指定file-desc時)。參數(shù)時)。參數(shù)expr為將要打印的表達式,參數(shù)為將要打印的表達式,參數(shù)file-desc是一個以寫方式打開的文件是一個以寫方式打開的文件描述符。函數(shù)返回表達式的值。例如:描述符。函數(shù)返回表達式的值。例如:(setq
35、a (+ 1 3)(princ a) ; 打印表達式的值打印表達式的值4,返回表達式的值,返回表達式的值4(print a) ; 換行打印表達式的值換行打印表達式的值4,再加一空格,返回表達,再加一空格,返回表達式的值式的值4(prin1 a) ; 打印表達式的值打印表達式的值4,返回表達式的值,返回表達式的值4。 Princ函數(shù)和Prin1函數(shù)直接打印表達式的值,而Print函數(shù)在打印表達式的值之前先打印一個空行,打印表達式之后增加打印一個空格。對于字符串型表達式,Princ函數(shù)顯示的字符串不帶雙引號,而Print和Prin1函數(shù)顯示的字符串都帶有雙引號。如果字符串中有控制字符(見表5-2)
36、,Princ函數(shù)將按照控制來打印字符串,而Print和Prin1函數(shù)將不承認(rèn)控制字符并把它原樣打印出來。例如: (setq str The allowable tolerance is n0.25) (prompt str); 打印 The allowable tolerance is ; 換行0.25 并返回nil (princ str) ; 打印 The allowable tolerance is; 換行 0.25,并返回str的值 (print str); 打印空行; 打印 The allowable tolerance is n0.25,并返回str的值 (prin1 str) ;
37、打印 The allowable tolerance is n0.25,并返回str的值 一般在程序的最后加一個無參數(shù)的打印函數(shù)語句,如 (princ),表示程序靜默退出,相當(dāng)于其他語言中的Return語句。 (terpri) 換行函數(shù),在命令行上輸出一個換行符,功能和 (princ n) 相同,返回值為nil。 Command函數(shù)用來在AutoLISP程序中調(diào)用AutoCAD命令,并響應(yīng)命令進行操作。利用該函數(shù)可以實現(xiàn)圖形的繪制和編輯等AutoCAD命令,使編寫圖形處理程序變得相當(dāng)方便。 Command函數(shù)的格式為: (command arguments ) 其中arguments參數(shù)表表示
38、要執(zhí)行的AutoCAD命令名和所需要的響應(yīng),可以是字符串、實數(shù)、整數(shù)或點,但必須與要執(zhí)行的命令所需要的參數(shù)一致。一般來說,arguments參數(shù)表的第一個參數(shù)是AutoCAD命令名,后跟該命令執(zhí)行時所需要的參數(shù),參數(shù)與參數(shù)之間用空格分開。 例如,在AutoCAD中運行畫圓命令,步驟為: 命令: _circle 指定圓的圓心或 三點(3P)/兩點(2P)/相切、相切、半徑(T): 10,10 指定圓的半徑或 直徑(D): 25 畫圓命令結(jié)束,把上述步驟寫成Command函數(shù),語句為: (command _circle 10,10 25) 其中,_circle對應(yīng)命令名,10,10對應(yīng)圓心點,25
39、對應(yīng)半徑,實現(xiàn)對畫圓命令的響應(yīng)。在Command函數(shù)中,命令執(zhí)行所需的數(shù)據(jù)也可用相應(yīng)類型的變量來響應(yīng),上述畫圓的語句可以寫成: (setq pt (10 10) (setq r1 25) (command _circle pt r1) 結(jié)果是一樣的。 (1)AutoCAD命令及其選項用字符串表示,大小寫均可。如:(command _circle 10,10 d 50) 和 (command _CIRcle 10,10 D 50) 是一樣的。 (2)數(shù)值常量(整數(shù)或?qū)崝?shù))可以寫數(shù)的本身,也可以寫成字符串形式。如:(command _circle 10,10 25) 也可以寫成 (command
40、_circle 10,10 25)。 (3)對于點的響應(yīng),有三種方式:表、字符串或變量,例如:(command _circle (10 10) 25) 與 (command _circle 10,10 25) 與 (setq pt (10 10) (command _circle pt 25) 是等價的。 (4)Command函數(shù)的參數(shù)中,空字符串()等效于鍵盤上按一次空格鍵。若沒有參數(shù)而調(diào)用Command函數(shù),相當(dāng)于ESC鍵,可取消大多數(shù)AutoCAD命令。 (5)一個Command函數(shù)可以執(zhí)行多個AutoCAD命令。一條AutoCAD命令可由多個Command函數(shù)來完成,中間可以插入其他A
41、utoLISP語句。 在AutoCAD中,可以很方便地查看或修改系統(tǒng)變量的值,只要在命令行中輸入系統(tǒng)變量的名稱就可以完成操作,這也使得可以利用Command函數(shù)來修改系統(tǒng)變量的值。除此之外,AutoLISP還提供了專門用來存取系統(tǒng)變量值的函數(shù):Getvar函數(shù)和Setvar函數(shù)。 格式:(getvar VarName) Getvar函數(shù)用于獲取AutoCAD系統(tǒng)變量的當(dāng)前值,其中,參數(shù)VarName為系統(tǒng)變量的名稱,其字符大小寫均可。若VarName是一個合法的系統(tǒng)變量名,Getvar函數(shù)將返回該系統(tǒng)變量的當(dāng)前值,否則返回nil。 例如,系統(tǒng)變量CMDECHO控制AutoLISP的comman
42、d函數(shù)運行時AutoCAD是否回顯提示和輸入,CMDECHO有兩個值0和1,0表示關(guān)閉回顯,1表示打開回顯。得到CMDECHO的當(dāng)前值,語句如下: (setq CurVal (getvar CMDECHO); 變量CurVal = CMDECHO的當(dāng)前值 格式:(setvar VarName value) Setvar函數(shù)用于設(shè)置AutoCAD系統(tǒng)變量的新值,其中,參數(shù)VarName為系統(tǒng)變量的名稱,參數(shù)value為所設(shè)置的新值。Setvar函數(shù)將value值設(shè)置給系統(tǒng)變量VarName,并返回該新值。 Getvar函數(shù)一般和Setvar函數(shù)聯(lián)用,實現(xiàn)用戶的意圖,例如,在運行command函數(shù)
43、時,想要避免在命令行中出現(xiàn)回顯,但又不想修改原來的設(shè)置,可在程序中加入以下語句: (setq CurVal (getvar CMDECHO); 變量CurVal記下CMDECHO的當(dāng)前值 (setvar CMDECHO 0) ; 設(shè)置CMDECHO的值為0,關(guān)閉回顯 ; 程序體,包含command函數(shù) (setvar CMDECHO CurVal) ; 恢復(fù)CMDECHO的原始值 (1)自定義函數(shù)Defun函數(shù) 格式:(defun (實參變量名表 / 局部變量名表 ) ) 其中,為一字符串,以后要調(diào)用此函數(shù)就通過來調(diào)用。自定義函數(shù)名不要與內(nèi)部函數(shù)重名。 函數(shù)名后邊是圓括號“()”,括號內(nèi)的變量
44、名表分為兩部分,用“/”隔開,前半部分為實參變量名表,是函數(shù)的實參,實現(xiàn)參數(shù)的傳遞;后半部分為局部變量名表,其內(nèi)的局部變量僅在函數(shù)內(nèi)部使用,與函數(shù)外部沒有任何聯(lián)系。 變量名表中的變量,無論“/”號前還是“/”號后的均為局部變量(約束變量),只在函數(shù)執(zhí)行過程中有值,等函數(shù)執(zhí)行完畢,所有的局部變量均置為nil(空),不占內(nèi)存。凡是在變量名表中未出現(xiàn)的其他變量均為全局變量(自由變量),它們在函數(shù)執(zhí)行過后,仍在內(nèi)存中保存其值。 變量名表中的各項要用空格分開,尤其要注意“/”號前后必須有空格。 變量名表可以沒有,可以只有實參變量名表(此時“/”號不寫),也可以只有局部變量名表(此時“/”號不能省略)。例
45、如: (defun myfunc (x y) ); myfunc函數(shù)有兩個實參 (defun myfunc (/ a b) ) ; myfunc函數(shù)有兩個局部變量 (defun myfunc (x / temp) ); myfunc函數(shù)有一個實參,一個局部變量 (defun myfunc ( ) ); myfunc函數(shù)沒有變量 都是合法的定義方式。 Defun函數(shù)返回最后一個表達式的值,供其他程序使用。 例5-5:計算兩點連線的斜率,程序可存為Sam5_5.lsp,函數(shù)名為slope。(defun slope (pt1 pt2 / x1 y1 x2 y2) (if (or (null (cdr
46、 pt1) (null (cdr pt2) nil ; 如果參數(shù)有錯誤返回nil (progn (setq x1 (car pt1) (setq y1 (cadr pt1) (setq x2 (car pt2) (setq y2 (cadr pt2) ; 坐標(biāo)值乘1.0的目的是保證坐標(biāo)值為實數(shù) (if ( (abs (- (* 1.0 x1) x2) 0.0001) 斜率無窮大(/ (- (* 1.0 y2) y1) (- (* 1.0 x2) x1) ); If函數(shù)結(jié)束 ); Progn函數(shù)結(jié)束 ); 外層If函數(shù)結(jié)束); 自定義函數(shù)結(jié)束在AutoCAD中加載該程序Sam5_5.lsp,在命
47、令行輸入 (slope (1 2) (5 6),返回1.0。 (2)定義AutoCAD命令 格式:(defun C:XXX ( / 局部變量名表 ) ) 其中,函數(shù)名稱的形式必須為“C:XXX”,XXX部分就是子定義命令的名稱,并且“C:”和“XXX”之間不能有空格。命令的名稱最好不要和AutoCAD已有命令的名稱重復(fù)。 該函數(shù)不能帶有實參變量名表,但可以含有局部變量,以“/”號為標(biāo)記。例如: (defun c:mycomm ( ) ) ; 命令名為mycomm,無局部變量 (defun c:mycomm (/ a b) ) ; 命令名為mycomm,有兩個局部變量 都是合法的定義方式。例例5
48、-6:繪制心形圖案,程序可存為:繪制心形圖案,程序可存為Sam5_6.lsp,命令名為,命令名為heart。(defun c:heart() (setq val_1 (getvar CMDECHO) (setvar CMDECHO 0) (setq ptBase (getpoint n請指定心形圖案的中心:) (setq radius (getdist ptBase n請輸入心形圖案的半徑:) (setq num (getint n請給出疊加次數(shù)(整數(shù)):) (setq afBase (/ (* 2.0 pi) num) afi 0) ; 角度初始化 (setq index 1) ; 循環(huán)量初
49、始化 (while (= index num); 計算圓心 (setq xVal (+ (* radius (cos afi) (car ptBase) yVal (+ (* radius (sin afi) (cadr ptBase) (setq ptCen (list xVal yVal); 計算半徑 (setq xTemp (* radius (cos afi) yTemp (- radius (* radius (sin afi) (setq rTemp (sqrt (+ (* xTemp xTemp) (* yTemp yTemp); 畫圓 (command _circle ptCe
50、n rTemp); 角度和循環(huán)量遞增 (setq afi (* afBase index) (setq index (1+ index) ) (setvar CMDECHO val_1) (princ) (3)子程序 AutoLISP程序中可以定義多個自定義函數(shù),這些函數(shù)之間相互調(diào)用,就產(chǎn)生了子程序。子程序的定義是通過Defun函數(shù)實現(xiàn)的,其調(diào)用方式與AutoLISP的內(nèi)部函數(shù)完全相同。下面的例子演示了子程序的定義和調(diào)用。 例5-7:程序要求用戶輸入兩個點,計算兩點連線的斜率,程序文件名為Sam5_7.lsp,命令名為Cal_k。本程序把計算斜率的函數(shù)slope作為子程序。 ; 主程序開始 (
51、defun c:Cal_k() (setq ptFst (getpoint n請輸入第一點:) (setq ptSnd (getpoint ptFst n請輸入第二點:) (setq kVal (slope ptFst ptSnd) ; 調(diào)用子程序 (slope ptFst ptSnd) (print kVal); 打印結(jié)果 (princ) ) ; 主程序結(jié)束 ; 子程序開始 (defun slope (pt1 pt2 / x1 y1 x2 y2) (if (or (null (cdr pt1) (null (cdr pt2) nil (progn (setq x1 (car pt1) (setq y1 (cadr pt1) (setq x2 (car pt2) (setq y2 (cadr pt2) (if ( (abs (- (* 1.0 x1) x2) 0.0001) 斜率無窮大(/ (- (* 1.0 y2) y1) (- (* 1.0 x2) x1) ) ) ) ) ; 子程序結(jié)束 在主程序中,語句 (setq kVal (slope ptFst
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第1單元 古代亞非文明(高頻非選擇題25題)(原卷版)
- 《波蘭歪屋設(shè)計》課件
- 《證券市場概述周》課件
- 玩具設(shè)計美工工作總結(jié)
- 2023-2024年項目管理人員安全培訓(xùn)考試題帶答案(黃金題型)
- 關(guān)于認(rèn)識實習(xí)報告匯編六篇
- 《系統(tǒng)安全評價概述》課件
- 《婦產(chǎn)科學(xué)緒論》課件
- 《監(jiān)理工作程序》課件
- 《應(yīng)用開發(fā)和管理》課件
- 青島市2022-2023學(xué)年七年級上學(xué)期期末道德與法治試題
- 高空作業(yè)安全免責(zé)協(xié)議書范本
- 石油化學(xué)智慧樹知到期末考試答案章節(jié)答案2024年中國石油大學(xué)(華東)
- 手術(shù)后如何防止排尿困難
- 特種設(shè)備“日管控、周排查、月調(diào)度”表格
- 重點關(guān)愛學(xué)生幫扶活動記錄表
- 2021年10月自考00850廣告設(shè)計基礎(chǔ)試題及答案含解析
- 結(jié)構(gòu)化面試表格
- 地?zé)崮苜Y源的潛力及在能源領(lǐng)域中的應(yīng)用前景
- 2023版:美國眼科學(xué)會青光眼治療指南(全文)
- 家長會課件:小學(xué)寒假家長會課件
評論
0/150
提交評論