QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
2 ]" p& H) ^* W+ Z; W  O  x
: k* `' \' e. t" U8 f在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
- H( I1 _# L* K& K: a" \6 H$ q- T
" c, V, S% A, L- c但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
% K# S: p" k6 x2 q. ~2 {  g+ a* a/ h, c
这就是说plttofile方法是还没有运行完。
' G' H7 \0 o+ s3 H: V
0 I$ j# p) v, y! S7 f2 c! z! @7 Z问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?7 b5 m1 |$ v8 P# ?) C
& x% Q) [/ b* T" W+ m
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
5 @7 h1 q5 u/ W9 a% D, {Private Sub Command1_Click()
. U' I- z# T) ]% m+ L1 f     'plottofile方法- o5 Y: h, S+ t1 v
     Unload Form15 c4 ]3 ~* d& M4 U, ~
End Sub  d$ F* _9 p- }
Private Sub Form_Unload(Cancel As Integer)# `0 c- B) C1 ^7 p/ n
     '此处写入需要运行的方法
5 W# P9 H3 ]4 R/ M2 _4 c! ~End Sub8 K: q% ^6 ~2 v' i9 \$ L2 o
7 l% p! P% _& D, d
从运行过程看应该可以,明天去单位试一下
发表于 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* u1 ~( O3 M$ x5 |9 X8 ]
检查指定的文档是否存在或许会更好一点?

! b7 q( e; l4 I9 B& z  k3 J+ x) ?, @- g: R. x9 \9 p
! w4 E  y, H# J

( q6 K- M& S( W: e1 J! h文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
% n3 z+ ?0 w- R8 f/ l# K+ {& x- B7 [! W% n
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
3 l+ V- P1 d. {" [6 X' a* c! ?% M8 o- E3 m) |
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
- h/ j- ~' u# f. A% t    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)3 ]4 c) t6 A8 q- M' `
+ e1 _$ i& W1 C. t% ?
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档  K% S( l0 N3 L$ n4 r0 V
    Do While RetVal11 <> 09 k4 ]0 K, ^1 {/ |. N2 @
      winHwnd11 = FindWindow(vbNullString, drawname11)
) e. W" x6 ?7 M& }" Y6 A        If winHwnd11 <> 0 Then
* O4 l9 ?, u9 o# H- Z% w9 G           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
1 B5 H8 r* `  C  V8 w           RetVal11 = 0
/ z! J2 W! }# B# A) A5 d. {5 V        End If
) L# [. F$ ~' o9 R    Loop5 |3 A5 F" G5 m
RetVal12 = 1: F9 o: j, Z1 u. s( X( o
    Do While RetVal12 <> 02 e$ \; f- c5 ]' f
      winHwnd12 = FindWindow(vbNullString, drawname12)$ u" E+ k# H' \  L$ k
        If winHwnd12 <> 0 Then
; Y+ r% b1 [+ b; o! N! A           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)* P3 h" r* R1 R- ^
           RetVal12 = 05 u3 Y; m, x* e& i' U7 C, P
        End If5 c% I: A! D3 [* Z$ y, E
    Loop: Y) r# ^- d: C7 Q

, Y* `7 U( c$ s   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
3 _4 M  ^4 |# ?. p6 r    Set M2 = New MODI.Document; L  `* t3 j$ p0 a* C0 O8 Z1 ]
    Set M5 = New MODI.Document. X* c0 ?% N( M- X3 r6 y
   
6 d+ m& [1 l3 P4 [( ~9 d    M1.Create pathmdi11
0 T- I9 ]1 L- Z    M2.Create pathmdi12# K+ F9 D  R- c: _8 V  }3 [; M
    M5.Create: x: k% T' E1 G% j7 Z- ?' ?) e# d
    M5.Images.Add M2.Images(0), Nothing  z; F) @! D0 K4 e
    M5.Images.Add M1.Images(0), Nothing
1 E& J0 x' V% h2 X& q4 D    M5.SaveAs pathmdi$ l2 t6 }/ F5 l$ `! K6 K
    M1.Close
( i2 q6 R. B0 ~+ ]9 g' \    M2.Close' w1 z8 i) g. s! t& t4 C
    M5.Close
( k, Z" r, K* [+ _- |) c3 L    Kill pathmdi11                                      '删除PlotToFile输出的两个文档3 g8 @+ m8 Z9 D- p$ h
    Kill pathmdi12
$ E  s. Y9 Y5 t
9 U) z* q. r( K" H    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档; n$ B& S2 b! Z6 M7 h" h
$ l( B& K+ i7 t4 r# G' Q$ F: }
6 r% Y- |1 |* Q+ r2 Q7 @" v
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
+ J$ p  Q$ I& e- {7 f8 s
, f2 V% @2 s8 Z! r8 W# W  J; |但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
# d: D/ D, k2 b6 J4 k' j1、程序死掉,需要关闭ACAD;
4 z6 F3 k; Z+ C; N2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
) |6 q/ U# h) m% X: ~3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
& O0 A$ _1 l. E1 M
' H! u# d6 S5 J, s2 ]1 J现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的+ p  u  b+ R7 d5 L/ q$ |
. g# C8 z+ Z  O/ }
如何在CAD中应用呢?" ]9 |- l8 r( L8 S

3 K2 c# ~' y: E1 C3 oOPENINMODI:0    输出文档不打开+ x7 h5 m6 |' F
               1   输出文档在MODI中打开
* M1 f$ Y5 t4 ^' V+ P, G; H1 ~; i2 g: B
5 S$ @6 q9 J( p; c  z, N  i( X3 p4 [& {8 q6 I# ^
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
5 U/ C: w0 g/ D2 l/ n# x9 H我用下面的代码做了一下检测
$ \5 ^; A( V- g# c
  1. ' ^8 L) q* }4 [. i1 l: i
  2. Sub A()
    5 J+ w+ x: v" H  ^. m
  3.     Dim H As Long, I As Long6 Z( t4 I% a+ w' ]
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    8 U0 E# r9 S( t/ N: b" P
  5.     PostMessage H, &H10, 0, 0
    & c. n# v( w) [3 e- e  N
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0! o. O3 I5 K9 J! O$ ]( g
  7.         I = I + 1- s0 i- t1 p$ V4 s0 F* T! E
  8.         DoEvents) [$ a5 }- ~, U. U
  9.     Loop
    / x& i% h1 s( |; I% m0 \0 x! |
  10. End Sub" W" s0 s( m4 i' ^) a
复制代码
4 b  Q9 j. M* V1 G2 t+ k
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
3 h' x, d9 ?  C; F8 A3 x; H0 |建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
5 `) Z5 Y. e) o/ L* o/ a我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。; z( [7 @# i% r; x2 h! p, c* }- i. t
我用下面的代码做了一下检测) r5 v1 O: d# d+ }

5 H* A& z# ~" P! v8 bSub A()
3 w% {: o3 }9 b    Dim H A ...
, ]/ g2 X& V3 ~9 H+ [% Q" `
0 p" S( Y6 h% ~' O' E1 l, ~0 x6 j
7 v" g9 K+ }( b" ~! O
谢谢斑竹& T9 q# ^; @3 G6 b5 O6 T: f! T
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行/ R% B3 v+ U8 K8 P: ~, ^' J% i5 H
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
: B8 Q4 d9 n2 P: z! _# h既然是虚拟打印,为啥不可以输出以后在合并呢?

8 T$ S7 A$ L8 K1 A8 j9 N( Q& j. _2 n8 V- D: r. n7 h' ~! A; @$ o
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
& Q, R4 Z$ L& H1 e9 k6 V- ^- \# n1 {4 y: |
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
1 H- K' f3 W: g7 j! D- l" B    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
8 h) l% X  |) t    .........
/ P/ q4 j7 c" U$ j    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
; M. Y! c1 h8 u& n% ^    .........
1 `/ L5 x# q& D' g" e    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
% Z, H+ s3 t0 J% \/ k        ........
6 B, I" Y# u& B; }9 O+ l       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- S2 G3 N2 m" e: x
测试发现:% a5 o# m1 V4 x2 t& L
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
2 D) g7 D4 S/ P5 n, f" [6 E    .........0 }" y' B8 L0 |' I7 X* y- M$ S9 p
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

9 a4 g- w1 {/ q: K% o9 p8 z% V( Y' ^! p( |5 m- [& i
& O1 p5 R/ U( I& J! N
不需于空打印,只需要空设置就可以了+ C% a; x4 A1 F

0 z. ~# n% d' \6 D" D& `2 y( }6 f
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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