Código Fuente‎ > ‎

Capítulo 24.lsp

;;;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 24. Tablas.

(defun ins-tabla (/ pt altura-fila ancho-col nfilas ncols) 
  (setq pt          (getpoint "\nEsquina superior izquierda de la tabla: ")
        altura-fila (getdist pt "\nAltura de filas: ")
        ancho-col   (getdist pt "\nAnchura de columnas: ")
        nfilas      (getint "\nNúmero de filas: ")
        ncols       (getint "\nNúmero de columnas: "))
  (vla-AddTable 
    (espacio-actual *aevl:dibujo*)
    (vlax-3d-point pt)
    nfilas
    ncols
    altura-fila
    ancho-col))
;;;Listado 24.1. Función que inserta una tabla en el dibujo.

(defun altura-texto-fila (obj-tabla i-fila altura-texto /) 
  (setq i 0)
  (repeat (vla-get-Columns obj-tabla) 
    (vla-setTextHeight2 obj-tabla i-fila i 0 altura-texto)
    (setq i (1+ i))))
;;;Listado 24.2. Función que cambia la altura de texto de una fila.

(defun altura-texto-columna (obj-tabla i-col altura-texto /) 
  (setq i 0)
  (repeat (vla-get-Rows obj-tabla) 
    (vla-setTextHeight2 obj-tabla i i-col 0 altura-texto)
    (setq i (1+ i))))
;;;Listado 24.3. Función que cambia la altura de texto para una columna.

(defun sel-bloque (nombre / ss obj cont ename datos lista-datos) 
  (setq cont 0)
  (if 
    (setq ss (ssget "X" 
                    (list (cons 0 "INSERT") (cons 2 nombre))))
    (while (setq ename (ssname ss cont)) 
      (setq obj (vlax-ename->vla-object ename))
      (setq datos (list 
                    (cons "CAPA" (vla-get-layer obj))
                    (cons "COORDS" 
                          (vlax-safearray->list 
                            (vlax-variant-value 
                              (vla-get-insertionpoint obj))))))
      (setq lista-datos (cons 
                          (append datos 
                                  (ax-lee-atributos ename))
                          lista-datos))
      (setq cont (1+ cont))))
  lista-datos)
;;;Listado 24.4. Selección del bloque a procesar y extracción de sus atributos a una lista.

(defun col-w (lista-datos ncols / lst-w max-c) 
  (setq lst-w (mapcar 
                '(lambda (fila) 
                   (mapcar 
                     '(lambda (cel) 
                        (apply 
                          'max
                          (list 
                            (strlen 
                              (vl-princ-to-string (car cel)))
                            (strlen 
                              (vl-princ-to-string (cdr cel))))))
                     fila))
                lista-datos)
        i     0)
  (repeat ncols 
    (setq max-c (cons 
                  (apply 'max 
                         (mapcar '(lambda (x) (nth i x)) lst-w))
                  max-c))
    (setq i (1+ i)))
  (reverse max-c))
;;;Función que calcula los anchos relativos aproximados de las columnas.

(defun C:TABLA-ATRIBUTOS (/ *error* pres-act bloque nombre car-por-cols ancho-por-car 
                          lista-datos nfilas ncols pt-ins pt-esquina altura-fila 
                          ancho-tabla obj-tabla i j txt) 
  (vla-StartUndoMark *aevl:dibujo*)
  (defun *error* (msg) 
    (vla-EndUndoMark *aevl:dibujo*)
    (command-s "_U")
    (prompt msg))
  (if (/= (setq pres-act (getvar "CTAB")) "Model") 
    (setvar "TILEMODE" 1))
  (while 
    (not 
      (and (setq bloque (ssget "_:S" '((0 . "INSERT")))) 
           (equal 
             (vla-get-HasAttributes 
               (vlax-ename->vla-object (ssname bloque 0)))
             :vlax-true)))
    (prompt "\nSelect a bloque with attributes: "))
  (setq nombre      (cdr (assoc 2 (entget (ssname bloque 0))))
        lista-datos (sel-bloque nombre)
        nfilas      (length lista-datos)
        ncols       (length (car lista-datos)))
  (setvar "CTAB" pres-act)
  (initget 1)
  (setq pt-ins (getpoint "\nSpecify table insertion point: "))
  (initget (+ 1 32))
  (setq pt-esquina  (getcorner pt-ins "\nSpecify table size: ")
        altura-fila   (/ 
                      (abs (- (nth 1 pt-ins) (nth 1 pt-esquina)))
                      (1+ nfilas))
        ancho-tabla (abs (- (nth 0 pt-esquina) (nth 0 pt-ins)))
        obj-tabla ; Creación de la tabla
                    (vla-AddTable 
                      (espacio-actual *aevl:dibujo*)
                      (vlax-3d-point pt-ins)
                      (1+ nfilas)
                      ncols
                      altura-fila
                      (/ ancho-tabla ncols)))
  (vla-put-RegenerateTableSuppressed 
    obj-tabla
    :vlax-true)
  ;;Las anchuras de columna se ajuatan a los contenidos
  (setq car-por-cols  (col-w lista-datos ncols)
        ancho-por-car (/ 
                        ancho-tabla
                        (apply '+ car-por-cols))
        i             0)
  (foreach w car-por-cols 
    (vla-SetColumnWidth obj-tabla i (* ancho-por-car w))
    (setq i (1+ i)))
  (vla-SetText obj-tabla 0 0 nombre) ; Título
  (setq i 0)
  (foreach dato (car lista-datos) 
    (vla-SetText obj-tabla 1 i (car dato)) ; Cabecera
    (setq i (1+ i)))
  (setq i 0)
  (repeat (1- nfilas)  ; Filas de datos
    (setq j 0)
    (repeat ncols 
      (vla-SetCellAlignment 
        obj-tabla
        (+ i 2)
        j
        acMiddleCenter)
      (setq txt (vl-princ-to-string 
                  (cdr (nth j (nth i lista-datos)))))
      (vla-SetText obj-tabla (+ i 2) j txt)
      (setq j (1+ j)))
    (setq i (1+ i)))
  (vla-put-RegenerateTableSuppressed 
    obj-tabla
    :vlax-false)
  (vla-EndUndoMark *aevl:dibujo*))
;;;Listado 24.5. Función principal C:TABLA-DATOS.