QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 4458|回复: 3
收起左侧

[已解决] AUTOCAD2010 使用VBA调用系统打印机完成打印非常慢,如何解决?

[复制链接]
发表于 2010-4-27 09:03:03 | 显示全部楼层 |阅读模式 来自: 中国浙江杭州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
本帖最后由 157787698 于 2010-4-27 09:17 编辑 / [. m5 j8 v6 o. r1 k
4 m. r. b: S$ ^& @* C1 O
本人写了一段VBA程序用来将CAD图形转化为MDI格式,此CAD图纸也同样是由此程序生成,原来在AUTOCAD2004中可以正常生成图纸并通过plottofile方法转化为MDI格式,但是现在公司统一将CAD升级为2010,这样导致此程序不能使用。3 M; u& j# \" b- [
4 r% ?9 X' ^6 o5 h% n
问题出现在使用plottofile方法进行虚拟打印过程。- B$ U+ B0 Z+ `4 C

6 l9 @6 `. m, ^6 _2 R1 U) Y( Q# P原来在AUTOCAD2004中,使用plottofile方法完成虚拟打印只需要20秒左右,但是在AUTOCAD2010中,完成统一个动作需要150秒左右,这是不能接受的。而且在程序中如果连续使用两次plottofile方法,则即使对第一次使用plottofile方法生成的文件进行是否存在进行判断,第二次打印时程序仍然会跳出中断。4 `) t: {+ e  }, a1 z/ ^3 N4 f

0 c% a8 R' O% B& [0 u具体代码如下:
8 s  {# d2 |* e- ]; r
' o; ^4 ^3 a/ r& {' R3 _        point1(0) = -5
3 u+ A4 R! ~9 J/ M        point1(1) = 310 7 R0 i6 i; ?. q2 Q$ L' Y
        point2(0) = 420
, K/ s# k. e: t& t4 g! `/ v        point2(1) = 610
+ z- Z$ e' n3 C       i = 0- k& T" L7 e/ Y- r" d, c
        ' Send information about window to current layout
0 ?: {0 ~' K% u/ h% o0 Z        ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()
0 V" K: p/ q! L; A! o/ b2 `/ d        ' Read back window information) w: ]' a5 o! }, ]
        ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()
; y1 W* o8 b6 U$ g( K'        ThisDrawing.Plot.DisplayPlotPreview acFullPreview    '全局预览6 D) d+ |* g9 c. ?- N
        ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees# Z; |. M0 ^' P. @' p9 R' H2 [
         ' 将打印份数设置为 1
0 s; d4 M3 w7 |; l        ThisDrawing.Plot.NumberOfCopies = 1
* r$ P/ U7 p* K2 A        ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow) Q+ f7 b/ D! ~
        ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit) A7 r  c. q0 m
        ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True '2 s3 }5 E& v! Q; m4 B
        ThisDrawing.Plot.QuietErrorMode = True
" l- j  l) B3 v  Y4 [" p. C# u9 }        ThisDrawing.Regen acActiveViewport; X" w$ j* _0 }8 t2 Q& e) X
         ' 初始化打印; i  ?' R) z8 I9 V* \
        RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result2 n* s: ]1 }, W3 `6 R
        RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4
* y5 P4 p" R4 F0 j        RegCloseKey Result
4 ~7 I) {9 D! `' o+ Q3 p6 r) {    - W0 o' h# q# ?1 @) U5 q
        ThisDrawing.Plot.PlotToFile KHpathmdi17 }' d( S) U( q% b! o8 e- H/ K
              '判断文件是否存在
9 h& G3 P3 C8 o% p- |2 m     Do While Dir(KHpathmdi1) = ""
0 [. I! Y: L$ z# |* d9 P" G            DoEvents
. Z  o+ O1 N( \7 d            i = i + 1
* N& r4 W/ d9 A& g- L0 K        Loop
   
  o2 l  R$ @& n0 ~& u    i = 0
$ U6 B  ~1 I1 Q2 x( Q4 v   'On Error Resume Next
, g2 ~5 V- t2 `; T/ u6 h3 b8 |    point1(0) = -5 ) e+ q, D3 H3 `0 U" _! ?  r
    point1(1) = -3
+ M( t3 B$ K+ A    point2(0) = 420
5 s4 M) _6 }$ O$ m0 N& W    point2(1) = 297
' J5 j( C4 H; c7 Y    ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()" z8 i- ^7 S9 `% a) q; u+ ]
    ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()7 g6 O! t' w5 u, R# a, Z! w7 s
    ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees3 C2 s# L! |- u1 g3 I' s
'    ThisDrawing.Regen acActiveViewport
1 }5 V# m1 n. ]2 x( t! T    ThisDrawing.Plot.NumberOfCopies = 1+ A1 @/ r# F3 W" L. K& v6 ^3 i
    ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow9 ]* O9 s' Y" T8 g; H8 \
    ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit
1 r& j/ ?! b+ X5 u    ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True
" }( q2 _3 Q6 ?$ Y$ G! g& k    ThisDrawing.Plot.QuietErrorMode = True
& _- L4 k/ g1 g9 f3 d$ @4 {    ThisDrawing.Regen acActiveViewport
; d5 d# |( u  D0 M# w- j2 v, J    RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result: d. Z4 w% A) C# U. Y
    RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4
2 x; I; C" O# H% `+ a. w, D, W    RegCloseKey Result0 m& L$ J4 Y7 C" W$ D1 Q
    ThisDrawing.Plot.PlotToFile AZpathmdi13 w7 j6 M$ b1 P
   Do While Dir(AZpathmdi1) = ""
: t' @9 C$ R( d. Z        DoEvents0 B; i6 T9 l# Z8 i; T1 P, k5 w$ x2 S6 c* K
        i = i + 1) p7 `" a3 n: w# Q
    Loop
& |2 d& B0 ?3 i- E- }
- W/ U; Q, ^) F, h! c  e
在判断第一次plottofile方法是否完成时,粉色部分循环运行了40多万次;如果在粉色部分后面设置断点,然后再继续运行,则第二次使用plottofile方法调用系统打印机可以完成打印,程序可以正常运行,而为完成此次循环,蓝色部分循环需要运行运行30多万次。这两个循环中任一个都需要耗费150秒左右。
! b% ]4 Y, q8 B9 }
! [5 b" C5 V0 T7 p而原来在AUTOCAD2004中,这两个循环 i 均等于0,也就是系统打印机与VBA程序基本上是同步执行的。: h$ o. M/ {1 Y( L7 ~9 H
2 J4 I% I4 N" u  l2 X) p
: Y4 H+ {5 q' \8 v
为什么会有这个差异?请各位大虾指点,谢谢
 楼主| 发表于 2010-4-28 18:06:18 | 显示全部楼层 来自: 中国浙江杭州
大家没有遇到这种情况吗?怎么都没有人回复阿
 楼主| 发表于 2010-5-1 17:07:56 | 显示全部楼层 来自: 中国浙江杭州
自己顶一下
 楼主| 发表于 2010-5-5 15:02:13 | 显示全部楼层 来自: 中国浙江杭州
问题已经解决
3 o. ?/ u) G2 V) g* B7 d( H" Z% y* N9 I, s' e6 n% e2 z
解决方法:, |5 D6 Y2 j0 Z/ Z+ U: i
在选项中不勾选后台打印关闭

评分

参与人数 1三维币 +5 收起 理由
woaishuijia + 5 经验分享

查看全部评分

发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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