You are on page 1of 35

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Sergio Raymundo Jaime Bernal Comunidad Latinoamericana de Usuarios de Autodesk en Espaol. Sigma High Consulting

CP220-5V

Sin saber programar, este curso le ensear como utilizar Visual LISP y adecuar el comportamiento de aplicaciones basadas en AutoCAD (AutoCAD Civil 3D, AutoCAD Map 3D, AutoCAD Architecture, etc.). En este curso aprender como controlar la interfaz y programar las barras de herramientas con pequeos comandos. Crear comandos nuevos y sustituir comandos de AutoCAD para que se desempeen como usted quiere. Aprender a utilizar formas diferentes de agrupar objetos. Sabr cmo est conformada la base de datos de AutoCAD. Podr crear y borrar layers automticamente y preparar las caractersticas adecuadas para una plantilla de dibujo. Por ltimo aprender a crear una pequea aplicacin para extraer informacin de su dibujo para automatizar la tarea de conteo de blocks. Aprenderemos en 10 sencillos pasos a: Controlar la Interfaz de AutoCAD Programar la barra de herramientas Crear y Modificar comandos Explorar la base de datos de AutoCAD Crear y Borrar Layers Automticamente Crear una Plantilla de Dibujo Contar Blocks

Acerca del Presentador:


Sergio Bernal es un reconocido consultor especialista en AEC, la Industria Geoespacial y la Manufactura. Es usuario de AutoCAD desde sus primeras versiones y ha escrito y traducido libros de matemticas, computacin y en particular de herramientas de software como El ABC del AutoCAD 10 o el Curriculum Educativo de Autodesk Inventor 2009 para la divisin de Educacin de Autodesk. Ha entrenado a ms de 10,000 estudiantes en diversos centros de enseanza de Mxico y Latinoamrica y actualmente se desempea como Coordinador de la Comunidad Latinoamericana de Usuarios de Autodesk en Espaol, es director de su propio centro de consultora y capacitacin, ofreciendo asesora profesional para la implementacin del software de Autodesk por ms de 20 aos. Su formacin acadmica abarca estudios de postgrado en Sistemas, Administracin de Informacin y Project Management . Comunidad de Usuarios: http://communities.autodesk.com/comlaude Email de la Comunidad: sergio.bernal@designerscommunity.org Email Sigma High Consulting: sergio.bernal@sigmahc.com

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

1. Introduccin
Bienvenidos a este cuso rpido de programacin con Lisp para AutoCAD. No eres un programador y no sabes nada de programacin? No te preocupes, aqu aprenders en 10 sencillos pasos a utilizar esta fantstica opcin de programacin para aquellos que no lo han hecho antes. Vayamos pues a conocer cmo puedo personalizar y controlar mis aplicaciones basadas en AutoCAD en unos minutos.

1.1 Un poco de historia Para los que gustan de conocer todos los detalles, El origen del Lisp como lenguaje se remonta al ao de 1956. A principios de los aos sesenta se daba un fuerte impulso al desarrollo de la llamada Inteligencia Artificial y con ello el Lisp se populariz y se crearon nuevos intrpretes del lenguaje incluso computadoras llamadas mquinas de Lisp Desde principios de los 80s, los programadores reconocieron aspectos comunes en sus lenguajes y surgi el Common Lisp como estndar de Lisp Del Common Lisp se deriva el Xlisp de donde podemos considerar que AutoLISP surgi directamente como intrprete de Lisp para AutoCAD La primera versin aparicin en la versin 2.18 de AutoCAD, podramos decir una actualizacin menor de AutoCAD entre su versin 6 y 7 en enero de 1986 Tradicionalmente un archivo simple de texto abierto (formato ASCII) con extensin .LSP Visual LISP aparece en Mayo de 1997 como un entorno integrado de desarrollo para AutoLISP que incluye un depurador (debugger) y un compilador Originalmente llamado Vital LISP, Autodesk lo adquiere y lo depura hasta 1999 llamndolo Visual LISP Aunque Autodesk se ha enfocado en desarrollar otros lenguajes ms poderosos para desarrollo como el Visual Basic for Application (mejor conocido como VBA) en su momento, y que ahora Microsoft ha dejado de soportarlo, o VB.NET y C++ que han demostrado su vala, AutoLISP ha permanecido como el primer lenguaje de personalizacin para usuarios de AutoCAD hasta nuestros das, y an el poderoso VB.NET o el C# rinden tributo integrando formas de ejecutar funciones de Lisp, pues ste es muy fcil de utilizar. Visual LISP integr el manejo de extensiones de archivos adicionales al tradicional .LSP

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

1.2 Qu significa LISP y AutoLISP? El acrnimo LISP significa Procesamiento en Listas o List Processing El trmino LISTA es una forma de referirse a una estructura de datos en las que un dato contiene una referencia con el dato siguiente, es decir; hay una inteligencia y una dependencia en el proceso lgico de ejecucin Los detractores del LISP ingeniosamente crearon el acrnimo Lost In Stupid Parenthesis haciendo alusin a la peculiar caracterstica que toda instruccin de LISP comienza y termina con un parntesis AutoLISP es la composicin de AutoCADs LISP o el LISP para AutoCAD, lo cual no necesariamente es verdad ya que, ante lo poderoso y sencillo del AutoLISP, algunos software de la competencia lo adoptaron como propio.

1.3 Qu puedo hacer con AutoLISP? El secreto mejor guardado de Autodesk es cmo est conformada su base de datos en el archivo DWG y no se ha revelado en 28 aos! Con AutoLISP podemos acceder a todas sus entidades de dibujo directamente Podemos manipular sus propiedades grficas o de atributos como en los blocks Podemos acceder a objetos del sistema como variables o dimensiones Podemos crear nuestros propios comandos o modificar el comportamiento de unos ya existentes Podemos generar lneas, arcos y cualquier objeto complejo compuesto Podemos controlar parte de la interfaz de comunicacin de AutoCAD Si lo deseamos, podemos leer y escribir archivos para exportar datos de nuestro dibujo

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

2. AutoLISP y Aplicaciones Basadas en AutoCAD


Iniciaremos rpidamente a programar si contestamos unas sencillas preguntas:

2.1 Dnde podemos utilizar AutoLISP? Podemos utilizar AutoLISP en prcticamente todo el software de Autodesk basado en AutoCAD: AutoCAD Architecture, AutoCAD Civil 3D, AutoCAD Map 3D, AutoCAD Electrical, AutoCAD MEP, AutoCAD Mechanical NO funciona en AutoCAD LT NO requiere de software adicional NO requiere de conocimientos previos

De hecho, AutoLISP es tan poderoso, que algunos fabricantes de software de CAD han integrado una funcionalidad parecida para tener adeptos que los sigan. Cuando decimos que AutoLISP no necesita de software adicional, pensamos que un usuario con su Microsoft Windows ordinario y su AutoCAD, puede programar en AutoLISP y correr sus programas sin problemas. Si no conoce ningn lenguaje de programacin y no ha hecho el intento ni de programar su televisin, con lo que aprender aqu podr desarrollar programas tiles y le invitar a aprender ms funciones para hacer sus programas ms poderosos.

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

3. Iniciar a Programar en AutoLISP


Todo comienza y Termina con un Parntesis (funcin [argumento1 argumento2]) Para quienes no saben nada de programacin fue un inicio algo complicado hablar de lenguajes, historia y todo lo mencionado anteriormente. Retomemos el rumbo; por principio de cuentas, asumiremos que todos tenemos una cierta habilidad manejando el AutoCAD, sino es as, entonces Por qu querer programar en l? Revisemos algunas premisas bsicas: Al igual que en AutoCAD, en Autolisp todo lo ejecutamos con una serie de instrucciones, funciones o comandos que tienen una secuencia. AutoLisp es realmente ms sencillo de seguir que algunos comandos en AutoCAD Escribimos un parntesis izquierdo, damos el nombre de la instruccin, sus argumentos o datos para ejecutarse y terminamos con un parntesis derecho

3.1 Nuestro Primer Programa Veamos el ejemplo ms clsico de todos los lenguajes de programacin; imprimir el mensaje Hola Mundo. En este ejemplo hemos utilizado el programa del block de notas de Windows que es el programa de procesamiento de textos ms simple y que todos tenemos a la mano. La plataforma integrada de desarrollo de Visual LISP la revisaremos ms adelante. Quisiera comenzar mostrando lo fcil que es utilizar recursos bsicos y lograr grandes resultados.

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

La instruccin es muy simple: Inicio con un parntesis izquierdo, escribo la instruccin que en este caso es la funcin print, que como su nombre nos indica nos servir para imprimir y a continuacin el parmetro de la funcin que es un texto que, por sintaxis debe ir encerrado entre comillas. En la imagen siguiente aparece la misma instruccin escribiendo la funcin print de tres formas diferentes.

En los tres casos obtendramos el mismo resultado; las funciones no son sensibles a las maysculas, as que podemos sentirnos cmodos escribiendo sin preocuparnos por una sintaxis estricta en el manejo de maysculas y minsculas.

3.2 Diferentes Tipos de Funciones Existen diferentes tipos de funciones de acuerdo al resultado o la accin que se busca: Consulta y Comandos (Query and Commands) Geomtricas (Geometric Utilities) Datos del Usuario (User Input) Conversin (conversion) Control de Desplegado (Display Control) Seleccin (Selection Sets) Manejo de Entidades (Entity Handling) Aritmticas

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Sin embargo, programar no es simplemente saber escribir correctamente de acuerdo a la sintaxis de las funciones o comandos. Programar, tiene mucho que ver con cmo relacionamos las funciones para obtener un resultado deseado. As pues, no convertiremos esta charla en una ctedra de cmo escribir funciones, ms bien, buscaremos hacer cosas tiles con ellas e iremos aprendiendo algunas funciones realmente tiles para todo tipo de trabajos de diseo. Aprendamos primero aprendamos algunas reglas y sugerencias bsicas Todo parntesis izquierdo necesita un parntesis derecho Si abre comillas para un texto (string) debe cerrarlas Los nmeros enteros y los enteros con decimales no son iguales: 1 no es igual a 1.0 No mezclar texto (strings) con nmeros (usar conversiones) Tabular el cdigo no afecta su operacin y ayuda visualmente Puede iniciar una funcin en un rengln y terminar en otro Si no necesita valores asignados, canclelos Automatice sus programas lo ms posible Las computadoras no son tontas, hacen lo que les decimos El AutoCAD no est fallando, revise su programa

Los parntesis van en parejas, regla fcil de entender difcil de seguir; El 90% de los errores de un programa en AutoLISP, es porque falta un parntesis. El mismo caso es para los textos entre comillas. Por cuestiones internas, las computadoras diferencian en trato a los nmeros enteros de los fraccionarios, aunque equivalentemente valgan lo mismo. AutoLISP hace una distincin desde

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

su sola consideracin, de aqu que el nmero entero 1 es diferente del fraccionario o decimal 1.0. Tambin debemos tener cuidado cuando designemos un texto que slo contenga numerales (caracteres numricos), podramos confundirnos y querer operar con ellos como si fueran nmeros. Curiosamente, esta regla que parece simple no siempre es vlida para AutoLISP veremos un par de ejemplos ms adelante. No se preocupe si se le acaban los renglones, AutoLISP los considera como uno solo mientras no se cierren parntesis, de aqu el trmino LISTA que explicamos anteriormente. Cuando ya no utilice valores asignados en variables podemos cancelarlos para que no consuman memoria, veremos cmo. Si su programa falla una y otra vez, tmese un caf, haga una llamada, lea el peridico, respire profundo y revise de nuevo su cdigo; es probable que descubra en qu se est equivocando En 35 aos no he podido encontrar un error de la computadora; todos son de los programadores. Si sospecha que el AutoCAD le est jugando una mala pasada, es posible pero poco probable Otro cafecito? Revisemos algunos ejemplos:

En el caso de la izquierda tenemos un ejemplo perfectamente vlido separar los componentes de una funcin a lo largo de varios renglones si finalmente se respeta su sintaxis. Sin embargo, como sucede en el primer caso a la derecha, el programador olvid cerrar las comillas al final del texto, esto hara que nuestro programa abortara marcando un error.

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

En el segundo caso, a la izquierda tenemos 3 instrucciones totalmente vlidas; en la primera se suma el entero 1 con el nmero fraccionario 1.0. Siendo ambos nmeros, el resultado se devuelve en la jerarqua necesaria, es decir el resultado sera el nmero fraccionario 2.0. En la siguiente funcin se suman los enteros 1, 2, 3, 4 y 5, el resultado de ejecutar esta funcin sera 15 ya que todos son enteros y la funcin permite sumar una cantidad libre de nmeros en su sintaxis, no siendo necesariamente dos los nmeros a sumar. La tercera funcin es similar a la del primer caso; podemos usar tabuladores o espacios en blanco para alinear y hacer ms clara la lectura del programa. En el caso de la derecha, la segunda funcin pretende sumar el texto representado con el numeral 5, al resto de los nmeros, lo que es incorrecto. Tambin cometemos un error que es comn en programas largos; olvidamos terminar la primera funcin que suma los dos unos y pusimos el parntesis de cierre hasta el final del programa. Si contamos los parntesis hay tantos parntesis izquierdos como derechos, pero hemos alterado la sintaxis de la primer funcin. Tcnicamente, el cdigo en este ejemplo tratara de sumar los dos nmero uno y despus al resultado tratara de sumarle la segunda y tercera funcin. Si stas devolvieran valores numricos (que no es el caso), entonces podramos obtener un resultados aparentemente falso en el clculo, pero el sistema operara adecuadamente. Es interesante hablar del resultado de la suma. Regularmente las funciones en AutoLISP devuelven el resultado de evaluar la funcin, es decir, en este caso devolvera el nmero 15. Esto es muy importante como lo analizaremos a continuacin pues esto permite utilizar una de las caractersticas ms ventajosas en AutoLISP; anidar o poner funciones dentro de otras funciones. 9

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Esta ltima grfica ilustra esto; AutoLISP en este caso devolvera 22.0 como resultado de las tres operaciones de suma. El AutoLISP como lo hemos hecho notar antes, evala una funcin y devuelve el resultado. Podemos atrapar este resultado y utilizarlo en otra funcin. AutoLISP siempre evala de adentro hacia afuera estos resultados veamos algunos ejemplos de anidamientos.

Las funciones anteriores son interesantes: Primero tenemos una nueva funcin de conversin llamada itoa. Es una funcin que tiene un nico parmetro y lo que hace es convertir un entero en un string o texto, de aqu que esta funcin devuelve como resultado 6 que lo utiliza la funcin print para imprimirlo en pantalla. El segundo rengln es muy comn y muy til en AutoLISP. La funcin SETQ asigna a una variable (que en este caso se llama const1) un valor, que en este caso es la funcin anidada de suma que ejecuta la suma de los enteros del 1 al 5, que es 15.

10

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

De esta manera la variable const1 retendr el valor del resultado de la suma y la podremos utilizar posteriormente en el rengln 3 como una de los sumandos. Este rengln nos muestra el resultado de un ejemplo anterior escrito en un solo rengln, es decir: 22.0

11

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

4. Interfaces de AutoLisp
4.1 Cmo o dnde escribo l cdigo de mi programa? En la lnea de comandos del AutoCAD En un editor de texto (p.e. Block de Notas, Word, etc.) En Visual LISP

AutoLISP es muy flexible cuando se trata de poner en funcionamiento un programa, puede hacerlo de varias formas. Como AutoLISP es un intrprete de cdigo en Lisp, basta utilizar cualquier programa que genere archivos de texto (conocidos como archivos ASCII desde hace dcadas). Si bien sera complicado escribir todo un programa directamente en la lnea de comandos, muchas veces es til hacerlo porque podemos probar alguna funcin que tengamos duda. Si est escrita correctamente se ejecutar inmediatamente sin problemas (imagen siguiente).

4.2 Cmo ejecuto programas de AutoLISP? Bien, si escribimos un texto en ASCII, basta que su extensin sea .LSP para que lo podamos cargar como un programa. Es mejor definir funciones (ver la seccin siguiente) porque esto nos permitir ejecutarlas una y otra vez cuando se necesiten. De otra manera tendremos que cargar el programa para que se ejecute cada vez que lo necesitemos. Utilizaremos la funcin appload para cargar nuestros programas.

12

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Como podemos observar, esto abre una caja de dilogo en la que podremos cargar entre otros, programas desarrollados para interpretarse con AutoLISP. Una vez seleccionado el archivo, haga clic en el botn Load y asegrese de que la leyenda programa.lsp successfully loaded aparezca en el recuadro en la esquina inferior izquierda. Esta opcin tambin se encuentra disponible en el men Tools > AutoLISP. Inmediatamente abajo, aparece la opcin para cargar el Visual LISP.

13

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

5. Crear y Modificar Funciones y Comandos


5.1 Comandos de AutoCAD desde AutoLISP La magia de utilizar los comandos de AutoCAD directamente en AutoLISP (Command nombre [argumentos])

Si conoces todos los argumentos de un comando en AutoCAD, tambin los conoces en AutoLISP, lo nico que tienes que hacer es utilizar la funcin command. En este ejemplo utilizamos la funcin setq para asignar a las variables pt1 y pt2 2 puntos que aparecen como listas de coordenadas. El apstrofe nos permite pasar las listas tal y como fueron escritas a las variables, esto es equivalente a utilizar la funcin quote. Es decir, (1 1) equivale a (quote (1 1)). No hemos incluido la coordenada z en las listas de puntos, AutoCAD asume el valor de 0 para la coordenada z (recuerde que AutoCAD siempre dibuja en tres dimensiones). Este programa dibujara una lnea de la coordenada 1,1 a la 1,5. Note las 2 asignaciones con un mismo setq. 5.2 Crear una funcin con AutoLISP (Defun funcin lista_de_argumentos)

14

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Ahora hemos utilizado la funcin defun (izquierda), para definir nuestra propia funcin llamada lnea, que ejecutar el trazo mencionado. Bastara escribir la funcin entre parntesis en la lnea de comandos de AutoCAD para ejecutar el trazo; (lnea). Los parntesis al final de la definicin de la funcin son necesarios, sirven para pasar parmetros a las funciones. En la ilustracin de la derecha, podemos observar que ahora pt1 y pt2 con parmetros de la funcin, y entonces podramos escribir (lnea (1 1) (1 5)) para tener el mismo resultado. Sin embargo, ahora la funcin es ms dinmica, pues me permite trazar cualquier lnea dados 2 puntos. Las dobles comillas dobles, () al final del comando, equivalen a presionar la tecla Enter, que en este caso, termina el trazo de la lnea.

5.3 Crear un comando nuevo de AutoCAD con AutoLISP

15

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Ahora hemos combinado el uso de la funcin definida anteriormente con la definicin de un comando en AutoLISP. Con la misma funcin defun podemos crear el comando nuevo RR anteponiendo C: al nombre de la funcin (izquierda). Esto convierte la funcin RR en un comando de AutoCAD que se ejecuta como cualquier otro comando escribiendo su nombre en la lnea de comandos. Su definicin permanecer con la sesin de dibujo abierta. Si abandona AutoCAD o abre otro archivo este comando se perder.

5.4 Modificar un comando de AutoCAD con AutoLISP Tambin podemos cambiar la ejecucin de un comando nativo de AutoCAD! Por ejemplo, en el recuadro de la derecha de la grfica anterior cambiamos la definicin del comando Line para genera un nico segmento de lnea de color rojo. Hemos integrado nuevos elementos para hacer ms limpia la ejecucin del comando. La funcin setvar nos permite cambiar las variables del sistema cmdecho a 0 (impidiendo con esto que estn apareciendo las evaluaciones de las funciones en la lnea de comandos) y cecolor a 1 (guarda el valor del color que est en uso como color 1 o rojo). Como vamos a modificar un comando nativo, es necesario utilizar el comando undefine antes de redefinirlo para poder usar nuestra nueva definicin. Tal vez ya notaron que al ejecutar un comando nuevo el sistema devuelve un valor nil (nulo) cuando ejecuta el comando. Esto es porque toda ejecucin de un comando en AutoLISP devuelve este valor. Al incorporar la funcin (princ) al final del comando evitamos que esto suceda. Tambin notarn el guin bajo _ antes de la funcin undefine. En AutoCAD podemos utilizar el nombre de un comando en ingls sin importar el idioma del programa (AutoCAD se edita en casi 20 idiomas), anteponiendo el guin bajo, con esto aseguramos la ejecucin. Adicionalmente, hemos cambiado el nombre de nuestro programa a acad.lsp. Este nombre es especial, porque si colocamos nuestro programa en una de las rutas que utiliza AutoCAD para checar la existencia de archivos, se cargar cada vez que iniciemos el AutoCAD y de esta manera aseguramos que siempre se encuentren disponibles nuestras funciones y comandos. Una opcin sera el flder de soporte en la ruta C:\Program Files\AutoCAD 2010\Support. Tambin puede redirigir a un flder especfico si hacemos cambios en las rutas con el comando options en la pestaa de files, basta un clic en el botn add para agregar una ruta nueva.

16

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

17

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

6. Seleccionar y Agrupar Objetos


Este es un tema interesantsimo. Aprenderemos primero formas rpidas y poderosas de seleccionar objetos.

6.1 Hagamos que AutoCAD recuerde nuestras selecciones Existe una forma rpida de crear una opcin para recordar una seleccin previa por siempre y agrupar objetos sin hacerlos blocks: (setq a (ssget)). Aqu utilizamos la funcin ssget para asignar a la variable a lo obtenido de la seleccin. En realidad la funcin ssget arroja un conocido mensaje de select objects: en la lnea de comandos invitndonos a seleccionar objetos. Si queremos devolver la seleccin en cualquier momento a un comando de edicin que nos mande el mismo mensaje simplemente escribamos: !a.

Esta opcin nos permite generar un conjunto seleccin (selection set), que no es otra cosa que una seleccin que AutoCAD recuerda mientas no abandonemos la seccin de dibujo. Ms an, esta es una forma de agrupar objetos, si utilizamos por ejemplo un comando de Copy o Move, podremos copiar y mover el grupo de objetos seleccionados como si fuera un block. Todava mejor, puede seguir manipulando cada objeto sin que la agrupacin se pierda. Por ejemplo, si borramos o cambiamos parte de la geometra de un objeto el grupo prevalece. Fantstico! Pero an hay ms, veamos algunos ejemplos de seleccin de objetos: (ssget P) Crea un SS (Selection Set) de los objetos seleccionados ms recientemente (ssget L) Crea un SS de la ltima entidad agregada visible en la base de datos (ssget (2 2)) Crea un SS de la entidad que pasa por el punto (2 2) (ssget W (0 0) (1 1)) Crea un SS de las entidades dentro de la ventana formada del punto (0 0) al punto (5 5). (ssget X) Crea un SS de todas las entidades en la base de datos 18

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

6.2 Listas y ms listas Por qu son tan importantes? Es importante hacer notar que internamente un SS lo podemos interpretar como una lista que contiene los nombres de los objetos seleccionados. Internamente, cada lnea, arco o cualquier otro objeto utilizado en AutoCAD tiene un nombre que ayuda al sistema a localizarlos rpidamente. Las Listas en AutoLISP no slo son funciones o comandos, tambin pueden ser datos: (setq pt_list ( (1 1) (3 1) (5 2) (2 4)) ) En esta asignacin generamos una lista que contiene como elementos puntos de AutoCAD en 2D que tambin estn en formatos de listas (en algunas circunstancias los puntos podemos pasarlos como regularmente lo hacemos en AutoCAD como x,y). La variable pt_list almacena estos puntos. (ssget WP pt_list) Crea un SS de las entidades dentro del polgono que define la lista An la base de datos AutoLISP no la muestra como una lista (ver la seccin 7 a continuacin), por eso es tan importante manejarlas y eso es lo que es Lisp! (recuerdan? List Processing). Tambin existe una invaluable opcin de filtrado sobre la base de datos. Aprenderemos de ella en nuestra prxima seccin. Ahora aprendamos otras formas de seleccin de objetos que estaremos utilizando. (entlast) Encuentra la ltima entidad en el dibujo (entsel [mensaje]) Le pide al usuario seleccionar una entidad especificando un punto Ejemplificaremos estas poderosas herramientas y algunas ms en nuestra siguiente seccin:

19

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

7. Entender la Base de Datos de AutoCAD


7.1 El archivo DWG: Accediendo con AutoLISP Una base de datos es todo conjunto de datos organizado y depurado al cual podemos consultar para que nos devuelva informacin, eso es precisamente el archivo de dibujo DWG de AutoCAD al pie de la letra. A travs de AutoLISP podemos acceder a la esta base de datos e interactuar con ella. Iniciemos ejercitando algunos de los comandos aprendidos; el entsel:

Dibujamos una lnea del punto 1,1 al 3,3 en color rojo. Notar que entsel nos pide seleccionar un nico objeto. Para reafirmar esto pudimos escribir (entsel Selecciona un Objeto: ), al tocar la lnea nos devolvera el nombre del objeto (en un cdigo hexadecimal y un punto x,y,z como una lista de 2 objetos. Que no les intimide el cdigo hexadecimal, para AutoCAD es ms fcil manejar nmeros como identificadores de objetos y los nmeros en base 16 son ms compactos. El punto es la coordenada del punto sobre el que hicieron clic. Avancemos un poco ms en las entraas de la base de datos.

20

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Wow! Veamos (entget (car (entsel))) Esta instruccin es en verdad poderosa! Seleccionamos un objeto y nos devuelve toda la estructura interna del objeto con todos sus datos en una gran lista. Ntese que todos los elementos de esta gran lista, son listas! La funcin car nos devuelve el primer elemento de la lista obtenida por entsel que corresponde al nombre del objeto (ver prrafo anterior). Esto es precisamente lo que la funcin entget necesita para obtener los datos del objeto en cuestin. Cada una de ellas contiene un dato o propiedad del objeto en forma de pareja separada por un punto. El primer dato es el cdigo DXF de la propiedad (lo que nos dice de qu se trata). El segundo dato es el valor de la propiedad. Podemos consultar detalladamente las propiedades DXF con las que AutoCAD clasifica los objetos y sus propiedades en la Ayuda de AutoCAD. Si utilizamos la ayuda en lnea podemos consultar, por ejemplo los cdigos de una lnea en http://docs.autodesk.com/ACD/2011/ENU/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719 -79fe.htm. Esto es comn sobre todo para el software educativo. Si consulta la ayuda local del archivo chm a travs de la opcin del men Ayuda o presionando la tecla F1:

Por obviedad, existen cdigos que se repiten en todas las entidades como el cdigo del layer (cdigo 8) o el color (cdigo 62). Si quisiramos consultar los cdigos comunes, en la ayuda en lnea haramos clic en Common Group Codes for Entities arriba a la izquierda.

21

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

7.2 Recuperando Propiedades DXF Esto es muy fcil de hacer, basta con una pequea funcin: (defun dxf (cdxf listao) (cdr (assoc cdxf listao)) ) La funcin assoc recupera una lista de asociacin (la lista formada de forma especial en la base de datos con el formato (cdigo . valor), compuesta del cdigo cdxf y el valor listao. Esta realmente es una lista con dos elementos (el punto es una cuestin de sintaxis). La funcin cdr al aplicarla a una lista de objetos nos devuelve normalmente una lista conteniendo todos los elementos de la lista referenciada con excepcin del primero (es una manera de recortar una lista). En el caso especial de una lista asociacin, nos devuelve el valor de la propiedad. As pues, si generamos el siguiente programa obtendramos el valor de la propiedad de un objeto.

22

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Se siente muy bien contando parntesis?... Tal vez prefiera la versin condensada: (defun dxf (cdxf listao) (cdr (assoc cdxf listao))) (defun pp (codigo) (setq a (entget (car (entsel "Seleccione un objeto: ")))) (alert (strcat "Layer del objeto: " (dxf codigo a)))) Aunque en realidad no aporta prcticamente nada en desempeo condensar la escritura de nuestras funciones y comandos, algunos programadores prefieren condensar funciones ya probadas. (pp 8) La ejecucin de esta funcin incorpora el uso de alert, una forma de mandar un mensaje de texto en un cuadro de dilogo. En este ejemplo integramos tambin la funcin strcat que concatena textos separados por espacios. Como la funcin DXF devuelve el nombre del layer del objeto (lo sabemos de la tabla de cdigos DXF), concatenamos la leyenda Layer del objeto: para hacer totalmente claro el mensaje de qu propiedad estamos rescatando. Qu tal?... Hora de sorprender al jefe?.. Ms cafecito?...

23

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

8. Crear una Barra de Herramientas y un ToolPalette


8.1 Crear una Barra de Herramientas Antes de implementar un par de buenos programas, aprendamos como crear una opcin en la barra de herramientas con la que podamos llamar a nuestras funciones y comandos. Haga clic en un espacio libre de la barra de mens. Haga clic en Customize (Personalizar) para crear una nueva barra de herramientas como se muestra en la figura de la derecha (es posible que tenga que seleccionar el Workspace de AutoCAD Classic en la barra de herramientas rpidas, en la esquina superior izquierda de la pantalla.

Una vez abierta la ventana Customize User Interface, expanda las opciones haciendo clic en las flechas que se sealan para obtener la vista expandida (derecha):

24

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Ahora seleccione la opcin desplegable en Customization in All Files, para seleccionar custom.cuix como lo muestra la ilustracin siguiente (ilustracin de la izquierda). Cabe mencionar que esto se debe hacer con mucho cuidado pues podemos llegar a daar los mens o los comandos de AutoCAD si lo ejecutamos incorrectamente. Una vez desplegado el men de personalizacin, hagamos clic derecho en Toolbars y seleccionemos New Toolbar del men desplegable, como lo muestra la ilustracin de la derecha:

Lo anterior nos permitir crear una barra de herramientas personalizada. Escribamos AU como su nombre y Enter. Despus haga clic en el botn Apply en la esquina inferior derecha de la ventana, esto crear una pequea barra de herramientas vaca en el rea de dibujo.

8.2 Crear un Botn con un Comando Ahora tenemos que cambiar nuevamente la opcin de seleccin para tener a la vista los comandos que podemos colocar en nuestra nueva barra. Cambie la opcin de desplegado del Customizations in All Files a All Customization Files.

25

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Si se desplaza hasta el final en la ventana All Customization Files, podr expandir las opciones Partial Customization Files y CUSTOM, lo que dejar visible una opcin de Toolbars donde podr encontrar nuestra nueva barra de herramientas AU. Esto es necesario hacerlo para poder tener los comandos a la vista en la parte de debajo de esta ventana y poderlos arrastrar hacia nuestra barra de herramientas para poblarla de botones de comandos. Ilustraremos el proceso con el comando del sistema Line:

Como lo muestra la imagen de la derecha de la figura anterior, seleccione el comando Line a la izquierda, luego expanda, de ser necesario, la seccin Button Image haciendo clic como lo marca la flecha de la derecha. Podemos hacer clic sobre el botn Edit para editar la imagen 26

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

del botn y salvarla con otro nombre para asignarla a nuestro comando. Si lo hace, se crear el icono al final de la tabla de imgenes. Explore la opcin de edicin sin salvar para sentirse cmodo.

Slo nos resta cambiar las propiedades del botn (abajo a la derecha). Sin embargo, no podremos hacerlo en este momento porque hemos utilizado un comando del sistema. Crearemos nuestro propio comando primero, cambiaremos las propiedades a las que se indica en las ilustraciones y arrastraremos el nuevo comando a nuestra barra de herramientas AU. Para crear un comando nuevo haga clic en el icono como se muestra a la izquierda, esto crear un nuevo comando autonombrado Command1. Si hace clic derecho en l, podr renombrarlo o puede utilizar F2.

27

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Procederemos a hacer los cambios de las propiedades y al final podremos arrastrar el comando en nuestra barra de herramientas AU. Es importante hacer notar que deber dar Enter al final de la captura de cada campo. En el campo Macro, deje los caracteres ^C^C (esto permite suspender cualquier ejecucin en proceso de un comando en favor de ejecutar el nuestro). Una vez escrito PP como nuestro comando de prueba, no olvide dejar un espacio en blanco al final (En una macro, esto hace las veces de un Enter para ejecutar el comando). De igual manera, si lo que desea es ejecutar una funcin, despus de abrir y cerrar parntesis como es normal para definir una funcin en AutoLISP, deje el espacio en blanco al final. Escribamos pues ^C^C(pp 8) como nuestro comando.

Por ltimo, clic en el botn aplicar para ver los cambios y finalice haciendo clic en el botn OK.

28

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

8.3 Crear un comando en el ToolPalette Si deseamos crear esta misma funcin pero en el ToolPalette, esto es ms fcil de hacer. Presione Ctrl + 3 para abrir el ToolPalette si no est abierto ya. Utilicemos ahora las opciones grficas. Cambie el Workspace a 2D Drafting & Annotation en los comandos rpidos (esquina superior izquierda de AutoCAD). Esto activa el Ribbon y si selecciona Manage en el men desplegar una serie de paneles entre los que encontraremos Customization. Ah encontrar la opcin que acabamos de ver en la seccin anterior: User Interface. Tambin encontrar la del ToolPalettes. Esta puede ser la opcin ms sencilla de entre varias disponibles.

Si tiene abierto el ToolPalette, abra el User Interface tambin, lo necesitaremos. Ahora haga clic derecho en cualquier pestaa del ToolPalette y seleccione New Palette (una paleta o palette no es ms que un contenedor), escriba Programas AU como nombre de la paleta. Localice rpidamente el comando Linea que creamos anteriormente escribiendo lnea en el buscador. Cuando lo encuentre, seleccinelo y arrstrelo en el interior de nuestra nueva paleta. Eso es todo! Ahora tiene un comando disponible y puede mover sus propiedades haciendo clic derecho y seleccionando la opcin pertinente. Le recomiendo una lectura rpida y sencilla en el artculo publicado por Jonathan Melndez en nuestra comunidad titulado: Paletas de Herramientas parte1.

29

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

30

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

9. Crear una Plantilla de Dibujo por Programacin


9.1 Layers, Tamao de Hoja, Unidades, Escala y Layers En esta seccin le presentamos el cdigo para crear una plantilla de dibujo con lo que hemos aprendido. El cdigo utiliza nuevas y tiles funciones y describe varias operaciones. Primero hace un cambio de unidades de insercin a metros con el comando INSUNITS. Despus da de alta una representacin fsica de la hoja del plano. Para esto, utilizamos la funcin WHILE que es un ciclo controlado en el que se registra lo que el usuario introduce en el teclado como un texto por medio de una funcin GETSTRING. De acuerdo a su sintaxis, no se permiten espacios en blanco. Lo que el usuario haya capturado se compara y si no es alguna de las letras de la A a la E, el ciclo contina indefinidamente solicitando el tamao de la hoja utilizando las letras que lo identifican de acuerdo a los estndares americanos ANSI. La instruccin WHILE es simple; evala el resultado de un valor o funcin. Si es verdadero ejecuta el ciclo, cuando el resultado sea falso termina el ciclo. Aparecen nuevas funciones como STRCASE con un nico argumento string, devolviendo tambin un string o texto equivalente con todas sus letras maysculas, de acuerdo a su sintaxis de uso. Aparece tambin la condicionante IF. Al igual que WHILE, evala un elemento o funcin, si el resultado es verdadero ejecuta o devuelve el valor a continuacin del elemento o funcin evaluado, si es falso devuelve un tercer elemento o funcin que sigue al anterior. La funcin condicionante IF presenta retos. Si quiero ejecutar ms de una funcin tendr que utilizar la funcin PROGN: (progn Funcin 1 Funcin 2 Funcin n ) Todo lo que se encuentre entre el inicio y fin de una funcin PROGN se considera como una sola funcin por la funcin IF, y as podemos ejecutar o asignar varios comandos o funciones. En la seccin de escala aparece la funcin INITGET que compone un valor numrico que sirve como indicador a ciertas instrucciones como GETREAL. En este caso, el valor de 7 restringe a GETREAL a no aceptar valores nulos, el valor cero, o nmeros negativos. Es interesante que revise esta funcin para controlar las capturas de las funciones GETXXX.

31

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

Aparecen los operadores aritmticos * y / para hacer multiplicaciones entre una serie de valores o para dividir, segn sea el caso, el primer valor entre la multiplicacin del resto. Note el continuo uso del punto y coma, todo lo que va despus de l no se evala como cdigo por AutoLISP. Esto nos permite usarlo para documentar el programa y darle claridad. Tambin aparece la funcin RTOS que convierte un valor real o fraccionado en un string o texto. Para ello hay que indicarle 3 cosas; el valor a convertir, el sistema numrico a utilizar y la precisin que se requiere. El valor de 2 indica un sistema decimal con 8 dgitos de exactitud de acuerdo a la sintaxis. Prevalece el orden y la limpieza con el uso de tabulaciones y espacios para alinear el cdigo. Es fcil de leer y deducir. Se destacan 3 funciones ms. LIST que nos permite crear una lista desde una secuencia de valores conteniendo como elementos los valores mismos. NTH, que nos devuelve el ensimo elemento de una lista dada (el primero ocupa la posicin 1), y la funcin 1+, que como se adivina, suma un valor de 1 a un valor dado, ideal para usar contadores.

32

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Programa PLANTILLA para AUV 2010 ;;;;;; ;;;;; Autor: Sergio Raymundo Jaime Bernal ;;;;;; ;;;;; Fecha: 30 de noviembre del 2010 ;;;;;; ;;;;; Versin: 1.0.0 ;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:Plantilla() (setvar "cmdecho" 0) (command "_UNDO" "M") ;----------------------------------------------------- Seccin Unidades (command "_INSUNITS" 6) ;----------------------------------------------------- Seccin Alta de Hoja ;-------- La hoja A mide 8.5 x 11 pulgadas ;-------- La hoja B mide 11 x 17 pulgadas ;-------- La hoja C mide 17 x 22 pulgadas ;-------- La hoja D mide 22 x 34 pulgadas ;-------- La hoja E mide 34 x 44 pulgadas (setq hoja nil) (while (= hoja nil) (setq hoja (getstring "Tamao del plano: [A carta/B doble carta/C cuatro cartas/D seis cartas/E ocho cartas] <A>: ")) (setq hoja (strcase hoja)) (if (= hoja "") (setq hoja "A") (progn (if (and (/= hoja "A") (/= hoja "B") (/= hoja "C") (/= hoja "D") (/= hoja "E")) (setq hoja nil) ) ) );fin del if );fin del while ;;;;;Seccin Escala (setq escala nil) (initget 7) (while (= escala nil) (setq escala (getreal );fin while "Escala 1 a X: "))

(setq fact (/ escala 100)) (setq Y (cond ((= hoja "A") 8.5) ((= hoja "B") 11) ((= hoja "C") 17) ((= hoja "D") 22) ((= hoja "E") 34) ) X (cond ((= hoja "A") 11) ((= hoja "B") 17) ((= hoja "C") 22) ((= hoja "D") 34) ((= hoja "E") 44) ) ) (setq X (* X 2.54 fact) Y (* Y 2.54 fact)) (setq X1 (rtos X 2 8) Y1 (rtos Y 2 8)) (command "_rectangle" '(0 0) (strcat X1 "," Y1)) (command "_zoom" "e") ;----------------------------------------------------- Seccin Crear Layers (setq conta 1 a01 "Muros" a02 "Pisos" a03 "Ventanas" a04 "Puertas" a05 "Techos" a06 "Cotas" a07 "Etiquetas" a08 "Solapa" a09 "Hoja" a10 "Muebles" LL (list a01 a02 a03 a04 a05 a06 a07 a08 a09 a10) ) (while (<= conta 10) (setq elemento (nth (1- conta) LL)) (command "layer" "n" elemento "s" elemento "c" conta elemento "") (setq conta (1+ conta))

);while (command "layer" "t" "0" "s" "0" "") (princ) );EOF

33

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

10. Manejar Blocks y Programas para Contar Blocks


Los blocks en su definicin y los INSERT como sus instancias son de los objetos ms complejos de manejar. Aqu le proporcionamos el cdigo para saber cuntos INSERT hay seleccionando uno de ellos. Es un buen ejercicio para el lector tratar de obtener automticamente todos los blocks en el dibujo y hacer una tabla de simbologa con ellos estableciendo su nmero y formando una tabla. La solucin aparecer publicada en diciembre en la pgina de la comunidad.
(defun cblk () (setq a (entget (car (entsel))) (setq b (dxf 2 a)) (setq c (ssget X ((0 . INSERT) (2 . b)) (alert (strcat (rtos (sslength c)) blocks encontrados del tipo b)) );EOF

Para el ejercicio de reto podran usarse las siguientes funciones:


;;;;; -----------------------------------------------------------------;;;;; Obtiene cdigo dxf de un objeto olist (defun dxf (cdxf olist) (cdr (assoc cdxf olist)) );EOF ;;;;; -----------------------------------------------------------------;;;;; Crea una lista con los nombres de objetos de un Selection Set (defun clista (sseleccion) (setq conta 0 llista (list "") ) (while (< conta (sslength sseleccion)) (setq lmlista (list (ssname sseleccion conta))) (setq llista (append llista lmlista)) (setq conta (1+ conta)) );wend (setq llista (cdr llista)) (setq llista (reverse llista)) );EOF

34

Visual LISP: Una Alternativa Rpida de Programacin para el NO Programador

;;;;; -----------------------------------------------------------------;;;;; Devuelve el nombre del ensimo objeto de un Selection Set (defun nssel (sselec nn) (setq lmlista (ssname sselec (1- nn))) );EOF

Comunidad Latinoamericana de Usuarios de Autodesk en Espaol: http://communities.autodesk.com/comlaude Email de la Comunidad: sergio.bernal@designerscommunity.org Email Sigma High Consulting: sergio.bernal@sigmahc.com

35

You might also like