養成良好的AutoLISP書寫習慣_第1頁
養成良好的AutoLISP書寫習慣_第2頁
養成良好的AutoLISP書寫習慣_第3頁
養成良好的AutoLISP書寫習慣_第4頁
養成良好的AutoLISP書寫習慣_第5頁
已閱讀5頁,還剩13頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、養成良好的AutoLISP書寫習慣眾所周知,Lisp是一種表結構語言,括號必須成對出現,在調試時往往為遺漏了一個括號大費周折,所以,養成一個好的編程習慣是學好Lisp所必須的。選擇一個較好的編輯器,這是一個基本條件,建議使用VisualLisp編輯器或Lisplink等專用編輯器,此類編輯器可以對函數突出顯示。按Lisp(DCL)專有格式書寫,并經常對程序進行格式化”,及時發現語法錯誤,并有利于調試是查找錯誤。使用自定義函數,并輔助以適當得注釋,在較大程序中按功能使用自定義函數可以使得程序條理化。autolisp的入門教程十autolisp函數!Lisp是一門歷史悠久的語言,全名叫LIStPr

2、ocessor,也就是裝處理語言”,它是由JohnMcCarthy于1958年就開始設計的一門語言。和Lisp同時期甚至更晚出現的許多語言如Algo等如今大多已經消亡,又或者僅僅在一些特定的場合有一些微不足道的用途,到現在還廣為人知的恐怕只剩下了Fortran和COBOL。但唯獨Lisp,不但沒有隨著時間而衰退,反倒是一次又一次的煥發出了青春,從Lisp分支出來的Scheme、ML等語言在很多場合的火爆程度甚至超過了許多老牌明星。那么這顆常青樹永葆青春的奧秘究竟在哪里呢?如果你只接觸過C/C+、Pascal這些過程式語言”的話,Lisp可能會讓你覺得十分不同尋常,首先吸引你眼球(或者說讓你覺得

3、混亂的)一定是Lisp程序中異常多的括號,當然從現在的角度來講,這種設計的確對程序員不大友好,不過考慮到五六十年代的計算機處理能力,簡化語言本身的設計在那時算得上是當務之急了。Lisp的基本語法很簡單,它甚至沒有保留字(有些語言學家可能對這一點有異議,另怕,我聽你們的),它只有兩種基本的數據,僅有一種基本的語法結構就是表達式,而這些表達式同時也就是程序結構,但是正如規則最簡單的圍棋卻有著最為復雜的變化一樣,Lisp使用最基本的語言結構定義卻可以完成其它語言難于實現的、最復雜的功能。廢話少說,現在我們就來看看Lisp語言中的基本元素。Lisp的表達式是一個原子(atom)或表(list),原子(

4、atom)是一個字母序列,如abc;表是由零個或多個表達式組成的序列,表達式之間用空格分隔開,放入一對括號中,如:abc()(abcxyz)(ab(c)d)最后一個表是由四個元素構成的,其中第三個元素本身也是一個表。正如算數表達式1+1有值2樣,Lisp中的表達式也有值,如果表達式e得出值v,我們說e返回v。如果一個表達式是一個表,那么我們把表中的第一個元素叫做操作符,其余的元素叫做自變量。Lisp世界中的7個公理(基正如歐幾里德的幾何世界中有五個公理一樣,我們在這里給出本操作符):(quotex)返回x,我們簡記為x(atomx)當x是一個原子或者空表時返回原子t,否則返回空表()。在Lis

5、p中我們習慣用原子t表示真,而用空表()表示假。 (atoma)t (atom(abc)() (atom()t現在我們有了第一個需要求出自變量值的操作符,讓我們來看看quote操作符的作用一一通過引用(quote)一個表,我們避免它被求值。一個未被引用的表達式作為自變量,atom將其視為代碼,例如: (atom(atoma)t反之一個被引用的表僅僅被視為表 (atom(atoma)()引用看上去有些奇怪,因為你很難在其它語言中找到類似的概念,但正是這一特征構成了Lisp最為與眾不同的特點一一代碼和數據使用相同的結構來表示,而我們用quote來區分它們。(eqxy)當x和y的值相同或者同為空表時

6、返回t,否則返回空表() (eqaa)t (eqab)() (eq()()t例如:我們有時想捕捉任意兩點的中點,而不只是一條線上的中點,用系統自己的捕捉中點(它要有輔助線)就不行了,我們可以參考輔捉虛中點.lsp程序來實現。除程序中的語句要學外,動畫中的自動找到所有的全局變量并把它們改為局部變量的方法很有用!動畫中先畫了一個六邊形,再畫一個圓與它內接,圓心就是捕捉虛中點!AutoLisp概述AutoLisp的數據類型,它有10種數據類型,常見的有五種:整型INT實數型REAL符號型SYM字符串STR表LISP在AutoLisp中,最基本的數據類型稱為符號表達式,也稱為S-表達式,它是原子和點對

7、的總稱,點對通常表示為表。原子是一個一般符號系列,有兩種類型的原子,一種稱為數子原子(簡稱數”),AutoLIsp可處理整數和實數,其它不是數”原子稱為非數字原子,它包括符號原子(或稱為文字原子)和串原子。注意:0.4不能寫成.4。符號原子的大小寫是等效的。符號原子可以包含下列字符以外的任何可打印字符。正反括號用于定義表句號用于作點對分號用于注釋的開始,用作QUOTE函數的簡寫雙引號用作字符串常數的定界符符號原子的長度沒有限制,且所有的字符都是有意義的,但盡量不要超過6個字符。約束是一對符號和值,當將一個值賦給符號時,就說符號被約束到那個值。值(而不是符號)決定所代表信息的類型,故一個符號可以

8、接受任何類型的值,其初始值為nil.在AutoLisp中,有兩個特殊的符號原子,即T和nil.字符串的個數(不包括定界符)稱為字符串的長度。字符串可以是任意長度,它們的存儲空間是動態分配的,但字符串常量的最大長度不超過100,長度為0字符串稱為空串。可以用“nnn”的方式表示字符,其中nnn為八進制。eEscn換行r回車t制表符(Tab節)點對是由一個左括號,后接一個S-表達式和空格再接一個句點和空格和一個右括號。表是指放在一對相匹配的左右括號中的元素有序集合。表中的項稱為表的元素,表中的元素可以是任意類型的S表達式,序號0到n1。如果嵌套,0層,1層.表的長度,頂層元素的個數。只有nil是表

9、(?()又是原子。表有兩種類型:標準表,引用表。引用表是在表的前面冠以引用符號(域Quote)對該表不求值。標準表:第一個元素的值必須是一個合法的已經存在的AutoLisp函數定義,后跟調用該函數的參數。AutoLisp采用”前綴表示法即把運算符放在操作數之前,而不是中間,并把運算符(函數名)和操作數(調用函數的參數)用圓括號括起來,以表的方式表示。一個完整的AutoLisp程序往往是由一系列按順序排列的S-表達式組成的。如:(defunplus(xy)(+(+xy)x)(SetQa2.0)(SetQb2.0)(plusab)一個S-表達式可以分多行寫,一行也可以寫多個表達式。注釋以分號開始,

10、并在一行的末尾結束,AutoLisp的求值器忽略注釋。AutoLisp是一種求值型語言,求值程序第一次碰到一個求值代碼塊時,整個塊被轉換成壓宿代碼,如果程序中再次碰到那個塊,只是簡單的運行它。求值過程:1,整形,實數,字符串,文件指針,系統內部函數,以及兩個特殊的符號原子,對它們求值就是它們本身。2,符號原子是以當前的約束值作為它們的求值。3,表是根據它的第一個元素的數據類型進行求值的。(1)第一個元素的值為表,該表就假定為用戶定義的函數。(2)如果表的第一個元素的求值結果為一個內部函數,則剩余元素作為參數傳給該函數,并執行該函數的代碼,由函數的類型確定是否對傳給它的參數進行求值。輸入距離Li

11、sp語言中輸入距離的函數為getdist,但我們有時需要輸入負值,有時需要在輸入距離的同時得到角度,使用getdist函數就顯得無能為力,這時,我們可以靈活使用其它交互輸入函數如getpoint、getcorner等,通過計算得到我們所需要的值。例1是一段輸入長度的同時得到默認角度的代碼,使用getpoint函數。*;例1(setqpt1dstpt0(getpointn直線基點:)(getpointpt0n直線長度:)(distancept0pt1)ang(anglept0pt1)angl(getanglept0(strcatn;長度及角度可用鍵盤或鼠標定位;計算長度;計算默認角度直線方向:)

12、*例2是可以按陣列方式輸入行列間距的代碼,輸入距離為正值,修改部分代碼可輸入負值,使用getcorner函數,同時使用initget的控制位128。*;例2(defunlc_dist()(initget128);允許任意輸入(setqdisr(getpointn指定單位單元或輸入行間距:)(if(=(typedisr),LIST)(progn;鼠標輸入(initget1)(setqdis(getcornerdisrn指定對角點:);鼠標輸入對角disc(abs(-(cardis)(cardisr)disr(abs(-(cadrdis)(cadrdisr)(if(=(typedisr),STR)

13、(if(setqdis(distofdisr);正值行距;正值列距;計算行列間距;鍵盤輸入行距;判斷輸入的是否距離(progn(initget6)(setqdisc(getdistn輸入列間距:)(progn(princn需要正數值或兩個二維角點。;輸入列距;鍵盤輸入格式不符返回)(lc_dist))(progn;空輸入返回(princn需要正數值或兩個二維角點。)(lc_dist)AutoCAD中特定角度及長度捕捉的實現方法一、引言在AutoCAD中的角度捕捉只有當正交狀態打開時的直和水平方向,對于其他特殊角度無能為力;另外,其網點捕捉也是相對于X軸和Y軸,無法實現其他方向的特殊長度捕捉,給

14、繪圖帶來極大的不方便。在應用AutoCAD進行設計制圖白操作中,LINE和POLYLINE是使用頻率最高的兩個命令,經常要遇到在某些特定角度上繪制特定長度的簡單線或復合線的情況,因而實現這兩個捕捉對提高AutoCAD作圖效率很有實用價值。二、方法原理所謂角度捕捉,是指當十字光標在某一角度”的一定范圍內選取一點時,該點自動落在該a角度線上;當我們設定捕捉角度為a時,將會以基準點作為原點、自X軸正方向出發,將整個屏幕劃分為360/a添區間,則NXz角度就是角度捕捉線,其中,0WN360/a360/速示不大于360/由勺整數。所謂長度捕捉,是在角度捕捉的基礎上,在某一角度線上有一系列捕捉點,該系列點

15、離基準點的距離為捕捉長度的正整數倍,當選取直線上的一點時,落點自動落到離其最近的捕捉點上。實現特定角度和長度捕捉的關鍵點是:當十字光標(即十字交*線)移動時,程序要隨時跟蹤其交*點的位置,并將該位置與用戶所設定的捕捉角度與長度對應起來,從而計算出在該角度上的落點。以下舉例說明該兩個捕捉的實現過程:假定捕捉角度為a=30。,捕捉長度為L。當十字光標在任意的某一區間內移動時,比如在第5區間(120150內移動時,此時,落點只能在120。或150。線上(該線在圖中并不直接顯示),該兩根角度線的中心線為135。當十字光標的中心點處在120135之間時,則落點應在120線上,該落點的具體位置為由十字光標

16、的中心點向120。線作垂線來獲得,其交點D(稱為垂點)即為落點,為直觀起見,此時由基準點(此處為。點)向落點作一橡筋拖曳線,該橡筋拖曳線隨十字光標的移動而相應移動,顯示出拖動過程(見圖1);同樣,當十字光標的中心點處在135150之間時,則落點應在150。線上,并顯示相應的橡筋拖曳線。該橡筋拖曳線并不是真正的線段,只是用XOR墨水繪制的一個向量,當用XOR墨水重新繪制一遍該向量時,該向量將從屏幕上消失,這就是本程序實現光標拖動的原理。落點落在某一捕捉角度線上時,還得落在捕捉長度L的整數倍的點(稱為捕捉點)上,還是針對圖1,其垂點必然處于某兩個捕捉點A與B之間,設A與B的中點為C,當D處于A與C

17、之間時,落點應為A;當D處于C與B之間時,落點應為B(見圖1)。其中:OA=nXL;OB=(n+1)XLn:非負整數。L:捕捉長度。此時,程序通過一定的操作將在屏幕的最上面的坐標提示行準確地顯示落點相對基準點的偏移長度和偏移角度。用戶可以滑動鼠標準確捕捉到目標點。至此,已實現某些特定角度及長度的捕捉。為了滿足在程序執行過程中能隨時更改捕捉角度和捕捉長度的需要,本程序還增加了相應的模塊;另外,本程序中嵌入了窗口放縮功能模塊,通過點取下拉菜單中窗口及漫游子菜單,方便了各種作圖的需要。三、源程序清單;OS.LSP源程序;err(),出錯處理子程序(defunerr(msg)(if(/=msgFunc

18、tioncancelled)(princ(strcatnError:msg);打印錯誤內容);forif(setq*error*olderr)(setvarcmdechoscmd)(setvarosmodecosmode)(setvarcoordsccoords)(princnnt-多謝使用角度捕捉2.0版,程序非正常結束-!n)(princ);fordefunerr;ant(),設定捕捉角度子程序(defunant(/ang0angl)(setqang0(*an0(/180pi)(princ(strcatn請輸入捕捉角度:_)(INITGET4)(setqang1(getreal)(if(n

19、ot(nullang1)(setqan0(*ang1(/pi180)(princnF2/F3/F4/F5/ESC/Return/下一點:);fordefunant;leng(),設定捕捉長度距離子程序(defunleng(/leng0leng1)(setqleng0len0)(princ(strcatn請輸入捕捉長度距離:_)(INITGET4)(setqleng1(getreal)(if(not(nullleng1)(setqlen0leng1)(princnF2/F3/F4/F5/ESC/Return/下一點:”);fordefunlent;field(),判斷十字光標所在區間,并投影到相

20、應的捕捉角度線上(defunfield(pspeang0/ang1n)(setqang1(anglepspe)(setqn(fix(+(/ang1ang0)0.5)(setqang2(*ang0n);fordefun;endp(),十字光標投影到相應的捕捉角度上后,以用戶設定的長度;捕捉計算落點(defunendp(pspeang0/p1p2p3p4dis)(setqp1psp2(polarpsang01)p3pep4(polarpe(+ang0(/pi2)1)(setqpend(intersp1p2p3p4nil)(setqdis(distancepspe)(if(/=len00)(setq

21、dist(*(fix(+(/dislen0)0.5)len0);else(setqdistdis);forif(setqpend(polarpsang0dist);fordefunendp;drag(),對上一次顯示的拖曳線進行或操作,使其從屏幕上消失;并繪制下一次拖曳線(defundrag(poldlpold2pold3/)(if(/=b24)(progn(grdrawpold1pold2-10)(grdrawpold2pold3-10);forif(grdrawpstartpend-10)(grdrawpendpframe-10);fordefundrag;coord(),在屏幕的最上一行

22、的坐標欄顯示長度和角度(defuncoord(/strleng1leng0ang0)(setqang0(*ang2(/180pi)(setqstr(strcat(rtosdist)(rtosang0)(grtext-2str);fordefuncoord;init(),對程序進行初始化(defuninit(/)(setqscmd(getvarcmdecho);保留原命令回顯方式(setqccoords(getvarcoords);保留原坐標顯示方式(setqcosmode(getvarosmode)(setqolderr*error*error*err);出錯處理(setvarcmdecho0

23、);不回顯(setvarcoords0);不顯示坐標(setvarosmode0);取消捕捉(setqb0b10c(00)(setqpstart(getpointn請輸入直線第一點:)(if(or(nullan0)(an00)(not(numberpan0)(progn(setqan0(/pi6)(ant);forif(if(or(nulllen0)(=(distanceplastpframe)0.1)(progn(dragpstartpoldeplast)(setqplastpframepoldepend);forprogn);forif);forprogn);forcond1(=b3);用

24、鼠標在屏幕上點取一點時(progn(setqpframe(cadra)(fieldpstartpframean0)(endppstartpframeang2)(if(=(distanceplastpframe)0.1)(progn(grdrawpstartpolde-10)(setqplastpframepoldepend);forprogn);forif);forprogn);forcond1(=b2);鍵盤輸入(progn(setqc1(cadra)(cond(=c1138)(ant);F2(=c1139)(leng);F3(=c1140);F4(progn(setqb24)(comman

25、dzoom0.7x);for(=c1140)(=c1141);F5(progn(setqb24)(commandzoom1.4x);for(=cl141)(=c113)(home)(=c127)(home)(T(princn未定義的鍵);forcond(princnF2/F3/F4/F5/ESC/Return/下一點:”);forprogn);for(cond(=b2)(=b4);點取下拉菜單時(progn(setqc1(cadra)(princn)(cond(=c16005)(progn(commandzoomw)(princn第一角點:)(commandpause)(princn第二角點:

26、)(commandpause);for(=cl6005)(=cl6007)(commandzoomp)(=cl6008)(commandzooma)(=cl6011)(progn(commandpan)(princn第一參考點:)(commandpause)(princn第二參考點:)commandpause);for(=c16011);else(T(princn未定義的菜單);forcond(princnF2/F3/F4/F5/ESC/Return/下一點:);FORPROGN);for(cond(=b4)(T(home);forelse);forcond);forprogn);forwhi

27、le);fordefunpull;draw(),繪制直線子程序(defundraw(/)(while(/=bl1)(progn(if(=b3)(progn(commandlinepstartpend)(princnF2/F3/F4/F5/ESC/Return/下一點:)(setqb0b11)(setqpstartpend);forprogn);forif(pull);forprogn);forwhile(grdrawpstartpend-10)(grdrawpendpframe-10);fordefundraw;主程序(defunc:os(/bblb2cpstartpendpframeplas

28、tang2distscmdccoordsolderrcosmode);an0len0aredefinedoutprogram(init)(draw)(princn)(commandredraw)(setq*error*olderr)(setvarcmdechoscmd)(setvarosmodecosmode)(setvarcoordsccoords)(princnnt角度捕捉2.0版n)(princnnt*寧波大學建筑設計研究院-程建華,1996*n)(princ);fordefunos四、程序的安裝與使用1 .程序的安裝以下三種裝載方式,用戶任選一種即可:在AutoCAD環境下,將OS.L

29、SP拷至當前目錄,再執行(LOADOS)即可裝載OS.LSP。也可先將OS.LSP拷至子目錄下,再在ACADSUPPORTACADR12.LSP或ACADR13.LSP中加入下面一句語句實現啟動AutoCAD時自動裝載:(AUTOLOADOS(OS)也可將OS.LSP拷至子目錄下,在子目錄下的菜單文件ACAD.MNU中的合適位置加上下面的一句語句,即可直接在菜單中點取角度捕捉操作:角度捕捉AcAc(loadc:/acad/support/os.lsp)os2 .程序的使用在一幅圖中第一次使用該程序時,需要用戶輸入捕捉角度和捕捉長度,第二次調用本程序時,程序可自動采用上一次最后設定的捕捉角度和長

30、度作為默認值。然后,程序需要用戶選擇輸入一點作為基準點,此時命令行提示:F2/F3/F4/F5/ESC/Return/下一點:用戶根據該提示可任選其中的一種操作,具體解釋如下:按F2鍵重新設定捕捉角度;按F3鍵重新設定捕捉長度;按F4鍵窗口縮小0.7倍;按F5鍵窗口放大1.4倍;按ESC鍵、回車鍵、鼠標右鍵均可結束操作,退出程序;選取下一點,移動十字光標鍵,此時在屏幕的最上面的一行的坐標提示欄準確地顯示出按用戶設定的捕捉角度和長度所取得的落點相對于基準點的偏移角度和長度,滑動十字光標鍵直至用戶尋找到所需要的下一點并按下鼠標左鍵,命令行重又出現上面的提示行,并進行下一輪循環;另外,用戶還可以點取

31、View菜單下的Zoom菜單中的ZoomWindow、ZoomPrevious、ZoomAll等三個子項實現窗口放縮和Pan菜單實現屏幕漫游;對于其他操作,用戶均可按屏幕命令行的中文提示方便地進行操作。在非漢化AutoCAD中運行本程序時,只需將程序中有關的中文提示行改成英文提示即可。另外,由于不同的機型在AutoCAD環境下鍵盤返回碼可能稍有區別,所以要求用戶在應用本程序之前對自己的機器鍵盤返回碼按如下方法作一次核實:在AutoCAD命令狀態下輸入(grread)并回車,用戶此時可按下F2或F3、F4、F5鍵:第一步:Command:(grread)回車第二步:按下F2鍵此時,屏幕上回顯剛輸入的鍵值,比如

溫馨提示

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

評論

0/150

提交評論