袁錫豪
(1.廣東省國土資源測繪院,廣東 廣州 510500)
宗地圖是以宗地為單位編制的地籍圖,主要表示本宗地的地籍要素以及與相鄰宗地的關(guān)系。宗地圖是土地登記發(fā)證資料的組成部分,是土地證書和宗地檔案的附圖。城鎮(zhèn)地籍調(diào)查是指為了滿足土地登記的需要,利用大比例尺(通常是1∶500)的地形圖對城鎮(zhèn)及其附近區(qū)域的土地進(jìn)行地籍調(diào)查,獲取和表述每一宗地的權(quán)屬、位置、形狀、數(shù)量、用途等基本情況的一系列工作總稱[1,2]。農(nóng)村宅基地發(fā)證是指為了滿足土地登記的需要,利用中、大比例尺的地形圖或正射影像圖對農(nóng)村宅基地的位置、權(quán)屬、界線、形狀、數(shù)量和用途等基本情況而進(jìn)行土地調(diào)查等一系列測繪工作的總稱。不論城鎮(zhèn)地籍調(diào)查還是農(nóng)村宅基地發(fā)證,都需要對權(quán)屬確定、界址清楚的每一宗土地制作宗地圖并用紙質(zhì)媒介打印出來,以供存檔、發(fā)證使用,因此宗地圖數(shù)量巨大,且可能需要多批量打印。一般來說,各宗地圖的比例尺是不一致的,所以打印的比例尺也不一致。盡管AutoCAD的部分版本有批量打印圖形的功能,但只局限于同比例尺的圖形批量打印,而無法實(shí)現(xiàn)不同比例尺的CASS圖形批量打印。因此,從提高生產(chǎn)效率的角度出發(fā),開發(fā)能夠批量打印不同比例尺圖形的軟件已成為必要。
AutoCAD從2005版開始支持.NET API對其二次開發(fā),隨著其版本的提高,AutoCAD.NET API的開發(fā)功能已日益完善。.NET API提供了一系列托管的外包類,在MVS平臺上選擇具有AutoCAD.NET API的程序語言VB.net或C#可易于開發(fā)出滿足用戶需求的應(yīng)用程序。AutoCAD.NET API 使用戶可通過編程利用程序集或庫顯示的 AutoCAD 和圖形文件的對象來操縱它們[3,4],通過顯示的對象,它們可被許多不同的編程語言和環(huán)境訪問。由于南方CASS軟件制作的宗地圖的圖形和界址點(diǎn)坐標(biāo)表是分開的,需要分開正反兩面打印,故在軟件設(shè)計時分打印圖形和打印表格2步進(jìn)行。根據(jù)實(shí)際工作中的功能需求,程序界面設(shè)計如圖1所示。
圖1 程序設(shè)計界面
由于VB.net與AutoCAD運(yùn)行在不同的內(nèi)存空間,所以在進(jìn)行二次開發(fā)時首先將其與AutoCAD進(jìn)行鏈接,即引用AutoCAD的對象、屬性和方法的庫文件。鏈接的具體方法是:運(yùn)行VB.net,創(chuàng)建一個VB.net項(xiàng)目,打開項(xiàng)目菜單,選擇添加引用;然后選擇COM,復(fù)選2個COM對象:AutoCAD2009 type library和AutoCAD/ObjectDBX Common 17.0 Type Library;再編輯VB.net代碼,獲取或創(chuàng)建AutoCAD對象[5]。在利用.NET API開發(fā)AutoCAD時,還需要添加引用acdbmgd.Dll和acmgd.dll 2個托管程序集類庫,并導(dǎo)入以Autodesk.AutoCAD開頭的命名空間Runtime、ApplicationServices、PlottingServices、EditorInput、DatabaseServices、Geometry、Interop.Common等。程序的整體設(shè)計思路如圖2所示。
在圖2中,選擇打印機(jī)并設(shè)置紙張規(guī)格在程序設(shè)計時需要添加PrintDocument、PrintDialog、PageSetupDialog 3個控件;選擇宗地圖是利用界面中的“添加文件”按鈕實(shí)現(xiàn)的,這需要利用OpenFileDialog來顯示一個對話框,提示用戶選擇打開文件,同時對該控件的Filter屬性進(jìn)行了設(shè)置,以便默認(rèn)的情況下選擇的是AutoCAD支持的DWG文件;對選擇了不需要打印的文件也可以用“刪除文件”按鈕將其刪除;程序是從一個外部的可執(zhí)行文件使用COM來控制AutoCAD的外部進(jìn)程,并在進(jìn)程中載入.NET組件。通過AutoCAD2009遍歷打開圖形文件列表中的每一幅宗地圖,所以在點(diǎn)擊窗體中的“打印圖形”或“打印表格”按鈕時,程序會先檢測AutoCAD2009是否已經(jīng)啟動,否則會創(chuàng)建AutoCAD2009應(yīng)用程序?qū)ο蟆utoCAD每打開一幅宗地圖,程序都會利用.NET API提供的方法讀取AutoCAD系統(tǒng)變量USERR1的值并計算出圖形的打印比例尺。
圖2 程序運(yùn)行流程圖
南方公司基于AutoCAD二次開發(fā)的CASS數(shù)字化測繪成圖軟件在生成宗地圖時,將圖形的比例尺分母記錄于系統(tǒng)變量USERR1中,并且各宗地圖的圖面也有注記。利用程序批量打印時各宗地圖的比例尺分母可以從系統(tǒng)變量USERR1中提取,文獻(xiàn)[6]介紹了獲取AutoCAD系統(tǒng)變量的方法。
利用VB.net 2005作為編程語言和開發(fā)工具來設(shè)計應(yīng)用程序以完成界面設(shè)計的各項(xiàng)功能,首先設(shè)計一個窗體,在窗體中設(shè)置選擇打印機(jī)和紙張規(guī)格的控件,并設(shè)置了“添加文件”、“刪除文件”、“打印圖形”、“打印表格”和“退出”等5個命令功能按鈕,再對各個功能按鈕設(shè)計了相應(yīng)的應(yīng)用程序代碼以操縱AutoCAD的運(yùn)行,使AutoCAD自動逐幅打開選擇的圖形,修改圖形的打印參數(shù)(如打印比例、打印偏移、圖形方向等),并在打印機(jī)準(zhǔn)備就緒時傳送給打印機(jī)以實(shí)現(xiàn)自動批量打印的目的。
1)選擇打印機(jī)。點(diǎn)擊“選擇打印機(jī)”組合框容器的“名稱”下拉列表框可選擇系統(tǒng)安裝的打印機(jī),點(diǎn)擊“屬性”可選擇紙張規(guī)格[7]。
Me.TopMost = True'//設(shè)置主窗體始終顯示在最上層窗體之上
…
'//增加系統(tǒng)安裝的打印機(jī)到上述文本框中
Dim strDefaultPrinter As String = prtdoc.PrinterSettings.PrinterName
For Each strPrinter As String In PrinterSettings.InstalledPrinters
cbxPrint.Items.Add(strPrinter)
If strPrinter = strDefaultPrinter Then
cbxPrint.SelectedIndex = cbxPrint.Items.IndexOf(strPrinter)
End If
Next strPrinter
…
2)添加文件,選擇需要打印的宗地圖文件,并添加到左邊的列表框中。
…
lstFile.Items.Add(OpenFileDlg.FileNames(i) '//將選中的文件添加列表框中
…
3)刪除文件。當(dāng)選擇了多余的宗地圖文件時,選中列表框的文件項(xiàng)目,點(diǎn)擊“刪除文件”按鈕可以移開。
…
lstFile.Items.RemoveAt((lstFile.SelectedIndex))
…
4)操縱AutoCAD程序?qū)ο蟆R倏vAutoCAD自動運(yùn)行,必須先引用AutoCAD的類型庫,然后使用CreateObject和GetObject函數(shù)與AutoCAD建立連接。
…
'//獲得正在運(yùn)行的AutoCAD2009應(yīng)用程序?qū)ο?/p>
acadApp = GetObject("AutoCAD.Application.17.2")
'創(chuàng)建一個新的AutoCAD2009應(yīng)用程序?qū)ο?/p>
acadApp = CreateObject("AutoCAD.Application.17.2")
…
5)打印圖形或界址點(diǎn)坐標(biāo)表。在VB.net2005環(huán)境下利用.NET API對AutoCAD的“PlotDrawing”和“PlotTable”2個命令進(jìn)行二次開發(fā),并導(dǎo)入到系統(tǒng)注冊表中,以便能在AutoCAD環(huán)境下直接調(diào)用。在程序主窗體中,通過“打印圖形”和“打印表格”2個按鈕分別打印宗地圖和界址點(diǎn)坐標(biāo)表。程序代碼分述如下:
…
'//取得當(dāng)前文檔和數(shù)據(jù)庫對象
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
…
acadApp.Documents.Open(lstFile.Items(i)) '打開指定的圖形
…
'//獲取AutoCAD系統(tǒng)變量USERR1的值并計算出圖形的打印比例尺
Dim deScale as single=Application.GetSystemVariable("USERR1")/1000
…
在.net中,有關(guān)數(shù)據(jù)庫的操作都是通過“事務(wù)處理”進(jìn)行的。
'//獲得當(dāng)前文檔和數(shù)據(jù)庫
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
…
'//開始一個事務(wù)
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
'//確定打印范圍
Dim MaxPoint(1), MinPoint(1) As Double
MinPoint(0) = pt.X - 86 * deScale : MinPoint(1) = pt.Y -20 * deScale
MaxPoint(0)=pt.X+90 * deScale : MaxPoint(1)= pt.Y+ 188 * deScale
Dim MaxPt As New Point2d(MaxPoint(0), MaxPoint(1))
Dim MinPt As New Point2d(MinPoint(0), MinPoint(1))
Dim WinArea As New Extents2d(MinPt, MaxPt)
acPlSetVdr.SetPlotWindowArea(acPlSet, WinArea)
'//設(shè)置打印類型
acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices._ PlotType.Window)
…
'// 檢查打印機(jī)是否準(zhǔn)備就緒
If PlotFactory.ProcessPlotState = Autodesk.AutoCAD.PlottingServices.ProcessPlotState.NotPlotting Then
Using acPlEng As PlotEngine = PlotFactory.CreatePublishEngine()
'//用一個進(jìn)程對話框跟蹤打印進(jìn)程
Dim acPlProgDlg As PlotProgressDialog = New PlotProgressDialog(False, 1, True)
…
End Using'//結(jié)束事務(wù)處理,并釋放Using控制的所有資源
…
'//調(diào)用二次開發(fā)的plotDrawing打印宗地圖
acadDoc.SendCommand("_plotDrawing" &vbCr)
acadDoc.Close(False) '不保存并關(guān)閉圖形
…
除上述功能外,程序還在窗體底部設(shè)計了標(biāo)簽和進(jìn)度條,以顯示當(dāng)前正在輸出打印的圖形文件名和打印進(jìn)度,供作業(yè)人員了解當(dāng)前的打印情況。
本文從權(quán)屬調(diào)查工作的實(shí)際需求出發(fā),運(yùn)用VB.net2005作為編程語言和開發(fā)工具,編寫了基于南方CASS軟件制作的宗地圖批量打印程序,并成功應(yīng)用于生產(chǎn)實(shí)踐中。該程序界面友好,運(yùn)行穩(wěn)定,稍加修改也可用于批量打印其他圖形??紤]到南方CASS軟件制作的宗地圖都是圖形和坐標(biāo)表格分開的,打印時需要正、反兩面分開打印,故此程序中未設(shè)置打印份數(shù)。經(jīng)過清遠(yuǎn)市陽山縣、清城區(qū)各中心鎮(zhèn)地籍調(diào)查及惠州市博羅縣、龍門縣農(nóng)村宅基地發(fā)證等多個測區(qū)的應(yīng)用驗(yàn)證,出圖效率得到數(shù)十倍提高,在實(shí)際工作中對減少工作量具有實(shí)用意義。
[1]粵國土(地籍)字[1999]61號.廣東省城鎮(zhèn)地籍調(diào)查測量實(shí)施細(xì)則[S].
[2]TD/T 1001—2012.地籍調(diào)查規(guī)程[S].
[3]曾洪飛,張帆,盧擇臨.AutoCAD VBA & VB.net開發(fā)基礎(chǔ)與實(shí)例教程[M].北京:中國電力出版社,2008
[4]陳立新,趙紅梅.基于VB.NET的AutoCAD二次開發(fā)[J].現(xiàn)代機(jī)械, 2006(6):13-15
[5]王哲,吳戰(zhàn)國.基于VB.NET2005在AutoCAD中操縱擬合曲線的研究[J].機(jī)械工程師, 2009(6):21-23
[6]美國Autodesk公司.AutoCAD.NET 開發(fā)人員手冊中文版[EB/OL].http://download.csdn.net/ detail/l510319004/4519684,2010
[7]曹祖圣,蔡文龍,林義證.Visual Basic2005完全開發(fā)指南[M].北京:科學(xué)出版社, 2007