寇少華 李艷
摘要:如采用AutoCAD的打印功能進(jìn)行批量打印,則需要對每幅圖進(jìn)行選擇、設(shè)置和打印,工作效率較低,這就需要開發(fā)一種能快速批量打印的功能。以VB為開發(fā)平臺,對AutoCAD批量打印的二次開發(fā)進(jìn)行了簡單介紹。重點(diǎn)對程序編制過程中的幾個關(guān)鍵技術(shù)進(jìn)行了闡述。
關(guān)鍵詞:AutoCAD;VB;打??;批量;二次開發(fā)
中圖分類號:U412 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)09-0096-03
Abstract:Taking the example of printing functions 0f the AutoCAD software in batch es, it is needed to select,set and print every drawings separately, so that its needed to develop a function to print the drawings in batches fast to improve the efficiency. This paper introduces the secondary development of AutoCAD batch plot on visual basic platform. The paper illustrates the key technology of implementation of the secondary development,and the program were verified with the projects.
Key words: AutoCAD; VB; batch plot; secondary development
AutoCAD是道路與橋梁工程設(shè)計過程中最常用的工具之一,我們在設(shè)計工作中,經(jīng)常需要打印大量的圖紙,用AutoCAD自身的打印功能打印一份新的圖紙,需要設(shè)置打印機(jī)、圖紙尺寸、打印范圍、打印偏移、打印比例、打印樣式表、圖形方向等選項,費(fèi)時費(fèi)力,AutoCAD自帶布局的方法也沒有方便的解決這個問題。因此,需要對AutoCAD進(jìn)行二次開發(fā),自動完成打印選項的設(shè)定,提高批量打印效率。本文主要介紹了基于VB二次開發(fā)AutoCAD批量打印程序編制過程中的主要技術(shù)。
1 程序的主要功能
根據(jù)道路與橋梁工程設(shè)計過程中的實(shí)際情況,我們開發(fā)了AutoCAD批量打印程序,如圖1所示,主要具有以下功能:
1)批量打印多個文件,每個文件中可以包含多個圖形;
2)自動識別圖框,圖框類型可以為多段線、塊或外部參照;
3)自動設(shè)置打印比例。
2 利用VB基于AutoCAD二次開發(fā)
2.1 開發(fā)原理
ActiveX Automation是微軟公司基于組件對象模型體系結(jié)構(gòu)開發(fā)的一項技術(shù),AuotoCAD自R14版本起加入了ActiveX Automation編程接口,通過ActiveX Automation,AutoCAD提供了由對象模型表述的可編程對象,這些對象可由其他程序來創(chuàng)建、操縱和編輯。
Visual Basic(以下簡稱VB)是微軟公司推出的面向?qū)ο罂梢暬幊坦ぞ?,VB作為我們常用的支持ActiveX技術(shù)的編程開發(fā)工具,使AutoCAD與其他運(yùn)用程序的數(shù)據(jù)共享變得更加方便。
2.2 AutoCAD對象模型
AutoCAD對象是采用分層方式來操作的,每一個對象就代表AutoCAD的一個元素。頂層對象為應(yīng)用程序?qū)ο驛pplication,下面是文檔Document對象、參數(shù)選擇Preferences對象、主菜單欄MenuBar對象及菜單工具M(jìn)enuGroups對象。文檔Document對象就是AutoCAD圖形,包含ModelSpace、PaperSpace、Blocks、Layers、Plot與Utility等對象,它提供訪問所有圖形對象(線、圓、弧等)及大部分非圖形對象(打印、圖層、線型、字型等)。在參數(shù)選擇(Preferences)對象下邊為對象集,每個對象集均對應(yīng)選項對話框的一個選項卡,它們共同提供訪問所有的注冊設(shè)置。AutoCAD對象模型如圖2所示。
2.3 VB與AutoCAD的連接
VB與AutoCAD連接的源代碼如下所示:
'定義AutoCAD 應(yīng)用程序acadApp和當(dāng)前文檔acaddoc
Public acadApp As Object
Public acaddoc As Object
'定義模型空間對象mospace和圖紙空間對象paspace
Public mospace As Object
Public paspace As Object
Sub ConnectToAcad ()
On Error Resume Next
' 使用Set語句及GetObject函數(shù)返回對AutoCAD對象AcadApp的引用
Set acadApp = GetObject(, "AutoCAD.Application")
If Err Then
'清除錯誤信息
Err.Clear
'使用Set語句及CreateObject函數(shù)創(chuàng)建對AutoCAD對象AcadApp的引用
Set acadApp = CreateObject("AutoCAD.Application")
If Err Then
'如出現(xiàn)錯誤,返回一個錯誤信息
MsgBox Err.Description
Exit Sub
End If
End If
End Sub
2.4 VB對AutoCAD的操作
通過VB面向?qū)ο蟮木幊汰h(huán)境,可以對使用屬性、方法等對AutoCAD的各種對象進(jìn)行操作。下面是利用VB6開發(fā)的用戶程序?qū)嵗涔δ苁窃谀P涂臻g中繪制多段線,然后獲取并顯示多段線坐標(biāo),并對多段線的端點(diǎn)坐標(biāo)、顏色進(jìn)行修改。
Sub Example_Coordinates()
Dim plineobject As object
'創(chuàng)建多段線
Dim points(5) As Double
points(0) = 3: points(1) = 7: points(2) = 0
points(3) = 9: points(4) = 2: points(5) = 0
Set plineobject = acaddoc.ModelSpace.AddPolyline(points)
plineobject.color=1
'獲取多段線坐標(biāo)
Dim retCoord As Variant
retCoord = plineobject.Coordinates
' 顯示多段線第2點(diǎn)坐標(biāo)
MsgBox "當(dāng)前多段線第2點(diǎn)坐標(biāo)為: " & points(3) & ", " & points(4) & ", " & points(5)
' 修改多段線的端點(diǎn)坐標(biāo)、顏色
points(3) = 5: points(4) = 5: points(5) = 0
plineobject.Coordinates = points
plineobject.color=2
End Sub
3 批量打印程序的實(shí)現(xiàn)
3.1 多個文件選擇
為實(shí)現(xiàn)在圖紙打印過程中,能依次選擇多個文件進(jìn)行打印,達(dá)到無人值守的目的,程序采用ListBox控件對文件存放路徑及名稱進(jìn)行存取。使用AddItem或者RemoveItem方法可以添加或者刪除項目,使用List、ListCount和ListIndex屬性可以訪問項目。
3.2 獲取打印機(jī)、樣式表及圖紙尺寸
Layout對象包含模型空間、圖紙空間的打印設(shè)置。用Layout.GetPlotDeviceNames獲取所有可用的打印設(shè)備名稱,Layout.GetCanonicalMediaNames獲取指定打印設(shè)備的所有圖紙尺寸,Layout.GetPlotStyleTableNames取得全部可用的打印樣式表名稱,添加到相應(yīng)的ComboBox 控件中用于選擇。調(diào)用上述方法前必須先調(diào)用 RefreshPlotDeviceInfo 方法,更新打印機(jī)、圖紙尺寸和打印樣式表信息,以反映當(dāng)前系統(tǒng)狀態(tài)。
獲取Layout對象
Dim Layout As Object
Set Layout = acadApp.ActiveDocument.ModelSpace.Layout
更新信息
Layout.RefreshPlotDeviceInfo
獲取打印機(jī)
Dim plotDevices As Variant
plotDevices = Layout.GetPlotDeviceNames()
Dim X As Integer
For X = LBound(plotDevices) To UBound(plotDevices)
Combo1.AddItem plotDevices(X)
Next
獲取圖紙尺寸
Dim mediaNames As Variant
mediaNames = Layout.GetCanonicalMediaNames()
For X = LBound(mediaNames) To UBound(mediaNames)
Combo2.AddItem mediaNames(X)
Next
獲取打印樣式表
Dim styleNames As Variant
styleNames = Layout.GetPlotStyleTableNames()
For X = LBound(styleNames) To UBound(styleNames)
Combo3.AddItem styleNames(X)
Next
3.3 設(shè)置打印機(jī)、樣式表及圖紙尺寸
ActiveX中的布局表現(xiàn)形式與 AutoCAD 用戶界面中的表現(xiàn)形式略有不同。在 ActiveX 中,標(biāo)準(zhǔn)AutoCAD布局可以分成兩個獨(dú)立的對象:Layout和Block。對象Layout為AutoCAD 用戶界面上的打印和布局顯示配置。Block對象包含布局的幾何圖形。在ActiveX中,除了圖紙空間布局外,模型空間也被看作是一個布局。使用ActiveLayout屬性獲取文檔的活動布局,ConfigName屬性設(shè)置打印機(jī)配置名,CanonicalMediaName屬性設(shè)置圖紙尺寸,StyleSheet設(shè)置打印樣式表。
Dim Layout As Object
Set Layout = acadApp.ActiveDocument.ActiveLayout
Layout.ConfigName = Combo1.Text
Layout.CanonicalMediaName= Combo2.Text
Layout.StyleSheet = Combo3.Text
3.4 獲取圖框并設(shè)置打印區(qū)域
為設(shè)置打印區(qū)域,需從圖形中過濾出符合特征的圖框 ,程序采用Select方法選擇對象,F(xiàn)iherType和 FilterData作為過濾參數(shù),將選擇的對象添加到選擇集中。FilterType為指定使用的過濾器類型的DXF組碼,F(xiàn)ilterData為過濾器的值。遍歷選擇集中的每個對象,可采用GetBoundingBox方法獲得每個圖框的的左下角點(diǎn)和右上角點(diǎn)坐標(biāo) ,即為圖紙的打印范圍。通過SetWindowToPlot方法設(shè)置打印區(qū)域。一個AutoCAD文件中如存在多個圖形的情況,還需對獲取的圖框坐標(biāo)進(jìn)行排序,以適應(yīng)給定的打印順序進(jìn)行打印,如“先下后上,先左后右”、“先上后下,先左后右”等。
If Option1.Value = True Then過濾對應(yīng)圖層的多段線圖框
ft(0) = 0: fd(0) = "LWPOLYLINE"
ft(1) = 8: fd(1) = Text1.Text
Elseif option2.Value = true then過濾給定名稱的塊圖框
ft(0) = 100: fd(0) = "AcDbBlockReference"
ft(1) = 2: fd(1) = Text2.Text
Else過濾給定名稱的外部參照圖框
ft(0) = 100: fd(0) = "AcdbExternalReference"
ft(1) = 2: fd(1) = Text3.Text
EndIf
過濾選擇圖框
sselect.Select 5, , , ft, fd
遍歷選擇集獲取每個圖框范圍
For Each element In sselect
element.GetBoundingBox minExt(seln), maxExt(seln)
Next
' 設(shè)置打印窗口
Layout.SetWindowToPlot ptMin, ptMax
3.5 打印比例的自動設(shè)置
用Layout.SetCustomScale方法可設(shè)置打印的比例,參數(shù)分別為給定的標(biāo)準(zhǔn)圖框打印長度、獲取的實(shí)際圖框長度。
設(shè)置打印比例
Layout.SetCustomScale Val(Text4.Text), ptMax(0)- ptMin(0)
3.6打印偏距、圖紙方向、打印份數(shù)設(shè)置
如圖形采用居中打印,可設(shè)置CenterPlot屬性為True,否則可使用PlotOrigin屬性設(shè)置X、Y方向的打印偏移值;對于圖紙方向可使用PlotRotation屬性進(jìn)行設(shè)置;對于打印份數(shù)可通過NumberOfCopies屬性給定。
打印偏距
If Check1.Value = Checked Then
Layout.CenterPlot = True
Else
originalValue(0) = Val(Text4.Text)
originalValue(1) = Val(Text5.Text)
Layout.PlotOrigin = originalValue
End If
圖紙方向
Layout.PlotRotation = ac0degrees
打印份數(shù)
acadApp.ActiveDocument.Plot.NumberOfCopies = Val(Text6.Text)
3.7打印預(yù)覽及輸出
創(chuàng)建打印設(shè)置后,可先使用DisplayPlotPreview方法進(jìn)行打印預(yù)覽,預(yù)覽沒問題后,采用PlotToDevice方法輸出到打印機(jī)或pdf虛擬打印機(jī)。
打印預(yù)覽
acadApp.ActiveDocument.Plot.DisplayPlotPreview 1
打印輸出
acadApp.ActiveDocument.Plot.PlotToDevice
3.8當(dāng)前圖形及局部打印
為適應(yīng)更廣泛的打印情況,可在程序中加入直接打印當(dāng)前圖形中的所有圖紙或局部圖紙代碼。
4 結(jié)束語
作為經(jīng)常使用AutoCAD的人員來說,掌握一些VB開發(fā)的基本知識,對工作將很有幫助,可以利用VB開發(fā)出許多很實(shí)用的程序,提高工作效率。由于篇幅所限,本文不能提供AutoCAD批量打印程序所有的代碼,僅僅給出了解決問題的相關(guān)思路。
參考文獻(xiàn):
[1] 張國寶. AutoCAD Visual Basic開發(fā)技術(shù)[M]. 北京: 科學(xué)出版社, 2000.
[2] 張帆,鄭立楷,盧擇林.AutoCAD VBA二次開發(fā)教程[M].北京:清華大學(xué)出版社,2006.