Ich entwickle ein VBA-Makro zur Verwendung in AutoCAD. Im Moment wandelt es einen Kreis in eine 3D Polylinie um und an sich funktioniert es perfekt. Es ist nur der Anfang, und ich werde in der Lage sein, etwas in die letzte Routine zu bringen.Gibt es eine alternative Möglichkeit, dieses Array doppelter Werte dynamisch zu erstellen?
Dies ist das Makro-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
ich gerade frage mich, ob es alternative Methoden sind meine dynamischen Arrays für die Verwaltung (ptCoord
)? Zum Beispiel gibt es eine Möglichkeit, dass ich einfach die ptProject
in eine dynamische Liste hinzufügen und dann einfach diese Liste in der Add3dPoly Routine verwenden?
Die Sache ist, PolarPoint gibt eine Variante zurück. Und ptCoord ist ein Array von verdoppelt (was ist, was Add3dPoly erwartet). Deshalb habe ich es so gemacht. Ich habe keine Varianten verwendet (außer Rückgabewerte).
Mein Code ist ziemlich einfach und ausreichend, aber wenn es weiter vereinfacht werden kann, wäre ich daran interessiert zu wissen (angesichts der Kontext von VBA und AutoCAD-Umgebung).
Ich hoffe meine Frage ist klar. Vielen Dank.
Gültiger Punkt über die feste Array-Größe. In Ihrem Beispiel verwenden Sie jedoch 'ptCoord (index) = pt'. Aber ich brauche 3 Indizes für jede Koordinate. Erstens für x, zweitens für y und drittens für z. ** PolarPoint ** gibt eine Variante zurück. Können Sie mir erklären, warum Ihr Code funktioniert? Vielen Dank. –
@AndrewTruckle, ich denke, dieser Code macht das, was du sagst. 'pt' iteriert das zurückgegebene Array. Bei jedem Aufruf der 'PolarPoint'-Funktion wäre' pt' also x, y, dann z, wobei der Index bei jedem Wert um 1 erhöht wird. – Ambie
OK, ich muss es versuchen. Aber ich denke, Index = Index + 1 muss Index = Index + 3 sein. –