;;;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 7.  Entrada de datos.
(defun valor-por-defecto (func mensaje valor / tmp)Â
  (ifÂ
    (setq tmp (applyÂ
                func
                (listÂ
                  (strcat mensajeÂ
                          "<"
                          (vl-princ-to-string valor)
                          ">: "))))
    tmp
    valor))
;;;Listado 7.1. Solicitud de datos incluyendo valor predeterminado.
(defun cadena-por-defecto (mensaje valor / tmp)Â
  (setq tmp (apply 'getstringÂ
                   (list (strcat mensaje "<" valor ">: "))))
  (if (/= tmp "")Â
    tmp
    valor))
;;;Listado 7.2. Solicitud de cadena con valor predeterminado.
(defun valor-con-opciones (funcion mensaje opciones / tmp)Â
  (initget opciones)
  (ifÂ
    (setq tmp (applyÂ
                funcion
                (listÂ
                  (strcat mensajeÂ
                          " ["
                          (vl-string-translate "/" " " opciones)
                          "]: "))))
    tmp))
;;;Listado 7.3. Solicitud de datos incluyendo opciones.
(defun getfixnum (mensaje / tmp)Â
  (initget 1)
  (setq tmp (getreal mensaje))
  (while (and tmp (not (< -2147483647.0 tmp 2147483647.0)))Â
    (promptÂ
      "Requiere un nº entero entre -2147483647 y 2147483647..\n")
    (initget 1)
    (setq tmp (getreal mensaje)))
  (if (numberp tmp)Â
    (fix tmp)
    tmp))
;;;Listado 7.4. Función para obtener números enteros largos.
(defun id-bits (valor /)Â
  (vl-remove 0Â
             (mapcar '(lambda (i) (logand i valor))Â
                     '(1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768Â
                       65536))))
;;;Listado 7.5. Función para detectar los bits activados.
(defun bits-activos? (bits valor)Â
  (= bits (logand bits valor)))
(defun activa-bits (bits valor)Â
  (logior bits valor))
(defun anula-bits (bits valor)Â
  (logand (~ bits) valor))
;;;Listado 7.6. Funciones para comprobar, activar o anular bits.
(defun conmuta-varsis (varsis bits)Â
  (setvar varsis (boole 6 (getvar varsis) bits)))
;;;Listado 7.7. Conmutador de variables.
(defun cmd-entrar (/ 3dosm)Â
  (ifÂ
    (and (setq 3dosm (getvar "3DOSMODE"))Â
         (not (bits-activos? (lsh 1 0) 3dosm)))
    (conmuta-varsis "3DOSMODE" (lsh 1 0)))
  (if (not (bits-activos? (lsh 1 14) (getvar "OSMODE")))Â
    (conmuta-varsis "OSMODE" (lsh 1 14)))
  (if (bits-activos? (lsh 1 0) (getvar "CMDECHO"))Â
    (conmuta-varsis "CMDECHO" (lsh 1 0))))
;;;Listado 7.8. Ajuste de las variables de sistema antes de entrar al comando.
(defun cmd-salir (/ 3dosm)Â
  (ifÂ
    (and (setq 3dosm (getvar "3DOSMODE"))Â
         (bits-activos? (lsh 1 0) 3dosm))
    (conmuta-varsis "3DOSMODE" (lsh 1 0)))
  (if (bits-activos? (lsh 1 14) (getvar "OSMODE"))Â
    (conmuta-varsis "OSMODE" (lsh 1 14)))
  (if (not (bits-activos? (lsh 1 0) (getvar "CMDECHO")))Â
    (conmuta-varsis "CMDECHO" (lsh 1 0))))
;;;Listado 7.9. Restitución de los valores originales al salir del comando.