QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2010-4-27 09:17 编辑
" F" I; I/ k8 k0 ?5 m7 U3 f; `3 ~9 i/ c$ t
本人写了一段VBA程序用来将CAD图形转化为MDI格式,此CAD图纸也同样是由此程序生成,原来在AUTOCAD2004中可以正常生成图纸并通过plottofile方法转化为MDI格式,但是现在公司统一将CAD升级为2010,这样导致此程序不能使用。) C$ }  m0 m: C+ f* o1 L, T
* g0 _8 {7 [; j6 W
问题出现在使用plottofile方法进行虚拟打印过程。' g' }. U/ O+ R# P

8 S" A, g& e0 s) J; ?5 c6 k原来在AUTOCAD2004中,使用plottofile方法完成虚拟打印只需要20秒左右,但是在AUTOCAD2010中,完成统一个动作需要150秒左右,这是不能接受的。而且在程序中如果连续使用两次plottofile方法,则即使对第一次使用plottofile方法生成的文件进行是否存在进行判断,第二次打印时程序仍然会跳出中断。- G6 O9 y" k- p* W2 S
- I2 {3 B- E+ h# }6 q! u
具体代码如下:' R) H- ^; v( C: I* A$ A, d7 O
: J) |) d# c/ a8 z7 P
        point1(0) = -5 % T- f( F! {( ~4 I
        point1(1) = 310
0 v* h* t6 N7 G        point2(0) = 420
+ y0 N* e* f5 I/ S        point2(1) = 610
% z% i7 R% ]6 }( T* [: K, k+ g       i = 0
) M( F7 r  ]7 r        ' Send information about window to current layout
. b& h2 a5 \9 c. g; y        ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()6 x  S! z1 ]+ |4 M
        ' Read back window information
! E1 e! H' _4 Q. J! {* u        ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()
; [/ E, |0 d0 K1 p, H. R'        ThisDrawing.Plot.DisplayPlotPreview acFullPreview    '全局预览4 Y( c2 Q8 a! F! N/ e
        ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees+ I& c# C' `8 E, y! w
         ' 将打印份数设置为 1' D6 a5 }5 `  J( ^
        ThisDrawing.Plot.NumberOfCopies = 1
% g& B  i& b' }+ E; x( k3 k        ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow" {* z. X% i- q' g, [
        ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit3 {: ]) H+ E, l, B6 M% I
        ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True '2 K* B! }3 n4 [' b5 V
        ThisDrawing.Plot.QuietErrorMode = True
' m" v2 I  W" M7 I- Z        ThisDrawing.Regen acActiveViewport4 e9 p2 m4 q) i
         ' 初始化打印
0 F5 I2 A/ r& t' Q. I' ?  z8 L        RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result2 I* S$ ?0 k  |; J1 G: k
        RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4
4 N5 P3 l5 ?7 \        RegCloseKey Result
$ Z$ {: c# |6 U* ^8 b   
1 y5 `( b! J. R        ThisDrawing.Plot.PlotToFile KHpathmdi1
! z9 N: t# @" H" i              '判断文件是否存在& B# K/ S& T, o. L2 N" q& E
     Do While Dir(KHpathmdi1) = ""
4 ]/ ?4 H& G$ a, S- \" E            DoEvents; S" i+ L, D6 [- ?6 Q
            i = i + 1; h4 x' E# C. i0 \+ }
        Loop
   
3 u! ^$ T) r- i4 N7 ~- V    i = 01 U: t* n: B4 U+ e' }( F
   'On Error Resume Next, p: x1 u1 }8 w% o
    point1(0) = -5 + H" n9 X+ c& n
    point1(1) = -3 " t5 \5 f1 F" J6 n8 @: ?
    point2(0) = 420
7 o  m9 [2 K7 @; S3 U1 E; ?1 w    point2(1) = 2970 B' g; a+ i& @6 R; s
    ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()
( F2 d8 V- @# v% y  A9 T    ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()6 i" w6 }% ?3 ~: c8 O
    ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees
/ |; {2 B3 B& R- g0 A* V& S& v: k'    ThisDrawing.Regen acActiveViewport. q1 d; Z& g( B/ T5 v
    ThisDrawing.Plot.NumberOfCopies = 17 r4 ~6 V, Q5 D: o; k* G
    ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow) Y" j/ `* K" p2 E, J0 a
    ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit
6 k. X+ m( C- V. k8 e    ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True
9 d" k" I( h8 ?3 N* O    ThisDrawing.Plot.QuietErrorMode = True6 k" A2 f2 {0 ?* b( s
    ThisDrawing.Regen acActiveViewport6 o& J& f' h8 y$ U2 I
    RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result& g; S9 Q. e5 f$ T4 M8 |) |1 c7 {$ }
    RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4
  H- o! v4 G. e9 h/ s/ F    RegCloseKey Result
2 o# a3 K2 U7 \2 `5 s8 Y" U+ [    ThisDrawing.Plot.PlotToFile AZpathmdi1
# C) }5 z! \* C* {, r    Do While Dir(AZpathmdi1) = ""$ ^- M% q. T$ F: g0 R- h4 q6 m- J- z
        DoEvents. r+ s) y$ |% B0 R
        i = i + 1
; X% S5 x3 m: B7 o0 d- A" x% T4 Z8 B    Loop
6 s( {: l$ w7 \+ g2 L; b% H

+ m3 z( K) Q8 }  f0 N在判断第一次plottofile方法是否完成时,粉色部分循环运行了40多万次;如果在粉色部分后面设置断点,然后再继续运行,则第二次使用plottofile方法调用系统打印机可以完成打印,程序可以正常运行,而为完成此次循环,蓝色部分循环需要运行运行30多万次。这两个循环中任一个都需要耗费150秒左右。4 o& i8 T# ?0 C9 h

/ B  g( Y8 t) e' R. F而原来在AUTOCAD2004中,这两个循环 i 均等于0,也就是系统打印机与VBA程序基本上是同步执行的。
) ^3 S/ S' Q( `! M
1 o& v+ e3 i& V( M6 u3 v6 h  a / }/ i2 P  ?3 Z
为什么会有这个差异?请各位大虾指点,谢谢
 楼主| 发表于 2010-4-28 18:06:18 | 显示全部楼层 来自: 中国浙江杭州
大家没有遇到这种情况吗?怎么都没有人回复阿
 楼主| 发表于 2010-5-1 17:07:56 | 显示全部楼层 来自: 中国浙江杭州
自己顶一下
 楼主| 发表于 2010-5-5 15:02:13 | 显示全部楼层 来自: 中国浙江杭州
问题已经解决. ?. S5 D" x5 i! l' r
" v4 N+ f- L( p, y6 {- e
解决方法:
* }# |3 z* S3 r& Q( W; @% R. t5 r在选项中不勾选后台打印关闭

评分

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

查看全部评分

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

本版积分规则


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

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

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