2.3.4.5. Función LOGIOR

Más arriba planteábamos que para activar un BIT determinando mediante la suma del valor decimal que devuelve nuestra función (bit posición) era necesario verificar que ese BIT no estuviera ya activo. Esto lo podemos lograr con la función LOGIOR. También para LOGIOR recurriremos a Jon Fleming * en su aporte a la mencionada discusión en autodesk.autocad.customization:

(LOGIOR ...) trabaja exactamente de la misma manera, excepto de que escribimos un 1 en la posición donde uno de los valores o ambos valores de los argumentos que se le pasan tienen un 1, y ponemos un 0 donde ambos argumentos deben tener un 0. Esto es útil para combinar números. ¿Quiere asegurarse de que la referencia a objeto INTERSECCIÓN está activa sin afectar a otros modos de referencia que se hubieren establecido previamente?

(setvar "OSMODE" (logior 32 (getvar "OSMODE")))

Por supuesto, tanto (logand ...) como (logior ...) pueden aceptar más de dos argumentos. En este caso:

  1. Se aplica la función a los dos primeros argumentos, obteniendo un resultado provisional.
  2. Se aplica la función al resultado provisional y al tercer argumento, obteniendo un nuevo resultado provisional.
  3. Se repite el proceso de aplicar la función al resultado provisional actual y al siguiente argumento hasta agotar los argumentos pasados a la función.

ALGUNOS EJEMPLOS:

De Tony Tanzillo <tony.tanzillo@worldnet.att.net> tomamos los siguientes ejemplos del uso de estas funciones:

Determinar si un bloque es una Referencia Externa (RefX):

Esta función toma la lista de asociación devuelta por (tblsearch/siguiente), y devuelve T si el bloque es una referencia externa:

(defun isXref (data)
(eq 4 (logand 4 (cdr (assoc 70 data))))
)

Comprobar el valor de la variable CMDACTIVE:

No debemos utilizar la función = para comprobar el valor de CMDACTIVE, ya que su valor puede variar (y de hecho asumir valores no documentados y totalmente inesperados). En lugar de

 (= 1 (getvar "cmdactive")), 

se debe utilizar:

(eq 1 (logand 1 (getvar "cmdactive")))

Desactivar REFENT:

Para dejar sin efecto mediante LISP las referencias a objeto de carácter permanente (establecidas mediante REFENT) sin cambiar los valores preestablecidos (lo que equivaldría a pulsar la tecla F3), se puede activar el noveno bit (valor decimal de 16384):

(setvar "OSMODE" (logior (getvar "osmode") 16384))

o utilizando la función BIT antes definida:

(setvar "OSMODE" (logior (getvar "osmode")(bit 9)))

Otros ejemplos los podemos obtener de los mismos programas LISP que acompañan a AutoCAD. Para el uso de LOGIOR puede consultarse DDOSNAP.LSP de la versión 13, AI_UTILS.LSP, DDCHPROP.LSP, DDMODIFY.LSP y DDSELECT.LSP, de las versiones 13 y 14 y EXCHPROP.LSP y MPEDIT.LSP, estos últimos de la versión 14.


* De: Jon Fleming <jonf@fleming-group.com>
Newsgroup: autodesk.autocad.customization
Asunto: Logand, logior, lsh, etc...
Fecha: Jueves, 26 Feb 1998 20:35:37 EST
Organización: The Fleming Group
Traducción del inglés: Reinaldo Togores