Te comento que ésta no es la última función condicional que veremos, pero es una de las más usadas, esta función junto con las demás funciones que hemos visto, te permitirán ya comprender como se programa en AutoLisp e ir creando tus propias rutinas, quizá al principio simples, pero luego con la práctica y más información serán mas complejas.

El condicional WHILE, permite repetir acciones mientras se cumpla una condición dada que sirve como elemento de control de la repetitiva, mientras la condición se cumpla o sea verdadera (T) todas las acciones se ejecutan, hasta que la condición resulte falsa (nil).

Condicional While DevCADLisp

Veamos un ejemplo para que puedas ver a while en acción, escribe este código en un archivo de texto y guárdalo como wh.lsp y cárgalo en AutoCAD con el comando “Appload“.

(defun c:cn4()
	(setvar "cmdecho" 0)
	(setq areatotal 0)
	(while 
		(setq ent (entsel "\nSeleccione un objeto a obtener el área: "))
		(command "area" "o" ent)
		(setq areahallada (getvar "area"))
		(setq areatotal (+ areatotal areahallada))
	)
	(alert (strcat "\nArea hallada: " (rtos areatotal 2 3) " m2"))
	(setvar "cmdecho" 1)
	(princ)
)

¿Qué te pareció?, a continuación te explico que ayuda a hacer este comando.

Como te habrás podido dar cuenta, al ejecutar este comando lo que hace es pedir la selección de objetos y va hallando el área de cada uno de ellos, hasta que finalmente si ya no se selecciona ninguno (Enter) entonces muestra la sumatoria de todas las áreas halladas.

Si se selecciona algún objeto que no contiene un área por ejemplo un texto, este comando produce un error, ya que es necesaria la ayuda de otras funciones mas avanzadas para interceptar este tipo de errores y corregirlos para evitar que el comando se cancele, esta información la podrás encontrar con temas mas complejos, que encontrarás aquí.

Ahora analizaremos juntos línea a línea este nuevo comando llamado cn4, ¿estás listo?, vamos!.

  1. (setq areatotal 0)

Aquí se está creando la variable “areatotal” con un valor de 0. Esta rutina va acumulando las áreas que se van hallando en esta variable, es por ello que al ejecutar el comando, debemos de empezar la rutina “reseteando” su valor a 0, de lo contrario podría incrementarse con un área hallada en una ejecución anterior.

  1. (while
    
  2. )

Aquí es donde entrar a tallar el condicional while, como puedes observar, abrimos un paréntesis para situar a la función y a continuación debajo de ello escribimos el código que va a evaluar while.

Se podría pronunciar de la siguiente manera: mientras que la variable “ent” tenga un valor o sea diferente de nulo (nil), se ejecuta las líneas siguientes de código que están dentro del while (cierre del paréntesis).

  1. (setq ent (entsel "\nSeleccione un objeto a obtener el area: "))

Ya conoces la función entsel, aquí la usamos para seleccionar el objeto del cual vamos a obtener el área, ese objeto o entidad seleccionado lo almacenamos en la variable “ent“, si ante la solicitud de seleccionar un objeto, se presiona la tecla Enter, la variable “ent” se crea nula (nil).

  1. (command "area" "o" ent)

Esta línea de código mediante la función command, invoca al comando area para hallar el área de un objeto, le especificamos que sea de un objeto porque ingresamos la opción “o” (object) y seguidamente especificamos que el “objeto” esta dentro de la variable ent (el objeto seleccionado).

El comando area obtiene el área de un objeto seleccionado pero no la muestra, esta área hallada se almacena en una variable de sistema llamada “area”, es por ello que en la siguiente línea usaremos la función getvar para obtener esa área guardada y la almacenamos en la variable areahallada mediante la función setq, lo que podrás observar en la siguiente línea de código.

  1. (setq areahallada (getvar "area"))

Posteriormente, lo que necesitamos hacer es actualizar la variable areatotal, entonces a esta variable que ya existe y que empieza con un valor de 0, le sumamos el área hallada contenida en la variable creada areahallada, ahora la variable areatotal va a contener el acumulado de las área halladas:

  1. (setq areatotal (+ areatotal areahallada))

La función while repite todo esto hasta que se presiona “Enter” para dar por finalizada la selección de entidades y a continuación el comando muestra un mensaje de alerta con información del área acumulada:

  1. (alert (strcat "\nArea hallada: " (rtos areatotal 2 3) " m2"))

Construimos el mensaje, concatenando un texto con una variable con ayuda de la función strcat, pero como ya sabemos, primero tenemos que transformar la variable numérica (real) a un valor de texto para poder unir texto con texto, es por ello que usamos la función rtos, que permite cambiar el tipo de dato de numérico (decimal) a valor de texto, el numero 2 indicado despues de la variable areatotal, indica el tipo de unidades (2 indica tipo decimal) y el número 3 indica el número de decimales, en este caso indica 3 decimales.

Una vez construido el mensaje usamos la función alert para mostrar un cuadro de diálogo con el mensaje indicando el área total hallada.

¿Que te parecieron estas funciones?, en estos momentos estás en la parte del proceso de aprendizaje, en donde lo primero es encontrarle sentido al lenguaje, comprender su estructura y el cómo programar, primero desde una rutina sencilla hasta una mas compleja posteriormente.

Funciones que se han visto en este tema:

  1. defun
  2. setvar
  3. setq
  4. while
  5. entsel
  6. command
  7. getvar
  8. +
  9. alert
  10. strcat
  11. rtos
  12. princ

A continuación conoceremos funciones muy importantes que te permitirán acceder a información de la estructura de las entidades dibujadas en AutoCAD con el propósito de usar esa información como datos para procesar un resultado o para modificarla y así editarlas.

¿Ya tomaste tu café?, entonces ahí vamos.