QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 4827|回复: 10
收起左侧

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
0 c# D! [4 R2 _! U: d# F' s9 o; ~( ^% ]( O% z
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
( V8 e* N$ t: f9 h5 Q# {! B4 [; n
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。, B5 H* d& o' i$ W% W& W7 K

( V# I; |. u; K$ A5 C这就是说plttofile方法是还没有运行完。
, N( ?3 I  O. m- V) J
, \5 c1 ?9 i3 K; q* r. Q* _问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?3 l% d) R  |- w" b6 ?( A5 e; \, }+ H
5 i$ S! n6 _: ?) f
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:: l7 H0 b) ?6 }1 c9 D9 i% `
Private Sub Command1_Click()3 B" y( Y, D0 J$ h
     'plottofile方法8 F# w( J  [  N# Y
     Unload Form1$ r+ @& |: b8 H& Y# v
End Sub
6 e' w& I( O; G: W, ]Private Sub Form_Unload(Cancel As Integer)/ z- W. c2 T4 W1 T4 R# t
     '此处写入需要运行的方法0 J6 C" U9 I7 M6 B
End Sub
" ]9 H. b2 |1 t* z  K/ {0 [# b/ F8 \" _: f2 M, \; U  U
从运行过程看应该可以,明天去单位试一下
发表于 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.gif8 l* v' D, R, J+ V4 N3 b6 \
检查指定的文档是否存在或许会更好一点?
5 Z; M( i+ Q" s
1 T; L; u3 k( T' }

4 n: i- [/ t) v/ ^0 t! o! e5 n$ C6 M% F; y. m: X1 F' f
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开# `. `9 {& \+ e5 n

$ \% a4 \* `/ z& W+ ?& B程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)1 ?% k$ Z) }! l2 m, D: ^
& m$ r" ~6 v* F6 e5 t" I/ K
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式' F5 k7 R7 S* p7 {% n9 E
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)% C# p- F& y5 `" }
% A  m; h  R/ q1 ~) j% o+ M; K  k
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档: n" k  P5 s  |4 l4 x
    Do While RetVal11 <> 0
/ a4 q8 z( @' u; }      winHwnd11 = FindWindow(vbNullString, drawname11)+ I% m. ~& h6 ~. `5 A
        If winHwnd11 <> 0 Then
! P8 Y; l( f8 D* Y) e9 M           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&), \0 ~$ H% R# _; f% S
           RetVal11 = 07 f5 a# {5 I  w7 R
        End If
6 E8 @7 T3 F) |3 o    Loop( ]# q9 z( R4 g4 ?/ Q! \3 z5 ~
RetVal12 = 13 p8 B' H) q3 V- n  V6 i
    Do While RetVal12 <> 04 J% W0 r8 H- i* k
      winHwnd12 = FindWindow(vbNullString, drawname12)$ b% [# T9 q: Q2 l) q# g
        If winHwnd12 <> 0 Then4 @* ]* F6 w1 w$ s  [
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
: g8 x+ {1 ?8 e$ B( g9 r6 x           RetVal12 = 0
: L) f' h7 [* s, B" v2 ^/ T- _0 S        End If
" B# l1 [& u9 L5 q) K( l' `# W    Loop
1 }  H* k9 }$ K; n1 q' A4 [$ r6 B0 }! k! x! q: D) H: K& u
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档  `- T9 n) Y; Y
    Set M2 = New MODI.Document) D5 D) y; X5 C3 v6 d5 F
    Set M5 = New MODI.Document1 M$ a1 r# W/ l% @. A; I0 x3 [
   
+ i& A3 ?' o8 e3 B9 A/ n    M1.Create pathmdi11! u" K* \/ C" t3 y5 {4 b4 L7 j
    M2.Create pathmdi127 \, n1 }5 \, j( @1 j5 k* K7 y
    M5.Create
, j1 ~4 {9 D! Q" y. N: X    M5.Images.Add M2.Images(0), Nothing
" k! D5 ~: m2 a6 {- H" _7 Y& E9 [    M5.Images.Add M1.Images(0), Nothing& D0 H; X3 m$ C
    M5.SaveAs pathmdi" X% R6 I$ T, L  K1 `) i  Z+ U& w
    M1.Close) {1 z0 j+ n+ b" |4 e
    M2.Close
- |; N/ w7 [" m$ L    M5.Close
5 Z, v" M/ O, q4 X/ ?+ d# l    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
# L( g$ O+ S: Y- l% a2 o; C    Kill pathmdi12
) ]+ P) r4 v* J# W
) e8 f/ ~0 u6 k  z    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
( \8 k2 T6 b/ G& S* @
: z& P% L$ Z0 }! n
; S) z. |& P  L( P' {! t程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档  {& I& y# h1 a4 x/ i, a& D0 D. V$ N

. N& n) G3 m% {7 R; I9 u" s但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
- n8 s' F; ~, B0 M( S1、程序死掉,需要关闭ACAD;+ g; }& ^. p. O; K+ p$ J& K
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
  b- q5 ]$ l; z- w1 n' G; L3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
2 j/ m* }6 t. _; i9 W: O1 w- P, V7 N5 _, m
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
0 x8 T5 {( M1 W) u6 x8 h
, P: N+ f7 o) I4 U- ?如何在CAD中应用呢?
8 q9 {' I, o. h1 F/ o7 f: f! q! V/ P5 }
OPENINMODI:0    输出文档不打开0 V  D3 m: X9 b% X
               1   输出文档在MODI中打开
' ~3 N; o+ U- F$ p. M# N9 @
0 i! W4 o; \6 H; D
* w$ ?7 Z$ T: ?/ y1 e研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
! n6 f4 C, K. Q# R2 x3 v我用下面的代码做了一下检测* ]7 Y3 @! q* S2 c( y# {
  1. . N6 w2 f/ g7 `! B% e- \8 g  j3 ?- w
  2. Sub A(), b" v/ u% D9 j  l/ k( O1 E
  3.     Dim H As Long, I As Long
    5 O0 d, F4 I1 |3 H" z6 @
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    0 {  x# C6 W( T, \& J
  5.     PostMessage H, &H10, 0, 0$ B2 f* D% q8 T- ?- G
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    . ]/ `# I- }. p! `
  7.         I = I + 1( B/ M( C, Y% `2 V
  8.         DoEvents
    ) s, Y/ a6 I0 e8 C
  9.     Loop0 ~+ F" ~$ m7 L. s7 j5 V
  10. End Sub
    6 ~$ m( |" C) Y3 A0 q
复制代码
% A; h4 ~" C# _$ o
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
% N& A) t& j1 J3 ]建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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, O: I8 `2 M7 o% Z8 S
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。! N0 a% F  c( e: [6 z
我用下面的代码做了一下检测
! T" L+ u) ~6 W7 O  n) {
$ g8 f( {1 \& c8 }  @Sub A()0 f( L6 o; k5 M* G+ k* p
    Dim H A ...
1 F3 h- w% m, c, S

) R* S) X" i% I: w' j; y" d& F, A+ i& v
谢谢斑竹
5 Y& q/ O% I' r( t( X窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
' l( Y! w  C5 a2 M+ P; Fsendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif. v1 t6 A% D. ~$ K4 U9 y
既然是虚拟打印,为啥不可以输出以后在合并呢?

2 j% }, Q7 A8 Q+ r5 G) e5 |- s+ `. p; ?
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸) ]% @" x5 s' ?" b6 [1 j
: ]6 s# `: n. _) `
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
( z& T. ?3 S! S$ L6 [3 d- c    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:) {: b5 j; u7 z9 C  d, h: s
    .........  m, `" \5 U. U; l+ r2 z
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式: @3 h  k5 C8 X, j3 P
    .........
4 S3 a6 E1 `  p( I: ^( \( |/ Z    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
6 X+ L0 N9 N( B4 W3 ?4 }" S, @        ......... z6 b' @# n, H  t7 _4 k
       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
7 ^; l" n9 E+ E测试发现:
5 I& y: [5 t; F) P# U$ D    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:- \8 N# }3 O% L. F& N6 S
    .........$ _- r; T7 N: `2 Q0 l5 @
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
+ ~7 i- e" y7 ~$ z/ [

3 ^8 \3 ~8 J  Y; J1 G. s; S0 g
! t* I* d% t7 ~: |* D- q不需于空打印,只需要空设置就可以了
: s% |5 B6 e6 {% P# [1 D, s; u* Z+ ?/ s2 e1 P4 X% i0 N. Q% @

$ U( W( z5 N& o- ~  k问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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