博文

Autocad VBA初级教程 (第一课:入门)(2006-01-03 07:13:00)

摘要:  第一课:入门 1.为什么要写这个教程市面上ACAD VBA的书不多,它的帮助是英文版的,很多人看不懂。其实我转行已经好几年了,而且手艺也慢慢生疏了,写个教程对自己来说也是一次复习。 2.什么是Autocad VBA?VBA是Visual Basic for Applications的英文缩写,它是一个功能强大的开发工具,学好VBA可以成倍甚至成百、成万倍提高工作效率,在工作中,有很多任务仅用ACAD命令不可能完成的,只要学好VBA就可以做到,相信到时候您一定会得到同事的佩服、老板的器重。 3、VBA有多难?相信大家都知道Basic是的含义。应该承认,我的水平还不高,错误之处在所难免,如果大家发现错误一定要提出批评,以便及时更正。 4、怎样学习VBA?介绍大家一个学习公式:信心+恒心=开心。仔细阅读本教程,完成例题,在学习的过程中一定要多思考,多想一些是什么、为什么。本教程将陆续发布在CAD世界论坛上,您不需要付费就可以学习。本作者在此郑重承诺:关于本教程中有任何疑问,可以跟贴提问,只要有时间,本人一定会耐心解答。我不会发到任何人的邮箱中,您自己在论坛上找就可以了,请不要再向我索要这份教程。 5、现在我们开始编写第一个程序:画一百个同心圆第一步:复制下面的红色代码第二步:在模型空间按快捷键Alt+F8,出现宏窗口第三步:在宏名称中填写C100,点“创建”、“确定”第四步:在Sub c100()和End Sub之间粘贴代码第五步:回到模型空间,再次按Alt+F8,点击“运行” Sub c100()Dim cc(0 To 2) As Double '声明坐标变量cc(0) = 1000 '定义圆心座标cc(1) = 1000cc(2) = 0For i = 1 To 1000 Step 10 '开始循环  Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆Next iEnd Sub 也许您还看不懂上面的代码,这没有关系,只要能把同心画出来就可以了,祝您成功。......

阅读全文(6746) | 评论:5

Autocad VBA初级教程 (第二课 编程基础)(2006-01-03 07:12:00)

摘要:  第二课  编程基础 本课主要任务是对上一课的例程进行详细分析 下面是源码:Sub c100()Dim cc(0 To 2) As Double '声明坐标变量cc(0) = 1000 '定义圆心座标cc(1) = 1000cc(2) = 0For i = 1 To 1000 Step 10 '开始循环  Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆Next iEnd Sub 先看第一行和最后一行:Sub C100()……End SubC100是宏的名称,也叫过程名称,当用户执行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(长整型),其范围从 -2,147,483,648 到 2,147,483,647。Variant  它是那些没被显式声明为其他类型变量的数据类型,可以理解为一种通用的数据类型,这是最常用的。 下面三条语句cc(0) = 1000 '定义圆心座标cc(1) = 1000cc(2) = 0它们的作用是给CC变量的每一个元素赋,值其顺序是X、Y、Z坐标。 For i = 1 To 1000 Step 10 '开始循环……Next i&nb......

阅读全文(4105) | 评论:1

Autocad VBA初级教程 (第四课 编程基础二)(2006-01-03 07:11:00)

摘要:  有一位叫自然9172的网友提出了下面的问题:绘制三维多段线时X、Y值在屏幕上用鼠标选取,Z值用键盘输入本课将讲解这个问题。 为了简化程序,这里用多条直线来代替多段线。以下是源码:Sub myl()Dim p1 As Variant '申明端点坐标Dim p2 As Variantp1 = ThisDrawing.Utility.GetPoint(, "输入点:") '获取点坐标z = ThisDrawing.Utility.GetReal("Z坐标:") '用户输入Z坐标值p1(2) = z '将Z坐标值赋予点坐标中On Error GoTo Err_Control '出错陷井Do '开始循环  p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "输入下一点:") '获取下一个点的坐标  z = ThisDrawing.Utility.GetReal("Z坐标:") '用户输入Z坐标值  p2(2) = z '将Z坐标值赋予点坐标中  Call ThisDrawing.ModelSpace.AddLine(p1, p2) '画直线  p1 = p2 '将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:End Sub 先谈一下本程序的设计思路: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中这是最常用的方法之一,它需要两个参数,在逗号前面的参数应该是一个点坐标,它的作用是在屏幕上画一条线,前一个端点位于点坐标位置,后一个端点跟随鼠标移动,逗号之前可以什么都不......

阅读全文(3985) | 评论:0

Autocad VBA初级教程 (第三课 程序的调试和保存)(2006-01-03 07:11:00)

摘要:  人非圣贤,孰能无过,初学者在编写复杂程序时往往会出现一些意想不到的错误,所以程序的调试显得尤为重要,随着学习的深入,以后我们需要经常进行程序调试。事实上,对于那些资深程序员来说,调试程序也是一项不可或缺的重要工作。 首先,在程序输入阶段,应该充分利用VBA编辑器的智能功能。当你在写代码时,输入一些字母后,编辑器可以自动列出合适的语句、对象、函数供你选择,可以用上下键选择,然后按TAB键(它位于“Q”键左边)确认。当输入一个回车符后程序会自动对这条语句进行分析,如果出现错误就会提示。我们经常碰到的麻烦是程序的运行结果和预计的不一样,一般我会这样做:首先要想一想可能是哪一个变量有问题,然后去监视这个变量(或表达式),在程序合适的位置设置断点,这样可以使程序停下来看一看这个变量有没有按照我的设想在变化。下面我举一个简单的例子,先看源代码:sub test()for i=2 to 4 step 0.6next iend 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功能太强,有时候会出现一些意想不到的事情,所以在学习阶段请暂时不要这样做。 ......

阅读全文(3234) | 评论:0

Autocad VBA初级教程 (第五课 画函数曲线)(2006-01-03 07:10:00)

摘要:  先画一组下图抛物线。 下面是源码: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 aEnd 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中,颜色可以用......

阅读全文(4986) | 评论:0

Autocad VBA初级教程 (第六课 数据类型的转换)(2006-01-03 07:04:00)

摘要:  上一节课我们用一个简单的公式把角度转化为弧度,这样做便于大家理解。不过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) ,得到3Cvar,获得一个Variant类型的数值,例:Cvar("123" & "00"),得到”12300”Cdate,转换为date数据类型,例:MyShortTime = CDate("11:13:14 AM") 下面的代码可以写出一串数字,从000-099。 Sub test() Dim add0 As StringDim te......

阅读全文(3956) | 评论:0

Autocad VBA初级教程 (第七课 写文字)(2006-01-03 07:03:00)

摘要:  客观地说,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) '倾斜角度(需转为弧度) ThisDrawing.ActiveTextStyle = mytxt '将当前文字样式设置为mytxtSet txtobj = ThisDrawing.ModelSpace.AddMText(p, 1400, "{做到老,学到老}\P" & "此心自光明正大,过人远矣") txtobj.LineSpacingFactor = 2 '指定行间距txtobj.AttachmentPoint = 3 '右对齐(1为左对齐,2为居中) End Sub 我们看这条语句Set mytxt = ThisDrawing.TextStyles.Add("mytxt") 添加文本样式并赋值给mytxt变量,只需要一个参数:文本样式名 fontfile、height、width、ObliqueAngle是文本样式最常用的属性 Call ThisDrawing.ModelSpace.AddMText(p, 1400, "{做到老,学到老}\P" & "此心自光明正大,过人远矣")这条语句是写文本,需要三个参数。第一个参数p是坐标,1400是宽度,最后一个参数是文本内容,其中\p是一个回车符 扩大字符间距用\T数字,例......

阅读全文(3215) | 评论:0

Autocad VBA初级教程 (第八课:图层操作)(2006-01-03 07:00:00)

摘要:  先简单介绍两条命令: 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 = "新建图层" Then '如果找到图层名    findlay = 1 '把变量改为1标志着图层已经找到    msgstr = lay0.Name + "已经存在" + vbCrLf    msgstr = msgstr + "图层状态:" + IIf(lay0.LayerOn = True, "打开", "关闭") + vbCrLf    msgstr = msgstr + "图层" + IIf(lay0.Freeze = True, "已经", "没有") + "冻结" + vbCrLf    msgstr = msgstr + "图层" + IIf(lay0.Lock = True, "已经", "没有") + "锁定" + vbCrLf    msgstr = msgstr + "图层颜色号:" + CStr(lay0.Color) + vbCrL......

阅读全文(5231) | 评论:0

Autocad VBA初级教程 (第九课:创建选择集)(2006-01-03 06:59:00)

摘要:  1.在创建对象的同时可以直接引用.以前的例程中已经做过多次了,现在复习一下,看例程:先随机画300个圆,在画圆时直接引用,然后再把这些圆根本大小修改颜色. Sub c300() Dim myselect(0 To 300) As AcadEntity '定义选择集数组Dim pp(0 To 2) As Double '圆心坐标 For i = 0 To 300 '循环300次pp(0) = 3000 * Rnd: pp(1) = 3000 * Rnd: pp(2) = 0 '设置圆心坐标Set myselect(i) = ThisDrawing.ModelSpace.AddCircle(pp, Rnd * 30 + 1) '画不同大小的圆Next i For i = 1 To 300If myselect(i).Radius > 10 Then '判断圆的直径是否大于10 myselect(i).color = Int(255 * Rnd + 1) '大圆颜色改为随机数Else myselect(i).color = 0 '小圆改为白色End IfNext i ZoomExtents '缩放到显示全部对象 End Sub pp(0) = 3000 * Rnd: pp(1) = 3000 * Rnd: pp(2) = 0这一行实际上应该是三条语句,用三行合并为一行,用冒号分开rnd是随机数函数,它的数值为0-1之间的小数,3000*rnd得到的数值就是在0-3000之间的随机数 Set myselect(i) = ThisDrawing.ModelSpace.AddCircle(pp, Rnd * 30 + 1)这条语句的作用是以pp点坐标为圆心,画一个圆,半径是1-30之间的随机数,赋值给myselect选择集. 2.提标用户在屏幕中选取选择语句这样写:Set sset = ThisDrawing.SelectionSets.Add("ss1"),其中”ss1”是一个选择集名称,这个参数可以随意写一个,注意不要重复就可以了.下面的例程是让用户选择对象,然后把选中的对象改为绿色,最后把选择集删除 Sub mysel() Dim sset As AcadSelectionSet '定义选择集对象Dim el......

阅读全文(5418) | 评论:0

AutoCAD中输入特殊字符(2006-01-03 06:35:00)

摘要:  ---- 在进行AutoCAD软件的实际绘图中,我们经常需要输入一些特殊字符,如表示直径的Ф、表示地平面的±等,这些特殊字符无法直接从键盘上输入。AutoCAD软件为这些字符的输入提供了一些简捷的控制码。 ----AutoCAD提供的控制码,均由两个百分号(%%)和一个字母组成,输入这些控制码后,屏幕上并不立即显示它们所代表的特殊符号,只在回车结束本次标注命令之后,控制码才会变成相应的特殊字符。 ----控制码及其相对应的特殊字符见下表所示: 控制码 相应特殊字符及功能%%O 打开或关闭文字上划线功能%%U 打开或关闭文字下划线功能%%D 标注度符号“°”%%P 标注正负号“±”%%C 标注直径“Ф” ----很明显,这些特殊字符的数量远远不能满足我们在进行绘图时的实际需要,有的用户不得不采用从WORD97中粘贴的办法,这样既麻烦又很不方便。实际上,AutoCAD软件从14.0版本起提供了通过“字符映射表”来增加特殊字符的方法,我们完全可以在“字符映射表”中找到所需要的特殊字符。具体操作如下 : ----1. 单击绘图工具栏上的“A”按钮或输入MTEXT(标注多行文本)命令,AutoCAD软件会提示要求用户在屏幕上选择指定文本边框的第一个角点,当指定了文本边框的第一个角点后,向左或向右拖动光标确定了段落文字的分布宽度,而向上或向下拖动光标就确定了文字分布的另一方向。一旦用户建立了文本边框, AutoCAD就会打开【Multiline Text Editor】对话框,我们就可以在此对话框中输入文本,当文本到达定义边框的右边界时,AutoCAD将自动换行。在这个对话框中,我们可以看到右侧四个按钮中有一个是“Symbol”,这就是我们输入特殊字符时所要使用的主要功能按钮。 ----2.单击这个按钮右下角的箭头,打开一个下拉列表,我们可以看到有“Degress %%d”、“Plus/Minus %%p”、“Diameter %%c”、“Non-breaking Space”、“Other”四个选项,选择前三个的某一选项可直接输入“°、±、Φ”符号。 ----3.单击选项“Other”时,可以有更多的选择,AutoCAD 会打开“字符映射表”对话框,该对话框包含更多的符号供用户选用,其当前内容取决于用户在“字体”下拉列表中选择的字体,......

阅读全文(3373) | 评论:0