En este primer ejercicio programaremos en Lisp un nuevo comando que va a permitir sumar todos los valores de los textos (entidades tipo texto) seleccionados.

Primero, escribe las siguientes líneas de código en un archivo de texto, puedes usar el Bloc de notas u otro editor de textos, te sugiero usar Visual Lisp incorporado en AutoCAD, Lisp Debugger para ZWCAD o Crimson Editor, Notepad++ para todos. Observa bien los paréntesis de apertura y de cierre, el número de paréntesis que abres debe de ser igual al número de paréntesis que cierras y cada paréntesis antecede a una función Lisp.

Vamos con el ejemplo:

(defun c:sumdcl()
	(setq suma 0 n 0)
 
	(princ "\nSeleccione los textos a sumar:")
	(setq seltext (ssget (list (cons 0 "TEXT"))))
 
	(if (not (null seltext))
		(progn
			(setq nums (sslength seltext))
			(repeat nums
				(setq nt (ssname seltext n))
				(setq vtextactual (cdr (assoc 1 (entget nt))))
				(setq suma (+ (atof vtextactual) suma))
				(setq n (1+ n))
			)
			(princ (strcat "\nLa suma total es: " (rtos suma 2 3)))
		)
		(alert "No se han seleccionado objetos.")
	)
 
	(princ)
)

Guarda el archivo en una carpeta en la que guardarás tus practicas con el nombre de “Ejercicio 1.lsp” y cárgalo en tu programa de CAD, usa para ello el comando “APPLOAD” (AutoCAD y ZWCAD) o copia el archivo y pégalo en la ventana de dibujo.

Luego en la línea de comandos escribe “sumdcl” que es el nombre del nuevo comando que has desarrollado, esto hará que se ejecute y comience con la secuencia de código que has escrito, si todo el código está bien, entonces no se producirá ningún error de carga o ejecución.

Lo primero que solicitará la rutina será la selección de textos, selecciona objetos diversos, entre ellos textos que tengan como contenido números, verás que el comando sólo tomará los objetos que sean textos y te devolverá la suma de sus valores.

¿Qué te pareció lo que has desarrollado?, ¿vamos bien?, a continuación, detallaremos cada línea de código para analizar las funciones que intervienen y que es lo que logra cada una de ellas.

Explicación detallada de este ejercicio:

  1. (defun c:sumdcl()

En esta primera línea de código, estas usando la función “defun” para crear una nueva función de usuario, todas las funciones de usuario deben de tener un nombre para poder ser llamadas desde cualquier lugar del código fuente, en este caso, la función “sumdcl” se está creando como un nuevo comando de AutoCAD y lo sabemos porque estamos usando el prefijo “c:” antes del nombre de la función, en resumen estamos creando un nuevo comando llamado “sumdcl” y como tal lo podremos invocar desde AutoCAD.

Si cuentas el número de paréntesis de apertura y de cierre notarás que en esta línea de código tienes 2 paréntesis de apertura y sólo uno de cierre, esto se debe a que los argumentos de la función “defun”, es todo el código fuente que puedas crear y una vez terminado, recién podrás cerrar el paréntesis de “defun” y finalizar la función.

Para más detalles acerca de la función “defun”, puedes visitar:
About Defining Commands (AutoLISP)

  1. (setq suma 0 n 0)

Detalle

  1. (setq ContenidoTexto (cdr (assoc 1 (entget NomEntidad))))

En la línea 2, con la función car obtenemos el nombre del objeto seleccionado y lo almacenamos en la variable NomEntidad posteriormente con la línea 3 empleamos las funciones necesarias para obtener del texto seleccionado su contenido y es en este orden:

entget obtiene la lista de la base de datos, assoc ubica la sublista con el código 1, cdr se encarga de obtener el segundo elemento de la sublista y se establece este valor en la variable ContenidoTexto.

  1. (setq EntidadReemp (entsel "\nSeleccione el texto a reemplazar: "))
  1. (setq NomEntidadReemp (car EntidadReemp))

En la línea 4, volvemos a seleccionar un texto, pero esta vez se trata del texto que deseamos reemplazar y almacenamos la entidad en la variable EntidadReemp.

Posteriormente en la línea 5 obtenemos solo el nombre de la entidad seleccionada a reemplazar y almacenamos ese nombre en la variable NomEntidadReemp.

A continuación en la línea 6 obtenemos la base de datos de esa entidad que será reemplazada y almacenamos la lista en la variable BaseNomEntidadReemp:

  1. (setq BaseNomEntidadReemp (entget NomEntidadReemp))
  1. (setq ListEntNuevaTexto (subst (cons 1 ContenidoTexto)(assoc 1 BaseNomEntidadReemp) BaseNomEntidadReemp))

Posteriormente en esta línea 7 estamos creando la variable ListEntNuevaTexto, que almacenará el trabajo de la función subst, esta función reemplaza una sublista por otra de la definición de una base de datos, los argumentos de la función subst son las siguientes:

  1. (subst nuevoitem viejoitem listabasedatosobjetoreemplazar)

En nuestro ejemplo el argumento nuevoitem es la construcción de una nueva sublista, usamos la función cons y como primer elemento le indicamos el código 1 y como segundo elemento el valor del contenido del primer texto seleccionado.

Como argumento viejoitem, hacemos referencia a la sublista que existe en la base de datos de la entidad a reemplazar, para ello usamos assoc para ubicar la lista que empieza con el código 1 de esta base de datos a reemplazar (BaseNomEntidadReemp) con el valor de nuevoitem.

Este reemplazo lo hacemos en la base de datos definida en el argumento listabasedatosobjetoreemplaza, que en nuestro ejemplo es BaseNomEntidadReemp.

Esta nueva lista actualizada por subst se almacena en la variable ListEntNuevaTexto que en realidad contiene la definición de la entidad modificada.

La edición de la base de datos de esta entidad (texto), no actualiza automáticamente el contenido del texto en pantalla, para actualizar necesitamos usar la función entmod, que es la que se encarga de actualizar los cambios de una entidad en pantalla.

Veras el código en esta novena línea.

  1. (entmod ListEntNuevaTexto)

La función entmod solo necesita un argumento y éste es el indicar que lista de base de datos (entidad) es la que va a actualizar.

Todo este código que hemos analizado se va a repetir “n” veces porque estamos usando la función while, cuya condición es “mientras se seleccione un objeto en la pantalla… se ejecuten las acciones siguientes”.

¿Qué te pareció todo lo analizado?, ¿está claro?, ¿medio claro?, no te preocupes, con la practica lograrás dominar este lenguaje.

A continuación practicaremos muchas de las funciones aprendidas hasta este momento con ejemplos muy prácticos y muy parecidos a los que probablemente usas en tu trabajo, aunque estos ejemplos están orientados a procesos de dibujo de Ing. Civil, igualmente te ayudarán a aprender a crear programas para usarlos en cualquier especialidad.

Recuerda que debes de mantener tu entusiasmo y dedicación, ten paciencia contigo mismo y lo lograrás.

¿Estás preparado?, OK.

Funciones que se han visto en este tema:

  1. entmod
  2. while
  3. setq
  4. entsel
  5. car
  6. assoc
  7. entget
  8. subst
  9. cons
  10. princ
  11. cdr

Si deseas aportar, agregar o realizar algún comentario, lo dejas aquí abajo.