QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
' b3 m) d! Q1 V; y/ O' Y) a. Y( J6 ]9 h2 J' l
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。% |2 r" K2 C2 s- i8 A# I; E" l
& D5 U! I& p# j  r- U. \
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
5 Y% P. q0 I) f- H" H3 u  j8 d1 b5 `$ v" H
这就是说plttofile方法是还没有运行完。
* Y, |, e( T5 f/ s2 ?$ o$ {1 p* a. ~
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?* N3 R& X6 K1 c8 s2 U- A

# a8 r& i& n/ z[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:5 m+ J) l" c- Q4 g- B$ U7 L* d, x
Private Sub Command1_Click()
+ d* u; X3 J' S7 c7 r+ \# P     'plottofile方法6 X7 J5 n5 W# q' |
     Unload Form1* F5 k, B2 c# t* F: ]4 e% x$ O* }
End Sub: U! g  }1 D$ b4 y2 @+ G4 S" `6 D
Private Sub Form_Unload(Cancel As Integer)
+ q  H  ^# l: Y1 T! n; r9 ]" R     '此处写入需要运行的方法
( i, r; q3 E1 k. e* [End Sub
* ~' {3 u; x1 \: a& Q6 P1 C: x
+ w9 o5 G  ]$ C. X# 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, |- P4 K' \7 h
检查指定的文档是否存在或许会更好一点?
. M* _4 l7 Y9 Z3 Q& h, D
& Y- I0 ]3 H5 e" m% [' g
$ H5 _. a3 z$ J/ c4 k) i1 j' M

5 `9 c; d& v9 b7 w& j3 ]. a文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
9 P( z* u5 C* ]* y
8 K9 K( V7 E: o! w" Q程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)+ X. M3 w4 }& f4 h0 X8 Y

3 d, ]: Q' \0 r- E( }0 S+ t, K    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
# R4 J2 d3 F* t; D    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
  c9 E) M; T3 A# ]( w) k0 s' P1 b& E) j  y
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
6 d1 @4 k) ]7 n& r* v! @    Do While RetVal11 <> 04 s- p& l! N: \* o$ l9 `
      winHwnd11 = FindWindow(vbNullString, drawname11)' o$ I  i: h  i+ e4 D
        If winHwnd11 <> 0 Then
$ R+ B8 S' N3 E( c1 s           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
( m2 j# \$ `% J# Q           RetVal11 = 0
  m+ T: Q/ U7 }7 O5 V% \9 L# E" u        End If
8 v' x9 a: ^- ]    Loop
" v. B8 H* R. |9 JRetVal12 = 1
$ t0 M! O5 _, B+ p/ g    Do While RetVal12 <> 0
. r- N$ S. F+ t0 \      winHwnd12 = FindWindow(vbNullString, drawname12)
1 c- ~1 u" c4 i( X7 i7 T        If winHwnd12 <> 0 Then
8 O3 Z. _- x+ \8 p  h9 Q           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)7 G; s) q1 E' g+ Z
           RetVal12 = 0
3 N1 v4 i% z, V. X# a9 a        End If. P+ g; f7 \3 M4 `$ o
    Loop' C9 j" N' |& o3 J  O

) o0 J2 o; y6 X1 B  y* `   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
9 P3 `# C  g" V5 f" L    Set M2 = New MODI.Document1 E( w" t8 s. N, i) v
    Set M5 = New MODI.Document# d/ M2 ]( X2 Z4 ^2 e
   
4 \* Q- ?6 N* u9 p    M1.Create pathmdi11
+ G6 g! f. d* l7 H4 @    M2.Create pathmdi12( s+ X- V9 L) v9 h8 _% Y
    M5.Create/ r6 i6 }+ V, f7 G% f% L. I+ c
    M5.Images.Add M2.Images(0), Nothing
) w: @0 e7 C! _2 L- U1 T- [+ i    M5.Images.Add M1.Images(0), Nothing9 f% f( T+ b5 i! D, B
    M5.SaveAs pathmdi2 B5 f* w4 _( |% e& l
    M1.Close- V& {4 J% w! _. V! q  v( x' L
    M2.Close
9 _7 k7 q4 |/ y+ x7 R  O    M5.Close0 n: W& G% D- x" f9 w: m2 [
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档$ v3 d. h" h/ R  U/ c
    Kill pathmdi12
) u( Y2 e/ `1 \" N6 o# ]  }' b% Q0 S3 u
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档: |" N  D$ H$ L; }+ \: n% q7 Z
- ]# s, z$ S" L! P/ K+ `" J& s
4 S$ A) F. J( t8 N( [
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
6 F% [6 r* E* }7 Q  n8 }# w# L3 m% p6 k+ r0 d7 ?, @3 j
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:. y) ^7 L5 g/ K4 U' y5 ~
1、程序死掉,需要关闭ACAD;
; D% r  `2 I; F' K+ k" A* V+ P: O( u& u2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
. Y/ N, a- c% R2 p: T3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。/ I; B  L0 z/ H! k
/ w# V; n: U0 I
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的% s9 B. Z! ~# [! _- _
9 x. i% n: S0 l* H, L0 y3 }6 F) F
如何在CAD中应用呢?
5 Z: r) P" V/ A
' y  X. |4 C1 K7 v  {% J7 hOPENINMODI:0    输出文档不打开: _' C' \: \9 L5 I
               1   输出文档在MODI中打开
. G0 M# F* }/ c" b1 r
$ W9 {, p0 Q) _3 @. p" R7 G- O- B$ e5 l
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
! `' m! m" I0 m) i7 t0 P4 H$ }我用下面的代码做了一下检测
# {9 y; F9 m% k3 K" E" f* V

  1. - i" {/ e( o7 U9 N8 H: W
  2. Sub A()( R* J$ h  H8 n* l
  3.     Dim H As Long, I As Long% w6 A9 Y: q9 ^+ k$ a  N
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    & A0 b9 l4 a# R4 E' V; Y/ I! s- [
  5.     PostMessage H, &H10, 0, 0& Y6 I) q' q9 c% `5 r( l' x
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    ! _' [7 c2 p3 M# \9 @# ?( L* o- V, n" k
  7.         I = I + 13 ~5 A( j) m6 j- I; r! d  y
  8.         DoEvents  w( z% N$ D. s  h. k: h
  9.     Loop% @  Z5 r' k$ P1 [& d7 S& C
  10. End Sub
    6 n: L. q: {* O$ e8 w
复制代码
5 `4 x) w* c5 A$ `1 z6 _
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
0 n# M5 a4 a' U' C" ^6 B建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
% e' R* {) q' k我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。* k/ R! T3 _. A0 _
我用下面的代码做了一下检测
/ l: N% u( C1 x$ B! o
& e& h2 i- ^! y, \/ MSub A()
6 c/ D3 l  o, l4 F    Dim H A ...
9 V+ p) W4 z4 ]# G; E8 F; ]
9 o8 m* K6 `* J$ r6 y
  P' N7 [: k5 u6 M9 t7 V7 P1 H
谢谢斑竹5 C; i5 |, D: y* l/ o; r
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行5 D4 j& C( a" ?1 \0 @
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
8 U- z# h. X, F# l既然是虚拟打印,为啥不可以输出以后在合并呢?
$ x8 a6 e$ \4 u% `) I

2 z/ a9 v8 p) f我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
" {5 ^( z5 B5 \. `' x0 g$ b- J" R' W  p/ ?4 n3 B
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:, X% n  W% g; S1 o3 u) U
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:& Q) y3 f" \+ |: C* D
    .........
. b, r! E3 a$ y5 g! k    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
" l  e8 m1 y8 X/ s: q    .........$ d% }* x: H! Z- G, }2 p  a
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
1 l. O$ O$ l5 ]4 q        ........: _# I4 G) K# B2 ^) d3 F3 G  z7 P7 p
       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
1 i4 S. l5 r$ l8 P测试发现:
, Y  D1 G  F; @, T. q    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
! G: @$ Y" h7 c2 M4 Z9 x0 F/ J. r' t    .........* k( C, M. @* V
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
) l3 P; e: ?$ p3 H' F0 n
4 P7 y) [$ \% o' W* [: p6 K
9 e- b* V/ o& z1 @7 L
不需于空打印,只需要空设置就可以了
* G1 T( s5 I; Y1 E: H' I
2 v: O- W/ |4 R) Z& j% [4 Z2 F: I
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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