Está en la página 1de 247
i \. Ew 2 (PROGH: (COMMAND “Cc ixolits* pri (SETQ cird (Lisr@Enraspy AutoLISP Version 11 JOSE ANTONIO TAJADURA ZAPIRAIN ‘Técnico especialista en CAD Profesor del Centro Ayala. Bilbao JAVIER LOPEZ FERNANDEZ ‘Técnico especialista en CAD Profesor y Jefe del Departamento de 1+D del Centro Ayala, Bilbao McGraw-Hill [MADRID * BOGOTA * BUENOS AIRES * CARACAS * GUATEMALA * LISBOA MEXICO ® NUEVA YORK * PANAMA ® SAN JUAN * SANTIAGO * SAO PAULO AUCKLAND # HAMBURGO * LONDRES # MILAN * MONTREAL * NUEVA DELHI * PARIS ‘SAN FRANCISCO # SINGAPUR ® ST, LOUIS # SIDNEY * TOKIO ® TORONTO ‘AutoLISP. Version 11 [No ext permitida fa reproduccién total o parcial de este bro i tratamiento informe tic, ni tarsisin de ninguna forma o por cualquier medio. ya see electronica, meeé- lc, por Fotocopia, por regio u otros métodos, sn el permiso previo y por eseio de os tulares del Copyright DERECHOS RESERVADOS © 1981, rspeco ala primer edicin en espaol, por McGRAW-HILL/INTERAMERICANA DE ESPANA, S.A Edificio Oasis 1. planta Besaut, so, 28028 Aravica (Maciid) ISBN: 8476155715 Dopésito logak M. 215461991 CCubiers: Juan Garcia Fotografia de eubiertae dustrasiones: José A. Tajadura Zapirin (Compuesto en: Pérez Dizz, S.A. Impreso en: Lael. Lot Llanos, nave 6. Humanes (Madtid) De esta eden se mprimieron 7.000 ejemplares en janio de 1991 PRINTED IN SPAIN - IMPRESO EN ESPANA Contenido ELS ETE DES TEE SOE ODEO, Priiogo xi ntroduccién : xiii Capitulo 1. Introducetén. Conceptos previos y definciones. i 1.1. Lenguaje de programacién LISP... 1 1.2, AutoLISP, una versién especifica de LISP.. 2 13. Tipos de objetos en AutoLISP 2 14. Procedimiento de evaluacién en AutoLISP 3 15. Convenciones de AutoLISP 4 Capitulo 2. Primeros pasos. g 7 24 Alte de memoria a sates de AOLIS : 7 2.2. Creacién de un programa en AULOLISP ..c. i: 8 23. (LOAD...) Cargar programas... ree sees oe 9 24, (DEFUN..) Definir funci6th.ssonnnnnuonnnnsnninninsnnnennnmonnionnn 10 2.5. (GRAPHSCR) Pantalla gréfica : 14 26. (TEXTSCR) Pantalla de texto 14 2.7. (PROMPT...) Fscribir mensaje : aH 14 2.8. (TERPRI) Terminar escritura nn 4 2.9. (SETQ..) Atribuir valores... 15 210. (GETPOINT...) Introducir un punto... 15 2.11. (COMMAND...) Acceso a ordenes de AutoCAD... 16 2.12. (QUOTE...) Literal de expresion, 1 2.13. (EVAL...) Evaliar expresi6n ... 18 2.14, Valores predefinidos de AutoL ISP... 18 2.15, (SET...) Atribuir valor a simbolo no evaluadb.. Caeser te 18 Ejemplo 1: Programa para dibujar una linea simple... eee : 19 jemplo 2: Programa para dibujar tres Fineas confuyeMtes....nnnarsnuonnarnonn reg Capitulo 3. Utilizaciéa de istaS....nessnmnnsininninnnnninnnsnnnn ce a 3.1. (CAR...) Primer elemento de Bista.nnnae : a 3.2. (CDR...) Segundo elemento y resto de lista. nnrnrn 2 33. (CADR...) Segundo elemento de lista : 2 34, (LIST...) Creacién de lista... 2B 3,5. (GETCORNER...) Introducir otra esquin.. B Fjemplo 1: Dibujar un rectangulo B Fjemplo 2: Dibujar rectingulo con arcos de empalme. 4 vi CONTENIDO. Capitulo 4, Estructura de un programa 4A. 42. 43, 4.10. 41 Ejemplo 1: D’bujar un haz. de lineas. Ejemplo 2: Dibujar una estrella. Ejemplo 3: Lineas de texto con cualquier Capitulo 5. Operaciones numérica... SA 52. 53. . (EQ...) Mentidad de expresiones: . IF...) Condicional (GETINT..) Introducir nimero entero. (GETREAL..) Introducir mimero real (GETDIST... Introducir distancia... (GETSTRING..) Introducir cadena de texto... ©) (9 0) () C=) Operasons de compara. Operadotes l6icos... (PROGN...) Secuencia consecutiva (REPEAT...) Repetir N e028 smesnesemninomenvn (WHILE...) Repetir segin condicién, (+) (-} @) ({) Operaciones aritméticas.. tras operaciones con datos numéricos .. (COND...) Condicional.. Ejemplo I: Dibujar curvas senoidales. 61. 62. 63. 64, 65. 66. 617, 68. Ejemplo I: Dibujar un muro con espesor. lo 6. Angulos y distancias.. (ANGLE...) Angulo definido por dos puntos... (DISTANCE...) Distancia entre dos puntos (POLAR...) Punto en coordenadas polares.. (GETANGLE..) Introducir éngulo.. (GETORIENT..) Angulos segin origen y sentido, (ANGTOS...) Conversion de dngulos.. (RTOS...) Conversibn de niimeros.. CINTERS..) Interseecién de lines. Ejemplo 2; Dibujar varios muros con espesor..... Capitulo 7. 1 72. 73. [Bjemplo 1: Muro con espesor al interior o exterior Capitulo 8, Manipulaci6n de eadenas textuales... 810, . (ASCH...) Cédigo del primer cardcter de cadena, Ufilizacin de fanciones del tipo GEE. nnn (INITGET,.) Modos de las funciones GET. (GETKWORD..) Permitir opciones o palabras cave, (GETENY...) Valor de variable de entorno.. (STRCASE..) Cambio maylisculas o minisculas. (STRCAT...) Concatenar cadenas de texto {ATOI..) Conversién de cadena en enter. (ATOF...) Conversién de cadena en némero (TOA...) Conversion de entero en cadena (SUBSTR...) Subcadena de una cadena (STRLEN...) Longitud de cadena... (CHR...) Cardcter correspondiente a cédigo ASCII. (READ...) Primera expresion de una cadena. Ejemplo |: Dibujar el trazado de cualquier funcién sEjemplo 2: Dibujar hélices con 3DPOL_ Capitulo 9. . (CLOSE...) Cerrar archivo (fichero) ... . (FINDFILE...) Explorar camino acce80 1. . (PRINT...) Eseribir con intertinea, . (WRITE-CHAR...) Escribir cardcter ASCH |. WRITE-LINE...) Bscribir fea... jemplo 1; Mend en pantalla con bloques definidos CONTENIDO Operaciones con archivos (ficheros) (OPEN...) Abrir archivo (fichero)... (PRIN...) Eseeiir expresir (PRIN...) Escribir expresién ASCII... (READ-CHAR...) Leer carfeter (READLINE..) Leer linea Capitulo 10. Acceso a variables de AutoCAD 10 Capitulo 11, ILL 12. 113 114. ILS, 116, 117, 118. iy, 11.10. 1 1112, 113, ‘Bjemplo I: Archivos de foto de miiltiples ventanas pat . Valores posibles de OSMODE (Modos de design: (REDRAW...) Redibujat nen Bjemplo f: Archivos de foto de miltiples ventanas... Ejemplo 2: Insercién de blogues unitarios partiendo lineas (GETVAR... Introducir valor en variable... (GETVAR..) Extraer valor de una variable. (OSNAP...) Aplicar modo de referencia (MENUCMD..) Llamada a menis de AutoCAD (TRANS...) Convertir de un SCP a otto. (VPORTS) Configuracién de ventanas actual... Otros comandos de operaciones com listas (ASSOC...) Lista asociads (CONS...) Afiadir primer elemento a lista, (SUBST... Sustituir elemento... (APPEND...) Juntar lista (LENGTH...) Longitud de lista (LAST...) Ultimo elemento de lista (MEMBER...) Lista a partic de elemento {NTHL...) Elemento enésimo de list... (REVERSE...) Lista invertida ern (FOREACH...) Aplicar expresién a lista (APPLY...) Aplicar funcion a lista. (MAPCAR...) Aplicar funcin a elementos sueesivos de lstas. (LAMBDA...) Definir funcién temporal. : Capitulo 12. Organizacién de la Base de Datos de AutoCAD ....s.usnnesn 124 122, Estructura de Ja Base de Datos para entidades 12.1.1. Entidades simples 12.1.2. Entidades compuestas nan. Estructura de la Base de Datos para Tablas de Simbolos.. Capitulo 13. Trabajo con entidades de dibujo y acceso a Base de Datos Bd ‘Comandos para la seleocién de entidades de dibujo 1B.LL. (SSGET..) Introducir conjunto : 13.1.2. (SSLENGTH..) Niimero de entidades de un conjunto 13.13. (SSNAME...) Nombre de entidad en conjunto. 109 10 116 121 121 12 12 12 12 13 123 123 124 14 125 125 126 127 133 13 134 136 140 145 145 145 147 147 ‘cONTENIDG 13.14, (SSADD..) Afiadir entidad a conjunto 147 13.15. (SSDEL...) Bliminar entidad de conjunto..wonsnnmennonnsnnn 148 13.1.6. (6SMEMB..) Ver sientidad esté en conjunto a 148 13.2, Comandos relativos @ nombres de entidades.... ae 148 132.1. (ENTNEXT..) Nombre de entidad siguiente... 148 1322. (ENTLAST) Nombre de la éltima entidad principal. 149 1323. (ENTSEL...) Nombre de entidad con punto de designacién... 149 1324. (HANDENT..) Nombre de entidad asociada a rétulo 149 133. Comandos relatives a datos de entidades.... ce : 149 133.1. (ENTGET..) Introducir lista de entidad... 150 1332. (ENTDEL... Borrar o recuperar entidad 150 133.3. (ENTMOD... Actualizar lista de entidad.. : z 131 13.3.4, (ENTUPD..) Regenerar entidad compuesta ... 151 13.4, Comandos relativos a Tablas de Simbotos.... 152 13.4.1. (TBLNEXT...) Extraer contenido de tabla... is2 1342. (TBLSEARCH..) Buscar tabla con nombre. : 152 Ejemplo 1: Cambiar capa actual designando entidad de refereacia.. 133 Ejemplo 2: Cambiar un texto a mayisculas o mintsculas 154 Ejemplo 3: Cambio global de estilo de varios textos. \s7 Ejemplo 4: Listado de blogues con mimero de insezciones. 162 Ejemplo 5: Hacer Bladisco de todos los bloques det dibujo. z 165 Capitulo 14, Acceso a pantalla grifica y dispositivos de entrada ee eee m 14.1. (GRCLEAR) Despejar ventana gréfica im 142. (GRDRAW..) Dibujar vector virtual... é m 143. (GRTEXT..) Escribir en dreas de texto. im 144. (GRREAD..) Lectura directa de datos de entrada. 1B Capitulo 15. Funciones de chequeo y operaciones binarias... 175 15.1. (ATOM..) Detectar étomo. 175 . (BOUNDP...) Detectar valor asociado a simbolo.. 175 (LISTP...) Detectar 176 (MINUSP...) Detectar valor numérico negative. 176 (NULL...) Detectar valor asociado 1l0,..uummunsnnonns 176 (NUMBERP...) Detectar valor numérico, : 17 (ZEROP...) Detectar valor numérico igual a cero : 7 (TYPE..) Tipo de elemento v7 (PRACE...) Marcar fancién con atributo de rastreo, 178 (UNTRACE..) Desactivar atributo de rastreo.. 179 *BRROR* Funcién de error. 179 (VER) Versin de AutoLISP... 180 . Operaciones a nivel binario 180 1513.1, (~..) Negecién logic 180 15132. (BOOLE..} Operacién Booleana 180 1513.3. (LOGAND...) Operacion Y t6gico.. 181 15.134, (LOGIOR...) Operacion 0 168560 .omssnnn Gocaaeea let 15.135. (LSH..) Desplazamiento a nivel binatio 181 Capitulo 16. Gestidn de la memoria... | i 183, 16.1. (VMON) Paginacién virtual de funciones 183, 16.2. (GC) Recuperaci6n de memoria inutilizada.. 184 16.3. (ALLOC...) Tamatio de segmentos en memoria nodal. aaa i 184 164. (EXPAND...) Numero de segmentos en memoria nodkl... 184 16.5. (MEM) Estadistica de la memoria... 185 ‘CONTENIDO Capitulo 17, AutoLISP Versién 11. Nuevos comandos 17.1. Conceptos previos 172. Nuevos comandos relatives a unidades y cadenas de texto... 17.2.1. (CYUNIT...) Convertir valor @ nuevas unidades... 1722, (TEXTPAGE) Conmutar a Pantalla de Texto borrando .... 1723. (WCMATCH..) Comparar cadena de texto con filtt . 173. Modificaciones en comandos de la Versién 16... : 173.1. (INITGET...).. 17.32. (TRANS..) 173.3. Céaigos de error. 1734. SSGET.)nnn 17.4, Nuevos comandos relatives @ aplicaciones ADS... 174.1. (XLOAD...) Cargar aplicaciin ADS... 17.42. (XUNLOAD...) Descargar aplicacion ADS... 17.43. (ADS) Lista de aplicaciones ADS cargadas.. 17.5. Nuevos comandos de acceso a Base de Datos... 17.5.1, (NENTSEL...) Seleccionar entidad componente Ge una entidad comput con punto de designacién . Baus 1752, (ENTMAKE..) Construir una entidad en Base de Datos. 176. Nuevas comndos para Extensién de Datos de Entidades. 17.6.1. (REGAPP...) Registrar nombre de aplicacién 1.62. (KDROOM...) Espacio disponible pars Exeesién ce Datos parma cotidad 17.63. (XDSIZE...) Longitud de lista de Extensin de Datos Bjemplo 1: Trazado de linea de tuberias Fjemplo 2: Juntar dos polilineas 3D en una sol Apéndice A: Lista de comandos de AutoLISP y érdenes AutoCAD. Apéniice B: Cédigos para entidades de dibujo en Base de Datos... Apéndice C: Contenidos del disquete de utilidades Indice analitico, Prélogo smn ae EES EEE Hace ya algo més de un aio que aparecié en el metcado el libro AutoCAD AVANZADO ¥. 10, En ague- liss fechas nacia con la necesidad de proporcionar ¢ nuestros alumnos una documentacién amplia y pre- cisa que sirviera de apoyo a los diversos cursos de AutoCAD que imparte el Centro AYALA. Pronto se demostré que, mas allé de las expectativas iniiales, el mercado en lengua espafiola se encontraba escaso de publicaciones que trataran con la suficente profundidad un tema tan actual y pujante, La favorable acogida dispensada por los usuarios de AutoCAD a nuestro libro, hasta el punto de con- vertirse en una de las publicaciones técnicas mas vendidas por la Editorial en Espafia durante 1990, re- compensa con creves los esfuerzos y las horas de trabajo invertidas en su realizaci ‘Siempre atentos @ las inquietudes que nos transmiten nuestros alumnos y también los profesionales de CAD que acuden @ nuestro Centro para soicitar usuarios cualficados, hemos detectado en fos itimos meses un interés creciente por aquellos programas y aplicaciones que, tomando como base de trabajo AutoCAD, permiten ir mas ald de sus propias limitaciones, posibilitando realizaciones cada vez ms com- plejas y precisas, impensables hace tan s6lo unos pocos afios en el mundo de las computadoras personales. En concreto, AutoLISP, la version especifca para AutoCAD del lenguaje de programacién LISP, ha sido continua fuente de interés y consulta por parte de un amplio sector de profesionales y usuarios en general que no encuentran en este momento una respuesta adecuada en el mercado de publicaciones en espafil ‘Animados por ef éxito de nuestro libro anterior y recogiendo la importante experiencia acurnulada cen los cursos dé AutoLISP que el Centro AYALA viene impartiendo desde hace tres aiios, nos pusimos ‘manos a la obra. La responsabilidad del nuevo libto AutoLISP. V. IT se le confié a José A. Tajadura Za- pirain, un joven ingeniero con amplia experiencia en temas de CAD y Programacién, profundo conoce- dor de AutoCAD y AutoLISP, ademés de profesor de nuestro Centro en los numerosos cursos que s¢ hhan impartido en los titimos aiios. En ese complicado trabajo que supone siempre la confeecién de un libro téenico, ha contado con ta colaboracién y apoyo de Javier Lopez Ferndndez, compafiero en las tareas docentes y especialista en CAD, ‘quien ya asumié con mucho éxito la responsabilidad de nuestro libro anterior AutoCAD AVANZADO V. 10. Como responsable del Centro AYALA, quiero agradecer la total entrega y dedicacién de dichos pro- fesores, que tantas horas de trabajo han empleado para que este importante libro pueda Hegar a vuestras manos El Centro AYALA, de Bilbao, es uno de los primeros ATC (Authorized Training Center) de Espaia, autorizado oficialmente, en 1986, para formar en AutoCAD a los usuarios de este programa de Disco Asistido por Computadora. El diploma que obtienen nuestros alumnos, enviado directamente por AUTODESK AG, BASEL- SWITZERLAND, ka sido reconocido por todos los paises de la Comunidad Econémica Europea. Esperamos que esta nueva publicacién satisfaga a todos 1os que acogieron tan favorablemente nues- tra obra anterior, y a aquellos que, conociendo el programa AutoCAD, se interesan por mejorar dia a dia sus prestaciones y posibilidades. Como siempre, nuestra intencién sigue siendo la de hacer un libro com. pleto y, sobre todo, eminentemente prdctico. Estamos seguros de que los numerosos programas y grficos explicativos que incluimos facitardn la mejor comprensién a los usuarios, J.C. Bartolomé Larrinaga Director Gerente del Centro AYALA. Bilbao Introducci6n a SEE CRE STE TT STEN Este libro, AutoLISP. ¥. 11, trata del lenguaje de programacién especialmente adaptado para obtener toda Ja potencia y prestaciones de AutoCAD. Hablar de AutoCAD es hablar del programa de CAD (Disefto Asistido por Computadora) més extendido en el mundo. Desde hace ya unos afios, AutoCAD mantiene ‘un liderazgo incuestionable en este terreno y buena prueba de ello son los mas de 400 000 usuarios que han optado por él en todo el mundo. No es preciso insistir aqué sobre las importantes posibilidades y la extraordinaria adaptabilidad de ‘AutoCAD a las necesidades particulares de cada usuario, Estas caracteristicas quedaron de manifiesto cn el libro AutoCAD AVANZADO V. 10 que publicamos hace un affo, con una gran acogida por parte de un plblico cada ver, mi interesado en los temas de CAD. 1a evolucién de AutoCAD ha sido, y es, constante desde su primera aparicién. Ast la dltima y ex perada versién AutoCAD V. 11 acaba de lanzarse al mercado con decisivas mejoras en el terreno de las ‘Tres Dimensiones, lo que nos obliga a mantener el testigo, ofteciendo a los numerosos interesados una nueva publicacién en forma de libro. Esta versién incluye un Médulo de Modelizacién que permite un ‘tratamiento completo de sélidos y la posibilidad de desarrollar aplicaciones en Lenguaje C. La complejidad creciente de estas aplicaciones y la rapidez, en ocasiones vertginoss, con que s6 ste ceden de un afio para otro, obliga «los usuarios a realizar un esfuerzo constante para mantenerse al dia, “no perder el tren”, en definitiva Es el momento, pues, de abordar el conocimiento de AutoLISP, un lenguaje sencillo de aprender, totalmente interactivo con AutoCAD, que permite a los usuarios la realizacién de programas propios y el acceso directo a la Base de Datos del dibyjo. Se trata de dar un importante peso hacia adelante para ob- tener toda la potencia y prestaciones de AutoCAD, més alla de las limitaciones de las érdenes propias de ‘AutoCAD y més alli, incluso, de Ia creacién de memis personalizados y archivos de guién, Quien no conozea ningiin lenguaje de programacién no debe tener el menor motivo de inguietud. Siguiendo la norma empleada en los libros AutoCAD AVANZADO ¥. 10 y V. 1, y que tan buenos resul- tados esta cosechando entre los usuatios, se ha tratado de realizar una obra fundamentalmente diddtica A la exposicion de los diferentes comandos de AutoL.ISP, sigue en cada capitulo uno o varios ejemplos con programas de aplicacién. No se recurre a diagramas de flujos que puedan despistar a los profanos en programacién, Las estructuras bisicas de cada programa se encuentran explicadas de una manera sencilla y comprensible. Unas llaves ayudan a ponerias de manifiesto en e! listado de cada programa, Los capitulos siguen un orden légico de diffcultad creciente, de acuerdo con el contenido temétioo de cada uno. Empezando por los comandos de AutoLISP para la creacién y carga de funciones propias de usuario, se pasa revista a los diferentes comandos para el tratamiento de listas y de cadenas textuales, introduccién de datos desde AutoCAD, estructuras de programacion, operaciones lgicas y numéricas, etc, Un apartado importante lo constituyen los comandos para el acceso a la Base de Datos de Auto- CAD. Se explica detalladamente la organizacién de esta Base de Datos y los cédigos necesarios para gestionar y modificar su contenido. También se incluyen los comandos de acceso a pantalla grética y dis- positivos de entrada, y explicaciones precisas sobre la gestién de memoria y paginacién virtual de funciones. En este libro aparecen explicados todos los comands de AutoLISP, incluso aquellos especificos de aplicacion més limitada, que se detalan en los capitulos finales, Se ha huido intencionadamente de programas extensos y complicados que resulten indescifrables para cl usuario. Todos los programas expuestos, desde los més sencillos, en los primeros capitulos, hasta los xi xiv INTRODUCCION “ltimos, que presentan ya una cierta complejidad, se explican con detalle mediante abundantes figuras ilus- trativas Para hacerlo mis didéctico, es posible incluso que la explicacién de algin programa ocupe mas que el texto de los comandos en el capitulo correspondiente. Estamos convencidos de que el examen detallado de estos programas va a proporcionar al usuario tuna mayor comprensién que todas las explicaciones teo- ricas, Se trata no sélo de que entienda su funcionamiento, sino también por qué contienen determinadas instrucciones en vez de otras, exponiendo los puntos débilesy los posibles problemas que es preciso pre venir. Esta es la tinica manera de que el usuario adquiera los conocimientos que necesita para realizar sus propios programas. ‘Al seleceionar los programas incluidos, se ha seguido un criterio gréfico en la resolucién de los mis- ‘mos. El usuario que ya conoce AutoCAD puede concentrarse, de esta forma, en fa esiruetura del progra- ‘ma, Un tratamiento matematico complejo, con matrices para el cambio de Sistema de Coordenadas, ecua- ciones paramétricas de superficie, et., exigiria un esfuerzo afiadido. De lo que se trata, en definitiva, es de aprender a realizar programas de aplicacin propios en AutoL ISP. La reciente aparicién de AutoCAD V. 11 (con su correspondiente version de AutoLISP) no implica la sustitucién completa de la Versién 10, Ambas van a coexistr, de acuerdo con las necesidades que tenga cada usuario. Por motivos didécticos se han agrupado las novedades de AutoLISP V. 11 en el Capi tulo 17. Todos los programas funcionan, en cualquier caso, con la Versién 10 de AutoCAD, por lo que no deben plantear ningiin problema al usuario que no disponga de la nueva Version 11, Los programas se encuentran preparados para funcionar con la versiGn en castellano de AutoCAD. Ello se debe a crterios didécticos ya mencionados. No obstante, el usuario que dispone de una versién cn inglés no tiene més que traducir las famadas a drdenes de AutoCAD. Para los interesados, y recogiendo la favorable experiencia de los libros AutoCAD AVANZADO V. 10 y V.17, ponemos a su disposicién un disquete con todos los programas, tanto en inglés como en castella- no, ademas de otras wtilidades. Bl contenido completo de este disquete de utilidades so detalla en el Apén- dice C. Los autores CAPITULO Introduccién. Conceptos previos y definiciones 1.1. LENGUAJE DE PROGRAMACION LISP. EL LISP es un lenguaje de program: la investigacin en Inteligencia Artificial. Su nombre proviene de LISt Processing (Proves ppuesto que la base de su funcionamiento es él manejo de listas en vez de datos mimér Una i ‘que pueden ser n Tiables, datos concretos numéri- 0s 0 textuales,funciones definidas por el propio usuario, efe. El simbolo es, pues, la unided bésica con un contenido 0 un significado para el programa en LISP. La lista es el mecanismo que junta una serie de simbolos y los evalia, es decir, los procesa, obtenien- do un resultado, El lenguaje LISP procesa directamente las listas en cuanto se encuentran formadas y ob- tiene 0 “devuelve” el resultado de ese proceso. Esta caracteristica del manejo de listas otorga al LISP una gran versatilidad y le distingue de otros lenguajes de programacién orientados a la manipulacién de mimeros, como pueden ser BASIC 0 FOR- ‘TRAN. relativamente antiguo, desarrollado en los afios cincuenta para Jo de Listas), Las ventajas que supone Ia utiizacién de un lenguaje basado en LISP para programar desde AutoCAD se podrfan resumir en los siguientes puntos: *¢ Faciidad para manejar objetos heterogéneos: niimeros, caracteres, funciones, entidades de dibujo, eteétera. Para LISP basta representar cualquiera de esos objetos con un “simbolo”, y no hay ne- cesidad de definir previamente qué tipo de datos va a c be ** Facilidad para la interacci6n en un proceso de dibujo. * Sencillez de aprendizaje y comprensién, ‘* El hecho de que el LISP sea un fenguaje muy utilizado.en investigacién y desarrollo de Inteligencia Artificial y Sistemas Expertos, * Sencillez de sintaxis, por lo que un intérprete de LISP es facil de realizar y resulta convenientemen- te pequefo, ELLISP.es.un lenguaje-que-ss svaluado en_vez.de.compilado o interpretado. Los lenguajes interpre- tados son leidos palabra a palabra por la computadora y cada palabra es convertida a lenguaje maquina Esto hace que sean muy lentos. Los lenguajes compilads son mucho més répidos, porque en el proceso de compilacién todo el pro- ‘grama se convierte en instrucciones de maquina. Bs fo que ocurre von BASIC, COBOL, FORTRAN, etc. Un lenguaje evaluado como el LISP es un paso intermedio entre los interpretados y los compilados. No es tan répido como estos iltimos, pero resulta mucho més flexible ¢ interactivo, Es posible, por ejem- plo, escribir un programa en LISP que sea capaz de modificarse a si mismo bajo cies “esta es la base de los llamados Sistemas Expertos. ‘© El mecanismo evaluador del LISP es la propia lista. Una lista es un conjunto de simbolos separados centre si por al menos un espacio en blanco y os entre paréntesis. Desde el momento en que existe 1 2 AUTOLISP, VERSION 11 tune expresién encerrada entre paréntess, el LISP la considera como una lista y la evaia intentando ofte- cer un resultado. © EI LISP no es un lenguaje de programacién ‘nico, sino que existen muchas versioies de LISP: MacLISP, InterLISP, ZetaL ISP, Common LISP. 1.2, AutoLISP, UNA VERSION ESPECIFICA DE LISP -AuIoLISP.es_un_subconjunio del lenguaje de programacién Common LISP, Puesto que AutoLISP esté disefiado para funcionar desde un dibujo de AutoCAD, se han seleccionado las caractristicas de LISP rms adecuadas para este fin y ademds se han aftadido otras nuevas, sobre todo en lo relativo a la mani- pulacién de entidades de dibujo, acceso a la Base de Datos de AutoCAD ¢ interaccién grifica en general Los programas en AutoLISP son simples archivos de texto, con la extension obligatoria LSP, donde cl usuario escribe uno o varios programas contenidos en ese archiva. Una vez hecho esto, basta cargar el archivo desde el Editor de Dibujo de AutoCAD, para poder aoveder directamente a todos los programas arent 86 pul \utoLISP desde la linea de. buioen AutoCAD, es desir, esoribir conjuntos de simbolos encerrados entre paréntesis, AULOLISP evalia ‘inmediatamente esa lista y oftece un resultado. Y si la expresin contiene definiciones de funciones 0 va- riables, quedan cargadas en la memoria para su utilizacién posterior. Incluso el usuario puede definir_ érdenes_propias_pe ejecutar programas en AutoLISP, Una vez que la nueva orden esté definida, se en AuioCAD y # utiliza comp una més en el momento en que interese, También existe la posibilidad de redefinir 6rdenes existen- tes de AutoCAD para que funcionen de manera diferente de la habitual. Por ejemplo, en un dibujo-en que interesa que todas las entidades scan polilineas, es posible redefinr las érdenes LINEA y ARCO para que dibujen ditectamente polilineas. ‘Una de las mas importantes potencialidades de AutoLISP es el acceso directo a la Base de Datos de tun dibujo en AutoCAD, Toda la informacién del dibujo se encuentra en ella: capes, estlos de texto, tipos de lineas, sistemas de coordenadas o vistas almacenadss, atributos con sus diferentes valores en cada in- sercién, ete, asf como todas las entidades contenidas en el dibujo. Se puede utilizar AutoLISP para modificar esa Base de Datos o para extraer la informecién que i terese de ella con objeto de importarla, por ejemplo, en una base de datos externa. La forma més habitual de extraer informacién es mediante los datos de atributos asociados a bloques, 1.3, TIPOS DE OBJETOS EN AutoLISP Los objetos en AutoLISP representan todos los tipos de componentes de un programa, En esencia son dos, como ya se ha dicho: listas_y simbolos, Ademés es posible incluir como elementos de listas valores concretos (“constantes”), ya sean muméricos o textuales. ‘Atendiendo a sus caracteristicas se pueden definir varios tipos de objetos en AutoLISP: * Lista: es un objeto compuesto de: — Paréntesis de apertura. = Uno o més elementos separados por al menos un espacio en blanco. = Paréntesis de cierre. ‘Los elementos de la lista pueden ser simbolos, valores concretos (“constantes” numéricas o textua- Jes), 0 tambign otras listas incluidas. ‘© Elemento: cualquiera de los componentes de una lista ‘ Atomo: representa una informacién indivisible. Un valor concreto 0 un simbolo de variable que con- tiene un valor son étomos. Una lista 0 una funcién definida por el usuario no son dtomos. bolo: cualquier elemento de lista que no sea un valor conereto. El simbolo puede ser un nombre de variable, un nombre de funci6n definida por el usuario o un nombre de comando de AutoL ISP. INTRODUCCION. CONCEPTOS PREVIOS Y DEFINICONES 3 «© Enteros: valores numéricos enteros, ya sean explicitos o contenidos en variables. © Reales: valores numéricos con precision de coma flotante. * Cadenas: valores textuales que contienen cadenas de caracteres (cédigo ASCID, Deben ir entre co- mills ‘* Descriptores de fichero o archivo: valores que representan un archivo abierto para lectura 0 escri- tura desde un programa en AutoLISP. Por ejemplo, * “Nombres” de entidades de AutoCAD: valores que representan el “nombre” de una entidad en la Base de Datos. Por ejemplo, , © “Conjuntos designades” de AutoCAD: valores que representan una designacién de entidades de di- bujo. Por ejemplo, . ‘© Funcién de usuario: es un simbolo que representa el nombre de una funcién definida por el usuario. ‘© Funcién inherente 0 Comando: es un simbolo con el nombre de un comando predefinido de AutoLISP. A veces se les llama Subrutinas o Funciones predefinidas. * Funciones ADS © Subrutinas externas: son simbolos con aplicaciones de ADS en Lenguaje C, cargadas desde AutoLISP, Es un nuevo tipo de objeto incorporado en la Versién 11 (véase en el Capitulo 17). : En sistemas MS-DOS los enteros son nimeros de 16 bits con signo, ¢s decir, comprendidos entre 32768 y +32767, Los miimeros reales se representan con separacién de coma flotante de doble precision, con un minimo de 14 ciftas signficativas. Las cadenas pueden tener cualquier longitud. No obstante, para valores explictos (“constantes” de tipo cadena) existe una limitacién de 190 caracteres. 1.4. PROCEDIMIENTO DE EVALUACION EN AutoLISP La base de todo intérprete de LISP es su algoritmo evaluador. Este analiza cada linea del programa y de- vuelve un valor como resultado. La evaluacién en AutoL ISP se realiza de acuerdo con las siguientes regas © Los valores enteros, reales, cadenas de texto, descriptores de archivos, asi como Jos nombres de subrutinas 0 comandos de AutoLISP, devuelven su propio valor como resultado, * Los simbolos de variables participan con el valor que contienen (que les esti asociado) en el mo- mento de la evaluacién. © Las listas se evalian de acuerdo con el primer elemento, Si éste es un nombre de funcién inherente © comando, los elementos restantes de fa lista son considerados como los argumentos de ese co- ‘mando, En caso contrario, se considera como un nombre de funcidn definida por el usuario, tam- bién con el resto de elementos como argumentos, ‘Cuando los elementos de una lista son a su ver otras listas, éstas se van evaluando desde el nivel de anidacién inferior (as listas més “interiores”). Puesto que cada lista contiene un paréntesis de apertura y otro de cierre, cuando existen listas incluidas en otras todos los paréntesis que se vayan abriendo debe, tener sus correspondientes de ciere. Si se introduce desde e! teclado una expresion en AutoLISP a la que falta por cerrar algiin paréntesis, se visualiza un mensaje: a> donde “‘n” es un niimero que indica cuintos paréntesis faltan por cerrar. Se pueden teclear esos parénte- sis y subsanar el error. : ‘También es posible evaluar directamente un simbolo (extraer, por ejemplo, el valor actual contenido en uma variable) tecleando el signo de cerrar admiracién seguido del nombre del sitnbolo, 4 auTouse. VERSION 11 Por ejemplo: tp devolveria el valor actual contenido en la variable “pt” 1.5. CONVENCIONES DE AutoLISP Las expresiones contenidas en un programa de AutoLISP pueden introducirse directamente desde el te- ‘lado durante la edicién de un dibujo de AutoCAD, escribirse en un archivo de texto ASCII 0 ser sumi- nistradas por una variable del tipo cadena, Existen una serie de convenciones para la interprétacién por AutoLISP de esas expresiones, que se pueden resurnir en los siguientes puntos: * Los nombres de simbolos pueden utilizar todos los caracteres imprimibles (letras, niimeros, signos de puntuacién, etc.) salvo los prohibidos: OyetnG * Los caracteres que terminan un nombre de simbolo o un valor explicito (una constante numérica 0 de texto) son: () 1" (espacio en blanco) (fin de linea) * Una expresién puede ser tan larga como se quiera. Puede ocupar varias lineas del archivo de texto. * Los espacios en blanco de separacién entre simbolos son interpretados como un solo espacio entre cada par de simbolos. ‘* Los nombres de simbolos no pueden empezar por una cifta, Las mayfsculas y minésculas son in- diferentes para AutoLISP. ‘* Los valores explicitos (constantes) de nimeros pueden empezar con el cardcter + 0 ~, que es in- terpretado como el signo del niero. * Les valores de constantes de miimeto reales deben empezar con una cifra significativa. Bl carde- ter . se interpreta como el punto decimal. También se admite + 0 ~ para el signo y “e” 0 “E” para notacién exponencial (cientifica). ‘Noes valida la coma decimal ni tampoco se puede abreviar, como en “6” (hay que poner 0.6). * Los valores de constantes con cadenas de texto son caracteres que empiezan y terminan por comi- las. Dentro de las cadenas se pueden incluir caracteres de control mediante ia contrabarra \. Los ‘codigos permitidos son: \\ significa el cardcter contrabarra \. \e significa “cambio de cédigo/esc”. \n significa nueva linea, “Retorno de carro”. \r significa RETURN. \t significa taBulador. nnn. significa el cardcter con mimero de cbdigo octal (no ASCH que es decimal) “non”. \" significa el carécter ”. Se trata de un eddigo affadido en la Versin 11 (véase Cap tulo 17). Los cédigos deben ir en minisculas. Para incluir en una cadena un cédigo ASCII hay que caleular ‘su valor octal. Por ejemplo, el cardcter délar, “$”, es ASCII 36; su valor octal serd 4 y en Ia ca- ‘dena habré que indicar el cédigo de control “\44”. INTRODUCCION. CONCEPTOS PREVIOS Y DEFINICIONES 5 ® El apéstrofo se puede utilizar como abreviatura del comando QUOTE. ‘Lin equivale a (QUOTE Lin) Elcomando QUOTE devuelve el iteral del simbolo, Es decir, cuando en una expresién un sim- bolo aparece precedido por apéstrofo o se le aplica el comando QUOTE, no se evakia con el valor que contiene en ese momento, sino que devaelve el propio nombre literal del simbolo, * Se pueden incluir comentarios en un archivo de texto con programas en AutoLISP, comenzando con un punto y coma, “;”. A partir de donde encuentre un punto y coma hasta el final de la linea, ‘AutoLISP considera que son comentarios y no los tiene en cuenta. En los capitulos que siguen se establecen unas convenciones para explicar el formato en que debe ir escrito cada comando de AUtoLISP y Jos argumentos que admite: © El nombre del comando o funcién inherente va en mayisculas para distinguirlo de los argumentos. ‘El mimero de argumentos yl tipo se muestran entre paréntesis quebrados. Los puntos suspensivos, indican la posibilidad de especificar més argumentos, * Los argumentos opcionales, que pueden omitirse, van encerrados entre corchetes. (ANGTOS [ [}]) Indica que el nombre del comando en AutoLISP ¢s ANGTOS, que tiene un argumento obli- gatorio que no puede faltar, pues en caso contrario produciria un error. Ademés tiene un argumento op- Tativo que es y otro argumento aptativo que es , pero que depende de . Bs decir, se puede indicar y fatar , pero, si se indica , debe haberse indicado también Si se responde que Si, queda habilitado, A continuacién se visvaliza un mensaje relativo a AutoLISP AT, del que se hablaré més adelante. Los requerimientos de soporte de equipo para poder utilizar AutoLISP Versién 19 normal (no AT) son los mismos que para la versién de AutoCAD en que se trabaje, Aunque se puede trabajar con versio- nes inferiores que admitan AutoLISP, en este libro se consideraré la versién AutoCAD V. 16, dejando la Versién 11 para el Capitulo 17, ‘Una vez habilitado AutoLISP, como paso previo para cargar programas es necesario reservar la can- tidad de memoria necesaria, Esto se consigue introduciendo los valores requeridos en dos variables de on torno de AutoCAD llamadas LISPHEAP y LISE Ta variable LISPHEAP controla ef aiimero de octetos reservados para le llamada memoria “mon- 1t6n” (heap), que es el drea de memoria donde se almacenan todas las funciones y simbolos o variables creardos durante la, ejecucién de los programas. Cuanto mayor es su mimero o més complejas son las fun- ciones, mayores seran los requerimientos de memoria. La variable LISPSTACK controla el mimero de octetos reservados en la memoria “pila” (stack), que cs donde se almacenan los argumentos de funciones y los resultados parciales de la evaluacién de los pro- ‘gramas, Cuanto més recursivas sean las funciones 0 mas niveles de anidacién existan, més memoria de pila sera necesaria, Su valor no debe ser superior a 10 998. ‘La suma total de ambos valores no debe superar los 45 0 octetos. La asignacién de valores se hace desde el Sistema Operativo, antes de entrar en AutoCAD, con el comando SET. Como también es neve- sacio_fijaren Ja variable ACADFREERAM el valor en k-octetos de memoria RAM reservada (an ¥ de 24 suele ser tipico en computadoras personales del tipo AT), lo logico es incluir esas tres variables en 7 102 £2 bye 8 AUTOUS. VERSION 11 tun archivo de proceso por lotes (tipo .BAT), para que cada vez que se entre en AutoCAD quedlen asig- nados los valores correctos. ‘Asi, unos valores habituales para esas variables podrian ser los siguientes: SET ACADPREERAM™24 SET LISPHEAP-35 99 SET LISPSTACK=16 905 En computadoras personales de tipo AT se puede utilizar una versién mejorada de AutoLISP, espe- cialmente preparada para aprovechar todas las posibilidades de esos equipos. Esta versién es AutoL ISP AT, que se ha realizado como wn programa aparte llamado EXTLISP.EXE, que se debe ejecutar desde el Sistema Operativo antes de entrar en AutoCAD, Por tanto, la llamada a EXTLISP debe incluirse en el archivo “BAT” con que se entra en AutoCAD. Ese programa se aloja patcialmente en la memoria adicional de tipo AT del equipo. El archivo de recubrimiento de AutoLISP AT es ahora el ACADLX.OVL. Los requerimientos de equipo necesarios para poder utilizar AutoLISP AT son: ‘© Computadora compatible tipo AT basado en microprocesador 8286 o superior, con memoria RAM de al menos 649 K y disco duro. © Al menos 512 K de memoria ampliada del tipo AT libre. * Sistema Operativo MS-DOS Versién 2,0 0 superior. AutoLISP AT trabaja en modo “protegido” 8286 y reside parcialmente en memoria ampliada AT, permitiendo usar programas més grandes y trabajar con mas cantidad de datos que el AutoLISP normal Por lo dems, ambas versiones funcionan exactamente igual. Para activar la caracteristica de AutoLISP AT se procede como se ha explicado al principio en el Mem de Configuracién. Cuando se visualiza el mensaje: Desea utilizar AutoLISP extendido? <> se tesponde que si, después de haber respondido también que si al mensaje de habilitacion de AutoLISP. Ahora las variables de entorno de AutoLISP son diferentes, AutoLISP AT no utiliza la variable LISPHEAP. La variable LISPSTACK funciona de la misma forma explicada antes. Ahora hay que atiadit ‘una nueva variable que ¢s LISPXMEM, que determina la cantided de memoria ampliada del tipo AT que se reserva. Si no se especifica ningin valor, AutoLISP AT utilzard toda la disponible. Si se fija un valor para esta variable, debe hacerse antes de llamar al programa EXTLISP. Una vez terminada la sesién en AutoCAD, si se desea liberar la parte de memoria ooupada por EXTLISP, seri preciso ejecutar el programa REMLISP.EXE tecleando sin mis REMLISP desde el Sistema Operativo 0 incluyendo esta instruccin en el archivo “.BAT” una vez que se ba salido de AutoCAD. 2.2. CREACION DE UN PROGRAMA EN AutoLISP Los programas en AutoLISP son archivos de texto com la extensién .LSP. Por tanto, se crean directamen- te con un Editor como el EDLIN del Sistema Operativo DOS, o un Procesador de Textos como WordStar. ‘Una condicién importante os que el texto no debe contener ningtin caricter de control del tipo de situacién de mérgenes, sangrado, paginacién, ete. Por eso, al emplear un Procesador como WordStar, es preciso asegurarse de que se utiliza en modo “No documento”. No es conveniente emplear acentos en. Tos nombres de funciones y variables, pues pueden inducir a error, y Jos acentos en contenidos textuales originan caracteres de control. Para los programas sencillos que se van a manejar en estos primeros capitulos es suficiente con el EDLIN. Como en el archivo de drdenes externas de AutoCAD “ACAD.PGP” ya estd contenida una or- den “EDIT” que accede directamente al EDLIN, éste seré el procedimiento més cémodo para confeccio- nar los programas en AutoLISP: desde el Editor de Dibujo emplear la orden EDIT, crear 0 modificar los programas con el EDLIN y grabar las modificaciones, con lo que se vuelve autométicamente al Dibujo y ala pregunta “Orden:”. PRIMEROS PASOS En programas més complejos, como los presentados en capitulos posteriores o en los ejemplos de aplicacién al final det libro, conviene disponer de un procesador de textos como, por ejemplo, WordStar. Con un instalador que permita entrar directamente en modo No documento, se puede afadir al archivo “ACAD.PGP” una orden nueva, llamada, por ejemplo, WSN (WordStar No documento), que pida el nom bre def archivo a editar en modo No documento y entre directamente en WordStar. De manera similar, se podria aitadir una orden WSD que entre directamente en modo Docamento. Previamente habria que ‘rear dos comandos, WSN.COM y WSD.COM, para entrar en WordStar desde el Sistema Operativo. Esto se hace con el propio instalador de WordStar. Las nuevas érdenes de AutoCAD flamarian a esos dos comandos. Las lineas a afiadir al “ACAD.PGP” podrian ser simplemente: WSN,WSN,15 9949,Archivo a editar en modo No documento: ,# WSD,WSD,15 §996,Archivo a editar en modo Documento: ,f E] paso siguiente consistiré en cargar el programa desde el Editor de Dibyjo. Para ello es preciso em- plear Ia funcién o comando de AutoLISP (LOAD) como se explica en el siguiente apartado. En AutoCAD 386 la variable LISPSTACK esta ya prefijada internamente a un valor de 26 606) oc- tetos. En cualquier caso, para AutoLISP 11, que es le nueva version que acompatia a AutoCAD V. 11, no es nocesario fijar ningiin valor de variable, pues se utiliza toda la memoria disponible. Para las nuevas prestaciones de AutoLISP 11, véase el Capitulo 17. 2.3, (LOAD []) CARGAR PROGRAMAS Esta funcién carga las expresiones en AutoLISP contenidas en . Este nombre se da ‘entre comillas, puesto que es una cadena de texto, y sin extensién, pues sdlo se admiten los archivos con cextensién LSP. El archivo se localiza en el directorio actual Si se encuentra en otro directorio, hay que indicar el camino. En Sistema Operative MS-DOS, como Jos caminos se indican mediante contrabarras, “\”, AutoLISP no la admite directamente como carécter de texto y es necesario indicarla con dos contrabarras, “\\". Por ejemplo, se tiene un programa en un archivo llamado “ (resultado si error). En este caso, AutoLISP devuelve el valor de ese argumento en vez. de producir un error. Por ejemplo, se intents cargar un archivo “dbcir.sp” que no existe 0 no se localiza Orden: (LOAD “"dbeir” "No encuentro archivo") “lo encuentro archivo” orden: En vez de producit un error, (LOAD) devuelve el mensaje textual “No encuentro archivo” Se puede crear un archivo llamado ACAD.LSP con una serie ce programas incluidos en él. El com de este archivo se carga automiéticamente en la memoria eada vez que se entra en el Editor de Di- ‘byjo. Para todos fos programas contenidos en ACAD.LSP no es necesatio utilizar ef comando LOAD. Este archivo es muy (itil cuando interesa disponer de determinadas rutinas cada vez que se entra en un dibujo. 2.4, (DEFUN ...) DEFINIR FUNCION En AutoLISP una funcién es directamente un programa, pues su evaluaciOn ofrece un resultado una vez cargado el archivo que contiene su definicién. Asi, un archivo .LSP puede contener muchos programss, segitn el nimero de funciones definidas en él. Para evaluarlas no es necesario volver al archivo que las contiene; basta. con cargarlo una sola vez. El comando (DEFUN) se uliliza precisamente para definir funciones o programas de AuoLISP. Va seguido de . Esta expresin puede ser tan compleja quiera, ejecutando otras funcio- nes definidas, cargando archivos .LSP, etc. ‘Los res elements deben exislir obigatoriamente.'Si la funci6n definida no tiene argumentos ni sim- bolos locales, ¢s preciso indicarlo mediante wna lista vacia “()”. Pot ejemplo, se define una funciém llamada ‘‘seno”, cuya utilidad es caleular ef seno de un dngulo, Su definiciSn es la siguiente: o orden: (DEFUN, seno (x), (SBEQ xr (* PI (/ x 189.8)))(SBTQ s (SIN xr))) | SENO 3 > Quizé parezca un poco largo para teclearlo directamente desde la linea de drdenes. Lo légico es in- ‘luir los programas en un archivo de texto, con EDIT, como se ha explicado. Pero en estos ejemplos re- sulta més sencillo y didactico introducir las expresiones en AutoLISP desde la linea de érdenes, pues no requiere cargar el archivo con LOAD y se evalian directamente. En el ejemplo se ulilizan comandos 6 subrutinas de AutoL.ISP, como SETQ y las operaciones * y /, que se estudiardn en seguida en estos primeros capitulos. De momento nos sirven pare entender el pro- ceso de creacién de funciones de usuario con DEFUN. La funcidn definida “sen” utiliza una variable global que es “x”. Lo que hace esa funcién es crear ‘una variable llamada “xr”, que transforma el valor del dngulo “x” dado en grados sexagesimales a radia- nes, Para ello divide “x” entre 189.9 y multiplica ese resultado por PI. El valor obtenido en radiances se almacena en “xt”. A continuacién se crea una nueva variable llamada “s”. SIN es el comando de AutoLISP que caleula el seno de un Angulo expresado en radianes (en este caso el valor contenido en “x2”, y el valor de ese seno, que es el resultado final que se persigue, se almacena en la variable “s”. Puesto que la utilidad de la funcién “seno” es cafcalar el seno de un éngulo, igicamente es una fun ida definida para una variable (en este caso se la ha llamado “x”), Esa variable, més que global, que gui- 4 es un término que induce a confusin, se la puede considerar asociada a la funcién “seno”. Cad ue se lame 2.esa funcisn habré que indicar para qué. valor de Ja variable asociada.se quiere calouas. Por ejemplo: orden:(seno 34) 4.5 En este caso se ha llamado 4 la funcién “seno” para un valor de la variable asociada (que aqui se llama ‘“x”) igual a 39, La expresidn en AutoLISP que define la funcién “seno” es: (SETQ xx (+ PI (/ 188.8 x)))(SBTQ 8 (SIN xr)) En esa expresién aparece la variable asociada a la funcién “x” en el cociente (/ 186.0 x). Lo que hace el programa en AutoLISP es, en la expresién que define la funcién “'seno”, buscar dénde aparece la va- rable asociada “x” y sustituirla por el valor de esa variable con que se ha llamado a la funcidn. En el ‘ejemplo anterior ese valor era 34. Por tanto: {seno 36) equivalea (SETQ xr (+ PI (/ 184.6 38)))(SETQ s (SIN xr)) La variable “xr” almacena el valor de 30 en radianes, que es 0.523599, La variable “s” almacena ef vvalor del resultado de (SIN 0.523599), que es 9.5. La llamada a la funcién (Seno 38) devuelve el resultado de la ltima expresion evaluada, que es (SEQ 5 (SIN xn), ¥ por e50 el valor devuelto es 0.5, que es el ‘que interesa, Ese valor queda almacenado en *'s” por si interesa utiizarlo posteriormente en otto progra- ma en AutoLISP, wen 12 AUTOLISP. VERSION 11 Si se extraen los contenidos de los diferentes simbolos utilizados, los resultados son los siguientes: Hseno ((X) (SETQ XR (« (/ 18H. x)))(SETOQ s (SIN xr))) Ix nid ter §.523599 is 6.5 Isetq {sin La funcidn de usuario “seno” contiene una fsta con las variables (en este caso s6lo la “x”) y después la expresion que la define, La variable “x” no almacena ningiin valor, puesto que es simplemente una va- riable asociada a le funcién “seno”. Las variables “xr” y ‘” son globales y mantienen los valores alma cenados, Los nombres de comandos de AutoLISP, como SETQ y SIN, devuelven su definicién de subra- tinas. La funcién “seno” se ha definido con una variable asociada, Con el comando DEFUN se pueden definir funciones de usuario con tantas variables como se desee. Por ejemplo, una funcién lamada “surma3” ue tiene como finalidad realizar la suma de tres niimeros: Orden: (DEFUN suma3 (x y z) (SETQ sum (+ x y z))) SUMA3 Orden: (suma3 12 25 36) 67 Orden: !sum 67 Para llamar a la funcién “suma3” hay que especificar los valores de las tres variables asociadas para los cuales se quiere calcular la suma. Hasta ahora no se han especificado argumentos locales. La funcién de usuario “seno” tenia tinica- ‘mente la variable asociada “x”, Si se indica “xr” como argumento local: Orden: (DEFUN seno (x / xr) (SBTQ xr (» PI (/ x 180.6))) (SBTO s (SIN xr))) Orden:(seno 36) 6.5 orden: Ixr nil La funcién “seno” se ejecuta de la misma manera que antes. Pero ahora ta variable “x2” ha sido es- pecifieada como local y pierde su valor al terminar de ejecutarse “seno”. Almacena temporalmente el va- lor de 36 grados en radianes (9.523599), pero después lo pierde y se queda en nil, puesto que estaba de- finida como variable antes de llamar a "seno”, Si se define a “xr” como variable global antes de llamar a “seno”: Orden: (SBTQ xr 55) 55 Orden:(seno 36) 5.5 order 55 4 variable “xr” ha sido definida como global con el valor almacenado 55, Durante la ejecucién de “‘seno” funciona temporelmente como argumento local (en ef ejemplo, con el valor 9.523599), pero después re- cupera su valor de 55, PRIMEROS PASOS 13, La variable “s” funciona en todo momento como global y conserva el valor almacenado al terminar de ejecutarse “seno”. : Las funciones definidas tario mediante (DEFUN) pueden integrarse en. AutoCAD como ‘una orden mis. Para ello deben tener un nombre precedido por C: y comprender una lista de variables ‘slobales vaca, aunque pueden tener locales. Logicamente, ef nombre de la funcion definida no ‘debe coincidir con el de una orden existente de AutoCAD ni con el de un comando de AutoLISP. Por ejemplo, si en vez de tener que evaluar Ja funcién “diblinea” cada vez que se quiere ejecutar, interesa implementarla en AutoCAD como una orden nueva, se definiria de la siguiente manera: orden: (DEFUN c:diblinea () “nada”) C:DIBLINEA, orden:diblinea nada” ara ejecutar diblinea ya no es necesario evaluatla entre paréntesis. Ahora funciona como una orden mas de AutoCAD, hasta que se libere su espacio en Ja memoria o se salga de. cién de dibujo La funeidn de usuario “seno” no podria definise de esta forma: (DBFUN ¢:seno (x / xr) .- puesto que ya se ha dicho que las nuevas drdenes a integrar en AutoCAD no pueden tener arguments ‘Si ademds se desea que determinadas instrucciones se ejecuten también automticamente, se pueden incluir en una funciOn especial que es “s:startup”. El prefijo de esta funcién especial, “s:", debe consi- derarse como reservado; es mejor no utilizarlo en ninguna funcién de usuario. La funcién especial “s:startup” se ejecutard automiéticamente nada més entrar en el Editor de D- bbujo y cargarse el archivo ACADLLSP. Por ejemplo, si se incluye en este archivo: (DEFUN s::startup () (COMMAND "Limpia” to") ) Cada ver. que se entre en el Editor de Dibujo se llamar a la orden de AutoCAD “limpia” con el ‘comando de AutoLISP COMMAND, que se explicaré en este mismo capitulo, y a la opeién “Timpiar todo lo no utilizado”. Esta funcin especial es muy itil para cuando se quiere redefinir Srdenes de AutoCAD. Primero hay que anular la actual definicién con la orden “Anulade?”, Si previamente se encuentran cargades en la me- moria funciones de AutoLISP con la nueva definicién de esas drdenes, esta nueva definicién sustituré a la antigua, Entonces basta inctuir en ACAD.LSP esas nuevas definiciones, y en la funcién especial “srstartup” la anulaciOn de las actuales definiciones. (DEFUN c:quita () ) (DEFUN réin () ) (DEFUN s::startup () (COMMAND "anuladef” "quita”) (COMMAND "anuladef” "fin") 14 AUTOLISP. VERSION 11 Con este contenido del ACAD.LSP se cargarian en la memoria las nuevas definiciones de las érde- ‘nes “quite” y “fin”, y al ejecutarse automaticamente “s:startup”, con la orden de AutoCAD “anuladef” anularfan las actuales definiciones de esas dos érdenes ara recuperar las definiciones normales de ambas érdenes, basta emplear la orden de AutoCAD “redefine”, 2.5. (GRAPHSCR) PANTALLA GRAFICA Esta funcién 0 comando de AutoLISP conmuta de pantalla de texto a pantalla grifica. Su efecto es el mis- ‘mo que pulsar la tecla de funcién “FI” desde AutoCAD. Su evaluacin devuelve siempre “nil”. Se utiliza para asegurar que el Editor de Dibujo se encuentra en pantalla gréfica, cuando es preciso procesar puntos, entidades y demas elementos grificos. 2.6. (TEXTSCR) PANTALLA DE TEXTO Este comando conmuta a pantalla de texto, Es el complementario del comando anterior, Su evaluacién devuelve siempre “nil”. Ambos son equivalentes a pulsar sucesivamente fa tecia de funcién “Fi” desde AutoCAD. Sirve para asegurar que el Editor de Dibujo se encuentra en la pantalla de texto, cuando se van a mostrar datos no graficos: por ejemplo, listados de capas, entidades, etc. En configuraciones con dos pantallas (una de texto y otra gréfica) estos dos comandos no tienen efecto, 2.7. (PROMPT ) ESCRIBIR MENSAJE Este comando visualiza la cadena de texto en la linea de drdenes de AutoCAD y devuelve “nil”. En configuraciones de dos pantallas visualiza ef mensaje en ambas, Por esta razén es preferible a otras, funciones de eseritura como (PRINC), que se estudiardn més adelante. Orden: (PROMP? “Bienvenido a AutoLTSP”) Bienvenido a AutoLISPnil Se observa que el mensaje se visualiza sin comillas. La evaluacién de (PROMPT) devuelve “ail” a continuacin del mensaje. Para evitar esto se utiliza el comando (TERPRI) explicado en el siguiente apar- tado, 2.8, (TERPRI) TERMINAR ESCRITURA Este comando mueve el eursor al comienzo de una nueva linea. Se utiliza para saltar de linea cada vez que se escriben mensajes en el area de Srdenes de la pantalla grifica. Existen otros procedimientos como el caracter de control “\n” incluido dentro del texto del mensaje, pero a menudo interesa (TERPRI) por razones de claridad Esta funcidn no se utiliza pars entradas(salidas de archivos. Para ello se emplea PRINT o PRIN. Orden: (PROMPT "Bienvenido a AutoLISP") (TERPRI) Bienvenido a AutoLIsP nil orden: El comando TERPRI salta de linea una vez visualizado el mensaje. Si se hubiera hecho: (PROMPT "\nBienvenido a AutoLISP”) se habria producido el salto de linea antes del mensaje, visualizandose éste, pero quedandose al final en la misma linea del mensaje. PRIMEROS PASOS 18 2.9, (SETQ {...]) ATRIBUIR VALORES Bste comando atribuye el valor de la expresién a la variable cuyo nombre es , el de a , y asi sucesivamente. Si las variables no estan previamente definidas, as crea. La fun- cién devuelve el valor atribuido a la titima variable. Los nombres de simbolos no pueden ser un literal (no valéria, por ejemplo, “QUOTE x”). SETO es le funcién bésica de atribucién de valores en AutoLISP. Por ejemplo: (SBTQ x 5 y “Hola” 2 ‘(a b) w 25.3) 5 "Hola" (ab) 25.3 JImportante: Hay que tener la precaucién de no utilizar con SETQ simbotos de variables que coincidan con nomn- bres de comandos de AutoLISP, pues esto descartaria la definicién de esos comandos, Por la misma razén, tampoco se deben utilizar nombres de érdenes de AutoCAD. La lista de nombres de todos los simbolos de AutoLISP (tanto los comandos como las funciones 0 variables definidas por el usuario) estén contenidos en una variable especial llamada ATOMLIST. Se ob- tiene tecleando: Orden: !ATOMLIST 2.10, (GETPOINT [] []) INTRODUCIR UN PUNTO Este comando aguarda a que el usuario introduzca un punto, bien directamente por teclado o sefialando en pantalla, y devuelve las coordenadas de ese punto en el SCP actual. Estas coordenadas se devuelven ‘como una lista con los tres valores reales de XY Z Se puede indicar opcionalmente un mensaje para que se visualice en la linea de érdenes, y también tun punto de base ...) ACCESO A ORDENES DE AutoCAD Este comando sirve para llamar a las érdenes de AutoCAD desde AutoL.ISP y siempre devuelve “nil”. ‘Sus argumentos son nombres de étdenes y opciones de AutoCAD. Cada argumento es evaluado y envia- do a AutoCAD como respuesta a sus mensajes o preguntas. Los nombres de érdenes y de opciones se envian como cadenas de texto y, por tanto, deben ir entre comillas. Los puntos 2D 0 3D se envian como Tstas de dos o tres niémeros reales, por lo que si se espe- cifican hay que hacerlo provedidos de QUOTE. Cada vez. que se necesite un RETURN hay que introducir la cadena vacia””. La llamada de COMMAND sin ningin argumento equivale a teclear “CTRt-C”, lo que anula la ma- vyoria de étdenes de AutoCAD, Orden: (COMMAND “linea” ‘(58 59) pt2 "") En el ejemplo se dibujaria una linea entre el punto 59,50 y el almacenado en la variable pt2 (que de- bberd contener, por tanto, una lista de dos o tres niimeros reales). La cadena vacie final introduce un RETURN y termina en AutoCAD la orden LINEA. Los comandos del tipo “GET...”, como GETPOINT del apartado anterior, no se pueden utilizar di- rectamente como argumentos de COMMAND. Por ejemplo, sise pretende dibujar una linea desde el pun- to 59,50 hasta un punto sefialado por el usuario: Orden: (COMMAND “linea” ‘(50 50) (GETPOINT ‘(58 50) " Segundo punto: ") ") Linea Del punto: Segundo punto: error:AutoCAD rejected function Se produce un error y el abandono de la funcién en curso. Pata especificar un punto introducido me- diante GETPOINT (0 més datos aceptados por funciones “GET...”) hay que ejecutar previamente esa fun- cin y almacenar el valor en una variable. PriMEROS PASOS 17 orden:(SETQ pt2 (GETPOINT '(56 58) “Segundo punto: “)) Segundo punto: (ce sefiala) (126.6 76.6 6.6) Orden: (COMMAND “linea” ‘(56 58) pt2 "") ‘Ahora la funcién se ejecuta correctamente y la linea queda dibujada entre el punto 50,50 y el punto almacenado en “pt2” (Figura 2.2). Las drdenes de AutoCAD que leen directamente informacion del teclado, como TEXTODIN y BO- CETO, no se pueden utilizar con la funcién COMMAND, También conviene evitar la llamada a érdenes ‘que abandonan el control del Editor de Dibujo, como SALTRAZ, SALIMPR o SCRIPT. Si se llama a una orden de AutoCAD y se especifica como argumento de COMMAND el simbolo prodefinido “pause”, a orden se interrumpe hasta que el usuario introduzca los datos que en ese momen- to se requieran, pudiendo hacerlo de forma dindmica mediante “arrastre”. El mecanismo es similar al uso de las contrabarras en las opciones de meni. En el momento en que se introducen esos datos (puede ser un valor, una opcién, un punto, etc:) continia la ejecucién de COMMAND desde Auto ISP. Si el usuario introduce una orden transparente durante la interrupcién de “pause” (como 'ZOOM 0 *BNCUADRE), la funcién COMMAND permaneceré temporalmente suspendida, Esto permite al usua- rio efectuar todos los zoom 0 encuadre que desee antes de reanudar la funcion COMMAND introducien- do los datos que sean precisos, Orden: (COMMAND “circulo” “5¢,50" "16" “Linea” "56,50" pause “") Este ejemplo dibuja un cireulo con centro en 59,50 y radio 19. Después comienza una linea en 5,50 yy se interrumpe hasta que el usuario especifica el punto final de la linea, pudiendo hacer todos fos zoom y encuadre que desee. En el momento en que se teclea o sefala ese punto, la funcién COMMAND intro- duce un RETURN y Ia orden LINEA termina (Figura 2.2) Figura 2.2. Utiizacién de COMMAND para llamar a érdenes de AutoCAD. Obsérvese que los puntos se pueden también especificar como una cadena de texto tal como se in- troducitian desde el teclado, con las coordenadas separadas por comas (en el ejemplo, 59,59”) 2.12, (QUOTE ) LITERAL DE EXPRESION Ya se ha dicho que este comando, que se puede abreviar con un apéstrofo, evita que se evahien los sim bolos. Se puede emplear con cualquier expresién en AutoLISP y siempre devuelve el literal de esa expre- sién, es decir, sin evaluar. Orden: (QUOTE (SBTO x 25)) (SBTQ X25) Orden: (QUOTE (DEFUN diblin () “nada”)) (DEFUN DIBLIN nil "nada”) 18 AUTOLISP. VERSION 11 En ambos casos, QUOTE devuelve el iteral de la expresin sin evaluat. AuioLISP siempre convierte todos los nombres de simbolos, funciones de usuario o variables en mayisculas. Por eso la variable “x” © la funcién “diblin” se devuclven en mayisculas. El “nil” que aparece después de la funcién “diblin”” significa que no tiene argumentos, 2.13. (EVAL ) EVALUAR EXPRESION Este comando eval la expresién indicada y devuelve el resultado de esa evaluacién. Orden: (BVAL (SETQ x 15)) 15 Es equivalente a hacer directamente (SETQ x 15). Como se ha dicho, AutoLISP evalia directamente fos paréntesis en cuanto se encuentran cerrados. Sin embargo, EVAL tiene aplicaciones especificas, como el ejemplo que se estudiaré al hablar del comando READ en el Capitulo 8, 2.14. VALORES PREDEFINIDOS DE AutoLISP Como ya se ha dicho, existen unas subrutinas de AutoLISP que no son propiamente comandos, sino va- lores predefinidos. Estas son las siguientes: © PE Bs el valor del mimero real “pi” 3.1415926. *T: Esel simbolo de True, Cierto (1 logico). Por titimo, et valor de Nada, Falso (9 légico), se representa en AutoLISP por nil, Este valor aparece siempre en mintsculas y no se puede acceder a él. Por ejemplo, orden: (SETQ nil 26) error: bad argument type ro es un simbolo propiamente, sino un valor que representa Vacio o Nada. 2.15. (SET ) ATRIBUIR VALOR A SIMBOLO NO EVALUADO Este comand atribuye el valor de la expresion indicada al simbolo . Este simboto se con- sidera sin evaluar. La diferencia con SETQ es que aqui se atribuye o asocia el valor de la expresion indi- cada, al literal del simbolo, haciendo ambos equivalentes. Con SETQ se almacenaban valores en simbolos, de variables no lterales. Orden: (SET ‘a 25) 25 AutoLISP rechaza si se hace: (SET a 25). El simbolo debe ser literal. Unicamente lo admite si pre- viamente se atribuye a ese simbolo un literal de otro. Orden: (SET .’x ‘a) A orden: (SET x 25) 25 orden: tx. A Orden: ta 25 PRIMEROS PASOS 19 En este caso se ha atribuido al simbolo x el valor literal del simbolo a, Si extrzemos el valor asociado ax, vernos que es.A. Al hacer (SET x 25) se atribuye indirectamente el valor 25 al literal asociado a x, ue es A. Por es0 el valor asociado al simbolo A es ahora 25, EJEMPLO 1: Programa para dibujar una linea simple Por ser el primer ejemplo, se trata de un programa muy simple que, mangjando los comandos hasta ahora vistos, dibuja una linea entre los dos puntos designados por el usuatio, ara confeccionar el archivo en AutoLISP que contiene este programa, accedemos mediante la or- den EDIT al Editor de lineas. El archivo se llamaré DBLIN.LSP y sa contenido es el siguiente: (DEFUN diblinea ( / pt! pt2) (GRAPHSCR) (PROMPT "Este sencillo programa dibuja una linea") (TERPRI) (SBTQ pt1 (GETPOINT "Primer punto: ")) (TERPRI) (SBTQ pt2 (GETPOINT ptl "Segundo punto: ")) (TERPRI) (PROMPT "MUCHAS GRACIAS") (TERPRI) (COMMAND “Linea” pti pt2 "") ) Ya esté hecho el archivo. Para cargarlo se utiliza la funcién “LOAD”. Orden:(L0AD “dblin”) DIBLINER Para ejecutar el programa basta llamar a la funcién “diblinea” recién creada Orden: (diblinea) Este sencillo programa dibuja una linea Primer punto: Segundo punto: MUCHAS GRACIAS Linea Del punto: Al punto: Al punto: Orden:nil Ei segundo punto visualiza una linea “elistca” unida dindmicamente al primero, al especificar este iitimo en el comando GETPOINT. Las variables “ptl” “pt2” son locales y, por tanto, su valor después de ejecutar el programa seré “nil” EJEMPLO 2: Programa para dibujar tres lineas confluyentes Vamos a completar el ejemplo anterior de forma que, partiendo desde el primer punto “pt!” ef nuevo programa dibuje ahora tres lineas hasta los puntos “pt2” “pt3” y “ped”. (DBFUN diblinea3 ( / pti pt2 pt3 pt4) (GRAPHSCR) (PROMPT "Este sencillo programa dibuja 3 lineas”) (TERPRI) (SETQ pt1 (GETPOINT "Primer punto: ")) (TERPRI) (SETQ pt2 (GETPOINT pt "Segundo punto: ")) (TERPRI) {COMMAND “linea” ptl pt2 “”) (SETO pt3 (GETPOINT pt “Nuevo segundo punto: “)) (TBRPRI) 20 AUTOUSP, VERSION 11 (COMMAND “Linea” pti pt3 “") (SETQ pt4 (GETPOINT ptl “Nuevo segundo punto: ")) (TERPRI) (COMMAND “linea” pti pté ””) ) La nueva funcién definida se llama “diblinea3”, El programa dibuja en primer lugar una linea desde ptl hasta pt2, lo misino que el programa anterior. Pero ahora pide un nuevo segundo punto, visualizando una linea elistica desde ptl. Cuando se introduce, dibuia una segunda linea. Después pide otro nuevo se- undo punto, para terminar en cuanto se dibuja la tercera linea (Figura 2.3) Figura 2.3. Resultado gréfico del programa para dibujar tres lineas contluyentes. CAPITULO Este capitulo comenta los procedimientos basicos para la utiizacién de listas, obmo cteatlas y cémo ac- ceder a todo o parte de su contenido, Ya se ha visto un caso muy importante y habitual de lista: los pun- tos en dos o tres dimensiones, que son listas de dos o tres elementos reales. Los comandos de AutoLISP «que se explican a continuacién permiten acoeder a los componentes de esas listas, es decir, extraer los com- ponentes X, Y o Z de los puntos segin interese 3.1. (CAR ) PRIMER ELEMENTO DE LISTA Este comando devuelve el primer elemento de la lista especificada. Si es vacia “()”, devuelve “nil” ‘Una de sus aplicaciones més importantes es extraer el primer valor de una liste que representa un punto, es decir, la coordenada X. Por ejemplo, si un punto en 3D “pti” es “(10 25 56)”: Orden: (SETQ xi (CAR pt1)) 16.0 El comando SETQ almacena en la variable “x1” el valor de la coordenada X de “ptl”. Si se emplea CAR directamente con listas, hay que tener en cuenta que deben estar sin evahiar (pre- cedidas por QUOTE). Orden: (CAR ‘(5 15 65)) 5 Orden:(caR "((¢ x) 1 2)) (ex) Orden: (CAR ’()) nil Otra importante funcién de este comando es el acceso a la Base de Datos de AutoCAD, donde todas, las entidades del dibujo se encuentran almacenadas como sucesién de listas. Este aspecto se estudiard con detalle en el Capitulo 12. 3.2, (CDR ) SEGUNDO ELEMENTO Y RESTO DE LISTA Este comando devuelve una lista con los elementos de la lista que se indique, desde el segundo hasta el final; es decir, todos los elementos menos el primero. Si es vacia, devuelve “nil”. ‘Si es un tipo especial de lista llamado “par punteado” con s6lo dos elementos (se estudiar mas adelante), CDR devueive el segundo elemento sin incluirlo en una lista, Este tipo de listas son fun- damentates en la Base de Datos de AutoCAD, como se verd en su momento, y de abi I utilidad de los comandos CAR, CDR y sus combinaciones (véase el siguiente apartado) para acceder a las entidades del dibujo y modificaras. 21 22 AUTOUSP. VERSION 11 Si es un punto en dos dimensiones, CDR devuelve el segundo elemento, pero, jot, incluido cn una lista, Para obtener el valor numérico de la coordenada Y es preciso aplicar CAR a esa lista de un elemento, orden:(SETQ ptl ‘(6 9)) (6 9) Orden: (SETQ lyl (CDR ptl)) (9) Orden: (SETQ yl (CAR ly1)) 9 La variable “ptl” almacena en forma de lista las coordenadas X ¥ del punto, En “Iy1” se almacena cl resultado del comando CDR, que es una lista con el nico elemento “9”, Para obtener el valor nurné- rico de la coordenada Y, ha habido que aplicar CAR a “Iy1” y almacenar el resultado en “yl”. Estos dos pasos sucesivos se pueden juntar en uno solo, como se verd a continuacién. 3.3. (CADR ) SEGUNDO ELEMENTO DE LISTA Este comando equivale a (CAR (CDR )), por lo que es muy itil para obtener directamente la co ordenada Y de una lista que represente un punto, orden: (SETQ ptl ‘(25 36 48) (25.8 36.6 49.0) Orden: (SET yl (CADR ptl)) 36.8 Los comandos CAR y CDR se pueden combinar de manera similar a lo visto, hasta el cuarto nivel de anidacién, Por ejemplo, si se tiene Orden: (SETQ lis ‘((a b) (x y) 5 £)) las siguientes combinaciones equivaldrian a: (CAAR lis) (CAR (CAR lis)) devuelve (CDAR lis) a (CDR (CAR lis)) devuelve — (b) {CADDR lis) a (CAR (CDR (CDR lis))) dewuelve 5 {CADAR lis) a (CAR (CDR (CAR lis))) devuelve —b (CADDAR lis) a (CAR (CDR (CDR (CAR lis)))) devuelve nil Y asi todas las combinaciones posibes. Segiin lo visto, el comando para obtener la coordenada Z de tun punto en 3d ({ercer elemento de la lista) es CADDR. Orden: (SETQ ptl ‘(3 66 98)) (38 66 98) Orden: (CADDR ptl) 90.8 Si el elemento buscado de Ja lista no existe, la funci6n devuelve nil. Por ejemplo, con el valor de “ptt” del ejemplo anterior: Orden: (CDODR pt1) nil ‘Todas estas combinaciones son extremadamente titles, tanto para mancjar lists en general como para -gestionar directamente la Base de Datos del Dibujo de AutoCAD. UMLZACION DE LISTAS 23 3.4, (LIST ) CREACION DE LISTA Bste comando retine todas las expresiones indicadas en y forma con ellas una lista, que devuelve ‘como resultado de la evaluacién, Se utiliza sobre todo para definir variables de punto, una vez obtenidas por separado las coordena: das. Si, por ejemplo, como resultado de un programa se han almacenado en “xl”, “yi” y “21” las eo: ordenadas de un punto y se quiere definir una variable “ptl” que contenga ese punto: Orden: (SETQ ptt (x1 yl 21)) error: bad function Orden: (SETQ ptl ‘(x1 yi 21)) (xt yl at) cen el primer caso el paréntesis que contiene las tres coordenadas es evaluado por AutoLISP y, como la funcién “x1” no esté definida, produce un error. En el segundo caso la variable “pt!” almacena el literal de la lista, peto no con los valores de las coordenadas, que son los que interesan. Para conseguirlo hay ‘que utilizar el comando LIST. orden: (LIS? x1 yl 21) (3.6 65.5 99.9) Orden: (SETQ ptl (LIST x1 yl 21)) (36.5 65.8 90.9) Ahora si, el valor del punto esta almacenado en “ptt”. Obsérvese la diferencia del resultado con va Totes de variable y con literales: (Lis? x1 yl 21) devuelve (36.9 69.6 90.8) (LIST ‘x1 ‘yl '21) — devuelwe (x1 yl 21) 3.5. (GETCORNER []) INTRODUCIR OTRA ESQUINA Este comando toma como base el punto especificado y visualiza de forma dinamica un rectingulo ‘entre este punto de base y la posicion del cursor, devolviendo el punto sefalado por el usuario, EL resultado es el mismo de GETPOINT (aceptar un punto); lo tinico que cambia es la forma de vi suatizar dindmicamente el arrastre: en vez de una linea, aqui es un.rectingulo eldstico, El punto de base se expresa respecto al SCP actual. Si se indica un punto 3D, no se tiene en cuenta Ja coordenada Z: siempre se toma como tal el valor actual de la elevacion. orden: (GETCORNER ‘(8 8) "Otro punto: ") Otro punto: (35.6 74.4 86.) En el ejemplo se visualiza el mensaje “Otro punto:” y aparece un recténgulo eldstico entre “0,6 y el cursor, hasta que se “pincha” y la funcién GETCORNER devuelve ese punto (Figura 3.1), EJEMPLO 1: Dibujar un rectingulo Una aplicacién muy sencilla de la utilizacién de puntos como listas es un programa para dibujar un rec- tingulo. El usuario introduce as dos esquinas de la diagonal y el programa se encarga de calcular las otras dos para dibujar las cuatro lineas del rectinguio, En el texto correspondiente a este programa se observa la préctica de ir “sangrando” los paréntesis, de forma que los que se van abriendo tengan el de cierre en la misma columna en vertical EI contenido del programa que define na funcién llamada “rectang” con las cuatro esquinas como variables locales es el siguiente: 24 AUTOLISP. VERSION 11, Figura 2.1. Visualizacién en pantalla de GETCORNER. (DEFUN rectang (/ pti pt2 pt3 pt4) (GRAPHSCR) (SETO ptl (GEYPOINT "Primera esquina: ”)) (TERPRI) (SEQ pt3 (GETPOINT pti “Segunda esquina: ”)) (TERPRI) (SETQ pt2 (LIST (CAR pt3)(CADR ptl))) (SETQ pté (LIST (CAR pt1)(CADR pt3))) (COMMAND “Linea” pti pt2 pt3 pté "c") ) EL programa asigna a “ptl” y “pt3” les dos esquinas introducidas por el usuario. Para caleular “pt2” hay gue tomar {a coordenada X de “pt3” con (CAR pt3) y la coordenada ¥ de “ptl” con (CADR pt), reuniendo ambas en una lista con LIST. De manera andlogs se almacena en “pid” el punto obtenido con Ja coordenada X de “ptI” y la coordenada Y de “p13”. Por tltimo se dibuja fa linea entre los cuatro pun- tos, cerrdndola al final (Figura 3.2). ( * Pt2 Figura 3.2. Visualizacién en pantalta del trazado del recténgulo con GETPOINT. ara visualizar el rectingulo de forma dindmica se puede mejorar el programa haciendo uso del co- mando GETCORNER para introducir la segunda esquina (Figura 3.3) (DEFUN rectang (/ ptl pt2 pt3 pt4)(GRAPHSCR), (SETQ pt1 (GBTPOINT "Primera esquina: ")) (TERPRI) (SETQ pt3 (GETCORNER pti "Segunda esquina: ”)) (TERPRI) (SBTQ pt2 (LIST (CAR pt3)(CADR ptl))) (SBTQ pt4 (LIST (CAR pt1)(CADR pt3))) (COMMAND “Linea” ptl pt2 pt3 pt4 “c”) ) EJEMPLO 2: Dibujar rectingulo con arcos de empalme Basado en el ejemplo anterior, este programa dibuja el rectingulo como una polilinea en ver de lineas individuales y después solicta un radio de empalme para aplicarlo a las cuatro esquinas del rectingulo. UTLIZAGION DE LISTAS 25 PES Figura 3.3. Trazado del rectingulo con GETCORNER, HTT (DEFUN rectemp (/ pti pt2 pt3 pté remp) (GRAPHSCR) (SETQ pti (GETPOINT “Primera esquina: ”)) (‘TERPRI) (SETO pt3 (GETCORNER ptl “Segunda esquina: ")) (TERPRI) (SETO pt2 (LIST (CAR pt3)(CADR ptl))) (SETQ pt4 (LIST (CAR ptl)(CADR pt3))) (COMMAND “pol” pti pt2 pt3 ptd "c”) (SETQ remp (GRTREAL "Radio de empalme: ")) (TERPRI) (COMMAND "empalne” "x" remp) (COMMAND “empaime” "p" "u") ) La funcién definida se llama ahora “rectemp” por distinguitla de la anterior. Su contenido para di- bujar el rectingulo es el mismo, salvo que la orden llamada por COMMAND es “pol”. ‘Después el programa solicita un valor de radio de empalme y lo almacena en la variable “‘remp” de- finida como una nueva variable local. Para ello utiliza el comando GETREAL explicado en el siguiente capitulo y cuya funcién no es otra que aceptar el valor introducido como un mimero real ‘A continuacién se utiliza la orden “empalme” y con su opcién ‘‘r” (Radio) se especifica el valor al- macenado en ‘'remp”. Hay un aspecto a destacar en este punto. La orden “empalme” hay que volver repetirla, una vez sefialado el radio, pata designar los objetos a empalmar. Desde AutoCAD esto se hace hhabitualmente con RETURN, que repite la tltima orden introducida, Pero al ejecutar el programa en ‘AutoLISP, la iltima orden reconocida por AutoCAD es la que se utilizé antes de cargarlo y no las que han sido Wamadas dentro del programa. Por eso es necesario volver a utilizar la funcién COMMAND para llamar de nuevo a la orden “empalme”. Ahora se escoge la opcida “p” (Polilinea) y ya sélo resta designar el recténgulo para que se generen Jos empalmes con “u” Ultimo) (Figura 3.4) Figura 3.4. Trazodo del recténgulo con arcas de empalme. CAPITULO Estructura de un programa Sa A SELON ENS Este capitulo comienza a examinar como se obtienen con AutoLISP las estructuras bisicas de programa- cién: condicionales o alternativas y repetitivas. Las primeras cuando la secuencia de instrucciones del pro- zgrama depend de que se cumplan 0 no una o varias condiciones establecidas. Las repettivas cuando es neceserio repetir una secuencia un nlimero determinado de veces 0 hasta que se cumpla una condicién, que sirve de control del ciclo o “bucle”. Previamente se explican otros comandos para introduecién de datos (hasta ahora se han visto GET- POINT y GETCORNER) y también comandos de comparacién y operadores lépicos, necesarios para es- tablecer condiciones en las estructuras de los programas. 4.1. (GETINT []) INTRODUCIR NUMERO ENTERO Este comando o funcién inherente de AutoLISP acepta un niimero entero introducide por el usuario y devuelve ese niimero, El valor debe encontrarse entre -32768 y +32767, Si el usuario introduce un ni- ‘mero no entero oun dato no numérico, se produce un mensaje de error y AutoLISP solicita que pruebe otra vez, Orden: (SETQ nent (GETIN? "Introducir numero: ”)) Introducir numero: 25 (Rewm) 25 Orden: !nent 25 En el ejemplo se introduce el niimero entero 25, que queda almacenado en la variable global “nent”. 4.2. (GETREAL []) INTRODUCIR NUMERO REAL Totalmente similar al anterior, salvo que acepta un niimero real. Este niimero puede tener todos fos deci- rales que el usuario desee introduc (separados por el “punto” decimal). Si se introduce un mtimero en- tero, se considera como real. Si no se introduce un nimero, se produce un mensaje de error y AutoLISP solicita al usuario que pruebe otra vez. Orden: (SEQ nreal (GETREAL "Numero real: ”)) Wumero real: 25 (Retutn) 25.0 Orden: !nreal 25.6 El valor introducido debe ser numérico, Si se trata de un angulo, por ejemplo, no seria aceptado en la notacién de grados-minutossegundos. AutoLISP rechazaria 32d 15° 39” 27 28 AUTOUISP. VERSION 11 4.3, (GETDIST [] []) INTRODUCIR DISTANCIA Este comando acepta el valor de una distancia introducida por el usuario, Este valor se piede introducir directamente desde el teclado o mediante dos puntos det dibujo. Si se introduce ditectamente, el formato debe ser el actual establecido por la orden “Unidades”, Pero, independientemente de este formato, GETDIST devuelve siempre un niimero real Si se especifica un punto de base , AutoLISP visualiza una linea elistca entre ese punto y la posicién del cursor, aguardando a que el usuario introduzca un segundo punto. Bsto se puede hacer con cualquiera de los métodos de AutoCAD: coordenadas absolutas, relativas rectangulares, relativas polares, sefalando directamente, et. Orden: (SETQ dis (GETDIST ‘(19 if) "Segundo punto: ”)) Segundo punto: 109,160 127.279 Orden: !dis 127.279 Para evaluar una distancia en general, dejando al usuario que sedale fos dos puntos, seria necesario almacenar el valor del primer punto en una variable. Orden: (SEQ pt1 (GETPOINT “Primer punto:”)) (SEQ dis (GETDIST ptl “ Segundo punto: ")) Primer punto: 56,58 Segundo punto: 16d, 160 70.7107 4.4. (GETSTRING [] []) INTRODUCIR CADENA DE TEXTO Este comando acepta una cadena de caracteres introducida por el usuario desde el teclado y devuelve esa cadena, Si la cadena contiene més de 132 caracteres, sélo devuelve los 132 primeros caracteres, Si se especifica , se toma como sefial 0 condicién de que el texto puede contener espacios en bianco, siempre que fuera “nil” 0 no existira, al introducir la cadena de texto desde AutoCAD el primer espacio cn blanco que se pretenda incluir es tomado como “Return” y termina el texto. Si es distinto de “nil”, Ja cadena de texto puede contener espacios en blanco y entonces debe terminarse forzosamente con “Return”, Orden: (SEQ cad (GETSTRING "Introducir texto: ")) Introducir texto: Textosinespacios (Espacio o Return) Textosinespacios Orden: tad ‘Pextosinespacios Orden: (SETQ cad (GETSTRING T "Introducir texto: ")) Introducir texto: Texto con espacios en blanco (Return) ‘Texto con espacios en blanco Orden: tcad Texto con espacios en blanco Se observa que en el segundo ejemplo se ha utilizado el valor “T” (cierto) como especificacion para asegurar que la sefial 0 “bandera” no es “nil” y admita los espacios en blanco. Si se introduce solamente “Return”, el comando GETSTRING acepta la cadena vacia representada por dos comillas sin nada en medio ””. ESTRUCTURA DE UN PROGRAMA — 29 orden: (SETQ cad (GETSTRING “Introducir texto: ")) Introducir texto: (Retum) Orden: tcad 45. (=) OPERACIONES DE COMPARACION () OV (=) Esta serie de comandos de AutoLISP efectiian operaciones de comparacién de valores, ya sean numéricos fo textuales. Los valores se pueden indicar expresamente 0 por las variables que los contenen, © Igual : (= <étomo> ..) ‘Compara los valores de todos los especificados. Si son todos iguales, el resultado de la evaluacion es “T”, En caso contrario devuelve “nit” Orden: (SETQ x1 5)(SBTQ yl x1)(= x1 yi) Los valores de ambas variables son 5 y por tanto la funcién devuelve “T”. Hay que tener muy en cuenta que este comando solo compara valores y no listas o expresiones. Si, por ejemplo, se tienen dos variables, “pti” y “pt2”, con dos puntos en 2D que son listas de dos elementos, el resultado de (= ptl pt2) es “nil” porque esas variables no contienen valores numéri- os, sino listas, Para compara Ia igualdad de ambos puntos habria que recurrir a un comando de operaciones 16- sicas como EQUAL (estudiado en el siguiente apartadoy. No kgual : (= <étomo>) ‘Compara los dos valores y devuelve “T" si efectivamente son distintos. La funcin s6lo esta defi nida para dos argumentos. Orden: (SETQ a 7 b “Hola”)(/= a b) T © Menor :(< <étomo? ..) Devueive “T” si el valor del primer es menor que el segundo, La comparacion se efectiia segiin el valor de los cddigos ASCII, Por tanto, para valores textuales seria en orden alfabético, sien- do cl espacio en blanco el cardeter de menor valor y las mayiiscules de menos valor que las mi- miscalas Si se indican més de dos , el resultado seré “T” si cada uno de ellos es menor que el sk guiente; es decir, se encuentran ordenados por valores crecientes de cédigo ASCIL Orden: (SETQ v1 1f v2 36 v3 "A" v4 “AY v5 "E") Dadas esas variables con esos valores asignados, os resultados de emplear el comando “Menor” con varias combinaciones serian los siguientes (< v1 v2 v3 v4 v5) nil (< vl v2 v3 v5) T (< v3 v5) T (< v4 v5 v1) nil © Menor 0 Igual : (<= <étomo? ..) Similar al comando anterior, funciona de la misma manera pero comparando la condicién menor igual. orden: (SETQ v1 36 v2 16 v3 30 v4 “AY v5 "a" v6 "A") 30 AUTOUSP. VERSION 11 Algunas de las combinaciones posibles darian los siguientes resultados: (<= vl v3 v4 v6) ? (<= v2 vi v4 v5) . T ni (<= vi v3) (< v5 v4 v6) i © Mayor : (> <étomo> ..) Compara todos los <étomo> especificados y devuelve “T” sélo si cada valor es mayor que el si- guiente; es decir, se encuentran ordenados de mayor a menor. Orden: (SETO v1 20 v2 28 v3 "Cc" va “£" v5 en) Estos serfan algunos de fos resultados de la evaluacién del comando con esas variables: (> v1 v2 v3 v5 v4) nil ( vi v3 way nil ( va v5 v3 v2 v1) nil © va v3 v2) ? ‘© Mayor o Igual : (= <étomo> <étomo> ...) Similar al anterior, establece la comparacién “Mayor o Igual”, Devuelve “ es mayor o igual que el siguiente, Orden:(S#TQ v1 26 v2 28 v3 "C" v4 "E" v5 nO") Estas variables ofrecerian los siguientes resultados: (= v5 va v3 vl) ail O= vi vbvavavl) oT (= v4 v5 v2 v3 v1) nil (= vi ¥2) r 4.6. OPERADORES LOGICOS Existen fundamentalmente cuatro comandos que acttian como operadores légicos: AND, OR, EQUAL y NOT. Estos comandos devuelven tinicamente los resultados “T” (cierto) o “nil” (falso). © (AND ..) -“Y” légico Este comando realiza ef “y” logico de una serie de expresiones que son las indicadas en Evalia todas las expresiones y devuelve “T” si ninguna de ellas es “nil”. En el momento en que encuentra alguna expresién con resultado “nil”, abandona la evaluacién de las demas y el comando devuelve “nil”. Su fincidn es detectar si exite algtin “nif” en las expresiones indicadas, Orden: (SBTQ v1 16 v2 19) (AND (<= vi v2) (= vl v2)) dewelve {AND (= v1 v2) (> vi v2)) — devuelve nil. Se observa que con el comando AND se puede evaluar cualquier tipo de expresién, por compleja «que se, y cuantas expresiones haga falta (OR ...) : “0” légico Realiza el “o” l6gico de la serie de expresiones indicadas. Evalia todas las expresiones y devuelve “nil” si todas ella son “nil”. En el momento en que encuentra un resultado diferente de “nil, aban- dona la evaluacién y devuelve “T”. ESTRUCTURA DE UN PROGRAMA 31 Se utiliza para detectar si existe alguna expresién diferente de “nil” en las indicadas, orden: (S879 v1 26 v2 26) (OR (< vl v2) (> v1 v2)) devuelve nil (OR (<= vi v2) (/= v1 v2)) devuelvwe (EQUAL [ optativo se utiliza cuando se comparan expresiones cuyos resultados son rnimeros reales y puede haber una pequefia diferencia de un decimal, Se suministra un valor del rmargen respecto al cual se consideran iguales los resultados. orden: (SETQ nl 2.5346 n2 2.5347) (HQUAL ni n2) dewuelve nil (EQUAL nl n2 6.8061) — devuelve © (NOT ) : “NO” logico Admite una tinica como argumento. Devuelve el “no” Idgico de esa expresion. Es decir, si el resultado de esa expresin es diferente de “nil”, devuelve “nil”, y si el resultado es “nil”, devuel- ner orden: (SEQ v1 26 v2 38) (sor (> vi v2)) devuelve (sor (< vi v2)) devuelve nil Estos operadores pueden utilizarse combinados entre si. Por ejemplo: Orden: (AND (OR (NOT (< v1 v2)) (= v2 v3)) (> v1 v3) e) En este ejemplo podria sustituirse el operador NOT haciendo uso de su equivalencia: (NOT (< v1 v2)) equivale a (= vi v2) 4.7, (EQ ) IDENTIDAD DE EXPRESIONES Este comando compara las dos expresiones indicadas y devuelve T (cierto) si ambas son idénticas, 0 nil (falso) en caso contrario. Se utiliza sobre todo para comparar listas y ver si hay igualdad estructural, (SETQ listl ‘(x y z)) (SETO list2 ‘(x y z)) (SET list3 list2) (BQ listi list2) dewelve 7 (BQ listl list3) develve nil 32° AUTOUISP. VERSION 11 Se observa que list y list2 son exactamente la misma lista por defini igual a fist2, pero no a list. Por eso EQ devuelve ni La diferencia con EQUAL es que éste compara los resultados de evaluar las expresiones, mientras que EQ compara la identidad estructural de las expresiones sin evalua. dn, Peto list3 es por definicién 4.8. (IF [}) CONDICIONAL Este comando es una de las estructuras basicas de programacién: la secuencia alternativa, La funcién IP cevalta la expresién indicada como condicién en . Si el resultado no es “nil”, entonces pasa a eva tat la expresién contenida en . En este caso devuelve el resultado de esa expresion. Si es “nil”, entonces pasa a evaluar Ja expresién contenida en en el caso de que se haya indicado y devuelve su resultado. Si no se ha indicado , devuelve “nil” Orden: (SBTQ pti (GETPOINT "Primer punto: ")) (TERPRI) (SETQ pt2 (GETPOINT "Segundo punto: ”)) (TERPRI) (IF (EQUAL pt1 pt2) (PROMPT "Son iguales”) (PROMPT "No son iguales”) ) (TERPRI) Primer puntot (se indica un punto) Segundo puntos (se indica el mismo punto) son iguales” orden: El ejemplo anterior acepta dos puntos introducidos por el usuario y después compara si as dos lstas «que representan esos puntos son iguales, con el comando de operacién l6gica EQUAL. Si son iguales, el resultado de es “T” (cierto) y entonces IF devuelve PROMPT ‘Son igusles”. Si no son iguales, el resultado de es “nil”, con lo que IF devuelve PROMPT “No son iguales”. En el ejemplo se han “sangrado” los paréntesis para apreciar mejor Ia estructura del programa. Des- de la linea de drdenes de AutoCAD habrfa que introducirio todo seguido. Bs practica habitual, ala hora de escribir un archivo con programas en AutoLISP, ir “sangrando” o desplazando los paréntesis hacia la derecha conforme se van abriendo nuevos paréntesis incluidos en otros. Después los paréntesis de cierre se sitian al mismo nivel en fa misma column) que los correspondientes de apertura, El comando IF requiete indicar como minimo dos listas: la primera lista como condicién y la segun- da como accién a efectuar si se cumple ésta (seria la rama del “si” de Ia estructura alternativa). Una ter~ cera lista optativa especifica la accién a efectuar si no se cumple la condieién (la rama del “no” de la al- ‘ternativa). 4.9. (PROGN ...) SECUENCIA CONSECUTIVA Este comando admite como argumentos todas las expresiones que se indiquen y las evalia secuen- cialmente, Devuelve el valor de Ia iltima expresin evaluada, Es habitual utilizar PROGN en comands cuyo formato s6lo permite especificar una expresién. Un cjemplo muy claro es el condicional IF visto en el apartado anterior, Este s6lo permite indicar una accién si la condicign se cumple. Con PROGN se pueden ejecutar varias expresiones. Orden: (IF (= n 1) (PROGN (SEO a (+ 1 nj) (PROMPT "Correcto") (TERPRI) ) (PROMPT “Incorrecto") \ ESTRUCTURA DE UN PROGRAMA 33, En el ejemplo, si se cumple la condiciOn “n= 1”, se ejecuta el comando PROGN, que evalia secuen cialmente los comandos SETQ, PROMPT y TERPRI. Si no se cumple la condicién, se ejecuta el PROMPT final. En una estructura alternativa, por tanto, el comando PROGN se puede utilizar para agrupar todas Jas instrucciones de cada una de les ramas (la del “si” y la del “no”). 4.10. (REPEAT ...) REPETIR N VECES Este comando es la estructura basica de la secuencia repetitiva, cuando se requiere repetir una expresion un determinado mimero de voces, El nimero de veces se especifica en y debe ser un entero posi- tivo. El comando REPEAT evalia la expresién indicads (que puede ser tan compleja como haga falta) veces y devuelve el resultado de la ultima evaluacién, Orden: (DEFUN pglS (/ pti pt2) (SETQ ptl (GETPOINT "Introducir punto: “)) (REPEAT 4 (SETQ pt2 (GBTPOINT pt1 "Nuevo punto: ")) (COMMAND “Linea” pt1 pt2 "") (SBTQ ptl pt2) ) PI programa define una funcién “pel S” que dibuja una poligonal con cinco vértices (es deci, cuatro centidades de linea). Primero se almacena en “ptt” el primer punto sefalado por el usuario. A continua ‘idn se establece un ciclo repetitivo para dibujar las cuatro lineas. En cada paso de este cielo, el usuario introduce un nuevo punto y se dibyja una Linea entre “ptl” y “pt2”. Con (SETQ pt! pt2) se consigue tomar como primer punto de la nueva linea el segundo punto de la anterior, con lo que s& puede repetr el ciclo. Este proceso de “actualizar variables” es muy habitual en los ciclos repetitivos. La variable “pt1” tiene al principio del ciclo un valor, ese valor se cambia al final ddel mismo y asi entra en la repeticién del ciclo con el nuevo valor. 4.11. (WHILE ...) REPETIR SEGUN CONDICION Es otro comando para establecer secuencias repetitivas en el programa. En este caso el ciclo no se repite un determinado niimero de veces, “N”, sino mientras sc cumpla la condicién especificada . Esta condicién sirve, pues, como elemento de control de Ia repetitiva. Mientras el resultado de evaluar sea diferente de “nit, el comando WHILE evalia la expre- sion indicada a continuacién , que puede ser tan compleja como se desee. Después vuelve a evar Jar . Esto se repite hasta que al evaluar resulte “nil”. Entonces deja de repetirse el ciclo y WHILE devuelve el resultado de la tiltima expresin realizada. Es muy habitual emplear este comando en combinacién con IF para establecer una variable de con- trol de la repetitiva y chequear en cada ciclo el valor de esa variable. Orden: (DEFUN pgl5 (/ n ctrl pti pt2) (SETQ ptl (GETPOINT "Introducir punto: ")) (SETQ n (GETINT “Numero de lineas: ”)) (SETQ ctrl 7) (WHILE ctrl (SETO pt2 (GETPOINT pti "Nuevo punto: ")) (COMMAND “Linea” pt1 pt2 "") (SETQ pti pt2) (SBTQ n (~ n 1)) (IF (= a g) (SBTQ ctr] nil)) 34 AUTOUISP, VERSION 11 Se ha utilizado el mismo programa del ejemplo anterior, pero estableciendo un control para la se- cuencia repettiva mediante la variable “tt”. Se define una variable “a” que almacena el némero’de lineas de la poligonsl, valor introducido por el usuario, Cada vex que se ejecuta un ciclo, al valor de “n” se le resta 1, con lo que se leva la cuenta del ‘mimero de ciclos que faltan por ejecutar. La vatiable “n” se inicializa fuera del ciclo antes de entrar en él, aceptando el valor introducido me- diante GETINT. La variable de control “ctr?” se iniializa también fuera det ciclo con el valor “T”. Este procedimiento de iniciaizar determinadas variables antes de entrar por primera vez en el ciclo es muy ha- bitual en las estructuras repetitivas. El comando IF chequea el valor de “‘n” y cuando es 9 significa que se acaba de realizar el iltimo ciclo, En ese momento (= n #) devuelve “T” (cierto), con lo que se asigna el valor mulo “ni” a la variable de control “ctt!”, Esto provoca el final de la repetitiva establecida por WHILE. ‘Obsérvese que la condicién se ha establecido con el nombre de fa vatiable “trl”. El ciclo se repetird hasta que su valor sea “nil”. EJEMPLO 1: Dibujar un haz. de limeas Como primera aplicacién sencilla de las estructuras de programacién, se va a definir una nueva orden de AutoCAD llamada “haz” que permitiré dibujar, a partir de un punto, un haz de lineas conforme el usus- rio vaya introduciendo nuevos puntos. El punto de base del haz también lo especifica el usuario. Puesto que se trata de un archivo de AutoLISP en el que ya empieza a haber estructuras de progra- ma, se van a poner de manifiesto mediante unas llaves que las destaquen. 1. Listado del programa [—(DEFUN mlin (/ pti pt2) (SETQ pti (GETPOINT "Punto de base: ")) (TERPRI) (sz79 2 7) [—(EILE n (SETQ pt2 (GEYPOINT pt “Punto final: ")) (TERPRI) (COMMAND “Linea” ptl pt2 "") _) L) [—(DEFUN crhaz () (SETVAR "blipmode” 6) (SETVAR “cmdecho” $) (mlin) (SBTVAR "blipnode” 1) (SETVAR “cndecho” 1) L_) 2. Observaciones ‘Se empiezan a observar las practicas habituales a la hora de escribir programas en AutoLISP. Al cargar el archivo que contiene los programas, el comando LOAD devuelve ef nombre de la iltima funcidn defi rida. Como en este caso se va a definir una nueva orden “haz”, interesa que el usuerio que cargue el pro- grama sepa cual es el nombre de fa nueva orden que tiene que emplear a contimacién para ejecutar el programa. Por eso la definicidn de la nueva orden se encontrard siempre al final del archivo de texto. En el ejemplo es (DEFUN cihaz () ...). Al cargar el archivo con LOAD, devolvera el nombre C:HAZ. Por otro lado, en vez de incluir todas las expresiones en AutoLISP del programa dentro de la defi nicién de “chaz”, se define una funcién “min” (linea miltiple), que es la que contiene las expresiones pata dibujar el haz. de lineas, Al definir “c:haz” bastard amar a esa funcién “mlin”. tra prictica habitual en programacién de AutoLISP es desactivar las marcas auxiliares y el eco de menii a la linea de érdenes. Esto se consigue accediendo con el comando SETVAR (que se estudiard en ESTRUCTURA DE UN PROGRAMA 35 detalle en el capitulo correspondiente) a las variables “>blipmode” y “cmdecho” y cambiando su valor 2 6. Una ver ejecutado el programa, se vuelven a activar ambas variables cambiando su valor a 1 La definicién de la nueva orden (en el ejemplo, chaz) contiene, pues, habitualmente s6lo la desacti- vacién de marcas auxiliares y eco de meni y la llamada a diferentes funciones de usuario previamente de- finidas en el archivo de texto (en este caso existe solamente una, que es “mlin”). También se observa claramente en el listado del archivo dé texto el procedimiento de “sangrar” los paréntesis, de forma que se van desplazando hacia la derecha, y el hecho de situar los paréntesis de cierre en la misma columna (al mismo nivel) que Jos correspondientes de apertura, 3. Explicacién del programa ‘Se definen dos funciones de usuario: = Funcién chaz Desactiva las mareas auniliares y el eco de Srdenes. Llama a la funcién “mlin”. Vuelve a activar las mar- cas auuiliares y el eco de drdenes. © Funcién min Solicita del usuario el punto de base del haz y lo elmacena en la variable “pt!” Establece un ciclo repe- titivo para dibyjar cada wna de las lineas de! haz, Como variable de control de ese cielo se toma “n”, que se inicialza a T (cierto) antes de entrar. El ciclo se repetit’ mientras “n” sea cierto, es decir, indefinida- mente, de forma que el usuario pueda hacer tantas lineas como desee. Para salir del ciclo habré que int- ‘rumpir el programa con CIRLC. Dentro del ciclo se solicita del usvario ef punto final de cada tinea del haz, el cual se almacena en “p12” A continuacién se dibuja la linea entre el punto de base “pt!” y el punto final indicado “pt2” (Fie gura 4.1), Figura 4.1. Trazado en pantalla del haz de lineas. EJEMPLO 2: Dibujar una estrella Este programa dibuja una estrella regular de N puntas, El usuario especifica el mimero de puntas desea- do, el centro de la estrella los radios de las circunferencias exterior e interior que van a delinir su tamafio. 36 AUTOLISP. VERSION 14 1. Listado del programa [— (DEFUN inic () (S879 cen (GETPOINT "Centro de la estrella: ")) (TERPRI) (S870 xmay (GETDIST cen "Radio mayor: ")) (TERPRI) (SETQ xmen (GETDIST cen “Radio menor: “)) (TERPRI) (SETQ np (GETINT “Numero de puntas: ”)) (TERPRI) [— (WHILE (np 1) (PROMPT "Valor debe ser positivo mayor que 1”) (TERPRI) (SBT0 np (GETINT "Numero de puntas: ")) (TERPRI) i) (SETQ dang (/ (+ 2 PI) np)) b) [— (DEFUN dib () (SETQ ang ) (SE79 ptl (POLAR cen $ rmay)) (—(REPEAT np (SETQ pt2 (POLAR cen (+ ang (/ dang 2)) rmen)) (SBTO pt3 (POLAR cen (+ ang dang) rmay )) (COMMAND “linea” ptl pt2 "") (COMMAND "Linea" pt2 pt3 ””) (SETQ ptl pt3) (SBTQ ang (+ ang dang)) Ly i) [—(DEFUN c:star (/ ang cen rmay rmen dang pti pt? pt3) (SEDVAR "blipmode” $) (SETVAR "cmdecho” 6) (inic) (aib) (SETVAR “blipmode” 1) (SBTVAR “cmdecho” 1) 2. Observaciones En este programa se puede observar otta préctica de programacién que es muy importante: prever todos Jos posibles fallos para tratar de evitarlos, Estos fallos se pueden producir fundamentalmente cada vez que l programa solicita datos del usuario. Bs preciso tener en cuenta todos los posibles errores que puede cometer el usuario y aiadir al programa ls instrucciones necesarias para evitaris. ‘Asi, en la funcién “inic” que va solicitando del usuario los datos necesarios para definir la estrella, al introdueir el nimero de puntas el comando GETINT sélo acepta nimeros enteros, Pero si el ustario indica un nimero entero negativo o @, GETINT lo acepta, con lo que el ciclo repetitivo de la funcién “dib”, que es (REPEAT np ....), produciria un error y el programa quedaria abortado. Por eso, tras solicitar un valor para el nimero de puntas, la funcién “inic” establece un ciclo repeti- tivo que chequea si el valor de “np” es menor o igual que I. Sies as, se visualiza el mensaje “Valor debe set positivo y mayor que 1” (pues se considera que una estrella de una punta no tiene sentido) y se soicita de nuevo el mimero de puntas. El programa sélo saldré de este ciclo cuando el valor de “np” sea entero y mayor que 1, con lo que el correcto funcionamiento de Ja posterior lamada a la funcién “dib” queda garantizado, En lo que respecta a los valores de los dos radios, se solictan mediante GETDIST. Este comando admit valores negativos para los vectores de distancia. Una estrella normal tendria dos radios positvos.. Pero el programa funciona también para uno o ambos radios negativos y se obtienen figuras atractivas de estrellas con puntas entrelazadas. Por eso no interesa poner ningin control adicional para esos valores. ESTRUCTURA DE UN PROGRAMA = 37 3, Explicacién del programa Define tres funciones de usuario, una de ellas como nueva orden de AutoCAD. ® Funcién c:star Simplemente desactiva marcas auxiliares y eco de Srdenes y llama a las dos funciones de usuario “nic” y“dib”. © Funcién inic Solicit del usuario los datos necesarios para dibujar Ia estrella. En primer lugar, el centro con el comando GETPOINT. Después, los radios mayor y menor, utilizando GETDIST con el centro como punto de base. De esta manera se pueden especificar aribos radios gréficamente (Figura 4.2). En cualquier caso, el usua- rio puede introducir directamente por teclado estos valores, Si uno de los radios es negativo, se obtienen estrellas con las puntas entrelazadas (Figura 4.4) GS Figura 4.2. Introduccién de datos pare cibujar la estrella. A continuacién se pide el mimero de puntas con GETINT, puesto que debe ser un nimero entero, Pero se impone la condicidn de que debe ser positive y mayor que 1. Por es0 se establece un control con WHILE para chequear si el valor introducido es menor o igual que 1. Si esto ocurre, se visualiza un PROMPT de advertencia y se vuelve a solicitar un valor para el nimero de puntas. Solamente cuando el usuario introduzca un valor correcto, se romperd el ciclo de control Por titimo, la funcién calcula el angulo abarcado por cada punta de la estrella, teniendo en cuenta que debe ir en radianes, Ese valor se almacena en la variable de incremento de éngulo “dang” (delta-n- glo) (Figura 42), * Funcién dib Conxiste en un ciclo repetitive que dibuja las dos lineas intermedias entre cada par de puntas, Previamen- te sc inicializa a el valor del angulo de referencia “ang” para empezar a dibujar cada punta. El punto inicial “ptl” se obtiene la primera vez fuera del ciclo, Corresponde al primer cuadtante de la estrella El ciclo calcula mediante el comando POLAR, que se emplea aqui por conveniencia y se estudiara ‘en el Capitulo 6, y teniendo en cuenta los valores de los radios mayor y menor, los puntos “pt2” y “pt3”” ‘que sirven para dibujar las dos lineas intermedias entre cada par de puntas (Figura 4.3). Al final del ciclo se actualiza la variable “>ptl” para que el nuevo ciclo empiece con el valor del titimo punto del anterior ‘También se actualiza el angulo de referencia “ang”, sumindole cada vez el incremento de Angulo “dang”. 38° AUTOUSP. VERSION 11 Figure 4.3. Trazado de cada una de las puntas de la estrella Este ciclo se repite un nimero de veces igual al nimero de puntas de la estrella Figure 4.4, Resultados aréficos do diferentes estrellas. Las dos figuras superiores han sido obtenidas con los ‘dos radios positivos. Las inferiores con uno da los radios negatvo, EJEMPLO 3: Lineas de texto con cualquier espaciado Cuando desde AutoCAD se quieren incorporar una serie de lincas de texto al dibujo, una vez especificado el estilo de texto, su altura, punto de insercién y éngulo de rotacin, ol espaciado entre lineas queda au- tomaticamente determinado. Si el usuario desea otra medida del espaciado entre lineas, debe calcular cada ver el punto de insercién de cada linea 0 moverlas hasta situarlas con el espaciado correcto, En cualquier caso, pierde ln posibilidad de empezar la nueva linea simplemente introduciendo “Return” una vez terminada la anterior. Este programa en AutoLISP define una nueva orden llamada “textos” que, con el estilo actual esta- biecido, permite al usuario escoger el espacizdo que desea para las sucesivas lineas de texto. ESTRUCTURA DE UN PROGRAMA 39 1. Listado del programa [— (DEFUN int () (GRAPHSCR) (SETQ pb (GETPOINT "Comienzo primera linea: “)) (TERPRI) (SETQ alt (GETDIST pb “Altura del texto: ")) (TERPRI) [WHILE (<= alt 5) (PROMPT “Altura debe ser positiva: ") (TERPRI) (SETQ alt (GETDIST pb "Altura del texto: ")) (TERPRI) Ly (SEZQ esp (GETDIST pb "Espacio entre lineas: “)) (TERPRI) (SETQ nl (GETINT “Numero de lineas: “)) (TERPRT) [— (WHILE (<= nl 8) (PROMPT "Numero de lineas debe ser positivo: *) (TERPRI) (SETQ nl (GETINT "Numero de lineas: ")) (TERPRI) ) ) (DEFUN dibtx () (SETQ n 1) (SETQ pins pb) p— (WHILE (<= n nl) (PROMPT "Introducir texto de linea: ") (PRINI n) (TBRPRI) (SETQ tx (GETSTRING T)) (COMMAND "texto" pins alt "6" tx) (SEQ n (+ 1 n)) (SETQ pins (LIST (CAR pb) (~ (CADR pins) esp))) Ly ) [—(DEFUN c:textos ( / pins pb alt nl n esp tx) (SEIVAR "blipnode” $) (SETVAR "cmdecho” 6) (int) (dibtx) (SEIVAR "blipmode” 1) (SETVAR “cmdecho” 1) 2. Observaciones Tal como se observaba en el programa anterior, los argumentos locales se especifican en la definicién de la altima funcidn “ctextos”. Esto es asi porque las funciones intermedias “int” y “dibtx” necesitan que los valores de esas variables no se pierdan. Por otro lado, convene establecer todas las variables utilizadas cen el programa como argumentos locales, con el fin de que no se agote répidamente la memoria disponible. Sin embargo, es conveniente ala hora de confeccionar un programa no establecer al principio ningin argumento local. $i el programa no funciona bien al primer intento, se puede de esta manera ir exploran- do los valores almacenados en las variables para ver la marcha dei mismo. Sélo al final, cuando el pro- grama esté depurado, se incluirén las variables como argumentos locales, Por otro lado, cuando el programa empieza a ser complejo y contiene Hamadas a varias funciones, resulta aconsejable definir en principio cada funcién por separado y probarlas hasta comprobar que van bien, Es mis facil detectar los enrores en una funcién aislada que en el programa completo con todas las funciones incluidas. 3. Explicacién de! programa Se define una nueva orden “textos” y dos funciones de usuario intermedias: 40° AUTOUSP. VERSION 11 ™ Funcién c:textos Define una nueva orden de AutoCAD “textos”, que tras desactivar las marcas auxiliares y el eco a ment llama simplemente a las funciones “int” y “dit”. © Funcién int Como siempre, se define para solicitar del usuario todos los datos necesarios para dibujar las lineas de texto, En primer lugar, el punto inicial para la primera linea. Después, ta altura del texto y el espaciado entre Iineas. A continuacibn, el ndimero de lineas a dibyjar (Figura 4.5). Se establece un ciclo de control con WHILE para asegurar que la altura introducida es positiva Se establece otto ciclo de control para ascgurar que el usuario no introduce un nimero 0) 0 negativo de lincas. Ya se verd al hablar de comandos, como INITGET y GETKWORD, eémo existen otros procedi- tmientos mas sencilos para establever los valores permitidos con los eomandos del tipo GET... Pero de momento el empleo de ciclos de control con WHILE va a servir para detectar de una manera mas clara donde hay que prever fallos en el programa, ara el espaciado entre lineas, el comando GETDIST acepta siempre un valor positivo si el usuario “pincha” un punto en pantalla, No obstante, es posible introducir un niimero negativo por teclado. El pro- grama lo permite, pues no tiene establecido ningtin ciclo de control para la variable “esp”. Bn ese caso las lineas Se generarian hacia arriba (eje ¥ positivo) Figura 4.5. Variables que intervienen en el trazado de las lineas de texto. * Funcién dibtx Consiste fundamentalmente en un ciclo repetitive que va dibujando cada una de las lineas de texto. La variable “n” se utiliza como contador del ciclo, para saber qué niimero de linea se esté generando en cada momento. Se inicaliza antes de entrar por primera vez en el ciclo, con un valor 1. La variable “pins” va a contener el punto de insercién del texto en cada linea, Se inicializa igualandola con “pb”, pues para la primera Kina el texto comienza en “pb” A continuacién se establece el ciclo con Ja condicién de que ef niimeso de linea “in” sea menor 0 ‘gual que el nimero total de lineas a dibujar “nt”. Se solicita del usuario el texto a incluir en cada linea y se almacena en la variable “tx”. Para solicitar ese texto y visualizar al mismo tiempo el mimero de tinea, ‘se hace de la siguiente manera: (PROMPT "Introducir texto de linea ") (PRINI n) (TERPRI) El comando PRINI, que se verd en el Capitulo 9, escribe en la pantalla el valor de la variable “n”, que serd en cada momento el nimero de linea correspondiente al actual recorrido del ciclo. Asi la tercers ESTRUCTURA DE UN PROGRAMA 41 ‘vez. que se recorra el ciclo, se solicita del usuario el texto para la Wea niimero tres y el mensaje que se visualiza en la pantalla es: Introducir texto de linea 3 El texto introducido por el usuario se acepta mediante uni comando GETSTRING con el parime- {ro T para que admita espacios en blanco. Se conocen ya todas las caracteristicas del texto y se procede a dibujarlo con (COMMAND “4ex10" sue) La parte final del ciclo, como siempre, actualiza los valores de las variables para entrar en el siguiente recortido del cielo, El contador ‘‘n” se incrementa en una unidad, Se calcula el nuevo valor del punto de insereidn: (SETQ pins (LIST (CAR pb) (- (CADR pins) esp))) Se toma la coordenada X del punto de base “pb” (es siempre la misma, los puntos iniciales de todas las lineas tienen la misma coordenada X), y la coordenada Y se calcula restando @ la Y del punto de in- sercién de la anterior linea el valor del espaciado (~ (CADR pins) esp). Se reiinen ambas coordenadas en una lista y ese es el nuevo punto de insercién buscado. Operaciones numéricas see eee Dt EE SSN RE En este capitulo se presentan los comandos de AutoLISP que permiten realizar operaciones numéricas Por razones de claridad se han dividido en dos apartados, uno para las operaciones aritméticas bésicas y ‘otro para el resto de céleulos numéricos. A final del capitulo se explica otro comando de estructura de programa, complementario de los es- tudiados en el capitulo precedente 5.1. (+)(-) (#) (/) OPERACIONES ARITMETICAS Estos cuatro comandos de AutoLISP efectiian las cuatro operaciones aritmeéticas basicas (Sumar, Restar, “Multplicar y Dividit) con los datos numéricos especificados a continuacié © Samar: (# ..) Devuelve la suma de todos fos especficados a continuacién del comando, $j todos los son enteros, el resultado es entero, Si uno de ellos es real, el resultado es real Orden: (SETQ nl 5 n2 7) (SETQ sum (+ 3 ni n2)) 45 orden: !sum 15 Los pueden ser directamente nimeros o bien variables, pero en ese caso su contenido debe ser numérico, © Restar: (~ ..) Devuelve el resultado de restar al primer todos los demas. Es decir, se resta al primero la suma de todos los demas. orden: (S810 ni 12 n2 5) (SEQ res (- nl n2 3)) 4 Ordon: tres 4 Fl resultado serla equivalente a hacer: orden:(SETQ res (- nl (+ n2 3))) Se observa que los valores numéricos de cualquiera de estos cuatro comandos pueden ser resulta: dos de la evaluacin de otras funciones. En el ejemplo, el resultado de una evaluacién de (+ n2 3) se utiliza como dato numérico para la evaluacion de (~ nl ), 43 44 AurousP. veRSION 11 © Multipticar: (+ Evalia el producto de todos los indicados. Como siempre, si uno de los es real, el resultado es real Orden:(SETQ nl 5 n2 6) (SETQ prod (« ni n2 3)) 6 Orden: Iprod oo En ol ejemplo, todos Jos mimeros suministrados a la funcién eran enteros y por eso el resultado es entero. © Dividir: (/ ...) Divide el primer nimero por todos los demés. Es decir, divide el primer niimero por el producto de todos los demas. Orden: (SETQ n1 8H n2 5) (SETQ div (/ nl n2 3)) 5 Orden: (SETQ div (/ nl n2 3.)) 5.3333 Se observa que en el primer ejemplo, al ser los tres miimeros enteros, el resultado de la division es también entero y se truncan [os decimales, En el segundo ejemplo se ha indicado el tercer mimero como real al ponerlo de [a forma “3.6” y entonces el resultado es tn niimero real El resultado de dividit més de dos nimeros es equivalente a hacer: Orden: (SBTQ div (/ nl (* n2 3))) Con estas cuatro operaciones bésicas y todas sus combinaciones (mis los comandos para evaluar fun- ciones trigonométricas, logaritmos, ete., que se estudiardn en el siguiente apartado) es posible introducie en AutoLISP cualquier ecuacién. Por ejemplo, se pretende realizar un programa para el que es preciso calcular los puntos (X,Y) de tuna curva dada por la férmula: Y= (AX + x5) / (K+ 3) El punto (X1Y1) de la curva se obtendria: (SETQ yl (/ (+ (# 4 xt xl x1) (= (+ x1 x1) 5) ) (x x1 x1) 3) : ) (SETQ pl (LIST x1 y1)) Los exponenciales se han obtenido como producto miltiple. Existe un comando EXPT para obtener los directainente, que se explicaré a continuacién, 5.2, OTRAS OPERACIONES CON DATOS NUMERICOS * (1+ ): Inctementa una unidad al valor indicado en . Equivale a (+ 1 ), pero de uuna forma més cémoda. Orden: (SET n (1+ n)) opeRaciones NUMERICAS 45 * (1 ): Resta una unidad al valor indicado en . Equivale a (- 1), orden: (SEQ n (1- n)) * (ABS ): Develve el valor absoluto del niimero indicado en . Orden: (ABS -25.78) dewielve 25.78 ‘© (FIX ): Convierte el niimero en un niimero entero. Es decir, si es un mimero real con decimales, devuelve solo la parte entera. Orden: (FIX 32.78) devuelve 32 © (REM ): Divide por y devuelve el resto de la division. Orden:(REM 287) devuelve 6 Orden: (REM 25 5) devuelve | 8 *# (COS ): Devuelve el coseno del éngulo expresado en radianes, orden: (cos 9.8) dewelve 1.0 (cos PI) devuelve 1.8 (cos (/ PT 2)) devuelve 8.9 ‘+ (GIN ): Devuelve el seno del &ngulo indicado en radianes, Orden: (SIN (/ PI 2)) device 1.6 (SIN 1.0) devuelve 9.841471 © (ATAN {): Devuelve arco tangente de en radianes. Orden: (ATAN 1.5) develve 9.98 Si se indica un segundo valor , ATAN devuelve el arco tangente de . Esto permite indicar directamente la tangente como cociente del seno entre el coseno, © (SQRT ): Devuelve la raiz cuadrada del nimero , orden:(SORT 4) devuelve 2.00 (SORT 2) devuelve 1.4142 © (EXP ): Devuelve “e” elevado @ la potencia indicada en ): Devuelve el niimero elevado a la potencia , Si ambos nimeros son enteros, el resultado es entero; en caso contratio, real orden: (EXPT 2 4) devuelve 16 (EXPT 5.83) devuclve 125.0008 + (LOG ): Devuelve el logaritmo neperiano del nimero indicado . Orden: (L0G 4.5) dewelve 1.56488 46 AUTOUISP. VERSION 11 * (FLOAT ): Convierte el ntimero indicado en un nlimero real Orden: (FLOAT 5) devueve 5.0 (FLOAT 5.25) devuelve 5.25 * (GCD ): Devuelve ef maximo comin denominador de los dos nimeros indicados. Estos tienen que ser enteros. Orden: (GOD 45 88) devuclve 5 Orden: (GCD 78 93) devuelve 3 © (MAX ) () ...) CONDICIONAL Este comando permite establecer una serie de condiciones especificando diferentes actuaciones segiin cud sea la primera condicién en cumplirse Los argumentos del comando COND son un mimero cualquiera de listas, tantas como condiciones se pretendan establecer. Cada lista contiene dos especificaciones: la condicién y el resultado a eje- cular en el caso de que esa condicién se cumpla (devuelva un valor diferente de “nit”. La condi- cién normalmente ¢s una lista con un comando de comparacién o un operador logico (para che- queat si la condicién se cumple). La segunda especificacion de cada lista es el resultado a ejecutar, Este no tiene por qué ser una tinica lista: pueden ser varias, que se irdn ejecutando todas en caso de que la condicién se cumpla. Orden:(SETQ ¢ 1) (COND ( (= ¢ 1) (SETQ nT) (PROMPT "Correcto") (TERPRI) ) (f (PROMPT "Incorrecto”) (TERPRI) ) ) En el ejemplo, el comando COND tiene dos tistas como argumento, es decir, estableve dos condicio- nes: en la primera, si el valor de “c” es igual a I, la lista (= ¢ 1) devuelve “T” y entonces la condicién se cumple y se ejecutan los comandos siguientes, que son SETQ, PROMPT y TERPRI. La segunda condicién no es una lista, sino ““T” (cierto); es decir, se oblige @ que sea siempre cierta, El comando COND no ejecuta todas las condiciones establecidas, sino que va chequeindolas hasta en contrar una que devuelva un valor diferente de “nil” y entonces ejecuta las expresiones establecidas como resultado , Por tanto, COND evaltia las expresiones de la primera condicién que encuentre que se cumpla (eva- Iuacién diferente de “nil”. Ya no sigue chequeando las siguientes condiciones, aunque haya mas que tam- bign se cumplan, se cumple una condicion y no existe el resultado correspondiente (no esta expecificado en la lista), entonces el comando COND devuele el valor de esa condiciSn. Si se especifican las expresiones a ejecutar como , el comando COND devuelve la evaluacién de la iltima expresin. Suele ser préctica habitual establecer la iltima condicién como siempre cieria “T”. De esta forma, si OPERACIONES NUMERICAS 47 ninguna de las anteriores se cumple (todas son “nil”), se tiene la seguridad de que el programa llevar a cabo la ejecucién correspondiente al resultado de la iltima lista. Una aplicacién muy corriente de este comando es verificar la respuesta del usuario cuando ésta ¢s del tipo “S” 0 “N”. Por ejemplo: orden: (COND ( (~ ch “S") 1 ) ( (= oh "s") 1) (© chm") 6) (© oh tn") 8) (( (ROMP? “Incorrecto”) } ) La variable “ch’" contiene el carécter introducido por el usuario desde el teclado. Si ese cardeter es “$" 0 “3", el comando COND devuelve 1. Si ese carécter es “N” 0 “n”, devuclve 0. Si es cualquier otro, se visualizaré el mensaje “Incorrecto”. De esta forma se puede chequear qué tipo de cardcter ha introdu- ido el usuario. Las acciones a ejecutar para cada condicién se pueden especificat a continuacién de cada con- icin, Se observa que el comando COND es equivalents a especificar varios comandos IF. orden: (IF (OR (= ch "S") (= ch "s")) 1) (IE (OR (= ch "N") (= ch "n")) @ ) (IF (AND (/= ch "S") (/= ch “8") (/= ch "N") (/= ch “n")) (PROMPT "Incorrecto”) ) ‘Cuando existen varias condiciones a analizar, es més seneillo el comando COND. Ademés, en al cas0 de especiicar después de cada condicién las expresiones a ejecutar, con IF habria que utlizar un PROGN, ‘mientras que con COND se especifican sin mas las expresiones. EJEMPLO 1: Dibujar curvas senoidales Como aplicacién de los comandos que realizan operaciones aritméticas, se presenta aqui un ejemplo para dibujar ia curva resultante de la suma de tres ondas senoidales. Fl programa solicita los coeficientes para cada onda y el resultado visualiza la interferencia resultante de la superposicién de las mismas. El programa completo empieza a presentar cierta complejidad en cuanto al nlimero de funciones y de variables definidas. Por so se incluye una lista de les variables que intervienen en cada funcién, con su significado, 1. Listado del programa [—(DEFUN intr () (SBTQ c£1 (GETREAL "Coeficiente primera onda: ")) (TERPRI) (SETQ c£2 (GETREAL “Coeficiente segunda onda: ")) (TERPRI) (SETQ c£3 (GETREAL “Coeficiente tercera onda: ")) (TERPRI) (SETQ prx (GBTREAL "Precision en X: ")) (TERPRI) [WHILE (<= prx 8) (PROMPT “Debe ser positivo mayor que §”) (TERPRT) (SETQ prx (GETREAL "Precision en X: ")) (TERPRT) —) (SETQ xi (GETREAL “Inicio curva en X: ")) (TERPRI) (SETQ xf (GBTREAL “Final curva en X: “)) (TERPRI) [WHILE (<= xf xi) (PROMPT "Debe ser un valor mayor que inicio”) (TERPRI) (SETQ xf (GETREAL "Pinal curva en X: ")) (TERPRI) Ly (SBTQ n (FIX (/ (- xf xi) prx))) amt) 48° AUTOUSP. VERSION 11 [— (DEFON fune (x) (+ (SIN (+ C£1 x)) (SIN (* c£2 x)) (SIN (+ c£3 x)) ) i) [—(DEFUN inic ( / yl) (SBTQ x1 xi) (SEQ yi (£une x1)) (SETQ pl (LIST x1 y1)) —) [— (DERN dib (/ x2 y2 p2) (— (REPEAT (SETQ x2 (+ xl prx)) (SEEQ y2 (func x2) (SEQ p2 (LIST x2 y2)) (COMMAND "Linea" pl p2 *”) (SBTQ pl p2 x1 x2) tn) —) [— (DEFUN ult (/ p2 yf) (SET9 yf (£unc x£)) (SBTQ p2 (LIST xf yf) (COMMAND "Linea" pl p2 “") —) [—(DEFUN crondas ( / cfl cf2 cf3 prx xi xf n pl x1) (SETVAR "blipmode” 6) (SETVAR "cmdecho" ) (intr) (nic) (dib) (alt) (SBTVAR "blipmode” 1) (SETVAR “cmdecho” 1) tL) 2. Observaciones En lo que respecta a la definiciin de variables como argumentos locales, cuando el nimero de funciones es elevado puede restltar conveniente indicarlas para cada funcién, en vez de haverlo con todas juntas en curva, Sin embargo, conviene tener muy en cuenta qué variables son efectivamente locales y cudles deben conservar su valor al salir de la funcién, Por otro lado, el programa completo define una nueva orden de ‘AutoCAD que va llamando al resto de funciones de usuario definidas. Pero cada una de esas funciones cs un programa que podria utilizarse independientemente, por ejemplo, para que el usuario vaya depu- rando el programa completo y vaya detectando los posibles fallos funcién por funcién Por eso puede ser una buena prctica de programacién establecer una lista de variables en cad fun- cién definida y dividirias en tres grupos + Variables de entrada: aquellas que deben encontrarse ya definidas antes de llamar a la funcién y eu- yos valores va a utilizar ésa. riables © argumentos locales: aquellas que s6lo utiliza internamente la funcion y cuyo valor no fees una vez que termina de ejecutarse. + Variables de salida: aquellas cuyo valor debe conservarse al terminar la funciSn, pues van a ser uti- lizadas por otra funcién posterior. Parte de ellas coincidirén con algunas o todas las variables de entrada. OPERACIONES NUMERICAS 49 En cualquier caso, mientras se prueba el programa no se debe especificar ningin argumento local Asi se pueden siempre explorar los valores de las variables, si fuera necesario, para ver dénde falla el pro- grama, Sélo al final, cuando todo funcione comrectamente, se indicarin los argumentos locales con el fin de que no ocupen memoria sin necesided. En lo que respecta a la deteccidn de posible errores en la entrada de datos por parte del usuatio (ancién intr”), los coeficientes de las tres ondas pueden ser cualquier nimero real, inchuidos negatives y 0. Sin embargo, la precisién en X debe set positiva y diferente de 0, y de ahi que se establezca un con- itol con WHILE. ‘Ademds, para prevenir errores en el trazado de la curva resultante, una vez introducido el valor de su inicio en X (variable “xi”) se obliga a que el valor de su final (variable “xP”) sea mayor para que la curva vaya de izquierda a derecha, Esa es la razén del segundo control con WHILE. 3. Explicacién del programa Se define una nueva orden de AutoCAD y cinco funciones més de usuario. "= Funcién c:ondas Define la nueva orden de AutoCAD llamada “ondas”. Establece como argumentos locales todas las va- riables restantes que no han sido establecidas como locales en las funciones intermedias. ‘Llama sueesivamente a las funciones “intr”, “inic, “dib” y “ule” © Funcién intr Solicita del usuario Jos datos requeridos. Se trata de dibujar la curva resultante de la suma de tres ondas (funciones senoidales) con diferentes coeficientes para la variable X. La funcién tiene la siguiente forma: ¥ = SEN (c£1 X) + SEN (cf2 X) + SEN (cf3 x) siendo ofl, of2y cf3 los tres coeficientes, La curva se va a dibujar a base de tramos de lineas rectas, de acuerdo con la precisién en X alma- cenada en “prx’”. El trozo de curva a dibujar seré el comprendido entre los valores “xi” y “xf” (Figura 5.1) Figura 6.1. Variables para el trazado de la curve de funcién. EL nimero de tramos de linea a dibujar seri, pues, el resultado de dividir el intervalo entre Ja preck sién en X. Ese valor se almacena en la variable “1 _ (et = xi) EX 50 AUTOUSP. VERSION 11 Con el comando FIX se toma el valor entero de ese cociente y entonces “n” almacena el niimero de tramos de linea completos a dibujar. Para completar el intervalo entre “xi” y “xl” con el ultimo “pico” ‘© “resto” que queda, se utilizaré la funcién “ult”, + Variables de entrada: ninguna. + Variables locales: ninguna, + Variables de salida: fl Coeficiente de la primera onda, cf2 Coeficiente de la segunda onda. cf Coeficiente de la tercera onda. rx Intervalo de precisién en X. xi Coordenada X de inicio de la curva. xf Coordenada X de final de la curva. nNaimero de tramos de linea completos. © Funcién func Bs una funcién auniliar que sitve para calcular todos los puntos de la curva, Simplemente contiene en for- mato de AutoLISP la definicién de Ia fancién Y= F(X) con la suma de las tres ondas. Tiene una variable asociada “x” y, cada vez que ¢s llamada para un valor de “x”, devuelve un valor que es la coordenada Y correspondiente a ese punto de la curva. + Variables de entrada: cfl Coeficiente de la primera onda, ef2 Coeficiente de la segunda onda. cf3 Coeficiente de la tercera onda, x Coordenada X del punto de la curva cuya coordenada Y se quiere obtener. + Variables locales: ninguna. + Variables de salida: No existe ninguna, pero la evaluacion de ta propia “func (x)” devuelve un valor que es la coorde- nada Y buscada. © Funcién inic Calcula el primer punto para empezar a dibujar la curva. Para ello toma como coordenada X la corres- pondiente al inicio de la curva y calcula la coordenada Y de ese punto llamando a la funcién “func”. Reine “xP” ¢ “yP” en una lista y lo almacena en “pl”, que contiene de esta manera el primer punto de la curva. Como la variable “1” se ha utilizado simplemente para obtener después “p|”, puede ser especifica- da como local. La variable “xi” no puede ser local, porque va a ser utilizada después por la funcién “ib”. + Variables de entrada: xi Coordenada X del inicio de la curva, + Variables locales: yl Coordenada ¥ del punto de inicio. + Variables de salida x1 Coordenada X del punto de inicio. pl Punto de inicio de la curva, ‘OPERACIONES NUMERICAS 51 © Funcién dib Dibuja todos los tramos completos de tinea con los que se va a aproximar el trazado de la curva resultan- te. Para ello establece un ciclo repetitive que dibuja cada tramo. Bl ciclo se repetird “n” veces, que es ef iimero de tramos completos. Al entrar en el ciclo por primera vez existe ya un valor de punto inicial del tramo “pi”, que viene. de la funcisn “inic®. Dentro del ciclo se calcula el punto final de cada tramo, Su coordenada X resulta de sumar Ia precision “prx” al valor X del punto inicial “x1”. La coordenada Y se obtiene lamando a la funcién “Func” para ese valor de “x2”. Se reiinen ambos en una lista y se obtiene el punto “p2”. Se dibuja el tramo de linea entre “pI” y “p2”. Por iltimo, se actualiza fa variable “‘p1” de forma que al repetir el ciclo se tome como nuevo punto inicial el final del ciclo anterior. Lo mismo con la va- riable “x1”, ‘Como variables locales se pueden establecer las correspondientes al punto final del tramo “x2” “‘y2" “p2, puesto que una ver dibujada la linea de cada tramo se almacena ese punto como nuevo punto ini- cial “pl”, y ese es el valor que interesa conservar. Al terminar “dib”, ef ditimo valor de “pl” seré utilizado por la funcién “ult” + Variables de entrada: Numero de tramos completos de tinea x1 Coordenada X del punto iniial de curva, rx Intervalo de precision en X, pl Primer punto del primer tramo. + Variables locales: x2 Coordenada X del punto final del tramo. y2 Coordenada Y. p2 Punto final del tramo, + Variables de sala: pI Punto final del dltimo tramo, que sera el inicial para dibujar el “resto”. © Funcién ult Dibuja el iiltimo “resto” que queda cuando no hay un niimero de intervalos completos que lleguen hasta el final de curva “xf”. Para ello calcula la coordenada ‘‘y?? del final de la curva llamando a “une” y ob- tiene el punto final “p2”, ‘Como se encuentra almacenado en “p1” el punto final del iltimo tramo del ciclo repetitivo, pasa a ibujar fa linea entre “pl” y “p2”. + Variables de entrada: xf Coordenada X del punto final de curva pl Punto inicial del “esto”. + Variables locales: yf Coordenada Y del punto final de curva. 2 Panto final de curva, + Variables de salida: ninguna. En la Figura 5.2 se muestran algunos trazados posibles de curvas. f w A ath cooticientes. del trazado de diferentes curvas, con diferentes valores de los tres Angulos y distancias En este capitulo se revisa un nuevo tipo de datos que pueden ser requeridos por un programa en Auto- LISP, como son angulos y distancias. Es preciso tener en cuenta siempre que los angulos se miden en rae dianes dentro de AutoLISP. Como por comodidad se van a escribir casi siempre en grados sexagesimales, interesard tener un pequefio programa de conversion de grados a radianes. Este programa se puede lla mar “dtr” (grados a radianes en inglés) y su contenido sera el siguiente: (DEFUN dtr (g) (* PI (/ g 186.) ) Un programa similar para realizar la operacién inversa, convertir radianes en grados, se podria lla mar “rid” y su contenido seria: (DEBUN rtd (r) (/ (* © 188.8) Pry ) Para que estas dos definiciones de funciones se carguen automaticamente nada més entrar en un di bujo, habria que incluirles en el archivo ACAD.LSP. 6.1. (ANGLE ) ANGULO DEFINIDO POR DOS PUNTOS Este comando devuelve el éngulo determinado por la linea entre los dos puntos y especifi- cados. El valor del éngulo se mide respecto al eje X actual en el dibujo. El Angulo se mide en radianes y su sentido positivo es el antihorario, Si los puntos indicados son en 3D, se proyectan al plano X-¥ actual, Por ejemplo, para almacenar el Angulo definido por dos puntos introducidos por el usuatio: ordei 'SeTQ ptl (GETPOINT "Primer punto: “)) (SETQ pt2 (GETPOINT ptl “Segundo punto: ”)) (SBTQ ang (ANGLE pt pt2)) (SETQ ang (rtd ang)) La ttima operacién es para convert el valor devuelto por ANGLE en grados sexagesimales, supo- niendo que hayamos cargado en ACAD.LSP la funcidn “rtd” antes definida, Es importante el orden de introduccién de los puntos, pues el Angulo seria diferente para cada caso. ‘No es Jo mismo (ANGLE pti pt2) que (ANGLE pt? pt!) (Figura 6.1) 53 54 AUTOUSP. VERSION 11 Figure 6.1. Diferentes éngulos devveltos por ANGLE sogan el orden de introduccién de fos puntos 6.2. (DISTANCE ) DISTANCIA ENTRE DOS PUNTOS Este comando devuelve la distancia entre los dos puntos especificados. En este caso, légicamente, es in- diferente el orden de introduccién de los puntos. orden: (SETQ ptl (GETPOINT "Primer punto: ")) (SETO pt2 (GETPOINT ptl "Segundo punto: ”)) (SETO dis (DISTANCE pti pt2)) El valor almacenado en “dis” en el ejemplo es un mimero real, que mide la distancia entre ambos puntos de acuerdo con sus coordenadas en el SCP actual. Las unidades son siempre decimales, indepen ientemente del tipo de unidades actuales en el dibujo (Pies y pulgadas, Fraccionario, etc.) Figura 6.2). Figura 6.2, Funcionamiento del comando DISTANCE. 6.3. (POLAR ) PUNTO EN COORDENADAS POLARES Este comando devuelve un punto obtenido en coordenadas relativas polares a partir del especificado , Es decir, desde el punto se lleva una distancia en un Angulo y se obtiene el nuevo punto (Figura 6.3). Como siempre, el dngulo introducido en se considera en radianes y positivo en sen- tido antihorario, Aunque puede ser en 3D, al valor de se toma siempre respecto al plano X-Y actual orden: (SETQ pt! (GETPOTNT “Punto de base: ")) (SEQ dis (GETREAL "Distancia: ")) (SETQ pt2 (POLAR ptl (/ PI 2) dis}) ANGULOS Y DSTANCIAS SB Figura 63. Visualizacién en pantalla de POLAR, En el ejemplo se introduce un punto de base “pti”, una distancia “dis” y la variable “pt2” almacena el punto situado a esa distancia en vertical, es decir, a un angulo de 90 grados, que son PI/2 en radianes. Disponiendo de la funcién “dtr” para convert grados en radianes, se podria haber puesto: (SETQ pt2 (POLAR ptl (dtr 96) dis)) El siguiente seria otro ejemplo un poco més completo para obtener un punto situado a ta distancia, especificada en perpendicular ala linea dada por dos puntos ptl y pr: Orden: (SEQ pt1 (GETPOINT "Primer punto: ")) (SEQ pt2 (GETPOINT ptl "Segundo punto: ”)) (SETQ dis (GETDIST pt2 “Distancia: ")) (SETO ang (ANGLE pti pt2)) (SBTO pt3 (POLAR pt2 (+ ang (dtr 98)) dis)) La variable “ang” almacena el valor del angulo de la linea entre ptl y pt2. El punto pt3 se obtiene tomando una distancia “dis” a partic de pt2 y con un dngulo igual a “ang” + 99 grados, es decir, (+ ang (dtr 9§)) Figura 6.4) 5 ms, pi2 Ta \era pil. Figura 6.4. Ejemplo de utlizacién de POLAR, lh El procedimiento explicado en este ejemplo se va a utilizar con el programa propuesto al final del capitulo, para dibujar un muro con espesor a partir de su linea central 6.4. (GETANGLE [] [}) INTRODUCIR ANGULO Este comando espera a que el usuario introduzca un dngulo y devuelve el valor de ese dngulo, El Angulo se puede introducir tecleando directamente en el formato actual de unidades (podrian ser, por ejemplo, 56 AUTOLISP. VERSION 11 _grados/minutos/segundos), pero el valor devuelto por GETANGLE sera siempre un niimero real en ra- dianes. ‘ La ventaja de este comando respecto a ANGLE es que se puede especificar el punto de base en y sefalar el segundo punto para obtener directamente el Angulo. En este caso se visualiza una linea “elés- tica” entre el punto de base y la posicién del cursor. El punto de base , asi como ef mensaje a visualizar, son optativos. Si se indica un punto de base en 3D, el dngulo se mide finicamente sobre el plano X-Y actual, orden: (SETQ pt1 (GETPOINT "Punto de base: “)) (SETQ ang (GETANGLE pti "Segundo punto: ”)) En el ejemplo se ha obtenido el Angulo “ang” sin necesidad de almacenar previamente ef segundo punto en “pt2” y ejecutar el comando ANGLE. 6.5. (GETORT!NT [] []) ANGULOS SEGUN ORIGEN Y SENTIDO AA diferencia de GETANGLE, que mide siempre los angulos desde la posicién habitual de grados (la posicidn de las 3 del reloi) y positives en sentido antihorari, el comando GETORIENT considera los éa- gulos con el origen ® grados y el sentido actuales definidos por la orden “Unidades”. E valor devuelto es siempre en radianes, independientemente del tipo de unidades definido para los ‘ingulos por la orden “Unidades”. Si el punto de base es en 3D, ef Angulo se mide sélo sobre el plano XY actual Por ejemplo, si la actual definicién de la orden ““Unidades” contiene un origen de dngulos en el je ¥ negativo (las 6 del reloj) y el sentido positive como horario (Figura 6.5): orden: (SETQ pt (GETPOINT “Punto de base: ”)) (SETQ ang (GETORIENT pt1 "Segundo punto: ")) Figura 6.5. Medicién de Angulos GETORIENT segiéin origen y sentido de éngulos. 6.6. (ANGTOS [ []]) CONVERSION DE ANGULOS Este comando toms el Angulo especificado en , que debe ser un niimero real en radianes, y lo de- vuelve editado como cadena de texto segin el formato especificado por y precision . Estos valores corresponden a las Variables de Sistema AUNITS y AUPREC, respectivamente. Si no se sumi- nistran los argumentos y , se toman los valores actuales de esas dos Variables de Sistema. EL argumento es un nimero entero entre @ y 4, cuyos formatos son los siguientes: Modo Grados, Modo 1 Grados/minutos/segundos. Modo 2 Grados centesimales g Modo 3 Radianes. Modo 4 Geodesia ANGULOSY DISTANCIAS 87 El argumento especifica la precisién en decimales con que se va a obtener la cadena de texto. Por ejemplo, suponiendo que la variable “ang” contiene un valor actual de PI radianes (es decir, 180 ‘grados), la ejecucin de ANGTOS daria los siguientes resultados: (ANGTOS ang #2) devuelve “100.99” {ANGTOS ang 14) devuelve "188d" B"" (ANGTOS ang 3 4) devoelve "3.14164" (ANGTOS ang 43) devuelve “oO” EI Angulo puede ser negativo, pero el valor es siempre convertido a positivo entre 9 y 2PI. 6.7. (RTOS [ []]) CONVERSION DE NUMEROS. ste comando toma el nimero real especificado en y devuelve una cadena segtin el formato espe- cificado por el modo y la precisién . Estos argumentos modo y precisién corresponden a las Va- rlables de Sistema LUNITS y LUPREC, respectivamente. Si no se especifican los argumentos, se utlizan fos actuales valores de esas dos variables. El argumento es un atimero entero entre 1 y 5, cuyos formatos son los siguientes: Modo { Cientific, ‘Modo 2 Decimal. Modo 3 Pies y-pulgadas I (fraccién decimal) Modo 4 ies4-pulgadas IT (fraccién propia). Modo 5 Fracciones de cualquier unidad. El argumento indica la precisidn en decimales para la cadena de texto a obtener. Por ejemplo, suponiendo que la variable “mum” contiene un valor actual de 24.75, la ejecucién de RTOS podria oftecer los siguientes resultados (RTOS num 13) devuelve "2.475E401" {RTOS num 21) devuelve "24.7" {RTOS num 32) devuelve "1/-5.50" (RTOS num 42) dewuelve "1/-5 1/2" (RTOS num 5 2) devuelve "24 3/4” 6.8. (INTERS []) INTERSECCION DE LINEAS Este comando toma y como extremos de una linea, y como extremos de otra linea, y calcula la interseccién de ambas devolviendo ese punto de interseccién El pardmetro es optativo, Si su valor es “nil”, el comando considera las lineas como infinitas y devuelve el punto de interseccién aunque se encuentre en la profongacién de las lineas (“fuera” de ells). En este caso todas las lineas en 2D tendrian interseccin, salvo las paralelas. En 3D las lineas se podrian cruzar y entonces no tendrian interseccién. Si ol parmetro no se indica o su valor es diferente de “ni”, entonces el punto de interseccién sélo se devuelve si se encuentra entre los extremos de ambas lineas (“dentro” de ellas). En caso contrario devolveria “nil”, Orden: (SBTQ pl "(99 60) p2 "(160 149) p3 ‘(118 58) ps *(246 119)) (4NTERS pl p2 p3 p4) dewuelve nil (INTERS pl p2 p3 pé™) — devuelve nil (INTERS pl p2 p3 p4 nil) dewielve (61.77 27.74 9.0) 5B AUTOLISP. VERSION 11 En al ejemplo, las dos lineas no tenfan une interscocién real, y solamente especificando un parémetro igual a “nil? se devuelve la interseocién en la prolongacién de ambas lineas. ‘ Hy que tener precaucién en indicar los cuatro puntos en el orden correcto, pues en caso contrario las lineas cuya interseccién calcula INTERS son diferentes (Figura 6.6). (INTERS pl p3 p2 p4 nil) dewuelve (-768.9 485.9 9.0) og pul. Xpt3 Xpta = igura 6.6. lnterseccién devuelta por INTERS, segtin el orden de especificacién de los puntos. EJEMPLO 1: Dibujar un muro con espesor Este programa dibuja un muro con el espesor indicado, El usuario introduce los puntos inicial y final me- didos sobre la linea media del muro, y el programa lleva la mitad del espesor a cada lado y dibuja las dos lineas paralelas del muro. 1. Listado del programa [— (DBFUN inie () (S219 pin (GETPOINT "Primer punto: ")) (TERPRI) (SETO e (GEPDIST pin "Espesor: ")) (TERPRI) (SET0 pf (GETPOINT pin "Segundo punto: "}) (TERPRT) (SETQ ang (ANGLE pin pf)) ) (— (DEFUN dib (/ pl p2 p3 p4) (SETQ pl (POLAR pin (+ ang (/ PI 2)) (/ e 2))) (SETQ p3 (POLAR pl (~ ang (/ PI 2)) €)) (SETQ p2 (POLAR pf (+ ang (/ PI 2)) (/ @ 2))) (SETQ p4 (POLAR p2 (~ ang (/ PI 2)) @)) (COMMAND "Linea" pl p2 *”) (COMMAND “Linea” p3 p4 "") (COMMAND “Linea” pl p3 ”") (COMMAND “Linea” p2 pé "") —) [—(DEFUN c:pared (/ pin e pf ang) (SEIVAR “blipmode” $) (SETVAR "cmdecho” 6) (inic) (dib) (SETVAR "blipnode” 1) (SETVAR “cmdecho" 1) ANGULOSY DISTANCIAS — 59 2. Observaciones En su versién més sencilla este programa dibuja un muro con espesor, definido a partir de su linea media, Hay que insistir en una precaucién importante: no utilizar como nombres de variables los nombres ‘de comandos de AutoL ISP. Se puede tener la costumbre de abreviar el nombre de un punto inicial como “pi”. Pero si se’utiliza ese simbolo como nombre de variable, esto inhabilta el comando de AutoLISP “PP” que contiene el valor "3.1416". Por este motivo, como nombre de variable de punto inicial, se utiliza en el programa “pin”. Lo mis- mo cabe advert respecto al simbolo “T” que representa “True, cierto” para AutoLISP. Nunca se deberd usar “t” como nombre de variable. 3. Explicacién del programa Define una nueva orden de AutoCAD y dos funciones de usuario. © Funci6n c:pared ‘Aflade una nueva orden a AutoCAD llamada “pared”. Como siempre, desactiva marcas auxiliares y eco de meni y después llama a las dos funciones de usuario “inic” y “ib”. © Funcién inic Solicita las variables iniciales necesarias para el programa y calcula el angulo en el que va a estar orienta- do el muro, Solicita el primer punto y lo almacena en “pin”. Acepta como dato el espesor del muro y fo almace- na en [a variable “e”, Se utiiza GETDIST pata que se pueda indicar el espesor mediante dos puntos si se prefiere (cosa que no podria hacerse con GETREAL). Se almacena el segundo punto en “pf” y se caleula el éngulo mediante ANGLE, almacenndoto en la variable “ang” (Figura 6.7). Figura 6.7. Variables para el trazaco del muro y puntos a calcular por el programa + Variables de entrada: ninguna. + Variables locales: ninguna, + Variables de salida pin Punto inicial de linea media del muro. pf Punto final de linea media del muro. © Espesor del muro. ang Angulo de la linea media de! muro. 60 AUTOUSP. VERSION 11 © Funcién dib Calcula los cuatro puntos de los vértices del muro o pared y lo dibuja mediante cuatro linea El primer punto “pl” se calcula a partir de “pin”, levando una distancia igual ala mitad del espesor ‘aun dngulo de 99 grados (PI/2) sumado a “ang”. Para ello se emplea el comando POLAR (Figura 6.8). ‘Bl segundo punto “p2” se obtiene de la misma manera, también con el empleo del comando PO- LAR, pero partiendo en este caso del punto final “pf”. Se leva también una distancia igual a la mitad del cespesor a un éngulo igual a ang + PI/2 pl Figura 6.8. Obtencién de los vértices del muro por el programa, El tercer punto “'p3” a partir de “pI”, levando una distancia igual al espesor a un dngulo de 96 gra- dos restados a “ang” Este tercer punto se podia haber obtenido a partir de “pin”, levando una distancia igual a la mitad el espesor a un angulo “ang ~ PI/2”. El cuarto punto “p4” so obtiene de la misma manera, bien llevando la mitad del espesor desde “pf”, © bien el espesor completo desde “p2”. El dngulo es el mismo de antes, ang ~ PI/2. + Variables de entrada: pin Punto inicial de tinea media del muro. pf Punto final de tinea media del muro. © Espesor del muro. ang Angulo de la linea media del muro, + Variables locales pl Primer vértice del muto, 2 Segundo vértice. p4 —Tercer vértice. p4 — Cuarto vértce. + Variables de sada: ninguna EJEMPLO 2: Dibujar varios muros con espesor Como ampliacién del ejemplo anterior, este programa permite dibujar una serie de muros encadenados con espesor calculando las esquinas para que queden de forma adecuada, De momento, el programa no permite ninguna opcién como unir la Ultima pated con la primera (op- cién “Cierra” o la posibilidad de ir eliminando las paredes hacia “atrés” si el usuario se ha equivocado en su introducei6n (opcién “Revoea”) 1. ANGULOS ¥ DISTANCIAS Listado del programa [— (DEFUN inic ( / pf ang) (GRAPHSCR) (SETQ pin (GETPOINT “Primer punto: ")) (TERPRT) (SETQ e (GETDIST pin “Espesor: ")) (TERPRI) (SET pf (GETPOINT pin "Segundo punto: ”)) (TERPRI) {SET ang (ANGLE pin pf)) (SETO pl (POLAR pin (+ ang (/ PI 2)) (/ @ 2))) (SETQ p3 (POLAR pl (- ang (/ PI 2)) e)) (SETO p2 (POLAR pf (+ ang (/ PI 2)) (/ @ 2))) (SETQ p4 (POLAR p2 (- ang (/ PI 2)) @)) (SETQ pin pf} (SETQ n 1) —) [— (DEFUN int ( / ang) (SETQ ang (ANGLE pin pf)) (S270 p5 (POLAR pin (+ ang (/ PI 2)) (/ e 2))) (SE7Q p7 (POLAR pS (- ang (/ PI 2)) €)) (SETQ p6 (POLAR pf (+ ang (/ PI 2)) (/ @ 2))) (SETO pe (POLAR p6 (~ ang (/ PI 2)) e)) (SBTQ il (INTERS pl p2 pS p6 nil)) (SETQ i2 (INTERS p3 pa p7 p@ nil)) —) [— (DEFUN act () (SEQ pl p5 p2 p6 p3 p? p4 p8 pin pf ibl it ib2 i2) (seg a (+ 1 n)) —) [— (DEFUN ciclo ( / pf pS p6 p7 p8 il i2 ibl ib2) —(WEILE n Sar (= 9 1) [— (PROGN (COMMAND "Linea" pl p3 ") (SET pf (GETPOINT pin "\nNuevo punto: “)) (int) (COMMAND "Linea" pl il “") (COMMAND “Linea” p3 2 “") (act) i) (— (PROGN [—(iE (SETQ pf (GBTPOINT pin “\nNuevo punto: ”)) f— (PROGN (int) (COMMAND "Linea" ibl il "") {COMMAND “linea” ib2 i2 “") (act) pe) [— (PROGN (COMMAND “linea” ibl p2 "") (COMMAND "Linea" ib2 pé "™") (COMMAND "Linea” p2 p4 “") (S819 n nil) —) —) [— (DEFUN c:paredes ( / pin e pl p2 p3 pé n) (SETVAR “blipmode” §) (SETVAR "cmdecho” 8) (inie) (ciclo) (SEIVAR “blipmode” 1) (SETVAR "cmdecho” 1) —) 62 AUTOLISP. VERSION 11 2. Observaciones El programa empieza a manifestar una cierta conmplejidad de estructura. Las llaves de! listédo visualizan el nivel de anidamiento de esas estructuras (el nivel hasta el que se van incluyendo unas dentro de otras). La repetitive, en este caso el WHILE, conforma una tinice estructura (una ilave) La alternativa supone siempre la generacién de dos “amas” en la estructura del programs: la rama del “Si”, que es la accion a efectuar si la condicién se cumple, y la rama del “No”, que es la accién a efectuar si no se cumple. Si una de las ramas esté “‘vacfa”” (no hay ninguna accién a efectuar, la estruc- tora del programa se simplifca En el programa de este ejemplo, falternativa incluida en el WHILE presenta acciones a efectuar en Jas dos ramas. Ademés, una de ells incluye otra alternativa que a su vez contiene acciones a efectuar en Jas dos ramas, lo que complica un poco le estructura del programa. Por otto lado, se ha incluido un comando PROGN para contener esta iiltima alternativa, que real mente no es necesario, Sin embargo, puede ayudar para visualizar de forma mds clara la estructura com- pleta, Un tiltimo aspecto a destacar es el empleo del comando GETPOINT, que solcita el nuevo punto de las paredes a dibujar, como condicién de las alternativas IF, Si a la solicitud de ese punto el usuario res- ponde con tn RETURN, el comando GETPOINT devuelve “nil, lo que se puede utilizar como condicién no cumplida y, por tanto, el programa efectia la accién incluida en fa rama del “No”, 3. Explicacién det programa Define una nueva orden de AutoCAD y cuatro funciones mis de usuatio. "= Funcién c:paredes ‘Como siempre, se limita a desactivar mareas ausiliares y eco de Grdenes y Hama @ las funciones de usuario que necesita; en este caso, “inic” y “ciclo” © Funcién inic Soliita del usuario todos los datos necesarios para obtener la primera pared. El punto inicial se almacena en la variable “pin”, el espesor en “e” y el segundo punto en “pf”, No es necesatio establecer ningtin control, puesto que cualquier punto es vilido, y un valor negativo o cero del espesor no impide fancionar al programa. A continuacin, tal como se ha explicado en la versi6n més sencilla del ejemplo anterior, se calcula 1 Angulo en el que est orientada la primera pared y los cuairo vértices de esa pared (Figura 6.9). Figura 6.9. Obtencién de la primera pared s partir de las variables inicio, ANGULOS V DISTANCIAS 63. [Al principio se ha aftadido el comando GRAPHSCR para que el programa conmute @ pantalla gré- fica nada més empezar a ejecutarse. Al final se actualiza la variable “pin” para que el programa entre en el ciclo y dibuje fa nueva pared tomando como nuevo punto inicial el punto final de la pared anterior. Por ditimo se inicializa la variable “‘n” a 1, pues va a ser el contador del nimero de paredes que se vayan generando, Al mismo tiempo se va a utilizar como variable de control del ciclo, ‘Las variables “pP” y “ang” son locales y sus valores no se van a utilizar una vez finalizada la funcion, + Variables de entrada: ninguna. + Variables locales: pf Punto final de la primera pared. ang Angulo de la primera pared. + Variables de salida: pin Punto inicia de la nueva pared. © Espesor homogéneo de todas las paredes. pl Primer vértice de la primera pared, 2 Segundo vértice. pd Tercer vértice p4 — Cuarto vértice. rn Niimero de pared y control del ciclo © Funcién int Se la llama desde la funcién “ciclo”, una vez que se ha solicitado el nuevo punto final de la nueva pared. La funcién “int” (intersecciones) calcula os cuatro vertices de esa nueva pared y los almacena en las va riables “ps”, *“p6°, “p?", “p8”. A continuacién calcula las intersecciones entce lz nueva pared y la ante- rior mediante el empleo del comando INTERS, Los puntos de intersevci6n se almacenan en las variables 41°, “12° (Figura 6.10). Se emplea INTERS con el pardmetro “nil” para que calc las intersecciones, incluyendo también las prolongaciones de las lineas. Figura 6.10. Célculo de los puntos de interseccién entre la primere y la segunda pared, + Variables de entrada: pin Punto inicial de la nueva pared. pf Punto final de la nueva pared. pl Primer vértice de la pared anterior. p2 Segundo vértice. 3. Tercer vertce. pd Cuarto vértice. + Variables locales: ‘ang Angulo de orientactén de la nueva pared. 64 AUTOUIS. VERSION 11 + Variables de salida: pS Primer vértioe de la nueva pared, 6 Segundo vértice. bp? Tercer vértice. pS Cuarto vértice. il Primer punto de intersecci6n. i2, Segundo punto de interseccién, © Funcién act ‘Actualiza los valores de variables para poder dibujar la nueva pared, Es llamada desde la funci6n “ciclo” cada vez que se han dibujado las lineas de la pared anterior. Su cometido es almacenar los cuatro vertices de la iltima pared (“pS” a “p8") en las variables “pl” a “p4” para que sean tomacios como vertices de pared anterior al empezar a calclar una nueva. Al mismo tiempo actuatiza la variable “pin” como nuevo punto inicial, necesario para calcular el 4n- agulo de la nueva pared, y guarda los valores de fos dos iltimos puntos de interseccién en “ib1” e “D2”. Estos valores van a ser necesarios para dibujar las lineas de la nueva pared. Por itimo, la funcién inerementa en J el valor de “n”, que es el contador del nimero de pared, + Variables de entrada: pf Punto final de la éltima pared. pS Primer vértice de la itima pared. 6 Segundo vértice. 7 Teroer vértice. pS Cuarto vértice, il Primer punto de interseccién, i2 Segundo punto de interseecion, nn —Niimero de pared, + Variables locales: ninguna, + Variables de sali: pin Punto inicial de la nueva pared pl Primer vértice de la pared anterior. p2 Segundo vértice. p38 Tercer vértice pt Cuarto vértce. ib] Ultimo primer punto de interseocién, ib2_Ultimo segundo punto de interseccién, n—Nitmero de la nueva pared. * Funcién ciclo Es la funcién que contiene précticamente la totalidad del programa. Su estructura bisica es un ciclo 1e- petitivo establecido mediante WHILE, con la propia variabie “n”” como control. Cada vez que se entra en el cielo, el programa establece un IF para chequear si el valor de “‘n” es 1. La primera vez que se ejecute el ciclo se cumpliré esta condicién (puesto que “n” viene con valor | desde la funcién “inic”). En este caso se efectia la accién incluida en la rama del “Si * Condicion cierta de IF (= n 1) Como es la primera pared, se dibuja la linea que cierra esa pared entre “pl” y “p3”. Se solicita el nuevo punto final para la siguiente pared y se lama ala funcién “int”, que calcula los cuatro nue vos vértices y las dos intersecciones de esta nueva pared con la primera (Figura 6.11) ANGULOS Y DSTANCAS 65 ra 6.11. Trazado de la primera pared y obtencién de puntos para la segunda El mensaje visualizado con GETPOINT para solicitar el punto final de la nueva pared es: “/mNuevo punto: " El cédigo de control “/n” origina un RETURN antes de visualizar “Nuevo punto: ” ‘A continuacién, y una vez calculados los dos puntos de interseccién, se dibujan las lineas de la pri- ‘mera pared hasta dichos puntos. Por titimo se lama a fa funcién “act” para actualizar valores de variables y dejarlos dispuestos para volver a entrar en el ciclo y calealar la siguiente pared (Figura 6.11). Hay que tener en cuenta que les lineas que delimitan una pared s6lo se dibujan cuando el usuario ha indicado el punto final de la siguiente pared y se han calculado los puntos de interseccién. Este funcionamiento es similer al de la orden de AutoCAD TRAZO. Condicién no cierta IF (= » 1). Una vez trazada la primera pared, como la funcién “act va a sumar 1 a la variable sgrama va a pasar siempre por la rama del “No”. Esta rama es a su vez un condicional, que en el programna esté agrupado en un PROGN innecesa- rio, peto incluido por razones de claridad de estructuras, Este condicional utiliza la solicitud de GET- POINT pata el nuevo punto final de la nueva pared como condicién. Si el usuario selecciona efec- tivamente un punto, la condicién se cumple y el programa efectia la accién de la rama del “St”. Si el usuario responde con “Return”, el comando GETPOINT devuelve nil y entonces la condicion no se cumple, con lo que el programa pasa por la rama del “No”. nn”, ef pro- En la rama del “Si", una vez que el usuario he introducido un nuevo punto para la nueva pared, se lama a fa funcidn “int” para calcular los dos nuevos puntos de interseccién y se dibujan las dos lineas de la anterior pared, entre “ib” “il” y entre “ib2” “i2” (Figura 6.12). Como se ha dicho, este funcionamiento es similar a la orden TRAZO, donde no se dibuja directa- ‘mente el tkimo tramo cada vex que se pincha, sino el anteitime. Se llama, por iltimo, a a funcién “act” para actualizar las variables y quedar en disposi ver a entrar en el ciclo para seguir calculando més peredes (Figura 6.12). mn de vol- En la rama del “No”, una vez que el usuario ha introducido “Return”, se da por terminada la ge- neracién de paredes. Como se tienen ya almacenados los valores de la titima pared, se dibujan di rectamente las dos lineas correspondientes y la tiltima linea de cierte de esta pared (Figura 6.13). 66 AUTOUSP. VERSION 11 Figura 6.12. Obtencin de puntos de la tercera pared y trazado de la segunda, Se cambia el valor de “n” a nil para provocar la ruptura del ciclo (WHILE n ..). Realmente el var lor de ‘'n”, que es el nimero de paredes generadas, se va a perder. Hubiera resultado mas logico conscrvarlo y utilizar una variable de control diferente, “ctr”. Pero, puesto que no interesa dema- siado conocer el nimero total de paredes, se ha aprovéchado esa variable para emplearla como control Figura 6.13. Trazado de la tercore pared y resultado final ANGULOSY DISTANCIAS 67 Una ver roto el control, fa funcidn “ciclo” termina y con ella el programa. + Variables de entrada: pin’ Punto inicial de la nueva pared, e — Espesor homogéneo de todas las paredes. pl Primer vértice de la primera pared. p2 Segundo vértice, pS Tercer vértce. p4 Cuarto vértice n Niimero de pared y control de ciclo, Variables locales: pf Punto final de I titima pared. pS Primer vértice de la uitima pared, p6 Segundo vértic. 7 Tercer vertice p8Cuarto vértce. il Primer punto de interseccién. i2 Segundo punto de interseccién. bl Ultimo primer punto de interseocién. ib2_ Ultimo segundo punto de interseccién. + Variables de salida: ninguna. Utilizaci6n de funciones del tipo GET. Se ha visto ya el empleo habitual de las funciones del tipo GET... para solicitar del usuario fos datos ne- cesarios en los programas de AutoLISP. Es muy frecuente establecer una serie de condiciones a la hota de que el programa acepte esos datos. Hasta ahora se incluian ciclos de control con el comando WHILE, que chequeaban el valor introducido. Pero es mas sencillo establecer las condiciones con comandes espe- cificos como los estuciados en este capitulo. 7.1, (INITGET [] []) MODOS DE LAS FUNCIONES GET... Este comando especifica el modo en que va a operar el siguiente comando del tipo GET... (excepto GETS- TRING y GETVAR). Fl comando devuelve siempre nil. El valor es un mimero entero, cuyos va lores posibles son los siguientes: Bits Modo 1 | No admite valores mulos 2__| _No admite valor cero. 4 | No admite valores negativos, 8 | No verifica limites, aunque estén activacos 16 | _Devuelve puntos 3D en vez de 2D. 32 | Dilbuj la linea 0 el rectinguloelisticos, con linea de trazos en ver de continua, ‘A la hora de indicar el modo se pueden sumar varios de ellos. Por ejemplo, si no se desea admitir ni valores nulos ni cero ni negatives y ademés devolver puntos 3D, el modo resultante. seria: 142444 16= 23 ‘La funcién de este modo es fijar las condiciones en que va a operar el siguiente comando GET... Si los datos introducidos por el usuario como respuesta @ la solicitud del comando GET... no cumplen la condicién o condiciones especificadas en el modo, se rechazan esos datos y se visualiza un mensaje que solicita al usuario que prucbe otra vez. Orden: (INITGET (+ 1 2 4)) (SETQ coef (GETINT “Intr. coeficiente de ecuacion: ")) En el ejemplo se pide al usuatio mediante un comando GETINT que introduzea el coeficiente de ‘una ecuacién, Si el usuario indica un mimero que no es entero, el propio comand GETINT lo rechaza 69 70 ALTOUSP. VERSION 14 pidiendo que pruebe otra ver, Pero si no se especifica un modo con INITGET, el comando GETINT ad- rmite un valor § 0 entero negativo o también nulo (si se pulsa RETURN). i Al establecer con INITGET un modo (+ 1 2 4), el comando GETINT no admite valores § ni nega tivos ni nulos y pide en todos los casos al usuario que prucbe otra vez. Esta es la forma de asegurar que el dato aceptado por GETINT es el correcto, El modo establecido por INITGET sélo sirve para el siguiente comando GET... Si se vuelve a utilizar tun segundo comando GETT.., habria que establecer antes el modo con un nuevo comando INITGET. ‘Los modos establecidas con INITGET sélo se tienen en cuenta para los comandos GET... co® los cuales tienen sentido. Asi, por ejemplo, no tiene sentido establecer un modo que no permita valores ne- gativos (modo 4) con un comando GETPOINT, puesto que éste devuelve un punto como una lista de dos 6 tres elementos, y las listas no pueden ser negativas El siguiente cuadro muestra los modos que tienen sentido con los diferentes comandos GET. iguana "Matas que teen sentido L 2 4 « | «| 2» GENT a | | s GBTREAL s | os | os Gero a | sa |= | | s« [sa GETANOLE as | s sl GETORIENT SI SL | SI GETPOINT si s | as | s GETCORNER SI é SI SI SI GeTKWORD si GETSTRING GETVAR | En la Versién 11 de AutoL ISP, los eédigos para los modos sufren alguna modificacién (véase el apar- tado 17.3.1 del Capitulo 17), Bl argumento opcional es una cadena de texto que define una serie de respuestas alternativas ‘los comandos del tipo GET... Si el usuario introduce una respuesta incorrecta ala solcitud del comando GET... en principio éste daria error y el programa en AutoLISP quedaria abortado, En cambio, si se e5- pecifican las respuestas alternativas con INITGET, el comando GET... verifica sila respuesta del usuario esté incluida entre las alternativas,y si es asi, devuelve esa cadena en vez de producit error. La lista de respuestas alternatives es una cadena de texto en que cada respuesta estd separada de la siguiente por un espacio en blanco. Por ejemplo, se dispone de un programa en AutoLISP que dibuja muros con espesor y solicita del usuario mediante GETPOINT que introduzca ef nuevo punto final de cada muro. Se desea disponer de una opcidn “R” para revocar el iltimo tramo de muro, “C” para cerrar el iitimo muro con ef primero y “A” para abrir el muro. (INITGET 1 "RC A") (SETQ pt (GETPOINT "Intr. nuevo punto”)) En este caso el comendo GETPOINT no admite un valor mulo (introducir RETURN), pero si admite que el usuario introduzea las respuestas alternativas “R”, “C” 0 “A”. Bstas pueden ir también en minis- calas (valdrian “r”, “ec” 0 a”), UTIUZACION DE FUNCIONES DEL TIPO GET... 711 Gsculas. Se pueden aveptar abreviaturas indicandolas en mayisculas en INITGET y el resto en mi Por ejemplo: (INITGET 1 “Revoca”) admitiria “R” o “+”, o la palabra completa “Revoca” como alternativas (INITGET 1 “REVoca") no admitiria “R” ni “RE”, sino solamente “REV” como abreviatura valida (puede estar tanto en maylis- caulas como en mimiscutlas). La abreviatura es, pues, el minimo nimero de caracteres en que debe coincidir la respuesta del usua- rio con ia alternativa indicada en INITGET. A partir de abi se admiten més caracteres por parte del usua- ro hasta la longitud de la respuesta alternativa indicada en INITGET. (murmest 1 Revo") aadmitiria “r”, “re”, “ etcetera “También es posible indicar la abreviatura junto a la respuesta completa, separada por una coma, ‘ev’ 0 “revo” (maytisculas o mintisculas), pero no “revoca”, ni “revocar”, ni “redo”, (INITGET 1 “REVO,R") equivale a (INITGRT 1 "Revo") 7.2. (GETKWORD []} PERMITIR OPCIONES O PALABRAS CLAVE Este comando permite solicitar det usuario que introduzca una serie de opciones o palabras clave. La lista de respucstas posibles admitidas se debe especifcar previamente con el comando INITGET, visto en el apartado anterior. El usuario debe introducir una de estas respuestas posibles 0 en caso contratio GETK- WORD solicita que prucbe otra vez (INITGET 1 "Si No") (SETQ x (GETKWORD "Cerrar muro Si/No?: ")) En este caso, GETKWORD admitiria las respuestas “s", “si", “n” 0 “no” (mayisculas o miniscu- las), pero no admitiria ninguna otra, El comando GETKWORD siempre devuelve una cadena de texto, que es una de las respuestas po- sibles indicadas en INITGET. Si no se ha especificado ninguna opcién, devuelve nil Hay que tener en cuenta que GETKWORD devuelve la cadena tal como esté indicada en INITGET. ‘Asi, en el ejemplo, acepta como respuesta “s” y devuelve la cadena correspondiente que es “Si”, pero no devuelve “SI” ni “si”, porque no estén eseritas asi en INITGET. 7.3. (GETENV ) VALOR DE VARIABLE DE ENTORNO Este, comando devuelve una cadena de texto (entre comillas), que es el valor actual atribuido a la variable de entoro indicada en . Esta variable habré que indicarla como un texto, entre comillas. (Gerewy “acadfreeran”) podria devolver_ "24" (GETENV “Lispheap”) podria devolver "35000" Si la variable no existe o no es encontrada, GETENV devuelve nil 72 SUTOUSP. VERSION 11 EJEMPLO 1: Muro con espesor al interior 0 exterior Este programa es una variante del Ejemplo I del capitulo anterior. En aquel caso, Jos puntos introducidos por el usuario se median sobre la linea media del muro, Pero, por ejemplo, en las fachadas de los edifcios es frecuente que el usuario conozca los puntos del contorno exterior y desee, por tanto, especificar el es- pesor hacia el interior. En algunos tabiques interiores puede interesar lo contrario Para posibilitar eses opciones, en este ejemplo se afiade al programa del capitulo anterior la opeién de que el usuario decida qué linea va a utilizar para definr eI muro: la Tinea media, la exterior o la interior. Listado del programa [—(DEFUN inte () (INIIGET 6 “Interior Exterior Medio") [—(IE (SETQ op (GETAWORD "Interior/Bxterior: ")) () L" (SET9 op "Hedio")) (SETQ pin (GETPOINT "Primer punto: ")) (‘TERPRI) (SETQ ¢ (GETDIST pin "Espesor: ")) (TERPRI) {SETQ pf (GETPOINT pin "Segundo punto: ")) (TBRPRI) (SETQ ang (ANGLE pin pf) i) [—(DBFON par ( / pl p2 p3 ps) [—(IF (= op "Medio" ) (BROGN (SEQ pl (POLAR pin (+ ang (/ PI 2)) (/ e 2))) (SEQ p3 (POLAR pl (~ ang (/ PT 2)) e)) (SETQ p2 (POLAR pf (+ ang (/ PI 2)) (/ e 2))) (SETQ p4 (POLAR p2 (~ ang (/ PI 2)) e))) —) [—(IF (= op "Bxterior") (PROGN (SEQ pi pin) (SETQ p3 (POLAR pl (- ang (/ PI 2)) e)) (SBTQ p2 p£) (SETQ p4 (POLAR p2 (- ang (/ PI 2)) e))) | GPG op *mnterion") (eRocu (seT0 p3 pin) (S80 pl (POLAR p3 (+ ang (/ PI 2)) e)) (SETQ p4 pf) (SeTQ p2 (POLAR p4 (+ ang (/ PI 2)) e))) Ly (COMMAND “Linea” pl p2."") (COMMAND “Linea” p3 pa") (COMMAND “Linea” pl p3 "") (COMMAND “Linea” p2 pa "*) ) [—(DEFUN cipared ( / op pin pf e ang) (SETVAR “blipwode” 6) (SETVAR “cmdecho” 6) (nic) (par) (SETVAR “bliptode” 1) (SBIVAR "cmdecho” 1) ) 2. Observaciones En este programa se observa un mecanismo muy habitual a la hora de proponer varias opciones para que el usuario elija una: mostrar una de las opciones entre paréntesis eomo opeién por defecto. De esta ma- UMLIZACION DE FUNCIONES DEL TIPO GET... 73 neta, si el usuario responde con RETURN 4 la solicitud, el programa toma la opcién por defecto. La ma- nera de conseguir esto es muy sencilla, como se mostrara al explicar la funcién “nic” donde se encuentra incluida, ‘Una vez seleccionada por ef usuario la opcién deseada entre las posibles, ésta va a condicionar el fax cionamiento del resto del programa, En este caso el ejemplo es muy sencillo, Pero en casos mas comple- jos, si se parte de un programa ya desarrollado y se pretende afiadirle la posibilidad de permitir varias ‘opciones, se trata siempre de aprovechar la disposicién estructurada del programa y hacer que las modi- ficaciones resulten minimas. 3. Explicacién del programa ‘Lo mismo que el programa del capitulo anterior en el que est basado, define una mueva orden de ‘AutoCAD y dos funciones de usuario, ™ Funcién c:pared Afiade una nueva orden “pared” a AutoCAD. Como es habitual, desactiva las marcas auxiliares y el eco de drdenes y llama a las dos funciones “nic” y “ib” Se definen como variables locales el resto de variables que no se han definido como tales en las fun ciones de usuario, De esta manera, no queda ninguna veriable permanentemente almacenada en la me- roria al final del programa. © Funcién inic Lo primero que solicta es la opcién deseada por el usuario para el trazado de la pated. Las tres opciones propuestas son: — Exterior, — Interior Medio, La opcién se va a solicitar mediante el comando de AutoLISP GETKWORD, que visualizaré el mensaje: Interior/Exterior, que seré aceptada con un RETURN como respuesta, Previamente, antes de GETKWORD es preciso especificar une lista de respuestas posibles admiti- das, con ef comando INITGET. (INITGET 6 "Interior Exterior Medio") Hay que inctuit como respuesta posible también “Medio”, por si el usuario introduce esa opcién con sus letras en vez de RETURN. Las mayisculas son la abreviatura de cada una de las opciones. Ademés de esas\abreviaturas, el usuario puede introducir mas letras de cada opcién como respaesta al mensaje de GETKWORD. El comando GETKWORD devuelve una cadena de texto que coincide con la opcién correspondien- te, tal como aparece en INITGET. Esta cadena de texto es la que se almacena en la variable “op”. ‘Asi, por ejemplo, son respuestas permitidas: "I", "int", "inter", “interior” ...... 74 —nuTOLIse. VERSION 11 siendo indiferente introducir las respuestas en maytisculas o mintisculas. En todos los casos, GETK WORD devolverd exactamente la cadena de texto “Interior” De la misma manera, las respuestas posible: vo", "ext", “exter”, “exterior” ...... devolverin en todos los casos la cadena de texto “Exterior”. Para la opeiin por defecto “medio” se emplea el mecanismo: (TF (SETQ op (GEYKWORD “Interior/Exterior []} CAMBIO A MAYUSCULAS 0 MINUSCULAS Este comando toma la cadena de caracteres indicada en . Al final devuelve fa nueva cadena resultante de esa conversién Si la expresién falta 0 su valor es “nil”, la cadena se convierte a maytisculas. Si tiene cualquier otro valor diferente de “nit”, la cadena se converte en mimisculas Este comando es itil para chequear una entrada de texto, por ejemplo del tipo de “Si” “No”, en que serian vélidas todas las posibles combinaciones de maytisculas y mintsculas: “ST”, “si”, “NO”, “no” 0 incluso “S”, “3°, “N®, fn", Orden: (SEEQ tx (GETSTRING "Introducir : ")) (SETQ cond (STRCASE tx nil)) ‘Ahora en la variable “cond” esta almacenado el texto en maytisculas introducido, por lo que bastard chequear solamente las posibilidades “SI”, “S", “NO” 0 “N”, 8.2. (STRCAT ...) CONCATENAR CADENAS DE TEXTO ste comando devuelve una cadena que es la concatenacién de todas las cadenas , , ete., indicadas. Los argumentos tienen que ser todos cadenas, pues en caso contrario se produce un error. Orden: (SETQ cadi "Ejemplo de ") (SETQ cad2 "concatenacion”’) (SETQ cad3 " de cadenas.") {SETQ cadt (STRCAT cadl cad2 cad3)) mgjemplo de concatenacion de cadenas.” ‘Una utilidad muy interesante es cuando el mensaje a visualizar depende del contenido de determing das variables de texto. Por ejemplo, se pretende insertar un blogue euyo nombre se pide previamente al usuario, y después se solicita el punto de insercién visualizando en el mensaje el nombre del bloque: 7 78 AUTOLISP. VERSION 11 Orden: (SBTQ nbl (GETSTRING “Nombre del bloque: “)) (SBTQ mens (STRCAT "Punto de insercion del bloque ” nbl " : ")) (SE19 pins (GETPOINT mens) ) La variable “nbY” almacena el valor textual (cadena) del nombre del bloque. Después en la variable “mens” se concatena un mensaje en que se incluye el nombre del bloque. Este mensaje se visualiza al so- licitar un punto de insercién para almacenarlo en “pins”, Si, por ejemplo, el nombre del bloque contenido en “nbl” es “resist”, ef mensaje visualizado seria: Punto de insercion del bloque resist: En el caso de que la variable a concatenar fuera numérica, seria preciso convertirla previamente me- iante el comando ITOA, que se estudiard en este mismo capitulo, 8.3. (ATO! ) CONVERSION DE CADENA EN ENTERO Este comando convierte la cadena especificada en en un niimero entero, Si tiene decimales, los trunca. Orden: (SETQ cad 38.7") (SETQ nun (ATOT cad)) 38 La variable “num” almacenaria en el ejemplo el valor numérico entero de 38 8.4, (ATOF ) CONVERSION DE CADENA EN NUMERO REAL Convierte la cadena indicada en un nimero real. Admite el guién inicial de la cadena de texto con virtiéndoto en signo “menos” del nimero real obtenido. Sila cadena de texto no contiene caraeteres nu- méricos, ATOF devuelve el valor (6, Si la cadena contiene al principio caracteres numéricos y después no, ATOF solamente convierte los niuméricos, desechando el resto, Todas estas posibilidades se contemplan en los siguientes ejemplos: (ATOR 35.76") devuelve 35.76 (ATOR *-56") develve -56.8 (ATOF 35,26") develve 35.8 (ATOP "24 metros”) devuelve 24.9 (AT0F "hola”) devuelve 9.6 8.5. (ITOA ) CONVERSION DE ENTERO EN CADENA Convierte el valor entero indicado en una cadena de texto. Reconoce el signo “menos”, si existe, y Jo con- vierte en guidn al principio de la cadena, Si el especificado tiene decimales 0 no es numérico, el comando produce un error. (120A 27) devuelve nae (TOA -35) — devuelve 35" (TOA 45.7) produce un error (170A 35m) produce un error Es itl este comando cuando el mensaje a visualizar depende del contenido de determinadas variables numéricas. Por ejemplo, en ef programa del Capitulo 4, para generar lineas de texto con cualquier valor MANIPULACION DE CADENAS TEXTUALES 79) de espaciado (Ejemplo 3), el mensaje para solcitar los textos de cada linea debfa visualizar el mimero de linea correspondiente en cada caso. Si ja variable “n contiene el valor del nimero de linea y se pretende almacenar en una variable “mens” el mensaje a visualizar, se produce un error: orden:(SBTQ mens (STRCAT “Introducir texto de linea” n)) error: bad argument type EB valor de ia variable “n” es numérico y no un texto. Para poder concatenarlo con el resto del men- saje, hay que convertiro previamente en cadena. Si el valor de “n”” es un miimero entero (por ejem- plo, 3), se usaria el comando ITOA. orden: (SE9 n 3) (SETQ mens (STRCAT "Coeficiente de grado ” (ITOA n))) “coeficiente de grado 3” A continuacién bastaria visualizar el mensaje almacenado en la variable “mens” al solicitar el texto de la linea de que se trate con GETSTRING: (SBTQ tx (GETSTRING T mens) ) El comando_RTOS para convertit un nimero real en cadena, segin un formato especificado, se ha cexplicado en el Capitulo 6, 8.6. (SUBSTR []) SUBCADENA DE UNA CADENA Este comando toma la cadena indicada en y devuelve una subcadena a partir del nimero de cardo- ‘er indicado en (principio de la subcadena), y con una longitud de caracteres . Si no se in- dica , la subcadena se toma desde hasta el final. ‘Tanto el principio de la subcadena deben ser nimeros enteros positives, Orden: (SEQ cad "Buenos dias”) (SUBSTR cad 2 3) devuelve —"uen” (SUBSTR cad 11) dewelve "B" (SUBSTR cad 7) devuelve dias” (SUBSTR cad 7.1) dewelve " " 8.7. (STRLEN ) LONGITUD DE CADENA Este comando devuelve ta longitud de la cadena indicada, Bl valor de la longitud es un niimero entero que expresa el nimero de caracteres totales de la cadena Orden: (SETQ cad “Buenos Dias”) (STRLEN cad) al En el ejemplo, la longitud de la cadena es de 11 caracteres. Una cadena vacia devolveria una fongitud de 9 caracteres: (STREEN "") devuelwe 6 80 AUTOUSP. VERSION 11 8.8. (ASCII ) CODIGO DEL PRIMER CARACTER DE CADENA Este comando devuelve un niimero entero que es el codigo ASCH del primer cardcter de ta cadena indi- cada ) CARACTER CORRESPONDIENTE A CODIGO ASCII Este comando devuelve el carécter cuyo cédigo, ASCIT coincide con ef miimero entero especifica- do. Representa la operacién inversa del comando anterior. (CHR 54) devuelve "6" (CHR 104) devuelve "h” (CHR 6) devuelve. (CHR 13) devuelve *\r Se observa en el tiltimo ejemplo que el carcter correspondiente al cédigo 13 (que es el RETURN) es A", El comando CHR siempre devuelve un carécter de texto, por tanto entre comillas. 8.10. (READ ) PRIMERA EXPRESION DE UNA CADENA Este comando devuelve la primera expresién de le cadena indicada + ")) (IE (= (SETQ fun(GEPSTRING 7 mens))) (SETQ fun funant)) (TERER) (SBTQ fundef (sTRCAT "(defun curvaf (x)" fun ")”)) (EVAL (READ fundef) ) (SETQ xi (GBTREAL "Inicio curva en X: ")) (TERPRI) (SETQ x1 xi) (S899 yl (curvaf x1)) (SBT pl (LIST x1 y1)) (SETQ funant fun) (SEIQ xf (GETREAL [— (WHILE (<= xf xi) (PROMPT "Debe ser un valor mayor que inicio”) (TERPRI) (S5TQ xf (GETREAL "Final curva en x: ")) (TERPRI) inal curva en ")) (RRPRI) i) (aNrvcEr 7) (SETQ prx (GETREAL "Precision en x: ")) (TERPRI) (SETQ n (FIX (/ (~ xf xi) prx))) —) [—"(DEFUN dib (/ x2 y2 p2) [—(REPEAT (SETQ x2 (+ x1 prx)) (SETQ y2 (curva x2)) (SETQ p2 (LIST x2 y2)) (COMMAND “Linea” pl p2 "”) (SETQ x1 x2 pl p2) ) —) f—(DEFUN ult (/ p2 yf) (SETQ yf (curvaf xf) (SETQ p2 (LIST xf yf)) (COMMAND “Linea” pl p2 "") MANIPULACION DE CADENAS TEXTUALES 83 [—(DBFUN cicurva ( / xi xf prx pl n xl) (SETVAR “blipmode” #) (SETVAR "omdecho" 9) (intr) (aib) (alt) (SETVAR "blipmode” 1) (SETVAR “cmdecho” 1) —) 2. Observaciones Las mismas consideraciones expuestas para el programa de trazado de curvas senoidales (Ejemplo 1 det Capitulo 5) sirven aqui, Como se ha dicho, la diferencia radica en que el usuario introduce la expresion. de fa funcin, Este es precisamente el punto mas delicado, pues la expresién debe ser indicada en el formato de AutoLISP. Si el usuario comete algin error, el programa quedard abortado. Es preciso controlar, pues, este aspecto. El tratamiento de errores en AUtoLISP se estudiard mas adelante. Pero conviene detectar sila expre- sign es correcta antes de que el programa solicite el resto de valores. Esto se hace provocando la evalua- cin de esa expresion, tl como se explica mas adelante al hablar de la funcién “intr” 3. Explicacién del programa Se define una nueva orden de AutoCAD llamada “curva” y tres funciones mis de usuario, = Funcién c:curva Desactiva marcas auxiliares y eco de érdenes y Hama sucesivamente a las restantes funciones de usuario. * Funcién intr ‘Como siempre, su cometido es solcitar los datos requeridos para la ejecucién del programa, En este caso el primero y fundamental dato es la expresién de Ja fuucién cuya curva se pretende di bujar. El programa fa solicita mediante un comando GETSTRING con el pardmetro T para aceptar tam- bign espacios en blanco. La expresién queda almacenada en la variable “fun” como una cadena de texto. Se insiste una vez mis en que el usuario debe introducit la expresién en el formato de AutoL ISP. Asi, por ejemplo, si se pretende trazat la curva del polinomio Y= ox = 7K +3 1 usuario deberd introducir la expresion (F (#8 x x) (- (4 7x) 3) w otra equivalente, Lo mismo con cualquier otro tipo de fneién, que podré contener exponenciales, funciones trigono- rétricas, logaritmicas, etc. Los eomandos de AutoLISP correspondientes a esas operaciones se han expli- cado en el Capitulo 5: Es muy normal que el, usuario prucbe con una misma funcién pata trazar diferentes intervalos 0 pre- cisiones diversas. Sila funcién es compleja, resultaria may engorroso tener que introducirla completa cada vez que se modifica el intervalo o fa precision. Por eso el programa guarda la dltima expresin introducida en una variable “funant”. Esa expresion. 84 AUTOUSP. VERSION 11 se concatena mediante STRCAT con el mensaje de solicitud en la variable “mens”. Se oftece como op- cién por defecto para que el usuario no tenga que repetirla, Si el usuario introduce RETURN como aceptacién de esa opcién por defecto, el coinando GETS- ‘TRING devuelve la cadena vacia””. Luego (SETQ fun (GETSTRING...)) también devuelve nil. Se es tablece una alternativa para asignar el valor de “funant” con la funcién por defecto a la variable “fun”, ‘en el caso de que se curmpla esa condicién (rama del SP). La rama del NO de la alternativa es una cadena vacia, Hay que considerar un hecho: la primera vez que se utiliza el programa en el Faitor de Dibujo, la variable “funant” se encuentra a nil y esto puede provocar un error. Por eso s¢ establoce una alternativa previa que detecta esta posibilidad y asigna a “funant” la cadena vacia ” Una vez almacenada la expresion de a funcién en “fun”, el programa debe defini una funcién con ella mediante DEFUN, con objeto de que pueda ser Ilamada para calcular los puntos de la curva, Pra ello se forma una cadena de texto mediante STRCAT, afadiendo por delante Ia cadena “(DE- FUN curvaf (x)” y por detrés el cardcter de cierre de paréntesis ")”. El resultado de esa concatenacién de cadenas se guarda en la variable “fundet”. Por ejemplo, sila variable “fun” de la expresion introducida por el usuario almacena la cadena de texto me (#5 xx) (= (xe 7x) 3)" la variable “fundef” almacenaré la cadena ‘"(DEFUN curvaf (x) (+ (# 5 x x) (= (+ 7 x)) 3)” que es precisamente la definicién de una funcién lamada “curva?” que contiene la expresion que se pre- tende dibyjar De momento s6lo es una cadena de texto, Pero a continuacién el programa hace: (EVAL (READ fundef)) EI comando READ lee la cadena de texto almacenada en “fundet” y devuelve como resultado una ‘expresién en AutoLISP, fa cual es evahiada mediante EVAL. El resultado es que se ejecuta el comando DEFUN y la funcién “curvaf” definida queda cargada en Ja memoria para su posterior uilizaci6n en el resto del programa. Si la definicién de la funcién es incorrecta, el programa lo detectara s6lo cuando se llame a dicha funcibn, Por eso se cambia un poco el orden del programa respecto al mencionado de las curvas seni dales. En este caso se solicita el valor X inicial de fa curva (variable “xi"), ¢ asigna ese valor a la co- ordenada X del primer punto de la primers lines (variable “x1”) y se caleala en seguida el punto “y!” correspondiente, para lo cual se Hama a la funcién “curva” recién definida. (SETQ yl (curvaf x1)) Con esos valores se forma el punto “pl”, que sera el inicial del trazado de la curva. Aunque lo més lbgico hubiera sido introducir primero todos los datos y calcalar después el punto, se hace de esta manera para comprobar si fa expresion se encuentra bien escrita, En caso de que no sea asi el programa provoca tun error y queda abortado en su comienzo. De esta forma no hay que esperar ¢ introducir los valores de precisidn, inicio en X, etc., para saber si hay error. Si todo es correcio, el programa almacena la expresiOn de la funcién en “funant” para que se visua- lice como opcién por defecto la préxima vez. y continia solicitando el valor X del final del intervalo a tra- zar, Se mantiene el control con WHILE para que su valor sea mayor que el inicio. ‘A continuacién viene ta precisién en X. En el ejemplo de las curvas senoidales se establecia un con- trol con WHILE para asegurar que ese valor es positivo, En este caso se utiliza el comando INITGET visto en el capitulo anterior. (anrtcer 7) MANIPULACION DE CADENAS TEXTUALES 85 El valor de 7= 442+ 1 establece no permitir valores nulos ni ni negativos. Por iiltimo, la funcién calcula el ndimero de tramos de linea a dibyjar, almacenindolo en la varia- ble “n”, El comando FIX toma el valor entero del cociente: (xf - xi) EX Es el miimero de tramos de linea completos a dibujar. Para dibujar el tltimo “pico” o “resto” se uti lizard Ja funcién “alt” + Variables de entrada: ninguna. + Variables locales: mens fun fundet xi yl Mensaje para la solicitud de funcién. Cadena con expresién de funcién, ‘Cadena con expresin para def. funcién, Coordenada X de inicio de la curva Coordenada Y del primer punto de curva. + Variables de salida: Expresion de la dltima funcin Intervalo de precisién en X. Coordenada X del primer punto de tramo. Primer punto del primer tramo, Coordenada X de final de ta curva ‘Niimero de tramos de linea completes. © Funcién dib Fs la misma fiticion explicada en el programa del trazado de curvas senoidales. Dibuja los tramos com- pletos de linea que van a conformar el trazado de Ja curva deseado, Establece un ciclo repetitivo de “n” ‘veces. ‘La primera vez se entra con un valor de punto inicial en “pl”, Dentro del ciclo se caleula el punto final del tramo de linea, de acuerdo con el incremento marcado por la precisién “prx”, Se dibuja el tramo de linea entre “pI” y “p2” y se actualiza la variable “p1” para que el punto final del presente tramo sea el inicial del nuevo tramo (Figura 8.1). Figura 8.1. Variables y célculo de un sogmento para el trazado de una curva Se establecen las variables locales euyos valores no van a ser utiizados posteriormente. BI timo va- lor de “pl” con.que se sale de la repetitiva va a ser utilizado por la funcién “ult” 86 AUTOLISP. VERSION 11 Para calcular la coordenada Y de cada punto de la curva existe dentro del ciclo una llamada a fa fun- cién “curvat”. + (SBTQ y2 (curvaf x2)) En este punto el programa puede quedar abortado si, como consecuencia de las caracteristicas de la funcién especificada, tiene alguna discontinuidad en el intervalo sefalado o tiende a infinito, En cualquier ‘caso, observando el trozo de curva dibujado antes de generarse ese error, es posible observar gréficamente la tendencia de ta funcién, + Variables de entrada: n__Niimero de tramos completes de linea, xl Coordenada X del punto inicial de curva. prx _Intervalo de precision en X. pl Primer punto del primer tramo. + Variables locales: x2 Coordenada X del punto final del tramo. y2 — Coordenada Y de ese mismo punto. p2 Punto final del tramo + Variables de salida: pl Punto final del tltimo tramo, que serd el inicial para dibujar el “resto”. © Funcién ult Dibuja el ditimo “resto” de la curva, Calcula la coordenada Y correspondiente a “x?” y forma el punto final “p2”, dibujando fa sitima linea + Variables de entrada: xf Coordenada X del punto final de curva, pl Punto inicial del “resto”. + Variables locales: £ Coordenada Y del punto final de curva. p2 Punto final de curva, + Variables de sada: ninguna © Funcién curvat Es en realidad una funcidn mas de usuario aunque el programador no la haya escrito en el programa, sino ‘que se ha formado a partir de la expresién introducida por el usuario de dicho programa. ‘Su contenido es calcalar las coordenadas Y correspondientes a cada valor de X. + Variables de entrada: x Coordenada X del punto de la curva cuya coordenada Y se quiere obtener. + Variables locales: ninguna, + Variables de sada: No existe ninguna, pero la evaluacién de la propia Cuncién “curvaf (x)” devuelve un valor que es la coordenada ¥ buscada

También podría gustarte