AutoCAD 二次开发 VBA 基础与实例.docx
《AutoCAD 二次开发 VBA 基础与实例.docx》由会员分享,可在线阅读,更多相关《AutoCAD 二次开发 VBA 基础与实例.docx(151页珍藏版)》请在冰豆网上搜索。
AutoCAD二次开发VBA基础与实例
AutoCAD2014二次开发VBA基础与实例
第一集AutoCAD二次开发介绍
第二集AutoCADVBA创建直线1
我们在用VBA在AutoCAD中完成预期的操作时,需要调用VBA提供的类或方法。
这就要求我们了解vba的基本语法结构。
其实vba和vb的语法结构基本相同,如果学习过vb程序设计语言的话,那么对vba的语言结构就不会陌生,如果没有学过那么,我会逐步给大家来讲解vba的语法结构。
其实如果没有学过vb语言,就直接学习vba也没有问题。
当然我们也不提倡为了学习vba而去学习vb程序设计语言,因为没有必要,直接学习vba发而不会受到vb的影响,他们毕竟还是有一些差别的。
我们先来看一个简单的应用:
Vba语法讲解:
DimpsAsVariant'定义变量类型,在vba中使用变量前一定要先定义
Dimpt1(0To2)AsDoubleDimpt2
(2)AsDouble两种定义数组的方法
CAD中的点可以用数组来表示,数组中的三个值分别为x、y、z
PublicSubLineDemo()
Dimpt1(0To2)AsDouble'定义起点
Dimpt2
(2)AsDouble'定义终点
pt1(0)=0:
pt1
(1)=0:
pt1
(2)=0
pt2(0)=100:
pt2
(1)=100:
pt2
(2)=0
DimobjLineAsAcadLine
SetobjLine=ThisDrawing.ModelSpace.AddLine(pt1,pt2)
EndSub
第三集AutoCADVBA创建直线2
上面的过程可以在模型空间内画出一条指定起点和终点的直线,但是如果指定的不是起点和终点,那该怎么办呢,我们可以通过相关的函数将其转换成起点和终点的形式,也可以自定义函数来实现相应的操作。
我们看到了上面过程的最后一个表达式很长,自定义函数可减少这种代码的书写,当然,如果你是初学AutoCADVBA编程的话,我建议还是尽量多些这些长的代码,因为他可以帮助你理解AutoCADVBA中各种对象和方法以至属性之间的关系。
那么过程和函数之间有什么区别呢?
我们用关键字Sub定义的一段代码为过程,而用关键字Function定义的一段代码为函数,过程和函数都可实现一定的功能或者操作。
过程没有返回值,而函数可以有返回值,这样就可将一长段代码其中的部分功能用函数封装起来。
这样做的好处是,使得代码的可读性更强,代码看起来更简练,同时如果多个功能代码都有相同的部分,则可以减少书写的次数。
下面我们根据四种不同的情况来分别写出相应的函数:
'根据起点和终点创建直线
PublicFunctionAddLine(ByValptStAsVariant,ByValptEnAsVariant)AsAcadLine
SetAddLine=ThisDrawing.ModelSpace.AddLine(ptSt,ptEn)
EndFunction
第四集AutoCADVBA创建直线2
'根据起点和终点的坐标创建直线
PublicFunctionAddlineXY(ByValx1AsDouble,ByValy1AsDouble,ByValx2AsDouble,ByValy2AsDouble)AsAcadLine
Dimpt1
(2)AsDouble
Dimpt2
(2)AsDouble
pt1(0)=x1:
pt1
(1)=y1:
pt1
(2)=0'注意不要忘记给数组的最后一个变量赋值
pt2(0)=x2:
pt2
(1)=y2:
pt2
(2)=0
SetAddlineXY=ThisDrawing.ModelSpace.AddLine(pt1,pt2)
EndFunction
'根据起点和相对起点的直角坐标创建直线
PublicFunctionAddLineReXY(ByValptStAsVariant,ByValxAsDouble,ByValyAsDouble)AsAcadLine
DimptEn
(2)AsDouble
ptEn(0)=ptSt(0)+x:
ptEn
(1)=ptSt
(1)+y:
ptEn
(2)=0
SetAddLineReXY=ThisDrawing.ModelSpace.AddLine(ptSt,ptEn)
EndFunction
'根据起点和相对极坐标创建直线
PublicFunctionAddLineReAL(ByValptStAsVariant,ByValangleAsDouble,ByValdistAsDouble)AsAcadLine
DimptEn
(2)AsDouble
ptEn(0)=ptSt(0)+dist*Cos(angle)
ptEn
(1)=ptSt
(1)+dist*Sin(angle)
ptEn
(2)=ptSt
(2)
SetAddLineReAL=ThisDrawing.ModelSpace.AddLine(ptSt,ptEn)
EndFunction
上面的些函数可以为我们作为我们以后书写代码的基础
第五集AutoCADVBA创建多段线
再将创建多段线之前,我们先看一下多段线和轻量多段线的区别,如果你是创建二维图形,那么在用VBA创建时,只有坐标的参数有区别,轻量多段线只有x、y两个坐标值,而多段线则有x、y、x三个坐标值。
下面我们先看一下如何通过代码来创建多段线和轻量多段线。
'创建多段线
PublicSubPolyLineDemo()
DimptArr(8)AsDouble
ptArr(0)=100:
ptArr
(1)=100:
ptArr
(2)=0
ptArr(3)=200:
ptArr(4)=200:
ptArr(5)=0
ptArr(6)=100:
ptArr(7)=200:
ptArr(8)=0
If(UBound(ptArr)+1)Mod3<>0Then
MsgBox"数组元素个数不匹配"
ExitSub
EndIf
DimobjPolyLineAsAcadPolyline
SetobjPolyLine=ThisDrawing.ModelSpace.AddPolyline(ptArr)
EndSub
'创建轻量多段线
PublicSubLWPolyLineDemo()
DimptArr(5)AsDouble
ptArr(0)=100:
ptArr
(1)=100:
ptArr
(2)=200:
ptArr(3)=200:
ptArr(4)=100:
ptArr(5)=200:
If(UBound(ptArr)+1)Mod2<>0Then
MsgBox"数组元素个数不匹配"
ExitSub
EndIf
DimobjPolyLineAsAcadLWPolyline
SetobjPolyLine=ThisDrawing.ModelSpace.AddLightWeightPolyline(ptArr)
EndSub
通过上面的代码我们可以创建多段线和轻量多段线,两者的区别仅在z轴坐标上。
如果我们要改变线的宽度那该怎么办呢?
可以通过改变相应的属性,最后调用update方法来实现。
objPolyLine.ConstantWidth=0.5
objPolyLine.Update
objPolyLine.Closed=True
当然我们也可以像上一集那样通过封装直线来封装多线,通过起点终点、或起点坐标终点坐标来实现多线的创建,但是通常在创建多线时,线的点数是不确定的,所以那样封装的意义就不是很大了。
那么如何在多线中包含圆弧,我们留到后面的章节来讲。
第六集AutoCADVBA创建圆1
在AutoCAD2014中,系统为我们提供了6种画圆的方法,而在AutoCADVBA中,程序只提供了一种方法即AddCircle,在实际应用中可能要用到多种创建圆的方法,那么如何在VBA中也能像CAD实现多种方法来创建圆。
首先我们看一下在VBA中如何创建一个简单的圆
'通过圆心和半径创建圆
PublicSubCircleDemo()
DimptCen
(2)AsDouble
DimradiusAsDouble
DimobjCircleAsAcadCircle
ptCen(0)=100:
ptCen
(1)=100:
ptCen
(2)=0
radius=50
SetobjCircle=ThisDrawing.ModelSpace.AddCircle(ptCen,radius)
EndSub
我们也可以像创建直线那样来封装对圆的创建。
我们来看前面4种对圆的封装
'通过圆心和半径创建圆
PublicFunctionAddCircle(ByValptCenAsVariant,ByValradiusAsDouble)AsAcadCircle
SetAddCircle=ThisDrawing.ModelSpace.AddCircle(ptCen,radius)
EndFunction
'通过圆心和直径创建圆
PublicFunctionAddCircleCD(ByValptCenAsVariant,ByValdiameterAsDouble)AsAcadCircle
SetAddCircleCD=ThisDrawing.ModelSpace.AddCircle(ptCen,diameter/2)
EndFunction
'通过两点创建圆,两点为圆的直径上的两个点
PublicFunctionAddCircle2P(ByValpt1AsVariant,pt2AsVariant)AsAcadCircle
DimptCen
(2)AsDouble
DimradiusAsDouble
ptCen(0)=(pt1(0)+pt2(0))/2
ptCen
(1)=(pt1
(1)+pt2
(1))/2
ptCen
(2)=(pt1
(2)+pt2
(2))/2
radius=Sqr((pt1(0)-pt2(0))^2+(pt1
(1)-pt2
(1))^2)/2
SetAddCircle2P=ThisDrawing.ModelSpace.AddCircle(ptCen,radius)
EndFunction
第七集AutoCADVBA创建圆2
'通过三点创建圆
'三点如果在一条直线上,则无法创建圆,这里我们先不考虑这种情况
'通过几何的知识来找出圆心,垂直平分线
PublicFunctionAddCircle3P(ByValpt1AsVariant,ByValpt2AsVariant,ByValpt3AsVariant)AsAcadCircle
DimptCenAsVariant
Dimpt12
(2)AsDouble
Dimpt23
(2)AsDouble
DimradiusAsDouble
'两条直线的起点坐标
pt12(0)=(pt1(0)+pt2(0))/2
pt12
(1)=(pt1
(1)+pt2
(1))/2
pt12
(2)=(pt1
(2)+pt2
(2))/2
pt23(0)=(pt2(0)+pt3(0))/2
pt23
(1)=(pt2
(1)+pt3
(1))/2
pt23
(2)=(pt2
(2)+pt3
(2))/2
Dimline12,line23,line12z,line23zAsAcadLine
Setline12=ThisDrawing.ModelSpace.AddLine(pt1,pt2)
Setline23=ThisDrawing.ModelSpace.AddLine(pt2,pt3)
Dimangle1,angle2AsDouble
angle1=line12.angle+1.570793
angle2=line23.angle+1.570793
Setline12z=AddLineReAL(pt12,angle1,100)
Setline23z=AddLineReAL(pt23,angle2,100)
ptCen=line12z.IntersectWith(line23z,acExtendBoth)
radius=Sqr((pt1(0)-ptCen(0))^2+(pt1
(1)-ptCen
(1))^2)
SetAddCircle3P=ThisDrawing.ModelSpace.AddCircle(ptCen,radius)
EndFunction
第八集AutoCADVBA循环语句
第九集AutoCADVBA创建圆弧1
在AutoCAD2014中,系统为我们提供了11种绘制圆弧的方法,但是在AutoCADVBA中,同样只提供了一种创建圆弧的方法,即AddArc。
而在通常的程序设计中我们可能会用到多种的圆弧创建方法,这就需要对基本的方法进行扩展。
这里我们封装6种方法
下面我们先来看一个简单的圆w弧创建实例
'通过基本方法创建圆弧
PublicSubArcDemo()
DimptCen
(2)AsDouble
DimradiusAsDouble
DimstAngAsDouble
DimenAngAsDouble
ptCen(0)=100:
ptCen
(1)=100:
ptCen
(2)=0
radius=200
stAng=0.1745329
enAng=2.0943948
DimobjArcAsAcadArc
SetobjArc=ThisDrawing.ModelSpace.AddArc(ptCen,radius,stAng,enAng)
EndSub
'通过圆心,半径,起始角度和终止角度创建圆弧
PublicFunctionAddArc(ByValptCenAsVariant,ByValradiusAsDouble,ByValstAngAsDouble,ByValenAngAsDouble)AsAcadArc
SetAddArc=ThisDrawing.ModelSpace.AddArc(ptCen,radius,stAng,enAng)
EndFunction
'通过圆心,起点和端点创建圆弧
'在创建圆时我们通过图元对象的属性了获得我们需要的信息
'这里我们通过utility对象来获取相关的信息
PublicFunctionAddArcCSN(ByValptCenAsVariant,ByValptStAsVariant,ByValptNodeAsVariant)AsAcadArc
DimradiusAsDouble
DimstAngAsDouble
DimenAngAsDouble
radius=Sqr((ptSt(0)-ptCen(0))^2+(ptSt
(1)-ptCen
(1))^2)
stAng=ThisDrawing.Utility.AngleFromXAxis(ptCen,ptSt)
enAng=ThisDrawing.Utility.AngleFromXAxis(ptCen,ptNode)
SetAddArcCSN=ThisDrawing.ModelSpace.AddArc(ptCen,radius,stAng,enAng)
EndFunction
第十集AutoCADVBA创建圆弧2
'通过圆心,起点和圆弧的角度创建圆弧
PublicFunctionAddArcCSA(ByValptCenAsVariant,ByValptStAsVariant,ByValangleAsDouble)AsAcadArc
DimradiusAsDouble
DimstAngAsDouble
DimenAngAsDouble
radius=Sqr((ptSt(0)-ptCen(0))^2+(ptSt
(1)-ptCen
(1))^2)
stAng=ThisDrawing.Utility.AngleFromXAxis(ptCen,ptSt)
enAng=stAng+angle
SetAddArcCSA=ThisDrawing.ModelSpace.AddArc(ptCen,radius,stAng,enAng)
EndFunction
'通过圆心,起点和弦长创建圆
'tanα·cotα=1sinα·cscα=1cosα·secα=1
'商的关系:
sinα/cosα=tanα=secα/cscαcosα/sinα=cotα=cscα/secα
'平方关系:
sin^2(α)+cos^2(α)=11+tan^2(α)=sec^2(α)1+cot^2(α)=csc^2(α)
PublicFunctionAddArcCSC(ByValptCenAsVariant,ByValptStAsVariant,ByValchordLengthAsDouble)AsAcadArc
DimradiusAsDouble
DimstAngAsDouble
DimenAngAsDouble
radius=Sqr((ptSt(0)-ptCen(0))^2+(ptSt
(1)-ptCen
(1))^2)
stAng=ThisDrawing.Utility.AngleFromXAxis(ptCen,ptSt)
enAng=stAng+Atn(((chordLength/2)/radius)/Sqr(1-((chordLength/2)/radius)^2))*2
SetAddArcCSC=ThisDrawing.ModelSpace.AddArc(ptCen,radius,stAng,enAng)
EndFunction
'通过圆心,起点和弧长来创建圆
PublicFunctionAddArcCSAL(ByValptCenAsVariant,ByValptStAsVariant,ByValarcLengthAsDouble)AsAcadArc
DimradiusAsDouble
DimstAngAsDouble
DimenAngAsDouble
radius=Sqr((ptSt(0)-ptCen(0))^2+(ptSt
(1)-ptCen
(1))^2)
stAng=ThisDrawing.Utility.AngleFromXAxis(ptCen,ptSt)
enAng=stAng+arcLength/radius
SetAddArcCSAL=ThisDrawing.ModelSpace.AddArc(ptCen,radius,stAng,enAng)
EndFunction
'通过三点来创建圆弧
PublicFunctionAddArc3P(ByValpt1AsVariant,ByValpt2AsVariant,ByValpt3AsVariant)AsAcadArc
DimptCenAsVariant
DimradiusAsDouble
DimstAngAsDouble
DimenAngAsDouble
Dimpt12
(2)AsDouble
Dimpt23
(2)AsDouble
pt12(0)=(pt1(0)+pt2(0))/2
pt12
(1)=(pt1
(1)+pt2
(1))/2
pt12
(2)=(pt1
(2)+pt2
(2))/2
pt23(0)=(pt2(0)+pt3(0))/2
pt23
(1)=(pt2
(1)+pt3
(1))/2
pt23
(2)=(pt2
(2)+pt3
(2))/2
Dimangle1AsDouble
Dimangle2AsDouble
angle1=ThisDrawing.Utility.AngleFromXAxis(pt1,pt2)+1.570793
angle2=ThisDrawing.Utility.AngleFromXAxis(pt2,pt3)+1.570793
Dimline12zAsAcadLine
Dimline23zAsAcadLine
Setline12z=AddLineReAL(pt12,angle1,100)
Setline23z=AddLineReAL(pt23,angle2,100)
ptCen=line12z.IntersectWith(line23z,acExtendBoth)
line12z.Delete:
line23z.Delete
radius=Sqr((pt1(0)-ptCen(0))^2+(pt1
(1)-ptCen
(1))^2)
stAng=ThisDrawing.Utility.AngleFromXAxis(ptCen,pt1)
enAng=ThisDrawing.Utility.AngleFromXAxis(ptCen,pt3)
SetAddArc3P=ThisDrawing.ModelSpace.AddArc(ptCen,radius,stAng,enAng)
EndFunction
'通过起点和极坐标创建直线
PublicFunctionAddLineReAL(ByValptStAsVariant,ByValangleAs