QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 5628|回复: 1
收起左侧

[求助] 拿到一个大神用Excel编写VBA程序生成CAD的程序,但是里面的语句不太懂

[复制链接]
发表于 2020-1-23 11:29:18 | 显示全部楼层 |阅读模式 来自: 中国江苏镇江
安装
主题分类用于问题归类:

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

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

x
基本上都是这样的,这个应该是画直线的子过程,但是从第3行开始就不太懂写的是设置什么参数,也找不到相关的书籍教程,有没有大神能稍微给我讲解下,谢谢。
+ U+ I6 r7 Z; E) j" {' c# ~1 L* |+ w; ?1 k8 F% _
Sub DxfLine(xs, ys, xe, ye, cl%, Typ$)
9 g, b& y, {3 ]1 q) w8 a    Print #1, "LINE"5 \( p6 A) H) y+ W' e
    Print #1, "  8") j$ }* D$ V% H7 }2 O; t
    Print #1, "0"3 e9 V2 t0 u$ V7 X, {, X0 ]
    If Typ$ <> "" Then
' ?  _! e. X! c4 w; |5 F. o       Print #1, "  6"
$ @- n3 @! }# g       Print #1, Typ$7 N( F& f) ?/ {1 F% U  X; ]$ B
    End If
; T( ~: g+ ]2 k  N( M    Print #1, "62"% v# S; e# _/ b5 d/ G
    Print #1, "  "; cl%3 t( r9 m( `1 s( h8 g3 b9 K+ l
    Print #1, "10"9 B3 I! Z# j. l  V2 m$ e2 [
    Print #1, xs
8 b2 t& O, X" o; J' K/ ~. k    Print #1, "20"
8 m4 \* s6 X& ?5 _. Z    Print #1, ys2 K2 y. G# K. M  o, m/ `; P
    Print #1, "30"
+ o" A' n- f; U* e    Print #1, "0.00"+ N4 ~1 {7 n# @4 w! K' B
    Print #1, "11"; l4 f- ^: G* d* r7 U3 ~" e
    Print #1, xe  t( Y# u) l% g% D/ r
    Print #1, "21"
! r! R# s) ?0 S0 B    Print #1, ye% i- B$ X7 `  A
    Print #1, "31"1 R/ X  Q3 ~( k0 l5 {
    Print #1, "0.00"  A- J6 y1 H9 F
    Print #1, "  0"
# {2 f# z$ E) y8 F% o1 b& F5 fLabel:  s& K3 W3 |, F  d% W
     Exit Sub
! }, `/ {5 M9 v+ t. T
6 e' }. N* y" N' F0 U- p) x" UEnd Sub
- B8 `* `* R' A: c7 f2 A2 X) d( U/ M5 Y
发表于 2020-1-30 14:39:53 | 显示全部楼层 来自: 中国北京
本帖最后由 woaishuijia 于 2020-1-30 19:47 编辑
' y, E9 n0 D* P$ T# n  c# }. w
9 v5 P8 q- k5 Y% O0 d" r下面逐行分析这段代码
; b3 {) D, E. E/ x
  1. Sub DxfLine(xs, ys, xe, ye, cl%, Typ$)
复制代码
声明过程。从这段代码带有参数这点看,这是一段供其它程序(主程序)调用的子程序。结合下面的代码看,这个子程序用于在一个文本文件(DXF)中写入图形中一条直线的DXF组码。共有六个参数,其中前两个分别是直线起点X、Y坐标,第三、四个是直线端点X、Y坐标,第五个是颜色索引,第六个是线形名。7 f% [7 O' I- u9 s
下一行
" [# a+ C* ]: q) t
  1. Print #1, "LINE"
复制代码
这行是Print # 语句,在打开的文本文档中写入数据。# E3 R) h+ m( @
首先,这个文档必须是已经打开的,所以在调用这个子程序的主程序中一定有打开这个文档的代码。其次,既然我们从下面的代码中已经知道它是在写一个图元的DXF组码,而按照DXF文档规则,一段图元组码一定是以0开头的,在0的下一行才是图元类型“LINE"(二者构成一个组码对),所以我猜想在调用这个子程序的主程序的打开文档语句的后面一定有一行写入”0“的代码。应该是这个样子8 k( w3 W1 {( n: W6 |% x7 R# B
  1. Sub A()
    * Q9 N$ e" O5 G6 W
  2. Open "c:\1.dxf" For Output As #1- U6 w/ \/ y0 ]+ _# h1 q- U& B
  3. Print #1, 0
    ( D% n/ D  C2 z# S' N
  4. DxfLine 0, 0, 100, 100, 1, "Continuous"
复制代码
这段”主程序“代码的第一行是声明(名字”A“是随便取的);第二行是打开一个已有的DXF文档用于写入数据;第三行是写入一个”0“;第四行是调用这个子程序(有六个参数,见前面的分析)。
- d2 W% G3 y/ n”主程序“中的第三行和子程序的Print #1, "LINE"结合起来,就在DXF文档中写入了$ \* l% V) y3 r  q# l
  1.   0; N" y8 W- f9 ~3 ]7 e
  2. LINE
复制代码
这是图元类型(直线)的组码对
. E$ G0 |5 m! [) V5 b1 D& M2 q$ h2 Y) G4 ^+ |* V8 R  {
子程序的下两行:  q% K. |; g# V3 e  N1 |- P
  1.     Print #1, "  8"- M3 ~7 P/ P( z* _
  2.     Print #1, "0"
复制代码
这是在DXF文档中写入3 V4 M; d6 R5 r, `
  1.   8
    6 A! p7 d0 R% H" f
  2. 0
复制代码
直线所在图层(”0“层)的组码对
( U4 P0 \+ X, Y$ A9 c/ x% h  @- [8 S9 S/ E3 S6 v- g" ]. r0 g
子程序的下面四行% D% }# G6 Z6 y6 J5 q  R
  1.     If Typ$ <> "" Then
    % w& r9 s0 s) z
  2.        Print #1, "  6"
    # u8 |6 b- l) t0 d
  3.        Print #1, Typ$
    0 a/ b# V( L/ `& ]3 ^$ z9 v
  4.     End If
复制代码
这是条件判断语句,意思是当主程序传递过来的第六个参数不是空字符串时,执行中间两行代码,否则跳过去不执行。中间两行代码执行的结果是(以第六个参数是
) e+ h, ]- B3 S2 k) r: E) E"Continuous"为例,参见主程序代码)( k0 J7 \( \! ?& T
  1.   6
    6 Y  o5 [* d2 b7 [% N
  2. Continuous
复制代码
这是图元线形组码对。这对组码在DXF文档中是可选的,所以条件判断语句中当参数为空字符串时不在文档中写入这对组码,此时图元的线形是默认值 BYLAYER。
5 \' l; u; ?% W9 t! t4 C4 T& ?& m
子程序的下两行
* ]" K- p5 Z! }; [) r7 I
  1.     Print #1, "62"
    ) o; |$ \* ]! J
  2.     Print #1, "  "; cl%
复制代码
根据第五个参数(以1为例,这是索引颜色中的红色)在文档中写入
8 g# x9 R1 }) k. g5 i4 [# K
  1. 62
    0 h* [+ e0 \- ^9 f3 E
  2.     1
复制代码
这是图元颜色组码对,可选的。如果省略这对组码,颜色就是默认值 BYLAYER) x$ ]  R$ P* a  [) O
: c( m% `+ s3 W- t" g7 s6 G5 K0 p
子程序的下面十二行% H) V; _3 J! _! a* |, X" I; |
  1.     Print #1, "10"
    $ j+ G7 X6 H/ Z: n
  2.     Print #1, xs' V: y* S, }& k; v  e& ^9 W
  3.     Print #1, "20"- A# O. }: ], Z4 s
  4.     Print #1, ys
    7 H* ]$ g  r9 u$ J; l# h" e
  5.     Print #1, "30"! @# L# ^0 x7 N& A. ~$ v( r1 ?, C) H# I
  6.     Print #1, "0.00"$ H! U$ U! V' z+ u' C
  7.     Print #1, "11"
    5 c! z# z: r4 ^
  8.     Print #1, xe
    # H  }4 _0 N5 B) P6 A) g3 u
  9.     Print #1, "21"' K1 ]/ }# O4 f1 G9 k6 K  o4 J8 T
  10.     Print #1, ye
    * R& L6 w7 a" {0 t1 K, F, X
  11.     Print #1, "31"/ @$ T8 f7 D: B' l/ k1 J3 x; K
  12.     Print #1, "0.00"
复制代码
根据前四个参数(以起点X坐标、Y坐标均为0,端点X坐标、Y坐标均为100为例)在文档中写入
1 \: D& t. _3 n) l* x
  1. 106 c% K' M- O5 T7 b9 ~
  2. 0! L; c& w0 d9 g2 r
  3. 207 A# ~( A+ @* D2 r: Q: m
  4. 0/ ?8 t) R' S$ X
  5. 30& x- q! V( [1 X  w) f5 _# j# ?
  6. 0.00
    ; @4 R" T* y9 d  {6 ?7 i
  7. 111 q6 t. t: h8 v+ q" A2 {0 A
  8. 100
    , w# A  X6 O+ a: ?- c% a* U
  9. 21
    5 }) b/ I! \: C# Z3 P- t
  10. 100. h4 A3 m# M* ^, [& d
  11. 31
    5 B3 |$ {; }1 ]- }( v
  12. 0.00
复制代码
这是直线起点、端点三维坐标的六个组码对
* `- i( @8 T# ?- t0 r0 J$ @- F4 w6 H
子程序的下一行! o* P, G. g8 N/ Y2 x
  1. Print #1, "  0"
复制代码
这一行是在文档中写入
# Y: k6 F* \' g  [9 E
  1. 0
复制代码
这是为继续写入后面的组码准备的。& ~& B+ s# ^+ f8 @; u4 `3 @
后面的组码可能是下一个图元,例如重复调用这个子程序再画一条直线,或者调用其它子程序画另一种图元(前提是代码结构与这个子程序类似,一上来就写入图元类型),或者图元组码结束,按DXF文档规则,在直线三维坐标组码那十二行的后面应该是4 U/ J, ?6 Q2 b' Z* f
  1. 0) x$ `# w$ E8 ?! f9 Y! j/ C* F& r3 A
  2. ENDSEC
复制代码
相应地,主程序中的代码应该在调用这个直线子程序语句的下一行是0 B. N( p) K! i6 Z) A
  1. Print #1, "ENDSEC", h# I9 B9 X7 J# i; E4 r$ u
复制代码
$ n% A) h- {5 F0 u" i9 X; s
子程序下面两行; V, M9 C+ r7 j) S" T
  1. Label:. D" ~" _5 Z: Y+ |1 D
  2.      Exit Sub
复制代码
完全没有用处。这可能是作者在调试程序时加入的错误陷阱的一部分,发布时没有删除。所幸对代码影响不大
: a. k7 N2 r8 W* Z) {# N6 X) M( z% H5 v) }  V) a
子程序最后一行
+ E# p# y. c$ B7 E+ w- ^3 @
  1. End Sub
复制代码
过程结束。* @0 u0 ~& o1 O) u8 ]* }, F- E3 c2 W5 K

( t# P% Q- x$ H% }( W0 C. {把前面有关主程序的内容完善一下
2 V) R* l  e: F1 y4 u1 J$ ^' k( K
  1. Sub A()6 }! I' f) E: n9 \
  2.     Open "c:\1.dxf" For Output As #1; d; ?9 I+ l" |4 L/ ~
  3.     Print #1, 06 |6 f; \6 j$ v4 M: C; C
  4.     Print #1, "SECTION"
    " G7 y2 A' l/ K) t' n
  5.     Print #1, 2
    5 L  I* a% N# L/ C* }
  6.     Print #1, "ENTITIES"
    ; Q& ?. E5 o$ W- w+ K! Y
  7.     Print #1, 08 V6 }  \% i/ V. X+ L- [# y
  8.     DxfLine 0, 0, 100, 100, 1, "Continuous"- t/ N) t0 x3 y3 ~
  9.     Print #1, "ENDSEC"
    : `; x( l5 M9 B& p$ j: p$ Q+ Y
  10.     Print #1, 0
    & L4 e) _# O9 f; x: R# I+ n: w
  11.     Print #1, "EOF". x, U$ o* @1 m, E2 Z0 c
  12.     Close #1
    . M' q- \3 x' p2 L! X6 D0 `) a9 n
  13. End Sub
    $ s9 \' y! c5 X0 u3 _) p
复制代码
这段代码比前面的“主程序”代码增加了第三到第六行,这是写入图元组码段开始的两个组码对;
* a% W/ [5 o/ L; g) z1 G第九行是写入图元组码段结束组码对的第二行(第一行在子程序里)。
) i+ w$ y. N# o
. C0 x. K; V% `7 c6 M% f第十、十一行是写入文档结束组码对。
2 |* Y  L4 f9 v% J9 B第十二行是关闭文档。) |( t2 ^. N$ T' j6 P# k. ~' g7 m

, i$ k! Z5 W6 P: L- \在C盘根目录新建一个文本文档,命名为”1.dxf“。然后打开CAD的VBA编辑器,分别把这段主程序代码和楼主的子程序代码粘贴在”ThisDrawing"模块代码页上,执行这个主程序(宏),就可以创建一个包含一条直线的名为”1.dxf“的最简单的DXF文档8 i) ^; c. L: S% o/ f3 w

5 @& j7 R* G% E0 ^! G7 c2 }7 }! c& x

评分

参与人数 1三维币 +10 收起 理由
2005llnn + 10 鼓励积极应答和参与的回帖。

查看全部评分

发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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