QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了! T1 H& q4 y* C# s2 B5 n; k0 T! Z

+ X1 c* W8 L, i" Q$ m" I+ M在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
( ~5 @- l/ T- V5 y5 X+ m
9 K- K' B$ L/ }: ?+ B4 y% O1 g0 E但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
" S, H8 G6 m& H: o  L( q$ H  j1 b
! ]3 Z1 E$ {. O, R% Z这就是说plttofile方法是还没有运行完。
+ T: y& m, x$ V8 X% k, ~/ R( G1 |$ n8 x8 _0 R$ ?
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
( K. i3 `* h* Y9 e: Z9 l/ d  v0 p% C. {4 u
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
* l% L/ O' q# j  |( p* JPrivate Sub Command1_Click()
3 w2 c* C% z" q! ~5 d4 p# r" o     'plottofile方法$ n8 c. `4 J. P/ d8 j
     Unload Form15 M$ C* S2 U1 P2 @0 m" B# \, v
End Sub
1 x6 L7 G! ?4 IPrivate Sub Form_Unload(Cancel As Integer)/ T- Z5 z. X4 o1 D
     '此处写入需要运行的方法
) g+ Z6 q, f; c9 k5 a. |9 VEnd Sub
( a  s5 s! ]5 q/ e3 ]( O- }
+ Z. u& [# E) `7 O从运行过程看应该可以,明天去单位试一下
发表于 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" M6 I* v! i; i& [
检查指定的文档是否存在或许会更好一点?

4 q, S) f- l! d, H: I1 g3 i* T
3 T8 D+ S% ]- v! @8 `2 k- I3 f! p1 T: J! q
! |; W6 D4 n) O3 y1 O( P
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开" h2 H+ G9 K5 ~% ]$ X

& o* K8 K( Z5 E2 P1 m3 O程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
: S/ n9 m2 u7 H* I  j1 y4 i5 h3 [& R$ G
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
, I* Y0 }6 u7 |! Y$ R2 Z8 ?    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
+ Y+ H5 G  f  t, w( v/ `% O0 B1 x, A
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档, p  Q- }7 z. Q$ _. e
    Do While RetVal11 <> 0
$ S2 X8 H. v1 g- k& Y, a      winHwnd11 = FindWindow(vbNullString, drawname11)0 z0 ~2 t/ B( m" m$ V9 T! O
        If winHwnd11 <> 0 Then4 T$ Q) u. b) O2 p6 n
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
. z5 w/ G- I6 z, ~0 A9 p/ ~! r- {           RetVal11 = 0: ^+ X# D& Y7 Y1 y
        End If$ \# R* C% u. I' F- Y1 V% |& V$ n" z5 F
    Loop+ ?" t1 Z; |" f; E- S
RetVal12 = 1
5 I- F% u. Y% T    Do While RetVal12 <> 0& V; U/ s: r" x3 Q
      winHwnd12 = FindWindow(vbNullString, drawname12)
; z5 h8 g; d2 F        If winHwnd12 <> 0 Then
4 Z" i+ n: _9 x6 ~1 }  o( L5 o$ u           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)6 X6 c4 b  P% ]; u3 t
           RetVal12 = 0) }3 V: [4 a7 Y& U, F0 n
        End If% |* v( {( J8 K# M/ i
    Loop; m# z& G: ?( S! j

. J' ?/ z7 r# i/ o/ U: m, F   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
7 Z4 @2 U4 m  ?# [    Set M2 = New MODI.Document
4 s* c5 d1 ~: A/ T  o! v; i    Set M5 = New MODI.Document
. O) x% [8 v9 s9 T; C8 O3 R: t    2 A3 f) F8 R' z: p7 a
    M1.Create pathmdi118 [' V! _( U1 w# ~, f! \( Z6 l
    M2.Create pathmdi12
8 Q0 G8 G# L3 P# [9 H. k- _    M5.Create
  Q! i8 p& u# I    M5.Images.Add M2.Images(0), Nothing. }; v, E' g6 F) M# A. Z' i- p
    M5.Images.Add M1.Images(0), Nothing
8 H0 t: P. V: A  ^1 z4 Q    M5.SaveAs pathmdi
( U4 L* n! C) A- H    M1.Close& G+ @4 b  k; L/ {3 r
    M2.Close
$ s' E' M0 T$ i+ b7 M5 y    M5.Close
# D2 d; W! v  w    Kill pathmdi11                                      '删除PlotToFile输出的两个文档" `  R9 a! d) ]1 p3 [( c4 z& {
    Kill pathmdi125 w! L0 {2 m! ^% j. \
" ~% [( }0 h+ f, E* Q) t$ E) Z% _5 h
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
2 P+ b4 I5 n. O: m* f$ N7 n5 u
5 g8 |2 v+ e# R+ c0 R; n8 Q/ z- f( ^
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档: i- {0 u+ Q; o1 h  a+ i% ]

3 n( d, V( I% j! P但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:, Z$ k9 \- ^3 q& S( c, I
1、程序死掉,需要关闭ACAD;9 c4 d$ o- M4 _( l9 Y
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
; V$ `1 {: O% U% L; {3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。7 R( {& j' t1 O
5 w1 c' E& m& k; L& B( G- d/ p
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
  p3 d$ q+ z9 \. H3 `5 S; j  J5 H/ j6 B. B  K; T) K" H
如何在CAD中应用呢?! E: `% o6 T0 |
) N0 m0 G, L" P
OPENINMODI:0    输出文档不打开
# S/ v& F5 }, f0 {# x8 F! o5 Y               1   输出文档在MODI中打开
8 G; ~5 z2 q# u2 b& ?
9 S% p' X- s  ]9 K/ q9 i
+ a6 @) N& y* l3 q9 f' S, g3 U. X研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
( C7 U8 D6 |' x我用下面的代码做了一下检测' m# q: m8 t7 O& M% {1 e/ o
  1. 3 j7 O% q- D% k+ Q9 ~
  2. Sub A()
    1 T$ n2 r( e  j6 F1 z* k; M
  3.     Dim H As Long, I As Long' y3 p2 H7 N4 {  E& t  R& f
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" ( ^6 |; T# |- y$ m
  5.     PostMessage H, &H10, 0, 0
    $ g' Z- X! N- Q. d7 K
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0! \2 l+ b* w7 B8 Q  c8 h% k/ Z! e6 @
  7.         I = I + 1
    7 t( m( F! c! B
  8.         DoEvents
    & L9 Q2 n4 S: Y2 K; Q- ~! k  B
  9.     Loop( U- G1 r: \0 I# V, `& Y, t0 X
  10. End Sub2 L8 O6 u1 T4 b
复制代码

# E) ^0 [  N+ I( i8 u在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
% z2 l4 W* R% J6 ~建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
$ V- k1 T" _% d* z" U# {5 H4 T我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。' h3 q; W1 i, G
我用下面的代码做了一下检测
- y. a2 O& a1 X8 W* \0 {
5 Y& l+ }0 b  |! {( e6 jSub A()
) k1 V; l3 d& |# B- v! C& Z5 }9 ?% B0 j    Dim H A ...

3 r1 K1 T6 |* L  H2 ^2 D- L/ M; u6 \' R
" H4 P( C/ W& o# ]4 O) i7 X3 A
谢谢斑竹
! K0 }& S0 c8 e% r窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
, Z$ G1 o. a" s  E% hsendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
7 U& r* R  Z) _7 Y既然是虚拟打印,为啥不可以输出以后在合并呢?
2 y6 P/ N1 O7 Q. M6 c. I! [

) w7 g1 b  Q# R+ T我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸% W' X4 J# |* `8 U

, y" X5 _9 M3 ^( X$ K! }) o) g输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
5 U8 N0 I' `; |* S) q/ S/ x    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:! O0 i) V5 k) O. N/ c2 W
    .........+ a5 \* U4 F9 V! m
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式9 Y! _+ V9 l6 C
    .........6 @% J  f, h$ q0 h! E0 p4 y
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)2 h4 d9 F' P# q# ^" G2 d. J/ N
        ........
  T) A5 x, @$ o/ j% q- [5 N& b       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
9 g' o# D2 N" H8 e) x9 P测试发现:# [6 @) w7 Z4 s: V7 V
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:9 k- a/ g& L. u5 |) U4 o7 }
    .........
' x6 ^# c0 ^! I: C    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

# Y% v$ p1 O0 Z9 O5 z( I5 [. r3 F% {. Y- \

9 A( t* D: a$ F5 P3 g: [不需于空打印,只需要空设置就可以了9 P, q4 M: \  M- e: X) ^. w8 }- i
+ Q7 q6 P: R# i! X4 X  c! N9 C
/ u4 g) L$ `* z8 p" Y* @4 U% I* B" X) J
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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