你当前的位置>>主页>>AutoCAD知识>>专题教程
 

Autocad VBA初级教程 (第十课:画多段线和样条线)

    画二维多段线语句这样写:
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是用户鼠标点下时的位置,第三个是一段字符串,显示在提示栏。

本教程共13页    第  [1]  [2] [3] [4] [5] [6] [7] [8] [9]  10  [11]  [12]  [13]  页
民众工作室.制作      版权所有