版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第頁
AUTOLISP程序設(shè)計(jì)技巧
一、引言
在AutoCAD中的角度捕捉只有當(dāng)正交狀態(tài)翻開時(shí)的直和水平方向,對于其他特殊角度無能為力;另外,其網(wǎng)點(diǎn)捕捉也是相對于X軸和Y軸,無法實(shí)現(xiàn)其他方向的特殊長度捕捉,給繪圖帶來極大的不方便。在應(yīng)用AutoCAD進(jìn)展設(shè)計(jì)制圖的操作中,LINE和POLYLINE是使用頻率最高的兩個(gè)命令,經(jīng)常要遇到在某些特定角度上繪制特定長度的簡單線或復(fù)合線的情況,因而實(shí)現(xiàn)這兩個(gè)捕捉對提高AutoCAD作圖效率很有實(shí)用價(jià)值。二、方法原理所謂角度捕捉,是指當(dāng)十字光標(biāo)在某一角度α的一定范圍內(nèi)選取一點(diǎn)時(shí),該點(diǎn)自動(dòng)落在該α角度線上;當(dāng)我們設(shè)定捕捉角度為α?xí)r,將會(huì)以基準(zhǔn)點(diǎn)作為原點(diǎn)、自X軸正方向出發(fā),將整個(gè)屏幕劃分為[360/α]個(gè)區(qū)間,那么NXα角度就是角度捕捉線,其中,0≤N≤[360/α],[360/α]表示不大于360/α的整數(shù)。所謂長度捕捉,是在角度捕捉的根底上,在某一角度線上有一系列捕捉點(diǎn),該系列點(diǎn)離基準(zhǔn)點(diǎn)的距離為捕捉長度的正整數(shù)倍,中選取直線上的一點(diǎn)時(shí),落點(diǎn)自動(dòng)落到離其最近的捕捉點(diǎn)上。實(shí)現(xiàn)特定角度和長度捕捉的關(guān)鍵點(diǎn)是:當(dāng)十字光標(biāo)(即十字穿插線)移動(dòng)時(shí),程序要隨時(shí)跟蹤其穿插點(diǎn)的位置,并將該位置與用戶所設(shè)定的捕捉角度與長度對應(yīng)起來,從而計(jì)算出在該角度上的落點(diǎn)。以下舉例說明該兩個(gè)捕捉的實(shí)現(xiàn)過程:假定捕捉角度為α=30°,捕捉長度為L。當(dāng)十字光標(biāo)在任意的某一區(qū)間內(nèi)移動(dòng)時(shí),比方在第5區(qū)間(120°~150°)內(nèi)移動(dòng)時(shí),此時(shí),落點(diǎn)只能在120°或150°線上(該線在圖中并不直接顯示),該兩根角度線的中心線為135°。當(dāng)十字光標(biāo)的中心點(diǎn)處在120°~135°之間時(shí),那么落點(diǎn)應(yīng)在120°線上,該落點(diǎn)的具體位置為由十字光標(biāo)的中心點(diǎn)向120°線作垂線來獲得,其交點(diǎn)D(稱為垂點(diǎn))即為落點(diǎn),為直觀起見,此時(shí)由基準(zhǔn)點(diǎn)(此處為O點(diǎn))向落點(diǎn)作一橡筋拖曳線,該橡筋拖曳線隨十字光標(biāo)的移動(dòng)而相應(yīng)移動(dòng),顯示出拖動(dòng)過程(見圖1);同樣,當(dāng)十字光標(biāo)的中心點(diǎn)處在135°~150°之間時(shí),那么落點(diǎn)應(yīng)在150°線上,并顯示相應(yīng)的橡筋拖曳線。該橡筋拖曳線并不是真正的線段,只是用XOR墨水繪制的一個(gè)向量,當(dāng)用XOR墨水重新繪制一遍該向量時(shí),該向量將從屏幕上消失,這就是本程序?qū)崿F(xiàn)光標(biāo)拖動(dòng)的原理。落點(diǎn)落在某一捕捉角度線上時(shí),還得落在捕捉長度L的整數(shù)倍的點(diǎn)(稱為捕捉點(diǎn))上,還是針對圖1,其垂點(diǎn)必然處于某兩個(gè)捕捉點(diǎn)A與B之間,設(shè)A與B的中點(diǎn)為C,當(dāng)D處于A與C之間時(shí),落點(diǎn)應(yīng)為A;當(dāng)D處于C與B之間時(shí),落點(diǎn)應(yīng)為B(見圖1)。其中:----OA=nXL;OB=(n+1)XLn:非負(fù)整數(shù)。L:捕捉長度。此時(shí),程序通過一定的操作將在屏幕的最上面的坐標(biāo)提示行準(zhǔn)確地顯示落點(diǎn)相對基準(zhǔn)點(diǎn)的偏移長度和偏移角度。用戶可以滑動(dòng)鼠標(biāo)準(zhǔn)確捕捉到目標(biāo)點(diǎn)。至此,已實(shí)現(xiàn)某些特定角度及長度的捕捉。為了滿足在程序執(zhí)行過程中能隨時(shí)更改捕捉角度和捕捉長度的需要,本程序還增加了相應(yīng)的模塊;另外,本程序中嵌入了窗口放縮功能模塊,通過點(diǎn)取下拉菜單中窗口及漫游子菜單,方便了各種作圖的需要。三、源程序清單;;OS.LSP源程序;;err(),出錯(cuò)處理子程序(defunerr(msg)(if(/=msg"Functioncancelled")(princ(strcat"\nError:"msg));打印錯(cuò)誤內(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è)定的長度;;捕捉計(jì)算落點(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);出錯(cuò)處理(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));只移動(dòng)十字光標(biāo)時(shí)(progn(setqpframe(cadra))(fieldpstartpframean0)(endppstartpframeang2)(if(>=(distanceplastpframe)0.1)(progn(dragpstartpoldeplast)(setqplastpframepoldepend));forprogn);forif);forprogn);forcond1((=b3);用鼠標(biāo)在屏幕上點(diǎn)取一點(diǎn)時(shí)(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)取下拉菜單時(shí)(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è)計(jì)研究院--程建華,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中參加下面一句語句實(shí)現(xiàn)啟動(dòng)AutoCAD時(shí)自動(dòng)裝載:(AUTOLOAD"OS"'("OS"))也可將OS.LSP拷至\ACAD\SUPPORT\子目錄下,在\ACAD\SUPPORT\\子目錄下的菜單文件ACAD.MNU中的適宜位置加上下面的一句語句,即可直接在菜單中點(diǎn)取角度捕捉操作:···[角度捕捉]^c^c(load"c:/acad/support/os.lsp")os···2.程序的使用在一幅圖中第一次使用該程序時(shí),需要用戶輸入捕捉角度和捕捉長度,第二次調(diào)用本程序時(shí),程序可自動(dòng)采用上一次最后設(shè)定的捕捉角度和長度作為默認(rèn)值。然后,程序需要用戶選擇輸入一點(diǎn)作為基準(zhǔn)點(diǎn),此時(shí)命令行提示:F2/F3/F4/F5/ESC/Return/下一點(diǎn):用戶根據(jù)該提示可任選其中的一種操作,具體解釋如下:①按F2鍵重新設(shè)定捕捉角度;②按F3鍵重新設(shè)定捕捉長度;③按F4鍵窗口縮小0.7倍;④按F5鍵窗口放大1.4倍;⑤按ESC鍵、回車鍵、鼠標(biāo)右鍵均可完畢操作,退出程序;⑥選取下一點(diǎn),移動(dòng)十字光標(biāo)鍵,此時(shí)在屏幕的最上面的一行的坐標(biāo)提示欄準(zhǔn)確地顯示出按用戶設(shè)定的捕捉角度和長度所取得的落點(diǎn)相對于基準(zhǔn)點(diǎn)的偏移角度和長度,滑動(dòng)十字光標(biāo)鍵直至用戶尋找到所需要的下一點(diǎn)并按下鼠標(biāo)左鍵,命令行重又出現(xiàn)上面的提示行,并進(jìn)展下一輪循環(huán);⑦另外,用戶還可以點(diǎn)取View菜單下的Zoom菜單中的ZoomWindow、ZoomPrevious、ZoomAll等三個(gè)子項(xiàng)實(shí)現(xiàn)窗口放縮和Pan菜單實(shí)現(xiàn)屏幕漫游;對于其他操作,用戶均可按屏幕命令行的中文提示方便地進(jìn)展操作。在非漢化AutoCAD中運(yùn)行本程序時(shí),只需將程序中有關(guān)的中文提示行改成英文提示即可。另外,由于不同的機(jī)型在AutoCAD環(huán)境下鍵盤返回碼可能稍有區(qū)別,所以要求用戶在應(yīng)用本程序之前對自己的機(jī)器鍵盤返回碼按如下方法作一次核實(shí):在AutoCAD命令狀態(tài)下輸入(grread)并回車,用戶此時(shí)可按下F2或F3、F4、F5鍵:第一步:Command:(grread)回車第二步:按下F2鍵此時(shí),屏幕上回顯剛輸入的鍵值,比方對筆者使用的機(jī)器(ASTPIII+4/66D)回顯為:(2136)。其具體涵義為:第一個(gè)數(shù)字"2"表示剛剛是鍵盤輸入;第二個(gè)數(shù)字"136"表示本機(jī)器的"F2"鍵的返回碼。按上述步驟依次對FF4、F5鍵的返回碼進(jìn)展核實(shí),筆者的機(jī)器該三鍵的返回碼分別為137、138、139。如果核實(shí)結(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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租房協(xié)議書游戲
- 2025年度個(gè)人住房按揭貸款合同協(xié)議3篇
- 2025年度個(gè)人房產(chǎn)租賃押金返還融資協(xié)議4篇
- 2025年度鋼材貿(mào)易代理與結(jié)算服務(wù)合同
- 2025-2030全球單深位旋轉(zhuǎn)伸縮貨叉行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球奶酪凝乳酶行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球棉籽濃縮蛋白 (CPC)行業(yè)調(diào)研及趨勢分析報(bào)告
- 2024年軍隊(duì)文職人員招聘考試《教育學(xué)》模擬卷2
- 外教聘請中介合同合同協(xié)議
- 2025年度個(gè)人挖掘機(jī)租賃安全責(zé)任合同4篇
- 2024公路瀝青路面結(jié)構(gòu)內(nèi)部狀況三維探地雷達(dá)快速檢測規(guī)程
- 浙江省臺(tái)州市2021-2022學(xué)年高一上學(xué)期期末質(zhì)量評(píng)估政治試題 含解析
- 2024年高考真題-地理(河北卷) 含答案
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 2024年浙江省中考科學(xué)試卷
- 初三科目綜合模擬卷
- 2024風(fēng)力發(fā)電葉片維保作業(yè)技術(shù)規(guī)范
- 《思想道德與法治》課程教學(xué)大綱
- 2024光儲(chǔ)充一體化系統(tǒng)解決方案
- 2024年全國高考新課標(biāo)卷物理真題(含答案)
- 處理后事授權(quán)委托書
評(píng)論
0/150
提交評(píng)論