AutoLISP在CASS繪圖軟件中的應(yīng)用_第1頁(yè)
AutoLISP在CASS繪圖軟件中的應(yīng)用_第2頁(yè)
AutoLISP在CASS繪圖軟件中的應(yīng)用_第3頁(yè)
AutoLISP在CASS繪圖軟件中的應(yīng)用_第4頁(yè)
AutoLISP在CASS繪圖軟件中的應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

AutoLISP在CASS繪圖軟件中的應(yīng)用摘要隨著科學(xué)技術(shù)的開(kāi)展,計(jì)算機(jī)的應(yīng)用越來(lái)越被廣泛的應(yīng)用到各行各業(yè),而對(duì)于測(cè)繪專業(yè),大量的數(shù)據(jù)處理時(shí)是其根本特征,處理數(shù)據(jù)是一項(xiàng)繁瑣的工作,如假設(shè)使用計(jì)算機(jī)編程語(yǔ)言編寫(xiě)程序來(lái)處理測(cè)繪專業(yè)的大量的數(shù)據(jù),不僅能夠節(jié)省大量的時(shí)間和人力物力,同時(shí)也可以有效的防止處理數(shù)據(jù)時(shí)由于數(shù)據(jù)過(guò)多造成不必要的錯(cuò)誤。本文主要是使用計(jì)算機(jī)語(yǔ)言AutoLISP——一款內(nèi)置于AutoCAD中的編程語(yǔ)言,通過(guò)編寫(xiě)程序,用來(lái)研究AutoLISP在CASS軟件中的應(yīng)用,由于CASS主要是基于AutoCAD平臺(tái)用來(lái)繪制圖形的軟件,所以本設(shè)計(jì)主要是研究關(guān)于AutoLISP在CASS中的計(jì)算方面的應(yīng)用。論文中主要是研究了用AutoLISP語(yǔ)言編寫(xiě)程序用于測(cè)邊交會(huì)計(jì)算、測(cè)角交會(huì)計(jì)算、城市坐標(biāo)系與建筑坐標(biāo)系計(jì)算及地物繪制。關(guān)鍵詞:AutoLISP語(yǔ)言,測(cè)角交會(huì)計(jì)算,測(cè)邊交會(huì)計(jì)算,建筑坐標(biāo)系和城市坐標(biāo)系轉(zhuǎn)換,地物繪制TheapplicationsofAutoLISPinCASSdrawingsoftwareABSTRCATWiththedevelopmentofscienceandtechnology,theapplicationsofthecomputeraremoreandmorewidelyappliedtoallwalksoflife.Andforthesurveyingandmapping,largeamountsofdataprocessing,itsbasiccharacteristics,thatdataprocessingisatediouswork,shoulduseacomputerprogramminglanguagetowriteaprogramtohandlelargeamountsofdata.Usingit,notonlycansavealotoftimeandmanpowerandmaterialresources,butalsocaneffectivelyavoidtoomuchdatatocauseunnecessaryerrorswhenprocessingdata.Inthispaper,thecomputerlanguageofAutoLISP-abuilt-inAutoCADprogramminglanguage,throughthepreparationprocess,isusedtostudytheapplicationofAutoCADintheCASSsoftware.CASSismainlybasedonAutoCADsoftwareusedtodrawgraphics,sothispaperistostudyonthecalculationofAutoLISPinCASS.Paperistostudyforthesideoftheintersectioncalculation,themeasuredangleofintersectioncalculations,thecitysystemandthebuildingcoordinatesystemconversations,andsurfacefeaturesdrawingwiththeAutoLISPprogramming.Keywords:AutoLISPprogramming,thesideintersectioncalculation,measuredangleoftheintersectioncalculation,thecitysystemandthebuildingcoordinatesystemconversations,andsurfacefeaturesdrawing目錄1緒論11.1AutoCAD的簡(jiǎn)介11.2AutoCAD的二次開(kāi)發(fā)的開(kāi)展與現(xiàn)狀12AutoLISP語(yǔ)言32.1AutoLISP語(yǔ)言的簡(jiǎn)介及特點(diǎn)32.2AutoLISP的運(yùn)行環(huán)境與內(nèi)存分配32.3AutoLISP的數(shù)據(jù)類型42.3.1原子52.3.2表和點(diǎn)對(duì)52.4AutoLISP程序的執(zhí)行62.4.1AutoLISP文件的加載62.4.2運(yùn)行AutoLISP程序73AutoLISP的函數(shù)83.1數(shù)值函數(shù)83.2邏輯運(yùn)算函數(shù)93.3三角函數(shù)103.4字符串處理函數(shù)113.5條件與循環(huán)函數(shù)124AutoLISP與CASS之間的聯(lián)系134.1AutoCAD與CASS之間的聯(lián)系134.2AutoLISP與CASS之間的關(guān)系145AutoLISP在CASS中的應(yīng)用175.1編寫(xiě)AutoLISP程序進(jìn)行測(cè)邊交會(huì)的計(jì)算175.2編寫(xiě)AutoLISP程序進(jìn)行測(cè)角交會(huì)的計(jì)算215.3關(guān)于角度化成十進(jìn)制并輸出255.4坐標(biāo)換算265.5地物繪制316結(jié)論與展望366.1結(jié)論366.2展望36致謝38參考文獻(xiàn)391緒論隨著計(jì)算機(jī)技術(shù)的飛速開(kāi)展,以計(jì)算機(jī)為根底的智能繪圖和設(shè)計(jì)軟件日益成為相關(guān)專業(yè)不可或缺的一局部,而這些繪圖和設(shè)計(jì)軟件以其人機(jī)交互、功能強(qiáng)大、易學(xué)易懂的功能受到人們的親睞。AutoCAD就是其中一種,它是美國(guó)Autodesk公司推出的一款計(jì)算機(jī)輔助繪圖和設(shè)計(jì)軟件,它以自己強(qiáng)大的功能已廣泛應(yīng)用于機(jī)械專業(yè)、土木專業(yè)以及測(cè)繪測(cè)量的相關(guān)領(lǐng)域。AutoCAD通過(guò)其強(qiáng)大的功能以及開(kāi)放式的功能結(jié)構(gòu),大大的改變了傳統(tǒng)繪圖和設(shè)計(jì)的工作方法,工作過(guò)程和工作方式,它不僅大大改善了傳統(tǒng)繪圖的很多弊病,同時(shí)也以其強(qiáng)大的優(yōu)點(diǎn)使得當(dāng)代的繪圖和設(shè)計(jì)工作能夠更有效更高質(zhì)量的得到完成。1.1AutoCAD的簡(jiǎn)介AutoCAD系列軟件是由美國(guó)的Autodesk公司研制開(kāi)發(fā)出的,一種為滿足用戶進(jìn)行繪圖設(shè)計(jì)工作的需求的,以計(jì)算機(jī)輔助圖形的繪制和設(shè)計(jì)的軟件,這個(gè)軟件的英文全名是AtuoComputerAidedDesign,即計(jì)算機(jī)輔助設(shè)計(jì)。AutoCAD計(jì)算機(jī)繪圖軟件有豐富的界面工具和功能,此外,隨著AutoCAD系列的軟件的開(kāi)展,AutoCAD可以用來(lái)繪制出復(fù)雜而精確的圖形。另外,隨著不同行業(yè)的需求,AutoCAD也為相關(guān)的專業(yè)、行業(yè)開(kāi)展出與之相匹配的軟件,為這些專業(yè)的應(yīng)用設(shè)計(jì)與開(kāi)展提供效勞,如在測(cè)繪測(cè)量行業(yè),基于AutoCAD平臺(tái)而開(kāi)發(fā)出來(lái)的南方CASS成圖系統(tǒng)軟件備受廣闊的測(cè)量專業(yè)人士的喜愛(ài),當(dāng)然南方CASS成圖系統(tǒng)軟件最適用于測(cè)繪專業(yè)的是它強(qiáng)大的測(cè)繪專業(yè)要求的自動(dòng)繪成圖的功能。1.2AutoCAD的二次開(kāi)發(fā)的開(kāi)展與現(xiàn)狀A(yù)utoCAD軟件憑借其強(qiáng)大的而又豐富的功能,越來(lái)越廣泛的滲入各個(gè)行業(yè)的各個(gè)領(lǐng)域。隨著不同專業(yè)的客戶對(duì)AutoCAD在自己專業(yè)應(yīng)用的需求的增長(zhǎng),客戶對(duì)各自需求的AutoCAD的二次開(kāi)發(fā)的功能的要求也愈發(fā)強(qiáng)烈。所以,不同的專業(yè)開(kāi)發(fā)出不同的功能、舉一反三、觸類旁通,這些AutoCAD的二次開(kāi)發(fā)功能的優(yōu)點(diǎn)越發(fā)的得到專業(yè)人士喜愛(ài)。通過(guò)AutoCAD的二次開(kāi)發(fā)語(yǔ)言進(jìn)行編程,用來(lái)實(shí)現(xiàn)大量數(shù)據(jù)的整體更改;用二次開(kāi)發(fā)的程序進(jìn)行復(fù)雜的大量的曲線的自動(dòng)繪制;用二次開(kāi)發(fā)的程序進(jìn)行相關(guān)專業(yè)的大量數(shù)據(jù)的統(tǒng)計(jì)與計(jì)算;用二次開(kāi)發(fā)的程序進(jìn)行繪制設(shè)計(jì)圖紙的自動(dòng)的標(biāo)注等等,二次開(kāi)發(fā)的程序的應(yīng)用越來(lái)越多的被用來(lái)解決許多復(fù)雜的、重復(fù)的工作,其方便的快捷的使用過(guò)程開(kāi)辟了AutoCAD的二次開(kāi)發(fā)的新天地。當(dāng)今社會(huì),各個(gè)專業(yè)的各個(gè)人士,一提到繪圖與設(shè)計(jì)軟件,AutoCAD這個(gè)詞語(yǔ)立即就會(huì)脫口而出,AutoCAD已經(jīng)不僅只是一個(gè)簡(jiǎn)單軟件了,它已經(jīng)完全成為了現(xiàn)時(shí)下各行業(yè)人士最為熟悉與認(rèn)可的一個(gè)工程繪圖設(shè)計(jì)軟件了。說(shuō)道繪圖制圖,AutoCAD一定會(huì)被人們提及,形成這種的局面的原因除了Atuodesk公司的大幅度的宣傳之外,恐怕所有的功能都要?dú)w功于這個(gè)軟件的強(qiáng)大的繪圖與編輯功能,以及它強(qiáng)大的二次開(kāi)發(fā)功能的運(yùn)用。如今的AutoCAD的開(kāi)展已經(jīng)深深的滲入了各個(gè)專業(yè)的各個(gè)領(lǐng)域與環(huán)節(jié)了,它不僅適用于某些專業(yè)的二維平面圖形的繪制和設(shè)計(jì),更是可以滿足一些行業(yè)對(duì)三維立體工作的要求,這說(shuō)明了AutoCAD的功能已經(jīng)不僅局限于二維平面圖形的繪制,它對(duì)于三維建模也同樣可以擁有其巨大的能量。如果這樣說(shuō)來(lái),AutoCAD的功能已經(jīng)足夠強(qiáng)大了,那么二次開(kāi)發(fā)的開(kāi)展是不是就不太需要了呢?恰恰相反,AutoCAD的二次開(kāi)發(fā)不但不是多余之舉,反而是更是大大加強(qiáng)了AutoCAD的各種功能。比方測(cè)繪行業(yè),因?yàn)闇y(cè)繪行業(yè)所進(jìn)行的相關(guān)領(lǐng)域的工作都是大范圍的測(cè)量與地形圖的繪制,為完成這些工作就得進(jìn)行大量的數(shù)據(jù)處理和大量的公式運(yùn)算以及通過(guò)野外測(cè)得許多數(shù)據(jù)點(diǎn)進(jìn)行地形繪制。在使用這些點(diǎn)進(jìn)行地物繪制時(shí),如果單純使用AutoCAD的自帶選項(xiàng)功能進(jìn)行處理就會(huì)十分繁瑣與麻煩,但是如果假設(shè)通過(guò)AutoCAD的二次開(kāi)發(fā)功能夠開(kāi)發(fā)出一系列的程序,用來(lái)處理測(cè)量中的這些數(shù)據(jù)的處理和其公式的運(yùn)算并進(jìn)行等高線的繪制,它不僅在很大程度上省下人力物力、方便該專業(yè)的相關(guān)工作的進(jìn)行,而在另一個(gè)角度上,它也推動(dòng)了該專業(yè)在該領(lǐng)域的開(kāi)展與進(jìn)步。2AutoLISP語(yǔ)言2.1AutoLISP語(yǔ)言的簡(jiǎn)介及特點(diǎn)AutoLISP是〔ListProcessingLanguage〕是一種計(jì)算機(jī)的表處理語(yǔ)言,是在人工智能學(xué)科領(lǐng)域廣泛應(yīng)用的一種計(jì)算機(jī)程序設(shè)計(jì)開(kāi)發(fā)語(yǔ)言。AutoLISP語(yǔ)言嵌套在AutoCAD的內(nèi)部,是LISP語(yǔ)言和AutoCAD有機(jī)結(jié)合的產(chǎn)物。在1987年6月份,AutoCAD添加了三維模式繪圖的功能,并且研發(fā)出了二次開(kāi)發(fā)的匯編語(yǔ)言——AutoLISP。用戶可以運(yùn)用這種匯編語(yǔ)言,在AutoCAD的開(kāi)發(fā)平臺(tái)進(jìn)行AutoCAD的二次開(kāi)放,這種二次開(kāi)發(fā)的功能突破賦予了AutoCAD注入了新的血液。用戶不但可以進(jìn)行相關(guān)功能的二次開(kāi)發(fā),也可以繼續(xù)擴(kuò)充AutoCAD的功能,為AutoCAD占領(lǐng)整個(gè)繪圖專業(yè)的相關(guān)領(lǐng)域提供了巨大的能量。AutoLISP是開(kāi)發(fā)AutoCAD的重要工具之一。它可以直接調(diào)用AutoCAD的命令,它不但具備一般高級(jí)語(yǔ)言的根本結(jié)構(gòu)和功能,又具有一些高級(jí)語(yǔ)言所不能完成的強(qiáng)大的圖形處理功能,是當(dāng)今世界用于AutoCAD二次開(kāi)發(fā)中的最廣泛使用的編程語(yǔ)言之一。美國(guó)AutoDesk公司把AutoLISP內(nèi)嵌于AutoCAD,就是為了使廣闊用戶更加方便的利用AutoLISP進(jìn)行二次開(kāi)發(fā):實(shí)現(xiàn)直接增加和修改AutoCAD的命令,隨意更改圖形編輯的功能,開(kāi)發(fā)CAD相關(guān)的功能軟件等等。AutoLISP語(yǔ)言最顯著的功能就是參數(shù)化繪圖的程序設(shè)計(jì)過(guò)程,實(shí)現(xiàn)圖形的自動(dòng)繪制以及進(jìn)行圖形的自行修改等功能。AutoLISP語(yǔ)言一個(gè)最大的優(yōu)點(diǎn)就是可以采用遞歸方式處理問(wèn)題,這樣一來(lái),不僅可以節(jié)省大量的時(shí)間,也使得程序簡(jiǎn)單明了。2.2AutoLISP的運(yùn)行環(huán)境與內(nèi)存分配AutoLISP對(duì)于運(yùn)行環(huán)境有一定的要求,主要是對(duì)處理器、存儲(chǔ)器以及輸入、輸出設(shè)備的要求:1.對(duì)處理器的要求:(1)至少應(yīng)為386型計(jì)算機(jī),計(jì)算機(jī)應(yīng)配有協(xié)處理器,即CPU386+387;(2)最好CPU為486或者是586。2.對(duì)存儲(chǔ)器的要求(1)內(nèi)存:AutoLISPR2.6~R10,有1MB以上的內(nèi)存即可;AutoLISPR11以上版本,有4MB以上的內(nèi)存即可,最好8MB內(nèi)存。(2)硬盤(pán):AutoLISPR2.6~R10,有10MB以上的空閑硬盤(pán)空間即可;AutoLISPR11以上版本,至少要35MB的空閑硬盤(pán)空間。3.對(duì)輸入、輸出設(shè)備的要求(1)應(yīng)配有鼠標(biāo)或數(shù)字化儀,以便于輸入;(2)應(yīng)配有打印機(jī)或繪圖儀,以便于圖形的輸出;(3)彩色的顯示器,分辨率在640×400像素以上;(4)應(yīng)配有高密軟驅(qū),以用于軟件的安裝。AutoLISPDE內(nèi)存分配主要是為其變量、用戶定義函數(shù)和系統(tǒng)函數(shù)提供計(jì)算機(jī)的存儲(chǔ)空間。當(dāng)運(yùn)行AtuoLISP程序時(shí),它需要兩個(gè)很大的內(nèi)存區(qū)域。(1)heap〔堆區(qū)域〕,它存儲(chǔ)所有的函數(shù)和變量,因此,程序使用的函數(shù)和變量越多,或者函數(shù)越為的復(fù)雜,那么他的堆區(qū)域占用的空間也就越多。(2)stack〔棧區(qū)域〕,它存儲(chǔ)的函數(shù)的變量和局部結(jié)果,因此“嵌套〞的函數(shù)越為的復(fù)雜與豐富,或者函數(shù)的執(zhí)行的遞歸次數(shù)越多,那么所用的??臻g內(nèi)存也就越多。AutoLISP默認(rèn)的堆空間和??臻g的大小為:Heap為25000B,Stack為20000B在AutoCAD下運(yùn)行AutoLISP不能擴(kuò)展它的堆和??臻g,如果用戶定義的函數(shù)和變量太多太復(fù)雜,以致占用了所有的堆空間,AutoLISP將會(huì)顯示以下信息:Insufficientnodespace,并且會(huì)終止正在執(zhí)行的函數(shù)的運(yùn)行,如果在執(zhí)行AutoCAD時(shí),沒(méi)有足夠的內(nèi)存裝入AutoLISP,那么顯示以下信息:Insuffcientmemory-AutoLISPdisabled,直到有足夠的內(nèi)存后AutoCAD重新啟動(dòng)時(shí),AutoLISP所需要的堆棧區(qū)域占有內(nèi)存量。2.3AutoLISP的數(shù)據(jù)類型AutoLISP語(yǔ)言的數(shù)據(jù)類型和其他的高級(jí)編程語(yǔ)言十分的相似,但是它又有自己的特殊的數(shù)據(jù)類型,它主要包括:符號(hào)〔SYM〕、字符串〔STR〕、表〔及用戶定義的函數(shù)〕〔LIST〕、文件描述符〔FILE〕、AutoLISP的內(nèi)部函數(shù)〔SUBR〕、AutoCAD的選擇集〔PICKSET〕、AutoCAD的實(shí)體名〔ENAME〕和函數(shù)分頁(yè)表〔PAGETB〕。AutoLISP的前五種數(shù)據(jù)類型,前四種被成為原子〔ATOM〕,它主要包括數(shù)字原子、符號(hào)原子和串原子。而AutoLISP語(yǔ)言最根本的數(shù)據(jù)類型是原子和表。原子原子主要包括整數(shù)、實(shí)型數(shù)、符號(hào)和字符串。整數(shù)是由0、1、2……9、+、-等字符組成。實(shí)型數(shù)用雙精度浮點(diǎn)數(shù)表示,并且至少有14的精度,即是整數(shù)后面的小數(shù)點(diǎn)的個(gè)數(shù)。實(shí)型數(shù)的范圍是-1.797693×10308~1.797693×10308,從這個(gè)范圍來(lái)看,它的范圍十分的龐大,幾乎不會(huì)超界。符號(hào)〔symbol〕包括除“〔〞、“〕〞、“、〞、“.〞、“;〞之外的所有打印字符,它的長(zhǎng)度沒(méi)有任何限制,但是用戶使用時(shí)最好控制在6個(gè)以內(nèi),以免因占用多余的內(nèi)存,而造成運(yùn)行速度的降低,另外,在AutoLISP中,字符的大小寫(xiě)是不區(qū)分的,如:AubVTx-8-u@fx都是合法的。在AutoLISP中,所有字符都是有值的,所以每一個(gè)符號(hào)都是要賦予一定的值,一般用賦值函數(shù)來(lái)完成這個(gè)工作。字符串是指在一對(duì)雙引號(hào)中所包含的所有字符,如:“ABC〞“135”“blancebeam〞“〞字符串包括任何可打印的字符,當(dāng)然,在字符串中的字母的大小寫(xiě)以及空格的個(gè)數(shù)都是具有一定的意義的。此外,字符串對(duì)于長(zhǎng)度有一定的限制,一般來(lái)說(shuō)最多不能超過(guò)100個(gè)字符,超出這個(gè)界限,超出的字符都是無(wú)效的。如果字符串中沒(méi)有任何字符,那么作為空串處理,即“〞。表和點(diǎn)對(duì)1.表在autollisp語(yǔ)言中,表有兩種類型,即標(biāo)準(zhǔn)表和引用表。標(biāo)準(zhǔn)表:它是AutoLISP語(yǔ)言中的根本的構(gòu)成形式,AutoLISP程序就是由標(biāo)準(zhǔn)表構(gòu)成的。它可以用來(lái)處理函數(shù)的調(diào)用,其中第一個(gè)元素應(yīng)是系統(tǒng)定義的內(nèi)部函數(shù)或者是用戶定義的函數(shù),而其他的元素那么為該函數(shù)的參數(shù),引用表:這種表區(qū)別于標(biāo)準(zhǔn)表的不同就是它不作為函數(shù)調(diào)用,而是用來(lái)處理數(shù)據(jù)的,很容易想象的出,用它處理關(guān)于坐標(biāo)方面的數(shù)據(jù)十分簡(jiǎn)單。2.點(diǎn)對(duì)點(diǎn)對(duì)也是一種表,這個(gè)表中有且僅有兩個(gè)元素,它的書(shū)寫(xiě)格式要求十分嚴(yán)格,即兩個(gè)元素的中間為一個(gè)圓點(diǎn)“·〞,且圓點(diǎn)與元素中間必須用空格分開(kāi),如〔A·B〕就是一個(gè)點(diǎn)對(duì)的例子,這個(gè)點(diǎn)對(duì)中A、B與圓點(diǎn)均有空格隔開(kāi),其中第一個(gè)元素A為這個(gè)點(diǎn)對(duì)的左元素,理所當(dāng)然,第二個(gè)B即為其右元素。點(diǎn)對(duì)可以任意嵌套,只要嵌套時(shí)注意它的書(shū)寫(xiě)要求,那么不會(huì)出現(xiàn)錯(cuò)誤。點(diǎn)對(duì)常被用來(lái)構(gòu)造連接表。2.4AutoLISP程序的執(zhí)行有些AutoLISP程序十分簡(jiǎn)短,僅僅只有幾句語(yǔ)言組成,那么它就可以使用defun函數(shù)定義簡(jiǎn)單的用戶函數(shù)進(jìn)行運(yùn)算,同樣也可以在AutoCAD環(huán)境中的command:提示符下直接輸入命令即可,運(yùn)算的結(jié)果那么會(huì)直接在文本屏幕中顯示。對(duì)于AutoLISP程序,需要先在文本編輯器上進(jìn)行語(yǔ)言程序的編寫(xiě),編輯器可以任意選取,但是最好是使用AutoLISP自帶的編輯器進(jìn)行編寫(xiě),因?yàn)樗詭У木庉嬈鲗?duì)函數(shù)和變量會(huì)有不同的顯示顏色,方便檢查錯(cuò)誤。AutoLISP文件的加載一般說(shuō)來(lái),通過(guò)AutoLISP語(yǔ)言編輯的LISP文件,需要經(jīng)過(guò)加載才能夠進(jìn)行使用。加載AutoLISP文件有以下三種方法:1.命令行輸入加載方式當(dāng)回到AutoCAD環(huán)境下,用load函數(shù)進(jìn)行裝載就可以執(zhí)行。如果程序中沒(méi)有defun函數(shù),系統(tǒng)就會(huì)邊裝載邊運(yùn)行,假設(shè)有,裝載后只需在command:提示符下鍵入defun的函數(shù)即可運(yùn)行相對(duì)應(yīng)的函數(shù)。加載文件的格式為:Command:(load“驅(qū)動(dòng)器:\\路徑\\文件名〞)加載文件的格式為:Command:(load“驅(qū)動(dòng)器:\\路徑\\文件名〞)2.用對(duì)話框的方式加載首先在“工具〞欄的下拉菜單找到“AutoLISP〞選項(xiàng),然后在子菜單中選擇“加載〞選項(xiàng),對(duì)話框如圖2.2所示。圖2.2“加載/卸載應(yīng)用程序〞對(duì)話框然后選取需要加載的LISP文件,選擇加載。命令行可以看到如以下圖2-3所示的成功加載信息,如以下圖2.3所示。3.自動(dòng)加載方式在AutoCAD的工作目錄下有一個(gè)ACAD.LSP文件,它是當(dāng)系統(tǒng)啟動(dòng)時(shí)、新建文件、翻開(kāi)文件時(shí)自動(dòng)裝載的AutoLISP程序,用戶可以通過(guò)它實(shí)現(xiàn)程序自動(dòng)的加載。在使用時(shí),如果程序出現(xiàn)錯(cuò)誤,那么剩余的文件不會(huì)被繼續(xù)加載,并提示錯(cuò)誤,假設(shè)有局部函數(shù)調(diào)用成功,那么返回加載文件的最后那個(gè)表達(dá)式的值。運(yùn)行AutoLISP程序裝載完成后,我們就可以在命令行command:鍵入函數(shù)名即可執(zhí)行這個(gè)程序段,系統(tǒng)將執(zhí)行程序,運(yùn)行出結(jié)果。概括來(lái)說(shuō)AutoLISP的運(yùn)行過(guò)程為:首先,用戶編寫(xiě)相關(guān)語(yǔ)言程序,在此時(shí),系統(tǒng)會(huì)為用戶使用的變量和內(nèi)存分配內(nèi)存,當(dāng)用戶編寫(xiě)完程序之后,加載程序,如果程序正確,那么返回表達(dá)式的值,如果運(yùn)行錯(cuò)誤,那么停止程序的加載。裝載完后,用戶就可以使用AutoLISP語(yǔ)言中defun定義的函數(shù)了。3AutoLISP的函數(shù)AutoLISP函數(shù)就是在進(jìn)行AutoLISP語(yǔ)言編寫(xiě)時(shí),所用來(lái)計(jì)算問(wèn)題所需要的算法。AutoLISP的函數(shù)十分豐富,接下來(lái)介紹一些常用的函數(shù)。3.1數(shù)值函數(shù)計(jì)算函數(shù)中,最常用的包括加函數(shù)、減函數(shù)、乘函數(shù)、除函數(shù)、平方根函數(shù)和正負(fù)判斷函數(shù)。1.加函數(shù)+(+<num1><num2>……)即(+<數(shù)1><數(shù)2>……)本函數(shù)計(jì)算之后所返回的值就是所有的<數(shù)>的和。其中的數(shù)可以是整型數(shù)和實(shí)型數(shù)。如果所有的數(shù)都是整型數(shù),那么它的返回值也是一個(gè)整型數(shù);如果有其中的一個(gè)數(shù)是實(shí)型,那么它的返回值那么是一個(gè)實(shí)型數(shù);如果只提供一個(gè)數(shù),系統(tǒng)將會(huì)默認(rèn)是與0相加,返回與0相加的結(jié)果;如果沒(méi)有提供一個(gè)數(shù),那么系統(tǒng)返回值為0。例如:命令:(+123.0)6.02.減函數(shù)–(-<num1><num2>……)即(-<數(shù)1><數(shù)2>……)此函數(shù)是用第一個(gè)數(shù)減去以后所有數(shù)的和,并返回所求值的結(jié)果。假設(shè)只給一個(gè)數(shù)目那么是返回0減去這個(gè)數(shù)的結(jié)果;假設(shè)不提供任何數(shù)目,那么返回0;此函數(shù)對(duì)函數(shù)中數(shù)的類型的規(guī)那么與加函數(shù)是相同的。例如:命令:(-531.0)1.03.乘函數(shù)*(*<num1><num2>……)即(*<數(shù)1><數(shù)2>……)本函數(shù)返回所有<數(shù)>的乘積,其返回值同樣取決于這些數(shù)值的類型,如果函數(shù)只提供了一個(gè)數(shù),那么不同加減函數(shù)的是,函數(shù)返回值是這個(gè)數(shù)乘以1所得到的值,假設(shè)不提供數(shù),那么是返回0.例如:命令:(*1234.0)24.04.除函數(shù)/(/<num1><num2>……)即(/<數(shù)1><數(shù)2>……)本函數(shù)返回值那么是第一個(gè)數(shù)除以第二個(gè)數(shù),依次除以第三……的數(shù)的值,如果只提供一個(gè)數(shù),那么是返回除以1所得到的值,如果沒(méi)有提供任何數(shù)目,那么返回0。這個(gè)函數(shù)返回值的類型同樣取決于各個(gè)數(shù)的類型,如果其中一個(gè)數(shù)是實(shí)型,那么它的返回值那么也是實(shí)型。例如:命令:(/9(/2.03))13.55.平方根函數(shù)sqrt(sqrt<num>)該函數(shù)返回的值是<num>的平方根,其數(shù)據(jù)類型總為實(shí)型數(shù)值,函數(shù)的使用中,要注意這個(gè)數(shù)的取值范圍。例如:命令:(sqrt(/42.0))1.414213.2邏輯運(yùn)算函數(shù)邏輯運(yùn)算函數(shù),是用來(lái)進(jìn)行邏輯關(guān)系的運(yùn)算,它主要包括邏輯與、邏輯或和邏輯非的運(yùn)算。1.邏輯與AND(and<expr>……)這個(gè)函數(shù)的返回值是表達(dá)式邏輯與的運(yùn)算結(jié)果,如果這個(gè)函數(shù)運(yùn)算每一個(gè)的表達(dá)式的結(jié)果都是nil,那么這個(gè)函數(shù)將停止運(yùn)算,并返回nil,否那么返回T。例如:命令:(setqa103bnilc“string〞)命令:(and1.4ab)nil2.邏輯或OR(or<expr>……)這個(gè)函數(shù)所返回的運(yùn)算結(jié)果值是返回表達(dá)式邏輯或〔OR〕的運(yùn)算結(jié)果,or函數(shù)運(yùn)算表達(dá)式是從左往右一次運(yùn)算,找到一個(gè)非nil的表達(dá)式,一旦找到,就會(huì)停止運(yùn)算,并返回T,如果表達(dá)式中沒(méi)有一個(gè)非nil的表達(dá)式,那么函數(shù)會(huì)返回or。例如:命令:(ornilT)T3.邏輯非NOT(not<expr>……)這個(gè)函數(shù)的是對(duì)表達(dá)式進(jìn)行邏輯非(NOT)的運(yùn)算,如果表達(dá)式的值為nil,那么返回值為T(mén);否那么,那么返回nil。3.3三角函數(shù)三角函數(shù)主要是用來(lái)計(jì)算數(shù)學(xué)中角度的問(wèn)題,AutoLISP中的三角函數(shù)主要有正弦函數(shù)、余弦函數(shù)和反正切函數(shù)。1.正弦函數(shù)sin(sin<angle>)該函數(shù)運(yùn)行的結(jié)果返回值是為<angle>的正切值,其中<angle>是用弧度制表示的角度。例如:命令:(sin1.0)0.814712.余弦函數(shù)cos(cos<angle>)這個(gè)函數(shù)的返回值是<angle>的余弦值,其中<angle>為弧度制。例如:命令:(cos1)0.5403023.反正切函數(shù)atan(atan[<num1>][<num2>])該函數(shù)返回值是一個(gè)數(shù)的反正切值,且是以弧度制表示,<num1>和<num2>也可以作為坐標(biāo)系內(nèi)的坐標(biāo)值,從而判斷取值,所返回的角度范圍是-pi至+pi之間的弧度。例如:命令:(atan3.02.0)0.9827943.4字符串處理函數(shù)在工程繪圖中,文字注記十分重要。在處理大量的文本數(shù)字注記時(shí),如果單純使用AutoCAD自身的編輯功能,就會(huì)十分繁瑣。因此在AutoLISP中,系統(tǒng)提供相關(guān)的字符串處理函數(shù),其中最常用的幾個(gè)字符串處理函數(shù)是求字符串長(zhǎng)度函數(shù)和字符串連接函數(shù)等。1.求字符串長(zhǎng)度函數(shù)strlen(stringlength)(strlen[(string)]……)這個(gè)函數(shù)是用來(lái)求一個(gè)字符串的長(zhǎng)度,也就是求字符的個(gè)數(shù),并把這個(gè)值作為函數(shù)值返回。例如:命令:(stelen“surveying〞“and〞“mapping〞)192.字符串連接函數(shù)strcat(stringcatenation)(strcat<string1>[<string2>]……)這個(gè)函數(shù)首先是把多個(gè)變?cè)峁┑淖址B接在一起,然后把連接而成的新的字符串作為函數(shù)返回值返回。例如:命令:(strcat“Auto〞“LISP〞)“AutoLISP〞3.5條件與循環(huán)函數(shù)為簡(jiǎn)化程序,循環(huán)結(jié)構(gòu)必不可少,而對(duì)于邏輯判斷,條件運(yùn)算又是必備手段。所以程序結(jié)構(gòu)中分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)尤為重要,那么條件函數(shù)和循環(huán)函數(shù)的地位就更是不言而喻了。1.條件函數(shù)條件函數(shù)通常用來(lái)測(cè)試表達(dá)式的值,然后根據(jù)測(cè)試的結(jié)果進(jìn)行相應(yīng)的運(yùn)算,AutoLISP的條件函數(shù)是if和cond。1.單一條件的兩分支結(jié)構(gòu)if(if<testexpr><thenexpr>[<elsexpr>])首先函數(shù)先對(duì)<testexpr>進(jìn)行判斷,如果求值為非空,那么對(duì)<thenexpr>進(jìn)行求值并返回,否那么,那么是對(duì)<elsexpr>進(jìn)行求值。例如:命令:(if(=2(+11))“YES!〞“no.〞)“YES!〞2.多分支結(jié)構(gòu)cond(cond(<test1><result1>……)……)這個(gè)函數(shù)是AutoLISP語(yǔ)言的一個(gè)重要的條件函數(shù),cond函數(shù)的求值是由上至下,逐個(gè)測(cè)試每個(gè)分支,如果測(cè)試的結(jié)果是一個(gè)非nil的值,那么運(yùn)算測(cè)試語(yǔ)句后面的結(jié)果語(yǔ)句,那么其他的分支不在執(zhí)行和運(yùn)算。2.循環(huán)函數(shù)循環(huán)結(jié)構(gòu)在AutoLISP語(yǔ)言中應(yīng)用十分廣泛,它的運(yùn)算思路就是測(cè)試—求值—測(cè)試,直到滿足條件終止循環(huán)為止。在AutoLISP語(yǔ)言中運(yùn)用最廣泛的循環(huán)函數(shù)是while函數(shù)。while函數(shù)(while<testexpr><expr>…)While函數(shù)對(duì)一個(gè)測(cè)試表達(dá)式進(jìn)行求值,如果它的值是非nil,那么計(jì)算其他表達(dá)式,并重復(fù)這個(gè)計(jì)算過(guò)程,直到它的值是非nil。4AutoLISP與CASS之間的聯(lián)系CASS軟件是現(xiàn)行測(cè)量測(cè)繪專業(yè)使用最多的一個(gè)軟件之一,它是由南方測(cè)繪儀器出產(chǎn)的,它是以AutoCAD為平臺(tái)根底進(jìn)行二次開(kāi)發(fā)而出的,效勞于測(cè)繪專業(yè)的地形地籍?dāng)?shù)字化成圖的專業(yè)軟件,使用CASS時(shí)不僅可以使用AutoCAD各種指令功能,同時(shí)它又發(fā)揮著自己獨(dú)特的專業(yè)效勞功能。4.1AutoCAD與CASS之間的聯(lián)系CASS軟件是基于AutoCAD軟件的二次開(kāi)發(fā)的專業(yè)軟件,所以在安裝CASS之前,必須安裝AutoCAD2002后才能進(jìn)行。在平安安裝AutoCAD軟件后,能夠正常使用,這時(shí)才可以繼續(xù)安裝CASS。從這點(diǎn)就可以看出AutoCAD與CASS的之間的聯(lián)系是多么的緊密。CASS是運(yùn)用AutoCAD軟件的技術(shù)進(jìn)行研發(fā)而出的數(shù)字化成圖軟件,因此AutoCAD的功能在CASS中同樣能夠得到使用,AutoCAD的菜單和工具條的依舊可以繼續(xù)使用,這一點(diǎn)就為CASS這個(gè)數(shù)字化成圖軟件,實(shí)現(xiàn)數(shù)字化成圖功能提供了強(qiáng)大的繪圖根底。雖然CASS出自于AutoCAD,但是它同樣具有其獨(dú)特的特色,所謂“青出于藍(lán)而勝于藍(lán)〞,在CASS與AutoCAD中得到充分的表達(dá)。CASS是專門(mén)為測(cè)繪專業(yè)開(kāi)發(fā)的軟件,它適用于測(cè)繪專業(yè)的各種成圖繪圖的要求,比方,測(cè)繪專業(yè)的坐標(biāo)系統(tǒng)和普通的坐標(biāo)系統(tǒng)不同,在使用CASS繪制地形圖之前,首先要進(jìn)行坐標(biāo)系的轉(zhuǎn)換。測(cè)繪專業(yè)很多繪制地形圖地籍圖的工作都是首先到實(shí)地進(jìn)行野外采集點(diǎn)位的坐標(biāo)數(shù)據(jù),然后根據(jù)這些點(diǎn)位的三維坐標(biāo)進(jìn)行地形圖的繪制,繪制出等高線圖,這一點(diǎn)和普通的AutoCAD繪制平面圖不同,因?yàn)樗鼌⒓拥母叱?,它要求是在三維坐標(biāo)的根底上,繪制等高線。此外,由于地物的種類繁多,而相應(yīng)的表示符合也是多種多樣的,如果單純用AutoCAD添加這些標(biāo)注,那將是一個(gè)十分繁瑣而冗長(zhǎng)的工作。而CASS那么恰恰實(shí)現(xiàn)了這些功能,它包含大量的測(cè)繪專業(yè)要求的專業(yè)表示符號(hào),用來(lái)注記相關(guān)的地物,使得繪制地形圖注記這個(gè)工作變得簡(jiǎn)單。此外,CASS同樣在AutoCAD的繪圖根底上,更加完善繪制專業(yè)地物的繪圖功能,這樣不僅可以實(shí)現(xiàn)測(cè)繪專業(yè)的繪圖功能,同時(shí)為實(shí)現(xiàn)專業(yè)地物的繪制提供了方便。4.2AutoLISP與CASS之間的關(guān)系上節(jié)說(shuō)到AutoCAD與CASS之間的聯(lián)系,后者是在前者之上開(kāi)發(fā)出來(lái)的軟件。而AutoLISP與AutoCAD之間的關(guān)系與他們二者的關(guān)系有些相同之處,又有不同之點(diǎn)。首先AutoLISP是AutoCAD用來(lái)進(jìn)行二次開(kāi)發(fā)的工具,換言之,可以使用AutoLISP進(jìn)行AutoCAD的二次開(kāi)發(fā),而CASS是基于AutoCAD平臺(tái)進(jìn)行的二次開(kāi)發(fā)。所以從這一點(diǎn)上來(lái)說(shuō)是相同的,也就是二者都是基于AutoCAD平臺(tái)的,不同之處就在于AutoLISP是用來(lái)進(jìn)行二次開(kāi)發(fā)的,而CASS那么是開(kāi)發(fā)出來(lái)的成果軟件,所以二者的相同點(diǎn)是都是基于AutoCAD平臺(tái),不同就是AutoLISP是用來(lái)進(jìn)行二次開(kāi)發(fā)的,而CASS那么是已經(jīng)開(kāi)發(fā)出來(lái)的軟件。既然二者都是都是基于AutoCAD平臺(tái)的,那么是否可以使用AutoLISP開(kāi)發(fā)出關(guān)于CASS軟件相關(guān)應(yīng)用的功能呢?原理上,可以使用AutoLISP開(kāi)發(fā)出基于AutoCAD平臺(tái)的關(guān)于繪圖和計(jì)算的功能,是否可以考慮把這些開(kāi)發(fā)功能應(yīng)用于CASS軟件中,即與CASS軟件息息相關(guān)的測(cè)繪專業(yè)的相關(guān)專業(yè)應(yīng)用上,比方進(jìn)行一些復(fù)雜的運(yùn)算,又或者進(jìn)行圖像的繪制。就著這個(gè)問(wèn)題,我們首先看幾個(gè)關(guān)于AutoLISP程序的例題。【例4-1】編一個(gè)程序,在一個(gè)文件中寫(xiě)入四個(gè)點(diǎn)的坐標(biāo),并用這些點(diǎn)位左邊繪制一個(gè)四邊形。;用戶自己定于一個(gè)函數(shù):(defunc:四邊形();新建一個(gè)儲(chǔ)存數(shù)據(jù)的文件:(setqfi(getstring"\n輸入文件的名字:"));翻開(kāi)這個(gè)文件,用于操作:(setqfile(openfi"w"));提示輸入點(diǎn)數(shù)據(jù):(prompt"在文件里輸入四個(gè)點(diǎn):");在這個(gè)文件中,寫(xiě)入數(shù)據(jù)點(diǎn)位:(setqa(getpoint"\n輸入第一個(gè)點(diǎn)坐標(biāo):"))(princafile)(setqb(getpoint"\n輸入第二個(gè)點(diǎn)坐標(biāo):"))(princbfile)(setqc(getpoint"\n輸入第三個(gè)點(diǎn)坐標(biāo):"))(princcfile)(setqd(getpoint"\n輸入第四個(gè)點(diǎn)坐標(biāo):"))(princdfile);關(guān)閉這個(gè)數(shù)據(jù)文件:(closefile);把這個(gè)點(diǎn)用直線連接起來(lái):(command"line"abcd"c"))加載程序,運(yùn)行結(jié)果如以下圖4.1:圖4.1運(yùn)行過(guò)程和運(yùn)行結(jié)果從這個(gè)例子可以看出用AutoLISP編程在AutoCAD平臺(tái)實(shí)現(xiàn)圖形的繪制是可行的,由這個(gè)啟發(fā),我們可以嘗試通過(guò)AutoLISP編程進(jìn)行CASS軟件要求的進(jìn)行一些地物的繪制,在下一章將進(jìn)行這方面的嘗試?!纠?-2】編程求方程ycos2x+x/sin(x-2)+xyz的解,其中x=2,y=6,z=8(defunc:復(fù)雜計(jì)算(/xyzs)(setqx4)(setqy6)(setqz8)(setqs(+(*y(cos(*x2)))(/x(sin(-x2)))(*xyz)))(princs)(princ))加載程序,運(yùn)行結(jié)果如以下圖4.2:圖4.2復(fù)雜計(jì)算的運(yùn)行結(jié)果從這個(gè)例題中可以看出,使用AutoLISP編程可以進(jìn)行一些復(fù)雜運(yùn)算的求解。大家都知道,在測(cè)繪專業(yè),有很多復(fù)雜的公式求解運(yùn)算,如果把這些公式用程序編出來(lái),配合CASS軟件的使用,可以使一些工作的計(jì)算得到簡(jiǎn)化,大大的節(jié)省了人力和物力。在下一章節(jié),將會(huì)以這個(gè)問(wèn)題為主線,編寫(xiě)一些復(fù)雜公式的計(jì)算程序進(jìn)行相關(guān)運(yùn)算,從而去研究AutoLISP在CASS中的應(yīng)用。5AutoLISP在CASS中的應(yīng)用在上一章中,從一些簡(jiǎn)單的例子中,我們看到了AutoLISP編程繪制圖形和進(jìn)行復(fù)雜計(jì)算的強(qiáng)大能力,在這一章中,通過(guò)一些例子,我們?cè)俅紊钊氲奶接慉utoLISP在CASS中的應(yīng)用。5.1編寫(xiě)AutoLISP程序進(jìn)行測(cè)邊交會(huì)的計(jì)算從待定點(diǎn)P向兩個(gè)點(diǎn)A和B測(cè)量邊長(zhǎng)AP(b)和BP(a),如以下圖5.1,然后計(jì)算P點(diǎn)的坐標(biāo),稱為側(cè)邊交會(huì),又稱為距離交會(huì)。具體的解題思路如下:圖5.1側(cè)邊交會(huì)首先從P點(diǎn)作AB邊垂線,交于D點(diǎn),得輔助線段AD〔e〕,PD〔f〕,那么:,(5-1-1)并計(jì)算輔助線段長(zhǎng)度:;(5-1-2)然后計(jì)算AP、AD、DP點(diǎn)間的坐標(biāo)增量關(guān)系:;(5-1-3);(5-1-4);(5-1-5)因此,A點(diǎn)到P點(diǎn)的坐標(biāo)增量:;(5-1-6)直接計(jì)算待定點(diǎn)P的坐標(biāo)公式為:;(5-1-7)求得P點(diǎn)的坐標(biāo),可以用以下公式進(jìn)行檢核:;(5-1-8)編寫(xiě)程序代碼如下:;用戶定義函數(shù)和變量:(defunc:cb(/dxdyxayaxbybabcefd1d2d3xpypxapyapxbpybpxd1xd2p1p2p3);系統(tǒng)變量,用來(lái)顯示繪制圖形的屏幕:(graphscr);從命令行輸入數(shù)據(jù):(setqxa(getreal"\n輸入A點(diǎn)的x坐標(biāo):"))(setqya(getreal"\n輸入A點(diǎn)的y坐標(biāo):"))(setqxb(getreal"\n輸入B點(diǎn)的x坐標(biāo):"))(setqyb(getreal"\n輸入B點(diǎn)的y坐標(biāo):"))(setqd2(getreal"\n輸入A到P的距離:"))(setqd1(getreal"\n輸入B到P的距離:"));編寫(xiě)語(yǔ)言進(jìn)行公式的運(yùn)算求解:(setqdx(-xbxa))(setqdy(-ybya))(setqd3(sqrt(+(*dxdx)(*dydy))))(setqc(atandydx))(setqa(sinc))(setqb(cosc))(setqe(/(-(+(*d2d2)(*d3d3))(*d1d1))(*2d3)))(setqf(sqrt(-(*d2d2)(*ee))))(setqxp(+xa(+(*eb)(*fa))))(setqyp(+ya(-(*ea)(*fb))))(setqxap(-xpxa))(setqyap(-ypya))(setqxbp(-xpxb))(setqybp(-ypyb))(setqxd1(sqrt(+(*xapxap)(*yapyap))))(setqxd2(sqrt(+(*xbpxbp)(*ybpybp))));根據(jù)得到的數(shù)據(jù)坐標(biāo)點(diǎn)進(jìn)行圖形的繪制:(setqp1(listyaxa))(setqp2(listybxb))(setqp3(listypxp))(command"line"p1p2p3"c")(command"text""m"p1150"A")(command"text"p2150"B")(command"text"P3150"P");輸出每項(xiàng)的計(jì)算的結(jié)果:(setqc(angtosc04))(princ"AB邊的坐標(biāo)方位角:α=")(princc)(princ(strcat"\n輔助線段:e="(rtose)))(princ(strcat";f="(rtosf)))(princ(strcat"\nA點(diǎn)至P的坐標(biāo)增量:ΔxAP="(rtosxap)))(princ(strcat";ΔyAP="(rtosyap)))(princ(strcat"\nB點(diǎn)至P的坐標(biāo)增量:ΔxBP="(rtosxbp)))(princ(strcat";ΔyBP="(rtosybp)))(princ(strcat"\n待定點(diǎn)P的坐標(biāo):xp="(rtosxp)))(princ(strcat";yp="(rtosyp)))(princ(strcat"\n檢核計(jì)算:a="(rtosxd1)))(princ(strcat";b="(rtosxd2)))(princ))程序加載及運(yùn)行結(jié)果如以下圖5.2:圖5.2程序運(yùn)行過(guò)程、輸出結(jié)果和圖形繪制這個(gè)程序用于計(jì)算測(cè)邊交會(huì),十分方便,只需要輸入需要的數(shù)據(jù)內(nèi)容,程序便可計(jì)算出相應(yīng)的結(jié)果,并且可以輸出計(jì)算過(guò)程中的每一項(xiàng)的計(jì)算結(jié)果,在最后,同樣也輸出了檢核計(jì)算的內(nèi)容。5.2編寫(xiě)AutoLISP程序進(jìn)行測(cè)角交會(huì)的計(jì)算測(cè)角交會(huì)就是從相鄰的兩個(gè)點(diǎn)A、B向待定點(diǎn)P觀測(cè)水平角α和β,如以下圖5.3,然后計(jì)算待定點(diǎn)P的坐標(biāo)。具體的解題思路如下,圖5.3測(cè)角交會(huì)首先進(jìn)行坐標(biāo)反算,根據(jù)點(diǎn)的坐標(biāo),反算兩點(diǎn)邊長(zhǎng)c和方位角αAB:;(5-2-1)然后,用三角正弦定律計(jì)算點(diǎn)到待定點(diǎn)的邊長(zhǎng)a,b:;(5-2-2)按下式計(jì)算待定邊的方位角:;(5-2-3)最后根據(jù)點(diǎn)至待定點(diǎn)的邊長(zhǎng)和方位角,按坐標(biāo)正算,分別從A、B計(jì)算待定點(diǎn)P的坐標(biāo),兩次算的坐標(biāo)應(yīng)該相等,可以作為檢核:;(5-2-4);(5-2-5)如果將上面的按測(cè)角交會(huì)法計(jì)算待定點(diǎn)坐標(biāo)的一系列公式,經(jīng)過(guò)化算,可得到直接計(jì)算待定點(diǎn)坐標(biāo)的一種公式:(5-2-6)編寫(xiě)程序代碼如下:;用戶定義函數(shù)和變量:(defunc:cj(/x1y1x2y2a1a(graphscr);暫停程序,使用戶從命令行輸入數(shù)據(jù):(setqx1(getreal"\n輸入第A點(diǎn)的x坐標(biāo):"))(setqy1(getreal"\n輸入第A點(diǎn)的y坐標(biāo):"))(setqx2(getreal"\n輸入第B點(diǎn)的x坐標(biāo):"))(setqy2(getreal"\n輸入第B點(diǎn)的y坐標(biāo):"))(setqa1(getorient"\n輸入點(diǎn)A向待定點(diǎn)P觀測(cè)角度α:"))(setqa2(getorient"\n輸入點(diǎn)A向待定點(diǎn)P觀測(cè)角度β:"));相關(guān)公式計(jì)算:(setqa1(/(sina1)(cosa1)))(setqa2(/(sina2)(cosa2)))(setqa3(+a1a2))(setqa4(*a1a2))(setqxp(/(+(+(*x1a1)(*x2a2))(*(-y2y1)a4))a3))(setqyp(/(+(+(*y1a1)(*y2a2))(*(-x1x2)a4))a3));根據(jù)計(jì)算坐標(biāo)進(jìn)行圖形的繪制:(setqp1(listy1x1))(setqp2(listy2x2))(setqp3(listypxp))(command"line"p1p2p3"c")(command"text""m"p1150"A")(command"text"p2150"B")(command"text"P3150"P");輸出運(yùn)算的結(jié)果 (princ(strcat"tanα×tanβ="(rtosa4)))(princ(strcat"\ntanα+tanβ="(rtosa3))) (princ(strcat"\n待求點(diǎn)p的坐標(biāo):\nxp="(rtosxp))) (princ(strcat",yp="(rtosyp))) (princ))程序運(yùn)行過(guò)程及加載結(jié)果和圖形輸入如以下圖5.4:圖5.4程序運(yùn)行過(guò)程及加載結(jié)果和圖形輸出這個(gè)程序可以用來(lái)計(jì)算測(cè)角交會(huì),可是在計(jì)算過(guò)程中角度的輸入和使用十分的不方便,因?yàn)闇y(cè)繪專業(yè)要求的角度需要精確到秒的單位,在下一節(jié)中,將詳細(xì)介紹如何處理度分秒制的角度。5.3關(guān)于角度化成十進(jìn)制并輸出在測(cè)繪專業(yè)中,角度的使用十分頻繁。為使精度到達(dá)一定的要求,角度會(huì)用秒的單位,所以在測(cè)繪專業(yè)的各種計(jì)算中,在有角度的相關(guān)計(jì)算時(shí),度分秒的表示的角度會(huì)一直存在,而在AutoCAD中,無(wú)法輸入度分秒表示的角度,并且經(jīng)過(guò)一定的三角函數(shù)運(yùn)算后,角度會(huì)化成弧度。如果我們使用AutoLISP編程計(jì)算相關(guān)的公式時(shí),輸出的運(yùn)算結(jié)果是弧度制,而我們希望看到的是十進(jìn)制表示或者度分秒表示。下面我們就以一個(gè)例子說(shuō)明如何用程序進(jìn)行角度化成十進(jìn)制用于計(jì)算,而在輸出時(shí)又如何化成度分秒或者十進(jìn)制輸出?!纠烤幰粋€(gè)程序把15°36′18″化成十進(jìn)制用于計(jì)算它的余弦值并輸出。具體的編程思路:1.通過(guò)度分秒數(shù)分別輸入進(jìn)行化算成十進(jìn)制,2.轉(zhuǎn)換成弧度制用來(lái)計(jì)算,3.輸出結(jié)果具體的編寫(xiě)程序代碼如下:;用戶定義函數(shù)變量:(defunc:jdhs(/abc);分別輸入角度的度分秒:(setqa(getreal"角度的秒數(shù):"))(setqb(getreal"角度的分?jǐn)?shù):"))(setqc(getreal"角度的度數(shù):"));把角度的度分秒制換算成十進(jìn)制:(setqa(/a3600))(setqb(/b60))(setqa(+c(+ab)));把角度轉(zhuǎn)換成弧度制(setqa(*pi(/a180)));計(jì)算它的余弦值:(setqz(cosa));根據(jù)要求,用angtos函數(shù)將角度轉(zhuǎn)換成相應(yīng)單位表示的角度:(setqx(angtosa04))(setqy(angtosa14));輸出結(jié)果:(princ(strcat"十進(jìn)制的角度:a="x))(princ(strcat"\n度分秒制的角度:a="y))(princ(strcat"\n余弦值cosα="(rtosz)))(princ))程序加載及運(yùn)行結(jié)果如以下圖5.5所示:圖5.5程序運(yùn)行過(guò)程和加載結(jié)果這個(gè)程序用于角度換算弧度十分簡(jiǎn)便,如果下次再進(jìn)行相關(guān)的運(yùn)算時(shí),只需要調(diào)用這個(gè)結(jié)果,即可得到結(jié)果,不需要每次都要進(jìn)行編寫(xiě),在下一章節(jié)的例子中,將會(huì)調(diào)用這個(gè)函數(shù)中換算弧度的那段代碼函數(shù)。5.4坐標(biāo)換算在測(cè)繪專業(yè)中,地面上的同一個(gè)點(diǎn)的在不同的坐標(biāo)系統(tǒng)中的值也不相同,但是在這些坐標(biāo)系統(tǒng)中,它們是可以根據(jù)相應(yīng)的數(shù)學(xué)關(guān)系進(jìn)行換算的。接下來(lái),以城市坐標(biāo)系與建筑坐標(biāo)系之間的轉(zhuǎn)換關(guān)系為例,使用AutoLISP進(jìn)行編寫(xiě)程序完成二者之間的相互轉(zhuǎn)換關(guān)系?!纠?】建筑坐標(biāo)系下的原點(diǎn)O′在城市坐標(biāo)系中的坐標(biāo)為:xO=528.456m,yO=496.332m,建筑坐標(biāo)系x′在城市坐標(biāo)系中的方位角α=19°56′18″,將A(600.000,200.000),C(600.000,800.000),D(600.000,1300.000)轉(zhuǎn)換成城市坐標(biāo),如以下圖5.6所示:圖5.6城市坐標(biāo)系與建筑坐標(biāo)系換算解題思路:建筑坐標(biāo)系的原點(diǎn)在城市坐標(biāo)系下的坐標(biāo)值(xO,yO),,和建筑坐標(biāo)系的縱軸在城市坐標(biāo)系下的方位角α,設(shè)P點(diǎn)的建筑坐標(biāo)系為〔x′P,y′P〕,那么可以根據(jù)下面的公式進(jìn)行換算城市坐標(biāo)〔xP,yP〕:;程序代碼如下:;定義角度換算至十分制的調(diào)用函數(shù)(defuncc(abc/d)(setqa(getreal"角度的秒數(shù):"))(setqb(getreal"角度的分?jǐn)?shù):"))(setqc(getreal"角度的度數(shù):"))(setqa(/a3600))(setqb(/b60))(setqd(+c(+ab))));定義函數(shù)變量(defunc:建筑坐標(biāo)系轉(zhuǎn)換城市坐標(biāo)系(/xyzabxpypijx0y0);調(diào)用角度換算函數(shù):(setqz(ccxyz));輸入要轉(zhuǎn)換的坐標(biāo)個(gè)數(shù):(setqi(getreal"\n輸入要轉(zhuǎn)換坐標(biāo)點(diǎn)的個(gè)數(shù):"));輸入數(shù)據(jù):(setqx0(getreal"\n輸入建筑坐標(biāo)系原點(diǎn)0'x坐標(biāo):"))(setqy0(getreal"\n輸入建筑坐標(biāo)系原點(diǎn)0'y坐標(biāo):"))(setqj0);進(jìn)行相關(guān)的角度計(jì)算:(setqz(*pi(/z180)));把相關(guān)角度的運(yùn)算值賦值,以為接下來(lái)的計(jì)算使用,同時(shí)方便后來(lái)的結(jié)果輸出:(setqa(cosz))(setqb(sinz));使用循環(huán)計(jì)算每個(gè)點(diǎn)的換算坐標(biāo):(while(<ji);輸入要轉(zhuǎn)換坐標(biāo)的建筑坐標(biāo):(setqx1(getreal"輸入建筑坐標(biāo)的x坐標(biāo):"))(setqy1(getreal"輸入建筑坐標(biāo)的y坐標(biāo):"));進(jìn)行相關(guān)的計(jì)算:(setqxp(+x0(-(*x1a)(*y1b))))(setqyp(+y0(+(*x1b)(*y1a))));輸出轉(zhuǎn)換后的城市坐標(biāo)數(shù)據(jù):(princ(strcat"\n轉(zhuǎn)換后的城市坐標(biāo)系坐標(biāo):x="(rtosxp)))(princ(strcat";y="(rtosyp)"\n"));使循環(huán)繼續(xù),為下一點(diǎn)的計(jì)算做準(zhǔn)備:(setqj(+1j)));輸出計(jì)算過(guò)程的關(guān)于角度運(yùn)算的相關(guān)值:(princ(strcat"其實(shí)方位角的余弦值cosα="(rtosa)))(princ(strcat"其實(shí)方位角的余弦值sinα="(rtosb)))(princ))程序運(yùn)行過(guò)程和加載結(jié)果如下如圖5.7所示:圖5.7程序加載過(guò)程和運(yùn)行結(jié)果在這個(gè)程序中使用了循環(huán),一個(gè)方面是使得程序的屢次循環(huán),可以方便工作的進(jìn)行,另外一個(gè)方面,使用循環(huán)記住要轉(zhuǎn)換的坐標(biāo)點(diǎn)的個(gè)數(shù),以免由于數(shù)據(jù)量過(guò)大造成錯(cuò)誤,方便檢查?!纠?】根據(jù)上例的數(shù)據(jù),進(jìn)行坐標(biāo)點(diǎn)從城市坐標(biāo)系到建筑坐標(biāo)系的轉(zhuǎn)換。解題思路:根據(jù)上例中提供的數(shù)據(jù),按以下公式:;進(jìn)行計(jì)算,把城市坐標(biāo)系的點(diǎn)化成至建筑坐標(biāo)系。在本例中,不再使用循環(huán),上例中已經(jīng)詳細(xì)闡述,本例單純只去計(jì)算一個(gè)坐標(biāo)點(diǎn)的轉(zhuǎn)換,不再贅述循環(huán)計(jì)算的相關(guān)內(nèi)容。程序代碼如下:;定義角度換算至十分制的調(diào)用函數(shù)(defuncc(abc/d);分別輸入分秒度數(shù):(setqa(getreal"角度的秒數(shù):"))(setqb(getreal"角度的分?jǐn)?shù):"))(setqc(getreal"角度的度數(shù):"));化成十進(jìn)制(setqa(/a3600))(setqb(/b60))(setqd(+c(+ab))));定義函數(shù)變量(defunc:cj(/xyzabxpypijx0y0);調(diào)用角度換算函數(shù):(setqz(ccxyz));輸入數(shù)據(jù):(setqx0(getreal"\n輸入建筑坐標(biāo)系原點(diǎn)0'x坐標(biāo):"))(setqy0(getreal"\n輸入建筑坐標(biāo)系原點(diǎn)0'y坐標(biāo):"));進(jìn)行相關(guān)的角度計(jì)算:(setqz(*pi(/z180)))(setqa(cosz))(setqb(sinz));輸入要轉(zhuǎn)換坐標(biāo)的城市坐標(biāo):(setqx1(getreal"輸入城市坐標(biāo)的x坐標(biāo):"))(setqy1(getreal"輸入城市坐標(biāo)的y坐標(biāo):"));行相關(guān)的計(jì)算:(setqxp(+(*a(-x1x0))(*b(-y1y0))))(setqyp(-(*a(-y1y0))(*b(-x1x0))));輸出轉(zhuǎn)換后的建筑坐標(biāo)數(shù)據(jù):(princ(strcat"\n轉(zhuǎn)換后的建筑坐標(biāo)系坐標(biāo):x="(rtosxp)))(princ(strcat";y="(rtosyp)"\n"));輸出計(jì)算過(guò)程的關(guān)于角度運(yùn)算的相關(guān)值:(princ(strcat"其實(shí)方位角的余弦值cosα="(rtosa)))(princ(strcat"其實(shí)方位角的余弦值sinα="(rtosb)))(princ))程序加載及運(yùn)行結(jié)果如以下圖5.8所示:圖5.8程序運(yùn)行過(guò)程及輸出的結(jié)果上述兩個(gè)例題詳細(xì)介紹了兩個(gè)坐標(biāo)系坐標(biāo)點(diǎn)的相互轉(zhuǎn)化,使用這兩個(gè)程序進(jìn)行相關(guān)的換算時(shí),可以準(zhǔn)確無(wú)誤的進(jìn)行大量的數(shù)據(jù)處理,節(jié)省大量的人力物力。5.5地物繪制在測(cè)繪專業(yè)中,測(cè)繪地形是最常做的工作,而測(cè)繪地形的結(jié)果不僅僅只是大量數(shù)據(jù)的采集,除此之外,還要把這些數(shù)據(jù)結(jié)果以圖形的形式輸出來(lái),就是繪制成等高線地形圖。而在繪制地形圖的時(shí)候,會(huì)有很多地物,大量的數(shù)據(jù)造成圖形的繪制成為一個(gè)非常繁重的工作,如果可以編寫(xiě)程序根據(jù)的坐標(biāo)數(shù)據(jù)進(jìn)行地物的自動(dòng)繪制,將會(huì)大大提高相關(guān)工作的工作效率。在前面已經(jīng)介紹了AutoCAD具有強(qiáng)大的繪制圖形的功能,如果使用AutoLISP語(yǔ)言編寫(xiě)相關(guān)代碼完成地物的繪制,其意義是不言而喻的。但是如何處理數(shù)據(jù),如何編寫(xiě)程序才能完成這項(xiàng)工作呢?下面先介紹下相關(guān)的編寫(xiě)程序的思路和解決方法。AutoLISP可以直接使用函數(shù)調(diào)用AutoCAD系統(tǒng)繪圖功能進(jìn)行點(diǎn)的連接,我們可以嘗試使用這一功能把測(cè)量外業(yè)采集的數(shù)據(jù)用直線連接起來(lái),這樣就可以完成地物的繪制。如果地物比擬復(fù)雜,點(diǎn)位比擬多,如果采用循環(huán)完成者一工作就會(huì)十分簡(jiǎn)便,按照這個(gè)思路,接下來(lái)我們將編寫(xiě)程序代碼進(jìn)行等高線的繪制?!纠康匚稂c(diǎn)的坐標(biāo)點(diǎn)為:〔4,0〕、〔8,0〕、〔8,2.0〕、〔5.0,2.0〕、〔5.0,6.0〕、〔4.0,6〕、〔4.0,4.0〕、〔2,4〕、〔2,3.0〕、〔4,3.0〕,根據(jù)這些坐標(biāo)數(shù)據(jù),編寫(xiě)程序進(jìn)行地物的繪制。編寫(xiě)程序代碼如下:;用戶定義函數(shù)和變量:(defunc:dh(/ijp1p2);輸入起始點(diǎn)坐標(biāo):(setqp1(getpoint"\n輸入起始點(diǎn):"));輸入所繪圖形的點(diǎn)數(shù):(setqi(getint"\n輸入點(diǎn)數(shù):"));把第一點(diǎn)賦值,記住第一點(diǎn):(setqp3p1);將測(cè)量專業(yè)使用的坐標(biāo)轉(zhuǎn)換成繪圖坐標(biāo):(setqp3(reversep3))(setqp3(cdrp3))(setqp1p3);將循環(huán)控制器j賦值:(setqj0);使用循環(huán)輸入坐標(biāo)點(diǎn):(while(<ji)(setqp2(getpoint"\n輸入下一點(diǎn):"));將輸入的坐標(biāo)點(diǎn)轉(zhuǎn)換坐標(biāo)系:(setqp2(reversep2))(setqp2(cdrp2));繪制圖形:(command"line"p3p2"");將輸入的點(diǎn)賦值第一點(diǎn),為下一個(gè)點(diǎn)的繪圖做準(zhǔn)備:(setqp3p2);使循環(huán)控制器增值,為下一點(diǎn)做準(zhǔn)備:(setqj(1+j)));是繪制的圖形閉合:(command"line"p1p2"c"))程序加載過(guò)程及運(yùn)行結(jié)果如以下圖5.9:圖5.9程序加載過(guò)程及運(yùn)行結(jié)果上例中是根據(jù)坐標(biāo)點(diǎn)數(shù)據(jù)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論