賀秋偉
摘 要:目前大部分地形圖都是采用AutoCAD的格式存儲,在數(shù)據(jù)入庫和使用時均需要將地形圖按照標準進行分幅,目前也有部分軟件支持自動對地形圖分幅,但是存在圖框不能自定義或者定義文件復(fù)雜、圖廓整飾不符合規(guī)范、進行地形圖裁切時對象丟失等問題,該文提出了利用VBA進行編程實現(xiàn)了地形圖以布局的方式自動分幅,較好的解決了以上問題。
關(guān)鍵詞:VBA 地形圖 自動分幅 布局
中圖分類號:TP3 文獻標識碼:A 文章編號:1674-098X(2014)01(b)-0242-01
隨著計算機技術(shù)的發(fā)展,目前大部分地形圖均實現(xiàn)了數(shù)字化生成和存儲,但是在外業(yè)用圖和數(shù)據(jù)歸檔時還是需要對地形圖進行分幅,目前部分商用軟件也實現(xiàn)了自動對地形圖分幅的功能,但是存在圖框文件不能自定義或者定義文件復(fù)雜、圖廓整飾不符合規(guī)范、進行分幅剪裁時對象丟失等現(xiàn)象,為解決這些問題,本文提出了采用VBA編程對AutoCAD進行二次開發(fā),將地形圖分幅到布局的思路克服以上缺點,實現(xiàn)對地形圖的自動分幅。
1 開發(fā)工具的選擇
目前AutoCAD最主流的開發(fā)方式是AutoLisp、ObjectARX和VBA三種方式,他們各有優(yōu)缺點。
1)AutoLISP是一種表處理語言,是被解釋執(zhí)行的,任何一個語句鍵入后就能馬上執(zhí)行,對于交互式的程序開發(fā)非常方便。其缺點是繼承了LISP語言的編程規(guī)則而導(dǎo)致繁多的括號。2)ObjectARX以C++為編程語言,采用先進的面向?qū)ο蟮木幊淘恚峁┛膳cAutoCAD直接交互的開發(fā)環(huán)境,能使用戶方便快捷地開發(fā)出高效簡潔的Auto CAD應(yīng)用程序,但是對編程門檻較高,需要比較熟練的掌握C++面向?qū)ο蟮木幊谭椒ā?) VBA 即Mcrosoft office中的Visual Basic for Applications,被集成到AutoCAD中。VBA為開發(fā)者提供了一種新的選擇,也為用戶訪問AutoCAD中豐富的技術(shù)框架打開一條新的通道。VBA和AutoCAD中強大的ActiveX自動化對象模型的結(jié)合,代表了一種新型的定制AutoCAD的模式構(gòu)架。通過VBA,我們可以操作AutoCAD,控制ActiveX和其它一些應(yīng)用程序,使之相互之間發(fā)生互易活動。同時VBA是以VB為基礎(chǔ)語言,大大降低了開發(fā)的難度。因此本次選用VBA作為主要開發(fā)手段對AutoCAD進行二次開發(fā)。
2 地形圖分幅信息文件的定義
要進行地形圖分幅首先要定義地形圖分幅信息文件,以便讓程序按照分幅信息的要求進行自動分幅,分幅信息文件主要包含兩個方面的內(nèi)容。
1)圖廓整飾內(nèi)容,這部分內(nèi)容對于同一測區(qū)的地形圖,每幅地形圖內(nèi)容基本相同;2)地形圖鄰接關(guān)系,這部分內(nèi)容包含每幅地形圖的位置以及和鄰接地形圖的關(guān)系,每幅地形圖均不相同。
根據(jù)分幅信息的特點,本次采用Excel表格的方式存儲分幅信息,在表一中存儲圖廓整飾內(nèi)容,作業(yè)員按照要求將內(nèi)容輸入進去即可,在表二中存儲圖幅鄰接關(guān)系,作業(yè)員只要在表格中按照地形圖的排列關(guān)系將圖名輸入表格即可(不需輸入每幅的西南角坐標,程序可以自動推算)。前面提到VBA是從Mcrosoft office中派生出來的,因此利用VBA讀取Excel格式的數(shù)據(jù)的編程難度也大大降低。
3 地形圖分幅至布局
AutoCAD文件分為模型空間和圖紙空間,一個AutoCAD文件只能有一個模型空間,但是可以擁有圖紙空間中的多個布局,將地形圖分幅至布局,即分幅后的每幅圖為圖紙空間中的一個布局。在編程實現(xiàn)時,將圖廓等內(nèi)容直接繪制在圖紙空間,和模型空間互不干擾,而地形圖的內(nèi)容在在該圖紙空間創(chuàng)建一個視口,通過定義視口的中心位置和大小等方法來實現(xiàn)該幅地形圖從模型空間到圖紙空間的映射。
與將地形圖分幅裁切成單個文件相比將地形圖分幅到布局有以下優(yōu)點:
1)全部地形圖存儲在一個AutoCAD文件里面,便于管理,并且分幅后的每幅地形圖至是模型空間的映射,減小了文件的大小,更利于存儲和傳送;2)地形圖如果更新后,只需修改模型空間的內(nèi)容,布局會自動更新不需要重新分幅和接邊;3)避免了對地形圖裁切時對象丟失的情況發(fā)生;4)不同幅地形圖的中的各種對象并沒有因為分幅而被真正裁切,更方便其他專業(yè)利用電子版的地形圖進行三維建模、斷面剖切等應(yīng)用;5)所有地形圖位于一個文件中,并且打印設(shè)置一致,在地形圖打印時更方便批打印。
地形圖自動分幅至布局關(guān)鍵實現(xiàn)代碼如下:
1)新建布局:
Set newLayout = ThisDrawing.Layouts.Add(“圖名”)
2)在布局中插入圖框,由于圖框的基本內(nèi)容是一直的,因此在編程時將標準圖框CAD文件作為一個塊直接扎入布局即可。
Set blockRefObj = ThisDrawing.PaperSpace.InsertBlock(insertionPnt, ImporFile, 1#, 1#, 1#, 0)
3)在布局中添加圖廓整飾文字:
Set textObj = ThisDrawing.PaperSpace.AddText(textString, insertionPoint, height)
textObj.Alignment = acAlignmentTopLeft
textObj.TextAlignmentPoint = insertionPoint
圖廓整飾內(nèi)容程序直接讀取對應(yīng)的Excel分幅信息文件中的表一,圖名、結(jié)合表信息等則可以通過表二中的圖形鄰接關(guān)系推算得到。
4)新建視口
Set newVport = ThisDrawing.PaperSpace.AddPViewport(center, 500, 500)
Center為視口中心位置,500, 500分別為視口的寬度和高度,在進行地形圖分幅時默認進行50×50分幅,因此在這里設(shè)置為500,500。
newVport.Display True
ThisDrawing.MSpace = True
ZoomWindow point1, point2
ThisDrawing.MSpace = False
通過以上幾個步驟的編程就完成一幅圖的分幅工作。需要說明的是由于布局只是為了地形圖分幅打印的需要而建立,并不需要反映真實的地理位置信息,因此每個布局中的地形圖均放在同一位置,并且根據(jù)地形圖比例尺對模型空間進行了縮放,以便于無論什么比例尺的地形圖均可以在打印的時候按照1:1打印。
4 結(jié)語
本程序?qū)崿F(xiàn)了根據(jù)分幅信息文件自動將地形圖分幅至布局的功能,克服了將圖形裁切分幅至文件的不足,支持圖廓信息自定義,并且界面友好,編程時字體嚴格按照規(guī)范定義,在保證作業(yè)標準化的同時大大提高了作業(yè)效率。
參考文獻
[1] 李冠憶.深居淺出AutoCAD二次開發(fā) 明經(jīng)通道論壇.
[2] 孔祥豐.Autocad+vba從入門到精通[M].北京:電子工業(yè)出版社,2001.
[3] GB-T 20257.1-20071:500、1:1000、1:2000地形圖圖式[M].北京:中國標準出版社.endprint