The selected polyline adds new vertexes to the object at intersections with other objects selected.
(defun c:pvx (/ *error* ps pm dc pt en cl vr cr ns m n bl ds lp ls
lt pr lz m1) (vl-load-com)
(defun *error* (msg)
(if (not (wcmatch (strcase msg t) "*cancel*,*exit*"))
(princ (strcat "\nError: " msg)))
(if ps (redraw (ssname ps 0) 4)))
(if (setq ps (ssget ":s" '((0 . "lwpolyline"))))
(progn (redraw (setq pm (ssname ps 0)) 3)
(if (setq dc (vla-get-activedocument
(vlax-get-acad-object)) pt (ssget))
(progn
(if (ssmemb pm pt) (ssdel pm pt))
(setq en (entget pm) cl (cdr (assoc 70 en))
vr (cdr (assoc 90 en)) cr (mapcar 'cdr (vl-remove-if
'(lambda(a) (/= (car a) 10)) en))
ns (vlax-ename->vla-object pm) m -1 n -1)
(if (= cl 1) (setq cr (append cr (list (car cr)))))
(repeat (if (= cl 1) vr (1- vr))
(setq bl (vla-getBulge ns (setq m (1+ m)))
ds (distance (nth m cr) (nth (1+ m) cr))
lp (cons (list m bl (if (= bl 0) 0
(/ (+ (expt (* (/ ds 2) bl) 2) (expt (/ ds 2) 2))
(* ds bl)))) lp)))
(repeat vr (setq ls (cons (setq n (1+ n)) ls)))
(repeat (setq n (sslength pt)) (setq m -1)
(if (setq lt (vlax-invoke ns 'Intersectwith
(vlax-ename->vla-object (ssname pt (setq n (1- n)))) 0))
(repeat (/ (length lt) 3)
(if (not (member (setq pr (vlax-curve-getparamatpoint ns
(list (nth (setq m (1+ m)) lt) (nth (setq m (1+ m)) lt)
(nth (setq m (1+ m)) lt)))) ls))
(setq ls (cons pr ls))))))
(setq n -1 lz (vl-sort ls '<) ls (apply 'append (mapcar
'(lambda(a) (vl-remove (last a) a)) (mapcar '(lambda(a)
(vlax-curve-getpointatparam ns a)) (vl-sort ls '<)))))
(vla-startundomark dc)
(vlax-put ns 'Coordinates ls)
(repeat (if (= cl 1) (length lz) (1- (length lz)))
(setq m1 (nth (vl-position (fix (nth (setq n (1+ n)) lz))
(mapcar '(lambda(a) (car a)) lp)) lp) dr (distance
(vlax-curve-getpointatparam ns n)
(vlax-curve-getpointatparam ns (1+ n))))
(vla-setBulge ns n (if (zerop (cadr m1)) 0 (* (if (minusp
(cadr m1)) -1 1) (/ (- (abs (caddr m1)) (sqrt (- (expt
(caddr m1) 2) (expt (/ dr 2) 2)))) (/ dr 2))))))
(vla-endundomark dc)
)
) (redraw pm 4)
)
) (prin1)
)