;3D spline to unfolded 2D spline - www.cadforum.cz

(defun C:SplineUnfold ( / Ent Obj ep p ps p2 pnt 2Dplist d st et fitPoints)

  (vl-load-com)
  (defun @2d (p)(list (car p)(cadr p))) ; add Z=0.0 for splines

 (setq Ent (entsel "\nSelect 3D spline or polyline: "))
 (if Ent (progn
  (setq Obj (vlax-ename->vla-object (car Ent)))
  (if (member (vla-get-ObjectName Obj) '("AcDbPolyline" "AcDbSpline"))(progn
   (setq ep (vlax-curve-getEndParam Obj)
		 p (vlax-curve-getStartParam Obj)
		 ps (/ (- ep p) 200.0) ; approx points
		 prev (vlax-curve-getPointAtParam Obj p)
		 p2 prev
		 ;st (vla-get-StartTangent Obj) ; for spline
		 ;et (vla-get-EndTangent Obj) ; for spline
		 2Dplist (list)
		 2Dplist (cons (@2d p2) 2Dplist)
	)
   (while (<= (setq p (+ p ps)) ep)
    (setq pnt (vlax-curve-getPointAtParam Obj p)
		  d (distance prev pnt)
		  p2 (@2d (polar p2 (angle prev pnt) d))
		  2Dplist (cons p2 2Dplist)
		  prev pnt
    )
   );while
   ;(vla-delete obj) ; delete old?
   (setq 2Dplist (reverse 2Dplist))

;draw approx. pline:
   (vlax-invoke
    (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'Modelspace)
    'AddLightWeightPolyline (apply 'append 2Dplist)
   )
;draw approx. spline:
;   (setq fitPoints (vlax-make-safearray vlax-vbDouble (cons 0 (1- (* 3 (length 2Dplist))))))
;   (vlax-safearray-fill fitPoints (apply 'append 2Dplist))
;   (vla-AddSpline 
;    (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'Modelspace)
;    fitPoints
;	st et)

  )); spline
 )); sel
 (princ)
)
