;                                         ***FLATTEN.LSP***
;
;       DESCRIPTION:   	A program to take a drawing with Z coordinates other than "0.0" and "flatten"
;                                       them to "0.0".   Our use for this routine is to take survey data for a building lot or
;                                       site from our engineers and make it more usable for our 2D site plan.
;                                       This facilitates drawing dimensions and getting distances without the extraneous
;                                       elevation information which can give inaccurate dimensions, etc.
;
;Written by:         Byron Blattel
;                           Hatch Partnership Architects
;                           Austin, Texas

;Modified by:		Amritendu Maji
;			N-Y Associates, Inc
;			Metairie, Louisiana

;                                          ***MAIN PROGRAM***
(defun C:flat ()
      (defun flat_ent (type)
	    ;(setq filter_1 (list ent_type))
            (setq ent_set (ssget "X" ));filter_1)); (list e_type)))
	    (setq c 0)
            (setq n (sslength ent_set))
            (repeat n
                  (setq c (1+ c))
                  (prompt (strcat "\nFlattening " ent_type " " (itoa c) " of " (itoa n) "."))
                  (setq ent_name (ssname ent_set (1- c)))
                  (setq ent_data (entget ent_name))
                  (setq ent_point0 (cdr (assoc 10 ent_data)))
                  (setq ent_point1 (cdr (assoc 11 ent_data)))
                  (setq ent_point2 (cdr (assoc 12 ent_data)))
                  (setq ent_point3 (cdr (assoc 13 ent_data)))
                  (if ent_point0
                        (setq ent_new (subst (cons 10 (list (car ent_point0) (cadr ent_point0) 0.0)) (assoc 10 ent_data) ent_data))
                  )
                  (if ent_point1
                        (setq ent_new (subst (cons 11 (list (car ent_point1) (cadr ent_point1) 0.0)) (assoc 11 ent_new) ent_new))
                  )
                  (if ent_point2
                        (setq ent_new (subst (cons 12 (list (car ent_point2) (cadr ent_point2) 0.0)) (assoc 12 ent_new) ent_new))
                  )
                  (if ent_point3
                        (setq ent_new (subst (cons 13 (list (car ent_point3) (cadr ent_point3) 0.0)) (assoc 13 ent_new) ent_new))
                  )
                  (entmod ent_new)
            )
      )      (setq filter (list (cons 0 "ARC")(cons 0 "CIRCLE")(cons 0 "INSERT")(cons 0 "LINE")(cons 0 "POINT")(cons 0 "SOLID")(cons 0 "ELLIPSE")))
      (foreach ent filter
            (setq ent_type (cdr ent))
            (flat_ent ent)
      )
      (command "regen")
      (princ)
;)



      (setq filter (list (cons 0 "Polyline")))
      (setq ent_set (ssget "X" filter))
      (setq n (sslength ent_set) c 0)
      (repeat n
            (setq c (1+ c))
            (prompt (strcat "\nFlattening Polyline " (itoa c) " of " (itoa n) "."))
            (setq ent_name (ssname ent_set (1- c)))
            (setq ver_data (entget ent_name))
            (setq poly (list (cons 0 "POLYLINE")
                  (cons 8 (cdr (assoc 8 ver_data)))
                  (cons 66 1)
                  (cons 10 (list 0.0 0.0 0.0))
                  (cons 70 (cdr (assoc 70 ver_data)))
                  (cons 40 (cdr (assoc 40 ver_data)))
                  (cons 41 (cdr (assoc 41 ver_data)))
            ))
            (entmake poly)
            (while (/= "SEQEND" (cdr (assoc 0 ver_data)))
                  (setq ver_data (entget (entnext (cdr (assoc -1 ver_data)))))
                  (setq ver_point (cdr (assoc 10 ver_data)))
                  (setq new_vertex (subst (cons 10 (list (car ver_point) (cadr ver_point) 0.0)) (assoc 10 ver_data) ver_data))
                  (entmake new_vertex)
            )
;;(PRINC "TILL HERE\n")
            (entmake (list (cons 0 "SEQEND")))
            (entdel ent_name)
      )
      (command "regen")
      (princ)
)