QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 版主微信号:caivin811031;还未入三维微信群的小伙伴,速度加
2022-07-04
全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
楼主: kuangben8
收起左侧

[分享] 分享学习AutoCAD编程之VBA笔记 (期初完结!)

[复制链接]
 楼主| 发表于 2019-3-29 19:31:00 | 显示全部楼层
12、很有用的Utility对象/ M) z: f; s+ o8 W0 E
2 {. \4 K4 z) t: o
AUtility对象
提供一系列实用工具方法,VBA类名AcadUtility,访问途径:Thisdrawing.Utility
  方法  
对应作用
AngleFromXAxis  
获取直线与 X 坐标轴的夹角。
AngleToReal  
将角度从字符串转换为双精度实数值。
AngleToString  
将角度从双精度实数值转换为字符串。
CreateTypedArray  
创建包含一组各种参数的变体。
DistanceToReal  
将距离由字符串转换为实数(双精度)值。
GetAngle  
获取指定的角度。考虑 ANGBASE 系统变量的设置。
GetCorner  
获取矩形的角点。
GetDistance  
获取由提示行或由屏幕上选定的一组点的距离
GetEntity  
以交互方式获取对象。
GetInput  
将用户输入的字符串转换为关键词索引。
GetInteger  
从用户处获取整数值。
GetKeyword  
从用户处获取关键词字符串。
GetOrientation  
获取指定角度。忽略 ANGBASE 系统变量的设置。
GetPoint  
获取  AutoCAD 中选定的点。
GetReal  
从用户获取双精度实数值。
GetRemoteFile  
下载由URL指定的文件。
GetString  
从用户获取字符串。
GetSubEntity  
以交互方式获取对象或子图元。
InitializeUserInput  
初始化 GetKeyword 方法。
IsRemoteFile  
返回下载远程文件的源 URL。
IsURL  
验证给定的URL。
LaunchBrowserDialog  
启动  Web 浏览器窗口,允许用户导航到任意 URL 并可指定  URL。
PolarPoint  
获取与给定点指定角度和距离的点。
Prompt  
向命令行发送提示。
PutRemoteFile  
将文件上载到由 URL 指定的远程位置。
RealToString  
将双精度实数值转换为字符串。
SendModelessOperationEnded
指出非模态操作已经结束。
SendModelessOperationStart  
指出非模态操作即将开始。
TranslateCoordinates   
将点从一个坐标系转换到另一个坐标系。

5 V' z* G) [- H" E3 m
  属性  
对应作用
Application
获取  Application 对象。

6 }) h9 [% G3 q8 R8 X4 w
/ K: N8 m  f2 x8 A6 P2 w# G
9 s% u' e8 ?1 h8 x) v
6 W, z6 T- e1 Z$ U+ d0 X* R2 m, t
 楼主| 发表于 2019-3-29 19:36:05 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-29 19:38 编辑 ! e: }# L& J5 }% @! D4 l
* l6 G5 D4 S' @" Z% A. o) `
B. AngleFromXAxis方法
RetVal = AngleFromXAxis(Point1, Point2)
Point1Point2 分别是起点和终点。RetVal是以弧度值表示的线的角度。
  1. Sub AngleFromXAxis方法()) e4 v1 Y9 u4 s$ d, r7 @% N
  2.     Dim p1(2) As Double, p2(2) As Double5 G+ c: d0 l5 Y
  3.     Dim angle As Double, V4 J2 d- W" Z0 S5 E& x
  4.     p1(0) = 10: p1(1) = 106 v! J: v& b$ h$ _* x$ G6 W* t# h! S
  5.     p2(0) = 60: p2(1) = 90* v$ e9 t: {% U2 J( p$ o" U& M
  6. angle = ThisDrawing.Utility.AngleFromXAxis(p1, p2)6 ]  [& T' ~! E: c
  7. angle = ThisDrawing.Utility.AngleFromXAxis(p2, p1)5 J5 p- a4 D* r+ w& K
  8.     Rem 可以不用画直线而直接获得两点对应直线的角度,注意起点不同的相同直线角度也不同。
    # ?5 v% N  D  x, Q
  9. End Sub
复制代码

3 V5 |1 _& {2 v( _C.AngleToReal方法
RetVal = AngleToReal(Angle, Unit)
AngleString[字符串]; 仅用于输入,以字符串值表示的角度。
UnitAcAngleUnits 常数; 仅用于输入需要转换到的单位。
acDegrees 角度字符串转为弧度值   
acDegreeMinuteSeconds 度分秒字符串转换为弧度值
acGrads 梯度字符串转换为弧度值                     
acRadians 弧度字符串转换为弧度值

" w, M8 A4 l2 B5 n! y
RetVal以弧度实数表示的角度。
  1. Sub AngleToReal方法()- a5 B+ p1 q! J8 o, Y5 |: D
  2.     Dim angAsStr As String
    ) {- @5 d% d$ ~8 V# R
  3.     Dim unit As Integer4 u# C3 ]* m; e  n% w! o. T1 k
  4.     Dim angAsReal As Double6 X$ N" }0 L9 g) @
  5.     : _! P8 v- ^% U
  6.     angAsStr = "180"
    ) D; y8 ?4 I% d9 g
  7.     unit = acDegrees   '角度转弧度2 N) q' g; l: h/ K/ \3 Q
  8.     angAsReal = ThisDrawing.Utility.AngleToReal(angAsStr, unit)' l* Y+ p: v- x
  9.     MsgBox "180°转为弧度是 " & angAsReal & " 弧度", , "AngleAsReal 示例"
    + l: [( f: k2 T) o/ F
  10. 6 D3 G- \3 g" n. F" X! C  r
  11.     angAsStr = "180d0' 0"""% V9 w7 i$ A2 Z  s
  12.     unit = acDegreeMinuteSeconds '度分秒转换为弧度
    " Z3 K7 |, c) {. e2 K
  13.     angAsReal = ThisDrawing.Utility.AngleToReal(angAsStr, unit)
    3 w6 p1 n- [' [& Q1 R% f( [7 f
  14.     MsgBox "180°0’0""转换为弧度是 " & angAsReal & " 弧度", , "AngleAsReal 示例"/ D& E6 ?7 z- i; E
  15.     % T2 a! ?% u8 O/ [+ Y
  16.     ' 下面是以梯度单位给出的角度转换为弧度
    6 o/ V7 P5 B5 f6 f
  17.     angAsStr = "90"4 P- d0 C; a+ F* N& I) k, U
  18.     unit = acGrads" U4 [9 Q# B# V! v
  19.     angAsReal = ThisDrawing.Utility.AngleToReal(angAsStr, unit)
    ; k" a, ^- B9 d4 ~
  20.     MsgBox "90梯度转换为弧度是" & angAsReal & " radians.", , "AngleAsReal 示例"; i7 x  B. U3 [$ u
  21.    
    . h9 o  |! ~+ |9 b8 z! I8 {$ a' l
  22.     '下面是将弧度字符串转换为弧度
    1 Y2 l9 ~9 K7 k" \
  23.     angAsStr = "3.1415926535897932"
    3 p7 p8 Y' K& o- s
  24.     unit = acRadians
    9 |1 L" P) f! P$ R7 x- K
  25.     angAsReal = ThisDrawing.Utility.AngleToReal(angAsStr, unit)8 b7 \; J( h0 m! a
  26.     MsgBox "π弧度转换为弧度是" & angAsReal & " radians.", , "AngleAsReal 示例"" o& |+ H. K, I) L4 i% i
  27.     . a& H0 W2 X2 _  B
  28. End Sub
    / b* W% O5 N/ i% }4 a2 \' A2 K
复制代码
! P8 U+ s4 V# R- O( @" r% [- M
D.AngleToString方法
RetVal = AngleToString(Angle, Unit,Precision)
Angledouble类型,用于输入的值
UnitAcAngleUnits 单位常数; 仅用于输入
acDegrees 将角度值转为字符串
acDegreeMinuteSeconds 将度分秒值转换字符串
acGrads 将梯度值转为字符串
acRadians 将弧度值转为字符串
PrecisionInteger[整数]; 仅用于输入,角度的精度。在 0 8 之间的整数。
$ s' R0 E9 c* p
ReVal以字符串表示的角度
  1. Sub AngleToString方法()
    ; o) g+ B8 M- |& t3 o
  2. '此示例将弧度值转换为几个不同的以不同单位表示值的字符串。
    - Y5 e% V4 u" y7 ]6 C+ s) ]
  3.     Dim angAsRad As Double. v  q8 M- R8 B+ q6 S+ `6 R, @. R
  4.     Dim unit As Integer
    4 I5 c5 o# G- H' R  m, |
  5.     Dim precision As Long& u8 V" [' d3 f5 @
  6.     Dim angAsString As String
    ' q# v" S) _6 g3 _& W. I+ q
  7.     angAsRad = 3.14159265358979    '以π弧度为例
    . U3 K/ ]3 d4 b$ ~  g
  8.     unit = acDegrees   '将弧度表示的角度转换为字符串
    : X* T) b! Z2 e3 |( Z
  9.     precision = 6
    * K+ b8 J4 W) K& X1 G5 C: d
  10.    
    8 j4 I0 j8 E" Z' U' s+ |; l! Y9 P( o
  11.     '将弧度值转换为精度为6的度数
    * v! g/ T8 V( ?; b6 k6 v
  12.     angAsString = ThisDrawing.Utility.AngleToString(angAsRad, unit, precision)    '结果是 "180" 。% Z( Z- b/ d" Y( C" F6 G, O$ \
  13.     MsgBox "π弧度= " & angAsString & " 度", , "AngleAsString 示例"
    1 _- o  b+ n2 O. D
  14.    
    , l# W1 _7 [+ n" X
  15.     ' 将弧度值转换为度/分/秒,精度为6
    1 C1 ]6 z" D1 y2 Y
  16.     unit = acDegreeMinuteSeconds3 u* M' A+ N: f
  17.     angAsString = ThisDrawing.Utility.AngleToString(angAsRad, unit, precision)     '结果是 "180d0'0.00"" 。
    4 E5 u) K9 {* O, P/ B* p+ b0 [
  18.     MsgBox "π弧度 =  " & angAsString, , "AngleAsString 示例"
    7 M* G3 M* @4 i% H' P
  19.     % K) @! ]0 \6 }1 t* _
  20.     '将弧度值转换为精度为6的梯度值字符串
    0 H. B" s* B9 T5 ^+ ]
  21.     unit = acGrads$ ~7 @) m! F3 y5 S
  22.     angAsString = ThisDrawing.Utility.AngleToString(angAsRad, unit, precision)    '结果是 "200g" 。# P: @' R" F& l' z6 |; O
  23.     MsgBox "π弧度=  " & angAsString, , "AngleAsString 示例"
    : K6 F$ j# c+ _1 e  m& [
  24.       @0 T9 y$ P+ |! }3 A- q
  25.     '将弧度值转换为精度为6的弧度值字符串( `7 W, D1 N+ l: \
  26.     unit = acRadians& K  }3 J% ^& Z% B' m: x# G6 e
  27.     angAsString = ThisDrawing.Utility.AngleToString(angAsRad, unit, precision)    '结果是 "3.141593r" 。* @/ |$ x, U3 l6 @$ I7 e
  28.     MsgBox "π弧度=  " & angAsString, , "AngleAsString 示例"' u* J2 [. X3 e
  29. End Sub
    * M* g7 C5 ]# q  {, S
复制代码
( n% b+ P4 }+ n' h( F0 O6 W- N
 楼主| 发表于 2019-3-29 20:40:08 | 显示全部楼层
E.CreateTypedArray方法
CreateTypedArray(VarArr, Type, Value1,[value2, value3, ...valueN])
VarArr: Variant[变体]; 仅用于输出,作为变体的数组值。
Type: Visual Basic 常数; 仅用于输入用户提供的类型值。
# {4 B" w3 P& H- P# }vbBoolean, vbInteger, vbLong, vbSingle, 或 vbDouble。
Value1,……ValueN:在上面 Type 参数中指定的类型; 仅用于输入包含在变体中的值。
说明:结果变体可传递给接受作为变体的数值数组的任何 AutoCAD 方法或属性。该方法只能使用后期绑定编程技术访问。
要使用该方法,可将 Utility 对象定义为 Object (Dim myObj As Object), 而不是 as AcadUtility
  1. Sub CreateTypedArray方法(): t8 H, p$ a" p* u
  2. '此示例使用CreateTypedArray方法从Double创建的变量数组创建样条线。
    ; z0 F+ ]& L; Z% b
  3. '请注意,此方法必须是后期绑定的。这是通过将实用程序对象(utilobj)声明为对象而不是AcadUtility来实现的。
    ( z9 @/ t1 o* K# i; S1 ?! S
  4.     Dim splineObj As AcadSpline: q  e' P2 \7 m: U. Y1 K( q
  5.     ' 即使这些是数组,它们也被声明为变体变量  ]0 }& U4 [  X  N4 P
  6.     Dim startTan As Variant8 a" n- U& \) k
  7.     Dim endTan As Variant9 S  S! E& I5 V# v
  8.     Dim fitPoints As Variant
    7 C2 b# F1 b; F6 T$ b, `
  9.     Dim utilObj As Object   ' 后期绑定对象( y- ~$ E$ B& z' Z' F& T
  10.     Set utilObj = ThisDrawing.Utility
    6 w; C+ r" r* O1 p5 f% K2 p# K
  11.     ' 定义样条曲线.- Z. O8 s4 e0 }* C, `3 R
  12.     utilObj.CreateTypedArray startTan, vbDouble, 0.5, 0.5, 0
    % d( P6 r- w6 _- _1 A
  13.     utilObj.CreateTypedArray endTan, vbDouble, 0.5, 0.5, 0
    1 C8 f8 z+ a6 I, [4 D
  14.     utilObj.CreateTypedArray fitPoints, vbDouble, 0, 0, 0, 5, 5, 0, 10, 0, 0
    $ W6 m1 X) D4 U) S: f( d9 v
  15.     ' 创建样条曲线
    0 l. D# ?2 S# |& A3 ]
  16.     Set splineObj = ThisDrawing.ModelSpace.AddSpline(fitPoints, startTan, endTan)/ ]; b! }& f( k* f. B& v$ \2 x2 J
  17.     ZoomAll
    + U0 ?" L. f+ v" b. S
  18. End Sub
复制代码
6 V7 S$ z1 J3 _1 C$ k, ], |
' G) k, @( z" i
F.GetAngle方法
RetVal = GetAngle([Point][, Prompt])
PointVariant[变体] (三元素双精度数组); 仅用于输入; 【可选项】指定第一点的三维WCS坐标。
PromptVariant[变体] (字符串); 仅用于输入; 【可选项】用于提示用户输入的文字。
RetValDouble[双精度],以弧度表示的角度。  
说明
AutoCAD暂停,等待用户输入角度,并设置返回值为已选角度的值。Point 参数指定了角度在二维WCS中的基点。Promp 参数指定在 AutoCAD 暂停时显示的字符串。Point 和 Prompt 参数为可选项。
AutoCAD用户可以通过以当前角度单位格式输入数值来指定角度。用户也可以通过在图形屏幕指定两个二维位置来设置角度。AutoCAD 从第一个点画一条橡皮筋线到当前十字光标位置以便用户看到角度。如果给出了 Point 参数,AutoCAD 用这个值作为两点中的第一点。该角度只测量 WCS 坐标下 XY 平面(GetAngle 忽略点的 Z 轴值)。
虽然 GetAngle 方法是用来指定角度,但它总是把返回值设置为以弧度表示的值。角度的加大方向始终是逆时针。
该函数差不多和GetOrientation一样,但它是按系统变量 ANGBASE 的当前值来计算。对于 GetOrientation,零角度总是向右:“东向”或“时钟的三点”。对于 GetAngle,零角度是 ANGBASE 系统变量的值,该值可设置任何四个90度象限。GetAngle 和 GetOrientation 都返回一个从基准角(零度角)逆时针测量的角的弧度值(实数)。对于 GetAngle,基准等于 ANGBASE 的值;对于 GetOrientation,基准在右侧。两个函数都有当前 ANGDIR 的值,这个值影响当前用户输入的值,但不影响函数的返回值。
可以用 GetAngle 来获得要插入块的旋转量,因为输入0度总是返回0弧度。可用 GetOrientation 来获得一个文字图元的基线角度以便与其它对象对齐。
如果返回的值不是角度而是关键字,AutoCAD 将生成“用户输入关键字”的错误信息。用 GetInput 方法可以从返回值中获得关键字。
  用户输入 (角度)
GetAngle  返回值
GetOrientation  返回值
0
0.0
1.5708
-90
1.5708
3.14159
180
3.14159
4.71239
90
4.71239
0.0

$ i0 \3 u  n8 Q) k; M
  1. Sub GetAngle方法()6 j2 N+ v  t$ c4 a! ?2 Z! M" o
  2. '此示例演示了4种不同方法使用getAngle方法从用户检索角度。& `& r1 e. U1 {8 N. G
  3.     Dim retAngle As Double
    4 D4 ]% A' b" A# U5 O! L
  4.     ' 返回以弧度表示的角度并提示# Y2 N6 c- a7 j# B8 ~
  5.     retAngle = ThisDrawing.Utility.GetAngle(, "请输入角度: ")         '输入 90 回车0 ~# O9 m! L: {+ D
  6.     MsgBox "被输入的角度是" & retAngle, , "GetAngle 示例"        '返回的是π/2=1.570796....。
    , v0 \* g# Z5 Y+ w; H
  7.     ' 无提示返回以弧度表示的角度
    1 H: _0 |/ {$ Y2 R! N& p, f
  8.     retAngle = ThisDrawing.Utility.GetAngle()      '该写法与上面的区别是:在模型空间的十字光标上没有提示
    7 p: K0 x. }& e8 I) l
  9.     MsgBox "输入的角度是 " & retAngle, , "GetAngle 示例"
    . T; R2 {9 F6 j% f% \1 {% X
  10.     ' 返回带有提示和角度基点的以弧度表示的角度0 L6 x$ \3 R. B
  11.     Dim basePnt(0 To 2) As Double
    / K' o0 h1 [7 m  Q
  12.     basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0#
    & O- b3 Q/ b+ Z3 L
  13.     retAngle = ThisDrawing.Utility.GetAngle(basePnt, "请输入角度: ")     '模型空间的十字光标从基点坐标引出一条橡皮筋线跟随光标走
    4 y+ a; r, u$ a$ M& K& J* ~; F
  14.     MsgBox "输入的角度是: " & retAngle, , "GetAngle 示例"; o$ n1 k2 }( h" Q# B
  15.     ' 返回带有角度基点但没有提示的弧度角度
    7 X; _9 v' p3 m3 {* M& h6 h8 H4 H8 o8 ~
  16.     retAngle = ThisDrawing.Utility.GetAngle(basePnt)# N2 U) A9 [* y% m* v1 v
  17.     MsgBox "输入的角度是:" & retAngle, , "GetAngle 示例"+ {" o9 G# _' H
  18. End Sub
复制代码
* W8 O: I  q5 F6 D4 w+ j# a
( b0 B& ^/ Z3 i% x
- c6 n' N) ~6 v" m# Y
2 z* |6 Z6 p* r9 i& ?; [; S1 F
 楼主| 发表于 2019-3-29 20:42:56 | 显示全部楼层
G.GetCorner方法
RetVal = GetCorner(Point[, Prompt])     ‘相当于手动画矩形,但不画矩形,而是获取另一角点坐标。
PointVariant[变体] (三元素双精度数组); 仅用于输入,指定矩形基点的三维WCS坐标点。
PromptVariant[变体] (字符串); 仅用于输入; 【可选项】用于提示用户输入的文本。
RetValVariant[变体] (三元素双精度数组),表示矩形框另一角点的三维WCS坐标。
说明
AutoCAD暂停,等待用户输入矩形的角点,然后将返回值设成选取点的值。Point 参数指定了矩形基点的三维WCS坐标;该参数是必需的。Prompt 参数指定了在AutoCAD暂停时显示字符串。该提示是可选项。
AutoCAD用户可以通过输入一个WCS格式的坐标点来指定角点;GetCorner 将点作为一个三维空间的点。用户也可以通过在图形屏幕上指定位置确定角点。AutoCAD从基点到当前十字光标处画出一个有动态大小的矩形来帮助用户认清第二个角点的位置。矩形是在WCS的XY平面中画出。当用点设备时,GetCorner忽略点的Z值,设置Z值的结果为当前标高。
  1. Sub GetCorner方法()
    1 e( |+ k; _$ {8 h
  2. '此示例提供一个基点,并提示用户输入第二个点以生成矩形。; `0 m* Q& c4 B% Q; P# s% u2 V
  3.     Dim returnPnt As Variant
    / F. {$ V! m4 s
  4.     Dim basePnt(0 To 2) As Double
    0 F' b  [) {9 r$ k
  5.     basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0#8 J( _  e& D* c4 o$ q
  6.     ' 提示用户选择第二个点并返回该点坐标
    1 y" S  m% i' F1 n6 B
  7.     returnPnt = ThisDrawing.Utility.GetCorner(basePnt, "请输入另一个角点: ")    '另一个角点可以输入,可以点击选取: g( y& v( U1 B! V0 R
  8.     ' 显示拾取的点3 e4 \7 h& ]/ g2 j9 Z1 X0 W4 o
  9.     MsgBox "拾取的点坐标是 " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "GetCorner 示例"
    . {! _1 ?9 U: ~9 @
  10. End Sub
复制代码
% U$ v5 @3 }% t/ b8 R
H.GetDistance方法
RetVal = GetDistance([Point][,Prompt])   获取(由提示行或由屏幕上选定的一组点的)距离
PointVariant[变体] (三元素双精度数组); 仅用于输入;【可选项】指定基点的三维 WCS坐标。如果该点未提供,用户必须输入两个点。
PromptVariant[变体] (字符串); 仅用于输入;【可选项】提示用户输入的文本。
RetValVariant[变体] (双精度或双精度数组),从提示行或从屏幕上选定一组点的距离。
说明
AutoCAD暂停,等待用户输入一个线性距离,设置选择的距离为返回值。Point 参数指定了一个WCS坐标系下的基点。Prompt 参数指定了AutoCAD在暂停前显示的字符串。Point 和 Prompt 都是可选的。
AutoCAD用户可以通过输入以当前单位为格式的数值来指定距离。用户也可以通过在图形屏幕上指定两个位置来设置距离。AutoCAD从第一个点到当前十字光标位置画一个橡皮筋线以帮助用户认清距离。如果提供了 Point 参数, AutoCAD将此值作为两个点的第一点值。
默认状态下,GetDistance 把点和返回值看作是三维点。事先调用 InitializeUserInput 方法可以使点成为二维点,以保证该方法返回的是二维平面距离。
本方法除了用于指定距离或当前线性单位(如英尺和英寸),还可经常用来设置双精度浮点的返回值。
  1. Sub GetDistance方法()% R  x4 D4 ?" T7 E6 s
  2.     ' 此示例返回用户输入的距离。用户可以输入单个距离值,也可以输入或点选两个点,返回两点的距离。6 v3 [1 {0 u, G/ y
  3.     Dim returnDist As Double$ ?( \3 V2 D* l6 U# d  e% R8 h
  4.     Dim basePnt(0 To 2) As Double
    " o4 k) s/ H( S# H' ?: _% i+ ?
  5.     basePnt(0) = 0#: basePnt(1) = 0#: basePnt(2) = 0#2 p/ z& @' e! J8 o" ?( n4 y
  6.     ' 返回用户输入的值。提供提示.1 p" t+ z3 W& _; O
  7.     returnDist = ThisDrawing.Utility.GetDistance(, "请输入距离: ")
    7 J; A" E9 G- i
  8.     MsgBox "输入的距离是:" & returnDist & vbCrLf & "(输入下一个值而不提示.)", , "GetDistance 示例"! C4 f( D8 d0 w5 e8 c' G
  9.     '返回用户输入的值。不提供提示。
    4 _/ {8 g" M& I
  10.     returnDist = ThisDrawing.Utility.GetDistance()2 Q9 M$ u" N) v# u, h
  11.     MsgBox "输入的距离是:" & returnDist, , "GetDistance 示例"
    " _# B! |  K! J8 T: n! k
  12.     ' 返回用户输入的值。提供基点和提示。$ ^$ X# E% }& v" p  d* ?5 X
  13.     returnDist = ThisDrawing.Utility.GetDistance(basePnt, "请输入距离: ")3 x! l- h) ^1 c% b# X7 j
  14.     MsgBox "输入的距离是:" & returnDist, , "GetDistance 示例"
    " k, u2 F$ n6 h
  15. End Sub
复制代码
* F: \1 C: r& f( h0 F9 w
8 `& E0 c/ M' h; _+ D" l# R8 F0 ~
 楼主| 发表于 2019-3-29 20:46:20 | 显示全部楼层
I.GetEntity方法
object.GetEntity Object, PickedPoint[, Prompt]
ObjectObject; 仅用于输出,拾取的对象,可以是任意图形对象中的一个。
PickedPointVariant[变体] (三元素双精度数组); 仅用于输出,表示选择点的三维 WCS 坐标。
PromptVariant[变体] (字符串); 仅用于输入;【可选项】用于提示用户输入的文本
说明
该方法需要 AutoCAD用户在图形屏幕上拾取一个点来选择一个对象。如果选定了对象,该方法将把它作为第一个参数返回,第二个参数包含了拾取点在WCS下的坐标。如果拾取点不在对象上,该方法调用失败。
GetEntity 返回的拾取点并不需要在已选定的对象上。返回的点只表示选择时十字光标的位置。点与对象的关系会因拾取框的大小和当前的缩放比例而变化。
该方法甚至可以取出在屏幕上不可见的或在冻结层的对象。
  1. Sub Example_GetEntity()
    ' b3 L9 `1 l. U5 L
  2.     '此示例在模型空间中创建多个对象。然后提示用户选择对象。
      N$ K) h  Y$ H5 r2 D
  3.     '该示例继续让用户选择对象,直到用户在空白空间中选择。在模型空间中创建一个光线对象。& P2 Z; y7 }' n- g& u) P
  4.     Dim rayObj As AcadRay    '定义射线变量
    7 X- d0 i, s5 W7 w( d
  5.     Dim basePoint(0 To 2) As Double
    $ t: H& ?1 y9 x% P" }2 B
  6.     Dim SecondPoint(0 To 2) As Double' D. k3 U7 J- _, i9 m) U
  7.     basePoint(0) = 3#: basePoint(1) = 3#: basePoint(2) = 0#  S4 {6 o* T' a. N9 P
  8.     SecondPoint(0) = 1#: SecondPoint(1) = 3#: SecondPoint(2) = 0#! [7 S7 U/ h" J* }( ^
  9.     Set rayObj = ThisDrawing.ModelSpace.AddRay(basePoint, SecondPoint)
    + l# l' b$ k- W, \7 n( K; N  h1 j
  10.     Update
    ) j3 D* T( a( U0 r
  11.     ' 在模型空间中创建多段线对象- k! D3 A& N) Y' Z! R1 ^' g7 ?
  12.     Dim plineObj As AcadLWPolyline9 B7 A  D  Q9 R; e: ]8 F* |
  13.     Dim points(0 To 5) As Double
    8 T3 {. T! U# Y
  14.     points(0) = 3: points(1) = 7+ L! S) O" W; e
  15.     points(2) = 9: points(3) = 2
    ) x) }$ _- ]5 }& g: _/ R7 n3 P8 G
  16.     points(4) = 3: points(5) = 5
    9 Z) Z3 p9 V% D; N) z/ T; C. o
  17.     Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)
    1 `; w  U5 \0 ]
  18.     plineObj.Closed = True    '让多段线闭合2 V  {! b/ c5 b
  19.     Update
    # M4 `2 h9 X( g! l# K; \
  20.     ' 在模型空间中创建线条对象
    9 e# N7 u6 S5 Y- m2 F9 O- w' f, z
  21.     Dim lineObj As AcadLine, \- Y5 ?3 Y% F  H
  22.     Dim startPoint(0 To 2) As Double
    ( v. U; q" y; ^& N
  23.     Dim endPoint(0 To 2) As Double
    # k' A4 P* o3 ^
  24.     startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0" c9 T$ R0 B9 Y7 g) }! [
  25.     endPoint(0) = 2: endPoint(1) = 2: endPoint(2) = 0
    & b9 L( V7 n7 n
  26.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint), Z+ N1 u/ X0 W7 F9 i. ^4 E
  27.     Update9 m, j/ F5 D! _1 |" i4 ]
  28.     ' 在模型空间中创建圆形对象2 C) h  G  r* Z% ^
  29.     Dim circObj As AcadCircle. E1 _4 `: G" H, g& W
  30.     Dim centerPt(0 To 2) As Double2 s0 a% d  _4 [
  31.     Dim radius As Double* {! l6 |' Z; H( G% z" P1 v) b
  32.     centerPt(0) = 20: centerPt(1) = 30: centerPt(2) = 0
    - c$ R6 @6 V; v# [# M1 H3 h
  33.     radius = 3
    ; p" q, [8 Z& r# ?- W- V+ J
  34.     Set circObj = ThisDrawing.ModelSpace.AddCircle(centerPt, radius)
    - M3 v$ b- Y8 ~* P: Q1 v9 R9 d
  35.     Update
    " b* r" I, \8 U
  36.     ' 在模型空间中创建椭圆对象$ N! o) [# u" k
  37.     Dim ellObj As AcadEllipse
    6 T; ?6 }4 |1 h- Q% Q3 F
  38.     Dim majAxis(0 To 2) As Double
    ( I2 N# N: ~( c! c) t
  39.     Dim center(0 To 2) As Double' l+ I6 r- f4 h5 O" \
  40.     Dim radRatio As Double! {: p3 Y" Y8 r
  41.     center(0) = 5#: center(1) = 5#: center(2) = 0#2 c2 F, _& e: P$ w
  42.     majAxis(0) = 10: majAxis(1) = 20#: majAxis(2) = 0#" J. N  B. \1 m5 G- J
  43.     radRatio = 0.3% `+ A+ N, E3 r5 h
  44.     Set ellObj = ThisDrawing.ModelSpace.AddEllipse(center, majAxis, radRatio)( \! y0 n8 X2 _  B" k
  45.     Update/ T- a6 Q# M7 L
  46.     ' 开始选择- I9 c% D/ R# j& o
  47.     Dim returnObj As AcadObject9 _9 H8 z% t5 \4 Z* s9 I: h
  48.     Dim basePnt As Variant" L" [9 r( D! K8 V- b" L- H
  49.     On Error Resume Next
    ( k# o) @# \) F3 w
  50.     ' 下面的示例等待来自用户的选择; p8 k* h4 a9 w1 C
  51. RETRY:
    3 h+ _4 ~. O2 h/ A
  52.     ThisDrawing.Utility.GetEntity returnObj, basePnt, "请选择一个对象"6 s2 [& W) F$ D  D* a; M; n+ T% R
  53.     If Err <> 0 Then     '如果拾取点不在对象上会出错!
    2 b0 j! W$ W) R/ I5 i
  54.         Err.Clear
    $ L0 ~& ]1 Q8 I# X- N
  55.         MsgBox "结束程序", , "GetEntity 示例"
    ; O1 ?5 o& b. K& N6 s0 D
  56.         Exit Sub; r4 `( f9 s! B' u5 b
  57.     Else
    ! ~+ w, I6 }$ o3 K: A( v$ W5 Z
  58.         returnObj.Update     '刷新选择的对象
    & M+ o- B- P* V1 w% L" k: D
  59.         MsgBox "对象类型是: " & returnObj.EntityName, , "GetEntity 示例"      '返回图元名称,LINE的是ACDBLINE,circle是acdbcircle等等。) m# P+ g1 D# k4 F: Z
  60.         MsgBox "对象类型是: " & returnObj.ObjectName, , "GetEntity 示例"      '返回值同上, j$ u; o  ^3 E# x! _. ~* x) T, }
  61.         MsgBox "对象类型是: " & returnObj.ObjectID, , "GetEntity 示例"        '返回值一串数字
    . {- X) o2 a( d; t0 Q* G4 E
  62.         MsgBox "对象类型是: " & returnObj.ObjectID32, , "GetEntity 示例"      '返回值两位数字
    : \) `& _9 L) p# p
  63.         MsgBox "对象类型是: " & returnObj.OwnerID, , "GetEntity 示例"         '返回值一串数字
    ; e! ]1 Y) I1 _
  64. '        returnObj.Update    '此句作用似乎不明显!
    * u# l$ h6 H6 h8 G: E% b) k
  65.     End If$ O* S, k/ K" [0 ^, N5 x8 z
  66.     GoTo RETRY6 `* I( N/ T' ?/ a
  67. End Sub
复制代码

* D) n" G4 o7 q4 q: ~/ T
以上示例似乎没有感受到PickedPoint的效果!!
J.GetInput方法
RetVal = GetInput()   结果是字符串,指定输入了哪个关键词的索引。
不怎么用,暂略。。。。。。

& N" Q) |, F8 Z# m
 楼主| 发表于 2019-3-29 20:48:03 | 显示全部楼层
K.GetInteger方法
RetVal = GetInteger([Prompt])
PromptVariant[变体] (字符串); 仅用于输入;【可选项】提示用户输入的文本信息。
RetValInteger[整数],用户返回的整数值。
AutoCAD 暂停,等待用户输入一个整数,将选择的值作为返回值。Prompt 参数指定了 AutoCAD 在暂停前显示的字串。Prompt 为可选项。
AutoCAD 用户可以输入任何有效的(短)整数,范围从 -32768 到 +32767 之间。
如果返回的不是整数而是关键词,或者是用户没有输入值直接按回车键,AutoCAD 则生成错误号-214530928(错误信息为“用户输入一个关键词”)。使用 GetInput 方法可以从返回值中获取关键词。
  1. Sub GetInteger方法()! e% w' Z6 e# Y# w
  2.     ' 此示例返回用户输入的整数。7 K$ k6 K0 U1 p6 q1 ^2 o
  3.     Dim returnInt As Integer) H0 V1 m. k% h# S
  4.     ' 返回用户输入的值。提供提示。
    * Q. a  [1 W; _' k# G) n
  5.     returnInt = ThisDrawing.Utility.GetInteger("请输入一个整数: ")9 X5 @3 ~4 p/ U6 [' W6 B4 m
  6.     MsgBox "输入的整数是 " & returnInt & vbCrLf & "(输入下一个值而不提示。)", , "GetInteger 示例"/ r# s. R$ {7 M# v# L1 w0 |
  7.     '返回用户输入的值。不提供提示。
    ' J2 E3 M3 M9 |) _; k- i
  8.     returnInt = ThisDrawing.Utility.GetInteger()0 r! x* G1 h% b  T1 {) o- G. {' M
  9.     MsgBox "输入的整数是" & returnInt, , "GetInteger 示例"
    3 J- g. y+ m* E
  10. End Sub
复制代码

2 l& K' ]  x' A4 S! R4 X
7 a# e" e7 \0 R  k* O
$ R# n/ F, O. ^
L.GetKeyWord方法
RetVal = GetKeyword([Prompt])
Prompt: Variant[变体] (字符串); 仅用于输入;[可选项]用于提示用户输入的文本。
RetVal: 字符串,用户返回的关键词。
说明
AutoCAD 暂停,等待用户输入一个关键词,并将输入关键词的值设为返回值。Prompt 参数指定了在 AutoCAD 暂停之前显示的字串。Prompt 为可选项。返回值的最大长度为511个字符。
AutoCAD 用户可以通过键盘输入一个关键词。该方法接受的关键词列表是由事先调用 InitializeUserInput 方法来设置的。如果用户输入的字串没有在调用 InitializeUserInput 所指定的关键词中,AutoCAD 显示一个错误信息并重试(如果指定有提示,则重新显示提示)。如果用户没输入任何值只是按下回车键,GetKeyword 返回一个空字串(""),除非调用 InitializeUserInput 时不允许 NULL 输入。
  1. Sub GetKeyword方法()5 F' j) O0 d8 j- w/ l- f# o, B
  2.     '此示例使用GetKeyword返回用户输入的关键字。InitializeUserInput建立有效的关键字。* m$ e" ?, \  r) G) T
  3.     ' 定义有效关键字列表
    / L! ]) n& a+ K5 W" S% D5 u* P
  4.     Dim kwordList As String
    6 h! Q; G: o* m! @8 X( m3 B. ^
  5.     kwordList = "Width Height Depth WWE High"
    0 W9 M" y/ p3 i4 U
  6.     ThisDrawing.Utility.InitializeUserInput 1, kwordList
    - b. ~4 X2 V9 {4 }9 G% R
  7.     ' 提示用户输入的任何的两个关键词。返回“宽”、“高”或“深度”returnstring变量取决于是否在用户输入“W”,“H”或“D”。
    ! {4 R5 X2 i; u1 _; t
  8.     Dim returnString As String
    & v. D% Q( Z5 }( p7 F
  9.     returnString = ThisDrawing.Utility.GetKeyword("输入一个关键字 (Height)(Width)(Depth)(WWE): ")
    ( J; t/ S. s4 \% \. c
  10.     '用户可以只输入首字符,然后自动识别,当有多个首字符相同时返回第一个对应首字符的字符串关键字9 N& C9 B4 K! ^3 F
  11.     MsgBox "你输入了" & returnString, , "GetKeyword 示例"
    . l$ `* h, X' C
  12. End Sub
复制代码
* [! H( t( v- s% r# u1 J

# k1 d8 d: L" r2 {& u/ l" g5 u
 楼主| 发表于 2019-3-29 20:49:54 | 显示全部楼层
M.GetOrientation方法
RetVal = GetOrientation([Point][,Prompt])       获取指定角度。忽略ANGBASE 系统变量的设置。
Point: Variant[变体] (三元素双精度数组); 仅用于输入; [可选项]指定基点的三维 WCS 坐标。
Prompt: Variant[变体] (字符串); 仅用于输入;[可选项]提示用户输入的文本信息。
RetVal: Double[双精度],指定的角度。
说明
AutoCAD 暂停,等待用户输入一个角度,并将选择角度的值作为返回值。Point 参数指定角度在三维 WCS 中的基点。Prompt 参数指定 AutoCAD 在暂停前显示的字符串。Point 和 Prompt 都是可选项。
AutoCAD 用户可以通过输入一个以当前角度单位格式为单位的数值来确定一个角度。用户也可以通过在图形屏幕上指定两个二维位置来确定角度。AutoCAD 画一条橡皮筋线到当前十字光标位置以帮助用户认清角度。如果提供了 Point 参数,AutoCAD 用这个值作为两点的第一个点值。角度是在WCS坐标系中的XY平面测量的(本方法忽略点的Z值)。角度的方向逆时针为增。
除了指定角度,GetOrientation还经常用来设置以弧度表示的值的返回值。
该方法与 GetAngle方法相似,但它忽略保存在 ANGBASE 系统变量中的当前的0角度的方向。0角度在 GetOrientation 中一般指向右:“东方”或“时针的三点”。
如果返回的是关键词而不是角度,AutoCAD将生成错误信息“用户输入关键词”。用 GetInput 方法可以从返回值中获得关键词。
  1. Sub GetOrientation方法(). f6 f- T* w3 R+ s
  2.     '此示例使用getOrientation方法演示从用户检索方向的三种不同方法。% y* p) M& d; P. P6 C- M
  3.     Dim retOrientation As Double
      I) V7 v5 i8 L# {5 D  L) }8 F
  4.     ' 返回以弧度表示的方向并提示
    9 P% D1 L2 n. r% T' p- X
  5.     retOrientation = ThisDrawing.Utility.GetOrientation(, "输入一个角度: ")    '输入90,结果返回的是π/2=1.57...... R4 E$ w4 R. j* s) k
  6.     MsgBox "被输入的角度是" & retOrientation & vbCrLf & "(输入下一个值而不提示。)", , "GetOrientation 示例"
    6 {) O0 X3 [$ O. q! `
  7.     ' 无提示返回弧度方向2 w# A, u; F6 ]7 M
  8.     retOrientation = ThisDrawing.Utility.GetOrientation()
    6 t5 M( Y! S5 v1 D- I. A
  9.     '也可以通过点选两个点来产生直线的角度,同样以起点为准逆时针旋转至终点的角度0 }! }2 ]& u! y! T2 A
  10.     MsgBox "被输入的角度是:" & retOrientation, , "GetOrientation 示例"
    7 I% F5 E* x" c6 @
  11.     ' 返回带有提示和方向基点的以弧度表示的方向
    $ Y. l7 V& Y7 W* R# F4 K: ^
  12.     Dim basePnt(0 To 2) As Double
    8 v% ?- }1 `, ]! C
  13.     basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0#1 [6 k# m+ T$ {/ V. n
  14.     retOrientation = ThisDrawing.Utility.GetOrientation(basePnt, "请输入一个角度: ")
    . L! r6 @; ^0 X. Y- v$ Y  m
  15.     MsgBox "输入的角度是:" & retOrientation, , "GetOrientation 示例"& s% }  y3 n, f) C% C
  16. End Sub
复制代码
7 p5 [/ \& \# H, _- s  I6 u
N.GetPoint方法
RetVal = GetPoint([Point][, Prompt])
PointVariant[变体] (三元素双精度数组); 仅用于输入; 【可选项】指定相对基点的三维 WCS 坐标。
PromptVariant[变体] (字符串); 仅用于输入; 【可选项】提示用户输入的文本信息。
RetValVariant[变体] (三元素双精度数组)AutoCAD 用户选择的点的三维 WCS 坐标。
说明
AutoCAD 暂停,等待用户输入一个点,将选择点的坐标值设为返回值。Point 参数指定的在WCS中的相对基点。Prompt 参数指定了AutoCAD在暂停前显示的字串。Point 和 Prompt 都是可选项。
AutoCAD 用户可以通过输入一个当前单位格式的坐标点来指定一个点;GetPoint 将 Point 参数及返回值作为三维点。用户也可以通过在图形屏幕上指定一个位置来确定一个点。如果提供了 Point 参数,AutoCAD 将从该点到当前十字光标处画一条橡皮筋线。存储在返回值中的点坐标根据 WCS 来表示。
如果返回一个关键字而不是点,AutoCAD 将生成错误信息“用户输入关键词”。用 GetInput 方法可以获得返回值中的关键字。
  1. Sub GetPoint方法()7 I% z' p8 o1 d! _8 a2 Z8 E# p" p5 H
  2.     ' 此示例返回用户输入的点的坐标。
    . H! g' L+ k  k, y# v( ]6 n
  3.     Dim returnPnt As Variant' Q/ |  Z: C7 \9 {6 ?- s& o
  4.     ' 使用提示返回点
    ) P/ `1 p2 E/ l6 T$ s
  5.     returnPnt = ThisDrawing.Utility.GetPoint(, "选择/输入一个点: ")2 l3 A- ?, p$ M# w9 T+ y& }2 U
  6.     MsgBox "WCS点坐标是: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2) & vbCrLf & _+ l8 v' M. q& n: ^/ q
  7.             "(不带提示的输入下一个点.)", , "GetPoint 示例"% L5 A- m# n# h# U
  8.     ' 不带提示的输入下一个点
    $ X: l+ R- p7 Y8 Y& t
  9.     returnPnt = ThisDrawing.Utility.GetPoint
    & J' D( ~0 D' Y3 E
  10.     MsgBox "WCS点的坐标是: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "GetPoint 示例"4 b5 t3 Z+ f/ p
  11.     ' 使用基点和提示返回点
    1 W  w; Q6 s5 T* t7 ?
  12.     Dim basePnt(0 To 2) As Double
    8 K) n/ G- C5 h& X% v) s: j/ ]
  13.     basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0#
    7 H/ ^$ l8 U. v6 `/ h
  14.     returnPnt = ThisDrawing.Utility.GetPoint(basePnt, "Enter a point: ")! t# {: q% @& B4 i0 o
  15.     MsgBox "WCS点的坐标是: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2)! n' d# m2 _& d
  16.     ' 从基点和输入的最后一个点创建一条线/ A" D. Z, v' _! o6 {
  17.     Dim lineObj As AcadLine" b- u3 s* |6 a: v# T6 g8 N0 l! p
  18.     Set lineObj = ThisDrawing.ModelSpace.AddLine(basePnt, returnPnt)
    * K1 q$ M" d% p6 W! |- p8 K7 I! [
  19.     Update, ~0 b" B$ k* @: v0 _6 [9 W
  20. End Sub
复制代码

$ _, O' k2 K8 |7 z( Y( c* B此示例中并没有显示出基点的作用啊!。。。。。。。。。。。' M+ Q/ F1 F, R' \, P8 W4 m4 c3 \
 楼主| 发表于 2019-3-29 20:51:46 | 显示全部楼层
O.GetReal方法
RetVal = GetReal([Prompt])
PromptVariant[变体] (字符串); 仅用于输入; 【可选项】用来提示用户输入的文本信息。
RetValDouble[双精度] 用户返回的值。
说明
AutoCAD 暂停,等待用户输入一个实数值,并将用户输入的值设为返回值。Prompt 参数指定 AutoCAD 在暂停前显示的字串,它是可选项。
如果返回的是关键字,而不是实数。AutoCAD 将生成错误信息“用户输入关键词”。用 GetInput 方法可以从返回值中获得关键字。
  1. Sub GetReal方法()+ }' A! }8 Y4 [. M
  2.     ' 此示例从用户处获取一个实数值9 A8 S9 J5 L% H5 \/ ]# o. e; Y
  3.     Dim returnReal As Double
    0 ]- ~/ w+ F; d9 @
  4.     ' 返回用户输入的值。提供提示.' Q6 c9 I% h5 {" ^" a' r
  5.     returnReal = ThisDrawing.Utility.GetReal("请输入一个实数值: "): q' c. [4 i$ z
  6.     MsgBox "输入的实数值是" & returnReal & vbCrLf & _
    6 A  _! K; N* D6 ^, v: w: H
  7.             "(不带提示的输入下一个实数值.)", , "GetReal 示例"
    2 q1 v  P, H, C3 U
  8.     ' 不带提示的输入下一个值9 Z6 J/ Z( s( b; v0 t' f' Z4 s& J+ I
  9.     returnReal = ThisDrawing.Utility.GetReal()8 N# ~' ?7 G0 F$ Z4 z
  10.     MsgBox "输入的实数值是:" & returnReal, , "GetReal 示例"8 b( w. ]) H! x/ C7 G) r
  11. End Sub
复制代码
8 m2 z/ H6 l  D9 K4 Z( a

- d& Z6 A# o3 o
P. GetRemoteFile方法
object.GetRemoteFile URL, LocalFile,IgnoreCache
URLString[字符串]; 仅用于输入,需下载的文件的URL
LocalFileString[字符串]; 仅用于输出,在指定URL上的文件。
lgnoreCacheBoolean[布尔值]
TRUE: 即使文件已经在进程中传输也进行下载。
FALSE: 如果文件已经在进程中传输则不进行下载。
示例暂无!
Q.GetString方法
RetVal = GetString(HasSpaces[, Prompt])
HasSpacesInteger[整数]; 仅用于输入
TRUE: 返回的字符串可以包含空格。它只能以回车键为结束。
FALSE: 返回的字符串不可以包含空格。它可以以回车键或空格为结束。
PromptVariant[变体] (字符串); 仅用于输入; 【可选项】提示用户输入的文本信息。
RetVal字符串,用户返回的字符串。
说明
AutoCAD 暂停,等待用户输入一个字符串,并将用户输入的值设为返回值。HasSpaces 参数指定了字符串是否可以包含空格。Prompt 参数指定了该方法在 AutoCAD 暂停前显示的字符串。
AutoCAD 用户可以通过键盘输入字符串。如果 HasSpaces 参数是TRUE,字符串中可以包含空格,用户必须按回车结束。如果 HasSpaces 参数是False,输入空格或回车都可以结束字符串的输入。如果用户输入多于132个字符,字符串的输入仍可继续直到用户输入一个空格或回车键(根据 HasSpacesd 而定),但是 GetString 只将前132个字符作为返回值。
  1. Sub GetString方法()
    ) j; u2 d; Y5 @+ w' L0 Z! j
  2.     ' 这个例子演示了返回用户输入的字符串的不同方法。5 S8 R: ?" r, R! b4 o
  3.     Dim returnString As String
    # P5 z! l' B" m$ \
  4.     '提示输入,不能包含空格0 g  Y7 _: v; H8 \, p4 S
  5.     returnString = ThisDrawing.Utility.GetString(False, "输入文本(空格或<enter>终止输入): ")
    ) S7 i: U( W7 [) T) _
  6.     MsgBox "输入的文本是:'" & returnString & "'", , "GetString 示例"
    4 S  W5 M! G% N, R( ]3 w. e" c. M
  7.     ' 提示输入,可以包含空格
    3 [8 H3 z* N( m3 d& e  C
  8.     returnString = ThisDrawing.Utility.GetString(True, "输入文本(按<enter>终止输入):")" C- q& ~$ s" Z& L, |
  9.     MsgBox "输入的文本是:'" & returnString & "'", , "GetString 示例": N' `" X  x0 L. G% j
  10.     ' 提示和输入可以包含空格,但不能包含空字符串; b! j. F" Z; Q3 D
  11.     Dim NoNull As Integer; E4 r. u2 d( N9 U9 v( Y
  12.     NoNull = 1    '不允许不输入字符) |- H, Q) Q4 P+ |: S/ @+ a
  13.     ThisDrawing.Utility.InitializeUserInput NoNull
    + j! H" ~8 x& G# u' h- T6 j
  14.     returnString = ThisDrawing.Utility.GetString(True, "输入文本(按<enter>终止输入): ")$ f) m2 }' n+ E! n* g1 x* V
  15.     MsgBox "输入的文本是:'" & returnString & "'", , "GetString 示例"
    . p: b0 S- u3 s' C) |0 U' d
  16. End Sub
复制代码
: d$ @  d  Y" g+ l
0 A  t3 a% d5 Y; h, S6 g! D
 楼主| 发表于 2019-3-29 20:53:48 | 显示全部楼层
R.GetSubEntity方法
object.GetSubEntity Object, PickedPoint, TransMatrix,ContextData[, Prompt] 以交互方式获取对象或子图元。
ObjectObject[对象]; 仅用于输出,被选取的对象或子图元。可以是任何一个图形对象。
PickedPointVariant[变体] (三元素双精度数组); 仅用于输出,选取点的三维 WCS 坐标。
TransMatrixVariant[变体] (4x4 双精度数组); 仅用于输出,该图元的转换矩阵。
ContextDataVariant[变体] (长整数数组); 仅用于输出,被选取对象中所有嵌套对象的对象ID的数组。
PromptVariant[变体] (字符串); 仅用于输入; 【可选项】提示用户输入的文本信息。
说明
该方法需要 AutoCAD用户通过在图形屏幕上拾取一个点来选择一个对象。如果一个对象或子图元被选中,它将在第一个参数中返回,第二个参数将包含拾取点的 WCS 坐标值。如果拾取点处没有对象,则该方法失败。该方法甚至可以获取在屏幕上不可见或它在冻结层里的对象。
  1. Sub Example_GetSubEntity(). i% X; k' C! j6 a6 E/ B
  2.     '此示例提示用户单击鼠标选择屏幕上的对象,并返回有关所选对象的一些信息。
    0 Y! W+ N7 w1 n1 R" T
  3.     Dim Object As Object
    . ^5 l+ ]9 W8 @9 N7 }5 F
  4.     Dim PickedPoint As Variant, TransMatrix As Variant, ContextData As Variant, P! z+ P$ w8 r1 E, S; _# F
  5.     Dim HasContextData As String
    ) ], h7 X1 \3 T6 r
  6.     On Error GoTo NOT_ENTITY8 h3 w' m- L! R' c! Z* D8 p
  7. TRYAGAIN:: z) F& u- i0 C, k) e
  8.     MsgBox "取消此对话框后,使用鼠标单击当前图形中的对象。"
    % |/ ]! e; H0 @& C- L
  9.     '获取所选对象的信息  f0 z! k) B" u8 T
  10.     ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData
    " N- V6 n8 F) i9 J9 x( ~# h0 n% w
  11.     ' 处理和显示所选对象属性
    3 H( J* R9 b& S: l
  12.     HasContextData = IIf(VarType(ContextData) = vbEmpty, " 不包含 ", " 包含 ")1 @9 j5 z7 L4 j/ w% ]
  13.     MsgBox "你选择的对象是: " & TypeName(Object) & vbCrLf & _
    / h3 e' L* ~6 Q0 Y3 e  \+ Y$ G
  14.         "你选择的点坐标是: " & PickedPoint(0) & ", " & _
    ) x2 H# \& ]1 `5 x
  15.         PickedPoint(1) & ", " & _
    8 `" D. O0 n* r5 _
  16.         PickedPoint(2) & vbCrLf & _
    ' s$ l  T/ |' H! w7 r
  17.         "所选对象" & HasContextData & "有嵌套对象."# y0 `' n) c6 }& R
  18.     Exit Sub: i( a- C( Y/ |8 S# T+ n1 w
  19. NOT_ENTITY:$ M9 e# i& f( f  L. e- E' g
  20.     '如果单击空白空间或不选择实体,将生成此错误
      r/ D. I5 Y! g1 Z: f1 ~
  21.     If MsgBox("你未选择对象实体.  单击“确定”重试.", _
    2 B& l7 j) T2 i. M
  22.         vbOKCancel & vbInformation) = vbOK Then1 H4 J- H& Y- h5 J) n$ r3 A6 @
  23.         Resume TRYAGAIN3 x+ J& t0 U; r! F
  24.     End If
    $ u9 }+ E9 a+ F8 D
  25. End Sub
复制代码
# @4 G0 r9 k7 A3 {5 B# I2 r

  C8 E0 @- _+ p& J/ q

# @  L  H) t8 `. [4 M
S.InitalizeUserInput方法
object.InitializeUserInput Bits[, Keyword]      初始化 GetKeyword 方法。
BitsInteger[整数]; 仅用于输入
要同时设置多个条件上,可把这些值相加做任意组合如果不包含这些值或设为 0,则不使用这些控制条件。
1 :不接受 NULL 输入。防止用户只按回车或空格来响应输入请求。
2:不接受输入零值(0)。防止用户输入 0 来响应输入请求。
4:不接受输入负值。防止用户输入负值来响应输入请求。
8:即使 LIMCHECK 系统变量为打开时也不检查图形界限。使用户能够输入当前图形界限以外的点。即使 AutoCAD 的系统变量 LIMCHECK 当前被设置为开 (ON),本条件也照样对随后调用的用户输入函数有效。
16:目前不使用。
32:用虚线绘制拖引线或拉伸方框。对于那些可以由用户在图形屏幕上通过选择位置来指定一个点的函数,设置该控制位将使拖引线和拉伸方框显示为虚线而不是实线(某些显示驱动程序用颜色醒目的线来代替虚线)。如果系统变量 POPUPS 设为 0AutoCAD 将忽略该控制位。
64:忽略三维点的 Z 坐标(只用于GetDistance 方法). 该项忽略由 GetDistance 方法返回的三维点的 Z 坐标,以使应用程序确保该函数返回的是二维距离。
128:允许任意输入任何用户类型。
KeyWordVariant[变体] (字符串数组); 仅用于输入; 【可选项】将被后续的用户输入方法识别的关键字。
说明
在调用GetKeyword 前必须用该方法定义关键字。假如已经调用该方法定义了关键字,请确定用户输入方法可接受正常返回值以外的关键字值。可接受关键字的用户输入方法有:GetKeyword, GetInteger, GetReal, GetDistance, GetAngle,GetOrientation, GetPoint, 和 GetCorner。
示例暂略!
T.IsRemoteFile方法
RetVal = object.IsRemoteFile(LocalFile,URL)
LocalFileString[字符串]; 仅用于输入下载的文件。
URLString[字符串]; 仅用于输出下载的文件的URL (如果有)
RetValBoolean[布尔值]
TRUE: 文件从远程位置下载。
FALSE: 文件不从远程位置下载。
说明
该方法与 IsURL 方法相反,它提供了从本地文件到下载的文件所对应的 URL 映射。
示例暂略!, |0 g* O2 }5 E8 Q3 g
 楼主| 发表于 2019-3-29 20:55:38 | 显示全部楼层
U.IsURL方法
RetVal = object.IsURL(URL)
URL: String[字符串]; 仅用于输入所要验证的URL
RetValBoolean[布尔值]
TRUE: 字符串为有效的 URL。
FALSE: 字符串为无效的 URL。
说明
“无效”的 URL 定义与应用程序有关,在这里给定的第三方应用程序可能对支持所有 Internet 协议不感兴趣。例如,一个应用程序试图连接用户到网站而不需要提供访问到 FTP 站点。在这种假定的应用程序中,如果 URL 不是以“http://”开头,将返回 FALSE。
该方法默认的功能支持 FTPHTTPHTTPS FILE 协议。
示例暂略!
V.LaunchBrowserDialog方法
启动 Web 浏览器窗口,允许用户导航到任意 URL 并可指定 URL。暂略!
W.PolarPoint方法
RetVal = PolarPoint(Point, Angle, Distance)   获取与给定点指定角度和距离的点坐标。
PointVariant[变体] (三元素双精度数组); 仅用于输入指定起点的三维WCS坐标。
AngleDouble[双精度]; 仅用于输入以弧度为单位的角度值。
DistanceDouble[双精度]; 仅用于输入以当前单位为单位的距离值。
RetValVariant[变体] (三元素双精度数组)该三维WCS的坐标是根据相对给出点的距离和角度得到的坐标。
  1. Sub PolarPoint方法()2 h9 e# p( N1 v: `$ U/ h
  2. '此示例查找与基点之间给定距离和角度的点的坐标。- x, X2 K; U& S! y
  3.     Dim polarPnt As Variant! s. W# z% {5 J2 q. l; Q
  4.     Dim basePnt(0 To 2) As Double7 d$ t3 t/ g/ W( ^
  5.     Dim angle As Double- y2 u  w4 w/ {) M& p; s* _
  6.     Dim distance As Double4 R$ }, A, h  J5 j2 R2 B' A
  7.     basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0#
    2 e3 _: j! X; T# E
  8.     angle = 3.1415926 / 2 ' 90 degrees0 }+ M, [& s* q
  9.     distance = 5& _  x: z* k% p2 g- M) `, ?. A" U4 O
  10.     polarPnt = ThisDrawing.Utility.PolarPoint(basePnt, angle, distance)
    * W' [( j  A1 q5 E* ]
  11.     ' 从基点到选择点之间画一条直线$ n0 ]5 a/ [0 d; r
  12.     Dim lineObj As AcadLine+ T5 n1 g7 N! p& ~4 e
  13.     Set lineObj = ThisDrawing.ModelSpace.AddLine(basePnt, polarPnt)
    # d9 u0 n) ]" ^4 R( C
  14.     ZoomAll9 A+ I* m/ D2 o; [6 K. L* k; I
  15. End Sub
复制代码

* I) U) S2 B) I! ?
X.Prompt方法
object.Prompt Message
MessageString[字符串]; 仅用于输入要显示的提示内容。
Sub Example_Prompt()
'此示例将使用实用程序对象向AutoCAD命令行显示提示。要在运行示例后查看结果,请切换到AutoCAD并查看命令行。
   ThisDrawing.Utility.Prompt "L 0,0 100,100  "   '只是在命令行显示字符串,并不能发送命令绘图!
End Sub
Y.PutRemoteFile方法
object.PutRemoteFile URL, LocalFile
URLString[字符串]; 仅用于输入指定要上传文件的 URL 位置。
LocalFileString[字符串]; 仅用于输入要上传的文件。
说明
该方法是为了完善GetRemoteFile 方法来设计的。
当连接到一个安全的URL后,会弹出一个对话框提示用户输入必要的密码信息。如果用户没有在其浏览器中抑制该行为,则会出现消息框。
示例暂略!' J1 P+ `. |7 m5 b; B$ f
 楼主| 发表于 2019-3-29 20:57:23 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-29 20:58 编辑
( d8 l2 f" D6 V: D( u' R0 m+ w. D! {3 V9 W! C# `' v4 I% V! N
Z.RealToString方法
RetVal = RealToString(Value, Unit,Precision)
ValueDouble[双精度]; 仅用于输入要转换的值。
UnitAcUnits 常数; 仅用于输入
acDefaultUnits  默认格式
acScientific     科学计数法格式
acDecimal      十进制格式
acEngineering   工程格式
acArchitectural  建筑格式
acFractional    分数格式
PrecisionInteger[整数]; 仅用于输入值的精度。为 0 8 的整数
RetVal字符串,相应格式的字符串值。
  1. Sub RealToString方法()
    $ }& }% G5 B0 E' P) B
  2.     ' 此示例将给定格式的值转换为等效的字符串。4 U0 ]1 L. ?# B6 j
  3.     Dim unit As Long. H* t+ ~: r5 Y! _3 ~0 \
  4.     Dim valueAsStr As String8 d, `6 ?5 ?4 a9 Q- \2 @
  5.     Dim precision As Integer3 W- m' t& M6 w+ k
  6.     Dim valueAsReal As Double# G! P' {4 Y# R* X- H, ]
  7.     precision = 6- j8 u; \+ [  }. [9 f
  8.     '使用科学模式将实值17.5转换为字符串
    3 _4 ^6 E5 ?& A! o
  9.     unit = acScientific( y% Q8 y0 ]: ?" N3 c
  10.     valueAsStr = ThisDrawing.Utility.RealToString(17.5, unit, precision)0 S8 m% P: @% i; h' h7 L
  11.     MsgBox "17.5科学格式为" & valueAsStr, , "RealToString 示例"! U" B8 [" t" q/ E. b( K
  12.     ' 使用十进制模式将实值17.5转换为字符串. p, E; c/ v% l+ T3 ~
  13.     unit = acDecimal
    1 P2 q! E- [; `" n$ T3 n
  14.     valueAsStr = ThisDrawing.Utility.RealToString(17.5, unit, precision)* |* G7 Y- p- P' _( T$ d
  15.     MsgBox "17.5十进制格式为" & valueAsStr, , "RealToString 示例"" t, Z* v5 q: t' u; {' m" H6 S
  16.     ' 使用工程模式将实值17.5转换为字符串3 {9 p2 V: V, z, N. k5 `
  17.     unit = acEngineering
      Z1 a/ y: m; T* b' Y
  18.     valueAsStr = ThisDrawing.Utility.RealToString(17.5, unit, precision)
    6 R: [  `3 ^# d' H) |
  19.     MsgBox "17.5工程格式为" & valueAsStr, , "RealToString 示例"
    & b$ f$ C6 Y$ O. m' l& H) D
  20.     ' 使用体系结构模式将实值17.5转换为字符串' ^. ]3 l  F& e6 N% q- @/ @( K- j
  21.     unit = acArchitectural
    3 m) E* r6 j* K# _1 B3 o
  22.     valueAsStr = ThisDrawing.Utility.RealToString(17.5, unit, precision)
    , h' r5 _( H, @% o* x  R, w4 q9 e( E
  23.     MsgBox "17.5建筑形式为" & valueAsStr, , "RealToString 示例"
    ; J- t, G$ m. o7 G$ R2 I
  24.     ' 使用分数模式将实值17.5转换为字符串
    ' R# t% S1 r4 h) n5 V; J
  25.     unit = acFractional5 `( C/ E& ?/ B& [* [
  26.     valueAsStr = ThisDrawing.Utility.RealToString(17.5, unit, precision)
    8 t7 @! K2 b6 E
  27.     MsgBox "17.5分数格式为" & valueAsStr, , "RealToString 示例"% F- ^- c1 f2 p& T
  28. End Sub
复制代码
4 e# B1 h3 B: y" |! ^& f0 c/ y

% ?" ?6 h. O1 w5 x( f- Z- p0 T) aAA.SendModelessOperationEnded方法
object.SendModelessOperationEnded(Context)
AB.SendModelessOperationStart方法
object.SendModelessOperationStart(Context)
AC.TranslateCoordinates方法
RetVal =object.TranslateCoordinates(OriginalPoint, From, To, Disp[, OCSNormal])  将点从一个坐标系转换到另一个坐标系。
OriginalPoint Variant[变体] (三元素双精度数组); 仅用于输入指定要转换的源坐标的三维 WCS 坐标。该参数可被看为一个点或相对于 Disp 值的位移矢量。
FromAcCoordinateSystem 常数; 仅用于输入点的源坐标系,有如下参数。
acWorld          acUCS         acOCS         acDisplayDCS       acPaperSpaceDCS
ToAcCoordinateSystem 常数; 仅用于输入点将被转换到的坐标系。
acWorld         acUCS         acOCS         acDisplayDCS        acPaperSpaceDCS
DispInteger[整数]; 仅用于输入位移矢量标记
TRUE: OriginalPoint 作为位移矢量。 FALSE: OriginalPoint 作为一个点。
OCSNormalVariant[变体] (三元素双精度数组); 仅用于输入;可选项OCS 的法线。
RetValVariant[变体] (三元素双精度数组)转化后的三维坐标。
说明
用户不能直接将坐标从一个OCS 转换到另一个 OCS。首先将一个坐标从一个 OCS 转换为中间坐标系(如 WCS),然后将其坐标转换为第二个 OCS 。
Polyline LightWeightPolyline 上的点从 OCS 转换到 WCS
1. Coordinate Coordinates属性中获得 OCS 点的 X Y 坐标。
2. 通过 Elevation 属性获得 OCS 点的 Z 坐标。
3. Normal 属性中获得样条曲线的法线。
4. X, Y, Z 坐标及 Normal 调用TranslateCoordinates
示例暂略!
! s+ u# T& p* w3 X- @: U' G% ^关于Utility对象及其方法示例下载:
# B9 C# Q5 @3 B1 D; r 2.12、很有用的Utility对象.zip (19.21 KB, 下载次数: 11)
 楼主| 发表于 2019-3-29 21:02:18 | 显示全部楼层
13、使用Utility对象手动辅助绘图示例
" K2 A) X8 ?* [% B

- X3 ~" q" B. J. s' ^3 FA、手动三点画弧
  1. Sub 手动三点画弧1(): x, y6 A- @, O- X8 }6 V/ `$ |1 ~
  2.     Dim P1 As Variant, P2 As Variant, P3 As Variant, L1 As AcadLine, L2 As AcadLine
    , a+ {* l9 ]/ z7 F
  3.     With ThisDrawing
    + u, N$ I8 T. V- w" v
  4.         With .Utility
    0 y  r+ k7 `8 b8 L5 e1 N* R7 B+ g
  5.             P1 = .GetPoint/ ^; Z0 s6 n) T
  6.             P2 = .GetPoint
    0 J( }* W- W0 ~
  7.             P3 = .GetPoint
    $ M0 n! d) b+ Z
  8.         End With: n0 Z+ l* t  j
  9.         Set L1 = .ModelSpace.AddLine(P1, P2)
    + y& K( @5 P: d  \% Y5 R
  10.         Update; p/ f- P% V5 U1 N7 E. s
  11.         Set L2 = .ModelSpace.AddLine(P2, P3)
    & b  n& C; V  j; g# P( u3 F
  12.         Update. p) ~1 f4 g8 v' Y# Y" i( H- g
  13.         L1.StartPoint = .Utility.PolarPoint(L1.StartPoint, L1.Angle, L1.Length / 2)   '将L1起点坐标修改为L1中点坐标
    6 o/ b- `: i) q; ^9 h5 E3 A
  14.         Update! N0 h) b$ B  ~* @$ G  Y
  15.         L1.Rotate L1.StartPoint, .Utility.AngleToReal(90, acDegrees)                  'L1绕新起点旋转90°(将90转换为弧度)9 H4 V7 D1 U+ N( `6 W+ ?4 @' L
  16.         Update0 P7 f7 ]) t5 g' t$ P( h* R
  17.         L2.StartPoint = .Utility.PolarPoint(L2.StartPoint, L2.Angle, L2.Length / 2)   '将L2起点坐标修改为L2中点坐标8 G( f' Y& g' c) t7 ]
  18.         Update& O% e0 d- D2 b. [( h& v& d) F
  19.         L2.Rotate L2.StartPoint, .Utility.AngleToReal(90, acDegrees)                  '同样将L2绕新起点旋转90°
    , N% a$ o% {, {( M5 U
  20.         Update" S9 g. M$ Z# m9 J
  21.         L1.StartPoint = L1.IntersectWith(L2, acExtendBoth)      '将L1起点修改为L1和L2相交的交点坐标(双方都延伸),也就是圆心。5 d9 N0 L! u' ~8 W
  22.         Update) y$ }) p. r0 V5 i# |4 ]
  23.         L1.EndPoint = P1/ b3 A8 l6 |5 m7 p: j! f
  24.         Update
    ' F9 P; ?  X5 J
  25.         L2.StartPoint = L1.StartPoint     'L2的起点坐标修改为L1的起点坐标,也就是圆心处。
    7 y" f% B! F  B: t! A7 d$ j
  26.         Update
    9 j2 v- M/ c" N) a+ \
  27.         L2.EndPoint = P3
    $ Z- q( _0 g! l3 F
  28.         Update3 Z- q, A( w" h4 c1 E
  29.         .ModelSpace.AddArc L1.StartPoint, L1.Length, L1.Angle, L2.Angle1 m; j+ h- P8 s; x: h
  30.         Update6 H( [5 y- P& w0 {/ g! S; l% `7 W
  31.         .ModelSpace.AddArc L1.StartPoint, L1.Length, L2.Angle, L1.Angle
    , X8 U# Z. Q8 L3 X1 A* P
  32.         Update
    ; N+ y# B% A2 L2 N
  33.         L1.Delete7 S" Q" j9 T  r! A' L- O
  34.         Update
    ) s( b% X3 b4 Y- X* J
  35.         L2.Delete
    . K0 [: {% f/ q0 p/ F
  36.         Update
    * A. a. o0 }2 ~) m
  37.     End With
    " D+ s6 ]5 J, G9 z
  38. End Sub
复制代码
+ e  W  g' Z3 d
B、手动三点画圆
类似手动三点画弧,因此没有想到其他解法时暂略重复代码!
# }5 _; `$ u" H; b& U  x" Z9 O. `
C、手动两点半径画弧
  1. Sub 手动两点半径画弧()' O3 h1 k! f( h9 z8 `0 @, f) E  f# n
  2.     Dim P1 As Variant, P2 As Variant, R As Double, L As AcadLine, ARC As AcadArc! F7 f9 i% t! U, p; u$ `+ H% O
  3.     With ThisDrawing
    & L. A2 e4 k( n3 L
  4. X:, N& R/ b/ a4 C( d
  5.         With .Utility
    " w  i  `- w& B! ?" e- h4 [+ F  F8 w
  6.             P1 = .GetPoint* [! c) j* I0 b7 i. }
  7.             P2 = .GetPoint
    8 k3 F! s$ B9 |4 o( U9 C! g5 O
  8.             R = .GetReal("请输入圆弧半径(Double类型)"); O/ R  c, p1 O. S
  9.         End With. g! F: r# B! p' h% w7 Z% s5 l
  10.         Set L = .ModelSpace.AddLine(P1, P2)
    * [, P( [7 a) `
  11.         Update& Z" V$ U0 y- d4 K% a3 s
  12.         Dim FirstAngle As Double, EndAngle As Double
    0 W% l& I* s2 |4 c
  13.         If L.Length > 2 * R Then
    ; f8 T6 \* @. D) `. n( `
  14.             If MsgBox("输入的两点距离大于半径的2倍,无法画弧,请重新输入!", vbYesNo + vbInformation, "AutoCAD友情提示") = vbYes Then* y$ u' J9 N! V  W5 B5 J& n
  15.                 GoTo X
    ; U6 X# |6 Y  \- S# ~( W
  16.             Else9 z+ @$ j8 ?2 i2 F& F
  17.                 Exit Sub
    ; U; q; F: I6 B' D  _; E6 K  J: F) W3 G
  18.             End If/ M6 ?" l. d' C1 S  D* U2 m
  19.         ElseIf L.Length = 2 * R Then( P" X; m- x4 Q1 ]1 @. m
  20.             Dim P0 As Variant
    5 b' Z- ]' @3 Y# ~% Q
  21.             With .Utility
    & e; I7 B7 ~- O* |9 K7 _* l
  22.                 P0 = .PolarPoint(P1, L.Angle, L.Length / 2)     '获取圆心坐标
    - ^! K4 Z- B7 h+ V! P1 i. k! l
  23.                 FirstAngle = .AngleFromXAxis(P0, P1)            '获取起始角弧度1 [& z% Q2 V" S9 O
  24.                 EndAngle = .AngleFromXAxis(P0, P2)              '获取终止角弧度) r) s; h3 {. v2 S% T" G; i
  25.             End With2 u7 C# i. b; V
  26.             Set ARC = .ModelSpace.AddArc(P0, R, FirstAngle, EndAngle)
    7 U0 n4 B, R% z0 y& N' d( ]
  27.             Update
    " c8 g% [" e6 p+ A- G# B. v% _# R
  28.         Else
    ; R" \+ Z, O" l9 P; Q' q+ ^
  29.             Dim P01(2) As Double, P02(2) As Double, cir1 As AcadCircle, cir2 As AcadCircle1 O1 u. K! A4 Z' ?4 ~
  30.             Set cir1 = .ModelSpace.AddCircle(P1, R)6 {" ?' I9 U( ^" e# `$ q
  31.             Set cir2 = .ModelSpace.AddCircle(P2, R)
    # L) y3 g: Y, J$ ~) l
  32.             P01(0) = cir1.IntersectWith(cir2, acExtendNone)(0)      '第一个圆心坐标
    * g1 G7 ]/ W. Z1 [+ _7 V# n4 P
  33.             P01(1) = cir1.IntersectWith(cir2, acExtendNone)(1)
    : r0 ?, ?0 {$ ?3 R! r* ~
  34.             P02(0) = cir1.IntersectWith(cir2, acExtendNone)(3)      '第二个圆心坐标
    3 ?% b, {6 b: |8 W" _9 ~
  35.             P02(1) = cir1.IntersectWith(cir2, acExtendNone)(4)+ M( L+ \) e9 Z1 j$ g- b+ N( p
  36.             With .Utility
    # Q- C, W) u: Z# }0 ]
  37.                 FirstAngle = .AngleFromXAxis(P01, P1)
    * S9 Q" d) [1 h; Z! b3 D
  38.                 EndAngle = .AngleFromXAxis(P01, P2)0 v: f3 x( t1 [' w/ k) E1 ]- |. T
  39.             End With
    * t$ C5 r" v1 F1 _
  40.             Set ARC = .ModelSpace.AddArc(P01, R, FirstAngle, EndAngle)
      u/ v, \7 l8 p2 ]
  41.             Update% i/ b7 t' p2 }7 ?: c3 v% h
  42.             
    $ M8 i7 l* a; m3 [
  43.             With .Utility. F' j9 s7 _5 @6 @. W
  44.                 FirstAngle = .AngleFromXAxis(P02, P1)$ U' n# M& i( q1 ~' H5 S
  45.                 EndAngle = .AngleFromXAxis(P02, P2)
    $ _5 S0 ?) k$ Q, e- a# h  `
  46.             End With
    : [4 Z9 ~4 k- n8 \
  47.             Set ARC = .ModelSpace.AddArc(P02, R, FirstAngle, EndAngle)8 n$ z5 t" V) _& V$ u! S+ V/ C
  48.             Update  [7 o2 p4 C3 g# \
  49.         End If1 V6 h; u0 A9 k& B# w1 ^* Z! j
  50.         cir1.Delete9 W8 F( V1 z5 \8 M7 ]
  51.         cir2.Delete
    ' K1 i: a+ O7 j5 E: \! u/ m2 D
  52.     End With
    , s; ^5 B& [3 L$ X6 j
  53. End Sub7 J" \, I0 ]4 @3 {
复制代码
4 d+ v  ?6 A- l6 G1 ^
+ c- {% ^8 o' P& D8 E
2.13、利用Utility对象方法画图.zip (7.87 KB, 下载次数: 8)
 楼主| 发表于 2019-3-29 21:05:22 | 显示全部楼层
14、手动取点画图时添加提示线
2 q  [! W, E! {$ g( _3 u; ^
' p) {2 g' w7 H
想要在绘图时根据手动取点后,在上一点和下一点之间显示一条弹性线并有提示,在使用Utility对象的相关方法时,参数中的基点坐标不可省略!含有Prompt的方法均写上即可
A、手动画一条直线
  1. Sub 画直线()1 d/ @1 r' q) X6 O
  2.     Dim P1 As Variant, P2 As Variant, L As AcadLine1 L) v  E* K1 `8 ^8 x* ]
  3.     With ThisDrawing
    " H$ _5 f1 T! Q. t
  4.         With .Utility6 n* E0 u- ~# b  C/ U$ g2 A
  5.             P1 = .GetPoint(, "请选择第一个点的位置")
    + [" y# l# {( B
  6.             P2 = .GetPoint(P1, "请选择第二个点的位置")    '在第一个点和鼠标之间会有一个随鼠标移动的弹性线- }  P! B; U' C  m! L
  7.         End With
    % P9 N; C. I- }+ Y7 }( I. M% R
  8.         Set L = .ModelSpace.AddLine(P1, P2)' R8 L# c% D, M* N/ |" n
  9.     End With
    & b$ a/ d! h/ R  B
  10. End Sub
复制代码
  @# [1 m* y' s) x# q
B、手动画圆
  1. Sub 画圆()
    7 l) [& G8 F2 ~% J/ {: c- g, i
  2.     Dim P0 As Variant, R As Double, cir As AcadCircle) Z+ c" A3 F  s- u7 y% i: k6 V
  3.     With ThisDrawing3 R: d6 J  D! z. W- |3 m
  4.         With .Utility  A* F0 @, R. j) c- J
  5.             P0 = .GetPoint(, "请选择圆心所在位置")/ d, N9 m) _( p
  6.             R = .GetDistance(P0, "请输入圆的半径")  '以P0为基点,可以输入距离或者点击下一点
    . p0 K: Y; N: C3 C, f
  7.         End With
    ! u# ^7 L4 Y- t* b7 t. D- n& ^
  8.         Set cir = .ModelSpace.AddCircle(P0, R)/ l, ^& d! o' e: L
  9.         '以上写法只能实现在屏幕上出现提示信息和提示线,不会产生随鼠标动的圆/ K" C- n- E3 s( F' T
  10.         Set cir = .ModelSpace.AddCircle(P0, .Utility.GetDistance(P0, "请输入圆的半径"))
    1 n9 d8 _5 I- E5 s+ s' z
  11.         '同上,似乎不能产生随鼠标动的圆,需要用到LISP语言才有这个效果!
    * G+ M; K: {5 \) v
  12.     End With9 u! R) a! X- g) I2 ^4 g% k! r
  13. End Sub
复制代码

) X1 W. |- h, b
想要产生如同图形界面画图那样的生动效果,还是需要采用LISP语言比较合适.
2.14、手动绘图时添加提示信息及提示线.zip (5.56 KB, 下载次数: 9)
 楼主| 发表于 2019-3-29 21:08:45 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-29 21:09 编辑
- z6 E; [+ H- A$ I8 S1 c% b4 m* y; X- ~* F  u2 R/ _- T  ~3 |! A
15、样条曲线对象(SpLine)
& w- b3 r3 g2 m8 @1 \2 o; W, O
6 }4 s+ j0 F7 x9 p* R& h2 Y
A、添加样条曲线方法(AddSpline)
RetVal = object.AddSpline(PointsArray,StartTangent, EndTangent)
PointsArray: Variant[变体] (双精度数组); 用于输入定义样条曲线的三维WCS坐标数组。至少需要两个点(六个元素)来构成 Spline 对象。并且样条曲线始终以该数组的每三个元素为一个点的坐标,因此该数组大小必须为3的倍数若不指定元素值,默认坐标均为0
StartTangent: Variant[变体] (三元素双精度数组); 用于指定与样条曲线第一点相切的三维坐标。
EndTangent: Variant[变体] (三元素双精度数组); 用于指定与样条曲线最后一点相切的三维坐标。
关于此二参数的说明: 一组三维坐标代表一个点,与第一个点或最后一个点组成的直线方向就是对应起点或终点的切线方向;以起点或终点为直线的起点,水平向右为X轴,逆时针旋转至三维坐标点所在处的角度就是切向角。如果三维参数都是0,就是不指定方向(用CAD的默认方向)。9 E' b% U" f9 _9 o5 T. f, T9 ]/ L) s
RetVal:新创建的样条曲线对象。

8 J; a$ e, x4 g' K- {+ N
  1. Sub AddSpline方法(): f6 n" R- L9 ]* L8 i
  2.     ' 该示例在模型空间中创建样条曲线对象。
    ; I* ~- Y* ^9 s0 S7 v& x+ R% Z
  3.     Dim splineObj As AcadSpline8 s# \: S: {  m" |
  4.     Dim startTan(0 To 2) As Double' e& L/ S  k6 ?
  5.     Dim endTan(0 To 2) As Double
    % [7 G" {# j4 R  I0 v
  6.     Dim fitPoints(0 To 8) As Double
    1 P: n0 M8 p' P: h
  7.     startTan(0) = 0.5: startTan(1) = 0.5: startTan(2) = 0     ‘第一个点的切向点坐标
    7 ^& F$ t( O- Z2 f
  8.     endTan(0) = 0.5: endTan(1) = 0.5: endTan(2) = 0       ‘最后一个点的切向点坐标
    ( l5 {' R- Z: ~4 `/ o
  9.     fitPoints(0) = 1: fitPoints(1) = 1: fitPoints(2) = 0
    0 r, S1 x+ n. P9 n, a6 ?8 x
  10.     fitPoints(3) = 5: fitPoints(4) = 5: fitPoints(5) = 0. i& f& H( u3 i  T! a# E
  11.     fitPoints(6) = 10: fitPoints(7) = 0: fitPoints(8) = 0
    0 u8 z- A7 l- o, L, j- V9 K
  12.     Set splineObj = ThisDrawing.ModelSpace.AddSpline(fitPoints, startTan, endTan)- b) [9 j. T8 s
  13.     Update2 K0 t* Z: L& ~/ y7 c; x+ Y# Y
  14. End Sub
    , ?1 X2 p$ z1 y; ]
复制代码
- J5 }7 N1 r1 W" H3 y( k- x
5 m6 s" K0 P% L
B、样条曲线对象(SpLine)的常用方法及属性
常用方法:
Copy、Delete、IntersectWith、Mirror、Move、Offset、Rotate、Update……具体示例略,参考一下Reverse、Offset示例,体会一下Offset的结果是多条样条曲线的情况

# O* N5 C0 P5 y$ h3 Q  z
  1. Sub 样条曲线的常用方法()( e% Q& V! o4 D4 @8 U6 u
  2.     Dim P(299) As Double, SP As AcadSpline4 ?! A5 {7 O( h' N
  3.     Dim startTan(0 To 2) As Double$ z) x/ w. b: ]+ n: F6 Y
  4.     Dim endTan(0 To 2) As Double2 Q7 G# ^. K/ n! f0 e
  5.     Dim M%( _6 M0 R2 {& ]  b7 |# r" v2 v
  6.     Const π As Double = 3.14159265358979
    , _" F+ x( a' Q0 B; U. n
  7.     For M = 1 To 100
    ; F8 }4 f& f3 G/ Y7 Y( }
  8.         P(3 * M - 3) = M * 0.1# ?4 l. o( E2 X, P6 f" ]2 y
  9.         P(3 * M - 2) = Sin(M * π / 10)
    . H2 e; C8 u" [
  10.         P(3 * M - 1) = 0
    " r* Q% `* Q4 o
  11.     Next
    1 U5 N2 N# {. L$ t1 L0 r
  12.     startTan(0) = 0: startTan(1) = 0: startTan(2) = 0
    1 \8 l6 Y/ L+ @# @4 G7 A
  13.     endTan(0) = 0: endTan(1) = 0: endTan(2) = 0
    1 u: M6 P3 d, ?7 J; h+ C
  14.     Set SP = ThisDrawing.ModelSpace.AddSpline(P, startTan, endTan)) h. t9 z/ D6 {9 s" c" u
  15.     Update
      W5 t3 s0 Q1 c! q) o( N+ K# s
  16.     Rem 接下来参考反转和偏移示例,其他示例略!
    9 \4 H% B* u2 D- v4 P
  17.     Dim pll As AcadSpline, SPL As Variant
    ) n& p% [7 b. z1 K1 I* H9 j
  18.     Set pll = SP.Copy4 V9 _5 v# C. _4 p
  19.     Update
      L! f5 s' W; w
  20.     pll.Reverse     '反转样条曲线的方向:就是将原来的第一点变成最后一点,最后一点变成第一点。
    , J9 L- M" }- S7 ^8 m8 D7 W
  21.     Update. _/ {8 _% w& L9 A* b8 C6 \  b& B
  22.     SPL = SP.Offset(-0.5)   '正值向下偏移,负值向上偏移
    % @6 \3 [( D" X
  23.     Update
    ; U) L; g4 L& q: Y, M) j' v# s
  24.     SPL(0).color = acCyan  '发现偏移后的结果不在是一条样条曲线,而是多条样条曲线
    / v2 @; P0 c; B0 Y" b
  25.     Update8 R. }  e$ G5 p# @% `0 i2 l% ]
  26.     SPL(3).color = acCyan  '发现偏移后的结果不在是一条样条曲线,而是多条样条曲线
    # K2 h4 D/ H) D% D
  27.     Update
    2 ?) P* a( E7 z* L; E) B7 W
  28.     SPL(5).color = acCyan  '发现偏移后的结果不在是一条样条曲线,而是多条样条曲线$ X' J% n4 T6 [/ I5 B' E8 M1 j
  29.     Update$ w" u% m: v5 X; f9 Z( j5 ?7 L0 M
  30. End Sub& Y  I8 E2 `$ H$ y, M; e
复制代码

6 t3 Z  ^2 _$ n5 Q* Q% t, \9 r) F2 S4 F" f" q8 c+ V. g
常用属性示例
其他简单属性略:重点理解一下样条曲线的起止点的切向矢量:StartTangentEndStantgent
可以理解为另外的一个控制点,这个点相对于样条曲线的起(端)点,用于指示起(端)点的方向。这个点到起(端)点的直线长度是 1 ,比如T(0)=1,T(1)=0,就是0度方向(相对于X轴);T(0)=0.707,T(1)=0.707,就是45度方向(相对于X轴)。T(0)=-0.5,T(1)=-0.866,就是240度方向(相对于X轴)。如果三维参数都是0,就是不指定方向(用CAD的默认方向)。
按照CAD的规定,三维参数的平方和应该是1,不过不是1也行。反正就是按三维坐标算角度。当然,尽量按CAD的要求来,以免意外出错。即用三维坐标指示方向。
9 n3 T8 K) L6 M. h+ `5 `
  1. Sub 样条曲线的常用属性(); T( u* Y7 o! x+ s0 D% h' B9 s
  2.     Dim P(299) As Double, SP As AcadSpline1 }' W6 M) F3 \! H
  3.     Dim startTan(0 To 2) As Double
    8 T9 _# s, H5 p0 _! F
  4.     Dim endTan(0 To 2) As Double
    $ H/ _9 e* O& S9 v7 P" C
  5.     Dim M%3 O; b6 q, G3 ]' \( F: U% t; M
  6.     Const π As Double = 3.14159265358979
    % v9 j( D2 F- A6 v: B- b2 ?" z  @
  7.     For M = 1 To 1000 Q; n* C1 i9 M) P% E# |/ m
  8.         P(3 * M - 3) = M * 0.1
    7 X* [5 z6 _1 L( I7 V& P$ P
  9.         P(3 * M - 2) = Sin(M * π / 10)
    " c$ @2 R& ]& @' r
  10.         P(3 * M - 1) = 0) d' @' L2 y3 \- g7 h
  11.     Next, w9 x" [9 p9 ~: W8 X
  12.     startTan(0) = 5: startTan(1) = 5: startTan(2) = 0
    / B1 n  a6 m- L) P, C) U
  13.     endTan(0) = 10: endTan(1) = 10: endTan(2) = 0) r+ t- F/ V/ n- |4 I
  14.     Set SP = ThisDrawing.ModelSpace.AddSpline(P, startTan, endTan)* ?; n3 N) w8 R: d( ?! e9 W
  15.     Update; W' d/ f9 [6 h4 v4 z1 w
  16.     MsgBox SP.Degree    '不理解这个次数3是怎么定的?
    9 ?  V+ }, `2 i6 d( m7 c& E5 n
  17.     Dim X As Variant
    9 w% R( Z) K7 P) J
  18.     X = SP.StartTangent    '获取的结果坐标是0.7071067,0.7071067,00 p0 _% R1 @0 m7 ~: {% P1 P! Y& S' ]
  19.     X = SP.EndTangent      '同上,其实就是2^0.5/2,2^0.5/2,0: k+ T' p3 K: W
  20.     Dim p1(2) As Double, p2(2) As Double
    6 z. g0 x  p5 @
  21.     p1(0) = 2: p1(1) = 7
    , J2 ?' M: _6 ?' f* X$ Q+ |
  22.     p2(0) = 6: p2(1) = 9
    ! c( R9 |/ e; z% h5 f" i
  23.     SP.StartTangent = p1    '修改属性值,从新指定起点切向角9 ]6 p+ o, Q; y5 e) a: I" q
  24.     Update
    6 b- m  j1 g9 ?) k) H$ Y# T
  25.     SP.EndTangent = p2      '修改属性值,从新指定终点切向角
    1 ]7 u& e4 {% h0 L3 B+ K+ J! }
  26.     Update$ M% ]4 J1 W) a
  27.     X = SP.StartTangent    '新的切向点坐标2,7,0* p1 Z. ?3 F3 y* t
  28.     X = SP.EndTangent      '新的切向点坐标6,9,0/ }0 a; `+ r5 y  t
  29. End Sub  \: n' c% ?% {5 ?' o
复制代码

$ N6 a4 i6 O( L# G. E! I& p9 w
 楼主| 发表于 2019-3-29 21:12:53 | 显示全部楼层
C、画函数曲线
可以用样条曲线来画函数图像。

+ l8 q" z8 ^+ G3 K+ M* O% d
  1. Sub 三角函数()$ u2 g# o* l9 }: Y9 V
  2.     Dim P(299) As Double, SP As AcadSpline5 s/ H# f$ B1 h: b
  3.     Dim startTan(0 To 2) As Double
    0 i/ y- J2 S5 B0 i
  4.     Dim endTan(0 To 2) As Double1 {7 \) e& M$ G8 U8 X6 O
  5.     Dim M%
    / E% ~3 B; R5 S( S
  6.     Const π As Double = 3.14159265358979% a3 K- |6 \: n; K
  7.     For M = 1 To 100
    9 c0 A3 u8 R/ N; u/ p
  8.         P(3 * M - 3) = M * 0.1
    : ~1 [# x' u3 X) ?$ v
  9.         P(3 * M - 2) = Sin(M * π / 10)
    " C* X6 v# x. c' {4 H1 c6 k
  10.         P(3 * M - 1) = 06 R8 G9 l1 \' R* f) @+ k! L  H
  11.     Next( Q1 w  ~# i4 z3 Q) I, N2 _
  12.     startTan(0) = 0: startTan(1) = 0: startTan(2) = 0      ‘都是0表示默认CAD切向9 `9 B- `( ^. ~1 Q0 O3 g; A7 c6 P
  13.     endTan(0) = 0: endTan(1) = 0: endTan(2) = 0        ‘同上9 J9 M9 g2 r! C
  14.     Set SP = ThisDrawing.ModelSpace.AddSpline(P, startTan, endTan)4 T: _$ f+ Q  o3 P- Q8 M; L- e3 H
  15. End Sub
    & f- i* f, a( q8 Z+ j' {4 e# @) o
复制代码
  1. Sub 二次函数()
    " L  G6 k8 M4 r- G
  2.     Rem Y=0.2*X^2+0.3*X-8
    0 ~% n- W* t) N( A2 Y$ E; B2 [
  3.     Dim ps(902) As Double, SP As AcadSpline: O, l& p# c+ r7 ?/ o
  4.     Dim startTan(0 To 2) As Double! a4 P) G- S( P/ D0 F3 e! W
  5.     Dim endTan(0 To 2) As Double  d+ q- D& k- L/ T) U
  6.     Dim x#, y#
    6 K* P. w3 d9 I) H
  7.     For x = -150 To 150
    $ f" s5 }/ V: y4 Q3 {
  8.         y = 0.2 * x ^ 2 + 0.3 * x - 8
    ( e, ?5 J4 ^4 N1 J8 o
  9.         ps(3 * (x + 151) - 3) = 0.1 * x
    ( B  M1 x0 {2 k& ^% s. T1 `
  10.         ps(3 * (x + 151) - 2) = 0.01 * y
    : ^+ p* P+ F9 e
  11.         ps(3 * (x + 151) - 1) = 0          'Z坐标值不写也可以,默认为01 {" c7 x; ]$ @" ]9 v. [
  12.     Next: ^7 R: k8 @: E, m: `+ S  V' I
  13.     startTan(0) = 0: startTan(1) = 0: startTan(2) = 0
    6 }2 r! l2 A$ e; m2 ?* b% j
  14.     endTan(0) = 0: endTan(1) = 0: endTan(2) = 0$ F7 B7 x4 I3 s# ]6 N( ~8 @
  15.     Set SP = ThisDrawing.ModelSpace.AddSpline(ps, startTan, endTan)6 z) n1 q0 @& d, e7 i+ n7 Y
  16. End Sub
    ' Z0 u6 x; z) s) H2 ]4 L
复制代码
  1. Sub 二次函数02()$ L6 S: ^* L) ~' U) y
  2.     Rem Y=0.2*X^2+0.3*X-8
    ( s. Z' {$ _# e9 W
  3.     Dim ps(902) As Double, SP As AcadSpline
    % {9 d6 q8 z5 H' b: W+ \
  4.     Dim startTan(0 To 2) As Double/ w& ~9 o& R5 c* z2 Q! s
  5.     Dim endTan(0 To 2) As Double
    9 y0 s) [' l3 Q5 R! B0 `* `
  6.     Dim x#, y#
    ( k) t! m$ g- H9 \/ J
  7.     For x = -150 To 150; `1 N8 \+ T, D: {. ~4 s
  8.         y = 0.2 * x ^ 2 + 0.3 * x - 87 o3 Z  J% X$ l, q# n+ Y: C
  9.         ps(2 * (x + 151) - 2) = 0.1 * x
      y+ a2 U; H( z% \9 S, N0 l
  10.         ps(2 * (x + 151) - 1) = 0.01 * y% {$ T: l% h7 s1 [$ c! m* J
  11.     Rem 样条曲线的点坐标默认每3个坐标为1个点,后续没有赋值的点默认为0,所以此例画出的是三维图像!
    % b: Y5 P) T+ L& v9 [
  12.     Next
    ' C- V+ a1 Z4 d2 X# X* ~
  13.     startTan(0) = 0: startTan(1) = 0: startTan(2) = 0
    # D2 R5 r  `. T% R# {
  14.     endTan(0) = 0: endTan(1) = 0: endTan(2) = 0
      M, _- m: g1 I) z
  15.     Set SP = ThisDrawing.ModelSpace.AddSpline(ps, startTan, endTan)5 z: q6 [' \' x# g6 Z$ p5 x+ l) h) y
  16. End Sub6 ^! I" s( H$ U  S& \0 [
复制代码
  1. Sub 任意函数()         '没成功!!!!!+ A/ p+ N- d. w! Z, S- G7 J
  2.     Dim ps(902) As Double, SP As AcadSpline
    " `2 n5 k* {2 A4 o8 ^
  3.     Dim startTan(0 To 2) As Double
    - k5 |  Z: v0 E, w7 A+ u2 V4 t: B
  4.     Dim endTan(0 To 2) As Double& f! g8 O9 x) M! v
  5.     Dim x#, y#, F
    , Q' X) Z& k. Z$ x% E
  6.     F = InputBox("请输入一个关于x的表达式:")" M: V6 e- q9 b$ _& Y; z  G
  7.     '    F = ThisDrawing.Utility.GetKeyword("请输入一个关于x的表达式:")   '该方法首先需要一个关键字列表,然后从中选择。
    , g4 R; \# X! P9 F* C/ Z
  8.     '    F = ThisDrawing.Utility.GetString(False, "请输入一个关于x的表达式:")   '直接返回字符串,后续不可用,使用val转换只能得到0, Y, s  Y6 A* L) F
  9.     '    F = ThisDrawing.Utility.GetInput()     '该方法首先需要一个关键字列表,然后从中选择。
    ! e: b; j4 b+ x, E7 m9 `
  10.     For x = -150 To 150
    1 A, ~: S1 G0 m; P+ n1 o
  11.         y = Evaluate((Replace(F, "x", x)))  '在Excel中使用Evaluate函数可以取值(不能自动识别变量,需要用replace函数替换一下)。但是CAD中不行啊!用VAL函数转换也不行。
    # u* a: t4 y. ~" v- E5 G9 p
  12.         ps(3 * (x + 151) - 3) = 0.1 * x
    / ?) r; u3 B' a4 T% w
  13.         ps(3 * (x + 151) - 2) = 0.01 * y8 d9 U: v1 r! F- L1 b" |3 z! E
  14.         ps(3 * (x + 151) - 1) = 0
      ?* U# j+ U9 u$ B1 U$ r9 J
  15.     Next
    - @/ J0 k6 w8 d3 Q5 w# B) k
  16.     startTan(0) = 0: startTan(1) = 0: startTan(2) = 0
      I" X" q$ n! u3 ]
  17.     endTan(0) = 0: endTan(1) = 0: endTan(2) = 0
    , ?$ W% K  h( ]' M
  18.     Set SP = ThisDrawing.ModelSpace.AddSpline(ps, startTan, endTan)
    ! L, o$ l) q8 k
  19. End Sub
    * v$ ^, u, K4 x, R3 @
复制代码

: d$ C& Y% a3 F
2.15、样条曲线对象(SpLine).zip (10.36 KB, 下载次数: 8)
 楼主| 发表于 2019-3-29 21:14:59 | 显示全部楼层
16、椭圆对象(Ellipse)5 u3 c1 p- Z" j  ~8 j8 {

0 Q2 e. D3 i- ?# ~A、添加椭圆方法(AddEllipse)
RetVal = object.AddEllipse(Center,MajorAxis, RadiusRatio)   
以上方法是给定中心点、长轴的一个端点短轴与长轴半径比WCSXY平面上创建椭圆。
CenterVariant[变体] (三元素双精度数组); 仅用于输入指定椭圆中心点的三维WCS坐标。
MajorAxisVariant[变体] (双精度); 用于输入长轴端点的三维WCS点坐标(相对中心点的相对坐标)
RadiusRatioDouble[双精度]; 仅用于输入定义椭圆短轴与长轴比例的正值(0<RadiusRatio≤1)。半径比为1.0时定义的是圆。比值越小越扁。
RetVal结果就是新创建的椭圆对象。
说明
椭圆可以是闭合的或开放的(即椭圆弧),它创建于当前WCSXY面上。该对象表示一个真正的椭圆,而不是多段线拟合的椭圆。要画椭圆弧必须先画椭圆,然后修改椭圆的起始角和终止角属性值来画椭圆弧
) T# _4 o9 g1 _2 L
  1. Sub AddEllipse方法01()
    7 q  V3 g& B  _4 }' `
  2.     ' 该示例在模型空间中创建椭圆。
    % A9 S- J' W$ R2 O! ]
  3.     Dim ellObj As AcadEllipse9 D: C* V  q+ A7 X+ z8 e
  4.     Dim majAxis(0 To 2) As Double" G  q9 q8 e  b* T4 j7 D
  5.     Dim center(0 To 2) As Double
    8 d9 j6 _: r) |! X: p% i2 O
  6.     Dim radRatio As Double
    " P1 k( Z4 u* d8 R; p# S
  7.     Rem 其中第二参数majAxis表示的点坐标是相对第一参数的相对坐标  B, c4 X  W( @: V, d* F2 C
  8.     Rem 在绘制的图中第二参数表示的点在长轴的一个端点上。需注意!!
    4 Y4 R6 A0 j1 u5 _% s- `
  9.     center(0) = 5#: center(1) = 5#: center(2) = 0#
    ) Z+ S3 ]# F; {- F6 d" L8 r. @
  10.     majAxis(0) = 10: majAxis(1) = 20#: majAxis(2) = 0#  '只输入一个值,默认另两个坐标为0
    / ?3 ]( G5 j$ K
  11.     radRatio = 0.3. s+ ]/ m$ p3 K  l
  12.     Set ellObj = ThisDrawing.ModelSpace.AddEllipse(center, majAxis, radRatio)
    - Q8 G, _( R( w0 {
  13.     Update+ i: x6 U$ P' _
  14.     Call ThisDrawing.ModelSpace.AddLine(center, majAxis)6 n9 g- Y& \+ H( s  M
  15.     '直线的终点坐标是绝对坐标,所以不在椭圆的端点上。
    7 t! o2 g+ H; K% Z
  16.     Update
      t# x5 Z! R; o
  17. End Sub
    0 z6 U9 n1 {2 V
复制代码
可以使用椭圆方法画一个灯笼:)

( M8 O6 ^  Y$ e- j. _* }. `
  1. Sub AddEllipse方法画灯笼()
    ( w  o; K1 P# s" _5 g
  2.     Dim ellObj As AcadEllipse: c5 V* Q2 L4 l8 H. V, t) R6 c
  3.     Dim majAxis(0 To 2) As Double
    5 j2 }7 O) O+ U2 m  V* J
  4.     Dim center(0 To 2) As Double( M) @/ |; f6 U
  5.     Dim radRatio As Double, m%4 Y& E5 Q4 h$ |
  6.     For m = 1 To 200 X% L9 E1 ~& M. e& L& T# t
  7.         center(0) = 5: center(1) = 5: center(2) = 0! I/ P8 _! j; ]9 @: F8 C
  8.         majAxis(0) = 10: majAxis(1) = 20: majAxis(2) = 0
    # X" @: x) Z! m
  9.         radRatio = (m - 1) * 0.05 + 0.05 '取值范围大于0,小于等于17 c6 ?' g$ Q' D, z) l
  10.         Set ellObj = ThisDrawing.ModelSpace.AddEllipse(center, majAxis, radRatio)' Y( l. ]/ j2 ^  O
  11.         Update8 M; o% x8 v4 _
  12.         ellObj.Copy
    3 R" M" f; y$ ]$ u/ {; Y0 |
  13.         ellObj.Rotate center, 3.1415926 / 2   '绘制的椭圆先复制后绕中心旋转90°7 j( Z9 ^3 D& ~$ C$ g! d  I
  14.         Update
    2 j% Q( |. i9 e% t4 f
  15.     Next) D& f( v* u6 }# a/ w0 B
  16.     Dim p1(2) As Double, p2(2) As Double, L As AcadLine! d) [0 T2 {7 n) u+ c  t
  17.     p1(0) = majAxis(0) + center(0): p1(1) = majAxis(1) + center(1)( ~+ L3 g% X& a7 n/ R
  18.     p2(0) = -majAxis(0) + center(0): p2(1) = -majAxis(1) + center(1)
    5 u0 D. @. T  G
  19.     Set L = ThisDrawing.ModelSpace.AddLine(p1, p2)/ X$ a  ?; `1 f- J- a* t
  20.     Update/ ~6 n/ e3 o5 S
  21.     L.Copy
    % E: o' i/ t3 Z" r- ?& L
  22.     L.Rotate center, 3.1415926 / 2 '直线先复制,后绕中心旋转90°* D  T: M3 r' m% R3 H% w* R
  23.     Update
    $ R. s' p6 U6 @. _5 L& S. B8 Z
  24. End Sub# I5 ^! _' o, d/ I' c
复制代码

6 u4 B) W: X: q* ^" _
4 E" u! G9 f4 R1 U+ X4 C
 楼主| 发表于 2019-3-29 21:17:27 | 显示全部楼层
B、椭圆对象(Ellipse)的常用方法及属性
椭圆对象的常用方法与其他对象一样,并没有特别的方法,常用的方法如:Copy、Delete、IntersectWith、Mirror、Move、Offset、Rotate、Update……具体语法不再赘述,参考示例如下:
需注意:椭圆对象偏移后的结果对象(数组)的图元不再是椭圆,而是样条曲线。
  1. Sub 椭圆常用方法()) g" S' W0 E$ V7 r5 ~; g
  2.     Dim ell As AcadEllipse8 T" M. K+ d+ A
  3.     With ThisDrawing, h. A. U9 |/ n; p
  4.         Set ell = .ModelSpace.AddEllipse(.Utility.GetPoint(, "请选择椭圆中心点"), .Utility.GetPoint(, "请选择椭圆的长轴端点"), .Utility.GetReal("请输入椭圆半径比(0,1]"))
    " g' t% T/ [  S  r, b
  5.     End With
    * L7 V5 }: w# r1 ?  k8 Y" @
  6.     Update
    + k( P. E& {$ W0 B" P4 _& q
  7.     Rem 上面的写法在选择第二个参数时不会产生一条弹性线跟随鼠标动
    , \" c- W) i* Z4 x" @- Q% a
  8.     Dim P0 As Variant
    ! o! U, t0 V- h( ~  u7 O
  9.     With ThisDrawing- [5 a) T+ G% |, ^
  10.         P0 = .Utility.GetPoint(, "请输入椭圆中心点")* e. b; ?: d4 C5 E# Y0 H% b
  11.         Set ell = .ModelSpace.AddEllipse(P0, .Utility.GetPoint(P0, "请选择椭圆的长轴端点"), .Utility.GetReal("请输入椭圆半径比(0,1]"))' c% W% e0 l. n# {2 U9 `
  12.         Update* g& P. V5 F8 G2 S" |: q8 q8 l2 s
  13.         Rem 上面的写法则可以在选择第二个参数时从第一个点到鼠标之间有一条弹性线跟随鼠标动。
    ) I5 U2 N( `, c
  14.         Rem 不管是点选还是输入的坐标,均是将第二个参数坐标值按照第一个参数中心点的相对坐标来绘制椭圆。0 Y( _3 V9 v+ ~
  15.         Dim ells As Variant
    # S2 K0 s& ^- X9 Q3 `3 G2 W% H
  16.         ell.Copy
    2 u  p& U2 z! E2 [2 O/ ~
  17.         Update
    : I5 D* T( A) n% _. m
  18.         ell.Move .Utility.GetPoint(, "请选择移动的第一个点"), .Utility.GetPoint(, "请选择移动的第二个点")
    2 a1 g; x  _% g- S; S7 d: P3 C3 M
  19.         Update  d0 j0 L7 t8 `; t. x3 x
  20.         ells = ell.Offset(.Utility.GetReal("请输入偏移距离,正外移,负内移"))    '偏移结果是新对象数组,而且图元不再是AcadEllise,而是样条曲线; W; m3 U2 i" o: s- K
  21.         Update# a# I6 |7 u5 S; C/ [6 A
  22.         ells(0).Rotate .Utility.GetPoint(, "请选择旋转的中心点"), .Utility.AngleFromXAxis(.Utility.GetPoint(, "请选择旋转角的第一个点"), .Utility.GetPoint(, "请选择旋转角的第二个点"))
    ! r& j; S4 N/ x8 B7 @
  23.         Rem 上面旋转时先提示第一个点,再提示第二个点,最后提示中心点。。。??这是为啥?) n9 X! {& S& E: g6 E0 _: J3 F
  24.         Update
    : ]3 O" a' I+ x! f. [* {
  25.         ells(0).Mirror .Utility.GetPoint(, "请选择镜像轴的第一个点"), .Utility.GetPoint(, "请选择镜像轴的第二个点")
    , F) W8 v7 M3 j9 E
  26.         Update3 b, k$ X' C3 d) }2 R
  27.         Dim PS As Variant8 M5 y' m5 G' g
  28.         PS = ell.IntersectWith(ells(0), acExtendBoth)  '若相交,获取交点坐标数组,不能直接使用msgbox显示。
    - }' D% ~  b& }
  29.         Dim obj As Object
    * b! k3 N9 n. z/ b
  30.         For Each obj In .ModelSpace4 [5 S6 j- k6 s+ ~1 x- D
  31.             If TypeOf obj Is AcadEllipse Then, l% |4 U" Y1 h" y, a! l
  32.                 obj.Delete
    5 F, C3 ]+ D* N5 W4 `
  33.                 Update
    1 E0 s2 `+ M$ ]/ G
  34.             End If
    6 v7 D6 \/ {5 E# g- R
  35.         Next( v2 C; `$ C" d$ a# w
  36.     End With
    7 V/ e& P$ R6 T# o5 i! s  R
  37. End Sub
    3 S* a1 [4 i. I( ]) [" q
复制代码
, v# g4 i, j) a2 L6 a: V, V
椭圆对象的常用属性:其他简单的属性参考示例理解。
  1. Sub 椭圆常用属性(): [! j2 V/ p4 `; N! ^3 A
  2.     Dim ell As AcadEllipse, x As Variant8 m# r  r7 P2 Q, W/ r; r
  3.     Dim p1(2) As Double, p2(2) As Double, S As Double
    ( F) Z( h  j/ [+ w" s: ^
  4.     p1(0) = 5: p1(1) = 5
    6 m6 p: d" f% T) K5 P  K0 Y. c
  5.     p2(0) = 15: p2(1) = 15* J4 M  F6 Y6 N* l6 E' z5 G
  6.     S = 0.37; B$ l, x% [) t2 O/ V8 i
  7.     Set ell = ThisDrawing.ModelSpace.AddEllipse(p1, p2, S)7 i4 S' D+ {# w2 N, k4 o9 V% B
  8.     Update
    , c! x  L) w& l" g& j6 c
  9.     x = ell.Area            '获取椭圆的面积523.0752,只读属性
    5 N% S( r: U/ ~  \
  10.     x = ell.center          '获取椭圆的中心(5,5,0)
    1 q" ^8 ]/ S9 I; s$ h' [( g
  11.     ell.center = ThisDrawing.Utility.GetPoint()    '也可以修改中心属性,相当于移动
    6 {9 i8 C3 w4 x) ^
  12.     x = ell.EndAngle        '获取椭圆的终止角,完整椭圆终止角是2π弧度,可修改
    / ~5 x7 y" F- t+ ~) x9 C6 r3 g
  13.     x = ell.StartAngle      '获取椭圆的起始角,完整椭圆的起始角是0弧度,可修改/ S$ U: F0 K2 C; W' x! g' r
  14.     x = ell.StartParameter  '获取椭圆的起始参数,完整椭圆的起始角是0弧度,可修改
      s2 ?- R" }$ U% O, Y/ [) c9 ~
  15.     x = ell.EndParameter    '获取椭圆的终止参数,完整椭圆终止角是2π弧度,可修改
    $ B: Y$ @4 v" V, s7 o  |
  16.     x = ell.EndPoint        '椭圆终点坐标,(20,20,0),也就是第二参数指定的长轴端点的绝对坐标,只读属性& H8 m6 R2 z7 v1 u0 k
  17.     x = ell.StartPoint      '椭圆起点坐标,(20,20,0),也就是第二参数指定的长轴端点的绝对坐标,只读属性4 O! s% E1 s8 B1 d& Q$ ~9 c
  18.     x = ell.RadiusRatio     '获取椭圆的短轴和长轴半径比,可修改* t% |6 ^' }, h4 n
  19.     x = ell.MajorAxis       '获取椭圆长轴端点坐标(15,15,0),是相对中心点的相对坐标/ G/ z. T% S& s+ U
  20.     x = ell.MajorRadius     '获取椭圆长轴半径0 D% Y. e- P2 o3 o1 d" L: _8 I+ n4 F
  21.     x = ell.MinorAxis       '获取椭圆短轴端点坐标(-5.55,5.55,0),逆时针旋转先经过的短轴端点坐标(相对中心的相对坐标)
    / c& ?) z: V0 c7 v' i9 Z
  22.     x = ell.MinorRadius     '获取椭圆短轴半径
    / I* g: r$ J' z# r/ J5 y9 W
  23. End Sub3 }2 V, i8 n7 h% I0 M$ ^
复制代码
; r1 Y" N$ O9 S% \' n

- }/ T' _3 R( R8 i- E- ?
1 Q' U( Y! |# W5 h8 Z% g
 楼主| 发表于 2019-3-29 21:19:53 | 显示全部楼层
C、创建椭圆弧对象
下面介绍一下通过修改椭圆的属性来创建椭圆弧:
1Ellipse.EndParameter属性:指定椭圆的终点参数角,[double]可读写,范围在[0,2π]
Ellipse.StartParameter属性:指定椭圆的起点参数角,[double]可读写,范围在[0,2π]
椭圆的起、终点坐标起、终点参数角关系按如下方程计算(按照椭圆所在面为XY平面,Z坐标默认0)。起、终点P的坐标为:P(X) =A * cos(θ) ,P(Y)= B * sin(θ)
以上坐标公式是在对象坐标系OCS中成立。在绝对坐标中仅中心点在(0,0,0),指定长轴端点在水平向右方向时成立!
起、终点参数角弧度的确认:以椭圆中心点为坐标原点,指定的椭圆长轴端点为X轴正方向,逆时针旋转为正角。但是实际得到的起、终点对应角度不一定是指定的参数角。
其中AB是椭圆的半长轴与半短轴。θ是指定的起、终点参数角弧度值。
2Ellipse. StartAngle属性:指定椭圆的起点角弧度[double]可读写,范围在[0,2π]
Ellipse. EndAngle属性:指定椭圆的终点角弧度[double]可读写,范围在[0,2π]
起、终点角弧度的确认:以椭圆中心点为坐标原点,指定的椭圆长轴端点为X轴正方向,逆时针旋转为正角。实际得到的起、终点对应的角度就是指定的起、终点角度。
3、角弧度θ和参数角弧度α的关系:tan(θ)=b*tan(α)   (b是半短轴与半长轴半径比)
可以用角弧度或参数角弧度来画一个椭圆。' u  d8 A7 [& S
  1. Sub 椭圆起止参数和角度属性()
    6 Y3 H. g1 X9 e2 X5 J
  2.     '此示例创建椭圆,并输入开始和结束参数以创建椭圆弧。
    - S* J4 h) D( |4 C4 o0 }, `( z
  3.     Dim ellObj As AcadEllipse, ellobje As AcadEllipse7 Q% i5 L5 a' N9 K0 r! Z4 Z' b5 ~
  4.     Dim majAxis(0 To 2) As Double9 H3 f- o. w$ A" e
  5.     Dim center(0 To 2) As Double
    0 M4 ]. ]8 m# J" a. R9 \
  6.     Dim radRatio As Double2 B, e' h( Q/ t; e3 Q/ A) ~' q
  7.     Dim p1(2) As Double, p2(2) As Double7 A% y1 n7 E5 N8 N& B
  8.     center(0) = 5#: center(1) = 5#: center(2) = 0#
    5 D& x* ~4 f" i4 ~
  9.     majAxis(0) = -10: majAxis(1) = -20#: majAxis(2) = 0#
    ; v# ^$ e" H8 V/ g
  10.     radRatio = 0.3
    . U' m5 j) \3 Z2 t
  11.     Set ellObj = ThisDrawing.ModelSpace.AddEllipse(center, majAxis, radRatio)
    + O$ ~* ]; H" ^' F, w( p
  12.     Set ellobje = ellObj.Copy
    / G, Z& s( }/ ~2 J
  13.     p1(0) = 5: p1(1) = 5
    # e2 a2 ?5 q8 N6 f) ~+ Z
  14.     p2(0) = 20: p2(1) = 5
    " @( c5 ~* Y1 {) \3 x" a7 Q
  15.     ellobje.Move p1, p21 R" _1 S  t8 D0 {6 j1 w
  16.     Update4 o+ w: U. G) Q  H# G7 _4 L6 w1 p
  17.     ' 输入开始参数1.57,结束参数6.28,可创建椭圆弧
    ) j* L! {1 h) L7 _. c! B, N
  18.     '角度的基准线是按照创建椭圆的中心点为原点,第二参数指定的端点为X轴正方向,逆时针旋转为正角。2 t( b, V* z3 Q0 k: [9 \' Q
  19.     ellObj.StartParameter = 3.1415926 / 2       '起始参数π/2=90°图上显示的角度也是90°。
    : u4 h3 {. r! K; X# p
  20.     Update1 j) b0 y) S6 g
  21.     ellObj.EndParameter = 5 * 3.1415926 / 3     '终止参数为5π/3=300°,但是图上显示的是332.542919°
    1 }4 }( H! b6 r9 E' Q. ]0 f
  22.     Update
    8 |0 g2 U, |, Q( l1 B4 d
  23.     Rem 下面通过修改起止角弧度来创建椭圆弧1 c, E" C0 s  p& A; P
  24.     '角度的基准线是按照创建椭圆的中心点为原点,第二参数指定的端点为X轴正方向,逆时针旋转为正角。. K( p# y0 B; L# Q9 k: J2 X
  25.     ellobje.StartAngle = 3.1415926 / 2          '起始角度为π/2=90°
    , l# Y/ h) Y5 _& q1 [
  26.     Update8 a( w9 i# o& P0 I# d4 F0 g7 g: G
  27.     ellobje.EndAngle = 5 * 3.1415926 / 3        '终止参数为5π/3=300°
    ' S; J- O9 [8 t) r! {3 O
  28.     Update
    ( j" K$ W% w2 g& l9 g
  29.     Dim x As Variant
    9 P/ `; [: v" W7 u. L7 O2 s
  30.     x = ellobje.StartPoint   '从指定的长轴端点开始逆时针旋转先经过的点为起点
    7 k; Q, |9 ?! J1 E
  31.     x = ellobje.EndPoint     '从指定的长轴端点开始逆时针旋转后经过的点为终点2 P" ^( l" N/ M/ c. U
  32. End Sub! p5 k* R" C- C
复制代码
: g5 `7 u& v4 q2 j3 u  T' }! S

3 y- x) l( u& ~# z. [. _
  1. Sub 角度与参数角属性01(), f6 H$ h6 l+ g# \8 e) l
  2.     Dim ell As AcadEllipse, p0(2) As Double, p1(2) As Double, b As Double
    $ @1 x, e4 T7 t$ Y. T
  3.     p0(0) = 0: p0(1) = 0      '便于观察,将中心点设置在坐标原点处
    3 W( S  M6 A* z1 m* {2 l4 k* h
  4.     p1(0) = 20: p1(1) = 0     '为了方便操作观察,半长轴为20,沿中心点水平向右- F2 u! ^/ b" ~" R2 @+ ~5 u' c  m9 \# S
  5.     b = 0.5                   '半短轴为10
    % t1 O0 `" w2 S
  6.     Set ell = ThisDrawing.ModelSpace.AddEllipse(p0, p1, b)" }; E3 C1 d2 E4 R1 r
  7.     Update% Z& ~' g8 I- f$ S/ Q$ v. `- Z
  8.     Rem 接下来设置起终点的参数角弧度属性( h3 h) e) ?* W& D
  9.     Const π As Double = 3.141592653589795 j3 D" P7 {  }9 m1 a& J. O
  10.         ell.StartParameter = π / 41 C$ z9 A" ~0 p. y
  11.     '设置起点参数角为45°,根据公式计算的起点坐标应为(20*cos(45°)=10*2^0.5,10*sin(45°)=5*2^0.5)% x# c! M; \6 V1 W& \& D
  12.     '结果起点坐标根据公式计算正确!但是起点所在角度并不是45°,而是26.565051°: P% e* V) W# T7 F
  13.     Update
    & G, _# h0 {9 G; f+ N3 X3 f) @" W; A
  14.         ell.EndParameter = 5 * π / 31 Y' B7 k0 z1 V+ {0 @1 j7 T- ?- |
  15.     '设置终点参数角为300°,根据公式计算的终点坐标应为(20*cos(300°),10*sin(300°))
    . G( o9 ?  ^  {' U; I+ E% ~' ?
  16.     '结果终点坐标根据公式计算正确!但是终点所在角度并不是-60°,而是-40.893395°4 E9 |; b& o  }" j7 i" ~9 W
  17.     Update$ I# t0 t. f% ]" |3 o- R
  18.     Rem 接下来设置起终点的角弧度属性. i. Y: Y; l1 U/ V
  19.     '    ell.StartAngle = π / 4
    ; F# A4 z" ?3 H8 l1 ^1 v4 k9 _
  20.     '    ell.EndAngle = 5 * π / 3
    . X4 t; H( n" b  d5 ?% i# Q$ Z
  21.     Update   '发现起终点角度属性就是根据圆心及指定的长轴端点为X轴正方向逆时针旋转对应角度。
    8 I: U. m9 }& w! m! \: T6 m
  22.     ell.StartParameter = 1.10714871779409   '该弧度角的正切值为2=tan(π/4)/0.5& }* ^1 [" M: K9 c& v
  23.     ell.EndParameter = -1.28976142529208    '该弧度角的正切值为-3.46410161513775=tan(5*π/3)/0.5
    & H/ k! O) I$ N# R' r3 Q
  24.     Update   '通过上例证明角度与参数角满足关系tan(角度)=椭圆半径比*tan(参数角)
    " y, t, H$ {) }' e, o2 J# B
  25. End Sub5 n# A3 ]2 o) o; @) _) u
复制代码

- ?1 i' y- Y: c% v. F# {

8 h* k8 X* i" h! B 2.16、椭圆对象命令(Ellipse).zip (11.71 KB, 下载次数: 10)
 楼主| 发表于 2019-3-29 21:22:02 | 显示全部楼层
本帖最后由 kuangben8 于 2019-7-1 22:08 编辑
7 ?7 p" q9 X! D5 h/ L
, P: h: L, u- z* e0 {& Z" X三、实现ExcelAutoCAD之间数据交互
1 H1 }) X5 ^- z9 e1、通过Excel编程调用指定AutoCAD文档自动画图! r( P9 |; D$ X! {5 E7 N
/ G2 f4 [, @% Z* G
需注意:
通过Excel调用AutoCAD程序文档之前,需要在Excel的VBE窗口中:工具---→引用,在弹出的窗口中必须勾选本机对应的AutoCAD程序库才可以正常调用CAD程序及文档.如下图所示:
1561906577(1).jpg

/ C$ J1 r5 a' w, l: }3 R7 O5 D
基本调用方法如下:
  1. Sub 调用CAD方法02()4 s2 _2 U. e: J: E2 c& }4 |6 D  P+ S
  2.     Dim CAD As AcadApplication, DOC As AcadDocument
    * l4 B  ]! D% F5 A
  3.     Set CAD = CreateObject("AutoCAD.Application") '运行一个新的CAD进程
    ' c7 Q, {3 Z1 D: Z
  4.     CAD.Visible = True '让新的CAD进程可见,这可以在CAD图形界面手工操作。否则只能用EXCEL在后台操作
    " F- D/ S% n* k/ S
  5.     '也可以用下面这行. R. a% w, z6 R( S* |
  6. '    Set CAD = GetObject(, "AutoCAD.Application") '获得一个已经运行的CAD进程,在已经有CAD文档打开时使用!
    % h+ j+ E$ Y* N' c* P5 Q# ~) s
  7.    
    . A- _; X9 a+ P( G" w
  8.     '指定要使用的文档的方法,可选用下面五行之一
    . `1 b1 E8 V; {( D3 t  s/ n, x
  9. '    Set DOC = CAD.ActiveDocument '指定使用活动(正在前台的)CAD文档# |3 Z0 c7 S" z. i
  10.     Set DOC = CAD.Documents.Open(ThisWorkbook.Path & "\CAD编程文件.dwg") '打开一个指定路径指定名称的CAD文档,打开后只有一个指定CAD文档窗口
    4 o1 k  _9 w0 |: n" I4 \
  11. '    Set DOC = CAD.Documents.Add() '新建一个CAD文档
    # a  o' f0 U& K& f1 \; B( F$ S
  12. '    Set DOC = CAD.Documents.Item(0) '指定当前已经打开的文档中的某一个——用索引号指定。& p9 N" _& u7 b0 J) Y
  13.     Rem 索引号从0开始,最大索引号比已经打开的文档数(Documents对象的Count属性)小1。
    % C0 X- |; A- @( j  }$ m7 Y
  14. '    Set DOC = CAD.Documents.Item("CAD编程文件.dwg") '指定当前已经打开的文档中的某一个——用文件名指定
    " a7 @/ ~/ \* y+ j! D
  15.    
    5 V' m1 I. V8 U( h5 @) O
  16.     DOC.Activate '使指定的文档成为活动文档
    + A% |9 \5 U" {+ u
  17.     DOC.SaveAs ThisWorkbook.Path & "CAD编程文件.dwg" '保存CAD文档到指定路径下的指定文档。
    " w! I7 X5 M+ |$ l9 H
  18.     CAD.Quit '如果运行一个新的CAD进程时,仅仅用于后台操作或完成辅助计算等,用过之后别忘了关闭它。否则每使用一次本程序就运行一个新CAD进程,次数多了电脑内存会吃不消的.5 Y8 S1 p& I7 X% [) r1 n
  19. '    CAD.Close False   '没有CAD.Close方法!
    7 I. f1 C& d; W1 G3 o
  20. 'CAD.Documents.CLOSE FALSE    '关闭文档可行。/ W. w' S7 r* G! N
  21. End Sub
    ( A8 t# x# q- C3 J7 W5 v0 U
复制代码
也可参考如下代码:
  1. Sub 调用CAD程序()" ?+ s$ x- T: }. \3 M: y
  2.     Rem 首先一定要在工具---引用---中勾选对应的CAD版本的引用库 AutoCAD 2014 Type Library- T' k- T0 P* @4 `' g/ n; `
  3.     Dim CAD As AcadApplication, DOC As AcadDocument
    ' _% U# W8 ~2 X( U& V8 n
  4.     On Error Resume Next      '忽略错误继续运行
      w! v+ T1 @: z8 m# ^
  5.     Set CAD = GetObject(, "AutoCAD.Application")   '若已经打开CAD程序时使用# A( j% j, E, J+ m4 q" v. b2 h
  6.     If CAD Is Nothing Then2 D$ s0 k7 P& N6 c
  7.         Err.Clear   '清除错误
    + @. t% z7 g  }% |6 l
  8.         Set CAD = CreateObject("AutoCAD.Application")  '若没有打开CAD程序时使用/ E# ]2 [* v. x# L. Y9 ]
  9.     End If
    ( m+ A* d9 y8 H( ]$ L
  10.     'CAD.Visible = True  '让CAD界面显示出来
    # O8 O7 ]" ^2 O+ [; C
  11.     Set DOC = CAD.Documents("设计绘图模板.dwg")    '不要.Item也可以。直接赋值如没有则出错!
    5 A& {4 k) [# P: Y; R
  12.     If DOC Is Nothing Then
    % f$ F7 D* c+ y7 ~$ ^5 ]
  13.         Err.Clear
    . }: k$ B  F4 S" V  z6 m8 k* ^
  14.         Set DOC = CAD.Documents.Open(ThisWorkbook.Path & "\设计绘图模板.dwg")  l1 @4 w  z% G7 S) d
  15.     End If5 m, S$ g! X6 s$ T& F3 Y
  16.     On Error GoTo 0      '恢复错误提示7 E* }2 M4 H& E! Q( u0 Q
  17.     CAD.Visible = True   '此时显示界面不会出现空白CAD文档!
    / G" u6 D  k, S' L7 F0 O5 {$ f
  18.     DOC.Activate         '激活指定文档
    / r* E, u; D  w
  19.     With DOC             '相当于CAD的VBE里的with Thisdrawing1 F. a7 X1 E4 L7 m# I6 N! y9 ^2 y# q
  20.         Rem 接下来就相当于在CAD的VBE中编写代码一样了!
      E- f% K; V" j1 i
  21.         Rem 方法一:以发送命令的方式画图- c. t7 }& G8 i0 b  K( f3 y
  22.         Dim obj As Object
    ; ?/ Z3 j7 E' v4 C0 P
  23.         For Each obj In .ModelSpace7 j+ @! r# c# ~( h3 `" P, u
  24.             obj.Delete     '删除对象不会及时显示出来
    , @) Z# S' h4 F9 l; a6 O! [, [
  25.             .Application.Update) S4 I2 n( u/ ^; x1 K8 H3 R% Y
  26.             '刷新CAD界面,直接Update单步执行没问题,但是直接运行,此步提示远程服务器不存在!,使用.Application.Update却没有问题!
    2 R6 _% t8 B7 m( p( \3 B6 l# ]
  27.         Next
    ) u$ I- W( V+ M* `% x
  28.         Rem 发送命令的形式绘图可以及时的显示出来/ Q' ]3 L5 O9 t  N5 y7 ^1 M
  29.         .SendCommand Sheet1.Cells(2, 1).Value( ^0 l5 m) s6 b7 j% b+ o! j- b2 ~
  30.         .SendCommand Sheet1.Cells(3, 1).Value9 V9 O5 X: _# I9 o2 _2 N# j
  31.         .SendCommand Sheet1.Cells(4, 1).Value
    - D. G# o! ^) h8 O. r
  32.         # a& ~; v  ~. s( [
  33.         Rem 方法二:直接编写代码画图
    . \- Z% U) T. u) A# O* U# a) w% F
  34.         Dim L As AcadLine, Cir As AcadCircle5 S# O* B# V3 V( ~! A7 m3 d
  35.         Dim p01(2) As Double, p02(2) As Double
    " U% x9 E' s( S# E
  36.         Dim cnt(2) As Double, R As Double4 O2 y' ~$ \6 J9 K% s% P
  37.         With Sheet1
    $ Y7 Q% b. F# P- B, I
  38.             p01(0) = .Cells(8, 1).Value
    2 X5 z/ z3 d: g$ D% }4 {4 D/ d: b
  39.             p01(1) = .Cells(9, 1).Value8 g; h: Q; w, i) w& X7 n
  40.             p01(2) = 0  'Z坐标也可以省略不写,默认是0
    0 g2 Y5 p* J- [, r' p/ K
  41.             p02(0) = .Cells(10, 1).Value$ _! w$ [6 Y$ p# A$ G) B
  42.             p02(1) = .Cells(11, 1).Value
    6 H% Y& Z0 h. r9 ~' l3 t
  43.             
    4 l9 O" i! c- I4 {; {# F
  44.             cnt(0) = .Cells(10, 1).Value
    / m6 w8 Q( N: Y  {. Q
  45.             cnt(1) = .Cells(11, 1).Value7 |; \5 G2 Y6 O/ ^6 p/ o! O+ g: K8 q
  46.             cnt(2) = 0( l! {# F, o& h+ W
  47.             R = .Cells(8, 2).Value
    * |$ B5 q. Z" N5 X4 j  T6 J, v
  48.         End With
    # U* j3 c- w9 O) g# o& T
  49.         Set L = .ModelSpace.AddLine(p01, p02)" X# e7 y/ Y0 f5 |; L1 o
  50.         L.Update    '单独的Update单步执行没问题,直接运行同样错误,但是使用对象刷新也没问题!
    8 ^. L0 J7 R) x. Q
  51.         Set Cir = .ModelSpace.AddCircle(cnt, R)* q, r* T% G! e& `/ }9 T( p3 a
  52.         Cir.Update
    + B* }+ G. @8 ~: ]% s
  53.         cnt(0) = Sheet1.Cells(9, 2).Value
    ( o# b& |; e" t$ q+ p- O
  54.         cnt(1) = Sheet1.Cells(10, 2).Value( H! V6 C0 |* h; s& `! s
  55.         cnt(2) = 0
    + M" ~( ^' A) n8 v" r
  56.         R = Sheet1.Cells(11, 2).Value  V8 b2 |+ d& p9 D
  57.         Set Cir = .ModelSpace.AddCircle(cnt, R)
    / {3 [4 E: [' g& {' Y+ B$ }
  58.         .Application.Update: d, V. ~9 U4 j; a0 u; O: o  i
  59.         % b) r' z6 S. C
  60.     End With/ @5 [( b# q7 O
  61.     'DOC.Save        '保存修改的CAD文档  ]( Z# `% t9 h4 @$ J) h7 v
  62.     DOC.Close True  '或者直接关闭并保存修改的CAD文档
    $ d0 T. ^2 }! ]* k; A9 z5 d
  63.     CAD.Quit        '结束CAD进程$ K# s3 p7 e" y& T8 m+ Y* e: A
  64.     Set DOC = Nothing   '释放变量# A# c5 |  n6 C4 D' L0 [
  65.     Set CAD = Nothing
    2 S' W7 E3 t. N
  66. End Sub
复制代码
Excel与AutoCAD 交互编程.zip (49.62 KB, 下载次数: 26)
 楼主| 发表于 2019-3-29 21:25:57 | 显示全部楼层
本帖最后由 kuangben8 于 2019-7-1 22:11 编辑   d1 {: {! h7 c6 @. N

% f. C. \2 p6 [- L1 K5 e2、通过AutoCAD编程调用Excel数据自动绘图
8 k. d3 m' j7 ?" B明白了使用Excel调用CAD,在使用CAD调用Excel则简单多了。套路都是差不多的!& m, C2 Z. O4 P
具体参考如下代码即可。% _' o0 X% t' c4 i: a6 ?
  1. Sub 调用Excel程序()
    ' W0 Z7 D4 A2 S7 r0 V9 C
  2.     Rem 首先一定要在工具---引用---中勾选对应的Excel版本的引用库 Microsoft Excel 16.0 Object Library& W7 }+ x& z. i5 A  {- d
  3.     Dim ExcelApp As Excel.Application, EWB As Excel.Workbook, ESHT As Excel.Worksheet5 b. l6 t% d0 [" w) T# k) C+ C
  4.     On Error Resume Next      '忽略错误继续运行
    % m( c/ k2 G9 S" a+ s
  5.     Set ExcelApp = GetObject(, "Excel.Application")   '若已经打开Excel程序时使用) N* A2 M$ ]+ S
  6.     If ExcelApp Is Nothing Then
    / A! ~( B! |( ~" e+ O0 |5 M5 X2 v& j  `
  7.         Err.Clear   '清除错误
    " A0 K, A( V+ x; o, z+ r' Z
  8.         Set ExcelApp = CreateObject("Excel.Application")  '若没有打开Excel程序时使用
    7 z7 o0 `. @* @. x7 n
  9.     End If
    5 i' h8 v4 t: |- |& Y, g: M
  10.     'ExcelApp.Visible = True  '让Excel界面显示出来,是一个没有工作表的空白的Excel文档,但是后续指定工作簿后也不会出现一个空白Excel文档。
    5 N3 Z( a0 a) F( q. y
  11.     Set EWB = ExcelApp.Workbooks("Excel工作簿.xlsx")    '不要.Item也可以。直接赋值如没有则出错!* v0 d  O( K2 |5 y
  12.     If EWB Is Nothing Then
    5 v6 j# M- J7 z: J( }
  13.         Err.Clear
    & T; y* K& b$ c, k' _6 E( v! J3 n
  14.         Set EWB = ExcelApp.Workbooks.Open(ThisDrawing.Path & "\Excel工作簿.xlsx")
    & ?  w7 a3 T+ k/ R! _; X8 r
  15.     End If4 x" e( ]2 y9 t" W
  16.     On Error GoTo 0      '恢复错误提示
    & _5 ]# K' R- N. o: r5 a! C
  17.     Set ESHT = EWB.Worksheets("实验工作表")4 \6 D' K/ ^/ b5 T4 i
  18.     ExcelApp.Visible = True   '此时显示界面不会出现空白Excel文档!
    ' t- m+ j& }% }& j
  19.     ESHT.Activate* s$ R5 {1 C. [+ L
  20.     With ESHT! I9 ]  Z6 U  A( z7 P1 d* Q
  21.         Dim arr, brr
    5 e- R" D% s9 Q  s! H
  22.         .Range("A1:E10") = "AutoCAD写入"2 e0 G' U9 y2 ~$ r; s2 |# r3 \
  23.         arr = .Range("G3:G5")3 L  h: R$ j+ E) E6 [/ ~% [
  24.         brr = .Range("G8:H11")
    9 u! b* e: v9 L& j$ ]( j
  25.     End With+ i; A) r" N3 v9 H
  26.     With ThisDrawing
    4 q8 F+ b& X7 a2 b& R  E4 y
  27.         Rem 方法一:发送命令形式画图/ J3 i  S  H. D  @5 E3 J
  28.         'Dim m%
    ! c8 J. l% M2 O9 ^
  29.         'For m = 1 To UBound(arr, 1)! I7 ~: K4 {6 n% D: B( j5 z' W
  30.         '   .SendCommand arr(m, 1)    '第三组数据第一个空格不能使得CAD默认执行上一次绘图命令,所以第二个圆没成功!
    ) Z  u6 h3 ~3 o9 h7 A& J/ Q
  31.         'Next5 l: A7 J7 r* ?! z9 {
  32.         ! r2 X& `% o/ e; Z
  33.         Rem 方法二:直接使用代码画图
    . B- g: Q$ g0 T! q4 S  X
  34.         Dim L As AcadLine, Cir As AcadCircle
    4 R, d" E% g" t! C* `
  35.         Dim p01(2) As Double, p02(2) As Double( `% l% }* S0 K) N4 D6 K' j) s
  36.         Dim cnt(2) As Double, R As Double1 G' L8 Z/ ~- n" p4 p& X: }" \, s
  37.         p01(0) = brr(1, 1): p01(1) = brr(2, 1): p01(2) = 07 D, d+ F7 l5 h8 F' D* J
  38.         p02(0) = brr(3, 1): p02(1) = brr(4, 1): p02(2) = 0
    * h+ B# x$ r, c
  39.         cnt(0) = brr(3, 1): cnt(1) = brr(4, 1): R = brr(1, 2)  ^4 _5 }6 C2 u" k& |" |$ K
  40.         With .ModelSpace
    0 _5 e. \+ R* V6 j+ ]& x5 }4 |
  41.             Set L = .AddLine(p01, p02)
    ! X0 Z2 B* e+ f& a" ?
  42.             Update4 O: i! U+ `1 h$ G' q* E
  43.             Set Cir = .AddCircle(cnt, R)3 L" u( t$ ~8 g0 [% A; [
  44.             Update( |3 }6 Z7 x+ g1 n1 d- N  p4 a# x1 D
  45.         End With0 M9 S* ~8 M% d  n# y8 ?
  46.         cnt(0) = brr(2, 2): cnt(1) = brr(3, 2): R = brr(4, 2)
      @$ A; _8 Q- w: p1 W" n& A2 K
  47.         Set Cir = .ModelSpace.AddCircle(cnt, R)
    % T/ ~* c6 J6 Y3 K! m# G5 X
  48.         Update6 u- A- O3 y# R' `2 Z
  49.     End With+ |  V) y2 {' s! p8 c
  50.     'EWB.Save
      K" Y2 @/ Y- H  q# N
  51.     EWB.Close True    '关闭病保存Excel文档的修改& T6 ~( x: D1 I6 Z; S* r8 c/ h& x$ }
  52.     ExcelApp.Quit    '关闭Excel进程) H  a- o# S1 h* _! p
  53.     Set ExcelApp = Nothing   '释放变量
    4 o& o1 j' {7 A$ n4 d# R2 O5 m  O. {! I
  54.     Set EWB = Nothing
    6 r1 _, ?( s& d( N! f6 X- t& w$ K
  55.     Set ESHT = Nothing
    , W8 `/ K3 |) V& r* V3 m9 R) ~9 `9 j
  56. End Sub* c% ]) @% H+ x- b( T% V" j/ C
复制代码
通过AutoCAD调用Excel数据绘图.zip (45.9 KB, 下载次数: 23)
发表于 2019-4-2 08:28:13 | 显示全部楼层

对楼主《AutoCAD中程序的保存与修改》的一点补充

AutoCAD 的 VBA 工程有两种保存和加载方法:
第一种是作为全局工程保存为单独的 dvb 文档,就像楼主在 3 楼阐述的那样。这种工程是全局的,我们可以在任何时候把它加载到正在运行的 AutoCAD 进程中来,也可以在编辑任何一个 dwg 文档时使用其中的宏。
第二种是作为嵌入工程,保存在 dwg 文档中,就像 EXCEL 的 VBA 工程保存在 xls 或 xlsm 文档中一样。这种工程是包含在 dwg 文档中的,在打开这个文档时自动加载,并且只能在编辑这个文档时使用其中的宏。
打开 VBA 管理器,最上面的“图形”下拉列表中列出了在当前 AutoCAD 进程中已经打开的全部 dwg 文档。选择其中的一个文档,如果这个 dwg 文档中包含嵌入的 VBA 工程,“嵌入工程”文本框中会显示嵌入工程的名称;如果这个 dwg 文档没有嵌入 VBA 工程,在“图形”下拉列表下面的“嵌入工程”文本框中会显示“(无)”。此时,在下面的“工程”表格中选择一个已经加载的全局工程(没有的话可以点击旁边的“新建”按钮创建一个),再点击“嵌入”按钮,这个全局工程将被“复制”到 dwg 文档中成为它的嵌入工程。
未标题-4.png
" Y6 [. M( |1 v# M0 M5 V
未标题-5.png
. [, P0 L1 c3 T' }& \& _; f
0 G7 q) z- e* _# C5 G; }& L  Y8 @
一个 *.dwg 文档只能嵌入一个 VBA 工程。
嵌入工程随 dwg 文档一同保存,无论你在图形界面保存文档还是在 VBA 编辑器界面保存文档,被保存的都是整个 dwg 文档,包括其中的嵌入工程。
对于一个嵌入了 VBA 工程的 dwg 文档,在 VBA 管理器上点击“提取”按钮,将删除文档中的嵌入工程——当然,在删除之前,AutoCAD 会询问你是否将其保存为一个全局工程(单独的 dvb 文档)。

点评

哦哦,明白全局工程和嵌入工程是啥意思了!感谢老师分享。  发表于 2019-4-2 10:00

评分

参与人数 1三维币 +10 收起 理由
kuangben8 + 10 鼓励积极应答和参与的回帖。

查看全部评分

发表于 2019-4-3 09:02:53 | 显示全部楼层

对楼主《很有用的Utility对象》的一点补充

AD、.GetObjectidString 方法(2010版新增); e3 p5 `" X% H. U3 A% z3 ?- Z
以字符串形式返回对象的ID。
1 v- u/ x; I% S3 M: b语法
& ]! N) ?( y' Q3 j- @8 lRetVal = Object.GetObjectIdString(acadObject, bHex)  `7 O& p- G. D9 b+ R9 {5 [
object  u" `! M2 t& C6 x" _* j
               Utility' z7 W+ r+ q3 f+ o; M% p  j" \" U
               使用该方法的对象。
& g1 q5 ], ^2 l- _' OacadObject6 v+ V# @- J; ^% d
               Object[对象]; 仅用于输入
. a$ i8 M, a" K4 I5 x; O  T4 P8 o% M               要返回其对象ID的AutoCAD对象。
& Q' ~1 z8 H3 U8 {$ }+ vbHex4 T" t4 x' |. A2 H5 u; Z# R5 v
               Boolean[布尔值]; 仅用于输入
8 S2 f/ {- Q2 U& ?4 Q& K               确定对象ID是作为整数还是十六进制返回。
$ u, S3 ~4 S/ |) p% ~& h9 S               TRUE: 十六进制。
8 u5 y4 P- D" K! L' O6 O               FALSE: 十进制。
2 T1 m# C# @, oRetVal9 ]& f: K1 [! `2 X6 j. v1 E+ }7 [
               String[字符串]; j, b! Y/ A$ }: @1 w( M" ~
               对象ID字符串。
* U5 {) s+ R4 R' U+ A/ Z0 o( k8 A4 T2 m

7 J/ `" v# h9 Z; ]% m

评分

参与人数 1三维币 +10 收起 理由
2005llnn + 10 鼓励积极应答和参与的回帖。

查看全部评分

 楼主| 发表于 2019-4-9 22:27:44 | 显示全部楼层
本帖最后由 kuangben8 于 2019-4-14 10:11 编辑 . y% N2 j4 e# a' _# T' _  a
/ B7 ?+ N* M( @/ Z) d7 }" l7 a
关于创建图案填充的补充:(非常感谢woaishuijia老师的热心帮助,以下是老师的帮助文档+我的一点总结)
一、关于 AddHatch方法的参数
12002版及以前,AutoCAD 只有图案填充,那时的AddHatch 方法只有三个参数,即 PatternType(图案类型)、PatternName(图案名称)和 Associativity(关联性);到2004版,增加了渐变填充, AddHatch 方法就增加了第四个参数 HatchObjectType(填充对象类型)。
2、先说第四个参数 HatchObjectType(填充对象类型)
先说它的原因是它的值决定了第一个参数的用法。按我们通常的思维习惯,它本来应该是第一个参数,但由于是后增加的,所以排在了第四个。
这个参数为 AcHatchObjectType 枚举类型。如果使用变量,应这样声明
Dim ** As AcHatchObjectType
这个枚举共有两个值:
1acHatchObject= 0(图案填充):表示选择填充样式为图案填充!对应填充界面如下
001.jpg
4 l7 E; k) C  k0 E' q
2acGradientObject= 1(渐变填充):表示选择填充样式为渐变填充!对应填充界面如下
002.jpg

' x7 Y% n9 S* G( Z% [, r8 v/ `8 C4 ?8 U( @" V$ H# W0 Y: ?
这个参数是可选的,默认值为 0acHatchObject,图案填充)。
# V  c- B/ h2 m1 e: v# h4 N
3、再来说第一个参数 PatternType
在2002版及以前,没有第四个参数(只有图案填充),这个 PatternType 参数是 AcPatternType 枚举类型。2004版及以后,这个参数的类型就有了两种选择,即:如果第四个参数HatchObjectType(填充对象类型)的值是 acHatchObject = 0(图案填充)或省略,则这个 PatternType 参数就必须用 AcPatternType 枚举类型如果第四个参数 HatchObjectType(填充对象类型)的值是acGradientObject = 1(渐变填充),则这个 PatternType 参数就必须用 AcGradientPatternType 枚举类型
这个PatternType 参数的值决定着第二个参数 PatternName(图案名称)的用法,后面再说。先说这个参数两种枚举的值:
1AcPatternType 枚举类型。如果使用变量,应这样声明
Dim ** As AcPatternType
这个枚举共有三个值:
acHatchPatternTypePreDefined = 0(预定义):使用CAD自带的填充样式!
acHatchPatternTypeUserDefined = 1(用户定义):此时CAD自带的填充样式不可选!
acHatchPatternTypeCustomDefined = 2(自定义):此时CAD自带的填充样式不可选!
这三个值对应着图形界面“图案填充和渐变色”对话框中“图案填充”选项卡上的“类型(Y”下拉列表(见图)。
! k. Z# h( S- K9 P* { 003.jpg
4 |% D6 A4 A! V8 ]( p4 @/ G7 H  T2 F5 A$ K- A# o+ J9 A( d
2)AcGradientPatternType 枚举类型。如果使用变量,应这样声明
Dim ** As AcGradientPatternType
这个枚举共有两个值:
acPreDefinedGradient = 0(预定义)
acUserDefinedGradient = 1(用户定义)
第一个值容易理解;第二个值E文是这样说的:Definesa pattern based on property values. 翻译:基于属性值定义模式。比较费解。经多次尝试,出错的提示总是“尚未实现”,且图形界面“图案填充和渐变色”对话框中也没有对应的选项。猜想这是为 AutoCAD 为今后的渐变填充改进预留的,就是说这个枚举目前只能用 acPreDefinedGradient = 0(预定义)值。
. G& Q, s" X! F( G1 H
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个名称之一:
4 F  K; t1 N1 B1 L
     1"Linear"2"Cylinder"3"InvCylinder"4"Spherical"5"HemiSpherical"6"Curved"7"InvSpherical"8"InvHemiSpherical"9"InvCurved"    ,对应图案如下:
004.jpg     005.jpg
7 B% T5 ~, q4 h
5、第三参数: Associativity(是否关联)   参考如上右图
Boolean[布尔值]; 仅用于输入,TRUE: 图案填充为关联的。
FALSE: 图案填充为不关联的。
作用:当填充图案的边界发生变化时,填充的图案是否自动适应边界的变化。
省略时默认是FALSE(不关联,即不勾选)。但是第三参数仍然要定义变量,可以不赋值。

0 Z1 o& E. l( o, R# n% Y4 ^
+ g; u7 v3 |- U, S4 [- f7 `

; a. d5 C$ f' c综上,第一个参数就取 0,第二个参数根据第四个参数的值取现有的图案填充名称或渐变名称,第四个参数决定第二参数的选择是图案填充还是渐变填充,图案名称必须是符合第四参数指定的类型中的图案名称。
0 ^- x6 ?* G4 K6 m, r' r$ g! e! u6 s; R% A4 B9 B. P. N$ K
二、创建填充的步骤和要求
首先用 AddHatch 方法创建填充对象;紧接着用Hatch 对象的 AppendOuterLoop 方法明确外边界;如果填充内部有空白,还要用 AppendInnerLoop 方法添加内边界,有几个内边界就用几次。边界必须是封闭的。组成边界的多个图元之间必须是首尾相连的,换句话说,组成边界的多个图元之间不允许交叉,只允许且必须端点重合。
在实际测试中发现使用图案填充时,添加完外边界后刷新界面,然后添加内边界无效!但是渐变填充却没事!
内边界与外边界不许交叉,各个内边界之间也不许交叉。
内边界可以内部还有内边界,就是两个内边界“嵌套”组成环形。
内边界内部是否填充、嵌套的内边界怎样填充,可以用 Hatch 对象的 HatchStyle 属性(孤岛检测样式)来决定。可以在图形界面打开“特性”管理器,再选择一个有内边界的填充对象,在“特性”管理器中修改“孤岛检测样式”属性查看效果。
  1. Sub AddHatch方法()" R1 h, Z& P& B/ @. G
  2.     Rem 语法:RetVal = Object.AddHatch(PatternType, PatternName, Associativity [, HatchObjectType])4 o9 d1 A3 G  f; w8 O$ v3 K
  3.     Dim HatchObject As AcadHatch            '定义填充图案对象$ l% I3 N/ ]2 r4 E/ y, t7 G( q
  4.     Rem 定义填充类型为长整型,取值为图案填充的0,1,2;渐变填充的0,1,一般就取0(CAD预定义)3 x% n" l% g! L
  5.     Dim hatchtype As AcPatternType       '参数4设置为图案填充的类型,参数4若是渐变填充,则定义为AcGradientPatternType类型
    ) `3 l: M$ e) G) u3 h
  6.     '    Dim hatchtype As AcGradientPatternType; L+ w. U! P3 f. y5 P5 L: s: ^
  7.     Dim HatchName As String                   '定义图案名称为字符串类型/ P1 M' F: T# L. L% g
  8.     Dim HatchAssociativity As Boolean       '定义关联类型为布尔值,取值为True表示关联,False表示非关联。9 H2 J+ a( ^& v9 A8 y4 u. A( V& y
  9.     Dim HObjectType As AcHatchObjectType    '定义图案对象类型,取值为“图案填充-0”、“渐变填充-1”。省略默认为0./ l& S+ s6 `( p5 O

  10. * `2 S- k' V+ J% N% O
  11.     Rem 首先添加几个边界以备填充使用9 c; B6 Z" n' o+ o) v
  12.     Dim L As AcadLWPolyline, cir1 As AcadCircle, cir2 As AcadCircle, CIR3 As AcadCircle   '定义一个多段线和三个圆3 Z- Q* S/ h& t1 U
  13.     Dim pts(11) As Double, P0(2) As Double, R As Double   '定义多段线端点变量,圆心变量,半径变量
    $ ~% q5 b6 H( D6 w6 y8 `% O2 h
  14.     pts(0) = 0: pts(1) = 0: pts(2) = 20: pts(3) = 15: pts(4) = 10: pts(5) = 30
    # C2 c, v% R- w+ A3 C8 j! o
  15.     pts(6) = 50: pts(7) = 50: pts(8) = 0: pts(9) = -70: pts(10) = -70: pts(11) = 32
    ' J6 `2 x" q. K2 F+ B
  16.     Set L = ThisDrawing.ModelSpace.AddLightWeightPolyline(pts)
    , K1 a5 v# Z; l' Z
  17.     Update7 N6 i! I. w8 ]: a2 m. R0 l7 |
  18.     L.Closed = True   '将多段线闭合
    6 T; g  |0 ~. i. ]
  19.     Update
    2 h: G  W8 w2 e! X& l) F
  20.     P0(0) = 0: P0(1) = 0: P0(2) = 0" W% [. N1 T# O; N& F% q
  21.     R = 25
    , {# ~/ U0 P. N
  22.     Set cir1 = ThisDrawing.ModelSpace.AddCircle(P0, R)
    8 M+ E* D/ b1 a$ A) f: V
  23.     Update' w( a! c8 }# L% N' T
  24.     R = 50# w# f# V- |3 m) t3 D1 P! e! C
  25.     Set cir2 = ThisDrawing.ModelSpace.AddCircle(P0, R)+ w; Y5 X' e8 z! T3 G
  26.     Update
    2 s3 g( J/ P  R- R% w
  27.     R = 709 f) k6 _( ~* D! F
  28.     Set CIR3 = ThisDrawing.ModelSpace.AddCircle(P0, R)
    + v+ A( @0 c" u; @4 `
  29.     Update$ e' R- x  G; `  @3 U0 o: ~4 t2 t' c
  30.    
    ! H4 h9 t. h6 `
  31.     Rem 接下来赋值图案填充变量,先复制第四参数,再赋值第一参数、第二参数、第三参数
      S* b) x7 J  G$ n
  32.     HObjectType = 1   '写0也可以直接写acHatchObject,表示图案填充类型,都省略默认为0;写1也可以写成acGradientObject,表示渐变填充
    ; `5 O% y9 U/ O+ S' u3 O3 e7 o2 V
  33.     '    HObjectType = acGradientObject '也可以直接写1,表示渐变填充类型
    6 x& R& [4 B2 r0 }3 e7 s1 r
  34.     Rem 第一参数值英文名称太长,还是直接记住数字好了!
    , y: z* w/ h& `* N5 b
  35.     hatchtype = 0       'acHatchPatternTypePreDefined,参数太长,直接记住数字吧!
      e9 L# I% t" v1 _
  36.     '    HatchType = 1      'acHatchPatternTypeUserDefined/ K/ X2 j9 b9 Y' T& {
  37.     '    HatchType = 2      'acHatchPatternTypeCustomDefined,第四参数为1时此参数无效!1 L  }& Q, v8 d2 |
  38.     Rem 以下四类图案名称仅在第四参数=0时有效!每一类里有数个名称可用!: I- ?2 k" L9 n' L0 g  R
  39.     '    HatchName = "ANSI32"
    . d: |. e* J( R  k
  40.     '    HatchName = "ISO02W100"    '此处的名字到底是什么?, E$ c; k( ?7 J
  41.     '    HatchName = "AR-HBONE"
    # O; S6 G: \3 A6 H3 u
  42.     '    HatchName = "STARS"" Z" T* X6 M! ~& p* J3 N/ C
  43.     Rem  以下9种图案名称仅在第四参数=1时有效!表示渐变填充名称,只有这9个名称。
    5 F( o+ C+ L2 A: X; m8 \, u
  44.     '    HatchName = "Linear"               '对应第1行第1列图案
      P9 P5 a! h7 H" p/ r# d
  45.     '    HatchName = "Cylinder"             '对应第1行第2列图案; w* _; v" M4 j
  46.     '    HatchName = "InvCylinder"          '对应第1行第3列图案5 U+ \2 a8 ~! X8 j* i4 [! I/ w
  47.     HatchName = "Spherical"            '对应第2行第1列图案$ v( k& @! b1 X6 \" @
  48.     '    HatchName = "HemiSpherical"        '对应第2行第2列图案
    5 ~0 J& w9 h  u
  49.     '    HatchName = "Curved"               '对应第2行第3列图案1 [! W$ d2 {$ c' p6 O
  50.     '    HatchName = "InvSpherical"         '对应第3行第1列图案
      ?+ _7 K, @* H/ Q' Z' v, x
  51.     '    HatchName = "InvHemiSpherical"     '对应第3行第2列图案$ @! E9 }  V% B4 ?  }
  52.     '    HatchName = "InvCurved"            '对应第3行第3列图案% ^( `4 M8 u, H6 l- b* K
  53.     Rem 第三参数一般设置为true(关联)) q3 u$ y- L: H3 F; j
  54. '    HatchAssociativity = True        '省略赋值时默认为False3 b/ {/ F# d* {: C
  55.     '    HatchAssociativity = False; l8 w. w! E0 U' }
  56.    
    - b& o0 G+ h; b
  57.     Rem 首先创建图案填充,然后创建图案外边界和内边界
    2 u: c! J; c' [+ z: z, }# E% o
  58.     Set HatchObject = ThisDrawing.ModelSpace.AddHatch(hatchtype, HatchName, HatchAssociativity, HObjectType)  I: [# L, {: W1 x
  59.     '    Set HatchObject = ThisDrawing.ModelSpace.AddHatch(0, "ANSI32", True, 0)   '也可以直接写参数值
    ( Z3 X1 ]4 G# J' Z) ?% l
  60.     Dim OUTLOOP(0) As AcadEntity    '定义外边界为CAD实体类型
      N! V1 Y. E( q* t
  61.     Set OUTLOOP(0) = CIR3      '将cir1圆赋给外边界
    0 a! p' Q2 v# Y
  62.     HatchObject.AppendOuterLoop (OUTLOOP)    '设置图案填充的外边界  u, x, _  ^7 z9 r; ^$ |
  63.     Update   '添加内边界之前刷新界面,后续图案填充内边界添加无效!但是渐变填充可以!
    % ?# n( P- A2 ]! q, ?0 V( e; `/ Y1 T
  64.     Dim INTLOOP(0) As AcadEntity    '定义内边界为CAD实体类型
    . n# s2 O* Z' u! h! i
  65.     Set INTLOOP(0) = cir2           '将cir2圆赋给第一个内边界,如果内边界比外边界大,则出错!
    ! t0 e* P: R4 M! a0 P. ?
  66.     HatchObject.AppendInnerLoop (INTLOOP)    '设置图案填充的内边界
    ' C6 }: V. z* Q2 \  P; O; I5 D
  67.     Update  v+ P0 a5 s( F
  68.     Set INTLOOP(0) = L           '将cir3圆赋给第二个内边界,同时设置两个内边界不好使!要一个一个设置
    & }2 g. [; n/ s2 @. p/ T
  69.     HatchObject.AppendInnerLoop (INTLOOP)    '设置图案填充的内边界
    . m+ h* [  f. Q0 U8 @
  70.     Update
    * Z! s, Q( b4 l  w3 \
  71. End Sub
复制代码

- v; L, S0 m/ e9 r6 d) k6 @2 D 2.11.02、创建图案填充的补充.zip (11.2 KB, 下载次数: 8)
发表于 2019-5-30 21:26:40 | 显示全部楼层
很好很强大

点评

这么久了终于打破了0回复!  发表于 2019-5-31 20:38
发表于 2019-6-2 13:30:00 | 显示全部楼层
楼主很用心啊,顶一下!

点评

谢谢!  发表于 2019-6-2 13:46
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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