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