; RvrsLine - reverse line or polyline (CZ: převrátí směr křivky)
; modified by Xanadu - www.xanadu.cz  www.cadforum.cz

; process LINE
(defun do_line (e / ent pt1 pt2 item)
 (setq ent (entget e))
   (foreach item ent
      (cond
         ((= (car item) 10)
            (setq pt1 (cdr item))
         )
         ((= (car item) 11)
            (setq pt2 (cdr item))
         )
      )
   )
   (setq ent (subst (cons 10 pt2)(assoc 10 ent) ent))
   (setq ent (subst (cons 11 pt1)(assoc 11 ent) ent))
;(PRINT ent)
   (if (entmod ent)
      (progn
         (prompt " OK")
         (entupd e)
      )
      (prompt " failed!")
   )
)

; process old POLY
(defun do_heavy (e / e1 ent0 ent ent1 list_new list_of_vert bulge)
   (setq e1 e
         ent0 (entget e1)
         e (entnext e)
         ent1 (entget e)
         bulge (cdr (assoc 42 ent1))
         e (entnext e)
         ent (entget e); skip header
   )
   (while (= (cdr (assoc 0 ent)) "VERTEX")
      (setq list_new (subst (cons 42 (- bulge))(assoc 42 ent) ent)
            bulge (cdr (assoc 42 ent))
            list_of_vert (cons list_new list_of_vert)
            e (entnext e)
            ent (entget e)
      )
   )
   (entmake ent0)
   (foreach ent list_of_vert (entmake ent))
   (entmake (subst (cons 42 (- bulge))(assoc 42 ent1) ent1))
   (if (entmake ent)
      (progn
         (prompt " OK")
         (entdel e1)
         (redraw (entlast))
      )
      (prompt " failed!")
   )
)

; process new POLY
(defun do_light (e / hdr tail list_new list_of_vert)
   (foreach item (reverse (entget e))
      (cond
         ((and (not hdr)(= (car item) 10))
            (setq hdr item)
         )
         ((member (car item) '(10 40 41))
            (setq list_of_vert (cons item list_of_vert))
         )
         ((= (car item) 42)
            (setq list_of_vert (cons (cons 42 (- (cdr item))) list_of_vert))
         )
         ((= (car item) 210)
            (setq tail item)
         )
         (T (setq list_new (cons item list_new)))
      )
   )
   (if (entmod (append list_new (list hdr)(reverse list_of_vert)(list tail)))
      (progn
         (prompt " OK")
         (entupd e)
      )
      (prompt " failed!")
   )
)

(defun C:RvrsLine ( / ocmde e etyp ans)
   (setq ocmde (getvar "cmdecho"))
   (setvar "cmdecho" 0)
   (while (setq e (car (entsel "\nSelect a (poly)line: ")))
      (setq etyp (cdr (assoc 0 (entget e))))
      (cond
         ((= etyp "LINE")(do_line e))
         ((= etyp "POLYLINE")(do_heavy e))
         ((= etyp "LWPOLYLINE")(do_light e))
         (T (prompt (strcat " selected " etyp)))
      )
   )
   (setvar "cmdecho" ocmde)
   (prin1)
)

(defun C:RvrsLines ( / ocmde e etyp ans ss ssl i)
   (setq ocmde (getvar "cmdecho"))
   (setvar "cmdecho" 0)
   (prompt "\nSelect (poly)lines: ")
   (setq ss (ssget (list (cons 0 "LINE,POLYLINE,LWPOLYLINE"))))
   (if ss (progn
    (setq ssl (sslength ss)  i 0)
    (while (< i ssl)
      (setq e (ssname ss i))
      (setq etyp (cdr (assoc 0 (entget e))))
      (cond
         ((= etyp "LINE")(do_line e))
         ((= etyp "POLYLINE")(do_heavy e))
         ((= etyp "LWPOLYLINE")(do_light e))
         (T (prompt (strcat " selected " etyp)))
      )
      (setq i (1+ i))
    )
   ));if progn
   (setvar "cmdecho" ocmde)
   (prin1)
)

(princ "\nRvrsLine+RvrsLines commands loaded. (C)2008, XANADU - www.xanadu.cz")
(princ "\n_________ CAD, PLM, GIS/FM custom application development _________")

(prin1)

