Write XYZ data (SDF or CDF formatted) to a file

;;;; FAQ: [21.8] How to write XYZ data of selected objects to a file?

;;; CDF - comma delimited string

(defun cdf-point (pt)
  (strcat (car pt) ", " (cadr pt) ", " (caddr pt)))

;;; SDF - space delimited, may easier be read back in to AutoCAD

(defun sdf-point (pt)
  (strcat (car pt) " " (cadr pt) " " (caddr pt)))

;;; convert this SDF format back to a point with

(defun str->point (s)
  (eval (read (strcat "(" s ")"))))

;;; Write a XYZ file of all selected objects (SDF see below)

(defun C:XYZ (/ ss fname f)
  (if (and (setq ss (ssget))
        (setq fname (getfiled "Write XYZ to file"
                (strcat (getvar "DWGNAME") ".XYZ") "XYZ" 7))
        (setq f (open fname "w")))
    (foreach ele (std-sslist ss)          
      (foreach pt (std-getpts ele)        
        (write-line (cdf-point pt) f)
      )
    )
  )
  (if f (close f))
)

;;; => <fname>.xyz

;;; 0.45, 12.3, -34.0

;;; For a ASC file (SDF-format) simply change all XYZ to ASC

;;; and cdf-point to sdf-point above.

(defun C:ASC (/ ss fname f)
  (if (and (setq ss (ssget))
        (setq fname (getfiled "Write ASC to file"
                (strcat (getvar "DWGNAME") ".ASC") "ASC" 7))
        (setq f (open fname "w")))
    (foreach ele (std-sslist ss)
      (foreach pt (std-getpts ele)
        (write-line (sdf-point pt) f)
      )
    )
  )
  (if f (close f))
)