我正在開發一個VBA宏使用AutoCAD。目前它將圓圈轉換爲3D折線,並且其本身完美地工作。這只是一個開始,我可以在最後的例程中加入一些肉體。是否有另一種方法來動態創建這個double值的數組?
這是VBA宏:
Sub CircleToPolyline()
Dim objSel As AcadEntity
Dim myCircle As AcadCircle
Dim pickedPoint As Variant
' Get the user to select a circle
' Eventually we will use a Selection Set with Filtering to pick them all in the drawing
Call ThisDrawing.Utility.GetEntity(objSel, pickedPoint, "Select Circle:")
If objSel.ObjectName <> "AcDbCircle" Then GoTo SKIP
Set myCircle = objSel
Dim dAngle As Double, dAngleStep As Double, dMaxAngle As Double
dAngle = 0# ' We always start at 0 degrees/radians
dAngleStep = 0.17453293 ' This is 10 degrees in radians
dMaxAngle = 6.28318531 ' This is 360 degrees in radians
' So our polyline will always have 36 vertices
Dim ptCoord() As Double
Dim ptProject As Variant
Dim i As Integer
i = 0
While dAngle < dMaxAngle
ReDim Preserve ptCoord(0 To i + 2) ' Increase size of array to hold next vertex
' Calculate the next coordinate on the edge of the circle
ptProject = ThisDrawing.Utility.PolarPoint(myCircle.center, dAngle, myCircle.Radius)
' Add to the coordinate list
ptCoord(i) = ptProject(0)
ptCoord(i + 1) = ptProject(1)
ptCoord(i + 2) = ptProject(2)
' Increment for next coordinate/angle on the circle edge
dAngle = dAngle + dAngleStep
i = i + 3
Wend
' Create the 3D polyline
Dim oPolyline As Acad3DPolyline
Set oPolyline = ThisDrawing.ModelSpace.Add3DPoly(ptCoord)
oPolyline.Closed = True
oPolyline.Update
SKIP:
End Sub
如果有管理我的動態數組(ptCoord
)任何替代方法,我只是想知道?例如,有什麼方法可以將ptProject
添加到動態列表中,然後在例程中只使用此列表?
事情是,PolarPoint返回變種。和ptCoord是雙打(這是什麼Add3dPoly期望)的數組。這就是我爲什麼這樣做的原因。我沒有使用變體(除了處理返回值)。我的代碼非常簡單和充分,但如果它可以進一步簡化,我會有興趣知道(給定VBA和AutoCAD環境的上下文)。
我希望我的問題很清楚。謝謝。
有關固定數組大小的有效點。然而,在你的例子中你使用'ptCoord(index)= pt'。但是我需要每個座標3個索引。首先是x,第二次是y,第三是z。 ** PolarPoint **返回一個變體。你能爲我解釋爲什麼你的代碼會起作用嗎?謝謝。 –
@AndrewTruckle,我認爲這段代碼正在做你在說的。 'pt'迭代返回的數組。因此,在每次調用PolarPoint函數時,「pt」將是x,y,然後是z,並且每個值的索引增加1。 – Ambie
好吧,我將不得不嘗試。但我認爲'index = index + 1'需要'index = index + 3'。 –