apuntes lisp

68
  PROGRAMACIÓN  AUTOLISP (PERSONALIZACIÓN DE AUTOCAD) MILAGROS CANGA VILLEGAS JOSÉ ANDRÉS DÍAZ SEVERIANO Departamento de Ingeniería Geográfica  y Técnicas de Expresión Gráfica  T a a/2 a/3 T a a/2 a/2 Pa P cenp ceng cen a/2 a/3 a/12 a/12 a/12 Sistema de rectas paralelas  a/3 a/3 Formas homotéticas rad Pa P cen Figura 1: Definición geométrica Figura 2: Mosaico

Upload: kappaxd

Post on 06-Jul-2015

982 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 1/68

 

 

PROGRAMACIÓNAUTOLISP

(PERSONALIZACIÓNDE AUTOCAD) 

MILAGROS CANGA VILLEGAS

JOSÉ ANDRÉS DÍAZ SEVERIANO

Departamento de Ingeniería Geográfica y Técnicas de Expresión Gráfica 

T

a

a/2

a/3

T a 

a/2

a/2

Pa

P

cenp

ceng

cen a/2 a/3 

a/12 

a/12 a/12

Sistema de rectasparalelas

 

a/3

a/3

Formashomotéticas

rad

Pa

P

cen

Figura 1: Definición geométrica

Figura 2: Mosaico

Page 2: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 2/68

 

 

“No basta el recuerdoCuando aún queda tiempo”

(Luis Cernuda)

“El hoy es malo, pero el mañana ... es mío”

(Antonio Machado)

Page 3: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 3/68

 

i

Page 4: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 4/68

 

ii

INDICE:

1. PRESENTACIÓN GENERAL DE AUTOLISP 1 2. ELEMENTOS DEL LENGUAJE Y TIPOS DE DATOS 2 

2.1. Números 2 2.2. Cadenas 2 2.3. Listas 3 2.4. Símbolos y variables 3 2.5. Conjuntos de selección 3 2.6. Nombres de entidad 4 2.7. Descriptores de archivo 4 2.8. Subrutinas 4 

3. EXPRESIONES DE AUTOLISP 5 4. RECOMENDACIONES INICIALES PARA LA CODIFICACIÓN DE UNA RUTINA LISP 6 5. FUNCIONES AUTOLISP 7 

5.1. FUNCIONES ARITMÉTICAS 8 5.2. FUNCIONES DE ASIGNACIÓN 12 5.3. FUNCIONES PARA MANEJAR CADENAS DE TEXTO 13 5.4. FUNCIONES PARA GESTIÓN DE LISTAS 15 

5.4.1. CREACIÓN DE LISTAS 15 5.4.2. EXTRACCIÓN DE ELEMENTOS DE UNA LISTA 16 5.4.3. MANIPULACIÓN DE LISTAS 18 

5.5. FUNCIONES MONOLÍNEA 20 5.6. FUNCIONES DE CONVERSIÓN Y TRANSFORMACIÓN 21 5.7. FUNCIONES DE RELACIÓN 24 5.8. FUNCIONES DE CONDICIÓN 27 5.9. FUNCIONES PARA GESTIÓN DE CICLOS 28 5.10. FUNCIÓN PARA CREAR FUNCIONES DE USUARIO 30 5.11. FUNCIONES GRÁFICAS 31 5.12. FUNCIONES DE ENTRADA INTERACTIVA 32 5.13. FUNCIONES PARA GESTIÓN DE FICHEROS 39 5.14. FUNCIONES DE LECTURA Y ESCRITURA 41 

5.14.1. ESCRITURA 41 5.14.2. LECTURA 42 

5.15. FUNCIONES DE ORDENACIÓN 44 5.16. FUNCIONES DE CONTROL DE PANTALLA 45 5.17. OTRAS FUNCIONES DE UTILIDAD 46 

6. FUNCIONES AVANZADAS DE PROGRAMACIÓN AUTOLISP 48 6.1. OBJETIVOS Y ENTORNO DE LA PROGRAMACIÓN AutoLISP 48 6.2. CONCEPTOS BÁSICOS 48 6.3. FORMA DE TRABAJO Y FUNCIONES UTILIZADAS 49 6.4. DESCRIPCIÓN DE LAS FUNCIONES 50 

7. CÓDIGOS Y MENSAJES DE ERROR DE AUTOLISP 59 8. ÍNDICE DE FUNCIONES 63 9. BIBLIOGRAFÍA BÁSICA 63 

Page 5: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 5/68

 

1

1. PRESENTACIÓN GENERAL DE AUTOLISP

AutoLISP es una adaptación del lenguaje de programación LISP y forma parte integral del paqueteAutoCAD. Autolisp es un pequeño subconjunto del CommonLISP, y por ello se ajusta muy estrechamente ala misma sintaxis y convenciones, pero consta de muchas funciones específicas de AutoCAD.

AutoLISP es la más potente herramienta para optimizar la ejecución de AutoCAD. Le habilita para«automatizar» AutoCAD incluso más allá de lo que puede llevar a cabo usando macros.

Las rutinas AutoLISP tienen aplicaciones como:

- La creación de nuevas y únicas órdenes AutoCAD.- La inserción de funciones especiales para dibujar y para calcular.- Análisis detallados de gráficos y de dibujos dentro del editor de dibujos de AutoCAD.

Con AutoLISP, se pueden escribir programas y generar funciones de macros con un lenguaje potente yde alto nivel, apropiado para las aplicaciones de gráficos. AutoLISP es flexible y fácil de aprender y utilizarpara los no-programadores, quienes al aprender AutoLISP sólo necesitan conceptos básicos deprogramación, tales como:

- Almacenar datos durante el proceso con variables de memoria;- Procesar datos en una serie de pasos secuenciales;- Organizar etapas dentro de una rutina definiendo nuevas funciones;- Elegir entre pasos alternativos (ramificar)- Repetir una secuencia de pasos hasta que se encuentre una condición específica (bucles).- Específicamente: Acceder a los datos de la base de datos geométrica

El código de AutoLISP no se compila 1, se puede teclear el código en la línea de comandos y ver losresultados inmediatamente haciéndose más sencilla la introducción a este lenguaje para los no iniciados. Enun segundo nivel de aprendizaje resulta mucho más fácil realizar pruebas y depurar cuando este código secarga desde un archivo, en lugar de volverlo a escribir cada vez que se realiza alguna modificación.

El código de AutoLISP se almacena en archivos de texto ASCII con la extensión *. lsp. La sintaxis de lasexpresiones de AutoLISP escritas en los archivos es básicamente la misma que se utiliza para escribirlas enla solicitud de comando.

1 Se trabaja a este nivel docente sin compilar. Se recomienda consultar los manuales de VisualLISP de la versión 2000de AutoCad o superior.

Page 6: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 6/68

 

2

2. ELEMENTOS DEL LENGUAJE Y TIPOS DE DATOS

El evaluador de AutoLISP procesa las expresiones de acuerdo con el orden y el tipo de datos delcódigo.

Este código se caracteriza especialmente porque aparece entre paréntesis.

Para poder utilizar plenamente AutoLISP, es necesario entender las diferencias entre los distintos tiposde datos y el modo en que deben utilizarse.

Los elementos del lenguaje y sus convenciones son las siguientes:

2.1. Números

Números enteros

Los enteros son números sin coma decimal. Los enteros de AutoLISP son números de 32 bits con signocuyos valores están comprendidos entre +2 147 483 648 (231) y –2 147 483 647. Aunque AutoLISP utilizainternamente valores de 32 bits, los que se transmiten de AutoLISP a AutoCAD y viceversa están limitadosa 16 bits. Por tanto, no pueden transmitirse a AutoCAD valores superiores a +32 767 (215) ni valoresinferiores a –32 768. Los enteros que se utilizan de forma explícita en expresiones de AutoLISP se conocencomo constantes. Números como 2, -56, y 1 200 196 son enteros válidos de AutoLISP.

Números reales

Los números reales son aquellos que contienen la coma decimal. Los comprendidos entre -1 y 1 debenempezar por cero. (No se admiten formatos como .2 ó 2.)

Los números reales se almacenan en formato de coma flotante de doble precisión, lo cual proporcionauna precisión mínima de 14 dígitos significativos, aunque el área de comandos de AutoCAD muestra sólo 6.Los números reales pueden expresarse en notación científica, que consta de una e o E opcional seguidapor el exponente del número (por ejemplo, 0.0000041 es lo mismo que 4.1e-6).

Los números reales que se utilizan de forma explícita en expresiones de AutoLISP se conocen comoconstantes. Números como 3,1, 0,23, -56,123, y 21 000 000.0 son números reales válidos de AutoLISP.

2.2. Cadenas

Las cadenas son grupos de caracteres delimitados por comillas.

Dentro de las cadenas que aparecen entre comillas: la contrabarra (\) permite incluir caracteres decontrol (o códigos de escape):

 \\ para el carácter \ 

 \e para el carácter ESC \n para el salto de línea \r para RETURN \t para tabulador

Las cadenas individuales tienen una limitación de 132 caracteres.

Las cadenas entre comillas que se utilizan de forma explícita en expresiones de AutoLISP se conocencomo cadenas de texto o constantes de cadena.

Ejemplos de cadenas válidas son "cadena 1" y "\nPrimer punto: ". 

Page 7: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 7/68

 

3

2.3. Listas

Las listas de AutoLISP son grupos de valores relacionados, separados por espacios en blanco (uno ovarios se interpretan como uno sólo) e incluidos entre paréntesis.

Las listas proporcionan un método eficaz para almacenar numerosos valores relacionados.

AutoCAD expresa los puntos 3D como una lista de tres números reales.

Ejemplos de listas son: (1.0 1.0 0.0), ("éste" "ése" "aquél") y (1 "UNO").

2.4. Símbolos y variables

AutoLISP utiliza símbolos para almacenar los datos.

En los nombres de símbolos no se distingue entre mayúsculas y minúsculas, pudiendo emplearsecualquier secuencia de caracteres alfanuméricos, siempre que no contenga a alguno de los siguientes:

- Paréntesis ( ) Reservado para lista y expresiones

- Punto . Punto decimal- Apostrofo ' Abreviatura de la Función QUOTE- Comillas " Reservado a las cadenas de caracteres.- Punto y coma; Para comenzar una línea de comentarios.

Un nombre de símbolo no puede estar compuesto sólo por caracteres numéricos.

Las aplicaciones de AutoLISP hacen uso de símbolos o valores constantes, como cadenas, númerosreales o enteros, y variables, empleadas para almacenar datos generados durante las ejecución de losprogramas.

AutoCAD proporciona tres variables predefinidas que pueden emplearse en las aplicaciones de

AutoLISP:

- PAUSE:   está definida como una cadena compuesta que consta sólo de una contrabarra (\). Estavariable se emplea con la función command para que el programa espere a que el usuario escribadatos.

- PI: está definida como la constante p (pi). Su valor aproximado es 3.1415926.- T: está definida como la constante T. Se emplea como valor distinto de nil.- Nil: símbolo que en Lisp significa “nada” o “vacío”.

Es posible cambiar el valor de estas variables con la función setq . Sin embargo, otras aplicacionespodrían considerar que sus valores son fiables; por tanto, se recomienda no modificar estas variables.

A estas tres variables, junto con los nombres de funciones del lenguaje y los nombres de funcionesdefinidas por el usuario, las denominaremos palabras reservadas del lenguaje

Los valores asignados a las variables pueden usarse como respuesta a las solicitudes de comando deAutoCAD. Esto proporciona una forma de almacenar y reutilizar nombres o números complejos. Si se deseautilizar el valor de una variable como respuesta a una solicitud de AutoCAD, basta escribir el nombre de lavariable precedido por un signo de admiración (!).

2.5. Conjuntos de selección

Los conjuntos de selección son grupos compuestos por uno o varios objetos (entidades).

Las rutinas de AutoLISP permiten añadir o suprimir de forma interactiva objetos de los conjuntos deselección.

Page 8: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 8/68

 

4

2.6. Nombres de entidad

Un nombre de entidad es un identificador numérico asignado a los objetos de un dibujo. En realidad, setrata de un puntero a un archivo mantenido por AutoCAD, en el que AutoLISP puede encontrar el registro dela base de datos de objetos

A este identificador pueden hacer referencia las funciones de AutoLISP con el fin de permitir la selección

de objetos para un posterior empleo de maneras varias.

2.7. Descriptores de archivo

Los descriptores de archivo son identificadores alfanuméricos asignados a archivos abiertos porAutoLISP.

Cuando sea necesario que una función de AutoLISP lea o escriba en un archivo, debe hacersereferencia a su identificador.

2.8. Subrutinas

Es un símbolo con el nombre de una función predefinida por Autolisp. Pueden ser:

- Internas, cuando pertenecen al conjunto base de Autolisp, incluidas las definidas por el usuario.- Externas, las que se han definido mediante otras aplicaciones ligadas a Autocad.

Page 9: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 9/68

 

5

3. EXPRESIONES DE AUTOLISP

Las instrucciones contenidas en una rutina LISP se ejecutan secuencialmente; trabajan unas sobre lorealizado por otras, los resultados de las instrucciones anteriores son usadas para llevar a cabo lasinstrucciones subsiguientes.

Todas las expresiones de AutoLISP tienen, básicamente, el siguiente formato:

(función argumentos )

Cada expresión comienza con un paréntesis abierto y se compone de un nombre de función seguido deuna lista ordenada de argumentos para dicha función, cada uno de los cuales puede constituir unaexpresión por sí mismo. La expresión termina con un paréntesis cerrado.

Cada expresión devuelve un valor que puede ser empleado por una expresión circundante (Anidacionde expresiones); en caso de que no haya ninguna, AutoLISP devuelve el valor a la línea de comando deAutoCAD.

Por ejemplo, el siguiente código incluye tres funciones.

(fun1 (fun2 argumentos)(fun3 argumentos)) 

La primera función, fun1, tiene dos argumentos, mientras que las otras dos, fun2  y fun3 , tienen unargumento cada una. Las funciones fun2 y fun3 están delimitadas por la función fun1, por lo que sus valorespasan a fun1 como argumentos. La función fun1 evalúa estos dos argumentos y devuelve el valor a la líneade comando.

Si se escribe una expresión de AutoLISP en la solicitud de comando de AutoCAD, AutoLISP la evalúa ymuestra el resultado, tras lo cual vuelve a aparecer la solicitud de comando.

El siguiente ejemplo ilustra el uso de la función *(multiplicación), que acepta uno o más números realescomo argumentos.

Comando: (* 2 27)54

Dado que este ejemplo no tiene expresión circundante, devuelve el resultado a la línea de comando.

Las expresiones anidadas en otras expresiones devuelven sus resultados a la expresión circundante.

El siguiente ejemplo utiliza el resultado de la función + (suma) como uno de los argumentos de lafunción * (multiplicación).

Comando: (* 2 (+ 5 10) )30

El formato completo que estudiaremos para cada función Autolisp es el siguiente:

(función argumentos .....[ Argumentos opcionales... ] )

Los puntos suspensivos significan que el último argumento puede repetirse un número cualquiera deveces.

Cuando AutoCAD recibe algún código de AutoLISP, lo transmite al intérprete de AutoLISP, cuyo núcleocontiene el evaluador. El evaluador lee una línea de código, la evalúa y devuelve el resultado. El códigopuede leerse de un archivo o como datos tecleados por el usuario desde la línea de comando, pero encualquier caso deberá tener el formato de una expresión de AutoLISP. Al respecto, hay que decir que:

- Una expresión puede ser más larga que una línea.

- Varios espacios en blanco se interpretan como uno sólo.- Una línea que se inició con ; no es interpretada. Se trata de una línea de comentarios.- Se puede responder a las solicitudes de comando de AutoCAD con expresiones de AutoLISP.

Page 10: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 10/68

 

6

4. RECOMENDACIONES INICIALES PARA LA CODIFICACIÓN DE UNA RUTINA LISP

- Conocer la sintaxis y las reglas del lenguaje.- Saber de qué funciones dispone el lenguaje.- Describir exactamente cuál es el objeto de la rutina LISP. Los programadores se refieren a esta

versión de una rutina como pseudocódigo.- Recorrer el proceso manualmente desde el teclado, si es posible. Este procedimiento de verificación

a priori, ayudará a reconocer rápidamente los problemas en el proceso de desarrollo.- Tomar notas de cada paso.- Anotar qué cálculos tuvieron lugar y en qué figuras se basaron.- Escribir el código lo más ordenado posible, distinguiendo entre:

- Función principal (que será la que se invoca al utilizar el programa). Suele incluir la definición deun nuevo comando Autocad.

- Funciones intermedias , según la estructura que el programar decida.

- Utilizar nombres de funciones y variables fácilmente identificables, limitando el empleo de estasúltimas a aquellas que sean estrictamente necesarias.

- Escribir líneas de comentarios.

- Utilizar funciones creadas en otros programas. Hacer Bibliotecas de funciones de usuario.- Sangrar el texto del código para facilitar la interpretación posterior.

Page 11: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 11/68

 

7

5. FUNCIONES AUTOLISP

Las funciones proporcionadas por el lenguaje se pueden clasificar de la siguiente manera:

FUNCIONES BÁSICAS

FUNCIONES ARITMÉTICAS, ...................................................................................................................8

FUNCIONES DE ASIGNACIÓN, .............................................................................................................12

FUNCIONES PARA MANEJAR CADENAS DE TEXTO, .............................................................. ......... 13

FUNCIONES PARA GESTIÓN DE LISTAS, ...........................................................................................15

FUNCIONES MONOLÍNEA, ............................................................ ........................................................ 20

FUNCIONES DE CONVERSIÓN Y TRANSFORMACIÓN, .......................................... ........................... 21

FUNCIONES DE RELACIÓN, ............................................................... .................................................. 24

FUNCIONES DE CONDICIÓN, ....................... ........................................................ ................................ 27

FUNCIONES PARA GESTIÓN DE CICLOS, .............................. ............................................................ 28

FUNCIÓN PARA CREAR FUNCIONES DE USUARIO, .........................................................................30

FUNCIONES GRÁFICAS, .................................................. ..................................................................... 31

FUNCIONES DE ENTRADA INTERACTIVA, ............... ................................................................ .......... 32

FUNCIONES PARA GESTIÓN DE FICHEROS, ................................ ..................................................... 39

FUNCIONES DE LECTURA Y ESCRITURA, .............................................................. ........................... 41

FUNCIONES DE ORDENACIÓN, ...........................................................................................................44

FUNCIONES DE CONTROL DE PANTALLA, ....................................................................... ................. 45

OTRAS FUNCIONES DE UTILIDAD, .................................................... ................................................. 46

FUNCIONES AVANZADAS

Page 12: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 12/68

 

8

5.1. FUNCIONES ARITMÉTICAS

+ Suma númerosSintaxis: (+ <n1> <n2> . . . )Valor retornado: Suma de todos los argumentos numéricos. Ningún argumento devuelve Nil

(+ 1 2) devuelve 3(+ 1 2 3 4.5) devuelve 10.5(+ 1 2 3 4.0) devuelve 10.0

- Sustrae n númerosSintaxis: (- <n1> <n2> . . . )Valor retornado: La diferencia entre el primer argumento y la suma de los restantes argumentos.Ningún argumento devuelve Nil

(- 50 40) devuelve 10(- 50 40.0) devuelve 10.0(- 50 40.0 2.5) devuelve 7.5

(- 8) devuelve -8

* Multiplica númerosSintaxis: (* <n1> <n2> . . . )Valor retornado: Producto de todos los argumentos numéricos. Ningún argumento devuelve Nil

(* 2 3) devuelve 6(* 2 3.0) devuelve 6.0(* 2 3 4.0) devuelve 24.0(* 3 -4.5) devuelve -13.5(* 3) devuelve 3

/  Divide númerosSintaxis: (/ <n1> <n2> . . . )Valor retornado: El cociente del primer argumento dividido por el producto de los demásargumentos.

(/ 100 2) devuelve 50(/ 100 2.0) devuelve 50.0(/ 100 20 2) devuelve 2(/ 100 20 2.0) devuelve 2.5(/ 4) devuelve 4(/ 1 2) devuelve 0(/ 4 (/ 1 2)) devuelve ERROR

(/ 4 (/ 1.0 2)) devuelve 8.0

∼ Devuelve el operador NOT binario (complemento de -1) del argumentoSintaxis: ( ∼ <entero>)Valor retornado = -1 - <entero>.

(~ 3) devuelve -4(~ 100) devuelve -101(~ -4) devuelve 3

Page 13: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 13/68

 

9

1+ Incrementa un número en unoSintaxis: (1+ <n> )Valor retornado = 1+n (entero o real según n sea entero o real.)

(1+ 5) devuelve 6(1+ -17.5) devuelve -16.5

1- Disminuye en uno un número.Sintaxis: (1- <n> )Valor retornado = n-1 (entero o real según n sea entero o real.)

(1- 5) devuelve 4(1- -17.5) devuelve -18.5

ABSConvierte un número a su valor absolutoSintaxis: (ABS <n> )

Valor retornado = el valor absoluto de n.(abs 100) devuelve 100(abs -100) devuelve 100(abs -99.25) devuelve 99.25

ATAN Calcula el arcotangenteSintaxis: (ATAN <n1> [n2]), donde los argumentos n1 y n2 se convierten en números reales antesde calcular el valor del arco tangente.Valor retornado = Arco tangente de n1/n2. Valor en radianes entre -π /2 y π /2.

(atan 0.5) devuelve 0.463648

(atan 1.0) devuelve 0.785398(atan -1.0) devuelve -0.785398(atan 2.0 3.0) devuelve 0.588003(atan 2.0 -3.0) devuelve 2.55359(atan 1.0 0.0) devuelve 1.5708(atan 1 2) devuelve 0.463648(atan (/ 1 2)) devuelve 0.0

COSCalcula el coseno de un ángulo expresado en radianesSintaxis: (COS <ang> )Valor retornado = El coseno de ang

(cos 0.0) devuelve 1.0(cos pi) devuelve -1.0(cos (/ pi 3)) devuelve 0.5

SIN Calcula el seno de un ángulo expresado en radianesSintaxis: (SIN <ang> )Valor retornado = El seno de ang

(sin 1.0) devuelve 0.841471(sin 0.0) devuelve 0.0(sin (/ pi 6)) devuelve 0.5

Page 14: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 14/68

 

10

EXP Calcula el antilogaritmo neperiano de un numeroSintaxis:(EXP <n> )Valor retornado: número real igual a en

(exp 1.0) devuelve 2.71828(exp 2.2) devuelve 9.02501

(exp -0.4) devuelve 0.67032EXPT 

Calcula el resultado de elevar un número a una potenciaSintaxis:(EXPT <base> <potencia>)Valor retornado: número real o entero

(expt 2 4) devuelve 16(expt 3.0 2.0) devuelve 9.0

GCDCalcula el máximo común denominador de dos enterosSintaxis: (GCD <n1> <n2>)

Valor retornado = El valor del máximo común denominador.(gcd 81 57) devuelve 3(gcd 12 20) devuelve 4

LOG Calcula el logaritmo neperiano de un número realSintaxis: (LOG <n> )Valor retornado = Un número real.

(log 4.5) devuelve 1.50408(log 1.22) devuelve 0.198851(log 2.718281) devuelve 1.0

MAXExtrae el mayor valor de una serie de númerosSintaxis: (MAX <n1> <n2> <n3>……..)Valor retornado = El mayor valor encontrado.

(max 4.07 -144) devuelve 4.07(max -88 19 5 2) devuelve 19(max 2.1 4 8) devuelve 8.0

MINExtrae el menor valor de una serie de númerosSintaxis: (MIN <n1> <n2> <n3>……..)

Valor retornado = El menor valor encontrado.

(min 683 -10.0) devuelve -10.0(min 73 2 48 5) devuelve 2(min 2 4 6.7) devuelve 2.0

MINUSP

Comprueba si un número es menor que 0Sintaxis: (MINUSP <n> )Valor retornado = T  si el argumento n es un número y es negativo y nil  en caso contrario.

(minusp -1) devuelve T

(minusp -4.293) devuelve T(minusp 830.2) devuelve nil

Page 15: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 15/68

 

11

REMCalcula el resto de la división entre dos númerosSintaxis: (REM <n1> <n2>)Valor retornado: El resto de dividir n1 entre n2.

(rem 42 12) devuelve 6(rem 12.0 16) devuelve 12.0

(rem 26 7) devuelve 5(rem 5 2) devuelve 1(rem 26 7 2) devuelve 1

SQRT Calcula la raíz cuadrada de un númeroSintaxis: (SQRT <n> )Valor retornado = Un número real, raíz cuadrada de n

(sqrt 4) devuelve 2.0(sqrt 2.0) devuelve 1.41421

ZEROP Comprueba si un número es 0Sintaxis: (ZEROP <elemento>)Valor retornado: T  si el elemento es 0 y nil  en caso contrario.

(zerop 0) devuelve T(zerop 0.0) devuelve T(zerop 0.0001) devuelve nil.

NUMBERP

Comprueba si la evaluación de una función es un númeroSintaxis: (NUMBERP <expresión>)Valor retornado: T  si la expresión evaluada es un numero y nil  en caso contrario.

(setq a 123 b 'a)(numberp 4) devuelve T(numberp 3.8348) devuelve T(numberp "Hola") devuelve nil(numberp a) devuelve T(numberp b) devuelve nil(numberp (eval b)) devuelve T

Page 16: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 16/68

 

12

5.2. FUNCIONES DE ASIGNACIÓN

SETQ

Liga el nombre de símbolos al valor de una expresiónSintaxis: (SETQ < Símbolo> <exp> < Símbolo> <exp>. . . . . . . .)Valor retornado: El devuelto por el último argumento de la función.

(setq a 5.0) devuelve 5.0 y define el símbolo (variable) a como 5.0.(setq b 123 c 4.7) devuelve 4.7 y define los símbolos (variables): b como

123 y c como 4.7(setq s "el") devuelve "el"(setq x '(a b)) devuelve (A B)

SETVAR

Cambia el valor de variables del sistema.Sintaxis: (SETVAR <"nombre de la variable"> <nuevo valor> )La variable del sistema no podrá ser sólo de lectura y el nuevo valor asignado será de los que el

sistema pueda aceptar.Valor retornado: El nuevo valor de la variable del sistema.

(setvar "blipmode" 0) Devuelve 0 y desactiva las marcas auxiliares.(setvar "pdmode" 34) Devuelve 34 y establece un tipo de punto(setvar "pellipse" 3) Error: AutoCAD rechazó la función

TYPE

Extrae el tipo de dato de un argumento.Sintaxis: (TYPE <elemento>)Valor retornado: El tipo de dato como una cadena en mayúsculas

REAL: numero enteroFILE: descriptor de ficheroSTR: cadenasINT: numero entero.SYM: símbolosLIST: listas y funciones de usuarioSUBR: funciones internasPICKSET Conjuntos de selecciónENAME Nombres de entidades..........

Los elementos que dan como resultado nil (como un símbolo no asignado) devuelven nil.

(setq a 123 r 3.45 s "Hola!" x '(a b c))(setq f (open "nombre" "r"))

entonces:

(type 'a) devuelve SYM(type a) devuelve INT(type f) devuelve FILE(type r) devuelve REAL(type s) devuelve STR(type x) devuelve LIST(type +) devuelve SUBR(type nil) devuelve nil

Page 17: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 17/68

 

13

5.3. FUNCIONES PARA MANEJAR CADENAS DE TEXTO

READ

Extrae datos de una cadena de caracteresSintaxis: (READ <"cadena">)Valor retornado: El primer ítem de una cadena de caracteres o la primera lista si la cadena contiene

listas.

STRCASE

Convierte los caracteres de una cadena a minúsculas o mayúsculasSintaxis: (STRCASE <"cadena"> [modo])

- conversión a minúsculas: modo /= nil - conversión a mayúsculas : modo = nil  o no se presenta.

Valor retornado: La cadena convertida.

(strcase "Ejemplo") devuelve "EJEMPLO"(strcase "Ejemplo" T) devuelve "ejemplo"

STRCAT

Empalma (concatena ) dos o más cadenasSintaxis: (STRCAT <"cadena1"> ["cadena2"]...........)Valor retornado: Una sola cadena empalmada.

(strcat "a" "cerca") devuelve "acerca"(strcat "a" "b" "c") devuelve "abc"(strcat "a" "" "c") devuelve "ac"

STRLEN

Cuenta los caracteres de una cadena

Sintaxis: (STRLEN <"cadena">........)Valor retornado: Un número entero.

Si se especifican varios argumentos cadena, la función devuelve la suma de las longitudes de todoslos argumentos. Si éstos se omiten o se escribe una cadena vacía, el resultado es 0 (cero).

(strlen "abcd") devuelve 4(strlen "ab") devuelve 2(strlen "uno" "dos" "tres") devuelve 10(strlen) devuelve 0(strlen "") devuelve 0

SUBSTR

Extrae una porción de una cadena de caracteres.Sintaxis: (SUBSTR <"cadena"> <inicio>[ long ])

inicio : número entero que indica la posición del primer carácter a extraer.long:  longitud de la subcadena a extraer ( si no se da proporciona la subcadena desde laposición inicial hasta el final)

Valor retornado: La subcadena extraída.

(substr "abcde" 2) devuelve "bcde"(substr "abcde" 2 1) devuelve "b"(substr "abcde" 3 2) devuelve "cd"(substr "abcde" 3 7) devuelve "cde"(substr "hola" 5) devuelve "" (cadena vacía)

Page 18: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 18/68

 

14

VL-PRINC-TO-STRINGDevuelve la representación en cadena de caracteres de cualquier objeto Lisp como si fuerapresentada mediante la función princ.Sintaxis: (VL-PRINC-TO-STRING <dato>)Valor retornado: Una cadena de caracteres que contiene la representación del dato tal y como lamostraría la función princ.

(vl-princ-to-string 120) devuelve ”120”(vl-princ-to-string 120.8) devuelve ”120.8”(vl-princ-to-string “abc”) devuelve ”abc”(vl-princ-to-string ‘(10 20)) devuelve ”(10 20)”

VL-LIST->STRINGConcatena los caracteres representados en una lista por sus códigos numéricos ASCII.Sintaxis: (VL-LIST->STRING ‘(entero … ) )Valor retornado: Una cadena formada por los caracteres cuyos códigos ASCII se incluyen en la listapasada como argumento.

((vl-list->string ‘(97 98 99 100) ) devuelve ”abcd”

VL- STRING->LISTConvierte una cadena de caracteres en una lista de los códigos numéricos ASCII correspondientes.Sintaxis: (VL-STRING->LIST <cadena>)Valor retornado: Una lista con los códigos ASCII correspondientes a los caracteres que integran lacadena.

((vl-string->list ”abcd” ) devuelve (97 98 99 100)

Page 19: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 19/68

 

15

5.4. FUNCIONES PARA GESTIÓN DE LISTAS

5.4.1. CREACIÓN DE LISTAS

LIST

Crea una lista a partir de un número de expresiones

Sintaxis: ( LIST <expresión>...........)Valor retornado: Una lista de los argumentos de la función.

(setq L1 (list 'a 'b 'c)) devuelve (A B C)(setq L2 (list 'a '(b c) 'd)) devuelve (A (B C) D)(setq L3 (list 3.9 6.7)) devuelve (3.9 6.7)(setq L3 '(3.9 6.7) equivale a (list 3.9 6.7)(setq a 10 b 20 c 30 L4_1 (list a b c)) devuelve (10 20 30)(setq La (list a) Lb (list b) Lc (list c) L4_2( La Lb Lc)) devuelve ((10)(20)(30))

Como alternativa a utilizar LIST, se puede indicar una lista de forma explícita con la función QUOTEsi la lista no contiene variables ni opciones sin definir. El carácter de comilla ( ' ) se define como lafunción QUOTE.

APPEND

Funde varias listas en unaSintaxis: (APPEND <lista>...........)Valor retornado: Una lista única.

(setq L5 (append '(a b) '(c d))) devuelve (A B C D)(setq L6 (append '((a)(b)) '((c)(d)))) devuelve ((A)(B)(C)(D))(setq L7 (append L3 L4_1)) devuelve (3.9 6.7 10 20 30)(setq L8 (append L4_2 L4_1) devuelve ((10) (20) (30) 10 20 30)(setq L9 (append La Lb Lc) devuelve (10 20 30)

CONS

Añade al principio de una lista como primer elemento una expresiónSintaxis: (CONS <expresión> <lista>)Valor retornado: La nueva lista.

(cons 'a '(b c d)) devuelve (A B C D)(cons '(a) '(b c d)) devuelve ((A) B C D)

La función CONS también acepta un átomo en lugar del argumento lista, en cuyo caso construyeuna estructura denominada pares punteados. En los pares punteados, AutoLISP incluye un puntoentre el primer y el segundo elemento. Un par punteado es un tipo especial de lista, por lo quealgunas funciones que utilizan listas normales no los aceptan como argumento.

(cons 'a 2) devuelve (A . 2)

LENGTH

Cuenta los elementos de una listaSintaxis: (LENGTH <lista>)Valor retornado: El número entero correspondiente.

(length '(a b c d)) devuelve 4(length '(a b (c d))) devuelve 3(length '()) devuelve 0

Page 20: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 20/68

 

16

5.4.2. EXTRACCIÓN DE ELEMENTOS DE UNA LISTA

CAR 

Extrae el primer elemento de una lista.Sintaxis: (CAR <lista>)Valor retornado: El primer elemento de la lista. Si lista está vacía, CAR devuelve nil.

(car '(a b c)) devuelve A(car '((a b) c)) devuelve (A B)(car '()) devuelve nil(car (cons 'a 2) devuelve a

CDR

Extrae una nueva lista donde están todos los elemento de la lista menos el primero.Sintaxis: (CDR <lista>)Valor retornado: la nueva lista. Si lista está vacía, CDR devuelve nil.

(cdr '(a b c)) devuelve (B C)

(cdr '((a b) c)) devuelve (C)(cdr '()) devuelve nil

Para obtener el segundo átomo de un par punteado, se puede utilizar la función CDR.

(cdr '(a . b)) devuelve B(cdr '(1 . "Texto")) devuelve "Texto"

FUNCIONES ANIDADES DE CAR Y CDR

AutoLISP permite concatenar las funciones CAR y CDR hasta en cuatro niveles. Las siguientes sonfunciones válidas.

CAAAAR CADAAR CDAAAR CDDAARCAAADR CADADR CDAADR CDDADRCAAAR CADAR CDAAR CDDARCAADAR CADDAR CDADAR CDDDARCAADDR CADDDR CDADDR CDDDDRCAADR CADDR CDADR CDDDR

CAAR CADR CDAR CDDR

Cada a representa una llamada a CAR y cada d representa una llamada a CDR. Por ejemplo:

(caar x) es equivalente a (car (car x))(caar L4_2) devuelve 10(cdar x) es equivalente a (cdr (car x))

(cadar x) es equivalente a (car (cdr (car x)))(cadr x) es equivalente a (car (cdr x))(cadr L4_2) devuelve (20)(cddr x) es equivalente a (cdr (cdr x))(caddr x) es equivalente a (car (cdr (cdr x)))

En AutoLISP, CADR suele utilizarse para obtener la coordenada Y de un punto 2D ó 3D (el segundoelemento de una lista de dos o tres números reales). De igual modo, CADDR puede utilizarse paraobtener la coordenada Z de un punto 3D. Por ejemplo, dadas las asignaciones:

(setq pt2 '(5.25 1.0)) un punto 2D(setq pt3 '(5.25 1.0 3.0)) un punto 3D(car pt2) devuelve 5.25

(cadr pt2) devuelve 1.0(caddr pt2) devuelve nil(car pt3) devuelve 5.25(cadr pt3) devuelve 1.0

Page 21: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 21/68

 

17

(caddr pt3) devuelve 3.0(car (cons 'a 2)) devuelve A(cdr (cons 'a 2)) devuelve 2

LAST

Extrae el último elemento de una listaSintaxis: (LAST <lista>)Valor retornado: el último elemento de la lista.

(last '(a b c d e)) devuelve E(last '(a b c (d e))) devuelve (D E)(last pt3 ) devuelve 3.0(last L4_2) devuelve (30)

NTH

Extrae un elemento de una lista a partir de especificar su posición en ella (pos)

Sintaxis: (NTH <pos> <lista>)Las posiciones dentro de la lista son numeradas de izquierda a derecha empezando por la posición0.Valor retornado: El elemento encontrado, o un nulo si no se encontró.

(nth 3 '(a b c d e)) devuelve D(nth 0 '(a b c d e)) devuelve A(nth 5 '(a b c d e)) devuelve nil(nth 0 L4_2) devuelve (10)(nth 0 (car L4_2)) devuelve 10

ASSOC

Localiza sublistas en una lista de asociaciones utilizando elemento  como palabra clave, y dondeéste puede ser cualquier expresión válida susceptible de aparecer como primer elemento de una delas sublistas.

Lista de asociaciones: ( (clave1 inf1) (clave2 inf2...) (clave3 inf3..)........)

Sintaxis: (ASSOC <elemento> <lista de asociaciones>)Valor retornado: La primera sublista encontrada. Si la clave no aparece devuelve nil 

(setq pieza '((nombre “CAJA”) (ancho 3) (largo 4.7263) (alto 5)))(assoc 'largo pieza) devuelve (largo 4.7263)(assoc 'peso pieza) devuelve nil

Las listas de asociaciones se suelen utilizar para almacenar los datos a los que puede accedermediante una clave. La función SUBST proporciona un medio apropiado para sustituir el valorasociado con una clave en una lista de asociaciones.

Page 22: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 22/68

 

18

5.4.3. MANIPULACIÓN DE LISTAS

MEMBER

Busca la primera aparición de una expresión en una lista y devuelve el resto de la lista a partir de laexpresión encontrada.Sintaxis: (MEMBER <expresión><lista>)

Valor retornado: una lista donde el primer elemento es la expresión encontrada y el resto, el resto dela lista hasta el final. Si no se encuentra la expresión devuelve nil  .

(member 'c '(a b c d e)) devuelve (C D E)(member 20 L4_1) devuelve (20 30)(member '(30) L4_2) devuelve ((30))(member 'q '(a b c d e)) devuelve nil

REVERSE

Invierte un listaSintaxis: (REVERSE <lista>)

Valor retornado: La lista con sus miembros en orden inverso.

(reverse '((a) b c)) devuelve (C B (A))

LISTP

Comprueba si un argumento es una listaSintaxis: (LISTP <expresión>)Valor retornado: T  si la expresión es una lista , nil  en caso contrario.

(listp L8) devuelve T(listp "hola") devuelve nil

SUBST

Busca en una lista un miembro especificado y sustituye cada aparición de éste por otro especificadoSintaxis: (SUBST <elemento nuevo> <elemento viejo> <lista>)Valor retornado: La lista modificada.

(setq ejemplo '(a b (c d) b))(subst 'qq 'b ejemplo) devuelve (A QQ (C D) QQ)(subst 'qq 'z ejemplo) devuelve (A B (C D) B)(subst 'qq '(c d) ejemplo) devuelve (A B QQ B)(subst '(qq rr) '(c d) ejemplo) devuelve (A B (QQ RR) B)

(subst '(qq rr) 'z ejemplo) devuelve (A B (C D) B)

Cuando se utiliza conjuntamente con assoc, subst proporciona una forma útil de sustituir el valorasociado a una clave de una lista de asociaciones.

(setq lista '((a 10) (b 20)(c 30))) devuelve ((a 10) (b 20)(c 30))

(setq sublvieja (assoc 'b lista)) define sublvieja como (b 20)sublnueva '(b 50)) define sublnueva como (b 50)

)

(setq lista (subst sublnueva sublvieja lista))devuelve ((a 10) (b 50)(c 30))

Page 23: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 23/68

 

19

FOREACH

Procesa uno a uno los elementos de una lista y evalúa cada expresión para cada uno de loselemento de la listaSintaxis: (FOREACH <nombre-var> <lista> <expresión>.........)

Nombre-var: variable  de memoria a la que FOREACH ligará secuencialmente los valores de lalista suministrada y que normalmente será usada en la expresión.

Valor retornado: El resultado de la última expresión evaluada.Avanza por la lista, asignando un nombre-var a cada elemento y evalúa cada expresión para todoslos elementos de la lista. Se pueden especificar tantas expresiones como se desee. La funciónFOREACH devuelve el resultado de la última expresión evaluada.

(setq pt1 (getpoint "\n¿pt1?:")pt2 (getpoint "\n¿pt2?:")pt3 (getpoint "\n¿pt3?:")listap (list pt1 pt2 pt3)

)(foreach pto listap

(command “_point” pto)

)equivale a dibujar una marca de punto en los puntos pt1 pt2 y pt3.

ATOM

Predicado que verifica si un elemento es un átomo, es decir, si no es una lista.Sintaxis: (ATOM <item>)Valor retornado: Nil si <item> es una lista; T en otro caso.

(setq a ‘(x y z)b 23)

(atom a) devuelve nil(atom b) devuelve T

Page 24: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 24/68

 

20

5.5. FUNCIONES MONOLÍNEA

APPLY

Devuelve el resultado de ejecutar la "función" tomando como argumentos los elementos de la"lista".Sintaxis: ( APPLY <función> <Lista> )

Valor retornado: El devuelto por el argumento de la función

(apply '+ '( 1 2 3 ) ) devuelve el resultado 1 + 2 + 3 = 6

(apply ' strcat '( "A" "B" "C" ) devuelve "ABC"

MAPCAR

Devuelve el resultado de ejecutar la "función" tomando como argumentos de función los elementossucesivos de "lista 1" ............."lista n"Sintaxis: ( MAPCAR <función> <lista 1> .................<lista n> )Valor retornado: una lista con las sucesivas soluciones.

(mapcar '+ ' (10 20 30 ) '( 4 3 2 ) ) devuelve la lista (14 23 32)

(mapcar '+ ' (1 2 3 4 ) '( 4 5 6 ) ) devuelve la lista (5 7 9)

(mapcar 'max ' (2 4 ) '( 7 -5 ) '( -8 20 ) devuelve la lista (7 20 )

(mapcar 'expt '( 1 2 3 ) '( 4 5 6 ) ) devuelve ( 14 25 36 )

(setq A 10 B 20 C 30)(mapcar '1+ (LIST A B C) devuelve la lista (11 21 31)

Ejemplo anterior:(setq L '( 1 2 3 4 5 6))(mapcar '1+ L) devuelve la lista (2 3 4 5 6 7)

LAMBDA

Define una función sin darle un nombre. El conjunto de expresiones se aplica sobre los argumentosSintaxis: ( LAMBDA < argumentos > < expresión >...............)Valor retornado: el resultado de la última evaluación.

Se suele utilizar combinada con APPLY y MAPCAR.

(apply '( lambda ( X Y Z ) (* X ( - Y Z ) ) ) ' ( 5 20 14 ) )devuelve 30.

(apply '( lambda ( X Y Z ) (+ X Y Z ) ) ' ( 1 2 3 4 ) )devuelve: Error: too many arguments .

(mapcar '( lambda ( X Y Z ) (* X ( - Y Z ) ) ) '( 5 6 ) '( 20 30 ) '(14 0 ) )devuelve ( 30 180 )

Page 25: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 25/68

 

21

5.6. FUNCIONES DE CONVERSIÓN Y TRANSFORMACIÓN

FIX

Convierte un número real en entero.Sintaxis: (FIX <numero real>)Valor retornado: El número entero que resulta de quitar los decimales al real.

(fix 3) devuelve 3(fix 3.7) devuelve 3

FLOAT

Convierte un número entero en real.Sintaxis: (FLOAT <numero entero>)Valor retornado: un numero real.

(float 3) devuelve 3.0(float 3.75) devuelve 3.75

ATOI

Convierte una cadena de caracteres en un número enteroSintaxis: (ATOI <cadena>)Valor retornado: un número entero.

(atoi "97") devuelve 97(atoi "3") devuelve 3(atoi "3.9") devuelve 3

Ejemplo de código que introduce puntos en una lista solicitando el punto por su posición en la lista.

(setq i 1 puntos nil)(while (setq dato (getpoint (strcat "\npunto" (itoa i) ":")))

(setq puntos (cons dato puntos)i (+ i 1)

))(setq puntos (reverse puntos)))

ATOF

Convierte una cadena de caracteres en un número realSintaxis: (ATOF <"cadena">)Valor retornado: un número real.

(atof "97.1") devuelve 97.1(atof "3") devuelve 3.0(atof "3.9") devuelve 3.9

ITOA

Convierte un entero en una cadena de caracteresSintaxis: (ITOA <entero>)Valor retornado: una cadena de caracteres.

(itoa 33) devuelve "33"

Page 26: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 26/68

 

22

RTOS

Convierte un número real en una cadena de caracteresSintaxis: (RTOS <número> [modo [precisión]])

numero : número real (o entero que tomará como real)modo (opcional): entero del 1 al 5 que determina el formato numérico de la cadena:

1. Unidades científicas

2. Unidades decimales3. Pies y pulgadas I (fracción decimal)4. Pies y pulgadas II (fracción propia)5. Unidades fraccionarias

precisión (opcional): entero que determina el número de decimales de precisión en la cadenaSi no se especifican los argumentos modo y precisión se asume el establecido por la variables deAutocad LUNITS y LUPRECValor retornado: Una cadena de caracteres

Ejemplos: (RTOS 5.6 1 4) => “5.6000 E+00" (RTOS 5.6 2 4) => “5.6000"(RTOS 5.6 5 4) => “5 5/8"

DISTOFConvierte un cadena en un número real, con un determinado formato de visualización.Sintaxis: (DISTOF <"cadena"> [ modo])

Cadena : cadena de caracteres que expresa un valor numérico.modo (opcional): entero del 1 al 5 que indica el formato numérico del número real expresado enla cadena (El código se corresponde con el dado en la función anterior), la función deberá sercapaz de interpretar el argumento cadena de acuerdo con el modo especificado:

Valor retornado: Un número real

ANGTOS

Convierte un número (que representa un ángulo en radianes) en una cadena de caracteresSintaxis: (ANGTOS <ángulo> [modo [precisión]])angulo : valor del ángulo en radianes.modo (opcional): entero del 0 al 4 que determina el formato numérico en la cadena:

0. Grados sexagesimales.1. Grados, minutos y segundos2. Grados centesimales.3. Radianes4. Unidades geodésicas.

precisión (opcional): entero que determina el número de decimales de precisión en la cadena.Si no se especifican los argumentos modo y precisión se asume el establecido por la variables deAutocad LUNITS y LUPRECValor retornado: Una cadena de caracteres.

Ejemplos: (ANGTOS 3.1416 0) => “180" (ANGTOS 3.1416 2) => “200g"

ANGTOF

Convierte una cadena de caracteres en un número real que representa un ánguloSintaxis: (ANGTOF <"cadena"> [ modo])

Cadena : cadena de caracteres que expresa un valor numérico de ángulomodo (opcional): entero del 0 al 4 que indica el formato numérico del ángulo expresado en lacadena (El código se corresponde con el dado en la función anterior), la función deberá sercapaz de interpretar el argumento de la cadena de acuerdo con el modo especificado.Si no se especifica el argumento modo se asume el establecido por la variable de Autocad

LUNITSValor retornado: Un valor correspondiente al numérico de un ángulo en radianes.

Ejemplos: (ANGTOF “180" 0) => 3.1416 (ANGTOF “200" 2) => 3.1416

Page 27: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 27/68

 

23

ASCII

Convierte el primer carácter de una cadena de caracteres a su código ASCIISintaxis: (ASCII <"cadena">)Valor retornado: Un entero que representa el código ASCII

(ascii "A") devuelve 65

(ascii "a") devuelve 97(ascii "GRANDE") devuelve 66

CHR

Convierte un número entero que representa un carácter ASCII en la cadena de un sólo caráctercorrespondienteSintaxis: (CHR <entero>)Valor retornado: una cadena de un sólo carácter.

(chr 65) devuelve "A"(chr 66) devuelve "B"(chr 97) devuelve "a"

READ

Extrae datos de una cadena de caracteresSintaxis: (READ <"cadena">)Valor retornado: El primer ítem de una cadena de caracteres o la primera lista si la cadena contienelistas.

(read “hola a todos”) hola(read “( 20 30 40)”) (20 30 40)(read "\"Hola a todos\"") devuelve la cadena "Hola a todos"(read "(a b c) (d)") devuelve la lista (A B C)(read "1.2300") devuelve el número real 1.23

(read "87 3.2") devuelve el entero 87

TRANS

Transforma las coordenadas de un punto de un sistema de coordenadas a otro.Sintaxis: (TRANS <lista de punto o desplazamiento> <codvie> < codnue> [desp] ).

codvie : código que expresa el sistema de coordenadas en el cual se expresa el punto.conue : código que expresa el sistema de coordenadas en el cual se quiere expresar el punto

0. SCU1. SCP2. SCV (visualización)3. SCV espacio papel

desp : si es distinto de nil  entiende el primer argumento como un desplazamiento.

Valor retornado: Una lista de punto con sus coordenadas transformadas.

CVUNIT

Convierte un número o lista de números de una unidad de medida a otra (Las cadenas querepresentan unidades de medida válidas en esta función están almacenadas en el ficheroACAD.UNT)Sintaxis: (CVUNIT <nº o lista> <cadvie> <cadnue>)

cadvie: cadena de unidad de medida vieja.cadvie : cadena de unidad de medida nueva.

Valor retornado: Un número o lista de números convertida a la unidad de medida nueva.

(cvunit 1 "minuto" "segundo") devuelve 60.0

(cvunit 1.0 "pulgada" "cm") devuelve 2.54(cvunit 1.0 "acre" "yarda cuadrada ") devuelve 4840.0(cvunit '(1.0 2.5) "pie" "pulgada") devuelve (12.0 30.0)(cvunit '(1 2 3) "pie" "pulgada") devuelve (12.0 24.0 36.0)

Page 28: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 28/68

 

24

5.7. FUNCIONES DE RELACIÓN

=Comprueba la igualdad numéricaSintaxis: (= <átomo> <átomo> <átomo>……….)Valor retornado: T  si todos los argumentos (números o cadenas de caracteres) se evalúan comoiguales numéricamente, Nil  en caso contrario.

Las cadenas son comparadas en esta función y en las siguientes en base a su valor numérico ASCII

(= 4 4.0) devuelve T(= 20 388) devuelve nil(= 2.4 2.4 2.4) devuelve T(= 499 499 500) devuelve nil(= "yo" "yo") devuelve T(= "yo" "tú") devuelve nil

/=Comprueba la desigualdad numérica

Sintaxis: (/= <átomo> <átomo>)Valor retornado: T  si los dos argumentos (números o cadenas de caracteres) no se evalúan comoiguales numéricamente, Nil  en caso contrario

(/= 10 20) devuelve T(/= "tú" "tú") devuelve nil(/= 5.43 5.44) devuelve T(/= 10 20) devuelve T

<Comprueba la relación “menor que” entre los argumentosSintaxis: (< <átomo> <átomo> <átomo>……….)

Valor retornado: T  si cada argumento es numéricamente menor que el argumento de su derecha y  Nil  en caso contrario.

(< 10 20) devuelve T(< "b" "c") devuelve T(< 357 33.2) devuelve nil(< 2 3 88) devuelve T(< 2 3 4 4) devuelve nil

> Comprueba la relación “mayor que” entre los argumentosSintaxis: (> <átomo> <átomo> <átomo>……….)

Valor retornado: T  si cada argumento es numéricamente mayor que el argumento de su derecha y Nil  en caso contrario

(> 120 17) devuelve T(> "c" "b") devuelve T(> 3.5 1792) devuelve nil(> 77 4 2) devuelve T(> 77 4 4) devuelve nil(> “Pablo” “pablo”) devuelve nil

Page 29: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 29/68

 

25

<= Comprueba la relación “menor o igual que” entre los argumentosSintaxis: (<= <átomo> <átomo> <átomo>……….)Valor retornado: T  si cada argumento es numéricamente menor o igual que el argumento de suderecha y Nil  en caso contrario.

(<= 10 20) devuelve T

(<= "b" "b") devuelve T(<= 357 33.2) devuelve nil(<= 2 9 9) devuelve T(<= 2 9 4 5) devuelve nil

>= Comprueba la relación “mayor o igual que” entre los argumentosSintaxis: (>= <átomo> <átomo> <átomo>……….)Valor retornado: T  si cada argumento es numéricamente mayor o igual que el argumento de suderecha y Nil  en caso contrario.

(>= 120 17) devuelve T

(>= "c" "c") devuelve T(>= 3.5 1792) devuelve nil(>= 77 4 4) devuelve T(>= 77 4 9) devuelve nil

ANDComprueba los valores de una serie de expresiones. (Y lógico)Sintaxis: (AND <exp> <exp> <exp>……….)Valor retornado: T  si todos los argumentos se evalúan con un valor no nulo y Nil  en casocontrario.

(and 1.4 2 "hola") devuelve T

(and 1.4 ( = 3 4)) devuelve nil

ORComprueba de izquierda a derecha una serie de expresiones hasta hallar la primera que se evalúacon un valor no nulo. (O lógico)Sintaxis: (OR <exp> <exp> <exp>……….)Valor retornado: T  si alguno de los argumentos se evalúa con un valor no nulo y Nil  en casocontrario.

(or 1.4 2 "hola") devuelve T(or 1.4 ( = 3 4)) devuelve T(or nil 45 ) devuelve T

(or nil (= 3 4)) devuelve nil

NOTModifica el sentido de un predicado: lo que es cierto lo hace falso, y viceversa.Sintaxis: (NOT <exp> )Valor retornado: devuelve T si su argumento es falso y Nil si es cierto.

(not nil) devuelve T(not (= 3 4)) devuelve T(not (= 4 4)) devuelve nil

Page 30: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 30/68

 

26

EQ Comprueba si los valores atribuidos a ambas expresiones son idénticasSintaxis: (EQ <exp> <exp> )Valor retornado: T  si las dos expresiones están ligadas a los mismos datos y Nil  en otro caso.

(setq f1 '(a b c))(setq f2 '(a b c))

(setq f3 f2)entonces:

(eq f1 f3) devuelve nil, f1 y f3 no son la misma lista(eq f3 f2) devuelve T, f3 y f2 son exactamente la misma lista

EQUALComprueba si dos expresiones se evalúan con valores igualesSintaxis: (EQUAL <exp> <exp> [margen de error] )Valor retornado: T  si las dos expresiones se evalúan igual y Nil  en caso contrario.

Si las dos expresiones son números reales se puede incluir un margen de error.

(setq f1 '(a b c))(setq f2 '(a b c))(setq f3 f2)(setq a 1.123456)(setq b 1.123457)

entonces:

(equal f1 f3) devuelve T(equal f3 f2) devuelve T(equal a b) devuelve nil(equal a b 0.000001) devuelve T

=Comprueba la igualdad numéricaSintaxis: (= <átomo> <átomo> <átomo>……….)Valor retornado: T  si todos los argumentos (números o cadenas de caracteres) se evalúan comoiguales numéricamente Nil  en caso contrario.

Las cadenas son comparadas en esta función y en las siguientes en base a su valor numéricoASCII.

(= 4 4.0) devuelve T(= 20 388) devuelve nil(= 2.4 2.4 2.4) devuelve T

(= 499 499 500) devuelve nil(= "yo" "yo") devuelve T(= "yo" "tú") devuelve nil

Uso de las funciones anteriores en línea de comandos: 

Comando: (setq a 2 b 2)2Comando: (= a b)TComando: (eq a b)T

Comando: (equal a b)T

Page 31: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 31/68

 

27

5.8. FUNCIONES DE CONDICIÓN

COND

Lee una serie de listas. Evalúa el primer elemento de cada lista (en el orden indicado) hasta que unode ellos devuelva un valor distinto de nil. A continuación, evalúa las expresiones que siguen a este

elemento y pasa por alto las restantes listas.

Sintaxis: (COND <lista1> <lista2>………..)Valor retornado: El retornado por la última expresión de la lista evaluada. Si no se evalúa ningunalista, la función COND devuelve Nil 

(cond((< a 20) (setq b (cons 'a a)))((> a 20) (setq b (list 'a a)))(t (setq b "b=20"))

)

en los casos:a = 10 => b = (a . 10) la variable b se evalúa como un par punteadoa = 25 => b = (a 25) la variable b se evalúa como una listaa = 20 => b = "b=20" la variable b se evalúa como un string

Como se muestra, COND se puede utilizar como una función de tipo case. Es habitual utilizar Tcomo última (por defecto) expresión de prueba.

Dada una cadena de respuesta de usuario en la variable s, esta función prueba la respuesta ydevuelve 1 si es Y o y, 0 si es N o n y nil en cualquier otro caso.

(cond((= s "Y") 1) ((= s "y") 1)

((= s "N") 0) ((= s "n") 0)(t nil))

IF

Evalúa una expresión Autolisp basándose en si una expresión de comprobación inicial se evalúacomo no nulaSintaxis: (IF <test> <expresión si test es /= nil  > [expresión si test es = nil  ] )Valor retornado: El valor retornado por expresión evaluada; nil en otro caso.

(if (= 1 3) "¡¡SÍ!!" "no.") devuelve "no."(if (= 2 (+ 1 1)) "¡¡SÍ!!") devuelve "¡¡SÍ!!"

(if (= 2 (+ 3 4)) "¡¡SÍ!!") devuelve nil

PROGN

Evalúa secuencialmente una serie de expresiones.Sintaxis: (PROGN <exp1> <exp2> ……………)Valor retornado: La última expresión evaluada.

Se puede utilizar PROGN para calcular varias expresiones cuando sólo se espera una expresión.

(if (= a b)(progn

(princ "\nA = B ")

(setq a (+ a 10) b (- b 10))))

Page 32: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 32/68

 

28

5.9. FUNCIONES PARA GESTIÓN DE CICLOS

REPEAT

Evalúa repetidamente una serie de una o más expresiones Autolisp un número determinado deveces.Sintaxis: (REPEAT<n> <exp1> <exp2> ……………)

n: Entero que indica el nº de repeticiones a realizar.Valor retornado: El resultado de la última expresión evaluada

(setq a 10 b 100)(repeat 4

(setq a (+ a 10))(setq b (+ b 100))

) Define a como 50, b como 500 y devuelve 500

(setq L '( 1 2 3 4 5 6)n (length L) i 0 Ln nil

)(repeat n(setq elem (nth i L)elem (1+ elem)Ln (cons elem ln)i (1+ i))

)(setq L (reverse Ln)) Devuelve la lista (2 3 4 5 6 7)

(setq L '( 1 2 3 4 5 6)n (length L) Ln nil

)(repeat n(setq elem (car L)

L (cdr L)elem (1+ elem)Ln (cons elem ln)

))(setq L (reverse Ln)) Devuelve la lista (2 3 4 5 6 7)

(setq pt1 (getpoint "\n¿pt1?:")pt2 (getpoint "\n¿pt2?:")

pt3 (getpoint "\n¿pt3?:")listap (list pt1 pt2 pt3)n (length listap)

)(Command "_pline")(repeat n

(setq pt (car listap ) listap (cdr listap))(command pt)

)(command "") Equivale a dibujar una polilínea que pasa por los puntos

pt1 pt2 y pt3

Page 33: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 33/68

 

29

WHILE

Evalúa repetidamente una serie de una o más expresiones Autolisp basándose en si una expresiónde comprobación inicial se evalúa como un valor nulo o no nulo.Sintaxis: (WHILE <test> <exp1> <exp2> ……………)

Test : Expresión de comprobación, que hace que las demás expresiones se evalúen mientrasésta se mantenga distinta de Nil  .

Valor retornado: El resultado de la última expresión evaluada(setq a 10 )(While (< a 100)

(setq a (+ a 10))) Define a como 90.

(setq L '( 1 2 3 4 5 6) i 0 Ln nil )(While (setq elem (nth i L))

(setq elem (1+ elem)Ln (cons elem ln)i (1+ i)

)

)(setq L (reverse Ln)) Devuelve la lista (2 3 4 5 6 7)

(setq L '( 1 2 3 4 5 6) Ln nil )(While (setq elem (car L) )(setq L (cdr L)

elem (1+ elem)Ln (cons elem ln)

..... ))(setq L (reverse Ln)) Devuelve la lista (2 3 4 5 6 7)

(setq pt1 (getpoint "\n¿pt1?:")pt2 (getpoint "\n¿pt2?:")pt3 (getpoint "\n¿pt3?:")listap (list pt1 pt2 pt3)

)(Command "_pline")(While (setq pt (car listap ))

(setq listap (cdr listap)))(command pt)

)(command "") Equivale a dibujar una polilínea que pasa por los puntos

pt1 pt2 y pt3.

(setq L '( 1 2 3 4 5 6) Ln nil)(foreach n L (setq Ln (cons (+ 1 n) Ln)))

(setq l (reverse ln))) Devuelve la lista (2 3 4 5 6 7)

(setq pt1 (getpoint "\n¿pt1?:") pt2 (getpoint "\n¿pt2?:") pt3 (getpoint "\n¿pt3?:")listap (list pt1 pt2 pt3)

)(command "_pline")(foreach punto listap (command punto))(command "") Equivale a dibujar una polilínea que pasa por los puntos

pt1 pt2 y pt3.

Page 34: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 34/68

 

30

5.10. FUNCIÓN PARA CREAR FUNCIONES DE USUARIO

DEFUN

Define una nueva función Autolisp o una orden o comando AutocadSintaxis (DEFUN <nombre> <( [lista-argumentos][ / símbolos locales])> [expr] ...)

Nombre:  el nombre de la función o de la orden que se está creando. Si es una orden o

comando Autocad el nombre será: c:xxx 

Lista-argumentos: una lista con los argumentos, que puede estar seguida por una barra oblicuay los nombres de uno o más símbolos locales para la función.Argumentos: variables que toman valor en la llamada a la función

Símbolos locales: variables que sólo tienen valor en la función que se define.

La barra oblicua debe ir separada del primer símbolo local y del último argumento, si existe, porun espacio como mínimo. Si no se declara ningún argumento ni símbolo local, se debe escribirun conjunto vacío de paréntesis tras el nombre de la función.

Los siguientes ejemplos de lista-argumentos muestran valores válidos y no válidos:

(defun mifunc (x y) ...) La función toma dos argumentos(defun mifunc (/ a b) ...) La función tiene dos símbolos locales(defun mifunc (x / temp) ...) Un argumento, un símbolo local(defun mifunc () ...) Ningún argumento ni símbolo local

Expr : Expresiones que se ejecutan en la función y que utilizan como variables:- Los argumentos de la función.- Las variables locales que tienen que tomar valor en la función y lo pierden al ejecutarse lamisma.- Las variables globales definidas, bien en esta función, bien en otras y que por no habersido definidas como locales en ninguna función tienen valor en todo el programa.

Valor retornado: La función DEFUN devuelve el nombre de la función que se va a definir. Al invocaresta función, sus argumentos se evalúan y se asocian a los símbolos correspondientes. La funcióndevuelve el resultado de la última expresión evaluada.

(DEFUN SUMA_10 (x)(+ 10 x)

) devuelve SUMA10

(SUMA_10 5) devuelve 15

(SUMA_10 -7.4) devuelve 2.6

(defun puntos (x y / temp)(setq temp (strcat x "..."))(strcat temp y)

) devuelve PUNTOS

(puntos "a" "b") devuelve "a...b"(puntos "de" "a") devuelve "de...a"(eval temp) devuelve nil

Advertencia: No se debe utilizar nunca el nombre de una función interna o un símbolo como nombrede función creada por el usuario, ya que quedaría inaccesible.

Page 35: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 35/68

 

31

5.11. FUNCIONES GRÁFICAS

ANGLE

Calcula el ángulo que formaría una recta definida por dos puntos con la dirección positiva del eje Xdel SCP actual (si los puntos son 3D se proyectan sobre el plano de construcción actual)Sintaxis: ( ANGLE <pt1> <pt2>)

Valor retornado: Un ángulo en radianes

(angle '(1.0 1.0) '(1.0 4.0)) devuelve 1.5708(angle '(5.0 1.33) '(2.4 1.33) devuelves 3.14159

DISTANCE 

Calcula la distancia entre dos puntosSintaxis: ( DISTANCE <pt1> <pt2>)Valor retornado: Un número real, que es la distancia en unidades de dibujo entre los dos puntossuministrados como argumentos.

Si al menos uno de los puntos facilitados es un punto 2D, DISTANCE no toma en cuenta las

coordenadas Z de los puntos 3D especificados, y devuelve la distancia 2D entre los puntos,proyectada sobre el plano de construcción actual.

(distance '(1.0 2.5 3.0) '(7.7 2.5 3.0)) devuelve 6.7(distance '(1.0 2.0 0.5) '(3.0 4.0 0.5)) devuelve 2.82843

POLAR

Computa un punto en relación a un punto dado.Sintaxis: ( POLAR <pt> <ang> <dis>)Valor retornado: Las coordenadas de un punto situado en el ángulo “ang” (radianes) y a unadistancia “dis” del punto “pt” todo ello con relación al SCP actual. El ángulo siempre se refiere alplano de construcción actual.

(polar '(1 1 3.5) 0.785398 1.414214) devuelve (2.0 2.0 3.5)(polar ‘(1 1) (/ pi 2) 3) devuelve (1.0 4.0)

INTERS

Calcula el punto de intersección entre dos líneasSintaxis: ( INTERS <pt1> <pt2> <pt3> <pt4> [extend])Valor retornado: Un punto que indica el punto de intersección de la línea definida por pt1 y pt2 y lalínea definida por pt3 y pt4, si no se encuentra ningún punto de intersección la función retorna un nil .

Extend:  Si extend  se evalúa como nil  las líneas se prolongan hasta encontrar el punto deintersección, en caso contrario o si no se codifica, sólo se busca la intersección en la longitudde los segmentos definidos por los puntos.

Todos los puntos se expresan respecto al SCP actual. Si los cuatro argumentos de puntos son 3D,inters busca una intersección 3D. Si hay algún punto 2D, inters proyecta las líneas sobre el plano deconstrucción actual y sólo busca una intersección 2D.

(setq a '(1.0 1.0) b '(9.0 9.0))(setq c '(4.0 1.0) d '(4.0 2.0))(inters a b c d) devuelve nil(inters a b c d T) devuelve nil(inters a b c d nil) devuelve (4.0 4.0)

Page 36: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 36/68

 

32

5.12. FUNCIONES DE ENTRADA INTERACTIVA

GETPOINT

Detiene la ejecución del programa para que el usuario introduzca un punto.Sintaxis: (GETPOINT [pt] [mensaje])

pt : punto de base opcional

mensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,en el momento de la solicitud del puntoValor retornado: El punto introducido, como una lista de números reales.

El usuario no puede escribir otra expresión AutoLISP como respuesta a una petición GETDIST.

(setq p (getpoint))(setq p (getpoint "¿Dónde? "))(setq p (getpoint '(10 20)) respuesta :@40,20 valor retornado: (50.0 40.0 0.0)

GETDIST

Detiene la ejecución del programa para que el usuario introduzca una distanciaSintaxis: (GETDIST [pt] [mensaje])

pt : punto de base opcionalmensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,en el momento de la solicitud de la distancia

Valor retornado: Un número real.

El usuario no puede escribir otra expresión AutoLISP como respuesta a una petición GETDIST.

(setq dist (getdist))(setq dist (getdist '(1.0 3.5)))(setq dist (getdist "¿A qué distancia? "))(setq dist (getdist '(1.0 3.5) "¿A qué distancia? "))

GETANGLE

Detiene la ejecución del programa para que el usuario introduzca un ángulo.Sintaxis: (GETANGLE [pt] [mensaje])

pt : punto de base opcionalmensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,en el momento de la solicitud del ángulo

Valor retornado: El valor del ángulo en radianes.

La función GETANGLE mide los ángulos a partir de cero radianes (definidos mediante la variable desistema ANGBASE) aumentando en dirección opuesta a las agujas del reloj. El ángulo resultante seexpresa en radianes con respecto al plano de construcción actual (el plano XY del SCP actual, conla elevación actual).

El usuario no puede escribir otra expresión AutoLISP como respuesta a una petición GETANGLE.

Para especificar un ángulo, el usuario debe escribir un número en el formato actual de unidadesangulares de AutoCAD. Aunque este formato puede utilizar grados, grados centesimales o cualquierotra unidad, esta función siempre devuelve el ángulo en radianes. El usuario también puededesignar dos posiciones 2D en la pantalla gráfica para indicar el ángulo a AutoLISP. AutoCAD dibujauna línea elástica desde el primer punto hasta la posición del cursor en cruz con el fin de facilitar alusuario la visualización del ángulo.

Page 37: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 37/68

 

33

Es importante comprender la diferencia entre el ángulo indicado y el que devuelve GETANGLE. Losángulos que se transmiten a GETANGLE se basan en los valores actuales de ANGDIR yANGBASE. Sin embargo, una vez que se especifica el ángulo, éste se mide en dirección opuesta alas agujas del reloj (sin tomar en cuenta el valor de ANGDIR), con cero radianes como valor actualde ANGBASE. Los siguientes ejemplos de código muestran cómo se pueden utilizar diferentesargumentos.

(setq ang (getangle))(setq ang (getangle '(1.0 3.5)))(setq ang (getangle "¿Hacia dónde? "))(setq ang (getangle '(1.0 3.5) "¿Hacia dónde? "))

GETORIENT

Detiene la ejecución del programa para que el usuario introduzca un ángulo.Sintaxis: (GETORIENT [pt] [mensaje])

pt : punto de base opcionalmensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,en el momento de la solicitud del ángulo

Valor retornado: El valor del ángulo en radianes .Esta función se asemeja a GETANGLE, con la

diferencia de que el valor de ángulo devuelto porGETORIENT no se ve afectado por las variables desistema ANGBASE y ANGDIR. Sin embargo, laintroducción del ángulo por parte del usuario todavía sebasa en los parámetros actuales de ANGDIR y ANGBASE.

.La función GETORIENT mide los ángulos con una

dirección de cero radianes hacia la derecha (este) y losángulos que se incrementan en sentido contrario a lasagujas del reloj. Al igual que con GETANGLE,

GETORIENT expresa el ángulo resultante en radianes,respecto al plano de construcción actual. Los ángulos quese transmiten a GETORIENT se basan en los valoresactuales de ANGDIR Y ANGBASE. Sin embargo, una vezproporcionado el ángulo, éste se mide en sentido contrarioa las agujas del reloj, con cero radianes a la derecha(ANGDIR y ANGBASE se ignoran). Por ello, si seleccionaotra base de cero grados u otra dirección para los ángulosque se incrementan, se debe utilizar el comandoUNIDADES o las variables de sistema ANGBASE yANGDIR para realizar la conversión necesaria.

Se recomienda el uso de GETANGLE para obtener un valor de rotación (un ángulo relativo). Y de

GETORIENT para obtener una orientación (un ángulo absoluto).

GETCORNER

Detiene la ejecución del programa para que el usuario introduzca un punto, y traza un rectángulo de“banda elástica” en la pantalla a medida que el usuario mueve el dispositivo señaladorSintaxis: (GETCORNER <pt> [mensaje])

pt : Primera esquina del rectángulo.mensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,en el momento de la solicitud de la otra esquina.

Valor retornado: El punto introducido por el usuario

Page 38: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 38/68

 

34

GETVAR

Extrae un valor almacenado en una variable del sistema de AutoCADSintaxis: (GETVAR <"nombre de variable">)Valor retornado: valor de la variable del sistema especificada.

(getvar "pdmode") Devuelve el valor actual para el tipo de punto

(getvar "area") Devuelve el valor del último área calculada por Autocad(getvar "perimeter") Devuelve el valor del último perímetro calculado porAutocad.

GETINT

Detiene la ejecución del programa para que el usuario introduzca un número entero.Sintaxis: (GETINT [mensaje])

mensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,en el momento de la solicitud del entero

Valor retornado: El entero introducido por el usuario.

El rango de valores pasados a GETINT puede ir de -32,768 a +32,767.El usuario no puede escribir otra expresión de AutoLISP como respuesta a una petición de GETINT.

(setq num (getint))(setq num (getint "Escriba un número: "))

GETREAL

Detiene la ejecución del programa para que el usuario introduzca un número realSintaxis: (GETREAL [mensaje])

mensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,en el momento de la solicitud del número real

Valor retornado: El real introducido por el usuario.

(setq val (getreal))(setq val (getreal "Factor de escala: "))

GETSTRING

Detiene la ejecución del programa para que el usuario introduzca una cadena de caracteresSintaxis: (GETSTRING [espacio] [mensaje])

Espacio: Si este argumento es distinto de nil la cadena introducida puede contener espacios enblanco. (y debe finalizarse con RETURN ). mensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,

en el momento de la solicitud de la cadenaValor retornado: La cadena introducida entrecomillada o una cadena vacía (“”) si el usuario pulsóEnter sin teclear caracteres.

Si tiene más de 132 caracteres, la cadena sólo devuelve estos caracteres. Si contiene el carácter decontrabarra (\), éste se convierte en dos caracteres de contrabarra (\\). De esta manera, el valorresultante puede incluir caminos de nombre de archivo a los que tienen acceso otras funciones.

(setq s (getstring "Escriba su nombre ")) Si se responde Juan se define s como "Juan"

(setq s (getstring T "Escriba su nombre completo: ")) Si responde Juan Díaz Pérez se definecomo "Juan Díaz Pérez"

(setq s (getstring "Nombre de archivo: ")) Si responde \acad\midibuj se define como"\\acad\\midibuj"

Page 39: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 39/68

 

35

GETKWORD

Detiene la ejecución del programa para que el usuario introduzca una cadena de caracteres. Estafunción comprueba la validez de lo introducido basándose en una lista de palabras válidasestablecidas usando la función INIGETSintaxis: (GETKWORD [mensaje])

mensaje : cadena opcional que será presentada en el área de órdenes/peticiones de la pantalla,

en el momento de la solicitud de la cadena.Valor retornado: La cadena introducida o Nil  si el usuario pulsó Enter sin teclear caracteresAutoCAD lo intenta de nuevo si la entrada no es una palabra clave. Si se trata de una entrada nula (RETURN ), GETKWORD devuelve nil (siempre que se admitan entradas nulas). Esta funcióntambién devuelve nil si antes no se ha realizado una llamada a INITGET que establezca una ovarias palabras clave.

El ejemplo siguiente muestra una llamada inicial a initget que define una lista de palabras clave (Sí yNo) y no admite entradas nulas (valor en bits igual a 1) en la siguiente llamada a getkword:

(initget 1 "Sí No")(setq x (getkword "¿Seguro? (Sí o No) "))

Este mensaje solicita datos del usuario y define el símbolo x como Sí o No, según la respuestaproporcionada. Si ésta no coincide con ninguna de las palabras clave o el usuario escribe un valornulo, AutoCAD vuelve a mostrar la cadena indicada en el argumento solicitud. Si no se especificaeste argumento, AutoCAD muestra lo siguiente:

Inténtelo de nuevo:

INITGET

Establece las palabras clave que han de usarse con la siguiente llamada a una función introducidapor el usuario. Las funciones que toman en consideración las palabras clave son getint, getreal,getdist, getangle, getorient, getpoint, getcorner, getkword, entsel, nentsel y nentselp. La función

getstring es la única función introducida por el usuario que no las admite.Sintaxis: (INITGET [bits] [cadena])Bits: El argumento bits es un número entero binario que admite o rechaza determinados tiposde datos de usuario. Algunos de los valores que puede tomar junto a su significado asociado:

1: no permite nulos2: no permite cero4: no permite negativos8: no chequea límites del dibujo64: devuelve una distancia 2D, en lugar de 3D.

Cadena : El argumento cadena define una lista de palabras clave.Valor retornado: La función initget siempre devuelve nil.

Para más información sobre la función se recomienda consultar el manual de personalización de

Autocad

Page 40: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 40/68

 

36

GETFILED

Presenta un cuadro de dialogo de nombres de archivos y espera una entrada de usuario.Sintaxis: (GETFILED <"dialogo"> <"nombre de Fichero por defecto" o ""> <"extensión" o "" (para. *)><parámetros>)Parámetros:

dialogo determina el nombre del cuadro de diálogo,

nombre de Fichero por defecto especifica el nombre de archivo que se va a utilizar por defectoextensión es la extensión por defecto del nombre del archivo. Si extensión se transmite comouna cadena nula [""], utiliza por defecto * (para todos los tipos).parámetros es un valor entero (un campo codificado en bits) que controla el funcionamiento delcuadro de diálogo. Para definir varias condiciones simultáneamente, se añaden los valores enconjunto y se crea un indicador con un número comprendido entre el 0 y el 15.

Valor del indicador = 1 (bit 0): Se define este bit para solicitar el nombre del archivo que se va acrear. No debe utilizarse para solicitar el nombre de un archivo existente con el fin de abrirlo. Eneste último caso, si el usuario introduce el nombre de un archivo que no existe, el cuadro de diálogomuestra un mensaje de error en la parte inferior. Si se define este bit y el usuario elige un archivoexistente, AutoCAD presenta una casilla de advertencia y ofrece la posibilidad de seguir o cancelarla operación.

Valor del indicador = 2 (bit 1): Desactiva el botón Teclearlo. Este bit se define si se llama a la funciónGETFILED mientras otro cuadro de diálogo está activo (en caso contrario, obliga a cerrar el otrocuadro de diálogo).Si no se define este bit, se activa el botón Teclearlo. Cuando el usuarioselecciona el botón, el cuadro de diálogo desaparece y GETFILED devuelve 1.

Valor del indicador = 4 (bit 2): Permite al usuario escribir una extensión de nombre de archivoarbitraria o bien no escribir ninguna. Si no se define este bit, GETFILED sólo acepta la extensiónespecificada en el argumento ext, y si el usuario no la escribe en la casilla de texto File, la añade alnombre del archivo.

Valor del indicador = 8 (bit 3):  Si se define este bit y no se define el bit 0, GETFILED inicia en labiblioteca una búsqueda del nombre de archivo escrito. Si encuentra el archivo y el directorio en el

orden de búsqueda en la estructura, descompone el camino y sólo devuelve el nombre del archivo.Esto no ocurre si los archivos que se buscan tienen el mismo nombre pero se encuentran endistintos directorios.

Si no se define este bit, GETFILED devuelve el nombre completo del archivo, incluido el nombre delcamino. Se define este bit si se utiliza el cuadro de diálogo para abrir un archivo existente cuyonombre desea guardar en el dibujo (u otra base de datos).

Si el usuario especifica un nombre de archivo en el cuadro de diálogo, GETFILED devuelve unacadena que corresponde al nombre del archivo, en caso contrario, devuelve nil.

La siguiente llamada a getfiled presenta el cuadro de diálogo Seleccionar un archivo Lisp:

(getfiled "Seleccionar un archivo Lisp" "/acadr14/support/" "lsp" 8)

La función GETFILED muestra uncuadro de diálogo con una lista queincluye todos los archivos con laextensión especificada que estándisponibles. Puede utilizar este cuadrode diálogo para buscar por los distintosdirectorios y unidades, seleccionar unarchivo existente o especificar el nombrede uno nuevo.

Page 41: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 41/68

 

37

COMMAND 

Ejecuta órdenes AutocadSintaxis: (COMMAND <"nombre de la orden"> [argumentos válidos].....)Valor retornado: nil 

Los argumentos de la función command pueden ser cadenas, números reales, números enteros o

puntos, según solicite la secuencia de mensajes del comando ejecutado. Una cadena nula ("")equivale a pulsar RETURN en el teclado.La función command sin argumentos equivale a pulsar ESC y cancela la mayoría de los comandosde AutoCAD.La función command devuelve nil.La función command evalúa los distintos argumentos y los envía a AutoCAD cada vez que apareceun mensaje que los solicita. Presenta como cadenas los nombres de los comandos y las opciones,como listas de dos números reales los puntos 2D y como listas de tres números reales los puntos3D.

(setq pt1 '(1 1) pt2 '(1 5))(command "linea" pt1 pt2 "")

(setq p1 '(10 20) p2 '(45 60) d 40)(command "linea" p1 p2 "" "circulo" p1 "d" d )

Se ejecuta:

Comando: lineaDesde el punto: p1Al punto:p2Al punto: ""Comando: circulo 3P/2P/TTR/<centro>:p1Diámetro/<Radio> <10>: dDiámetro <20>: 40Comando: nil

Si el programa lisp se va a utilizar con versiones de AutoCAD para idiomas extranjeros, los nombresde los comandos deben ir precedidos de un subrayado ( _ ), para que puedan traducirse.

Los comandos que se ejecutan mediante la función command no se reproducen en la línea decomando si la variable de sistema CMDECHO está definida como cero. (setvar "CMDECHO" 0).

Las funciones indicadas por el usuario getxxx (getangle, getstring, getint, getpoint, etc.) no sepueden utilizar dentro de la función command.

Los comandos TEXTODIN y BOCETO de AutoCAD leen desde el teclado y el digitalizadordirectamente, por lo que no se pueden utilizar con la función command de AutoLISP.

Se crea un grupo DESHACER explícitamente alrededor de cada comando utilizado con la funcióncommand. Si un usuario escribe H (o DESHACER) después de ejecutar una rutina de AutoLISP,sólo se deshará el último comando. Si se introduce DESHACER más veces, se retrocederá por loscomandos utilizados en dicha rutina. Si se desea que un grupo de comandos se considere un grupo(o toda la rutina), se utilizan las opciones Inicio y Fin de DESHACER.

Si un comando de AutoCAD está activo y el símbolo PAUSE se encuentra predefinido como unargumento de la función command, esta función se interrumpirá para que el usuario pueda escribirinformación.

Ejemplo ejecutado a nivel de línea de comandos:Comando: (setq centro '(10 20))(10 20)

Comando: (command "circulo" centro PAUSE "linea" centro PAUSE "")circulo 3P/2P/TTR/<centro>: Diámetro/<Radio>:Comando: linea Desde el punto:Al punto:

Page 42: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 42/68

 

38

OSNAP

Aplica a un punto un modo de referencia AutocadSintaxis: (OSNAP <pt> <”modo”>)Valor retornado: Una lista de punto resultante del modo de referenciar objetos que se esté aplicandoal argumento pt.

El funcionamiento de esta orden depende del valor de la variable del sistema “APERTURE“ y delpunto de vista 3D actual.

(osnap p5 "int") devuelve nil(osnap p7 "fin") devuelve nil

Cambiando la variable APERTURE:

(osnap p5 "int") devuelve nil(osnap p7 "fin") devuelve p4

Page 43: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 43/68

 

39

5.13. FUNCIONES PARA GESTIÓN DE FICHEROS

LOAD

Carga un archivo Autolisp en la memoria y evalúa las expresiones en el archivo.Sintaxis: (LOAD <"nombre del fichero"> [si falla] )

nombre de fichero : cadena de caracteres con el nombre, sin extensión .lsp, del fichero. Si no se

indica ningún camino se busca el fichero según el camino de acceso a bibliotecas Autocad. .Una barra oblicua (/) o dos contrabarras (\\) son delimitadores de directorio válidos.

Si falla : valor vuelto por la función en el caso de que la carga del fichero fracase. Si no seproporciona este argumento, la función presenta un mensaje de error AutoLISPValor retornado: El de la última expresión evaluada, si la carga es buena.

Los ficheros que se quiere sean cargados al iniciarse la sesión del editor de dibujo tendrán que estarespecificados en el fichero ACAD.LSP que Autocad carga automáticamente.

Estudiar este ejemplo después de ver la función DEFUN

(defun MI-FUNC1 (x) ...cuerpo de la función...)

(defun MI-FUNC2 (x) ...cuerpo de la función. )

y el archivo prueba2.lsp no existe, entonces:

(load "/luis/prueba1") devuelve MI-FUNC2(load "\\luis\\prueba1") devuelve MI-FUNC2(load "/luis/prueba1" "mal") devuelve MI-FUNC2(load "prueba2" "mal") devuelve "mal"(load "prueba2") produce un error de AutoLISP

Cuando un programa define varias funciones deben estar todas codificadas en un único fichero quese cargará con la función LOAD.

OPEN

Abre un archivo de disco para leer o almacenar datosSintaxis: (OPEN <"nombre de fichero"> <"clave de acceso">)

El argumento nombre de fichero  es una cadena que especifica el nombre y la extensión delarchivo que debe abrirse.clave de acceso : cadena de una letra minúscula, es la etiqueta de lectura/escritura y debecontener una cadena de una sola letra en minúsculas. En la tabla siguiente se describen lasletras de modo válidas.

"r": Abre un fichero para lectura"w": Abre un fichero para escritura"a": Abre un fichero para escribir añadiendo nuevos datos al final del mismo. Sitúa elpuntero al final del fichero abierto.2 

Valor retornado: El descriptor de fichero utilizado por las funciones de Entrada/Salida a fichero, portanto se deberá atribuir a un símbolo que permita referirse a ese descriptor.

(setq a (open "archivo.ext" "r"))

Si se tiene en cuenta que los archivos de los ejemplos siguientes no existen,(setq f (open "nueva.tst" "w")) devuelve <Archivo #nnn>(setq f (open "noesta.ahi" "r")) devuelve nil(setq f (open "registro" "a")) devuelve <Archivo #nnn>

2 Nota En sistemas DOS, algunos programas y editores de texto escriben los archivos de texto con una marca de fin de

archivo (CTRL Z, código ASCII decimal 26) al final del texto. Cuando lee un archivo de texto, el DOS devuelve unestado de fin de archivo si encuentra una marca CTRL Z, aunque a ésta le sigan más datos. Si va a utilizar el modo "a"de OPEN para añadir datos a archivos creados en otros programas, cerciórese de que éstos no insertan marcas CTRLZ al final de sus archivos de texto.

Page 44: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 44/68

 

40

El argumento nombre de fichero  puede incluir un prefijo de directorio. En los sistemas DOS esposible usar una letra de unidad y una contrabarra (\) en lugar de una barra oblicua (/), aunque nodebe olvidarse que en una cadena es necesario especificar dos contrabarras (\\) para obtener una.

(setq f (open "/x/nueva.tst" "w")) devuelve <Archivo #nnn>(setq f (open "\\x\\nueva.tst" "w")) devuelve <Archivo #nnn>

CLOSE

Cierra un archivo abiertoSintaxis: (CLOSE <símbolo correspondiente al descriptor de fichero>)

El argumento símbolo correspondiente al descriptor de fichero es un descriptor de archivo quese obtiene mediante la función OPEN. Tras utilizar la función CLOSE, aunque el descriptor defichero no cambia, deja de ser válido. Los datos añadidos a un archivo abierto no se escribenrealmente hasta que se cierra el archivo.

Valor retornado: nil si descriptor_archivo es válido, en caso contrario devuelve un mensaje de error.

Por ejemplo, el siguiente código calcula el número de líneas del archivo unarchivo.txt y define lavariable ct en ese número.

(setq fil "UNARCHIVO.TXT")(setq x (open fil "r") ct 0)(while (read-line x)

(setq ct (1+ ct)))(close x)

FINDFILE

Localiza un archivo en la ruta de búsqueda de archivos de AutocadSintaxis: (FINDFILE <"nombre_archivo">)

Valor retornado: una cadena de caracteres con el nombre completo del archivo indicando la ruta delocalización.

La función FINDFILE no asigna el tipo o extensión del archivo especificado en nombre_archivo . Sinombre_archivo  no especifica un prefijo de unidad/directorio en este argumento, FINDFILE buscaen el camino de la biblioteca de AutoCAD. Si se escribe un prefijo de unidad/directorio, FINDFILEbusca en dicho directorio. La función FINDFILE siempre devuelve un nombre completo deunidad/directorio/archivo o nil si el archivo especificado no se ha encontrado.

El nombre completo que devuelve FINDFILE puede utilizarse con la función OPEN.

Si el directorio actual es /acad y contiene el archivo abc.lsp.

(findfile "abc.lsp") devuelve "/acad/abc.lsp"

Si se está editando un dibujo en el directorio /acad/drawings, la variable de entorno ACAD se definecomo /acad/support, y el archivo xyz.txt sólo existe en el directorio/acad/support.

(findfile "xyz.txt") devuelve "/acad/support/xyz.txt"

Si ninguno de los directorios del camino de búsqueda de la biblioteca contiene el archivo no esta.

(findfile "noesta") devuelve nil

Page 45: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 45/68

 

41

5.14. FUNCIONES DE LECTURA Y ESCRITURA

5.14.1. ESCRITURA

PRIN1

Imprime una expresión AutoLISP en el área de órdenes o la escribe en un archivo abierto en modo

de escritura.Sintaxis: (PRIN1 [expresión] [descriptor de fichero])Valor retornado: el argumento de la expresión.Es posible llamar a la función prin1 sin argumentos, en cuyo caso devuelve (e imprime) la cadenanula.

(setq a 123 b '(a))(prin1 'a) imprime A y devuelve A(prin1 a) imprime 123 y devuelve 123(prin1 b) imprime (A) y devuelve (A)(prin1 "Hola") imprime "Hola" y devuelve "Hola"

Los ejemplos anteriores aparecen en pantalla porque no se ha especificado un descriptor de

archivos con descriptor_archivo. Si se tiene en cuenta que f es un descriptor válido para un archivoabierto para escritura,

(prin1 "Hola" f) escribirá "Hola" en el archivo indicado y devolverá "Hola".

PRINC

Imprime una expresión AutoLISP en el área de órdenes o la escribe en un archivo. (La diferenciacon PRIN1 es que PRINC evalúa los caracteres de control que aparezcan en la expresión.).Sintaxis: (PRINC [expresión] [descriptor de fichero])Valor retornado: el argumento de la expresión.

PRINT

Imprime un salto de línea, una expresión AutoLISP y un espacio en el área de órdenes o lo escribeen un archivo.Sintaxis: (PRINT [expresión] [descriptor de fichero])Valor retornado: el argumento de la expresión

PROMPT

Presenta una cadena de caracteres en el área de órdenes. (Evalúa caracteres de control)Sintaxis: (PROMPT <”cadena”>)Valor retornado: nilEn las configuraciones de pantalla dual de AutoCAD, PROMPT muestra la cadena en ambaspantallas, por lo que resulta más útil princ.

(prompt "Nuevo valor: " ) muestra Nuevo valor: en la(s) pantalla(s)

WRITE-CHAR

Escribe un solo carácter en el área de órdenes o bien en un fichero abierto.Sintaxis: (WRITE-CHAR <num> [descriptor de fichero])El argumento núm es el código ASCII decimal del carácter que debe escribirse.Valor retornado: El código ASCII para los caracteres escritos.

(write-char 67) devuelve 67 y escribe la letra C en la pantalla.

Si se tiene en cuenta que f es el descriptor de un archivo abierto,(write-char 67 f) devuelve 67 y escribe la letra C en ese archivo.

Page 46: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 46/68

 

42

WRITE-LINE

Escribe una cadena de caracteres en al área de órdenes o bien en un archivo (evalúa caracteres decontrol.Sintaxis: (WRITE-LINE <”cadena”> [descriptor de fichero])Valor retornado: La cadena de caracteres.

(write-line "Prueba" f) escribe Prueba y devuelve "Prueba"

TERPRI

Imprime un salto de línea en el área de órdenes.Sintaxis: (TERPRI)Valor retornado: nil

5.14.2. LECTURA

READ-CHAR

Lee caracteres procedentes del bufer del teclado o de un archivo abierto en modo de lectura.Sintaxis: (READ-CHAR [descriptor de fichero])Valor retornado: El código ASCII para el carácter leído.

Por ejemplo, si se tiene en cuenta que el búfer de entradas por teclado está vacío,

(read-char)

espera a que se escriban datos. Si introduce los caracteres ABC seguidos de RETURN, read-chardevuelve 65 (el código ASCII decimal correspondiente a la letra A). Las tres llamadas siguientes aread-char devuelven 66, 67 y 10 (línea nueva), respectivamente. Si se efectúa otra llamada, read-

char vuelve a esperar a que se escriban datos.

READ- LINE

Lee una cadena de caracteres procedentes del bufer del teclado o de un archivo abierto en modo delectura.Sintaxis: (READ-LINE [descriptor de fichero])Valor retornado: la cadena leída. (Cuando se alcanza el final de un archivo de lectura el valorretornado es nil )

Por ejemplo, si tiene en cuenta que f es un puntero de archivo abierto válido,

(read-line f)

devuelve la siguiente línea de entrada del archivo, o nil si ha llegado al final del archivo.

Page 47: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 47/68

 

43

Ejemplo ejecutado a nivel de línea de órdenes de Autocad:

(SETQ A 10 B “HOLA”)“HOLA”

(PRIN1 A)1010

(PRIN1 “\nCASA”)“\nCASA”“\nCASA”

(PRINC A)1010

(PRINC “\nCASA”)“CASA“\nCASA”

(PRINT A)10 10

(PRINT “\nCASA”)“\nCASA” “\nCASA”

(PROMPT “\nCASA”)CASAnil 

(WRITE-CHAR A)10

(WRITE-CHAR 67)C67

(WRITE-LINE B)

HOLA“HOLA”

(WRITE-LINE “\nCASA”)CASA“CASA”

Page 48: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 48/68

 

44

5.15. FUNCIONES DE ORDENACIÓN

ACAD_STRLSORT

Ordena alfabéticamente listas de cadenas de caracteresSintaxis: (ACAD_STRLSORT lista)

Valor retornado: La lista con las cadenas ordenadas alfabéticamente. Si la lista no contiene cadenaso no hay memoria suficiente para realizar la ordenación, la función devuelve NIL.

(setq mes '("ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov" "dic"))

(acad_strlsort mes) devuelve:("abr" "ago" "dic" "ene" "feb" "jul" "jun" "mar" "may" "nov" "oct" "sep")

VL-SORT

Ordena todos los elementos de una lista de acuerdo con una función de comparación dada. En

determinados casos puede eliminar los objetos duplicados.Sintaxis: (VL-SORT lista función)Puede emplearse como función de comparación cualquiera que acepte dos argumentos y devuelvaT (u otro valor distinto de Nil) cuando el primer argumento precede al segundo conforme al criteriode ordenación.Valor retornado: La lista con los elementos de la lista original ordenados, aunque no se garantiza laconservación de todos los elementos originales (elimina las cadena y los enteros duplicados).

(vl-sort '(9.0 9.0 1 7 3 7 88) '<) ) devuelve: (1 3 7 9.0 9.0 88)

VL-SORT-I

Ordena todos los elementos de una lista de acuerdo con una función de comparación dada, ydevuelve sus índices. No elimina duplicados.Sintaxis: (VL-SORT-I lista función)Puede emplearse como función de comparación cualquiera que acepte dos argumentos y devuelvaT (u otro valor distinto de Nil) cuando el primer argumento precede al segundo conforme al criteriode ordenación.Valor retornado: Una lista que contiene los índices de los elementos de la lista, ordenados conformeal criterio establecido por la función de comparación.

(vl-sort-i '("a" "d" "f" "c") '>) devuelve: (2 1 3 0)

El orden en la lista ordenada sería: "f" "d" "c" "a"; donde "f" es el tercer elemento (índice 2) en la listaoriginal, "d" es el segundo elemento (índice 1) en la lista, y así sucesivamente.

(vl-sort-i '(9.0 9.0 1 7 3 7 88) '<) ) devuelve: (2 4 5 3 1 0 6)

Los índices se pueden emplear para recuperar mediante la función NTH los valores originales.

(defun ordena-lista (lista funcion)

(mapcar ‘(lambda (x) (nth x lista)) (vl-sort-i lista funcion))

)

(ordena-lista '(9.0 9.0 1 7 3 7 88) '<) devuelve: (1 3 7 7 9.0 9.0 88)

Page 49: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 49/68

 

45

5.16. FUNCIONES DE CONTROL DE PANTALLA

REDRAW

Redibuja la pantalla de presentación (o las entidades especificadas)Sintaxis: (REDRAW ) (sintaxis simplificada para el redibujado de la pantalla)

Valor retornado: Nil 

GRAPHSCR

Fuerza la presentación de pantalla gráfica en sistema de pantalla única.Sintaxis: (GRAPHSCR)Valor retornado: nulo

TEXTSCR

Presenta la pantalla texto en sistemas de pantalla única

Sintaxis: (TEXTSCR)Valor retornado: nulo

TEXTPAGE

Presenta la pantalla texto en sistemas de pantalla única y la limpiaSintaxis: (TEXTPAGE)Valor retornado: nulo

VPORTS

Extrae los números de identificación de las ventanas gráficasSintaxis: (VPORTS)Valor retornado: Una lista de sublistas donde los elementos de cada sublista son:

1. El número de identificación de cada ventana gráfica.2. Coordenadas de la esquina inferior izquierda (coordenadas normalizadas).3. Coordenadas de las esquina superior derecha..

Page 50: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 50/68

 

46

5.17. OTRAS FUNCIONES DE UTILIDAD

EVAL

Evalúa expresionesSintaxis:(EVAL <expresión>)Valor retornado: El valor retornado por la expresión evaluada

En la línea de órdenes la abreviatura es el signo !

(setq a 123)(setq b 'a)

entonces:

(eval 4.0) devuelve 4.0(eval (abs -10)) devuelve 10(eval a) devuelve 123(eval b) devuelve 123

QUOTE 

Procesa una instrucción sin evaluarlaSintaxis:(QUOTE <expresión>)Valor retornado: La expresión sin evaluarla

La sintaxis alternativa es el apóstrofo. No puede usarse en el indicador COMMAND.

(quote a) devuelve A(quote cat) devuelve CAT(quote (a b)) devuelve (A B)'a devuelve A

'cat devuelve CAT'(a b) devuelve (A B)

Los tres últimos ejemplos no tienen efecto si se introducen directamente desde el teclado comorespuesta a un mensaje de AutoCAD.

NULL

Comprueba si una expresión se evalúa como nuloSintaxis: (NULL <expresión>)Valor retornado: T  si la expresión evaluada es nulo y nil  en caso contrario.

(setq a 123 b "cadena" c nil)(null a) devuelve nil(null b) devuelve nil(null c) devuelve T(null ' ) devuelve T

QUIT

Fuerza a la rutina actual a abandonar el procesamiento.Sintaxis: (QUIT)Valor retornado: El mensaje “”quit/exit abort”” (abandonar/salir abortar)

Page 51: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 51/68

 

47

TEXTBOX 

Mide un objeto de texto designado y devuelve las coordenadas diagonales del cuadro donde estácontenido el textoSintaxis: (TEXTBOX <lista_e>)

lista_e : es una lista de definición de entidad en la forma devuelta por ENTGET y debe definir unobjeto de texto. Debe definir un objeto de texto. Si en lista_e se omiten los campos que definen

parámetros de texto distintos del texto en sí, se utilizan los valores actuales (por defecto).Valor retornado: Si textbox se ejecuta satisfactoriamente, devuelve una lista de dos puntos, en casocontrario devuelve nil.Lo mínimo que TEXTBOX acepta como lista es el texto en sí.

(textbox '((1 . "Hola mundo."))) puede devolver ((0.0 0.0 0.0) (0.8 0.2 0.0))

Page 52: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 52/68

 

48

6. FUNCIONES AVANZADAS DE PROGRAMACIÓN AUTOLISP

6.1. OBJETIVOS Y ENTORNO DE LA PROGRAMACIÓN AutoLISP

LISP BÁSICO: El objetivo ha sido la incorporación de ALTAS en la base de datos geométrica. La granlimitación consiste, por consiguiente, en plantear MODIFICACIONES.

LISP AVANZADO:  Resuelve el problema anterior proporcionando formas de conexión con elmetaarchivo de información gráfica.

6.2. CONCEPTOS BÁSICOS

Conjunto designado: Conjunto de entidades designado, bien, interactivamente, bien,automáticamente y retenido como una variable en la corriente del programa.

Nombre de entidad: clave alfanumérica asociada a cada entidad del dibujo en el formato interno.(puntero capaz de producir una lectura en la base de datos del dibujo)

<Nombre de objeto: 3c50500> Registro de entidad: Información relativa a la entidad estructurada como una lista de asociaciones

que utilizan como claves los códigos estudiados para la estructura interna en el formato DXF.

Definición de una línea en formato DXF 

0LINE

520

100AcDbEntity

8 0100

AcDbLine10

112.18650620131.211019

300.0

11233.335573

21

229.387734310.0 

 

Registro de la entidad línea utilizado por Autolisp 

((-1 . <Nombre de objeto: 3c50500>) (0 . "LINE") (5 . "20")

(100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine")

(10 112.187 131.211 0.0) (11 233.336 229.388 0.0) (210 0.0 0.0 1.0))

Page 53: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 53/68

 

49

6.3. FORMA DE TRABAJO Y FUNCIONES UTILIZADAS

- Creación del conjunto designado:

(SETQ)Creación interactiva: SSGET

Creación automática: SSGET "X" filtrosModos de designación de Autocad

- Obtención de los nombres de entidad.

(SETQ)SSLENGTHSSNAMESSMEMBSSADDSSDEL

- Obtención del registro de entidad.

(SETQ) ENGET

- Gestión de subentidades (entidades compuestas)

Polilíneas => VérticesBloques con atributos => Atributos

(SETQ)ENTLASTENTNEXT

ENTSELENTDEL

- Manipulación del registro de entidad:

ASSOCCONSSUBSTÓrdenes relacionadas con la manipulación de listas

- Creación de una nueva entidad:

ENTMAKE

- Modificación de la información del registro y regeneración del dibujo:

ENTMODENTUPD (entidades compuestas).

Page 54: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 54/68

 

50

6.4. DESCRIPCIÓN DE LAS FUNCIONES

SSGET

Solicita al usuario que designe objetos (entidades) y devuelve un conjunto de selección (un punteroa la información del conjunto).Sintaxis: (SSGET [modo] [pt1 [pt2]] [lista_pt] [lista_filtros])

Modo : es una cadena que especifica el método de designación de objetos. Los modos válidosson "_W", "_WP", "_C", "_CP", "_L", "_P", "_I" y "_F", que corresponden a los métodos dedesignación Ventana, PolígonoV, Captura, PolígonoC, Ultimo, Previo, Implícito y Borde.Otro valor optativo de modo es "X", que selecciona toda la base de datos.

pt1 y pt2 : especifican puntos relevantes para la designación. Introducir un punto sin ningúnargumento modo equivale a seleccionar un objeto designando un solo punto.

Lista_pt : especifican puntos relevantes para la designación para los casos en que seanecesario.

lista_filtros : es una lista de asociaciones que especifica propiedades de objeto. Los objetos que

coinciden con la lista_filtros se añaden al conjunto de selección.

Si se omiten todos los argumentos, SSGET muestra la solicitud Designar objetos para que elconjunto de selección pueda construirse de forma interactiva.Valor retornado: un conjunto de selección (un puntero a la información del conjunto)

Los conjuntos de selección pueden contener objetos de los espacios papel y modelo, pero cuandoel conjunto se utiliza en una operación, los objetos del espacio no activo se descartan. Losconjuntos de selección devueltos por SSGET sólo contienen entidades principales (ningún atributoni vértice de polilínea).

Ejemplos de uso de SSGET

(ssget):Solicita al usuario que realice una designación general de objetos y los incluye en un conjuntode selección

(ssget "_P"):Crea un conjunto de selección con los últimos Objetos seleccionados

(ssget "_L"):Crea un conjunto de selección con los últimos objetos visibles añadidos a la base de datos

(ssget '(2 2)):Crea un conjunto de selección con un objeto que pasa por el punto (2,2)

(ssget "_W" '(0 0) '(5 5)):Crea un conjunto de selección con los objetos incluidos en la ventana desde (0,0) hasta (5,5).

(ssget "_C" '(0 0) '(1 1)):Crea un conjunto de selección con los objetos que pasan por el rectángulo de (0,0) a (1,1)

(ssget "X"):Crea un conjunto de selección con todos los objetos de la base de datos

(ssget "X" lista_filtros):Analiza la base de datos y crea un conjunto de selección de objetos que coinciden con lalista_filtros.

(ssget lista_filtros ):Solicita al usuario que realice una selección general de objetos y coloca sólo los objetos quecoinciden con y los Incluye en un conjunto de selección

(ssget "_P" lista_filtros):Crea un conjunto de selección con los últimos objetos seleccionados que coinciden con lalista_filtros

Page 55: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 55/68

 

51

Los siguientes ejemplos de ssget requieren que se suministre una lista de puntos a la función. Lavariable lista_pt no puede contener puntos que definan segmentos con longitud cero.

(setq lista_pt '((1 1)(3 1)(5 2)(2 4)) )(ssget "_WP" lista_pt):

Crea un conjunto de selección con todos los objetos incluidos en el polígono definido porlista_pt

(ssget "_CP" lista_pt):Crea un conjunto de selección con todos los objetos que pasan por el polígono y los que estándentro definidos por lista_pt

(ssget "_F" lista_pt):Crea un conjunto de selección con todos los objetos que intersecan el borde definido porlista_pt

(ssget "_WP" lista_pt lista_filtros):Crea un conjunto de selección con todos los objetos dentro del polígono definido por lista_ptque coinciden con la lista_filtros

AutoLISP no permite manejar más de 128 conjuntos abiertos a la vez. Si se alcanza este límite,AutoCAD se niega a crear más conjuntos de selección y devuelve nil a todas las llamadas SSGET.

SSLENGTH

Devuelve el número entero correspondiente al número de entidades del conjunto designadoindicado.Sintaxis: ( SSLENGTH < conjunto designado> )Valor retornado: Un número entero.

(setq cs (ssget "U")) Coloca el último objeto en el conjunto de selección cs(sslength cs) devuelve 1

SSNAME

Devuelve el nombre de entidad de la entidad perteneciente al conjunto designado indicado y queocupa la posición que especifica el índice.Sintaxis: ( SSNAME < conjunto designado> < índice> )

El argumento índice debe ser un número entero. Si es negativo o mayor que la entidad con elnúmero más alto del conjunto de selección, el resultado es nil.El primer elemento del conjunto tiene un índice definido como cero.

Valor retornado: El nombre de la entidad (Un puntero a la información de la entidad)

(setq cs (ssget)) Crea un conjunto de selección llamado cs(setq ent1 (ssname cs 0)) Obtiene el nombre de la primera entidad de cs(setq ent1 (ssname cs 3)) Obtiene el nombre de la cuarta entidad de cs

SSMEMB

Comprueba si un objeto (entidad) forma parte de un conjunto de selecciónSintaxis: (SSMEMB <nombre_ent> < cs>)Valor retornado: Si la entidad forma parte del conjunto, SSMEMB devuelve su nombre(nombre_ent ). En caso contrario, devuelve nil.

Por ejemplo, si la entidad e1 pertenece al conjunto de selección cs1 pero e2 no, entonces

(ssmemb e1 cs1) devuelve el nombre de entidad e1(ssmemb e2 cs1) devuelve nil

Page 56: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 56/68

 

52

SSADD

Añade un objeto (entidad) a un conjunto de selección o crea un conjunto de selección nuevoSintaxis: (SSADD [nombre_ent [cs]])

Si se llama a SSADD sin argumentos, la función construye un nuevo conjunto de selección sinmiembros.Si se le llama con el argumento de nombre de entidad único nombre_ent , SSADD construye un

conjunto de selección nuevo sólo con esa entidad.Si se le llama con un nombre de entidad y el conjunto de selección cs , SSADD añade laentidad con nombre al conjunto de selección.

Valor retornado: el conjunto de selección nuevo o modificado.Al añadir una entidad a un conjunto, la entidad nueva se añade al conjunto existente, y sedevuelve como resultado el conjunto transmitido como cs . De este modo, si el conjunto seasigna a otras variables, éstas también reflejan lo añadido. Si la entidad con nombre ya seencuentra en el conjunto, la operación con SSADD se ignora y no se indica ningún error.

(setq e1 (entnext)) Define e1 como el nombre de la primera entidad deldibujo

(setq ss (ssadd)) Define cs como un conjunto de selección vacío(ssadd e1 cs) Devuelve cs con nombre de entidad e1 añadido

(setq e2 (entnext e1)) Obtiene la entidad que sigue a e1(ssadd e2 cs) Devuelve cs con nombre de entidad e2 añadido

SSDEL

Suprime un objeto (entidad) de un conjunto de selecciónSintaxis: (SSDEL <nombre_ent> <cs>)

La función SSDEL borra la entidad nombre_ent del conjunto de selección cs.Valor retornado: el nombre de conjunto de selección cs .

La entidad se suprime del conjunto de selección, pero no se crea un conjunto nuevo con dichaentidad. Si ésta no se encuentra en el conjunto, se devuelve nil.

Por ejemplo, si la entidad e1 pertenece al conjunto de selección cs1 pero e2 no, entonces

(ssdel e1 cs1) Devuelve el conjunto de selección cs con la entidad e1suprimido.

(ssdel e2 cs1) Devuelve nil (no cambia cs1)

Page 57: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 57/68

 

53

ENTGET

Busca en la base de datos la entidad cuyo nombre se proporciona y devuelve una lista con los datosde su definición (registro de entidad)Sintaxis: ( ENTGET < nombre de entidad> )Valor retornado: lista de asociaciones (pares punteados o listas normales) que componen elregistro de entidad

Los datos que ENTGET devuelve son codificados como una lista de asociaciones, desde laque se pueden extraer elementos mediante la función ASSOC. Los objetos de esta lista tienenasignados códigos de grupo DXF de AutoCAD para cada parte de la información de la entidad.

Supongamos que el último objeto creado en el dibujo es una línea cuyos puntos iniciales y finalesson (1,2) y (6,5), respectivamente. Mediante la función entlast, puede recuperar el nombre de laentidad del último objeto y transmitirlo a entget.

(entget (entlast))

El resultado podría ser el siguiente:

((-1 . <<Nombre de entidad: 60000014>>) Nombre de entidad

(0 . "LÍNEA") Tipo de objeto(8 . "0") Capa(10 1.0 2.0 0.0) Punto inicial(11 6.0 6.0 0.0) Punto final

)

Los códigos de grupo DXF que utiliza AutoLISP no son exactamente iguales que los de los archivosDXF. Al igual que ocurre con DXF, los elementos de encabezamientos de entidades (color, tipo delínea, grosor, indicador de atributo e identificador de entidad) se exportan sólo en el caso de que nocontengan valores por defecto. A diferencia de DXF, los campos optativos de definición deentidades se exportan tanto si mantienen los valores por defecto como si no, lo cual simplifica elproceso. Los programas siempre pueden asumir que estos campos están presentes en losalgoritmos generales que les afectan. Además, a diferencia de DXF, las coordenadas X, Y y Z se

agrupan en una lista de puntos, como (10 1.0 2.0 3.0), en lugar de aparecer como grupos 10, 20 y30 separados.

El primer elemento de la lista (-1) contiene el nombre de esta entidad. Los pares de puntosindependientes, que representan los valores, se pueden extraer mediante ASSOC, utilizando CDRpara obtener sus valores.

Las sublistas para puntos no son pares punteados como el resto. El CDR de la sublista es el valordel grupo por convención. Como un punto es una lista de dos (o tres) números reales, el grupocompleto es una lista de tres (o cuatro) elementos. El CDR del grupo es una lista que representa unpunto, de modo que se mantiene la convención de que CDR siempre devuelve el valor.

Page 58: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 58/68

 

54

CÓDIGOS DE GRUPO BÁSICOS INTERESANTES

Se presentan aquí algunos códigos de grupo (los que se usarán más frecuentemente). Para conocer losdemás se recomienda la consulta al manual de personalización de Autocad.

CÓDIGO VALOR-1 Nombre de entidad

0 Tipo de entidad1 Valor del texto (la propia cadena)2 Nombre: bloques, etc

3,4 Otros valores de nombre o de texto6 Nombre de tipo de línea7 Nombre de estilo de texto8 Nombre de capa

10 PUNTO PRIMARIO: Punto inicial (línea), punto de colocación(texto), centro (círculo),punto de inserción de un bloque

11 Punto final

38 Elevación39 Altura de objeto40 a 48 radios de circulo, Altura de texto, factores de escala. .....50 a 58 ángulos

62 Número de color210 Orientación de la altura de objeto

ENTLAST

Devuelve el nombre del último objeto principal (entidad) no suprimido del dibujoSintaxis: (ENTLAST)Valor retornado: El nombre de entidad

La función ENTLAST se suele utilizar para obtener el nombre de la entidad que se ha añadido conla función COMMAND.

(setq e1 (entlast)) Define e1 como el nombre de la última entidad principaldel dibujo.

ENTNEXT

Devuelve el nombre del siguiente objeto (entidad) del dibujo. La función ENTNEXT devuelve tantolas entidades principales como las subentidades. Las entidades seleccionadas mediante SSGETson entidades principales, no atributos de bloques ni vértices de polilíneas. Para acceder a laestructura interna de estas entidades complejas, se utiliza ENTNEXT que permite llegar a todas lassubentidadesSintaxis: (ENTNEXT [nombre_ent]).Valos retornado:

Si se llama a ENTNEXT sin argumentos, devuelve el nombre de la primera entidad nosuprimida de la base de datos.Si ENTNEXT se llama con un argumento de nombre de entidad nombre_ent , devuelve elnombre de la primera entidad no suprimida que sigue a nombre_ent en la base de datos.Si nombre_ent es la última entidad de la base de datos, devuelve nil.

Forma de uso: Una vez que se haya obtenido el nombre de la subentidad adecuada, se puedetrabajar con ella como con cualquier otra entidad. Si para ello se utiliza ENTNEXT, se puede buscar

la entidad original aproximándose con ENTNEXT hasta que se encuentre una entidad SEQEND y, acontinuación, extrayendo el grupo -2 de la entidad, que es el nombre principal de entidad.

Page 59: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 59/68

 

55

(setq e1 (entnext)) Asigna e1 al nombre de la primera entidad del dibujo(setq e2 (entnext e1)) Define e2 como el nombre de la entidad que sigue a e1

(defun lastent (/ a b)(if (setq a (entlast)) Obtiene la última entidad principal

(while (setq b (entnext a)) si contiene subentidades, crea un bucle hasta la últimasubentidad

(setq a b) ) a: devuelve la última entidad o subentidad principal)

)

ENTSEL

Solicita al usuario la designación de un único objeto (entidad) mediante la especificación de unpunto.Sintaxis: (ENTSEL [solicitud])

La cadena especificada en solicitud se utiliza para solicitar al usuario el objeto. Si no se escribeninguna cadena, la solicitud tomará Designar objeto como valor por defecto.

Valor retornado: una lista cuyo primer elemento es el nombre de la entidad del objeto designado ycuyo segundo elemento lo forman las coordenadas del punto utilizado para designar el objeto.

Nota: El punto de designación que devuelve ENTSEL no representa un punto que esté en elobjeto seleccionado. El punto que se devuelve es la ubicación del cursor en cruz cuando serealiza la designación. La relación entre el punto de designación y el objeto variarádependiendo del tamaño de la caja de selección y de la escala de ampliación actual.

La siguiente secuencia de comandos de AutoCAD ilustra el uso de la función entsel y la lista quedevuelve:

Comando: linea

Desde el punto: 1,1al punto: 6,6al punto: ENTERComando: (setq e (entsel "Designe un objeto: "))Designe un objeto: 3,3(<<Nombre de entidad: 60000014> (3.0 3.0 0.0))

ENTDEL

Suprime objetos (entidades) o recupera los objetos eliminados anteriormenteSintaxis: (ENTDEL nombre_ent)

La entidad especificada mediante nombre_ent se suprime si ya forma parte del dibujo. Lafunción entdel recupera la entidad (la devuelve al dibujo) si se ha suprimido anteriormente enesta sesión de edición. Las entidades suprimidas se purgan del dibujo cuando se sale delmismo. La función entdel puede suprimir las entidades gráficas y no gráficas.

Valor retornado: El nombre de entidad suprimida o dada de alta.

(setq e1 (entnext)) ;Define e1 como el nombre de la primera entidad del dibujo(entdel e1) ;Suprime la entidad e1(entdel e1) ;Anula la supresión (recupera) la entidad e1

La función ENTDEL sólo actúa con entidades principales. Los atributos y vértices de polilíneas nopueden eliminarse sin tener en cuenta la entidad original. Puede utilizar la función COMMAND paraejecutar los comandos ATREDIT o EDITPOL con el fin de modificar subentidades.En las definiciones de bloque no se pueden borrar entidades. Sin embargo, con ENTMAKE, sepuede cambiar la definición completamente, con excepción de la entidad que desea suprimir.

Page 60: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 60/68

 

56

ENTMAKE

Crea una nueva entidad (objeto gráfico) en el dibujo. La función ENTMAKE puede definir entidadestanto gráficas como no gráficas.Sintaxis: (ENTMAKE [lista_ent])

El argumento lista_ent  debe ser una lista con datos de definición de entidad en un formatosimilar al devuelto por la función ENTGET. El argumento lista_ent  debe contener toda la

información necesaria para definir la entidad Si se omite dicha información, ENTMAKEdevuelve nil y no se admite la entidad. Si omite información de la definición optativa (como lacapa), ENTMAKE utiliza el valor por defecto.

Valor retornado: Si ENTMAKE crea correctamente la nueva entidad, devuelve la lista de informaciónde la definición de la entidad. Si ENTMAKE no puede crear la entidad, devuelve nil.Forma de uso: Un método para crear una entidad consiste en obtener la información de definiciónde una entidad con la función ENTGET, modificarla y transmitir los datos revisados a la funciónENTMAKE. Antes de crear una entidad ENTMAKE, se debe verificar si los nombres de capa, tipo delínea y color indicados son correctos. Al indicar un nombre de capa nuevo, ENTMAKE crea la capade forma automática.

El código siguiente crea un círculo rojo, con centro en el punto (4,4) y radio 1. Los campos optativosde capa y tipo de línea se han omitido, por lo que se mantienen los valores por defecto.

(entmake'((0 . "CIRCLE") (62 . 1) Tipo de objeto y color(10 4.0 4.0 0.0) (40 . 1.0) ) Radio y Centro

ENTMOD

Modifica los datos de la definición de un objeto (entidad) Al actualizar la entidad principal, ENTMODla modifica y actualiza su imagen en la pantalla.Sintaxis: (ENTMOD <lista_ent>)La función ENTMOD se transmite a una lista (lista_ent ) en el formato que devuelve ENTGET yactualiza la información de base de datos correspondiente al nombre de entidad especificado por elgrupo -1 en lista_ent. Valor retornado: El registro de entidad

Forma de uso: El mecanismo principal por el que AutoLISP actualiza la base de datos consiste enrecuperar las entidades con ENTGET, modificar la lista que las define y actualizarlas en la base dedatos con ENTMOD. La función ENTMOD puede definir objetos tanto gráficos como no gráficos.

(setq en (entnext)) Asigna en al nombre de la primera entidad del dibujo(setq ed (entget en)) Define ed como los datos de la entidad en(setq ed (subst (cons 8 "0") (assoc 8 ed) ed ) )

Cambia el grupo de capas de ed a la capa 0(entmod ed) Modifica la capa de la entidad en el dibujo

ENTUPD

Actualiza la imagen de un objeto (entidad) en pantalla

Sintaxis: (ENTUPD <nombre_ent>)Cuando se modifica un vértice de polilínea o un atributo de bloque con ENTMOD, no seactualiza en la pantalla la entidad compleja completa. La función ENTUPD puede utilizarsepara actualizar en pantalla una polilínea o bloque modificados. Esta función puede llamarse conel nombre de la entidad como parte de la polilínea o bloque; no es necesario que sea unaentidad principal. Aunque ENTUPD va destinada al uso con bloques y polilíneas con atributos,se puede llamar para cualquier entidad y siempre regenera la entidad en la pantalla, incluidaslas subentidades.

Si la primera entidad del dibujo fuera una polilínea con varios vértices, entonces:

(setq e1 (entnext)) Define e1 como el nombre de entidad de la polilínea(setq e2 (entnext e1)) Define e2 como el primer vértice(setq ed (entget e2)) Define ed como los datos del vértice

(setq ed (subst '(10 1.0 2.0) (assoc 10 ed) ed ) )Cambia la posición del vértice en ed al punto (1,2)(entmod ed) Traslada el vértice en el dibujo(entupd e1) Regenera la entidad e1 de la polilínea.

Page 61: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 61/68

 

57

Ejemplo completo 

(DEFUN C:TTT ()(PRIN1 "SEÑALAR ENTIDADES PARA EL CONJUNTO DESIGNADO")(SETQ CD1 (SSGET)

N1 (SSLENGTH CD1)I1 0 I2 0 I3 0 F1 (OPEN "d:\\docencia\\DATOS" "w")

 )(PRINT (STRCAT "CD1=" (ITOA N1) ))

(REPEAT N1(SETQ NENT (READ (STRCAT "ENT" (ITOA I1)))

ENT(SSNAME CD1 I1)RENT (ENTGET ENT)I1 (+ 1 I1)

 )

(PRINT "CD1" F1)(PRINT NENT F1)(PRINT RENT F1)

 )(CLOSE F1) )

(DEFUN C:TTT ()(PRIN1 "SEÑALAR ENTIDADES PARA EL CONJUNTO DESIGNADO")(SETQ CD1 (SSGET)

CD2 (SSGET "X" '( (8 . "1")))CD3 (SSGET "X" '((0 . "TEXT")))N1 (SSLENGTH CD1)

N2 (SSLENGTH CD2)N3 (SSLENGTH CD3)I1 0 I2 0 I3 0 F1 (OPEN "D:\\docencia\\DATOS" "w")

 )(PRINT (STRCAT "CD1=" (ITOA N1)))(PRINT (STRCAT "CD2=" (ITOA N2)))(PRINT (STRCAT "CD3=" (ITOA N3)))

(REPEAT N1

(SETQ NENT (READ (STRCAT "ENT" (ITOA I1)))ENT (SSNAME CD1 I1)RENT (ENTGET ENT)I1 (+ I1 1)

 )(PRINT "CD1" F1)(PRINT NENT F1)(PRINT RENT F1)

(SETQ CAPA (ASSOC 8 RENT)CAPAN (CONS 8 "1")RENT (SUBST CAPAN CAPA RENT)

 )

(ENTMOD RENT) )

Page 62: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 62/68

 

58

(REPEAT N2 

(SETQ NENT (READ (STRCAT "ENT" (ITOA I2)))ENT (SSNAME CD2 I2)RENT (ENTGET ENT)I2 (+ I2 1)

 )

(PRINT "CD2" F1)(PRINT NENT F1)(PRINT RENT F1)(SETQ CAPA (ASSOC 8 RENT)

CAPAN (CONS 8 "2")RENT (SUBST CAPAN CAPA RENT)

 )(ENTMOD RENT)

 )(REPEAT N3 

(SETQ NENT (READ (STRCAT "ENT" (ITOA I3)))ENT (SSNAME CD3 I3)

RENT (ENTGET ENT)I3 (+ I3 1) )(PRINT "CD3" F1)(PRINT NENT F1)(PRINT RENT F1)(SETQ ALTEXTO (ASSOC 40 RENT)

NALTEXTO (CONS 40 (* 2 CDR ALTEXTO))RENT (SUBST NALTEXTO ALTEXTO RENT)

 )(ENTMOD RENT)

 )(CLOSE F1)

 )

Page 63: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 63/68

 

59

7. CÓDIGOS Y MENSAJES DE ERROR DE AUTOLISP

En este apartado se tratan los mensajes de error que se pueden encontrar mientras se escriben ydepuran funciones AutoLISP. La mayoría de estos mensajes señalan errores de programación en AutoLISP,como:

- Nombre de función o símbolo mal escritos

- Tipo o número de argumentos de función erróneos- Incoherencia en paréntesis- Incoherencia en comillas (cadenas de caracteres no terminadas)- Falta de comprobación de la terminación correcta de una función antes de intentar utilizar su

resultado.

Los mensajes que Autolisp presenta por defecto son los siguientes:

- Los argumentos de defun no pueden tener el mismo nombre:  Una función definida con variosargumentos que tengan el mismo nombre fallará y generará este mensaje.

- AutoCAD rechazó la función:  Los argumentos suministrados a una función de AutoCAD no son

válidos (como en setvar con una variable de sistema de sólo lectura o tblnext con un nombre de tablano válido) o la propia función no es válida en el contexto actual. Por ejemplo, no puede utilizar unafunción getxxx de introducción de datos del usuario dentro de la función command.

- Desbordamiento de pila de AutoLISP :  Se ha superado el espacio de almacenamiento de pila deAutoLISP. El motivo puede ser una repetición excesiva de funciones o listas de argumentos muylargas.

- Tipo de argumento erróneo:  Se ha pasado un tipo de argumento incorrecto a una función. (Porejemplo, no se puede obtener la strlen de un número entero.)

- Bad association list: La lista suministrada a la función assoc no está formada por listas de valor clave.

- Código de conversión erróneo: El identificador space suministrado a la función trans no es válido.

- Bad ENTMOD list:  El argumento suministrado a entmod no es una lista de datos de entidadesadecuada (tal y como lo devuelve entget).

- Bad ENTMOD list value:  Una de las sublistas de la lista de asociación suministrada a entmodcontiene un valor erróneo.

- Lista de argumento formal inadecuada: Al evaluar esta función, AutoLISP ha detectado una lista deargumento formal no válida. Quizás no se trate de una función, sino más bien de una lista de datos.

- Función incorrecta: El primer elemento de la lista no es un nombre de función válido; quizás se tratede un nombre de variable o de un número. Este mensaje también puede indicar que la funciónespecificada no está bien definida

- Lista incorrecta: Se ha suministrado una lista con errores de forma a una función. Esto puede sucedersi un número real empieza con un separador decimal. Ha de incluir un cero inicial en este caso.

- Lista de puntos incorrecta: La solicitud F, CP o WP lleva adjunta una lista nula o con elementos queno son puntos. Se utilizan con ssget y grvecs.

- Bad node: La función type ha encontrado un tipo de elemento no válido.

- Tipo de nodo erróneo en la lista: La función foreach ha encontrado un tipo de elemento no válido.

Page 64: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 64/68

 

60

- Argumento de puntos incorrecto valor de punto incorrecto: Se ha pasado un punto mal definido (unalista de dos números reales) a una función que esperaba un punto. Un número real no puedeempezar por un separador decimal; en dicho caso, hay que incluir el cero inicial.

- Detectado número real incorrecto: Se ha intentado transmitir un número real no válido de AutoLISP aAutoCAD.

- Bad ssget list: El argumento suministrado a ssget "X") no es una lista de datos de entidad adecuada(tal y como devuelve entget)

- Bad ssget list value:  Una de las sublistas de la lista de asociaciones suministrada a (ssget "X")contiene un valor erróneo.

- Cadena modo ssget incorrecta: Este error se produce cuando ssget recibe una cadena no válida en elargumento modo.

- Lista de xdata incorrecta: Este error se genera cuando xdsize, ssget, entmod, entmake o txtbox recibeuna lista de datos de entidad extendida con errores de forma.

- Se requiere punto de base:  Se ha llamado a la función getcorner sin el argumento de punto baseobligatorio.

- Boole arg1 0 or 15: El primer argumento de la función booleana ha de ser un número entero entre 0 y15.

- Imposible evaluar la expresión: Separador decimal mal colocado o alguna otra expresión incorrecta.

- No es posible abrir (archivo) para entrada; fallo de LOAD: No se ha encontrado el archivo designadoen la función load, o el usuario no tiene permisos de lectura sobre ese archivo.

- Imposible volver a entrar en AutoLISP: Una función activa está utilizando el búfer de comunicación

AutoCAD/AutoLISP; no se podrá llamar a otra nueva función hasta que la actual haya finalizado.- Interrupción desde el teclado: El usuario ha tecleado CTRL+C durante el proceso de una función.

- Divide by zero: No se puede dividir por cero.

- Desbordamiento en división:  La división por un número muy pequeño ha dado como resultado uncociente no válido.

- Exceeded maximum string length. Se ha pasado a una función una cadena con más de 132caracteres.

- Extra right paren: Se ha encontrado uno o más paréntesis cerrados de los necesarios.

- File not open: El descriptor de archivo para la operación de E/S no es el de un archivo abierto.

- Lectura de archivo, memoria de cadenas insuficiente:  Memoria de cadenas agotada mientrasAutoLISP leía un archivo. Consulte el capítulo 15, "Gestión de memoria".

- File size limit exceeded:  Un archivo ha superado el límite de tamaño permitido por el sistemaoperativo.

- Floating-point exception: (Sólo sistemas UNIX.) El sistema operativo ha detectado un error aritméticode coma flotante.

- Función cancelada: El usuario ha tecleado CTRL+C o ESC (cancelar) en respuesta a una solicitud dedatos.

Page 65: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 65/68

 

61

- Function undefined for argument: El argumento pasado a log o sqrt sobrepasa los límites permitidos.

- Function undefined for real: Se ha suministrado un número real como argumento de una función queexige un número entero; por ejemplo, (lsh val 1.2).

- Illegal type in left: El archivo .lsp no es ASCII puro, sino que se ha guardado con un programa detratamiento de textos e incluye códigos de formato.

- Improper argument: El argumento para gcd es negativo o cero.

- Número incorrecto de argumentos. La función quote sólo espera un argumento concreto, pero se lehan proporcionado otros.

- Número incorrecto de argumentos para una función: El número de argumentos para la función creadapor el usuario no coincide con el número de argumentos formales especificado en defun.

- Solicitud inadecuada de datos sobre lista de comandos: Se ha encontrado una función de comandopero no se puede ejecutar porque hay otra función activa o porque el intérprete de comandos no estácompletamente inicializado. Este error puede producirse desde una llamada a la función command en

acad.lsp, acadr13.lsp o en un archivo .mnl.

- Entrada interrumpida: Se ha detectado un error o condición de fin de archivo prematuro, lo que haprovocado la finalización de la introducción de datos en el archivo.

- Insufficient node space:  No hay espacio suficiente en la pila de almacenamiento para la acciónsolicitada. Consulte el capítulo 15, "Gestión de memoria".

- Insufficient string space. No hay espacio en la pila de almacenamiento para la cadena de textoespecificada. Consulte el capítulo 15, "Gestión de memoria".

- Invalid argument: Tipo de argumento erróneo o argumento sobrepasa los límites permitidos.

- Lista de argumentos no válida:  Se ha pasado a una función una lista de argumentos que contieneerrores.

- Invalid character: Una expresión contiene un carácter erróneo.

- Invalid dotted pair:  Los pares punteados son listas que contienen dos elementos separados por laconstrucción espacio-punto-espacio. Este mensaje de error puede deberse a un número real queempieza por el separador decimal, en cuyo caso ha de incluir el cero inicial.

- Valor de número entero no válido: Se ha encontrado un número menor que el entero más pequeño omayor que el número entero más grande.

- Desbordamiento LISPSTACK: Se ha superado el espacio de almacenamiento de pila de AutoLISP. Elmotivo puede ser una repetición excesiva de funciones o listas de argumentos muy largas.

- Malformed list: Se ha terminado prematuramente una lista que se estaba leyendo en un archivo. Lacausa más común es una incoherencia en el emparejamiento de las aperturas y cierres de paréntesiso comillas.

- Malformed string:  Se ha terminado prematuramente una cadena que se estaba leyendo en unarchivo.

- Misplaced dot: Un número real comienza con el separador decimal. Ha de incluir un cero inicial eneste caso.

- Función nula: Se ha intentado evaluar una función que tiene una definición vacía.

Page 66: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 66/68

 

62

- Quitar/salir abandonar: Se ha llamado a la función quit o exit.

- Cadena demasiado larga: La cadena que se ha pasado a setvar es demasiado larga.

- Too few arguments: Se han pasado pocos argumentos a una función integrada.

- Demasiados argumentos: Se han pasado demasiados argumentos a una función integrada.

Page 67: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 67/68

 

63

8. ÍNDICE DE FUNCIONES

- ......................................................... .................... 8∼ ............................................................................. 8* ................................................... .......................... 8/ ...................................................... ....................... 8/= ........................................................................... 24+ ....................................................... ...................... 8< ....................................................... .................... 24<=........................................................................... 25= ....................................................... .............. 24, 26> ........................................................... ................ 24>=........................................................................... 251- ............................................................................. 91+............................................................................. 9ABS ......................................................................... 9ACAD_STRLSORT ............................................... 44AND ....................................................... ................ 25ANGLE................................................................... 31ANGTOF................................................................ 22ANGTOS................................................................ 22APPEND .............................................................. .. 15APPLY ............................................................ ....... 20

ASCII ..................................................................... 23ASSOC ........................................................... ....... 17ATAN ................................................................ ....... 9ATOF ............................................................... ...... 21ATOI ...................................................................... 21ATOM .................................................................... 19CAR ....................................................... ................ 16CDR ........................................................... ............ 16CHR ........................................................... ............ 23CLOSE................................................................... 40COMMAND............................................................ 37COND .................................................................... 27CONS..................................................................... 15COS .............................................................. ........... 9CVUNIT.................................................................. 23

DEFUN................................................................... 30DISTANCE............................................................. 31DISTOF.................................................................. 22ENTDEL................................................................. 55ENTGET................................................................. 53ENTLAST............................................................... 54ENTMAKE ............................................................. 56ENTMOD................................................................ 56ENTNEXT .............................................................. 54ENTSEL................................................................. 55ENTUPD .......................................................... ...... 56EQ.......................................................................... 26EQUAL................................................................... 26EVAL ..................................................................... 46EXP........................................................................ 10

EXPT...................................................................... 10FINDFILE............................................................... 40FIX ......................................................................... 21FLOAT .............................................................. ..... 21FOREACH ............................................................. 19GCD ....................................................... ................ 10GETANGLE ........................................................... 32GETCORNER ........................................................ 33GETDIST................................................................ 32GETFILED ............................................................. 36GETINT.................................................................. 34GETKWORD.......................................................... 35GETORIENT .......................................................... 33GETPOINT............................................................. 32GETREAL.............................................................. 34

GETSTRING .......................................................... 34GETVAR ......................................................... ....... 34GRAPHSCR........................................................... 45

IF .............................................................. ............. 27INITGET ............................................................... .. 35INTERS ............................................................... ... 31ITOA................ ....................................................... 21LAMBDA.............................................................. .. 20LAST......................................................... ............. 17LENGTH.................................................... ............. 15LIST.................................................................... .... 15LISTP ....................................................... .............. 18LOAD ........................................................ ............. 39LOG........................................................... ............. 10MAPCAR............................................ .................... 20MAX .......................................................... ............. 10MEMBER ............................................................ ... 18MIN................ ......................................................... 10MINUSP .............................................................. ... 10NTH........................................................ ................ 17NULL.............. ........................................................ 46NUMBERP .......................................................... ... 11OPEN ........................................................ ............. 39OR............................................................. ............. 25

OSNAP.................................................... ............... 38POLAR.......... ......................................................... 31PRIN1............. ........................................................ 41PRINC ....................................................... ............. 41PRINT........................................................ ............. 41PROGN ................................................................ .. 27PROMPT............................................................. ... 41QUIT............ ........................................................... 46QUOTE...................................................... ............. 46READ ............................................................... 13, 23READ- LINE........................................................... 42READ-CHAR........................ .................................. 42REDRAW ............................................................ ... 45REM .......................................................... ............. 11REPEAT.................... ............................................. 28

REVERSE ........................................................... ... 18RTOS ........................................................ ............. 22SETQ................................................................ ...... 12SETVAR................... .............................................. 12SIN .......................................................... ................. 9SQRT ........................................................ ............. 11SSADD........... ........................................................ 52SSDEL ...................................................... ............. 52SSGET ...................................................... ............. 50SSLENGTH............... ............................................. 51SSMEMB............................................................. ... 51SSNAME............................................................... . 51STRCASE ........................................................... ... 13STRCAT......... ........................................................ 13STRLEN.............................................................. ... 13

SUBST ...................................................... ............. 18SUBSTR.................................................... ............. 13TERPRI ............................................................... ... 42TEXBOX............................................................. .... 47TEXTPAGE........................................................... . 45TEXTSCR............................................................ ... 45TRANS...................................................... ............. 23TYPE......................................................... ............. 12VL-LIST->STRING................................................. 14VL-PRINC-TO-STRING.......................................... 14VL-SORT............................................................. ... 44VL-SORT-I .......................................................... ... 44VL-STRING->LIST................................................. 14VPORTS............................................................. .... 45WHILE.......... .......................................................... 29

WRITE-CHAR ........................................................ 41WRITE-LINE .......................................................... 42ZEROP...................................................... ............. 11

Page 68: Apuntes Lisp

5/8/2018 Apuntes Lisp - slidepdf.com

http://slidepdf.com/reader/full/apuntes-lisp 68/68

 

63

9. BIBLIOGRAFÍA BÁSICA

AUTODESK: Autolisp: Manual de personalización . (Varias versiones)

OTERO GONZÁLEZ, César: Guiones para las clases de C.A.D. Tercera y Cuarta parte: Lisp avanzado .E.T.S. de Ingenieros de Caminos, Santander. 1992.

TOGORES FERNÁNDEZ, Reinaldo y OTERO GONZÁLEZ, César: Programación en Autocad con Visual Lis p. Ed. Mc Graw Hill. 2003.