QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 4828|回复: 10
收起左侧

[已解决] 如何判断plottofile方法运行结束?

[复制链接]
发表于 2009-10-26 11:31:40 | 显示全部楼层 |阅读模式 来自: 中国天津

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
5 r2 Y6 t, P/ K/ T9 B
; K  y3 L5 \" c4 v: `在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。9 S* d) b0 s& o/ T9 ^
- s) ^' E! h. N; f2 S% n
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
" H6 h$ m& O, i7 g* b7 V
! M- Z8 }; K5 ]7 T2 y8 I2 K( v这就是说plttofile方法是还没有运行完。+ g% Q" r8 d9 \2 a5 F, r
# |# o# }( M* A  M4 h! f* o+ M
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?# {4 n0 |0 E* r" |4 O

1 |% Y. d7 w3 |& z( y7 u( I5 v8 g[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:0 x; }- j6 |2 n% Z# g0 g9 q+ h
Private Sub Command1_Click()6 S. Z* X$ a/ a( p8 O  Y
     'plottofile方法
  D: J9 h' l1 Y; ]     Unload Form1
# O0 y0 Q' @. |" U" }End Sub
9 {( l. C! b5 c6 y# m  xPrivate Sub Form_Unload(Cancel As Integer)
/ N! ]2 J% Q' H( C6 n4 H6 x& Z& H     '此处写入需要运行的方法0 l  |; _/ Y5 I) r  a  K$ @' b
End Sub
. `1 l; H" K; S- T$ Q+ @, C( i
8 l9 Y9 `& G, {6 p% m/ {从运行过程看应该可以,明天去单位试一下
发表于 2009-10-27 06:43:52 | 显示全部楼层 来自: 中国

回复 2# 157787698 的帖子

检查指定的文档是否存在或许会更好一点?
 楼主| 发表于 2009-10-27 08:37:12 | 显示全部楼层 来自: 中国天津
原帖由 woaishuijia 于 2009-10-27 06:43 发表 http://www.3dportal.cn/discuz/images/common/back.gif0 T0 o, _, ^' h+ J5 M
检查指定的文档是否存在或许会更好一点?

0 x/ i: V7 N+ h9 ^" k7 l: Z( U
% D2 j. o: p% B: J* m
9 f0 L# k) w' P0 ]2 |! k
; w. A% H+ }7 Y, W文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开  G3 l% Q$ t4 D6 u/ C1 ^

( h  ^2 K4 {5 G# J# a( Z程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)! I3 i& j0 p% Y, V, o7 n( W  V+ o

6 ^  `# a3 R/ o4 G% f    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
5 S* D& z" f. q    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)3 Z+ P" P7 x* D7 ]' n% A# \) _
( B5 L* \9 }) |
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档# q. c  b/ S& {4 T
    Do While RetVal11 <> 0
/ U# ~/ {0 U! \      winHwnd11 = FindWindow(vbNullString, drawname11)' u0 c# |6 F3 S6 Z: H4 w" P
        If winHwnd11 <> 0 Then
" D/ O! D8 K( X5 w3 {) I8 q2 o1 C           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)$ ?5 q, L( C2 E" o( T' j! u" u
           RetVal11 = 08 Z8 \6 C( F& y& n3 T0 t4 t, l* @
        End If2 j9 o4 R5 I+ C: P8 g# x
    Loop/ R' J. y2 @( |3 P
RetVal12 = 10 c  z. r+ a- U( A' q
    Do While RetVal12 <> 0
* x: w  n) \3 R+ P( ]% d9 ^      winHwnd12 = FindWindow(vbNullString, drawname12)9 f3 `2 _1 O9 c- ^) O7 s$ N
        If winHwnd12 <> 0 Then
7 \5 D7 K& x, ^( Q$ G( m1 C           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)% Y  |5 X. h/ |8 S# {* T
           RetVal12 = 0
8 G' X1 q8 t) ?6 N: `3 s, k6 @        End If" z$ ?- R! \+ `8 p; X
    Loop
" C" ^8 F" C( \2 d% d
) K* C5 I; F5 L3 U( k! S) }   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档9 Q' T6 l2 z7 }; y2 J4 ~9 b5 X$ C
    Set M2 = New MODI.Document
* V/ O  I; o; F3 t+ X. N  V    Set M5 = New MODI.Document
5 R1 I7 B- l7 L+ S% O    5 \/ C7 r4 R: u
    M1.Create pathmdi11  |+ o% \3 _3 V8 Q) A7 q  t
    M2.Create pathmdi12
3 D6 _) h6 `  B" o: q9 U    M5.Create
/ e3 ^  V& S9 O# e) f    M5.Images.Add M2.Images(0), Nothing
7 `4 i) J* h( |4 B3 X. I    M5.Images.Add M1.Images(0), Nothing. g& O4 o, F5 B  k
    M5.SaveAs pathmdi$ H, S! R. E$ ]" S
    M1.Close
, m2 H! x# j1 g* ^    M2.Close
; B: T  q9 P8 j    M5.Close
5 E. W0 w2 h% |2 ?2 I) E7 y. ~    Kill pathmdi11                                      '删除PlotToFile输出的两个文档9 I$ J9 ^8 h9 _' s
    Kill pathmdi123 q# q$ ~0 P+ N# e

, c8 ?; J/ ?3 [0 ?$ b    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
7 _; ~# k! K6 p+ L9 Y6 D; N6 b$ l2 R  ]% O
  D( M6 a  a/ g2 f
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档6 v( D, ^0 a4 d! w' E& U" G

5 _5 c' H1 ~& U; T0 {* e" i但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:2 k- C, L" E8 i3 n: A5 J
1、程序死掉,需要关闭ACAD;  P* c- H. ~6 ]( P# ^' Q  x
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;/ ]$ m  F2 W5 i" ?
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
0 U4 u. C/ E* i% O' i
9 X1 ]4 F) N9 q6 z! k现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
- G# A) f' a) h+ p8 _! c
" M* M, P) N  x' [: Y/ b如何在CAD中应用呢?
% n0 z9 y8 H  p  T1 B2 }& Z7 r. {. H  _7 x* {( Q
OPENINMODI:0    输出文档不打开: w6 ~- R' K7 k* H' ?6 u) g6 ?- L
               1   输出文档在MODI中打开
0 T7 Y" Z$ G$ L0 {$ H' J# a- Y1 L
- b1 {0 ?# L  P! v4 J3 r
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。' |& P6 _6 \0 x& ~( O; _
我用下面的代码做了一下检测
3 Z# g0 s4 [6 v5 t0 W. U: T

  1. ! X) `. k; N# N6 k$ B
  2. Sub A()0 y8 U- q1 K5 b5 x
  3.     Dim H As Long, I As Long* H5 w, J' K! S4 M% g
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" 1 |' u. L$ A3 r/ n' F" h: n. T
  5.     PostMessage H, &H10, 0, 0
    % n* A, M% k% a. _
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0) G) ?; Z  c0 u$ L" P% j
  7.         I = I + 1$ m' R6 j# G) d/ f" V
  8.         DoEvents0 C- u; Q( f, |
  9.     Loop
    0 k3 Q3 d$ C) Z0 Z8 E
  10. End Sub
    ! v6 D9 j7 e: l; L  p. ?9 {
复制代码

  X; s7 K$ O6 e0 s4 k& b. s在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
" |9 u. H- \0 b* }/ z建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 DoEvents,否则,在mdi文档生成过程中,程序会进入循环体运行等待文档生成和打开(在我的电脑上调试时,生成一个mdi文档大约需要30秒),此时CPU占用率100%,电脑会假死,你其它什么工作也做不了。
发表于 2009-10-27 22:31:11 | 显示全部楼层 来自: 中国江苏无锡
既然是虚拟打印,为啥不可以输出以后在合并呢?
 楼主| 发表于 2009-10-28 08:30:39 | 显示全部楼层 来自: 中国天津
原帖由 woaishuijia 于 2009-10-27 20:45 发表 http://www.3dportal.cn/discuz/images/common/back.gif
( |/ H$ @* e  F. @( o我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。/ S( g% L- O& H. R4 L; b1 J3 ^
我用下面的代码做了一下检测% m+ O. r. g) t' I" F2 t

8 ?9 T+ R, j, Y- }Sub A()
) O/ b; p0 _, ?, P* b1 l    Dim H A ...
8 u& n7 [3 L- ^/ X

/ ?9 j. E* b. `" s; `9 H6 X7 ~1 W) ~2 v2 y! x. K2 h  v
谢谢斑竹, F" i2 C  f9 Y5 f
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行0 n5 W. O2 ?" X! U* i
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
: y( j; F; P- A5 o+ O& z8 D3 i既然是虚拟打印,为啥不可以输出以后在合并呢?

0 E$ V9 i1 y. h! C, Z0 @
" A! E0 N/ n1 j/ a" d+ n# X3 T4 B我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
. v, p9 D$ D* q# u! w( y( q$ [1 D0 m/ Q- H4 h! O4 H* Q
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:9 J$ l2 s5 K+ o& ]5 f, R
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
: \# o. ^3 r5 G) ]    .........
$ J1 y# u6 ^$ M- U8 W    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
* l/ k+ q7 A% c0 J! S: F5 x2 {    .........
$ ^  A8 P2 O8 h5 R% e+ k0 \5 t: f( O    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
! l8 N2 n- P0 p" k        ........1 ]" r/ ^% f# t
       aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi123333, tempName)    ' 空打印,但仍然会输出文件,而且该文件是无用的
 楼主| 发表于 2009-11-2 18:32:12 | 显示全部楼层 来自: 中国天津
原帖由 157787698 于 2009-10-28 12:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
3 D4 S" G6 N1 ^4 d9 |测试发现:
! L  n0 o% y8 [' _    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:+ S/ F2 ?7 G3 q7 @& N$ H$ l  G( U* d
    .........
' k3 _* y6 [1 u# r4 E1 j    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
6 }$ q4 v6 F2 x3 u* b

, S( W% f% |+ J8 ]4 A/ I
- H. D5 V9 ~) B( D& s不需于空打印,只需要空设置就可以了
$ N% t" P9 R3 X. |+ @4 q; _: v0 I  j2 M" `! @' a

) Z, i3 j4 E/ N, f* D/ Z: P% k# l5 ?! Q问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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