QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
Dim object As AcadSolid) C; b- R, ^- W2 d, m
ThisDrawing.SetVariable "fillmode", 1+ ?! `- S* Q8 H- m( e# i$ p7 p
Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)
& k- k9 l5 D  D: E( ?2 J+ y* Gobject.color = 6" }: L' i2 ^5 P' b4 _

$ h9 u2 u" G3 ]! P2 Z' R; j: d% E3 @+ j
点已经定义好了。。只要这4个点是二维的。。就可以填充。。。但是如果点定义为三维的就不行。。# k( h: O+ t0 H# c4 [- @" L

$ `1 C  \; O9 v# t. a, r% x高手指点!
发表于 2009-2-5 11:14:02 | 显示全部楼层 来自: 中国辽宁营口
solid(二维填充)对象本来就是二维的
 楼主| 发表于 2009-2-5 11:39:04 | 显示全部楼层 来自: 中国福建福州
那如何填充三维的面呢?0 E: V1 [! w8 i1 D

' ?8 q+ x- Z$ l; g. V4 t我这4个点是在XZ面上的一个四边形。。。$ k; G1 N$ K- t. @

  ]+ @+ h! ~! R; Z+ k* p[ 本帖最后由 jjww123 于 2009-2-5 11:41 编辑 ]
发表于 2009-2-5 13:53:50 | 显示全部楼层 来自: 中国辽宁营口
需要变换UCS& u- H% D3 ~& w1 T! p

  1. : J  T9 i! v& J6 x* {* [- d) M9 z
  2. Sub A()
    ; b! Q8 a0 W% g9 a' v5 ]( K( w
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    , E, M8 ^6 O: Q1 \( R; D0 _6 h
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double- u3 t0 J  I9 U4 l7 F* M# c
  5.     With ThisDrawing$ M: a8 b8 R3 _$ k8 [
  6.         '下面4个点用于定义二维填充(solid)对象3 ~. }/ y, V8 ~, D) A7 p, n3 M
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0: [$ ]1 K- |! ~0 h  o
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 04 f% i5 I$ y' P" ~0 U( q9 N
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 10
    ( o/ O. N: _; p9 k9 q
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10/ `4 [* |) l5 E7 M7 Z8 m( E
  11.         '下面3个点用于定义新的UCS& J- N  {5 s+ {# H! a
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点  H& O4 b3 q1 ]% g* s( g7 A/ }0 k6 m
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    5 }; K  m1 o( L7 T- n
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
    * ~! I' B' y2 o
  15.         '新建UCS
    3 m8 l; E- `  `! B8 t0 p
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA"); E. A2 }1 E. R$ \1 B/ D: F# O3 x
  17.         '新UCS置为当前1 T2 V+ O- }- Q: W, ]
  18.         .ActiveUCS = UCS
    - t7 }0 u2 M' r0 w1 j! {- ~
  19.         '创建二维填充2 ?3 B' D5 f+ }  L, P
  20.         .ModelSpace.AddSolid P1, P2, P3, P49 W& k& e% U& V' C5 Q8 D0 b8 d& y* g
  21.     End With" f$ u: J) x' Z, ]) t- y# k
  22. End Sub, {9 Y5 \0 q5 h) [5 h
复制代码

8 Q5 r* ]& H; {  p$ Y
5 O4 s7 R; }0 U6 K: m3 Z* e- z上面代码中定义二维填充对象的四个点都是世界坐标系WCS。如果这四个点是自定义的用户坐标系UCS上的点,还需要换算坐标,参见下面的代码  m% \, |6 s, ?- T$ t# m8 q) q7 M
  1. + f' K+ @1 l. w) E( p
  2. Sub A()$ B) f3 q# x, g
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    + Z/ ~: t( g/ x7 Y# m: [. n/ G+ W
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
    # c8 N+ _; d0 l7 f- f" R
  5.     With ThisDrawing+ n  K' p/ J( f" S3 `) H  f
  6.         '下面4个点(相对于XZ平面)用于定义二维填充(solid)对象
    2 i  K: r3 X4 S, q$ ~! F* D
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 01 A0 Q3 \( t4 S
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    " o( ^5 z) P! B' g( E/ i
  9.         P3(0) = 0: P3(1) = 10: P3(2) = 0
    0 E9 N. N$ Q. [; |+ i: i
  10.         P4(0) = 10: P4(1) = 10: P4(2) = 0
    " y4 Z/ U' w5 W) o. q' h( S+ p) r
  11.         '下面3个点用于定义新的UCS
    # |9 l  z2 y& N# d8 U7 N, A
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
    9 n% W; h' q6 |0 p8 L2 Q7 o; D) R- X
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向" t. b* U8 j  ?# l8 T2 F
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向8 K  J. w" g, K( v# V. g  n6 m& v' m
  15.         '新建UCS
      M, ]8 O# _5 ?2 f/ ~/ ^
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")5 |" V$ t$ ]+ S
  17.         '新UCS置为当前7 a- B0 s4 k. ?4 y- \" e
  18.         .ActiveUCS = UCS7 M1 A) t* o8 d" L
  19.         '创建二维填充(P1和P2在两个坐标系中没有变化,不必换算;P3和P4从当前UCS换算为WCS才可以,因为addsolid方法的四个点坐标必须是WCS)6 K' l- T- E: b! {7 }! {7 C  f
  20.         .ModelSpace.AddSolid P1, P2, .Utility.TranslateCoordinates(P3, acUCS, acWorld, False), .Utility.TranslateCoordinates(P4, acUCS, acWorld, False)4 U. \8 X; S2 @( Y; J- J* m2 f
  21.     End With
    3 W( P, N' M. a0 G
  22. End Sub
    ' q, N( Q& V# D: s
复制代码
 楼主| 发表于 2009-2-5 14:11:20 | 显示全部楼层 来自: 中国福建福州
哇。。太感谢了!太谢谢了!我慢慢看。。。。先回帖!
 楼主| 发表于 2009-2-5 14:57:57 | 显示全部楼层 来自: 中国福建福州
版主您好!请问为什么画出来以后无法显示颜色。。必须要选视图-视觉样式-真实  以后才能显示填充以后的效果?
7 M& d; J7 y8 Q0 Q" e, @
" r4 E1 j6 X: `" S
. N2 f7 C: U2 h; s '下面3个点用于定义新的UCS3 f, c' _& C% p  V9 _0 Y' }8 m2 Z. K
    Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点- ^) n: d# M0 c3 u: E
    Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向2 w' G8 Z: Q8 Q! p: r8 T: P7 H2 S
    Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向! ~# I6 t8 o1 z# g
* V1 k5 P6 B2 z0 L) z
    '新建UCS
9 d6 @! Q) R8 ^4 j3 ]9 k4 |    Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")2 }; ]- Y& a# u4 p5 [% ~: K" Y
    ' f; F! \. m) `  e6 w( n% V. r
    '新UCS置为当前3 F: l8 J! H; {8 m& G+ c7 r: s% M% y
    .ActiveUCS = UCS: }/ p2 U7 U7 i2 ^1 p( ^$ S
    5 T, ~6 d! ]- g$ b! q
    6 l( K7 [8 x4 ~8 y- g
    Dim object As AcadSolid
$ F; Z1 J* |0 I8 g    % ^; U1 }1 U/ z
    Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)
& [. P  c7 {& g1 v# j    / r) J# V; |: G3 g- A: e
    object.color = 6
发表于 2009-2-5 16:38:26 | 显示全部楼层 来自: 中国辽宁营口
“FILLMODE”系统变量设置为1并且视图方向正对着二维实体时才能看到填充。
/ H9 d- F$ P- _" t2 z+ r- K. L可以在上面的代码中再添加两行,如下
6 Y/ k' b0 r1 A( T7 y0 p" K

  1. ' x! [2 J, h, @, o" T2 w/ y
  2. Sub A()
    2 P6 O8 A0 B" y6 R" Q
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double0 w& k) C# Q8 L" l+ i
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
      Q$ N" c" K# ~0 V# V; k9 n
  5.     With ThisDrawing
    ( l8 f- V" l, V+ Y
  6.         '下面4个点用于定义二维填充(solid)对象/ c3 Q# g, z9 s2 J' T, }
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0" E5 f6 x' Z* [* f9 m& m- x
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    " Y) O: B3 C) P5 c* Z
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 107 r% }9 f3 n: T" T
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 107 P1 h2 V  e8 H! B% N, U
  11.         '下面3个点用于定义新的UCS+ k) ^3 U) e0 K
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点* [* B% ~! ?1 T5 Y
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    " H9 i5 @" ~3 }* W
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向* ?7 A3 X1 j# x4 R
  15.         '新建UCS
    3 O/ ^% Q$ T. e2 p+ s
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
    / U1 ]8 h, y" d, I, Y3 U( T
  17.         '新UCS置为当前0 I" u4 N, ]  [5 G
  18.         .ActiveUCS = UCS2 u, T, Y9 y9 a4 d' e1 x2 O
  19.         '创建二维填充: R8 _0 m9 ~9 u. a' u3 i* J
  20.         .ModelSpace.AddSolid P1, P2, P3, P4( ?1 X1 L1 a9 k/ U( _
  21.         '发送键盘命令,使视图对正当前UCS。注意plan后面有两个半角空格,相当于两次回车
    / y2 U- s6 V9 \, Q
  22.         SendCommand "plan  "1 l- t6 x7 K  Z# f) E& u
  23.         '修改系统变量(CAD默认该变量值就是1,如果没有修改过此变量,则此行可以不用)3 ?9 u0 o- u, B" h
  24.         .SetVariable "fillmode", 1* u  `2 R. E- V0 I
  25.     End With' c5 b+ W, V  c; c( @" p" Z
  26. End Sub3 b- D+ W- c2 p: ^+ _$ R! H' ]: o
复制代码
 楼主| 发表于 2009-2-5 17:09:42 | 显示全部楼层 来自: 中国福建福州
感谢版主耐心的回答。。
# o0 M# ^# v, C) o" w0 y8 [1 Z5 i( v9 V- N5 s
结合我另外一贴的问题。。加入以下代码以后。。视图是变了。。但是加上你上面填充的代码之后就乱了。。。5 A) y0 S4 ]( R* A0 d! z

" ]) \1 ]( x. W) \8 R6 P- {如何在下面代码中添上楼上的填充代码。。并且正确显示呢?4 u8 n: m6 K1 j1 j0 C( }( X0 U
, n8 F: l$ p+ C" W/ I; A+ Q& r
- ^4 i9 P# T$ c& g/ A
, j5 k6 \9 s  ^
Sub A()
, d4 L* ]0 C  K( ~! o    Dim V As AcadView, D(2) As Double
7 L# J0 J" F8 i" R3 f, r5 A    With ThisDrawing
" t1 _$ f/ Y% G; M. g$ e        '新建视图' @1 x% R' p! @- q+ |7 J
        Set V = .Views.Add("AAA")
; C* N( U7 C9 c6 g& p        '设置新视图的方向
3 q$ ^- M# n, }$ J( }# {' H9 C; F6 n        D(0) = -1: D(1) = -1: D(2) = 19 x) T9 U1 ?& D5 |
        V.Direction = D( s0 u* T8 K$ e3 f9 E, Z
        '活动视口设置为该视图5 f* C, y% @9 K8 n# l
        .ActiveViewport.SetView V
* z. q) N- `4 z1 \        '重置活动视口9 S9 [5 `% O( k3 w' q& W* k
        .ActiveViewport = .ActiveViewport
" V) c( \( L6 `3 Q    End With
! J  u* y: d4 ]$ ?4 Y    '缩放视图
" m/ ^6 V" [6 v, j' N; ~    ZoomAll
. W6 q# ~! l3 O8 Y) F8 f4 sEnd Sub
发表于 2009-7-21 09:03:18 | 显示全部楼层 来自: 中国甘肃兰州
找了很长时间,总算找到这个例子.
4 D  l& c& G( P  {% D5 a4 `* X, b关键点$ t4 n- o) G. ]" j# w+ z
        P4(0) = 10: P4(1) = 0: P4(2) = 10
+ z" J0 i$ a( Z4 e4 y0 `+ i6 ]# M        '下面3个点用于定义新的UCS
$ E- s4 P" I: Z4 N" N* `  F- a        Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点6 W, n+ m2 O: m- L* J! B
        Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
8 y7 b/ f4 l7 }0 R+ o        Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
' d5 x9 c7 D( p- F        '新建UCS
( ?6 ~) x! L- w        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 )

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