Autocad VBA初級教程 (第十課:畫多段線和樣條線)
畫二維多段線語句這樣寫:
set lobj= ThisDrawing.ModelSpace.AddLightweightPolyline(fitpoint)
AddLightweightPolyline后面需一個參數(shù),存放頂點坐標(biāo)的數(shù)組
畫三維多段線語句這樣寫:
Set lobj = ThisDrawing.ModelSpace.Add3DPoly(fitpoint)
Add3dpoly后面需一個參數(shù),就是頂點坐標(biāo)數(shù)組
畫二維樣條線語句這樣寫:
Set lobj = ThisDrawing.ModelSpace.AddSpline(fitPoints,startT, endT)
Addspline后需要三個參數(shù),第一個是擬合點數(shù)組,后面兩個分別是起點切向和終點切向。
下面看例題。這個程序是第三課例程的改進版。原題是這樣的:
繪制三維多段線時X、Y值在屏幕上用鼠標(biāo)選取,Z值用鍵盤輸入。
細心的讀者是否還記得這個小程序已經(jīng)在第三課的回貼中發(fā)布了。先分析一下編程細路:
用動態(tài)數(shù)組存放多段線的所有頂點坐標(biāo),獲得新坐標(biāo)后就把前一次畫的多段線刪除,畫出多段線,并將線段第二點的端點保存為下一條線段的第一個端點坐標(biāo),以下是源碼:
Sub myl()
Dim p1 As Variant '申明端點坐標(biāo)
Dim p2 As Variant
Dim l() As Double '聲明一個動態(tài)數(shù)組
Dim templ As Object
p1 = ThisDrawing.Utility.GetPoint(, "輸入點:") '獲取點坐標(biāo)
z = ThisDrawing.Utility.GetReal("Z坐標(biāo):") '用戶輸入Z坐標(biāo)值
p1(2) = z '將Z坐標(biāo)值賦予點坐標(biāo)中
ReDim l(0 To 2) '定義動態(tài)數(shù)組
l(0) = p1(0)
l(1) = p1(1)
l(2) = z
On Error GoTo Err_Control '出錯陷井
Do '開始循環(huán)
p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點:") '獲取下一個點的坐標(biāo)
z = ThisDrawing.Utility.GetReal("Z坐標(biāo):") '用戶輸入Z坐標(biāo)值
p2(2) = z '將Z坐標(biāo)值賦予點坐標(biāo)中
lub = UBound(l) '獲取當(dāng)前l(fā)數(shù)組中元的元素個數(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 '將第二點的端點保存為下一條直線的第一個端點坐標(biāo)
Loop
Err_Control:
End Sub
我們學(xué)一學(xué)動態(tài)數(shù)組,這是非常有用的。所謂動態(tài)數(shù)組,簡單講就是數(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ù)組中元的元素個數(shù),用ubount函數(shù)計算。
ReDim Preserve l(lub + 3)
重定義時數(shù)組中要加三個元素,用以存放坐標(biāo)值,所以定義元素為lub+3。給數(shù)值賦值的語句是一樣的。
再看畫多段線語句:
Set templ = ThisDrawing.ModelSpace.Add3DPoly(l) '畫多段線
在最后面括號中的l就是存放點坐標(biāo)的動態(tài)數(shù)組,這條語句在畫多段線的同時把多段線作為對象賦值給templ 變量,這樣下面的刪除語句就可以直接引用這個變量了。
刪除語句:
templ.Delete
因為已經(jīng)知道對象是templ,所以只要在對象后面用delete方法就可以了。
下面的例程更加實用些,它的功能是把樣條線轉(zhuǎn)化為多段線。編程思路:用戶選擇一根樣條線,計算樣條線的擬合點,然后把所有的擬合點存放到數(shù)組中,最后用這個數(shù)組畫多段線。
Sub sp2pl()
Dim getsp As Object ‘獲取樣條線的變量
Dim newl() As Double ‘多段線數(shù)組
Dim p1 As Variant ‘獲得擬合點點坐標(biāo)
ThisDrawing.Utility.GetEntity getsp, po, "本程序?qū)訔l曲線轉(zhuǎn)為多段線。請選擇樣條曲線"
sumctrl = getsp.NumberOfControlPoints ‘計算樣條線中一共有多少擬合點
ReDim newl(0 To sumctrl * 3 - 1) ‘重定義數(shù)組
For i = 0 To sumctrl - 1 ‘開始循環(huán),
p1 = getsp.GetControlPoint(i) ‘把擬合點坐標(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)為多段線。請選擇樣條曲線"
ThisDrawing.Utility.GetEntity 后面需要三個參數(shù):
第一個getsp用于存放獲得用戶選擇的對象變量,第二個po是用戶鼠標(biāo)點下時的位置,第三個是一段字符串,顯示在提示欄。 |