乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 67|回复: 0

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

[复制链接]

2

主题

10

帖子

6

银币

初来乍到

Rank: 1

铜币
18
发表于 2021-8-28 12:49:00 | 显示全部楼层 |阅读模式
我用代码获取图框的对角点,还画了一条直线看看对不对,直线位置是对的。但是以这两个对角点来确定打印范围并打印的时候,发现实际的打印范围偏移了,如下图:
但是在有的文件里打印却是正常的!

1r4chw4vdiq.jpg

1r4chw4vdiq.jpg


请教各位老师:这是什么原因导致的?代码如下:
  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

5bjxhvit34a.jpg

5bjxhvit34a.jpg

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 22:21 , Processed in 0.572247 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表