Código Fuente‎ > ‎

Capítulo 21.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 21. Responder a Eventos: los Reactores.

(defun procesa-textos (obj-notif / sel-texto nueva-escala alt-texto i texto) 
  (setq sel-texto    (ssget "X" '((0 . "TEXT") (410 . "Model")))
        nueva-escala (vla-get-CustomScale obj-notif)
        alt-texto    (* (getvar "textsize") (/ 1 nueva-escala))
        i            0)
  (while (setq texto (ssname sel-texto i)) 
    (setq texto (vlax-ename->vla-object texto))
    (if 
      (and (vlax-write-enabled-p texto) 
           (usar? (vla-get-Layer texto))
           (/= (vla-get-height texto) alt-texto))
      (vla-put-Height texto alt-texto))
    (setq i (1+ i))))
;;;Listado 21.1. Función que procesa los textos.

(defun respuesta-ventana (obj-notif obj-react) 
  (if 
    (and (zerop (getvar "CMDACTIVE")) 
         (vlax-read-enabled-p obj-notif)
         (= (getvar "CTAB") (car (vlr-data obj-react))))
    (procesa-textos obj-notif)))
;;;Listado 21.2. Función de respuesta a la modificación de la ventana gráfica.

(defun respuesta-fin-comando (obj-react lis-param / obj-vgraf) 
  (setq obj-vgraf       (vlax-ename->vla-object 
                          (handent (cadr (vlr-data obj-react)))))
  (if 
    (and (= (car lis-param) "PSPACE") 
         (vlax-read-enabled-p obj-vgraf))
    (procesa-textos obj-vgraf)))
;;;Listado 21.3. Función de respuesta al fin de un comando.

(defun reactor-ventana (ventana) 
  (vlr-pers 
    (VLR-Object-Reactor 
      (list ventana)
      (list (getvar "CTAB") (vla-get-Handle ventana))
      '((:VLR-objectClosed . respuesta-ventana)))))
;;;Listado 21.4. Creación del reactor de Objeto.

(defun reactor-comando (ventana) 
  (vlr-pers 
    (vlr-command-reactor 
      (list (getvar "CTAB") (vla-get-handle ventana))
      '(:vlr-commandEnded . respuesta-fin-comando)))))
;;;Listado 21.5. Creación del reactor de Comando.

(defun C:AUTO-ESCALA (/ vgraf obj-vgraf) 
  (cond 
    ((/= (getvar "CTAB") "Model")
     (prompt "\nDesigne ventana para auto-escala de textos:\n")
     (while (not (setq vgraf (ssget "_:S" '((0 . "VIEWPORT"))))))
     (setq obj-vgraf (vlax-ename->vla-object 
                       (ssname vgraf 0)))
     (if (not (propietario? obj-vgraf)) 
       (progn (reactor-ventana obj-vgraf) 
              (reactor-comando obj-vgraf))
       (alert "Esta ventana ya tiene reactores.")))
    (t
     (alert "Este comando válido sólo\nen Espacio Papel."))))
;;;Listado 21.6. C:AUTO-ESCALA. Interfaz de usuario para creación de los reactores.

(defun propietario? (objeto / reactores) 
  (if 
    (setq reactores (mapcar 'cadr 
                            (vlr-reactors :VLR-Object-Reactor)))
    (apply 'or 
           (mapcar 
             '(lambda (x) 
                (if (member objeto (vlr-owners x)) 
                  t))
             reactores))))
;;;Listado 21.7. Función que determina si un objeto tiene vinculados reactores.

;;;(vl-load-com)
;;;(load "funciones-reactor" 
;;;      "No se encuentra FUNCIONES-REACTOR") ;_ fin de load
;;;(autoload "escala-texto" '("AUTO-ESCALA"))
;;;Listado 21.9. Código a incluir en ACADDOC.LSP.

;|
(defun reaccion (reactor params)
  (princ (vlr-data reactor))
  (princ " | ")
  (princ (vlr-current-reaction-name))
  (princ " | ")
  (princ params)
  (princ "\n"))
;;;Listado 21.10. Función de respuesta que informa de los eventos.


(defun reaccion-obj (obj reactor params)
  (princ (vlr-data reactor))
  (princ " | ")
  (princ (vlr-current-reaction-name))
  (princ " | ")
  (princ params)
  (princ "\n"))
;;;Listado 21.11. Función de respuesta para el reactor de objeto.

(vlr-acdb-reactor "BaseDatos"
                  '((:vlr-objectAppended . reaccion)
                    (:vlr-objectUnAppended . reaccion)
                    (:vlr-objectReAppended . reaccion)
                    (:vlr-objectOpenedForModify . reaccion)
                    (:vlr-objectModified . reaccion)
                    (:vlr-objectErased . reaccion)
                    (:vlr-objectUnErased . reaccion)))
Listado 21.12. Creación del reactor de la Base de Datos

(vlr-editor-reactor
  "Editor"
  '((:vlr-beginClose . reaccion)
    (:vlr-beginDxfIn . reaccion)
    (:vlr-abortDxfIn . reaccion)
    (:vlr-dxfInComplete . reaccion)
    (:vlr-beginDxfOut . reaccion)
    (:vlr-abortDxfOut . reaccion)
    (:vlr-dxfOutComplete . reaccion)
    (:vlr-databaseToBeDestroyed . reaccion)
    (:vlr-unknownCommand . reaccion)
    (:vlr-commandWillStart . reaccion)
    (:vlr-commandCancelled . reaccion)
    (:vlr-commandEnded . reaccion)
    (:vlr-commandFailed . reaccion)
    (:vlr-lispWillStart . reaccion)
    (:vlr-lispEnded . reaccion)
    (:vlr-lispCancelled . reaccion)
    (:vlr-beginDwgOpen . reaccion)
    (:vlr-endDwgOpen . reaccion)
    (:vlr-dwgFileOpened . reaccion)
    (:vlr-beginSave . reaccion)
    (:vlr-sysVarWillChange . reaccion)
    (:vlr-sysVarChanged . reaccion)))
;;;Listado 21.13. Creación del reactor del Editor.

(defun c:vlr-objeto  ()
  (setq obj (vlax-ename->vla-object (car (entsel))))
  (vlr-object-reactor (list obj)
                      "Objeto"
                      '((:vlr-cancelled . reaccion-obj)
                        (:vlr-copied . reaccion-obj)
                        (:vlr-erased . reaccion-obj)
                        (:vlr-unerased . reaccion-obj)
                        (:vlr-goodbye . reaccion-obj)
                        (:vlr-openedForModify . reaccion-obj)
                        (:vlr-modified . reaccion-obj)
                        (:vlr-subObjModified . reaccion-obj)
                        (:vlr-modifyUndone . reaccion-obj)
                        (:vlr-modifiedXData . reaccion-obj)
                        (:vlr-unappended . reaccion-obj)
                        (:vlr-reappended . reaccion-obj)
                        (:vlr-objectClosed . reaccion-obj))))
;;;Listado 21.14. Función para vincular un reactor informativo de Objeto.