CAD VBA中一个模型空间不同图样的批量打印(VBA程序)
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 = ThisDrawing.Utility.GetPoint(, "左下") '精确取左下点
TZZDer = ThisDrawing.Utility.GetPoint(, "右上") '精确取右上点
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 = ThisDrawing.layouts
    For Each BZnla In layouts
    If BZnla.Name = "Layout1" Then
    BZiio = BZnla.CanonicalMediaName
    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
夏普60寸电视机ThisDrawing.ActiveSpace = 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 = ThisDrawing.SelectionSets.Add("XZ") '增加选择集
Mxuanze.Select acSelectionSetWindow, Mzx, Mys '窗选模式下选择集的范围
PDif = Mxuanze.Count '输出选择集内部的对象数目
If PDif <> 0 Then
    Dim newlayout As AcadLayout
    Set newlayout = ThisDrawing.layouts.Add("XBJ" & XBJjs) '增加新的布局
    ThisDrawing.ActiveLayout = newlayout '新增布局为活动布局
    newlayout.ConfigName = "DWF6 ePLOT.PC3" '新增布局的打印机
    newlayout.CanonicalMediaName = BZiio '新增布局的纸张
    '窗选模式下新增布局的范围
    Dim BJzx(0 To 1) As Double
    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
    newlayout.SetWindowToPlot BJzx, BJys '指定窗选模式下新增布局的范围
    newlayout.PlotType = acWindow '指定新增布局为窗选模式
    newlayout.CenterPlot = True '指定新增布局居中
    newlayout.StandardScale = acScaleToFit '指定新增布局铺满纸张
    newlayout.PlotRotation = ac90degrees '指定新增布局横向打印
    newlayout.StyleSheet = "b" '指定新增布局打印样式
XBJjs = XBJjs + 1
End If
Mxuanze.Delete '删除选择集对象
TZx = TZx + 1
'记录单列最大的图纸数
If TZx > TZxjs Then
TZxjs = TZx
End If
Loop Until PDif = 0
Next
TZxxjs = TZxjs + TZxxjs
Next
End Sub
TZQDyi、TZZDer不需要设置
TZxx需要修改
工商营业执照办理TZy 需要修改
Mxuanze 、PDif不需要设置
newlayout不需要设置
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 * 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”为布局里第一张图纸的左下和右上坐标值,可在标准布局测得。“21”“15”为布局里列距和行距,计算可得。
他不是独行侠>广西龙脊梯田过程开始时,cad必须模型活动。
精确取点,必须用鼠标在模型空间里获取。
必须显示所有图纸,否则后面程序无法执行。
新建标准布局“layout1
先返回模型空间
选择集建立,如果过程在此失败,重新运行时修改“XZ”。
新布局建立;新布局进行给定属性值时,必须有先后顺序,否则过程不认。如果过程在此失败,重新运行时删除新建的布局。
将选择集删除,避免影响循环

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。