pengyg1204 发表于 2007-1-24 09:48

好东东啊!先COPY下来再看,呵呵!

wangpiwujing 发表于 2007-1-28 12:31

:) 谢谢,我是菜鸟不是很懂,感觉很好 啊!

yhfsmu 发表于 2007-1-29 00:12

先收藏起来,慢慢看看,谢谢了

设计从零 发表于 2007-1-31 15:50

支持楼主!!!

hellmen 发表于 2007-1-31 16:12

斑竹,还有写好的教程吗?:(

tianyunxuan 发表于 2007-5-26 20:02

Autocad VBA初级教程 (第十二课:参数化设计基础)

简单地讲,参数化设计就是根据参数进行精确绘图,绘图所需要的参数也可以由用户手工输入。真正的参数化设计往往需要数据库操作,为了简化程序,把数据库部分放在以后的课程中详细讲解。

    本课的例程是画一个标准足球场。足球场长度90~120米,宽度45~90米,而红色标注的尺寸是程序默认的,绿色标注固定不变。




Sub court()
Dim courtlay As AcadLayer '定义球场图层
Dim ent As AcadEntity '镜像对象
Dim linep1(0 To 2) As Double '线条端点1
Dim linep2(0 To 2) As Double '线条端点2
Dim linep3(0 To 2) As Double '罚球弧端点1
Dim linep4(0 To 2) As Double '罚球弧端点2
Dim centerp As Variant '中心坐标
xjq = 11000 '小禁区尺寸
djq = 33000 '大禁区尺寸
fqd = 11000 '罚球点位置
fqr = 9150 '罚球弧半径
fqh = 14634.98 '罚球弧弦长
jqqr = 1000 '角球区半径
zqr = 9150 '中圈半径

On Error Resume Next
chang = ThisDrawing.Utility.GetReal("长度(90000~120000)<105000>")
If Err.Number <> 0 Then '用户输入的不是有效数字
chang = 105000
Err.Clear '清除错误
End If
kuan = ThisDrawing.Utility.GetReal("宽度(45000~90000)<68000>")
If Err.Number <> 0 Then
kuan = 68000
End If

centerp = ThisDrawing.Utility.GetPoint(, "定位球场中心:")

Set courtlay = ThisDrawing.Layers.Add("足球场") '设置图层
ThisDrawing.ActiveLayer = courtlay '把当前图层设为足球场图层

'画小禁区
linep1(0) = centerp(0) + chang / 2
linep1(1) = centerp(1) + xjq / 2
linep2(0) = centerp(0) + chang / 2 - xjq / 2
linep2(1) = centerp(1) - xjq / 2
Call drawbox(linep1, linep2) '调用画矩形子程序



'画大禁区
linep1(0) = centerp(0) + chang / 2
linep1(1) = centerp(1) + djq / 2
linep2(0) = centerp(0) + chang / 2 - djq / 2
linep2(1) = centerp(1) - djq / 2
Call drawbox(linep1, linep2)


' 画罚球点
linep1(0) = centerp(0) + chang / 2 - fqd
linep1(1) = centerp(1)
Call ThisDrawing.ModelSpace.AddPoint(linep1)
'ThisDrawing.SetVariable "PDMODE", 32 '点样式
ThisDrawing.SetVariable "PDSIZE", 30 '点的尺寸

'画罚球弧,罚球弧圆心就是罚球点linep1
linep3(0) = centerp(0) + chang / 2 - djq / 2
linep3(1) = centerp(1) + fqh / 2
linep4(0) = linep3(0) '两个端点的x轴相同
linep4(1) = centerp(1) - fqh / 2
ang1 = ThisDrawing.Utility.AngleFromXAxis(linep1, linep3) '计算角度
ang2 = ThisDrawing.Utility.AngleFromXAxis(linep1, linep4)
Call ThisDrawing.ModelSpace.AddArc(linep1, zqr, ang1, ang2) '画弧


'角球弧
ang1 = ThisDrawing.Utility.AngleToReal(90, 0) '角度转换为弧度
ang2 = ThisDrawing.Utility.AngleToReal(180, 0)
linep1(0) = centerp(0) + chang / 2 '角球弧圆心
linep1(1) = centerp(1) - kuan / 2
Call ThisDrawing.ModelSpace.AddArc(linep1, jqqr, ang1, ang2) '画弧

ang1 = ThisDrawing.Utility.AngleToReal(270, 0)
linep1(1) = centerp(1) + kuan / 2
Call ThisDrawing.ModelSpace.AddArc(linep1, jqqr, ang2, ang1)



'镜像轴
linep1(0) = centerp(0)
linep1(1) = centerp(1) - kuan / 2
linep2(0) = centerp(0)
linep2(1) = centerp(1) + kuan / 2

'镜像
For Each ent In ThisDrawing.ModelSpace '所有模型空间的对象进行一次循环
If ent.Layer = "足球场" Then '对象在"足球场"图层中
    ent.Mirror linep1, linep2 '镜像
End If
Next ent

'画中线
Call ThisDrawing.ModelSpace.AddLine(linep1, linep2)

'画中圈
Call ThisDrawing.ModelSpace.AddCircle(centerp, zqr)

'画外框
linep1(0) = centerp(0) - chang / 2
linep1(1) = centerp(1) - kuan / 2
linep2(0) = centerp(0) + chang / 2
linep2(1) = centerp(1) + kuan / 2
Call drawbox(linep1, linep2)

ZoomExtents '显示整个图形

End Sub

Private Sub drawbox(p1, p2) '根据对角线坐标画矩形的子程序
Dim boxp(0 To 14) As Double

boxp(0) = p1(0)
boxp(1) = p1(1)

boxp(3) = p1(0)
boxp(4) = p2(1)

boxp(6) = p2(0)
boxp(7) = p2(1)

boxp(9) = p2(0)
boxp(10) = p1(1)

boxp(12) = p1(0)
boxp(13) = p1(1)

Call ThisDrawing.ModelSpace.AddPolyline(boxp)

End Sub




下面开始分析源码:

On Error Resume Next
chang = ThisDrawing.Utility.GetReal("长度(90~120)<10500>")
If Err.Number <> 0 Then '用户输入的不是有效数字
chang = 10500
Err.Clear '清除错误
End If

    这段代码的作用是要求用户输入一个足球场长度的数字,由于getreal只能输入数字,如果输入其他字符程序就会报错,所以先要用去掉错误提示:On Error Resume Next,虽然错误不再提示,但是出错代码会err.number改变,有兴趣的读者可以用变量跟踪的方法看看这个代码的数值。您只要记住,如果这个数字不是0,那么就是有错了,这时就可以把长度定为默认值,然后用Err.Clear语句把错误代码清零。


    在画小禁区的最后一行这样写:Call drawbox(linep1, linep2)

    Drawbox并不是vba提供的方法,它是一个带参数的子程序。由于画足球场要画好几次矩形,
而vba没有提供一个现成的画矩形方法,如果每次都用一长串代码画矩形是很麻烦的,所以需要把这些麻烦的代码写到一个子程序中,在需要时只有写一条调用语句就行了。这个子程序最后几行,从“Private Sub drawbox(p1, p2) ”开始,到end sub结束,p1,p2是参数,调用时也必须写两个参数:linep1、linep2。


ang1 = ThisDrawing.Utility.AngleFromXAxis(linep1, linep3) '计算角度
ang2 = ThisDrawing.Utility.AngleFromXAxis(linep1, linep4)
Call ThisDrawing.ModelSpace.AddArc(linep1, zqr, ang1, ang2) '画弧

    画圆用addarc方法,需要4个参数:圆心、半径、起始角度、结束角度。AngleFromXAxis用于计算角度,其参数需要两个点坐标

下面看镜像操作:
For Each ent In ThisDrawing.ModelSpace '所有模型空间的对象进行一次循环
If ent.Layer = "足球场" Then '对象在"足球场"图层中
    ent.Mirror linep1, linep2 '镜像
End If
Next ent

    本例只对“足球场”图层中的对象进行镜像,所以要对全部对象进行循环,判断对象的图层属性,只有位于“足球场”图层中的对象才作镜像。


本课思考题:

1、对本课的例程进行修改,当用户输入长、宽不在规定的范围时要求用户重新输入

2、设计一张简单的平面图,用户输入2个参数,其他尺寸写进程序中

[ 本帖最后由 tianyunxuan 于 2007-5-26 20:10 编辑 ]

tianyunxuan 发表于 2007-5-26 20:13

Autocad VBA初级教程 第十三课块操作

定义块方法:

Set blocksobj=ThisDrawing.Blocks.Add(基点, 块名)
把选择集加入块中的方法:
ThisDrawing.CopyObjects(选择集,块)
插入块方法:
ThisDrawing.ModelSpace.InsertBlock(插入点,块名, X轴比例,Y轴比例,Z轴比例, 旋转角度)
画块属性方法:
ThisDrawing.ModelSpace.AddAttribute(文字高度,模式,提示字符, 插入点, 显示字符,默认值)
一共有五种模式,在输入时会有提示,其中最常用的是“acAttributeModeNormal”普通模式


下面的例题是利用属性块画足球场的阵型图。
程序画出一个球员块,然后把块写到用户指定位置,球员号码由程序自动递增,把球员姓名改为用户输入值。画足球场请参阅上一课内容。






编程思路:
1.定义一个空块
2.在块中画一段弧(球服衣领)
3.画多段线,镜像画出球衣
4.画块属性,由于块属性默认的对齐方式是左对齐,而球员号码应该居中,所以必须把块的对齐属性改为居中。但是当这个属性更改时块属性对齐点会自动归零,所以不得不再次更改对齐点属性
5.把多段线和属性复制到块中
6.提示用户点选球员位置和姓名
7.插入块,修改球衣号码属性、球员姓名属性

以下是源码,附有详细的注释,如果有疑问,建议用变量跟踪法研究一下。
Sub team()
Dim playerlay As AcadLayer '定义球员图层
Dim playerblock As AcadBlock '定义块变量
Dim arcc(0 To 2) As Double '圆弧圆心
Dim linep1(0 To 2) As Double '线条端点1
Dim linep2(0 To 2) As Double '线条端点2
Dim pline(0 To 20) As Double '定义队服右侧多段线7个顶点
Dim basep(0 To 2) As Double '块基点
Dim playernumberpoint(0 To 2) As Double '块属性插入点
Dim mytxt As AcadTextStyle '定义mytxt变量为文本样式
Dim blockRef As AcadBlockReference '定义块属性变量
Dim Attr3 As Variant '插入块属性变量

Set playerblock = ThisDrawing.Blocks.Add(basep, "球员") '定义一个"球员"的块

arcc(0) = 0
arcc(1) = 430
Call playerblock.AddArc(arcc, 50, ThisDrawing.Utility.AngleToReal(180, 0), 0) '画弧并加入块中

pline(0) = 0
pline(1) = 20

pline(3) = 100
pline(4) = 20

pline(6) = 100
pline(7) = 250

pline(9) = 125
pline(10) = 207

pline(12) = 212
pline(13) = 257


pline(15) = 112
pline(16) = 430


pline(18) = 50
pline(19) = 430

Set line1 = ThisDrawing.ModelSpace.AddPolyline(pline) '画队服右侧多段线

linep2(1) = 1 '镜像轴第二点位于Y轴上任一点
Set line2 = line1.Mirror(linep1, linep2) '镜像获得另一半多段线

Dim p(0 To 2) As Double '定义坐标变量
Set mytxt = ThisDrawing.TextStyles.Add("mytxt") '添加mytxt样式
mytxt.fontFile = "c:\windows\fonts\simfang.ttf" '设置字体文件为仿宋体
ThisDrawing.ActiveTextStyle = mytxt '将当前文字样式设置为mytxt

playernumberpoint(0) = 0 '块属性位置
playernumberpoint(1) = 200
Set attr1 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "号码", playernumberpoint, "X", 0) '画块属性
attr1.Alignment = 7 '居中
attr1.TextAlignmentPoint = playernumberpoint '重定义对齐点
Set attr2 = ThisDrawing.ModelSpace.AddAttribute(100, acAttributeModeNormal, "姓名", playernumberpoint, "???", 0) '画块属性
attr2.Alignment = 7 '居中


Dim objCollection(0 To 3) As Object '创建选择集
Set objCollection(0) = line1 '线条1加入选择集
Set objCollection(1) = line2 '线条2加入选择集
Set objCollection(2) = attr1 '属性1加入选择集
Set objCollection(3) = attr2 '属性2加入选择集

Call ThisDrawing.CopyObjects(objCollection, playerblock) '把选择集加入块中

For Each element In objCollection '在选择集中进行循环
element.Delete '删除线条和属性(此操作并不影响已创建的块)
Next


Set playerlay = ThisDrawing.Layers.Add("球员") '新建图层
playerlay.color = 2 '为黄色
ThisDrawing.ActiveLayer = playerlay '将当前图层设置为球员图层

Dim p1 As Variant '块插入点位置

For i = 1 To 11 '插入块
pstring = CStr(i) & "号球员位置:"
p1 = ThisDrawing.Utility.GetPoint(, pstring) '点选球员位置坐标
nstring = ThisDrawing.Utility.GetString(30, "球员姓名:")
Set blockRef = ThisDrawing.ModelSpace.InsertBlock(p1, "球员", 1, 1, 1, 0) '插入块
Attr3 = blockRef.GetAttributes '获取块属性
Attr3(0).TextString = CStr(i) '赋值球员号码
Attr3(1).TextString = nstring '赋值球员姓名
Next

End Sub

本课思考题:
1、在本课例程的最后一段增加出错陷阱代码,当用户输入非正常数值时退出程序
2、画一个简易路灯块,用属性块做为路灯编号,由用户点选路灯位置,程序画路灯时自动为路灯编号

trinco 发表于 2007-5-30 09:00

很有帮助!谢谢lz

cgc 发表于 2007-6-7 00:20

终于看好了,写得很不错, 连我从来不写程序的人都能看得懂了

好好学习,感觉函数 方面还有很多的东西不是很懂

有函数库可以查阅么?

买书也行

nebs 发表于 2007-7-8 22:38

偶是菜鸟 还看不懂 还是顶你一下辛苦啦

lianghn1986 发表于 2007-7-9 00:17

头痛呀~~~~~~~~~~~~

pianpi111 发表于 2007-8-10 18:02

auto cad vba第一次听说
学学;P

nebs 发表于 2007-8-17 17:01

顶!! 学习中.....

sod11791 发表于 2007-8-22 09:40

太难了,能学会吗?

kyokula 发表于 2007-8-22 10:17

学VB是不是必须要懂C语言?
页: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14
查看完整版本: Autocad VBA初级教程 (强烈推荐)