本帖最后由 kuangben8 于 2019-4-14 10:11 编辑
" d& k0 S& r1 a7 B/ q Z
3 p: S" R3 [% m# E关于创建图案填充的补充:(非常感谢woaishuijia老师的热心帮助,以下是老师的帮助文档+我的一点总结)一、关于 AddHatch方法的参数 1、在2002版及以前,AutoCAD 只有图案填充,那时的AddHatch 方法只有三个参数,即 PatternType(图案类型)、PatternName(图案名称)和 Associativity(关联性);到2004版,增加了渐变填充, AddHatch 方法就增加了第四个参数 HatchObjectType(填充对象类型)。 2、先说第四个参数 HatchObjectType(填充对象类型) 先说它的原因是它的值决定了第一个参数的用法。按我们通常的思维习惯,它本来应该是第一个参数,但由于是后增加的,所以排在了第四个。 这个参数为 AcHatchObjectType 枚举类型。如果使用变量,应这样声明 Dim ** As AcHatchObjectType 这个枚举共有两个值: 1、acHatchObject= 0(图案填充):表示选择填充样式为图案填充!对应填充界面如下
s3 ]4 V b0 M9 [/ {9 p% F2、acGradientObject= 1(渐变填充):表示选择填充样式为渐变填充!对应填充界面如下 . @0 ^2 n) _( G P
7 W/ o) e% N( ]
这个参数是可选的,默认值为 0(acHatchObject,图案填充)。
5 `# X4 A; M6 V. T' x/ [
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)”下拉列表(见图)。. ^" F* q, J, O2 L9 B
; B8 I1 J/ M4 W# U, E6 X& g3 L# |# U+ W" p7 V! q8 @' R6 U
2)AcGradientPatternType 枚举类型。如果使用变量,应这样声明 Dim ** As AcGradientPatternType 这个枚举共有两个值: acPreDefinedGradient = 0(预定义) acUserDefinedGradient = 1(用户定义) 第一个值容易理解;第二个值E文是这样说的:Definesa pattern based on property values. 翻译:基于属性值定义模式。比较费解。经多次尝试,出错的提示总是“尚未实现”,且图形界面“图案填充和渐变色”对话框中也没有对应的选项。猜想这是为 AutoCAD 为今后的渐变填充改进预留的,就是说这个枚举目前只能用 acPreDefinedGradient = 0(预定义)值。 ' M; _0 P- f0 z u5 W! r# r7 N
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个名称之一: T }' ?1 C, d5 c$ \- I4 z2 @. [. [
1、"Linear"、2、"Cylinder"、3、"InvCylinder"、4、"Spherical"、5、"HemiSpherical"、6、"Curved"、7、"InvSpherical"、8、"InvHemiSpherical"、9、"InvCurved" ,对应图案如下:
! t+ x& @0 s( T7 }- m/ y5 N5、第三参数: Associativity(是否关联) 参考如上右图 Boolean[布尔值]; 仅用于输入,TRUE: 图案填充为关联的。 FALSE: 图案填充为不关联的。 作用:当填充图案的边界发生变化时,填充的图案是否自动适应边界的变化。 省略时默认是FALSE(不关联,即不勾选)。但是第三参数仍然要定义变量,可以不赋值。 0 T: \6 c! c! @8 L
- j" ^. l( {5 I. I: r4 @" [! d
2 L/ W( {6 }+ {- w7 b$ C3 I% E& j& v
综上,第一个参数就取 0,第二个参数根据第四个参数的值取现有的图案填充名称或渐变名称,第四个参数决定第二参数的选择是图案填充还是渐变填充,图案名称必须是符合第四参数指定的类型中的图案名称。/ m1 j# ~/ _+ l* F/ k/ ~% D
: e( Z: h4 N! f! Y7 d$ d二、创建填充的步骤和要求 首先用 AddHatch 方法创建填充对象;紧接着用Hatch 对象的 AppendOuterLoop 方法明确外边界;如果填充内部有空白,还要用 AppendInnerLoop 方法添加内边界,有几个内边界就用几次。边界必须是封闭的。组成边界的多个图元之间必须是首尾相连的,换句话说,组成边界的多个图元之间不允许交叉,只允许且必须端点重合。 在实际测试中发现使用图案填充时,添加完外边界后刷新界面,然后添加内边界无效!但是渐变填充却没事! 内边界与外边界不许交叉,各个内边界之间也不许交叉。 内边界可以内部还有内边界,就是两个内边界“嵌套”组成环形。 内边界内部是否填充、嵌套的内边界怎样填充,可以用 Hatch 对象的 HatchStyle 属性(孤岛检测样式)来决定。可以在图形界面打开“特性”管理器,再选择一个有内边界的填充对象,在“特性”管理器中修改“孤岛检测样式”属性查看效果。 - Sub AddHatch方法(), j% v: K3 A8 Y& f$ l
- Rem 语法:RetVal = Object.AddHatch(PatternType, PatternName, Associativity [, HatchObjectType]) I, i7 z7 n" Z& k0 N
- Dim HatchObject As AcadHatch '定义填充图案对象6 [7 `: x1 O- Q
- Rem 定义填充类型为长整型,取值为图案填充的0,1,2;渐变填充的0,1,一般就取0(CAD预定义)
7 r- D! K; s( V4 D, {0 F - Dim hatchtype As AcPatternType '参数4设置为图案填充的类型,参数4若是渐变填充,则定义为AcGradientPatternType类型
- m4 ?# R* K9 l, e. _4 R4 f$ b" t - ' Dim hatchtype As AcGradientPatternType$ A5 T! B' G }7 B
- Dim HatchName As String '定义图案名称为字符串类型 {% K! l5 _, m1 C
- Dim HatchAssociativity As Boolean '定义关联类型为布尔值,取值为True表示关联,False表示非关联。
T: Q7 ~& e0 h3 c7 G, [ - Dim HObjectType As AcHatchObjectType '定义图案对象类型,取值为“图案填充-0”、“渐变填充-1”。省略默认为0.
$ d9 C9 X6 C/ l! V1 l1 l
w; N- a* _: j7 V% k- Rem 首先添加几个边界以备填充使用
! o8 ^3 n. a6 X - Dim L As AcadLWPolyline, cir1 As AcadCircle, cir2 As AcadCircle, CIR3 As AcadCircle '定义一个多段线和三个圆
, v) ^8 [* }/ l- m2 V& y! p - Dim pts(11) As Double, P0(2) As Double, R As Double '定义多段线端点变量,圆心变量,半径变量
+ l- d0 S4 `+ Z+ ?2 w7 K - pts(0) = 0: pts(1) = 0: pts(2) = 20: pts(3) = 15: pts(4) = 10: pts(5) = 30
8 `/ v0 w0 w6 t% I - pts(6) = 50: pts(7) = 50: pts(8) = 0: pts(9) = -70: pts(10) = -70: pts(11) = 32
8 I% a( u W$ m4 ~ - Set L = ThisDrawing.ModelSpace.AddLightWeightPolyline(pts)/ T4 h. L3 x9 n0 t; R s" j7 U, i
- Update1 C+ C1 U, p! e) \ @) M0 c
- L.Closed = True '将多段线闭合
}; k: s4 ~1 f) v - Update3 x5 H3 ^1 k2 Y
- P0(0) = 0: P0(1) = 0: P0(2) = 0 q+ m# R4 K$ n8 |
- R = 25
% L: I4 T# K: x' y0 o - Set cir1 = ThisDrawing.ModelSpace.AddCircle(P0, R)3 `; Q. ]( k/ N- }$ j! M0 W( G
- Update
/ S q0 W( ]; N. T4 ]$ a - R = 50
4 B" b* E! \. h3 E! @; w - Set cir2 = ThisDrawing.ModelSpace.AddCircle(P0, R)
' K; v* z5 e. I5 J# K. A - Update
+ T; w R6 o. o! y$ _3 b' f - R = 70( N" H* R2 W' \( }# L% Q) B' M
- Set CIR3 = ThisDrawing.ModelSpace.AddCircle(P0, R)/ i/ T. F9 X3 a% l7 [6 p
- Update: X) j* P3 g2 j( f2 _' D
-
( O5 I$ X0 u4 H9 J - Rem 接下来赋值图案填充变量,先复制第四参数,再赋值第一参数、第二参数、第三参数
0 X# O1 [' x$ Q3 e' c; v - HObjectType = 1 '写0也可以直接写acHatchObject,表示图案填充类型,都省略默认为0;写1也可以写成acGradientObject,表示渐变填充4 j# ?0 X# ? j; s4 m
- ' HObjectType = acGradientObject '也可以直接写1,表示渐变填充类型4 b6 t- u( h- c, t
- Rem 第一参数值英文名称太长,还是直接记住数字好了!. b3 J. R5 s* N! a" G7 K* K* l
- hatchtype = 0 'acHatchPatternTypePreDefined,参数太长,直接记住数字吧!* d# m% p: O W' C5 B
- ' HatchType = 1 'acHatchPatternTypeUserDefined
0 c# x+ R- ?9 K! S# o3 n - ' HatchType = 2 'acHatchPatternTypeCustomDefined,第四参数为1时此参数无效!2 G! |& C0 _8 X3 K& j6 n* }
- Rem 以下四类图案名称仅在第四参数=0时有效!每一类里有数个名称可用!
* T& @6 F3 \# ?) t8 q' I6 j - ' HatchName = "ANSI32"
. U8 z, b- i+ E - ' HatchName = "ISO02W100" '此处的名字到底是什么?
# a; Q: a& J7 e" O$ J - ' HatchName = "AR-HBONE"
" ?) R8 J( A8 M4 E - ' HatchName = "STARS"
' A) y' b* ^- f6 a, G- U - Rem 以下9种图案名称仅在第四参数=1时有效!表示渐变填充名称,只有这9个名称。
# v7 v6 p' S9 O. t - ' HatchName = "Linear" '对应第1行第1列图案, r6 y5 {1 d/ Y; S: Z# `: g$ P6 w
- ' HatchName = "Cylinder" '对应第1行第2列图案
7 f9 R! ~! T$ a; o8 O5 W - ' HatchName = "InvCylinder" '对应第1行第3列图案; [3 i+ \: c, t. a/ M' Y3 p
- HatchName = "Spherical" '对应第2行第1列图案
" _6 S- V1 A _! P/ P - ' HatchName = "HemiSpherical" '对应第2行第2列图案
; y% {' x& P" A1 i. W3 c - ' HatchName = "Curved" '对应第2行第3列图案! F6 e1 S3 K$ _7 C
- ' HatchName = "InvSpherical" '对应第3行第1列图案
7 w! ?% \5 E7 e9 ` - ' HatchName = "InvHemiSpherical" '对应第3行第2列图案
1 S1 |% Z6 I+ T8 W5 l d - ' HatchName = "InvCurved" '对应第3行第3列图案
. P8 }( r' d2 O; S. Y - Rem 第三参数一般设置为true(关联)
Z2 I7 F/ t. R6 R& @ - ' HatchAssociativity = True '省略赋值时默认为False9 u) t( {; U" V4 B( @
- ' HatchAssociativity = False! `, f% I$ I. c0 E% P8 s$ C
- , H2 |' _/ _3 Z% K! C: B, h
- Rem 首先创建图案填充,然后创建图案外边界和内边界
6 G: `! Q+ v% w+ W - Set HatchObject = ThisDrawing.ModelSpace.AddHatch(hatchtype, HatchName, HatchAssociativity, HObjectType)
: @& O) A$ j1 W/ k - ' Set HatchObject = ThisDrawing.ModelSpace.AddHatch(0, "ANSI32", True, 0) '也可以直接写参数值
9 \% U- \5 z9 D) B - Dim OUTLOOP(0) As AcadEntity '定义外边界为CAD实体类型; P( `2 ^, h) k8 y
- Set OUTLOOP(0) = CIR3 '将cir1圆赋给外边界0 J9 S2 Q3 Q Z/ N
- HatchObject.AppendOuterLoop (OUTLOOP) '设置图案填充的外边界; X/ g3 W8 `( n0 w. i
- Update '添加内边界之前刷新界面,后续图案填充内边界添加无效!但是渐变填充可以!) K' M7 ~+ W+ ~2 R4 j, \
- Dim INTLOOP(0) As AcadEntity '定义内边界为CAD实体类型
, u4 _& {4 T% m# C - Set INTLOOP(0) = cir2 '将cir2圆赋给第一个内边界,如果内边界比外边界大,则出错!
o0 a6 z, P! t) ]% Q - HatchObject.AppendInnerLoop (INTLOOP) '设置图案填充的内边界1 g4 O4 O y) ^9 I% x
- Update# a0 e% _) G X! O. u
- Set INTLOOP(0) = L '将cir3圆赋给第二个内边界,同时设置两个内边界不好使!要一个一个设置: R# B; h4 K( q2 Y4 T, Q3 t: P* A
- HatchObject.AppendInnerLoop (INTLOOP) '设置图案填充的内边界! o7 t% O& D6 {# p, V
- Update' y: F. T& b2 V* j
- End Sub
复制代码
6 H1 a+ U5 [1 T3 _! V* u
2.11.02、创建图案填充的补充.zip
(11.2 KB, 下载次数: 8)
|