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?
(princ "\nSeleccione los objetos a cambiar el color a azul: ")
(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.
(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.
(setq nums (sslength ents))
(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:
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.
ME GUSTARIA IMPORTAR PUNTOS A AUTOCAD CREARMI PROPIO APLICATIVO ME GUSTARIA APRENDER YA HE REALIZADO TODOS LOS EJERCICIO DE LIST PERO COMO INICIO IMPORTANDO MIS PUNTOS D MI GPS MOVIL
Hola Jaime.
Normalmente los dispositivos de recolección de datos tienen su propio software para «descargar» los datos a la PC, este software ofrece diferentes opciones para bajar la información con diferentes formatos, el formato mas comun es el «CSV» (delimitado por comas).
Una vez que tengas la información en ese formato, puedes desarrollar cualquier aplicación en AutoLisp y VisualLisp para importar puntos a AutoCAD, con funciones para abrir, leer y escribir en archivos, puedes hacerlo.
Hola Mario
Me quede con un problema con la funcion sslenght y solo me arroja un NO FUNCTION DEFINITION: SSLENGHT… estoy usando AutoCAD en aleman, quizas sea ese un problema, tambien lo intente con _sslenght y tampoco funciona. alguna idea.
Muchas gracias por este tutorial
Hola Emmanuel, autoLisp es independiente del idioma de AutoCAD, usar el subguión es sólo valido para los nombres de los comandos (estos si están lozalizados de acuerdo al idioma de la versión de AutoCAD).
¿Puedes copiar todo el código que haz avanzado para observarlo?
Muchas gracias por tu respuesta, pero me acabo de responder yo solo 😀 tenía escrito SSLENGHT en vez de SSLENGTH!!!! bueno, no hay nada mejor que descubrir y sorprenderse uno mismo… también me apareció un problema con itoa, pero se me ocurrió probar escribiendo (ITOA nums) y resultó 😀
Estoy muy entusiasmado con tus tutoriales, están muy bien explicados. Sin duda me verás comentando en los artículos que vienen.
Jejeje, bueno, en programación, hasta una coma y un punto hacen la diferencia.
Una pregunta, sigue sin quedarme muy claro esta línea de código
(setq ents (ssget(list (cons 0 «circle»))))
¿no podría hacerse la lista directamente con el 0 y «circle» sin tener que usar cons?
Espero pueda ayudarme
La idea es construir una lista, puede ser de 2 formas:
(setq ents (ssget (list (cons 0 «circle»))))
ó
(setq ents (ssget (list ‘(0 . «circle»))))
Pero es mejor usar CONS para listas mas complejas.