;;;Código fuente del libro "Experto AutoCAD con Visual LISP"
;;; (c) 2012 Ediciones ARTUAL, S.L. Barcelona, España.
;;; (c) 2012-2020 Reinaldo Togores. Todos los derechos reservados
;;; Se permite su uso mencionando la obra y su autor.
;;;CapÃtulo 8.  Operaciones con archivos.
(defun lee-letras (archivo / id-archivo textos)Â
  (if (setq id-archivo (open (findfile archivo) "r"))Â
    (progn (setq textos "")Â
           (while (setq letra (read-char id-archivo))Â
             (setq textos (strcat textos (chr letra))))
           (close id-archivo)
           (alert textos))))
;;;Listado 8.1. Lectura de un archivo letra a letra.
(defun archivo->lista (archivo / id-archivo tmp)Â
  (if (setq id-archivo (open (findfile archivo) "r"))Â
    (while (setq linea (read-line id-archivo))Â
      (setq tmp (cons (read (strcat "(" linea ")")) tmp)))
    (close id-archivo))
  (reverse tmp))
;;;Listado 8.2. Lectura de un archivo a una lista.
(defun lista->csv (lista delim archivo anexar / id-archivo)Â
  (ifÂ
    (setq id-archivo (open archivoÂ
                           (if anexarÂ
                             "a"
                             "w")))
    (prognÂ
      (foreach sublista listaÂ
        (while (setq valor (car sublista))Â
          (prin1 valor id-archivo)
          (if (setq sublista (cdr sublista))Â
            (princ delim id-archivo)))
        (write-char 10 id-archivo))
      (close id-archivo))))
;;;Listado 8.3. Función lista->csv.
(defun lista->textos (lista prec)Â
  (mapcarÂ
    '(lambda (x)Â
       (mapcarÂ
         '(lambda (y)Â
            (if (numberp y)Â
              (rtos y 2 prec)
              (vl-princ-to-string y)))
         x))
    lista))
;;;Listado 8.4. Conversión de elementos de listas a textos.
(defun long-cadena (caracter cadena long / veces)Â
  (setq veces (- long (strlen cadena)))
  (condÂ
    ((zerop veces) cadena)
    ((minusp veces) (substr cadena 1 long))
    (t
     (repeat veces (setq cadena (strcat cadena caracter))))))
;;;Listado 8.5. Llevar una cadena a una longitud fija.
(defun lista->sdf (lista long prec caracter archivo anexar / id-archivo tmp)Â
  (ifÂ
    (setq id-archivo (open archivoÂ
                           (if anexarÂ
                             "a"
                             "w")))
    (progn (setq lista (lista->textos lista prec))Â
           (foreach sublista listaÂ
             (setq tmp "")
             (foreach valor sublistaÂ
               (setq tmp (strcat tmp (long-cadena caracter valor long))))
             (write-line tmp id-archivo))
           (close id-archivo))))
;;;Listado 8.6. Función LISTA->SDF.
(defun existe-archivo? (nombre carpeta)Â
  (vl-directory-files carpeta nombre 1))
;;;Listado 8.7. Función para búsqueda de un archivo.
(defun unidades (/ codigo tmp)Â
  (setq codigo 65)
  (while (<= codigo 90)Â
    (if (vl-directory-files (strcat (chr codigo) ":"))Â
      (setq tmp (cons (strcat (chr codigo) ":") tmp)))
    (setq codigo (1+ codigo)))
  (reverse tmp))
;;;Listado 8.8. Función para reconocer unidades de disco disponibles.
(defun crea-lista-puntos (/ pt tmp)Â
  (while (setq pt (getpoint "\nDesigne Punto: "))Â
    (setq tmp (cons pt tmp)))
  tmp)
;;;Listado 8.9. Función CREA-LISTA-PUNTOS para crear una lista de coordenadas.