QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 157787698 于 2010-4-27 09:17 编辑
  X( a3 ]! f1 y" \* F/ \' v( R
- u+ J* m& p' Z; ?本人写了一段VBA程序用来将CAD图形转化为MDI格式,此CAD图纸也同样是由此程序生成,原来在AUTOCAD2004中可以正常生成图纸并通过plottofile方法转化为MDI格式,但是现在公司统一将CAD升级为2010,这样导致此程序不能使用。4 U: N5 |8 q" Y
: c" w5 t" O# k1 s9 P* F
问题出现在使用plottofile方法进行虚拟打印过程。
' I/ d7 f6 l( W. {) |' k- S; N6 Z- Z
原来在AUTOCAD2004中,使用plottofile方法完成虚拟打印只需要20秒左右,但是在AUTOCAD2010中,完成统一个动作需要150秒左右,这是不能接受的。而且在程序中如果连续使用两次plottofile方法,则即使对第一次使用plottofile方法生成的文件进行是否存在进行判断,第二次打印时程序仍然会跳出中断。; g+ M2 z& h6 |

; K8 u; ]% d- N9 |2 G) {具体代码如下:
* F4 i0 t' Q, n* _$ L3 ^- J, ]2 m5 i, u6 b/ b1 N
        point1(0) = -5
8 c8 _0 a6 x" }3 d        point1(1) = 310 4 j& ~1 Y+ a: N% |
        point2(0) = 420 $ W2 y, V! G/ Q( v; P' X2 J5 |
        point2(1) = 610
% V" J  n0 q* i* X9 a1 S       i = 0
" m0 c" }! W# v+ B: ^1 j- F4 s        ' Send information about window to current layout
' T. j4 w5 T- Q  r* u        ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()
1 y3 }8 z! n8 G- ?+ A* k, P2 o0 @& P( J        ' Read back window information
: }. G& o' P; }4 |& [        ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()- L' R/ t9 D! E" @& p
'        ThisDrawing.Plot.DisplayPlotPreview acFullPreview    '全局预览2 L5 k6 V% E; g9 }, E8 L4 q- C
        ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees0 w& c$ X; m' a+ u, z
         ' 将打印份数设置为 1
+ Z8 X, K6 d6 _        ThisDrawing.Plot.NumberOfCopies = 1  e4 K  C6 g8 U, r) ^
        ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow
' W5 o: S6 H- J' g6 g& u! t4 f        ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit
, Y6 X* N* P( N4 k3 P6 x        ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True '+ l& u! x; f* t/ S+ K& B& Y8 S: y; |
        ThisDrawing.Plot.QuietErrorMode = True
$ I1 }4 ?! a( z4 @        ThisDrawing.Regen acActiveViewport/ D, D( V0 B( K) ]& X5 W
         ' 初始化打印
& |) d. ^9 D% F2 o: R# Z. |        RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result
/ _1 c5 G/ K4 d$ G- Z, f. B& x        RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4* V" o1 x" o2 _
        RegCloseKey Result
& N, z9 X/ ]! M  W1 }# l   
, m6 p* G1 t! j; z        ThisDrawing.Plot.PlotToFile KHpathmdi15 D9 x) @( Z/ V* [' I
              '判断文件是否存在& \% p3 ~) O1 g3 a
     Do While Dir(KHpathmdi1) = """ P  x- i  z# c
            DoEvents
' ?* {1 [, \3 |# v0 e: R% K1 F1 ]            i = i + 1
4 m# {( V4 F! k        Loop
   
. I# A" B; U; q/ f* u# O7 D    i = 0
/ |  [3 B2 ]# r   'On Error Resume Next" D$ X) ~3 v0 v" b
    point1(0) = -5 1 @# G7 u! q- B0 P
    point1(1) = -3 % ]% o! G5 c4 V$ M3 @- q0 G: X
    point2(0) = 420$ J  Y( |. Y4 L8 w/ U& N) A
    point2(1) = 297/ X$ K7 N. i' f& @4 P
    ThisDrawing.ActiveLayout.SetWindowToPlot point1(), point2()4 c& R5 T$ Y+ N1 X& t
    ThisDrawing.ActiveLayout.GetWindowToPlot point1(), point2()1 p0 x9 \5 U  n/ A" i' K
    ThisDrawing.ModelSpace.LAYOUT.PlotRotation = ac0degrees
# b! |  ~1 G0 o4 h) e- [9 e$ [) j'    ThisDrawing.Regen acActiveViewport
7 K4 M8 j6 `: A% s& V5 g& v$ l    ThisDrawing.Plot.NumberOfCopies = 13 g4 P5 S+ [. k1 N
    ThisDrawing.ModelSpace.LAYOUT.PlotType = acWindow& Z2 X" p: ^( ~7 Y# y
    ThisDrawing.ModelSpace.LAYOUT.StandardScale = acVpScaleToFit
6 X  y6 o9 r* G! g    ThisDrawing.ModelSpace.LAYOUT.CenterPlot = True
  Y- F& x( }& l' t( U1 C8 ~+ l    ThisDrawing.Plot.QuietErrorMode = True6 C9 J5 G( s7 }7 |
    ThisDrawing.Regen acActiveViewport
* o) t6 `/ V" b$ N9 ^    RegOpenKeyEx HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, Result
2 c' o7 t# [) q7 d    RegSetValueEx Result, "OpenInMODI", 0, reg_dword, 0, 4
7 c7 V6 t; n) ?$ G    RegCloseKey Result7 b; W4 J- m& ~1 b3 ]+ \
    ThisDrawing.Plot.PlotToFile AZpathmdi1
3 }$ X6 {7 j# p. n; n    Do While Dir(AZpathmdi1) = ""0 _) t( ~0 u3 R
        DoEvents
1 ~  P/ y; ]9 V, k3 {8 V5 @        i = i + 1: @& {& U( O+ u) c$ d) }
    Loop

2 {  T; D- p' q7 o  U ; w- K+ `( p' y( ]: A7 b% ~& y
在判断第一次plottofile方法是否完成时,粉色部分循环运行了40多万次;如果在粉色部分后面设置断点,然后再继续运行,则第二次使用plottofile方法调用系统打印机可以完成打印,程序可以正常运行,而为完成此次循环,蓝色部分循环需要运行运行30多万次。这两个循环中任一个都需要耗费150秒左右。- P8 s! B* h& \& B
6 V- S4 k7 V/ R5 A
而原来在AUTOCAD2004中,这两个循环 i 均等于0,也就是系统打印机与VBA程序基本上是同步执行的。  e+ w2 J" E, J& i, \
8 P& [, N5 v& {6 [2 b7 V9 \
+ z1 n! e  F' H9 c# a0 c. K
为什么会有这个差异?请各位大虾指点,谢谢
 楼主| 发表于 2010-4-28 18:06:18 | 显示全部楼层 来自: 中国浙江杭州
大家没有遇到这种情况吗?怎么都没有人回复阿
 楼主| 发表于 2010-5-1 17:07:56 | 显示全部楼层 来自: 中国浙江杭州
自己顶一下
 楼主| 发表于 2010-5-5 15:02:13 | 显示全部楼层 来自: 中国浙江杭州
问题已经解决# j$ w- n- ?, r' M
! i- H# b" L; z. E  B& M1 B3 K
解决方法:( E7 T) X" K* |% K
在选项中不勾选后台打印关闭

评分

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

查看全部评分

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

本版积分规则


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

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

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