Evaluate Curve By Distance

 This Rhino Script breaks a curve down into a series of equidistant points represented as lines. Starting from a series of origin options, start, middle, end, curve percentage, and user-specified point, the function housed in the script returns two array sets of points, one in the positive and one in the negative t directions where possible.

Rhino Script

Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Design>
'Script version Tuesday, January 06, 2009 8:42:52 PM

Call Main()
Sub Main()
	Dim strReturn, curve, distance, percent, origin
	
	curve = Rhino.GetObjects("Select Curve", 4)
	If isNull(curve) Then Exit Sub
	
	strReturn = Rhino.GetString("Evaluate Curve From ", "Start", array("Start", "Middle", "End", "Percent", "Point"))
	If isNull(strReturn) Then Exit Sub
	
	If strReturn = "Start" Then
		origin = Rhino.CurveDomain(curve)(0)
	ElseIf strReturn = "Middle" Then
		origin = Rhino.CurveDomain(curve)(1) * 0.5
	ElseIf strReturn = "End" Then
		origin = Rhino.CurveDomain(curve)(1)
	ElseIf strReturn = "Percent" Then
		
		percent = Rhino.GetReal("Percent", 50, 0, 100)
		If isNull(percent) Then Exit Sub
		
		If percent = 0 Then
			origin = Rhino.CurveDomain(curve)(0)
		Else
			origin = Rhino.CurveDomain(curve)(1) * (percent * 0.01)
		End If
	ElseIf strReturn = "Point" Then
		origin = Rhino.CurveClosestPoint(curve, Rhino.GetPointOnCurve(curve))
		If isNull(origin) Then Exit Sub
	End If
	
	distance = Rhino.GetReal("Division Length", 10)
	If isNull(distance) Then Exit Sub
	
	
	Dim i, j,k, evalCurve
	
	Call Rhino.EnableRedraw(False)
	For k = 0 To uBound(curve(k)) Step 1
		evalCurve = evalCrvByDist(curve(k), distance, origin)
		
		For i = 0 To 1 Step 1
			For j = 1 To uBound(evalCurve(i)) Step 1
				Call Rhino.AddTextDot(j, evalCurve(i)(j))
				Call Rhino.AddLine(evalCurve(i)(j - 1), evalCurve(i)(j))
			Next
		Next
	Next
	Call Rhino.EnableRedraw(True)

End Sub
Function evalCrvByDist(curve, distance, origin)
	evalCrvByDist = Null
	Dim i, j, k, r, s, t
	Dim sphere
	Dim tInt(), pt(), tempT(),pts(1)
	r = 0: s = 0

	For k = 0 To 1 Step 1
		t = origin
		r = 0
		ReDim Preserve pt(r)
		pt(r) = Rhino.EvaluateCurve(curve, t)
		
		Do
			j = 0
		
			ReDim tempT(0)
			ReDim Preserve tInt(r)
			sphere = Rhino.AddSphere(pt(r), distance)
			tInt(r) = Rhino.CurveSurfaceIntersection(curve, sphere)
			Call Rhino.DeleteObject(sphere)
		
			For i = 0 To uBound(tInt(r)) Step 1
				If k = 0 Then
					If tInt(r)(i, 0) = 1 And tInt(r)(i, 5) > t Then
						s = s + 1
						ReDim Preserve tempT(j)
						tempT(j) = tInt(r)(i, 5)
						j = j + 1
					End If
				Else
					If tInt(r)(i, 0) = 1 And tInt(r)(i, 5) < t Then
						s = s + 1
						ReDim Preserve tempT(j)
						tempT(j) = tInt(r)(i, 5)
						j = j + 1
					End If
				End If
			Next
		
			If s = 0 Then Exit Do
			If k = 0 Then
				t = Rhino.Min(tempT)
			Else
				t = Rhino.Max(tempT)
			End If
			r = r + 1
			ReDim Preserve pt(r)
			pt(r) = Rhino.EvaluateCurve(curve, t)
			s = 0
		Loop
		pts(k) = pt
	Next
	evalCrvByDist = pts
End Function
Function reparameterize(strObjectID)
	If Rhino.IsCurve(strObjectID) = True Then
		Call rhino.SelectObject(strObjectID)
		Call rhino.Command("reparameterize 0 1", False)
		Call rhino.UnselectAllObjects()
	End If
	If Rhino.IsSurface(strObjectID) = True Then
		Call rhino.SelectObject(strObjectID)
		Call rhino.Command("reparameterize 0 1 0 1", False)
		Call rhino.UnselectAllObjects()
	End If		
End Function