ONCE.24. CÓDIGOS Y MENSAJES DE ERROR

ONCE.24.1. Códigos de error

En la tabla siguiente se muestran los valores de códigos de error generados por AutoLISP. La variable de sistema ERRNO toma uno de estos valores cuando una llamada de función de AutoLISP provoca un error que AutoCAD detecta después.

Código ----- Significado

------------------------------------------------------------------------------------

0 ----------- Sin errores

1 ----------- Nombre no válido de tabla de símbolos

2 ---------- Nombre no válido de conjunto de selección o entidad

3 ---------- Se ha superado el número máximo de conjuntos de selección

4 ---------- Conjunto de selección no válido

5 ---------- Uso no adecuado de definición de bloque

6 ---------- Uso no adecuado de referencia externa

7 ---------- Selección de objeto: fallo en la designación

8 ---------- Final de archivo de entida

9 ---------- Final de archivo de definición de bloque

10 --------- No se ha encontrado la última entidad

11 --------- Intento no válido de suprimir un objeto de ventana gráfica

12 --------- Operación no permitida durante el comando POL

13 --------- Identificador no válido

14 --------- Identificadores no activados

15 --------- Argumentos no válidos en la petición de transformación de coordenadas

16 --------- Espacio no válido en la petición de transformación de coordenadas

17 --------- Uso no válido de entidad suprimida

18 --------- Nombre de tabla no válido

19 --------- Argumento de función de tabla no válido

20 --------- Intento de definir una variable de sólo lectura

21 --------- No puede utilizarse el valor cero

22 --------- Valor incorrecto

23 --------- Regeneración compleja en curso

24 --------- Intento de cambiar el tipo de entidad

25 --------- Nombre de capa erróneo

26 --------- Nombre de tipo de línea erróneo

27 --------- Nombre de color erróneo

28 --------- Nombre de estilo de texto erróneo

29 --------- Nombre de forma erróneo

30 --------- Campo para el tipo de entidad erróneo

31 --------- Intento de modificar una entidad suprimida

32 --------- Intento de modificar una subentidad SEQEND

33 --------- Intento de cambiar identificador

34 --------- Intento de modificar la visibilidad en pantalla gráfica

35 --------- Entidad en capa bloqueada

36 --------- Tipo de entidad errónea

37 --------- Entidad polilínea errónea

38 --------- Entidad compleja incompleta en el bloque

39 --------- Campo de nombre de bloque no válido

40 --------- Campos de identificador de bloque repetidos

41 --------- Campos de nombre de bloque repetidos

42 --------- Vector normal erróneo

43 --------- Falta el nombre de bloque

44 --------- Faltan los indicadores de bloques

45 --------- Bloque anónimo no válido

46 --------- Definición de bloque no válida

47 --------- Falta un campo obligatorio

48 --------- Tipo de datos extendidos (XDATA) no reconocido

49 --------- Anidación errónea de lista en XDATA

50 --------- Ubicación errónea del campo APPID

51 --------- Se ha superado el tamaño máximo de XDATA

52 --------- Selección de entidad: respuesta nula

53 --------- APPID duplicada

54 --------- Intento de crear o modificar objeto de pantalla gráfica

55 --------- Intento de crear o modificar RefX, XDef o XDep

56 --------- Filtro SSGET: fin de lista no esperado

57 --------- Filtro SSGET: falta operando de prueba

58 --------- Filtro SSGET: cadena opcode (-4) no válida

59 --------- Filtro SSGET: anidación errónea o cláusula condicional vacía

60 --------- Filtro SSGET: incoherencia en principio y final de cláusula condicional

61 --------- Filtro SSGET: número erróneo de argumentos en cláusula condicional (con NOT o XOR)

62 --------- Filtro SSGET: superado el límite máximo de anidación

63 --------- Filtro SSGET: código de grupo no válido

64 --------- Filtro SSGET: prueba de cadena no válida

65 --------- Filtro SSGET: prueba de vector no válida

66 --------- Filtro SSGET: prueba de número real no válida

67 --------- Filtro SSGET: prueba de número entero no válida

68 --------- El digitalizador no es un tablero

69 --------- El tablero no está calibrado

70 --------- Argumentos de tablero no válidos

71 --------- Error ADS: no es posible asignar buffer nuevo de resultados

72 --------- Error ADS: se ha detectado un puntero nulo

73 --------- No es posible abrir el archivo ejecutable

74 --------- La aplicación ya está cargada

75 --------- Número máximo de aplicaciones ya cargadas

76 --------- No es posible ejecutar la aplicación

77 --------- Número de versión no compatible

78 --------- No es posible descargar la aplicación anidada

79 --------- La aplicación no se descarga

80 --------- La aplicación no está cargada

81 --------- Memoria insuficiente para cargar la aplicación

82 --------- Error ADS: matriz de transformación no válida

83 --------- Error ADS: nombre de símbolo no válido

84 --------- Error ADS: valor de símbolo no válido

85 --------- Operación AutoLISP/ADS no permitida mientras se presenta un cuadro de diálogo

 

ONCE.24.2. Mensajes de error

Como ya sabemos, cuando AutoLISP detecta una condición de error, cancela la función en proceso y llama a la función *error* del usuario con un mensaje que indica el tipo de error. Si no se define ninguna función *error* (o si *error* se limita a cero), la acción estándar es presentar el mensaje en la forma siguiente:

error: mensaje

El mensaje va seguido de un indicador de función. Si hay una función *error* definida por el usuario, el indicador no actúa, sino que se hace referencia a dicha función de usuario con mensaje como argumento único.

A continuación se muestra una lista completa de los mensajes de error que puede proporcionar AutoLISP en programas de usuario, además de una explicación de cada uno. La lista recoge los mensajes únicamente en castellano, excepto los que se encuentran en inglés en todas las plataformas idiomáticas.

 

Lista 1

Los argumentos de defun no pueden tener el mismo nombre

Una función definida con varios argumentos 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 tabla no válido) o la propia función no es válida en el contexto actual. Por ejemplo, no se puede utilizar una función GET... 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 de AutoLISP. El motivo puede ser una repetición excesiva de funciones o listas de argumentos muy largas.

tipo de argumento erróneo

Se ha pasado un tipo de argumento incorrecto a una función Por ejemplo, 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 entidades adecuada (tal y como lo devuelve ENTGET).

bad ENTMOD list value

Una de las sublistas de la lista de asociación suministrada a ENTMOD contiene un valor erróneo.

lista de argumento formal inadecuada

Al evaluar esta función, AutoLISP ha detectado una lista de argumento 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 trate de un nombre de variable o de un número. Este mensaje también puede indicar que la función especificada no está bien definida (no olvidar la lista de argumentos formal obligatoria).

código de función erróneo

El identificador de función suministrado al comando TABLET no es correcto.

bad grvecs list value

El valor pasado en una lista GRVECS no es un punto 2D o un punto 3D.

bad grvecs matrix value

La matriz que se ha suministrado a GRVECS contiene errores de formación o de tipo de datos (por ejemplo: STR, SYM, etc.).

lista incorrecta

Se ha suministrado una lista con errores de forma a una función. Esto puede suceder si un número real empieza con un separador decimal. Hemos 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 que no 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.

argumento de puntos incorrecto valor de punto incorrecto

Se ha pasado un punto mal definido (una lista de dos números reales) a una función que esperaba un punto. Un número real no puede empezar 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 a AutoCAD.

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 el argumento modo.

lista de xdata incorrecta

Este error se genera cuando XDSIZE, SSGET, ENTMOD, ENTMAKE o TEXTBOX recibe una 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 base obligatorio.

Boole arg1 0 or 15

El primer argumento de la función booleana ha de ser un número entero entre 0 y 15.

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 designado en 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 buffer 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 un cociente no válido.

exceeded maximum string length

Se ha pasado a una función una cadena con más de 132 caracteres.

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 mientras AutoLISP leía un archivo.

file size limit exceeded

Un archivo ha superado el límite de tamaño permitido por el sistema operativo.

floating-point exception

Sólo sistemas UNIX. El sistema operativo ha detectado un error aritmético de coma flotante.

función cancelada

El usuario ha tecleado CTRL+C o ESC (cancelar) en respuesta a una solicitud de datos.

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 que exige un número entero, por ejemplo (LSH 2.2 1).

falta punto final grvecs

Falta un punto final en la lista de vectores que se ha suministrado a GRVECS.

illegal type in left

El archivo .LSP no es ASCII puro, sino que se ha guardado con un programa de tratamiento de textos e incluye códigos de formato.

improper argument

El argumento para GCD es negativo o cero.

inappropriate object in function

El paginador de funciones VMON ha detectado una función mal expresada.

número incorrecto de argumentos

La función QUOTE sólo espera un argumento concreto, pero se le han proporcionado otros.

número incorrecto de argumentos para una función

El número de argumentos para la función creada por 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 comando pero 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, ACADR14.LSP o en un archivo .MNL.

entrada interrumpida

Se ha detectado un error o condición de fin de archivo prematuro, lo que ha provocado 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ón solicitada.

insufficient string space

No hay espacio en la pila de almacenamiento para la cadena de texto especificada.

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 contiene errores.

invalid character

Una expresión contiene un carácter erróneo.

par punteado no válido

No se ha dejado el espacio pertinente antes y después del punto en la construcción manual del par punteado. Este mensaje de error también puede deberse a un número real que empieza 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 o mayor que el número entero más grande.

desbordamiento LISPSTACK

Se ha superado el espacio de almacenamiento de pila de AutoLISP. El motivo 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. La causa más común es una incoherencia en el emparejamiento de las aperturas y cierres de paréntesis o comillas.

malformed string

Se ha terminado prematuramente una cadena que se estaba leyendo en un archivo.

misplaced dot

Un número real comienza con el separador decimal. Se ha de incluir un cero inicial en este caso.

función nula

Se ha intentado evaluar una función que tiene una definición vacía.

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.

argumentos insuficientes para grvecs

No se han pasado suficientes argumentos a GRVECS.

demasiados argumentos

Se han pasado demasiados argumentos a una función integrada.

 

La siguiente lista muestra los errores internos de AutoLISP que no tienen que ver con el programa de usuario. Estos errores, si se producen, hay que notificarlos a Autodesk de forma inmediata ya que se pueden deber a bugs o fallos en la programación de AutoCAD 14 o en la implementación de AutoLISP en él. Para más información véase la ayuda del programa.

 

Lista 2

bad argument to system call

Sólo sistemas UNIX. El sistema operativo ha detectado una llamada errónea generada por AutoLISP.

bus error

Sólo sistemas UNIX. El sistema operativo ha detectado un error de bus.

hangup

Sólo sistemas UNIX. El sistema operativo ha detectado una señal hangup (colgado).

illegal instruction

Sólo sistemas UNIX. El sistema operativo ha detectado una instrucción de máquina no válida.

segmentation violation

Sólo sistemas UNIX. El sistema operativo ha detectado un intento de direccionamiento externo al área de memoria especificada para este proceso.

unexpected signal nnn

Sólo sistemas UNIX. El sistema operativo ha emitido una señal inesperada.

 

ONCE.FIN. EJERCICIOS PROPUESTOS

  1.  Diseñar un programa en AutoLISP que permita dibujar un perfil doble T parametrizado. El programa solicitará en línea de comandos la altura total y la altura del alma, la anchura del ala y del alma y el punto de inserción. El perfil se dibujará con ángulo de inserción 0.
  2. Realizar un programa que extraiga todos los bloques existentes en el dibujo actual y los guarde en disco en la unidad y directorio que el usuario indique. El programa contendrá una rutina de control de errores y funcionará desde línea de comandos. El resto al gusto del programador.
  3. Realizar un programa que permita dibujar un agujero en alzado seccionado. Tras solicitar el punto de inserción se irán pidiendo los demás datos. El usuario dispondrá de la posibilidad de dibujar el agujero con o sin cajera y/o roscado o no. La cajera (si existiera) y el agujero se dibujarán en la capa actual; la rosca (si existiera) y el eje de simetría se dibujarán en sendas capas cuyos nombres serán solicitados al usuario. El programa funcionará bajo línea de comandos únicamente.
  4. Crear un programa en AutoLISP que dibuje una curva de nivel cartográfica a partir de los puntos contenidos en un fichero topográfico. El programa funcionará mediante un cuadro diseñado en DCL que tendrá el siguiente aspecto:
  5. Como se puede apreciar en este letrero de diálogo, el usuario dispondrá de la posibilidad de escoger un fichero en entrada —donde están los datos— y un fichero de salida. En este último se guardarán las coordenadas de los puntos precedidas de un número de orden o marca que será el que se dibuje en pantalla al lado de cada punto. Además, también se podrá escoger la posibilidad de ver el fichero de salida al terminar de dibujar la curva, en cuyo caso se abrirá un editor ASCII (tipo Bloc de Notas) con el fichero en cuestión, y la posibilidad de no generar este fichero, en cuyo caso no se generará (al elegir esta opción habrán de desactivarse la innecesarias).

    Como segundo paso se elegirá el tipo de curva con el que se dibujará la curva de nivel (sección Generar curva). Después elegiremos las propiedades de la curva: capa, color y tipo de línea. En cada lista desplegable se reflejarán los elementos actuales en el dibujo.

    Como se ve en el cuadro, habremos de especificar también un estilo de texto, su rotación y su altura, así como dispondremos de la posibilidad de no escribir las marcas en pantalla. También se ofrece en esta sección del letrero una casilla de edición para indicar cuál será la primera de las marcas.

    Por último escogeremos el separador de coordenadas en el archivo de entrada, es decir, cuál es el carácter que divide unas componentes de otras: una coma (formato CDF), un espacio blanco (formato SDF) o cualquier otro que, en su caso, se especificará.

    El programa dispondrá de una rutina de control de errores, tanto del cuadro de diálogo (para no introducir valores incorrectos) como de errores AutoLISP.

  6. Crear un programa mediante AutoLISP y DCL que dibuje escaleras de caracol en 3D. El cuadro de diálogo puede ser el que sigue:
  7. Como observamos habremos de introducir todos los datos necesarios para el dibujo de la escalera. La opción Hueco interior determina si en por dentro existirá hueco o una columna cilíndrica. Dispondremos de un botón para designar un punto de inserción en pantalla.

    Créense rutinas de control de errores y demás.

  8. Diseñar un programa AutoLISP/DCL cuyo cometido será sumar o acumular todas distancias de tramos rectos y curvos de las líneas y/o polilíneas y/o arcos existentes en una capa del dibujo actual. Al final, el programa escribirá un texto personalizable con las cantidades acumuladas. Este programa puede serle muy útil a todo aquel que necesite saber en un momento el total de tramos trazados en un dibujo (en una capa), sean tuberías, circuitos eléctricos, carreteras, etcétera.

El cuadro de diálogo principal del programa será el que se puede observar en la página siguiente.

EL área Actuar en capa define la capa en la cual se realizarán las mediciones. Como vemos puede ser una elegida de la lista desplegable —que contendrá todas las capas del dibujo—, la capa actual o la correspondiente al objeto que se designará (si se elige la última opción). En estos dos último casos la primera opción quedará inhabilitada, evidentemente; en el último caso, se pedirá designar objeto al pulsar el botón Aceptar, antes de proceder a la medición.

En el área Acumular se especifica el tipo de objeto sobre el que actuará: línea, polilínea, arcos o todos (con las correspondientes combinaciones).

En el área Inserción del texto habremos de pulsar el botón designar para escoger un punto de inserción en pantalla. Al volver el cuadro, se reflejarán en las casillas correspondientes las coordenadas X, Y y Z de dicho punto. Además, escogeremos aquí la capa donde se insertará el texto (Actuación dice relación a la capa elegida en el área primera).

Por último, en el área Mostrar texto describiremos las propiedades del texto (estilo, altura y rotación), así como el texto que aparecerá antes del total acumulado y después del mismo.

El botón Preferencias... nos lleva a otro cuadro de diálogo, cuyo diseño lo vemos en la página siguiente. En este nuevo cuadro elegiremos diversas preferencias (si así lo deseamos) para el texto final escrito en pantalla. Así pues, dispondremos de la posibilidad de mostrar el subtotal de tramos rectos y de tramos curvos —con sus correspondientes textos inicial y final—, la fecha y la hora de la medición y el autor de la misma, así como su empresa y la ubicación de ésta.

Este programa representa ya un alto nivel en la programación en AutoLISP/DCL. Se puede hacer de variadas formas, sobre todo el cuerpo principal donde se realiza la medición. Intentemos escoger la que nos resulte más sencilla y versátil a la hora de tener en cuenta otros aspectos del programa.