QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2010-4-27 09:17 编辑
# _. I9 O2 q! S/ n3 Y+ I  t9 |6 S9 ]
本人写了一段VBA程序用来将CAD图形转化为MDI格式,此CAD图纸也同样是由此程序生成,原来在AUTOCAD2004中可以正常生成图纸并通过plottofile方法转化为MDI格式,但是现在公司统一将CAD升级为2010,这样导致此程序不能使用。
! k- z5 ~$ N; N: u$ _$ H& v$ b+ J$ H5 Q1 ?1 D4 E9 u% B. {0 X8 P, K
问题出现在使用plottofile方法进行虚拟打印过程。
# v4 a) U9 |7 n% |8 K- I7 w1 \5 K4 M, ~
原来在AUTOCAD2004中,使用plottofile方法完成虚拟打印只需要20秒左右,但是在AUTOCAD2010中,完成统一个动作需要150秒左右,这是不能接受的。而且在程序中如果连续使用两次plottofile方法,则即使对第一次使用plottofile方法生成的文件进行是否存在进行判断,第二次打印时程序仍然会跳出中断。
& f) n  f+ o2 g. S. K* {  ?: X$ |  b$ Q6 h; K. Q
具体代码如下:
+ ~' Z3 @. X( {7 N( F
- A; v# m. E& s2 E        point1(0) = -5 4 a- I) n8 q& f9 u
        point1(1) = 310
" Z& b0 s& Z: x        point2(0) = 420 . `3 n, Q1 J$ \; B
        point2(1) = 610
: S# |5 Y7 ?$ v5 F; I  }) M' x       i = 0
$ U( T: {& c& I( ]1 l) i! L        ' Send information about window to current layout
8 o- |) b$ E9 A7 x& T. s; V5 B5 C4 ]        ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()
$ I# E# v5 W: C0 m        ' Read back window information* z& u1 W% r& L) A" m* [5 L. c) q
        ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()# }7 O$ L: J5 T% D. f( _$ z
'        ThisDrawing.Plot.DisplayPlotPreview acFullPreview    '全局预览
: m6 x% l# K0 x1 f* u1 n        ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees
8 L" T' t8 F$ z* F4 ]# h7 L         ' 将打印份数设置为 16 m2 \/ }0 Z! ~
        ThisDrawing.Plot.NumberOfCopies = 1' L2 ?5 F- [; _% j, M' w& b
        ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow8 ^1 j! h, x% z- z1 N1 L: d( c
        ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit- G7 G( k& I2 ~! m" ^9 P" W
        ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True '4 R. F* \7 g2 ^$ c4 r6 y1 ~
        ThisDrawing.Plot.QuietErrorMode = True
3 L6 O8 t' t8 }. ?8 y        ThisDrawing.Regen acActiveViewport- U" I/ a% Q( o. y# v# k7 Y
         ' 初始化打印
& a5 N. L5 v- T2 l" i# e8 Z. T        RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result/ G! n; z7 \' M6 r
        RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4
. U- V8 a# I# Q4 y0 `2 p# x3 c# k        RegCloseKey Result
. l) V! A& L- `8 x: @    - {( ~1 u$ g. n3 b* e* V. G; u
        ThisDrawing.Plot.PlotToFile KHpathmdi1
- O- l; D# C% q, e* [              '判断文件是否存在
" v% ?/ O6 N5 t3 f6 m0 F     Do While Dir(KHpathmdi1) = ""5 \; {2 @& V7 A
            DoEvents
+ X& ]/ t4 c+ q9 [9 f) }7 G0 G  Y            i = i + 14 v6 {* H  _6 I$ Y
        Loop
    # ]( w4 k8 G8 o9 P# X4 I
    i = 0
) c1 Q/ u, {9 t6 k" S   'On Error Resume Next
2 v  X8 h/ d$ ]. j    point1(0) = -5
+ b0 J0 o% |# r! w; k) y9 W8 w
    point1(1) = -3
: g; _* u, z: J* Q2 ?- e1 ?    point2(0) = 4209 _/ P2 a% j; J; T" W- B3 N& k( g
    point2(1) = 297
8 `4 m) n8 N: D7 j) t& Q" Y    ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()" u! n1 F; ^, M
    ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()
2 G2 j( W6 K# e* @! }& [    ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees8 h6 ~5 q, E7 W! b/ \. Z
'    ThisDrawing.Regen acActiveViewport
3 V" I) R4 s8 `$ X    ThisDrawing.Plot.NumberOfCopies = 1" T. n! e0 N+ a2 J6 ~
    ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow% \3 j+ k, ^) A1 b4 T3 p5 v
    ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit# x. n( A$ S. R5 i- t
    ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True
* T1 J5 r. d& V( C- G    ThisDrawing.Plot.QuietErrorMode = True+ K) f- ^  ~, _0 B# G
    ThisDrawing.Regen acActiveViewport
2 k- V/ T9 ]! J" K  P& d    RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result+ F+ X" N! l8 N4 R
    RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 45 ~% F0 x  Z3 b* m! }  I
    RegCloseKey Result8 W* b, h5 l# Z# d6 [+ Q% N
    ThisDrawing.Plot.PlotToFile AZpathmdi1
; x" P; ^, N% V& Y& j; e5 E    Do While Dir(AZpathmdi1) = ""! X/ e$ X9 w8 _- _, ^7 t7 V
        DoEvents  V  W8 W. s5 U
        i = i + 1
- O; |3 I% ]8 d8 N7 g6 J; l    Loop
! V3 B. g- q8 C& V, u

9 m9 H4 q: Q) S2 @8 p9 m3 @在判断第一次plottofile方法是否完成时,粉色部分循环运行了40多万次;如果在粉色部分后面设置断点,然后再继续运行,则第二次使用plottofile方法调用系统打印机可以完成打印,程序可以正常运行,而为完成此次循环,蓝色部分循环需要运行运行30多万次。这两个循环中任一个都需要耗费150秒左右。
7 p* z* d7 W. n2 O6 Y
' c7 ^2 }2 h* \. ]" h8 V/ \% `而原来在AUTOCAD2004中,这两个循环 i 均等于0,也就是系统打印机与VBA程序基本上是同步执行的。% l' C- q7 S& k9 X* \: z

& r/ K; a4 y5 {& M! S5 }3 z3 [1 S4 O ' V. N- l- Y+ b: B
为什么会有这个差异?请各位大虾指点,谢谢
 楼主| 发表于 2010-4-28 18:06:18 | 显示全部楼层 来自: 中国浙江杭州
大家没有遇到这种情况吗?怎么都没有人回复阿
 楼主| 发表于 2010-5-1 17:07:56 | 显示全部楼层 来自: 中国浙江杭州
自己顶一下
 楼主| 发表于 2010-5-5 15:02:13 | 显示全部楼层 来自: 中国浙江杭州
问题已经解决5 k# }+ l% Z3 ^% N6 `, L: c$ g

, K: r4 k& [$ d7 \2 g% c! V1 S解决方法:
) Q: z4 t" l* B7 r- G在选项中不勾选后台打印关闭

评分

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

查看全部评分

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

本版积分规则


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

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

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