QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了0 M" J/ n) ^) b3 m$ b, Y. B
  K1 |: T& x9 v- ~& h7 Q# z8 ?- _
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
; w  v& e# \2 ~( X) M
  B/ g% I/ \7 R( S& [但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。9 x& s4 h. q0 x% p# Y8 X- L
- J6 j% `7 d/ J0 N
这就是说plttofile方法是还没有运行完。& t' }6 W  J3 q; Y( Z+ Y

- |: D8 z2 k, E4 `. M" {问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?' w) z! u* M; M5 @  Q+ x8 d" ^3 C

4 ?9 @; s3 {/ }[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
  R, ]# @; V1 R, ]1 r5 G" v' wPrivate Sub Command1_Click()4 J5 J  O$ R1 e( [7 f/ C1 U/ p! H
     'plottofile方法
$ }" a. I( u' Z. Y     Unload Form1% e- B5 P" D  t% f5 R$ h0 x
End Sub
7 D, W3 ?6 G7 \0 xPrivate Sub Form_Unload(Cancel As Integer)
0 l; T% c- _' y* ^4 Z     '此处写入需要运行的方法
& v! N& ^, p, jEnd Sub6 ?/ v3 X( W1 ]" R
' ~. a$ w0 \  ]
从运行过程看应该可以,明天去单位试一下
发表于 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  [7 o/ x& u; x9 b6 I7 q
检查指定的文档是否存在或许会更好一点?

; B% e& V$ G3 y* C1 N( ~, M
& J2 R9 g( ^1 }8 `; \' x
0 ~$ s7 T. M* ?. K" z4 u3 T5 t) n' L& x- [9 R  r9 S3 G
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开+ }% S# A0 @! T; u
0 V0 U; j; n# b  N4 U, M0 v
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
# U7 M5 K' b+ V9 H  [+ ~6 }" a  Y' Z( i& k% Y5 s
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
% V) }5 a5 C- `1 Q4 c) x" {- X    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)) O) W0 t: W; k/ P+ K
0 O0 O2 {$ z" w: q) v3 {" F- ~
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
; L7 g) Q! J' x8 p- F" Q% t    Do While RetVal11 <> 0
8 I  x3 O& Q* f% l      winHwnd11 = FindWindow(vbNullString, drawname11)
' @% O8 S: M+ ^' K! K) w, y# B0 L3 ^. I        If winHwnd11 <> 0 Then
# ^+ s; ?. J( L3 L1 Z* j           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)3 \3 o, U4 e: `+ o" E* O( Q$ ^" h
           RetVal11 = 0
7 F  V: P; k, c* e/ U        End If$ j! |( s  Z2 n9 K4 V! f
    Loop
6 {5 L# H/ \! @2 N/ I$ k7 MRetVal12 = 1+ g" D4 k4 e; D; R- P% a
    Do While RetVal12 <> 0
; V7 D2 r+ @& U9 H5 L3 K      winHwnd12 = FindWindow(vbNullString, drawname12): z0 R& z2 D! a! }
        If winHwnd12 <> 0 Then! n  p. Q1 n' k& ^
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&); W% F9 G" I0 A
           RetVal12 = 0% E/ r4 c( l) B4 F4 Q% x9 H
        End If
8 V' h0 I( h. c    Loop
& M7 |- Q# E3 W. O3 X& F# S. C3 I" }/ o7 C# `9 q  r
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
& t( _8 v6 N# B, L1 Y, l9 L2 Y4 Y& s1 [    Set M2 = New MODI.Document
/ T: i& ~" ^% N0 D, s" @& i+ a    Set M5 = New MODI.Document
  i0 w2 y+ W( K1 c   
* V  k  h, y6 K. g9 w) J    M1.Create pathmdi11- \: _. K% Z4 J! I
    M2.Create pathmdi12* n$ Q- o8 k+ ?  O
    M5.Create$ Y9 u% x) s; Z$ w/ L+ B6 ^6 u
    M5.Images.Add M2.Images(0), Nothing' P& @8 Q/ p8 \* f( b/ `: {2 X/ ]
    M5.Images.Add M1.Images(0), Nothing- g3 `, {  |8 I# z  ?5 O) \
    M5.SaveAs pathmdi* H; g$ u6 H* o! p3 i% A  \
    M1.Close2 F- R& l$ S/ c4 x
    M2.Close/ m4 @+ X, N& X. u' F0 U! z
    M5.Close  c! m) d% R$ g* U/ O
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
) W7 y" ~# q7 ]6 Y- e4 e3 `    Kill pathmdi12
+ s7 X& I) t9 \5 a1 _& O- J: q- _2 |
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档" P; P& \4 T  |. p
  E: g) q$ A7 J# I! Q

; X5 e" b0 O- M6 C' ?1 C程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
$ R% k* o& s6 o. O$ M1 E9 K. P* a1 u6 Y. U+ o' |
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
% N# x+ y" X$ w6 y, z* l! F: P1、程序死掉,需要关闭ACAD;
# m; k# c( N2 {1 e; c2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;) h6 H  g( h* V9 ~
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。+ H3 F* k) a8 n

, A3 h7 U8 v) m3 F, v, z% H" p现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的+ m& Q& r/ k' `/ ~# E

9 v6 P0 f8 p& @( {$ ], w) F如何在CAD中应用呢?
- J4 U0 k- w  C& z! F, l* }: O+ O
1 `6 ], I) R2 w$ P7 K3 @) ^OPENINMODI:0    输出文档不打开
* N  y( V- _, w8 S% m               1   输出文档在MODI中打开: q0 S6 s6 T. D, S, E
& K) T& ~( s9 u: x, j; F! f

  V' k8 e1 E; b$ X' p. C4 B* ~研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
0 E+ I+ m0 n' s/ ]我用下面的代码做了一下检测" X8 O) `) N, o, z6 p: T

  1. # T4 j; S$ D1 f7 X' t
  2. Sub A()8 L4 H; y* W4 k$ E* |& A# x7 z2 d/ j
  3.     Dim H As Long, I As Long) k+ b) r% h' c- m
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" $ v6 O( `: x; ?9 ]4 a% ~# }3 ~
  5.     PostMessage H, &H10, 0, 0
    8 U, E0 O, H2 u$ n, Z0 r+ N% p, z
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0( ^8 w) a7 |# @) r6 ?3 `* c
  7.         I = I + 1
    9 A  n* V7 h% _* G
  8.         DoEvents- F0 ^" \8 Z- v  [: o
  9.     Loop
    ' P( g$ [. P( }7 h
  10. End Sub  Z  t& \( ~1 {  z) X1 O
复制代码
3 r7 j4 ^% K) C
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。& o) l  q) u% w" ~' N
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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 Y! _  x/ j5 }9 ]: r) Y. W我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
- p2 s* J. R, @" o我用下面的代码做了一下检测1 {) J; Z9 h# K6 ]! @9 k( y7 V% T
4 p8 G: m& v: K$ [( t! v5 Z
Sub A()9 `) [0 E* f3 H- Z
    Dim H A ...
, Z0 K) s8 b: U9 G8 |0 k) ?1 I- i
3 N' h- W/ W4 X' C5 v0 ^
( m7 c% [7 ~& ?, y$ d6 ~7 K" X
谢谢斑竹, M( k) A% j$ R4 @% n
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
& e3 o0 l( p* E! `2 L8 psendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
7 x# H0 }, K" X" \& T既然是虚拟打印,为啥不可以输出以后在合并呢?

6 ~' \8 d) w4 Y2 v: K. t
1 n7 ~& f7 Z  I- n# J我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
. u# |! A) p2 ]6 Z6 p/ ^( P: G% s% w5 u, d0 z" C# Q
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
! X* X( r( d1 I* J    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:3 n, i/ x( a% T
    .........
- G5 k# S7 T9 K5 Q+ I  O    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
' X7 z; F7 Q# h1 }& @. a7 ^- J    .........
1 k$ p' a1 C0 k7 m' p    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)0 f7 f  _& N, X. m7 t( z
        ........
, l# ?7 t4 ]; t       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& h5 y8 d& P7 I* U" d" |4 V
测试发现:- z" t0 R( i5 }! O7 R. z
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
* h: k- ]0 C' s+ ]    .........
+ _% |: n$ ~! y+ ~    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

1 ?! Y. c" ]1 B& h
3 F" E6 t3 f; ~* O
$ ~! K4 z% d( B不需于空打印,只需要空设置就可以了
3 C# G7 F, B: o9 N
% b% u% ^2 |( v2 b. _: v9 u# }9 J+ }0 x! n: y+ ?
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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