QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了9 {! `) L2 Y' g; A8 q
2 `5 x: r% s( O& A% p. U
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
3 h, [6 t6 ]; K( z- U0 g" j
' h( W. g% N/ y) B/ B但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
: N' ^6 `1 s7 ~0 c& w- t/ {. T, ]  J$ e0 H; n# Y
这就是说plttofile方法是还没有运行完。& l8 T' O: D4 q$ }0 `

( J# ~9 C+ \/ g+ E* K3 }问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?+ V0 o, m! Y" C3 {% E

6 k; F; ~& g0 h) E1 g8 I; H[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:8 @5 ~/ Z9 J9 M, f
Private Sub Command1_Click()+ L2 {- w+ r. w5 K2 P
     'plottofile方法
) W, Y/ ?* @4 Q. J. M     Unload Form1
0 U6 q! [! B, y+ U6 h! I' LEnd Sub
& I3 t4 f2 v1 e! o3 ^; P7 b# p2 ~+ VPrivate Sub Form_Unload(Cancel As Integer)
8 {3 `7 e9 Y3 P0 n6 O/ E5 I     '此处写入需要运行的方法2 j; A6 k8 ]" J+ Y9 t7 o3 w  X
End Sub
7 _. _" d! H6 J
. q1 I( y! v3 p" @从运行过程看应该可以,明天去单位试一下
发表于 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) r: g5 g+ v* {
检查指定的文档是否存在或许会更好一点?

. J! O9 |. f  z$ u$ ?
0 G) z; u% D* q$ N3 e; s. r! B- m( o) `% o1 @/ V4 h
  I- C" z8 f# t$ p
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
/ O' o, z- |7 v" k6 K; b1 V
/ w' b6 m/ Q8 X+ ]! |" q程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
% B) s& C- M, `( y6 R. b4 w: k- m) u% d7 G/ l4 @: s
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
9 r* c; e( ~" O4 g+ z3 H% ?    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)+ x6 Q5 u, J7 e
  S+ u& Q- Y. {
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
6 v  y) j. y* v    Do While RetVal11 <> 0$ w' {& c0 s8 _" Z
      winHwnd11 = FindWindow(vbNullString, drawname11)
8 ^7 u; \5 P6 I) s- n0 C        If winHwnd11 <> 0 Then
9 j% P0 T9 e/ j# l: [4 O2 \7 t# w           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)4 U! S1 `* g% G
           RetVal11 = 0. z# Z* U+ ]( I& l, J# X
        End If
! m# h8 v; u( E3 }' K    Loop
5 E6 ^$ f4 i; K- m8 [RetVal12 = 1
% I- o) `, t, K+ K5 g    Do While RetVal12 <> 0
/ f2 P: F8 r1 N9 {) d      winHwnd12 = FindWindow(vbNullString, drawname12)
9 l3 m, o! _+ I        If winHwnd12 <> 0 Then
4 G! X$ T/ x# G           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)0 m3 A; C  N3 t. H, t! L; v- n
           RetVal12 = 0
! h( z6 k; d7 ?! E. W2 p        End If# A1 _" {% l: f' K9 a0 c0 ^
    Loop
6 L; r/ m. a3 {0 ~9 L: v
# W& \+ C8 ]' N' H5 M6 C   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
4 D( p& j# i$ t/ L9 x/ @    Set M2 = New MODI.Document7 H/ W& D, h, p7 ~+ V# G& v
    Set M5 = New MODI.Document7 b- u! [4 K3 |; Y' t0 {+ @# E
   
7 [/ S8 m. G3 C! p% F    M1.Create pathmdi11/ \0 }( N# F  u+ F. e3 b. p
    M2.Create pathmdi12
8 r5 ]- i# }- h; Z' I    M5.Create
0 k# H( A/ q- l4 j9 W    M5.Images.Add M2.Images(0), Nothing
7 I9 v( M- `! ]9 t    M5.Images.Add M1.Images(0), Nothing$ J+ W2 H! s7 ~. v' S  Z2 N- ~+ ^5 G3 a  K
    M5.SaveAs pathmdi8 N: b' m( R' U2 t: c1 A; @
    M1.Close) @. I# f# w0 j
    M2.Close
# Z/ W: o& d  k& Z    M5.Close
7 g: }* \: W% x; N    Kill pathmdi11                                      '删除PlotToFile输出的两个文档+ A' y& H1 j/ I0 v
    Kill pathmdi12
" B7 ^3 z: ]; |" {3 F4 Q$ X  A
& ]9 Q( ]* k1 \; m/ y  ]& P1 ?    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
2 s, V1 }# s7 b, c9 r3 [# R; P9 W/ a2 X3 C7 ~/ i$ c! H; c3 T

6 E( n& \. h' r$ ]5 }$ z. u) ^5 D程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档  ?/ P+ P, U( H- f
+ {& p- R8 u- t
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:! c' W) j, q/ |; h& U
1、程序死掉,需要关闭ACAD;1 I0 R; W" Q' f% |  y' ^" U
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
  X, @. c" I% M% ?$ H% K% p3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。1 x3 B7 R/ g; n6 o- S( ^1 X

8 g3 W# I' K# O& g) Q6 d8 G1 n7 H现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的" u8 A3 \# ]- ]8 b/ B
' L0 G4 P" y2 ~' T' U
如何在CAD中应用呢?. C8 C. r% \( q) |
0 I. q5 w  M9 c' `# l7 `
OPENINMODI:0    输出文档不打开
, \; k) v3 o1 `. t% Q" U  {  u               1   输出文档在MODI中打开
' o. g  }% X* q" ^
# k% I3 [6 s. B) c: v- r) z: b) ?% t) n- M
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
5 x( I& w! p: u1 V5 r* n" p/ w我用下面的代码做了一下检测
, t/ }' Y" Q, n- N5 N

  1. , e5 j2 B  I' U& b  ^* [. s
  2. Sub A()1 P4 s5 s" [2 _0 @7 q
  3.     Dim H As Long, I As Long  v$ I" b1 m8 V+ A7 G
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    ; W: e& M/ f; W7 m# f
  5.     PostMessage H, &H10, 0, 0
    $ c$ N- n, Y2 z2 P# j
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0& u  p5 ]4 F, u
  7.         I = I + 1$ w9 x: A2 m, m7 w, N
  8.         DoEvents
    % ]4 E/ @$ x' o* s& v
  9.     Loop
    8 F6 p% j4 N- b1 b  E* M
  10. End Sub: M8 Q: X  A6 X- c
复制代码
- e+ _2 M8 v3 [6 @* h& w) f, P
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。+ _, M2 c" o6 j: i* L
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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+ l, Y& c6 j& L: h$ e& H+ U4 s
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
1 S' b" f9 M+ [* x" Y" h+ z' Q我用下面的代码做了一下检测! S% o9 k8 G9 K+ f' k" G
: Z/ B1 z6 l! |5 y
Sub A()  d. e6 U' Z: c& H0 x
    Dim H A ...

4 w. ?+ `# [6 h' ?
% M( Y3 ~% [9 G% B! B5 i. }1 E" X! f  b0 m1 v
谢谢斑竹
/ z9 }2 i0 L+ u8 o1 z) h3 F& w) @窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行) q) T" b9 Z" U! ]3 G
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif" W# O0 j4 W9 E- B/ A
既然是虚拟打印,为啥不可以输出以后在合并呢?

: R! L* J' c- K' B) }* d' W% O! ~1 Y+ d/ p7 T$ Y
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
9 [2 ^& \# `- ~( S% X" M6 `5 c: x0 O! Z, P
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
4 k; e* y2 a  q9 M    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:( z7 G. a+ W, @$ v
    .........
' K( t3 l" ?7 E2 v- {    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
6 d" m5 S4 b) k$ r. q' F, L, x    .........! m7 [4 F4 B, Z( `! n
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)* q( R5 y6 f. O& J) |1 ^2 n1 X6 X
        ........( q, q6 ^+ J  @- k, I2 P: K
       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
8 `+ {1 d! G" g: B% g+ X* U) p* P测试发现:
1 E' \9 O- r4 e" W1 Q    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
4 k( Y2 u, s2 y; J  X( {    .........
- z/ ?9 R1 j' N9 j    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

( t3 E1 _4 g! \; k9 W5 T+ Q2 ]+ q7 J4 ]! I. s9 [
+ e6 u2 M7 y" f' l0 n
不需于空打印,只需要空设置就可以了
4 H% ~8 r. V5 t. ^" A* G9 M+ X5 K9 [* y+ x) G* R! H: ^: ~
( m, [0 X$ n! w" J
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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