QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

[复制链接]
发表于 2019-3-24 12:08:39 | 显示全部楼层 |阅读模式
画图
主题分类用于问题归类:

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

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

x
本帖最后由 kuangben8 于 2019-7-1 13:15 编辑 2 B" k5 ~& w9 @- v& Q/ o  p3 n
9 u$ P. F" J! P# s' `
分享AutoCAD编程之VBA笔记

; V$ k* D9 T) H, L, ?4 H4 D
0 R5 L+ A! G1 H1 J$ c& y      本人是从Excel编程转到AutoCAD编程学习的,目的是想实现Excel与AutoCAD之间数据交互,实现自动绘图的功能!期望于解决平常工作中的繁琐绘图与反复修改的麻烦。& O. `# ?( I0 U
# b' O( b+ @2 ]; `( r3 n' F$ I- P9 r
      作为AutoCAD编程完全小白的我,很庆幸自己在学习的过程中遇到了咱们论坛的版主woaishuijia老师手把手式教学辅导!每次遇到不理解的问题都会去请教woaishuijia老师,而老师也总是会耐心的答疑、细心的解惑、不厌其烦的亲自写示例讲解,并且不断的扩展我的知识面!如果没有woaishuijia老师的热心帮助,那么我的学习之路将会漫长很多,甚至会严重打击我的学习热情和信心!
6 @. G, q, U9 w7 Q
; V5 N* m8 }# b  ^9 I      所以在此我想对woaishuijia老师说一声:感谢!感谢您的热心帮助,感谢您细心、耐心的答疑解惑,感谢您循序渐进的扩展我的知识面!没有您,我就不可能在短时间内完成我的初期目标。
* c3 b% T  G6 m2 o. h0 Y4 K; Z2 I) R! o# ?. A) a
      取之于论坛,用之于论坛,在此也分享一下本人这段时间来的学习笔记,期望于给那些想学习CAD的VBA编程还没有门路的友人们一点绵薄之力。
% I' H; \; m0 V7 C* j$ Q1 n1 J, R; y  l' A
      说明:以下分享的内容都是本人的学习笔记,在学习过程中是遇到一个问题解决一个问题,遇到一个知识点总结一个知识点。所以内容排版不一定最合理,错误也在所难免!若各位看官发现错误之处,还望指正!5 \0 g" j1 w/ T
以下是本次分享内容的目录:
! r2 k( V  o, j  }
( L/ L# r( A; [: k
一、AutoCAD编程与Excel编程的不同
    1、编程环境不同带来的麻烦 点击
    2、学习中的参考资料
    3、AutoCAD中程序的保存与修改 点击
       A、单次加载VBA宏的方法
       B、自动加载工程代码方法
    4、让AutoCAD界面显示单步运行的结果 点击
二、初识AutoCAD编程对象与方法
    1、直线命令(LINE) 点击
    2、二维多段线命令(LightWeightPolyline) 点击
    3、圆命令(Circle) 点击
       A、根据圆心和半径画圆方法:AddCircle(圆心坐标,半径)
       B、根据三点坐标画圆
       C、根据两点直径画圆
    4、圆弧命令(Arc) 点击
       A、指定四个基本参数画弧
       B、根据三点画弧
       C、起点、端点、半径画弧 点击
    5、对象操作方法之偏移、镜像
       A、Object.Offset方法 点击
       B、Object.Mirror方法 点击
    6、设置对象属性之颜色、线宽、线型、比例、图层
       A、添加线型 点击
       B、设置对象属性之颜色 点击
       C、设置线宽和比例 点击
       D、添加图层 点击
    7、添加文字(AddMText) 点击
    8、对象操作方法之复制、旋转、移动 点击
       A、Object.Copy方法
       B、Object.Rotate方法
       C、Object.Move方法
    9、常用对象的常用方法、属性、事件
       A、常用对象的方法列表 点击
       B、常用对象的事件列表
       C、常用对象的属性列表
       D、常用方法示例 点击
       E、常用属性示例 点击
       F、常用事件示例
    10、辅助绘图方法
       A、辅助三点画圆 点击
       B、辅助三点画弧 点击
       C、辅助两点半径画弧 点击
    11、对象操作方法之图案填充(AddHatch)
       A、创建图案填充 点击  创建图案填充的补充
       B、图案填充的常用方法 点击
       C、图案填充的常用属性 点击
    12、很有用的Utility对象
       A、Utility对象 点击
       B、. AngleFromXAxis方法 点击
       C、.AngleToReal方法
       D、.AngleToString方法
       E、.CreateTypedArray方法 点击
       F、.GetAngle方法
       G、.GetCorner方法 点击
       H、.GetDistance方法
       I、.GetEntity方法 点击
       J、.GetInput方法
       K、.GetInteger方法 点击
       L、.GetKeyWord方法
       M、.GetOrientation方法 点击
       N、.GetPoint方法
       O、.GetReal方法 点击
       P、. GetRemoteFile方法
       Q、.GetString方法
       R、.GetSubEntity方法 点击
       S、.InitalizeUserInput方法
       T、.IsRemoteFile方法
       U、.IsURL方法 点击
       V、.LaunchBrowserDialog方法
       W、.PolarPoint方法
       X、.Prompt方法
       Y、.PutRemoteFile方法
       Z、.RealToString方法 点击
       AA、.SendModelessOperationEnded方法
       AB、.SendModelessOperationStart方法
       AC、.TranslateCoordinates方法
    13、使用Utility对象手动辅助绘图示例 点击
       A、手动三点画弧
       B、手动三点画圆
       C、手动两点半径画弧
    14、手动取点画图时添加提示线 点击
       A、手动画一条直线
       B、手动画圆
    15、样条曲线对象(SpLine) 点击
       A、添加样条曲线方法(AddSpline)
       B、样条曲线对象(SpLine)的常用方法及属性
       C、画函数曲线 点击
    16、椭圆对象(Ellipse)
       A、添加椭圆方法(AddEllipse) 点击
       B、椭圆对象(Ellipse)的常用方法及属性 点击
       C、创建椭圆弧对象 点击
三、实现Excel与AutoCAD之间数据交互
    1、通过Excel编程调用指定AutoCAD文档自动画图 点击
    2、通过AutoCAD编程调用Excel数据自动绘图 点击

1 Q* Y3 u  N! z  _. _# i! ^; C3 `- d* v% ?

! k6 ^0 D0 a& v
: I- C1 Q! t- h7 ?5 O
2 U7 l) M7 `" i8 I+ a& B# M* Z

评分

参与人数 1三维币 +80 收起 理由
2005llnn + 80 鼓励分享,好资料!

查看全部评分

本帖被以下淘专辑推荐:

 楼主| 发表于 2019-3-24 12:08:40 | 显示全部楼层
本帖最后由 woaishuijia 于 2019-3-30 04:48 编辑
1 U* o5 @6 W0 ^7 a
: v7 ]4 W+ [  K4 X$ f' J3 O- L1、编程环境不同带来的麻烦
自AutoCAD2010版本开始,VBA模块就已经不随软件自行安装,因此想在AutoCAD中编写VBA代码,首先需要下载(2016版本之后的网上很容易搜到)对应版本AutoCAD的VBA模块安装。
但是安装的VBA模块自带的帮助文件全是英文版本的!更可恨的是AutoCAD的VBA里没有像OFFICE那样的录制宏功能(What!!!)。
在对AutoCAD的VBA对象、属性、方法一无所知的情况下,我该怎么学习VBA呢?难道逼我退出吗?那我的理想怎么办(虽然不知道理想是什么)!!
方法总比困难多。。。。。。。。。。。。
2、学习中的参考资料
处于这个时代的最大好处是:当你决心去做成一件事的时候,你会发现早已有人做成了这件事,而且还免费的分享了一堆技术资料、示例、经验。。。。。。
什么?你问我在哪?
知道你的钥匙丢了去哪里找吗?百度啊!!
在此也分享一些本人学习的参考资料链接:(三维网的技术分享)当然后续学习主要依靠自己摸索和请教老师!(论有个好老师的重要性!)
    网络上免费分享的帖子、资料不计其数,初始时总像发现宝一样的疯狂下载到自己的电脑硬盘里,但是最后发现存储了很多!但是拥有的很少!因为人家的心不在你这里!
    简述一下本人的学习观点:可以做疯狂的学习者,但不要做疯狂的下载者!勤动手、多总结!
另外在ExcelHome论坛里有一篇帖子非常好:相信、实践、理解!
+ M+ R7 B6 \/ Z5 X
 楼主| 发表于 2019-3-24 12:08:41 | 显示全部楼层
本帖最后由 woaishuijia 于 2019-3-30 04:57 编辑
# q  U0 s  O* ^( U7 m
3 C+ c! J) W' F! f3、AutoCAD中程序的保存与修改9 t: b+ W+ @$ t# E! c6 h4 t" C8 K
通过观摩大神的技术分享并亲自动手试验一下,相信你对AutoCAD里VBA的的对象、方法、属性有了一点概念上的理解。
但是当你在AutoCAD的VBA里写完代码后满心欢喜的保存、关闭,以为下次打开后点击一下就自动运行了!哈哈哈,多刁!在打开的那一瞬间你是泪奔的!我写的代码哪里去了??
这里要说的是AutoCAD的VBA代码保存方式和Excel很不同!不是有专门的对应格式文件,也不是直接存储在这个文档里!而是单独保存在一个叫“Project.dvb”的文件里(Project是文件名可以修改),那是AutoCAD自己的工程代码类文件,需要额外加载。
以下内容原文链接地址:地址贴的第29楼层
A、单次加载VBA宏的方法
1、直接加载:
AutoCAD图形界面菜单:“工具”> “宏” > “加载工程”
或功能区 :“管理” > “应用程序” > “加载工程”
或命令行:VBALOAD
在弹出的对话框中找到你的VBA工程库名.dvb文件,打开、加载。返回到VBE窗口就能看见代码了。
2、通过VBA管理器加载:
首先打开VBA管理器,方法是:
CAD图形界面菜单:“工具”> “宏” > “VBA管理器”
或功能区 :“管理” > “应用程序” > “VBA管理器”
或命令行:VBAMAN
然后在弹出的“VBA管理器”上点击“加载”按钮。
同样在弹出的对话框中找到你的VBA工程库名.dvb文件,打开、加载。返回到VBE窗口就能看见代码了。
不过上述方法的缺点是每次重新打开AutoCAD时都需要这么操作一次,才能加载上你的工程代码。
    3卸载VBA宏的方法:
首先打开VBA管理器(方法同上),然后在列表框中选择要卸载的宏,点击“卸载”按钮
B、自动加载工程代码方法
想要AutoCAD文档打开可以自动加载工程代码大约有如下几种方法:
以下原文的地址链接:cad 自动加载vba程序
1vba自己加载法:将你的vba工程文件改名为acad.dvb,放在cad的安装目录下,vba初始化后自动加载。
2startup加载法:将你的vba文件放到cad的安装目下。cad安装目录下和suport目录下搜索acad.lsp文件,如果不存在,用windows记事本在安装目录下新建一个acad.lsp文件(如果已经存在,用记事本打开它),在该文件中添加如下内容:
(defunS::STARTUP()
(command"_VBALOAD" "myproj.dvb")
)
保存后退出,以后启动cad会自动加载,其中myproj.dvb你的vba工程文件名
以上是autodesk推荐的两种方法,其实还有第三种方法。
3lisp加载法。用记事本打开support目录下的acad20xx.lsp,其中20xx与acad的版本对应(如acad2000对应acad2000.lsp,acad2012对应acad2012.lsp等等),在文件的最后添加如下语句:
(vl-vbaload"myproj.dvb")
同样,vba工程文件名。保存后退出,以后可自动加载了。
# t# D$ |0 D0 k9 Z+ h
 楼主| 发表于 2019-3-24 12:08:42 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-25 20:45 编辑
2 A' M  M& A; F  ^
. B8 C; ~% m8 O8 K2 X% G- e4、让AutoCAD界面显示单步运行的结果
正常运行AutoCAD工程中的代码时,在CAD界面上看不见运行过程的,直到代码运行完后界面自动刷新,才会出现代码执行的结果。如果希望像Excel里那样单步执行可以看见过程,必须在程序中使用Update来刷新数据,但是刷新数据会耗费电脑内存资源,所以不是单步执行或者必须想看过程,不建议使用Update,因为必须每一步下面都要写上Update才能实现步步可见的效果。
  1. Sub 刷新界面()
    + n% N+ W9 s; S' c  U
  2.     Dim pt01(2) As Double, pt02(2) As Double,n%      '定义两个点变量,再定义一个循环变量
    * B( O$ {4 y& {' S& F7 Q  V- T
  3.     Dim l As AcadLine, cir As AcadCircle         '定义直线和圆变量,AcadLine是CAD中对象“直线”的类名,只有定义为指定的类名,CAD才知道你定义的这个变量是什么!
    . v" p! r5 D, n( u" v7 A
  4.     For n = 1 To 10                             '给循环变量n指定循环次数,从1 到10,默认每次增加1,即1,2,3,4,5,6,7,8,9,10
    9 z' z9 c+ l) t! `. N4 M) x5 t
  5.         pt01(0) = 10 * (n - 1)              '通过2楼链接里的帖子,相信你已经知道接下来的6句是干什么了吧?4 @- |7 w& n$ J: V
  6.         pt01(1) = 10 * (n - 1)3 j, d+ j8 R! c$ X
  7.         pt02(0) = pt01(0) + 50
    2 o2 p! v  q8 e8 K* l
  8.         pt02(1) = pt01(1) + 0" R; v) S) ~9 ^" M, ^
  9.         Set l =ThisDrawing.ModelSpace.AddLine(pt01, pt02)
    ' `0 A/ A; i) j$ l5 X: S
  10.         Set cir =ThisDrawing.ModelSpace.AddCircle(pt01, 50)) i. g1 c6 R" R" T# c  K0 V
  11.         update    '方法一、直接刷新' R$ ?7 R. C- H+ z% j
  12.         l.update  '方法二、对象刷新  '可以指定任一对象刷新,效果都是屏幕刷新
    ( |) ^0 X' C# J, @% S
  13.         ThisDrawing.Application.update   '方法三、使用当前画布对象刷新4 \; b: ^; n1 A7 ]+ [) H
  14.     Next3 p+ K  b6 L3 b6 F4 e7 ]% r- j9 w
  15. End Sub
复制代码
1.4、刷新界面Update.zip (5.58 KB, 下载次数: 14)
 楼主| 发表于 2019-3-24 17:17:35 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-25 20:49 编辑
8 m) P; U$ G- t0 u
* |  r2 @! s8 ]) l二、初识AutoCAD编程对象与方法
在你熟悉VBA编程的基本知识后,学习AutoCAD编程则要方便的多。虽然对象及其属性、方法不知道,也没办法录制宏!好在我们需要用到的对象也不用太多,先从直线、圆、圆弧、多段线等常用命令开始慢慢的积累。
1、直线命令(LINE)
在AutoCAD中画直线需要指定点的位置,CAD的模型空间相当于一个无限大的三维空间,因此绘制直线时指定的点的位置可以由三维坐标(x,y,z)来对应确定,如果只是在XY平面上画图,则Z坐标在赋值时可以省略(默认为0),但是定义点的坐标数组时必须是3个元素。
画直线的方法:AddLine(起点坐标,终点坐标)
  1. Sub 画直线()5 k) s4 e/ T: g/ c7 Z
  2.     Dim L01 As AcadLine   '定义直线对象变量( ]. ?3 \4 H3 }9 B
  3. '    Dim L02 As AcadLine
    & n! X, K2 K& t* j
  4. '    Dim L03 As AcadLine
    1 a' H+ Z- X/ v4 S) G; C+ m
  5.     Dim P01(0 To 2) As Double          '定义点数组变量,类型为双精度型(范围大,含小数),数组元素下标为0、1、2
    3 M2 h1 b  G$ a
  6.     Dim P02(2) As Double                '同上,单独一个数字表示数组元素下标的上限(最大值),默认从0开始,所以是0、1、29 E" j. u% Y) Q0 {+ ~: i
  7.     Dim P03(1 To 3) As Double         '同上,数组下标的下限可以自由设定,一般从1开始,所以设为1、2、3
    2 C* w% u) O" P; f
  8.     Dim P04(2 To 4) As Double         '同上,数组元素下标也可以设置为2、3、4
    9 x0 U, J( b: ^# j
  9.     P01(0) = -500: P01(1) =0          '对点的坐标数组元素分别赋值,可省略  : P01(2) = 0,多行语句合在一行写时用:连接7 e$ e/ ?; W5 r* ~- ]
  10.     P02(0) = 500: P02(1) = 0:P02(2) = 0           '按照先后顺序,对应该点的X、Y、Z坐标值
    7 O" Y& ^% q0 N& a
  11.     P03(1) = -600: P03(2) = 1000:P03(3) = 09 X. y/ o9 z) [; b% {7 M
  12.     P04(2) = 600: P04(3) =1000                        'z坐标值省略,默认是0/ S/ E2 q) g" Y" K0 N0 X. z% ^
  13.     With ThisDrawing.ModelSpace                      '在当前画布的模型空间里,with...end with语句简化代码的作用( S; o' M2 U9 Y6 R/ K
  14.         Set L01 = .AddLine(P01, P02)      '给对象赋值要用set,画直线的参数(起点坐标,终点坐标)要加括号- |  ]9 n2 D0 U! H0 z, W5 }
  15.         Call .AddLine(P01, P03)               '未定义对象时可以用call调用对应的过程或方法,参数也要加括号! i2 [0 W% v) g4 u
  16.         .AddLine P02, P04                        '也可以直接画,但此时画直线的参数不能加括号! j- ~- O/ x7 a. \+ v4 Y
  17.     End With
    % R( g: M+ r$ j2 N4 J1 a. l
  18. End Sub
复制代码

& M7 i3 U$ Z# @$ Z+ H
2.1、画直线.zip (4.65 KB, 下载次数: 15)
 楼主| 发表于 2019-3-25 20:55:42 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-25 20:58 编辑 * w9 S% q/ f6 F  y9 t

! i$ Z: a& K  m3 Y; S9 W6 j2、二维多段线命令(LightWeightPolyline)
    AutoCAD中多段线的作用是可以将多条线段、圆弧等对象连成一个整体,当然还有很多后续操作的方便之处(例如整体偏移等)
二维多段线在定义点的坐标时默认Z坐标为0(省略),多段线的连续点的坐标组成一个数组。数组中每两个元素值作为一个点的X、Y坐标值,所以二维多段线的点坐标数组的元素个数一定是偶数!画二维多段线方法:AddLightWeightPolyline(点坐标的数组集合)
  1. Sub 画多段线()
    , z, W/ }3 K/ s, D" P! K3 {2 {
  2.     Dim pl As AcadLWPolyline   '定义二维多段线对象变量
    1 d* M/ k7 p0 T4 q2 s  B
  3.     Dim pt1(1 To 8) As Double
    7 B/ l9 m2 U3 c( X2 o" Z
  4.     Dim pt2(1 To 3) As Double, pt3(1 To 3) As Double   '直线端点需要3个坐标,赋值时可以省略z坐标0
    $ ]. D% S$ M4 p. V" C$ Q
  5.     Dim pt4(1 To 3) As Double, pt5(1 To 3) As Double   '直线端点需要3个坐标,赋值时可以省略z坐标0
    1 K( y! |6 T8 s  L
  6.     Dim pt6(1 To 8) As Double, pt7(1 To 8) As Double
    " I* M2 A: G3 F
  7.     Dim n%, pts(1 To 10) As Double  '画矩形
    + u8 n& Y' D' A, E: ]# N! I# o
  8.     pt1(1) = -1600: pt1(2) = 3000  '每两个点作为一条二维多段线的一个端点坐标,默认z坐标为0省略。9 [3 c# Y* u; g
  9.     pt1(3) = -1400: pt1(4) = 0
    ) U$ T2 ]% L/ y. x. Q$ a( D- }9 _+ M# a
  10.     pt1(5) = 1400: pt1(6) = 0
    . Z2 e/ o8 h. G7 C. t% q4 C1 ~3 P4 q5 F
  11.     pt1(7) = 1600: pt1(8) = 3000" |" h3 R* t" u6 Z. _
  12.     Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(pt1)  '第一种赋值语句
    0 C% Z3 V" t6 i1 w+ O+ t5 @
  13.     pt2(1) = -1400.666667: pt2(2) = 101 m! c/ C) L- n8 L' [# D
  14.     pt3(1) = 1400.666667: pt3(2) = 10
    + U6 l1 o: o: A6 g( Z8 Z
  15.     ThisDrawing.ModelSpace.AddLine pt2, pt35 r6 L7 G% n% ~
  16.     pt4(1) = -1410.666667: pt4(2) = 160
    0 Q* h& B+ X4 E
  17.     pt5(1) = 1410.666667: pt5(2) = 160
    * q% @9 N6 B# G* b
  18.     ThisDrawing.ModelSpace.AddLine pt4, pt5
    & a) B8 x+ B0 v1 P+ C
  19.     pt6(1) = -1589.977802: pt6(2) = 3000  '每两个点作为一条二维多段线的一个端点坐标,默认z坐标为0省略。& C: E9 g! T/ \
  20.     pt6(3) = -1400.644469: pt6(4) = 160! r6 ^9 k9 V) _  Z/ Z8 |
  21.     pt6(5) = -1310.444691: pt6(6) = 160
    6 [3 B. z: J4 s2 n5 C$ B4 d7 q
  22.     pt6(7) = -1499.778024: pt6(8) = 3000
    , v( D7 A: Q. v0 o6 ]" A& {# C
  23.     Call ThisDrawing.ModelSpace.AddLightWeightPolyline(pt6)  '第二种赋值语句
    ! }. d+ v: E' e) V% H$ r/ v2 R" W0 |. E
  24.     pt7(1) = 1589.977802: pt7(2) = 3000  '每两个点作为一条二维多段线的一个端点坐标,默认z坐标为0省略。
    ; \6 o: M; ]2 a6 m  l( H9 I
  25.     pt7(3) = 1400.644469: pt7(4) = 160
    4 ], Y. m, {% V% \0 A$ M$ \9 ?% P8 w# N
  26.     pt7(5) = 1310.444691: pt7(6) = 160
    , G+ E# k+ F) H  q# ~3 ^, F& r
  27.     pt7(7) = 1499.778024: pt7(8) = 30002 X+ z  E1 j. Z. I4 q8 B, t2 d) ^
  28.     ThisDrawing.ModelSpace.AddLightWeightPolyline pt7  '第三种赋值语句
    ) S; c# D, {* v
  29.     For n = 1 To 28    '循环画矩形2 n: n8 b% |( v" {: U2 z" [
  30.         If n <= 12 Then  '不同的n值对应的矩形不同,添加一个判断
    , X) \: m' U/ q5 ?* t$ {% m6 a
  31.             pts(1) = -(n - 1) * 100 * 0.133333333333333 / 2 + pt6(5): pts(2) = (n - 1) * 100 + pt6(6)! z# E( K/ k& w4 t) P% D; D
  32.             pts(3) = pts(1) + 180: pts(4) = pts(2)9 B- W3 a3 d9 ]3 B- A2 l
  33.             pts(5) = pts(3): pts(6) = pts(4) + 1003 r4 v& O6 {0 x5 T* D( i
  34.             pts(7) = pts(5) - 180: pts(8) = pts(6)
    ) C/ c. P( w, S3 ^
  35.             pts(9) = pts(1): pts(10) = pts(2)
      a) @/ n6 s0 U, g
  36.         ElseIf n <= 20 Then  c5 _1 [  n( E4 i! D6 H3 H. r
  37.             pts(1) = -(n - 1) * 100 * 0.133333333333333 / 2 + pt6(5): pts(2) = (n - 1) * 100 + pt6(6)
    6 e% n6 ~2 ^, d. b" ^0 ]
  38.             pts(3) = pts(1) + 220: pts(4) = pts(2)* c. Z$ |$ D7 p+ b9 [2 H' B6 o  R
  39.             pts(5) = pts(3): pts(6) = pts(4) + 100
    # n3 ?, ?3 z0 v1 T3 J
  40.             pts(7) = pts(5) - 220: pts(8) = pts(6): M) p7 E4 }5 G3 ]
  41.             pts(9) = pts(1): pts(10) = pts(2)' q+ i: z+ H4 v$ T
  42.         Else& b4 _% l5 c1 m& r8 M6 n8 N
  43.             pts(1) = -(n - 1) * 100 * 0.133333333333333 / 2 + pt6(5): pts(2) = (n - 1) * 100 + pt6(6)* d8 A: A% P/ M- a. g5 e
  44.             pts(3) = pts(1) + 200: pts(4) = pts(2)
    0 A% p0 A3 Q& [, g$ ]1 L( _' x
  45.             pts(5) = pts(3): pts(6) = pts(4) + 100
    & X$ f0 q2 _4 z: a, _
  46.             pts(7) = pts(5) - 200: pts(8) = pts(6)% f4 ^: m9 k2 C1 c; f! \+ X2 Q
  47.             pts(9) = pts(1): pts(10) = pts(2)
    + _+ N6 s0 Q& n
  48.         End If& }- k5 \' z- j! K' X: ~
  49.        ThisDrawing.ModelSpace.AddLightWeightPolyline pts  '绘制二维多段线
    6 O8 }7 R) {  o( c& t
  50.     Next# i1 v4 t7 X* u% W, \
  51. End Sub
复制代码

& L9 m; D! F! N' Y. \
2.2、画多段线.zip (8.09 KB, 下载次数: 17)
 楼主| 发表于 2019-3-25 21:06:23 | 显示全部楼层
3、圆命令(Circle)
在AutoCAD中绘制圆时,需要指定圆的圆心坐标和半径,似乎只有这一种方法,想要通过其他方法画圆(如经过3点画圆),需要根据3点求出圆心坐标和半径大小!
A、根据圆心和半径画圆方法:AddCircle(圆心坐标,半径)
  1. Sub 同心圆()   '画100个同心圆0 B) v+ e& ^# J4 E4 V
  2.     Dim cir As AcadCircle8 a4 l# e9 T  b
  3.     Dim pot(2) As Double2 O( k9 f& D4 X/ N" S# d' g4 x
  4.     Dim r As Double
    ! a" t4 v  k# S4 m4 m/ w3 Z/ ]
  5.     Dim i+ M& M" H, i3 X+ X
  6.     pot(0) = 100
    % a7 }8 S' t2 }! c7 Y2 L
  7.     pot(1) = 1001 A3 h1 n# N' h7 E4 Q
  8.     pot(2) = 100   'Z坐标相当于将图形位置从XY平面平移到Z坐标所在位置。9 H! y5 ]9 ?  c9 z8 s& H
  9.     With ThisDrawing.ModelSpace
    : o- y/ s) i& K. z; a* t
  10.         For i = 1 To 1000 Step 105 g. S! ^% X: s! e6 D( e3 G
  11.             r = i * 100 r/ ]  A5 d! w) z
  12.             Call .AddCircle(pot, r)    '第一种赋值语句2 i3 h+ Z+ z% l) D/ [
  13.             Rem 上述语句中的call起到调用画圆的方法作用
    ! }8 C7 c0 B! n) o
  14.             Rem 使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。 _
    2 ^% D+ V& X8 h6 V7 P
  15.                 如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号
    & A7 T9 F3 z& |) }, O- C
  16. '            .AddCircle pot, r  '不用call时则参数argumentlis 外面的括号不能要!第二种赋值语句; n. x* u7 H  X1 \( p
  17. '        Set cir = .AddCircle(pot, r)  '第三种赋值语句+ M6 T8 j2 \& s
  18.         Next; J9 P* ^7 n7 g: _% s
  19.         Call MsgBox("100个同心圆已经绘制完毕!", vbOKOnly + vbInformation)* m3 c% C7 ]( s7 g# ?$ M4 |. U
  20.         MsgBox "100个同心圆已经绘制完毕!", vbOKOnly + vbInformation
    2 g0 H, m5 M8 N- s1 }5 `
  21.     End With
    4 ]3 f8 b5 Q1 c
  22. End Sub
复制代码
1 I" |& z. R/ j1 o8 y
B、根据三点坐标画圆
首先根据三点坐标计算出圆心坐标和半径大小,然后画圆,关于计算方法,根据几何图形知识换算即可。
  1. Sub 三点画圆(); Q3 ^, Y  B- a, o
  2.     Dim cir As AcadCircle
    5 X0 @3 V8 U' I5 b7 x2 E! d
  3.     Dim pt1(2) As Double, pt2(2) As Double, pt3(2) As Double
    5 g9 E6 e) B! ~, s6 X; m
  4.     Dim A1#, B1#, C1#, A2#, B2#, C2#                   '定义中间变量为double类型,用于简化计算8 ^+ r5 K# K( V7 E+ `, j
  5.     Dim pt0(2) As Double, r#                          '定义圆心坐标(X,Y)和半径r& d0 c8 x9 [( o% C. g% d* ~" s0 p
  6.     pt1(0) = 120: pt1(1) = 105                         '第一点坐标(X1,Y1)
    " q( e5 s' U0 Q% T: b
  7.     pt2(0) = 59: pt2(1) = 67                           '第二点坐标(X2,Y2)& s: K; z8 Z1 L+ z
  8.     pt3(0) = 89: pt3(1) = 91                           '第三点坐标(X3,Y3)% e+ Q- {  t3 @0 Q5 S' N$ \' b$ r
  9.     A1 = 2 * (pt2(0) - pt1(0))                          'A1=2*(X2-X1); S+ O+ }. ]. d# W
  10.     B1 = 2 * (pt2(1) - pt1(1))                          'B1=2*(Y2-Y1)
    & ~1 k' C- ^; q2 [1 z
  11.     C1 = pt2(0) ^ 2 - pt1(0) ^ 2 + pt2(1) ^ 2 - pt1(1) ^ 2     'C1=X2^2-X1^2+Y2^2-Y1^2
    9 |' O9 p- _  B1 p
  12.     A2 = 2 * (pt3(0) - pt1(0))                          'A2=2*(X3-X1)% e6 V" R: G% Z! Z6 F+ S' |* ?
  13.     B2 = 2 * (pt3(1) - pt1(1))                          'B2=2*(Y3-Y1)8 m5 m  J1 i& Y. M  \
  14.     C2 = pt3(0) ^ 2 - pt1(0) ^ 2 + pt3(1) ^ 2 - pt1(1) ^ 2     'C2=X3^2-X1^2+Y3^2-Y1^26 z+ a0 W9 A  V% q
  15.     pt0(0) = (B1 * C2 - B2 * C1) / (A2 * B1 - A1 * B2)       'X=(B1*C2-B2*C1)/(A2*B1-A1*B2)
    5 Z# N1 C" [$ p' L4 a7 _
  16.     pt0(1) = (A2 * C1 - A1 * C2) / (A2 * B1 - A1 * B2)       'Y=(A2*C1-A1*C2)/(A2*B1-A1*B2)9 J% m0 X2 n9 g  b3 m8 Y
  17.     r = ((pt0(0) - pt1(0)) ^ 2 + (pt0(1) - pt1(1)) ^ 2) ^ 0.5    'r=((X-X1)^2+(Y-Y1)^2)^0.5, ]0 D( y. O( k1 F6 Z
  18.     With ThisDrawing.ModelSpace
    ; x, `, u3 u3 j* f0 R' M
  19.         Set cir = .AddCircle(pt0, r)
    ! e) b% O3 f* q0 y0 U6 x2 |! |
  20.         Call .AddLine(pt1, pt2)                       '画这两条直线目的为了确认三点在圆上。; P" P, ^6 n) S; N4 n
  21.         .AddLine pt2, pt3
    6 _) S  O, W1 r' s( x; ]1 a  D
  22.     End With0 t2 I3 l9 t. x* j' N) O" J, f
  23.     ZoomAll                                       '全部显示在窗口中
    4 t  w6 d% A! G
  24. End Sub
复制代码
- b4 e) f( s: u1 n. u( ~
- u) _2 T( W) \8 ^
C、根据两点直径画圆
求出相应的圆心坐标和半径即可画圆
  1. Sub 两点直径画圆()4 I. A3 J0 W; n- A1 k! }3 |
  2.     Dim pt(3) As Double
    3 y/ @% P7 k, b% a9 L: c) [( U8 o4 P
  3.     Dim pt0(2) As Double, R#
    6 ^2 U' w9 W$ k( n5 o, t+ c0 `
  4.     pt(0) = 29: pt(1) = 35: pt(2) = 156: pt(3) = 286
    ! u9 O- G5 C' u
  5.     pt0(0) = (pt(0) + pt(2)) / 26 w0 [' H! k# g' A- O: g
  6.     pt0(1) = (pt(1) + pt(3)) / 24 m5 ^1 C" {1 {3 |( h9 E% c
  7.     R = ((pt0(0) - pt(0)) ^ 2 + (pt0(1) - pt(1)) ^ 2) ^ 0.5( t6 X; y  I/ J* ?5 e- T4 ^. k
  8.     ThisDrawing.ModelSpace.AddCircle pt0, R8 f; Z$ Q+ r1 A! L& n1 P3 j
  9. End Sub
复制代码
2.3-画圆命令.zip (7.51 KB, 下载次数: 13)
 楼主| 发表于 2019-3-25 21:19:17 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-25 21:25 编辑
3 i: Q9 L4 q, h! A. k3 ]/ K6 W% L7 T/ ?- Q  w8 N1 S3 b+ @# j
4、圆弧命令(Arc)
AutoCADVBA中添加圆弧的方法也很单一:需要指定圆心,半径,起始角,终止角四个参数.
A、指定四个基本参数画弧
方法: RetVal = Object.AddArc(Center, Radius, StartAngle, EndAngle)
Object可以是模型空间、布局空间、块等对象,
Center圆弧中心点坐标,3个元素组成的数组(double类型),其中Z坐标默认0可省略,
Radius圆弧的半径,double类型,
StartAngleEndAngledouble类型,用于输入定义圆弧的起始角和终止角(以弧度表示)大小。
起始角度和终止角度的确认:以圆心所在水平轴为X轴,圆心位置为坐标原点,以X轴正半轴为角度的起始边,逆时针旋转对应度数就是指定的起始角或终止角。所以AutoCAD中圆弧均是逆时针绘制
弧的优劣:当起始角小于终止角时,角度差大于180°就是优弧,小于180°就是劣弧当起始角大于终止角(可以为负角)时,圆弧依然是从起始角位置逆时针绘制到终止角位置
RetVal结果是新绘制的圆弧对象。
  1. Sub 圆弧()/ Z: S+ Z- u8 _5 @6 ^5 R& y! h8 S
  2.     Dim arc As AcadArc   '定义圆弧对象! j5 ?' x5 F0 N; \* V: f& _
  3.     Dim pot(1 To 3) As Double     '定义圆弧中心坐标点数组
    # H8 C# N' W2 b8 q# c% T
  4.     Dim R As Double     '定义半径, M7 W& N. t& J- C/ h& [7 A
  5.     Dim stq As Double, edq As Double  '定义起始角度,终止角度7 [/ P: c+ ?. o7 ~/ D
  6.     Dim str As Double, edr As Double  '定义起始弧度,终止弧度- [5 }+ T1 R5 z" S, e
  7.     Const pi = 3.14159265358979         '定义π常量,只能保留15位有效数字
    " U( a1 [# v7 o6 e
  8.     Dim n%
    9 e) L+ _9 J  m
  9.     pot(1) = 0: pot(2) = 0: pot(3) = 0
    ; q1 }/ V" h- _
  10.     For n = 1 To 10
      j5 ]- y" i- ~  Y
  11.         R = 39.5629 + (n - 1) * 10
    , O# c1 ?0 z5 G! h: h+ Q: J
  12.         stq = 0 + (n - 1) * 10
    ; a7 _% |- h( X
  13.         edq = 60 + (n - 1) * 10& w, ?$ P' s! k4 G- S# N) N  M- ^
  14.         Rem 如下度数转换为弧度值
    9 `" m. m! M3 z& D* r% D& Q
  15.         str = stq * pi / 180
    # V- X& i! v- C+ g  h( P4 |
  16.         edr = edq * pi / 1804 E2 t- j* C  Y
  17.         Rem 接下来画圆弧) M( p- |4 h- [& q% e6 d
  18.         Set arc = ThisDrawing.ModelSpace.AddArc(pot, R, str, edr)   '画的是逆时针圆弧* ^- D  I3 H- G+ E) O* x
  19.         Update
    5 I& m- y$ B- N3 P
  20.         Set arc = ThisDrawing.ModelSpace.AddArc(pot, R, edr, str)   '画的还是逆时针圆弧
    0 z2 n; d( k/ f% W* B& H
  21.         Update
    / D( W4 g  B: v. _* ~, W: N3 ~
  22.     Next
    * t5 x* ]1 Z% K! G" |0 T
  23.     For n = 1 To 102 ]* P& d5 G- ]! F
  24.         pot(1) = 200: pot(2) = 200
      H8 B$ E- i( d5 x
  25.         R = 100 + (n - 1) * 10
    ' ~8 v7 I2 C. b
  26.         str = (0 + (n - 1) * 10) * pi / 180
    : ?  k9 ?% u7 v7 R! b. Z
  27.         edr = (-60 - (n - 1) * 10) * pi / 180
    3 T" ]; a$ ~8 b7 X' H
  28.         ThisDrawing.ModelSpace.AddArc pot, R, str, edr       '画的还是逆时针圆弧1 y+ y" ~: c# R1 l% h$ E  o
  29.         Update: _, l! }! W) W; Z2 ?$ G: d
  30.     Next
    : j0 ~) }9 C5 k) _
  31. End Sub
复制代码

- K8 c" u* o3 ^- B. b
0 |7 L2 q7 p# T4 y% D1 {B、根据三点画弧
首先需要根据三点坐标换算出圆心坐标,半径大小,起始角度,终止角度.然后使用A方法画圆弧即可.
  1. Sub 三点画弧()9 R) L' F5 |- i# O. G
  2.     Dim ARC As AcadArc
    % X* [0 ^& v9 x# G+ B0 K; J
  3.     Dim pt1(2) As Double, pt2(2) As Double, pt3(2) As Double
    ; m  M' B  M  \! Z1 [$ l9 q
  4.     Dim A1#, B1#, C1#, A2#, B2#, C2#                   '定义中间变量为double类型,用于简化计算
    8 Z5 V$ h" K; z$ Q' s
  5.     Dim pt0(2) As Double, r#                          '定义圆心坐标(X,Y)和半径r+ U: V+ Q0 r4 i8 h/ Y/ }' b
  6.     Dim fst As Double, enr As Double                  '定义起始角和终止角
      \5 n# C# P9 s! f* G- ?$ O# t
  7.     Const pi As Double = 3.14159265358979              '定义π常量1 x2 r8 V2 e6 O# R7 z$ F
  8.     pt1(0) = 120: pt1(1) = 105                         '第一点坐标(X1,Y1),作为圆弧的起始角点) z5 ]3 m4 Q# @; {
  9.     pt2(0) = 59: pt2(1) = 67                           '第二点坐标(X2,Y2),作为圆弧的终止角点1 Y: l+ \/ B' {0 E
  10.     pt3(0) = 89: pt3(1) = 91                           '第三点坐标(X3,Y3)
    1 F& }  F( [6 p/ y$ k
  11.     A1 = 2 * (pt2(0) - pt1(0))                          'A1=2*(X2-X1)7 Y# g5 E1 l# `  U5 R8 r
  12.     B1 = 2 * (pt2(1) - pt1(1))                          'B1=2*(Y2-Y1)# r# n* P0 o/ v/ Z
  13.     C1 = pt2(0) ^ 2 - pt1(0) ^ 2 + pt2(1) ^ 2 - pt1(1) ^ 2     'C1=X2^2-X1^2+Y2^2-Y1^2, [0 v5 L; Z" R8 P: i2 e
  14.     A2 = 2 * (pt3(0) - pt1(0))                          'A2=2*(X3-X1)
    " q4 N, t  X1 l2 a2 `% P& o. w
  15.     B2 = 2 * (pt3(1) - pt1(1))                          'B2=2*(Y3-Y1)& l: ^7 N7 {, F" n
  16.     C2 = pt3(0) ^ 2 - pt1(0) ^ 2 + pt3(1) ^ 2 - pt1(1) ^ 2     'C2=X3^2-X1^2+Y3^2-Y1^25 v  V& a+ r  P3 q' ~7 k. n* v2 C
  17.     pt0(0) = (B1 * C2 - B2 * C1) / (A2 * B1 - A1 * B2)       'X=(B1*C2-B2*C1)/(A2*B1-A1*B2)! ]( P+ D" _' p7 g" R  w- m
  18.     pt0(1) = (A2 * C1 - A1 * C2) / (A2 * B1 - A1 * B2)       'Y=(A2*C1-A1*C2)/(A2*B1-A1*B2)
    : J" v. p- p  B1 n0 [
  19.     r = ((pt0(0) - pt1(0)) ^ 2 + (pt0(1) - pt1(1)) ^ 2) ^ 0.5    'r=((X-X1)^2+(Y-Y1)^2)^0.5( w: z9 F; m. j; U
  20.     fst = pi + Atn((pt1(1) - pt0(1)) / (pt1(0) - pt0(0)))       'VBA中只有反正切函数,没有反正弦和反余弦函数. ^1 G1 u! C/ o, {# l3 a
  21.     enr = pi + Atn((pt2(1) - pt0(1)) / (pt2(0) - pt0(0)))      'Atn((Y3-Y0)/(X3-X0))结果就是终止角的弧度值
    7 g! P2 W- w4 F7 P" u0 m
  22.    Rem 因为圆心在指定的三点的右下方,所以起始角和终止角均为负值,实际画圆弧的起始角和终止角均要加180°
    * D& _/ D' h. P2 j
  23.     With ThisDrawing.ModelSpace8 ?% U1 S' m% l- V3 K& z# f7 o& V
  24.         .AddArc pt0, r, fst, enr      '添加圆弧
    4 v* S; l& V2 C
  25.         .AddLine pt1, pt2   '画直线为了查看点在哪里  `3 \2 Q& H6 J5 O- n2 W
  26.         .AddLine pt2, pt36 v+ Q7 B+ t' g! N
  27.     End With3 H; a7 ?: ]( C' N6 i6 U  s0 O! f
  28. End Sub
复制代码

7 ~& m) s. [# d
关于起始角终止角的判定:首先VBA中只有反正切函数,没有反正弦、反余弦函数,所以只能借助反正切函数求角度,自然就会出现90°/270°不能根据反正切求出的破绽。
所以需要事先判断起始角和终止角是否为90°/270°,方法是圆心横坐标起点或终点的横坐标是否相同,圆心纵坐标与起点或终点纵坐标谁大?前者相同时,圆心纵坐标小则为90°,圆心纵坐标大则为270°;不同就不是90°/270°。
    另外就是根据反正切求出的角度有时需要加π,根据几何图形可知:起点坐标相对于圆心坐标在第一象限或者第四象限时直接使用反正切的结果;相对在第二象限或第三象限时使用π+反正切
直接判断横坐标:起点或终点横坐标大于圆心横坐标,则在第一或第四象限;起点或终点横坐标小于圆心横坐标,则在第二或第三象限。
所以修改后的代码如下:
  1. Sub 三点画弧()
    " G( S; i- o% {
  2.     Dim ARC As AcadArc9 c: n( c% y/ W) d) Y4 G+ r3 F% I
  3.     Dim pt1(2) As Double, pt2(2) As Double, pt3(2) As Double) s1 W: m. a) x* u, m
  4.     Dim A1#, B1#, C1#, A2#, B2#, C2#                       '定义中间变量为double类型,用于简化计算
    , o  B) m5 g* K
  5.     Dim pt0(2) As Double, R#                                       '定义圆心坐标(X,Y)和半径r( E0 M' J/ e+ O6 z5 E
  6.     Dim fst As Double, enr As Double                               '定义起始角和终止角" r8 I) a- J/ \! r) O0 D: w
  7.     Const pi As Double = 3.14159265358979                          '定义π常量5 k8 c# P4 p: m
  8.     pt1(0) = 120: pt1(1) = 105                               '第一点坐标(X1,Y1),作为圆弧的起始角点
    $ r7 @' `" w- R/ I, r5 d
  9.     pt2(0) = 59: pt2(1) = 67                                 '第二点坐标(X2,Y2),作为圆弧的终止角点& j+ p( _3 Y( {. e7 c9 K" t
  10.     pt3(0) = 89: pt3(1) = 91                                       '第三点坐标(X3,Y3)
    ' K% a5 ?; g4 s2 X. L+ C5 [( _" j
  11.     A1 = 2 * (pt2(0) - pt1(0))                                     'A1=2*(X2-X1)+ p1 L, R6 y4 ^' a; G9 M, i, U2 ^
  12.     B1 = 2 * (pt2(1) - pt1(1))                                     'B1=2*(Y2-Y1)
    ) D2 c- z: U' y# A
  13.     C1 = pt2(0) ^ 2 - pt1(0) ^ 2 + pt2(1) ^ 2 - pt1(1) ^ 2         'C1=X2^2-X1^2+Y2^2-Y1^29 ^: w3 l/ L: v" R$ @% D
  14.     A2 = 2 * (pt3(0) - pt1(0))                                     'A2=2*(X3-X1)
    # b1 _. V3 f2 V% M. n
  15.     B2 = 2 * (pt3(1) - pt1(1))                                     'B2=2*(Y3-Y1)
    * Z, _% d: g  m. A
  16.     C2 = pt3(0) ^ 2 - pt1(0) ^ 2 + pt3(1) ^ 2 - pt1(1) ^ 2         'C2=X3^2-X1^2+Y3^2-Y1^2
    * b+ ~' y8 G  e) [7 C  g7 O
  17.     pt0(0) = (B1 * C2 - B2 * C1) / (A2 * B1 - A1 * B2)             'X=(B1*C2-B2*C1)/(A2*B1-A1*B2); ^  w2 a; z6 A* d" _3 u6 p  S0 P
  18.     pt0(1) = (A2 * C1 - A1 * C2) / (A2 * B1 - A1 * B2)             'Y=(A2*C1-A1*C2)/(A2*B1-A1*B2)
    ; E3 I( H* L: y1 Z
  19.     R = ((pt0(0) - pt1(0)) ^ 2 + (pt0(1) - pt1(1)) ^ 2) ^ 0.5      'r=((X-X1)^2+(Y-Y1)^2)^0.54 y  `* ^: L3 W9 u4 l: \0 T/ \
  20.     If pt1(0) > pt0(0) Then
    " d# v& A; I6 y/ n1 `) k
  21.         fst = Atn((pt1(1) - pt0(1)) / (pt1(0) - pt0(0)))
    ' x- W. r7 X2 R; Z
  22.     ElseIf pt1(0) < pt0(0) Then$ a" Q4 w$ g5 @5 c! c1 e0 v' S
  23.         fst = pi + Atn((pt1(1) - pt0(1)) / (pt1(0) - pt0(0)))   'VBA中只有反正切函数,没有反正弦和反余弦函数
    8 Q7 L# n8 B( n; _1 X  t
  24.     Else! ~! u# x7 U' B# {! B# U
  25.         If pt1(1) > pt0(1) Then& t+ G: U, B( W. \4 E; q2 y* f
  26.             fst = pi / 2
    5 N+ ]9 _% l5 O6 X3 b/ i3 _
  27.         Else
    4 V4 ]% ]2 m8 c5 u1 m3 t
  28.             fst = 3 * pi / 2
    # H7 s5 b2 D3 v, ]  i8 z: P
  29.         End If
    0 v) Z6 m7 ]8 F( Z2 h6 M
  30.     End If: z4 D2 j2 Y. j& Q8 h& U
  31.     If pt2(0) > pt0(0) Then
    4 R. [0 C- c# I/ i; r& A% h
  32.         enr = Atn((pt2(1) - pt0(1)) / (pt2(0) - pt0(0)))
    1 k8 a- z5 n" V& I+ W
  33.     ElseIf pt2(0) < pt0(0) Then6 l! ~/ C- n1 f! E0 S  e- ~
  34.         enr = pi + Atn((pt2(1) - pt0(1)) / (pt2(0) - pt0(0)))   'Atn((Y3-Y0)/(X3-X0))结果就是终止角的弧度值
    ( W! X; w  r3 z+ t4 b0 U$ a
  35.     Else
    3 u8 f* R1 i0 D+ s
  36.         If pt2(1) > pt0(1) Then" `6 C7 _- p0 p. d; Z: ^8 Q
  37.             enr = pi / 2$ X2 B$ H) @( }( d
  38.         Else
    0 k9 ]) B3 H+ P* v
  39.             enr = 3 * pi / 2
    : A. V( k% q$ Z% \8 l
  40.         End If; W& _* x1 {/ s: J( x1 g
  41.     End If( C7 T0 |$ x9 {$ F& v! {# c" G
  42.     With ThisDrawing.ModelSpace" r3 |4 j# ?9 j+ @
  43.         .AddArc pt0, R, fst, enr                                '添加圆弧
    . D$ w% w; N6 d' P9 x3 P
  44.         .AddLine pt1, pt2                                       '画直线为了查看点在哪里
    : `8 v. x2 b/ ]! i' e. c
  45.         .AddLine pt2, pt3/ t  n3 ~& I: s
  46.     End With
    * L" G* }1 J3 Y3 Y0 _9 e$ x
  47. End Sub
复制代码

2 I5 a' G4 N: C  p  B9 Y
3 X- p6 o" J( ?9 h6 j

; V7 Z1 p! A) Z# Y9 Q
3 v5 p( {, F) ]4 k
7 ~% Q- l: `7 n' u) x4 U0 m( ?
 楼主| 发表于 2019-3-25 21:23:31 | 显示全部楼层
C、起点、端点、半径画弧
根据起点和端点及半径计算出圆心坐标,进而计算出起始角和终止角
已知:点A(X1,Y1)、点B(X2,Y2)、半径R,求圆心坐标O(X0,Y0)
理论计算如下: AB>2R时无解;AB=2R时有1解,圆心在AB中点处;AB<2R时有2解。
1553519917(1).jpg
/ H7 J! K! G/ r. g0 X- _
' G0 R* |+ i- L( I  m% A  E( ?: T
                              
  1. Sub 起端半径画弧()9 Q" p! g- A! Z8 V
  2.     Rem 根据理论计算方法画弧,假设AB和OM斜率均存在的情况下。
    7 y) X, \' P+ W/ z
  3.     Dim pt1(2) As Double, pt2(2) As Double, R As Double          '定义已知条件:起点A、端点B、半径R# e) @- \; K3 I3 P
  4.     Dim pt3(2) As Double, pt01(2) As Double, pt02(2) As Double    '定义辅助点(AB中点M)、圆心点O(有2个圆心)/ y! h' h: P* h& B% K4 Q: s
  5.     Dim KAB As Double, KOM As Double                       '定义直线AB斜率KAB、直线OM斜率KOM
      ~: `9 a, m7 k. i0 A
  6.     Dim BM As Double                                     '定义BM长度  F- x+ P. l. {  R9 l/ T
  7.     Dim QSJ As Double, ZZJ As Double                         '定义起始角,终止角  c8 X' N# _! g5 x% J, u- ^
  8.     Const pi As Double = 3.14159265358979                   '定义常量π$ }" z0 x; I- G. T
  9.     pt1(0) = 32.59: pt1(1) = 36.98                            '已知点A坐标
    0 k; p; i2 i1 e& t, @  R
  10.     pt2(0) = 69.87: pt2(1) = 70.59                            '已知点B坐标& e+ e% F- L% z9 W+ M
  11.     ThisDrawing.ModelSpace.AddLine pt1, pt2                 '画线段AB
    ( p1 G0 H' ~' ?8 t2 e
  12.     Update
    * J* G6 p4 ]2 Y9 d1 |; X
  13.     R = 100                                              '已知条件R2 U( t& z1 K- a
  14.     pt3(0) = (pt1(0) + pt2(0)) / 2: pt3(1) = (pt1(1) + pt2(1)) / 2      '求出中点M坐标
    ( v7 b2 ~5 F: Q
  15.     BM = Sqr((pt2(1) - pt3(1)) ^ 2 + (pt2(0) - pt3(0)) ^ 2)           '计算BM长度2 T: A4 f" A& H. h
  16.     KAB = (pt2(1) - pt1(1)) / (pt2(0) - pt1(0))
    & ~1 d/ z$ K0 m# {1 S
  17.     KOM = -1 / KAB
      I: X4 Z* e' {7 o; U5 e4 |) ]
  18.     pt01(0) = pt3(0) + Sqr((R ^ 2 - BM ^ 2) / (KOM ^ 2 + 1))         '第一组圆心坐标X0
    9 r5 Y3 i3 A7 \% s
  19.     pt01(1) = pt3(1) + KOM * Sqr((R ^ 2 - BM ^ 2) / (KOM ^ 2 + 1))   '第一组圆心坐标Y0
    ! ]- L2 R- u8 k3 s& {/ Z
  20.     pt02(0) = pt3(0) - Sqr((R ^ 2 - BM ^ 2) / (KOM ^ 2 + 1))         '第二组圆心坐标X0
    6 ?% Q5 X/ Q: K$ |  u
  21.     pt02(1) = pt3(1) - KOM * Sqr((R ^ 2 - BM ^ 2) / (KOM ^ 2 + 1))   '第二组圆心坐标Y0
    6 D4 n# F$ d  y( b% M4 }+ ^7 _
  22.     Rem 计算起始角和终止角时需根据点坐标关系判断谁是起点和终点,以及想画的是优弧还是劣弧
    . e3 D0 a: o3 W- n7 o. q2 s
  23.     If pt2(0) > pt01(0) Then) x. q1 Q. u2 h# H$ S' r: _
  24.         QSJ = Atn((pt2(1) - pt01(1)) / (pt2(0) - pt01(0)))
    # U' K8 r  z4 b- i0 q. b9 q
  25.     ElseIf pt2(0) < pt01(0) Then: w( y- v1 m7 j  g. ~
  26.         QSJ = pi + Atn((pt2(1) - pt01(1)) / (pt2(0) - pt01(0)))
    3 V, F1 [9 {+ C6 L
  27.     Else3 U1 ?5 R  `! V* {8 _
  28.         If pt2(1) > pt01(1) Then
    3 R2 {3 p3 v% A% G
  29.             QSJ = pi / 2+ X; v( M- i2 d8 T1 p
  30.         Else
    ' M& S# U& ~0 t/ j/ S
  31.             QSJ = 3 * pi / 2
    9 g; l0 d  g8 }& d% U2 j# T
  32.         End If) }$ {5 \5 B; [/ v
  33.     End If
      h7 e' x, ^8 r4 f1 s
  34.     If pt1(0) > pt01(0) Then
    3 m3 |  b, h3 z# q5 C5 O1 t( g, z3 c
  35.         ZZJ = Atn((pt1(1) - pt01(1)) / (pt1(0) - pt01(0)))) d8 C. a2 Q+ |6 {* N( [
  36.     ElseIf pt1(0) < pt01(0) Then
    2 f( H3 W' I: k, s6 I; r9 c0 s/ T! ?
  37.         ZZJ = pi + Atn((pt1(1) - pt01(1)) / (pt1(0) - pt01(0)))8 V4 x, m! K" i9 N% X$ @) e
  38.     Else
    . @* F5 j* @0 ]. o* l
  39.         If pt1(1) > pt01(1) Then. ^/ X3 d, Q2 n% j" O
  40.             ZZJ = pi / 2
    8 X8 m+ |( E  Y7 F( I" `
  41.         Else
    8 [4 j  E+ Q1 G  t
  42.             ZZJ = 3 * pi / 25 \& T9 a+ q2 I! V* M' F
  43.         End If
    8 q# T" X; d( ?+ q, c7 z! b5 W5 K
  44.     End If
    . z! j8 S2 E8 c
  45.     ThisDrawing.ModelSpace.AddArc pt01, R, QSJ, ZZJ
    0 x7 D1 Q$ F& K: N, A" i
  46.     Update
    ; s" I' }) K/ \! X9 C! z
  47.     If pt1(0) > pt02(0) Then
    , u2 Y9 D3 T1 Z
  48.         QSJ = Atn((pt1(1) - pt02(1)) / (pt1(0) - pt02(0)))
    , s6 \! p; `4 w) b
  49.     ElseIf pt1(0) < pt02(0) Then
    8 r6 Y9 }8 _/ Z
  50.         QSJ = pi + Atn((pt1(1) - pt02(1)) / (pt1(0) - pt02(0)))9 r) Q: o# M3 `5 w" k5 k; w9 j
  51.     Else$ y; _2 `( V  K1 W9 Q' J9 x
  52.         If pt1(1) > pt02(1) Then
    # @( @9 z$ k" `+ d4 L
  53.             QSJ = pi / 2
    - e3 B% q' e$ z$ @3 o% m, I* R; l
  54.         Else7 L: {; w2 `( H* V
  55.             QSJ = 3 * pi / 2
    & e8 H2 ~8 o. }( H& o- S0 w
  56.         End If2 A& p2 E) R! r# E- M
  57.     End If
      x/ I' z7 Y$ K3 C/ m& Q+ @
  58.     If pt2(0) > pt02(0) Then! Q" F/ P; F. t# b# Z  P
  59.         ZZJ = Atn((pt2(1) - pt02(1)) / (pt2(0) - pt02(0)))
    : v9 t: L+ F8 v' l% p2 w3 Z9 Y- @6 l
  60.     ElseIf pt2(0) < pt02(0) Then" I! e# b( `2 O
  61.         ZZJ = pi + Atn((pt2(1) - pt02(1)) / (pt2(0) - pt02(0)))
    . r- v, s8 I9 b2 n! H! n) g2 ^# L
  62.     Else
    ; ~) M! H( y( E$ g0 b
  63.         If pt2(1) > pt02(1) Then
    . }9 i) q, j7 L9 y5 D
  64.             ZZJ = pi / 2" @" G# \- o: N5 G
  65.         Else
    ' F! w' e6 A9 V
  66.             ZZJ = 3 * pi / 2: S2 O6 s2 _% E& L9 N" D  a
  67.         End If% }  `* n/ |, R# |1 W8 b
  68.     End If0 e5 @+ F3 |) j# ~3 V) `( r& ^
  69.     QSJ = Atn((pt1(1) - pt02(1)) / (pt1(0) - pt02(0)))7 s! Q7 k- w+ y& A, {
  70.     ZZJ = Atn((pt2(1) - pt02(1)) / (pt2(0) - pt02(0)))
      H' o; S1 o5 r1 a
  71.     ThisDrawing.ModelSpace.AddArc pt02, R, QSJ, ZZJ   '画劣弧9 X5 ~" w1 l4 g8 o7 j( V' b
  72.     Update
    4 C+ R: V. b* w! j
  73.     ThisDrawing.ModelSpace.AddArc pt02, R, ZZJ, QSJ   '画优弧
    * I6 ~6 H3 M1 E( \
  74.     Update
    ; P& x, \. `/ d8 v
  75. End Sub
复制代码
2.4、圆弧命令.zip (11.43 KB, 下载次数: 17)
 楼主| 发表于 2019-3-25 21:32:37 | 显示全部楼层
5、对象操作方法之偏移、镜像0 h) U' U' |5 q% X  _
4 M5 i2 t; a0 `$ G& C
AObject.Offset方法
在AutoCAD中,对象偏移的结果仍是对象,但是与Excel不同的是,在AutoCAD中对于很多对象,该操作的结果形成单一的新曲线(它的类型可能与原始曲线不同)。例如,椭圆偏移后的对象将会是样条曲线,这是因为结果不能与椭圆的方程式匹配。有时偏移结果可能形成多个曲线。
所以AutoCAD中偏移的结果是一个对象组成的数组
基本语法:RetVal = object.Offset(Distance)
Object可以是圆、圆弧、直线、多段线、样条曲线、构造线等对象。
Distance是偏移的距离(double双精度型),可以是正值或负值,但是不能为0。如果偏移为负值,这意味着将得到更“小”的曲线 (例如,一个圆以负值偏移后的得到的圆的半径将会比原对象半径小). 如果“小”没有意义,则AutoCAD将向小的XYZ WCS坐标方向偏移。如果偏移距离无效,则返回错误。
[明经通道特别提示对于的LightweightPolyline Polyline 对象,曲线有顺时针方向和逆时针方向,对于顺时针方向,距离值为正值时为向内偏移,距离值为负值时为向外偏移。对于逆时针时刚好相反。对于自相交的多段线的偏移方向需要自己慢慢实践了。
RetVal返回偏移的结果,注意是一个对象数组,所以在赋值时不用set,并且对赋予的新变量后续操作时,需用索引号选取第几个对象,一般用(0)来选取第一个。
  1. Sub 偏移()
    ; V4 [3 ^' y% F/ d
  2.     Dim l As AcadLWPolyline7 [; K$ K! A7 j( S$ Y: U" r2 p$ ]
  3.     Dim pot(5) As Double
    - L& E8 M# ^9 G- X* R
  4.     Dim LL, l02  '直接定义为变体型类型,& Y0 P4 k1 ~$ m) j* V8 c
  5.     pot(0) = 50: pot(1) = 100. t( x0 i& C% |, p& l
  6.     pot(2) = 300: pot(3) = 500) U% ^2 Q* d1 b. y: C2 N
  7.     pot(4) = 600: pot(5) = 190+ F2 ^- k; |" F6 l6 K, Z9 D
  8.     Set l = ThisDrawing.ModelSpace.AddLightWeightPolyline(pot)  '顺时针多段线2 r1 U5 o, B& m7 \6 [$ O( G
  9.     LL = l.Offset(35.26)            '正值向内偏移0 S8 O# S1 S, \/ X% y( x
  10.     LL(0).Lineweight = acLnWt050   '设置线宽为0.50mm,用索引号(0)选取第一个对象元素
    , }% a6 ^7 y3 S1 I4 n& d1 l
  11.     l02 = l.Offset(-36.28)           '负值向外偏移6 h7 ~6 i. D( I: v+ M8 s( x
  12.     '.....................................................................- j: e5 C- u- T4 i8 \4 j

  13. 5 U" p. H( N4 w& h1 Y# l9 ?
  14.     Dim l1 As AcadLWPolyline
    " v. B8 T: e5 w4 P6 Y
  15.     Dim pot2(5) As Double$ o% ?; k2 d% K9 G
  16.     Dim lll, lll02                   '定义变体型
    : _5 c6 |; ^5 D4 O6 f0 T
  17.     pot2(0) = 10: pot2(1) = 10
    8 Z% d& x7 f+ X" z1 u5 i+ X' m
  18.     pot2(2) = 100: pot2(3) = -300/ S/ @! g1 ?  {) F) c! M! m
  19.     pot2(4) = 300: pot2(5) = 500
    ) P0 R- B5 q- G% Z' G4 q! i
  20.     Set l1 = ThisDrawing.ModelSpace.AddLightWeightPolyline(pot2)   '逆时针多段线) L, y5 j+ J0 E# u- f- Q2 V
  21.     lll = l1.Offset(100)               '正值向外偏移; ]8 H0 R+ }( h6 h
  22.     lll(0).Lineweight = acLnWt050     '设置线宽为0.50mm
    7 Q- {2 m2 d8 x
  23. lll02 = l1.Offset(-100)            '负值向内偏移,且结果变成一条线了!
    0 z- Q: ^2 F, ?
  24. l1.Offset 300                   '直接偏移
    # U* F% n# h' B* ]& a' v
  25. End Sub
复制代码

- \/ A- G7 Z# Z2 b/ m' L
/ |* i6 m1 j/ Q# X
' M( |( S5 t; L: q0 m
通过以上程序感受一下对象偏移的结果及引用偏移的结果对象的方法。

$ K2 k1 m, q6 r
( S% W; X" A9 B# |) H4 x1 r
 楼主| 发表于 2019-3-25 21:38:36 | 显示全部楼层
BObject.Mirror方法
镜像方法相对简单,结果就是一个新的对象。
语法:RetVal =Object.Mirror(Point1, Point2)
Object可以是任何图形对象;
Point1, Point2是镜像对称轴上两点的坐标,均为double类型。
RetVal是镜像后的对应对象
注意:可以使用 MIRRTEXT系统变量来管理文本对象的反向属性。MIRRTEXT 的缺省设置为开(1),它使文本对象与其它对象一样镜像。当其设置为关(0)时,文本不被镜像———AddMText方法讲解。
如果是想同时镜像多个对象,可以先将多个对象建立成块,然后镜像块即可。
  1. Sub 镜像(), i! L2 h" U  K% _  q5 }
  2.     Dim pl As AcadLWPolyline; q% w" q; G4 s. y0 m* [
  3.     Dim pts(9) As Double1 [% A5 Z' X% }- H3 }  ~$ E
  4.     Dim pl2 As AcadLWPolyline5 T: ^6 W2 _2 X, B  P
  5.     Dim pt01(2) As Double, pt02(2) As Double, pt03(2) As Double
    ! M6 L4 r* q: J' _, Q+ }+ X
  6.     Dim rec As Object
      C' B5 Y  @( W  |3 E( z5 `# K
  7.     pts(0) = 0: pts(1) = 0
    ' V: z7 d) i& X* i! M4 f! h2 {
  8.     pts(2) = 100: pts(3) = 06 u( {+ Z6 b. ^3 d; X. ?3 Y, S# l
  9.     pts(4) = 100: pts(5) = 100. ?# `+ M2 Q9 w; d
  10.     pts(6) = 0: pts(7) = 100+ Y5 _3 T6 t- z/ M: N9 @
  11.     pts(8) = 0: pts(9) = 0( \* _1 O5 C) {) C. g  W
  12.     Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(pts) '绘制多段线矩形
    * a: R. p9 ^' a& {- ]; f2 w
  13.     pt01(0) = 0: pt01(1) = 150
    2 }0 X& m* e5 @4 Y& Q- {* f
  14.     pt02(0) = 150: pt02(1) = 150
    7 W; N4 Z$ L; X  |/ T$ v
  15.     pt03(0) = 150: pt03(1) = 0
    1 h- N2 M9 V7 J, ^: W2 V' k
  16.     With ThisDrawing.ModelSpace
    ; z0 y, Z5 a% b, q- i/ y- d  n
  17.         .AddLine pt01, pt02
    5 L* x( c2 w( V: s) U$ B" W4 U
  18.         .AddLine pt02, pt035 u0 U* i+ J$ o; \4 u! D1 q1 u
  19.     End With' }: Z/ }& F! l
  20.     Set rec = pl.Mirror(pt01, pt02)   '给矩形镜像并赋给新对象9 u5 D) N  G  d+ @& e3 u0 y- j9 n, B
  21.     pl.Mirror pt02, pt03              '直接镜像9 D0 ]- l+ _. W% h5 A% A* O
  22. End Sub
复制代码
2.5、偏移、镜像.zip (4.58 KB, 下载次数: 11)
 楼主| 发表于 2019-3-25 21:48:57 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-25 22:04 编辑
7 e1 v& L# R6 ~6 }8 S+ H8 h- ?% s+ `8 R0 A
6、设置对象属性之颜色、线宽、线型、比例、图层/ p5 o/ I# h- z+ v8 o" \3 O3 P

1 S# W  a4 B+ A" I" d4 ?A、添加线型
  1. Sub 添加线型()
    4 D& }& E" ~) d( v8 m
  2.     ' 该示例尝试从acad.lin文件中加载 "CENTER" 线型。如果该线型已经存在,则提示错误。, n- q( h( c  @" ^  @
  3.     Dim L As AcadLine, P1(2) As Double, P2(2) As Double
    - \: {8 h: S) ]3 V. w5 [' _
  4.     ' 从acad.lin文件中加载 "CENTER"线型8 I  U2 v+ h) f1 L: @  T
  5.     On Error Resume Next    ' 下面添加线型语句在已经添加了线型时会出错!所以添加此句% v3 o; U/ P/ g3 }
  6.     ThisDrawing.Linetypes.Load "CENTER", "acad.lin"   ‘加载线型! P+ b, h6 Q( K* L7 O4 t
  7.     On Error GoTo 0    '恢复错误提示
    ) m* j4 c4 ~9 a9 Y
  8.     MsgBox Err.Number   '弹出错误对应的数字代码,此处没啥用,就是看看错误对应的代码。: d- e' ]  c: W+ U- d
  9.     Err.Clear     '清除错误* M3 v6 O% Z1 r
  10.     P1(0) = 0: P1(1) = 0
    " r. P- [6 E& Y. u/ F/ n
  11.     P2(0) = 100: P2(1) = 1003 v/ ^6 w9 q7 Q; Y8 D  D
  12.     Set L = ThisDrawing.ModelSpace.AddLine(P1, P2)
    8 l9 J# L, K- T- U' x9 ?
  13.     L.Linetype = "CENTER"                           ‘设置对象的线型属性
    $ W. r" [3 [" `
  14. End Sub
复制代码

( T; }& u2 d& T$ L  y" P! _
, m8 c; ]! [3 k+ YB、设置对象属性之颜色
在AutoCAD中设置对象颜色有两种方法:Color属性(早起版本,后续会被淘汰)、AcadAcCmColor对象(AutoCAD真彩色对象)。
  1. Sub 颜色属性()
    / h- Z* t1 j. ^  Q  R9 J- x
  2.     Dim L As AcadLine, P1(2) As Double, P2(2) As Double  |1 X+ B5 q" J; d  P. J
  3.     '    Dim CL As AcadAcCmColor
    9 L* H4 @( J+ J! `% y0 l" U! H
  4.     On Error Resume Next/ p  w7 I! A' d0 Q
  5.     ThisDrawing.Linetypes.Load "DASHDOT", "acad.lin"- R# ]; P( a8 F* K
  6.     '先加载线型,如果已存在,会报错,所以添加上面容错语句; M% [0 I; n# t$ V5 I. V5 J% @4 I
  7.     Rem dashdot是线型的名字,加载中心线就是CENTER,Acad.lin类似CAD存储线型的文件夹
    & k% s' a" S* N
  8.     On Error GoTo 0
    , i# X6 `" b; ~1 Q( m
  9.     Err.Clear    '清除错误!
    4 J/ {; G5 o3 g4 b$ k0 z
  10.     '    Set CL = New AcadAcCmColor
    / `' e9 @/ f6 w$ z3 p4 g) K3 C& O
  11.     '    CL.ColorIndex = acRed
    ; v% t! c, A( j8 h3 s+ C7 u
  12.     P2(0) = 100: P2(1) = 100
    & S: A  T3 t  ^
  13.     Set L = ThisDrawing.ModelSpace.AddLine(P1, P2)
    ( M" c( Q% ?9 g2 E) `! X& t; @
  14.     L.Linetype = "DASHDOT"
    " p( [( s2 N( i1 N. A/ I0 L" g: m
  15.     '    L.TrueColor = CL
    3 q& B: ~' L  n( T9 I
  16.     L.color = acCyan   '藏青色3 [$ h; z) h8 o) Q
  17.     '    L.color = RGB(213, 222, 198)  '使用RGB函数赋值颜色无效!) J& r+ q3 G+ N6 G  W/ n
  18. End Sub
复制代码
3 B, _. n& c6 t& L$ a
; P+ U( d2 [: X8 v

. X* h3 s  D7 r2 [" _5 J
  1. Sub 颜色对象()2 @1 |3 n1 A6 C5 d
  2.     Dim L As AcadLine, P1(2) As Double, P2(2) As Double
    ! i$ t$ o# t: x, e) a8 u
  3.     Dim CL As Object   'AcadAcCmColor  定义为对象或者制定的颜色对象均可。
    ; }+ Z$ Q5 }& D: Q* E2 J
  4.     Dim n
    5 r7 k. _9 D1 w  |5 |; c
  5.     On Error Resume Next
    ' e1 i3 x; q# k2 x3 P  z! g4 p
  6.     '如果线型已加载,使用下面这行加载线型的语句就会引发错误。所以这行用错误处理语句跳过可能的错误,这样在重复使用这段程序时就不会带来不必要麻烦——不用先检查线型是否已加载. b8 V3 v' N& O- b
  7.     ThisDrawing.Linetypes.Load "DASHDOT", "acad.lin". d9 I* k  J! B6 P) U3 g( _
  8.     On Error GoTo 0 '这行是恢复正常报错,以免后面调试时出了错不报
    ' H0 N$ Z& }( N% ~2 M
  9.     Err.Clear '和上面这行一样用处,清除错误
    2 Y* o1 |& K( h  a& `
  10. '    Set CL = New AcadAcCmColor% u; q5 G( d, {: U
  11.     Rem 上面语句相当于新建一个颜色对象,也可以使用AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.版本号")来创建颜色对象6 V; u: F8 ]. h' q# D7 @- K
  12.     n = Application.Version   '查看当前CAD版本号/ `' M: U- f/ I* i" X' Z, A
  13.     Set CL = GetInterfaceObject("AutoCAD.AcCmColor.19")   '19就是上一句获得的结果8 }' [9 b" F" k/ K, X
  14.     CL.ColorIndex = acRed   '可以使用颜色索引号索取颜色
    4 F% \" z+ w4 w  B: J
  15. '   CL.color = RGB(200, 215, 225)  '同样不能使用RGB函数赋值颜色/ y; w( B3 C+ F# ~; F6 S6 R  i
  16.     Call CL.SetRGB(200, 215, 225)      '也可以使用SetRGB方法指定对应颜色,不用call时,参数的括号不要写。
    2 t3 d/ Z$ n" i" r
  17.     P2(0) = 100: P2(1) = 100: O* L* f1 K: p  C
  18.     Set L = ThisDrawing.ModelSpace.AddLine(P1, P2)' m' t1 |. ]  k! g
  19.     L.Linetype = "DASHDOT"* c, q& U& v' T  d& Y) Z
  20.     L.TrueColor = CL
    # Z$ P# Z6 d0 ]; Y1 x3 f& ^
  21. End Sub
复制代码
0 r0 V5 |( H: U# ?6 o, i4 q
注意:AcadApplication对象的GetInterfaceObject 方法,是创建一个CAD程序的子对象,它在VBA中是没有加载的,用的时候新建就可以了。通过以上两例子来体会一下两种赋值颜色的语句的不同!
: m5 a, F5 E: r& d) g7 l" U' r6 J: I1 _. F  r% I
 楼主| 发表于 2019-3-25 21:51:49 | 显示全部楼层
C、设置线宽和比例
  1. Sub 设置线宽和比例()
    8 w/ k0 s& R' U
  2.     Dim L As AcadLine, P1(2) As Double, P2(2) As Double! U! J) `- A* c! s
  3.     Dim CL As AcadAcCmColor
    * G  b! E% j" `' \$ P# n4 u# e2 p
  4.     On Error Resume Next
    5 l# K% A+ {; r& F3 K3 H
  5.     ThisDrawing.Linetypes.Load "DASHDOT", "acad.lin"$ d3 H% h$ T, a  L" U1 X! v1 C
  6.     On Error GoTo 0 '这行是恢复正常报错,以免后面调试时出了错不报; t1 q  o9 v- H! C
  7.     Err.Clear '和上面这行一样用处,清除错误
    & d  r, l5 ?5 Z$ n+ m* K' ^
  8.     Set CL = New AcadAcCmColor2 f% G2 s* m& ~  N; w  C4 D
  9.     CL.ColorIndex = acRed
    . T0 v& H& O1 U# Z; q! O9 X
  10.     P2(0) = 100: P2(1) = 1005 P: V" e/ B; N- c) r3 w* `
  11.     Set L = ThisDrawing.ModelSpace.AddLine(P1, P2)
    ( j' h; l* s3 d+ u+ @
  12.     L.Linetype = "DASHDOT"/ C) G( H5 F) G+ G2 ~9 S0 a
  13.     L.TrueColor = CL
    * X( x- O; ?( _: [2 c, s/ D
  14.     L.Lineweight = acLnWt050        '050代表0.50mm 粗
    8 P2 T  \. O4 G& D1 e; i: ^
  15.     L.LinetypeScale = 2.25           '指定线型的比例因子,该值必须正实数,默认1.0; L# e% H8 K4 L. h& c+ Z: C6 j3 G3 F
  16. End Sub
复制代码

1 @0 W' k: b5 S* T- ]" A0 q
对象的一些基本属性相对简单,不在赘述!

& ~  s3 ^  s- Z' i9 `$ n

7 k: \4 G+ J8 E8 M2 p; G
D、添加图层
  1. Sub 添加图层()
    7 I  m" O1 z: j9 Z! S" w# J
  2.     Dim layerObj As AcadLayer   '定义图层对象变量
    $ S  o* g# E8 q, y
  3.     Set layerObj = ThisDrawing.Layers.Add("ABC")   '创建新图层8 L) a/ X; i$ I" J! `. ~' B
  4.     Dim color As AcadAcCmColor                      '定义颜色对象变量4 I; f; Z! z9 O, D5 h
  5.     Set color = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.19")   '创建颜色对象
    5 _5 U6 z- d2 T! Z# [' p
  6.     Call color.SetRGB(80, 100, 244)    '设置颜色值(通过RGB值指定); m3 P: @1 r7 w! Y: E+ Y4 T  @
  7.     layerObj.TrueColor = color         '设置图层颜色3 C  a3 ^" i/ f7 _7 R6 m% P2 \/ a
  8.     On Error Resume Next
    ) X' L6 n; q0 j/ Z( y( s3 C
  9.     ThisDrawing.Linetypes.Load "DIVIDE2", "acad.lin"
    ) d: w, b) e5 r% y9 [% ~) H
  10.     On Error GoTo 0 '这行是恢复正常报错,以免后面调试时出了错不报
    0 V! E! o% d7 Q" e( q5 V+ I1 A  ~& ]
  11.     Err.Clear '和上面这行一样用处,清除错误
    - A" a- B& S* _! ^
  12.     layerObj.Linetype = "DIVIDE2"       '设置图层的线型* H5 F2 E) Q9 h( B' V3 t
  13.     layerObj.Lineweight = acLnWt040     '设置图层的线宽
    ' o# j: j/ Q) m2 I/ d( ~, K
  14. '    layerObj.LinetypeScale = 2.5       '不支持设置线型比例方法
    & A% f) V- b& p4 x- k$ d, G+ \+ R% V
  15.     Dim circleObj As AcadCircle        '定义圆变量# c& y" A! |6 }7 T
  16.     Dim center(0 To 2) As Double
    & V; B& }: t: N5 r
  17.     Dim radius As Double
      q! R: Y8 Z0 Q1 j! b" |- q
  18.     center(0) = 3: center(1) = 3: center(2) = 0- F) C4 n" U# C) r5 }5 ~
  19.     radius = 1.5
    * M1 R& a, s9 Z( D) I
  20.     Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius)    '画圆
    " A% t5 U$ b# ~1 g" ?  W
  21.     Update
    . U  H* Z6 a+ D+ U2 e7 N
  22.     MsgBox "已经在图层上创建了圆,对应图层是: " & circleObj.Layer, , "Layer 示例"7 ?  H3 ?/ c% l
  23.     Update
    ; W, B2 c" W1 _6 l
  24.     circleObj.Layer = "ABC"    '将圆所在图层设置为指定的图层6 M3 s' p. \7 Q& ?) G- }
  25.     Update
    ! {. j4 P2 _( p) @; h. J: s/ e; U
  26.     ThisDrawing.Regen (True)     '重生成整个图形并重计算所有对象的屏幕坐标和显示精度。
    ; \0 B2 F1 S$ o  \5 ^. W) |4 a
  27.     MsgBox "现在圆已经在" & circleObj.Layer & "图层上了!", , "Layer 示例"
    2 p( c8 i+ i% n- {: g4 |1 d
  28. End Sub
复制代码
2.6、线型、颜色、线宽、比例、图层.zip (10.02 KB, 下载次数: 9)
 楼主| 发表于 2019-3-27 20:45:31 | 显示全部楼层
7、添加文字(AddMText)
该方法是在由插入点边框宽度所定义的矩形中创建多行文字。
语法:RetVal= object.AddMText(InsertionPoint, Width, Text)
Object针对ModelSpace 集合,PaperSpace 集合, Block等对象。
InsertionPointVariant[变体] (三元素双精度数组); 仅用于输入多行文字边框的插入点。
WidthDouble[双精度]; 仅用于输入多行文字边框的宽度(一行容纳字符数量的宽度)
TextString[字符串]; 仅用于输入MText 对象的实际文本字符串。
RetVal结果就是一个多行文本对象。示例如下:
  1. Sub Example_AddMtext(), s; }' I+ H5 e. J# ]1 k
  2.     ' 该示例在模型空间中创建多行文字对象。1 m! L, V$ \8 z" w( R- L; ^
  3.     Dim MTextObj As AcadMText, `  e8 a( N, M' r
  4.     Dim corner(0 To 2) As Double
    ; s* [  e1 {8 X; }3 }/ g% M% k
  5.     Dim width As Double: O3 ]5 E. t9 l% O4 |
  6.     Dim text As String
    ! _9 B# X) a" g1 [' l
  7.     corner(0) = 0#: corner(1) = 10#: corner(2) = 0#
    $ G+ e4 Z& C6 z3 Y
  8.     width = 20   '一行容纳文字数量的宽度) H! L( V( p4 G5 D& z/ U5 D& L
  9.     text = "This is the text String for the mtext Object"; F! [6 i) [* o" b  j  o( t
  10.     ' 创建多行文字对象
    * u% V/ [: p+ R
  11.     Set MTextObj = ThisDrawing.ModelSpace.AddMText(corner, width, text)
    # ~) ]- G  M, T8 \! H
  12. ZoomAll
    # W7 Z9 o4 a* i; X6 p* J8 y
  13. '.................................................................................................................
    ; v+ R" n( ]; D
  14.     Dim pt1(2) As Double, pt2(2) As Double
    ( U) }& P3 o2 j8 e" v4 x" m
  15.     Dim str As String; ~9 P6 c& E  f( Z* ^" _
  16.     str = "mirrtext 1 "   '按照界面操作顺序输入
    / n, t! W9 I3 g5 E- [
  17.     ThisDrawing.SendCommand str   '向命令行发送命令并自动执行
    - C1 B- v: h+ Q  y1 d$ `
  18.     pt1(0) = 30: pt1(1) = -10
    # [4 b6 c& T: ~- O0 r6 H
  19.     pt2(0) = 30: pt2(1) = 30
    # F6 D) G8 B7 Z! h' w( D  L
  20.     MTextObj.Mirror pt1, pt2/ q" k3 s4 B2 n8 ?. M& M
  21.     ThisDrawing.SendCommand "mirrtext 0 "    '恢复文字不镜像,因为一般都不镜像* R4 O  |: h$ `& @2 Y( X$ {9 I9 j
  22. End Sub
复制代码

# r* z6 O8 o; l6 d) l% U& K/ n
修改系统变量,除了类似界面操作外,在代码中改可以用 Document 对象的 SetVariable 方法。获取系统变量值用 GetVariable(有兴趣自己摸索一下:)。

8 J; k; t9 J4 V$ I+ f1 L! t+ `
想要创建单行文本,可以使用AddText方法。
RetVal = object.AddText(实际显示文字的字符串,文字插入点三维坐标, 文字的高度)
需注意文字的高度必须是正数!mm为单位。
  1. Sub AddText方法()! h$ q4 w8 \0 w8 X& E
  2.     Dim textObj As AcadText5 M5 @. _* w3 J- U4 ^/ f, k
  3.     Dim textString As String
    ; [5 a: Z( V" H% k1 v4 H
  4.     Dim insertionPoint(0 To 2) As Double
    3 p* c: ~2 x' j4 O' ^+ o( H
  5.     Dim height As Double
    & ]! G) b! ]- r
  6.     ' 定义文字对象9 D/ s7 C0 t7 x8 h* K# T  }1 `
  7.     textString = "我的AutoCAD文字"
    - B. I7 i, p# e( R
  8.     insertionPoint(0) = 2: insertionPoint(1) = 2: insertionPoint(2) = 0
    ( J) H) E8 A! _, S5 Q( o$ j
  9.     height = 2.5    ‘2.5mm高3 @+ s+ M3 F6 [5 ]6 O1 C1 g
  10.     ' 在模型空间中创建文字对象, l& s$ r+ O9 h
  11.     Set textObj = ThisDrawing.ModelSpace.AddText(textString, insertionPoint, height)$ H( {! ^% |* k! y( Z  |
  12.     Update
    : Z! a$ w! Q" y2 a6 U1 P
  13.     '............................................................+ ]; M0 U0 n& r
  14.     Dim pt1(2) As Double, pt2(2) As Double
    4 U: p$ c, [$ q1 t4 Z
  15.     Dim str As String
    ) T: X* \& f1 [1 H: H" F
  16.     str = "mirrtext 1 "   '按照界面操作顺序输入
      d; U6 J2 C9 B  P3 r
  17.     ThisDrawing.SendCommand str   '向命令行发送命令并自动执行
    , b3 D. P$ Q: b# G
  18.     pt1(0) = 30: pt1(1) = -109 O0 G" c. J4 P3 D
  19.     pt2(0) = 30: pt2(1) = 30! v& M; k0 G+ [) s
  20.     textObj.Mirror pt1, pt2
    # S& M& b9 ]7 Q
  21.     ThisDrawing.SendCommand "mirrtext 0 "    '恢复文字不镜像,一般都不镜像。
    : _& N7 p# ^9 F, K
  22. End Sub
复制代码
2.7、添加文字.zip (6.16 KB, 下载次数: 11)
 楼主| 发表于 2019-3-27 20:53:52 | 显示全部楼层
8、对象操作方法之复制、旋转、移动+ N1 A  t+ y5 p, L9 f

. J; o/ S$ y+ [) k' f2 QAObject.Copy方法
同一位置复制指定对象!
  1. Sub 复制()
    4 k7 P1 M$ ]  F) P/ [
  2.     Dim cir As AcadCircle, cirs As AcadCircle( X8 K- l6 `. D1 w6 V
  3.     Dim pt(2) As Double, r As Double
    ) @6 I  W0 j6 |6 [1 P9 i5 x6 }3 f" ^. `
  4.     pt(0) = 5: pt(1) = 10: r = 15
    ( l" c8 P$ v" w/ t  t" K, L& M
  5.     Set cir = ThisDrawing.ModelSpace.AddCircle(pt, r)
    7 E" g9 K6 I; O
  6.     Set cirs = cir.Copy   '复制绘制的圆,但是复制的圆还在原地
    + Y. q9 n4 E7 g5 C" e9 J
  7.     cirs.color = acBlue   '设置复制的圆的颜色
    / L% \) h  z: o3 b- f" Y
  8. End Sub
复制代码

) e0 A, _! ^+ m- N( r$ L- i9 \3 e
BObject.Rotate方法
语法:Object.Rotate BasePoint, RotationAngle
Object使用该方法的所有图形对象
BasePoint指定旋转中心点坐标(Double类型,3元素数组)
RotationAngleDouble类型,以弧度表示的用于旋转对象的角度。正值逆时针旋转、负值顺时针旋转。注意该方法仅是旋转对象,不能复制旋转!想要旋转时复制对象,可以先复制对象,然后在旋转。
需注意:旋转、移动等方法操作的就是原对象,不会产生新的对象,所以旋转、移动等操作的结果不能赋给新的对象变量! Set l01 =l1.Rotate(旋转中心,旋转角)会提示错误!!!
  1. Sub 旋转对象()
    ; A& X* T  q  O" x$ ?
  2.     Dim plineObj As AcadLWPolyline
      ^, D3 F6 `/ L$ F
  3.     Dim points(0 To 11) As Double/ G/ M4 S0 B- L7 D
  4.     points(0) = 1: points(1) = 2
    # h  |: K9 Z8 q, B
  5.     points(2) = 1: points(3) = 3/ B, Z* \# x' c( h+ H2 F+ V: N4 B
  6.     points(4) = 2: points(5) = 3, m" l, g) Z: V8 Y9 B0 j
  7.     points(6) = 3: points(7) = 33 a% j' f* A7 F" H+ }& w
  8.     points(8) = 4: points(9) = 4$ F: J' f8 O2 y6 Z6 p* V# M4 @
  9.     points(10) = 4: points(11) = 2
    2 ^( g% ]2 F9 ?& M3 O" S2 }
  10.     Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)5 L' t' S$ j3 N( j
  11.     plineObj.Closed = True  'true表示多段线或样条曲线为闭合的,False(默认)表示多段线或样条曲线为开放的.% G% O. W* |, p9 b" c  s8 y8 C
  12. zoomAll    '全部显示- E" h0 j. U  h+ c
  13.     Dim basePoint(0 To 2) As Double     '定义旋转中心
    / s/ D% s$ ~* U
  14.     Dim rotationAngle As Double         '定义旋转角
    4 ~0 i: I- N* ^. @" P# j8 N
  15.     basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0
    & Q# N$ s. g. w
  16.     rotationAngle = 0.7853981   ' 45°,转化为弧度,正值逆时针旋转/ r2 P( r( _5 J0 C3 t$ w
  17.     plineObj.Rotate basePoint, rotationAngle: `9 G0 b% W( M' G+ p: a
  18.     Update
    9 o% W' w# W! K: u
  19.     rotationAngle = -0.7853981   ' -45°,转化为弧度负值顺时针旋转5 y1 P( `5 N$ }3 O! {; |9 ^
  20.     plineObj.Rotate basePoint, rotationAngle
    ( C8 |- ?0 C' P" N9 i) U2 Q4 k" B
  21.     Update1 y' B* @. |  r! L) F% B
  22.     ZoomAll
    3 |3 k0 I0 [6 ?. K
  23. End Sub
复制代码
以上代码仅旋转对象,想要实现旋转复制,需要先复制对象,然后旋转。
  1. Sub 旋转复制()
    9 e; q2 e! E$ s) ], l" {3 B8 L$ c
  2.     Dim plineObj As AcadLWPolyline
    + P& j% F. P5 r' h9 A
  3.     Dim copypl As AcadLWPolyline; e; Y1 r2 a; K$ V0 D+ D3 C
  4.     Dim points(0 To 11) As Double* W# q8 L4 L+ q' p4 ^
  5.     points(0) = 1: points(1) = 2
    3 m: L! |6 i/ M! s& U/ M, X
  6.     points(2) = 1: points(3) = 3/ n- [5 [/ A; p! ^+ ?3 Q
  7.     points(4) = 2: points(5) = 3- @- P5 u/ }( X1 ]  f$ n/ q
  8.     points(6) = 3: points(7) = 3) u$ U. q; K% \1 ?
  9.     points(8) = 4: points(9) = 4
    + e# }$ D' e- M% o7 P: c" `9 j0 J
  10.     points(10) = 4: points(11) = 2
    5 J) U$ ^+ [! C7 s4 W# ~
  11.     Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)9 i' y. O8 k: |* {: {& V% g
  12.     plineObj.Closed = True  'true表示多段线或样条曲线为闭合的,False(默认)表示多段线或样条曲线为开放的.
    : E9 T7 [6 p3 s6 L: _' p
  13.     ZoomAll    '全部显示
    % E! _/ L# m. Y+ m1 z; D
  14.     Dim basePoint(0 To 2) As Double     '定义旋转中心. q+ ?. V; V* Q( L
  15.     Dim rotationAngle As Double         '定义旋转角
    - O$ K, t0 k1 n5 Q( ?/ H  \/ ~
  16.     basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0) i& {, g2 v: N- }8 v+ [/ T/ [3 o- Z
  17.     rotationAngle = 0.7853981   ' 45°,转化为弧度,正值逆时针旋转+ U& b$ f" w2 R# s6 U
  18.     Set copypl = plineObj.Copy  '复制多段线, o0 O. _8 j6 l3 t
  19.     copypl.Rotate basePoint, rotationAngle  '逆时针旋转复制的多段线) H6 w, P' C; ~; u. a3 L
  20.     copypl.color = acBlue
    2 X3 I5 {' q( |! [$ A
  21.     Update
    6 M" ~3 b2 W: x0 h
  22.     rotationAngle = -0.7853981   ' -45°,转化为弧度负值顺时针旋转( z9 e* p. x3 {  D1 E4 m$ S0 O
  23.     Set copypl = plineObj.Copy   '再次复制原多段线# t1 _# \1 x5 C6 k
  24.     copypl.Rotate basePoint, rotationAngle    '顺时针旋转复制的对象( g; m5 |, T3 |
  25.     copypl.color = acGreen! U, x6 s) X) g9 O: ]. g6 Y
  26.     Update7 R- @8 H, ~8 l' N! Z
  27.     ZoomAll3 O& h  N7 n$ i1 a, W4 Q2 y+ H1 E
  28. End Sub
复制代码
以上代码是先复制对象,然后旋转复制的对象,实现了旋转复制。

+ X- N0 s$ F$ [% y5 \3 zCObject.Move方法
语法:Object.Move Point1, Point2 将对象按照点1到点2的向量方向移动向量的模长距离。
  1. Sub 移动()9 w: \- }; N. n* \4 b5 ?
  2.     Dim circleObj As AcadCircle
    7 P* j6 a; o/ X5 i  h
  3.     Dim cirs As AcadCircle% w. X  T- F% p2 x2 i$ `2 ~
  4.     Dim center(0 To 2) As Double2 f/ ]9 T4 S8 i5 T
  5.     Dim radius As Double
    ! [% |# N9 C4 ^) C% Y
  6.     center(0) = 2#: center(1) = 2#: center(2) = 0#" N7 L! U1 g% E# \1 {
  7.     radius = 0.5) ^1 X' W! B( F. Y3 G) {: D
  8.     Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius)
    5 l( w7 J- P+ _( W& J3 u( w  L
  9.     Update( C8 ?; g" C- Y+ u1 y
  10.     Dim point1(0 To 2) As Double& r3 W( I/ A& ~- f
  11.     Dim point2(0 To 2) As Double
    $ I! w+ D+ F$ A" }
  12.     point1(0) = 0: point1(1) = 1: point1(2) = 0
    8 q. ?4 B, m' T+ Z
  13.     point2(0) = 2: point2(1) = 6: point2(2) = 0
    5 L; V% F6 Y7 C! R5 a+ S' U
  14.     Set cirs = circleObj.Copy& f. q6 D/ L* C7 ^2 i. _& }- i8 R+ r) J
  15.     cirs.Move point1, point2    '移动复制的对象3 ?9 g/ [( b  `; ~! B2 U9 v+ q
  16.     cirs.color = acCyan
    0 S( |( Y8 L& r4 W7 `
  17.     ZoomAll! Y5 N* j' e/ L1 @
  18. End Sub
复制代码
2.8复制、旋转、移动.zip (7.33 KB, 下载次数: 9)
 楼主| 发表于 2019-3-27 21:09:10 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-27 21:40 编辑 . l9 R0 M+ Z* P5 |

, t! H. y. \+ z5 a6 ]0 u( {9、常用对象的常用方法、属性、事件       6 }" M& A7 r/ V3 U7 h  I

& L) J: _$ f: c       至此,绘制一般的图形,应该没啥问题了!但其实AutoCAD除了给予图形对象的创建方法外,还给予了对象自身很多的操作方法及属性值,通过获取或者修改对象的属性值,可以更加简便的获取我们想要的图形数据。所以本节我们总结一下常用图形对象的常用方法及常见属性值。在AutoCAD中大部分对象的操作方法及属性都相同,所以一通百通!下面以多段线为例,概括一下常用的对象方法及属性、事件。' r+ t, S! |5 h, {! w& A
A、常用对象的方法列表
) w; v: L: l+ r# k: p' Z' H
  方法
对应作用
AddVertex  
向优化多段线中添加顶点。
ArrayPolar  
以给定的对象数量、填充角度和中心点创建对象的环形阵列。
ArrayRectangular  
创建对象的二维或三维矩形阵列。
Copy
同一位置复制给定对象。
Delete  
删除指定对象或一组保存了的图层设置。
Explode  
将复合对象分解为子图元。
GetBoundingBox  
返回图元对象边框的最大和最小点。
GetBulge  
获取多段线上给定索引位置的凸度值。
GetExtensionDictionary  
获取与对象关联的扩展词典。
GetWidth  
返回多段线的起始和终止宽度。
GetXData  
获取与对象关联的扩展数据(XData) 。
Highlight  
设置给定对象或给定选择集中所有对象的亮显状态。
IntersectWith  
获取对象与图形中其它对象的相交点。
Mirror  
围绕轴创建平面对象的镜像图像副本。
Mirror3D  
绕由三点定义的平面镜像选定的对象。
Move
将图元对象从源向目标移动。
Offset  
创建由现有对象偏移指定距离的新对象
Rotate  
绕一点旋转图元对象。
Rotate3D  
绕三维直线旋转图元对象。
ScaleEntity  
按指定的基点和比例因子来缩放图元对象。
SetBulge  
设置多段线在给定索引位置的凸度。
SetWidth  
设置多段线上给定段索引的起始和终止宽度。
SetXData  
设置与对象关联的扩展数据 (外部数据) 。
TransformBy  
给定4×4转换矩阵移动、缩放或旋转对象。
Update
更新图形屏幕的对象。

( @6 A+ E, G' g: i
: e  s; x( u# A* fB、常用对象的事件列表5 D9 Z9 f& v5 m4 `6 N% f6 B
  事件
对应作用
Modified
图形中的对象和集合被修改时触发。

$ x7 T" H  K6 |8 F& I4 }! x( F( y5 I9 O: s0 y
C、常用对象的属性列表; e, v% y$ s9 D5 G
  属性
对应作用
Application  
获取  Application 对象。只读属性
Area
指定构成弧、圆、椭圆、填充图案、优化多段线、多段线、面域或平面闭合样条曲线的封闭区域的面积。对于圆可修改,其他图形是只读属性
Closed  
决定三维多段线、优化多段线、多段线或样条曲线是否闭合。
ConstantWidth  
指定多段线的固定宽度。
Coordinate  
指定对象中单个顶点的坐标。
Coordinates  
指定对象中每个顶点的坐标。
Document  
获取对象所属的文档(图形)。只读属性
Elevation  
指定图案填充或多段线的当前标高
Handle  
获取对象的句柄。只读属性
HasExtensionDictionary  
确定对象是否有扩展词典与其关联。只读属性
Hyperlinks  
获取图元的 Hyperlinks 集合。只读属性
Layer  
指定图元的图层。
Length  
获取对象的长度。只读属性
Linetype  
指定图元的线型。
LinetypeGeneration  
指定二维多段线或优化多段线的线型生成方式。
LinetypeScale  
指定图元的线型比例因子。
Lineweight  
指定个别图元的线宽或图形的默认线宽。
Normal  
指定图元的三维法向单位矢量。
ObjectID  
获取对象的对象ID。只读属性
OwnerID  
获取所有者(上层)对象的对象ID。只读属性
PlotStyleName  
指定一个对象、一组对象或图层的打印样式名称。
Thickness  
指定二维 AutoCAD 对象按其平面向上或向下拉伸的距离。
TrueColor  
指定对象的真彩色。
Visible
指定对象或应用程序的可见性.
Angle
指定直线的角度。————————Line属性。只读属性
Delta
指定直线的增量。————————Line属性。只读属性
EndPoint
指定弧、直线或椭圆的终点。————————Line属性。对于Arc和Ellipse对象该属性为只读。Line可读写
StartPoint
指定弧、直线或椭圆的起点。————————Line属性。对于Arc和Ellipse对象该属性为只读。Line可读写
Center
指定圆弧、圆、椭圆、视图或视口的中心。————————Circle属性
Radius
指定圆弧或圆的半径。————————Circle属性
Circumference
指定圆的周长。————————Circle属性
Diameter
指定圆的直径。————————Circle属性
ArcLenth
指定圆弧的弧长。————————Arc属性。只读属性
EndAngle
指定弧或椭圆的终止角度。————————Arc属性
StartAngle
指定圆弧或椭圆的起点角度。————————Arc属性
TotalAngle
获取圆弧的总角度。————————Arc属性。只读属性

/ F- |6 e4 Z, H! u7 o: ?
      表中标明只读属性的表示只能获取对象的对应属性值,不可以修改对象的对应属性值。其他非只读属性可以修改对应属性值,相当于对图形进行编辑。了解一下大部分对象共同具有的属性及方法后,后续学习到新的对象,对比学习一下新的属性值和操作方法即可(如属性表后续增加内容)。

7 E5 r# M3 T1 G" m$ p$ z5 M: B0 i6 b4 c4 x! A  O8 W& s8 |6 ^
 楼主| 发表于 2019-3-27 21:21:40 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-27 21:41 编辑
6 C$ F7 m2 {7 a; \7 \4 T8 L4 E
) X4 j7 {" Z8 t- Y2 Q; UD、常用方法示例
注意:
1关于偏移的注意:OFFSET的结果是一个对象数组,赋值时不用set,获取结果中的对象时需用索引号(一般用0获取第一个)
2关于删除的注意:当用户删除集合中的对象时,集合中所有剩余项目会依据目前的计数重新指定新的索引。因此当处理整个集合时,应避免执行删除对象的循环。
3关于旋转的注意: Rotate只是旋转某个对象,旋转的结果不能赋给某个对象变量。
所以Set l01= l1.Rotate(midl1pt, 3.1415926 / 2)        会提示错误!
l1.Rotate midl1pt, 3.1415926 / 2              没问题!
类似的还有Move方法,凡是对原对象操作不会产生新的对象的方法,结果都不能重新赋给新的变量!
  1. Sub 对象常用方法()4 w/ c, P/ V/ T( F8 w! W) d0 }
  2.     Dim L As AcadLine- g1 F/ }6 W3 ^$ n
  3.     Dim p1(2) As Double, p2(2) As Double
    # v8 w. i# F: u" o& C9 k+ F
  4.     Dim cir As AcadCircle
    * A0 N& c5 P3 A. P: K
  5.     Dim p0(2) As Double, R As Double
    + u. A1 Z! M! r/ D
  6.     Dim pl As AcadLWPolyline
    ! N& k6 l# [( b* ?6 {
  7.     Dim ps(7) As Double# n: R- X7 |- I% u( a. P" s% y4 _/ ^
  8.     p1(0) = 10: p1(1) = 10
    / {1 C3 }8 _  m7 q" X% a0 J) q
  9.     p2(0) = 100: p2(1) = 100
    5 N& T& I( P# z1 N! ^
  10.     Set L = ThisDrawing.ModelSpace.AddLine(p1, p2)6 Z6 T+ ~1 ^7 Z7 Z8 }
  11.     L.Update5 s+ P3 w) \. Y: a" u
  12.     p0(0) = 20: p0(1) = 30: R = 50
    4 ]5 m7 g; l$ ~, m9 y4 }2 m! r2 U# r
  13.     Set cir = ThisDrawing.ModelSpace.AddCircle(p0, R)# m+ u( n4 D7 K
  14.     cir.Update6 F1 p0 E2 {! G0 a5 Z+ P' i
  15.     ps(0) = -40: ps(1) = 40
    , j' F3 E4 {3 D
  16.     ps(2) = 8: ps(3) = 10! \/ {! Z( K3 G6 w! q4 I; a
  17.     ps(4) = 40: ps(5) = 20
    7 j9 }2 Q. z& V6 c4 o
  18.     ps(6) = 60: ps(7) = 98% T" }0 m8 D5 ~# S
  19.     Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(ps)
    0 S, G9 V% H$ v  _. B
  20.     pl.Update& R! U$ Y/ |4 A$ i+ |+ Z
  21.     Rem 接下来演示复制、移动、旋转、镜像、偏移、删除
    ( q. {8 Y  m, v( I/ Z) _1 F
  22.     Dim p3(2) As Double, p4(2) As Double, ang As Double
    , @3 A6 U% Q5 V* R
  23.     Dim copycir As AcadCircle, copy As AcadLine, copypl As AcadLWPolyline, mirpl As AcadLWPolyline, offsetpl As Variant
    8 r8 K* P/ T" E
  24.     Dim obj As Object) |  G3 D2 W2 ~$ a, A
  25.     p3(0) = 100: p3(1) = -20
    2 e1 \, X% j$ S9 |! P# W4 d
  26.     p4(0) = 160: p4(1) = 90; x: D, d9 @( p9 G* D" a
  27.     ang = 60 * 3.14 / 180    '指定旋转角度(弧度值); g% |' Z% W& C% T4 Y3 t9 B
  28.     Set copycir = cir.copy   '先在原位置复制圆) f6 W3 v3 [0 {) b$ P
  29.     copycir.Move p3, p4      '移动复制的圆/ u" A5 W; [- }
  30.     Update
    - }+ s5 `; q! L: v& V2 m
  31.     Set copypl = pl.copy     '先在原位置复制多段线
    5 n: w. E. j! ^4 T9 ?& [
  32.     copypl.Rotate p3, ang    '在旋转复制的多段线
    6 ]# i. T: [. q2 u5 Y/ w/ W: n3 y- m6 L
  33.     Update
    - C  t! I0 G8 x( _& ~0 }$ g2 Q) ~  g
  34.     Set mirpl = copypl.Mirror(p3, p4)    '镜像复制的多段线并赋给mirpl, C) E; X" ~3 v7 Z$ z4 ^
  35.     Update
    ; Y% R, R* x4 l3 p
  36.     mirpl.Offset (50)   '顺时针多段线,正值向内偏移,负值向外偏移。
    - d. }- q4 L) p& [% b* v8 o
  37.     Update
    8 z3 q$ D5 N  V  [) B
  38.     offsetpl = mirpl.Offset(-50)   '偏移的结果是对象数组,所以offsetpl定义为变体型,赋值时不需要set(对象赋值时必须使用)+ n% ]0 z; G  x& ~
  39.     Update
    ' F/ ^* k* F+ l" E: r
  40.     offsetpl(0).color = acGreen  '设置偏移后的对象颜色属性值为绿色,虽然只有一个对象,但属于从数组中获取,所以以索引号0获取第一个。
    8 G0 i% @. @: B0 }
  41.     Update  Z1 G$ l6 [  Q. V# x
  42.     Rem 接下来删除所有对象
    ; Y- d" e7 b; B; T% E  o$ Q
  43.     offsetpl(0).Delete                       '可以删除指定名称的对象* f- S% _# J7 F. a0 Q  W5 {- ?
  44.     Update8 H% _* S5 P8 i
  45.     For Each obj In ThisDrawing.ModelSpace   '在当前画布模型空间中
    9 b# d/ k; q5 D8 R5 }
  46.         obj.Delete                           '删除对象,似乎是按照绘图顺序依次删除对象的!- d2 L0 a% E8 P
  47.         Update1 y* q- d, V: h8 d* r6 i* [
  48.     Next
    3 t! O) q  y' `: [1 n+ c, E
  49. End Sub
复制代码

( g6 B7 D" D" O$ A3 m, w( [8 D3 E& R0 i- T. f/ J

& e1 y5 s! J$ D! ]# J* ^3 ?. ~- s+ B( X* s  r
 楼主| 发表于 2019-3-27 21:58:11 | 显示全部楼层
获取交点语法: RetVal = object.IntersectWith(IntersectObject, ExtendOption)  获取交点坐标
Object:使用该方法的对象或对象集合。
IntersectObjectObject[对象], 为输入项; 对象可以是所有图形对象中的任一个。
ExtendOptionAcExtendOption常数; 为输入项,该选项指定两个对象中是否没有、单个或两个对象延伸来得到交点。有如下4个参数:
acExtendNone       两个对象均不延伸              acExtendThisEntity    延伸基本对象。
acExtendOtherEntity  延伸作为参数传递的对象。      acExtendBoth        延伸两个对象。
RetVal获取的结果是交点的坐标组成的数组。注意不是点的数组,而是坐标数组,所以有多个交点时,后续需要分别取值赋给点变量才能形成多个点对象
如果两个对象不相交,则没有返回数据。用户可以要求一个或两个对象延伸相交来产生相交点。
  1. Sub 获取交点()
    0 |; l% h% G6 X, r8 j2 \
  2.     Dim L01 As AcadLine, L02 As AcadLine, L03 As AcadLine
    ( V, N! O. P7 O; o. b
  3.     Dim p1(2) As Double, p2(2) As Double$ W! u1 x8 G  s- i
  4.     Dim p3(2) As Double, p4(2) As Double3 `% a4 O* g* M+ @
  5.     Dim p5(2) As Double, p6(2) As Double
    - s. b0 F* ?* _9 s# u
  6.     Dim cir As AcadCircle! q5 D! v- y, y4 s
  7.     Dim p0(2) As Double, R As Double/ w/ W" P, C* m8 _0 {2 T8 u
  8.     Dim pl As AcadLWPolyline/ e  S$ r* d  e
  9.     Dim ps(7) As Double3 k# E: i4 i) w1 K+ o4 m
  10.     p1(0) = 10: p1(1) = 10! @8 K. |: |! F" L; `- w: T9 K
  11.     p2(0) = 100: p2(1) = 100
    ; J# H9 p0 r2 S1 P* v
  12.     p3(0) = 80: p3(1) = 30- q; e# V1 Z" e( _; Q7 i3 x
  13.     p4(0) = 130: p4(1) = 30
    7 d) h8 U! m# P9 g2 I$ e, R, l
  14.     p5(0) = 150: p5(1) = 403 _/ b/ W. b& z+ g) `
  15.     p6(0) = 160: p6(1) = 70
    ' Z6 [- k' d  B( ~. b
  16.     Set L01 = ThisDrawing.ModelSpace.AddLine(p1, p2)
    & B7 i& V. q5 t* ~; `; G  s( [
  17.     L01.Update9 R- V7 a( d1 z3 L% f
  18.     Set L02 = ThisDrawing.ModelSpace.AddLine(p3, p4)
    0 V# }  G- F4 R' X3 Z5 K
  19.     L02.Update
    ! Q, v$ A0 y. b( n. e# o# k" B" h
  20.     Set L03 = ThisDrawing.ModelSpace.AddLine(p5, p6)
    . I* S% E5 n" e( {9 ^; n
  21.     L03.Update* V! S$ G7 X, l! J& W, o
  22.     p0(0) = 20: p0(1) = 30: R = 50
      U7 h/ B# l, o" s. M3 r
  23.     Set cir = ThisDrawing.ModelSpace.AddCircle(p0, R)
    " {5 c0 E" W/ b' c0 L
  24.     cir.Update
    0 J. z0 Z2 x, I/ s7 z
  25.     ps(0) = -40: ps(1) = 40
    & j8 ]/ w5 r9 E9 i, t. f
  26.     ps(2) = 8: ps(3) = 10- K* x4 q* ~- l6 ?" v
  27.     ps(4) = 40: ps(5) = 20
    1 G6 n. e0 O  K' r
  28.     ps(6) = 60: ps(7) = 98/ `; i' Z& z3 E: G% @" b
  29.     Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(ps)2 I8 f& B' U: |
  30.     pl.Update8 @+ _* ~" q2 o8 i
  31.     Rem 接下来获取交点坐标7 I" j/ t; R$ C1 ^6 ^
  32.     Dim ppt01 As Variant, ppt02, ppt03, ppt04           '默认是变体型
    ' a1 C4 f) n1 G* ^
  33.     ppt01 = L01.IntersectWith(cir, acExtendBoth)        '两个都延伸,获得延伸后的交点坐标
    ! W9 T6 J6 Q/ }' E8 U7 q/ W$ t5 d8 i
  34.     ppt02 = L01.IntersectWith(cir, acExtendNone)        '两个都不延伸,获得唯一1个交点坐标
    , J( X6 r% U8 ~: q8 H# b/ T' }
  35.     ppt03 = L01.IntersectWith(cir, acExtendOtherEntity) '延伸作为参数传递的对象,延伸圆,所以结果还是1个交点坐标
    : `; w2 q0 q3 u1 U# T# |' f6 N
  36.     ppt04 = L01.IntersectWith(cir, acExtendThisEntity)  '延伸基本对象,延伸基本对象L01,所以结果是2个交点坐标# \: O: d% E$ @4 Z1 x) H2 p
  37.     Rem 以上是L01与圆的交点情况; F' f  q; y& h
  38.     ppt01 = L01.IntersectWith(L02, acExtendBoth)        '两个都延伸,可以获得一个交点坐标
    ) m+ `" G' p. z) t9 F3 U9 C; U1 K
  39.     ppt02 = L01.IntersectWith(L02, acExtendNone)        '两个都不延伸,不相交,所以无交点坐标+ e0 D" |! W  F' t
  40.     ppt03 = L01.IntersectWith(L02, acExtendOtherEntity) '延伸作为参数传递的对象,延伸L02,所以获得一个交点坐标
    + j. O  c" p: \  H
  41.     ppt04 = L01.IntersectWith(L02, acExtendThisEntity)  '延伸基本对象,延伸L01,仍然无交点坐标
    7 p* y8 D3 ~$ H/ ]4 h
  42.     Rem 以上是L01与L02直线的交点情况
    ' M7 y2 t+ D5 q
  43.     ppt01 = L02.IntersectWith(L03, acExtendBoth)        '两个都延伸% @% l8 g6 |6 T3 A; b; g
  44.     ppt02 = L02.IntersectWith(L03, acExtendNone)        '两个都不延伸
    + h+ E! f( m7 U' g6 V- I6 D8 U4 M5 q9 ^
  45.     ppt03 = L02.IntersectWith(L03, acExtendOtherEntity) '延伸作为参数传递的对象$ P# |. f: J' {3 p* V7 ~8 \+ n
  46.     ppt04 = L02.IntersectWith(L03, acExtendThisEntity)  '延伸基本对象
    - A# x5 \  c- w" t5 a/ G5 E
  47.     Rem 以上是L02与L03交点情况
    " A+ H6 c7 t. w# t
  48.     ppt01 = L03.IntersectWith(cir, acExtendBoth)        '两个都延伸" r1 \0 S# I& z) A* N* k% Y
  49.     ppt02 = L03.IntersectWith(cir, acExtendNone)        '两个都不延伸' g* k: c" s# H3 z
  50.     ppt03 = L03.IntersectWith(cir, acExtendOtherEntity) '延伸作为参数传递的对象9 m4 x2 }. Z+ t# h
  51.     ppt04 = L03.IntersectWith(cir, acExtendThisEntity)  '延伸基本对象) |8 A4 |. V8 z  B+ M
  52.     Rem 以上是L03与圆交点情况
    " O" N' C+ `6 ?" f1 R
  53.     ppt01 = L02.IntersectWith(pl, acExtendBoth)        '两个都延伸+ o( _# `; q' A( a( o+ [' q9 n/ w
  54.     ppt02 = L02.IntersectWith(pl, acExtendNone)        '两个都不延伸4 W* Z6 q1 N- H4 h, E( M
  55.     ppt03 = L02.IntersectWith(pl, acExtendOtherEntity) '延伸作为参数传递的对象( K4 K( E+ T. `1 V2 V; F; c! U' s
  56.     ppt04 = L02.IntersectWith(pl, acExtendThisEntity)  '延伸基本对象' b- Z8 L$ Q0 I# z
  57.     Rem 以上是L02与多段线交点情况
    * c7 k4 T) f2 z4 D5 \- b
  58.     ppt01 = L01.IntersectWith(pl, acExtendBoth)        '两个都延伸: y: ^6 A) v8 h/ o; e
  59.     ppt02 = L01.IntersectWith(pl, acExtendNone)        '两个都不延伸
    7 D8 C+ M3 p, v3 p" d+ T2 ]
  60.     ppt03 = L01.IntersectWith(pl, acExtendOtherEntity) '延伸作为参数传递的对象
    ) M  V( ]/ d& V; Z
  61.     ppt04 = L01.IntersectWith(pl, acExtendThisEntity)  '延伸基本对象
    ; w1 m) F" G; [& f+ ?# s
  62.     Rem 以上是L01与多段线交点情况
    $ b, @$ _' j$ D7 f5 g
  63.     Rem 通过以上几种示例结合本体窗口中ppt01、ppt02、ppt03、ppt04的结果理解四个参数的区别
    / |8 e+ L1 B+ j1 N
  64. End Sub
复制代码
程序包见下楼!

( j4 C. n  @, q+ V7 E- n& }
 楼主| 发表于 2019-3-27 22:03:09 | 显示全部楼层
E、常用属性示例
注意:1直线角度Angle是按照直线起点为坐标原点,起点所在水平线为基准线逆时针旋转至直线处的角度。所以画直线时起点和终点互换位置后对应的直线角度不同!
  1. Sub 常用对象属性()! b/ T* s! }% u& u# V
  2.     Dim L01 As AcadLine
    0 @- ?* U: D' P" s
  3.     Dim p1(2) As Double, p2(2) As Double
    % c9 D( {. l9 s4 \
  4.     Dim cir As AcadCircle4 N2 V' m) T  `6 E+ S2 J" ]
  5.     Dim p01(2) As Double, R1 As Double. P/ B- M( b" W) i( Z
  6.     Dim pl As AcadLWPolyline
    6 t0 l2 Z" Z6 L, K
  7.     Dim ps(7) As Double
    6 v8 i( A8 }* e$ X% b  w  g) [
  8.     Dim arc As AcadArc4 P( Z- T% [% }/ Z# Y
  9.     Dim p02(2) As Double, R2 As Double, fstangle As Double, endangle As Double% @& L: Y9 f& E$ l; U
  10.     p1(0) = 10: p1(1) = 10" ?- }  q1 T% Z- H
  11.     p2(0) = 100: p2(1) = 1004 S7 ~5 L8 {6 K1 z/ `
  12.     Set L01 = ThisDrawing.ModelSpace.AddLine(p1, p2)5 ?7 r& |& W# [( N& j, k
  13.     L01.Update
    5 j% X+ M- j5 F8 c/ }2 J3 t
  14.     p01(0) = 20: p01(1) = 30: R1 = 50: g. x, G* Y+ v. o9 I
  15.     Set cir = ThisDrawing.ModelSpace.AddCircle(p01, R1)7 b1 G& i) z8 R/ J& f; d) Q% m2 q
  16.     cir.Update
    9 \! J. X! \. l% W2 q7 x9 N$ w4 s
  17.     ps(0) = -40: ps(1) = 408 k, A, y# X: j$ r* R, l9 Y, [- o: k
  18.     ps(2) = 8: ps(3) = 10
    * x8 M5 G/ M5 ?# S& g2 v( i
  19.     ps(4) = 40: ps(5) = 20
    : A' [6 \/ V2 e2 r1 _4 m
  20.     ps(6) = 60: ps(7) = 98
    $ {2 `% h4 J6 c# A
  21.     Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(ps)# ^7 h' K9 |" u
  22.     pl.Update
    0 @) X" \' I) g* Q
  23.     p02(0) = 50: p02(1) = 60: R2 = 80: fstangle = 60 * 3.14 / 180: endangle = -60 * 3.14 / 180
    7 O8 }" \) O9 A/ i3 f
  24.     Set arc = ThisDrawing.ModelSpace.AddArc(p02, R2, fstangle, endangle)8 E  b. B( s  V& F9 W0 B3 O, z
  25.     arc.Update# n: k5 N3 c6 H% h8 v+ p. R) M
  26.     Rem 接下来设置/获取对象属性' s2 S5 g. k4 J7 O  a0 W
  27.     Rem 多段线属性
    & t9 ^3 @! y) ]$ v" z; x* }
  28.     Dim X As Variant- U: x" d& n0 y! W2 O1 r$ |  O
  29.     X = pl.Area          '返回闭合图形的面积,结果是double,值为4040,即使非闭合,系统自动按照起点和终点连接闭合图形计算2 \9 E1 l/ Q8 Q& @" o$ @0 x# E
  30.     X = pl.Closed        '结果为false表示非闭合曲线,为true则表示闭合曲线: _5 ^6 G. a/ w7 ~: `
  31.     pl.Closed = True     '设置多段线为闭合曲线,系统会自动将多段线起点和终点连接闭合。
    : A; M/ V1 i* a1 r
  32.     Update: [- X. W; v9 A* n
  33.     X = pl.ConstantWidth        '固定宽度为0(默认值)3 i$ v1 S( @. f  H! I
  34.     pl.ConstantWidth = 0.35     '设置多段线固定宽度为0.35mm,设定后线宽属性设置无效!
    % N- J: c4 }' X0 w* t0 g9 m
  35.     Update
    " h% v6 O8 ^2 k! Q% p
  36.     Rem 该属性设置多段线所有段的起始和终止宽度为统一值。该属性只有在所有段设置为统一宽度时才返回固定宽度。! q4 Y) s/ k* B0 x4 e; |
  37.     Rem 可以使用 SetWidth 和 GetWidth 方法来指定各个段的宽度。
    - p% @+ A& P6 H" e( z
  38.     X = pl.Layer         '返回对象所在的图层名字0,string类型,亦可指定图层,参考“添加图层”。
    7 L4 k, e; N" e- H3 R( y: n
  39.     X = pl.Length        '获取对象的长度,属于只读属性,不可重新赋值!0 }* |& |+ W) }) i9 s
  40.     X = pl.Linetype      '获取对象的线型"ByLayer",此处是随层,亦可指定线型
    7 s- K: o9 n4 m4 [- K- \
  41.     X = pl.LinetypeScale '获取多段线线型比例,亦可指定线型比例
    8 S- [+ L. B7 ?" f* N, F, w. `
  42.     X = pl.Lineweight    '获取多段线的默认线宽"-1"
    . U2 s7 i1 K) ]  ^  s2 Q
  43.     pl.Lineweight = acLnWt100 '指定多段线的线宽为1.00mm,设定固定宽度后此属性值修改无效!% e# ]2 `2 i) X6 a; l" Q
  44.     Update
    , C$ X$ E' ]7 L7 z; @2 c7 i, S
  45. '     pl.TrueColor=xxx     '该属性值是设置属性,不能获取!
    * z/ q+ ?% I# s2 S) \
  46.     Rem 接下来了解直线属性
    + f) F3 F! s( R1 E1 Q
  47.     X = L01.Angle         '获取直线的角弧度(只读属性),该角度是由 X 轴开始并沿逆时针方向测量值。
    6 M$ k) k2 T' \8 S
  48.     X = L01.Delta         '获取直线的增量(只读属性),终点坐标相对于起点坐标增加的量!
    & k9 h1 e% P8 J+ _/ J* {
  49.     X = L01.EndPoint      '获取直线的终点坐标3 Y  c5 i  s' b1 p9 k1 p$ A2 c4 ]  o
  50.     X = L01.StartPoint    '获取直线的起点坐标1 ^/ Q1 x$ b; K+ p
  51.     Rem 接下来是圆的属性
    - y' s8 p) a0 p- B0 Z- Z
  52.     X = cir.Center        '获取圆的圆心坐标
      [- x" J+ n( k8 H
  53.     X = cir.Radius        '获取圆的半径& v  c6 \; Q# w+ }% }" r# l
  54.     X = cir.Circumference  '获取圆的周长" C1 b3 p2 ^/ E+ F8 b3 ]
  55.     X = cir.Diameter       '获取圆的直径( ^. `0 ?7 `# @0 t- g: z7 d* N
  56.     Rem 接下来是圆弧的属性
    5 s; u1 U: e' R- f+ v6 D
  57.     X = arc.ArcLength       '获取圆弧弧长(只读属性)4 W4 z) d) g1 u7 [5 f8 o
  58.     X = arc.endangle       '获取圆弧的终止角弧度# f5 h( N+ G4 U3 s) u+ Z
  59.     X = arc.StartAngle     '获取圆弧的起始角弧度
    3 c4 C) c5 }' E: d$ f0 ], s
  60.     X = arc.TotalAngle     '获取圆弧的总角弧度(只读属性)3 x$ a) R3 p" Z; n9 U
  61. End Sub
复制代码
2.9、常用对象的常用方法、属性、事件.zip (10.16 KB, 下载次数: 9)
 楼主| 发表于 2019-3-29 19:07:30 | 显示全部楼层
10、辅助绘图方法
在通过VBA绘图中发现很多手工绘图命令在VBA中并没有直接可用的命令,而需要转换.例如通过3点画圆方法,前面提到的是通过理论计算出圆心和半径,然后按照圆心、半径画圆即可。
也可以通过辅助绘图方式完成,然后将辅助线删除即可。
A、辅助三点画圆
辅助思路:3个点连接2条线段,绕各自中点旋转90°,交点就是圆心,交点与任意一点连线就是半径:画圆。
  1. Sub 辅助三点画圆()
    0 ]+ B/ m6 P- }& D. d( Q
  2.     Rem 通过3点画两条线,然后分别以中点为基点旋转90°,取得相交点坐标就是圆心,圆心和任意点连线长度就是半径。
    : d/ @  W5 ]2 E' |% e9 [
  3.     Dim pt1(2) As Double, pt2(2) As Double, pt3(2) As Double
    . Z0 \' |8 u3 W( Q, `+ {# g
  4.     pt1(0) = 100: pt1(1) = 60& X; ^" R# w: F- f3 u3 o7 f
  5.     pt2(0) = 70: pt2(1) = 95
      E" E* v* M! @+ M
  6.     pt3(0) = 150: pt3(1) = 76
    ( _, t) D4 x0 H) V6 E
  7.     Dim l1 As AcadLine, l2 As AcadLine    '画两条辅助直线并求中点坐标
    $ }' {5 k4 c/ q4 y% T' Y3 K8 b$ t
  8.     Dim midl1pt(2) As Double, midl2pt(2) As Double   '定义中点坐标变量
    " x  U% P9 n5 W5 t
  9.     With ThisDrawing.ModelSpace3 v' ]' s5 A( H" ?! e
  10.         Set l1 = .AddLine(pt1, pt2)
    0 S' Y0 g  V6 l8 Y2 R
  11.         Update* i" X  c2 ~( U7 E& n7 e
  12.         midl1pt(0) = (l1.StartPoint(0) + l1.EndPoint(0)) / 2
    $ Z5 E8 a9 @$ G9 Z$ Q1 K
  13.         midl1pt(1) = (l1.StartPoint(1) + l1.EndPoint(1)) / 2
    ! \+ Q* u" h1 M. I
  14.         Set l2 = .AddLine(pt2, pt3)/ \# I% G5 X5 V! F, ^
  15.         Update
    4 l# \) r  \  `
  16.         midl2pt(0) = (l2.StartPoint(0) + l2.EndPoint(0)) / 2, p8 l+ f2 w+ Z/ f) j
  17.         midl2pt(1) = (l2.StartPoint(1) + l2.EndPoint(1)) / 26 ^& L1 ^$ O  B- q
  18.     End With/ [+ G& ?/ E( r' c- o
  19.     Rem 复制并旋转90°
    , F, c1 T9 u$ `
  20.     l1.Copy
    * Z4 n! W8 Y% i" K; z  ^7 q& ^8 h
  21.     l2.Copy
    $ o* `" N  c7 l, |" l2 F
  22.     l1.Rotate midl1pt, 3.1415926 / 2    '旋转的结果还是l1" v! g% L) v% t% n7 R
  23.     Update2 e. J! c, [1 ^" z
  24.     l2.Rotate midl2pt, 3.1415926 / 2    '旋转的结果还是l2
    8 R1 i3 L/ w/ M  Z" R
  25.     Update
    ( V2 A. S0 e& N" Y
  26.     Dim p0, R As Double     '定义圆心和半径& I4 H1 h& E% N; L5 f9 I: m
  27.     p0 = l1.IntersectWith(l2, acExtendBoth) '获取交点坐标,两个都延伸,防止不相交
    6 v+ _! w7 g5 Z
  28.     R = Sqr((p0(0) - pt1(0)) ^ 2 + (p0(1) - pt1(1)) ^ 2); Q9 R$ _) \! n/ j- S
  29.     Dim cir As AcadCircle
    ! O# C- W0 W, a/ M  J
  30.     Set cir = ThisDrawing.ModelSpace.AddCircle(p0, R)
    $ }$ w! Q" R8 C  i) }$ ]
  31.     Update# W0 X$ X3 d: {
  32.     Dim obj As Object, x   '定义对象变量
    . @# M7 N, b5 {, K( N
  33.     For Each obj In ThisDrawing.ModelSpace# `4 h0 j8 z0 I+ ^4 }
  34. '    x = obj.Type     '没有这个属性,那怎么知道这个obj是什么类型呢?/ U5 t- Q- n' @$ h3 p
  35.         If TypeOf obj Is AcadLine Then  '如果对象的图元类型是直线则删除
    7 i0 `6 y7 c: q' Y( N
  36.             obj.Delete
    3 v% ^# m- j; m! j' [
  37.             Update+ X9 `7 ?- e1 A* g* ~6 r; t( x6 _0 f
  38.         End If
    2 Y# _1 o( A# W( _- |
  39.     Next; f" x4 V! M/ }1 R0 n
  40. End Sub
复制代码
4 q4 w/ L& b; r* @. D
新增的知识点:TypeOf
TypeOf是语句,只应用于 If ... Then ... 语句中
MSDN解释:TypeOf  <ObjectName>  Is  <ObjectType>形式的表达式。其中的ObjectName是任何对象的引用,而ObjectType则是任何有效的对象类型。如果ObjectNameObjectType所指定的一种对象类型,则表达式为True,否则为False
例如,将窗体中的所有文本框清空,用如下语句:
Dim c As Control
For Each c In Me.Controls
If TypeOf c Is TextBox Then c.Text =""
Next
. J! @  O+ n! O3 z, v
程序包见下楼。

1 I* ?3 k0 g: I6 U4 k
 楼主| 发表于 2019-3-29 19:13:58 | 显示全部楼层
B、辅助三点画弧
辅助思路:3个点连接2条线段,绕各自中点旋转90°,交点就是圆心,交点与任意一点连线长度就是半径,圆心与起点连线角度就是起始角,圆心与终点连线角度就是终止角。
  1. Sub 辅助三点画弧()
    0 n; i* D- ?3 B; Y' g* ~
  2.     Dim P1(2) As Double, P2(2) As Double, P3(2) As Double, l1 As AcadLine, l2 As AcadLine
    5 B, r  K' S5 @  u+ c/ b- n
  3.     P1(0) = 100: P1(1) = 603 b1 g( d7 `) s: f  r
  4.     P2(0) = 70: P2(1) = 95
    6 X) j# O+ g7 v1 W
  5.     P3(0) = 150: P3(1) = 76( {( A5 ]. P9 {1 k
  6.     Set l1 = ThisDrawing.ModelSpace.AddLine(P1, P2)
    - j. o- d# f6 i
  7.     Update, j& v! j  W, O$ m
  8.     Set l2 = ThisDrawing.ModelSpace.AddLine(P1, P3)
    . ?4 R% l% q; v7 e5 P: f; z
  9.     Update( C& O5 H" y" ~) b' x1 P4 V9 \
  10.     Dim p01(2) As Double, p02(2) As Double9 S1 Z7 M& X; ~
  11.     p01(0) = (P1(0) + P2(0)) / 2: p01(1) = (P1(1) + P2(1)) / 2
    4 T8 W9 K+ E6 q
  12.     p02(0) = (P1(0) + P3(0)) / 2: p02(1) = (P1(1) + P3(1)) / 23 l" v: R5 k3 r
  13.     l1.Rotate p01, 3.1415926 / 25 }3 f( ^+ x$ e! X% j5 d
  14.     Update
    6 c2 B# W7 m: `8 O+ f% A' l! U$ q
  15.     l2.Rotate p02, 3.1415926 / 2
    % L2 F$ j* v; t# e1 H7 y% c3 |
  16.     Update
    3 {# X8 n4 K( H" a
  17.     Dim p0 As Variant, R As Double, l01 As AcadLine, l02 As AcadLine, arc As AcadArc, X$ @5 K1 x) W# ~- X
  18.     Dim firstangle As Double, endangle As Double5 H# X7 n. ?* G
  19.     p0 = l1.IntersectWith(l2, acExtendBoth)( w; c! {8 K! w% }$ ]6 C% F9 V+ U( B
  20.     Set l01 = ThisDrawing.ModelSpace.AddLine(p0, P2)   '圆心与起点连线,就是半径
    5 g- K8 e' b7 ^* L- ?0 D$ q
  21.     Update
      v' |) A( D9 p
  22.     Set l02 = ThisDrawing.ModelSpace.AddLine(p0, P3)   '圆心与终点连线,也是半径9 j2 q5 L. B: x* d
  23.     Update% i4 }3 `5 \! T+ G8 N+ F
  24.     R = l01.Length               'l01的长度就是半径( K+ c5 f/ `- K& I$ x
  25.     firstangle = l01.Angle       'l01的角度就是起始角
    ! |7 G+ S  k2 ?) I% G, Z! X- P
  26.     endangle = l02.Angle         'l02的角度就是终止角
    + w3 n; a5 W3 P# e5 ?1 F3 d, d
  27.     Set arc = ThisDrawing.ModelSpace.AddArc(p0, R, firstangle, endangle)   '画弧
    # r0 Q; I0 o2 ?; W, ]" j, R' i3 G7 w
  28.     Update
    2 U) _! B) ]# s6 O& {
  29.     l1.Delete    '删除直线l1
    " \! f( ~) D5 h8 Z& q' q8 ~6 W
  30.     Update
    * }: [' p$ f8 c4 d$ Z
  31.     l2.Delete    '删除直线l2
    0 X7 z: R, B6 f& o3 u( W
  32.     Update
      |* I5 O1 R( a8 m8 ~' k3 @& j
  33.     Set l01 = ThisDrawing.ModelSpace.AddLine(P2, p0)   '圆心与起点连线,就是半径1 W9 }! r( x$ I8 w3 Z
  34.     Update
    - y  z4 c# g. l" m2 f' o5 \9 z0 g5 O
  35.     Set l02 = ThisDrawing.ModelSpace.AddLine(P3, p0)   '圆心与终点连线,也是半径
      k9 b8 m1 b4 X, Y, K7 E1 C
  36.     Update
    8 W  V3 u$ \9 J& J1 }
  37.     R = l01.Length               'l01的长度就是半径2 n, J3 q3 ?+ k
  38.     firstangle = l01.Angle       'l01的角度就是起始角
    # w7 v* s7 I9 b
  39.     endangle = l02.Angle         'l02的角度就是终止角
    - c6 @6 A. M. P+ [+ A
  40.     Set arc = ThisDrawing.ModelSpace.AddArc(p0, R, firstangle, endangle)   '画弧
    & V$ d. r  ?+ N1 H7 y5 p' e' E
  41.     Update2 W5 v5 v: |6 C
  42.     Rem 通过以上两例发现,直线角度是按照直线起点为坐标原点,起点所在水平线为基准线逆时针旋转至直线处的角度。
    + ^% w8 D% V% @) \5 ~1 @7 X
  43. End Sub
复制代码
  1. Sub 验证直线角度()
    6 f- l' [2 _* r7 G/ K# S
  2.     Dim P1(2) As Double, P2(2) As Double, l1 As AcadLine, l2 As AcadLine
    ) r- v8 B- P6 m8 T1 A: ?8 g
  3.     P1(0) = 100: P1(1) = 60/ d) B" b( w! H( c& b. Z1 c* B
  4.     P2(0) = 70: P2(1) = 95
    5 S. M3 y( h& Q5 L* ^
  5.     Set l1 = ThisDrawing.ModelSpace.AddLine(P1, P2)$ X# _9 }1 l+ `* M
  6.     Set l2 = ThisDrawing.ModelSpace.AddLine(P2, P1)
    ! }( k4 a0 P- m+ H3 u4 |
  7.     Dim m, n  c" k: p+ n# B7 C. a
  8.     m = l1.Angle * 180 / 3.1415926; o9 _( b, V& z6 m$ k
  9.     n = l2.Angle * 180 / 3.1415926
    , l* g5 x3 ~# g9 ]; S0 I: A. h
  10.     Rem 直线的角度是以起点为坐标原点,起点所在水平线为X正半轴逆时针旋转至直线处的旋转角度。# d$ _. S: c1 ^" J, R, K8 x% S
  11. End Sub
    : H$ T0 n- r/ ^
复制代码
$ F& B5 A2 U; t
2 _9 [; X5 D/ y$ h  a) q
0 a. t* P9 x8 y0 Q! S& Q! F: |! V8 n

& v4 [! p7 R$ Q, k; c
 楼主| 发表于 2019-3-29 19:19:00 | 显示全部楼层
本帖最后由 kuangben8 于 2019-3-29 19:20 编辑
8 E' v. f7 r& t4 w8 t. ]) h- s
2 v# _  V4 I; `+ {! NC、辅助两点半径画弧4 d) U; D# P, L) U
辅助思路:分别以AB点为圆心,R为半径画圆,两圆交点就是圆心。圆心与起点连线角度就是起始角,圆心与终点连线角度就是终止角-----然后画弧。+ e' u$ H) w! X- }+ h
  1. Sub 辅助两点半径画弧()
    5 W( d4 [" p* x5 ^4 v$ h
  2.     Rem 能画弧条件:两点距离小于2R,等于2R是半圆,大于2R不能形成图形9 ~- f: p/ b6 }
  3.     Rem 分别以A、B点为圆心,R为半径画圆,两圆交点就是圆心。圆心与起点连线角度就是起始角,圆心与终点连线角度就是终止角-----然后画弧。
    ; o2 r8 d2 p2 G0 `1 ~
  4.     Dim p1(2) As Double, p2(2) As Double, R As Double, l As AcadLine
    / Y* f; _' K5 U
  5.     p1(0) = 30: p1(1) = 30# E" n3 c/ w- a1 ?' X* \" }
  6.     p2(0) = p1(0) + 50 * 2 ^ 0.5: p2(1) = p1(1) + 50 * 2 ^ 0.5   '为了让线段长为100
    : m4 i% Q' \$ S, o- S
  7.     R = InputBox("请输入圆的半径:"), K1 x( f5 }2 L  B6 j) l- X- Z
  8.     Set l = ThisDrawing.ModelSpace.AddLine(p1, p2)1 w' O' x5 U% f) Q# x: B5 x
  9.     Update
    ' O3 X0 y5 h/ ^' e
  10.     If l.Length > 2 * R Then) ]2 c" h" n7 @$ h6 p' N, m
  11.         MsgBox "两点距离大于直径,不能形成圆或圆弧", vbInformation, "AutoCAD提示!"
    + u. T' A8 S1 }& i& O/ I7 ^: p9 r. g* _
  12.     ElseIf l.Length = 2 * R Then
    6 B1 \; i" C' k8 k
  13.         Dim p0(2) As Double
    ' k1 B& B- ^/ a
  14.         p0(0) = (p1(0) + p2(0)) / 2: p0(1) = (p1(1) + p2(1)) / 2
    1 [) J, R2 `8 u% u2 o; H
  15.         ThisDrawing.ModelSpace.AddArc p0, R, l.Angle, 3.1415926 + l.Angle  '起始角是直线的角度,终止角是直线角度+180°
    * s4 U9 o6 H+ P# u
  16.         Update8 ~4 e9 H: O# B/ W- D3 {
  17.         ThisDrawing.ModelSpace.AddArc p0, R, 3.1415926 + l.Angle, l.Angle: [. |  Q" W4 O' X- ~6 L, w
  18.         Update. R* N% L7 \( C; R
  19.     Else
    * N" z# d. l4 K) f' Z
  20.         Dim cir1 As AcadCircle, cir2 As AcadCircle, ps As Variant, ps1(2) As Double, ps2(2) As Double, l01 As AcadLine, l02 As AcadLine/ _. h0 H6 \! S* A1 h  `  P- |5 a
  21.         With ThisDrawing.ModelSpace
    5 C% S5 \' D7 b
  22.             Set cir1 = .AddCircle(p1, R). Q) `3 j( T; j( `
  23.             Update9 M. ^$ ?* X% y+ p* M# {, l& c
  24.             Set cir2 = .AddCircle(p2, R)7 W6 K( o# [- m
  25.             Update
    6 ^- ^6 p- P8 ^" o; f4 I0 X1 s  Z& h; r
  26.         End With! L; x4 \5 G+ s8 `4 Q0 j: n) ^
  27.         ps = cir1.IntersectWith(cir2, acExtendNone) '取两个圆的交点坐标,都不延伸9 x; X3 W/ C# I. C
  28.         ps1(0) = ps(0): ps1(1) = ps(1)    '第一个圆心坐标1 P; P4 z" H- U# z( s( `: C! p
  29.         ps2(0) = ps(3): ps2(1) = ps(4)    '第二个圆心坐标8 m4 c/ N( O, o* _
  30.         With ThisDrawing.ModelSpace# ~: T8 o. j/ N0 W1 I
  31.             Set l01 = .AddLine(ps1, p1)   '注意必须是圆心作为直线的起点# a5 G' B7 p  y) g' Y
  32.             Update- N4 i* H4 P, V% Q3 V3 ]3 n
  33.             Set l02 = .AddLine(ps1, p2)   '注意必须是圆心作为直线的起点: P1 ~. M7 \& q# |, ^
  34.             Update
    ! b8 @1 S- c7 i* Q- E; o0 N
  35.             .AddArc ps1, R, l01.Angle, l02.Angle    '圆心作为直线的起点,角度才是画弧需要的角度
    # S& f' C6 m$ X0 u2 q
  36.             Update" y' {# r- L% H- {! x+ |2 B
  37.             
    ' C! z3 s& S- }8 Z( P" ]5 g1 {
  38.             Set l01 = .AddLine(ps2, p1)
    + R' _/ P. H; ^6 N: \
  39.             Update
    9 T  a/ e6 B5 P* h) I8 y
  40.             Set l02 = .AddLine(ps2, p2)2 I# y( C# l/ g% E
  41.             Update
    ( A7 {4 d+ v) I+ g
  42.             .AddArc ps2, R, l01.Angle, l02.Angle
    9 @& k+ b* G* G6 j, g
  43.             Update8 C3 V$ v# @/ r: U( Q! X" L
  44.             .AddArc ps2, R, l02.Angle, l01.Angle
    . D8 {% W$ f" z0 V9 |% M
  45.             Update5 z* S! D$ B: y% [& _6 T
  46.         End With
    / ^' n& B, M5 _% g
  47. End If
      T/ ~) l" e& I. R
  48. Dim obj As Object
    % I+ I9 t' J2 N& j4 W
  49.     For Each obj In ThisDrawing.ModelSpace! N8 V, {  }9 f! d$ ]4 v3 m5 J" ^& M0 _8 C
  50.         If Not TypeOf obj Is AcadArc Then    '如果对象的图元不是圆弧则删除,按照绘图顺序删除。  Z9 w! U" e0 d5 s
  51.             obj.Delete
    5 _! M% E7 }, [
  52.             Update. w0 S+ Z& e) R" D
  53.         End If
    3 Z) E9 i0 F/ p  Q8 c9 L( H: U- B
  54.     Next
    1 h2 T" x6 L* Q, W0 T7 O8 l
  55. End Sub
    0 B0 d) r; v" P5 t# ~
复制代码
2.10、辅助绘图方法.zip (12.4 KB, 下载次数: 9)
 楼主| 发表于 2019-3-29 19:26:23 | 显示全部楼层
本帖最后由 kuangben8 于 2019-4-13 20:54 编辑
: N6 \* M  D& ?4 Q" R2 I7 B
  p+ o, o, W6 k  S11、对象操作方法之图案填充(Hatch)0 u7 T1 C% E% r( w  D

+ J8 n# a! L# i. P7 W/ f2 mA、创建图案填充
语法:RetVal = Object.AddHatch(PatternType, PatternName, Associativity [,HatchObjectType])
Object:使用该方法的对象
PatternType(图案类型): AcPatternType AcGradientPatternType 常数; 仅用于输入,如果 HatchObjectType 常数值为 acHatchObject,则使用 AcPatternType 常数; 如果 HatchObjectType 常数值为 AcGradientObject则使用 AcGradientPatternType 常数.
PatternName(图案名称): String[字符串]; 仅用于输入,如果HatchObjectType 常数值为 acHatchObject, PatternName 包含填充图案名称。如果 HatchObjectType 常数值为 acGradientObject,则 PatternName 包含在 GradientName 中列出的其中一个渐变图案名称。
Associativity(是否关联): Boolean[布尔值]; 仅用于输入,TRUE: 图案填充为关联的。FALSE:图案填充为不关联的。
HatchObjectType(填充对象类型): HatchObjectType; 可选项; 仅用于输入,默认值为AcHatchObjectType 常数值的 AcHatchObject
如果AcHatchObjectType 常数值为 AcGradientObject,则 PatternType AcGradientPatternType 类型,并且 PatternName 包含渐变图案名称。
RetVal: Hatch 对象,新创建的 Hatch 对象。
说明
PatternType 常数值如下:
acHatchPatternTypePredefined        :  选择那些定义在 acad.pat 文件中的图案名称。
acHatchPatternTypeUserDefined       :  使用当前线线型定义的线图案。
acHatchPatternTypeCustomDefined    :    acad.pat 文件名的其它 PAT 中选择图案名称。
创建了 Hatch 对象后,必须使用AppendOuterLoop 方法添加外边界。外边界必须封闭而且必须在任何内边界创建前创建。内边界使用 AppendInnerLoop 方法创建的,一次只能创建一个。
警告! 当创建了 Hatch 对象后,你必须立即追加外边界到 Hatch 对象以便它成为有效的 AutoCAD 对象。如果试图进行调用  AppendOuterLoop 方法以外的其它操作,AutoCAD 将进入无法预测的状态。
  1. Sub 填充图案()
    7 k* K+ g: [* Y
  2.     ' 该示例在模型空间中创建关联的渐变填充图案。: A* q/ K; h; y" M. J) p* K
  3.    
    * ?- {; n6 }! O3 [7 f
  4.     Dim hatchObj As AcadHatch  '定义图案填充变量
    ) t% [4 b# g9 X6 ]0 m
  5.     Dim patternName As String     '定义填充图案名称( f1 t' Z, D, _2 y4 k
  6.     Dim PatternType As Long       '定义填充图案类型
    4 }6 q9 x) S7 J4 |
  7.     Dim bAssociativity As Boolean  '定义关联结果为布尔值% @  C. v9 Q& u7 r; `2 s
  8.     ! M0 s1 K, `' h
  9.     ' 定义填充图案, _! L/ d7 p- W4 e4 y2 f, M
  10.     patternName = "CYLINDER"& Q' g( u- u- H! o, Q8 b! N
  11.     PatternType = acPreDefinedGradient '0
    3 `' u5 Y( L3 S! _& Y3 \$ B
  12.     bAssociativity = True# v1 `+ P$ G: A/ g- r" v
  13.     - N/ C- k4 V& {
  14.     ' 在模型空间中创建关联的 Hatch 对象- ^  k6 i. |' `4 t0 C+ h
  15.     Set hatchObj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity, acGradientObject)& h0 ^) `' h. {. h- u: N9 E* k' Y
  16.     Dim col1 As AcadAcCmColor, col2 As AcadAcCmColor          '定义颜色对象9 {" x8 E2 l; b- S& \
  17.     MsgBox Application.Version   '查看一下版本号,下一句的19即是版本号/ O/ o/ o' v  s& r: s" V5 \; J+ p
  18.     Set col1 = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.19")' u, Q) O. @4 @1 w+ ]& y. ^. D2 G
  19.     Set col2 = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.19")7 A( N) H8 M$ _4 y; q& N
  20.     Call col1.SetRGB(255, 0, 0)
    # e- w- j1 B# Z" y2 t
  21.     Call col2.SetRGB(0, 255, 0)3 O5 @* k$ J9 J1 L1 u- G. s
  22.     hatchObj.GradientColor1 = col1      '定义两种渐变色
    " j/ T+ F. d( V. |& r4 c+ b) p
  23.     hatchObj.GradientColor2 = col2+ F4 ~2 v' A- v" e1 z: W" V
  24.     7 l  |" M4 W' C& d7 H4 I
  25.     ' 为填充图案创建外边界(圆)
    - B2 X0 [; t/ o  c% H, G3 n6 H/ `' M
  26.     Dim outerLoop(0 To 0) As AcadEntity, t  E2 c8 }# f% b
  27.     Dim center(0 To 2) As Double
    6 \) o# r* W0 k6 A( T
  28.     Dim radius As Double
    $ |: }6 l0 s' l( h, P
  29.     center(0) = 3: center(1) = 3: center(2) = 0
    + _; [. h! O* L% n5 c* m! P) [
  30.     radius = 1- h0 g1 r, b' I& T
  31.     Set outerLoop(0) = ThisDrawing.ModelSpace.AddCircle(center, radius)+ J& {7 t. ]( j7 W
  32.     # i% I! |8 s  E( H* R2 v
  33.     ' 附着外边界到填充图案对象,并显示该填充图案
    $ g$ E4 p+ t7 t: }
  34.     hatchObj.AppendOuterLoop (outerLoop)
    ! B% G" C) D, y( M8 P) O
  35.     hatchObj.Evaluate+ X" {, a8 H! |
  36.     ThisDrawing.Regen True     '全部重生成!* T# A( o+ G8 w/ X( y' y
  37. End Sub
    3 D) |6 m. M, \, ^& Y' L
复制代码
2.11、图案填充(AddHatch).zip (11.58 KB, 下载次数: 15)
 楼主| 发表于 2019-3-29 19:27:46 | 显示全部楼层
本帖最后由 kuangben8 于 2019-4-14 09:47 编辑
5 |( T% n8 `8 n  l/ D: i- u
5 U) o$ @, ~! }. oB、填充图案的常用方法
  方法
对应作用
AppendInnerLoop  
向图案填充中附加内边界。
AppendOuterLoop  
向图案填充中附加外边界。
ArrayPolar  
以给定的对象数量、填充角度和中心点创建对象的环形阵列。
ArrayRectangular  
创建对象的二维或三维矩形阵列。
Copy
同一位置复制给定对象。
Delete  
删除指定对象或一组保存了的图层设置。
Evaluate  
计算给定的图案填充或引线。
GetBoundingBox  
返回图元对象边框的最大和最小点。
GetExtensionDictionary  
获取与对象关联的扩展词典。
GetLoopAt  
获取给定索引位置的图案填充边界
GetXData  
获取与对象关联的扩展数据(XData) 。
Highlight  
设置给定对象或给定选择集中所有对象的亮显状态。
InsertLoopAt  
按给定索引在图案填充中插入边界。
IntersectWith  
获取对象与图形中其它对象的相交点。
Mirror  
围绕轴创建平面对象的镜像图像副本。
Mirror3D  
绕由三点定义的平面镜像选定的对象。
Move
将图元对象从源向目标移动。
Rotate  
绕一点旋转图元对象。
Rotate3D
绕三维直线旋转图元对象。
ScaleEntity  
按指定的基点和比例因子来缩放图元对象。
SetPattern  
设置图案填充的图案类型和名称。
SetXData  
设置与对象关联的扩展数据 (外部数据) 。
TransformBy  
给定4×4转换矩阵移动、缩放或旋转对象。
Update
更新图形屏幕的对象。

; g6 t8 ~: i& q# J) u1 V) R
( I6 M; Q0 g/ D1 b
1Object. AppendInnerLoop方法:向图案填充添加内边界。
语法:Object.AppendInnerLoop Loop
Object使用该方法的对象Hatch
LoopVariant[变体] (对象,或对象数组); 仅用于输入构成封闭边界的对象数组。该数组可以由一个或多个对象组成。如果使用多于一个对象,它们的端点必须相接以形成一个环。该边界必须包含以下类型的对象:Line, Polyline, Circle, Ellipse, Spline, Region
说明:
在使用 AddHatch 方法创建了 Hatch 对象后,可使用AppendOuterLoop 添加外边界。外边界必须封闭,而且必须在添加内边界之前创建。
当为图案填充定义定了边界后,使用Evaluate 方法计算填充线并填充该边界,然后使用Regen 方法更新该图案填充的显示。
- I) h  _3 K: G示例参考附件6 i( @& b- J  @4 j

4 U* U) J1 q3 G
5 b9 X' `' p4 I, k- ^( t7 U5 a
2、object.AppendOuterLoop方法:向图案填充中添加外边界
语法:Object.AppendOuterLoop loop
Object使用该方法的对象Hatch
LoopObject (对象数组); 仅用于输入构成封闭边界的对象数组。该数组可以由一个或多个对象组成。如果使用多于一个对象,它们的端点必须相接以形成一个环。该边界必须包含以下类型的对象: Line, Polyline, Circle, Ellipse, Spline, Region
说明:
在使用 AddHatch 方法创建了 Hatch 对象后,必须添加外边界。外边界必须封闭,而且必须在添加内边界之前创建。在创建了有效的外边界后,可使用 AppendInnerLoop 方法分次每次添加一个任意的内边界。
当为图案填充定义定了边界后,使用Evaluate 方法计算填充线并填充该边界,然后使用Regen 方法更新该图案填充的显示。

  G* }: ~: Q! v* @2 E/ u示例参考附件& I( P0 m0 U9 j' U9 r; q! H

5 I$ n% E5 y: s& I( B( ~. ^
! P! K& }# F2 P3 v
3、填充图案的复制、删除、移动、镜像、旋转、获取交点方法
示例参考附件
    示例代码AppendOuterLoop方法中获取交点失败的原因:边界尺寸太小,绘制的填充图案的线宽超出了边界的尺寸,所以显示的填充图案是一整片区域,而且手动画的直线虽然穿过边界区域,但是并没有超过填充图案的线宽,所以获取不到交点!尝试把边界尺寸扩大到100后重新画线即可。
0 Q2 S) u! Q; G1 m" {) b
7 H6 ^( P; H7 M1 a4 |; M9 l
    示例代码验证交点中获取交点失败的原因:两个填充图案的样式相同,并且角度相同,相当于平行线,所以获取不到交点,将其中一个填充图案的角度修改一下之后即可获取交点。
3 p9 R: h# J/ [# Z6 V! w2 g2 J! {3 W7 [
- C: D. g7 l: r. W) R' i0 \    注意获取的交点坐标组成的数组中每三个元素组成一个点,所以获取的交点个数等于(数组下标最大值+1)/3
) y" C0 G4 \- z- M6 r

4 W! _* p+ Q! }! r0 u

/ v% T2 M" w7 ?/ i, k  C  N
4、object.GetLoopAt方法:获取给定索引位置的图案填充边界
语法:object.GetLoopAt Index, Loop
Object使用该方法的对象Hatch
IndexInteger[整数]; 仅用于输入从0开始的正整数。
Loop:Variant[变体] (对象或对象数组); 仅用于输出组成边界的一个对象或对象数组。

5 q7 h( T, a; Q) F: I% y6 T6 {示例参考附件
+ x0 Q6 _, j- v8 ^5 v4 h- i% \8 B3 R; o8 p7 q8 m. z

, _* c$ J6 _* E# b, b1 }8 b- k
5、Object. InsertLoopAt方法:按给定索引在图案填充中插入边界。
语法:object.InsertLoopAt Index, LoopType, Loop
Object使用该方法的对象Hatch
IndexInteger[整数]; 仅用于输入生成图案填充边界的顶点数组中的索引位置。索引必须从 0 开始的正整数。
LoopTypeAcLoopType 常数; 仅用于输入
acHatchLoopTypeDefault
acHatchLoopTypeExternal
acHatchLoopTypePolyline
acHatchLoopTypeDerived
acHatchLoopTypeTextbox
LoopVariant[变体] (对象或对象数组); 仅用于输入形成封闭边界的对象或对象数组。如果使用是的对象数组,它们的端点必须首尾相连以形成回路。边界,或定义边界的数组,可由以下类型的对象组成:
Line, Polyline, Circle, Ellipse, Spline,Region。
示例参考附件

  j1 X9 R/ g& e. S  ~1 h% g
6、Object.ScaleEntity方法:按指定的基点和比例因子来缩放图元对象,是所有对象的方法.
语法: object.ScaleEntity BasePoint, ScaleFactor
Object:使用该方法的对象, 所有图形对象、 AttributeReference
BasePoint: Variant[变体] (三元素双精度数组); 仅用于输入指定基点的三维WCS 坐标。
ScaleFactor: Double[双精度]; 仅用于输入缩放对象的比例因子。对象的尺寸与该比例因子相乘。比例因子大于 1 将放大对象。比例因子在 0 和 1 之间将缩小对象。比例因子必须大于0.0 。
示例参考附件
( h* O+ q4 \1 a9 S# I( S; d
7、Object.SetPattern方法:设置图案填充的图案类型和名称(仅限于图案填充,而非渐变填充)
语法: object.SetPattern PatternType, PatternName
Object: 使用该方法的对象Hatch。
PatternType: AcPatternType 常数; 仅用于输入
acHatchPatternTypePreDefined        =0从在 acad.pat 文件的定义中选择图案名称。
acHatchPatternTypeUserDefined       =1使用当前线型定义图案线。
acHatchPatternTypeCustomDefined     =2从 acad.pat 文件以外的其它 PAT 文件中选择图案名称。
PatternName: String[字符串]; 仅用于输入图案的名称。填充图案名称最多只允许 34个字符,而且不允许带空格。
示例参考附件
% G0 }, c* y! s
为防止所占的一个楼层字数限制,特将程序代码打包成附件供下载: 2.11.2、图案填充的常用方法.zip (12.79 KB, 下载次数: 12)
 楼主| 发表于 2019-3-29 19:28:37 | 显示全部楼层
本帖最后由 kuangben8 于 2019-4-13 20:49 编辑
5 m0 e9 h  x* I9 ?6 C6 l- p! A
3 p7 k) A. q' ~2 `C、填充图案的常用属性
: \( ~# U! m$ |: G. S' Z
  属性
对应作用
Application  
获取  Application 对象。只读属性
Area
指定构成弧、圆、椭圆、填充图案、优化多段线、多段线、面域或平面闭合样条曲线的封闭区域的面积。对于圆可修改,其他图形是只读属性
AssociativeHatch  
决定图案填充是否关联。只读属性, 关联性只能在图案填充创建时设置
Document  
获取对象所属的文档(图形)。只读属性
Elevation  
指定图案填充或多段线的当前标高
GradientAngle  
指定渐变填充的角度。
GradientCentered  
指定是否按中心渐变填充。
GradientColor1  
指定渐变填充的起始颜色。针对渐变填充中的双色填充
GradientColor2  
指定渐变填充的结束颜色。针对渐变填充中的双色填充
GradientName  
指定渐变填充的图案名称。
Handle  
获取对象的句柄。只读属性
HasExtensionDictionary  
确定对象是否有扩展词典与其关联。只读属性
HatchObjectType  
指定图案填充的类型为标准或渐变填充。
HatchStyle  
设置图案填充的样式。指孤岛检测样式(普通=0、外部=1、忽略=2)
Hyperlinks  
获取图元的 Hyperlinks 集合。只读属性
ISOPenWidth  
指定 ISO 填充图案的 ISO 笔宽。
Layer  
指定图元的图层。
Linetype  
指定图元的线型。针对的是填充的图案的线型
LinetypeScale  
指定图元的线型比例因子。针对的填充的图案的线型比例,不是图案整体比例
Lineweight  
指定个别图元的线宽或图形的默认线宽。针对填充的图案的线条宽度
Normal  
指定图元的三维法向单位矢量。
NumberOfLoops  
获取图案填充的整体边界数量。只读属性
ObjectID  
获取对象的对象ID。只读属性
OwnerID  
获取所有者(上层)对象的对象ID。只读属性
PatternAngle  
指定填充图案角度。范围在[0,2π]的double类型
PatternDouble  
指定用户定义图案填充是否为双向图案填充。
PatternName  
指定填充图案名称。 只读属性!需用SetPattern方法设置
PatternType  
获取用于图案填充的图案类型。只读属性!需用SetPattern方法设置
PatternScale  
指定填充图案比例。针对的是图案的整体比例,等同于PatternSpace
  
取值范围【>0】
PatternSpace  
指定用户定义填充图案的间距。针对图案的整体比例.等同于PatternScale
  
取值范围【>0】
PlotStyleName
指定一个对象、一组对象或图层的打印样式名称。
TrueColor  
指定对象的真彩色。
Visible
指定对象或应用程序的可见性.

1 C% Z, P3 G4 N5 _
, ~, H' G) i! H  {( q1 W
1Object.HatchStyle属性:设置图案填充的样式,就是填充界面里的孤岛检测样式。有三个属性值。
表示acHatchStyle 常数; 可读写
1acHatchStyleNormal:孤岛检测样式中的“普通”。
指定标准的样式,即普通。该选项从最外面的区域边界向内进行图案填充。如果 AutoCAD 遇到内部边界,则关闭填充,直到遇到另一个边界为止。
2acHatchStyleOuter:孤岛检测样式中的“外部”。
仅填充最外面的区域。该样式也是从最外面的区域边界向内进行图案填充,但是遇到内部边界时会关闭图案填充并且不再打开。
3acHatchStyleIgnore:孤岛检测样式中的“忽略”。
忽略内部结构。该选项使图案填充通过所有的内部对象。
2object.GradientName属性:设置渐变填充图案的名称,String[字符串]; 可读写
渐变填充的图案名称,可以是 LINEAR, CYLINDER, INVCYLINDER, SPHERICAL HEMISPHERICAL, CURVED,INVSPHERICAL, INVHEMISPHERICAL INVCURVED
3object.HatchObjectType属性: 指定图案填充的类型为标准或渐变填充。
AcHatchObjectType 常数; 可读写. 指定以下常数之一。
AcHatchObject = 0   指定为图案填充
AcGradientObject = 1  指定为渐变填充
说明:
该属性为默认值为 0(acHatchObject),创建的是标准的图案填充。
如果该属性的值为 1(acGradientObject),则通过 AddHatch 方法创建的图案填充是渐变的。如果创建了渐变的图案填充,则 PatternType 为 AcGradientPatternType 并且 PatternName 包含的渐变图案名称为LINEAR,CYLINDER, INVCYLINDER, SPHERICAL, HEMISPHERICAL, CURVED, INVSPHERICAL,INVHEMISPHERICAL, 或 INVCURVED。

$ U# e. m; N, C( `7 I
4object.ISOPenWidth属性:指定ISO填充图案的ISO笔宽。
ISOPenWidthacISOPenWidth 常数, 对于所有 ISO 填充图案为可读写。指定以下常数之一。
acPenWidth000     0.00 mm
acPenWidth013     0.13 mm
acPenWidth018     0.18mm
acPenWidth025     0.25mm
acPenWidth035     0.35mm
acPenWidth050     0.50mm
acPenWidth070     0.70mm
acPenWidth100     1.00mm
acPenWidth140     1.40mm
acPenWidth200     2.00mm
acPenWidthUnk    未知
5object.PatternDouble属性:指定用户定义图案填充是否为双向图案填充。
PatternDoubleBoolean[布尔值]; 可读写
TRUE: 使用双向图案。 FALSE:不使用双向图案。
系统变量:该属性值保存在系统变量 HPDouble 中。
说明:
如果PatternType被设置为acHatchPatternTypePreDefined或acHatchPatternTypeCustomDefined,那么双向图案属性将不起作用。
6object.PatternName属性:获取填充图案的名称。【只读属性】
7object.PatternType属性:获取用于图案填充的图案类型。【只读属性】
以上两个属性值不可重新赋值修改,只能通过SetPattern方法修改!
常用属性示例参考附件(防止一个楼层字数限制): 2.11.3、图案填充的常用属性.zip (15.83 KB, 下载次数: 9)
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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