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