何德平,楊本廷
(重慶市勘測院,重慶 400020)
AutoCAD軟件以其強大而又完善的功能以及方便快捷的操作在計算機輔助設計領域中得到了極為廣泛的運用。AutoCAD軟件的通用功能已經足夠強大,但針對具體專業領域的某些功能還有局限性。因此目前測繪行業使用廣泛、知名度很高的數字測圖軟件包括南方公司的CASS測圖系統、威遠圖的SV300測圖系統、廣州開思的SCS測圖系統均是在AutoCAD平臺上進行的二次開發的,這些軟件滿足了測繪行業數字測繪的需要。但在某些專業測繪領域中,還需開發一些專用的功能,以提高工作效率,滿足實際工作的需要。
在面積測繪過程中,測繪單位一般也是采用Auto-CAD軟件進行內業的圖形繪制、面積計算、圖形打印。在繪圖過程中需對每棟建筑不相同的樓層均需繪制樓層建筑面積實測圖。由于科學技術的發展,當前城市建設工程的建筑風格、建筑結構和樣式越來越復雜和新穎,特別是別墅和花園洋房的每一層形狀和大小均不相同。因此,遇到該類項目時所繪制的樓層建筑面積實測圖較多,有的甚至需要繪制幾百余張圖。若采用AutoCAD通用的打印功能進行批量圖幅的打印出圖(如圖1),每張圖均需進行打印設備、圖紙大小、打印窗口、打印比例等打印設置,則需要較長的時間。如圖1的64幅圖,若每幅圖打印設置需要 30 s,則64幅圖需要 32 min。這樣花費的時間太長,就需要針對該種情況開發一種能快速批量打印的功能,只要同時選中這則64幅圖,則按一定的順序、比例尺在計算機前臺自動打印,以提高勞動效率。

圖1 需打印的圖幅
在實際的建筑面積測繪工作中,因為表示的建筑的大小、復雜程度不一樣,但為了統一出圖圖紙大小,一般選用A4或A3紙張,因此會導致建筑面積實測圖按不同的比例尺繪制(如圖2)。打印的圖紙一般需按建筑棟號和樓層號從小到大的先后順序裝訂,因此要求圖紙批量打印時,也按一定的先后順序打印,以節省人工重新排序的時間。但在選擇圖形時,AutoCAD默認的是按圖形制作的先后順序選中,這與需要的順序不一致。這就需要將圖紙的比例尺和出圖順序采用一定的方式注記在圖廓中,打印時可根據注記的比例尺和圖紙的順序進行打印。一般采用添加標準的圖廓來實現上述要求。

圖2 不同比例尺繪制的圖幅
編程時首先需要對出圖配置進行設置,設置的內容主要有:①設置打印設備、圖紙類型、圖紙方向和單位;②設置出圖原點、出圖區域;③設置出圖比例、份數、顏色;其次是進行打印對象的選擇,選擇時Auto-CAD默認的是根據打印范圍線繪制的先后順序選中,需根據圖廓中規定的順序對圖形進行排序和獲取打印的比例尺,并可進行預覽。最后是將圖形按設定的比例尺、順序、顏色、份數在指定打印設備進行打印。
AutoCAD的特色之一便是提供了廣闊的二次開發空間,如 VBA、VB.NET、ObjectARX、AutoLisp、Visual-Lisp等,讓用戶完成AutoCAD本身所不具備的功能,更高效地完成工作。使用VBA進行二次開發具有很大的優勢,其語法簡單、功能強大、界面清晰。使用VBA編程實現批量打印主要需使用下列方法和屬性:
(1)出圖配置設置
①模型空間出圖
使用AutoCAD打印圖形比較常用的是窗口打印,也就是在模型空間創建所有的實體然后直接從模型空間指定打印范圍,然后選擇大小適當的圖紙進行打印。
ThisDrawing.ActiveLayout=ThisDrawing.Layouts.Item("Model") '確保當前布局是模型空間
②打印設備
使用GetPlotDeviceNames來獲得所有可用的打印設備,再通過ConfigName屬性來指定打印設備。
ThisDrawing.ActiveLayout.ConfigName="DWF6 ePlot.pc3"'指定打印設備
③圖紙類型和單位
圖紙類型是根據用戶系統連接的打印設備而定的,每一種不同的打印設備都會有相應可用圖紙尺寸的標準,使用GetCanonicalMediaNames可獲得所有可用的圖紙類型,再用CanonicalMediaName屬性來配置圖紙的尺寸,用PaperUnits屬性指定圖紙的單位。
ThisDrawing.ActiveLayout.CanonicalMediaName="A4" '指定圖紙為A4
ThisDrawing.ActiveLayout.PaperUnits=acMillimeters '設置圖紙單位為毫米
④紙張方向
使用 PlotRotation來設置紙張方向,設置成ac90degrees為橫向,設置成ac0degrees為縱向。
ThisDrawing.ActiveLayout.PlotRotation=ac90degrees '紙張方向為橫向
⑤出圖原點
出圖原點默認設置為(0,0),用戶也可以通過設置CenterPlot屬性為True來將原點設置在圖紙中央進行對中出圖。
ThisDrawing.ActiveLayout.CenterPlot=True '設置對中出圖
⑥出圖區域
使用PlotType屬性來指定出圖區域,該屬性可以選擇為 acWindow,打印 SetWindowToPlot方法指定的窗口中所有圖形。
ThisDrawing.ActiveLayout.PlotType=acWindow '打印類型為窗口選擇
ThisDrawing.ActiveLayout.SetWindowToPlot ptMin,ptMax '設置打印窗口
⑦出圖比例
出圖時需要使用一個精確的比例來打印到圖紙上,可使用SetCustomScale方法輸入自定義比例。
ThisDrawing.ActiveLayout.UseStandardScale=False '不使用標準比例
ThisDrawing.ActiveLayout.SetCustomScale 1,bl '自定義比例
⑧出圖份數
使用NumberOfCopies指定出圖的份數
ThisDrawing.Plot.NumberOfCopies=1 '出圖份數為 1
⑨出圖顏色
利用StyleSheet來指定打印樣式表,從而確定打印的顏色。
ThisDrawing.ActiveLayout.ShowPlotStyles=True '指定在打印中應用打印樣式
ThisDrawing.ActiveLayout.PlotWithPlotStyles=True '指定對象按打印樣式文件的配置打印
ThisDrawing.ActiveLayout.StyleSheet="Monochrome.ctb" '指定黑色打印樣式表
(2)對象選擇及處理
使用SelectionSets集合的add方法創建選擇集,使用SelectOnScreen方法過濾選擇屏幕中的打印范圍多段線對象并添加到選擇集,再根據指定的順序對打印范圍線進行排序處理,同時獲取每個需要打印的范圍線的比例尺、打印窗口坐標。
Set Sset=ThisDrawing.SelectionSets.add("LWPolyline") '創建選擇集
fType(0)=0:fData(0)="LWPolyline" '選擇對象為多段線
fType(1)=8:fData(1)="打印范圍" '選擇圖層為打印范圍
Sset.SelectOnScreen fType,fData '用過濾器選擇打印范圍線
bl=EntLWP.Thickness '獲取打印范圍線的厚度作為自定義比例
LWPolyEnt.GetBoundingBox ptMin,ptMax '獲取打印范圍線的兩對角點坐標
Set LWPolyEnt(m)=Sset.Item(LineNum(m)- 1) '將多段線對象導出為對象數組,再進行排序
ThisDrawing.ActiveLayout.SetWindowToPlot ptMin,ptMax '設置打印窗口
ThisDrawing.Plot.DisplayPlotPreview acFullPreview '打印預覽
(3)打印對象
將選擇的打印對象按上述設置進行打印。
ThisDrawing.SetVariable"BACKGROUNDPLOT",0 '設置前臺打印
ThisDrawing.Plot.PlotToDevice(PlotDName) '打印當前區域的全部文件
ThisDrawing.SetVariable"BACKGROUNDPLOT",2 '恢復系統變量的值,后臺打印
利用AutoCAD VBA二次開發技術以及本文的編程思路和方法編寫了批量打印程序(見圖3),在實際工作中得到了廣泛的應用。幾百余張的圖紙打印,只需要進行一次的打印設置和對象選擇,花費時間不到1分鐘,即可按順序進行批量打印,極大地提高了工作效率,滿足了生產的需要。以上列出了編寫該程序使用的主要屬性和方法的語句,只要在此基礎上根據本文中的編程思路,利用以上列出的一些語句,再添加一些排序、單選鈕、列表框、文本框的使用語句,即可編寫出批量打印程序。

圖3 批量打印程序的界面
[1] 張帆.AutoCAD VBA二次開發教程[M].北京:清華大學出版社,2006.
[2]李鳳華.AutoCAD 2002/2000 VBA開發指南[M].北京:清華大學出版社,2001.
[3]張帆,鄭立楷,王華杰.AutoCAD VBA開發精彩實例教程[M].北京:清華大學出版社,2004.
[4] 曾洪飛,張帆,盧擇臨.AutoCAD VBA&VB.NET開發基礎與實例教程[M].北京:中國電力出版社,2008.
[5]王玉琨,任衛紅,茅艷等.CAD二次開發技術及其工程應用[M].北京:清華大學出版社,2008.
[6]二代龍震工作室.AutoCAD VBA函數庫查詢辭典[M].北京:中國鐵道出版社,2003.