本帖最后由 kuangben8 于 2019-4-14 10:11 编辑 8 \$ I' [1 l5 D' \, d5 a
* y7 F* u4 d2 ~. h关于创建图案填充的补充:(非常感谢woaishuijia老师的热心帮助,以下是老师的帮助文档+我的一点总结)一、关于 AddHatch方法的参数 1、在2002版及以前,AutoCAD 只有图案填充,那时的AddHatch 方法只有三个参数,即 PatternType(图案类型)、PatternName(图案名称)和 Associativity(关联性);到2004版,增加了渐变填充, AddHatch 方法就增加了第四个参数 HatchObjectType(填充对象类型)。 2、先说第四个参数 HatchObjectType(填充对象类型) 先说它的原因是它的值决定了第一个参数的用法。按我们通常的思维习惯,它本来应该是第一个参数,但由于是后增加的,所以排在了第四个。 这个参数为 AcHatchObjectType 枚举类型。如果使用变量,应这样声明 Dim ** As AcHatchObjectType 这个枚举共有两个值: 1、acHatchObject= 0(图案填充):表示选择填充样式为图案填充!对应填充界面如下
8 ?8 v5 ~7 m7 L3 Y1 E2、acGradientObject= 1(渐变填充):表示选择填充样式为渐变填充!对应填充界面如下
, i- ]' D( o! M g7 z* z( C3 y% P
. }' M# _5 k" r这个参数是可选的,默认值为 0(acHatchObject,图案填充)。 c' T7 ~8 {# v* `2 L( K* G: u4 q: h
3、再来说第一个参数 PatternType 在2002版及以前,没有第四个参数(只有图案填充),这个 PatternType 参数是 AcPatternType 枚举类型。2004版及以后,这个参数的类型就有了两种选择,即:如果第四个参数HatchObjectType(填充对象类型)的值是 acHatchObject = 0(图案填充)或省略,则这个 PatternType 参数就必须用 AcPatternType 枚举类型;如果第四个参数 HatchObjectType(填充对象类型)的值是acGradientObject = 1(渐变填充),则这个 PatternType 参数就必须用 AcGradientPatternType 枚举类型。 这个PatternType 参数的值决定着第二个参数 PatternName(图案名称)的用法,后面再说。先说这个参数两种枚举的值: 1)AcPatternType 枚举类型。如果使用变量,应这样声明 Dim ** As AcPatternType 这个枚举共有三个值: acHatchPatternTypePreDefined = 0(预定义):使用CAD自带的填充样式! acHatchPatternTypeUserDefined = 1(用户定义):此时CAD自带的填充样式不可选! acHatchPatternTypeCustomDefined = 2(自定义):此时CAD自带的填充样式不可选! 这三个值对应着图形界面“图案填充和渐变色”对话框中“图案填充”选项卡上的“类型(Y)”下拉列表(见图)。6 K) D- c% ~+ Q' z5 I% S
' m' Z5 A4 @0 n# ?& r& f
8 E5 i- U+ b: ~- n4 I2)AcGradientPatternType 枚举类型。如果使用变量,应这样声明 Dim ** As AcGradientPatternType 这个枚举共有两个值: acPreDefinedGradient = 0(预定义) acUserDefinedGradient = 1(用户定义) 第一个值容易理解;第二个值E文是这样说的:Definesa pattern based on property values. 翻译:基于属性值定义模式。比较费解。经多次尝试,出错的提示总是“尚未实现”,且图形界面“图案填充和渐变色”对话框中也没有对应的选项。猜想这是为 AutoCAD 为今后的渐变填充改进预留的,就是说这个枚举目前只能用 acPreDefinedGradient = 0(预定义)值。
7 c0 R1 t. j$ a* d! \; K4、第二个参数 PatternName(图案名称) 1)当第一个参数 PatternType 是 AcPatternType 枚举类型且其值为 acHatchPatternTypePreDefined = 0(预定义)时,图形界面“填充图案选项板”(见图)上的“ANSI”、“ISO”和“其它预定义”选项卡上的所有图案名称都可以用。 2)当第一个参数 PatternType 是 AcPatternType 枚举类型且其值为 acHatchPatternTypeUserDefined = 1(用户定义)时,本参数只能为"_U"。这个图案没有什么实际用处。所以 AcPatternType 枚举类型的值 acHatchPatternTypeUserDefined = 1(用户定义)我认为至少在当前阶段是多余的,也许随着 AutoCAD 的改进将来会有用吧? 3)当第一个参数 PatternType 是 AcPatternType 枚举类型且其值为 acHatchPatternTypeCustomDefined = 2(自定义)时,本参数应使用图形界面“填充图案选项板”上的“自定义”选项卡上的图案名称。我没自定义过填充图案,我的这个选项卡上也是一片空白,所以这个枚举值对我也是没有用的。 4)当第一个参数PatternType 是 AcGradientPatternType 枚举类型且其值为acPreDefinedGradient = 0(预定义)时,本参数为下列9个名称之一:" Y" C+ P! l' n7 t( U( u( L
1、"Linear"、2、"Cylinder"、3、"InvCylinder"、4、"Spherical"、5、"HemiSpherical"、6、"Curved"、7、"InvSpherical"、8、"InvHemiSpherical"、9、"InvCurved" ,对应图案如下: 5 I7 T! J5 z" U8 S3 d
5、第三参数: Associativity(是否关联) 参考如上右图 Boolean[布尔值]; 仅用于输入,TRUE: 图案填充为关联的。 FALSE: 图案填充为不关联的。 作用:当填充图案的边界发生变化时,填充的图案是否自动适应边界的变化。 省略时默认是FALSE(不关联,即不勾选)。但是第三参数仍然要定义变量,可以不赋值。
$ a( ]$ H. ?8 E& f0 e, j$ p% R U4 F8 r2 R4 ~ p* E& i0 H
" g1 ]' X: V$ t$ h+ q综上,第一个参数就取 0,第二个参数根据第四个参数的值取现有的图案填充名称或渐变名称,第四个参数决定第二参数的选择是图案填充还是渐变填充,图案名称必须是符合第四参数指定的类型中的图案名称。- K P$ G5 a- @' s% T
$ Z/ v, X ?" q8 Y7 ?+ R二、创建填充的步骤和要求 首先用 AddHatch 方法创建填充对象;紧接着用Hatch 对象的 AppendOuterLoop 方法明确外边界;如果填充内部有空白,还要用 AppendInnerLoop 方法添加内边界,有几个内边界就用几次。边界必须是封闭的。组成边界的多个图元之间必须是首尾相连的,换句话说,组成边界的多个图元之间不允许交叉,只允许且必须端点重合。 在实际测试中发现使用图案填充时,添加完外边界后刷新界面,然后添加内边界无效!但是渐变填充却没事! 内边界与外边界不许交叉,各个内边界之间也不许交叉。 内边界可以内部还有内边界,就是两个内边界“嵌套”组成环形。 内边界内部是否填充、嵌套的内边界怎样填充,可以用 Hatch 对象的 HatchStyle 属性(孤岛检测样式)来决定。可以在图形界面打开“特性”管理器,再选择一个有内边界的填充对象,在“特性”管理器中修改“孤岛检测样式”属性查看效果。 - Sub AddHatch方法()9 b) P8 I9 D- P) d. @/ I- I2 j
- Rem 语法:RetVal = Object.AddHatch(PatternType, PatternName, Associativity [, HatchObjectType])
; u! t2 O! e K0 X+ P6 W - Dim HatchObject As AcadHatch '定义填充图案对象; A8 B5 B0 Z9 s# p# b' j# U
- Rem 定义填充类型为长整型,取值为图案填充的0,1,2;渐变填充的0,1,一般就取0(CAD预定义). e8 `9 _9 ]4 l6 q5 u8 U: c
- Dim hatchtype As AcPatternType '参数4设置为图案填充的类型,参数4若是渐变填充,则定义为AcGradientPatternType类型
9 i6 F; P3 k5 `/ m/ N$ y - ' Dim hatchtype As AcGradientPatternType
4 ^7 E% t2 Y; x( }* i/ T0 g - Dim HatchName As String '定义图案名称为字符串类型
1 q. S3 h" z5 `+ t5 z - Dim HatchAssociativity As Boolean '定义关联类型为布尔值,取值为True表示关联,False表示非关联。/ d: J( s; U U
- Dim HObjectType As AcHatchObjectType '定义图案对象类型,取值为“图案填充-0”、“渐变填充-1”。省略默认为0., x7 _/ I. Z) A+ ]7 G# H
- ' \/ ?( c& `9 k9 R
- Rem 首先添加几个边界以备填充使用 f" X/ @$ H8 a6 p+ p7 D" H
- Dim L As AcadLWPolyline, cir1 As AcadCircle, cir2 As AcadCircle, CIR3 As AcadCircle '定义一个多段线和三个圆. \ K$ Z# J% m! f- Q: v, L
- Dim pts(11) As Double, P0(2) As Double, R As Double '定义多段线端点变量,圆心变量,半径变量/ p& L( L' B+ |; c, F
- pts(0) = 0: pts(1) = 0: pts(2) = 20: pts(3) = 15: pts(4) = 10: pts(5) = 30
( \7 D/ i3 A4 T4 y5 J8 } - pts(6) = 50: pts(7) = 50: pts(8) = 0: pts(9) = -70: pts(10) = -70: pts(11) = 32
" h- v3 @/ ]9 K - Set L = ThisDrawing.ModelSpace.AddLightWeightPolyline(pts)
8 z4 H, i/ O- i* H2 `* F - Update7 P- R1 ?& R1 ]" ]4 e% r7 M
- L.Closed = True '将多段线闭合7 p/ d3 @, I% O! ^3 X) `+ j
- Update
8 d3 v( U6 U: a - P0(0) = 0: P0(1) = 0: P0(2) = 0, Z# I; q0 l! Y# v
- R = 25
: p: u. K; _) m - Set cir1 = ThisDrawing.ModelSpace.AddCircle(P0, R)
; z* `- A9 D1 v% Z1 K7 l - Update
1 }$ u& _/ T) K8 f - R = 50
, V3 I: E2 g. k% A1 C$ w - Set cir2 = ThisDrawing.ModelSpace.AddCircle(P0, R): N' S( M2 D' }. ~6 ~
- Update
, h; S6 u) O: o Z/ z& u - R = 70# W# ]# }: I! z4 q0 |/ B
- Set CIR3 = ThisDrawing.ModelSpace.AddCircle(P0, R)
1 X( q: |; q Z! i/ L4 p - Update
1 g# m+ |1 t+ R2 ` -
4 d1 b9 E) M* a; K- D - Rem 接下来赋值图案填充变量,先复制第四参数,再赋值第一参数、第二参数、第三参数; [7 I8 C% g# s7 ~5 \: C
- HObjectType = 1 '写0也可以直接写acHatchObject,表示图案填充类型,都省略默认为0;写1也可以写成acGradientObject,表示渐变填充
! x6 P. T7 O9 g) X- o$ m: x - ' HObjectType = acGradientObject '也可以直接写1,表示渐变填充类型/ P0 s" W1 B8 r: |8 ^
- Rem 第一参数值英文名称太长,还是直接记住数字好了!' ]0 ~; P. G N) C' F3 O
- hatchtype = 0 'acHatchPatternTypePreDefined,参数太长,直接记住数字吧!' T$ B& U Q; D" |( O& h) G& s2 [
- ' HatchType = 1 'acHatchPatternTypeUserDefined6 p% M. A$ k# t: w1 a! ]
- ' HatchType = 2 'acHatchPatternTypeCustomDefined,第四参数为1时此参数无效!
3 R! X) N1 |& f8 p% h" ] - Rem 以下四类图案名称仅在第四参数=0时有效!每一类里有数个名称可用!
5 ?- n m$ h0 J* b - ' HatchName = "ANSI32": C; A1 E" @5 W z- b/ \
- ' HatchName = "ISO02W100" '此处的名字到底是什么?8 j0 B# }4 O; M# f4 L# {
- ' HatchName = "AR-HBONE"# h- |8 f( h4 }' K
- ' HatchName = "STARS" j3 H3 D- X7 s& j
- Rem 以下9种图案名称仅在第四参数=1时有效!表示渐变填充名称,只有这9个名称。+ S7 P$ J5 i5 j/ Z1 W0 Q
- ' HatchName = "Linear" '对应第1行第1列图案7 o* ^8 C. N2 @
- ' HatchName = "Cylinder" '对应第1行第2列图案
5 b7 i- F" V" t+ z+ i% N - ' HatchName = "InvCylinder" '对应第1行第3列图案 i7 e( M4 }" \: Z! f$ C
- HatchName = "Spherical" '对应第2行第1列图案
7 t; w c7 }$ ^0 k/ B - ' HatchName = "HemiSpherical" '对应第2行第2列图案
& U, {4 V9 S/ p - ' HatchName = "Curved" '对应第2行第3列图案3 K8 c) Q+ Y( n8 b+ o" t& k
- ' HatchName = "InvSpherical" '对应第3行第1列图案
# x: ? s* m3 [9 ?9 ^0 K - ' HatchName = "InvHemiSpherical" '对应第3行第2列图案. X2 H. M7 l: g" l: n4 W
- ' HatchName = "InvCurved" '对应第3行第3列图案2 S# Z/ W) _6 F
- Rem 第三参数一般设置为true(关联)6 v7 ~) G, `/ X4 Q
- ' HatchAssociativity = True '省略赋值时默认为False" q# f$ f- `4 {; z( h8 s6 X
- ' HatchAssociativity = False
% z/ O* ^& o4 q( Z. L5 k -
: d" X; g v1 c1 ~2 b5 ~8 Z0 \ - Rem 首先创建图案填充,然后创建图案外边界和内边界7 {5 V! F) i$ H& T# K
- Set HatchObject = ThisDrawing.ModelSpace.AddHatch(hatchtype, HatchName, HatchAssociativity, HObjectType)
& }3 m3 Q; K( O - ' Set HatchObject = ThisDrawing.ModelSpace.AddHatch(0, "ANSI32", True, 0) '也可以直接写参数值
9 F, v' G+ a9 ~ - Dim OUTLOOP(0) As AcadEntity '定义外边界为CAD实体类型
5 E8 Y2 L0 q" y$ P - Set OUTLOOP(0) = CIR3 '将cir1圆赋给外边界! {& c2 {4 @+ h$ J7 d
- HatchObject.AppendOuterLoop (OUTLOOP) '设置图案填充的外边界) n5 z% A4 y* q
- Update '添加内边界之前刷新界面,后续图案填充内边界添加无效!但是渐变填充可以!
6 r$ a1 W* _3 L* k1 @ - Dim INTLOOP(0) As AcadEntity '定义内边界为CAD实体类型
. }' |* n- m7 w - Set INTLOOP(0) = cir2 '将cir2圆赋给第一个内边界,如果内边界比外边界大,则出错!9 i G: c" q; f( a% r/ u8 A/ K
- HatchObject.AppendInnerLoop (INTLOOP) '设置图案填充的内边界' d2 b" }! f2 e! ^' O
- Update
. R. [$ s5 }1 i0 C, I/ E - Set INTLOOP(0) = L '将cir3圆赋给第二个内边界,同时设置两个内边界不好使!要一个一个设置, A+ ^4 w' u3 U6 I8 w! y1 G4 w
- HatchObject.AppendInnerLoop (INTLOOP) '设置图案填充的内边界
; T( n1 v5 O5 P& x) Q9 s. B - Update
# t J4 j0 z) n2 s - End Sub
复制代码
# s1 }& W7 Y7 P
2.11.02、创建图案填充的补充.zip
(11.2 KB, 下载次数: 12)
|