QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
3 d+ n5 P4 J. v/ W1 t8 v+ ~! w1 v" P0 N  h
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。9 m! X- y. L" g* g/ s
: a- j8 M0 `/ u6 y/ Z
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
2 p' p& r9 _; X2 j9 k, p6 i1 ?" N6 m. [! H5 [. }
这就是说plttofile方法是还没有运行完。
, A( j+ Q  [+ d- m
2 W+ V. M9 e; J7 I! i6 A问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?, X1 |( o& {  |( l( e0 J
" B8 \4 D# w. P, u
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
  b" |+ G# k" D' N# |2 b- p. wPrivate Sub Command1_Click()
" l# o& \0 ^/ a     'plottofile方法4 u, K9 X2 t, \6 A9 b
     Unload Form1
5 c* E& u- K* `, q% xEnd Sub
2 ^+ ^/ d. x* @8 h) h4 QPrivate Sub Form_Unload(Cancel As Integer)% A; p+ i5 d7 m; G9 m; u5 [: ~2 w
     '此处写入需要运行的方法
) \- I4 \7 Y6 d5 yEnd Sub. J  U- l2 V( }
4 t8 n7 q( L) Y! @1 ?
从运行过程看应该可以,明天去单位试一下
发表于 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. v: n3 g1 j) V
检查指定的文档是否存在或许会更好一点?

2 I) ?, I$ ^- {/ c$ b
2 `; A$ k8 z; ]% I5 N; Q/ J7 [! S, d; x/ n
; O6 t! e5 b: A3 m; y
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
, D! R$ `, M$ M8 y9 L  }
9 `: }; z/ S+ e+ f7 s程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)5 D. @1 n3 P. R. J
8 C9 K- ~: V4 S, E& Z
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式4 Z3 b& O" I3 u
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
& d; u# s, I5 L6 W
" b; U  I, K- O RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
/ O! P2 Z8 F! J* h) t    Do While RetVal11 <> 0
, F% {. W* Q7 n. B  M      winHwnd11 = FindWindow(vbNullString, drawname11); j- r1 d6 o; }, F% x- y
        If winHwnd11 <> 0 Then7 W. j' T8 ~* E& n9 ?
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)( t- E; K' ]5 g' }9 u5 g% S9 F$ g
           RetVal11 = 0: M0 n0 `$ R# k; c
        End If2 I. F# ]+ f( r% {7 D& ^
    Loop
* d& |4 Y$ O7 v( CRetVal12 = 17 u3 }) q; _, F3 _
    Do While RetVal12 <> 0
+ Y1 x" O4 J/ K2 u3 s8 |" l9 C      winHwnd12 = FindWindow(vbNullString, drawname12)
7 p8 q9 T  ^( V; Z" }2 q/ R( O        If winHwnd12 <> 0 Then
" t8 I  Y, ?! V- |0 D           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)  Q' ^+ c, S7 e* n& [  l# d% M
           RetVal12 = 0, c* ]% z) G- v* f5 j
        End If7 f# @$ S2 x5 {6 B6 C. q
    Loop
+ s) u" K5 k6 ?8 a% ^3 F" v4 `7 w. d4 E3 j8 l0 I5 E
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档9 ]$ d: B2 ]/ l: p7 @& J
    Set M2 = New MODI.Document+ t' Q  Z/ R  _2 I5 F  ]& B7 }
    Set M5 = New MODI.Document
6 V# a5 z. S, q   
# m7 B5 c4 Q; T+ G/ d( F    M1.Create pathmdi11  w8 x" P' F! r, W% Q; j( X6 E
    M2.Create pathmdi12
0 w* k1 T! s+ x% E5 O    M5.Create
! R' ^( P) \7 M; {/ g4 h( z    M5.Images.Add M2.Images(0), Nothing' E9 q  [2 n% l, S# B) m% M7 g; v
    M5.Images.Add M1.Images(0), Nothing/ ^2 y+ G$ U3 O2 U+ b, V, v* ^
    M5.SaveAs pathmdi
5 P2 o# e$ B/ X( I8 U3 \    M1.Close  P0 w8 F. U# E0 L. k5 u
    M2.Close/ u5 B. X5 X7 _4 ]4 [- W- {/ p$ m
    M5.Close" P* F: F% q  a+ a' q8 s) V
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档, _: Q' w0 e0 D* H) b8 F4 s9 ?, K
    Kill pathmdi12
7 T* X* m7 P5 L4 t& n1 y8 \7 y! w
7 E" z  K& X2 I& a/ ?% f! @    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档" ?# o; M. V, g7 {* V
4 ?+ M- U7 f* S5 B

% r8 D, u' g* N+ l8 h  U8 S" u8 P程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档& M: j8 }' H/ W! G! F/ r

' W9 L& V9 k/ n3 ~! Q, E+ ?5 H但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
4 g% @) P: `! w  w1 {8 u6 |1、程序死掉,需要关闭ACAD;, E+ M1 g$ u' ?% p0 t
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;7 t9 \2 w0 W5 g- R- u
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。& v# y  D/ X$ \. Y  b
' g( R5 I3 V: z$ |
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
. K  B& k& E6 A% z8 G9 Z6 ~% R- E0 ?! a1 o' V# A
如何在CAD中应用呢?& ^0 o6 u- d! D  @  G+ K* Z

7 X! Q3 |4 @4 J6 E. u! B  IOPENINMODI:0    输出文档不打开" |1 M! s0 S" m* r, l
               1   输出文档在MODI中打开
9 j  f: _" R7 n% L6 l* e
8 m* q3 W6 r* R6 k; ?" Y+ G) j
9 {& ~  s% _  g! B# ~7 t4 L! I研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
# {; F6 a6 T- {' x  w% T* ?6 d. A我用下面的代码做了一下检测
9 K$ }" v2 U# Y. C. b* h* H' M
  1. 8 z& h" u9 D0 c+ S, j: H
  2. Sub A()
    & ?" W' Q) }. A: r$ k) Z
  3.     Dim H As Long, I As Long
    7 o) g& m6 N" L4 o4 ~
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    7 N* s0 L% o1 m7 U' c
  5.     PostMessage H, &H10, 0, 0. R- K/ d5 M4 b. _7 _. @
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    ! h; i% T+ z2 k" |% s( a% ]
  7.         I = I + 1
    ) T4 W# ~. i- s( {  Z$ q- B
  8.         DoEvents
    ' O- `& M4 g+ w3 h# P; [5 v
  9.     Loop  }2 Q1 e/ l+ s5 z
  10. End Sub. L# z* p; b& y2 g: V' _2 Y
复制代码
% k1 m+ D7 M$ b" X: U; s% i
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。' g0 H2 p6 V) P8 r- L5 U. X
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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. u' m0 Z% z; d
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。4 j# q: J+ c2 l) J
我用下面的代码做了一下检测
0 |: W2 Y* O, u' b
% @" q6 K# Y9 d) fSub A()1 `$ K, c& ~: ~8 y( D( e
    Dim H A ...

- A5 y! }4 C* K" e- c, R% d; g+ W* Q% `% g

, E; e: `. N! c) b# g0 D1 u4 L谢谢斑竹2 t. K/ R2 X3 [+ X/ T; M0 \5 u
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行: b' _0 B3 p) p2 l2 |
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
) M/ w* r. Q7 c: B, W; C既然是虚拟打印,为啥不可以输出以后在合并呢?
/ g' t* v/ _" ~7 @+ T8 X+ n8 n

$ ^/ J! C" ?- _: u  q+ }我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸% ]; v% Q5 e1 _( X  X' t- D0 h! U

  V1 E, D% f1 q; n) [7 F0 ^: }输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:! l* o8 \. q9 q. P+ f# A8 p, I
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:1 `# Z1 A+ C& R' D2 U+ O- {% e+ R
    .........+ D7 w% _) k7 n4 t
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
: x3 v; B' e9 ?: v* W    .........
6 I9 v, ?) b$ z) o8 ]# B    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)! k5 W) Q" ?' ~- r% R7 C9 K
        ........
# O) q1 }% a: F. B, s2 ~% O       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, G* s8 U/ B% Y5 `3 ^* }4 f3 G
测试发现:  E% t3 f) A7 ]' z4 p+ E! i2 u- l
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
' H) Z  K, @0 f5 d& J    ........." y; [9 v. [0 M. w9 n% [# Y7 A' o3 D9 B
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
( R8 A4 f* a# |8 g! b- s
& ]8 o9 N+ _( ^! [! }: s$ Y+ {  B6 X

4 U; T; G) l( v8 p7 y' R不需于空打印,只需要空设置就可以了; R6 ~8 B1 O0 a+ M" N. a% [
. M) @! e2 Y( O# w

+ J* @  s8 ]3 ~( s" k0 I问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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