2024年3月7日发(作者:)

CAD VBA中一个模型空间不同图样的批量打印(VBA程序)

说明:

1、本VBA程序在CAD2008/2009运行成功;电脑系统64位。

2、本程序仅对略有VBA基础知识同志共同学习、共勉;还请编程高手对不妥之处给予指正。谢谢大家!

3、本VBA程序用于解决如下问题:如下图所示,当一个Model有12张图形是如何使用VBA代码实现一键打印或发布。

一般情况下,VBA有三种解决思路:

a)在每个图形上进行矩形框标识,然后用VBA代码识别矩形框进行批量打印。

b)使用VBA代码进行批量布局,然后使用CAD的发布功能进行批量打印。

c)使用VBA代码进行图样位置识别,然后进行批量打印。

4、本文仅对第二种和第三种方法进行程序演示。

b)使用VBA代码进行批量布局,然后使用CAD的发布功能进行批量打印。

应用步骤:

第一步,将图形等列、等行排放

第二步,新建一个标题为“layout1”布局, “页面布局管理器”的参数修改为自己想要的参数

第三步,打开VBA编辑器(工具→宏→Visual Basic编辑器),插入一个模块,将下面的过程代码复制进去

第四步,修改参数

第五步,运行

过程 参数说明 参数式说明 备注

'本过程用于同一个模型内,多张图纸一键布局的应用。

'要求:多张图纸的最大轮廓必须为同一大小,并且必须等行、等列排放。

'变量表:

'TZQDyi、TZZDer记录精确取点的值

'TZxx、TZy 、TZx大列循环(X方向)、行循环、小列循环(X方向)

'TZxxjs大列的图纸个数

'TZxjs小列的图纸个数

'XBJjs布局个数

'Mzx(0 To 2)、Mys(0 To 2)数组,记录选择的范围。

'Mxuanze选择集对象

'PDif选择的对象个数

'newlayout布局对象

'BJzx(0 To 1)、BJys(0 To 1)数组,记录窗选布局的范围

'-----------------------------------------------------------------

Sub piliangbuju() '批量布局

Dim TZQDyi As Variant

Dim TZZDer As Variant

TZQDyi = nt( "左下") '精确取左下点

TZZDer = nt( "右上") '精确取右上点

ZoomAll '将所有图形显示

Dim TZxx As Integer

Dim TZxxjs As Integer

Dim TZxjs As Integer

Dim XBJjs As Integer

XBJjs = 0 '布局名称计数

TZxxjs = 0 '大列计数

'获取正确打印纸名称

Dim BZiio As String

Dim BZnla As AcadLayout

Dim layouts As AcadLayouts

Set layouts = s

For Each BZnla In layouts

If = "Layout1" Then

TZQDyi、TZZDer不需要设置

过程开始时,cad必须模型活动。

精确取点,必须用鼠标在模型空间里获取。

必须显示所有图纸,否则后面程序无法执行。

BZiio = calMediaName

End If

Next

For TZxx = 0 To 2

TZxjs = 0

Dim TZy As Integer

For TZy = 0 To 3

Dim TZx As Integer

TZx = 0 '单列X方向计数

Do

Space = acModelSpace '返回模型空间

'指定图纸位置

Dim Mzx(0 To 2) As Double

Dim Mys(0 To 2) As Double

Mzx(0) = TZQDyi(0) + 1200 * TZx + 1200 *

TZxxjs: Mzx(1) = TZQDyi(1) - 800 * TZy:

Mzx(2) = 0

Mys(0) = TZZDer(0) + 1200 * TZx + 1200 *

TZxxjs: Mys(1) = TZZDer(1) - 800 * TZy:

Mys(2) = 0

Dim Mxuanze As AcadSelectionSet

Dim PDif As Integer

Set Mxuanze =

("XZ") '增加选择集

acSelectionSetWindow Mzx

Mys '窗选模式下选择集的范围

PDif = '输出选择集内部的对象数目

If PDif <> 0 Then

Dim newlayout As AcadLayout

Set newlayout =

("XBJ" & XBJjs) '增加新的布局

Layout = newlayout '新增布局为活动布局

Name = "DWF6

3" '新增布局的打印机

calMediaName = BZiio '新增布局的纸张

'窗选模式下新增布局的范围

Dim BJzx(0 To 1) As Double

TZxx需要修改

TZy 需要修改

For TZxx = 0 To 2中的“2”根据自己在模型空间所建立的大列数修改。3大列为2,4大列为3依次类推。

For TZy = 0 To 3中的“3”指的是行数,有几行就写几。

Mzx(0) =

TZQDyi(0) +

1200 * TZx +

1200 * TZxxjs:

Mzx(1) =

TZQDyi(1) - 800

新建标准布局“layout1”

Dim BJys(0 To 1) As Double

BJzx(0) = 53 + 21 * TZx + 21 * TZxxjs:

BJzx(1) = 103 + 15 * TZy

BJys(0) = 74 + 21 * TZx + 21 * TZxxjs:

BJys(1) = 117 + 15 * TZy

dowToPlot BJzx BJys '指定窗选模式下新增布局的范围

pe = acWindow '指定新增布局为窗选模式

Plot = True '指定新增布局居中

rdScale = acScaleToFit '指定新增布局铺满纸张

tation = ac90degrees '指定新增布局横向打印

heet = "" '指定新增布局打印样式

XBJjs = XBJjs + 1

End If

'删除选择集对象

TZx = TZx + 1

'记录单列最大的图纸数

If TZx > TZxjs Then

TZxjs = TZx

End If

Loop Until PDif = 0

Next

TZxxjs = TZxjs + TZxxjs

Next

End Sub

Mxuanze

、PDif不需要设置

newlayout不需要设置

* TZy: Mzx(2) =

0

Mys(0) =

TZZDer(0) +

1200 * TZx +

1200 * TZxxjs:

Mys(1) =

TZZDer(1) - 800

* TZy: Mys(2) = 0中的“1200”为小列间距,直接测量出来;“800”为行间距,直接测量出来。

BJzx(0) = 53 + 21

* TZx + 21 *

TZxxjs: BJzx(1) =

103 + 15 * TZy

BJys(0) = 74 + 21

* TZx + 21 *

TZxxjs: BJys(1) =

117 + 15 * TZy

中的“53”“103”“74”“117”为布局里第一

先返回模型空间

选择集建立,如果过程在此失败,重新运行时修改“XZ”。

新布局建立;新布局进行给定属性值时,必须有先后顺

张图纸的左下和右上坐标值,可在标准布局测得。“21”“15”为布局里列距和行距,计算可得。

序,否则过程不认。如果过程在此失败,重新运行时删除新建的布局。

将选择集删除,避免影响循环

c)使用VBA代码进行图样位置识别,然后进行批量打印。

应用步骤:

第一步,将图形等列、等行排放

第二步,打开VBA编辑器(工具→宏→Visual Basic编辑器),插入一个模块,将下面的过程代码复制进去

第三步,修改参数

第四步,运行

过程

'本过程用于同一个模型内,多张图纸一键打印的应用。

'要求:多张图纸的最大轮廓必须为同一大小,并且必须等行、等列排放。

'变量表:

'TZQDyi、TZZDer记录精确取点的值

'TZxx、TZy 、TZx大列循环(X方向)、行循环、小列循环(X方向)

'TZxxjs大列的图纸个数

'TZxjs小列的图纸个数

'Mzx(0 To 2)、Mys(0 To 2)数组,记录选择的范围。

'Mxuanze选择集对象

'newplot打印对象

'PDif选择的对象个数

'-----------------------------------------------------------------

Sub piliangdaying() '批量布局

Dim TZQDyi As Variant

Dim TZZDer As Variant

TZQDyi = nt( "左下") '精确取左下点

TZZDer = nt( "右上") '精确取右上点

ZoomAll '将所有图形显示

Dim TZxx As Integer

Dim TZxxjs As Integer

Dim TZxjs As Integer

TZxxjs = 0 '大列计数

'获取正确打印纸名称

参数说明

参数式说明

备注

TZQDyi、TZZDer不需要设置

过程运行时必须在模型空间

精确取点,必须用鼠标在模型空间里获取。

必须显示所有图纸,否则后面程序

Dim BZiio As String

Dim BZnla As AcadLayout

Dim layouts As AcadLayouts

Set layouts = s

For Each BZnla In layouts

If = "Layout1" Then

BZiio = calMediaName

End If

Next

For TZxx = 0 To 2

TZxjs = 0

Dim TZy As Integer

For TZy = 0 To 3

Dim TZx As Integer

TZx = 0 '单列X方向计数

Do

'指定图纸位置

Dim Mzx(0 To 2) As Double

Dim Mys(0 To 2) As Double

Mzx(0) = TZQDyi(0) + 1200 * TZx + 1200 *

TZxxjs: Mzx(1) = TZQDyi(1) - 800 * TZy: Mzx(2)

= 0

Mys(0) = TZZDer(0) + 1200 * TZx + 1200 *

TZxxjs: Mys(1) = TZZDer(1) - 800 * TZy: Mys(2) =

0

Dim Mxuanze As AcadSelectionSet

Dim PDif As Integer

Set Mxuanze =

("XZ") '增加选择集

acSelectionSetWindow Mzx Mys '窗选模式下选择集的范围

PDif = '输出选择集内部的对象数目

If PDif <> 0 Then

Dim newlayout As AcadLayout

Set newlayout =

'增加模型布局

Name = "DWF6 3" '模型布局的打印机

calMediaName = BZiio '模型布局的纸张

TZxx需要设置

TZy需要设置

For TZxx

= 0 To 2中的“2”根据自己在模型空间所建立的大列数修改。3大列为2,4大列为3依次类推。

For TZy =

0 To 3中的“3”指的无法执行。

'窗选模式下模型布局的范围

dowToPlot Mzx Mys '指定窗选模式下模型布局的范围

pe = acWindow '指定模型布局为窗选模式

Plot = True '指定模型布局居中

rdScale = acScaleToFit '指定模型布局铺满纸张

tation = ac90degrees '指定模型布局横向打印

heet = "" '指定模型布局打印样式

Dim newplot As AcadPlot

Set newplot =

Device

End If

'删除选择集对象

TZx = TZx + 1

'记录单列最大的图纸数

If TZx > TZxjs Then

TZxjs = TZx

End If

Loop Until PDif = 0

Next

TZxxjs = TZxjs + TZxxjs

Next

End Sub

注意此处的参数设置

是行数,有几行就写几。

Mzx(0) =

TZQDyi(0) + 1200 *

TZx +

1200 *

TZxxjs:

Mzx(1) =

TZQDyi(1) - 800 *

TZy:

Mzx(2) =

0

Mys(0) =

TZZDer(0) + 1200 *

TZx +

1200 *

TZxxjs:

Mys(1) =

TZZDer(1) - 800 *

TZy:

Mys(2) =

0中的“1200”为小列间距,直接测量出来;“800”为行间距,直接测量出来。

建立在模型空间中的布局,用于打印参数的获取

打印参数

如果想打印到PDF文件,请更改configname属性值。

建立新的打印对象,执行打印任务

将选择集删除,避免影响循环