Autocad VBA教程.docx
《Autocad VBA教程.docx》由会员分享,可在线阅读,更多相关《Autocad VBA教程.docx(40页珍藏版)》请在冰豆网上搜索。
![Autocad VBA教程.docx](https://file1.bdocx.com/fileroot1/2023-4/16/80224213-dda2-47df-8aed-d61a9120fc73/80224213-dda2-47df-8aed-d61a9120fc731.gif)
AutocadVBA教程
AutocadVBA初级教程
本文是我搜集网上一位高手的教程,整理而成,其中对某些程序进行了拓展。
本人从事选煤厂工程总承包多年,发现业内从大型设计院到小型公司,只是将CAD作为画图板、丁字尺、铅笔的替代品,所有的设计还都基本是手工绘制,远没有充分利用AutoCAD的功能。
即便快捷键这么简单的功能,都有好多人没有掌握如何自定义(通过修改自定义文件,将常用命令都改为左手操作的快捷命令,右手操作鼠标。
例如将原本需要右手操作的画直线命令L,改为左手操作输入FF也能画出直线)。
利用CAD二次开发接口进行设计的更是少之又少,关于CAD二次开发的书籍、资料也是少的可怜。
所以本人搜集、整理此文供AutoCADVBA初学入门使用,以此共勉,充分利用CAD软件的功能,减少设计中的劳动强度,提高工作效率。
本人也AutoCADVBA初学者,欢迎交流。
QQ:
249365331。
第一课:
入门
1.为什么要写这个教程
市面上ACADVBA的书不多,它的帮助是英文版的,很多人看不懂。
其实我转行已经好几年了,而且手艺也慢慢生疏了,写个教程对自己来说也是一次复习。
2.什么是AutocadVBA?
VBA是VisualBasicforApplications的英文缩写,它是一个功能强大的开发工具,学好VBA可以成倍甚至成百、成万倍提高工作效率,在工作中,有很多任务仅用ACAD命令不可能完成的,只要学好VBA就可以做到,相信到时候您一定会得到同事的佩服、老板的器重。
3、VBA有多难?
相信大家都知道Basic是的含义。
应该承认,我的水平还不高,错误之处在所难免,如果大家发现错误一定要提出批评,以便及时更正。
4、怎样学习VBA?
介绍大家一个学习公式:
信心+恒心=开心。
仔细阅读本教程,完成例题,在学习的过程中一定要多思考,多想一些是什么、为什么。
本教程将陆续发布在CAD世界论坛上,您不需要付费就可以学习。
本作者在此郑重承诺:
关于本教程中有任何疑问,可以跟贴提问,只要有时间,本人一定会耐心解答。
我不会发到任何人的邮箱中,您自己在论坛上找就可以了,请不要再向我索要这份教程。
5、现在我们开始编写第一个程序:
画一百个同心圆
第一步:
复制下面的红色代码
第二步:
在模型空间按快捷键Alt+F8,出现宏窗口
第三步:
在宏名称中填写C100,点“创建”、“确定”
第四步:
在Subc100()和EndSub之间粘贴代码
第五步:
回到模型空间,再次按Alt+F8,点击“运行”
Subc100()
Dimcc(0To2)AsDouble'声明坐标变量
cc(0)=1000'定义圆心座标
cc
(1)=1000
cc
(2)=0
Fori=1To1000Step10'开始循环
CallThisDrawing.ModelSpace.AddCircle(cc,i*10)'画圆
Nexti
EndSub
也许您还看不懂上面的代码,这没有关系,只要能把同心画出来就可以了,祝您成功。
第二课:
编程基础
本课主要任务是对上一课的例程进行详细分析
下面是源码:
Subc100()
Dimcc(0To2)AsDouble'声明坐标变量
cc(0)=1000'定义圆心座标
cc
(1)=1000
cc
(2)=0
Fori=1To1000Step10'开始循环
CallThisDrawing.ModelSpace.AddCircle(cc,i*10)'画圆
Nexti
EndSub
**************************************************************
拓展程序(将上述画圆的程序拓展为每画一个圆设定为一种颜色)
Subc100()
Dimcc(0To2)AsDouble'声明坐标变量
cc(0)=1000'定义圆心座标
cc
(1)=1000
cc
(2)=0
DimmylAsObject'定义引用曲线对象变量
co=15'定义颜色
Fori=1To1000Step10'开始循环
Setmyl=ThisDrawing.ModelSpace.AddCircle(cc,i*10)'画圆,cc数组为圆心X、Y、Z值
myl.color=co'设置颜色属性
co=co+1'改变颜色,供下次定义曲线颜色
Nexti
EndSub
**************************************************************
先看第一行和最后一行:
SubC100()
……
EndSub
C100是宏的名称,也叫过程名称,当用户执行C100时程序将运行sub 和endsub之间的所有指令。
第二行:
Dimcc(0To2)AsDouble'声明坐标变量
后半段“'声明坐标变量”自动变为绿色字体,它是代码语句的注释,它不会影响程序运行,它的作用是告诉阅读者程序员的想法。
对于简单的程序,一般不需要写注释,如果要编写非常复杂的程序,最好要多加注释,越详细越好,对于程序员来说,这是一个好习惯。
电脑真正编译执行的是这条语句:
Dimcc(0To2)AsDouble
它的作用就是声明变量。
Dim是一条语句,可以理解为计算机指令。
它的语法:
Dim变量名As数据类型
本例中变量名为CC,而括号中的0to2声明这个CC是一个数组,这个数组有三个元素:
CC(0)、CC
(1)、CC
(2),如果改为CC(1to3),则三个元素是CC
(1)、CC
(2)、CC(3),有了这个数组,就可以把坐标数值放到这个变量之中。
Double是数据类型中的一种。
ACAD中一般需要定义坐标时就用这个数据类型。
在ACAD中数据类型的有很多,下面两个是比较常用的数据类型,初学者要有所理解。
Long(长整型),其范围从-2,147,483,648到2,147,483,647。
Variant它是那些没被显式声明为其他类型变量的数据类型,可以理解为一种通用的数据类型,这是最常用的。
下面三条语句
cc(0)=1000'定义圆心座标
cc
(1)=1000
cc
(2)=0
它们的作用是给CC变量的每一个元素赋,值其顺序是X、Y、Z坐标。
Fori=1To1000Step10'开始循环
……
Nexti'结束循环
这两条语句的作用是循环运行指令,每循环一次,i值要增加10,当i加到1000时,结束循环。
i也是一个变量,虽然没有声明i变量,程序还是认可的,VB不是C语言,每用一个变量都要声明,不声明就会报错。
简单是简单了,这样做也有坏处,如果不小心打错了一个字母,程序不会报错,如果程序很长,那就会出现一些意想不到的错误。
step后面的数值就是每次循环时增加的数值,step后也可以用负值。
例如:
Fori=1000To1Step-10
很多情况下,后面可以不加step10
如:
Fori=1to100,它的作用是每循环一次i值就增加1
Nexti语句必须出现在需要结束循环的位置,不然程序没法运行。
下面看画圆命令:
CallThisDrawing.ModelSpace.AddCircle(cc,i*10)
Call语句的作用是调用其他过程或者方法。
ThisDrawing.ModelSpace是指当前CAD文档的模型空间
AddCircle是画圆方法
Addcicle方法需要两个参数:
圆心和半径
CC就是圆心坐标,i*10就是圆的半径,本例中,这些圆的半径分别是10、110、210、310……
本课到此结束,下面请完成一道思考题:
1.以(4,2)为圆心,画5个同心圆,其半径为1-5
第三课:
编程基础二
有一位叫自然9172的网友提出了下面的问题:
绘制三维多段线时X、Y值在屏幕上用鼠标选取,Z值用键盘输入
本课将讲解这个问题。
为了简化程序,这里用多条直线来代替多段线。
以下是源码:
Submyl()
Dimp1AsVariant'申明端点坐标
Dimp2AsVariant
p1=ThisDrawing.Utility.GetPoint(,"输入点:
")'获取点坐标
z=ThisDrawing.Utility.GetReal("Z坐标:
")'用户输入Z坐标值
p1
(2)=z'将Z坐标值赋予点坐标中
OnErrorGoToErr_Control'出错陷井
Do'开始循环
p2=ThisDrawing.Utility.GetPoint(p1,vbCr&"输入下一点:
")'获取下一个点的坐标
z=ThisDrawing.Utility.GetReal("Z坐标:
")'用户输入Z坐标值
p2
(2)=z'将Z坐标值赋予点坐标中
CallThisDrawing.ModelSpace.AddLine(p1,p2)'画直线
p1=p2'将第二点的端点保存为下一条直线的第一个端点坐标
Loop
Err_Control:
EndSub
先谈一下本程序的设计思路:
1、获取第一点坐标
2、输入第一点Z坐标
3、获取第二点坐标
4、输入第二点Z坐标
5、以第一、二点为端点,画直线
6、下一条线的第一点=这条线的第二点
7、回到第3步进行循环
如果用户没有输入坐标或Z值,则程序结束。
首先看以下两条语句:
p1=ThisDrawing.Utility.GetPoint(,"输入点:
")‘获取点坐标
……
p2=ThisDrawing.Utility.GetPoint(p1,vbCr&"输入下一点:
")'获取下一个点的坐标
这两条语句的作用是由用户输入点用鼠标选取点坐标,并把坐标值赋给p1、p2两个变量。
ThisDrawing.Utility.GetPoint()在ACAD中这是最常用的方法之一,它需要两个参数,在逗号前面的参数应该是一个点坐标,它的作用是在屏幕上画一条线,前一个端点位于点坐标位置,后一个端点跟随鼠标移动,逗号之前可以什么都不填,这时没有线条会跟随鼠标移动,但逗号必须保留。
逗号后面使用一串字符,程序在命令行显示这串字符,这不难理解。
VbCr通常代表一个回车符,而在这个语句中,它的作用是在命令行不显示“命令:
”
&的作用是连接字符。
举例:
“爱我中华”&”抵制日货”&”从我做起”
z=ThisDrawing.Utility.GetReal("Z坐标:
")'用户输入Z坐标值
由用户输入一个实数
OnErrorGoToErr_Control'出错陷井
……
Err_Control:
OnError是出错陷井语句,在程序出错时将执行OnError后面的语句
GoToErr_contorl是程序跳转语句,它的作用是在程序中寻找Err_control:
,并执行这一行后面的语句,本例中Err_Control:
后就是结束宏,所以只要出现错误,程序中止。
Do'开始循环
……
Loop‘结束循环
这个循环就历害了,它会无休止地进行循环,好在本例中已经有了一个出错陷井,当用户输入回车时,由于程序没有得到点或坐标,程序出错,跳出循环,中止程序。
如果要人为控制跳出循环,可以在代码中用ExitDo语句跳出循环。
在For变量和Next变量之间如果要跳出循环,那么只要在循环体内加一个Exitfor就可以跳出循环,关于这方面的例程以后会讲到。
CallThisDrawing.ModelSpace.AddLine(p1,p2)'画直线
画直线方法也是很常用的,它的两个参数是点坐标变量
本课到此结束,请做思考题:
连续画圆,每次要求用户输入圆心、半径,当用户不再输入圆心或半径时程序才退出
**************************************************************
参考程序:
Subcir1()
DimccAsVariant'申明端点坐标
DimrAsVariant
Do'开始循环
cc=ThisDrawing.Utility.GetPoint(,"屏幕拾取圆心:
")
r=ThisDrawing.Utility.GetReal("键盘输入半径")
OnErrorGoToErr_Control'出错陷井
CallThisDrawing.ModelSpace.AddCircle(cc,r)'画直线
Loop
Err_Control:
EndSub
**************************************************************
第四课:
程序的调试和保存
人非圣贤,孰能无过,初学者在编写复杂程序时往往会出现一些意想不到的错误,所以程序的调试显得尤为重要,随着学习的深入,以后我们需要经常进行程序调试。
事实上,对于那些资深程序员来说,调试程序也是一项不可或缺的重要工作。
首先,在程序输入阶段,应该充分利用VBA编辑器的智能功能。
当你在写代码时,输入一些字母后,编辑器可以自动列出合适的语句、对象、函数供你选择,可以用上下键选择,然后按TAB键(它位于“Q”键左边)确认。
当输入一个回车符后程序会自动对这条语句进行分析,如果出现错误就会提示。
我们经常碰到的麻烦是程序的运行结果和预计的不一样,一般我会这样做:
首先要想一想可能是哪一个变量有问题,然后去监视这个变量(或表达式),在程序合适的位置设置断点,这样可以使程序停下来看一看这个变量有没有按照我的设想在变化。
下面我举一个简单的例子,先看源代码:
subtest()
fori=2to4step0.6
nexti
endsub
这是一个非常简单的循环,每一次循环i便会增加0.6,当循环3次后i值就变为4.4,但问题是每一次循环时i值变为多少?
第一步:
在菜单中选“调试”—“添加监视”,在表达试中填“i”,点击确定,这时你会看到临视窗口中会多一行。
第二步:
把光标移到代码窗口中的“nexti”行,按一下“F9”,于是每当程序运行到这里时就会暂停了。
好,一切就绪,请按F5执行程序,在监视窗口中C值立刻变为2,再按F5继续,C值为2.6,再按几次F5,直到程序结束,这样我们就成功监视了C值的变化。
第三步:
在nexti行再按一次F9,清除断点。
监视的表达式的右键菜单选择“删除监视”。
另外,还可以用“逐语句”、“逐过程”、“运行到光标处”等方法进行调试,这些都在调试菜单中,操作比较简单,请读者自行领悟。
到目前为止,我们所做的工程都是“嵌入式工程”,它只是嵌入在当前的Autocad图形文件中,以后打开这个文件时代码才会加载,如果别的dwg文件也要使用,那就需要把代码导出为.bas文件,供其他dwg文件导入。
在VBA编辑器的“文件”菜单中有这两个功能,一试便知。
ACADVBA还有一种工程叫“通用式工程”,只要进入ACAD就可以运行,程序可以在不同用户、不同的图形文件中共享,但是由于VBA功能太强,有时候会出现一些意想不到的事情,所以在学习阶段请暂时不要这样做。
本课结束,请做思考题;监视下列代码中的i和j的值,注意,此题虽然要监视2个变量,但是在代窗口中只要设置1个断点就足够了。
subtest()
fori=2to4step0.6
forj=-5to2step5.5
nextj
nexti
endsub
第五课:
画函数曲线
先画一组下图抛物线。
下面是源码:
Submyl()
Dimp(0To49)AsDouble'定义点坐标
DimmylAsObject'定义引用曲线对象变量
co=15'定义颜色
Fora=0.01To1Step0.02'开始循环画抛物线
Fori=-24To24Step2'开始画多段线
j=i+24'确定数组元素
p(j)=i'横坐标
p(j+1)=a*p(j)*p(j)/10'纵坐标
Nexti'至此p(0)-p(40)所有元素已定义,结束循环
Setmyl=ThisDrawing.ModelSpace.AddLightWeightPolyline(p)'画多段线
myl.Color=co'设置颜色属性
co=co+1'改变颜色,供下次定义曲线颜色
Nexta
Endsub
为了鼓励大家积极思考,从本课开始,我不再解释每一条语句的作用,只对以前没有提过的语句进行一些解释,也许你一时很难明白,建议用上一课提到的跟踪变量、添加断点的办法领悟每一条语句的作用,如果有问题不懂请跟贴提问。
在跟踪变量p时请在跟踪窗口中单击变量p前的+号,这样可以看清数组p中每一个元素的变化。
ACAD没有现成的画抛物线命令,我们只能用程序编写多段线画近似抛物线。
理论上,抛物线的X值可以是无限小、无限大,这里取值范围在正负24之间。
程序第二行:
DimmylAsObject'定义引用曲线对象变量
Object也是一种变量类型,它可以把变量定义为对象,本例中myl变量将引用多段线,所以要定义为Objet类型。
看画多段线命令:
Setmyl=ThisDrawing.ModelSpace.AddLightWeightPolyline(p)'画多段线
其中括号中的p是一个数组,这个数组的元素数必须是偶数,每两个元数作为一个点坐标。
等号前面部分“Setmyl”的作用就将myl变量去引用画好的多段线。
myl.Color=co'设置颜色属性。
在ACAD中,颜色可以用数字表示,本例中co会增值,这样就会有五彩缤纷的效果。
本课第二张图:
正弦曲线,下面是源码:
Subsinl()
Dimp(0To719)AsDouble'定义点坐标
Fori=0To718Step2'开始画多段线
p(i)=i*2*3.1415926535897/360'横坐标
p(i+1)=2*Sin(p(i))'纵坐标
Nexti
ThisDrawing.ModelSpace.AddLightWeightPolyline(p)'画多段线
ZoomExtents'显示整个图形
EndSub
p(i)=i*2*3.1415926535897/360'横坐标
横坐标表示角度,后面表达式的作用是把角度转化弧度
ZoomExtents语句是缩放命令,它的作用是显示整个图形,消除图形以外的区域
本课思考题:
画一条抛物线:
y=0.5*x*x+3,其中X取值范围在正负50之间
*******************************************************************************
Subtest5()
Dimp(0To101)AsDouble'定义点坐标
Fori=-50To50Step2'开始画多段线
j=i+50'确定数组元素
p(j)=i'横坐标
p(j+1)=0.5*p(j)*p(j)+3'纵坐标
Nexti'至此p(0)-p(40)所有元素已定义,结束循环
Setmyl=ThisDrawing.ModelSpace.AddLightWeightPolyline(p)'画多段线
EndSub
*********************************************************************
第六课:
数据类型的转换
上一节课我们用一个简单的公式把角度转化为弧度,这样做便于大家理解。
不过VBA中有现成的方法可以转换数据类型。
我们举例说明:
jd=ThisDrawing.Utility.AngleToReal(30,0)
这个表达式把角度30度转化为弧度,结果是.523598775598299。
AngleToReal需要两个参数,前面是表示要转换角度的数字,而后面一个参数可以取值为0-4之间的整数,有如下意义:
0:
十进制角度;1:
度分秒格式;2:
梯度;3:
弧度;4:
测地单位
例:
id=ThisDrawing.Utility.AngleToReal("62d30'10""",1)
这个表达式计算62度30分10秒的弧度
再看将字符串转换为实数的方法:
DistanceToReal
需要两个参数,前一个参数是表示数值的字符串,后面可以取值1-5,表示数据格式,有如下意义:
1:
科学计数;2:
十进制;3:
工程计数——英尺加英寸;4:
建筑计数——英尺加分数英寸;5:
分数格式。
例:
以下表达式得到一个12.5的实数
temp1=ThisDrawing.Utility.DistanceToReal("1.25E+01",1)
temp2=ThisDrawing.Utility.DistanceToReal("12.5",2)
temp3=ThisDrawing.Utility.DistanceToReal("121/2",5)
而realtostring方法正好相反,它把一个实数转换为字符串。
它需要3个参数
第一个参数是一个实数,第二个参数表示数据格式,含义同上,最后一个参数表示精确到几位小数。
temp1=ThisDrawing.Utility.RealToString(12.5,1,3)
得到这个字符串:
“1.250E+01”,
下面介绍一些数型转换函数:
Cint,获得一个整数,例:
Cint(3.14159),得到3
Cvar,获得一个Variant类型的数值,例:
Cvar("123"&"00"),得到”12300”
Cdate,转换为date数据类型,例:
MyShortTime=CDate("11:
13:
14AM")
下面的代码可以写出一串数字,从000-099。
Subtest()
Dimadd0AsString
DimtextAsString
Dimp(0To2)AsDouble
p
(1)=0'Y坐标为0
p
(2)=0'Z坐标为0
Fori=0To99'开始循环
Ifi<10Then'如果小于10
add0="00"'需要加00
Else'否则
add0="0"'需要加0
EndIf
text=add0&CStr(i)'加零,并转换数据
p(0)=i*100'X坐标
CallThisDrawing.ModelSpace.AddText(text,p,4)'写字
Nexti
EndSub
重点解释条件判断语句:
If条件表达式Then
……
Else
……
Endif
如果满足条件那么程序往下执行,到els