明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 573|回复: 0

请教:VBA代码获取图框对角点,打印时发生了偏移?

[复制链接]
发表于 2021-8-28 12:49 | 显示全部楼层 |阅读模式
本帖最后由 kuangben8 于 2021-8-28 12:53 编辑

我用代码获取图框的对角点,还画了一条直线看看对不对,直线位置是对的。但是以这两个对角点来确定打印范围并打印的时候,发现实际的打印范围偏移了,如下图:



但是在有的文件里打印却是正常的!



请教各位老师:这是什么原因导致的?代码如下:
  1. Option Explicit

  2. Sub 点选获取打印图框()     '通过鼠标选择图框,获取图框的对角点存于数组中,然后批量打印。
  3.     Dim EntObj As AcadEntity, PickPot As Variant
  4.     Dim MinPt As Variant, MaxPt As Variant
  5.     Dim arr(), m%, Temp$, NameStr$
  6.     NameStr = InputBox("请输入要打印的图框名称,多个名称请用逗号“,”隔开。", "友情提醒:", "横向图框,纵向图框,砖型图,砖型图框")
  7.     Do
  8. X:
  9.         On Error Resume Next    '鼠标单击空白处,下面选择实体的语句会出错中断。
  10.         Set EntObj = Nothing    '清除EntObj前一次的值
  11.         Temp = ""               '清除Temp前一次的值
  12.         With ThisDrawing
  13.             .Utility.GetEntity EntObj, PickPot, "请选择图框:"
  14.             Temp = EntObj.ObjectName
  15.             If Len(Temp) = 0 Then
  16.                 If MsgBox("您未选择任何实体对象,是否退出选择?", vbYesNo + vbInformation, "友情提醒:") = vbYes Then
  17.                     Err.Clear     '清除错误
  18.                     Exit Do
  19.                 Else
  20.                     GoTo X
  21.                 End If
  22.             ElseIf Temp <> "AcDbBlockReference" Then
  23.                 MsgBox "您选择的实体对象不是块参照对象,请选择图框块参照对象。" _
  24.                     & vbCrLf & "若要退出选择,请单击空白处。"
  25.                 GoTo X
  26.             Else
  27.                 If InStr(NameStr, EntObj.EffectiveName) > 0 Then
  28.                     m = m + 1
  29.                     ReDim Preserve arr(1 To 2, 1 To m)
  30.                     EntObj.GetBoundingBox MinPt, MaxPt
  31.                     arr(1, m) = MinPt
  32.                     arr(2, m) = MaxPt
  33.                 End If
  34.             End If
  35.         End With
  36.     Loop
  37.     批量打印 (arr)
  38. End Sub

  39. Public Function 批量打印(arr)
  40.     Dim Layout As ACADLayout
  41.     Dim Plot As AcadPlot
  42.     Dim Pt1(1) As Double, Pt2(1) As Double   '定义两个窗选的二维对角点
  43.     Dim m%, Temp
  44.     Dim LowLeft As Variant, UppRight As Variant
  45.     With ThisDrawing
  46.         .ActiveLayout = .Layouts.Item("Model")   '确保当前布局是模型空间布局
  47.         Set Layout = .ModelSpace.Layout    '只打印当前模型空间布局
  48.         With Layout
  49.             .RefreshPlotDeviceInfo         '先刷新当前系统设置
  50.             .ConfigName = "FinePrint"      '设置打印设备
  51.             .CanonicalMediaName = "A4"     '设置打印图纸为A4纸
  52.             .CenterPlot = True             '设置居中打印,在非模型空间布局中该设置无效而出错!
  53.             .StyleSheet = "acad.ctb"       '指定为无时直接结束了!!
  54.             .PlotWithLineweights = True    '打印线宽
  55.             .PlotWithPlotStyles = False    '不勾选按样式打印
  56.             .PlotViewportsFirst = False    '先打印图纸空间对象
  57.             .PlotHidden = False            '不隐藏图纸空间对象
  58.             .ScaleLineweights = False      '不缩放线宽
  59.             .PaperUnits = acMillimeters    '按照毫米为单位
  60.             .UseStandardScale = True       '使用标准比例
  61.             .StandardScale = acScaleToFit  '勾选布满图纸
  62.             .PlotType = acWindow           '设置打印范围为窗口选择范围,在非模型布局中只能=acLayout
  63.             .PlotViewportBorders = False   '不打印视口线
  64.             
  65.             '            Temp = .PlotOrigin              '获取打印偏移的X、Y值,相对于所选图纸的左下角点,正值右移上移,负值左移下移。
  66.             '            ReDim brr(0 To 1) As Double
  67.             '            brr(0) = 3.5: brr(1) = 3.5
  68.             .PaperUnits = acMillimeters  '设定单位为毫米,该参数值还有:英寸、像素。
  69.             '            .PlotOrigin = brr
  70.             .GetPaperMargins LowLeft, UppRight    '获取页边距值
  71.         End With
  72.         .SetVariable "BACKGROUNDPLOT", 0     '设置系统变量,保证不进行后台打印
  73.         With .Plot
  74.             .NumberOfCopies = 1                 '只打印1份
  75.             '.DisplayPlotPreview acFullPreview   '先预览后打印
  76.         End With
  77.         Dim L As AcadLine
  78.         For m = LBound(arr, 2) To UBound(arr, 2)                      '对arr数组循环并打印
  79.             Set L = .ModelSpace.AddLine(arr(1, m), arr(2, m))         '画一条直线看看点对不对?运行到此句回去了!
  80.             Pt1(0) = arr(1, m)(0): Pt1(1) = arr(1, m)(1)
  81.             Pt2(0) = arr(2, m)(0): Pt2(1) = arr(2, m)(1)              '将三维点转换为二维点
  82.             If Pt2(0) - Pt1(0) > Pt2(1) - Pt1(1) Then                 '通过判断图框的长宽比来确定是横向打印还是纵向打印
  83.                 Layout.PlotRotation = ac90degrees                     '设置为横向不颠倒
  84.             Else
  85.                 Layout.PlotRotation = ac0degrees                      '设置为纵向不颠倒
  86.             End If
  87.             Layout.SetWindowToPlot Pt1, Pt2                           '给定窗口的两个二维数组点参数
  88.             L.Visible = False
  89.             .Plot.PlotToDevice                'Layout已经设置打印设备,此处不再设置,若重新设置新打印机会取代原先的打印机。
  90.             L.Visible = True
  91.         Next
  92.     End With
  93. End Function



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-6 01:34 , Processed in 0.166276 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表