ahlzl 发表于 2004-6-9 22:50:24

[教学]:VBA新手入门学堂:从头开始学习VBA

如果您对VBA完全是外行,来这吧,你不会失望的!


我觉得学VBA(或其他程序),“任务驱动法”是最有效的!写出一个程序就能进一步。

第一课:用VBA画圆。

http://www.xdcad.net/bbstech/develop/vba/ahlzl/vba1.swf

ahlzl 发表于 2004-6-9 23:11:44

代码

Sub vba1()
'我的第一个VBA程序——画一个圆。

'先定圆心坐标
Dim cen(2) As Double
cen(0) = 100: cen(1) = 200: cen(2) = 0            '这就是圆心的坐标

'再定半径
Dim R As Double
R = 300                                           '这就是半径

'有了圆心和半径就可以画圆了!
Dim C As AcadCircle
Set C = ThisDrawing.ModelSpace.AddCircle(cen, R) '在“当前文档”的“模型空间”里“画圆”

ZoomExtents
End Sub

从代码中可以看出,VBA中是通过“圆心cen(2)”和“半径R”来画圆的。因此,要先给圆心、半径“赋值”,而“赋值”前,要先对相应的变量进行“声明”。

ahlzl 发表于 2004-6-11 22:11:14

如果能看懂上述代码,那下面的代码都不难理解了。
Sub vba2()

'画一个蓝色的圆。
Dim cen(2) As Double
cen(0) = 100: cen(1) = 200: cen(2) = 0
Dim R As Double
R = 300
Dim C As AcadCircle
Set C = ThisDrawing.ModelSpace.AddCircle(cen, R) '在“当前文档”的“模型空间”里“画圆”
C.color = acBlue                                 '将圆的颜色设为蓝色

'画一条红色的直线
Dim sp(2) As Double, ep(2) As Double
sp(0) = 0: sp(1) = 0: sp(2) = 0
ep(0) = 300: ep(1) = 400: ep(2) = 0
Dim L As AcadLine
Set L = ThisDrawing.ModelSpace.AddLine(sp, ep)    '根据“起点”和“终点”画直线
L.color = acRed                                 '将直线的颜色设为红色


'画一圆弧,用现成的变量
pi = 3.1415926535
Dim A As AcadArc
Set A = ThisDrawing.ModelSpace.AddArc _
(sp, R, 30 * pi / 180, 150 * pi / 180)         '根据圆心、半径、起始角、终止角画圆弧
A.Lineweight = acLnWt030                         '将圆弧的线宽设为0.3mm
A.Update                                       '刷新,显示线宽

'过点(800,150),(120,240),(320,600),(350,720)画一二维多段线,并闭合。
Dim po(9) As Double
po(0) = 800: po(1) = 150: po(2) = 120: po(3) = 240
po(4) = 320: po(5) = 600: po(6) = 350: po(7) = 720
Dim PL As AcadLWPolyline
Set PL = ThisDrawing.ModelSpace.AddLightWeightPolyline(po)
PL.Closed = True                                 '使多段线闭合

ZoomExtents                                    '范围缩放
End Sub

说明:画圆弧时,起始角和终止角分别为30度和150度,但VBA中的角度变量应为弧度,故应进行转化,把度化为弧度。

ahlzl 发表于 2004-6-11 22:21:45

在更多的情况下,点的坐标和距离值要由用户输入。
下面我们来画一直线,两端点坐标由用户输入,再画一个圆,圆心在所画直线的起点,半径也由用户来输入。
Sub vba3()

'画直线
Dim sp As Variant, ep As Variant
sp = ThisDrawing.Utility.GetPoint(, "请输入直线的起点:")
ep = ThisDrawing.Utility.GetPoint(sp, "请输入直线的终点:")
Dim L As AcadLine
Set L = ThisDrawing.ModelSpace.AddLine(sp, ep)    '根据“起点”和“终点”画直线

'画一圆
Dim rAs Double
r = ThisDrawing.Utility.GetDistance(sp, "请输入半径")
Dim C As AcadCircle
Set C = ThisDrawing.ModelSpace.AddCircle(sp, r)

ZoomExtents                                    '范围缩放
End Sub

ahlzl 发表于 2004-6-11 22:44:17

VBA是通过ActiveX方法和CAD交互。此外,还可使用SendCommand方法,和AutoLisp中的command函数很相似。

Sub vba4()
'VBA代码
'以(100,200)为圆心,500为半径画圆。
ThisDrawing.SendCommand ("circle" + vbCr + "100,200" + vbCr + "500" + vbCr)
End Sub

(defun c:cc()
;AutoLisp代码
(command "circle" "100,200" "" "500" "")
)

ahlzl 发表于 2004-6-11 23:23:21

一想到赋值,长不大的斑竹就觉得VBA代码的可读性要优于LISP。
如x=(a+b)/2,
;LISP代码
(setq x (/ (+ a b) 2))

'VBA代码
x = (a + b) / 2
越是复杂的赋值语句,VBA代码可读性好的优点就越突出。

ahlzl 发表于 2004-6-12 13:06:39

第3贴中的二维多段线,在VBA中有两种:AcadLWPolyline和AcadPolyline,分别用AddLightweightPolyline方法和AddPolyline方法创建。
Sub Example_AddPolyline()
   
    Dim plineObj As AcadPolyline
    Dim points(0 To 14) As Double
   
    points(0) = 1: points(1) = 1: points(2) = 0
    points(3) = 1: points(4) = 2: points(5) = 0
    points(6) = 2: points(7) = 2: points(8) = 0
    points(9) = 3: points(10) = 2: points(11) = 0
    points(12) = 4: points(13) = 4: points(14) = 0
      
    Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)
      
End Sub
Sub Example_AddLightWeightPolyline()

    Dim plineObj As AcadLWPolyline
    Dim points(0 To 9) As Double
   
    points(0) = 1: points(1) = 1
    points(2) = 1: points(3) = 2
    points(4) = 2: points(5) = 2
    points(6) = 3: points(7) = 2
    points(8) = 4: points(9) = 4
      
    Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)

End Sub

ahlzl 发表于 2004-6-17 22:48:37

学了一段时间,要测验一下……

出个题目:画一个三角形和它的三条中线,要求三角形的三个角点由用户输入,三角形和其中线由程序自动生成。

哦,还有一难点的附加题:画一个三角形和它的三条角平分线,要求三角形的三个角点由用户输入,三角形和其角平分线由程序自动生成。
页: [1]
查看完整版本: [教学]:VBA新手入门学堂:从头开始学习VBA