QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
! N- {' q: x" d) b0 B( q3 d# V
  Y7 B3 R$ A6 n9 Q8 z在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
, b: W! i$ \5 A3 u7 P5 o' M6 _
# Y- q- r8 L7 L9 b1 O但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。! x& j# j/ W) R! J7 s
2 I# K! q( h2 ?5 Y% ^( X6 Q. ?
这就是说plttofile方法是还没有运行完。
2 |' Q6 x) W# l/ w) b; m
) r+ N  }/ s) }, b问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
3 Z0 f6 [! z. E
5 s$ C$ ~; Q0 u  Y5 [: j[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:: I% p. n8 W: K! a8 I3 E8 r
Private Sub Command1_Click()
9 [* K6 ~% `- h' J9 h1 N     'plottofile方法/ p( s  d2 ]: h  ^
     Unload Form1
( [8 \* J7 A, l) M. k5 yEnd Sub
$ f/ o& i  P/ G8 NPrivate Sub Form_Unload(Cancel As Integer)
; y$ p1 |" a' l2 y     '此处写入需要运行的方法. U) Q$ ]. o6 {5 A3 k9 P+ W  s
End Sub* X# l4 z' @+ p5 ^6 ]

$ K2 \' r' `/ B2 \. y3 I从运行过程看应该可以,明天去单位试一下
发表于 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
% }. i+ A' ?, [检查指定的文档是否存在或许会更好一点?
8 l2 a% S$ P9 S& c3 l6 }

* q& }  z2 F( Q' e+ A9 [* E/ [0 H; ]' P# t8 B

% F1 g" l8 k) |7 m* G; p文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开$ ~( R: k5 X! T
4 E7 |7 P" Z9 K; m* \# M5 a
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)( G: e9 @" g. x! o; l7 r

1 _/ ]* |: n7 R& a& ]    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
5 f0 {( y+ ~9 l    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)% j+ g; `! `! A5 Q5 m

8 F5 a8 X% e, V, ^ RetVal11 = 1                                                                      '关闭PlotToFile输出的文档0 w% Q; n$ u! |' m
    Do While RetVal11 <> 0' o# h. v& t) _1 k9 g" L
      winHwnd11 = FindWindow(vbNullString, drawname11)
" o9 K  r: m8 v' L( K6 O: ^- m3 G        If winHwnd11 <> 0 Then4 }9 B7 c  u, w. x( J5 S
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)4 i* s1 L6 f# q0 g% \2 m
           RetVal11 = 0) ]  ~: d* E& n( [; J! c
        End If
  F$ N" S! L0 `; l: b# G. b- K! Z1 `    Loop
+ U+ D; d8 b5 ?  [+ X/ ZRetVal12 = 1, ?+ g( }1 d* p4 t
    Do While RetVal12 <> 0
" h8 z9 S. g+ e3 ^% ^* l' }      winHwnd12 = FindWindow(vbNullString, drawname12)
9 {' s5 o  a, L9 _8 h$ O4 d! D& g        If winHwnd12 <> 0 Then! Q3 T5 J# M: D+ \6 }
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
2 C, S" I, p* D5 X) ]; w% u           RetVal12 = 0& R6 ?9 K8 _7 X  z, ~
        End If
! Q  r9 p( F3 `; r. Q7 A) g( `' h    Loop
# L8 f9 @( k5 O$ S
* B& j5 ~$ v7 N3 C% c. p   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档# z& S; h8 b9 [, Z1 u6 T
    Set M2 = New MODI.Document. B' r7 Y, @/ j; v1 d: ^% S8 V
    Set M5 = New MODI.Document+ H0 y+ W4 b. y: }/ {2 L3 [
   
" ^& |$ k# V, ~) ]: f    M1.Create pathmdi11; {( i/ b9 W: G5 M
    M2.Create pathmdi12
; }' k0 f4 o" O& @4 ]    M5.Create
, p  H. {7 C% P+ P6 i$ g    M5.Images.Add M2.Images(0), Nothing+ l, _! @& R) _& J" I$ M
    M5.Images.Add M1.Images(0), Nothing8 w# I8 \, v* G# p9 h
    M5.SaveAs pathmdi
8 }! m1 J9 u0 z8 c! a    M1.Close% F6 @1 l3 d  d% I2 s
    M2.Close# C+ y- `5 ^6 g  a6 f3 @: \) f9 ?
    M5.Close
+ f, ^  k& f) e4 G. k; X. V$ r" H    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
. c$ P. M0 i* b    Kill pathmdi128 q( a- C- _" I( S& o

' I* h# m; u6 w" {1 b' o) F% s    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
9 |1 H0 ^- j# S* a! h- Y+ x
9 p6 a+ c1 y, a2 }) y6 U$ k* P4 J0 Z+ O  \3 s* b0 M
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档* S' r4 o# N) p

9 f5 e$ W8 ]2 v( H. K但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:* M' W4 t2 q& _" u- m2 {
1、程序死掉,需要关闭ACAD;" `+ ]- F1 e, }  B) D
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
8 [. k8 S) Y2 i* \5 Z/ F3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。& ]7 u4 k- v# A5 `2 V
! ~5 i3 J) @3 `( `
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
7 M, L  }0 ^/ c9 w, y  O; T
9 [7 b) |0 x( H7 A: h$ y/ D$ F) V如何在CAD中应用呢?
6 S  D' i) H' R; U+ Y, W' C6 G" L- _; n  x; \/ r, f$ x' u* b/ w
OPENINMODI:0    输出文档不打开3 y' A* f2 E; B6 C2 I* v& W
               1   输出文档在MODI中打开( ^' B) d3 Q% D$ H* T% }( k
4 W3 ?& n0 w. l# T

" ^2 E6 K) o, z9 W+ _( @  r研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
; ^3 b9 N, x2 c" @9 h( i$ N* C; V+ H我用下面的代码做了一下检测
; h1 I# o8 f6 r' \# H
  1. ( a5 Q( n: s! u& X- O9 i
  2. Sub A()/ }1 L* A: W* n: h+ X' u) _1 {
  3.     Dim H As Long, I As Long
    3 ?, N/ A: d# q$ v+ @
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    5 z. X' w" d; r; `. s
  5.     PostMessage H, &H10, 0, 00 N9 a/ O$ Z1 s# t1 z% Y
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    ' |- j" ^" {$ d; d; p# n3 }
  7.         I = I + 1# Y* d4 D3 {; e: Y+ T
  8.         DoEvents
    . X4 O& c( M( Z5 |
  9.     Loop$ Q+ A0 j# ^- L6 i, o
  10. End Sub* }; U9 O+ y# A( U$ p
复制代码

. m8 _; {  S& H4 @7 Q" s$ |( x在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。/ p! S: Q4 R# s) ?& `( F7 I9 a
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
/ s( [1 }% i3 o7 l4 M+ E" g& U# l1 o我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。  M& ~5 @6 y4 v: M* B7 \
我用下面的代码做了一下检测
* z+ Q) g) E. w& G: V
0 ?- m% D) T1 ~+ j9 \" [Sub A()- ^# w: t6 f: m$ X9 e, f+ N- t; P* E
    Dim H A ...

4 w9 z& _$ o0 Q, t
% j; G5 c/ N4 y
' l3 Y- {3 l2 y9 w谢谢斑竹2 G- e! l% f7 c
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
; b% H' w5 {& hsendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif# w# X, l( M# s% P5 V
既然是虚拟打印,为啥不可以输出以后在合并呢?

) K! Q; N/ C1 h& W; m$ ~! S+ v5 y
  r) d) Q+ }/ q1 t: R4 B' |我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸9 D  n! {; e' v8 Y, S
( [: z# }8 e! @  l% }
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:" A8 t- ?+ T8 \( ]/ O% y6 I' M2 a- @- x
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
% [% [* N+ s4 x' P* H/ z1 v3 c9 k    .........! w5 t) T5 Y2 R. T* i$ H5 C
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式% ~  N8 B6 t$ {8 n& R
    .........5 m- {) \; z0 z& n. o( v1 W
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
/ `* H2 ?0 @# `7 T" D        ........
! h2 K$ F7 D- n9 @+ n       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! A5 Y. b! d) e' M1 J
测试发现:
: m7 C4 h  B! K7 j9 O+ K: C5 R    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:, X: b9 U) U7 Q% O% i/ v# f: {) l
    .........
0 T2 Y" }; t5 m7 W3 ^    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
8 p  G8 @# T  S( x! ]
6 H4 t( Z5 }/ m) f
# u2 z9 T$ ^& Y! o/ w
不需于空打印,只需要空设置就可以了
& I& J$ X" D" M" ]6 S" Q' G0 S9 ~1 ^' ?

0 l* K  L6 }$ l+ ?' p问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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