AUTOLISP程序設(shè)計技巧11_第1頁
AUTOLISP程序設(shè)計技巧11_第2頁
AUTOLISP程序設(shè)計技巧11_第3頁
AUTOLISP程序設(shè)計技巧11_第4頁
AUTOLISP程序設(shè)計技巧11_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第頁

AUTOLISP程序設(shè)計技巧

一、引言

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

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論