QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了) q8 q% Y, O0 ^& t

; u& [8 b( M% W8 K4 y& D在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。! y& A; P2 a$ W, U9 M, l7 t+ f+ d

' c3 f% h3 [- |! e; L' Z- `& ]$ B但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
: {0 }6 h# g- H# M, B7 c/ m3 u3 ?
7 A) G. e& q3 E5 Z8 h' W这就是说plttofile方法是还没有运行完。
2 @! h& H" p. x' A* ~4 |6 p
! E  L6 y6 ^2 r2 ?0 ]问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
3 E2 h4 P3 @" `0 {
3 v$ p- m) h5 m[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:8 \& q& U# S% i% `+ Y* ^' g
Private Sub Command1_Click()
6 r5 A9 ~' s4 r" R$ F% p     'plottofile方法3 X! X$ M4 g6 J8 h0 m
     Unload Form1
2 v! P; V+ u2 K+ {" w: xEnd Sub
0 d: g6 ~( }8 e: u2 UPrivate Sub Form_Unload(Cancel As Integer)
) q& |) D0 ~3 ~5 J$ s( r' B     '此处写入需要运行的方法
0 b, X( U2 k/ h6 M  G, }* iEnd Sub
! g$ ^* o. \4 M" K8 F! X% h9 F# e9 V& c) 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! J1 V! f" ^$ E0 p  n1 R4 h  D
检查指定的文档是否存在或许会更好一点?
2 ~. b& z* V7 c$ O! b/ G
* _* ?( u3 Y/ W2 n$ ^$ X+ w0 v% P' K

) l  S% A# @& A8 z$ B2 w, V6 W! ?
+ M0 m7 O  M8 r8 l" [& K文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
3 E: M. j* N: j+ ?2 @2 P* K* o+ ]) m3 j6 E$ h
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
# d. _! o: z, b* Y! t7 n& ?; q: o3 B- l4 D; H- Z
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
( r7 \, |  p0 a* ~+ F    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
1 s; E, M5 R) V- }6 a" Q3 A$ R  `8 d9 Z( N  b- s, Y! t7 c) |. x: z
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档" |( S/ @% z9 I" `: ]) l
    Do While RetVal11 <> 0$ Z* c4 V$ _! X: p
      winHwnd11 = FindWindow(vbNullString, drawname11)1 g% @$ _* N+ _
        If winHwnd11 <> 0 Then. H1 }: m: i( |6 W  J
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)! r( N7 z! N$ n) y
           RetVal11 = 0
: B' C* A8 [3 k. i        End If
) R2 g5 p* u5 C: q    Loop
/ a/ }% Q- W6 `. q  v3 BRetVal12 = 1
1 h0 D' i' j" u1 ^    Do While RetVal12 <> 0( v9 q3 S( L( S) R7 v: D
      winHwnd12 = FindWindow(vbNullString, drawname12)! d% L" a0 q; r: ]4 |5 e
        If winHwnd12 <> 0 Then/ \5 i7 i0 a; K' _7 e. M
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)& Y7 O* k0 k; H+ E
           RetVal12 = 0
2 }  l6 r4 s1 h7 N& ~        End If" c2 E% F/ j1 \5 T( ^
    Loop( x. p8 N/ Q' L, R; ^6 @

: k* A# b! b3 l1 W8 P   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档% y) C# ~. }! k- e% C
    Set M2 = New MODI.Document# L8 w0 ~5 g" L( @$ M. {: T
    Set M5 = New MODI.Document
8 M1 M+ ?: p- k4 N    9 `* T5 P2 {* @$ Z8 Q
    M1.Create pathmdi11
/ a5 c5 c8 |, v- d" q    M2.Create pathmdi12  B8 C3 ~( u! b8 e3 R
    M5.Create
1 @% q1 N4 X3 @  @1 N8 M    M5.Images.Add M2.Images(0), Nothing
) K$ l6 i$ G2 k% l. ]    M5.Images.Add M1.Images(0), Nothing
( @; L4 m4 u1 o" i9 N    M5.SaveAs pathmdi# f9 \7 x8 F! ~  A2 o7 ^2 j
    M1.Close* |; P+ m6 G+ X/ g+ u* f8 O- |7 g
    M2.Close
+ ?* A8 E7 Z8 I! V7 X. F& W+ A    M5.Close6 n3 E3 c9 U; i1 [9 B7 b8 A5 z
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档& `% a' V. }  T
    Kill pathmdi12! M* V- y8 e, w8 L3 g- g
1 q1 Z. Y( k3 H$ z7 u8 O
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档! H8 C6 ~9 [# a7 ^( h( R: _

+ R6 n! P6 H& B! v8 }1 y0 l- Y
7 X5 u- W6 Y1 v2 ^/ ^8 C程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
& v0 _9 R3 T2 Y" O- w. T
  v6 V/ b7 d9 K3 o4 M9 \但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:9 `* N% J4 P$ k
1、程序死掉,需要关闭ACAD;/ }  x( u. X, g# J
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
6 c3 B& u# n* n$ F3 K1 q9 Q  l3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
2 W" C. \6 D( j4 h4 j6 {1 N) k
- \$ h4 d5 n+ P: W3 B6 p0 b* ~现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的: s" K; \1 R' z# u5 r

3 @: J$ O3 j  V# j如何在CAD中应用呢?0 N8 v7 Y8 G2 C/ p- s$ w
1 a  W4 `2 B( P; e
OPENINMODI:0    输出文档不打开2 {/ b' k' E2 ~/ ?2 B% m
               1   输出文档在MODI中打开, o% w0 k# Q. |) Q/ `5 A% Z- E" z
& J* X! ~4 E# Y# n- I2 K
, t! U: e. a/ v+ i% G2 C8 V/ q
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。4 l* C  Q" J# x/ D1 P% D
我用下面的代码做了一下检测, ^1 }$ x( i1 J7 Z. U
  1. 5 w5 w2 n5 A  B+ f, Z4 S5 N( v' k
  2. Sub A()
    3 Q6 m9 i" |# R" w6 ?: m1 f& W" B4 U
  3.     Dim H As Long, I As Long3 H+ t' `6 k4 R- d. l8 a
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    ' f+ F: P; X8 g4 Q" E5 r
  5.     PostMessage H, &H10, 0, 0+ F! R  a/ Z# N! }2 S. d7 o! h
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 02 H6 v' ^& C0 V
  7.         I = I + 1$ b6 O" T; t1 m
  8.         DoEvents
    6 O8 C  r1 x2 R* \7 |3 S7 P+ K
  9.     Loop
    / b4 I4 k" ^7 c8 R, @, \
  10. End Sub
    7 g; v: E+ k! f6 J$ T9 N' _
复制代码

) x5 j/ |2 v' F. K6 F+ O$ ^在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。  ]% C7 G" m5 [: q) 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
: n, S  p  H, K我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
  p0 ~& S, E  Y6 b7 ?" V: Z我用下面的代码做了一下检测
9 O! i  M0 t8 q% J: H) g
- f6 e$ M7 E/ z9 B9 ISub A()
6 O# v" Q- ^" y4 d- b    Dim H A ...
6 G7 w  \6 _6 P1 E- ~5 B

0 f6 A1 Q. P: g! ^% I4 x: E/ r
; ]- [) w- L; }& A# q谢谢斑竹" C; Z& h$ u, E7 }& S
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
, j+ g8 J6 E. C) \1 lsendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
2 D$ f- e4 S+ r9 z4 H既然是虚拟打印,为啥不可以输出以后在合并呢?
; @3 a' t5 m' Z! A

3 ~0 L% [3 b: y/ d/ a/ s我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
/ d7 S1 \. q& A; C1 T3 _
/ Z  X4 F. h2 H输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:( x; B4 T! g/ a9 s( ?
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:+ T5 s8 E, T' |
    .........: m! F: F  j: U5 R: j6 Y0 J
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式# Q: x3 t" G$ L
    .........
' l3 ]8 X  A8 S! o    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)# L' \3 m- V5 x' u6 I
        ........
4 @# m8 |2 h6 }+ r9 o1 q       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
. F  i0 q7 v* z9 J测试发现:3 q7 B8 q5 Q9 Y9 K
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:. f) i* P; [, D# K: q0 G9 [  B9 d
    .........; o. r2 l. T' d6 p4 c1 u# M
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
& Z- }9 I+ U/ \/ v% J5 W' _

, I9 {# m4 j8 D  L6 d+ m' W/ g# @
6 D5 ?8 H5 i0 d! U7 {/ J不需于空打印,只需要空设置就可以了$ J+ K! {! G0 h( O% @1 I! @* o
4 w7 l/ ]5 A6 T) G& @# V: ?" T$ f

; D) S! Z& Q7 O0 g! R3 _5 i, `问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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