QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了% Y, I3 R! \: E2 \$ C

, R4 m1 D* y* [3 F. u在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。4 k8 q. f) w- m1 ]8 G1 i

+ ^. |$ I: Y) U- k, `8 ?但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
- S1 z9 H' O, b5 ]- `
3 q- v! a+ E( u0 v这就是说plttofile方法是还没有运行完。
6 V" S5 a% g6 n' K9 o3 X0 _
" a" n0 o2 s* d# v; M& i) I7 n问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
7 g7 @6 W# }5 X' T" Q
+ ^  f' ?% D: ]) {[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
3 {& `7 I3 x4 y/ t# q. g3 r- c. O; hPrivate Sub Command1_Click()
4 [" K- Q; u! @* B  T     'plottofile方法& }1 W$ }! M( }" B1 ]5 V' v' m3 r
     Unload Form1
. S9 U( D, L2 Z  u9 E2 _  B$ Q7 KEnd Sub2 d$ h( i; J9 k
Private Sub Form_Unload(Cancel As Integer)
9 M$ Q1 M, j, [     '此处写入需要运行的方法9 C6 a* \5 a; j; f: O
End Sub. E) U3 }$ h" U  j4 V, ^
& W* R$ V+ u) c
从运行过程看应该可以,明天去单位试一下
发表于 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( ]5 x+ U. j2 k1 N( a
检查指定的文档是否存在或许会更好一点?
" c9 }4 l5 S' x( Q

# }+ s" D& |% g" M8 ]+ _( s4 `6 x" _3 R
( S; f2 j/ L4 [" \) Y# U
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开3 L' N+ Q1 P, e  w, n

* Z, Y" c" g  i. ]7 ^程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)# d. H% |' D! Q( ~. i: Y

6 |4 j( O& U+ X# x$ `1 H4 }    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
' C& C' K0 m+ O6 n; Z( e( s    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)& E4 |- [& u2 k7 {7 n; }7 \1 S
* W. S" b/ Q2 i9 L- o- j( [
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
  J: z& w5 [5 B2 H- W    Do While RetVal11 <> 0
& n6 @: w% P# w/ S3 O1 L- g4 r$ t      winHwnd11 = FindWindow(vbNullString, drawname11)
" |' O* {- q! Y# O( u' I        If winHwnd11 <> 0 Then, |; C/ M" c5 q
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&): C8 @- }0 n$ d: S1 A8 U4 Q% i
           RetVal11 = 0- K9 g  u1 W0 N3 P# ~
        End If$ w6 g5 J  @: u) ~
    Loop, v7 V1 |+ _/ m0 N
RetVal12 = 17 @. T: t1 \$ W" z/ K
    Do While RetVal12 <> 0
$ G  V5 d3 F0 H2 j# A' X( k      winHwnd12 = FindWindow(vbNullString, drawname12)/ b3 T; K4 \. ]" F6 B0 r: A
        If winHwnd12 <> 0 Then
! S. P+ M: `( L, U( u           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)$ u1 m! p0 }9 k( y$ m" f( ?) j2 r
           RetVal12 = 05 m. j$ B2 F. i" H; j
        End If
2 C7 J5 Y: y! g/ t: ?, L- e1 ?0 S    Loop
! z; @+ E  y, S; v0 o- w  E& \0 W% n/ H& T+ v
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
0 |: j7 W' Z7 p+ T    Set M2 = New MODI.Document
  ]5 ^1 H7 G$ e    Set M5 = New MODI.Document
% H8 g2 B( ?7 q0 w# |   
" {. \& o/ g5 t4 y* N# S! K* i7 }    M1.Create pathmdi11
! L7 S6 [/ ?+ ?4 `    M2.Create pathmdi125 c1 j& L, V6 w
    M5.Create
; R% Z& {8 E" [0 P    M5.Images.Add M2.Images(0), Nothing
" r9 g4 U; j3 H  `5 i    M5.Images.Add M1.Images(0), Nothing% c6 c3 e" }7 H9 X2 H
    M5.SaveAs pathmdi2 E# {/ g6 ?7 F. [3 F8 |
    M1.Close
' `0 S# Y- L9 f# \7 U) V. w    M2.Close
1 L2 S; n8 L$ B    M5.Close
1 K, V4 ]+ I5 B4 P. q. e9 _    Kill pathmdi11                                      '删除PlotToFile输出的两个文档7 [) R/ `( L# f! U4 u
    Kill pathmdi12
" L8 K4 N) \4 s" S6 R+ T( ]: b' `# J) r. Z& y9 m6 h
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
4 h; G0 X4 q+ n" ~/ H+ V7 y( f+ a/ W

$ a& ]* W5 v. u" j- f2 O- T程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
& b" P3 ?; P: ?' z8 j1 _9 v8 t% i: j6 |1 k9 G/ I4 f
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
0 b& Q5 Y0 m& i) s9 J" K4 Q1、程序死掉,需要关闭ACAD;2 Z* F" z2 \1 Q0 r8 w
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
; _; ^8 c; j7 r9 G; q; h3 p' m3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
9 [5 k, E, g& b2 B/ N: L" a3 Z: s
9 w* n& g& B# F* C( @现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
" V% N8 Z: g5 U+ U
3 p  M* T" r, `; O  ~( @6 h# C如何在CAD中应用呢?
7 }5 m1 k% q& A9 o) h! H3 ^) z1 G* y; l) ~6 w  m
OPENINMODI:0    输出文档不打开" w( I7 d& M& ]+ F7 m$ l0 a
               1   输出文档在MODI中打开$ Q# @$ X( E/ d, v, F

6 u) j! l5 a4 A4 U8 c' _
- S. c+ N1 V6 Z' A研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
% V: r. ]' U( L! o0 G( Z, V我用下面的代码做了一下检测
' f: f0 z! D7 _8 n' n5 d
  1. ! E- x6 y' [7 |  P( n
  2. Sub A()4 M2 p" d7 L4 y, m
  3.     Dim H As Long, I As Long
      g, k" R  l* ?" Y% R9 L6 T
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" ' ?  E: B7 v& O3 ~
  5.     PostMessage H, &H10, 0, 0+ C2 m+ }- w( I/ f9 t
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0$ N/ D5 I0 l8 S: @$ U1 b! w8 ]
  7.         I = I + 1
    * S- }8 ]3 M% R. ^. j8 m. e
  8.         DoEvents
    % `& b! [: j7 x5 K8 G
  9.     Loop
    0 T0 }2 P$ k' X
  10. End Sub0 j! g* M; I/ [! o) f0 R
复制代码

+ F; c1 @1 j3 H' `在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。2 ~0 D1 j2 @, U/ H8 U0 O
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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# W8 R! j* @* D: h) N0 X! K% L+ h
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。1 ^% _8 W/ ]- V
我用下面的代码做了一下检测/ Y7 ]4 n0 q8 b$ D- D) f

. Q4 K0 m" d7 Q8 q1 }& gSub A()
# o$ q  e1 M% R8 c* T0 ?1 z+ [7 u6 x    Dim H A ...

' w: g$ q3 z+ K: s& ?; |$ v
' m2 ^. [& `+ r9 X9 F9 p- y' x. Q- K  T3 A* q( R! U
谢谢斑竹
8 R6 w" I8 g2 ]! p, F5 G9 o窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行8 @: _3 H/ {6 b+ N( a( H
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
- j# W3 n8 e6 e5 F1 \( }既然是虚拟打印,为啥不可以输出以后在合并呢?
0 m* ~/ W% Y% B4 R2 X6 R" K

* s- B4 o; y8 f9 m$ u5 _- x& X4 o7 A9 T我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
6 C% H$ m% f' k( K3 B6 T0 E, H, F6 p5 X; A7 L
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
5 p' R8 s7 m/ b3 }5 r+ O    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
8 d# P+ ]1 `9 h2 q    .........
( l; E- M1 _5 D7 @$ v' s    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
8 A$ T. n: j4 e" e# {8 K    .........5 V& B+ a+ L+ l' N
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)1 e; X6 K+ w+ l* K. `
        ........* n+ t! l- k% W* s8 m# G4 A- 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' m) I+ I4 |0 A  O: q& V
测试发现:
6 O- E% b4 V5 _$ }8 I" B, t2 ?    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
+ Q& y/ b* d* ]  K    .........
/ G: g& h& Q( r, `: x8 ]    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
9 O) z' n8 J  `2 U$ U$ A
" K) F, w* D# f
2 m. N) D+ c# h3 {3 w( i0 {
不需于空打印,只需要空设置就可以了. n2 t" a2 T8 D! L
4 Z- c/ N# b  h2 [

0 g0 C' `3 P; f! Y. y% J7 f问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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