Autocad AddLightWeightPolyline method requires an array of doubles. It does not require the lowerbound of the array to be zero. An array simply has to have an even number of elements, one element for each X and each Y alternating. (x1, y1, x2, y2, x3, y3…) For indexes and loops I typically use the counting numbers, which do not include zero. I am evaluating an autocad work-alike program that is similar but requires arrays to be zero-based. It does not throw an error with a one-based array but results are a failure. it creates zero values for non-existent indexes that it expects. However there is no reason the arrays cannot be zero-based so they run in both packages. To that end for that reason i am re-doing the graph loops.

Only the array needs to be zero based. The loop still executes one time for each point. The index of the array starts with zero.

Calculation of points for Coordinate XY graphing –

Autocad does not care what indexes the array pt (below) was created with. The work-alike absolutely requires a starting index of zero.

Dim plineobj As AcadLWPolyline Set plineobj = acadDoc.ModelSpace.AddLightWeightPolyline(pt)

in line drawing mode, subtracting lbound from ubound adding one and dividing by two will give the number of points in the array. There is one less line. Since we know lbound is zero we could remove that. The loop iterates once for each line drawn. We could do the loop to handle any lbound value, but it would be a little messy with no immediate benefit. For now we expect a zero base array.

Sub draw_lines(ByRef pt() As Double) Dim lineobj As AcadLine Dim i As Integer, numpts As Integer, numlines As Integer Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double Dim pt1(0 To 2) As Double Dim pt2(0 To 2) As Double numpts = (UBound(pt) - LBound(pt) + 1) / 2 numlines = numpts - 1 'this requires a zero base array For i = 1 To numlines x1 = pt(i * 2 - 2) y1 = pt(i * 2 - 1) x2 = pt(i * 2) y2 = pt(i * 2 + 1) pt1(0) = x1: pt1(1) = y1: pt1(2) = 0 pt2(0) = x2: pt2(1) = y2: pt2(2) = 0 Set lineobj = acadApp.ActiveDocument.ModelSpace.AddLine(pt1, pt2) Next i Update End Sub

Lines w/limits mode we use when the Y value approaches infinity, such as y=1/x near x=0. It is otherwise the same.

Sub draw_lines_wlimits(xlim As Double, ylim As Double, ByRef pt() As Double) Dim lineobj As AcadLine Dim i As Integer, numpts As Integer, numlines As Integer Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double Dim pt1(0 To 2) As Double Dim pt2(0 To 2) As Double numpts = (UBound(pt) - LBound(pt) + 1) / 2 numlines = numpts - 1 'this requires a zero base array For i = 1 To numlines x1 = pt(i * 2 - 2) y1 = pt(i * 2 - 1) x2 = pt(i * 2) y2 = pt(i * 2 + 1) If Abs(x1) < xlim And Abs(y1) < ylim And Abs(x2) < xlim And Abs(y2) < ylim Then pt1(0) = x1: pt1(1) = y1: pt1(2) = 0 pt2(0) = x2: pt2(1) = y2: pt2(2) = 0 Set lineobj = acadApp.ActiveDocument.ModelSpace.AddLine(pt1, pt2) End If Next i Update End Sub

point mode

Sub draw_points(ByRef pt() As Double) Call pointmode Dim pointobj As AcadPoint Dim i As Integer, numpts As Integer Dim x1 As Double, y1 As Double Dim pt1(0 To 2) As Double numpts = (UBound(pt) - LBound(pt) + 1) / 2 'this requires a zero base array For i = 1 To numpts x1 = pt(i * 2 - 2) y1 = pt(i * 2 - 1) pt1(0) = x1: pt1(1) = y1: pt1(2) = 0 Set pointobj = acadDoc.ModelSpace.AddPoint(pt1) Next i Update End Sub