本帖最后由 kuangben8 于 2019-4-14 10:11 编辑 9 Y) C/ ~4 N0 O) S6 a: e5 m
5 e+ ~& j: c" M0 o6 b关于创建图案填充的补充:(非常感谢woaishuijia老师的热心帮助,以下是老师的帮助文档+我的一点总结)一、关于 AddHatch方法的参数 1、在2002版及以前,AutoCAD 只有图案填充,那时的AddHatch 方法只有三个参数,即 PatternType(图案类型)、PatternName(图案名称)和 Associativity(关联性);到2004版,增加了渐变填充, AddHatch 方法就增加了第四个参数 HatchObjectType(填充对象类型)。 2、先说第四个参数 HatchObjectType(填充对象类型) 先说它的原因是它的值决定了第一个参数的用法。按我们通常的思维习惯,它本来应该是第一个参数,但由于是后增加的,所以排在了第四个。 这个参数为 AcHatchObjectType 枚举类型。如果使用变量,应这样声明 Dim ** As AcHatchObjectType 这个枚举共有两个值: 1、acHatchObject= 0(图案填充):表示选择填充样式为图案填充!对应填充界面如下
" G' a' w2 t6 f& i. P6 O' m2、acGradientObject= 1(渐变填充):表示选择填充样式为渐变填充!对应填充界面如下
3 l, w5 A* m# Y8 Z0 X' Z
2 `2 A5 ^9 r7 J4 \这个参数是可选的,默认值为 0(acHatchObject,图案填充)。 5 \$ G5 d; }. A1 |) v6 N- A
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)”下拉列表(见图)。 V/ W1 L5 J9 `7 Q' a x
% X4 V# m p* k: z3 q+ `
( ?2 } E! _5 _0 C9 f! l( l2)AcGradientPatternType 枚举类型。如果使用变量,应这样声明 Dim ** As AcGradientPatternType 这个枚举共有两个值: acPreDefinedGradient = 0(预定义) acUserDefinedGradient = 1(用户定义) 第一个值容易理解;第二个值E文是这样说的:Definesa pattern based on property values. 翻译:基于属性值定义模式。比较费解。经多次尝试,出错的提示总是“尚未实现”,且图形界面“图案填充和渐变色”对话框中也没有对应的选项。猜想这是为 AutoCAD 为今后的渐变填充改进预留的,就是说这个枚举目前只能用 acPreDefinedGradient = 0(预定义)值。 ! s$ f" ?7 c: j: m5 |
4、第二个参数 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个名称之一:& i1 s6 P- S F8 ]3 ?
1、"Linear"、2、"Cylinder"、3、"InvCylinder"、4、"Spherical"、5、"HemiSpherical"、6、"Curved"、7、"InvSpherical"、8、"InvHemiSpherical"、9、"InvCurved" ,对应图案如下: / k0 w+ R6 {3 f9 n5 x, |/ \
5、第三参数: Associativity(是否关联) 参考如上右图 Boolean[布尔值]; 仅用于输入,TRUE: 图案填充为关联的。 FALSE: 图案填充为不关联的。 作用:当填充图案的边界发生变化时,填充的图案是否自动适应边界的变化。 省略时默认是FALSE(不关联,即不勾选)。但是第三参数仍然要定义变量,可以不赋值。
" d1 s$ s1 Z6 ` e: C
6 k% l% A- q( l* V0 W- R& e: l. A/ ~3 U5 X
综上,第一个参数就取 0,第二个参数根据第四个参数的值取现有的图案填充名称或渐变名称,第四个参数决定第二参数的选择是图案填充还是渐变填充,图案名称必须是符合第四参数指定的类型中的图案名称。
) [; q D) H5 V" a& t
/ h! g4 A* V; v- V& Z/ s二、创建填充的步骤和要求 首先用 AddHatch 方法创建填充对象;紧接着用Hatch 对象的 AppendOuterLoop 方法明确外边界;如果填充内部有空白,还要用 AppendInnerLoop 方法添加内边界,有几个内边界就用几次。边界必须是封闭的。组成边界的多个图元之间必须是首尾相连的,换句话说,组成边界的多个图元之间不允许交叉,只允许且必须端点重合。 在实际测试中发现使用图案填充时,添加完外边界后刷新界面,然后添加内边界无效!但是渐变填充却没事! 内边界与外边界不许交叉,各个内边界之间也不许交叉。 内边界可以内部还有内边界,就是两个内边界“嵌套”组成环形。 内边界内部是否填充、嵌套的内边界怎样填充,可以用 Hatch 对象的 HatchStyle 属性(孤岛检测样式)来决定。可以在图形界面打开“特性”管理器,再选择一个有内边界的填充对象,在“特性”管理器中修改“孤岛检测样式”属性查看效果。 - Sub AddHatch方法()* s' h& y4 q3 c5 v% {& t) W
- Rem 语法:RetVal = Object.AddHatch(PatternType, PatternName, Associativity [, HatchObjectType])& O! s% v+ h% P/ M Q- ]
- Dim HatchObject As AcadHatch '定义填充图案对象* e* t& R' r( a7 y' [
- Rem 定义填充类型为长整型,取值为图案填充的0,1,2;渐变填充的0,1,一般就取0(CAD预定义)
* _* o; c5 D/ t2 n# M# G' b. J' y - Dim hatchtype As AcPatternType '参数4设置为图案填充的类型,参数4若是渐变填充,则定义为AcGradientPatternType类型" x+ _1 k. Q1 u
- ' Dim hatchtype As AcGradientPatternType& O) S6 B9 H7 F$ d. \' {
- Dim HatchName As String '定义图案名称为字符串类型5 ?$ E4 B3 W1 ]; h2 x2 u2 k. d2 v8 r
- Dim HatchAssociativity As Boolean '定义关联类型为布尔值,取值为True表示关联,False表示非关联。+ w5 k2 Q% X! z+ g; y
- Dim HObjectType As AcHatchObjectType '定义图案对象类型,取值为“图案填充-0”、“渐变填充-1”。省略默认为0.
q+ @8 E+ R, C9 _6 Q( A: ]) F - 2 j$ N6 h2 ?1 Z# r
- Rem 首先添加几个边界以备填充使用7 P( `: n9 g' O6 n: X8 Z
- Dim L As AcadLWPolyline, cir1 As AcadCircle, cir2 As AcadCircle, CIR3 As AcadCircle '定义一个多段线和三个圆% L. u6 ]* r# F/ f
- Dim pts(11) As Double, P0(2) As Double, R As Double '定义多段线端点变量,圆心变量,半径变量
: I/ x* Q! }% B- ~/ w$ t - pts(0) = 0: pts(1) = 0: pts(2) = 20: pts(3) = 15: pts(4) = 10: pts(5) = 306 q ^8 p O1 F1 Y% X3 X6 b
- pts(6) = 50: pts(7) = 50: pts(8) = 0: pts(9) = -70: pts(10) = -70: pts(11) = 321 b3 l7 r! H |2 h( G$ f
- Set L = ThisDrawing.ModelSpace.AddLightWeightPolyline(pts)
; o$ q0 @# U( d5 ~7 l - Update
5 T2 V' p7 K0 q2 [; j4 o7 N - L.Closed = True '将多段线闭合& a; S0 r, J6 u [
- Update
9 S A p: n% O: d: _/ B - P0(0) = 0: P0(1) = 0: P0(2) = 05 B# T) p+ C* I3 P* `/ B9 t# e
- R = 25
, B# T! w. y) B2 W - Set cir1 = ThisDrawing.ModelSpace.AddCircle(P0, R)( [1 E# Q6 {4 R3 g' C
- Update
$ R: M! x2 v3 c* a* x - R = 50
. ?( J3 @- x: h7 Y- p& W( e- K6 T - Set cir2 = ThisDrawing.ModelSpace.AddCircle(P0, R)9 t2 h( @7 B8 v, K* b% {
- Update' p; c3 {' W( @3 _* X
- R = 70
4 {3 a1 I4 X& k. I9 x - Set CIR3 = ThisDrawing.ModelSpace.AddCircle(P0, R)+ H* t/ w( E5 P9 r; v& i
- Update: B! r$ n c) s7 K2 P, n; t( r
-
0 q; u: W) n5 \ n - Rem 接下来赋值图案填充变量,先复制第四参数,再赋值第一参数、第二参数、第三参数/ B7 G W! C) T' z$ d4 V
- HObjectType = 1 '写0也可以直接写acHatchObject,表示图案填充类型,都省略默认为0;写1也可以写成acGradientObject,表示渐变填充
& l$ F+ k9 E* Q r m7 a8 T8 h, @ - ' HObjectType = acGradientObject '也可以直接写1,表示渐变填充类型
4 E( @ a! k7 ?0 W1 ~ - Rem 第一参数值英文名称太长,还是直接记住数字好了!
6 [$ V9 S. f0 | - hatchtype = 0 'acHatchPatternTypePreDefined,参数太长,直接记住数字吧!
$ e+ E6 p% b1 q# x1 `4 _, _4 D - ' HatchType = 1 'acHatchPatternTypeUserDefined
9 F t0 R3 O4 Y0 |9 B F0 U - ' HatchType = 2 'acHatchPatternTypeCustomDefined,第四参数为1时此参数无效!
) n1 ^/ A: v; Q( q F" C. @& j. q/ K - Rem 以下四类图案名称仅在第四参数=0时有效!每一类里有数个名称可用!
, i- K* _1 u# Q2 B1 P5 X" y - ' HatchName = "ANSI32"
1 J5 k5 R* b1 z ?5 k' T5 p$ m3 r - ' HatchName = "ISO02W100" '此处的名字到底是什么?: \$ x6 [3 Z0 l G5 O3 M. M+ d
- ' HatchName = "AR-HBONE"& T2 u$ j" t+ H' |/ v
- ' HatchName = "STARS"
7 ] ~) z! F! q3 t B, p* c - Rem 以下9种图案名称仅在第四参数=1时有效!表示渐变填充名称,只有这9个名称。
6 X4 h+ S1 S4 P2 ~* q) y& s1 |# d - ' HatchName = "Linear" '对应第1行第1列图案! A0 I& h& P0 U+ w8 x$ o1 x, V
- ' HatchName = "Cylinder" '对应第1行第2列图案
- ?' c1 s# b4 V) h8 |+ @# u/ Y* j - ' HatchName = "InvCylinder" '对应第1行第3列图案3 N6 T+ Z0 ~/ ?
- HatchName = "Spherical" '对应第2行第1列图案) K. u+ m% r% ?" C6 E
- ' HatchName = "HemiSpherical" '对应第2行第2列图案% g' e' n* b6 v- Y
- ' HatchName = "Curved" '对应第2行第3列图案' v* g5 L8 h; V) C% P
- ' HatchName = "InvSpherical" '对应第3行第1列图案
& @3 P$ H( x2 B/ ]6 w$ U - ' HatchName = "InvHemiSpherical" '对应第3行第2列图案* d) W4 t J- r# p, ^+ y
- ' HatchName = "InvCurved" '对应第3行第3列图案! _- o' z1 o0 s& Q. w ^
- Rem 第三参数一般设置为true(关联)
7 b4 P0 j2 h% N - ' HatchAssociativity = True '省略赋值时默认为False" [$ f/ @& B, c
- ' HatchAssociativity = False: F. V' R ?5 b% H5 B
-
( ^, Q3 m1 |- D+ q" B - Rem 首先创建图案填充,然后创建图案外边界和内边界
. x% q8 q+ t# h0 D* m5 L+ H% s - Set HatchObject = ThisDrawing.ModelSpace.AddHatch(hatchtype, HatchName, HatchAssociativity, HObjectType)
& l3 K- T4 q5 Q( g - ' Set HatchObject = ThisDrawing.ModelSpace.AddHatch(0, "ANSI32", True, 0) '也可以直接写参数值
5 h; O+ b0 i4 D \ - Dim OUTLOOP(0) As AcadEntity '定义外边界为CAD实体类型6 G H; W" m- d: S8 L0 E, d- e U
- Set OUTLOOP(0) = CIR3 '将cir1圆赋给外边界
+ y" N& x- p- G2 @- y; ~ - HatchObject.AppendOuterLoop (OUTLOOP) '设置图案填充的外边界
: b. ]) w8 C1 S% U: ~7 x; m* O - Update '添加内边界之前刷新界面,后续图案填充内边界添加无效!但是渐变填充可以!
8 [# ~: W/ N# k7 U1 k5 _$ D - Dim INTLOOP(0) As AcadEntity '定义内边界为CAD实体类型
" i8 O7 X; W% ^: ?2 u4 q - Set INTLOOP(0) = cir2 '将cir2圆赋给第一个内边界,如果内边界比外边界大,则出错!
9 E \' F- i0 u& \9 v. V( A" | - HatchObject.AppendInnerLoop (INTLOOP) '设置图案填充的内边界5 Z" O& `" d# q4 D5 S1 p: l$ V
- Update/ [5 Q7 |+ W; z7 T
- Set INTLOOP(0) = L '将cir3圆赋给第二个内边界,同时设置两个内边界不好使!要一个一个设置/ o" `8 s% i' J( h( N
- HatchObject.AppendInnerLoop (INTLOOP) '设置图案填充的内边界/ H5 c5 h5 V0 e6 f( K- q! d
- Update
! }5 g" N8 C/ f9 L( Z - End Sub
复制代码
y: d0 ~+ L- L4 x9 D& N
2.11.02、创建图案填充的补充.zip
(11.2 KB, 下载次数: 10)
|