Administración de CAD

Este es un sitio dedicado a comentar sobre asuntos relacionados con el diseño CAD, BIM y diseño en general, así como sobre la administración de la información generada por estas herramientas.

Siéntanse libres de comentar las entradas y compartirnos sus experiencias y opiniones.
Mostrando entradas con la etiqueta AutoLISP. Mostrar todas las entradas
Mostrando entradas con la etiqueta AutoLISP. Mostrar todas las entradas

miércoles, 4 de mayo de 2011

Rutina para convertir textos en nodos

Fernando, del estado de México, nos comparte una necesidad que trataremos de resolver mediante la programación de una rutina de AutoLISP.

La necesidad es la siguiente:

Se cuenta con un archivo DWG con una serie de objetos de texto, los cuales están insertados en puntos específicos y su contenido representa el nivel de dicho punto. Sin embargo, la coordenada Z es igual a 0 en todas las instancias.

Lo que se requiere es hacer una rutina que permita seleccionar un objeto, y que al hacerlo se cree un nodo o punto en el punto de inserción del texto, pero en el nivel que se indica en este último.

Cómo lo vamos a resolver.

Primero haremos una rutina que nos resuelva la necesidad de forma manual, es decir, que cree el punto como lo requerimos, pero seleccionando objeto por objeto.

Posteriormente, en otro post, crearemos una rutina que haga un ciclo de la rutina primaria y seleccione todos los objetos que cumplan con el criterio especificado y genere los puntos en el archivo de forma automática.

Rutina 1: Crear un punto en el punto de inserción del texto, pero con el nivel que se especifica en este último.

Primero abrimos nuestro block de notas y comenzamos con la definición de nuestro comando. Vamos a guardar el archivo como TXT2NODO.LSP y definiremos el comando como TXT2NODO (Texto a nodo)


   (defun C:TXT2NODO ()

Vamos ahora a capturar en una variable el contenido del texto, el cual nos servirá para tener a la mano el nivel en Z donde deseamos que se cree nuestro punto:

   (setq TEXTONIVEL (car (entsel "\nSeleccione un objeto de texto: ")))

La función ENTSEL nos permite seleccionar una entidad única al hacer click en esta. La función CAR nos permite extraer el primer elemento de una lista, en este caso, el identificador de la entidad que seleccionamos previamente. Lo que hacemos en este punto es establecer esa entidad en una variable, en este caso TEXTONIVEL.

Ahora almacenaremos en una variable el contenido del texto que seleccionamos.

   (setq NIVELZ (cdr (assoc 1 (entget TEXTONIVEL))))

Aquí estamos usando varias funciones: ENTGET nos permite obtener los valores de definición de la entidad, en función de la base de datos del DXF. La función ASSOC nos permite obtener uno de los valores de dicho listado, en este caso, el valor 1 (uno) corresponde al par que representa el contenido de la entidad, en este caso un texto. La función CDR nos permite obtener el segundo valor de una lista, en este caso, el contenido del texto como tal.

Lo que hacemos es almacenar en la variable NIVELZ el contenido del texto seleccionado. Para nuestro caso, es la coordenada Z del punto que deseamos dibujar en el plano.

Ahora capturaremos el punto de inserción de la entidad, en este caso, texto:

   (setq COORDTXT (cdr (assoc 10 (entget TEXTONIVEL))))

Usamos las mismas funciones que en el caso anterior, solo que en esta ocasión, el código que estamos recuperando es el código 10, el cual representa el punto de inserción de la entidad. Lo almacenamos en la variable COORDTXT.

El valor resultante de esta función es una lista con las coordenadas X, Y y Z, algo similar a lo siguiente: (1666.1 1197.9 0.0) Donde 1666.1 es X, 1197.9 es Y y 0.0 es Z.

Ahora, definiremos las coordenadas finales del punto que insertaremos en el dibujo, en función del punto de inserción del texto y su contenido como Z.

   (setq COORDNODO (LIST (car COORDTXT)(cadr COORDTXT)(atof NIVELZ)))

Lo que hacemos en este paso es crear una lista, elemento fundamental de AutoLISP, con las coordenadas X, Y y Z. Para ello, usamos los dos primeros elementos de la lista que almacenamos en la variable COORDTXT

Para extraer el primer valor de esta (Coordenada X), usamos la función CAR, para extraer el segundo valor (Coordenada Y) usamos la función CADR, y para definir el tercer valor, usaremos la función ATOF, la cual convierte una cadena de caracteres en un valor real. Dicho en otras palabras, nosotros teníamos almacenado en la variable NIVELZ el texto que contenía la entidad de texto que seleccionamos. Lo que hacemos con la función ATOF es convertir ese texto a un número real, para que el sistema lo pueda considerar como tal.

Al final, en la variable COORDNODO tendremos una lista con los puntos X, Y y Z que necesitamos para dibujar el punto o nodo que deseamos.

Ahora solo resta dibujar el punto de forma automática usando los valores que almacenamos en la variable COORDNODO.

   (command "POINT" COORDNODO)

Aquí estamos ejecutando el comando POINT, especificando que el punto en donde se colocará el punto o nodo está almacenado en la variable COORDNODO.

Ya solo nos queda finalizar la rutina.

  (princ)
   )

La función PRINC imprime una expresión en la línea de comandos, en este caso, no estamos especificando ningún parámetro, por lo que únicamente se imprimirá un campo en blanco.

El último paréntesis cierra la función DEFUN y le indica al sistema que la función ha terminado.

Código Final

El código final de la rutina quedaría así:

   (defun C:TXT2NODO ()
    (setq TEXTONIVEL (car (entsel "\nSeleccione un objeto de texto: ")))
    (setq NIVELZ (cdr (assoc 1 (entget TEXTONIVEL))))
    (setq COORDTXT (cdr (assoc 10 (entget TEXTONIVEL))))
    (setq COORDNODO (LIST (car COORDTXT)(cadr COORDTXT)(atof NIVELZ)))
    (command "POINT" COORDNODO)
    (princ)
   )

Con esto tenemos una rutina totalmente funcional, que nos permitirá cumplir con la necesidad que plantea Fernando. Para activarla, habrá que cargar la aplicación con el comando APPLOAD de AutoCAD, y teclear en la línea de comandos TXT2NODO.

Sin embargo, si bien esta rutina puede funcionar, no tenemos ningún tipo de control. Es posible seleccionar cualquier tipo de instancia, lo que nos puede dar resultados inciertos o errores en la función. Además, ¿qué tal si tenemos miles de puntos que convertir?

En el siguiente post veremos como podemos mejorar la función para tener mayor control y funcionalidad.

Pueden expresar sus dudas en este mismo post, o a mi correo, natanvg@gmail.com

Saludos!

lunes, 11 de abril de 2011

Programando en AutoLISP, Parte 3

En la parte 3 del artículo Programando en AutoLISP comenzamos con el desarrollo de una rutina que coloca la coordenada de un punto a partir del punto de selección, bastante útil para Ingenieros Civiles, Topógrafos y todos aquellos que manejan sistemas de coordenadas.

El documento ya está en la sección Recursos de la Comunidad Latinoamericana de Usuarios de Autodesk en Español. Lo puedes bajar directamente del siguiente vínculo (requiere que te firmes en la comunidad)

http://communities.autodesk.com/?nd=resource_detail&resource_id=1614&minisite_id=6

Cualquier comentario o duda, estoy a sus órdenes.

martes, 15 de marzo de 2011

Programando en AutoLISP (Parte 2)

Después de unas semanas de espera, ya está disponible la segunda parte del artículo Programando en AutoLISP que contiene un breve y sencillo tutorial para realizar tu primer comando de AutoCAD.

Si quieres descargar el documento, entra a la sección Recursos de la Comunidad Latinoamericana de Usuarios de Autodesk en Español y búscalo como Programando en AutoLISP (Parte 2) o simplemente haz click AQUÍ (Es necesario estar registrado en la comunidad, es rápido, fácil y gratis)

Seguiremos publicando sobre este tema, así que estén al tanto de las publicaciones.

Saludos!

jueves, 3 de marzo de 2011

¿Qué rutina de AutoCAD te gustaría programar?

Como bien lo he aclarado anteriormente, no me considero para nada un programador. Sin embargo, la facilidad con la que uno, aun sin tener formación en la programación, puede automatizar tareas en AutoCAD me sigue sorprendiendo.

Es por eso que, como parte de la ayuda que se pueda brindar a los lectores, y como un reto personal, propongo que los lectores sugieran alguna rutina que pudiéramos hacer en AutoLISP.

Personalmente haré todo lo posible por hacer una rutina funcional, que cumpla con el objetivo deseado del mejor modo posible (que esté a mi alcance). Sé que tendré que investigar mucho, hacer muchas pruebas, preguntar a mis amigos que sí saben programar. Sin embargo, haré lo posible por que la solución final sea totalmente de "mi cosecha".

Una vez que logremos algo, subimos el tutorial para que quien desee replicar la rutina, lo haga a nivel personal, pero con la facilidad de tener la explicación detallada del proceso de la misma.

Así que: ¿Qué rutina de AutoCAD te gustaría programar?