寇少华 李艳
摘要:如采用AutoCAD的打印功能进行批量打印,则需要对每幅图进行选择、设置和打印,工作效率较低,这就需要开发一种能快速批量打印的功能。以VB为开发平台,对AutoCAD批量打印的二次开发进行了简单介绍。重点对程序编制过程中的几个关键技术进行了阐述。
关键词:AutoCAD;VB;打印;批量;二次开发
中图分类号:U412 文献标识码: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是道路与桥梁工程设计过程中最常用的工具之一,我们在设计工作中,经常需要打印大量的图纸,用AutoCAD自身的打印功能打印一份新的图纸,需要设置打印机、图纸尺寸、打印范围、打印偏移、打印比例、打印样式表、图形方向等选项,费时费力,AutoCAD自带布局的方法也没有方便的解决这个问题。因此,需要对AutoCAD进行二次开发,自动完成打印选项的设定,提高批量打印效率。本文主要介绍了基于VB二次开发AutoCAD批量打印程序编制过程中的主要技术。
1 程序的主要功能
根据道路与桥梁工程设计过程中的实际情况,我们开发了AutoCAD批量打印程序,如图1所示,主要具有以下功能:
1)批量打印多个文件,每个文件中可以包含多个图形;
2)自动识别图框,图框类型可以为多段线、块或外部参照;
3)自动设置打印比例。
2 利用VB基于AutoCAD二次开发
2.1 开发原理
ActiveX Automation是微软公司基于组件对象模型体系结构开发的一项技术,AuotoCAD自R14版本起加入了ActiveX Automation编程接口,通过ActiveX Automation,AutoCAD提供了由对象模型表述的可编程对象,这些对象可由其他程序来创建、操纵和编辑。
Visual Basic(以下简称VB)是微软公司推出的面向对象可视化编程工具,VB作为我们常用的支持ActiveX技术的编程开发工具,使AutoCAD与其他运用程序的数据共享变得更加方便。
2.2 AutoCAD对象模型
AutoCAD对象是采用分层方式来操作的,每一个对象就代表AutoCAD的一个元素。顶层对象为应用程序对象Application,下面是文档Document对象、参数选择Preferences对象、主菜单栏MenuBar对象及菜单工具MenuGroups对象。文档Document对象就是AutoCAD图形,包含ModelSpace、PaperSpace、Blocks、Layers、Plot与Utility等对象,它提供访问所有图形对象(线、圆、弧等)及大部分非图形对象(打印、图层、线型、字型等)。在参数选择(Preferences)对象下边为对象集,每个对象集均对应选项对话框的一个选项卡,它们共同提供访问所有的注册设置。AutoCAD对象模型如图2所示。
2.3 VB与AutoCAD的连接
VB与AutoCAD连接的源代码如下所示:
'定义AutoCAD 应用程序acadApp和当前文档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函数返回对AutoCAD对象AcadApp的引用
Set acadApp = GetObject(, "AutoCAD.Application")
If Err Then
'清除错误信息
Err.Clear
'使用Set语句及CreateObject函数创建对AutoCAD对象AcadApp的引用
Set acadApp = CreateObject("AutoCAD.Application")
If Err Then
'如出现错误,返回一个错误信息
MsgBox Err.Description
Exit Sub
End If
End If
End Sub
2.4 VB对AutoCAD的操作
通过VB面向对象的编程环境,可以对使用属性、方法等对AutoCAD的各种对象进行操作。下面是利用VB6开发的用户程序实例,其功能是在模型空间中绘制多段线,然后获取并显示多段线坐标,并对多段线的端点坐标、颜色进行修改。
Sub Example_Coordinates()
Dim plineobject As object
'创建多段线
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
'获取多段线坐标
Dim retCoord As Variant
retCoord = plineobject.Coordinates
' 显示多段线第2点坐标
MsgBox "当前多段线第2点坐标为: " & points(3) & ", " & points(4) & ", " & points(5)
' 修改多段线的端点坐标、颜色
points(3) = 5: points(4) = 5: points(5) = 0
plineobject.Coordinates = points
plineobject.color=2
End Sub
3 批量打印程序的实现
3.1 多个文件选择
为实现在图纸打印过程中,能依次选择多个文件进行打印,达到无人值守的目的,程序采用ListBox控件对文件存放路径及名称进行存取。使用AddItem或者RemoveItem方法可以添加或者删除项目,使用List、ListCount和ListIndex属性可以访问项目。
3.2 获取打印机、样式表及图纸尺寸
Layout对象包含模型空间、图纸空间的打印设置。用Layout.GetPlotDeviceNames获取所有可用的打印设备名称,Layout.GetCanonicalMediaNames获取指定打印设备的所有图纸尺寸,Layout.GetPlotStyleTableNames取得全部可用的打印样式表名称,添加到相应的ComboBox 控件中用于选择。调用上述方法前必须先调用 RefreshPlotDeviceInfo 方法,更新打印机、图纸尺寸和打印样式表信息,以反映当前系统状态。
获取Layout对象
Dim Layout As Object
Set Layout = acadApp.ActiveDocument.ModelSpace.Layout
更新信息
Layout.RefreshPlotDeviceInfo
获取打印机
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 设置打印机、样式表及图纸尺寸
ActiveX中的布局表现形式与 AutoCAD 用户界面中的表现形式略有不同。在 ActiveX 中,标准AutoCAD布局可以分成两个独立的对象:Layout和Block。对象Layout为AutoCAD 用户界面上的打印和布局显示配置。Block对象包含布局的几何图形。在ActiveX中,除了图纸空间布局外,模型空间也被看作是一个布局。使用ActiveLayout属性获取文档的活动布局,ConfigName属性设置打印机配置名,CanonicalMediaName属性设置图纸尺寸,StyleSheet设置打印样式表。
Dim Layout As Object
Set Layout = acadApp.ActiveDocument.ActiveLayout
Layout.ConfigName = Combo1.Text
Layout.CanonicalMediaName= Combo2.Text
Layout.StyleSheet = Combo3.Text
3.4 获取图框并设置打印区域
为设置打印区域,需从图形中过滤出符合特征的图框 ,程序采用Select方法选择对象,FiherType和 FilterData作为过滤参数,将选择的对象添加到选择集中。FilterType为指定使用的过滤器类型的DXF组码,FilterData为过滤器的值。遍历选择集中的每个对象,可采用GetBoundingBox方法获得每个图框的的左下角点和右上角点坐标 ,即为图纸的打印范围。通过SetWindowToPlot方法设置打印区域。一个AutoCAD文件中如存在多个图形的情况,还需对获取的图框坐标进行排序,以适应给定的打印顺序进行打印,如“先下后上,先左后右”、“先上后下,先左后右”等。
If Option1.Value = True Then过滤对应图层的多段线图框
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
' 设置打印窗口
Layout.SetWindowToPlot ptMin, ptMax
3.5 打印比例的自动设置
用Layout.SetCustomScale方法可设置打印的比例,参数分别为给定的标准图框打印长度、获取的实际图框长度。
设置打印比例
Layout.SetCustomScale Val(Text4.Text), ptMax(0)- ptMin(0)
3.6打印偏距、图纸方向、打印份数设置
如图形采用居中打印,可设置CenterPlot属性为True,否则可使用PlotOrigin属性设置X、Y方向的打印偏移值;对于图纸方向可使用PlotRotation属性进行设置;对于打印份数可通过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
打印份数
acadApp.ActiveDocument.Plot.NumberOfCopies = Val(Text6.Text)
3.7打印预览及输出
创建打印设置后,可先使用DisplayPlotPreview方法进行打印预览,预览没问题后,采用PlotToDevice方法输出到打印机或pdf虚拟打印机。
打印预览
acadApp.ActiveDocument.Plot.DisplayPlotPreview 1
打印输出
acadApp.ActiveDocument.Plot.PlotToDevice
3.8当前图形及局部打印
为适应更广泛的打印情况,可在程序中加入直接打印当前图形中的所有图纸或局部图纸代码。
4 结束语
作为经常使用AutoCAD的人员来说,掌握一些VB开发的基本知识,对工作将很有帮助,可以利用VB开发出许多很实用的程序,提高工作效率。由于篇幅所限,本文不能提供AutoCAD批量打印程序所有的代码,仅仅给出了解决问题的相关思路。
参考文献:
[1] 张国宝. AutoCAD Visual Basic开发技术[M]. 北京: 科学出版社, 2000.
[2] 张帆,郑立楷,卢择林.AutoCAD VBA二次开发教程[M].北京:清华大学出版社,2006.