Autocad二次开发vba教程第十课

来源:互联网 发布:linux服务器搭建教程 编辑:程序博客网 时间:2024/06/06 12:51
 第十课:画多段线和样条线

画二维多段线语句这样写:
set lobj= ThisDrawing.ModelSpace.AddLightweightPolyline(fitpoint)
AddLightweightPolyline后面需一个参数,存放顶点坐标的数组

画三维多段线语句这样写:
Set lobj = ThisDrawing.ModelSpace.Add3DPoly(fitpoint)
Add3dpoly后面需一个参数,就是顶点坐标数组

画二维样条线语句这样写:
Set lobj = ThisDrawing.ModelSpace.AddSpline(fitPoints,startT, endT)
Addspline后需要三个参数,第一个是拟合点数组,后面两个分别是起点切向和终点切向。

下面看例题。这个程序是第三课例程的改进版。原题是这样的:
绘制三维多段线时X、Y值在屏幕上用鼠标选取,Z值用键盘输入。
细心的读者是否还记得这个小程序已经在第三课的回贴中发布了。先分析一下编程细路:
用动态数组存放多段线的所有顶点坐标,获得新坐标后就把前一次画的多段线删除,画出多段线,并将线段第二点的端点保存为下一条线段的第一个端点坐标,以下是源码:

Sub myl()

Dim p1 As Variant '申明端点坐标
Dim p2 As Variant
Dim l() As Double '声明一个动态数组
Dim templ As Object

p1 = ThisDrawing.Utility.GetPoint(, "输入点:") '获取点坐标
z = ThisDrawing.Utility.GetReal("Z坐标:") '用户输入Z坐标值
p1(2) = z '将Z坐标值赋予点坐标中

ReDim l(0 To 2) '定义动态数组
l(0) = p1(0)
l(1) = p1(1)
l(2) = z

On Error GoTo Err_Control '出错陷井
Do '开始循环
p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "输入下一点:") '获取下一个点的坐标
z = ThisDrawing.Utility.GetReal("Z坐标:") '用户输入Z坐标值
p2(2) = z '将Z坐标值赋予点坐标中

lub = UBound(l) '获取当前l数组中元的元素个数
ReDim Preserve l(lub + 3)
For i = 1 To 3
    l(lub + i) = p2(i - 1)
Next i
If lub > 3 Then
    templ.Delete '删除前一次画的多段线
End If
Set templ = ThisDrawing.ModelSpace.Add3DPoly(l) '画多段线
p1 = p2 '将第二点的端点保存为下一条直线的第一个端点坐标
Loop
Err_Control:

End Sub


我们学一学动态数组,这是非常有用的。所谓动态数组,简单讲就是数组元素可以改变的特殊数组。
这样定义数组:Dim l( ) As Double
赋值语句:
ReDim l(0 To 2)
l(0) = p1(0)
l(1) = p1(1)
l(2) = z
重新定义数组元素语句:
lub = UBound(l) '先要获取当前l数组中元的元素个数,用ubount函数计算。
ReDim Preserve l(lub + 3)
重定义时数组中要加三个元素,用以存放坐标值,所以定义元素为lub+3。给数值赋值的语句是一样的。

再看画多段线语句:
Set templ = ThisDrawing.ModelSpace.Add3DPoly(l) '画多段线
在最后面括号中的l就是存放点坐标的动态数组,这条语句在画多段线的同时把多段线作为对象赋值给templ 变量,这样下面的删除语句就可以直接引用这个变量了。

删除语句:
templ.Delete
因为已经知道对象是templ,所以只要在对象后面用delete方法就可以了。

下面的例程更加实用些,它的功能是把样条线转化为多段线。编程思路:用户选择一根样条线,计算样条线的拟合点,然后把所有的拟合点存放到数组中,最后用这个数组画多段线。

Sub sp2pl()

Dim getsp As Object ‘获取样条线的变量
Dim newl() As Double ‘多段线数组

Dim p1 As Variant ‘获得拟合点点坐标

ThisDrawing.Utility.GetEntity getsp, po, "本程序将样条曲线转为多段线。请选择样条曲线"

sumctrl = getsp.NumberOfControlPoints ‘计算样条线中一共有多少拟合点

ReDim newl(0 To sumctrl * 3 - 1) ‘重定义数组

For i = 0 To sumctrl - 1 ‘开始循环,
p1 = getsp.GetControlPoint(i) ‘把拟合点坐标存到p1变量中
      For j = 0 To 2
    newl(i * 3 + j) = p1(j)
Next j

Next i
Set templ = ThisDrawing.ModelSpace.Add3DPoly(newl) ‘画样条线

End Sub

下面的语句是让用户选择样条线:
ThisDrawing.Utility.GetEntity getsp, po, "本程序将样条曲线转为多段线。请选择样条曲线"
ThisDrawing.Utility.GetEntity 后面需要三个参数:
第一个getsp用于存放获得用户选择的对象变量,第二个po是用户鼠标点下时的位置,第三个是一段字符串,显示在提示栏。

原创粉丝点击