QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了6 R/ v) q1 g3 C8 Y
3 I. @6 X" g& P. y
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。4 ?# c, z0 P( N! S
3 b) E4 I7 B- D* ?; \
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
" ]: Q* n3 y# [* x
/ ?" [( Q# r5 p8 A- f2 B( V; o这就是说plttofile方法是还没有运行完。
3 l- X# r4 w6 p  m  W, I3 ?
; R1 A. b2 y8 ]问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
3 D$ U; q" M: H) j) s
5 m0 J/ Q5 |$ J" d3 Y2 e[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
' H8 J, t! s* sPrivate Sub Command1_Click()
: V) z1 H; S( U# ?2 r& a/ q     'plottofile方法3 Y3 I! |. h5 |' m
     Unload Form1( G( J9 R  E5 x
End Sub
, D: ^1 q$ U; GPrivate Sub Form_Unload(Cancel As Integer)
0 i' S: c9 B6 z& H     '此处写入需要运行的方法* e4 J5 a6 {" a! u2 X
End Sub& o9 b' c0 s+ p2 v* C

/ c' R8 }+ D4 n+ ~6 c8 ?+ R+ x从运行过程看应该可以,明天去单位试一下
发表于 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
. |, S: f/ j, {% Q, i  i检查指定的文档是否存在或许会更好一点?
2 X9 B( z. J& v! l/ g
+ }( z. p" i( u, e2 M+ ^: h' v
* w2 H" L$ c  g% W

& D- [$ C9 b$ D8 `) h. C& |" n文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
( G( A2 v& e* B9 [/ ]- {/ ]) e8 F; l. \" H; R: L+ H
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
+ @0 p) i- |$ O7 M
; |4 Q* S' |5 @1 L, H6 N. i0 Z    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
: t7 C( Z$ R$ Y0 {( ~- @$ Q: {    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
9 V  J& l; T* l/ q7 Z; h
, Z9 r) v: E4 `' t  }' s RetVal11 = 1                                                                      '关闭PlotToFile输出的文档/ f( P* J6 f- _$ G! R
    Do While RetVal11 <> 0
8 F, D) h# _0 A      winHwnd11 = FindWindow(vbNullString, drawname11)( e- U$ t4 v7 C$ j
        If winHwnd11 <> 0 Then  U) N/ g4 s3 q( D3 g9 N
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)% e* G" {  ?" U
           RetVal11 = 0
/ {3 {! T2 r5 ?        End If( S1 M8 j& n( o; u
    Loop
; F- v& q; @4 I5 t+ |% O( G1 QRetVal12 = 1
1 J* I3 B; F" x% [    Do While RetVal12 <> 0
$ A( I# n3 M! e7 q      winHwnd12 = FindWindow(vbNullString, drawname12)
  Q8 ~0 C; H8 C7 }, K; @% t        If winHwnd12 <> 0 Then
7 X6 k/ }5 H: C* U           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)3 i6 g5 S- `. A* ^0 G2 d
           RetVal12 = 02 j8 b) R0 |. L& g2 A) ]6 m
        End If1 @1 O+ _$ _/ i8 B* @& Q7 ~/ P
    Loop8 N9 w( I# F, L8 N' O5 S7 I

+ c6 B+ W4 Q; B+ g! o/ N   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
& J9 a! N( W; J- ~# N3 M+ n$ V3 X    Set M2 = New MODI.Document$ v; u. x2 z4 E/ g% U: ^0 a0 n
    Set M5 = New MODI.Document
: `1 m$ a' u3 q7 U* m1 ?7 w    & G2 F3 Q( j: ~3 d/ ]- L  l
    M1.Create pathmdi11
+ m$ I1 T: z0 f2 ]8 P    M2.Create pathmdi12* v0 s: ?2 P/ W, I
    M5.Create: l9 m, O3 ?' I( d  L
    M5.Images.Add M2.Images(0), Nothing7 w# G. q( T( _( H
    M5.Images.Add M1.Images(0), Nothing
3 _& @6 o* S$ I% V& O& L3 W    M5.SaveAs pathmdi
) J2 {+ a/ K  m, X: e; d    M1.Close/ W/ a6 N/ \/ q5 n. g
    M2.Close1 Z9 P1 u. N5 t
    M5.Close
* i6 a( W$ R& U3 ]+ Y2 K    Kill pathmdi11                                      '删除PlotToFile输出的两个文档& H3 V9 s6 {% C9 X0 g
    Kill pathmdi122 T' F: F; T8 o0 b& F' y

& i  h0 [; ?0 X0 y6 e2 [    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
) f6 N; ]4 n' w3 Q
7 G/ s5 {6 \! F% `
# |8 P/ U8 z% Q  j( y程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档7 ^% I. g. D8 U) `8 x0 J

# q7 e+ q* ~% ^2 m0 g5 d; {但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
; x3 O1 y0 W1 E3 }5 J; N1、程序死掉,需要关闭ACAD;) U& U4 G; S# z) m: t' E
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
$ p9 f. Q1 n- y4 F3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。! q& `  u4 X$ t: X) G! O' ]
; g4 {5 k* Y' m/ d5 o0 s! m
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的7 ~" u3 y' F- b7 g& G

& \" v9 S" N8 }( S) u$ s/ f% h如何在CAD中应用呢?
* V& g# t* D8 k& g, }) }8 E( U# u5 u5 G& |, ~5 {
OPENINMODI:0    输出文档不打开
7 W/ n+ N0 a# x$ v* ?8 `, ^               1   输出文档在MODI中打开
* l: ?4 R) X% |7 c5 v) W( [, F$ Z) ~* `$ c0 h8 z, y7 g
& ^' Z% E' w$ m  J# N+ @0 M# f/ N
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
9 u3 g1 I2 z" `2 p# s& \- C我用下面的代码做了一下检测
! Y7 O% n) r- k/ A. E: F# z
  1. ! x  a7 T: w) [5 c4 z( p0 o3 c) b
  2. Sub A()- B* H# `. ]0 d% O) m# e3 i
  3.     Dim H As Long, I As Long* k8 M# a' k7 o1 g3 G/ Q
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" 6 o% U* }+ o$ U
  5.     PostMessage H, &H10, 0, 00 b5 ~6 T# ]8 L1 ~; `5 F
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    ; Q$ x" i: F* i6 U. J
  7.         I = I + 1
    1 S( w- B9 @5 ^0 \& ], b
  8.         DoEvents3 T0 x8 A. y( x9 v% }
  9.     Loop
    * P5 b5 d6 b) n9 _6 `7 ]
  10. End Sub; ^( k" N8 B; f7 p, S  ]
复制代码

) L# l9 o( l) Q, |- @在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
  U; o, z: {. a7 ^' A! r建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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 f4 I2 R, D3 f, k3 b) l9 C% P我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。. s( n' f& ^( y' G# v1 `
我用下面的代码做了一下检测
+ L# [7 o# z% H2 |- c
& ?- E/ }7 k7 f! g# `, oSub A()
7 h  ]- T) J2 c% r" P; j. @    Dim H A ...
9 j5 z- A6 x# D% W8 y

* ?. `4 V% I$ w' A6 r6 ^$ v- ?$ u1 b2 v: S- n2 R( @
谢谢斑竹
2 b: Y) @  ]2 E4 }' @窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
. ^% E/ j, _0 R2 Y, l: X+ k6 `sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif' x% `1 \3 o0 {& d: n4 U
既然是虚拟打印,为啥不可以输出以后在合并呢?

7 P- z, P2 k: r! G. _7 O1 ?& B- s- J' N& [) A8 T$ ~- I6 W
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
+ W; J9 f/ V' c8 b0 A( j$ `1 L5 t, S. C+ |1 f: s# b& H+ X: T
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
' n2 q+ B0 S5 o  ~0 [' s    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:4 a* Y- d! f; |2 X' Z
    .........
8 S( e+ B' y) S  Z    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式$ V' l8 y9 p# Z) ~/ Q% Y
    .........8 Z% r% `; m, H3 |( i5 s% ?. n
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)" @7 g* M" n; c) E4 z# D' X$ x
        ........, d; T% x; a1 w. d7 Y  @7 @1 i
       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% ^& I5 a- t' |! K+ Y
测试发现:
- H; q' ^0 j# }& ?$ L. ]& `" b    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:: B4 |9 @9 E+ H) {/ I% j! C
    .........7 f  t  O1 j- h# Z- ^* v+ o7 p7 r
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
2 I! P1 L$ @5 n) R. D' K3 w- N5 `
4 }2 u6 L% G9 k, H
/ V* y5 C3 A  c# v' K
不需于空打印,只需要空设置就可以了  X0 M6 ~* V0 N3 |

  j8 b) Z" b4 \# n% Q- [& N# {
2 k3 J" I* I0 [' z$ j问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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