AUTOLISP程序設計技巧11_第1頁
AUTOLISP程序設計技巧11_第2頁
AUTOLISP程序設計技巧11_第3頁
AUTOLISP程序設計技巧11_第4頁
AUTOLISP程序設計技巧11_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第頁

AUTOLISP程序設計技巧

一、引言

在AutoCAD中的角度捕捉只有當正交狀態翻開時的直和水平方向,對于其他特殊角度無能為力;另外,其網點捕捉也是相對于X軸和Y軸,無法實現其他方向的特殊長度捕捉,給繪圖帶來極大的不方便。在應用AutoCAD進展設計制圖的操作中,LINE和POLYLINE是使用頻率最高的兩個命令,經常要遇到在某些特定角度上繪制特定長度的簡單線或復合線的情況,因而實現這兩個捕捉對提高AutoCAD作圖效率很有實用價值。二、方法原理所謂角度捕捉,是指當十字光標在某一角度α的一定范圍內選取一點時,該點自動落在該α角度線上;當我們設定捕捉角度為α時,將會以基準點作為原點、自X軸正方向出發,將整個屏幕劃分為[360/α]個區間,那么NXα角度就是角度捕捉線,其中,0≤N≤[360/α],[360/α]表示不大于360/α的整數。所謂長度捕捉,是在角度捕捉的根底上,在某一角度線上有一系列捕捉點,該系列點離基準點的距離為捕捉長度的正整數倍,中選取直線上的一點時,落點自動落到離其最近的捕捉點上。實現特定角度和長度捕捉的關鍵點是:當十字光標(即十字穿插線)移動時,程序要隨時跟蹤其穿插點的位置,并將該位置與用戶所設定的捕捉角度與長度對應起來,從而計算出在該角度上的落點。以下舉例說明該兩個捕捉的實現過程:假定捕捉角度為α=30°,捕捉長度為L。當十字光標在任意的某一區間內移動時,比方在第5區間(120°~150°)內移動時,此時,落點只能在120°或150°線上(該線在圖中并不直接顯示),該兩根角度線的中心線為135°。當十字光標的中心點處在120°~135°之間時,那么落點應在120°線上,該落點的具體位置為由十字光標的中心點向120°線作垂線來獲得,其交點D(稱為垂點)即為落點,為直觀起見,此時由基準點(此處為O點)向落點作一橡筋拖曳線,該橡筋拖曳線隨十字光標的移動而相應移動,顯示出拖動過程(見圖1);同樣,當十字光標的中心點處在135°~150°之間時,那么落點應在150°線上,并顯示相應的橡筋拖曳線。該橡筋拖曳線并不是真正的線段,只是用XOR墨水繪制的一個向量,當用XOR墨水重新繪制一遍該向量時,該向量將從屏幕上消失,這就是本程序實現光標拖動的原理。落點落在某一捕捉角度線上時,還得落在捕捉長度L的整數倍的點(稱為捕捉點)上,還是針對圖1,其垂點必然處于某兩個捕捉點A與B之間,設A與B的中點為C,當D處于A與C之間時,落點應為A;當D處于C與B之間時,落點應為B(見圖1)。其中:----OA=nXL;OB=(n+1)XLn:非負整數。L:捕捉長度。此時,程序通過一定的操作將在屏幕的最上面的坐標提示行準確地顯示落點相對基準點的偏移長度和偏移角度。用戶可以滑動鼠標準確捕捉到目標點。至此,已實現某些特定角度及長度的捕捉。為了滿足在程序執行過程中能隨時更改捕捉角度和捕捉長度的需要,本程序還增加了相應的模塊;另外,本程序中嵌入了窗口放縮功能模塊,通過點取下拉菜單中窗口及漫游子菜單,方便了各種作圖的需要。三、源程序清單;;OS.LSP源程序;;err(),出錯處理子程序(defunerr(msg)(if(/=msg"Functioncancelled")(princ(strcat"\nError:"msg));打印錯誤內容);forif(setq*error*olderr)(setvar"cmdecho"scmd)(setvar"osmode"cosmode)(setvar"coords"ccoords)(princ"n\n\t--多謝使用角度捕捉2.0版,程序非正常完畢--!\n")(princ));fordefunerr;;ant(),設定捕捉角度子程序(defunant(/ang0ang1)(setqang0(*an0(/180pi)))(princ(strcat"\n請輸入捕捉角度:<"(rtosang0)">_"))(INITGET4)(setqang1(getreal))(if(not(nullang1))(setqan0(*ang1(/pi180))))(princ"\nF2/F3/F4/F5/ESC/Return/下一點:"));fordefunant;;leng(),設定捕捉長度距離子程序(defunleng(/leng0leng1)(setqleng0len0)(princ(strcat"\n請輸入捕捉長度距離:<"(rtosleng0)">_"))(INITGET4)(setqleng1(getreal))(if(not(nullleng1))(setqlen0leng1))(princ"\nF2/F3/F4/F5/ESC/Return/下一點:"));fordefunlent;;field(),判斷十字光標所在區間,并投影到相應的捕捉角度線上(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)(setqdist(*(fix(+(/dislen0)0.5))len0));else(setqdistdis));forif(setqpend(polarpsang0dist)));fordefunendp;;drag(),對上一次顯示的拖曳線進展"或"操作,使其從屏幕上消失,;;并繪制下一次拖曳線(defundrag(pold1pold2pold3/)(if(/=b24)(progn(grdrawpold1pold2-10)(grdrawpold2pold3-10)));forif(grdrawpstartpend-10)(grdrawpendpframe-10));fordefundrag;;coord(),在屏幕的最上一行的坐標欄顯示長度和角度(defuncoord(/strleng1leng0ang0)(setqang0(*ang2(/180pi)))(setqstr(strcat(rtosdist)">"(rtosang0)))(grtext-2str));fordefuncoord;;init(),對程序進展初始化(defuninit(/)(setqscmd(getvar"cmdecho"));保存原命令回顯方式(setqccoords(getvar"coords"));保存原坐標顯示方式(setqcosmode(getvar"osmode"))(setqolderr*error**error*err);出錯處理(setvar"cmdecho"0);不回顯(setvar"coords"0);不顯示坐標(setvar"osmode"0);取消捕捉(setqb0b10c'(00))(setqpstart(getpoint"\n請輸入直線第一點:"))(if(or(nullan0)(<an00)(not(numberpan0)))(progn(setqan0(/pi6))(ant)));forif(if(or(nulllen0)(<len00)(not(numberplen0)))(progn(setqlen01)(leng)));forif(if(nulllen0)(leng))(princ"\nF2/F3/F4/F5/ESC/Return/下一點::")(setqa(grread2nil))(setqpframe(cadra))(fieldpstartpframean0)(endppstartpframeang2)(grdrawpstartpend-10)(grdrawpendpframe-10)(setqplastpframepoldepend)(setqb(cara)));fordefuninit;;home(),設置退出程序的控制變量(defunhome(/)(setqb3)(setqb11));fordefunhome;;pull(),承受用戶輸入控制子程序(defunpull(/)(setqb10)(while(/=b3)(progn(setqa(grread2nil))(coord)(if(and(=b2)(=b24))(setqb4))(setqb2b)(setqb(cara))(cond((or(=b5)(=b12));只移動十字光標時(progn(setqpframe(cadra))(fieldpstartpframean0)(endppstartpframeang2)(if(>=(distanceplastpframe)0.1)(progn(dragpstartpoldeplast)(setqplastpframepoldepend));forprogn);forif);forprogn);forcond1((=b3);用鼠標在屏幕上點取一點時(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)(command"zoom""0.7x")));for(=c1140)((=c1141);F5(progn(setqb24)(command"zoom""1.4x")));for(=c1141)((=c113)(home))((=c127)(home))(T(princ"\n未定義的鍵")));forcond(princ"\nF2/F3/F4/F5/ESC/Return/下一點:"));forprogn);for(cond(=b2))((=b4);點取下拉菜單時(progn(setqc1(cadra))(princ"\n")(cond((=c16005)(progn(command"zoom""w")(princ"\n第一角點:")(commandpause)(princ"\n第二角點:")(commandpause)));for(=c16005)((=c16007)(command"zoom""p"))((=c16008)(command"zoom""a"))((=c16011)(progn(command"pan")(princ"\n第一參考點:")(commandpause)(princ"\n第二參考點:")commandpause)));for(=c16011);;else(T(princ"\n未定義的菜單")));forcond(princ"\nF2/F3/F4/F5/ESC/Return/下一點:"));FORPROGN);for(cond(=b4))(T(home));forelse);forcond);forprogn);forwhile);fordefunpull;;draw(),繪制直線子程序(defundraw(/)(while(/=b11)(progn(if(=b3)(progn(command"line"pstartpend"")(princ"\nF2/F3/F4/F5/ESC/Return/下一點:")(setqb0b11)(setqpstartpend));forprogn);forif(pull));forprogn);forwhile(grdrawpstartpend-10)(grdrawpendpframe-10));fordefundraw;;;;主程序(defunc:os(/bb1b2cpstartpendpframeplastang2distscmdccoordsolderrcosmode);;;an0len0aredefinedoutprogram(init)(draw)(princ"\n")(command"redraw")(setq*error*olderr)(setvar"cmdecho"scmd)(setvar"osmode"cosmode)(setvar"coords"ccoords)(princ"\n\n\t角度捕捉2.0版\n")(princ"\n\n\t**寧波大學建筑設計研究院--程建華,1996**\n")(princ));fordefunos四、程序的安裝與使用1.程序的安裝以下三種裝載方式,用戶任選一種即可:在AutoCAD環境下,將OS.LSP拷至當前目錄,再執行(LOAD"OS")即可裝載OS.LSP。也可先將OS.LSP拷至\ACAD\SUPPORT\子目錄下,再在\ACAD\SUPPORT\ACADR12.LSP或ACADR13.LSP中參加下面一句語句實現啟動AutoCAD時自動裝載:(AUTOLOAD"OS"'("OS"))也可將OS.LSP拷至\ACAD\SUPPORT\子目錄下,在\ACAD\SUPPORT\\子目錄下的菜單文件ACAD.MNU中的適宜位置加上下面的一句語句,即可直接在菜單中點取角度捕捉操作:···[角度捕捉]^c^c(load"c:/acad/support/os.lsp")os···2.程序的使用在一幅圖中第一次使用該程序時,需要用戶輸入捕捉角度和捕捉長度,第二次調用本程序時,程序可自動采用上一次最后設定的捕捉角度和長度作為默認值。然后,程序需要用戶選擇輸入一點作為基準點,此時命令行提示:F2/F3/F4/F5/ESC/Return/下一點:用戶根據該提示可任選其中的一種操作,具體解釋如下:①按F2鍵重新設定捕捉角度;②按F3鍵重新設定捕捉長度;③按F4鍵窗口縮小0.7倍;④按F5鍵窗口放大1.4倍;⑤按ESC鍵、回車鍵、鼠標右鍵均可完畢操作,退出程序;⑥選取下一點,移動十字光標鍵,此時在屏幕的最上面的一行的坐標提示欄準確地顯示出按用戶設定的捕捉角度和長度所取得的落點相對于基準點的偏移角度和長度,滑動十字光標鍵直至用戶尋找到所需要的下一點并按下鼠標左鍵,命令行重又出現上面的提示行,并進展下一輪循環;⑦另外,用戶還可以點取View菜單下的Zoom菜單中的ZoomWindow、ZoomPrevious、ZoomAll等三個子項實現窗口放縮和Pan菜單實現屏幕漫游;對于其他操作,用戶均可按屏幕命令行的中文提示方便地進展操作。在非漢化AutoCAD中運行本程序時,只需將程序中有關的中文提示行改成英文提示即可。另外,由于不同的機型在AutoCAD環境下鍵盤返回碼可能稍有區別,所以要求用戶在應用本程序之前對自己的機器鍵盤返回碼按如下方法作一次核實:在AutoCAD命令狀態下輸入(grread)并回車,用戶此時可按下F2或F3、F4、F5鍵:第一步:Command:(grread)回車第二步:按下F2鍵此時,屏幕上回顯剛輸入的鍵值,比方對筆者使用的機器(ASTPIII+4/66D)回顯為:(2136)。其具體涵義為:第一個數字"2"表示剛剛是鍵盤輸入;第二個數字"136"表示本機器的"F2"鍵的返回碼。按上述步驟依次對FF4、F5鍵的返回碼進展核實,筆者的機器該三鍵的返回碼分別為137、138、139。如果核實結果與上述結果不符(比方,對某些機型,上述四鍵的返回碼分別為138、139、140、141),那么應對程序中的相應語句作如下修改。在"承受用戶輸入控制子程序"pul

溫馨提示

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

評論

0/150

提交評論