I guess Lee beat me to it, but here is one I wrote that will let you pick at many points as you want, pline style. It might overlap itself at corners, but well I didn't want to spend that much time on it.
(defun c:WavePline (/ DivideDistance EntList Blg Pt nPt cnt Dist Sc )
(defun DivideDistance ( sPt ePt dist / Ang tempDist SpDist Amnt )
(setq Ang (angle sPt ePt))
(setq tempDist (distance sPt ePt))
(setq SpDist (/ tempDist (setq Amnt (fix (/ tempDist dist)))))
(setq Amnt (1+ Amnt))
(setq cnt (+ Amnt cnt))
(repeat Amnt
(setq EntList
(cons
(cons 42 (setq Blg (- Blg)))
(cons
(cons 41 0.)
(cons
(cons 40 0.)
(cons
(cons 10 (list (car sPt) (cadr sPt)))
EntList
)
)
)
)
)
(setq sPt (polar sPt Ang SpDist))
)
EntList
)
;-------------------------------------------------
(setq Dist 0.4)
(setq Sc (getvar 'LtScale))
(setq EntList
(list
(cons 90 2)
(cons 100 "AcDbPolyline")
(cons 100 "AcDbEntity")
(cons 0 "LWPOLYLINE")
)
)
(setq Blg 1.)
(setq cnt 0)
(if (setq Pt (getpoint "\n Select first point: "))
(progn
(while (setq nPt (getpoint Pt "\n Select next point: "))
(setq EntList (DivideDistance Pt nPt (* Dist Sc)))
(setq Pt nPt)
(setq cnt (1+ cnt))
)
(entmake (subst (cons 90 cnt) '(90 . 2) (reverse EntList)))
)
)
(princ)
)