Autolisp編程心得.doc_第1頁(yè)
Autolisp編程心得.doc_第2頁(yè)
Autolisp編程心得.doc_第3頁(yè)
Autolisp編程心得.doc_第4頁(yè)
Autolisp編程心得.doc_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Autolisp編程心得.txt如果不懂就說(shuō)出來(lái),如果懂了,就笑笑別說(shuō)出來(lái)。貪婪是最真實(shí)的貧窮,滿足是最真實(shí)的財(cái)富。幽默就是一個(gè)人想哭的時(shí)候還有笑的興致。1.養(yǎng)成良好的書寫習(xí)慣 眾所周知,Lisp是一種表結(jié)構(gòu)語(yǔ)言,括號(hào)必須成對(duì)出現(xiàn),在調(diào)試時(shí)往往為遺漏了一個(gè)括號(hào)大費(fèi)周折,所以,養(yǎng)成一個(gè)好的編程習(xí)慣是學(xué)好Lisp所必須的。 選擇一個(gè)較好的編輯器,這是一個(gè)基本條件,建議使用Visual Lisp編輯器或Lisplink等專用編輯器,此類編輯器可以對(duì)函數(shù)突出顯示。 按Lisp(DCL)專有格式書寫,并經(jīng)常對(duì)程序進(jìn)行“格式化”,及時(shí)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,并有利于調(diào)試是查找錯(cuò)誤。 使用自定義函數(shù),并輔助以適當(dāng)?shù)米⑨專谳^大程序中按功能使用自定義函數(shù)可以使得程序條理化。2.函數(shù)中循環(huán)與轉(zhuǎn)移的使用 在高級(jí)語(yǔ)言中一般有類似“goto”的語(yǔ)句實(shí)現(xiàn)轉(zhuǎn)移,在AutoLisp中沒(méi)有轉(zhuǎn)移的函數(shù)。我們可以使用自定義函數(shù)實(shí)現(xiàn)轉(zhuǎn)移,用if及cond輔助實(shí)現(xiàn)條件轉(zhuǎn)移。 當(dāng)我們需要實(shí)現(xiàn)在滿足一定條件時(shí)進(jìn)行循環(huán)的功能,一般使用while函數(shù),但有時(shí)需要判斷的條件較復(fù)雜時(shí),使用while函數(shù)往往不能實(shí)現(xiàn)或使得程序不夠簡(jiǎn)潔。這時(shí)我們可以使用“轉(zhuǎn)移”,將需要實(shí)現(xiàn)的功能作為(子)函數(shù),使用恰當(dāng),可以在程序中任意“轉(zhuǎn)移”。 一般認(rèn)為,當(dāng)一段代碼在不同處重復(fù)使用時(shí),我們才會(huì)使用子函數(shù)定義,其實(shí),利用函數(shù)的更大的優(yōu)點(diǎn)是使得程序更加結(jié)構(gòu)化。這就使得我們不必拘泥于程序中的循環(huán)語(yǔ)句,而使用函數(shù)的循環(huán)調(diào)用,輔助適當(dāng)?shù)呐袛啵瑢?shí)現(xiàn)“轉(zhuǎn)移”,如A-B-A。當(dāng)然也可以進(jìn)行自身調(diào)用,構(gòu)成一個(gè)“標(biāo)準(zhǔn)的”循環(huán)。 如例一中,“程序執(zhí)行完畢返回”與“空選返回”兩種情況如果使用循環(huán)語(yǔ)句,其條件是完全不同的,而將函數(shù)本身作為子函數(shù)調(diào)用,程序簡(jiǎn)潔明了。3.initget函數(shù)中關(guān)鍵字“ ”(空格)的使用 空格可以被用作關(guān)鍵字,一般多用來(lái)定義鼠標(biāo)右鍵退出。 當(dāng)用戶輸入函數(shù)不支持控制位(如entsel、nentsel、nentselp)時(shí),可直接使用“(initget )”。 當(dāng)用戶輸入函數(shù)支持控制位(如getpoint等)時(shí),可使用“(initget 1 )”禁止空輸入,而將回車等空輸入作為關(guān)鍵字使用。 當(dāng)同時(shí)使用其它關(guān)鍵字時(shí),應(yīng)該將空格作為一系列關(guān)鍵字的最后一個(gè),用“(initget C )”(兩個(gè)空格)調(diào)用,否則無(wú)效。 見例一。*;例一(defun ett_ct() (initget C ) ;關(guān)鍵字“C”及空格 (setq s0 (entsel n設(shè)置顏色C / 選取文本:) (cond ( (= s0 C) (ett_col) ;轉(zhuǎn)設(shè)置顏色子函數(shù) ( (= s0 ) nil) ;空格退出 ( (and (= (type s0) LIST) ;選擇實(shí)體 (= (cdr (assoc 0 (entget (car s0) TEXT) ;判別文本 ) . ;操作內(nèi)容 (ett_ct) ;編輯后返回選擇 ) (t (ett_ct) ;空選返回選擇 )* 有時(shí)需要進(jìn)行復(fù)雜的判斷,使用如“(= s0 )”語(yǔ)句可能不能準(zhǔn)確判別輸入的空格關(guān)鍵字與空選擇,可以使用“(= (type s0) STR)”語(yǔ)句。4.Lisp的暫停與while的特殊使用 Lisp一般在交互輸入時(shí)才會(huì)暫停,如果只需要實(shí)現(xiàn)屏幕顯示暫停,可使用grread函數(shù),grread函數(shù)對(duì)所有合法的輸入設(shè)備均會(huì)作出反應(yīng),有時(shí)我們只希望對(duì)鍵盤有反應(yīng),可使用while函數(shù)進(jìn)行循環(huán)。* (princ nPress ENTER to continue:) (while (/= (car (grread) 2)* while用于滿足一定條件的循環(huán),其標(biāo)準(zhǔn)語(yǔ)法為: (while testexpr expr.) 其中expr解釋為“在 testexpr 為 nil 之前要求值的一個(gè)或多個(gè)表達(dá)式”,為可選項(xiàng)(在R14之前沒(méi)有方括號(hào),但仍為可選項(xiàng))。 正常我們使用while時(shí),總會(huì)有expr項(xiàng),更多的時(shí)候,我們是為了expr項(xiàng)才會(huì)使用這種循環(huán)語(yǔ)句,所有我們往往有expr項(xiàng)是不可缺少的感覺。這里我們使用while函數(shù)的語(yǔ)法是while函數(shù)的特例,即沒(méi)有expr項(xiàng)的情況。 如果希望對(duì)鼠標(biāo)右鍵同時(shí)反應(yīng),可以使用:* (princ nPress ENTER to continue:) (while (and (/= (setq a(car (grread) 2) ;鍵盤 (/= a 11) ;鼠標(biāo)右鍵(SHORTCUTMENU0) (/= a 25) ;鼠標(biāo)右鍵(SHORTCUTMENU0) ) )*5.輸入距離 Lisp語(yǔ)言中輸入距離的函數(shù)為getdist,但我們有時(shí)需要輸入負(fù)值,有時(shí)需要在輸入距離的同時(shí)得到角度,使用getdist函數(shù)就顯得無(wú)能為力,這時(shí),我們可以靈活使用其它交互輸入函數(shù)如getpoint、getcorner等,通過(guò)計(jì)算得到我們所需要的值。 例二是一段輸入長(zhǎng)度的同時(shí)得到默認(rèn)角度的代碼,使用getpoint函數(shù)。*;例二 (setq pt0 (getpoint n直線基點(diǎn): ) pt1 (getpoint pt0 n直線長(zhǎng)度: ) ;長(zhǎng)度及角度可用鍵盤或鼠標(biāo)定位 dst (distance pt0 pt1) ;計(jì)算長(zhǎng)度 ang (angle pt0 pt1) ;計(jì)算默認(rèn)角度 ang1 (getangle pt0 (strcat n直線方向: ) )* 例三是可以按陣列方式輸入行列間距的代碼,輸入距離為正值,修改部分代碼可輸入負(fù)值,使用getcorner函數(shù),同時(shí)使用initget的控制位128。*;例三 (defun lc_dist () (initget 128) ;允許任意輸入 (setq disr (getpoint n指定單位單元或輸入行間距: ) (if (= (type disr) LIST) ;鼠標(biāo)輸入 (progn (initget 1) (setq dis (getcorner disr n指定對(duì)角點(diǎn): ) ;鼠標(biāo)輸入對(duì)角 disc (abs (- (car dis) (car disr) ;正值行距 disr (abs (- (cadr dis) (cadr disr) ;正值列距 ) ;計(jì)算行列間距 ) (if (= (type disr) STR) ;鍵盤輸入行距 (if (setq dis (distof disr) ;判斷輸入的是否距離 (progn (initget 6) (setq disc (getdist n輸入列間距: ) ;輸入列距 ) (progn ;鍵盤輸入格式不符返回 (princ n需要正數(shù)值或兩個(gè)二維角點(diǎn)。) (lc_dist) ) ) (progn ;空輸入返回 (princ n需要正數(shù)值或兩個(gè)二維角點(diǎn)。) (lc_dist) ) ) ) )*6.數(shù)學(xué)運(yùn)算函數(shù)的數(shù)量界限 在Lisp中對(duì)表中數(shù)據(jù)進(jìn)行求和、求最大值等數(shù)學(xué)運(yùn)算時(shí),往往直觀的對(duì)表直接賦予運(yùn)算函數(shù),使用語(yǔ)句如“(eval (cons MAX numlist)”,一般都可以進(jìn)行計(jì)算,但當(dāng)表中數(shù)據(jù)數(shù)量大于255時(shí),將會(huì)出現(xiàn)錯(cuò)誤“bad argument value: does not fit in byte: 256”。 對(duì)于這種情況,我們不必對(duì)數(shù)據(jù)表進(jìn)行分段,可以直接使用函數(shù)apply,語(yǔ)法更簡(jiǎn)單:(apply MAX numlist)。apply可將數(shù)據(jù)表傳送給指定的函數(shù)進(jìn)行求值而不受數(shù)據(jù)數(shù)量的影響。 受表中數(shù)據(jù)數(shù)量影響的數(shù)學(xué)運(yùn)算函數(shù)有:+、-、*、/、max、min、logand及l(fā)ogior。7.選擇集與表 選擇集是一種特殊結(jié)構(gòu)的表,只能通過(guò)特定的函數(shù)進(jìn)行操作,但這些函數(shù)對(duì)大量重復(fù)的操作只能通過(guò)循環(huán)實(shí)現(xiàn),顯得力不從心,不能體現(xiàn)Lisp語(yǔ)言表結(jié)構(gòu)的優(yōu)越性。 其實(shí)我們只要通過(guò)存取實(shí)體名或?qū)嶓w句柄,將它們存為一個(gè)普通結(jié)構(gòu)的表,完全可以通過(guò)常規(guī)表操作函數(shù)實(shí)現(xiàn)對(duì)實(shí)體的操作。 例四是一段使用apply、mapcar函數(shù)聯(lián)合求文本選擇集中文本基點(diǎn)最大y值得代碼,只是一個(gè)示例,如果結(jié)合VL-sort函數(shù),可輕松實(shí)現(xiàn)對(duì)文本的排序。*;例四 (setq sl nil i -1) (repeat (sslength (setq ss (ssget (0 . TEXT) ;選擇文本 (setq i (1+ i) en (ssname ss i) ;從選擇集中取出文本 sl (cons en sl) ;構(gòu)造包含實(shí)體名的表 ) ) (setq maxy (apply max ;求文本基點(diǎn)最大y值 (mapcar (lambda (x) (caddr (assoc 10 (entget x) ;提取y值 ) sl ) ) )* 當(dāng)然,選擇集也有其優(yōu)勢(shì)的一面,比如對(duì)選擇集中實(shí)體的刪除操作非常簡(jiǎn)單、選擇集中的實(shí)體不會(huì)重復(fù)及選擇集可以與Acad命令交互使用等特征是一般表所不具備的,所以,編程時(shí)應(yīng)根據(jù)程序要求,靈活運(yùn)用。8.cal的使用與加載 Acad隨機(jī)附帶了一些外部定義命令,其中cal(計(jì)算器)命令是最常用的命令之一,在加載gromcal.arx后cal可以在Lisp程序中像其它函數(shù)一樣使用,這就使得我們?cè)诔绦蛑袑?duì)文本的四則運(yùn)算處理變得簡(jiǎn)單,如“(cal 1+2/3)”,其中字符串1+2/3可以從圖形的文本中提取,也可以是符合cal要求格式的任一字符串(詳見Acad聯(lián)機(jī)幫助)。 需要注意的是,在Acad中g(shù)romcal.arx只能加載一次,重復(fù)加載將使Acad以外退出(無(wú)提示)。需要使用cal函數(shù)的Lisp程序,應(yīng)在程序尾部加上以下代碼:*(if (or (= (type c:cal) LIST) ;R14使用 (= (type c:cal) SUBR) ;R2000+使用 ) (arxload geomcal.arx)* 9.Undo處理 一個(gè)完善的程序應(yīng)該有較好的出錯(cuò)處理,這是在所有Lisp教材上都提及的,但程序的Undo處理就說(shuō)得很少或沒(méi)有提及。 其實(shí)Undo處理對(duì)程序來(lái)說(shuō)也是非常重要的,尤其對(duì)有較多輸出的復(fù)雜程序而言,不能解決Undo問(wèn)題,使用起來(lái)會(huì)極不方便。 對(duì)于Undo問(wèn)題的解決,一種方法是盡量少用或不用command函數(shù),即不調(diào)用原始命令,這是一種較好的方法,但必須注意的是,一段程序必須至少有一次調(diào)用command函數(shù),否則Undo命令將取消程序運(yùn)行前的前一次命令,解決的方法是在程序運(yùn)行的起始位置加一個(gè)無(wú)謂的command,如“(command color )”。 有時(shí)不使用command函數(shù)不能達(dá)到我們要求的一些功能,或使得程序過(guò)于復(fù)雜,我們可能需要使用一些command函數(shù)(原始命令),這是就應(yīng)該在程序中進(jìn)行Undo處理,即使用Undo命令的編組功能。 例五是一段程序出錯(cuò)函數(shù)與Undo處理的示例。*;例五(defun newerr (s) ;出錯(cuò)函數(shù) (if s (progn (term_dialog) ;使用對(duì)話框時(shí)使用 (if olderr (setq *error* olderr) ;出錯(cuò)函數(shù)恢復(fù) (if oldvar (setvar . oldvar) ;系統(tǒng)變量恢復(fù) (if olderr (setq *error* olderr) ;出錯(cuò)函數(shù)恢復(fù) (command _.undo _e) ;Undo編組結(jié)束 ) ) (princ)(defun c:my(/ .) ;主程序(主函數(shù)) (setvar cmdecho 0) ;取消命令回顯提示 (command _.undo _BE) ;Undo編組開始 (setq olderr *error* *error* newerr) ;調(diào)用自定義出錯(cuò)函數(shù) (setq oldvar (getvar .) ;保存相關(guān)系統(tǒng)變量

溫馨提示

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

評(píng)論

0/150

提交評(píng)論