QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
( U. D; l* k8 X& G+ H- f
9 z$ V  f: T+ J' o2 s( V在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。6 s0 W: m% [+ l  U) G  K

( w1 F, z. z0 i, {2 N3 |. g3 N但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
# t( K% q6 [( d$ [0 t
2 m) b' Y' M) y" {- L" \2 V% I" f0 w这就是说plttofile方法是还没有运行完。' y" s7 L( A; l/ @
* y( V2 u8 H$ B  F
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
# I! E8 Y# S4 |& n6 [& r2 k
% {4 v  u& o! V. Z) _3 p1 {$ U/ P[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
7 Q) x/ \: G7 K. ]0 i3 rPrivate Sub Command1_Click()1 s* k2 Z, [" c' a. {' t
     'plottofile方法! ]# b4 C, u: ?
     Unload Form13 O. O# R& {3 L! K' T
End Sub
7 o% ~9 b' O8 p7 g$ fPrivate Sub Form_Unload(Cancel As Integer)
* E' A/ X1 @  c/ U$ D     '此处写入需要运行的方法
# z1 \3 b6 ?& ?* @* w) i2 y" MEnd Sub' a& p6 r8 K3 C& |( Q
7 t, L6 n# E2 N- q3 j
从运行过程看应该可以,明天去单位试一下
发表于 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
1 h5 a  [  ?; B检查指定的文档是否存在或许会更好一点?
" G5 A# v3 p1 J' C8 T$ x
+ Q' G, R  D: D$ \3 S
/ U6 s2 h1 t& D5 M4 q
% I+ X, t0 p1 N3 ], t
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
# r, X. G) I( _$ z% ~. B7 d( L* K) b( a- X% @7 V' m
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
0 y4 x9 @( G  [& F! a1 J" |( _1 G9 g, n6 M- u& }
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式: n3 r5 X% F+ u9 x& D- B( C
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
0 @  e) {. w' B; X# f$ [+ X- w+ g  |  ~( t
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
/ i$ T$ A; G6 M! y* }% X% @    Do While RetVal11 <> 0
1 x( H- h5 p* \9 a1 ~* E/ E/ B      winHwnd11 = FindWindow(vbNullString, drawname11)' }  [* ]: W! F2 O& c: Z% }
        If winHwnd11 <> 0 Then
; r/ B3 ?$ {, y' v8 M& e: d           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
& u- F' r: O: L. D- i0 d           RetVal11 = 0
+ _( r( G1 R1 I6 g        End If5 p! T) H) Y( @6 m: D
    Loop
; n) u( Y, x* zRetVal12 = 1( [1 u$ i: W& ^, Q$ l
    Do While RetVal12 <> 0
) U, x% Y. H; R0 |. V0 I% q4 y8 r+ n# e7 h      winHwnd12 = FindWindow(vbNullString, drawname12)
( [! e: J! w% W- R+ X  E        If winHwnd12 <> 0 Then
, Q  N3 I/ j5 m# t& X           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)) n  r/ h3 y' A$ w" o
           RetVal12 = 03 Z$ J7 Y' D3 [3 ]7 V
        End If; y( ^) n. A+ S9 [
    Loop
  s5 m8 j( b5 g* O" w6 |
/ h6 R( ^3 x1 k. c   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
0 k* a: N+ a) b: W% a5 F" Z; b3 Y- {    Set M2 = New MODI.Document+ P& ^: o: i/ ]1 z
    Set M5 = New MODI.Document
% J- r+ M5 y; ~* j   
, [& [8 i4 Z0 C/ Z    M1.Create pathmdi11
% s; G6 N2 n+ J    M2.Create pathmdi12
$ [  }( C6 W" G) u3 U2 R3 U6 e    M5.Create9 W" z# S% C3 R- |9 C$ w
    M5.Images.Add M2.Images(0), Nothing
6 a- f2 z: t; R: z. k    M5.Images.Add M1.Images(0), Nothing1 r" j0 o2 A7 p6 q- Z
    M5.SaveAs pathmdi: Y" S$ p4 r4 R0 k/ O# L0 o
    M1.Close
$ d* v8 M6 @/ M  H- I8 i% ]7 _; ^4 p; S    M2.Close1 V; J4 \$ O. a1 i0 s- w1 z
    M5.Close& ?' D  B0 v5 F& A/ u# q8 n  L
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
# o6 N0 C' d1 S* w$ q( x% L1 x    Kill pathmdi12! E9 N! h2 ^% ]0 F7 p2 }& `8 [
" [4 ~& T) b; k2 W  P
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
' k  b/ H/ Q! Y) a$ B
. i, _1 l+ K. R/ v/ i/ K% F- W  t
0 n; P4 t0 c" C) e5 N. n程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
: }# M2 V- e+ E' d. @. o$ u$ C9 T) c2 z, r) c7 O
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
; s0 k: P& t! V8 V, R6 i1、程序死掉,需要关闭ACAD;
- q! B) N! D" |( w4 }9 l" K2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;+ Q, l( k# k6 P, R% M; T
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。* c) s+ k+ U% j2 l0 n- }) Z

, @/ ~8 o) R# t; j- M现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的, F) h3 B$ R, q# z7 X3 m3 U: ?. Y: r
4 T6 V1 T' [) _5 c* _
如何在CAD中应用呢?
4 o( b9 `8 j( _- \; ]
* v( ^) n5 g3 x6 E/ aOPENINMODI:0    输出文档不打开
) g* S+ L2 a7 X& z: Y) i4 U1 t" i               1   输出文档在MODI中打开* v2 _5 o9 ]/ o- x" N! W6 J- E

1 q7 C" `. t, L" E1 Y* r- u: }, I$ Y+ x- J% e& p
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
+ u9 D2 |) S! v- z9 ^6 F! N3 D我用下面的代码做了一下检测
: Z2 m! _- Y% q4 J2 N' V8 W. P# ~' x
  1. + T3 @7 c9 {% {' C# s5 ?% B
  2. Sub A()6 o* l* J) M* k" r" v6 D% Z9 i0 j9 V
  3.     Dim H As Long, I As Long
    9 \) g& v; N0 L- {1 d/ B
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    ; m- J- e- s/ n' B# C8 n$ G$ i
  5.     PostMessage H, &H10, 0, 0$ F3 |$ t8 o8 B" w3 a
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    . a. k. [( O( s6 j1 h% B8 D7 R
  7.         I = I + 1
      [& y: D9 O( v$ E4 d
  8.         DoEvents0 l4 Y+ ~3 N& P) _
  9.     Loop5 `, a! D9 b7 ]7 i
  10. End Sub
    * t1 y2 P) s9 k+ T0 L4 ^
复制代码
; I; I+ a4 a1 @
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。  T# p" M) V) b$ {8 }; J0 ?1 j
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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.gif3 J+ d* v8 G8 {8 P
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
& J- Z- V. v$ l我用下面的代码做了一下检测) l3 @. ^4 B6 X$ X# _# ~. N6 ~6 q
& i" s: A; w; Q- u, r6 r
Sub A()
2 W: v, [4 Z/ v    Dim H A ...

# i5 j" ^' \1 ]7 g. M6 l5 L
- T5 A0 u( W1 E- V8 |+ V% `- X5 W( r6 ]: b# t% t6 D: d
谢谢斑竹
* @9 W: N! z, @窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行& e) ]3 L- f3 L/ ^+ n8 }+ `5 h0 m
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif% O0 h/ t; N: Q5 R6 [, I
既然是虚拟打印,为啥不可以输出以后在合并呢?
) Y+ i% D7 p7 j6 @+ X
- E7 F2 \0 q3 l% M) m3 p0 Y2 {
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
9 ~' P; `- ^" C" }, U
% C: ~" f0 `4 B# C输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
+ F  N" |! X( g& ^) h1 w$ j    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
$ j! P: P" k2 W& e8 R% z    .........5 a9 |, I3 g8 M5 o- `
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
6 T& ~( {' _# i2 o8 K" ^& l) P9 X    .........
2 T+ ?& D, I3 j    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
6 j9 h  l8 X0 n0 t        ........$ B' C' b* G  T7 r# g; 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
% J8 [. i  A4 J# ?; |' G+ N4 F测试发现:
+ H% B/ a6 `9 }: |9 t; g8 ^    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:" B/ k/ {3 s3 d( V2 B
    .........
5 V! u' y- @& P- B- e    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

, ^" X! E8 ~+ T3 `) v* r1 k+ f; X; N; W) _9 F7 `
9 a: k8 r# O+ t2 m7 C/ ~0 e! B" b
不需于空打印,只需要空设置就可以了
+ W" M: z5 O( w1 _* d
& P7 `- Z' t- m9 F5 d$ S: _& P9 g: S  C% R
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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