QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 4805|回复: 10
收起左侧

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了, q0 k2 a; y& h2 \3 P

) m2 M+ c  o) {! z! j在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。  f6 @& p- M+ T# `1 L  l
8 Z1 _) G6 n. s. b* P
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。) S9 z3 K* a# o: b8 V

9 o6 `0 s0 y7 `这就是说plttofile方法是还没有运行完。0 Y. w2 i* U; U

* j8 `. h9 M+ f# ~6 d问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?5 I5 U  d* N# y. c
. @4 Y& l& `+ Z7 C' r3 X
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:9 s- y2 m8 i# u% Y
Private Sub Command1_Click(). _8 @; }) q9 r: ?
     'plottofile方法  J" k$ k3 o5 L
     Unload Form1) o* ~9 T" A7 |$ a+ |& i, C
End Sub
' l% H8 Z4 ~$ |# `4 UPrivate Sub Form_Unload(Cancel As Integer): N6 G% @3 D1 T5 j" Y
     '此处写入需要运行的方法7 C/ {, r* B: z7 r; j5 y) R) G
End Sub  e5 a( X* q- _
. B: {! [( Z* C4 h9 f* C
从运行过程看应该可以,明天去单位试一下
发表于 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
0 c/ @6 ?6 D# }2 y, e( F: n2 N3 f5 P检查指定的文档是否存在或许会更好一点?
: j2 R' I2 p4 r

+ O+ y3 B2 A# m" j( w# T
+ H7 E# S2 v6 Z" M
- y6 ]7 Q6 I9 C( @( Q/ Z文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
9 ^1 v) N* v, R. @1 o' R3 X* Y
9 r3 f+ O$ n2 V& m' B8 N. I# z程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)3 ?9 x5 u( E9 r3 M$ ?

5 ]. U. p( R, X# y. T    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式* _! l& e9 B/ p' w
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)' f5 W. ]" o9 ^+ ?. K

" o+ r0 n1 T$ K8 o6 l$ ?. C, m; F RetVal11 = 1                                                                      '关闭PlotToFile输出的文档, x0 {+ i  R# G% t
    Do While RetVal11 <> 00 \& O' r% i; _1 ^* ]
      winHwnd11 = FindWindow(vbNullString, drawname11); V, m. |) E/ |6 }
        If winHwnd11 <> 0 Then
4 y9 P3 `, i* g: W3 C# [           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&). H3 _2 g$ ^3 @9 n0 @5 q/ M
           RetVal11 = 0/ R, K5 E1 @3 Q
        End If
3 |1 u) w( S, W% w    Loop
% g8 w0 y- U1 Y  uRetVal12 = 1
4 H: K  {( M. Z% C$ |    Do While RetVal12 <> 0
1 F0 S! s8 @! p) t3 @      winHwnd12 = FindWindow(vbNullString, drawname12)
- X" h; ~: }  Z8 X& o$ w        If winHwnd12 <> 0 Then' ~5 p% f4 g3 v2 X2 T6 V7 `
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
  v" g+ q& W# j  E- q( s           RetVal12 = 0
* {9 A) B* H" V& m) x# y        End If7 A( d, C- y: f; B, k
    Loop$ p. K& ^# D- ^# {

' A- y# d% R# D' c   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
0 [& J/ i4 d( n) w    Set M2 = New MODI.Document/ I" y% p6 ]$ ^2 H' m3 F
    Set M5 = New MODI.Document
) t1 d" A2 l/ x8 w5 \3 a   
/ }+ [! E5 t3 ]' G  l    M1.Create pathmdi119 `! k5 c4 z- _; E( f1 n# Z
    M2.Create pathmdi12
8 [" [2 S, Y+ U$ R    M5.Create8 g( i6 Y0 h3 g% f- e% ^, v2 a
    M5.Images.Add M2.Images(0), Nothing7 w  ~$ k# o  d9 a% }
    M5.Images.Add M1.Images(0), Nothing0 M, D* K' v; W7 s; @
    M5.SaveAs pathmdi% x) ~- d5 @6 ~( a  g+ i
    M1.Close  k. E3 T4 w# D& A/ [3 R! X; q
    M2.Close
0 A9 f# ?& u  Q6 W! t4 x    M5.Close/ t) P3 O: |$ @4 H
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档* Q$ Q5 M6 ]& H2 t
    Kill pathmdi124 w# P3 {) j$ i% K

9 O: |, q8 n9 i    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档2 U3 i) }1 H4 r$ k
$ }9 @9 [- J2 Q' B$ t
1 [  Y9 G6 F2 w5 A
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档. ~$ k( F1 {" e! i
5 H5 ]. E- ?9 D5 e2 x# d
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:  w# Z4 w' N$ g8 I0 u/ P% z) E
1、程序死掉,需要关闭ACAD;0 m: {5 `! F+ u% ?
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;$ {% h+ T" O, E7 l" l( V
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。# z: {2 O& Z9 ?9 N

; C9 Y# }1 N4 @/ U- ?现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
1 M" k# X; _8 L' _8 e; I3 g
( i  n& X  ^. {* L2 I: G3 ]如何在CAD中应用呢?& q/ H- t2 v6 h2 F5 _- B) v

8 o" S1 J# c$ {  o, a% IOPENINMODI:0    输出文档不打开* q" X0 o8 i# x" y' ]! t* t% y5 U
               1   输出文档在MODI中打开  W- {. g2 @2 X6 b/ r( J) }2 v9 p3 W9 T

/ x, I$ d* H$ k0 X- g( a
/ x+ W; C- s7 V; l9 [5 o7 }2 w研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
3 s& ]% A! n7 i* j, i我用下面的代码做了一下检测4 s$ [. o: H7 q* ?+ ^4 E& u1 }

  1. ; j' }+ d9 j/ \! E7 w; P. a& i
  2. Sub A()* `* t+ I0 h# L& A
  3.     Dim H As Long, I As Long
    / i, g2 Q6 l* a
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    % |, Z3 Z: x# i) J6 o
  5.     PostMessage H, &H10, 0, 0
    * J0 L& T9 `+ `' s) o
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    " q4 p6 R8 k: ~6 w
  7.         I = I + 1
    . h- y/ Z: q$ a* q" {" h
  8.         DoEvents
    / W% P* H" e7 \) c7 Q
  9.     Loop
    + E7 o5 B! \* J$ z' q) @: u3 W8 B
  10. End Sub4 ^+ P" z& r& [7 l
复制代码
! H7 ?) s) F$ G4 G( I4 f# ^
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。4 A" l2 s# @. S$ y# t! R0 ^
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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.gif5 L; q; r5 p$ a' f) G- V
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
" s) m4 {" }0 c" y我用下面的代码做了一下检测! H1 _% d! D! o
0 S0 S9 l0 i& z# ~+ \. g
Sub A()/ V* @7 K2 M3 Q; i2 v0 T2 Q
    Dim H A ...

$ _9 A8 h) F: f  O) p2 `7 y. A
3 [3 W; O5 o" v% i8 G) T8 b0 ^
9 k1 y" e( a  _! W- P- p谢谢斑竹
  Z- Q( \, A# ~+ ~& i! u( I& s窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行" v& Z  j3 L7 N- @$ K- c$ H
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif, }9 L9 G3 Q4 O5 d) h. O
既然是虚拟打印,为啥不可以输出以后在合并呢?

( z% @7 p8 {3 Y7 n# Q; q3 t
( [; [( t' R1 }$ M- {我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
& n7 y2 g- T9 Z
; h) `, J) f9 m# T. J/ }+ h输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:1 h& f3 S! t3 C) n5 M
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
7 O3 H7 F! T( K# _    .........
3 @$ `8 |! M$ H3 q    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
& e' j$ ^- p* J6 k    .........$ n) D- A- a1 T6 c+ |% {& @( U) x
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName): M, T$ c/ _; ?9 {. S7 ~
        ........7 k2 w) d& w7 F9 \) k- h7 A
       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' H( U9 Y9 i/ E. t  _& L
测试发现:
* f" Y) k' Q6 t4 F- Y2 u$ S9 ?4 X    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
: U2 J8 x4 @8 G    .........6 L% D2 `( T2 Q. Y4 O
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

9 U6 @4 Q" n0 X' K/ x$ ?
+ [% ?% c# F9 l( P7 W8 E
3 h" Q; I, V6 X+ e' P( B不需于空打印,只需要空设置就可以了
& Y$ G9 @8 u) j, E; v  H' M9 o4 {# {$ ~

/ |% ~' p" N5 [/ n  }问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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