QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 6007|回复: 3
收起左侧

[已解决] VBA:如何填充不规则区域?

[复制链接]
发表于 2011-5-16 10:36:12 | 显示全部楼层 |阅读模式 来自: 中国浙江杭州

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

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

x
本帖最后由 157787698 于 2011-5-16 10:50 编辑
% C( C4 \" d+ z" K# |0 a! o+ ?" ], U( i# O! I* x- |
如何填充不规则区域呢?比如下面的代码创建了一个封闭区域,如何填充呢?
& f9 [3 F% ?+ b) |& w* y6 i
" u. W4 c' P! J! ^6 E' O7 l& A6 l; Y  
  1. Dim splineObj As AcadSpline
    9 w( D' E$ i0 S3 x4 C% O9 O
  2.     Dim startTan(0 To 2) As Double2 f1 T9 V* O" A9 r0 L7 F
  3.     Dim endTan(0 To 2) As Double+ i" b8 H& E8 ~+ S4 H8 S$ `
  4.     Dim fitPoints(0 To 17) As Double
    ; x2 T" S% D) q' D! F% X  v, x
  5.     dim p2(0 to 3 )  as double
    , w4 u$ O' H' }( S2 D

  6. : N* @" C7 o; ?9 N
  7.     P2(0) = 1: P2(1) = 1! T3 I! }3 m$ M% p
  8.     P2(2) = 10: P2(3) = 1( C5 V# J' ?! {& Z, y
  9.     Set PLINEOBJ = ThisDrawing.ModelSpace.AddLightWeightPolyline(P2)
    3 _5 ]4 D  @2 C
  10. ; [- ^, G$ ?- J. Z9 B  M& c
  11.     startTan(0) = 0.5: startTan(1) = 0.54 v$ u% K! f$ w7 }  ^
  12.     endTan(0) = 0: endTan(1) = 0
    ; l) @5 Q7 o% H. T) P6 v- u
  13.     fitPoints(0) = 1: fitPoints(1) = 1. o# t1 W5 t/ {( N0 c6 b0 F( l
  14.     fitPoints(3) = 3: fitPoints(4) = 9
    ' U+ t" u3 h2 |2 \" ^0 _
  15.     fitPoints(6) = -1: fitPoints(7) = 174 N) A) O6 C% [( q* t5 ]
  16.     fitPoints(9) = 1: fitPoints(10) = 25
    , q" U# v7 s5 Z4 Z% i# B% l: K. R
  17.     fitPoints(12) = 10: fitPoints(13) = 10
    7 s7 B6 P. N* B/ O
  18.     fitPoints(15) = 10: fitPoints(16) = 1
    2 P5 X$ @2 t) s& L  G
  19.     $ u# @% z) q5 L+ f
  20.     Set splineObj = ThisDrawing.ModelSpace.AddSpline(fitPoints, startTan, endTan)
    ( ~" _. }; Y0 o5 N1 G& d
  21.     ZoomAll2 y5 e+ V+ m7 h7 u
  22. + g2 p3 ]# L" t
复制代码

% I/ j  S3 {! ~  Z2 u如何使用取点填充?
发表于 2011-5-16 14:23:57 | 显示全部楼层 来自: 中国辽宁铁岭
  1.     Dim splineObj As AcadSpline
    5 i$ p" e" ~* K: ?1 }3 _5 a/ l
  2.     Dim startTan(0 To 2) As Double
    1 Q3 U/ H0 I4 \) W. w- }8 f% |" }
  3.     Dim endTan(0 To 2) As Double
    4 M+ f1 H' b: f0 ?( h
  4.     Dim fitPoints(0 To 17) As Double0 @/ G/ l% [' O& l" S
  5.     Dim p2(0 To 3)   As Double* S" [5 P- E+ L# s, O
  6.     Dim PLINEOBJ As AcadLWPolyline
    ( \; g5 X; ^' m4 l; i1 B
  7.     '声明一个对象数组,用于定义填充的外边界3 o) w7 T/ I8 ^; w9 l
  8.     '边界必须是由同一平面内首尾相连的若干条线封闭构成! o8 {0 R$ s0 ^  f; n/ N. }6 C
  9.     '本例的填充边界由一条二维多段线和一条二维样条曲线共两条线构成,所以数组元素数为2,最大下标为1
    # ]  ]' s8 H/ L' r8 c2 q% y
  10.     '根据需要,还可以声明若干个对象数组用于定义填充对象的内边界
    & O0 i! b7 \( c
  11.     Dim Obj(1) As Object$ X) O! P# p* u+ O
  12.     '声明一个填充对象
    2 @) R( h2 b+ Q3 z
  13.     Dim H As AcadHatch
    ) c) v4 N! O& @/ n1 k- P7 h) y
  14.    
    $ Z; g* X, z& t$ @% z  N% b( f
  15.     p2(0) = 1: p2(1) = 1
    2 b5 b1 x! k% ?6 S* N3 X5 h
  16.     p2(2) = 10: p2(3) = 1+ ]0 m3 ]2 d& X& o3 E
  17.     Set PLINEOBJ = ThisDrawing.ModelSpace.AddLightWeightPolyline(p2)
    , z/ a% d' b( A! ]- X( K

  18. 4 R2 b! H, @; D; g( g8 A
  19.     startTan(0) = 0.5: startTan(1) = 0.5
    & i- I# Q9 K  b0 P# H
  20.     endTan(0) = 0: endTan(1) = 0; I7 e7 s% x! O# h* f) ]3 @
  21.     fitPoints(0) = 1: fitPoints(1) = 1# P0 l0 v7 m0 P: T2 U( b7 m
  22.     fitPoints(3) = 3: fitPoints(4) = 92 n; T, o% k1 [2 u7 g: P. A& i, f$ ?+ t6 \
  23.     fitPoints(6) = -1: fitPoints(7) = 17+ F9 r  L% v1 ]; M" n2 A
  24.     fitPoints(9) = 1: fitPoints(10) = 25
    ) C1 t6 Z) v9 L+ M9 O# i" L
  25.     fitPoints(12) = 10: fitPoints(13) = 10
    9 s$ T/ Y& N6 x2 A! C
  26.     fitPoints(15) = 10: fitPoints(16) = 1
    5 |2 Q4 U, t6 e8 y% a
  27.     ! V1 e0 g1 e; @0 _
  28.     Set splineObj = ThisDrawing.ModelSpace.AddSpline(fitPoints, startTan, endTan)
    / Y7 S; B: a- P7 V3 d2 d$ ~# C! [/ n
  29.     '对构成边界的数组赋值, M, @6 v8 m$ y* y9 W
  30.     Set Obj(0) = splineObj
    # m& I3 W2 ^% O8 ]% ]0 G0 r
  31.     Set Obj(1) = PLINEOBJ
    , ?9 {% V) K8 q1 t" l
  32.     '创建填充对象# }$ }# r0 S( M3 C; A% W7 h% A
  33.     'cad2004及以上版本的AddHatch方法既可以创建图案填充,也可以创建渐变色填充( M6 C  M$ P4 u
  34.     '所以2002及以前版本的AddHatch方法有三个参数,而2004及以上版本增加了第四个参数"填充对象类型"(AcHatchObjectType)
    " w8 C5 T- }% N  n
  35.         '该参数有两个命名常量,一个是acHatchObject = 0(图案填充),另一个是acGradientObject = 1(渐变色填充); K8 P: [" D. ~$ I
  36.         '该参数是可选的,默认是0(即图案填充)7 `$ }( z5 z* M' O9 u
  37.         '下面的代码没有写这个参数,用的是默认值图案填充: k8 R; L2 U( W/ T# j
  38.     '前面三个参数:
    * H, {3 q; ~2 J4 A' L6 j; M
  39.         '当填充类型为图案填充时" X. J3 V: u, e  M
  40.             '第一个参数是"图案类型"(AcPatternType)
    7 }9 A. U+ D' M6 |) N& k
  41.                 '该参数有三个命名常量
    6 f7 V  S! N+ L: ?6 |
  42.                     '一个是acHatchPatternTypeUserDefined = 0,对应于图形界面填充对话框中"类型"下拉列表框中的"用户定义"
    # N) Y6 {" Y  T
  43.                     '再一个acHatchPatternTypePreDefined = 1,对应于图形界面填充对话框中"类型"下拉列表框中的"预定义"7 w3 s4 j  b# N& S( ]0 V3 @8 ~
  44.                     '第三个acHatchPatternTypeCustomDefined = 2,对应于图形界面填充对话框中"类型"下拉列表框中的"自定义"8 N) M) |0 F2 o- X# V1 Z" ]  N1 |
  45.                     '下面的代码用的是"预定义"
    ; ^$ [# ?0 ]0 j+ l3 Q; L7 e
  46.             '第二个参数是"图案名称",在图形界面的填充对话框中都可以看到! K% E( [( V" i9 U
  47.         '当填充类型为渐变色填充时
    - X" D% r( n2 {  p/ I0 G& R
  48.             '第一个参数是"渐变类型"(AcGradientPatternType)/ ]1 p) ?' w8 E5 D. s
  49.                 '该参数有两个命名常量2 S3 g& `" h9 ~  U. G: h
  50.                     '一个是acPreDefinedGradient = 0(预定义)9 |/ h" S4 d* ~( r
  51.                     '另一个是acUserDefinedGradient = 1(用户定义)
    ( ~7 D8 S$ l1 Z# [8 f3 Y* G
  52.                     '第二个可能是为以后版本升级备用的,现在不能用,只能用第一个
    8 A$ {- }- B0 V4 s: H2 Q
  53.             '第二个参数是"渐变填充名称",预定义的有以下这些0 q1 ?( W' ~& v( u2 Q, C
  54.             'LINEAR, CYLINDER, INVCYLINDER, SPHERICAL HEMISPHERICAL, CURVED, INVSPHERICAL, INVHEMISPHERICAL 或 INVCURVED* _- ^2 m7 ^0 b% t" t) L( j7 Q$ D! b
  55.         '第三个参数是"关联",布尔型" q# `5 N+ l+ C5 d
  56.     Set H = ThisDrawing.ModelSpace.AddHatch(acHatchPatternTypePreDefined, "ansi31", True)1 E" E; ?6 z# j
  57.     '创建填充后的第一件事就是为它指定外边界
    ( T. a) c* ~0 e2 T
  58.     '填充对象的其它属性可以在后面慢慢弄,这里就不写了
    ( I1 b8 f) y- G
  59.     H.AppendOuterLoop Obj3 s2 k+ B+ N5 q3 _9 b3 ]8 [
  60.     & _3 h2 G& B! H5 K, `4 R; w6 ]$ R
  61.     ZoomAll
复制代码
 楼主| 发表于 2011-5-16 14:56:30 | 显示全部楼层 来自: 中国浙江杭州
谢谢0 @. e9 h6 `; ?

5 c! R- h( P0 W" K( t9 Y9 G  [我爱谁家,你太强了
 楼主| 发表于 2011-5-16 16:06:11 | 显示全部楼层 来自: 中国浙江杭州
需要补充说明一点:
3 L. a& A1 T& s6 B* H绘制样条曲线时最好用三维坐标,即z坐标即使为0也写出来3 y1 ^4 w8 f, P
2 j9 ^4 C6 c, A
我遇到了这样一个问题:我在填充由样条曲线和多线段围成的区域时,经常跳出来提示输入无效,但有时候又是正常的。
5 c7 v4 \9 q8 [* R2 I* _( s  `6 \$ F3 z2 Z1 _1 ^4 O, R) M. x! H
我查找了很长时间,我觉得这没有道理。
9 J9 y. Z) A* m; m1 V  W( ~) N4 {% X
最后发现是因为我在绘制多线段时使用了绘制样条曲线时的同一个数组导致的,而在那里使用该数组的时候我是当做二位坐标来赋值的,而在对样条曲线点赋值的时候我直接忽略了z坐标,导致样条曲线不在xy平面上,最终形成的区域不是二维面域,也就无法填充。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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