QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了! P% N5 X6 h" H# U- p2 V
8 p& c, `# i# \/ B1 J: A) i
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
  ^- `! ^' e+ l( p: S/ ?6 D( Q
& i+ z, w/ H7 x4 V/ ]但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
: r8 O5 a$ f* n' Q$ c9 O( o0 l  [5 M- Z2 ]$ H2 M* L
这就是说plttofile方法是还没有运行完。
: N, {/ |- B# w& S' K# `
! C1 r$ q+ z: M. B8 i9 \问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?! m% D( e$ X+ R: X; E$ ~: Z& s

& t$ }3 \7 ^! E; \* P$ e4 c0 `[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:$ S5 X/ V- T4 h0 _
Private Sub Command1_Click()7 h" j  E/ R7 S- M: c
     'plottofile方法* _' u4 H7 K, s6 W% S
     Unload Form1
: s9 o- I% Q( \. q3 }0 |End Sub
4 _8 M: {; L1 ]: @# f3 APrivate Sub Form_Unload(Cancel As Integer)7 Z; s* Y8 V# V0 N- L% S' F
     '此处写入需要运行的方法! ~2 y8 |' M) @0 |  k$ Y) ]8 z( s
End Sub  W2 c$ d0 ^1 Q8 u" _

$ q# [5 s4 g# x  E+ Q从运行过程看应该可以,明天去单位试一下
发表于 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  P# ?  t' T5 x( m; b/ {
检查指定的文档是否存在或许会更好一点?
% V0 a1 C, W! g' G) Y  W

& J1 h) v% i: j1 P' W! e+ c. L
9 }, ?" h1 w" ~# r5 M7 I
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开" v) G+ g8 N& [! r# D) P& z
2 H( o  A  {0 Z
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)0 c3 k2 Q1 o. u2 S
/ Y% ^% ~" x" U5 F
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式9 ~" C0 n8 @5 A" B7 b# D
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
4 Y( `/ K) a4 ?, F' ^
2 ^1 Y3 H. R5 W0 d) ?. i RetVal11 = 1                                                                      '关闭PlotToFile输出的文档3 T6 X, Q0 A4 Z1 I: G" U
    Do While RetVal11 <> 0* w6 J' s; c% n( j  N; y& `7 Z& E
      winHwnd11 = FindWindow(vbNullString, drawname11)
2 h: |( J: @4 w# \        If winHwnd11 <> 0 Then
, R! G+ A" U! t" U0 e" ~           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)9 b* x" L* q6 o2 {( t4 Q, L/ o1 A! T
           RetVal11 = 0; u6 u6 H* f$ K2 O6 x, Y
        End If
# n" q5 Q4 s+ q  k    Loop
0 |  r2 o9 d+ J- N8 NRetVal12 = 1
" G, q) n: n% G( {4 ?    Do While RetVal12 <> 0+ p9 n9 v/ b: {
      winHwnd12 = FindWindow(vbNullString, drawname12)
1 X9 P( ?/ f3 A  G1 g        If winHwnd12 <> 0 Then
$ r1 Q: j8 V9 i. {) \& |           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)8 I- P- r' U$ z  ~) l, N7 z! B, W
           RetVal12 = 09 {0 D& z; `  m& E; R
        End If" ]5 n& N$ W' M5 [* D5 N# Y4 ^
    Loop1 F. W# R4 ?4 n1 t; o2 P

' I* x1 {& s) }, q   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档( e/ ?6 Q$ N0 s1 g1 B
    Set M2 = New MODI.Document
+ w! q3 C8 Z% V# p# g5 G    Set M5 = New MODI.Document5 Z4 w: {# @8 X) ^% Z# x
    0 t3 m* U& r- B$ Z  a( J, ^
    M1.Create pathmdi11
0 R/ X3 i2 k4 R+ ^6 S  S2 B    M2.Create pathmdi12; {* P; f+ S: K0 Q
    M5.Create5 h& ~" @+ k2 u% S# h
    M5.Images.Add M2.Images(0), Nothing, `- N  k9 }2 w/ D# R( C
    M5.Images.Add M1.Images(0), Nothing
4 A1 ~5 q7 ?% s  M' s' b0 [; B    M5.SaveAs pathmdi
$ @1 A6 j' {( i# d7 B- I9 K    M1.Close
: n$ ^; n, ~/ k$ q$ q" c  o    M2.Close
6 ~& c! j' D# g9 [+ E1 e    M5.Close
7 t) ^) B, X5 _1 {    Kill pathmdi11                                      '删除PlotToFile输出的两个文档. r+ t$ \! I# d
    Kill pathmdi12: m2 h: A. |6 S7 e5 p/ d% [7 e+ t
) j8 U( r8 C* |! t& y0 X" w/ P
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
" H) M5 d& c3 ~4 s2 ^9 t" Q+ d5 A, {. s) b6 k: ~6 a

( E5 t9 ^% c& J6 H: v程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
; O1 Y. x0 [! N- _2 o  {5 y- }' P
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
) K4 Z- f/ l4 T2 k. p1、程序死掉,需要关闭ACAD;
. H; I: Q+ C% K8 J2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;. d6 b0 X5 c6 C7 q4 j/ E
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
# [4 y, m' j6 N- ]& N& x" ?& j  C2 @. x* W! o4 S. D  D7 {
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的1 d' @6 n$ H6 {) }) L7 N9 `
; P  D- [9 t1 P
如何在CAD中应用呢?
5 X+ F* D6 n+ J  T; A5 {
6 g3 i6 ]) Q, }. F  I& KOPENINMODI:0    输出文档不打开
. b3 O1 ^  q8 h& ^               1   输出文档在MODI中打开  j4 \( I0 w$ d- q4 u
+ j2 q$ M3 s8 I4 K  {

  I/ ?! f" d; t2 O; t. Y* f. N& D2 I研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
; M" J3 b2 E8 @+ B我用下面的代码做了一下检测3 l2 S" h/ p0 a6 x& K5 h" z9 l

  1. - |: L) f6 T  }# a
  2. Sub A()7 W- L% g' @7 n4 m* B9 o
  3.     Dim H As Long, I As Long* o! H7 L8 N* X$ G; [
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    $ k& L1 k0 w! i2 E, d
  5.     PostMessage H, &H10, 0, 0
    6 U# j9 f( {3 G; p; c; O
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    , r/ ?3 N+ H0 \; w( z9 ]  R. P
  7.         I = I + 1
    2 U8 V8 b+ H+ d
  8.         DoEvents2 |# L* z, m" f* ^
  9.     Loop
    7 C  n4 @( @8 X( B: j! `# J! ^
  10. End Sub* Q7 @- y* _& n6 }) e, {# S$ V
复制代码
  l( E: p" [' u7 w
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
: [& H4 q+ n9 A. g+ j( }0 ^" n9 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
2 h* T" `" g2 G6 l. w, `7 P我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
5 ]/ [  T6 K$ l/ d8 ?, E我用下面的代码做了一下检测) r- X$ Q" R# @) O2 B

6 u0 M9 ^! e! ~8 g. n, m0 XSub A()1 R9 c- s& `# I. x6 f9 P8 B
    Dim H A ...

7 V! A1 y9 `: x1 i& ^! z1 j$ B; ?# B2 \& k7 k

* y; N* L! K# G* q! H' x谢谢斑竹- w$ b0 s7 h/ B8 D# \
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行3 }" J5 W! r% j1 t
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif# ^! U/ h! v! }1 d! X3 L+ L
既然是虚拟打印,为啥不可以输出以后在合并呢?

$ ]$ ]5 n. e6 }$ l! r% r' r0 x- ?: `' R# y' P
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸& o% `0 `+ h" G! ~% e7 [; g

5 c9 \' V" k0 U  u  S: \0 r输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:; h: ~3 z5 W: s
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
$ A6 K: |% W* V" z& m    .........
. o" g  Z3 J# l+ s- W/ t    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式( l2 i3 Y4 x$ _( b: k! f/ n& C! v
    .........5 a  o4 O" ~( H8 j- z9 w% B
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)6 b. ~) u8 J* Q- _- ?
        ........
& v( e0 n' b! @: @0 [1 t3 A" E       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
2 j5 _) j/ i* n0 E5 T7 b. U1 D) _测试发现:  Q3 u" K) K' z0 E! [; \( U5 A) @
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:& F6 m! Z6 U5 s
    .........6 F4 c' ?" B6 Y( D7 }/ Z
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
1 e3 R. O6 b2 K& c" Z

! t; ]% a  g, Q- _/ G! {! A
, X. }' n( e9 V1 E0 X不需于空打印,只需要空设置就可以了2 r" f* D* E. p# X
, [" I" |' j  f; {* c

- f4 F7 d+ ?1 }; l) s( i* J2 Z6 B问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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