AutoLISP: Spline to Polyline

Keeping with the theme of the previous posts about modifying Splines and Polylines…

Here is a routine that lets you change Splines into Polylines. I will warn you though, that this routine doesn’t let you escape or cancel out from the program. So you just have to finish the routine and then undo in order to make changes….

Here’s how it works:

  • S2P <enter> to start (Spline 2 Polyline)
  • Select the Splines that you want to change to Polylines
  • <enter> when finished selecting
  • Specify the amount of segments. The more the segments, the smoother the curve. but too many segments may be difficult to work with.

~enjoy

 

;;CADALYST 12/03 AutoLISP Solutions SPLINE-TO-PLINE.LSP

;;(c) 2003 Tony Hotchkiss

(defun spline-to-pline (/ i)

(vl-load-com)

(setq *thisdrawing* (vla-get-activedocument

(vlax-get-acad-object)

) ;_ end of vla-get-activedocument

*modelspace* (vla-get-ModelSpace *thisdrawing*)

) ;_ end of setq

(setq spline-list (get-spline))

(setq i (- 1))

(if spline-list

(progn

(setq msg "\nNumber of segments <100>: ")

(initget 6)

(setq num (getint msg))

(if (or (= num 100) (= num nil))

(setq num 100)

) ;_ end of if

(repeat (length spline-list)

(setq splobj (nth (setq i (1+ i)) spline-list))

(convert-spline splobj num)

) ;_ end of repeat

) ;_ end of progn

) ;_ end of if

) ;_ end of spline-to-pline

(defun get-spline (/ spl-list obj spline no-ent i)

(setq spl-list nil

obj nil

spline "AcDbSpline"

selsets (vla-get-selectionsets *thisdrawing*)

ss1 (vlax-make-variant "ss1")

) ;_ end of setq

(if (= (vla-get-count selsets) 0)

(setq ssobj (vla-add selsets ss1))

) ;_ end of if

(vla-clear ssobj)

(setq no-ent 1)

(while no-ent

(prompt "\nSelect splines: ")

(vla-Selectonscreen ssobj)

(if (> (vla-get-count ssobj) 0)

(progn

(setq no-ent nil)

(setq i (- 1))

(repeat (vla-get-count ssobj)

(setq

obj (vla-item ssobj

(vlax-make-variant (setq i (1+ i)))

) ;_ end of vla-item

) ;_ end of setq

(cond

((= (vlax-get-property obj "ObjectName") spline)

(setq spl-list

(append spl-list (list obj))

) ;_ end of setq

)

) ;_ end-of cond

) ;_ end of repeat

) ;_ end of progn

(prompt "\nNo entities selected, try again.")

) ;_ end of if

(if (and (= nil no-ent) (= nil spl-list))

(progn

(setq no-ent 1)

(prompt "\nNo splines selected.")

(quit)

) ;_ end of progn

) ;_ end of if

) ;_ end of while

(vla-delete (vla-item selsets 0))

spl-list

) ;_ end of get-spline

(defun convert-spline (splobj n / i)

(setq point-list nil

2Dpoint-list nil

z-list nil

spl-lyr (vlax-get-property splobj 'Layer)

startSpline (vlax-curve-getStartParam splobj)

endSpline (vlax-curve-getEndParam splobj)

i (- 1)

) ;_ end of setq

(repeat (+ n 1)

(setq i (1+ i))

(setq p (vlax-curve-getPointAtParam

splobj

(* i

(/ (- endspline startspline) n)

) ;_ end of *

) ;_ end of vlax-curve-getPointAtParam

) ;_ end of setq

(setq 2Dp (list (car p) (cadr p))

2Dpoint-list (append 2Dpoint-list 2Dp)

point-list (append point-list p)

z (caddr p)

z-list (append z-list (list z))

) ;_ end of setq

) ;_ end of repeat

(setq summ (apply '+ z-list))

(setq arraySpace

(vlax-make-safearray

vlax-vbdouble ; element type

(cons 0

(- (length point-list) 1)

) ; array dimension

) ;_ end of vlax-make-safearray

) ;_ end of setq

(setq vert-array (vlax-safearray-fill arraySpace point-list))

(vlax-make-variant vert-array)

(if (and (= :vlax-true (vlax-get-property splobj 'IsPLanar))

(= summ 0.0)

) ;_ end of and

(setq plobj (add-polyline

2Dpoint-list

vla-AddLightweightPolyline

) ;_ end of add-polyline

) ;_ end of setq

(setq plobj (add-polyline

point-list

vla-Add3DPoly

) ;_ end of add-polyline

) ;_ end of setq

) ;_ end of if

(vlax-put-property plobj 'Layer spl-lyr)

(vla-delete splobj)

(vlax-release-object splobj)

) ;_ end of convert-spline

(defun add-polyline (pt-list poly-func)

(setq arraySpace

(vlax-make-safearray

vlax-vbdouble

(cons 0

(- (length pt-list) 1)

) ; array dimension

) ;_ end of vlax-make-safearray

) ;_ end of setq

(setq vertex-array

(vlax-safearray-fill arraySpace pt-list)

) ;_ end of setq

(vlax-make-variant vertex-array)

(setq plobj (poly-func

*modelspace*

vertex-array

) ;_ end of poly-func

) ;_ end of setq

) ;_ end of add-polyline

(defun c:s2p ()

(spline-to-pline)

(princ)

) ;_ end of c:s2p

(prompt

"SPLINE-TO-PLINE by Tony Hotchkiss. Enter S2P to start"

) ;_ end of prompt

Advertisement

About AutoCAD Tips

This blog serves as a knowledge base for myself (and anyone else) so that I can reference tips & tricks that I have learned and also refer others to it as well. I hope that this blog helps you learn at least one tip to make your drafting/design experience better.
This entry was posted in AutoLISP, Modifying, Polylines, TIPS. Bookmark the permalink.

4 Responses to AutoLISP: Spline to Polyline

  1. Harold says:

    Thanks a lot,
    You saved me an hour work. Done in 5 minutes.
    Many Thanks
    Harold

  2. Davide says:

    Hi there,

    Nice code! Though, how is this different from the built-in Spline->Convert to Polyline?
    I’m also trying to implement something similar on my own, but generating segments as well as arcs, to preserve tangent continuity of the original curve. Quite challenging so far. Any thoughts on how this can be done?

    Cheers,

    Davide

    • AutoCAD Tips says:

      After all of the posts that I did on converting Splines to Polylines and vice versa I came across a tip on how this feature was added in AutoCAD 2010 and made about about it as well https://autocadtips.wordpress.com/2011/08/04/spline-to-polyline-without-lisp/

      In this case I learned a good lesson in that the person teaching AutoCAD needs to stay current with the newest version and be familiar with what features are added and discontinued. I was taught that converting polylines and splines was only available through some sort of custom program like a lisp routine. I then scoured the web for was to accomplish this and then after spending all of that time, i came to find that this feature had been added and improved.

      The converted splines and polylines in the out of the box SPLINEDIT and PEDIT commands are much better (in my opinion) because they are optimized and don’t have as many redundant vertices.
      ~Greg

  3. mel says:

    many thanks . you saved me

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s