QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
Dim object As AcadSolid# O. E) m, I; I
ThisDrawing.SetVariable "fillmode", 1" [! B- |  t! D' u* ^! p: g; B
Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)
' _& F. l' T: S# @/ qobject.color = 6: W1 g& w" z9 T
) L  {- G' \' q4 _- m' N& o3 U
# ^' |0 B' A3 C8 g9 [# Z
点已经定义好了。。只要这4个点是二维的。。就可以填充。。。但是如果点定义为三维的就不行。。
0 h. M3 a- H, j* m2 L' [8 C- W* g7 x  H
高手指点!
发表于 2009-2-5 11:14:02 | 显示全部楼层 来自: 中国辽宁营口
solid(二维填充)对象本来就是二维的
 楼主| 发表于 2009-2-5 11:39:04 | 显示全部楼层 来自: 中国福建福州
那如何填充三维的面呢?
+ _" @$ Z/ R, t' C7 T2 O" U. x3 E+ B2 w
我这4个点是在XZ面上的一个四边形。。。& \9 y) k1 E, {. P2 v. ?/ ^0 `4 u
/ a1 j  ~$ }! Y' U
[ 本帖最后由 jjww123 于 2009-2-5 11:41 编辑 ]
发表于 2009-2-5 13:53:50 | 显示全部楼层 来自: 中国辽宁营口
需要变换UCS
, R$ t/ Z) x3 b
  1. ( `3 H4 |3 S8 U) ]! @2 M7 ^
  2. Sub A()
    % p! K, h8 p6 o. I2 }6 A
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    / J1 g1 V9 ]4 ?8 `6 D$ M. W; X
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double) l8 ]; N5 _! O* _
  5.     With ThisDrawing
    " \* U9 Y$ \0 G" C* m% z
  6.         '下面4个点用于定义二维填充(solid)对象2 G" ~2 \( E9 }+ @
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0
    $ N4 a6 v& n0 O# W  H  l) G( {
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    4 R& n9 p8 n1 ?' v8 H4 H: X. m8 }
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 10
    " }0 p" X/ C# V; G
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10: P5 ~4 L' Q* v  W. @- @; ^
  11.         '下面3个点用于定义新的UCS2 X  O1 f! H+ s, t" ?* l; J6 O
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点  J# k. X! e( j( _: }% ]. S
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    - e' ]: w' j3 v6 d' \, O9 v: N
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
    8 N2 r5 A4 v! t* b) J( |
  15.         '新建UCS6 E# r3 u0 f( d9 C+ M) _
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA"); [* s. H2 w+ `2 j0 N. [! c' W& T
  17.         '新UCS置为当前: s. Z  g' {, l  S6 a
  18.         .ActiveUCS = UCS: C$ D& m" b. c
  19.         '创建二维填充' T0 _$ j% ~+ ]6 P/ i1 j
  20.         .ModelSpace.AddSolid P1, P2, P3, P4) ]* w2 y7 Z5 L0 P
  21.     End With
    ( }9 r0 S8 P* y+ X5 Y
  22. End Sub! a+ p6 `5 Z' A0 C/ m' r; F
复制代码
2 A/ y5 F2 A$ U+ |
8 r3 x/ K7 R0 \# ?2 o2 D) r  f
上面代码中定义二维填充对象的四个点都是世界坐标系WCS。如果这四个点是自定义的用户坐标系UCS上的点,还需要换算坐标,参见下面的代码, i8 i: Z2 X( p, i. x4 r  X8 @
  1. - p3 u8 V' H/ v: e
  2. Sub A()
    1 E9 g, [" z9 {& ~% X1 O3 X$ ]* l+ s: v
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double: Q' Q4 _% B6 B4 j+ S' \
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double; R' n' Q, a7 t! J
  5.     With ThisDrawing% W& |0 V9 E0 c- z6 x
  6.         '下面4个点(相对于XZ平面)用于定义二维填充(solid)对象
    6 w! v$ B' J  z1 k7 x
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0: Z8 X/ }4 m6 C$ E
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    4 `/ d6 N& e( v0 C" Z  s
  9.         P3(0) = 0: P3(1) = 10: P3(2) = 0
    2 W% `& x2 Q+ i- f8 U0 h% [
  10.         P4(0) = 10: P4(1) = 10: P4(2) = 0
    ) s1 {) o$ J0 ~1 N9 b' R$ E
  11.         '下面3个点用于定义新的UCS- H/ N7 B3 N$ ^
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点- g2 ]8 ]+ k8 E& f1 p& V" I1 p
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向- {2 t9 T) a' A1 f" Z
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向! h- Y: X% m; S  w  s% N2 r: E
  15.         '新建UCS' H! |0 g* T. L$ b- j/ j
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")% `: f3 E+ t4 _) y: d
  17.         '新UCS置为当前8 q4 Q( N2 v& j( `% w) @# v
  18.         .ActiveUCS = UCS  k. e5 d. h, K6 U, `- F2 o
  19.         '创建二维填充(P1和P2在两个坐标系中没有变化,不必换算;P3和P4从当前UCS换算为WCS才可以,因为addsolid方法的四个点坐标必须是WCS)
    9 p; g4 S. N2 R3 N, f4 }3 ?
  20.         .ModelSpace.AddSolid P1, P2, .Utility.TranslateCoordinates(P3, acUCS, acWorld, False), .Utility.TranslateCoordinates(P4, acUCS, acWorld, False)
    1 ?8 T3 a) i$ [( A0 ]( K
  21.     End With
    + m- i5 r4 O  c# l- f% v) A
  22. End Sub) q0 Z, G+ g8 V( A5 L7 x& a. }) x* a
复制代码
 楼主| 发表于 2009-2-5 14:11:20 | 显示全部楼层 来自: 中国福建福州
哇。。太感谢了!太谢谢了!我慢慢看。。。。先回帖!
 楼主| 发表于 2009-2-5 14:57:57 | 显示全部楼层 来自: 中国福建福州
版主您好!请问为什么画出来以后无法显示颜色。。必须要选视图-视觉样式-真实  以后才能显示填充以后的效果?2 m9 F1 I+ f, e7 P7 z  g5 y
. d5 ^* F  A+ U7 _9 o% t" @0 k
1 o- W! M  R2 k4 U# D
'下面3个点用于定义新的UCS
5 e2 M% B& n$ L$ E/ g; [% C    Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点9 P! [" B, C) D7 Y8 `
    Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向# X& l+ ?  N9 F
    Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向% `+ w) f; m; q: f( e+ v% L) B

7 k. {4 }% r6 h" M7 U& t# P    '新建UCS9 _$ |4 E2 ~- U, M2 d- l
    Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
: M0 H5 B- V) p+ D8 q    2 w& h% ~& T; H3 h
    '新UCS置为当前
' k$ z8 g; L" |# _. z4 n2 y    .ActiveUCS = UCS. F5 l6 q8 ?7 `6 W! U
   
/ H  O6 y1 s0 s6 p1 G3 c* Y   
7 `5 T, x" G7 D  Z, ]7 N    Dim object As AcadSolid
0 n; i# K' h( c/ S' J   
% g! c- D" ~/ |, r" f& _    Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)8 l9 @5 D3 }5 K3 V
   
7 f5 `$ ?, z7 U/ x2 j  V8 f    object.color = 6
发表于 2009-2-5 16:38:26 | 显示全部楼层 来自: 中国辽宁营口
“FILLMODE”系统变量设置为1并且视图方向正对着二维实体时才能看到填充。
) ^$ M" x0 p: I. L4 N5 y& t0 f# o+ k可以在上面的代码中再添加两行,如下
  `+ e$ `  B, @9 _1 U

  1. 8 [; _, O9 M; O. V& K* o+ R* b
  2. Sub A()3 T+ ]0 q: }+ R/ O
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double, @2 W5 c/ `6 m" l+ X& P
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
    * Y- M% K. s+ d8 i2 @+ h* O
  5.     With ThisDrawing
    ) x  |" E7 k+ o& Y8 g
  6.         '下面4个点用于定义二维填充(solid)对象
    # k8 y9 F2 v8 e; \7 f6 d) U& `5 h
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0
    ' j& `) T) U8 i0 L4 I9 y+ E
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 09 Z* Q0 V( k& P
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 10
    * |9 L! W6 i( C9 |
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10) `% {! d$ {6 y+ [8 d
  11.         '下面3个点用于定义新的UCS) @9 w' |7 b% t$ C
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
    , q5 v1 Z" N$ B. a( }- ]+ ~0 Z) j
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向# x9 ?; O) s/ P; k. W; {7 E
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向) }5 M% V/ ~- `8 o' }, S
  15.         '新建UCS
    $ j5 D! N& z% L" S" E& B5 w8 w8 p
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")$ \1 }5 s: D$ E8 F
  17.         '新UCS置为当前0 N) F5 Z% D" j' E$ D" L- P# C& |7 M
  18.         .ActiveUCS = UCS# e) ^' l2 @9 e' r! d
  19.         '创建二维填充
    - u  A" Y* y8 W5 X* A9 X! @
  20.         .ModelSpace.AddSolid P1, P2, P3, P4" N5 a8 x5 n/ {& k
  21.         '发送键盘命令,使视图对正当前UCS。注意plan后面有两个半角空格,相当于两次回车
    / J; \5 @* b( d( k: o
  22.         SendCommand "plan  "" [/ y3 t/ U/ ?, U
  23.         '修改系统变量(CAD默认该变量值就是1,如果没有修改过此变量,则此行可以不用)
    ( h* Z: A; a' n0 i2 {
  24.         .SetVariable "fillmode", 16 \# C% ?. h! E) k" W
  25.     End With% Q* y5 }* `* q
  26. End Sub
      Z% }0 G+ r: H/ ~
复制代码
 楼主| 发表于 2009-2-5 17:09:42 | 显示全部楼层 来自: 中国福建福州
感谢版主耐心的回答。。: f0 y2 u7 [* l
& w& j8 u+ q; R$ _& ?3 H1 |/ u) J
结合我另外一贴的问题。。加入以下代码以后。。视图是变了。。但是加上你上面填充的代码之后就乱了。。。
6 Q3 Z& }  i, t3 u9 ?  h( A1 t2 w% Q9 o* G6 n7 \6 v
如何在下面代码中添上楼上的填充代码。。并且正确显示呢?
. V! n% B( Y2 m& X+ e7 V
# S& f2 Y! p9 g% {" n8 W; K" P: ^8 z- d" |9 t( Q4 B

1 j& c  y# b! X9 t9 LSub A()
) Z4 d% ^! P9 h, W. }3 t& |+ V8 J    Dim V As AcadView, D(2) As Double2 Q+ e0 ~. z& C8 ]; C- U1 G8 j
    With ThisDrawing! k4 f: b: D5 Z$ ^  {+ x% O
        '新建视图+ |% Z, r) W, P, t/ v1 C: D# l
        Set V = .Views.Add("AAA")
" H) f8 ^+ M6 t. K        '设置新视图的方向7 D. H/ z  m! B
        D(0) = -1: D(1) = -1: D(2) = 1) q2 n7 y9 q: h4 ~8 [0 ~
        V.Direction = D
, Q; C2 i; h, a4 ^1 Z! f        '活动视口设置为该视图. W' f3 \8 x2 }9 A& j
        .ActiveViewport.SetView V
0 R4 y* O3 v! M- g! L6 B        '重置活动视口
5 ^" L) B3 B2 a# q/ l        .ActiveViewport = .ActiveViewport3 f+ J( F  _9 ~4 r2 M3 T9 l
    End With/ u  s2 v: n$ i* Q/ E. ?
    '缩放视图) ^( S) ]# W8 K/ F4 s
    ZoomAll: K+ ~. m0 y; |% M6 {0 a
End Sub
发表于 2009-7-21 09:03:18 | 显示全部楼层 来自: 中国甘肃兰州
找了很长时间,总算找到这个例子.! b( A1 c. z3 a) V
关键点% Y/ l0 X0 d. G% d' h: a: V/ |
        P4(0) = 10: P4(1) = 0: P4(2) = 105 u$ q* [0 t$ N  j7 @
        '下面3个点用于定义新的UCS( z+ B/ ?% r! d) T6 y8 J* H! P$ r
        Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点0 v, e% b3 I2 b* J* b, v0 D% \
        Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向( T7 W* Q/ Q6 {( x' Q9 d* a( e/ Q( V
        Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
: T4 S$ T7 w+ l; E/ X        '新建UCS, r8 D* @& i- ?7 Y: I, K6 ~8 G
        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 )

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