QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了: d0 D9 L( U* k

8 k( u- n9 _: y4 X在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。- ^  c5 e  W5 {! \6 A9 p7 {
, l: J- v3 r2 p  g1 F* X6 z$ Z
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。  t* D0 A4 y0 f5 q, n
/ N: g! w* ~( L. a% f' e
这就是说plttofile方法是还没有运行完。
. Y. N& w1 h. h8 G$ z% e* q
- `, ?, J0 E& z  R2 y% Y2 _问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
1 @) Y+ I" C: f- a9 K/ y
5 R0 b, S. _* p5 `$ K8 O) W+ T[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
9 j# X( d2 M& |4 PPrivate Sub Command1_Click()
  A9 o: O+ B- |. e( r     'plottofile方法* H. I/ _1 W: \9 `
     Unload Form1
7 r( ~+ ~1 d2 J5 {8 }5 fEnd Sub$ h, B$ l$ Q7 O, a  v1 T
Private Sub Form_Unload(Cancel As Integer)  A/ ^3 V% l( w/ c
     '此处写入需要运行的方法
$ u" w  j2 ?7 r3 F+ n# ^: pEnd Sub' ^% K& w7 g9 v5 z' f$ k

0 [* M. M* g, g& F1 }- N4 D4 V5 e  t从运行过程看应该可以,明天去单位试一下
发表于 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# Y. R- o+ n: @; a9 W  h; ^
检查指定的文档是否存在或许会更好一点?
! j4 x( G. B' U# z6 B: ?; ?5 p
5 g  A8 u2 C, ~) @1 }7 m6 J

* n3 B+ T, W4 ^0 e( a! y. C4 |' p5 y  r* [9 l( q! K3 g' }3 g
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
  ^8 ?. b. \' H! @/ s
+ R( e5 i- M! ?程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)* i1 o* Q8 c; p6 x0 h

9 r% c$ |; E+ |& i1 k9 _    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
3 Z  y& r9 }4 r    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
9 c1 T# L' B, y9 N
$ V! f  i6 }7 {# c RetVal11 = 1                                                                      '关闭PlotToFile输出的文档+ s( K5 [8 K# N3 R/ Y
    Do While RetVal11 <> 0
% s' p( f2 H, ~% _' m- h      winHwnd11 = FindWindow(vbNullString, drawname11)9 [& t- Z4 g. r1 K/ N
        If winHwnd11 <> 0 Then
% i8 s# B2 Z) N/ P8 p           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)* M6 D$ f) t/ Q2 X$ x; x" }
           RetVal11 = 0- c  G" o+ h9 X9 [6 ~: ?
        End If
8 n3 O# A8 A4 D9 l, h3 k9 _, ?    Loop
& _% p0 b9 N8 wRetVal12 = 17 h9 `8 J# N) F1 J
    Do While RetVal12 <> 0& x! O/ U9 D9 X$ [2 V/ p
      winHwnd12 = FindWindow(vbNullString, drawname12)! l( X3 Z  q! ]) j/ u( g
        If winHwnd12 <> 0 Then
4 F5 V5 S+ \7 {1 A           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)+ E! _& }2 c) `5 _3 q. X( \6 P
           RetVal12 = 0  I& y: a. U/ v# s7 n
        End If
' m4 f3 c+ \9 J, A6 i+ D    Loop
, T' F1 @1 M* v& i  j! f4 X6 Z4 }
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
0 b1 l+ o9 G' i, N8 N% d1 h* a4 J" c    Set M2 = New MODI.Document
/ T5 A# E7 W4 t* _" ?6 t+ ]    Set M5 = New MODI.Document' E/ B# ?# z# u1 H
   
0 s7 v7 N" Y! l8 ?: v    M1.Create pathmdi116 w/ X+ K; G& n
    M2.Create pathmdi12' m9 R% U. i* c6 }0 m
    M5.Create  ]( G/ ]2 a; e: E9 @5 S" G
    M5.Images.Add M2.Images(0), Nothing
# Z: t* P+ x! h5 q    M5.Images.Add M1.Images(0), Nothing
: y3 S- C2 H* I$ ^    M5.SaveAs pathmdi% s- C1 s2 P! b1 Q% z! h) b- o& p7 v
    M1.Close( e; ?3 w, \. i0 {) J' d8 ^8 P
    M2.Close2 q! h% D" M  _. h$ p0 S$ _
    M5.Close
. W) Y9 e$ T$ @/ {/ D    Kill pathmdi11                                      '删除PlotToFile输出的两个文档& f8 B0 m: ]. l
    Kill pathmdi12$ k3 M, B+ q) _' [  W

* j' v. X, z* q/ H. |- n+ G    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档, a# T9 \7 G8 ^# z
5 l$ g' A, u! r0 x' y/ }
5 F$ ~0 j  d. K8 I, P& u. H# D
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档0 c) w* e9 p5 u0 k# N/ ^8 t0 \

7 Z7 ~. T# V6 L/ A" }3 N5 S- Z但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
  D  _8 o0 Q+ Y+ X1、程序死掉,需要关闭ACAD;
) ?+ G! U/ v6 ~! F2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
$ P$ r. f9 U/ ~2 H. v" h- z3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。3 z# U3 M; r$ b; B/ f, M
5 G4 ~# C, B) ~+ _% I/ m
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的# H/ S$ }. P& e8 b) m# G# J1 x

# ]! ^$ @2 @" D0 \! @2 z. s如何在CAD中应用呢?/ V6 ^. Y) B! V$ o' S
2 x$ v, R1 D* S  {/ L7 c; j, {
OPENINMODI:0    输出文档不打开, d3 P  P$ `* w
               1   输出文档在MODI中打开. U+ ]- \. H. _3 W8 v6 [- i2 Q: \
* I# p; k7 Q; \2 [0 M
3 w: v6 V$ Q7 V6 q6 d0 c9 _
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。( m# [# {( P# F0 P
我用下面的代码做了一下检测
2 L. F# j6 H& K" B/ t7 p

  1. ; z6 I! f6 S) g8 K
  2. Sub A()
    # I, U9 _1 h2 Z1 e  D2 [6 k
  3.     Dim H As Long, I As Long
    6 _/ ]7 M6 w& b1 w9 O! A
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    6 d3 _+ ^6 A9 t" G" e5 A2 P* e) ?
  5.     PostMessage H, &H10, 0, 0
    ; m0 }. i& N8 [; ^7 B, z7 n
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    ' W8 {8 c' l: e8 x- n2 I4 W; c
  7.         I = I + 1
    3 ^: n: P4 g4 I) ~. b
  8.         DoEvents% h/ j! o( b! y! O
  9.     Loop
    " m8 l7 j3 L" y; i
  10. End Sub- S. A' A& O  ?: ]* Z+ [
复制代码

9 C+ h7 t$ [3 D( h0 G* w在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。: p# t% k$ W6 {% P& |
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
& y* g5 D7 Y; _7 ^' L我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。" Z$ a$ ?+ ^# _) t; c* @
我用下面的代码做了一下检测- U) ~& S7 J( E; d5 D

. E0 V" b. R& Z: w" Y% ?Sub A()
' c: i) i5 X: h# U    Dim H A ...

3 k. s- ^- u# L0 W8 Y2 m: \; n2 _# T+ v' b5 D; m: m  v+ u8 k3 T
* m: R6 l8 @4 ]! |2 C
谢谢斑竹$ v! q. I+ s4 Q0 D
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
6 G' h1 j; l2 \, M; p$ t8 _& j' @sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
5 {2 G5 ^' V5 N' s: {  w- U既然是虚拟打印,为啥不可以输出以后在合并呢?
) B* b; M& o# r8 B( @: E+ m

3 d$ Q( C% L5 D# W. u6 `8 G我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
1 @& X) D/ H' s! e1 J
) o6 K. X& S0 |0 A& n2 T& E1 p# F输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
2 c8 R) A. Q& h4 ?- U    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
/ X. f7 `1 ~8 I" a    .......... r& C9 k( H+ r: O
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式) _. O1 \' s& @. }7 l
    .........+ ]4 m3 E9 c8 f1 v0 {
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
) H; v( `. r, V' F1 z        ........
9 r! B3 X( m, P. L% b       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
& G+ g3 B, W: |, p) i; \" P测试发现:) I8 S% v' j  D$ q! i% A
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
9 ]- Z: Z* r$ o2 T1 o; }7 x    .........
) X, ^) {" y; L) B4 ~/ f* `2 s& s2 U4 `    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
, m% g& y( n' \$ U- ]

7 u; E! b4 X7 s* y3 r$ W
) }8 b5 q9 t3 g不需于空打印,只需要空设置就可以了
) l8 c7 w* V+ j0 V, W, F5 ]. e2 p. s, H0 j, S/ l  u5 x
+ D$ ]" ]9 s, ^3 |% v
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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