QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
. s+ M# u) q2 h* v, T
$ z1 f: n5 ]6 z0 i9 C在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
. ?9 ~4 P, i: L9 A
6 G+ X9 H! O  A( }, f$ t+ R# ?但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
$ M% d( M2 D+ f" z9 R' o) Y2 N
  p& e! G- S  W! A* {9 w+ H7 ~2 W这就是说plttofile方法是还没有运行完。4 M7 I. s5 |! L6 @0 n$ b5 Z0 W
, v8 w/ g/ e) a9 u0 V. ~4 I# q
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?8 g1 ?) `; O* W9 {& H# W2 A
4 L- U, H7 s9 j$ Z  ?5 r* U; n
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
7 N9 Z! R+ s6 {" A" g) I, s4 FPrivate Sub Command1_Click(). w3 G0 u; N, A8 p1 S  c6 v% E
     'plottofile方法
/ w$ e8 A7 _+ g     Unload Form1; p5 r$ K3 A" X: ]( o
End Sub: t3 O! _+ |' e6 y0 k& P
Private Sub Form_Unload(Cancel As Integer)3 j+ @2 f* L9 B& W
     '此处写入需要运行的方法9 g( f# x1 E" l+ e: y; E
End Sub/ s; ~. g" v: I9 y' f. S
& x9 m  }, i8 A  A
从运行过程看应该可以,明天去单位试一下
发表于 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) F3 t2 `$ Y; G' W
检查指定的文档是否存在或许会更好一点?

$ H8 y# y( t+ {8 i4 `
5 ^/ Z# p5 c  U0 B- F, _. a/ {% T) G

; o; B- y  K. e/ N文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
' b# A% G' ~2 B# u3 m0 v/ y
, K  q3 a- j8 U程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
- k3 N1 K1 |/ {9 N
6 V+ n4 y/ {" p9 f    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
3 m5 v: G3 I& E. T3 {3 y0 O/ F    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)  Q1 a1 S: l: r( ^5 w4 x0 u- B

$ ]3 q) w6 \* y  N RetVal11 = 1                                                                      '关闭PlotToFile输出的文档/ N: F1 T) @: _
    Do While RetVal11 <> 04 ]$ g& B& ?9 I, e
      winHwnd11 = FindWindow(vbNullString, drawname11)
( r' ?/ N# W- U. C5 l        If winHwnd11 <> 0 Then
" y7 H% w5 y% v           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
( W3 k! U) V" R. F; G3 W2 o: I           RetVal11 = 0% B9 w2 ?1 L9 |- |
        End If0 G5 s9 ?% A4 |# s6 b) h
    Loop5 B) s! b6 J# p: O& M/ H
RetVal12 = 1
$ P1 s: j$ V& A6 A+ g& d/ U+ O    Do While RetVal12 <> 0) x0 b3 C! l$ o8 F
      winHwnd12 = FindWindow(vbNullString, drawname12)) A; A  f0 I5 g) y2 k: M) f3 V$ z9 k5 N
        If winHwnd12 <> 0 Then
! e$ P, z5 }; {           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
* ?8 A2 D$ ?- j' ~% \: P           RetVal12 = 0
+ s- @# a5 n% U8 }) W! W        End If
8 c- s) ~& R7 p$ M9 n& G! L; \    Loop
" i% V' G6 w$ G# c9 C5 b: h7 o' y2 L( O6 a9 ^4 ?- }
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档. I: B. n; V, V" `
    Set M2 = New MODI.Document
+ y9 K: f! \0 f& l: N3 B: q    Set M5 = New MODI.Document
) {  Y8 w& ~) p: L   
6 t5 g% t* f- O. e) Z6 z  P; ^    M1.Create pathmdi11
6 _. ^7 {4 V/ r7 i- J    M2.Create pathmdi12% ^4 n" L! ?! O3 f( M4 |- b$ s/ ?
    M5.Create+ s: R2 f( M' s6 I# I2 ^3 h; m
    M5.Images.Add M2.Images(0), Nothing
, R* t+ O9 P9 _3 H' |    M5.Images.Add M1.Images(0), Nothing
5 R1 t8 ?1 @- u3 L, h    M5.SaveAs pathmdi
) V; r" G9 X5 g% x2 C& O4 R, G    M1.Close% H- p7 v! T* h5 q& J8 D7 Q- c) U
    M2.Close+ T/ d. C  z0 z: _8 b- v
    M5.Close0 m% K6 l: a8 O4 f; }1 s
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
) n: T7 N8 c" W    Kill pathmdi12+ K! S8 O1 J  r

4 G* E, I3 y- v( k/ N- y2 @+ j    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档* t/ C) p1 `4 X( x3 d, m% f' [% C

0 U, ~& x5 ^9 X( ?# ^0 t$ e. t
$ ^: u' j% N) ~( u程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档2 M5 H% _5 b' M4 F  H, d4 b

; S3 N; F7 F; C; f! n8 s+ j: W但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
( V$ O4 R! A+ d& o. C, ^4 A1、程序死掉,需要关闭ACAD;( `' b7 p8 I' C' W  r) J
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;( f& U7 r. Q9 S# N' |7 N, @
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。( e5 Y; D- d* K. x

, E6 ?# W2 T) c% k( ^现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
' k( m8 ]5 x: a* p6 [. ]  m' |0 e5 S5 k  H4 i5 E
如何在CAD中应用呢?
6 `- p' I( f+ T+ G  K7 i: `% b5 q; c
  W' H. d( `! _" g( E# o4 @" wOPENINMODI:0    输出文档不打开+ J" f, B1 R# {
               1   输出文档在MODI中打开
+ X( m) D# P. ?/ U. I
8 p, e* Z3 I5 H* w9 {1 D& |2 p6 s. L$ c$ m
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。) }5 Y% u5 ^2 i9 Z  P% e! E" D& ]
我用下面的代码做了一下检测" @3 ^! c  B1 k# B0 z% `
  1. ) F' q4 w) l. q. W0 `2 `
  2. Sub A()
    3 z0 ]2 ~# b  d, C, E* ~; R- S+ t' L
  3.     Dim H As Long, I As Long
    4 B4 r5 ]$ Z4 R4 H* F
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" 8 N: n9 s) }: g! \. ?
  5.     PostMessage H, &H10, 0, 0
    + n2 S4 w: R/ Z3 f
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    ) g" j; E, P4 n/ i! W9 v
  7.         I = I + 11 Z* R+ k- |6 d5 U
  8.         DoEvents
    ! i4 q7 c& k- E, b3 j
  9.     Loop5 D- T4 f. \8 Q" O
  10. End Sub) j+ n) \+ f+ M/ b- F7 {! C; B* V
复制代码
6 @2 \' h& b  S- |' i
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。4 z9 w. }0 F. p. p/ G; y4 \
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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* _* n2 o/ G- c; Y2 v: y
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
! p6 `( {- {. s8 [我用下面的代码做了一下检测, d% e) U6 z7 e# f2 o! S
1 @6 G. @8 ?! a
Sub A()
8 C7 N) w# j$ U" a/ ^0 [    Dim H A ...
6 e" D' `, m) ^

9 m2 Z  o* l. ?# [3 q2 S3 d8 }6 }# l" d5 f3 @, y7 A) f) A
谢谢斑竹
0 ?! G) `* d$ M窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行4 _6 g! B' O; C0 y4 |4 E
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
4 [- [# c$ L, L5 `4 Q6 v既然是虚拟打印,为啥不可以输出以后在合并呢?
' z! K- V. Z& B9 [! y3 Q7 {7 A8 W
' I5 ^! H0 w) O& [4 ]" D: i
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸* T7 N" c* B6 [3 S

5 u, T5 c5 ^2 x3 M输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:, [$ f) g$ {9 p% y( }! v
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:* N% t7 _( F4 x. ^
    .........( S" q: N4 I3 k3 ^0 l# X& B
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
3 c& O5 K3 u3 J+ N    .........+ h& ~. O3 n/ J  F5 h7 M' g5 D7 x
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
9 n: f2 p& x2 n" N5 @        ........
, e2 L+ Q2 _* W9 S# a5 ?       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.gif8 @9 V; z, [( K
测试发现:! U4 x  A! C1 A6 O
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:& e  g5 p. A% o, Q3 ~7 ]% ~
    .........
# Q2 @7 c2 J2 E  G: f4 A. H    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

& [4 z* q3 ]# H) J1 _2 H2 ?+ f) Y
: S: C6 c" ]5 d6 f" M8 O6 k
: F4 H; [, R4 r/ u% o' w不需于空打印,只需要空设置就可以了( C+ T; t% I% [6 w

+ @# x7 J8 Z% K% L; O/ S& h; B7 J
, W# S: N0 i5 X3 n6 J) N* t问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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