Hemos visto que con la función ENTGET podemos acceder a todas las propiedades de una entidad seleccionada, pero en muchos casos o en casi todos, sólo nos interesa acceder y obtener algunas de ellas en particular por ejemplo (altura de texto, contenido de texto, capa, centro, punto de inicio, fin, etc).

Es por ello que usaremos una función que nos ayudará a ello, se trata de la función ASSOC, esta función nos permite referirnos a un elemento especificado de una lista asociada que lo contiene, lo obtenido es la sublista que coincide con el código indicado.

Pero que te parece si mejor escribimos algunos ejemplos para comprender mejor ENTGET y ASSOC. Escribe en un nuevo archivo de texto lo siguiente y lo guardas con el nombre de basedatos.lsp.

(defun c:bde()
	(while 
		(setq EntidadSel (entsel "\nSeleccione un objeto: "))
		(setq NombreEntidadSel (car EntidadSel))
		(setq ListaBaseDatosEntidad (Entget NombreEntidadSel))
		(setq SubListaTipo (assoc 0 ListaBaseDatosEntidad))
		(setq TipoEntidad (cdr SubListaTipo))
		(Alert (strcat "El tipo de entidad del objeto seleccionado es: " TipoEntidad))
	)
	(princ)
)

Habrás notado, que cuando ejecutas el nuevo comando bde, te solicita seleccionar cualquier objeto y finaliza una vez que ya no selecciones ninguno (Enter o clic derecho).

La información que te muestra el comando es el tipo de entidad seleccionada, este es el tipo que deberás de evaluar cuando desees comprobar si la entidad seleccionada es la que finalmente deseas procesar.

Por ejemplo, si seleccionas una polilinea, el comando te informa que se trata de una “LWPOLYLINE”, este es el verdadero nombre de la entidad.

¿Estás esperando la explicación de la rutina?, bien aquí va.

  1. (while
    
  2. 	(setq EntidadSel (entsel "\nSeleccione un objeto: "))
    
  3. )

En primer lugar, mediante la función while le estamos indicando al comando que ejecute una acción repetitiva pero con una condicional, la condición es “mientras se defina (o sea creada) la variable EntidadSel, se ejecuten el resto de acciones”, es por ello que si se presiona Enter y la variable EntidadSel no es creada (valor nil), finaliza el ciclo (bucle) de while y por lo tanto el comando.

Como hemos visto anteriormente, con entsel la variable EntidadSel obtiene una lista con 2 valores, el nombre y el punto de designación (coordenada), en este caso lo que nos interesa es obtener solo el nombre de la entidad para obtener su base de datos y poder acceder a las propiedades de esa entidad, es por ello que usamos la función car para obtener el primer elemento de la lista (nombre) y almacenarlo en la variable NombreEntidadSel.

  1. (setq NombreEntidadSel (car EntidadSel))

Ahora que ya tenemos el nombre de la entidad seleccionada, vamos a obtener la base de datos de esa entidad y para ello usamos la función entget.

  1. (setq ListaBaseDatosEntidad (Entget NombreEntidadSel))

De esta forma, obtenemos la lista de la base de datos de la entidad y almacenamos esa lista en una variable llamada ListaBaseDatosEntidad, ¿Cómo vamos hasta aquí?, ¿todo bien?, entonces continuamos con la siguiente línea.

  1. (setq SubListaTipo (assoc 0 ListaBaseDatosEntidad))

En esta línea de código usamos assoc para obtener la sublista asociada al código 0 (cero), esta función devuelve un valor parecido a este: (0 . “CIRCLE”) y lo almacena en la variable SubListaTipo, pero aún no conseguimos lo que deseamos, que es solo el nombre del tipo de entidad, así que escribimos lo siguiente.

  1. (setq TipoEntidad (cdr SubListaTipo))

Ahora sí, esta es la última línea de código que nos permite obtener el nombre del tipo de entidad, esta vez usamos la función CDR que obtiene todos los elementos de una lista excepto el primero. De la lista (0 . “CIRCLE”) obtuvo CIRCLE y lo almacenó en la variable TipoEntidad y por último, como ya tenemos el tipo, lo vamos a mostrar en un mensaje con el siguiente código.

  1. (Alert (strcat "El tipo de entidad del objeto seleccionado es: " TipoEntidad))

¿Qué te pareció todo este proceso? Todas estas línea de código de ejemplo, estan detalladas y escritas una por una para tu mejor comprensión, pero prueba escribiendo esta otra línea:

(Alert (strcat "El tipo de entidad del objeto seleccionado es: " (cdr (assoc 0 (entget (car (entsel "\nSeleccione un objeto: ")))))))

¿Notaste que se obtiene lo mismo que en la rutina anterior?, es porque en esta última línea de código que te he mostrado, se están empleando las funciones de una forma anidada, sin crear ninguna variable, esta forma de escribir el código es válida pero no se recomienda, salvo si no vas a necesitar usar posteriormente algún valor de una variable.

¿Vamos avanzando verdad?, a continuación, después de haber aprendido como acceder a la base de datos de una entidad y a cualquiera de sus propiedades, en el siguiente tema conocerás como modificar las propiedades de los objetos o manipular la información que ellas contienen.

Funciones que se han visto en este tema:

  1. entget
  2. entsel
  3. assoc
  4. car
  5. cdr

Si deseas aportar, agregar o realizar algún comentario, lo dejas aquí abajo.