QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
Dim object As AcadSolid
* I' Q' ?3 W" DThisDrawing.SetVariable "fillmode", 1, q# n. y3 e9 a9 x& ]) y6 m2 L
Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)
1 {4 ]  f- y; [0 A& F! uobject.color = 6
* ?7 j1 V5 l) P8 r
% G+ t- ^0 v) t. O! a- Z& t: p. u
& u$ V% |% L0 h点已经定义好了。。只要这4个点是二维的。。就可以填充。。。但是如果点定义为三维的就不行。。
  c1 J/ a' H5 g4 J' Z0 ?5 G5 Q  b5 W
高手指点!
发表于 2009-2-5 11:14:02 | 显示全部楼层 来自: 中国辽宁营口
solid(二维填充)对象本来就是二维的
 楼主| 发表于 2009-2-5 11:39:04 | 显示全部楼层 来自: 中国福建福州
那如何填充三维的面呢?
! Q# w" c6 t1 p9 B' `: C( \- I2 X: M# J. F
我这4个点是在XZ面上的一个四边形。。。8 B& _: k" o% t( Z; l6 c
7 b( \' L0 u* ~5 _) U  {: e$ N
[ 本帖最后由 jjww123 于 2009-2-5 11:41 编辑 ]
发表于 2009-2-5 13:53:50 | 显示全部楼层 来自: 中国辽宁营口
需要变换UCS
, V/ F2 N9 u. ^8 R
  1. 3 n2 v8 \& Q; X8 L+ ~& _$ i8 ^# ]8 w
  2. Sub A()
    1 i/ o6 b! V4 Z0 h; ^0 {* ^# f
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    . M& K' d/ j! C' i0 F+ s: ~# Q5 U( L
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double# T$ N/ ]4 m9 o
  5.     With ThisDrawing+ ]9 S/ M  T- \. y1 h
  6.         '下面4个点用于定义二维填充(solid)对象) j# g0 X, |6 o6 A+ }6 h
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0' }, A. M0 u! A! {
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    / E2 ?$ V+ x9 o* y4 ~
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 10/ d3 J+ V2 S+ F
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10
    ; f  A4 L3 X8 r5 B& k
  11.         '下面3个点用于定义新的UCS
    0 K0 L6 U3 z. J3 o
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
    & r! a4 M% U+ |0 ^4 d6 \" Y
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    ) R. K. S8 [; a- m" h7 ?* w- m
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
    + b9 l9 ^+ u7 x, Y' q7 p
  15.         '新建UCS0 _8 L' v  `1 E2 R& T5 [
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
    ' Y2 B- d, V( k( w! `' {! y5 k
  17.         '新UCS置为当前& }4 @' R# R; B: _3 m- e. x$ s
  18.         .ActiveUCS = UCS; Q) L0 j+ P% t9 `
  19.         '创建二维填充. s, |% _/ f4 S
  20.         .ModelSpace.AddSolid P1, P2, P3, P4- o$ E- }7 s: Z9 c6 ?( y3 l
  21.     End With
    $ @7 P0 ]* p. l: k) a) f! }2 z
  22. End Sub/ B" |3 U8 h* k8 T7 w
复制代码
2 F3 ~! l3 f1 ?% d5 H
. f. x! _" x& O- ~/ m
上面代码中定义二维填充对象的四个点都是世界坐标系WCS。如果这四个点是自定义的用户坐标系UCS上的点,还需要换算坐标,参见下面的代码
! q4 k/ K3 V0 o( i) f# Y* h* P8 p
  1. 1 U; t0 b- Z4 p0 y6 n
  2. Sub A()( L2 L9 _  u4 B, w
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    : ]: k  B6 G% N4 F1 j* H! A7 g' `
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double8 H6 ]1 M2 ^, x0 F7 ]
  5.     With ThisDrawing
    ) |+ I+ D! Q3 T4 P  H- y
  6.         '下面4个点(相对于XZ平面)用于定义二维填充(solid)对象, Q  ]% G. |/ |3 }  [1 v* B
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 0. H: v& N2 c! R; f& Z. s3 w
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    4 _/ A+ k  Z( U) S
  9.         P3(0) = 0: P3(1) = 10: P3(2) = 0$ F  w% ]8 X. u- K: G
  10.         P4(0) = 10: P4(1) = 10: P4(2) = 09 C4 J9 L% p) j  K
  11.         '下面3个点用于定义新的UCS5 l* P1 D* D0 X
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点! q$ L* G+ J! F( L. H# y6 f* E
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向/ R+ o) n% O* d0 `, a
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向/ x! o% X5 @- u* a' o0 A6 ~  y3 r
  15.         '新建UCS
    0 h/ K+ t1 ?6 {% S* K; ~
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")! ?$ |: N. M9 d' N8 |  i4 t$ m
  17.         '新UCS置为当前
    " q4 S7 L! s4 v5 N- H
  18.         .ActiveUCS = UCS
    % D% ^. r3 c* B5 _) B
  19.         '创建二维填充(P1和P2在两个坐标系中没有变化,不必换算;P3和P4从当前UCS换算为WCS才可以,因为addsolid方法的四个点坐标必须是WCS); a6 X6 Y, L4 o% T1 y( b! \
  20.         .ModelSpace.AddSolid P1, P2, .Utility.TranslateCoordinates(P3, acUCS, acWorld, False), .Utility.TranslateCoordinates(P4, acUCS, acWorld, False)
    : e3 d. D- v5 O1 l( y1 H
  21.     End With( b7 m$ F6 D  K1 W4 p% \
  22. End Sub1 x2 y5 h% O' v+ b  Z0 X
复制代码
 楼主| 发表于 2009-2-5 14:11:20 | 显示全部楼层 来自: 中国福建福州
哇。。太感谢了!太谢谢了!我慢慢看。。。。先回帖!
 楼主| 发表于 2009-2-5 14:57:57 | 显示全部楼层 来自: 中国福建福州
版主您好!请问为什么画出来以后无法显示颜色。。必须要选视图-视觉样式-真实  以后才能显示填充以后的效果?) I5 D  R4 K7 x4 g
- g2 A8 P1 O/ J3 Z0 A3 A

8 m# K. X% V9 j; S- D7 {' M '下面3个点用于定义新的UCS
4 [- L( U: I' f1 w    Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
3 Q, u/ d% K6 z! N    Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向& n( S3 Z4 r! I! ^
    Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向4 S) w8 {+ z- m! \4 v! B

% ~8 O5 v- }- q9 N% W# o    '新建UCS
& n( M2 j0 R9 C( t  @4 ]. ], R$ K" e    Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")
/ v3 V1 v" ~5 I2 l' O    / R8 W7 W$ h% |/ l, ?3 }# ~4 t9 `
    '新UCS置为当前( @- ]$ l1 r8 H$ t
    .ActiveUCS = UCS
% q, O0 @) `) L$ m6 s" T+ b   
0 ~3 A& [5 v' i( f    " p9 k0 i- Z/ G! L. H
    Dim object As AcadSolid1 p# M+ }: O* m& z2 e" B8 c( H& x
   
7 c, m' F  [# e+ l% B8 P$ ~    Set object = ThisDrawing.ModelSpace.AddSolid(e点, f点, h点, g点)
' S1 `$ X4 i8 G   
& H. M. `! \- ]7 x3 f' E" I2 N    object.color = 6
发表于 2009-2-5 16:38:26 | 显示全部楼层 来自: 中国辽宁营口
“FILLMODE”系统变量设置为1并且视图方向正对着二维实体时才能看到填充。' B0 b# j3 Q' N4 X" E4 P# J
可以在上面的代码中再添加两行,如下* v6 t3 g0 Q' z

  1. ) k# |) W- ^" X5 }% {
  2. Sub A()
    . }7 R1 S( C8 _( {3 I1 z) |
  3.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, P4(2) As Double
    7 _% D0 @  J4 |# d4 w5 J3 a; i
  4.     Dim UCS As AcadUCS, Op(2) As Double, Xp(2) As Double, Yp(2) As Double
    ' _( ~% t( M* m; P& A
  5.     With ThisDrawing# S' [: h% c5 W4 G" D% I: ^
  6.         '下面4个点用于定义二维填充(solid)对象
    0 g" E/ Y* ^: i6 j2 @$ g5 T0 v
  7.         P1(0) = 0: P1(1) = 0: P1(2) = 03 K  p! _1 D6 b( _: y& S  G
  8.         P2(0) = 10: P2(1) = 0: P2(2) = 0
    , P" ]# f% T. a$ O) \4 G" _( u
  9.         P3(0) = 0: P3(1) = 0: P3(2) = 10
    - X( g8 U+ h! K7 V: V3 a
  10.         P4(0) = 10: P4(1) = 0: P4(2) = 10
    ! S2 `7 m% u4 _4 A  ]
  11.         '下面3个点用于定义新的UCS# N6 z9 p$ q2 @$ _1 S2 b' q
  12.         Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点  h- E: v. l5 _# ?
  13.         Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向
    7 @$ k! y. H, ^, H$ C- L- ?1 R
  14.         Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向
    4 o+ Y! T- Z. ]& y
  15.         '新建UCS9 g4 S% _( {' ]  g& ?) Q! ]
  16.         Set UCS = .UserCoordinateSystems.Add(Op, Xp, Yp, "AAA")# a$ j' A: F0 V) x7 c
  17.         '新UCS置为当前  T6 {9 h9 {  h0 k
  18.         .ActiveUCS = UCS
    * ^# l! s7 P5 R) w( h6 m* p+ F9 u
  19.         '创建二维填充4 X0 _) b6 N; y, R. h1 R$ v9 j8 ?( Y' [
  20.         .ModelSpace.AddSolid P1, P2, P3, P4+ {. n. T: m6 _( @6 j
  21.         '发送键盘命令,使视图对正当前UCS。注意plan后面有两个半角空格,相当于两次回车* ?, \7 C" s  ]/ \
  22.         SendCommand "plan  ": R; M' V7 F- f9 s, S
  23.         '修改系统变量(CAD默认该变量值就是1,如果没有修改过此变量,则此行可以不用)
    ; a+ G  ^$ z5 I7 v
  24.         .SetVariable "fillmode", 1
    . V* k6 y# w  D* F% y0 i  u
  25.     End With/ x9 v2 ]9 e  i  T+ x% Z; \
  26. End Sub
    5 A3 Z( m8 s) c# F9 j- m
复制代码
 楼主| 发表于 2009-2-5 17:09:42 | 显示全部楼层 来自: 中国福建福州
感谢版主耐心的回答。。
6 O: b; p5 R3 W: ?, Y. q2 W, p( J, G# U7 U
结合我另外一贴的问题。。加入以下代码以后。。视图是变了。。但是加上你上面填充的代码之后就乱了。。。7 a1 B$ I+ d7 {) }3 l" n
5 a" s% m4 j% ?. u6 s3 H- V- |
如何在下面代码中添上楼上的填充代码。。并且正确显示呢?
- j; X. O9 a' E/ g. t
7 P/ T, X3 i* j1 a! ^
0 Q& h# p0 s" K
8 a6 {7 o" t# T$ @Sub A()* V5 K1 v8 A9 q& b, ^2 @4 z
    Dim V As AcadView, D(2) As Double
/ a* b; U' B9 a. Z9 Z    With ThisDrawing- @0 L# f% |# N
        '新建视图
* L- y$ i& B$ q  n7 K( Q& |        Set V = .Views.Add("AAA")
# A% v) w* ?5 m' \- Z        '设置新视图的方向/ x- J. ?' V8 i  h, H7 [( l
        D(0) = -1: D(1) = -1: D(2) = 1( S) Q5 D7 `8 h# Z
        V.Direction = D
+ P# Z7 T( v# [        '活动视口设置为该视图
/ n9 l8 ]8 u) A2 F9 w        .ActiveViewport.SetView V( U  M0 y$ H6 P+ p
        '重置活动视口
9 G  D& a& l4 e" G& z: a        .ActiveViewport = .ActiveViewport0 ]) X, v; ?" F6 _7 d2 D
    End With8 E2 k( J- ~) p
    '缩放视图
, s) M1 N; ~' |3 c    ZoomAll" ~6 R9 J- F" Z& \
End Sub
发表于 2009-7-21 09:03:18 | 显示全部楼层 来自: 中国甘肃兰州
找了很长时间,总算找到这个例子.
- [0 h3 ]! |- K2 r关键点) c6 F2 |6 a/ O6 v( w- ^
        P4(0) = 10: P4(1) = 0: P4(2) = 10
' F" `/ [1 v7 j        '下面3个点用于定义新的UCS% R8 x# X9 H$ p+ }3 X: A
        Op(0) = 0: Op(1) = 0: Op(2) = 0 '新UCS的原点
! `5 O# c# ]- v8 l        Xp(0) = 1: Xp(1) = 0: Xp(2) = 0 '新UCS的X方向) e: b7 s8 M2 k! ?
        Yp(0) = 0: Yp(1) = 0: Yp(2) = 1 '新UCS的Y方向9 W/ v( W8 c  E8 T# v* f! F
        '新建UCS
0 m( C7 T+ N# k! n! C: _7 ?        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 )

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