但是在代窗口中只要设置1个断点就足够了。 sub test()
for i=2 to 4 step 0.6 for j=-5 to 2 step 5.5 next j next i
end subAutocad VBA初级教程 (第五课 画函数曲线)
先画一组下图抛物线。
下面是源码: 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之间Autocad VBA初级教程 (第六课 数据类型的转换)
上一节课我们用一个简单的公式把角度转化为弧度,这样做便于大家理解。不过VBA中有现成的方法可以转换数据类型。
我们举例说明:
jd = ThisDrawing.Utility.AngleToReal(30, 0)
这个表达式把角度30度转化为弧度,结果是.523598775598299。
AngleToReal需要两个参数,前面是表示要转换角度的数字,而后面一个参数可以取值为0-4之间的整数,有如下意义:
0:十进制角度;1:度分秒格式;2:梯度;3:弧度;4:测地单位 例:id= ThisDrawing.Utility.AngleToReal(\这个表达式计算62度30分10秒的弧度
再看将字符串转换为实数的方法:DistanceToReal
需要两个参数,前一个参数是表示数值的字符串,后面可以取值1-5,表示数据格式,有如下意义:
1:科学计数;2:十进制;3:工程计数——英尺加英寸;4:建筑计数——英尺加分数英寸;5:分数格式。
例:以下表达式得到一个12.5的实数
temp1 = ThisDrawing.Utility.DistanceToReal(\temp2 = ThisDrawing.Utility.DistanceToReal(\temp3 = ThisDrawing.Utility.DistanceToReal(\
而realtostring方法正好相反,它把一个实数转换为字符串。它需要3个参数
第一个参数是一个实数,第二个参数表示数据格式,含义同上,最后一个参数表示精确到几位小数。
temp1= ThisDrawing.Utility.RealToString(12.5, 1, 3) 得到这个字符串:“1.250E+01”,
下面介绍一些数型转换函数:
Cint,获得一个整数,例:Cint(3.14159) ,得到3
Cvar,获得一个Variant类型的数值,例:Cvar(\,得到”12300” Cdate,转换为date数据类型,例:MyShortTime = CDate(\
下面的代码可以写出一串数字,从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 Else '否则
add0 = \需要加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) '写字
这是写单行文本,需要三个参数,分别是:写的内容、位置、字高Autocad VBA初级教程 (第七课 写文字)
客观地说,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.fontFile = \设置字体文件为仿宋体 mytxt.Height = 100 '字高 mytxt.Width = 0.8 '宽高比
mytxt.ObliqueAngle = ThisDrawing.Utility.AngleToReal(3, 0) '倾斜角度(需转为弧度)
ThisDrawing.ActiveTextStyle = mytxt '将当前文字样式设置为mytxt
Set txtobj = ThisDrawing.ModelSpace.AddMText(p, 1400, \做到老,学到老}\\P\此心自光明正大,过人远矣\
txtobj.LineSpacingFactor = 2 '指定行间距
txtobj.AttachmentPoint = 3 '右对齐(1为左对齐,2为居中)
End Sub
我们看这条语句
Set mytxt = ThisDrawing.TextStyles.Add(\
添加文本样式并赋值给mytxt变量,只需要一个参数:文本样式名
fontfile、height、width、ObliqueAngle是文本样式最常用的属性
Call ThisDrawing.ModelSpace.AddMText(p, 1400, \做到老,学到老}\\P\此心自光明正大,过人远矣\
这条语句是写文本,需要三个参数。第一个参数p是坐标,1400是宽度,最后一个参数是文本内容,其中\\p是一个回车符
扩大字符间距用\\T数字,例:\\T3abc,使文字abc的间距扩大3 部,n取值范围是0.75-3
在论坛中有一个经常被同好提及的问题:如何使用文字叠加。举例说明:123\\S+0.12^-0.34 \\S是格式字符,^是分隔符,前面的数字在上,后面的数字在下。
\\C是颜色格式字符,C后面跟一个数字表示颜色
\\A是对齐方式,\\A0,\\A1,\\A2分别表示底部对齐、中间对齐和顶部对齐Autocad VBA初级教程 (第八课:图层操作)
先简单介绍两条命令:
1、这条语句可以建立图层:
ThisDrawing.Layers.Add(\新建图层\在括号中填写图层的名称。
2、设置为当前的图层
ThisDrawing.ActiveLayer=图层对象
注意,等号右边的变量不能用图层名称,必须使用一个有效的图层变量
以下一些属性在图层比较常用: LayerOn 打开关闭 Freeze 冻结 Lock锁定 Color 颜色 Linetype 线型
看一个例题:
1、先在已有的图层中寻找一个名为“新建图层”的图层
2、如果找到这个图层,显示该图层的信息,并提示用户是否需要设置为当前图层,如果用户确认,则设置为当前图层。
3、如果图层没有找到,新建一个名为“新建图层”的图层,设置为黄色,HIDDEN线型,并把这个图层设置为当前图层
Sub mylay()
Dim lay0 As AcadLayer '定义作为图层的变量 Dim lay1 As AcadLayer
findlay = 0 '寻找图层的结果的变量,0没有找到,1找到
For Each lay0 In ThisDrawing.Layers '在所有的图层中进行循环
If lay0.Name = \新建图层\如果找到图层名 findlay = 1 '把变量改为1标志着图层已经找到 msgstr = lay0.Name + \已经存在\
msgstr = msgstr + \图层状态:\打开\关闭\