QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了( M3 z2 K2 I% k/ r; n7 O
4 F6 r) T! h+ g5 e
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。0 w: u9 n2 X4 H3 V& e
" T( k8 \2 O: q+ z
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。; D6 L. P  V0 n) w. r

% o) Q! E0 V( k# s8 }6 w+ \6 M这就是说plttofile方法是还没有运行完。3 _) I0 ~! N2 x7 N8 I

" w( Q: u1 p# }; H  i. K9 v问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
+ A+ V3 A6 E6 D" }/ W
; O0 s. w) D* F; f. A[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:! e. c9 m; e9 j0 L( a5 A7 `
Private Sub Command1_Click()
1 I2 d/ Y/ o# X/ y6 ?' M: t     'plottofile方法
+ g) M8 M- e5 M6 ^2 O     Unload Form1) _5 s9 b* K& }$ I
End Sub! A! R9 e, T6 T
Private Sub Form_Unload(Cancel As Integer)7 Q# O: V* [6 L. m2 G0 P5 j( {
     '此处写入需要运行的方法# g2 l* e) m8 l- O5 v
End Sub! D( @" Q* X4 v, R6 x; u' B2 N' R
& W, q1 ]' ^& P3 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.gif
. e( j- S0 f/ |6 l9 i/ D: z' l" }+ S检查指定的文档是否存在或许会更好一点?

* S# u9 G1 o3 E; J) a% C
, p: m" _, e0 `! ^" @* m: V4 Z4 K. F  P. ~

6 ^: M4 f! r( z$ j文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开: g$ B8 L2 l4 I. l0 d
7 U: W$ z" y$ R  c1 ~. V; V- t
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)- t( B9 C0 v$ w# ]. P
3 w! T- `/ u6 P
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
. N: d, o5 k: P0 `" n+ _    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
8 q$ H% Q. G8 i: V' Z3 S
$ t% U: \8 y; m; _ RetVal11 = 1                                                                      '关闭PlotToFile输出的文档# w. W! `" P1 N( j7 q
    Do While RetVal11 <> 0/ \9 p' S3 s$ D3 |6 b7 }
      winHwnd11 = FindWindow(vbNullString, drawname11)
* y5 p: e1 M3 e' O+ Q5 S. C& S        If winHwnd11 <> 0 Then
7 n. w% A' a3 U5 U0 k           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
) J6 ~/ V: R. I, M4 Z. S: k/ S           RetVal11 = 05 }: M5 L+ m  F- o5 O' K8 e1 }
        End If
) F5 t' r# ~& {, _1 v    Loop0 H1 i3 N' \% x' l! P; J1 s" e; U
RetVal12 = 1
0 T# W# q. @' c) r    Do While RetVal12 <> 0
' M- C$ n( a; n2 a7 ]5 p4 P6 l      winHwnd12 = FindWindow(vbNullString, drawname12)) K7 s  C8 |% |' y( d6 C
        If winHwnd12 <> 0 Then
, J  [1 ]2 O+ v3 T* Y& r3 [) D% m2 T8 A4 h! x           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
5 `' t$ |1 N4 U- |  b. a2 X           RetVal12 = 0$ _. C4 o1 E4 F. m: }" J
        End If' S4 E! f0 D% S- v
    Loop
! {* e6 x/ [$ d! C4 f' V; h
9 k8 u) Q# f) l* R1 c   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档" K9 _1 ~* n; ]
    Set M2 = New MODI.Document5 a5 U/ E* f. r" j+ K: }$ v% O
    Set M5 = New MODI.Document0 n# @' S6 Q9 t) i$ h+ z4 L
    , c6 c" i* Z% w
    M1.Create pathmdi11$ ~) b6 [3 ^9 q* ^  g$ N, l
    M2.Create pathmdi12
  w- m; |9 {+ G# F0 O& r/ [( O$ D    M5.Create" i7 @  u, x# D/ ~
    M5.Images.Add M2.Images(0), Nothing
7 F9 i% X4 H  |. j3 }* a    M5.Images.Add M1.Images(0), Nothing
: Y3 h( ^/ l2 Y    M5.SaveAs pathmdi0 j' W" Z! y% `  I0 g* D9 ~
    M1.Close& L0 G- C# t8 K! k  g4 ?8 B3 @
    M2.Close
8 c% d/ H5 s* m$ s* p    M5.Close' c1 p) w' M; }
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档8 U6 [3 n, A! ?9 n7 s
    Kill pathmdi12* k- B9 ?3 R1 b- b
2 S6 I4 Z9 H; E. c" @  _- O
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档4 A, z# i. d  ~8 g  e8 G0 |
0 \/ b7 x" A# P) i: l

$ M2 R' `+ V- S) F4 x! N1 p程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
1 Q9 M6 a* [" H) J5 p( w& w5 G1 N
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:4 j2 G9 s; s( i# c8 f! V
1、程序死掉,需要关闭ACAD;' F( B# c: o- V) q* d+ b# K5 ]+ G6 }7 T
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
* D2 y* m: W. p: l" i8 h3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
% j. t2 j1 W( X8 o0 y# Q* V3 A! D8 Y' n7 d
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
7 H+ ~+ ^& P+ l6 u* k( O' y9 U8 m4 F
如何在CAD中应用呢?
, P: P1 ~1 E' \, m5 ^% e( U2 u" g: ]% i6 Z& F3 W& Q+ y) x
OPENINMODI:0    输出文档不打开
4 T/ S6 V6 v- O" ~               1   输出文档在MODI中打开
' O8 ?0 c6 Q# [" l: |9 k3 d4 X, G  `' t

# U2 _* Z' i. T& z' h研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
: N* J9 `$ q0 `1 i  h/ K9 V我用下面的代码做了一下检测
, r/ B) u: a' \7 t* B% X

  1. * [& W: T/ W' y" h" g( R) e, ~
  2. Sub A()
    0 ?7 B: O' x* j# T; f% D* ?
  3.     Dim H As Long, I As Long
    7 i- u% t) j4 k% j7 g* q
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" 4 l/ Z3 L0 J3 w
  5.     PostMessage H, &H10, 0, 0$ X( U6 U2 s. X# |  [
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0: e8 p, |+ N0 x
  7.         I = I + 1
    * O2 S2 V2 x9 l8 L( g& _1 n9 i
  8.         DoEvents
    5 S# R$ |6 X$ E" S- Y
  9.     Loop
    & i& S7 L0 {; J
  10. End Sub
    $ c2 f3 w& D3 v0 i5 y
复制代码

* w- }: P. @' Q7 J. v在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
/ e- K0 I% r7 L$ C( F  }9 W% o建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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.gif3 D' O9 Z- g8 X- m# ?
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
+ f# [" w$ g% A7 ]- Z我用下面的代码做了一下检测
! b+ W& y# W7 ?8 k! Q6 ^& @9 O) \
Sub A()
1 d3 O! O9 l+ S    Dim H A ...

, o1 k4 Y: H5 l" ?! h% Z& d
, h5 u( G9 `  K6 X/ l2 S* z( G
# S; _& i& Y4 W! F5 B$ U& }谢谢斑竹, @( j% K# D6 R7 }1 K' l, v
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行$ Z% o. r- k( Y$ g: G$ u0 \
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif3 w, b: m8 |+ ~
既然是虚拟打印,为啥不可以输出以后在合并呢?
& o0 o( o- a+ J; l+ t1 L
3 d& S3 L  |+ {( k; M* L9 F
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸6 g' |6 G! d8 B

9 s7 U  [$ P2 v输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:) A- d) d, J6 X) \7 g6 j
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
7 N- i  n+ Z7 B6 j+ r2 i# I    .........7 g& l. b" p& @, a; e/ |+ G
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
. s3 y0 i0 R. m# o5 r/ l1 v* l; X: f    .........2 W1 |: U8 w+ q. o4 s8 g
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)) k6 C- s* q# ~/ V& g' I
        ........
- y! K5 y/ @- j' Q# H       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.gif4 ^4 J" |# z; u4 b! `) [
测试发现:
8 {* J  @8 T! P& t2 S4 k* L0 \8 w8 A    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:6 B2 C) `2 {, B, `8 V& U# D
    .........
4 X2 F6 ?. Q  f& ]) Z7 _    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
; Z' J- G. T) Q
6 W# W& p- }" h  l

! c& M2 m* B0 r- {不需于空打印,只需要空设置就可以了. Q! [( F0 J; e# p& D- D! ^

( N- e+ \0 ~( X+ o& @4 n
+ i: S2 v. v: s问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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