明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1964|回复: 3

VBA 多文档打印问题。

[复制链接]
发表于 2012-6-5 12:58:54 | 显示全部楼层 |阅读模式
多文档转换出来问题。自己电脑上要加msgbox "是否继续", 才能正常多文档打印,别人电脑上可以正常打印,为啥?
I write a code for CAD batch plot,the main code of  the pass for different dwg is
below.
  1. Public Sub dylst(strPath, Flag As Boolean, Optional Mlstr1 As String = "忽略",

  2. Optional Mlstr2 As String = "忽略")
  3.     Dim Mnew As AcadDocument
  4.     Dim Tkdoc As AcadSelectionSet, Mstr As String
  5.         Set Mnew = ThisDrawing.Application.Documents.Open(strPath, ReadOnly) '只

  6. 读方式打开图形
  7.        ' MsgBox "是否继续打印?"
  8.          BuildFilter pType, pData, 2, Mainfrm.TextBox1.Text '建立图块过滤器
  9.          
  10.          For Each Tkdoc In Mnew.SelectionSets
  11.               If Tkdoc.Name = "Tkdoc" Then
  12.                   Tkdoc.Delete
  13.                   Exit For
  14.               End If
  15.          Next
  16.          
  17.          Set Tkdoc = Mnew.SelectionSets.Add("Tkdoc")
  18.          
  19.             Mnew.SetVariable "REGENMODE", 1 '防止图纸大的时候缩放出现提示
  20.             Mnew.Application.ZoomExtents
  21.            
  22.             Tkdoc.Select acSelectionSetAll, , , pType, pData
  23.             
  24.            If Mlstr1 = "忽略" Then
  25.                   Dy Tkdoc, Flag, Mnew
  26.             Else
  27.                   'Debug.Print "执行!"
  28.                   Dy Tkdoc, Flag, Mnew, Mlstr1, Mlstr2
  29.             End If
  30.             Mnew.Close False
  31.             Tkdoc.Delete
  32. End Sub I my computer  I test it  in CAD 2008 and CAD 2012 ,It opens  alll  the

  33. dwg in the list and nothing of the code "dy" excute.

  34. Set Mnew = ThisDrawing.Application.Documents.Open(strPath, ReadOnly) '只读方式打

  35. 开图形

  36. "dy"  is the module i write for plot a single dwg.

  37. But if i add the code of "MsgBox "Continue?" " i t works well !  and in some

  38. other computer it also works well without the code of "MsgBox "Continue?" " . I

  39. was so confused about this problem. do you have  run into the same  situation?

  40. Can you give me some advice? Thank you very very much!

  41. more code  below:

  42.     ' lstdic is a dictionary object of the dwg pathstr.
  43.     For Each key In Lstdic
  44.             i = i + 1
  45.             Label1.Caption = "正在打印第" & i & "张图共(" & Lstdic.Count & "张)"

  46. & vbCrLf
  47.             dylst key, True
  48.      Next

I my computer  I test it  in CAD 2008 and CAD 2012 ,It opens  alll  the dwg in the list and nothing of the code "dy" excute.
Set Mnew = ThisDrawing.Application.Documents.Open(strPath, ReadOnly) '只读方式打开图形
"dy"  is the module i write for plot a single dwg.
But if i add the code of "MsgBox "Continue?" " i t works well !  and in some other computer it also works well without the code of "MsgBox "Continue?" " . I was so confused about this problem. do you have  run into the same  situation? Can you give me some advice? Thank you very very much!

' dy module

  1. Public Sub Dy(SSt As AcadSelectionSet, Flag As Boolean, Optional Doc As

  2. AcadDocument, Optional Mlstr1 As String = "忽略", Optional Mlstr2 As String = "忽

  3. 略")
  4.     Dim i As Integer, j As Integer
  5.     Dim Ent As AcadEntity, Mtk As AcadBlockReference
  6.     Dim GTstr As String, Plotstr As String
  7.     Dim Low As Variant, Upp As Variant
  8.     Dim Mastr As String, Mistr As String, Mip, Map
  9.     Dim ACADLayout As ACADLayout
  10.     Dim Toustr As String '显示进度条
  11.     Dim Att As AcadAttribute
  12.     Dim Mydic As Scripting.Dictionary '创建属性字典,以句柄为主键,以一个储存此Id

  13. 内属性的字典为item
  14.     Dim Filstr As String '输出的文件名
  15.     Dim Setoutlst As Variant, Setoutstr(1 To 1) As String
  16.     Dim ATTstr As String
  17.   'On Error Resume Next
  18. '在块没有改变前,以其句柄为key建立一个有关其属性的字典(因为所删非打印层也有属性


  19. '********************************************************************************

  20. *******
  21.       Set Mydic = CreateObject("Scripting.Dictionary")
  22.       If Mlstr1 <> "忽略" Then '说明此参数没有被忽略,再进行分图或者批打到文件
  23.                For Each Mtk In SSt
  24.                    ATTstr = ""
  25.                    Atts = Mtk.GetAttributes
  26.                       For i = 0 To UBound(Atts)
  27.                             ATTstr = ATTstr & Atts(i).TagString & Chr(174) &

  28. Atts(i).TextString & vbLf
  29.                       Next
  30.                       ATTstr = ATTstr & "块名" & Chr(174) & Mtk.EffectiveName &

  31. vbLf
  32.                       Mydic.Add Mtk.Handle, ATTstr
  33.                Next
  34.       End If
  35. '********************************************************************************

  36. *******

  37.    Doc.StartUndoMark '设置U回点
  38.    
  39. '删除块内非打印层并进行同步
  40. '********************************************************************************

  41. *******
  42.                 For Each Ent In Doc.Blocks(Mainfrm.TextBox1.Text)
  43.                      If Doc.Layers(Ent.Layer).Plottable = False Then
  44.                         Ent.Delete
  45.                      End If
  46.                 Next
  47.                 Doc.SendCommand "ATTSYNC N " & Mainfrm.TextBox1.Text & Chr(13)
  48.                 Doc.Regen acActiveViewport
  49.                 Doc.SetVariable "REGENMODE", 1 '防止图纸大的时候缩放出现提示
  50.                 Doc.SetVariable "BACKGROUNDPLOT", 0 ' 确保AutoCAD在前台进行打印,

  51. 这样后一次打印会在前一次打印完成之后才开始,避免出现错误
  52.                 Doc.Application.ZoomExtents
  53. '********************************************************************************

  54. *******

  55.             j = 0 '打印或者预览初始值
  56.                Doc.ActiveLayout.CopyFrom Mpig '复制打印设置
  57.                Doc.ActiveLayout.CenterPlot = True
  58.                Doc.ActiveLayout.RefreshPlotDeviceInfo
  59.                Doc.Regen acAllViewports
  60. '传递打印设置Mylayout到DOC.layouts("Model")
  61. '********************************************************************************

  62. *******
  63.            'Debug.Print Doc.ActiveLayout.Name
  64. '            With Doc.ActiveLayout
  65. '                  .CenterPlot = True '居中打印
  66. '                  .ConfigName = Mylayout.ConfigName '打印机配置名称
  67. '                  .PaperUnits = Mylayout.PaperUnits '纸张单位
  68. '                  .PlotWithLineweights = Mylayout.PlotWithLineweights
  69. '                  .PlotWithPlotStyles = Mylayout.PlotWithPlotStyles
  70. '                  .ScaleLineweights = Mylayout.ScaleLineweights
  71. '                  .StyleSheet = Mylayout.StyleSheet
  72. '                  '.UseStandardScale = Mylayout.UseStandardScales
  73. '            End With
  74. '********************************************************************************

  75. *******

  76. '批量打印的时候需要设置
  77. '********************************************************************************

  78. *******
  79. '            If Flag = True Then
  80. '                Doc.Plot.QuietErrorMode = True
  81. '                Doc.Plot.StartBatchMode SSt.Count '调出批打模式
  82. '                Setoutstr(1) = "Model"
  83. '                Setoutlst = Setoutstr
  84. '                Doc.Plot.SetLayoutsToPlot Setoutlst
  85. '            End If
  86. '********************************************************************************

  87. *******

  88.             Toustr = Mainfrm.Label1.Caption '记录进度标签内容
  89.             
  90. 'SSt是一个图框图块的选择集,遍历此选择集,建立打印窗口
  91. '********************************************************************************

  92. *******
  93.        For Each Mtk In SSt

  94. '批量打印的时候需要设置
  95. '********************************************************************************

  96. *******
  97.             If Flag = True Then
  98.                ' Doc.Plot.QuietErrorMode = True
  99.                 Doc.Plot.StartBatchMode SSt.Count '调出批打模式
  100.                 Setoutstr(1) = Doc.ActiveLayout.Name
  101.                 Setoutlst = Setoutstr
  102.                 Doc.Plot.SetLayoutsToPlot Setoutlst
  103.             End If

  104. '********************************************************************************

  105. *******

  106. '打印pdf或者分图的时候需要传递此参数进行文件名字的设置
  107. '********************************************************************************

  108. *******
  109.         If Mlstr1 <> "忽略" Then '说明此参数没有被忽略,再进行分图或者批打到文件
  110.             Dim Marr, Mi As Integer, Ui As Integer, Ni As Integer
  111.             Dim Mtemstr As String, Thisatt As New Scripting.Dictionary
  112.               Filstr = Mlstr1
  113.               Marr = Split(Mydic(Mtk.Handle), vbLf) '取出字符串 0开头
  114.               Ui = UBound(Marr)
  115.               For Mi = 0 To Ui - 1
  116.                     Thisatt.Add Split(Marr(Mi), Chr(174))(0), Split(Marr(Mi),

  117. Chr(174))(1)
  118.               Next
  119.                For Mi = 0 To Ui - 1
  120.    
  121.                     For Ni = Mi + 1 To Ui - 1
  122.                          If Len(Split(Marr(Ni), Chr(174))(0)) > Len(Split(Marr

  123. (Mi), Chr(174))(0)) Then
  124.                                 Mtemstr = Marr(Mi)
  125.                                 Marr(Mi) = Marr(Ni)
  126.                                 Marr(Ni) = Mtemstr
  127.                          End If
  128.                        
  129.                     Next
  130.                     
  131.               Next
  132.               For Mi = 0 To Ui - 1
  133.                   Filstr = Replace(Filstr, Split(Marr(Mi), Chr(174))(0), Thisatt

  134. (Split(Marr(Mi), Chr(174))(0)))
  135.                   '此处会出现bug,比如前面一个Item后面一个key值一样
  136.                   '则会使item变成后面一个key的item(以后再消除此bug)
  137.               Next
  138.               Thisatt.RemoveAll
  139.               Set Thisatt = Nothing '清空字典
  140.         End If
  141. '********************************************************************************

  142. *******

  143. '获得处理后的块box边界,设置窗口打印范围,并设置视口使打印或者预览范围可见
  144. '********************************************************************************

  145. *******
  146.             Mtk.GetBoundingBox Mip, Map
  147.             'Doc.ModelSpace.AddLine Mip, Map
  148.             If Flag = False Then '是预览
  149.                 Mistr = "": Mastr = ""
  150.                 Mistr = Mip(0) & "," & Mip(1) & "," & Mip(2)
  151.                 Mastr = Map(0) & "," & Map(1) & "," & Map(2)
  152.                 Doc.SendCommand "zoom W" & Chr(13) & Mistr & Chr(13) & Mastr &

  153. Chr(13)
  154.             Else   '打印
  155.                 Doc.Application.ZoomWindow Mip, Map
  156.             End If
  157.            Upp = Doc.Utility.TranslateCoordinates(Map, acWorld, acDisplayDCS,

  158. False)
  159.            Low = Doc.Utility.TranslateCoordinates(Mip, acWorld, acDisplayDCS,

  160. False)
  161.             ReDim Preserve Low(0 To 1)
  162.             ReDim Preserve Upp(0 To 1)
  163.             With Doc.ActiveLayout
  164.                 .PlotRotation = Val(IIf(Pand(Mip, Map), 1, 0)) '设置横向竖向打印
  165.                 .SetWindowToPlot Low, Upp
  166.                 .PlotType = acWindow '窗口打印
  167.             End With
  168. '********************************************************************************

  169. *******
  170.          j = j + 1 '记录打印或者预览次数
  171.          
  172. '预览图形文件
  173. '********************************************************************************

  174. *******
  175.           If Flag = False Then '预览
  176.                Doc.Plot.DisplayPlotPreview acFullPreview '预览图形
  177.                If SSt.Count > j Then '说明不是最后一张
  178.                    Dim kwordList As String
  179.                     kwordList = "Y N"
  180.                     Doc.Utility.InitializeUserInput 0, kwordList
  181.                     GTstr = Doc.Utility.GetKeyword("是否预览下一张?[是(Y)/否(N)]

  182. <Y>")
  183.                     If GTstr = "" Then GTstr = "Y"
  184.                     If Err.Number = "-2147352567" Then GTstr = "N"
  185.                End If
  186.                If GTstr = "N" Then Exit For
  187. '********************************************************************************

  188. *******

  189. '打印图形文件
  190. '********************************************************************************

  191. *******
  192.           Else '打印
  193.                 If Mainfrm.Frame5.Visible = True Then
  194.                       Doc.Plot.PlotToDevice
  195.                 ElseIf Mainfrm.Frame7.Visible = True Then
  196.                       Doc.Plot.PlotToFile Mlstr2 & Filstr & ".pdf"
  197.                       ShutDic Prodic
  198.                 End If
  199.                 Mainfrm.Label1 = Toustr & "打印进度:" & FormatPercent(Val(j /

  200. SSt.Count), 2)
  201.           End If
  202.           DoEvents
  203.        Next
  204. '********************************************************************************

  205. *******

  206. 'U回图形原来的状态
  207. '********************************************************************************

  208. *******
  209.        Doc.EndUndoMark
  210.        Doc.SendCommand "U" & Chr(13)
  211. '********************************************************************************

  212. *******
  213. End Sub


 楼主| 发表于 2012-6-6 12:21:00 | 显示全部楼层
这都沉到底了,我自己来顶置一下。
发表于 2013-1-6 09:35:11 | 显示全部楼层
楼主很强大,佩服佩服,新手看不懂,希望好好向你学习,你发的帖子我几乎都看了
 楼主| 发表于 2013-1-9 23:55:51 | 显示全部楼层
254619324 发表于 2013-1-6 09:35
楼主很强大,佩服佩服,新手看不懂,希望好好向你学习,你发的帖子我几乎都看了

转.net了,看自己以前写的VBA代码,除了几个好的算法,简直就是一堆垃圾。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:48 , Processed in 0.206105 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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