QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

[已答复] VBA如何填充一个三维四边形?高手指点~

[复制链接]
发表于 2009-2-4 23:33:32 | 显示全部楼层 |阅读模式 来自: 中国福建福州

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

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

x
Dim object As AcadSolid3 T6 R9 K9 A, |; P" R) ^
ThisDrawing.SetVariable "fillmode", 1
; v6 [3 p# j: U! Q8 PSet object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)3 C( h& Q  r' }6 g" P
object.color = 6# @: w3 X, `* X5 X" P

0 m8 A' s' W3 u  ?5 M9 i, W* r7 h
1 g5 U1 Q+ o9 m点已经定义好了。。只要这4个点是二维的。。就可以填充。。。但是如果点定义为三维的就不行。。
$ U) {1 i, p1 P$ n0 x" C
- l; C/ Q0 j) {! }高手指点!
发表于 2009-2-5 11:14:02 | 显示全部楼层 来自: 中国辽宁营口
solid(二维填充)对象本来就是二维的
 楼主| 发表于 2009-2-5 11:39:04 | 显示全部楼层 来自: 中国福建福州
那如何填充三维的面呢?
+ z, R4 M# L$ L5 ?4 k  s" y
$ B/ M! U/ a2 `# E. P. k我这4个点是在XZ面上的一个四边形。。。0 u. e( [9 `5 D" r- k) C& r
* j8 g5 n/ @7 R# t
[ 本帖最后由 jjww123 于 2009-2-5 11:41 编辑 ]
发表于 2009-2-5 13:53:50 | 显示全部楼层 来自: 中国辽宁营口
需要变换UCS+ K6 r5 s' a  i% J

  1. , `+ H: p# F2 N: U5 i8 t/ S+ i  C% m
  2. Sub A()
    5 I) n: y+ u+ G- A  @9 r+ P
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    : I7 {! u( Y1 n& g& g& m5 ?. X: n
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double% g- \) E. J/ G# H5 P9 z
  5.     With ThisDrawing8 y2 E  r+ y9 x9 R0 z. C
  6.         '下面4个点用于定义二维填充(solid)对象
    8 V# h/ v2 g( K4 ]0 z/ T
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0
    5 E( {8 h, k: s! ?- D7 t
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0+ l  t2 ]  ~, ~
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 10, ~! h+ ~9 p% v4 p/ t
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 103 f3 T5 G* Y5 V) Z  B2 e" d3 J
  11.         '下面3个点用于定义新的UCS
    4 G& }4 q+ p- P
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点. z3 @  N8 ^$ J, F: h5 A
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    " J5 T# u% v, V& O* J
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
      K" }4 M8 O. t# J) x0 b6 c
  15.         '新建UCS/ q. j7 c, B. m8 z8 n% r$ t
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
    ( t) b8 v. x1 B* v: b5 ]
  17.         '新UCS置为当前
    & @, H! e! {5 b( b
  18.         .ActiveUCS = UCS# V* f' F* T2 c) i, ~
  19.         '创建二维填充
    ' U8 O9 u0 s. W7 Y) y4 ?* A
  20.         .ModelSpace.AddSolid P1, P2, P3, P4
    4 L  P* b0 I, z+ H6 U' R9 G3 s6 e1 J
  21.     End With. J2 I8 }0 C! m& {8 C+ N. A
  22. End Sub; A6 C7 A6 [' e, \) b+ G
复制代码
( p6 x* A' K& T
6 f5 k" n1 D! O9 }
上面代码中定义二维填充对象的四个点都是世界坐标系WCS。如果这四个点是自定义的用户坐标系UCS上的点,还需要换算坐标,参见下面的代码' z- j4 s2 D5 s, H

  1. % X! ^; v) U2 C# u1 Z
  2. Sub A(). q- F! B- B/ J, r
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double2 B& l+ O" m9 e
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
    % s. e. j4 @& U1 Q$ m
  5.     With ThisDrawing
    4 h  ~) H2 _6 C! G3 E
  6.         '下面4个点(相对于XZ平面)用于定义二维填充(solid)对象! k* Q5 K; q' M" K9 [" B2 K
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0
    ( [' b! q6 w4 s& w) h
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    2 `, N8 k7 \6 B! `" |
  9.         P3(0) = 0: P3(1) = 10: P3(2) = 0
    8 s' M$ z$ i" q" Y5 O
  10.         P4(0) = 10: P4(1) = 10: P4(2) = 0+ H' C4 W! l/ F; T( Y
  11.         '下面3个点用于定义新的UCS
    4 G2 n) q( N# P/ V! _- s) }
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
    8 t) I3 R5 y1 t6 {1 @, Z
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    7 R9 Y2 _& o7 Z
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
    . C( a& x+ C" F  e$ W; S1 w# T
  15.         '新建UCS
    8 E$ X# |3 S4 v* p* f/ t4 q5 T8 S
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
    9 W( R1 ]% a# ]& \; g
  17.         '新UCS置为当前
    2 a$ t7 A; a  \5 j
  18.         .ActiveUCS = UCS
    6 W5 ^  ^6 _4 J/ y7 M
  19.         '创建二维填充(P1和P2在两个坐标系中没有变化,不必换算;P3和P4从当前UCS换算为WCS才可以,因为addsolid方法的四个点坐标必须是WCS)7 y. w$ i# M) D$ V
  20.         .ModelSpace.AddSolid P1, P2, .Utility.TranslateCoordinates(P3, acUCS, acWorld, False), .Utility.TranslateCoordinates(P4, acUCS, acWorld, False)
    + y% T! M+ q" i* \2 j+ `
  21.     End With
    4 h' R4 t: X5 E( S
  22. End Sub- T5 {+ y1 O( P; t( h% ]' o
复制代码
 楼主| 发表于 2009-2-5 14:11:20 | 显示全部楼层 来自: 中国福建福州
哇。。太感谢了!太谢谢了!我慢慢看。。。。先回帖!
 楼主| 发表于 2009-2-5 14:57:57 | 显示全部楼层 来自: 中国福建福州
版主您好!请问为什么画出来以后无法显示颜色。。必须要选视图-视觉样式-真实  以后才能显示填充以后的效果?
# ?* i9 ~$ g& X% K; ~1 @
" f. D) ~, t3 h6 q4 M  }3 H0 s& @6 t* l7 [  ?- `  ~
'下面3个点用于定义新的UCS
0 z6 A9 r2 X* Z' `/ N' Y/ C) [- [    Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点. T5 l2 A* [" t5 Q7 ]/ [
    Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向* a% C+ N5 c6 _; f# q/ g
    Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向1 Y5 i2 M  z( z% M; G/ G1 ~: S

) S( K" S" g. \8 _3 Z0 L! `    '新建UCS# V: a) `: l( v1 X% }
    Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
7 A" ?, F$ _* m: v0 `% `   
7 Z# R/ ]$ v3 u, S/ k( v6 }    '新UCS置为当前( ^+ A: O9 n% \4 r
    .ActiveUCS = UCS
+ F/ P- J  A4 `& Q% l9 R) ?- U   
( m% R+ I. I/ z! C0 W" z   
# ]$ ^2 `$ o2 i; d" J' N# J    Dim object As AcadSolid2 `* Y+ n( |' y; H8 P7 p( u7 N
    " N. _7 G: \% c) V7 |0 n
    Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)
6 s# l1 D2 K5 g! `   
$ ^) @& s7 V! R, Y  l6 @    object.color = 6
发表于 2009-2-5 16:38:26 | 显示全部楼层 来自: 中国辽宁营口
“FILLMODE”系统变量设置为1并且视图方向正对着二维实体时才能看到填充。' k: M5 E& A* @/ J& n' @$ A
可以在上面的代码中再添加两行,如下
0 ]9 S! f. Q2 C7 \7 _! `# v# H
  1. / X7 c' B5 {7 Q, J
  2. Sub A()
    # y1 p" V' B! m! l1 L2 |+ l  V7 Z4 C7 [
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    4 C" g+ l# [, p* s9 o
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
    0 k: j$ G% W$ ^* M3 d+ ]$ `3 Z
  5.     With ThisDrawing
    ; e% R; F, T" `4 D" L# ^
  6.         '下面4个点用于定义二维填充(solid)对象
    - i% ?8 m- s# b% G
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0# Y! `1 n1 S3 E+ T4 G
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    - `3 y  M6 D5 W% ^: k
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 105 \' ^  y. h5 B7 F: D% q2 p- S
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10
    ) \* q6 i9 K: m+ C4 I8 w9 l
  11.         '下面3个点用于定义新的UCS# r" e! d. I9 `( H4 N% ?
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点: E2 C1 f7 E- k; b0 \6 L4 C3 V: S
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向8 b% I5 ]# v+ q# x9 s1 S
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
    9 r$ w. v/ Y: J. c' P# a% I& _
  15.         '新建UCS
    ' B9 v- b5 j) q7 ]* @% V
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
    4 W( ]: R# O$ R" g! t
  17.         '新UCS置为当前
    ) c- D- L! q" i) [, V4 O. S2 l8 J
  18.         .ActiveUCS = UCS' e/ m; Z/ g6 a8 E' D
  19.         '创建二维填充! G* ~: O' A1 G: M, G0 _. K$ `
  20.         .ModelSpace.AddSolid P1, P2, P3, P4
    " l5 q3 [" {1 }7 `: i. K
  21.         '发送键盘命令,使视图对正当前UCS。注意plan后面有两个半角空格,相当于两次回车0 }& L9 n* Z- M' M9 M
  22.         SendCommand "plan  "
    5 m+ u, D/ O9 _+ B2 w
  23.         '修改系统变量(CAD默认该变量值就是1,如果没有修改过此变量,则此行可以不用)9 v" |3 J/ `! R8 \/ K9 t8 W8 f
  24.         .SetVariable "fillmode", 1( q$ J  u. {$ M* i+ c3 C
  25.     End With  P) Y& j$ U- Z/ d: `
  26. End Sub; d  ^# g. ~& T) W  x* \
复制代码
 楼主| 发表于 2009-2-5 17:09:42 | 显示全部楼层 来自: 中国福建福州
感谢版主耐心的回答。。. M. u: h  w4 R& r3 R' B

+ S- e: Z( G8 a0 r. B& y) q+ w$ _结合我另外一贴的问题。。加入以下代码以后。。视图是变了。。但是加上你上面填充的代码之后就乱了。。。
/ n5 p9 {8 t$ z/ v  ?" t. Y( _4 b1 P: {7 h* N6 h
如何在下面代码中添上楼上的填充代码。。并且正确显示呢?  ~; F* _3 ~% u6 o& u' f4 R

& P# n/ t6 o1 a* T# ]# {0 v/ v& X( t8 C7 r1 Y" }  q2 v# e

: j5 |  W2 I# y! M6 ~  V# WSub A()
) l& ]" f7 ~7 ~: z( }0 g. k, u2 t    Dim V As AcadView, D(2) As Double$ q, o+ Y  {6 z2 }! f9 H; O
    With ThisDrawing0 s& }0 J4 |7 j2 `
        '新建视图
% E6 }  b( e7 v2 s% X( ?        Set V = .Views.Add("AAA")
2 f. r! c3 z5 q+ ]+ f. z        '设置新视图的方向" q, e4 B% n4 f0 G1 u0 M2 |
        D(0) = -1: D(1) = -1: D(2) = 10 \6 D8 t, M) r" o: Y5 x7 J
        V.Direction = D  X6 N* Y5 Y% G' W3 d+ |2 }
        '活动视口设置为该视图& f" `3 l; Y; u% ?' i% k$ w# h# c
        .ActiveViewport.SetView V
2 a. ^" I% k6 O" b$ ^$ F        '重置活动视口' t0 u) m7 h: Q" ]9 K
        .ActiveViewport = .ActiveViewport
) R8 c: W# \. n& L& F    End With
) @4 `  I% ^9 H+ G1 Z) ]3 F; D9 M    '缩放视图) ^, Q6 ?4 q' R, c7 G5 L4 I
    ZoomAll
- Y  b4 W" ]; b; fEnd Sub
发表于 2009-7-21 09:03:18 | 显示全部楼层 来自: 中国甘肃兰州
找了很长时间,总算找到这个例子." r$ H: O, F8 _
关键点0 _, f" |0 ]" N" b* h/ d) z( a& p
        P4(0) = 10: P4(1) = 0: P4(2) = 10
9 f; t2 }: Y: @( |. y  R* o/ K        '下面3个点用于定义新的UCS- r& w' Q/ X$ W' R9 L7 K5 r
        Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
$ y& w: a" q) ^/ T8 C        Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向4 a& C* L  R/ E* c9 V: d! {
        Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向8 F! i4 m$ k! @) w- ]( S3 `
        '新建UCS
5 j( ?7 `. c- _, _& {        Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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