QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了1 v+ i8 @% p& N- K& U2 Q0 Q3 U

( H6 U/ K7 ?' y4 y) p5 d4 q在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。! a3 M3 k4 }& p
: M8 `  C' e' k4 q
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。5 u: @4 Z, N7 P7 y

7 ]0 i$ H, F% w& ~% h: ?这就是说plttofile方法是还没有运行完。
- Q: v. S: X9 e5 D$ f8 E
8 n/ d  N' m' _' x1 Z& f问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?; O1 B8 u) n/ D, d) Q8 v# o

, \8 u6 s# p9 J, v, v# }7 z" ?[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
2 x6 a9 j9 k8 G8 B. E' l' jPrivate Sub Command1_Click()& v8 H! o1 l* h* U! s* D+ b
     'plottofile方法/ U/ P% U* U" p
     Unload Form1- g* ?% q2 h" ~' L1 p' W  V8 t% ?
End Sub
4 k6 ?1 Z  n# q6 ?Private Sub Form_Unload(Cancel As Integer)
# V# Q. e) x. C# Y- O/ _$ D. p, l     '此处写入需要运行的方法- x8 d6 |, D  N% y6 S0 N
End Sub
& W/ u- z3 S+ s) g/ P6 R, z7 z, a5 j! Q) ~. A7 z6 ]
从运行过程看应该可以,明天去单位试一下
发表于 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
* W' u; q5 M7 b5 P0 |检查指定的文档是否存在或许会更好一点?

2 A: o: u% H8 O  X( G& m9 O+ ?* U' k0 @
& b! c* P. I0 }: c  [

, L- ?0 @% B9 D0 B文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开8 r( Y9 I2 R& j  Y# g% K9 g- J% \
: r5 I' R  L9 {# {. A/ m' H
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
, U$ N: c6 y2 x" [, n4 j) E2 [) P5 n# ^5 Z- ^& ~
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式8 e& A+ [6 i# \* }0 f' U
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)7 o3 s% A  z, B/ h
: z" |: f6 Z% E6 y8 [0 w5 h8 {) |
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
4 V/ {% ?8 X' Y  \    Do While RetVal11 <> 0
+ R, j" g: S) S$ }  m, _      winHwnd11 = FindWindow(vbNullString, drawname11)- J, Z# L" ?: z
        If winHwnd11 <> 0 Then3 w7 O/ s4 }2 F: i. k9 g' G0 o
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)' P) Q5 o$ L6 m5 j) `
           RetVal11 = 0% |' S+ p2 u, K( H( _* i, O  o( K
        End If+ m# ^3 _; r, \% ]: S$ z6 ^- e2 W
    Loop
5 L+ Y5 b, j* k2 QRetVal12 = 1
5 T6 V0 J" V* ^2 s    Do While RetVal12 <> 0
, P- C8 _8 B+ W* Y) u( t0 |8 i      winHwnd12 = FindWindow(vbNullString, drawname12)
, H/ R+ T( T( g% O        If winHwnd12 <> 0 Then6 ]4 |/ M5 l2 m  A0 l8 m0 w  n7 G
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
7 k" ^: l, f" t) r7 M2 T1 D           RetVal12 = 0
4 H9 _" L1 m" T% n        End If
2 A& ?- m3 V3 m' V4 z; W( p    Loop% a8 M9 ?: @7 K' o9 x6 k3 o

2 ^  m  [8 I* M+ W% L6 Y   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
' q6 I- e' }0 W* z8 y5 ?1 ~7 w    Set M2 = New MODI.Document& f5 s, s1 a4 ~3 ^. b( V3 p
    Set M5 = New MODI.Document, @0 e8 S0 U5 F6 {6 M* r
   
; R# v9 ^0 q7 [' Y* C# W) F: u1 e    M1.Create pathmdi11. w& N3 I, A! ?2 L  _4 ^
    M2.Create pathmdi12" P' w' L+ u$ f: |
    M5.Create
  O% d# [2 j5 ~) T$ `    M5.Images.Add M2.Images(0), Nothing
* D; ]7 Z; I2 l1 f/ J& ~' G    M5.Images.Add M1.Images(0), Nothing
' R) V. \7 I* ?: M; k- H% O8 S1 N3 g    M5.SaveAs pathmdi
* i* H( w! z; `" O: p$ Z    M1.Close
7 H" C% }1 f7 Q, p$ n/ X    M2.Close
. q3 [- w) J5 l4 q  B    M5.Close
1 e6 e+ q, h: D/ m) I) N* y    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
/ V4 U# i: D' A5 L    Kill pathmdi12
2 A' K$ v3 \& w% C* w, _9 z* Z- r5 ^' ~1 L- [% J& A
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
+ A5 k; t$ C* @% w+ p) w5 o- }
) t; C* t9 T0 \7 G( I1 n$ N. z( u5 ~+ j8 }5 o( v; s. r
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
6 s& J2 m% ?+ k2 ^
) [! w. v. S; @$ S) w1 e  |/ S但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:' {2 N0 u6 `4 }1 j5 {/ P
1、程序死掉,需要关闭ACAD;! V8 ?8 k5 B7 P6 t' k! k+ M( Z& q/ Y
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;/ U9 z; Z0 m/ A5 t: h" G
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。; H( N/ _- s, g5 {

" y" p! x7 w% L* a' u& Z8 @1 q现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
1 J+ H) d6 R9 {  b. a' z( D7 J0 v+ H$ k0 E# L& P+ A1 }( ^
如何在CAD中应用呢?
6 C" o2 E" o! p+ {+ B
) H: i8 s( U9 V8 @3 F4 J7 IOPENINMODI:0    输出文档不打开
8 Z8 G/ O( O0 n' B               1   输出文档在MODI中打开
, F9 p1 `6 J8 b4 o3 t
6 s/ d6 Z2 ?* a8 r6 c4 X/ C& M$ n2 M& e: v" Q
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。: k( j! J3 _5 y+ w% ]! a
我用下面的代码做了一下检测# m; y( r5 z& U- o$ d" I

  1. ! e- U; t$ k" h0 R9 `
  2. Sub A()" M+ c; H' q" d3 s: z2 A
  3.     Dim H As Long, I As Long
    % Q$ x/ S, n! \
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    ( e( J& `  n" V. @2 p- n  u
  5.     PostMessage H, &H10, 0, 03 ~9 c9 y8 d5 }. `, c, S
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 03 w, x2 g8 v* J" ]! Z; _
  7.         I = I + 1
    9 _7 u7 J2 \& n6 x# h, H7 n- |" @9 J
  8.         DoEvents
    / H) M# ^. c2 j- Q/ k
  9.     Loop
    5 L1 @# @+ a9 M" k  O$ ]0 o
  10. End Sub) g2 ~# T5 ^5 s1 y& Y
复制代码

9 b# w9 _% L& X3 E- Q在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。9 o+ Q- t3 M7 I  w6 z
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
: w$ g+ O' x/ P2 B6 r1 \我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
/ k8 M/ V: h5 |6 M, W4 a我用下面的代码做了一下检测
$ w/ g- I; [( n4 Y
( ^* M% J) f2 |% [Sub A()
" i  e# A3 O8 x9 N! D8 G  Y    Dim H A ...
' o6 u9 N; ~( P# @0 ^4 J! h
; F, \) e" b* a8 C6 h: a: w' }& x/ f
1 ^1 h% N" q$ h( F
谢谢斑竹
: [! K( t+ S; K: I9 ?. {窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行" R6 y) }0 J+ `- j
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
9 f( T8 b0 I0 A. e6 }+ B: z% P既然是虚拟打印,为啥不可以输出以后在合并呢?
8 Q- z5 `& U2 z6 L; U$ }8 I

  x% e2 k, U- j4 i我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
& [, f9 H1 H5 I/ C3 W/ Y# Q2 ?, r- o$ z2 Q3 T
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:" a$ D& b, B$ y$ o2 Y3 I& i9 o
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:  q+ s* j8 W% z# m' ]
    .........5 E& {# j  B6 U2 t
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式* z0 }+ I+ B8 n$ ^1 D' S2 a) P
    .........; B/ ~( Q! s& A+ C
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)6 `4 q! k/ w; d+ y4 K& h
        ........& i. N# }" N& U6 p! R
       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.gif1 t, d0 [" O& a1 i- Y& I) ?: @
测试发现:
& k7 T2 D1 c  G4 `    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:( F+ Y* \1 E1 v$ P& G
    ........., a+ y3 j4 r) ?3 m. v$ H
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
5 S) W9 `/ f2 @$ Y6 J" X% }2 `. }
2 \( p9 A, R/ y6 |
5 J  q3 I$ l" |3 a/ }, W
不需于空打印,只需要空设置就可以了
: v6 K( `2 d% V9 m: N% b# \
1 Q% q. g6 e6 y3 C; D' ^7 z, _1 w' c) W* U
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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