




已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Autolisp編程心得.txt如果不懂就說出來,如果懂了,就笑笑別說出來。貪婪是最真實的貧窮,滿足是最真實的財富。幽默就是一個人想哭的時候還有笑的興致。1.養(yǎng)成良好的書寫習(xí)慣 眾所周知,Lisp是一種表結(jié)構(gòu)語言,括號必須成對出現(xiàn),在調(diào)試時往往為遺漏了一個括號大費周折,所以,養(yǎng)成一個好的編程習(xí)慣是學(xué)好Lisp所必須的。 選擇一個較好的編輯器,這是一個基本條件,建議使用Visual Lisp編輯器或Lisplink等專用編輯器,此類編輯器可以對函數(shù)突出顯示。 按Lisp(DCL)專有格式書寫,并經(jīng)常對程序進(jìn)行“格式化”,及時發(fā)現(xiàn)語法錯誤,并有利于調(diào)試是查找錯誤。 使用自定義函數(shù),并輔助以適當(dāng)?shù)米⑨?,在較大程序中按功能使用自定義函數(shù)可以使得程序條理化。2.函數(shù)中循環(huán)與轉(zhuǎn)移的使用 在高級語言中一般有類似“goto”的語句實現(xiàn)轉(zhuǎn)移,在AutoLisp中沒有轉(zhuǎn)移的函數(shù)。我們可以使用自定義函數(shù)實現(xiàn)轉(zhuǎn)移,用if及cond輔助實現(xiàn)條件轉(zhuǎn)移。 當(dāng)我們需要實現(xiàn)在滿足一定條件時進(jìn)行循環(huán)的功能,一般使用while函數(shù),但有時需要判斷的條件較復(fù)雜時,使用while函數(shù)往往不能實現(xiàn)或使得程序不夠簡潔。這時我們可以使用“轉(zhuǎn)移”,將需要實現(xiàn)的功能作為(子)函數(shù),使用恰當(dāng),可以在程序中任意“轉(zhuǎn)移”。 一般認(rèn)為,當(dāng)一段代碼在不同處重復(fù)使用時,我們才會使用子函數(shù)定義,其實,利用函數(shù)的更大的優(yōu)點是使得程序更加結(jié)構(gòu)化。這就使得我們不必拘泥于程序中的循環(huán)語句,而使用函數(shù)的循環(huán)調(diào)用,輔助適當(dāng)?shù)呐袛?,實現(xiàn)“轉(zhuǎn)移”,如A-B-A。當(dāng)然也可以進(jìn)行自身調(diào)用,構(gòu)成一個“標(biāo)準(zhǔn)的”循環(huán)。 如例一中,“程序執(zhí)行完畢返回”與“空選返回”兩種情況如果使用循環(huán)語句,其條件是完全不同的,而將函數(shù)本身作為子函數(shù)調(diào)用,程序簡潔明了。3.initget函數(shù)中關(guān)鍵字“ ”(空格)的使用 空格可以被用作關(guān)鍵字,一般多用來定義鼠標(biāo)右鍵退出。 當(dāng)用戶輸入函數(shù)不支持控制位(如entsel、nentsel、nentselp)時,可直接使用“(initget )”。 當(dāng)用戶輸入函數(shù)支持控制位(如getpoint等)時,可使用“(initget 1 )”禁止空輸入,而將回車等空輸入作為關(guān)鍵字使用。 當(dāng)同時使用其它關(guān)鍵字時,應(yīng)該將空格作為一系列關(guān)鍵字的最后一個,用“(initget C )”(兩個空格)調(diào)用,否則無效。 見例一。*;例一(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) ;選擇實體 (= (cdr (assoc 0 (entget (car s0) TEXT) ;判別文本 ) . ;操作內(nèi)容 (ett_ct) ;編輯后返回選擇 ) (t (ett_ct) ;空選返回選擇 )* 有時需要進(jìn)行復(fù)雜的判斷,使用如“(= s0 )”語句可能不能準(zhǔn)確判別輸入的空格關(guān)鍵字與空選擇,可以使用“(= (type s0) STR)”語句。4.Lisp的暫停與while的特殊使用 Lisp一般在交互輸入時才會暫停,如果只需要實現(xiàn)屏幕顯示暫停,可使用grread函數(shù),grread函數(shù)對所有合法的輸入設(shè)備均會作出反應(yīng),有時我們只希望對鍵盤有反應(yīng),可使用while函數(shù)進(jìn)行循環(huán)。* (princ nPress ENTER to continue:) (while (/= (car (grread) 2)* while用于滿足一定條件的循環(huán),其標(biāo)準(zhǔn)語法為: (while testexpr expr.) 其中expr解釋為“在 testexpr 為 nil 之前要求值的一個或多個表達(dá)式”,為可選項(在R14之前沒有方括號,但仍為可選項)。 正常我們使用while時,總會有expr項,更多的時候,我們是為了expr項才會使用這種循環(huán)語句,所有我們往往有expr項是不可缺少的感覺。這里我們使用while函數(shù)的語法是while函數(shù)的特例,即沒有expr項的情況。 如果希望對鼠標(biāo)右鍵同時反應(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語言中輸入距離的函數(shù)為getdist,但我們有時需要輸入負(fù)值,有時需要在輸入距離的同時得到角度,使用getdist函數(shù)就顯得無能為力,這時,我們可以靈活使用其它交互輸入函數(shù)如getpoint、getcorner等,通過計算得到我們所需要的值。 例二是一段輸入長度的同時得到默認(rèn)角度的代碼,使用getpoint函數(shù)。*;例二 (setq pt0 (getpoint n直線基點: ) pt1 (getpoint pt0 n直線長度: ) ;長度及角度可用鍵盤或鼠標(biāo)定位 dst (distance pt0 pt1) ;計算長度 ang (angle pt0 pt1) ;計算默認(rèn)角度 ang1 (getangle pt0 (strcat n直線方向: ) )* 例三是可以按陣列方式輸入行列間距的代碼,輸入距離為正值,修改部分代碼可輸入負(fù)值,使用getcorner函數(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指定對角點: ) ;鼠標(biāo)輸入對角 disc (abs (- (car dis) (car disr) ;正值行距 disr (abs (- (cadr dis) (cadr disr) ;正值列距 ) ;計算行列間距 ) (if (= (type disr) STR) ;鍵盤輸入行距 (if (setq dis (distof disr) ;判斷輸入的是否距離 (progn (initget 6) (setq disc (getdist n輸入列間距: ) ;輸入列距 ) (progn ;鍵盤輸入格式不符返回 (princ n需要正數(shù)值或兩個二維角點。) (lc_dist) ) ) (progn ;空輸入返回 (princ n需要正數(shù)值或兩個二維角點。) (lc_dist) ) ) ) )*6.數(shù)學(xué)運算函數(shù)的數(shù)量界限 在Lisp中對表中數(shù)據(jù)進(jìn)行求和、求最大值等數(shù)學(xué)運算時,往往直觀的對表直接賦予運算函數(shù),使用語句如“(eval (cons MAX numlist)”,一般都可以進(jìn)行計算,但當(dāng)表中數(shù)據(jù)數(shù)量大于255時,將會出現(xiàn)錯誤“bad argument value: does not fit in byte: 256”。 對于這種情況,我們不必對數(shù)據(jù)表進(jìn)行分段,可以直接使用函數(shù)apply,語法更簡單:(apply MAX numlist)。apply可將數(shù)據(jù)表傳送給指定的函數(shù)進(jìn)行求值而不受數(shù)據(jù)數(shù)量的影響。 受表中數(shù)據(jù)數(shù)量影響的數(shù)學(xué)運算函數(shù)有:+、-、*、/、max、min、logand及l(fā)ogior。7.選擇集與表 選擇集是一種特殊結(jié)構(gòu)的表,只能通過特定的函數(shù)進(jìn)行操作,但這些函數(shù)對大量重復(fù)的操作只能通過循環(huán)實現(xiàn),顯得力不從心,不能體現(xiàn)Lisp語言表結(jié)構(gòu)的優(yōu)越性。 其實我們只要通過存取實體名或?qū)嶓w句柄,將它們存為一個普通結(jié)構(gòu)的表,完全可以通過常規(guī)表操作函數(shù)實現(xiàn)對實體的操作。 例四是一段使用apply、mapcar函數(shù)聯(lián)合求文本選擇集中文本基點最大y值得代碼,只是一個示例,如果結(jié)合VL-sort函數(shù),可輕松實現(xiàn)對文本的排序。*;例四 (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)造包含實體名的表 ) ) (setq maxy (apply max ;求文本基點最大y值 (mapcar (lambda (x) (caddr (assoc 10 (entget x) ;提取y值 ) sl ) ) )* 當(dāng)然,選擇集也有其優(yōu)勢的一面,比如對選擇集中實體的刪除操作非常簡單、選擇集中的實體不會重復(fù)及選擇集可以與Acad命令交互使用等特征是一般表所不具備的,所以,編程時應(yīng)根據(jù)程序要求,靈活運用。8.cal的使用與加載 Acad隨機附帶了一些外部定義命令,其中cal(計算器)命令是最常用的命令之一,在加載gromcal.arx后cal可以在Lisp程序中像其它函數(shù)一樣使用,這就使得我們在程序中對文本的四則運算處理變得簡單,如“(cal 1+2/3)”,其中字符串1+2/3可以從圖形的文本中提取,也可以是符合cal要求格式的任一字符串(詳見Acad聯(lián)機幫助)。 需要注意的是,在Acad中g(shù)romcal.arx只能加載一次,重復(fù)加載將使Acad以外退出(無提示)。需要使用cal函數(shù)的Lisp程序,應(yīng)在程序尾部加上以下代碼:*(if (or (= (type c:cal) LIST) ;R14使用 (= (type c:cal) SUBR) ;R2000+使用 ) (arxload geomcal.arx)* 9.Undo處理 一個完善的程序應(yīng)該有較好的出錯處理,這是在所有Lisp教材上都提及的,但程序的Undo處理就說得很少或沒有提及。 其實Undo處理對程序來說也是非常重要的,尤其對有較多輸出的復(fù)雜程序而言,不能解決Undo問題,使用起來會極不方便。 對于Undo問題的解決,一種方法是盡量少用或不用command函數(shù),即不調(diào)用原始命令,這是一種較好的方法,但必須注意的是,一段程序必須至少有一次調(diào)用command函數(shù),否則Undo命令將取消程序運行前的前一次命令,解決的方法是在程序運行的起始位置加一個無謂的command,如“(command color )”。 有時不使用command函數(shù)不能達(dá)到我們要求的一些功能,或使得程序過于復(fù)雜,我們可能需要使用一些command函數(shù)(原始命令),這是就應(yīng)該在程序中進(jìn)行Undo處理,即使用Undo命令的編組功能。 例五是一段程序出錯函數(shù)與Undo處理的示例。*;例五(defun newerr (s) ;出錯函數(shù) (if s (progn (term_dialog) ;使用對話框時使用 (if olderr (setq *error* olderr) ;出錯函數(shù)恢復(fù) (if oldvar (setvar . oldvar) ;系統(tǒng)變量恢復(fù) (if olderr (setq *error* olderr) ;出錯函數(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)用自定義出錯函數(shù) (setq oldvar (getvar .) ;保存相關(guān)系統(tǒng)變量
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工廠車間干燥管理制度
- 墻面防撞處理方案(3篇)
- 小區(qū)勘測現(xiàn)場管理制度
- 彩繪門頭改造方案(3篇)
- 肇事賠償方案(3篇)
- 建筑施工防暑演練方案(3篇)
- 地質(zhì)雷達(dá)監(jiān)測方案(3篇)
- 水系圍欄維修方案(3篇)
- 廠房樓層規(guī)劃方案(3篇)
- 工程計劃方案(3篇)
- 靜脈治療考試試題及答案
- 2025年四川省成都市青羊區(qū)中考二診化學(xué)試題(原卷版+解析版)
- 2024初級注冊安全工程師筆試模擬題帶答案
- 2025年濱州國有資本投資運營集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- PVC拆除施工方案
- 2025年山東省煙草專賣局(公司)高校畢業(yè)生招聘(208名)筆試參考題庫附帶答案詳解
- 中考數(shù)學(xué)復(fù)習(xí)-中檔題訓(xùn)練(四)(含答案)
- 醫(yī)學(xué)實驗室質(zhì)量控制知識試題及答案
- 2025中國新型儲能行業(yè)發(fā)展白皮書
- 設(shè)備定制技術(shù)協(xié)議書
- 個人借款公司擔(dān)保借款合同7篇
評論
0/150
提交評論