QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了; T2 P# o" ~2 |! K' u! ~

0 I1 X. P% l" N% G: N6 ^在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。- h7 f7 T+ O& \8 @# d+ H5 n

& S$ F( }  a* m7 N" |- ^但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。* W( t4 o2 s  `" Y

8 G/ j, w; b- B, H) a% l* r这就是说plttofile方法是还没有运行完。# Z5 r+ {; |1 G) u  O

* ]% l5 Q. r1 V8 z问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?. W' K1 x. }- x! \$ O# A1 a/ S
( Y+ v9 ]/ [; V1 h- I8 J
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:0 `# J3 `0 H- U8 l) ^( @2 `: T/ @
Private Sub Command1_Click()
; c- a2 Z+ y- r* D) o/ X     'plottofile方法% e7 g. Y9 M  [
     Unload Form1. ~0 d- A2 ?, R6 ^$ p
End Sub
1 D2 C: ^! T. y: K. h/ NPrivate Sub Form_Unload(Cancel As Integer)
& p$ V# l) g7 l6 I, ]     '此处写入需要运行的方法' ?7 V$ j$ M( _
End Sub; E% c1 p2 N% _! W  y2 a/ Z8 h

2 B# W! X- k, K; L从运行过程看应该可以,明天去单位试一下
发表于 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 o; J- n$ j1 t* w  `检查指定的文档是否存在或许会更好一点?
) t! j+ S9 M0 y6 h/ n: z

8 _! s5 @: ~: ~' z: ^  I# X/ v* E& C) s2 T' ~5 }' {
% d& h. I) Z8 g; n7 I4 X0 C
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开8 Y2 l0 I8 J2 g+ n* |

6 G2 k4 m3 M5 X* [5 R7 j( q程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
; \2 o: R+ z: {& m% ?+ x# N4 h6 b
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
/ x+ h+ v6 ], @    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)- }% L, p+ _* j2 L! r) F4 H
+ A* R& D! R/ c/ w
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档- q; \$ G4 n! `7 q
    Do While RetVal11 <> 01 G$ O* Y2 Q8 ~6 d- ^
      winHwnd11 = FindWindow(vbNullString, drawname11)
1 _) ]7 M4 N6 d) K% g        If winHwnd11 <> 0 Then
* |, C  u4 }' k2 M, h" ~: s           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
) ^$ ]# |& a1 ^# Z$ B& y  P; Z           RetVal11 = 0! Z5 c# P  X0 J3 E: D. m! ?8 T
        End If
2 G9 D" T  g/ q, J/ ^! k    Loop
0 C4 s% n" \3 bRetVal12 = 1) v8 J( V  z, u9 {: g8 _, ]
    Do While RetVal12 <> 0
- n2 s% ]0 Z# I+ o3 _      winHwnd12 = FindWindow(vbNullString, drawname12)
& M2 ^1 z/ G0 f# {2 Q        If winHwnd12 <> 0 Then- ]+ |# o" K; p% [1 ?
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)8 h( D" X1 k6 c% t' U
           RetVal12 = 0
! {6 Z2 E# [+ l+ {- o8 u; J1 ]        End If
. r  G9 ^" y3 e( q/ h    Loop  v- }/ A5 n, w4 C; J6 I
- s- e, G" A% M. m
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
2 z0 Z$ q% G/ I3 Z0 o    Set M2 = New MODI.Document, S* D  [& G# l( U; {* T  E
    Set M5 = New MODI.Document2 x( r; e0 M% v% ~& s' V: Q% H
   
7 \7 X. G0 [1 a* N! z, ^: @5 q9 S& L; b    M1.Create pathmdi11
0 g, l4 _, m1 L    M2.Create pathmdi124 [3 I) J' C% F) w$ e
    M5.Create% }- \  |7 d. O1 `' P- R
    M5.Images.Add M2.Images(0), Nothing
, I' ~1 K  _+ N: q& e8 U  E" ^* s    M5.Images.Add M1.Images(0), Nothing3 P- \" X' S6 ~3 D+ ~5 b
    M5.SaveAs pathmdi6 u- v# J* n" f1 P& T
    M1.Close
4 V' ?' S6 O' F7 V4 ]    M2.Close! R: L+ U' M7 Q6 i. E( y7 l6 j
    M5.Close- ~" l0 d" J! T' x; d# w; y
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
6 E, Q3 p! H( H9 _9 H; l/ G; _    Kill pathmdi12; y/ \/ C7 V' a, Z  k, _$ n  Y2 L

8 ^; R' m! W2 Y& j! n: f    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
! p: k+ `5 |- c$ M1 J1 V7 u1 U3 X9 g2 X/ n& G& y+ w
& g' F$ M4 x+ `6 G( i8 P# M. k2 e
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档3 z& N! ?" L- H7 H2 V& g5 z

3 s; D- C, P6 u( ]& N但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:3 r7 |3 e' s: L5 Y* |( ^( X$ p
1、程序死掉,需要关闭ACAD;
5 Y8 D1 E5 e0 b% Y2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;: s8 w; i) x% x/ [/ g. O8 r( H, Q3 X
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。8 K( B) w+ P9 D' L% i. Z

% s  N0 `, Q0 G- e& ^  y4 [现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的0 h/ D7 \7 }; y
) m. K5 X4 f) y  _
如何在CAD中应用呢?# O" |) A8 j' }# H

, ]& k  X3 T; z/ j; I3 }OPENINMODI:0    输出文档不打开
( X1 y- O6 D0 I# Y2 G               1   输出文档在MODI中打开
+ J0 S- A" M' g8 E" ?! `$ [/ Y' K8 T. j" h/ p2 c$ \
7 ?5 }  {9 `0 f& ?0 w; }
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。4 s& g# o& {1 I8 m+ V1 u" |7 R
我用下面的代码做了一下检测
; n- ~9 |! w# J( h
  1. ! }! [+ b+ v; f$ c
  2. Sub A()
    " l( a8 k8 [, C( B, g5 \' F
  3.     Dim H As Long, I As Long
    1 C3 i- R( t  J% ~: x
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" " M& ^# a/ @8 `3 W
  5.     PostMessage H, &H10, 0, 0
    - |& n- T- t8 c; W( ?$ t
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    0 q1 [$ e+ a) x7 c" P2 \
  7.         I = I + 1
    ( Y1 U1 j. b6 z
  8.         DoEvents6 \! A$ E# Q9 G# e" t# z4 n
  9.     Loop
    " i/ `6 I& a7 G" f, J
  10. End Sub) O0 w6 I8 J. o
复制代码

$ m2 c& f+ f0 r. P2 _在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
" |- F  C3 \8 w建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
. _' B& E% j% E# V$ }我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。5 D9 ^) E8 E  ^# _
我用下面的代码做了一下检测" C4 T6 Q( w1 i( T
$ R! {9 Z2 c2 V$ A$ X6 X: s6 C
Sub A()
/ M4 a$ ^( O* M6 @& _    Dim H A ...
* |& T8 L5 ^. E  G: T# {3 ~+ B
$ U% G; |* W- Y/ M/ P1 }1 ^( w
# X: q, G4 A3 {! p# U" r0 A! @
谢谢斑竹
$ A) o  m; y: K- P& Z1 r0 T: N: K窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行5 E) O, R" X) y( j" U9 ]. X+ Q$ g
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif  w+ @# S: Q+ f0 p
既然是虚拟打印,为啥不可以输出以后在合并呢?
- @0 O1 h% I/ o3 K8 ^# V- _

& q2 \( c1 F  u# l; [& v7 r我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
5 k' Y& }1 X) c+ l2 O
# `% }# v. u  q+ [& q输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:4 e# b& p& s2 X# Z) R. p
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
' s) E3 m2 L2 |+ y9 Z    .........5 b& @$ [0 A# i6 t! D, d5 B0 O7 e
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式" X/ S* [" m0 G$ \- r
    .........
5 z  A2 I5 x0 Z    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
% h2 L; K) p; P9 [$ E8 L        ........9 E' ?4 }& T$ `$ 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
$ \! i7 C, l0 S/ \测试发现:) t7 c& E% m4 }$ f  U+ T6 T
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
. Z5 e7 a0 v8 N1 ~    .........
1 O$ \1 s9 Y: A$ s7 c    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

$ G( p9 V; X2 x, G7 ^
, Q2 r/ R( O9 o9 i" n: B. ]) Z3 C( D1 v  M9 Y) K$ f  M: m: Y0 k
不需于空打印,只需要空设置就可以了
9 i7 m: N& X+ l( g. ]% r4 i1 Y9 S0 e. @2 l( s% k2 `# Z: N1 F

$ e4 x& @9 f: T  t: n+ i; x* R; s问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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