En el tema anterior pudimos ver en acción las funciones que te permiten seleccionar un objeto para realizar algunas operaciones con él, a partir de este momento aprenderás a usar otras funciones que te permitirán seleccionar una o más entidades, todas las seleccionadas se agrupan en conjuntos de entidades.

Escribe lo siguiente en el archivo seleccion.lsp y cárgalo con el comando appload:

(defun c:ss()
	(princ "\nSeleccione los objetos a cambiar el color a azul: ")
	(setq ents (SSGET))
	(command "_change" ents "" "_p" "_c" "5" "")
	(setq nums (sslength ents))
	(alert (strcat "\nSe actualizaron " (itoa nums) " entidades. ")) 
	(princ) 
)

¿Observaste lo que pasó?, esta rutina hace lo mismo que la rutina anterior pero ahora con más entidades al mismo tiempo. ¿Qué te parece si evaluamos las líneas de código nuevas para detallarlas?

  1. (princ "\nSeleccione los objetos a cambiar el color a azul: ")
    
  2. (setq ents (SSGET))

La función ssget (2), es la encargada de seleccionar múltiples entidades, esta función muestra sólo el mensaje “Select objects:” (AutoCAD en inglés), es por ello que mediante la función princ (1) previamente “explicamos” mediante un mensaje para qué se va a realizar la selección de las entidades.

El usuario puede seleccionar una o más entidades y todo el conjunto de ellas (definición) se almacena en la variable ents.

  1. (command "_change" ents "" "_p" "_c" "5" "")

Aquí, como ya sabemos, la función command invoca al comando “change” para cambiar el color de las entidades seleccionadas, este comando solicita la selección de objetos a cambiar el color, le entregamos mediante programación el conjunto de entidades almacenada en la variable ents.

  1. (setq nums (sslength ents))
    
  2. (alert (strcat "\nSe actualizaron " (itoa nums) " entidades. "))

Aquí estamos usando una función importante para la creación de una rutina, se trata de sslength (4), la labor de esta función es contar el número de elementos seleccionados dentro del conjunto de selección, te preguntarás ¿Por qué es importante?, porqué muchas veces es necesario interactuar con cada uno de los elementos seleccionados, en nuestro ejemplo todos los elementos son cambiados de color a 5 (azul), pero, que pasaría si quisiéramos que todos fueran de diferentes colores, por ejemplo un color incremental. Mas adelante vamos a ver un ejemplo para este caso.

Volviendo a sslength (4), esta función, para poder contar el número de elementos, lógicamente necesita que se le indique el conjunto a contar, en este caso, le indicamos que cuente cuantos elementos tiene el conjunto ents, ese número se almacena en la variable nums, por último usamos la función alert (5) para mostrar un cuadro de mensaje que indicará cuantos elementos fueron modificados, para construir este mensaje, juntamos texto con una variable con ayuda de la función strcat (5), como no podemos unir un valor texto con un valor número entero, primero convertimos la variable nums a valor de texto mediante la función itoa.

¿Qué te pareció este ejemplo?, ¿vamos bien?, entonces modifiquemos una línea de ese ejemplo para mostrar otra bondad de la función ssget.

Ahora, del ejemplo anterior vas a modificar esta línea:

(setq ents (SSGET)) ;por esta:
(setq ents (SSGET (list (cons 0 "CIRCLE"))))

Esta actualización lo que te permitirá hacer es “filtrar” los elementos seleccionados para que se seleccionen solo círculos, entonces solo las entidades de tipo “CIRCLE” se almacenarán en la variable ents.

Para construir este “filtro” primero tenemos que construir una lista, en un tema anterior ya hemos aprendimos que podemos construir una lista con la función LIST, pero en este caso, no estamos construyendo una coordenada, sino una lista de una referencia a una sublista de la base de datos de un objeto.

Para construir esta sublista que referencia a un código de acceso al tipo de entidad del objeto seleccionado, usamos la función CONS, esta función para construir la lista necesita que se le indique un número (código) y un valor asociado, en este caso el valor 0, indica el tipo de entidad de un objeto.

Mas adelante conocerás más acera del acceso a base de datos de objetos.

Si ejecutas de nuevo el comando ss, verás que a pesar de que selecciones varios tipos de entidades (por ejemplo, círculos, líneas y otros) sólo serán modificados los objetos tipo “circle”, es decir los círculos.

¿Qué te parece?, ¿se pone un poco más fuerte?, eso parece, es por ello que debes de practicar más y más.

Funciones que se han visto en este tema:

  1. defun
  2. setq
  3. ssget
  4. sslength
  5. alert
  6. itoa
  7. list
  8. cons
  9. command
  10. princ
  11. strcat

Para poder observar la potencia de la selección de objetos, vamos a quedarnos con los ejemplos pequeños que hemos desarrollado para este tema y pasaremos a ver funciones condicionales, el uso combinado de estos dos tipos de funciones hará que podamos programar rutinas un poco más complejas y apreciar una verdadera utilidad con ejemplos al estilo de los que más usamos en nuestro trabajo, de paso tomamos un poco de aire para esta subida. ¿Te parece?, bien!, entonces continuamos.