何德平,楊本廷
(重慶市勘測院,重慶 400020)
AutoCAD軟件以其強大而又完善的功能以及方便快捷的操作在計算機輔助設(shè)計領(lǐng)域中得到了極為廣泛的運用。AutoCAD軟件的通用功能已經(jīng)足夠強大,但針對具體專業(yè)領(lǐng)域的某些功能還有局限性。因此目前測繪行業(yè)使用廣泛、知名度很高的數(shù)字測圖軟件包括南方公司的CASS測圖系統(tǒng)、威遠圖的SV300測圖系統(tǒng)、廣州開思的SCS測圖系統(tǒng)均是在AutoCAD平臺上進行的二次開發(fā)的,這些軟件滿足了測繪行業(yè)數(shù)字測繪的需要。但在某些專業(yè)測繪領(lǐng)域中,還需開發(fā)一些專用的功能,以提高工作效率,滿足實際工作的需要。
在面積測繪過程中,測繪單位一般也是采用Auto-CAD軟件進行內(nèi)業(yè)的圖形繪制、面積計算、圖形打印。在繪圖過程中需對每棟建筑不相同的樓層均需繪制樓層建筑面積實測圖。由于科學技術(shù)的發(fā)展,當前城市建設(shè)工程的建筑風格、建筑結(jié)構(gòu)和樣式越來越復(fù)雜和新穎,特別是別墅和花園洋房的每一層形狀和大小均不相同。因此,遇到該類項目時所繪制的樓層建筑面積實測圖較多,有的甚至需要繪制幾百余張圖。若采用AutoCAD通用的打印功能進行批量圖幅的打印出圖(如圖1),每張圖均需進行打印設(shè)備、圖紙大小、打印窗口、打印比例等打印設(shè)置,則需要較長的時間。如圖1的64幅圖,若每幅圖打印設(shè)置需要 30 s,則64幅圖需要 32 min。這樣花費的時間太長,就需要針對該種情況開發(fā)一種能快速批量打印的功能,只要同時選中這則64幅圖,則按一定的順序、比例尺在計算機前臺自動打印,以提高勞動效率。
圖1 需打印的圖幅
在實際的建筑面積測繪工作中,因為表示的建筑的大小、復(fù)雜程度不一樣,但為了統(tǒng)一出圖圖紙大小,一般選用A4或A3紙張,因此會導(dǎo)致建筑面積實測圖按不同的比例尺繪制(如圖2)。打印的圖紙一般需按建筑棟號和樓層號從小到大的先后順序裝訂,因此要求圖紙批量打印時,也按一定的先后順序打印,以節(jié)省人工重新排序的時間。但在選擇圖形時,AutoCAD默認的是按圖形制作的先后順序選中,這與需要的順序不一致。這就需要將圖紙的比例尺和出圖順序采用一定的方式注記在圖廓中,打印時可根據(jù)注記的比例尺和圖紙的順序進行打印。一般采用添加標準的圖廓來實現(xiàn)上述要求。
圖2 不同比例尺繪制的圖幅
編程時首先需要對出圖配置進行設(shè)置,設(shè)置的內(nèi)容主要有:①設(shè)置打印設(shè)備、圖紙類型、圖紙方向和單位;②設(shè)置出圖原點、出圖區(qū)域;③設(shè)置出圖比例、份數(shù)、顏色;其次是進行打印對象的選擇,選擇時Auto-CAD默認的是根據(jù)打印范圍線繪制的先后順序選中,需根據(jù)圖廓中規(guī)定的順序?qū)D形進行排序和獲取打印的比例尺,并可進行預(yù)覽。最后是將圖形按設(shè)定的比例尺、順序、顏色、份數(shù)在指定打印設(shè)備進行打印。
AutoCAD的特色之一便是提供了廣闊的二次開發(fā)空間,如 VBA、VB.NET、ObjectARX、AutoLisp、Visual-Lisp等,讓用戶完成AutoCAD本身所不具備的功能,更高效地完成工作。使用VBA進行二次開發(fā)具有很大的優(yōu)勢,其語法簡單、功能強大、界面清晰。使用VBA編程實現(xiàn)批量打印主要需使用下列方法和屬性:
(1)出圖配置設(shè)置
①模型空間出圖
使用AutoCAD打印圖形比較常用的是窗口打印,也就是在模型空間創(chuàng)建所有的實體然后直接從模型空間指定打印范圍,然后選擇大小適當?shù)膱D紙進行打印。
ThisDrawing.ActiveLayout=ThisDrawing.Layouts.Item("Model") '確保當前布局是模型空間
②打印設(shè)備
使用GetPlotDeviceNames來獲得所有可用的打印設(shè)備,再通過ConfigName屬性來指定打印設(shè)備。
ThisDrawing.ActiveLayout.ConfigName="DWF6 ePlot.pc3"'指定打印設(shè)備
③圖紙類型和單位
圖紙類型是根據(jù)用戶系統(tǒng)連接的打印設(shè)備而定的,每一種不同的打印設(shè)備都會有相應(yīng)可用圖紙尺寸的標準,使用GetCanonicalMediaNames可獲得所有可用的圖紙類型,再用CanonicalMediaName屬性來配置圖紙的尺寸,用PaperUnits屬性指定圖紙的單位。
ThisDrawing.ActiveLayout.CanonicalMediaName="A4" '指定圖紙為A4
ThisDrawing.ActiveLayout.PaperUnits=acMillimeters '設(shè)置圖紙單位為毫米
④紙張方向
使用 PlotRotation來設(shè)置紙張方向,設(shè)置成ac90degrees為橫向,設(shè)置成ac0degrees為縱向。
ThisDrawing.ActiveLayout.PlotRotation=ac90degrees '紙張方向為橫向
⑤出圖原點
出圖原點默認設(shè)置為(0,0),用戶也可以通過設(shè)置CenterPlot屬性為True來將原點設(shè)置在圖紙中央進行對中出圖。
ThisDrawing.ActiveLayout.CenterPlot=True '設(shè)置對中出圖
⑥出圖區(qū)域
使用PlotType屬性來指定出圖區(qū)域,該屬性可以選擇為 acWindow,打印 SetWindowToPlot方法指定的窗口中所有圖形。
ThisDrawing.ActiveLayout.PlotType=acWindow '打印類型為窗口選擇
ThisDrawing.ActiveLayout.SetWindowToPlot ptMin,ptMax '設(shè)置打印窗口
⑦出圖比例
出圖時需要使用一個精確的比例來打印到圖紙上,可使用SetCustomScale方法輸入自定義比例。
ThisDrawing.ActiveLayout.UseStandardScale=False '不使用標準比例
ThisDrawing.ActiveLayout.SetCustomScale 1,bl '自定義比例
⑧出圖份數(shù)
使用NumberOfCopies指定出圖的份數(shù)
ThisDrawing.Plot.NumberOfCopies=1 '出圖份數(shù)為 1
⑨出圖顏色
利用StyleSheet來指定打印樣式表,從而確定打印的顏色。
ThisDrawing.ActiveLayout.ShowPlotStyles=True '指定在打印中應(yīng)用打印樣式
ThisDrawing.ActiveLayout.PlotWithPlotStyles=True '指定對象按打印樣式文件的配置打印
ThisDrawing.ActiveLayout.StyleSheet="Monochrome.ctb" '指定黑色打印樣式表
(2)對象選擇及處理
使用SelectionSets集合的add方法創(chuàng)建選擇集,使用SelectOnScreen方法過濾選擇屏幕中的打印范圍多段線對象并添加到選擇集,再根據(jù)指定的順序?qū)Υ蛴》秶€進行排序處理,同時獲取每個需要打印的范圍線的比例尺、打印窗口坐標。
Set Sset=ThisDrawing.SelectionSets.a(chǎn)dd("LWPolyline") '創(chuàng)建選擇集
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) '將多段線對象導(dǎo)出為對象數(shù)組,再進行排序
ThisDrawing.ActiveLayout.SetWindowToPlot ptMin,ptMax '設(shè)置打印窗口
ThisDrawing.Plot.DisplayPlotPreview acFullPreview '打印預(yù)覽
(3)打印對象
將選擇的打印對象按上述設(shè)置進行打印。
ThisDrawing.SetVariable"BACKGROUNDPLOT",0 '設(shè)置前臺打印
ThisDrawing.Plot.PlotToDevice(PlotDName) '打印當前區(qū)域的全部文件
ThisDrawing.SetVariable"BACKGROUNDPLOT",2 '恢復(fù)系統(tǒng)變量的值,后臺打印
利用AutoCAD VBA二次開發(fā)技術(shù)以及本文的編程思路和方法編寫了批量打印程序(見圖3),在實際工作中得到了廣泛的應(yīng)用。幾百余張的圖紙打印,只需要進行一次的打印設(shè)置和對象選擇,花費時間不到1分鐘,即可按順序進行批量打印,極大地提高了工作效率,滿足了生產(chǎn)的需要。以上列出了編寫該程序使用的主要屬性和方法的語句,只要在此基礎(chǔ)上根據(jù)本文中的編程思路,利用以上列出的一些語句,再添加一些排序、單選鈕、列表框、文本框的使用語句,即可編寫出批量打印程序。
圖3 批量打印程序的界面
[1] 張帆.AutoCAD VBA二次開發(fā)教程[M].北京:清華大學出版社,2006.
[2]李鳳華.AutoCAD 2002/2000 VBA開發(fā)指南[M].北京:清華大學出版社,2001.
[3]張帆,鄭立楷,王華杰.AutoCAD VBA開發(fā)精彩實例教程[M].北京:清華大學出版社,2004.
[4] 曾洪飛,張帆,盧擇臨.AutoCAD VBA&VB.NET開發(fā)基礎(chǔ)與實例教程[M].北京:中國電力出版社,2008.
[5]王玉琨,任衛(wèi)紅,茅艷等.CAD二次開發(fā)技術(shù)及其工程應(yīng)用[M].北京:清華大學出版社,2008.
[6]二代龍震工作室.AutoCAD VBA函數(shù)庫查詢辭典[M].北京:中國鐵道出版社,2003.