Alt+F8,出现宏窗口 第三步:在宏名称中填写C100,点“创建”、“确定” 第四步:在Sub c100()和End Sub之间粘贴代码 第五步:回到模型空间,再次按Alt+F8,点击“运行” Sub c100() Dim cc(0 To 2) As Double '声明坐标变量 cc(0) = 1000 '定义圆心座标 cc(1) = 1000 cc(2) = 0 For i = 1 To 1000 Step 10 '开始循环 Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆 Next i End Sub 也许您还看不懂上面的代码,这没有关系,只要能把同心画出来就可以了,祝您成功。 第二课 编程基础 本课主要任务是对上一课的例程进行详细分析 下面是源码: Sub c100() Dim cc(0 To 2) As Double '声明坐标变量 cc(0) = 1000 '定义圆心座标 cc(1) = 1000 cc(2) = 0 For i = 1 To 1000 Step 10 '开始循环 Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆 Next i End Sub 先看第一行和最后一行: Sub C100() …… End Sub C100是宏的名称,也叫过程名称,当用户执行C100时程序将运行sub 和end sub之间的所有指令。 第二行: Dim cc(0 To 2) As Double '声明坐标变量 后半段“'声明坐标变量”自动变为绿色字体,它是代码语句的注释,它不会影响程序运行,它的作用是告诉阅读者程序员的想法。对于简单的程序,一般不需要写注释,如果要编写非常复杂的程序,最好要
多加
注释,越详细越好,对于程序员来说,这是一个好习惯。 电脑真正编译执行的是这条语句:Dim cc(0 To 2) As Double 它的作用就是声明变量。 Dim是一条语句,可以理解为计算机指令。 它的语法:Dim变量名 As
数据类型
本例中变量名为CC,而括号中的0 to 2声明这个CC是一个数组,这个数组有三个元素:CC(0)、CC(1)、CC(2),如果改为CC(1 to 3),则三个元素是CC(1)、CC(2)、CC(3),有了这个数组,就可以把坐标数值放到这个变量之中。 Double是数据类型中的一种。ACAD中一般需要定义坐标时就用这个数据类型。在ACAD中数据类型的有很多,下面两个是比较常用的数据类型,初学者要有所理解。 Long(
: sub test() for i=2 to 4 step 0.6 next i end sub 这是一个非常简单的循环,每一次循环i便会增加0.6,当循环3次后i值就变为4.4,但问题是每一次循环时i值变为多少? 第一步:在菜单中选“调试”—“添加监视”,在表达试中填“i”,点击确定,这时你会看到临视窗口中会多一行。 第二步:把光标移到代码窗口中的“next i”行,按一下“F9”,于是每当程序运行到这里时就会暂停了。 好,一切就绪,请按F5执行程序,在监视窗口中C值立刻变为2,再按F5继续,C值为2.6,再按几次F5,直到程序结束,这样我们就成功监视了C值的变化。 第三步:在next i行再按一次F9,清除断点。监视的表达式的右键菜单选择“删除监视”。 另外,还可以用“逐语句”、“逐过程”、“运行到光标处”等方法进行调试,这些都在调试菜单中,操作比较简单,请读者自行领悟。 到目前为止,我们所做的工程都是“嵌入式工程”,它只是嵌入在当前的Autocad图形文件中, 以后打开这个文件时代码才会加载,如果别的dwg文件也要使用,那就需要把代码导出为.bas文件,供其他dwg文件导入。在VBA编辑器的“文件”菜单中有这两个功能,一试便知。 ACAD VBA还有一种工程叫“通用式工程”,只要进入ACAD就可以运行,程序可以在不同用户、不同的图形文件中共享,但是由于VBA功能太强,有时候会出现一些意想不到的事情,所以在学习阶段请暂时不要这样做。 本课结束,请做思考题;监视下列代码中的i和j的值,注意,此题虽然要监视2个变量,但是在代窗口中只要设置1个断点就足够了。 sub test() for i=2 to 4 step 0.6 for j=-5 to 2 step 5.5 next j next i end sub 第五课 画函数曲线 先画一组下图抛物线。
下面是源码: Sub myl() Dim p(0 To 49) As Double '定义点坐标 Dim myl As Object '定义引用曲线对象变量 co = 15 '定义颜色 For a = 0.01 To 1 Step 0.02 '开始循环画抛物线 For i = -24 To 24 Step 2 '开始画多段线 j = i + 24 '确定数组元素 p(j) = i '横坐标 p(j + 1) = a * p(j) * p(j) / 10 '纵坐标 Next i '至此p(0)-p(40)所有元素已定义,结束循环 Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '画多段线 myl.Color = co '设置颜色属性 co = co + 1 '改变颜色,供下次定义曲线颜色 Next a End sub 为了鼓励大家积极思考,从本课开始,我不再解释每一条语句的作用,只对以前没有提过的语句进行一些解释,也许你一时很难明白,建议用上一课提到的跟踪变量、添加断点的办法领悟每一条语句的作用。 在跟踪变量p时请在跟踪窗口中单击变量p前的+号,这样可以看清数组p中每一个元素的变化。 ACAD没有现成的画抛物线命令,我们只能用程序编写多段线画近似抛物线。理论上,抛物线的X值可以是无限小、无限大,这里取值范围在正负24之间。 程序第二行:Dim myl As Object '定义引用曲线对象变量 Object也是一种变量类型,它可以把变量定义为对象,本例中myl变量将引用多段线,所以要定义为Objet类型。 看画多段线命令: Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '画多段线 其中括号中的p是一个数组,这个数组的元素数必须是偶数,每两个元数作为一个点坐标。 等号前面部分“Set myl”的作用就将myl变量去引用画好的多段线。 myl.Color = co '设置颜色属性。在ACAD中,颜色可以用数字表示,本例中co会增值,这样就会有五彩缤纷的效果。 本课第二张图:正弦曲线,下面是源码: Sub sinl() Dim p(0 To 719) As Double '定义点坐标 For i = 0 To 718 Step 2 '开始画多段线 p(i) = i * 2 * 3.1415926535897 / 360 '横坐标 p(i + 1) = 2 * Sin(p(i)) '纵坐标 Next i ThisDrawing.ModelSpace.AddLightWeightPolyline (p) '画多段线 ZoomExtents '显示整个图形 End Sub
p(i) = i * 2 * 3.1415926535897 / 360 '横坐标 横坐标表示角度,后面表达式的作用是把角度转化弧度 ZoomExtents语句是缩放命令,它的作用是显示整个图形,消除图形以外的区域 本课思考题:画一条抛物线:y=0.5*x*x+3,其中X取值范围在正负50之间 第六课 数据类型的转换 上一节课我们用一个简单的公式把角度转化为弧度,这样做便于大家理解。不过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("12 1/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:14 AM") 下面的代码可以写出一串数字,从000-099。 Sub test() Dim add0 As String Dim text As String Dim p(0 To 2) As Double p(1) = 0 'Y坐标为0 p(2) = 0 'Z坐标为0 For i = 0 To 99 '开始循环 If i < 10 Then '如果小于10 add0 = "00" '需要加00 Else '否则 add0 = "0" '需要加0 End If text = add0 & CStr(i) '加零,并转换数据 p(0) = i * 100 'X坐标 Call ThisDrawing.ModelSpace.AddText(text, p, 4) '写字 Next i
End Sub
重点解释条件判断语句: If 条件表达式 Then …… Else …… End if 如果满足条件那么程序往下执行,到else时不再往下执行,直接跳到End if后面 如果不满足条件,程序跳到else后往下运行。 Call ThisDrawing.ModelSpace.AddText(text, p, 4) '写字 这是写单行文本,需要三个参数,分别是:写的内容、位置、字高 第七课 写文字 客观地说,ACAD写字功能不够历害,而用VBA可以使写字效率更高。比较正规的做法是把定义文字样式,用样式来控制文字的特性。我们还是用实例来学习,先看下面一段代码,它的作用是先创建一个文字样式,然后用这个文字样式写一段多行文本。 Sub txt() Dim mytxt As AcadTextStyle '定义mytxt变量为文本样式 Dim p(0 To 2) As Double '定义坐标变量 p(0) = 100: p(1) = 100: p(2) = 0 '坐标赋值 Set mytxt = ThisDrawing.TextStyles.Add("mytxt") '添加mytxt样式 mytxt.fontFile = "c:\windows\fonts\simfang.ttf" '设置字体文件为仿宋体 mytxt.Height = 100 '字高 mytxt.Width = 0.8 '宽高比 mytxt.ObliqueAngle = ThisDrawing.Utility.AngleToReal(3, 0) '倾斜角度(需转为弧度)