Ahora ya no escribiremos el código de una rutina directamente en la Línea de comandos de AutoCAD porque es cada vez mas extenso, consigue un editor de texto (no Word ni Worpad), por ejemplo “Crimson Editor” o Bloc de Notas (básico) y escribe lo siguiente:
(defun c:cr()
(setq PC (getpoint "\nIndica el punto centro del círculo: "))
(setq DIAM (getreal "\nIngresa el radio del nuevo círculo: "))
(command "_circle" PC DIAM)
(princ)
)
Ahora guarda este archivo como “círculo.lsp”, luego en AutoCAD usa el comando “appload” para ubicar este archivo, cargar este código y almacenarlo en su memoria.
Muy bien, ahora en la línea de comandos de AutoCAD escribe lo siguiente “cr”, que es el nombre del comando que se ha establecido en el código de la rutina.
Observarás que este nuevo comando te solicita primero los datos necesarios antes de dibujar el círculo, analizaremos juntos el código de este comando:
(defun c:cr()
La función “defun”, permite definir una nueva función de usuario, puede definir una función para ser llamada mediante un nombre de comando desde AutoCAD (como este caso) sólo agregando el prefijo «c:» antes del nombre de la función o solo como bloque de código que puede ser llamado desde otra función.
(setq PC (getpoint "\nIndica el punto centro del círculo: "))
En la línea código anterior, tenemos dos funciones una dentro de otra, incluso podrían ser más, en este caso AutoLisp evalúa las funciones de adentro hacia afuera, eso quiere decir que en este caso primero evaluará la función getpoint y luego evaluara la función setq.
Ok, se que necesitas mas explicación y aquí va, la función getpoint está solicitando al usuario que indique un punto, este punto indicado en pantalla obtiene coordenadas, que pueden ser cualquiera, ahí termina el trabajo de getpoint, ahora, para que esas coordenadas obtenidas no queden flotando, las almacenaremos en una variable, para ello le daremos ese trabajo a la función setq que sirve para almacenar valores a variables, en este caso las coordenadas obtenidas se almacenan en la variable PC.
* Si observas el código, algunas líneas de texto empiezan con lo siguiente: «\n», esto es un caracter de escape que indica que la línea de texto se escriba en una nueva línea, similar a dar un Enter.
(setq DIAM (getreal "\nIngresa el radio del nuevo círculo: "))
La explicación de esta tercera línea de código es parecida a la anterior, la función getreal está solicitando al usuario que ingrese un valor real (con decimales), sabemos que puede ser cualquier valor, ahí termina el trabajo de getreal, ahora, también almacenaremos ese valor obtenido en una variable para no perderlo, para ello nuevamente daremos ese trabajo a la función setq que se encargará de almacenar este valor en la variable DIAM.
A esta altura, te das cuenta que ya tenemos los dos valores que necesita el comando “circle” para dibujar un círculo, así que vamos a dibujarlo con AutoLisp con la función command.
(command "_circle" PC DIAM)
La función command se encargará de ejecutar el comando «_circle», como sabemos que el comando “circle” solicita datos para crear el círculo, se los daremos uno por uno, para la ubicación del círculo le daremos la variable PC y para el radio la variable DIAM.
* Agregamos el «_» antes del nombre del comando para que éste sea aceptado para cualquier idioma de AutoCAD, porque si solo invocas al comando «circle» en AutoCAD en español sin el «-» no lo reconocerá debido a que el comando en AutoCAD en español es «circulo».
Eso es todo, con ese código se dibujará el círculo, pero, un momento ¿y la línea siguiente de código?, bien, la quinta línea que es esta:
(princ)
Se encarga de limpiar la finalización de un comando, usualmente para evitar la palabra “nil” que significa vacío o final.
PRÁCTICA:
Practica ahora escribiendo las siguientes rutinas en tu editor de código favorito y luego cargas cada una de ellas en AutoCAD. Ejecuta cada una, evalúa las solicitudes y lo que hace cada una de ellas:
1. Rutina 1:
(defun c:no()
(setq pno (getpoint "\Indica el punto del nuevo origen del UCS: "))
(command "_ucs" pno "")
(princ)
)
2. Rutina 2:
(defun c:texto()
(setq pin (getpoint "\Indica el punto de inserción del texto: "))
(setq altura (getreal "\Indica la altura del texto: "))
(setq texto (getstring t "\Ingresa el texto que desees: "))
(command "_text" pin altura "" texto "")
(princ)
)
¿Qué te pareció esta práctica?, ¿me podrías indicar mediante tu comentario que hace aquí cada comando (el comando «no» y el otro comando «texto»)?
Funciones que se han visto en este tema:
ALCANCE DEL SIGUIENTE TEMA:
En el siguiente tema iremos profundizando el uso de las variables para encontrarle mayor sentido a su uso, podrás observar que de aquí en adelante no dejarás de usar las variables y operar con ellas.
Bastante interesante el curso…
Opino que para comprender un poco más la lógica de cada uno de los programas que vas presentando, es importante usar primero el comando para analizar los parámetros solicitados por el propio AutoCAD, por ejemplo, con el comando TEXT que en la práctica se activa como (command «_text» se solicita el start point of text, posteriormente se solicita especificar la altura «specify height» y por último se solicita specify rotation angle of text o especificar el ángulo de rotación del texto, pero en la rutina jamás fue definida esa variable, cosa que se soluciona con la doble comilla.
Ahora, el AutoCAD nos abre un cursor en el punto que le habíamos indicado solicitando que ingresemos el texto en el que estamos interesados, pero la rutina lo soluciona con un getsring t para solicitarnos una cadena de caracteres…
El segundo par de comillas escritas en la rutina es para indicarle al AutoCAD que hemos terminado de escribir…
Felicidades por todo esto!!!…
Muchas gracias por el tremendo trabajo de explicar este tema. Personalmente me considero un usuario experto de AutoCAD, pero de todas formas siempre digo que aun tengo que aprender a programar, ya sea en con Lisp o VBA.
Nuevamente muchas gracias!
Por nada Emmanuel, AutoLisp te lleva un paso más allá de la experiencia que tienes con AutoCAD.
Saludos!
Buen día, este curso me está ayudando demasiado, pero me gustaría saber algo de esta línea de código:
(command «_text» pin altura «» texto «»)
Los espacios vacíos donde están las comillas dobles, ¿Qué datos son los que deberían ir ahí o por qué se dejan vacíos?
Agradecería mucho su respuesta
Hola Erika,
Las comas vacias en una línea de código lisp dentro de la función «command» equivale a ingresar un Enter en la línea de comandos.
En el caso que me consultas, las primeras comillas vacias representan que «aceptas» con un Enter el valor del ángulo de rotación por defecto que te muestra el comando, que por defecto es 0.00, si deseas que el texto a generar tenga otro ángulo, en lugar de que las comillas sean vacías, puedes por ejemplo escribir «90.00», con lo cual indicarás que el texto se genere con una rotación de 90 grados.
Las segundas comillas vacias en este caso, indican que ya no se desea ingresar ningun otro texto adicional, por lo cual se da un «enter» para finalizar.
Tu puedes realizar una prueba llamando al comando «_text» desde la línea de comandos e ir ingresando lo que el comando solicita, verás que es lo que te solicita el comando en la ubicaión de las comillas vacías.
Me encanta este curso, es el que más me hace avanzar en menos tiempo. Mis «dieses».
El comando «No» cambia el origen del SCP
El comando «Texto» inserta un texto de altura, punto de inserción y cadena de texto que hemos especificado antes.
También he descubierto que no puedo llamar al comando «Texto» con ese nombre, ya que ya existe un comando con el mismo alias que (imagino) tiene prevalencia sobre el comando que he creado con el LISP, así que después del «defun» he tenido que cambiar el alias
(defun c:textoo()
También me he dado cuenta que cuando me pide la cadena de texto a ingresar no puedo poner espacios, por que AutoCAD lo toma como un ENTER.
Un saludo, de nuevo muchas gracias por el curso.
Hola jordiZ. Gracias por tu apreciación.
Con respecto al nombre de la función comando, tienes razón, como uso AutoCAD en inglés no pude ver la incompatibilidad con el nombre del comando «texto» en español.
Como dices, para ingresar espacios en una cadena de texto debes de agregar el argumento «T» antes de la cadena de solicitud:
(getstring T «Ingresa una cadena de texto con espacios: «)
Muchas gracias, eso me aclara muchísimo esta lección, un saludo!!
Excelente. se aprende poco a poco.
no: nuevo punto de origen de coordenadas
texto: un texto cualquiera dentro de dibujo