QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3158|回复: 8
收起左侧

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

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

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

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

x
Dim object As AcadSolid* ~& O2 V5 l  F- w$ M+ |
ThisDrawing.SetVariable "fillmode", 1
( u$ ~+ F* d# P6 O: ]) DSet object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)
  C1 o3 s8 n+ p+ n" I1 |. O  pobject.color = 6
/ E  h; ]9 n" ]4 q' G2 @
5 j( ?: b1 Y  n! N7 C% k. ^& {5 l; x2 \
点已经定义好了。。只要这4个点是二维的。。就可以填充。。。但是如果点定义为三维的就不行。。& ]9 r& {% r+ l( R) @/ I
1 p0 n' }5 M/ C/ Y2 c) {5 i
高手指点!
发表于 2009-2-5 11:14:02 | 显示全部楼层 来自: 中国辽宁营口
solid(二维填充)对象本来就是二维的
 楼主| 发表于 2009-2-5 11:39:04 | 显示全部楼层 来自: 中国福建福州
那如何填充三维的面呢?
. q1 J. K. g, G1 k9 ]- i' M1 x# E& ]/ w% w" b6 H
我这4个点是在XZ面上的一个四边形。。。
) }# ^4 z$ G. T4 O1 D5 b6 W+ B5 k  m6 i1 e3 j
[ 本帖最后由 jjww123 于 2009-2-5 11:41 编辑 ]
发表于 2009-2-5 13:53:50 | 显示全部楼层 来自: 中国辽宁营口
需要变换UCS
& K# T3 d8 g$ R' X: D9 M9 j( |5 s
  1. % O3 p! v9 U9 k& f2 |5 x$ a$ U- d5 w
  2. Sub A(), Z7 j( b4 s. J! k+ P" H6 _& c" e1 p8 e) Z
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double3 ?; T( p' C( V4 p
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double$ Y. t* r1 R+ p0 C
  5.     With ThisDrawing
    - `1 H3 q& k! q; R, i
  6.         '下面4个点用于定义二维填充(solid)对象% {- T1 b! b$ N  s% w: i* X. f
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0
    ' j& n7 P1 M: V% j
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 07 h' d" {$ a" }5 @) |6 M
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 101 ?* w" n4 t  b- \
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10
    0 o1 x! F) x9 f/ @. h5 J1 o
  11.         '下面3个点用于定义新的UCS
    ! f; j- @1 a, D( h9 U* u
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
    ! N" x" Y: p* M0 T
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向9 p3 `3 v+ ^+ t* P6 |+ U
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
    9 U! ?5 v' ~) z7 O9 f
  15.         '新建UCS
    . O* S8 v5 A* V: @* I3 y6 P, x
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
    ( T( G7 x. y4 A1 ~
  17.         '新UCS置为当前
    ! |* p) T; Q' y
  18.         .ActiveUCS = UCS
    4 y% s; Q; s# h' V
  19.         '创建二维填充& m( i3 F: {6 }9 k- l- k% Y
  20.         .ModelSpace.AddSolid P1, P2, P3, P4# c( d+ f! s& N+ q
  21.     End With8 N! M4 n4 Y: p8 M
  22. End Sub% o, U# K5 B; c; m
复制代码
6 S  ]; n. |( |" J, u( M: P

" e7 g  O# g! B5 h上面代码中定义二维填充对象的四个点都是世界坐标系WCS。如果这四个点是自定义的用户坐标系UCS上的点,还需要换算坐标,参见下面的代码; [- J! ?; m* {6 }

  1. ( I' x6 \7 p, z; O. l; p( A
  2. Sub A()
    : [- }3 s7 v( s) H7 X
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    4 {! A; ?6 @6 ]. M$ j
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
    ( [" g) x% ?$ u* s2 U
  5.     With ThisDrawing
      g) t/ z9 q1 c- s, w) j
  6.         '下面4个点(相对于XZ平面)用于定义二维填充(solid)对象& E1 X# C- \$ j$ d* B0 n, a
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 04 r4 l5 j8 Z% O) e$ X- c/ ?
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
      w- n4 |+ }. N# o) |* y2 i
  9.         P3(0) = 0: P3(1) = 10: P3(2) = 0: x% }: z* @+ j" I  D( j, r
  10.         P4(0) = 10: P4(1) = 10: P4(2) = 0
    + a/ C4 n1 h+ \$ m. B7 w
  11.         '下面3个点用于定义新的UCS
    - K, @  E1 P. }7 P
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点/ h! [4 o8 `3 f" Y8 \
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向: I6 _! t6 Q; ^
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向8 }$ b7 P4 ]$ \1 ~
  15.         '新建UCS* |$ e9 E+ A" E) n" ?/ V3 j
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
    0 ?0 P/ K# m2 O" `" L
  17.         '新UCS置为当前' P- Z! n! V/ `! i% P5 N( r
  18.         .ActiveUCS = UCS; s- W9 {) y7 o. `5 p" |8 K
  19.         '创建二维填充(P1和P2在两个坐标系中没有变化,不必换算;P3和P4从当前UCS换算为WCS才可以,因为addsolid方法的四个点坐标必须是WCS)
    4 q! [; ?; V" \! \# |
  20.         .ModelSpace.AddSolid P1, P2, .Utility.TranslateCoordinates(P3, acUCS, acWorld, False), .Utility.TranslateCoordinates(P4, acUCS, acWorld, False)
    # \! a' W7 I( x4 ~  M
  21.     End With
    & K  n; T, A) @  q$ l- T* g4 L
  22. End Sub
    , `5 p: Z! d+ h( b; D
复制代码
 楼主| 发表于 2009-2-5 14:11:20 | 显示全部楼层 来自: 中国福建福州
哇。。太感谢了!太谢谢了!我慢慢看。。。。先回帖!
 楼主| 发表于 2009-2-5 14:57:57 | 显示全部楼层 来自: 中国福建福州
版主您好!请问为什么画出来以后无法显示颜色。。必须要选视图-视觉样式-真实  以后才能显示填充以后的效果?
! E6 M4 v8 U8 A- x
; g* R7 Y+ M5 G- C& X1 E+ |* Q/ k) D
& P, K' {( C* t2 ]/ |& l5 z4 y '下面3个点用于定义新的UCS
6 S- i5 P. a; M6 U' {    Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点# k  K2 T3 N" B0 |  O' J$ t3 n
    Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向$ S% _" e/ w) B7 n, c4 h
    Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
: E9 {* ^4 E+ M, f( @" s# ^
, N0 q; Z! r7 @9 h    '新建UCS% q( }" k  l( C" V
    Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
3 }- S1 I0 F- Z0 l    : ^4 H7 k* Y# @+ A7 d
    '新UCS置为当前
' K) ^& @6 b. \" a) [+ T    .ActiveUCS = UCS7 L2 C7 h  A: n
   
- D% S; a5 J& Q; g/ |    : Z7 F! D1 r2 ]  Q7 y% e$ T# O! }
    Dim object As AcadSolid7 X$ R- q: [4 s# H+ S3 w! b( k
    , R; I) v5 e5 s; ^7 p
    Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)& P- x. L# P4 B
   
" L! T6 q5 z2 K0 n; D0 @% ~  S    object.color = 6
发表于 2009-2-5 16:38:26 | 显示全部楼层 来自: 中国辽宁营口
“FILLMODE”系统变量设置为1并且视图方向正对着二维实体时才能看到填充。
( w  _2 E: U4 r1 {0 ^! v* l% j可以在上面的代码中再添加两行,如下
; i+ p& R6 Y" {; C) R% c7 c

  1. % y9 l  X. A0 K1 s9 }/ o
  2. Sub A()
    6 Q  v+ O+ v( D# ]/ |/ I
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    4 S" U3 B4 u" C; J$ h
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
    " A3 D+ h  j$ F; }3 u$ @8 m; U. w- o
  5.     With ThisDrawing
    ) k8 b' i4 v, K  J; l- s  z' c, k
  6.         '下面4个点用于定义二维填充(solid)对象5 Z$ w5 _, b  y# D( {
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0+ b; p2 M2 I0 q, v; N
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 03 I, z  c% I4 U% P( A/ l/ D
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 10
    , A5 J# q- f7 B) x& e% ~1 C' N
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10
    0 N% l; n( W2 K* i8 ~6 k% G- t
  11.         '下面3个点用于定义新的UCS
    9 g0 a6 T% ?3 p+ l
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
    , R; b! C" F  l) d* Q" ^2 K; B$ Y
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    , D! s& A& N( W
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向: L! g% D7 |5 i. ~" E9 Z4 k5 }
  15.         '新建UCS7 l; P6 E! |% q2 s
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")- Z: Z( @+ H' Y1 O4 h$ E
  17.         '新UCS置为当前
    : ]# u! k- f  U# c- p8 K! A
  18.         .ActiveUCS = UCS
    " X; U. S( e' {  H3 x$ \- i, e: z" Z
  19.         '创建二维填充
    ' I6 G& H3 W! ]8 t/ X0 _9 C& Z7 Z. A
  20.         .ModelSpace.AddSolid P1, P2, P3, P4
    + F, K1 `- u; }
  21.         '发送键盘命令,使视图对正当前UCS。注意plan后面有两个半角空格,相当于两次回车
    * @  b# o2 w5 G; V8 l
  22.         SendCommand "plan  "
    4 m/ Y( a. g( U. m- x0 ?
  23.         '修改系统变量(CAD默认该变量值就是1,如果没有修改过此变量,则此行可以不用)
    6 Z8 j$ @0 i( W' p- \7 q
  24.         .SetVariable "fillmode", 15 W% x+ k  a! p1 B0 I
  25.     End With
    & H/ H9 J8 q' a8 K: Q1 B
  26. End Sub, k  a, c  N& y* r9 S
复制代码
 楼主| 发表于 2009-2-5 17:09:42 | 显示全部楼层 来自: 中国福建福州
感谢版主耐心的回答。。
* a- [! w! k% Y" }
! F0 y( r6 s7 M, n结合我另外一贴的问题。。加入以下代码以后。。视图是变了。。但是加上你上面填充的代码之后就乱了。。。5 L5 S& T* ^4 g0 a# s
& J( p- w* u) [+ q
如何在下面代码中添上楼上的填充代码。。并且正确显示呢?
0 K& q8 H6 q. L/ |& Y- |
- }5 L& H2 G4 r& h" T3 u* R( ]2 O# F* _- P# _6 }

/ n' a: L1 O* t1 wSub A()
, s' P4 ]/ Z# b) E: _3 \, K8 p    Dim V As AcadView, D(2) As Double* M/ y* @9 d- A% \$ `6 Y, v
    With ThisDrawing
+ Y- i& G1 U* |; _" E" u        '新建视图7 U" Z' m% j: z- S' t( _2 V
        Set V = .Views.Add("AAA")
2 [& q5 ^( X. A# A: _/ m        '设置新视图的方向3 \, F9 i7 f. i9 ?" B4 {+ m  e4 z6 C
        D(0) = -1: D(1) = -1: D(2) = 1
' W7 @  k) j9 G# h. X, D( T        V.Direction = D3 s: i, Y: Y8 D- Z, h" s
        '活动视口设置为该视图6 l7 p; r7 T4 p% n! Z8 X  I
        .ActiveViewport.SetView V- _. Z$ z0 Q( W- t5 H8 V& ]
        '重置活动视口) o# Q1 g# f+ S1 S, ^
        .ActiveViewport = .ActiveViewport: Q; ^  P! @. w4 R2 T! e' ?
    End With$ C% Y' n! n* U" J; ?# O7 V
    '缩放视图2 N% K" D3 u( |) ^- S+ M! y9 P
    ZoomAll  A: t. G1 u+ ^8 _; B: L- ~
End Sub
发表于 2009-7-21 09:03:18 | 显示全部楼层 来自: 中国甘肃兰州
找了很长时间,总算找到这个例子.
, d8 y( ]8 a# [( o' \: X6 Y7 F: v* K关键点
  O. _) P3 a6 w        P4(0) = 10: P4(1) = 0: P4(2) = 10
7 a. ]! V& }5 V+ n/ `* d, a2 d        '下面3个点用于定义新的UCS1 |9 O3 }) I  p& T$ `
        Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
' t7 W  n) h- ?. i0 w        Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向4 q. i( o0 i+ M
        Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
) H" N# m, w! P6 i9 z        '新建UCS% F3 d0 J0 O; f/ t
        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 )

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