QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
! x  n. m0 K: Z0 d7 _7 T  r) {, z6 a% @. n, W
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
3 O" u" |3 L9 C. _  e* }# m6 I9 O' ?7 O# N
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
- S  p0 S" \3 O% w) q- `0 _+ F9 P2 C; R
这就是说plttofile方法是还没有运行完。6 z$ g( v2 `: i' _* n

0 I0 y# I7 x( x$ y& g9 p问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?, D8 b' f8 {8 H0 n6 d: {

0 S1 U. @* c+ [) K- w; [[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:: Q2 ?$ X7 S1 _" s
Private Sub Command1_Click()0 \, L2 `! L! f
     'plottofile方法
% X, N9 R& {+ T$ i* M4 E. T     Unload Form1
+ S* H* @$ J% K7 [End Sub# v# c! F  i. K+ o
Private Sub Form_Unload(Cancel As Integer)$ J, ?1 R" Z# U! m/ x& Q8 [0 |
     '此处写入需要运行的方法( s% S( ?6 s6 f" A- s
End Sub
3 ~3 N" D' I7 X+ e& e5 }0 Q% B5 V& ~: W
从运行过程看应该可以,明天去单位试一下
发表于 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.gif
+ y7 y+ g" w2 K/ U" d检查指定的文档是否存在或许会更好一点?
  f2 n1 V0 s  c  D, w8 P& A

1 F! D- e. M" @. q8 d- y7 M* O. T2 f% @, b
% ^/ L) k/ S/ m% Y2 X7 e/ @% h+ _4 X5 i4 I
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
- I/ D. u/ a$ m% W5 A. p1 H
0 m" f+ h& C9 V* x0 p" L1 R8 T) u程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
4 t5 m& u1 c; V2 v0 y0 l* N. \, Z/ S; G3 r- v
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
3 ?* G+ H1 S% J, H, F7 S6 s    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
- d, p  J, z' w1 S* Z- U! e! n4 M  [, v0 h4 [) _# [! R: m0 I' {
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档/ R- P2 Q; P1 R( _1 `& E
    Do While RetVal11 <> 0
6 H8 N& ]& p6 Z6 i2 q      winHwnd11 = FindWindow(vbNullString, drawname11)/ C& C( H) F* j0 J: X- d- e/ @5 G! a
        If winHwnd11 <> 0 Then
5 ~" {% q) I# ^# M# \$ U           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
: s5 z# Y# i' I$ F& t' F) W           RetVal11 = 0
- p2 ]) M- g1 Y+ C) q$ f. f        End If' u) z- \6 G& I( U
    Loop! b& v6 {  t+ t3 `+ e' x
RetVal12 = 1
& J+ b& {4 \; @    Do While RetVal12 <> 0
, u2 @% X& f$ c7 g5 o      winHwnd12 = FindWindow(vbNullString, drawname12)
& x4 n- b2 I  T# [8 B3 \# p, l        If winHwnd12 <> 0 Then( X  y6 P( L+ d% z& X' [' K
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)# ]7 P( ]. K1 S( v
           RetVal12 = 0
. ~+ Q7 r2 ^8 o  A( }/ @  E        End If( w: x' d% \# t% g2 F3 b
    Loop
& c" ~7 S" D1 m  I- m8 n2 l
( l& V: ^) |/ B   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档$ u$ B" \$ K/ O0 M/ Y0 w
    Set M2 = New MODI.Document* I+ m+ i2 K. i7 r$ X- P
    Set M5 = New MODI.Document
% _; s( |; d- f" L    ( [8 p$ j+ H" @1 q9 Q% A
    M1.Create pathmdi116 w2 `' ]6 a2 l9 w
    M2.Create pathmdi12( B! |2 k# w; i/ c
    M5.Create; n, x( c5 _; M' B; C, P3 s9 q
    M5.Images.Add M2.Images(0), Nothing# w0 {2 p% S% r9 t
    M5.Images.Add M1.Images(0), Nothing
- w9 ?+ d1 j4 V7 Z& z5 ]2 e& M    M5.SaveAs pathmdi
9 f" a3 j( ]! L7 ^) N2 s* f    M1.Close
# R7 v5 E- e3 n. }4 r1 D2 w- I    M2.Close- O% B8 t  D7 @
    M5.Close5 [- S( c- x0 }3 u2 t
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档5 O# g1 a- z# v
    Kill pathmdi12
3 W* D9 d" W1 N$ A& C) ?3 @# P# Z5 V) e( R, J) z" `+ o9 ]. c+ k
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
8 \, f7 ]* t# u3 P" p2 h( r
4 ^  t0 {& g% u( |9 m! L
$ v# U. L4 h, e3 I& I& i程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
4 l2 G7 k- w) W% v  U
# r& C* k- r6 I0 s3 c2 m但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
4 A4 l! R8 L. z# n, W1、程序死掉,需要关闭ACAD;
' u. {& Y9 F. ~* G( k" U2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
7 C4 z' t% o1 o3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
5 i0 a) Q. T* }4 [3 R6 M$ E% F5 r
7 v1 @/ T; p2 w9 p, g! h现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的% Z/ \) x( g( J0 G* C

+ I2 T: K0 U5 E9 a, ~6 \$ {如何在CAD中应用呢?
$ B9 F; t# q# `- ]0 d4 m
  a# o  _; h. {0 p& U, F9 J6 _OPENINMODI:0    输出文档不打开+ ]+ ^+ C; [$ q6 H; z
               1   输出文档在MODI中打开
# A. e. V- J( N: W1 V) j) u2 r+ W1 R- u1 {6 J, |
. j: q' ?: m- c6 m. x
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。4 L' n- ?* ^2 K( \' H) e. `
我用下面的代码做了一下检测
" X! t' y' N- k+ a, w2 [3 u
  1. 6 O- E, f) b& }; B3 X! U, Y$ N
  2. Sub A()- X$ y) D; O$ I% K$ O
  3.     Dim H As Long, I As Long
    1 P7 v1 p  b) j# T
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    ' b! G% a* u9 j* s3 i8 Q3 A! H
  5.     PostMessage H, &H10, 0, 05 A: k; x3 `0 t5 @9 a
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0( {) T& Y, |$ Y  P3 i
  7.         I = I + 1  b! q3 e- j+ p1 ]) W
  8.         DoEvents
    , L4 E% v9 s( p
  9.     Loop
    & R/ o: n3 c4 M
  10. End Sub
    % f* ?: O& l5 W" l8 p9 t
复制代码

# _1 M2 @% h9 e/ }# A% V在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。. @0 Z# _1 I$ Y1 N: M
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
1 Y; o: y: R: n- K- N+ ?我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
. }: n# f) m7 K! X& |; a我用下面的代码做了一下检测# N, m$ }8 p  Y" U8 a
: Q. O% d# t* ?3 e6 u
Sub A()' {$ a$ D' |, |- A; D
    Dim H A ...
/ S$ |6 Q( O2 n: o1 l0 t& ^

( N0 L. Y2 Q+ i! L9 v6 n( [
4 D" j& _4 P- K- Q谢谢斑竹( a% R2 e1 s+ a9 p7 Q' s: y* X
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行+ @+ f& X! I) K. E9 z! B! f
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
8 ^7 l/ w7 z: f! g& s$ r既然是虚拟打印,为啥不可以输出以后在合并呢?
& X$ T3 q: J- w3 G1 @

2 t2 K* f9 Y8 V( H; E我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸& j" d* H: }; }" o5 t

5 h. e" Q- c# y$ y输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
3 ~8 a- [( m& E    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
% @# n3 a9 B: u9 T7 K9 H4 t    .........
2 @: e& V6 o; R    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
4 m/ @( Q6 D. P$ y+ {0 o: f    .........1 g( j% l) M0 ~' y' t/ j# ^1 F# K: ]
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
1 |$ e, Q! r) h( s. c2 e, h: ~' G+ {        ......../ u% p5 j$ }$ E& Z3 z9 }' l
       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$ z" ^; W8 q1 H3 x
测试发现:
$ X$ m4 v; V1 w* ^    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
0 Z" I' x* l4 z" d7 A5 r    .........
9 H. B  p  n; h5 g    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
; b- G1 _# i$ [1 n3 \; ~' A3 i
1 k  Y* d5 T% u" e8 S/ d1 Q/ q

/ g) _" B) j# @  P4 A4 x4 ~不需于空打印,只需要空设置就可以了6 Q9 Z- K# `1 P+ A& D: Y6 Q4 b
/ p  P) l3 D" V% ~: Q
+ L0 n3 e8 r( H! L0 C# X% r
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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