你當(dāng)前的位置>>主頁(yè)>>AutoCAD知識(shí)>>專題教程
 

Autocad VBA初級(jí)教程 (第十課:畫多段線和樣條線)

    畫二維多段線語句這樣寫:
set lobj= ThisDrawing.ModelSpace.AddLightweightPolyline(fitpoint)
AddLightweightPolyline后面需一個(gè)參數(shù),存放頂點(diǎn)坐標(biāo)的數(shù)組

畫三維多段線語句這樣寫:
Set lobj = ThisDrawing.ModelSpace.Add3DPoly(fitpoint)
Add3dpoly后面需一個(gè)參數(shù),就是頂點(diǎn)坐標(biāo)數(shù)組

畫二維樣條線語句這樣寫:
Set lobj = ThisDrawing.ModelSpace.AddSpline(fitPoints,startT, endT)
Addspline后需要三個(gè)參數(shù),第一個(gè)是擬合點(diǎn)數(shù)組,后面兩個(gè)分別是起點(diǎn)切向和終點(diǎn)切向。

下面看例題。這個(gè)程序是第三課例程的改進(jìn)版。原題是這樣的:
繪制三維多段線時(shí)X、Y值在屏幕上用鼠標(biāo)選取,Z值用鍵盤輸入。
細(xì)心的讀者是否還記得這個(gè)小程序已經(jīng)在第三課的回貼中發(fā)布了。先分析一下編程細(xì)路:
用動(dòng)態(tài)數(shù)組存放多段線的所有頂點(diǎn)坐標(biāo),獲得新坐標(biāo)后就把前一次畫的多段線刪除,畫出多段線,并將線段第二點(diǎn)的端點(diǎn)保存為下一條線段的第一個(gè)端點(diǎn)坐標(biāo),以下是源碼:

Sub myl()

Dim p1 As Variant '申明端點(diǎn)坐標(biāo)
Dim p2 As Variant
Dim l() As Double '聲明一個(gè)動(dòng)態(tài)數(shù)組
Dim templ As Object

p1 = ThisDrawing.Utility.GetPoint(, "輸入點(diǎn):") '獲取點(diǎn)坐標(biāo)
z = ThisDrawing.Utility.GetReal("Z坐標(biāo):") '用戶輸入Z坐標(biāo)值
p1(2) = z '將Z坐標(biāo)值賦予點(diǎn)坐標(biāo)中

ReDim l(0 To 2) '定義動(dòng)態(tài)數(shù)組
l(0) = p1(0)
l(1) = p1(1)
l(2) = z

On Error GoTo Err_Control '出錯(cuò)陷井
Do '開始循環(huán)
  p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點(diǎn):") '獲取下一個(gè)點(diǎn)的坐標(biāo)
  z = ThisDrawing.Utility.GetReal("Z坐標(biāo):") '用戶輸入Z坐標(biāo)值
  p2(2) = z '將Z坐標(biāo)值賦予點(diǎn)坐標(biāo)中
 
  lub = UBound(l) '獲取當(dāng)前l(fā)數(shù)組中元的元素個(gè)數(shù)
  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 '將第二點(diǎn)的端點(diǎn)保存為下一條直線的第一個(gè)端點(diǎn)坐標(biāo)
Loop
Err_Control:

End Sub


我們學(xué)一學(xué)動(dòng)態(tài)數(shù)組,這是非常有用的。所謂動(dòng)態(tài)數(shù)組,簡(jiǎn)單講就是數(shù)組元素可以改變的特殊數(shù)組。
這樣定義數(shù)組:Dim l( ) As Double
賦值語句:
ReDim l(0 To 2)
l(0) = p1(0)
l(1) = p1(1)
l(2) = z
重新定義數(shù)組元素語句:
  lub = UBound(l) '先要獲取當(dāng)前l(fā)數(shù)組中元的元素個(gè)數(shù),用ubount函數(shù)計(jì)算。
  ReDim Preserve l(lub + 3)
重定義時(shí)數(shù)組中要加三個(gè)元素,用以存放坐標(biāo)值,所以定義元素為lub+3。給數(shù)值賦值的語句是一樣的。

再看畫多段線語句:
Set templ = ThisDrawing.ModelSpace.Add3DPoly(l) '畫多段線
在最后面括號(hào)中的l就是存放點(diǎn)坐標(biāo)的動(dòng)態(tài)數(shù)組,這條語句在畫多段線的同時(shí)把多段線作為對(duì)象賦值給templ 變量,這樣下面的刪除語句就可以直接引用這個(gè)變量了。

刪除語句:
templ.Delete
因?yàn)橐呀?jīng)知道對(duì)象是templ,所以只要在對(duì)象后面用delete方法就可以了。

下面的例程更加實(shí)用些,它的功能是把樣條線轉(zhuǎn)化為多段線。編程思路:用戶選擇一根樣條線,計(jì)算樣條線的擬合點(diǎn),然后把所有的擬合點(diǎn)存放到數(shù)組中,最后用這個(gè)數(shù)組畫多段線。

Sub sp2pl()

Dim getsp As Object ‘獲取樣條線的變量
Dim newl() As Double ‘多段線數(shù)組

Dim p1 As Variant ‘獲得擬合點(diǎn)點(diǎn)坐標(biāo)

ThisDrawing.Utility.GetEntity getsp, po, "本程序?qū)訔l曲線轉(zhuǎn)為多段線。請(qǐng)選擇樣條曲線"

sumctrl = getsp.NumberOfControlPoints ‘計(jì)算樣條線中一共有多少擬合點(diǎn)

ReDim newl(0 To sumctrl * 3 - 1) ‘重定義數(shù)組
 
  For i = 0 To sumctrl - 1 ‘開始循環(huán),
  p1 = getsp.GetControlPoint(i) ‘把擬合點(diǎn)坐標(biāo)存到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, "本程序?qū)訔l曲線轉(zhuǎn)為多段線。請(qǐng)選擇樣條曲線"
ThisDrawing.Utility.GetEntity 后面需要三個(gè)參數(shù):
第一個(gè)getsp用于存放獲得用戶選擇的對(duì)象變量,第二個(gè)po是用戶鼠標(biāo)點(diǎn)下時(shí)的位置,第三個(gè)是一段字符串,顯示在提示欄。

本教程共13頁(yè)    第  [1]  [2] [3] [4] [5] [6] [7] [8] [9]  10  [11]  [12]  [13]  頁(yè)
民眾工作室.制作      版權(quán)所有