QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2010-4-27 09:17 编辑
9 g, R: @# T* T  `" `6 D: Z  k2 V: R& q
本人写了一段VBA程序用来将CAD图形转化为MDI格式,此CAD图纸也同样是由此程序生成,原来在AUTOCAD2004中可以正常生成图纸并通过plottofile方法转化为MDI格式,但是现在公司统一将CAD升级为2010,这样导致此程序不能使用。
& T  W, ?! c7 H1 o6 R$ X
. G0 Z9 `5 i; w' ?& q, i2 H问题出现在使用plottofile方法进行虚拟打印过程。2 K3 e0 x+ k& p3 j7 f2 I) q" _

# b# a! L. m4 B, X$ F7 k9 u原来在AUTOCAD2004中,使用plottofile方法完成虚拟打印只需要20秒左右,但是在AUTOCAD2010中,完成统一个动作需要150秒左右,这是不能接受的。而且在程序中如果连续使用两次plottofile方法,则即使对第一次使用plottofile方法生成的文件进行是否存在进行判断,第二次打印时程序仍然会跳出中断。
% l5 c5 Q3 k9 C" K. I8 _: m& j9 m$ ?7 r  O$ _3 O, Z+ j$ y
具体代码如下:
# ~( m$ c; Q4 s6 ^
2 D' l& u5 S6 V5 C8 S+ C        point1(0) = -5 $ e  l& _8 [7 O/ x
        point1(1) = 310
1 ~, x7 R3 m. ^# P$ `) F        point2(0) = 420   A* V4 i4 g* Z" ~/ U
        point2(1) = 610
: @# X( g! X# B7 i- w& Q1 Q7 @       i = 0
3 ~1 w! ^9 U  @        ' Send information about window to current layout
; T3 g0 Y, N! u* o& M5 f2 l- r6 M        ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()
8 _0 e. E6 A% ~7 ?. K        ' Read back window information
$ [% I( o9 O$ _1 @, h( B: n- K        ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()  ^" @% K5 q2 M* H* Q/ z: `/ {
'        ThisDrawing.Plot.DisplayPlotPreview acFullPreview    '全局预览* R' y& p+ j: X
        ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees
- y& e. L9 P: D1 t1 ]% R' V5 x6 L8 G         ' 将打印份数设置为 1. q0 D7 S7 _$ M1 M5 D4 d
        ThisDrawing.Plot.NumberOfCopies = 1
) ^4 D) P2 q4 U/ R* z) [) T$ k        ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow
. a5 \/ S5 G; I! s        ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit( ]9 v3 m# b4 ~; O" p1 B- A
        ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True ') M7 b2 h& l9 Y+ M
        ThisDrawing.Plot.QuietErrorMode = True" v# `+ x( {" {7 \# V
        ThisDrawing.Regen acActiveViewport
) P1 g" Q/ ?3 O) \: u8 }6 C         ' 初始化打印
/ U& s6 @! x* t: K- e8 f        RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result" n7 q+ U( O5 M# o/ T! w8 X% W# q: S
        RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4
1 g# h, ~: Y/ R" W6 C        RegCloseKey Result+ R5 P* Z5 c! x& _
    1 i  b0 u' h9 g6 [* J
        ThisDrawing.Plot.PlotToFile KHpathmdi1
  `4 V1 v' v5 R/ f* g, |" b% J              '判断文件是否存在
! Y9 b: E- P5 K     Do While Dir(KHpathmdi1) = ""
, e$ @1 Q4 ]. T6 V            DoEvents% H( f6 V0 a* e% l
            i = i + 1& I6 e+ i6 O4 X* Z' w( M, f8 c
        Loop
   
  t5 e, m5 _5 w. m# ]    i = 09 V$ x; D  p. i2 q! ~3 _; X
   'On Error Resume Next
* Y1 \8 N! l) I3 }3 z9 I    point1(0) = -5 + F: p" q3 p4 J6 y. J* `+ b
    point1(1) = -3
- X! }. W+ H; Q" R, \  y& p& I    point2(0) = 420* {, `% g- F5 Q1 \$ A$ G" |1 O
    point2(1) = 297
( n) m4 ?7 C& k    ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()5 T3 i+ W" Z& y
    ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()
1 M3 e) j1 ^3 r! D9 A0 J    ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees* ^: y: w0 H* {: X( t6 X$ Y" I
'    ThisDrawing.Regen acActiveViewport" y, w9 z" h7 _1 o2 u% e& s. A
    ThisDrawing.Plot.NumberOfCopies = 1
, u" a! h9 E! [    ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow
' y2 t: E. V7 ?! T$ O1 U    ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit
' }& t  C/ k% @- P0 I4 X    ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True2 U0 J1 t+ H( K+ z
    ThisDrawing.Plot.QuietErrorMode = True
7 E  d* t9 L. s* M: p" b7 K    ThisDrawing.Regen acActiveViewport
/ O4 |5 W8 u5 ~" o    RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result
7 \$ d3 L7 I. a1 r& n& v* w    RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 42 z! ?/ q: ]; I+ `3 q. V
    RegCloseKey Result
9 F6 g0 c# g  V; V6 c3 b( j# A7 ]    ThisDrawing.Plot.PlotToFile AZpathmdi1- Q" S  y; N3 G6 A' C3 @* T; G
   Do While Dir(AZpathmdi1) = ""# w# C" U1 U) F1 ^1 i% A, ?
        DoEvents
; C# P" c) `4 }- X8 z        i = i + 1
; b+ d4 H! W* y/ F  R" L$ ]: |" j1 S    Loop

) M; R3 _4 e* Y/ c8 f' ^
& `" s: l* g' ~$ z& ?7 R! V* a在判断第一次plottofile方法是否完成时,粉色部分循环运行了40多万次;如果在粉色部分后面设置断点,然后再继续运行,则第二次使用plottofile方法调用系统打印机可以完成打印,程序可以正常运行,而为完成此次循环,蓝色部分循环需要运行运行30多万次。这两个循环中任一个都需要耗费150秒左右。
) A' c  d; t+ a5 I9 @
3 G0 T2 ?% {/ n3 T6 a' S: k& v/ O2 L+ g' \而原来在AUTOCAD2004中,这两个循环 i 均等于0,也就是系统打印机与VBA程序基本上是同步执行的。( t$ k2 p0 T6 L# k

, |4 G! j: ^( u- e* D% r
  n/ C8 z# a2 A6 F. b为什么会有这个差异?请各位大虾指点,谢谢
 楼主| 发表于 2010-4-28 18:06:18 | 显示全部楼层 来自: 中国浙江杭州
大家没有遇到这种情况吗?怎么都没有人回复阿
 楼主| 发表于 2010-5-1 17:07:56 | 显示全部楼层 来自: 中国浙江杭州
自己顶一下
 楼主| 发表于 2010-5-5 15:02:13 | 显示全部楼层 来自: 中国浙江杭州
问题已经解决
* \: [9 E! {$ K) H+ r' u. a3 ~% j: S' W) n
5 ^- S% ]+ ^' z, m2 B% n解决方法:4 O( F3 ~5 {( R6 I2 L: H$ s
在选项中不勾选后台打印关闭

评分

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

查看全部评分

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

本版积分规则


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

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

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