Sei sulla pagina 1di 245

Programacin en AutoLISP

1. INTRODUCCIN
A parte de todo lo visto en cuestin de personalizacin, AutoCAD 14 ofrece al usuario
la posibilidad de crear programas y aplicaciones verticales totalmente funcionales.
Estos programas podrn ser distribuidos por el creador, eso s, siempre corrern bajo
AutoCAD.
La capacidad para hacer un programa nos lleva mucho ms all de la simple
personalizacin de mens o patrones de sombreado, nos lleva a un mundo totalmente
integrado en AutoCAD desde donde podremos dise!ar nuestros propios comandos,
manipular dibujos o incluso acceder a la "ase de #atos interna del programa.
AutoCAD 14 proporciona diversas interfaces de programacin de aplicaciones $ue
vamos a comentar ahora de forma somera.
1.1. AutoLISP, ADS, ARX, !A " i#ua$ Li#%
1.1.1. &ntorno AutoLISP
#entro de lo $ue es la programacin e%isten diversas interfaces para crear programas
para AutoCAD. El ms antiguo y, $uiz el ms utilizado hasta ahora, es AutoL&'(.
AutoL&'( es una adaptacin del lenguaje de programacin L&'( $ue forma parte ntima
e integrada con AutoCAD, esto es, AutoCAD posee internamente un propio int)rprete
de L&'(.
El lenguaje L&'( est basado en lo $ue se denominan listas de smbolos. Es un
lenguaje de alto nivel *como "A'&+, y $ue, en principio, fue dise!ado para la
investigacin en el campo de la inteligencia artificial. AutoL&'( es un lenguaje
evaluado, es decir, est a un paso entre los lenguajes interpretados, por un lado, y los
lenguajes compilados, por otro.
+omo hemos dicho, AutoCAD provee al usuario de un propio int)rprete de AutoL&'(
interno. Este int)rprete, al $ue habra $ue llamarle evaluador, se encarga -
precisamente- de evaluar las e%presiones incluidas en el cdigo fuente de un
programa. Estos programas pueden introducirse directamente desde la lnea de
comandos de AutoCAD, o bien cargarse en memoria a partir de un programa
completo escrito es un archivo de te%to A'+&&. #ichos archivos tendrn habitualmente
la e%tensin .LSP.
#e la programacin en AutoL&'( hablaremos largo y tendido en este MDULO.
1.1.'. &ntorno ADS
1
A#' *AutoCAD Development System, es un entorno de programacin el lenguaje +
para AutoCAD. Las aplicaciones programadas de esta manera han de ser llamadas
desde un propio programa AutoL&'(, ya $ue AutoCAD las considera como funciones
e%ternas.
El cdigo fuente de estas aplicaciones ha de escribirse y compilarse en un compilador
e%terno de +, es decir, AutoCAD no provee de un entorno de programacin para estas
aplicaciones, como ocurre con AutoL&'( o ."A. El programa objeto ejecutable .EXE
*normalmente,, producto de la compilacin del fuente, podr ser cargado desde
AutoCAD.
NOTA: Este entorno est ya obsoleto en la versin /0 y los programas desarrollados en
)l debern adaptarse a A12 mediante el entorno A#'12.

1.1.(. &ntorno ARX
A12 *AutoCAD Runtime Extension, es desde la versin /3 de AutoCAD otro entorno
de programacin + $ue posibilita, al contrario $ue A#', una comunicacin directa de
las aplicaciones con AutoCAD. #e esta forma, no es necesaria la intervencin de
AutoL&'( como intermediario. La aplicacin 1ender, en RENDER.ARX, es un ejemplo de
programa en este formato.
La no integracin de un entorno de programacin en + dentro del soft4are de
AutoCAD ha hecho $ue su utilizacin para desarrollar aplicaciones para el programa
no est) muy e%tendida. Es necesario, pues, ad$uirir un compilador de +
complementario para poder desarrollar en este lenguaje aplicaciones A#' o A12, lo
$ue no ocurre con AutoL&'( o ."A. (or este motivo, tampoco se tratar en este curso.
NOTA: En la versin /0 de AutoCAD e%iste el comando ARX para cargar, descargar y
obtener informacin sobre aplicaciones A12 sin necesidad de utilizar AutoL&'(.

1.1.4. &ntorno !A
."A *Visual BASIC for Appliations, es un novedoso entorno, incluido en la versin /0,
$ue parece hacer furor entre los programadores ltimamente. La programacin en
.isual "A'&+ para 5indo4s viene siendo, desde hace unos a!os, una de las
herramientas ms verstiles y, a la vez, ms sencillas y utilizadas en el mundo de la
programacin informtica. El usuario puede desarrollar sus programas en un
compilador .isual "A'&+ e%terno o utilizar el propio mdulo ."A $ue incluye AutoCAD
14. Este mdulo contiene la sinta%is del lenguaje, un depurador y un entorno de
desarrollo. As, el programador, puede programar rutinas ."A e ir probndolas en una
sesin de AutoCAD mientras se van depurando.
."A ser ampliamente tratado en el MDULO DOCE.

2
1.1.). &ntorno i#ua$ Li#%
A partir de la .ersin /0 e%iste un nuevo entorno de desarrollo denominado .isual Lisp
$ue permite realizar aplicaciones en AutoL&'( de una manera ms rpida y efectiva.
Este entorno proporciona herramientas para desarrollar y depurar las rutinas y
compilarlas como aplicaciones A12. 6ambi)n dispone de su propio evaluador, $ue
emula al de AutoL&'(, adems de un completo control de codificacin y seguridad de
las rutinas creadas.
El entorno de .isual Lisp es un mdulo $ue se carga bajo demanda. 7o est incluido en
el propio ncleo de AutoCAD, como ocurre con el evaluador de AutoL&'(. El nuevo
conjunto de funciones incorporadas en .isual Lisp permite trabajar en diferentes reas
y niveles $ue incluyen funciones a!adidas de AutoL&'(, funciones de acceso al sistema
operativo y E8' de archivos, funciones de carga y vinculacin de objetos y bases de
datos, almacenamiento directo de listas en un archivo de dibujo, acceso al conjunto de
objetos Active2 de AutoCAD y tecnologa basada en 9bjectA12 $ue no necesita la
presencia de AutoCAD para su ejecucin.
#e esta manera, el entorno de .isual Lisp permite a los desarrolladores la
programacin en A12 y Active2.
'. CARACT&R*STICAS D& AutoLISP
+omo ya hemos dicho, L&'( *!ISt "roessin#, es un lenguaje de programacin $ue se
remonta a los a!os cincuenta y $ue fue desarrollado para la investigacin de
inteligencia artificial. La base de su funcionamiento es el manejo de listas, en lugar de
datos num)ricos como otros lenguajes. AutoL&'( es una implantacin L&'( en
AutoCAD.
:na lista es un conjunto de smbolos. El smbolo es la unidad mnima bsica de una
lista, y puede ser una variable, una funcin inherente a AutoL&'(, una funcin de
usuario, un dato constante... Las listas elaboradas mediante smbolos son evaluadas y
procesadas para obtener un resultado.
(ara programar en AutoCAD, este lenguaje proporciona una serie de posibilidades
como la facilidad para manejar objetos heterog)neos *nmeros, caracteres, funciones,
entidades u objetos de dibujo, etc)tera,, la facilidad para la interaccin en un proceso
de dibujo, la sencillez del lenguaje y su sinta%is, y otras $ue hacen de )l una
herramienta muy til y sencilla de manejar y aprender.
+omo tambi)n hemos dicho ya, el lenguaje AutoL&'( *y L&'(, es un lenguaje evaluado,
y no interpretado o compilado. Los lenguajes interpretados son ledos palabra a
palabra por el ordenador, al ser introducidas, y cada una de ellas convertida a lenguaje
m$uina. Esto hace $ue sea sencilla su edicin y deteccin de errores de sinta%is u
otros; por el contrario, hace $ue sean muy lentos *ejemplo< =icrosoft >"A'&+,. Los
cdigos de los lenguajes compilados son escritos por completo y, antes de su ejecucin
final, es necesario compilarlos, convirti)ndolos as en cdigo fuente ejecutable y
comprensible por la m$uina. Este tipo de lenguajes hace $ue su ejecucin sea ms
rpida y pura pero, en contra, resulta ms difcil su depuracin *ejemplos< =icrosoft
>uic?"A'&+ o "orland +@@,.
3
Los lenguajes evaluados -AutoL&'(- estn a caballo entre unos y otros. 7o son tan
rpidos como los compilados pero son ms fle%ibles e interactivos $ue estos. Es
posible, por ejemplo, construir un programa con AutoL&'( $ue sea capaz de
modificarse a s mismo bajo determinadas circunstancia; )sta es la base de los
llamados Sistema Expertos.
El mecanismo evaluador de AutoL&'( es la propia lista< conjunto de smbolos
separados entre s por, al menos, un espacio blanco y encerrados entre par)ntesis.
Esto es, desde el momento $ue e%iste una e%presin encerrada entre par)ntesis,
AutoL&'( la evala e intenta ofrecer un resultado.
AutoL&'( es un subconjunto del lenguaje Common !IS". +omo ha sido dise!ado para
trabajar desde AutoCAD, se han seleccionado las caractersticas de L&'( ms
adecuadas para este fin y, adems, se han a!adido otras nuevas, sobre todo en la
manipulacin de objetos de dibujo, acceso a la "ase de #atos de AutoCAD e
interaccin grfica general.
Los programas en AutoL&'( son simples archivos de te%to A'+&&, con la e%tensin
habitual .LSP. :na vez hecho el programa, habremos de cargarlo desde el propio
editor de dibujo de AutoCAD. 6ambi)n es posible escribir lneas de cdigo AutoL&'(
desde la lnea de comandos del programa, como veremos en breve.
Es posible la creacin de rdenes nuevas $ue llamen a programas en AutoL&'(, as
como la redefinicin de comandos propios de AutoCAD, como por ejemplo LINEA o
DESPLAZA. (ero una de las ms importantes potencialidades de AutoL&'( es el acceso
directo a la "ase de #atos interna de AutoCAD. 6oda la informacin de un dibujo,
como deberamos saber, no se guarda como objetos de dibujo en s, o sea, cuando
salvamos un .DWG, en disco no se guardan los crculos, lneas, etc)tera, sino una
relacin o base de datos donde se dice dnde aparece un crculo o una lnea, con $u)
coordenadas de origen y final, con $u) radio o dimetro, tipo de lnea, color...
(odremos pues desde AutoL&'( acceder a dicha base de datos para modificarla,
editarla o para e%portar datos, por ejemplo, a una base de datos e%terna.

'.1. Ti%o# +e o,-eto# " +ato# en AutoLISP
Atendiendo a sus caractersticas podemos definir varios tipos de objetos y datos en
AutoL&'(, $ue son los de la tabla siguiente<
O,-eto o +ato ........................ De#cri%cin
------------------------------------------------------------------------------------------------------------
!ista AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 9bjeto compuesto de un par)ntesis de aperA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA tura, uno o ms elementos separados por, al
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA menos, un espacio en blanco y un par)ntesis
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA de cierre. Los elementos de una lista pueden
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ser smbolos, valores concretos *constantes
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA num)ricas o cadenas, o listas incluidas. (or
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ejemplo< (DEFUN seno (x) (SETQ xr (* PI (/x
4
180.0))) (SETQ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA s (SIN xr))), se trata de una lista $ue contiene
cinco elemenA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA tos< una funcin inherente de AutoL&'(
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA DEFUN, un nombre de funcin de usuario
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA seno, una lista con un nico elemento (x) y
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dos listas SETQ con tres elementos cada una.
Elemento AAAAAAAAAAAAAAAAAAAAAAAAAAAAA +ual$uiera de los componentes de una lista.
S$m%olo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +ual$uier elemento de una lista $ue no sea
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA una constante. (uede ser el nombre de una
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA variable, un nombre de funcin definida por
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA el usuario o un nombre de funcin de AutoL&'(.
Enteros AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA .alores num)ricos enteros, sin punto deciA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA mal. &nternamente son nmeros de 3B bits
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA con signo, sin embargo, en la transferencia
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA de datos con AutoCAD son valores de /C bits
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA con signo, comprendidos por lo tanto entre
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A3BDCE y 3BDCD.
Reales AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA .alores num)ricos con coma flotante de doA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA precisin. Esto representa un mnimo de /0
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dgitos representativos. 'e pueden e%presar
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA en notacin cientfica e%ponencial mediante e o E.
Cadenas &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .alores te%tuales $ue contienen cadenas de
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA caracteres en cdigo A'+&&. #eben ir entre
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA comillas y se permite una longitud m%ima
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA de /3B caracteres. 'e pueden construir cadenas
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA mayores como veremos.
Desriptores de ar'ivo AAAAAAAAAAAAAAA .alores $ue representan un archivo abierto
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA para lectura o escritura.
Nom%res de o%(etos de di%u(o AAAAAAAAAA .alores $ue representan el FnombreF he%adeA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA cimal de un objeto de la "ase de #atos.
Con(untos desi#nados de AutoCAD AAAAA .alores $ue representan un conjunto de seA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA leccin de objetos de dibujo.
)uniones de usuario &&&&&&&&&&&&&&&&&&&&& 'mbolo $ue representa el nombre de una
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA funcin definida por el usuario.
)uni*n in'erente o su%rutina &&&&&&&&&&& 'mbolo con el nombre de una funcin predeA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA finida de AutoL&'(. 'e suelen denominar con
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA la abreviatura inglesa su%rs. (ueden ser inA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ternas o e%ternas.

5
'.'. Proce+imiento# +e e/a$uacin
La base de todo int)rprete de L&'( es su algoritmo evaluador. Gste analiza cada lnea
de programa y devuelve un valor como resultado. La evaluacin slo se realizar
cuando se haya escrito una lista completa y )sta podr ser cargada desde un archivo
de te%to o tecleada directamente en la lnea de comandos de AutoCAD 14.
El primer elemento de la lista es comparado con todos los nombres de funciones
inherentes base o su%rs internas de AutoL&'(, con todos los nombres de su%rs
e%ternas cargadas desde aplicaciones A#' o A12 y en su caso con todos los nombres
de funciones de usuario cargadas en memoria. 'i el nombre es reconocido, se realiza
la evaluacin de la e%presin de AutoL&'(. Esta puede consistir en asignar un valor a
una variable, cargar en memoria una funcin de usuario, escribir un resultado en
pantalla o en un archivo, dibujar un objeto grfico, etc.
El primer elemento de la lista debe ser por tanto un nombre de funcin. El resto de
elementos se consideran argumentos de dicha funcin. La evaluacin en AutoL&'( se
realiza de acuerdo a las siguientes reglas.
Primera0
Las listas se evalan $uedando determinadas por el primer elemento. 'i )ste es un
nombre de funcin inherente o subrutina, los elementos restantes de la lista son
considerados como los argumentos de esa funcin. En caso contrario se considera
como un nombre de funcin definida por el usuario, tambi)n con el resto de elementos
como argumentos. +uando los elementos de una lista son a su vez otras listas, )stas
se van evaluando desde el nivel de anidacin inferior *las listas ms FinterioresF,. El
valor resultante en cada evaluacin de las listas FinterioresF, es utilizado por las listas
Fe%terioresF. (or ejemplo<
(SETQ sx (SIN (* PI (/ x 180.0))))
La lista ms FinteriorF contiene como primer elemento el nombre de la funcin de
AutoL&'( / $ue realiza el cociente o divisin del siguiente elemento entre los restantes.
La evaluacin de dicha lista devuelve el resultado del cociente, en este caso el valor
contenido en la variable x dividido entre el nmero real 180.0. #icho valor es utilizado
como elemento en la lista circundante $ue empieza por la funcin de AutoL&'( * $ue
realiza una multiplicacin o producto. Esta lista se evala ofreciendo como resultado el
producto de PI *3,/0/HI, por el valor anterior. A su vez el resultado interviene como
argumento en la lista $ue empieza por la funcin de AutoL&'( SIN, $ue es evaluada
obteni)ndose el seno. Este interviene por ltimo como argumento de la lista ms
e%terior $ue empieza por la funcin de AutoL&'( SETQ , cuyo resultado es asignar o
almacenar en la variable sx el valor del seno. Este valor es devuelto por la lista de
SETQ como resultado final.
Segun+a0
(uesto $ue cada lista contiene un par)ntesis de apertura y otro de cierre, cuando
e%isten listas incluidas en otras, todos los par)ntesis $ue se vayan abriendo deben
tener sus correspondientes de cierre. 'i se introduce desde el teclado una e%presin en
AutoL&'( a la $ue falta por cerrar algn par)ntesis, se visualiza un mensaje del tipo n>
6
donde n es un nmero $ue indica cuntos par)ntesis faltan por cerrar. 'e pueden
introducir por teclado esos par)ntesis y subsanar el error. (or ejemplo<
Comando: (SETQ sx (SIN (* PI (/ x 180.0))
2> ))
0.523599
Tercera0
6ambi)n es posible evaluar directamente un smbolo *e%traer por ejemplo el valor
actual contenido en una variable,, introduciendo por teclado el signo de cerrar
admiracin seguido del nombre del smbolo. Esta evaluacin se puede producir incluso
en mitad de un comando. (or ejemplo, para suministrar como ngulo para un arco el
valor contenido en la variable x, se responde a la solicitud de AutoCAD con !x. (or
ejemplo<
Comando: !sx
0.523599
Cuarta0
Los valores enteros, reales, cadenas de te%to y descriptores de archivos, devuelven su
propio valor como resultado. Los nombres de funciones inherentes o subrutinas de
AutoL&'( devuelven un nmero interno he%adecimal *suele cambiar de una sesin de
dibujo a otra,. (or ejemplo<
!72.5 devuelve 72.5
!"Inicio" devuelve "Inicio"
!SETQ devuelve <Subr: #1a93e24>
1uinta0
Los smbolos de variables participan con el valor $ue contienen *$ue les est asociado,
en el momento de la evaluacin. (or ejemplo<
!x devuelve 30
!sx devuelve 0.523599
Se2ta0
#eterminadas funciones de AutoL&'( pueden devolver un valor nulo, $ue se representa
mediante la e%presin nil. (or ejemplo<
Comando: (PROMPT "Bienvenido a AutoLISP\n")
Bienvenido a AutoLISP
nil
7
La funcin PROMPT escribe en la lnea de comando el mensaje especificado y devuelve
nil. El cdigo \n e$uivale a INTRO.

'.(. Arc3i/o# 4uente +e %rograma#
Las e%presiones contenidas en un programa de AutoL&'( pueden introducirse
directamente desde el teclado durante la edicin de un dibujo de AutoCAD, escribirlas
en un fichero de te%to A'+&& o ser suministradas por una variable del tipo cadena,
como ya se ha dicho varias veces.
(ara una correcta evaluacin, las e%presiones deben cumplir unos re$uisitos de
sinta%is, $ue se pueden resumir en los siguientes puntos<
- :na e%presin puede ser tan larga como se $uiera. (uede ocupar varias lneas del
archivo de te%to.
- Los nombres de smbolos pueden utilizar todos los caracteres imprimibles *letras,
nmeros, signos de puntuacin, etc., salvo los prohibidos $ue son< ( ) . ' " ;
- Los nombres de smbolos no son sensibles a las maysculas. As, seno y SENO
representan el mismo nombre. Los nombres pueden contener nmeros, pero no estar
formados e%clusivamente por nmeros. As, 1pt, pt-1, p12 son vlidos como nombres
de variables, pero no 21, $ue ser interpretado como un valor num)rico constante.
- Los caracteres $ue terminan un nombre de smbolo o un valor e%plcito *una
constante num)rica o de te%to, son< par)ntesis de apertura y cierre, apstrofo,
comillas, punto y coma, espacio en blanco o final de lnea en el archivo. Estos
caracteres sirven de separacin entre elementos de una lista.
- Los espacios en blanco de separacin entre smbolos son interpretados como un solo
espacio entre cada par de smbolos. 'e recuerda $ue es necesario un espacio en
blanco para separar un smbolo del siguiente, siempre $ue no haya par)ntesis,
apstrofo, comillas o punto y coma. #ebido a la longitud de las e%presiones de
AutoL&'( y a la profusin de par)ntesis $ue dificultan su lectura, suele ser norma
habitual realizar sangrados en las lneas del archivo de te%to, para resaltar los
par)ntesis interiores de los e%teriores. 6odos los espacios a!adidos son interpretados
como uno solo.
-Los valores e%plcitos *constantes, de nmeros pueden empezar con el carcter + o -
$ue es interpretado como el signo del nmero.
- Los valores de constantes de nmeros reales deben empezar con una cifra
significativa. El carcter punto *., se interpreta como el punto decimal. 6ambi)n se
admite + o - para el signo y e o E para notacin e%ponencial o cientfica. 7o es vlida
la coma decimal, ni tampoco abreviar como en .6 *hay $ue escribir 0.6,.
8
- Los valores de constantes con cadenas de te%to son caracteres $ue empiezan y
terminan por comillas. #entro de las cadenas se pueden incluir caracteres de control
mediante la contrabarra *\,. Los cdigos permitidos son<
\\ ------ +arcter contrabarra *\,.
\" ------ +arcter comillas *",.
\e ------ +arcter de escape.
\n ------ 7ueva lnea o retorno de carro.
\r ------ INTRO
\t ------ +arcter de tabulador TAB
\nnn ------ +arcter cuyo cdigo octal *no A'+&&, $ue es decimal, es nnn.
\U+xxxx ------ 'ecuencia de caracteres de cdigo +niode.
\M+nxxxx ------ 'ecuencia de caracteres multibyte.
Los cdigos deben ir en minsculas. (ara incluir en una cadena un cdigo A'+&& hay
$ue calcular su valor octal. (or ejemplo, el carcter dlar $ es A'+&& 3C; su valor octal
ser 00 y en la cadena habr $ue indicar el cdigo de control \44.
- El apstrofo *', se puede utilizar como abreviatura del comando QUOTE. El comando
QUOTE devuelve el literal del smbolo. Es decir, cuando en una e%presin un smbolo
aparece precedido por apstrofo o se le aplica la funcin de AutoL&'( QUOTE, no se
evala con el valor $ue contiene en ese momento sino $ue devuelve el propio nombre
literal del smbolo.
- 'e pueden incluir comentarios en un archivo de te%to con programas y e%presiones
en AutoL&'(, comenzando la lnea del archivo con un punto y coma *;,. A partir de
donde se encuentre un punto y coma hasta el final de la lnea, AutoL&'( considera $ue
son comentarios y no los tiene en cuenta. 6ambi)n se pueden incluir comentarios en
mitad de una lnea u ocupando varias de ellas, si se sitan entre los caracteres ;| y |;.
(or ejemplo<
;Funcin de estado actual del dibujo.
(DEFUN funcion_1 (x / pt1 pt2)
(SETQ refnt0 ;| modos de referencia actualmente
activados |; (GETVAR "osmode"))
...
Los comentarios son tiles tanto para el autor del programa como para futuros
usuarios $ue accedan al archivo con el fin de modificarlo. 'uele ser habitual situar al
principio del archivo el ttulo, autor y fecha de creacin. (osteriormente, una
e%plicacin general del programa, e%plicaciones particulares de cada funcin
intermedia, usos de variables, etc. +omo muchas de las configuraciones de pantalla de
te%to disponen de un ancho de EJ columnas, conviene $ue las lneas del archivo de
te%to no sobrepasen los EJ caracteres.

'.4. aria,$e# %re+e4ini+a#
E%isten unos valores de smbolos de AutoL&'( predefinidos. 'on los siguientes<
9
PI. Es el valor del nmero real (&, es decir< 3,/0/HIBCH3HEIDI3.
PAUSE. Es una cadena de te%to $ue consta de un nico carcter contrabarra. 'e
utiliza para interrumpir un comando de AutoCAD despu)s de haberlo llamado
mediante la funcin de AutoL&'( COMMAND. Esto permite al usuario introducir algn
dato.
T. Es el smbolo de True, es decir, cierto o verdadero *valor 1 lgico,. 'e utiliza para
establecer $ue determinadas condiciones se cumplen.
(or ltimo el valor de nada, vaco o falso *0 lgico, se representa en AutoL&'( por
nil. Este valor aparece siempre en minsculas y no es propiamente un smbolo, ya
$ue no est permitido acceder a )l.

(. PRO5RA6ANDO &N AutoLISP
A partir de ahora vamos a comenzar a ver poco a poco la manera de ir haciendo
nuestros programas en AutoL&'(. .amos a seguir un orden lgico de menor a mayor
dificultad, por lo $ue la estructura puede llegar a parecer un poco catica para alguien
$ue conozca el lenguaje. 6ampoco es objetivo de este curso profundizar en un m)todo
complejo de programacin, sino proponer unas bases para comenzar a programar $ue,
con imaginacin y horas de trabajo, podr convertirnos en programadores e%pertos de
AutoL&'(.
6odo lo visto hasta ahora resulta la parte rida de la programacin; parece $ue no
sirven de mucho esos conocimientos tericos mientras no pasemos a la prctica. #e
a$u en adelante podremos ir entendiendo las B primeras secciones de este MDULO
y, si algo se $ued en el tintero o algo hay $ue repetir de todo lo e%puesto hasta a$u,
se completar y se e%plicar o repetir.
+omencemos, pues, con la programacin en AutoL&'( para AutoCAD 14.
(.1. Con/encione# +e #inta2i#
Las convenciones utilizadas para las sinta%is en este MDULO van a ser las
siguientes<
7ombre del comando o funcin AutoL&'( en maysculas.
Argumentos en minscula itlica, representados por un nombre mnemot)cnico.
Argumentos opcionales encerrados entre corchetes itlicos *$ue no han de
escribirse,.
(untos suspensivos en itlica indican la posibilidad de indicar ms argumentos.
10

4. OP&RACION&S NU67RICAS 8 L5ICAS
E%plicaremos a$u la manera en $ue se realizan en AutoL&'( las operaciones
matemticas, de comparacin y lgicas. El buen aprendizaje de ests t)cnicas nos ser
tremendamente til a la hora de lanzarnos a la programacin pura.

4.1. Aritm9tica ,:#ica
(ara realizar las cuatro operaciones aritm)ticas bsicas e%isten cuatro funciones
AutoL&'( $ue son +, -, * y /, estas se corresponden con la suma, resta, multiplicacin
y divisin.
La funcin de suma tiene la siguiente sinta%is<
(+ [valor1 valor2 valor3...] )
Esto es, primero se indica el nombre de la funcin, como siempre en AutoL&'(, $ue en
este caso es + y luego los argumentos de la misma, es decir, a$u los valores de los
distintos sumandos.
Esta funcin devuelve el resultado aditivo de todos los valores num)ricos especificados
como argumentos de la funcin. (or ejemplo<
(+ 14 10 20)
devolvera el valor 44. (ara hacer la prueba nicamente debemos escribir dicho rengln
en la lnea de comandos de AutoCAD, pulsar INTRO y comprobar el resultado.
NOTA: Al introducir el primer carcter de apertura de par)ntesis, AutoCAD reconoce
$ue se est escribiendo una e%presin en AutoL&'(, por lo $ue nos permitir utilizar los
espacios necesarios de la sinta%is sin $ue se produzca un INTRO cada vez, como es
habitual. 1ecordemos $ue todos los elementos de una lista de AutoL&'( han de ir
separados por lo menos con un espacio blanco. (robemos diferentes sinta%is utilizando
ms espacios, o tabuladores, y comprobemos $ue el resultado es el mismo; se
interpretan los espacios o tabuladores como un nico carcter de espacio en blanco.
NOTA: Kagamos la prueba de no introducir el par)ntesis final de la lista indicada.
+omprobaremos lo e%plicado en la segunda regla de la seccin 2.2.
+on la funcin + podemos indicar valores enteros o reales. 'i todos los valores son
enteros el resultado ser entero, pero si uno o varios de ellos son reales -o todos ellos
-, el resultado ser real. Esto significa $ue nicamente es necesario introducir un
valor real para recibir una respuesta real. (or ejemplo, si introducimos la siguiente
lnea en la lnea de comandos en AutoCAD<
(+ 14 10 20.0)
11
el resultado ser<
44.0
o sea, un nmero real.
Esto a$u parece irrelevante, pero comprenderemos su utilidad al hablar, por ejemplo,
de la divisin.
'i indicamos un solo sumando con esta funcin, el resultado es el valor del propio
sumando. (or ejemplo<
(+ 23)
devuelve<
23
L si se escribe la funcin sin argumentos, el resultado es 0 *funcin sin argumentos<
(+),.
Los valores indicados en la funcin de suma pueden ser directamente valores
num)ricos o nombres de variables num)ricas declaradas anteriormente, por ejemplo<
(+ 10.0 x total)
En esta funcin, 10.0 es un valor constante real y x y total son dos nombres de
variables $ue han debido ser anteriormente declaradas; ya aprenderemos a declarar
variables. 'i la variable no e%istiera se producira un error bad argument type de
AutoL&'(.
9tros ejemplos con nmeros negativos<
(+ 10 -23) devuelve -13
(+ -10 -10) devuelve -20
NOTA: 'i se produce algn error de sinta%is u otro, podemos acudir al final de este
MDULO para ver una relacin de los mensajes de error de AutoL&'(.
La funcin de resta, por su lado, tiene la siguiente sinta%is<
(- [valor1 valor2 valor3...] )
Esta funcin devuelve la diferencia del primer valor con todos los dems indicados. As
por ejemplo<
(- 10 5)
da como resultado 5 y la siguiente e%presin<
12
(- 10 5 2)
da como resultado 3. Esto es producto de restar ,- . / 0 / y, luego, / . 1 0 2; o lo
$ue es lo mismo ,- . 3/ 4 15 0 2.
Al igual $ue en la suma, si se indican valores enteros el resultado ser entero, si se
indica uno real *con uno es suficiente, el resultado es real, si se indica un solo valor se
devuelve el mismo valor y si se escribe la funcin sin argumentos se devuelve 0. As
pues, si $ueremos un resultado real efectuado con nmeros enteros para posteriores
operaciones, deberemos indicar uno de los valores entero; de la siguiente manera, por
ejemplo<
(- 10 5.0 2)
o cual$uier otra combinacin posible de uno o ms nmeros enteros.
+omo se ha e%plicado para la suma, los valores de los argumentos para la resta
pueden ser constantes, eso s, siempre num)ricas, o variables<
(- tot num1 num2)
Llegados a este punto, podemos suponer ya las diferentes combinaciones $ue
podremos realizar con las distintas funciones aritm)ticas. (or ejemplo, es factible la
evaluacin de la siguiente e%presin<
(+ 12 (- 2 -3))
cuyo resultado es 11. 9 sea, y como hemos e%plicado, se realizarn las operaciones de
dentro a fuera. En este ejemplo, se suma la cantidad de /B a la diferencia B M 3, esto
es6 ,1 4 31 . 25 0 ,,. +omo vemos, e%isten dos listas, una interior anidada a la otra
$ue es, a la vez, argumento de la lista e%terior. 9curre lo mismo con nombres de
variables<
(- fer1 (+ -sum1 sum2) 23.44)
+on respecto al producto su sinta%is es la siguiente<
(* [valor1 valor2 valor3...] )
'e evala el producto de todos los valores num)ricos indicados como argumentos.
+omo anteriormente, si un valor es real el resultado es real. :n solo valor como
argumento devuelve el mismo valor. 7ingn valor devuelve 0. .eamos un ejemplo<
(* 12 3 4 -1)
El resultado es -144. .eamos otros ejemplos<
(* 2 3)
(* val (- vax vad))
13
(- (* 12 2) 24)
(+ (- -10 -5) (* 3 total 23))
NOTA: 'i escribimos ms par)ntesis de los necesarios por la derecha se nos mostrar
un mensaje de error. 1ecordar $ue si no los escribimos nos da la opcin de escribirlos
despu)s, as como el nmero de ellos $ue faltan. #e todas forma, consltese el final
del MDULO para la e%plicacin de los mensajes de error.
La sinta%is de la divisin es la $ue sigue<
(/ [valor1 valor2 valor3...] )
La funcin / realiza el cociente del primer valor num)rico por todos los dems, es decir,
divide el primer nmero por el producto de los dems. (or ejemplo<
(/ 10 2)
da como resultado 5. L el ejemplo siguiente<
*8 /JJ H H,
da como resultado 4, es decir, ,-- 7 / 0 1- y, luego, 1- 7 / 0 8; o lo $ue es lo mismo6
,-- 7 3/ 9 /5 0 8.
9tros dos ejemplos<
(/ 24 (* (+ 10.0 2) 12))
(/ 12 2 1)
+on respecto al cociente debemos realizar las mismas observaciones anteriores, esto
es, si se indica un solo valor se devuelve el mismo valor, si se indica la funcin sin
argumentos se devuelve 0 y si se indican valores enteros slo se devuelven valores
enteros. Esto ltimo cobra especial sentido en el caso de las divisiones, ya $ue el
cociente entre dos nmeros enteros puede ser un nmero real. .eamos el siguiente
ejemplo<
(/ 15 7)
'i introducimos esta lnea el resultado ser 2. El motivo es $ue, como hemos
especificado valores enteros, el resultado se muestra en forma de nmero entero, con
la parte decimal o mantisa truncada. (ara asegurarnos de recibir una respuesta
correcta *con decimales significativos,, deberemos introducir uno de los valores -o
todos ellos, pero con uno es suficiente- como valor real, de la siguiente forma<
(/ 15 7.0)
Ahora el resultado ser 2.14286. El nmero entero podra haber sido el otro<
(/ 15.0 7)
14
Esto debemos tenerlo muy en cuenta a la hora de realizar operaciones cuyo resultado
vaya a ser parte integrante de otra operacin -o no- $ue puede devolver decimales.
.emos otros ejemplos de divisiones<
(/ -12.0 7.8 210)
(/ (+ (- 23.3 32) 12.03) (/ (* (+ 1.01 2.01) 100)))
(+ datos (/ grupo (* 100 2)))
NOTA: Evidentemente, la divisin por J produce un error de AutoL&'(< divide by
zero.

1; 4a#e interme+ia +e e-ercicio#
1ealizar mediante AutoL&'( las siguientes operaciones aritm)ticas *estn e%presadas
en notacin informtica sencilla de una lnea,<
*HJ @ H, 8 B
*BJJ N H M 3, 8 *0 8 B,
*/J.B3 M */B.J3 8 3,, N */B @ *B N AB, M **/B.H 8 B, N B.CH,,
*/I @ B3, 8 */J @ *B3 8 *B3 8 /I,,,
**ABJ 8 H, M /, 8 */H.H N **/H.H M /, 8 /B,,

4.'. 6atem:tica a/an<a+a
Ouera aparte de las funciones aritm)ticas de nivel bsico, programando en AutoL&'(
podemos realizar operaciones matemticas complejas como races cuadradas o senos.
.amos a e%plicar a$u las funciones $ue controlan estas operaciones.
Las dos primeras $ue veremos son sencillas de entender y utilizar. Ambas se refieren al
incremento, positivo o negativo, de una unidad a un valor num)rico.
(1+ valor )
Esta sinta%is corresponde a la funcin de incremento positivo de una unidad al valor
indicado. As, si $ueremos incrementar en / el valor HDC, haremos<
(1+ 576)
Esto e$uivale a (+ 576 1) pero es de una forma ms cmoda; el resultado es 577.
NOTA: La funcin se denomina 1+ en s, por lo $ue no e%iste espacio entre 1 y +.
(odemos realizar estos incrementos con nombres de variable<
15
(1+ n)
lo $ue incrementar en una unidad el valor de n. Esto puede ser especialmente
necesario para controlar los llamados ontadores&suma en programacin, del tipo<
(SETQ sum (1+ sum))
Esto ya lo veremos a la hora de declarar variables.
La siguiente funcin resta *incremento negativo, una unidad al valor num)rico
indicado. E$uivale a (- valor 1), pero de una forma ms cmoda.
(1- valor )
(or ejemplo<
(1- 32)
suyo resultado es 31.
9tros ejemplos de estas dos funciones<
(1- n)
(1- 67.90)
(1- -23)
(1+ -34.0)
(1+ (+ tuttot 1)
(1- (* 2 2))
(1- (* (/ 32 2) (+ 10 1.0)))
(ABS valor )
Esta funcin ABS devuelve el valor absoluto del nmero indicado o e%presin indicada.
#e esta forma, la siguiente e%presin<
(ABS -23)
devuelve 23.
Las siguientes e%presiones tienen el siguiente efecto indicado<
(ABS -25.78) devuelve 25.78
(ABS 45) devuelve 45
(ABS 0) devuelve 0
(ABS -13) devuelve 13
(ABS (/ 2 3.0)) devuelve 0.666667
(ABS (/ 2 -3.0)) devuelve 0.666667
(FIX valor )
16
FIX trunca un valor a su parte entera *positiva o negativa,, es decir, de un nmero real
con decimales devuelve nicamente su parte entera. (ero, cuidado, no se produce
redondeo, slo un truncamiento.
Ejemplos<
(FIX 32.79) devuelve 32
(FIX -12.45) devuelve -12
(FIX (/ 10 3.0)) devuelve 3
(FIX (/ 10 -3.0)) devuelve -3
(REM valor1 valor2 [valor3...] )
Esta funcin AutoL&'( devuelve el resto del cociente *mdulo, de los dos valores
introducidos en principio. (or ejemplo, la siguiente e%presin devuelve 6 como
resultado<
(REM 20 7)
#icho 6 es el resto $ue resulta de dividir BJ 8 D. 'i aplicamos la regla de la divisin
*dividendo es igual a divisor por cociente ms resto,< 1- 0 : 9 1 4 ;, vemos $ue se
cumple correctamente.
'i se especifican ms de dos valores, el resto anterior es dividido entre el actual,
devolviendo el nuevo resto de la nueva divisin. (or ejemplo<
(REM 20 7 4)
da como resultado 2. El primer resto 6 se calcula de la forma e%plicada en el ejemplo
anterior y, el resultado final 2, se produce al dividir dicho primer resto entre el tercer
valor 4. Al dividir C 8 0, nos da un resultado *$ue es igual a /, y un resto 2 *valor final
obtenido,. L as sucesivamente.
9tros ejemplos<
(REM -1 2)
(REM 0 23)
(REM (* 23 2) (- (+ 1 1) 45.5))
(REM 54 (* 3 -4))
(asemos ahora a ver las funciones trigonom)tricas, esto es, cmo calcularlas mediante
AutoL&'(. La primera sinta%is se refiere al seno de un ngulo y es la siguiente<
(SIN ngulo )
La funcin SIN devuelve el seno de un ngulo e%presado en radianes. Ejemplos<
(SIN 1) devuelve 0.841471
(SIN (/ PI 2)) devuelve 1.0
17
NOTA: +omo sabemos PI es un constante de AutoL&'(, por lo $ue no hace falta
declararla como variable; ya tiene valor propio y es 3.14159. An as, se puede
calcular su valor e%acto mediante la e%presin< "I 0 8 9 arta# ,.
(COS ngulo )
COS devuelve el coseno de un ngulo e%presado en radianes. Ejemplos<
(COS PI) devuelve -1.0
(COS (* 3 4)) devuelve 0.843854
NOTA: 7tese $ue (& es un valor real, por lo $ue el resultado ser real.
(ATAN valor1 [valor2] )
Esta funcin ATAN devuelve el arco cuya tangente es valor1 e%presada en radianes, es
decir, realiza el arcoAtangente de dicho valor. (or ejemplo<
(ATAN 1.5) devuelve 0.98
'i se indica un segundo valor *valor2,, ATAN devuelve el arcoAtangente de valor1
dividido por valor2. Esto permite indicar la razn entre los lados de un tringulo recto,
es decir, escribir la tangente directamente como cociente del seno entre el coseno. 'i
valor2 es 0, el valor devuelto ser igual a (& 8 B o a M(& 8 B radianes, dependiendo del
signo de valor1.
Ejemplos<
(ATAN 1 1)
(ATAN 1 (* 2 -4.5))
Estas son las tres funciones trigonom)tricas de AutoL&'(. En este punto se nos
plantean un par de problemas< Pcmo calculo las restantes funciones trigonom)tricasQ
y Pcmo convierto grados se%agesimales en radianes y viceversaQ
La segunda cuestin es sencilla, ya $ue basta aplicar al frmula rad 0 #rados 9 "I 7
,<- para convertir grados en radianes. La operacin inversa en fcilmente deducible.
La primera pregunta tiene una respuesta no menos sencilla, y es $ue en la mayora -
por no decir todos- de los lenguajes de programacin nicamente nos proporcionan
estas funciones trigonom)tricas bsicas y, a partir de ellas, podemos calcular las
funciones trigonom)tricas derivadas inherentes. La manera se e%plica a continuacin
mediante notacin sencilla de una lnea<
=uncin +eri/a+a ......... Notacin
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
'ecante *sec %, AAAAAAAAAAAA / 8 cos *%,
+osecante *cosec %, AAAAAAA / 8 sen *%,
18
ArcoAseno *arcsen %, AAAAAAA arctag *% 8 */ M % R B,,
ArcoAcoseno *arccos %, AAAAA /.HDJDC33 M arctag *% 8 */ M % R B,,
ArcoAsecante *arcsec %, AAAA arctag * *% R B M /,, @ si#no *%, M/, N /.HDJDC33
ArcoAcosecante *arccos %, AA arctag */8 *% R B M /,, @ si#no *%, M/, N /.HDJDC3
ArcoAcotang. *arccotag %, AAA /.HDJDC33 M arctag *%,
NOTA: El smbolo R significa e%ponenciacin. es raz cuadrada. si#no *%, se refiere al
signo del valor; si )ste es positivo si#no *%, valdr /, si es negativo valdr M/ y si es
cero valdr J. 7o debemos preocuparnos ahora por esto, ya $ue aprenderemos en
breve o ms adelante -con mayor soltura- a realizar e%ponenciaciones, races
cuadradas y operaciones con signos.
'igamos, pues, ahora con otras diferentes funciones $ue nos ofrece AutoL&'( a la hora
de realizar operaciones matemticas. La siguiente dice referencia a las races
cuadradas; su sinta%is es<
(SQRT valor )
Esta funcin devuelve el resultado de la raz cuadrada del valor indicado, ya sea un
guarismo simple o una e%presin matemtica, como siempre. As por ejemplo, veamos
unas e%presiones con sus correspondientes evaluaciones<
(SQRT 4) devuelve 2.00
(SQRT 2) devuelve 1.4142
(SQRT (* 2 6)) devuelve 3.4641
La intencin de e%traer una raz cuadrada de un nmero negativo produce el error
function undefined for argument de AutoL&'(.
(or otro lado, la sinta%is para la funcin e%ponencial es la siguiente<
(EXPT base exponente )
EXPT devuelve el valor de base elevado a exponente. #e esta forma, para elevar H al
cubo *igual a /BH,, por ejemplo, escribiremos<
(EXPT 5 3)
9tro ejemplo<
(EXPT 2.3 7.23)
#e esta forma, como sabemos, podemos resolver el resto de races *cbicas, cuartas,
$uintas..., e%istentes. La $ue raz cbica de 3B es lo mismo $ue 3B elevado a / 8 3,
podemos escribir la siguiente e%presin<
(EXPT 32 (/ 1 3))
As tambi)n<
19
(EXPT 20 (/ 1 5))
(EXPT 10 (/ (+ 2 4) (- v23 rt sw2))
(EXPT 3 (/ 1 2))
NOTA: El intento de e%traer races negativas de cual$uier ndice producir el mismo
error e%plicado en SQRT.

(EXP exponente )
Esta funcin devuelve la constante *nmero, e elevada al e%ponente indicado. 'e
corresponde con el antilogaritmo natural. (or ejemplo<
(EXP 1) devuelve 2.71828
(LOG valor )
LOG devuelve el logaritmo neperiano o natural *en base e, del valor indicado. (or
ejemplo<
(LOG 4.5) devuelve 125.0000
(GCD valor_entero1 valor_entero2 )
Esta sinta%is se corresponde con la funcin de AutoL&'( GCD, $ue devuelve el m%imo
comn denominador de los dos valores indicados. Estos valores han de ser
obligatoriamente enteros, de no ser as, AutoL&'( devuelve bad argument type como
mensaje de error. .eamos unos ejemplos<
(GCD 45 80) devuelve 5
(GCD 80 70) devuelve 10
(GCD (* 10 10) (/ 70 2)) devuelve 5
'i se indica un entero negativo el mensaje de error de AutoL&'( es improper
argument.
Las dos ltimas funciones matemticas $ue veremos pueden sernos de gran ayuda a la
hora de programar. :na de ellas *MAX, devuelve el mayor de todos los nmeros
indicados en la lista. 'u sinta%is es<
(MAX valor1 valor2... )
Los valores pueden ser nmeros enteros o reales, y tambi)n e%presiones matemticoA
aritm)ticas. As por ejemplo<
(MAX 78.34 -12 789 7)
20
devolver 789.0, ya $ue es el nmero mayor. Lo devuelve como real por la aparicin
de decimales en el elemento 78.34. +omo sabemos, con la sola aparicin de un valor
real en una lista, el resultado es real.
'i el elemento mayor de la lista es un e%presin matemtica, se devolver su
resultado, no la e%presin en s, por ejemplo<
(MAX (* 10 10) 5)
devolver 100 como resultado */J N /J,.
9tro ejemplo<
(MAX -5 -7 -9)
devolver -5.
(MIN valor1 valor2... )
La funcin MIN, por su lado, devuelve el menor de todos los valores indicados en lista.
Las dems consideraciones son anlogas a la funcin anterior. Ejemplos<
(MIN 1 2 3 4 7) devuelve 1
(MIN 23.3 7 0) devuelve 0.0
(MIN (/ 7 3) 0.56) devuelve 0.56
Ejemplos de MAX y MIN con variables<
(MIN x y z)
(MIN (+ x1 x2) (+ y1 y2) (+ w1 w2) (+ z1 z2))
L hasta a$u todas las funciones $ue tienen $ue ver con operaciones matemticas.
(asaremos, tras unos ejercicios propuestos, a ver las operaciones de comparacin,
muy interesantes y sencillas de comprender.

'; 4a#e interme+ia +e e-ercicio#
1ealizar mediante AutoL&'( las siguientes operaciones matemticas *estn
e%presadas en notacin sencilla de una lnea,<
**BJ M 3, N *E M B,,
/ @ DE.E @ **DE.E R B, 8 B, @ **DE.E R 3, 8 3,
*sen * *EJ N BE.JJB, M cos *(& 8 B,,, 8 *(& M */ 8 B,,
arccos */JJ 8 B,
*/B0.CHEI N *e R B.3,, 8 *D N B,
ln *0H N *D 8 B,,
*B3.JJI 8 DE.D03, R *HC.JJ/B3 M /,
21
1ealcense ejercicios de clculo de valores mayores y menores de listas, as como de
m%imos comunes denominadores.
1ealizar un par de ejercicios de incremento y decremento de una unidad a valores.
NOTA: Las operaciones en general siguen en AutoL&'( la jerar$ua de las operaciones
matemticas< par)ntesis internos, par)ntesis e%ternos, operadores unitarios *signos,,
potenciacin, multiplicacin y divisin, suma y resta, operadores relacionales *mayor
$ue, menor $ue..., y operadores lgicos *lgebra de "oole,. L cuando e%isten varios
operadores en el mismo nivel, se ejecutan de iz$uierda a derecha. Ahora mismo
veremos operadores relacionales o de comparacin y, luego, el lgebra de "oole en
AutoL&'(.

4.(. O%eracione# re$aciona$e#
Las funciones $ue veremos a continuacin se denominan relacionales o de
comparacin, y es $ue comparan valores, ya sean num)ricos o te%tuales *cadenas,
emitiendo un resultado verdadero o falso, segn la comparacin. Estas funciones son
conocidas por todos *igual, mayor $ue, menor o igual $ue...,, slo $ueda determinar
cmo se utilizan y cul es su sinta%is en AutoL&'(.
+omo hemos dicho el resultado de la evaluacin solo puede ser uno de dos< T *6rue,
$ue representa el verdadero o cierto, o nil $ue representa el falso o nulo.
NOTA: +on la devolucin nil por parte de AutoL&'( nos empezamos a familiarizar
ahora y la veremos muchas veces.
+omencemos por el igual o igual $ue, cuya sinta%is es la siguiente<
(= valor1 [valor2...] )
La funcin = compara todos los valores especificados -uno como mnimo-,
devolviendo T si son todos iguales o nil si encuentra alguno diferente. Los valores
pueden ser nmeros, cadenas o variables *num)ricas o alfanum)ricas,. As por
ejemplo<
(= 5 5) devuelve T
(= 65 65.0) devuelve T
(= 7 54) devuelve nil
(= 87.6 87.6 87.6) devuelve T
(= 34 34 -34 34) devuelve nil
.eamos ahora algn ejemplo con cadenas<
(= "hola" "hola") devuelve T
(= "casa" "cAsa") devuelve nil
22
(= "H" "H" "H" "H") devuelve T
(= "hola ahora" "hola ahora") devuelve nil
NOTA: 7tese, como adelanto, $ue las cadenas literales han de ir encerradas entre
comillas, como en casi todos los lenguajes de programacin.
+on variables declaradas, $ue ya veremos, sera de la misma forma. 'i slo se indica
un valor en la lista, AutoL&'( devuelve T.
NOTA: Kay $ue tener en cuenta $ue esta funcin slo compara valores y no listas o
e%presiones. 'i, por ejemplo, se tienen dos variables pt1 y pt2 con dos puntos $ue son
listas de tres elementos *una coordenada 2, una coordenada L y una coordenada S,,
para comparar la igualdad de ambos habra $ue recurrir a una funcin lgica como
EQUAL, $ue veremos un poco ms adelante.
(/= valor1 [valor2...] )

Esta funcin /= *distinto o desigual $ue, devuelve T si alguno o algunos de los valores
comparados de la lista son diferentes o distintos de los dems, por ejemplo en los
siguientes casos<
(/= 2 3)
(/= "texto" "textos")
(/= (* 2 2) (* 2 4) (* 2 3)
#evuelve nil si todos los valores son iguales, por ejemplo<
(/= "casa" "casa" "casa")
(/= "1 2 3" "1 2 3" "1 2 3" "1 2 3" "1 2 3")
(/= 32 32 32 32)
(/= (* 10 10) (* 25 4))
'i nicamente se indica un valor, AutoL&'( devuelve T.
(< valor1 [valor2...] )
Esta sinta%is se corresponde con la comparacin menor $ue. Es una funcin AutoL&'(
$ue devuelve T si efectivamente el primer valor comparado es menor $ue el segundo.
'i e%isten diversos valores, cada uno ha de ser menor $ue el siguiente para $ue
AutoL&'( devuelva T. 'i no se devuelve nil. .eamos algunos ejemplos<
(< 2 3) devuelve T
(< 3 4 5 89 100) devuelve T
(< 3 -4 5 6) devuelve nil
(< (* 2 2) (/ 5 3)) devuelve nil
23
En el caso de cadenas o variables alfanum)ricas *las $ue contienen cadenas,, la
comparacin se efecta segn el valor de los cdigos A'+&&. (or lo tanto, ser el orden
alfab)tico ascendente *de la A a la S, la manera de considerar de menor a mayor los
caracteres, teniendo en cuenta $ue el espacio blanco es el carcter de menor valor y
$ue las letras maysculas son de menor valor $ue las minsculas. Ejemplos<
(< "a" "b") devuelve T
(< "z" "h") devuelve nil
(< "A" "a" "b") devuelve T
(< "f" "S") devuelve nil
'i las cadenas tienen ms caracteres se comparan de la misma forma<
(< "abc" "abd") devuelve T
(< "abc" "ab") devuelve nil
7o es posible comparar cadenas literales con nmeros; AutoL&'( devuelve un mensaje
de error $ue dice bad argument type. +on variables $ue contienen valores num)ricos
o literales se realizara de la misma manera<
(< valor1 valor2 total)
(< -12 -7 km hrs)
(< autor1 autor2 autor3 auto4 autor5)
(<= valor1 [valor2...] )
Esta es la funcin menor o igual $ue. Ounciona de la misma forma $ue la anterior pero
teniendo en cuenta $ue devolver T si cada valor es menor o igual $ue el anterior. 'i
no devolver nil. Ke a$u unos ejemplos<
(<= 10 30 30 40 50 50) devuelve T
(<= 12.23 12.23 14) devuelve T
(<= 56 57 57 55) devuelve nil
Las dems consideraciones son id)nticas a las de la funcin precedente.
(> valor1 [valor2...] )
Al igual $ue en la comparacin de menor $ue, pero de manera inversa, esta funcin
devuelve T si cada valor especificado, sea num)rico sea cadena, es mayor $ue el
siguiente, esto es, si se encuentran ordenados de mayor a menor. 'i no devuelve nil.
(or ejemplo<
(> 10 5 4.5 -2) devuelve T
(> "z" "gh" "ab") devuelve T
(> 23 45) devuelve nil
9tros ejemplos<
24
(> saldo divid)
(> pplanta ppiso pcubierta)
(>= valor1 [valor2...] )
'imilar a los anteriores, establece la comparacin mayor o igual $ue. 'e devolver T si
y slo si cada valor es mayor o igual $ue el $ue le sucede, si no, nil. Las dems
consideraciones son id)nticas a las otras funciones similares e%plicadas. Ejemplos<
(>= 33 23 23 12 12 54) devuelve nil
(>= 24 24 24 23 23 0.01 -3) devuelve T

(; 4a#e interme+ia +e e-ercicio#
&ndicar el resultado de AutoL&'( *T o nil, ante las siguientes proposiciones<
(= 23 23.0)
(= 48.0 (* 6 8))
(= "AutoLISP" "autolisp" "aUtOlIsP")
(/= (/ 7 2) (/ 2 7))
(/= "libro" "libro ")
(< 3 5 6 (+ 5 -67))
(<= "A" "A" "bc" "zk" "zk")
(> "coche" "mesa")
(>= "coche" "cochecito")
(>= "cochu" "coche" "coche" "cocha")
(>= "" "" "a")
4.4. O%eracione# $gica#
Adems de lo estudiado hasta ahora, e%isten cuatro operaciones lgicas referidas al
lgebra de "oole. Estas operaciones son el = lgico, el O lgico, la identidad y el NO
lgico. Adems, e%iste una $uinta funcin $ue veremos al final denominada de
identidad de e%presiones y $ue es un poco especial.
Las cuatro funciones $ue vamos a ver actan como operadores lgicos y devuelven, al
igual $ue las anteriores, nicamente los resultados T *cierto, o nil *falso,.
(AND expresin1 [expresin2...] )
Esta funcin realiza el = lgico de una serie de e%presiones indicadas $ue representan
otras tantas condiciones. Esto significa $ue evala todas las e%presiones y devuelve T
si ninguna de ellas es nil. En el momento en $ue alguna es nil, abandona la
evaluacin de las dems y devuelve nil. Es decir, se deben cumplir todas y cada una
de las condiciones. .eamos un ejemplo<
(AND (<= 10 10) (>= 10 10)) devuelve T
25
Esto significa $ue, si se cumple la condicin de la primera lista (<= 10 10) y, adems,
se cumple la de la segunda lista (>= 10 10) devolver T. +omo esto es as, devuelve
T.
#e otra forma, si una de las condiciones no se cumple, devuelve nil, por ejemplo en el
siguiente caso<
(AND (= 10 10) (> 10 10))
La primera condicin en verdadera */J es igual a /J,, pero la segunda es falsa */J no
es mayor $ue /J,. +omo una ya no se cumple se devuelve nil. Kan de cumplirse
todas las condiciones para $ue sea el resultado verdadero. .eamos otros dos ejemplos<
(AND (= 10 10) (> 23 22.9) (/= "camin" "camioneta")) devuelve T
(AND (<= "A" "a") (= 5 7)) devuelve nil
7o tiene mucho sentido indicar una sola e%presin con esta funcin. Las dos siguientes
son id)nticas y producen el mismo resultado<
(AND (= 20 -20))
(= 20 -20)
Ambas devuelven nil.
(OR expresin1 [expresin2...] )
1ealiza un O lgico de una serie de e%presiones $ue representan otras tantas
condiciones. Evala las e%presiones y devuelve nil si todas ellas son nil. En el
momento en $ue encuentre una respuesta distinta de nil, abandona la evaluacin y
devuelve T. Gsta es precisamente la mecnica del O lgico, es decir, basta $ue se
cumpla una de las condiciones para $ue la respuesta sea verdadera o cierta.
El siguiente ejemplo compara nmeros y devuelve nil<
(OR (< 20 2) (> 20 2))
9 sea, si es menor BJ $ue B -$ue no lo es- o si es mayor BJ $ue dos -$ue s lo es-,
devuelve T. El cumplirse una de las dos condiciones es condicin suficiente para $ue
devuelva T. .eamos otro ejemplo<
(OR (= 20 2) (> 2 20)) devuelve nil
En este caso ninguna de las dos condiciones se cumplen *ambas son nil,, as $ue el
resultado final ser nil.
+omo en el caso de la funcin AND, no tiene sentido utilizar una sola e%presin, ya $ue
el resultado sera el mismo $ue al escribirla sola. .eamos otros ejemplos<
26
(OR (>= 30 30 20 -5) (<= -5 -5 -4 0)) devuelve T
(OR (< (* 2 8) (* 2 3)) (= (/ 8 2) (* 4 1))) devuelve T
(OR (= "carro" "carreta") (= "casa" "caseta") (= 2 3) devuelve nil
1ecapitulando, y para afianzar estos dos ltimos conocimientos, decir $ue AND obliga a
$ue se cumplan todas las condiciones para devolver T. 'in embargo, a OR le basta con
$ue una de ellas se cumpla para devolver T. #igamos, en lenguaje colo$uial, $ue AND
es Fsi se cumple esto, y esto, y esto, y... es vlidoF, y OR es Fsi se cumple esto, o esto,
o esto, o... es vlidoF.
.eamos ahora otra funcin lgica para comparar e%presiones. 'e llama EQUAL y su
sinta%is es la siguiente<
(EQUAL expresin1 expresin2 [aproximacin] )
Esta funcin compara las dos e%presiones indicadas, si son id)nticas devuelve T, si
difieren en algo devuelve nil.
A primera vista puede parecer igual a la funcin = *igual $ue, estudiada, sin embargo,
)sta nicamente comparaba valores; EQUAL tiene la capacidad de poder comparar
cual$uier e%presin o lista de e%presiones. #e esta forma, podemos utilizar EQUAL de la
misma forma $ue =, as<
(EQUAL 2 2) devuelve T
(EQUAL -3 5) devuelve nil
(ero no tiene mucho sentido, ya $ue tenemos la funcin =. 1eservaremos EQUAL para
lo e%puesto, es decir, para la comparacin de listas de e%presiones.
As pues, y adelantndonos a algo $ue veremos un poco ms tarde, diremos $ue la
e%presin de las coordenadas de un punto 3# se escribira de la siguiente forma<
'(20 20 10)
El apstrofo es la abreviatura de la funcin QUOTE de AutoL&'(, $ue toma como
literales, y sin evaluar, las e%presiones $ue le siguen. #e esta forma, para comparar la
identidad de dos puntos haramos, por ejemplo<
(EQUAL '(20 20 10) '(20 20 10)) devuelve T
(EQUAL '(20 -5 10) '(20 20 10)) devuelve nil
NOTA: La funcin QUOTE se ve ampliada en la seccin 5.1.
El argumento optativo aproximacin se utiliza cuando se comparan e%presiones cuyos
resultados son nmeros reales y puede haber una pe$ue!a diferencia decimal $ue no
$ueramos considerar desigual. +on este argumento suministramos a la funcin un
valor de apro%imacin decimal respecto al cual se creern iguales los resultados. (or
ejemplo<
27
(EQUAL 23.5147 23.5148) devuelve nil
(EQUAL 23.5147 23.5148 0.0001) devuelve T
(NOT expresin )
La funcin NOT devuelve el NO lgico, es decir, si algo es verdadero devuelve falso y
viceversa. As, cuando el resultado sea distinto de nil *T,, devolver nil; cuando el
resultado sea nil, devolver T. (or ejemplo<
(NOT (= 2 2)) devuelve nil
(NOT (/= 2 2)) devuelve T
(EQ expresin1 expresin2 )
Esta funcin no es propiamente lgica, sino $ue se denomina de identidad de
e%presiones. An as, la introducimos en este apartado por su similitud con las
anteriores.
EQ compara las dos e%presiones *slo dos y ambas obligatorias, indicadas y devuelve T
si ambas son id)nticas o nil en caso contrario. 'e utiliza sobre todo para comparar
listas y ver si hay igualdad estructural.
La diferencia de EQ con EQUAL es $ue )sta ltima compara los resultados de evaluar las
e%presiones, mientras $ue EQ compara la identidad estructural de las e%presiones sin
evaluar. (or ejemplo, y adelantando la funcin SETQ $ue enseguida veremos, podemos
hacer lo siguiente<
(SETQ list1 '(x y z))
(SETQ list2 '(x y z))
(SETQ list3 list2)
(EQ list1 list2) devuelve T
(EQ list2 list3) devuelve nil
'e observa $ue list1 y list2 son e%actamente la misma lista por definicin, estn
declaradas con SETQ y por separado, siendo sus elementos iguales. (ero list3 es, por
definicin, igual a list2 y no a list3, aun$ue sus elementos sean iguales. Es por ello
$ue, en la segunda evaluacin, EQ devuelve nil.
NOTA: +omprenderemos enseguida el funcionamiento y base de la funcin SETQ, no
hay preocuparse.

4; 4a#e interme+ia +e e-ercicio#
&ndicar el resultado de AutoL&'( *T o nil, ante las siguientes proposiciones<
(AND (= (* 20 20) (/ 800 2)) (> 300 200 500))
(AND (>= "a" "a") (>="z" "a") (>= " " " ") (>= "" ""))
(AND (OR (= 2 2) (> 3 6)) (OR (= 7 5) (= 0 0)))
28
(EQUAL (AND (= 1 10) (= 1 1)) (OR (>= 3 2 1 0) (<= 0 -2)))
(OR (AND (= 1 1) (= 2.0 2)) (OR (NOT (= 1 1)) (= 2.0 2)))
NOTA: Apr)ciese la capacidad de poder anidar y combinar e%presiones.
L hasta a$u llega esta parte de funciones matemticas, lgicas y de comparacin.
(robablemente el lector estar pensando $ue de poco sirve lo e%puesto hasta ahora<
$u) ms dar $ue una e%presin matemtica me d) un resultado si luego no puedo
operar con )l; $ue importar $ue una proposicin lgica me devuelva T o nil si no me
sirve para otra cosa.
(aciencia... En el mundo de la programacin hay $ue empezar desde abajo y,
aseguramos $ue un buen dominio abstracto de lo visto hasta ahora proporcionar un
gran nivel de soltura a la hora de programar de verdad. 'eguramente, adems, a$uella
persona $ue sepa programar en algn lenguaje e%istente, habr comprendido algo ms
-ya $ue todos son muy parecidos-. El nefito comenzar a ver las cosas claras
inmediatamente.
A partir de la siguiente seccin comenzaremos a ver para $u) sirve todo esto y cmo
utilizarlo prcticamente en programas propios.
29
). CR&AR 8 D&CLARAR ARIA!L&S
:na vez visto lo visto, vamos a ver como podemos introducir valores en variables para
no perderlos. A esto se le llama declarar variables.
:na variable es un espacio en memoria donde se guardar, con un nombre $ue
indi$uemos, un valor concreto, una cadena de te%to, un resultado de una e%presin,
etc)tera. El comando para declarar variables en AutoL&'( es SETQ y su sinta%is es la
$ue sigue<
(SETQ nombre_variable1 expresin1 [nombre_variable2 expresin2...] )
#e esta manera introducimos valores en nombres de variables, por ejemplo<
(SETQ x 12.33)
Esta proposicin almacena un valor real de /B,33 unidades en una variable con nombre
x.
Al escribir una funcin SETQ atribuyendo a una variable un valor, AutoL&'( devuelve
dicho valor al hacer INTRO. AutoL&'( siempre tiene $ue devolver algo al ejecutar una
funcin.
+omo indica la sinta%is, podemos dar ms de un valor a ms de un nombre de variable
a la vez en una funcin SETQ, por ejemplo<
(SETQ x 54 y 12 z 23)
En este caso, AutoL&'( devuelve el valor de la ltima variable declarada. Esto no es
muy recomendable si las e%presiones o elementos de la lista son muy complicados, ya
$ue puede dar lugar a errores. A veces, aun$ue no siempre, es preferible utilizar
tantas SETQ como variables haya $ue declarar $ue hacerlo todo en una sola lnea.
'i declaramos una variable $ue no e%ista, se crea y se guarda en memoria con su
valor; si la variable ya e%ista cambiar su valor por el nuevo.
NOTA: Al comenzar un dibujo nuevo, abrir uno e%istente o salir de AutoCAD, el valor
de las variables se pierde de la memoria.
(odemos, como hemos dicho, atribuir valores de cadena a variables de la siguiente
forma<
(SETQ ciudad "Bilbao")
y combinar cadenas con valores num)ricos y8o e%presiones<
(SETQ ciudad "Bilbao" x (+ 23 45 23) v1 77.65)
#e esta forma, se guardar cada contenido en su sitio. Las variables $ue contienen
cadenas te%tuales han de ir entre comillas dobles *"",. A estas variables se las conoce
30
en el mundo de la informtica como variables alfanum)ricas o cadenas, y pueden
contener cual$uier carcter A'+&&. Las otras variables son num)ricas, y nicamente
contendrn datos num)ricos.
NOTA: #e forma diferente a otros lenguajes de programacin, en AutoL&'( no hay $ue
diferenciar de ninguna manera los nombres de variables num)ricas de los de variables
alfanum)ricas o cadenas.
(ara comprobar nosotros mismos el valor de una variable declarada, y como se e%puso
al principio de este MDULO ONCE, podemos evaluarla directamente introduciendo su
nombre, en la lnea de comandos, precedido del carcter de cierre de e%clamacin *!,.
(or ejemplo, declaradas las variables anteriores *ciudad, x y v1,, podemos e%aminar
su valor de la siguiente manera<
!ciudad devuelve "Bilbao"
!x devuelve 91
!v1 devuelve 77.65
As pues, imaginemos $ue $ueremos escribir unas pe$ue!as lneas de cdigo $ue
calculen el rea y el permetro de un crculo, segn unos datos fijos proporcionados.
(odramos escribir la siguiente secuencia en orden, acabando cada lnea con INTRO<
(SETQ Radio 50)
(SETQ Area (* PI Radio Radio))
(SETQ Perim (* 2 PI Radio))
#e esta forma, si ahora tecleamos lo siguiente se producen las evaluaciones indicadas<
!area devuelve 7853.98
perim devuelve 314.159
NOTA: +omo sabemos es indiferente el uso de maysculas y minsculas. Adems,
decir $ue podemos *lo podramos haber hecho con la variable Area, introducir tildes
y8o e!es en nombres de variable pero, por compatibilidad, es lgico y mucho mejor no
hacerlo.
NOTA: Es posible declarar variables con nombres de funciones inherentes de AutoL&'(,
pero cuidado, si hacemos estos perderemos la definicin propia de la misma y ya no
funcionar, a no ser $ue cambiemos de sesin de dibujo. As mismo, tampoco
debemos reasignar valores diferentes a constantes *$ue en realidad son variables,
por$ue podemos cambiarlas, propias de AutoL&'( como PI. La siguiente funcin $ue
veremos nos ayudar a evitar esto.
NOTA: 'i $ueremos ver el valor de una variable no declarada, AutoL&'( devuelve nil.
Al estar los valores guardados en variables, podemos utilizarlos para otras operaciones
sin necesidad de volver a calcularlos. 6eniendo en cuenta el ltimo ejemplo, podramos
hacer<
(+ area perim)
31
para $ue devuelva el resultado de la adicin de las dos variables. 9 incluso, podemos
guardar dicho resultado en otra variable, para no perderlo, as por ejemplo<
(SETQ total (+ area perim))
#espu)s podremos comprobar su valor escribiendo !total.
Lo $ue no podemos es realizar, por ejemplo, operaciones matemticas con variables
alfanum)ricas entre s, o con num)ricas y alfanum)ricas mezcladas *aun$ue las
cadenas contengan nmeros no dejan de ser cadenas te%tuales,. .eamos la siguiente
secuencia y sus resultados<
(SETQ x 34) devuelve 34
(SETQ y "ami") devuelve "ami"
(SETQ z "guitos") devuelve "guitos"
(SETQ w "12") devuelve "12"
(SETQ p 10) devuelve 10
(+ x p) devuelve 44
(+ p y) devuelve error: bad argument type
(+ x w) devuelve error: bad argument type
(+ y z) devuelve error: bad argument type
En otros lenguajes de programacin podemos concatenar cadenas de te%to con el
smbolo de suma 4, en AutoL&'( no. AutoL&'( ya posee sus propios mecanismos -$ue
ya estudiaremos- para realizar esta funcin. 6ampoco podemos, como vemos, operar
con cadenas y valores num)ricos, sean como sean y contuvieren lo $ue contuvieren.
.eamos algunos ejemplos ms de SETQ<
(SETQ ancho (* l k) largo (+ x1 x2) alto (* ancho 2))
NOTA: +omo vemos, podemos definir una variable con una e%presin $ue incluya el
nombre de otra definida anteriormente, aun$ue sea en la misma lnea.
(SETQ x (= 20 20))
Esta variable x guardara el valor verdadero *T,.
(SETQ zon (* (/ 3 2) 24 (EXPT 10 4)))
(SETQ f (1+ f))
Este ltimo ejemplo es lo $ue se denomina, en el mundo de la programacin
informtica, un contadorAsuma. Tuarda el valor de f ms una unidad en la propia
variable f *se autosuma /,.
+ambiando a otra cosa, vamos a comentar la posibilidad de perder la definicin de una
funcin AutoL&'( por declarar una variable con su nombre. E%iste una funcin $ue
muestra todos los smbolos actuales definidos. Esta funcin es<
32
(ATOMS-FAMILY formato [lista_s!mbolos] )
ATOMS-FAMILY, como decimos, muestra una lista con todos los smbolos definidos
actualmente. En esta lista entran tanto las su%rs *funciones inherentes, de AutoL&'(
como las funciones y variables definidas y declaradas por el usuario cargadas en la
actual sesin de dibujo. #e esta forma podemos consultar dicha lista para ver si
tenemos la posibilidad de dar ese nombre de variable $ue estamos pensando. Ah
tendremos todas las funciones propias e inherentes, adems de las variables ya
creadas.
+omo podemos observar en la sinta%is, esta funcin necesita un parmetro o
argumento obligatorio llamado formato. formato slo puede tomar dos valores< 0 1.
'i es 0, los smbolos se devuelven en una lista, separando cada nombre de otro por un
espacio en blanco. 'i es 1, los smbolos se devuelven entre comillas *separados
tambi)n por espacios blancos, para su mejor comparacin y e%amen. +uestin de
gustos; la verdad es $ue no se encuentra un smbolo tan fcilmente entre la
marabunta de t)rminos.
(ero con el argumento optativo podemos depurar o filtrar al m%imo la bs$ueda; de
esta manera es de la $ue ms se utiliza. +on lista_smbolos hacemos $ue se
e%aminen solamente los nombres $ue incluyamos en la lista. Estos smbolos habrn de
ir encerrados entre comillas y ser precedidos del apstrofo *', por ser una lista literal.
El resultado es otra lista en la $ue, los smbolos ya e%istentes aparecen en su sitio, en
el mismo lugar de orden donde se escribieron y, en el lugar de los no e%istentes
aparece nil.
'i por ejemplo $ueremos saber si el nombre de variable total e%iste ya como smbolo,
sea funcin inherente, propia o variable ya declarada, y deseamos el resultado como
simple lista escribiremos<
(ATOMS-FAMILY 0 '("total"))
y AutoL&'(, si no e%iste el smbolo, devolver<
(nil)
'i an no hemos declarado ninguna variable y escribimos<
(ATOMS-FAMILY 0 '("tot" "setq" "w" ">=" "sqrt" "suma"))
AutoL&'( devolver<
(nil SETQ nil >= SQRT nil)
L si lo escribimos as *con 1 para formato,<
(ATOMS-FAMILY 1 '("tot" "setq" "w" ">=" "sqrt" "suma"))
AutoL&'( devolver<
(nil "SETQ" nil ">=" "SQRT" nil)
33

).1. A /ue$ta# con e$ a%#tro4o >?
La hemos utilizado un par de veces este smbolo y, tambi)n, hemos e%plicado por
encima su funcin. .amos ahora a ampliar esa informacin.
El smbolo de apstrofo *', no es otra cosa, como ya se coment, $ue una abreviatura
de la funcin QUOTE de AutoL&'(. #icha funcin tiene la siguiente sinta%is de
programacin<
(QUOTE expresin )
o tambi)n<
(' expresin )
NOTA: 7tese $ue tras QUOTE hay un espacio pero, si se utiliza el apstrofo no hay $ue
introducirlo.
Esta funcin se puede utilizar con cual$uier e%presin de AutoL&'(. Lo $ue hace es
evitar $ue se evalen los smbolos y los toma como literales. #evuelve siempre el
literal de la e%presin indicada, sin evaluar. (or ejemplo<
(QUOTE (SETQ x 22.5)) devuelve (SETQ x 22.5)
(QUOTE hola) devuelve HOLA
(QUOTE (+ 3 3 3)) devuelve (+ 3 3 3)
Kay $ue tener cuidado al utilizar el apstrofo de abreviatura de QUOTE, ya $ue desde la
lnea de comandos no lo vamos a poder utilizar. 1ecordemos $ue AutoCAD slo
reconoce $ue estamos escribiendo algo en AutoL&'( en la lnea de comandos cuando
comenzamos por el par)ntesis de apertura (, o a lo sumo por la e%clamacin final !,
para evaluar variables directamente. E%presiones como las siguientes<
'(DEFUN diblin () "Nada")
'a
'var12
slo podremos introducirlas desde un archivo A'+&& *como veremos en seguida,.
(ues este comando es muy utilizado a la hora de introducir directamente, por ejemplo,
las coordenadas de un punto, ya $ue estas coordenadas son en el fondo una lista y $ue
no ha de ser evaluada. (or ejemplo '(50 50).
Lo mismo nos ha ocurrido con la lista de ATOMS-FAMILY. Gsta no ha de evaluarse *no
tiene otras funciones a!adidas, es simplemente un grupo de cadenas,, por lo $ue ha
de introducirse como literal.
34
:na lista $ue no tiene funcin a!adida, por ejemplo (50 50 -23) produce un error de
bad function en AutoL&'(, a no ser $ue se introduzca como literal<
(QUOTE (50 50 -23)) devuelve (50 50 -23)
NOTA: En la mayora de las funciones de AutoL&'(, al introducir un literal de e%presin
la haremos con el apstrofo directamente, ya $ue con QUOTE no funcionar. QUOTE slo
tendr validez cuando se utilice solo, sin ms funciones.

@. PRO5RA6ANDO &N UN ARCAIO ASCII
Kasta ahora hemos visto muchos ejemplos de funciones en AutoL&'(, pero todos ellos
los hemos tecleado desde la lnea de comandos de AutoCAD. Esto resulta un poco
engorroso, ya $ue si $uisi)ramos volver a teclearlos tendramos $ue escribirlos de
nuevo. 'abemos $ue e%iste la posibilidad de copiar y pegar en lnea de comandos, an
as es pesado tener $ue volver a copiar y pegar cada una de las lneas introducidas.
E%iste la posibilidad de crear archivos A'+&& con una serie de funciones AutoL&'(
*programa, $ue se vayan ejecutando una detrs de otra al ser cargado, el programa,
en AutoCAD. Gsta es la verdadera forma de trabajar con AutoL&'(. La escritura en
lnea de comandos est relegada a pruebas de funcionamiento de funciones.
+on este m)todo, no slo tenemos la posibilidad de editar unas lnea y correrlas
*ejecutarlas, bajo AutoCAD, sino $ue adems podremos elaborar programas e%tensos
$ue tendremos la posibilidad de cargar desde disco en cual$uier sesin de dibujo, en
cual$uier momento.
&ncluso, como veremos, es factible la creacin de rdenes o comandos para AutoCAD
14 $ue, siendo no otra cosa $ue programas en AutoL&'(, podremos ejecutar con slo
teclear su nombre. Estos programas manejarn la "ase de #atos de AutoCAD,
operarn con objetos de dibujo, utilizarn cuadros de dilogo o no como interfaz, y un
largusimo etc)tera. La programacin en AutoL&'(, unida a estructuras de mens, tipos
de lnea, patrones de sombreado y dems estudiado en este curso, nos permitir llegar
a crear verdaderas aplicaciones verticales para AutoCAD 14.
(ero para desarrollar un programa en un archivo A'+&& y luego poder cargarlo en
AutoCAD, no debemos simplemente escribir las e%presiones $ue ya hemos aprendido
y punto. Kay $ue seguir una lgica y hay $ue indicarle a AutoCAD, al principio del
programa, $ue estamos escribiendo un programa en AutoL&'(, precisamente.
:n archivo A'+&& puede contener varios programas o funciones de usuario en
AutoL&'(. 'e suelen escribir procurando no sobrepasar los EJ caracteres por lnea para
su edicin ms cmoda y, adems, se suelen sangrar en mayor o menor medida las
entradas de algunas lneas, dependiendo de la funcin -ya nos iremos familiarizando
con esto- para dar claridad al programa.
:n programa de AutoL&'( se compone de una serie de funciones AutoL&'( $ue se
ejecutan una detrs de la otra produciendo diferentes resultados. El caso sera el
mismo $ue ir introduciendo rengln a rengln en la lnea de comandos. (ero en un
35
archivo A'+&& hay $ue introducir todas las funciones dentro de la lista de argumentos
de otra $ue las engloba. Esta funcin es DEFUN y su sinta%is es<
(DEFUN nombre_funcin lista_argumentos expresin1 [expresin2...] )
DEFUN define una funcin de usuario. 'u par)ntesis de apertura es lo primero $ue debe
aparecer en un programa AutoL&'( y su par)ntesis de cierre lo ltimo tras todas las
funciones intermedias *despu)s puede haber otros DEFUN,.
nombre_funcin es el nombre $ue le vamos a dar a nuestra funcin y
lista_argumentos es una lista de argumentos globales o locales para la funcin. Los
argumentos o variables globales son a$uellos $ue se almacenan en memoria y
permanecen en ella; son todas las variables $ue hemos definiendo hasta ahora. Estas
variables pueden ser utilizadas por otros programas AutoL&'( o ser evaluadas
directamente en lnea de comandos mediante el carcter !.
Los smbolos locales son variables temporales. Estas se almacenan en memoria slo de
manera temporal, hasta $ue se termina la funcin en curso. :na vez ocurrido esto
desaparecen y no pueden ser utilizados por otros programas ni evaluados en lnea de
comandos. Estos smbolos locales han de estar indicados en la lista despu)s de una
barra */,. Esta barra tiene $ue estar separada del primer smbolo local por un espacio
en blanco y del ltimo smbolo global -si lo hubiera- por un espacio blanco tambi)n.
.eamos unos ejemplos<
(DEFUN func (x)... variable global< x
(DEFUN func (x y)... variables globales< x y
(DEFUN func (x / u z)... variable global< x variables locales< u z
(DEFUN func (/ x s)... variables locales< x s
'i el smbolo local se encontrara ya creado antes de ser utilizado en la funcin definida,
recupera el valor $ue tena al principio una vez terminada la funcin. 'i no se
especifican como locales al definir una funcin, todos los smbolos declarados con SETQ
dentro de ella son globales.
NOTA: #e momento vamos a olvidarnos de variables globales y locales, ya $ue todas
las funciones $ue definamos por ahora tendrn una lista de argumentos vaca. =s
adelante se profundizar en este tema.
#espu)s de esto, aparecern todas las e%presiones del programa, o sea, las funciones
de AutoL&'( o de usuario ya definidas $ue formen el conjunto del programa. Al final,
deber cerrarse el par)ntesis de DEFUN.
As pues, ya podemos crear nuestro primer programa en AutoL&'(. Este programa
calcular la raz cuadrada de un nmero, definidos anteriormente en una variables.
.eamos cmo es el pe$ue!o programa<
(DEFUN () Raiz
--(SETQ X 25)
--(SQRT X)
)
36
NOTA I>"ORTANTE DE SINTA?IS: E7 L9' (19T1A=A' &7+L:&1E=9' L9'
'A7T1A7#9' E7 O91=A #E T:&97E', (E19 E'69' 79 #E"E7 'E1 &7+L:&#9'
1EAL=E76E E7 EL +U#&T9, '&79 >:E 'E1V7 ':'6&6:&#9' (91 E'(A+&9'
"LA7+9'.
.amos a comentarlo un poco. #efinimos, lo primero, la funcin llamada Raiz con una
lista de argumento vaca. A continuacin, asignamos con SETQ el valor 25 a la variable
X y calculamos su raz cuadrada. Al final, cerramos el par)ntesis de DEFUN. 'imple.
NOTA: La razn para sangrar las lneas se debe a la comodidad de ver $u) par)ntesis
cierran a $u) otros. #e un golpe de vista se aprecia perfectamente.
NOTA: Es irrelevante la utilizacin de maysculas o minsculas en la programacin en
AutoL&'( *e%cepto en cadenas literales, lgicamente,.
(odamos haber hecho el programa sin variable, simplemente poniendo el valor tras la
funcin de la raz cuadrada, pero es otro modo de recordar y practicar. Escribmoslo y
guard)moslo con e%tensin .LSP. +omo nombre es recomendable darle el mismo $ue a
la funcin, es decir, $ue el nombre del archivo $uedara as< RAIZ.LSP. Esto no tiene
por $u) sentar ctedra.
.amos ahora a cargar nuestra nueva funcin en AutoCAD. El procedimiento es sencillo
y siempre el mismo. #esde @errABCar#ar apliai*nAAA accedemos al uadro Car#ar
ar'ivos Auto!IS"6 ADS y AR?. En este cuadro, pinchando en Ar'ivoAAA se nos abre un
nuevo cuadro para buscar y seleccionar el archivo. 6ras seleccionarlo *y pulsar A%rir,
volveremos al cuadro anterior donde pulsaremos el botn Car#ar. #e esta forma
cargamos el archivo para poder ser utilizado.
NOTA: 'i en este cuadro comentado activamos la casilla Cuardar lista, tendremos
accesibles en la lista Ar'ivos a ar#ar todos los archivos cargados desde la activacin
de la casilla. #e esta forma podremos modificar un archivo .LSP y, rpidamente, volver
a cargarlo escogi)ndolo de esta lista y pulsando Car#ar. 1ealmente la lista se guarda
en un archivo llamado APPLOAD.DFS y $ue estar guardado en el directorio al $ue haga
referencia el acceso directo $ue arranca AutoCAD en su casilla Iniiar en:.
El botn Desar#ar descarga de memoria la aplicacin designada y, el botn Suprimir,
elimina una entrada de la lista.
NOTA: Este cuadro de dilogo aparece tambi)n con el comando APPLOAD de AutoCAD
14.
:na vez cargada la funcin slo $ueda ejecutarla. (ara ello deberemos indicarla entre
par)ntesis, esto es *en la lnea de comandos,<
(RAIZ)
y AutoCAD devuelve<
37
2.23607
La razn de $ue haya $ue ejecutarlas entre par)ntesis es por$ue es una funcin
AutoL&'(; es una funcin definida por el usuario, pero no deja de ser AutoL&'(. (ero
e%iste una forma de no tener $ue escribir los par)ntesis para ejecutar una nueva orden
de usuario. Esta forma consiste en colocar justo delante del nombre de la nueva
funcin los caracteres C: *una ce y dos puntos,. #e la siguiente manera $uedara con
el ejemplo anterior<
(DEFUN () C:Raiz
--(SETQ X 25)
--(SQRT X)
)
As, nicamente habramos de escribir en la lnea de comandos<
RAIZ
para $ue devuelva el mismo resultado. #e esta forma, RAIZ es un nuevo comando
totalmente integrado en AutoCAD, el cual podramos ejecutar desde la lnea de
comandos o hacer una llamada a )l desde un botn de una barra de herramientas, o
desde una opcin de men, etc)tera.
NOTA: Las funciones definidas mediante este m)todo no admiten variables globales,
slo locales.
NOTA: Las maysculas o minsculas son tambi)n irrelevantes a la hora de llamar a un
funcin de usuario, al igual $ue ocurre con los comandos de AutoCAD.

); 4a#e interme+ia +e e-ercicio#
1ealizar un programa AutoL&'( $ue calcule la suma de los diez primeros nmeros.
1ealizar un programa $ue compare valores mayores.
1ealizar un programa $ue asigne valores a 3 variables y luego las multipli$ue todas
entre s.

B. CAPTURA 8 6AN&CO !DSICO D& DATOS
B.1. Ace%tacin +e %unto#
6ras lo estudiado parece ser $ue vamos entrando poco a poco y de lleno en el mundo
de la programacin en AutoL&'(. 'in embargo, an puede parecernos algo ilgico el
poder realizar un programa $ue calcule una serie operaciones con cantidades fijas, sin
poder variar de nmeros cada vez $ue se ejecute el programa, por ejemplo. En esta
38
seccin 7. vamos a aprender la forma $ue tenemos de pedirle datos al usuario para
luego operar con ellos. +omenzaremos por los puntos.
6odo lo $ue se refiere a captura de datos, tiene en AutoL&'( un nombre propio $ue es
"#$.... 'i nos damos cuenta, se ha indicado con punto suspensivos por$ue F"#$F
como tal no e%iste como funcin, sino una serie de ellas $ue comienzan con esas
letras. (ues bien, todas estas funciones del tipo "#$... nos proporcionarn las
posibilidad de preguntar al usuario por un te%to, por el valor de una distancia, por la
situacin de un punto, etc. para luego operar a nuestro antojo con dichos valores.
La primera funcin de este tipo $ue vamos a estudiar tiene la sinta%is<
(GETPOINT [punto_base] [mensa%e] )
GETPOINT solicita un punto al usuario. Esta funcin aguarda a $ue se introduzca un
punto, bien sea por teclado o se!alando en pantalla como habitualmente lo hacemos
con AutoCAD, y devuelve las coordenadas de dicho punto en forma de lista de tres
valores reales *2, L y S,. (ara probarla podemos escribir en la lnea de comandos<
(GETPOINT)
A continuacin, se!alamos un punto *o lo digitamos, y AutoL&'( devuelve las
coordenadas de dicho punto. Estas coordenadas, como hemos dicho, estn en forma
de lista, es decir, entre par)ntesis y separadas entre s por espacios en blanco *es una
tpica lista de AutoL&'( como hemos visto alguna ya,.
La potencia de esta funcin se desarrolla al guardar las coordenadas indicadas en una
variable, para $ue no se pierdan. En el momento en $ue capturamos los datos y los
almacenamos en una variable ya podemos utilizarlos posteriormente. (ara almacenar
los datos utilizaremos la funcin SETQ estudiada, de la siguiente manera por ejemplo<
(DEFUN C:CapturaPunto ()
--(SETQ Punto (GETPOINT))
)
+omo sabemos, para ejecutar esta nueva orden habr $ue escribir en la lnea de
comandos de AutoCAD<
CAPTURAPUNTO
+on el argumento opcional mensa%e de GETPOINT tendremos la posibilidad de incluir un
mensaje en la lnea de comandos a la hora de solicitar un punto. As, podramos variar
un poco el programa anterior de la siguiente manera<
(DEFUN C:CapturaPunto ()
--(SETQ Punto (GETPOINT "Introducir un punto: "))
)
#e esta forma se visualizar el mensaje indicado *siempre entre comillas, a la hora de
solicitar el punto.
39
El argumento punto_base permite introducir un punto base de coordenadas *B# 3#,,
a partir del cual se visualizar una lnea elstica hasta $ue indi$uemos un punto. .iene
a ser algo as como la manera de dibujar lneas en AutoCAD< se indica un punto y la
lnea se FenganchaF a )l hasta se!alar el segundo. #e todas formas no tiene nada $ue
ver. (ara indicar este punto de base lo podemos hacer mediante una variable $ue
contenga un punto o directamente con una lista sin evaluar *con apstrofo,, como
vimos<
(GETPOINT '(50 50) "Introducir un punto: ")
NOTA: Apr)ciese el espacio tras ...punto: . Es puramente decorativo. (roducira mal
efecto al aparecer en pantalla el mensaje si no estuviera este espacio. (ru)bese.
(ero, P$u) hacemos ahora con este puntoQ Kemos comenzado a ver la manera de
obtener datos del usuario, pero poco podremos hacer si no somos capaces de
procesarlos despu)s, al margen de las tpicas -$ue no intiles- operaciones
matemticas y de comparacin. (ara avanzar un poco ms, vamos a hacer un inciso en
la manera de capturar datos y vamos a ver la funcin COMMAND de AutoL&'(.
La funcin COMMAND permite llamar a comandos de AutoCAD desde AutoL&'(. 'us
argumentos son las propias rdenes de AutoCAD y sus opciones correspondientes. La
manera de indicarle estas rdenes y opciones del programa a la funcin COMMAND es
entre comillas dobles *"",, aun$ue tambi)n podremos indicar puntos en forma de lista
*o no,, valores en formato de e%presin matemtica y otros. La sinta%is de COMMAND es
la siguiente<
(COMMAND [comando] [opciones...] )
As por ejemplo, podemos ejecutar la siguiente funcin desde la lnea de comandos<
(COMMAND "linea" '(50 50) '(100 100) "")
Esto es, ejecutar el comando LINEA, darle HJ,HJ como primer punto y /JJ,/JJ como
segundo punto. Al final, un INTRO *"", para acabar la orden. La base es e%actamente
la misma $ue cuando escribamos la macro de un botn< hay $ue ir escribiendo
comandos y opciones como si fuera directamente en lnea de comandos. La diferencia
es $ue no hay $ue introducir ningn carcter para indicar un INTRO, simplemente al
escribir "LINEA" se ejecuta el comando, o al escribir '(50 50) se introduce el punto.
Es por ello $ue, al final haya $ue escribir un par de comillas dobles *sin espacio
intermedio, para acabar la orden LINEA, y es $ue estas comillas indican un INTRO.
+omo vemos, la manera de escribir las coordenadas de un punto es mediante un lista
sin evaluar *con apstrofo,. (ero es perfectamente lcito *slo con la funcin COMMAND,
introducirlas como algo $ue se escribira por teclado, es decir, de la siguiente forma<
(COMMAND "linea" "50,50" "100,100" "")
como ocurre con el comando LINEA. Esto no lo podremos hacer con el resto de
funciones.
40
NOTA: Al igual $ue en las macros y en los mens, sera ms recomendable, por a$uello
del soporte idiomtico del programa en AutoL&'(, escribir funciones como la anterior de
esta otra forma< (COMMAND "_line" `(50 50) `(100 100) "").
As pues, podramos reciclar nuestro ejemplo de GETPOINT de la siguiente forma<
(DEFUN C:DibCirc ()
--(SETQ Centro (GETPOINT "Introducir un punto: "))
--(COMMAND "_circle" Centro "10")
)
Este programa pedir un punto al usuario y dibujar un crculo de radio /J con centro
en dicho punto. 'encillo.
NOTA: 'i damos un nombre de un comando de AutoCAD a una funcin definida por
nosotros, recordar lo e%plicado en el MDULO NUEVE sobre redefinicin de rdenes.
L si $ueremos realizar un programa $ue sea totalmente compatible con todas las
versiones idiomticas de AutoCAD y, adems, evitar la posibilidad de $ue en una
m$uina haya rdenes predefinidas, utilizaremos los comandos con el guin de
subrayado y el punto juntos, de la forma< _.line.
NOTA: Las rdenes de AutoCAD $ue leen directamente informacin del teclado, como
TEXTODIN *DTEXT, o BOCETO *SKETCH,, no funcionan correctamente con la funcin
COMMAND, por lo $ue no se pueden utilizar. 'i se utiliza una llamada a la orden SCRIPT
mediante COMMAND deber ser la ltima llamada.
Al principio de este MDULO vimos $ue e%istan tres variables o smbolos predefinidos
de AutoL&'(. Entre ellas estaba PAUSE, y dijimos $ue se utilizaba con la funcin
COMMAND. La forma de hacerlo es introducir este smbolo predefinido como argumento
de COMMAND, esto har $ue el comando en curso, al $ue haya llamado la funcin, se
interrumpa para $ue el usuario introduzca algn dato. La mecnica es la misma $ue se
utilizaba al escribir un carcter de contrabarra en las macros de los mens o los
botones de barras de herramientas. (or ejemplo<
(COMMAND "_circle" '(50 50) pause)
Este ejemplo situar el centro de un crculo en el punto de coordenadas HJ,HJ y
esperar a $ue el usuario introduzca el radio *o dimetro,, sea por teclado o indicando
en pantalla. (odemos hacer zooms, encuadres y dems *siempre transparentes, hasta
introducir lo solicitado, momento en el cual se devolver el control a la funcin
COMMAND y terminar el comando.
NOTA: #e hecho, el smbolo PAUSE contiene el valor predefinido de contrabarra.
Wnicamente deberemos evaluarlo en lnea de comandos *!pause, para comprobarlo. El
resultado de esta evaluacin ser "\\", ya $ue \\, como est indicado en el punto <A
de la seccin 2.3. *en este MDULO,, es el cdigo para el carcter contrabarra. (or
compatibilidad, podemos introducir la cadena "\\" en lugar de PAUSE con funciones
COMMAND.
41
6erminado el inciso de la funcin COMMAND, vamos a seguir e%plicando otra funcin
similar a GETPOINT. Esta nueva se llama GETCORNER y su sinta%is es la siguiente<
(GETCORNER punto_base [mensa%e] )
La misin de GETCORNER es e%actamente la misma $ue la de GETPOINT *solicitar y
aceptar un punto,, la nica diferencia es la forma de visualizar dinmicamente el
arrastre. +on GETCORNER, en lugar de ser una lnea elstica *como ocurra con
GETPOINT con punto base,, es un rectngulo elstico. Esto nos lleva a deducir $ue esta
funcin necesita obligatoriamente $ue se indi$ue un punto de base para el rectngulo
*vemos en la sinta%is $ue es argumento obligatorio,. As<
(GETCORNER '(50 50))
situar la es$uina primera del rectngulo elstico en coordenadas HJ,HJ y esperar
$ue se se!ale, o se indi$ue por teclado, el punto opuesto por la diagonal. #evolver el
punto se!alado por el usuario en forma de lista.
El punto base se e%presa respecto al '+( actual. 'i se indica un punto de base 3# no
se tiene en cuenta su coordenada S, evidentemente< siempre se toma como tal el valor
actual de la elevacin.
El argumento mensa%e funciona de la misma forma $ue con GETPOINT, es decir, escribe
el te%to en lnea de comandos al solicitar el punto. .eamos un pe$ue!o ejemplo con
esta funcin<
(DEFUN C:Caja ()
--(SETQ Esq1 '(100 100))
--(SETQ Esq2 (GETCORNER Esq1 "Indique 2 punto de la diagonal del
--rectngulo: "))
--(COMMAND "rectang" Esq1 Esq2)
)
Este ejemplo dibuja un rectngulo cuya diagonal se sita entre el punto /JJ,/JJ y el
designado por el usuario. Al final, AutoL&'( devuelve nil. Esto no significa $ue haya
habido algn fallo, sino $ue, como dijimos, AutoL&'( siempre ha de devolver algo,
cuando no hay nada $ue devolver, el resultado ser nil.
La separacin en dos de la tercera lnea es nicamente problema de espacio en estas
pginas. Al escribirlo en un archivo A'+&& deberemos hacerlo todo seguido, en este
caso. En otros casos, si el mensaje $ue presentaremos en pantalla e%cede el nmero
de caracteres $ue caben en la lnea de comandos, podemos recurrir al cdigo \n,
e%puesto al principio de este MDULO con el resto de los cdigos admitidos. \n
representa un salto de lnea con retorno de carro, pero no un INTRO. #e esta forma, el
programa anterior mostrara la siguiente lnea en pantalla<
Indique 2 punto de la diagonal del rectngulo:
(ero si lo escribimos de la siguiente forma, por ejemplo<
42
(DEFUN C:Caja ()
--(SETQ Esq1 '(100 100))
--(SETQ Esq2 (GETCORNER Esq1 "Indique 2 punto\nde la diagonal\ndel
--rectngulo: "))
(COMMAND "rectang" Esq1 Esq2)
)
mostrar<
Indique 2 punto
de la diagonal
del rectngulo:
NOTA I>"ORTANTE DE SINTA?IS: =ientras no se indi$ue lo contrario, si se separan las
lneas en la escritura de los programas de estas pginas, es e%clusivamente por falta
de espacio. En la prctica, al escribir un programa en un editor A'+&&, cada vez $ue
damos un INTRO para saltar a la lnea siguiente, para el int)rprete de AutoL&'( es un
espacio en blanco. (or eso si escribimos lo siguiente<
(DEFUN C:MiProg
--(SETQ X 5)
--(COMM
--AND "linea" X '(10 10) "")
)
el resultado de la tercera lnea, $ue podemos ver en el historial de la lnea de
comandos pulsando F2 para conmutar a pantalla de te%to, ser el siguiente<
(COMM AND "linea" X '(10 10) "")
lo $ue producir un error null function de AutoL&'(. 'in embargo, si el programa
fuera<
(DEFUN C:MiProg
--(SETQ X 5)
--(COMMAND
--"linea" X '(10 10) "")
)
y siempre $ue tras COMMAND no e%ista ningn espacio, el resultado sera<
(COMMAND "linea" X '(10 10) "")
$ue es perfectamente correcto. 'i lo $ue $ueremos es separar en lneas te%tos literales
$ue aparecern por pantalla *por $ue no caben en una sola lnea,, utilizaremos el
cdigo \n e%plicado. (or lo general, escribiremos todas las lnea seguidas en el archivo
de te%to, a no ser $ue nos resulte incmoda su e%tremada longitud para la edicin.


43
B.'. Ca%tura +e +ato# num9rico#
'iguiendo con las funciones de solicitud de datos, vamos a pasar ahora a e%plicar cmo
preguntar por datos num)ricos al usuario. (ara este tipo de misin disponemos en
AutoL&'( de dos funciones, GETINT y GETREAL.
(GETINT [mensa%e] )
La funcin GETINT -cuya sinta%is se indica- solicita y acepta un nmero entero
introducido por el usuario. El valor de dicho nmero ha de estar comprendido entre M
3BDCE y 3BDCD. 'i se introduce un valor real o un dato no num)rico, AutoL&'(
devuelve un mensaje de error indicando $ue ha de ser un nmero entero y solicita un
nuevo nmero. El mensaje de error proporcionado es similar *aun$ue no igual, al $ue
produce el comando MATRIZ *ARRAY en ingl)s, de AutoCAD 14 al introducir un nmero
con decimales *real, cuando pregunta por nmero de filas o de columnas.
mensa%e proporciona la posibilidad de escribir un mensaje a la hora de solicitar el
valor; es opcional. +omo todos los te%tos literales y cadenas, el mensaje indicado ir
encerrado entre comillas dobles. :n ejemplo<
(GETINT "Introduzca el nmero de vueltas de la rosca: ")
(GETREAL [mensa%e] )
GETREAL es totalmente similar a la funcin anterior, salvo $ue acepta nmero reales.
Estos nmeros pueden tener todos los decimales $ue se $uiera introducir, separado de
la parte entera por el punto decimal *.,. 'i se introduce un nmero entero se toma
como real, es decir, con un decimal igual a J *BE X BE.J, y, si se introduce un carcter
no num)rico se produce un error de AutoL&'(, proporcionando la opcin de repetir la
entrada. El argumento mensaje funciona igual $ue con GETINT.
.eamos un ejemplo de un pe$ue!o programa con GETINT y GETREAL<
;Programa que realiza el producto
;entre un nmero entero y un nmero real.
(DEFUN C:Producto (); Comienzo de la funcin de usuario.
--(SETQ Ent (GETINT "Introduzca un nmero entero: ")); Nmero entero.
--(SETQ Real (GETREAL "Introduzca un nmero real: ")); Nmero real.
--(* Ent Real); Producto.
); Fin de funcin de usuario.
;Fin del programa
+omo vemos, los comentarios *precedidos del carcter ;, se pueden incluir en
cual$uier parte del programa. +omo se e%plic en el punto ,-A de la seccin 2.3.,
tambi)n podemos incluir comentarios en medio de las lneas utilizando los caracteres
;| para la apertura y |; para el cierre *son los caracteres de punto y coma y barra
vertical,. #e la siguiente forma<
(SETQ X ;| se guarda en x |; 5 ;|el valor 5|;)
44
9 incluso en varias lneas<
(SETQ X ;| se guarda
en x |; 5 ;|el valor 5|;)
NOTA: Al contrario de cmo ocurra en los archivos A'+&& de personalizacin, en un
archivo de cdigo AutoL&'( no se hace necesario un INTRO al final de la ltima lnea
para $ue funcione el programa. Aun$ue no viene mal introducirlo por comodidad y para
no perder la costumbre.

B.(. Di#tancia# " :ngu$o#
Las tres funciones siguientes nos permitirn solicitar distancias y ngulos al usuario. La
funcin GETDIST acepta el valor de una distancia introducida y su sinta%is es la
siguiente<
(GETDIST [punto_base] [mensa%e] )
El valor de la distancia puede ser introducida por teclado o directamente indicando dos
puntos en pantalla, como muchas distancias en AutoCAD. 'i se introduce por teclado
el formato ha de ser el establecido por el comando UNIDADES *UNITS,. (ero
independientemente de este formato, GETDIST devuelve siempre un nmero real.
mensa%e funciona como en todas las funciones e%plicadas. L punto_base permite
incluir un punto de base a partir del cual se visualizar una lnea elstica hasta
introducir un segundo punto para la distancia.
.eamos un ejemplo con GETDIST<
(DEFUN C:Circulo2 ()
--(SETQ Centro (GETPOINT "Introduzca el centro del crculo: "))
--(SETQ Radio (GETDIST Centro "Introduzca el radio del crculo: "))
--(COMMAND "_circle" Centro Radio)
)
Este ejemplo pide el centro de un futuro crculo y, al pedir el radio ya est
FenganchadoF a dicho centro; se introduce el segundo punto del radio y el crculo se
dibuja. Al final AutoL&'( devuelve nil.
NOTA: (ru)bese $ue podemos utilizar los modos de referencia a objetos *(unto Oinal,
(unto =edio, +entro...,, los filtros *.2L, .LS..., y dems con todos los pe$ue!os
programas $ue estamos aprendiendo a hacer.
(GETANGLE [punto_base] [mensa%e] )
GETANGLE espera a $ue el usuario introduzca un ngulo y devuelve su valor. #icho
ngulo puede ser introducido por teclado -segn formato actual de UNIDADES *UNITS,
- o mediante dos puntos en pantalla con el cursor. El valor devuelto siempre ser un
45
nmero real en radianes. Kay $ue tener en cuenta $ue los ngulos se devuelven
considerando como origen el indicado en la variable de AutoCAD ANGBASE, pero
medidos en el sentido antihorario *independientemente de lo $ue especifi$ue la
variable ANGDIR,. 'e utiliza esta funcin sobre todo para medir ngulos relativos.
NOTA: El orden de introduccin de los puntos *si se hace con el dispositivo se!alador,
influye en el ngulo medido. (or ejemplo, si desde un punto A a otro " de miden 3J
grados, desde el punto " al A se medirn B/J grados.
'i se indica un punto base se muestra la tpica lnea elstica. 'i se escribe un punto de
base 3#, el ngulo se mide sobre el plano 2L actual nicamente. 'i no se indica punto
de base se solicitan los dos puntos y se calcula el ngulo de la lnea $ue une ambos en
radianes.
mensaje funciona como en las funciones anteriores. .eamos un pe$ue!o ejemplo<
(DEFUN C:GiraSCP ()
--(SETQ AngRad (GETANGLE "Introduzca un ngulo: "))
--(SETQ AngGrad (/ (* AngRad 180) PI))
(COMMAND "_ucs" "_x" AngGrad)
)
El programa solicita el ngulo para imprimir un giro al '+( con respecto al eje 2 y lo
guarda en AngRad *como sabemos el resultado de GETANGLE es en radianes,. #espu)s
guarda en AngGrad la conversin del ngulo pedido a grados se%agesimales. (or
ltimo, gira el '+( el ngulo en cuestin alrededor del eje 2.
(GETORIENT [punto_base] [mensa%e] )
La funcin inherente a AutoL&'( GETORIENT funciona de forma parecida a la anterior.
La diferencia con GETANGLE estriba en $ue, GETORIENT devuelve los ngulos con el
origen J grados siempre en la posicin positiva del eje 2 del '+( actual y el sentido
positivo antihorario, independientemente de los valores de las variables ANGBASE y
ANGDIR de AutoCAD. 'e utiliza esta funcin sobre todo para medir ngulos absolutos.
Al igual $ue con GETANGLE, el valor devuelto es siempre en radianes y, si el punto de
base es 3#, el ngulo de mide sobre el plano 2L actual.
(ara comprender bien la diferencia entre ambas funciones de captura de ngulos
vamos a ver un ejemplo simple. 'i tuvi)ramos el origen de ngulos definido en el eje L
negativo y el sentido positivo como horario, lo $ue entendemos por un ngulo de 0H
grados *con respecto a la horizontal,, producira un valor de 0H grados con la funcin
GETORIENT y un valor de /3H grados con la funcin GETANGLE *ambos en radianes,.
'i indicamos dos puntos en pantalla $ue unidos describan una lnea a 0H grados *con
respecto a la horizontal,, el ngulo se mide desde el origen indicado en UNIDADES
*UNITS, con GETANGLE y desde el lado positivo del eje 2 con GETORIENT *las 3 de la
esfera de un reloj, hasta dicha lnea y siempre en sentido antihorario *con ambas
funciones,. #e ah los dos tipos de resultado.
46
Evidentemente, si indicamos un ngulo por teclado el resultado siempre ser el mismo.
El ejemplo de la funcin anterior puede aplicarse a )sta. Kabremos de tener mucho
cuidado a la hora de entrar los ngulos se!alando puntos, debido a las caractersticas
de ambas funciones, ya $ue pueden generar resultados errneos de giro del '+(.

B.4. So$icitu+ +e ca+ena# +e te2to
+on AutoL&'( tambi)n tenemos la posibilidad de solicitar, y posteriormente procesar,
cadenas de te%to. La funcin para realizar esto es GETSTRING. (odemos ver su sinta%is
a continuacin<
(GETSTRING [T] [mensa%e] )
GETSTRING acepta una cadena de caracteres introducida por teclado y devuelve dicha
cadena, precisamente en forma de cadena *entre comillas,. Ejemplo<
(GETSTRING)
'i introducimos las siguientes cadenas devuelve lo $ue se indica<
Auto+A# devuelve "AutoCAD"
/B30HC devuelve "123456"
&'$() devuelve ""
El argumento opcional T *o e$uivalente, de la funcin especifica la posibilidad de
introducir espacios blancos en la cadena. T es el smbolo predefinido del $ue hemos
hablado ms de una vez; es el carcter de cierto o verdadero. 'i no se incluye, o se
incluye otro u otros cuales$uiera, GETSTRING no aceptar espacios blancos y, en
momento en $ue se introduzca uno se tomar como un INTRO y se acabar la funcin.
'i se incluye este argumento, TE6'61&7T aceptar espacios blancos y slo ser
posible terminar con INTRO.
mensa%e acta como siempre. .eamos unos ejemplos<
(GETSTRING "Introduce un texto sin espacios: ")
(GETSTRING T "Introduce cualquier texto: ")
(GETSTRING (= 3 3) "Introduce cualquier texto: ")
(GETSTRING (/= 3 3) "Introduce un texto sin espacios: ")
'i se introduce una contrabarra *\, en cual$uier posicin, en dicha posicin se
devuelven dos contrabarras *\\, $ue, como sabemos, es el cdigo para el carcter
contrabarra. Esto ser til a la hora del manejo de archivos, $ue ya estudiaremos.
NOTA: +omo se ha visto en el tercero de los primeros ejemplos de esta funcin, si se
47
introduce un INTRO *o un espacio tambi)n si no se admiten,, AutoL&'( devuelve una
cadena vaca *"",. 'i se admiten espacios y slo se teclean espacios, se devuelven
dichos espacios como cadena.
NOTA: 'i se introducen ms de /3B caracteres, AutoL&'( slo devuelve los /3B
primeros, desechando los restantes.

B.). &#ta,$ecer mo+o# %ara 4uncione# GET...
Antes de ver la ltima funcin de este tipo, y para comprender su funcionamiento,
hemos de introducir una nueva funcin AutoL&'( muy utilizada y verstil. Esta funcin
es INITGET y su sinta%is es<
(INITGET [modo] [palabras_clave] )
La funcin INITGET especifica el modo en $ue va a operar la siguiente funcin del tipo
"#$..., esto es, la primera $ue se encuentre tras ella. Este modo se indica con el
argumento modo, y es un nmero entero cuyo valor especifica un bit de control $ue
determina los valores no permitidos para la siguiente funcin "#$.... Los valores son
los $ue siguen<
a$or +e ,it ......... 6o+o
-------------------------------------------------------------------------
1 AAAAAAAAAAAAAAAAAA 7o admite valores nulos, es decir, INTRO como respuesta.
2 AAAAAAAAAAAAAAAAAA 7o admite el valor cero *0,.
4 AAAAAAAAAAAAAAAAAA 7o admite valores negativos.
8 AAAAAAAAAAAAAAAAAA 7o verifica lmites, aun$ue est)n activados.
16 AAAAAAAAAAAAAAAAA *No se utiliDa,.
32 AAAAAAAAAAAAAAAAA #ibuja la lnea o el rectngulo elsticos con lnea de trazos en
AAAAAAAAAAAAAAAAAAAA lugar de continua.
64 AAAAAAAAAAAAAAAAA Kace $ue la funcin GETDIST devuelva distancias B#.
128 AAAAAAAAAAAAAAAA (ermite introducir datos arbitrarios por teclado. 6iene prioridad
AAAAAAAAAAAAAAAAAAAA sobre el valor 1.
(ara ver la manera de utilizar esto pongamos un ejemplo. &maginemos $ue $ueremos
solicitar un nmero al usuario para realizar una cierta copia de objetos. #icho nmero,
evidentemente, habr de ser entero *utilizaremos GETINT,, pero adems no puede ser
48
negativo *no podemos copiar un objeto MB0 veces,. (ues para controlar dicho filtro,
escribiremos lo siguiente<
(INITGET 4); Establece que el siguiente GETINT no admita valores
negativos
(GETINT "Introduzca el nmero de copias: "); Solicita el nmero de copias
#e esta forma, si el usuario introduce un nmero negativo, AutoL&'( devuelve un
mensaje de error diciendo $ue el nmero ha de ser positivo, y vuelve a solicitarlo.
(ero siguiendo con nuestro ejemplo, nos percatamos de $ue tampoco se podra
introducir un valor de cero, por$ue no se puede copiar un objeto J veces. Kabremos de
indicarle tambi)n a GETINT $ue tampoco admita el cero como respuesta. (ara
especificar varios valores a la vez debemos sumarlos. As pues, como el modo de no
admitir negativos es el 4 y el de no admitir el cero es el 2, el valor final del bit sera un
6 *8 4 1 0 ;,. #e esta forma haramos<
(INITGET 6)
(GETINT "Introduzca nmero de copias: ")
L para FredondearF el ejemplo, $ue menos $ue evitar $ue introduzca un INTRO a la
pregunta, es decir, obligar al usuario a introducir un valor<
(INITGET 7)
(GETINT "Introduzca nmero de copias: ")
Esto es resultado de sumar los tres valores de bits correspondientes *, 4 1 4 8 0 :,.
El modo en INITGET tambi)n puede indicarse como suma de valores de bits. (or
ejemplo, el ltimo caso podra haberse escrito as<
(INITGET (+ 1 2 4))
(GETINT "Introduzca nmero de copias: ")
'i se vuelve a utilizar ahora otra funcin del tipo "#$... habra $ue especificar otro
INITGET si fuera necesario, ya $ue cada uno slo afecta a la funcin "#$... $ue le
sigue y solamente a esa.
NOTA: INITGET siempre devuelve nil.
Los modos establecidos con INITGET slo se tienen en cuenta para las funciones
"#$... con las cuales tienen sentido. As, no tiene sentido establecer un modo $ue no
admita valores negativos con una funcin GETPOINT, puesto $ue )sta devuelve un
punto como una lista de tres elementos y las listas no pueden ser negativas por
definicin. En la siguiente tabla se muestran los modos $ue tienen sentido con las
diferentes funciones tipo "#$....
=uncin a$ore# +e ,it# +e mo+o con #enti+o %ara $a 4uncin
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
49
GETINT 1 --- 2 --- 4 --------------------- 128
GETREAL 1 --- 2 --- 4 --------------------- 128
GETDIST 1 --- 2 --- 4 --------- 32 --- 64 - 128
GETANGLE 1 --- 2 --------------- 32 -------- 128
GETORIENT 1 --- 2 -------------- 32 -------- 128
GETPOINT 1 --------------- 8 --- 32 -------- 128
GETCORNER 1 --------------- 8 --- 32 -------- 128
GETSTRING ---------------------------------------
GETKWORD 1 --------------------------------- 128
El valor 128 es el ms especifico. 'e utiliza para tener la posibilidad de responder a una
solicitud de funcin "#$... por ejemplo con una e%presin AutoL&'(. Gsta se aceptara
como una cadena de te%to y se podra evaluar posteriormente mediante la funcin
EVAL *tal como veremos,. +omo el valor 128 tiene prioridad sobre el valor de bit 1, se
aceptara tambi)n un INTRO en la forma de una cadena de te%to vaca "".
.eamos un pe$ue!o programa de ejemplo de todo esto e intentemos comprenderlo. El
listado es el $ue sigue<
; Nuevo comando CircEjes de AutoCAD
(DEFUN CircEjes (/ Centro Radio)
--(INITGET 1)
--(SETQ Centro (GETPOINT "Centro del crculo: "))
--(INITGET (+ 1 2 4))
--(SETQ Radio (GETDIST Centro "Radio del crculo: "))
--(COMMAND "_circle" Centro Radio)
--(INITGET 1)
--(COMMAND "_line" Centro "_qua" "\\" "")
--(COMMAND "_line" Centro "_qua" "\\" "")
--(COMMAND "_line" Centro "_qua" "\\" "")
--(COMMAND "_line" Centro "_qua" "\\" "")
)
(DEFUN C:CircEjes ()
--(CircEjes)
)
; Fin de CircEjes
En este ejemplo se observan algunas prcticas habituales a la hora de desarrollar
programas en AutoL&'(. La primera dice relacin a la estructuracin de programas.
+omo se ve, primero se define una funcin de usuario CircEjes y luego el propio
50
comando de AutoCAD *C:CircEjes, con el mismo nombre. Esto se suele realizar as,
primero por estructurar los programas< la definicin de la orden de usuario
*C:CircEjes, no contiene la secuencia de rutinas del programa en s, sino una llamada
a las funciones de usuario *en este caso slo una, CircEjes, necesarias para ejecutar
la orden. L, segundo, por claridad estructural a la hora de observar el listado de un
programa< podemos acceder directamente al comando de usuario *C:CircEjes, para
ver como va llamando sucesivamente a diferentes funciones e ir comprobando cada
una de ellas. (or lo tanto, bajo la definicin del comando en s, nicamente aparecern
llamadas a funciones *entre par)ntesis por$ue son funciones de AutoL&'( sin los
caracteres C:, y algunas otras funciones $ue ya veremos; por ejemplo para establecer
valores de variables antes y despu)s de las llamadas, etc)tera.
(or otro lado tambi)n podemos apreciar la declaracin de las dos variables $ue
utilizar el programa como locales en los argumentos de DEFUN. +omo se e%plic, la
manera de declarar variables locales es con una barra y, despu)s de un espacio, sus
nombres separados tambi)n por espacios. L la diferencia $ue haba con las globales, es
$ue las locales desaparecen de memoria en cuanto se acaba de ejecutar el programa,
o sea, no ocuparn memoria intilmente. 'i al acabar el programa intentamos evaluar
alguna en la lnea de comandos mediante el carcter !, el resultado ser nil.
9tra de las caractersticas importantes de definir, por un lado la funcin de usuario y
por el otro el comando de AutoCAD, es la posibilidad de introducir variables globales
en los argumentos de las funciones creadas con DEFUN. 1ecordemos $ue si definimos
con DEFUN una funcin del tipo C: *comando de AutoCAD, no se pueden introducir
variables globales en sus argumentos. 1ecordemos tambi)n $ue si no se introduce
argumento alguno, todas las variables declaradas con SETQ sern globales *seguirn en
memoria al terminar el programa,. Esto puede ser til cuando otro programa AutoL&'(
necesita de esas variables para funcionar.
(or ltimo, hemos de recordar tambi)n $ue si introducimos variables globales y locales
juntas como argumentos de DEFUN, entre la ltima global y la barra, y entre la barra y
la primera local habr de haber un espacio blanco. Adems siempre estarn en el
orden globalAlocal.
El programa del ejemplo en s es un poco rudimentario, pero con los conocimientos $ue
poseemos hasta ahora no podemos hacer ms. 'implemente dibuja *de un modo un
poco chapucero y manual, un crculo con sus cuatro ejes -slo hasta el crculo, sin
sobresalir-. (ide el centro y el radio, dibuja el crculo y, luego, va dibujando lneas
*cuatro, desde el centro hasta un punto $ue ha de indicar el usuario. El punto $ue
debe indicarse ha de ser un cuadrante *aun$ue no es obligatorio, pero si no se indica el
programa no funcionar bien,. El modo de referencia +uadrante se activa
automticamente tras FengancharseF la lnea al centro del crculo.

B.).1. Pa$a,ra# c$a/e
Kemos dejado un poco colgada la e%plicacin de INITGET, a falta de e%plicar el
segundo de sus argumentos palabras_clave. .amos a ver para $ue sirve
e%actamente.
51
El argumento palabras_clave es una cadena de te%to $ue define una serie de
respuestas alternativas para las funciones del tipo "#$.... .amos a ver un ejemplo
para entender esto. &maginemos $ue $ueremos solicitar un punto para el final de una
lnea, lo haremos con GETPOINT. 'abemos $ue dicho punto lo podemos introducir
directamente en pantalla o por teclado. (ero, en este caso, tambi)n nos interesa $ue
se acepten otros caracteres, por ejemplo una FKF para deshacer el tramo ltimo y una
F+F para cerrar. +omo bien sabemos, si introducimos un carcter no num)rico con
GETPOINT AutoL&'( nos dar un mensaje de error. (ero si definimos $u) caracteres se
pueden aceptar *los e%puestos, GETPOINT los capturar sin ningn problema. Esto lo
realizamos desde INITGET. .amos a ver el ejemplo<
(INITGET 1 "H C")
(GETPOINT "Introducir nuevo punto: ")
En este caso GETPOINT no acepta INTRO como respuesta *valor de bit 1,, pero si
aceptar un carcter H o un carcter C *da lo mismo maysculas $ue minsculas,. Los
caracteres han de indicarse entre comillas -es una cadena- y separados entre s por
un espacio blanco.
'i las respuestas posibles tienen una o varias letras como abreviatura mnima
necesaria para identificar dicha respuesta, se indican esas letras en maysculas en
INITGET y el resto en minsculas. (or ejemplo<
(INITGET "desHacer Cerrar")
Este ejemplo aceptar como respuesta vlida H *o h,, C *o c, y las palabras completas
DESHACER y CERRAR *tanto maysculas como minsculas,. Es e%actamente lo mismo
$ue podemos apreciar en el comando MATRIZ *ARRAY en ingl)s, de AutoCAD, por
ejemplo. 6ras teclearlo y designar los objetos correspondientes, el comando e%pone<
Matriz Rectangular o Polar (<R>/P):
(odemos escribir R, P, Rectangular o Polar, cual$uiera de las opciones. 'i )sta fuera
una orden de usuario, la funcin INITGET podra haber sido<
(INITGET "Rectangular Polar")
Kemos de tener cuidado con esto de las abreviaturas por$ue a veces, incluso con los
propios mensajes $ue emite AutoCAD, parece $ue hay mucha gente $ue tiene
problemas. En el caso siguiente<
(INITGET "DESactivar")
no se admite ni D ni DE, sino DES *como abreviatura vlida, y la palabra completa
DESACTIVAR; tanto maysculas como minsculas todas las opciones.
La abreviatura es pues el mnimo nmero de caracteres en $ue debe coincidir la
respuesta del usuario con la alternativa indicada en INITGET. A partir de ah, se
admiten ms caracteres por parte del usuario hasta la longitud de la respuesta
alternativa completa. (or ejemplo<
52
(INITGET 1 "Cont")
admitira C, CO, CON o CONT *maysculas o minsculas,, pero no CONTINUA o
CONTINUAR.
NOTA: Es norma lgica indicar, como mnimo, el bit 1 en estos tipos de INITGET con
palabras clave para $ue no se admita el INTRO como respuesta, ya $ue es necesaria
una de las opciones.
6ambi)n el posible indicar la abreviatura junto a la respuesta completa en maysculas
y separada por una coma *aun$ue recomendamos el m)todo anterior,. (or ejemplo<
(INITGET 1 "DESACTIVAR,DES")
e$uivale a
(INITGET 1 "DESactivar")
NOTA: 6odas las funciones "#$... admiten palabras clave.
:n ejemplo sencillo aun$ue no funcional<
(DEFUN C:Prueba ()
--(INITGET 1 "desHacer Cerrar")
(GETPOINT "desHacer/Cerrar/<Primer punto>: ")
)
Este ejemplo no realiza nada, y es $ue an no hemos aprendido a procesas estos datos
de palabras clave. (ero es una buena muestra de lo $ue sera un mensaje tpico de
AutoCAD en la lnea de comandos. El programa muestra<
desHacer/Cerrar/<Primer punto>:
La opcin por defecto *entre corchete angulares, es se!alar un punto en pantalla *o
por teclado,, aun$ue podemos acceder a otras dos opciones alternativas mediante los
caracteres H y C *o sus palabras completas, respectivamente. Al acceder a estas
opciones el programa no hace nada y es $ue, como decimos, hace falta procesar esta
entrada de usuario *ya se ver,.
Al indicar cual$uiera de las opciones anteriores, AutoL&'( devuelve la palabra clave,
entre comillas, correspondiente indicada en INITGET.
(ues vista esta caracterstica de las palabras clave, ya podemos estudiar la ltima de
las funciones "#$..., la cual emplazamos para despu)s de INITGET y es GETKWORD. La
sinta%is de GETKWORD es<
(GETKWORD [mensa%e] )
53
Esta funcin solicita nicamente una de una serie de palabras clave indicadas en
INITGET de la forma e%plicada. 'lo sirve para palabras clave, y nada ms. 'olicitar
dichas palabras y, si no se introduce alguna de ellas, da un mensaje de error y vuele a
indicar la solicitud. (or ejemplo<
(INITGET 1 "S No")
(GETKWORD "Cerrar el muro (S/No): ")
6ras esta pregunta podramos teclear, como sabemos, o S o N o SI o NO *incluso el FsF
sin tilde y tanto maysculas como minsculas,. (ero slo podramos realizar dichas
entradas, ninguna ms.
La funcin GETKWORD devuelve, como cadena de te%to, la opcin especificada tal y
como se indic en INITGET. 'i no se especific ninguna devuelve nil.

@; 4a#e interme+ia +e e-ercicio#
1ealizar un programa $ue dibuje aros *arandelas sin relleno, solicitando el centro, el
dimetro interior y el dimetro e%terior.
1ealizar el mismo ejercicio anterior pero solicitando el centro, el radio intermedio del
aro *mitad entre interior y e%terior, y el grosor del mismo.
(racticar la caracterstica de palabras clave con algn ejercicio inventado, aun$ue no
se procesen las entradas de estas palabras.
54
E. ACC&SO A ARIA!L&S D& AutoCAD 14
.amos a e%plicar ahora, en esta seccin, el control $ue podemos tener desde AutoL&'(
con respecto a las variables de sistema de AutoCAD 14.
(ara lo $ue se refiere a este control tenemos a nuestra disposicin dos funciones muy
importantes y utilizadas en la programacin en AutoL&'(. Esta funciones son GETVAR y
SETVAR. 'i revisamos el MDULO NUEVE de este curso, acerca de la programacin en
lenguaje #&E'EL, recordaremos la misin $ue realizaba la funcin GETVAR de este
lenguaje. (ues e%actamente la misma *y con el mismo nombre, realiza bajo AutoL&'(.
Lo nico $ue vara es la sinta%is de la funcin, debido a las e%igencias propias de
AutoL&'(, pero tampoco demasiado, es la siguiente<
(GETVAR nombre_variable )
+on GETVAR e%traemos o capturamos el valor actual de la variable de sistema o
acotacin de AutoCAD 14 indicada en nombre_variable, o sea, de cual$uier variable
del programa.
+omo sabemos, AutoCAD funciona internamente con multitud de variables
*APNDICE B, $ue controlan prcticamente todos los aspectos del programa. El $ue
posea el conocimiento y habilidad de manejo de las variables de AutoCAD, se puede
decir $ue posee el control casi al /JJY sobre )l. (ues desde AutoL&'( accederemos al
contenido de dichas variables para luego procesarlo, o simplemente como informacin.
El nombre de la variable habr de ir entre comillas, por ser cadena. .emos un ejemplo<
(GETVAR "pickfirst")
Esta e%presin devolver el valor de la variable de sistema de AutoCAD 14
PICKFIRST, $ue controla la llamada designacin Nom%re&Ver%o.
9tros ejemplos<
(GETVAR "blipmode")
(GETVAR "aperture")
(GETVAR "blipmode")
(GETVAR "dimtad")
(GETVAR "modemacro")
NOTA: 'i la variable indicada no e%iste, AutoL&'( devuelve nil.
(or su lado, SETVAR realiza la accin contraria, es decir, introduce o asigna un valor a
una variable de AutoCAD. 'u sinta%is es<
(SETVAR nombre_variable valor )
SETVAR asignar valor a nombre_variable, segn esta sinta%is, y devolver valor
como respuesta. El nombre de la variable en cuestin deber ir entre comillas, al igual
$ue con GETVAR, y el valor $ue se le asigne deber ser coherente con la informacin
55
$ue puede guardar la variable. 'i no es as, AutoL&'( devuelve el error AutoCAD
rejected function.
NOTA: En el APNDICE B, adems de la lista de las variables de sistema y acotacin
de AutoCAD 14, se muestra tambi)n el significado de cada una de ellas y el tipo de
valor $ue pueden guardar, as como el rango de )ste o las opciones disponibles.
.eamos algn ejemplo<
(SETVAR "filletrad" 2)
(SETVAR "proxygraphics" 0)
(SETVAR "attdia" 1)
'i no e%iste la variable se devuelve el mismo error $ue si se le introduce un valor
errneo.
El funcionamiento de SETVAR cuando un comando se encuentra en curso es
completamente transparente, es decir, sera como utilizar el comando MODIVAR *SETVAR
en ingl)s, igual $ue la funcin, de AutoCAD de manera transparente, con el apstrofo
delante. En estos casos puede suceder $ue la modificacin de la variable slo surta
efecto en la siguiente orden o en la siguiente regeneracin.
:n ejemplo de total trasparencia podra ser<
(COMMAND "_erase") (SETVAR "pickbox" 2)
COMMAND llama al comando BORRA *ERASE, de AutoCAD, el cual se $ueda esperando en
Designar objetos<. #espu)s SETVAR cambia el valor de la mira de designacin a un
valor de 2. Este cambio se efecta de manera trasparente, y la orden BORRA sigue
pidiendo designar objetos, pero ahora visualiza la mirilla con el nuevo tama!o de mira
de designacin.
Evidentemente no se puede cambiar el valor de una variable $ue sea de slo lectura. 'i
se intenta, se producir el mismo error antes comentado en dos ocasiones.
NOTA: (ara algunas variables como ANGBASE y SNAPANG, el valor de las mismas se
interpreta en radianes al acceder mediante AutoL&'(, mientras $ue si se accede con
MODIVAR, desde la lnea de comandos *o tecleando el nombre de la variable,, su valor
se considera en grados. +uidado con esto. La misma consideracin para GETVAR.
:n ejemplo prctico y muy usado es la posibilidad de desactivar el eco de la lnea de
comandos en la ejecucin de programas AutoL&'(. Este eco *variable CMDECHO, evitar
$ue las funciones de AutoL&'( vayan devolviendo nmeros, cadenas y dems a lo largo
de la ejecucin. L anta!o, cuando las marcas au%iliares *variable BLIPMODE, venan
activadas por defecto en AutoCAD, se utilizaba mucho la posibilidad de desactivarlas
para producir unas rutinas FlimpiasF. .eamos en uno de los ejemplos vistos hace poco<
(DEFUN CircEjes (/ Centro Radio)
--(INITGET 1)
--(SETQ Centro (GETPOINT "Centro del crculo: "))
--(INITGET (+ 1 2 4))
56
--(SETQ Radio (GETDIST Centro "Radio del crculo: "))
--(COMMAND "_circle" Centro Radio)
--(INITGET 1)
--(COMMAND "_line" Centro "_qua" "\\" "")
--(COMMAND "_line" Centro "_qua" "\\" "")
--(COMMAND "_line" Centro "_qua" "\\" "")
--(COMMAND "_line" Centro "_qua" "\\" "")
)
(DEFUN C:CircEjes ()
--(SETVAR "cmdecho" 0)
--(SETVAR "blipmode" 0)
--(CircEjes)
--(SETVAR "cmdecho" 1)
--(SETVAR "blipmode" 1)
)
(odemos observar otra aplicacin a la hora de estructurar la programacin. El comando
de AutoCAD *C:CircEjes, slo contiene la llamada a la funcin $ue realiza toda la
tarea y las definiciones de los valores de las variables pertinentes antes de la propia
llamada; restaurando sus valores al final del programa *tras la ejecucin de la funcin,.

F. &STRUCTURAS !DSICAS D& PRO5RA6ACIN
En el mundo de los lenguajes de programacin e%isten un par de estructuras $ue, con
todas sus variantes, son consideradas las estructuras bsicas o elementales a la hora
de programar. Esta estructuras son las condicionales *o alternativas, y las repetitivas.
#entro de cada una de ellas pueden e%istir variantes, como decimos, $ue realicen el
trabajo de distinta forma. (or ejemplo, y si sabemos programar algo en "A'&+
*>uic?"A'&+, pensaremos en I)AAA T@ENAAA E!SE, E@I!EAAA EEND o SE!ECT CASE
como estructuras alternativas o condicionales y en )ORAAA NE?T o COS+BAAA RET+RN
como estructuras repetitivas. Kay ms, en este y en todos los lenguajes, cada una
operando a su manera, pero todas dentro del mismo grupo.
(ues en AutoL&'( tambi)n disponemos de una serie de funciones $ue nos van a
permitir jugar con la posibilidad de ejecutar determinados tramos de nuestro programa
si se da una condicin, o repetir una serie de funciones un determinado nmero de
veces, etc)tera.
.amos a empezar pues con la primera.
(IF condicin accin_se_cumple [accin_no_se_cumple] )
La funcin IF establece una condicin en forma de e%presin evaluada. 'i dicha
condicin se cumple, es decir si el resultado es distinto de nil, entonces pasa a
evaluar la e%presin contenida en accin_se_cumple. En este caso devuelve el
resultado de esta e%presin.
'i la condicin no se cumple, es nil, entonces pasa a evaluar el contenido de la
e%presin en accin_no_se_cumple, si es $ue e%iste *es opcional,. El contenido en
57
este caso de la accin si es $ue se cumple sera obviado, al igual $ue el contenido de la
accin si no se cumple cuando se cumple.
'i no se indica accin_no_se_cumple y la condicin no se cumple *no evala
accin_se_cumple,, AutoL&'( devuelve nil.
.eamos un ejemplo para aclararnos un poco<
(DEFUN C:Personal ()
--(SETQ Nombre (GETSTRING T "Introduce tu nombre: "))
--(IF (= Nombre "Jonathan")
----(SETVAR "blipmode" 0)
----(SETVAR "blipmode" 1)
--)
)
Este pe$ue!o programa ha podido ser dise!ado para $ue pregunte por un nombre, $ue
guardar en la variable *global, Nombre. #espu)s se pregunta< si Nombre es igual a
Jonathan, entonces se establece la variable BLIPMODE a 0, si no, se establece
BLIPMODE a 1. #ependiendo del nombre $ue tecleemos se realizar una accin u otra.
9tro ejemplo<
(DEFUN C:Compara ()
--(SETQ Punto1 (GETPOINT "Primer punto: "))
--(SETQ Punto2 (GETPOINT "Segundo punto: "))
--(IF (EQUAL Punto1 Punto2)
----(PROMPT "Son iguales.")
----(PROMPT "No son iguales.")
--)
)
Este ejemplo acepta dos puntos introducidos por el usuario. 'i dichos punto son
iguales *comparados con EQUAL, el resultado de la comparacin es cierto *T, por lo $ue
se escribe el mensaje Son iguales. *accin_se_cumple,; si no lo son, el resultado es
nil y pasa directamente a escribir No son iguales. *accin_no_se cumple,.
NOTA: Kemos conjeturado el funcionamiento de PROMPT. An as, lo veremos
inmediatamente.
+omo ya se ha dicho, la accin $ue se realiza si no se cumple la condicin no es
obligatorio ponerla. As, podemos realizar un pe$ue!o ejercicio en el $ue no haga nada
ni no se cumple la condicin<
(DEFUN C:Prueba ()
--(SETQ X (GETDIST "Distancia primera: "))
--(SETQ Y (GETDIST "Distancia segunda: "))
--(IF (>= X Y)
----(SETQ X (1+ X))
--)
)
58
Este ejemplo pregunta por dos distancias, si la primera es mayor o igual $ue la
segunda, incrementa en una unidad esa distancia primera, si no, no se realiza
absolutamente nada.
La funcin IF debe llevar dos argumentos como mnimo, la condicin o comparacin y
la accin si dicha condicin se cumple. La accin si no se cumple es opcional, como
sabemos. (or ello, si lo $ue $ueremos es indicar una opcin si no se cumple y evitar
$ue realice algo si se cumple, habremos de indicar una lista vaca en este primero
argumento<
(IF (EQUAL Pto1 Pto2) () (PROMPT "No son iguales."))
'i no se hace esto, tomara la segunda accin como primera y no producira el
resultado esperado.
E%iste una pe$ue!a restriccin en torno a la funcin IF, y es $ue nicamente permite
un elemento o e%presin en cada uno de sus argumentos. (or ejemplo, si hubi)ramos
$uerido indicar en el ejemplo C:Prueba un incremento de uno para X y, adems un
incremento de 7.5 para Y, todo ello si la condicin se cumple, no habramos podido
hacerlo todo seguido. (ara subsanar este pe$ue!o inconveniente e%iste una funcin
$ue enseguida veremos.
Antes vamos a e%plicar esa funcin PROMPT $ue hemos dejado un poco en el aire.
(PROMPT cadena )
PROMPT escribe la cadena de te%to especificada en la lnea de comandos de AutoCAD y
devuelve nil. Ejemplos<
(PROMPT "Hola") devuelve Holanil
(PROMPT "Hola, soy yo") devuelve Hola, soy yonil
(PROMPT "1 + 2") devuelve 1 + 2nil
(PROMPT "") devuelve nil
(PROMPT " ") devuelve nil
'e observa $ue el mensaje se devuelve sin comillas.
NOTA: En configuraciones de dos pantallas, PROMPT visualiza el mensaje en ambas. Es
por ello preferible a otras funciones de escritura $ue ya veremos ms adelante.
.olvamos ahora sobre el siguiente ejemplo, ya e%puesto anteriormente<
(DEFUN C:Compara ()
--(SETQ Punto1 (GETPOINT "Primer punto: "))
--(SETQ Punto2 (GETPOINT "Segundo punto: "))
----(IF (EQUAL Punto1 Punto2)
----(PROMPT "Son iguales.")
----(PROMPT "No son iguales.")
--)
)
59
(odemos apreciar, al correr este programa, un par de cosas. La primera es $ue no
e%iste salto de lnea en ningn momento de la ejecucin. :na salida final de este
ejercicio podra aparecer as *tras indicar los dos puntos en pantalla,<
Primer punto: Segundo punto: No son iguales.nil
Esto hace realmente poco vistoso el desarrollo de una aplicacin.
El segundo problema es la devolucin de nil al final de una funcin PROMPT. Al igual
$ue en el caso anterior, desmejora la vistosidad del programa. (ara solucionar estos
dos problemas vamos a e%poner dos funciones, TERPRI y PRIN1. La primera *TERPRI,
la e%plicamos a continuacin y, la segunda *PRIN1,, indicamos donde escribirla y no
vamos a decir nada ms de ella, por$ue la comentaremos a fondo cuando estudiemos
las operaciones con archivos, $ue es para lo realmente sirve.
(TERPRI)
+omo apreciamos, TERPRI es una funcin sin argumentos. La misin $ue tiene es la de
mover el cursor al comienzo de una nueva lnea. 'e utiliza para saltar de lnea cada
vez $ue se escribe algn mensaje en el rea de comandos de AutoCAD, a no ser $ue
la funcin $ue escriba el mensaje salte de lnea por s sola, $ue las hay, ya veremos.
As por ejemplo, podemos variar el ejemplo anterior as<
(DEFUN C:Compara ()
--(SETQ Punto1 (GETPOINT "Primer punto: ")) (TERPRI)
--(SETQ Punto2 (GETPOINT "Segundo punto: ")) (TERPRI)
--(IF (EQUAL Punto1 Punto2)
----(PROMPT "Son iguales.")
----(PROMPT "No son iguales.")
--)
)
El resultado ser bastante ms claro, al saltar a la lnea siguiente despu)s de cada
peticin.
NOTA: (odramos haber escrito cada funcin TERPRI en un rengln aparte del
programa, pero se suelen indicar as por estructuracin< para especificar despu)s de
$u) mensaje salta a una nueva lnea.
E%iste otro m)todo, como deberamos saber ya *ver el principio de este MDULO,
para saltar de lnea. Es la inclusin de los caracteres \n. (ero esto se utiliza para
separar cadenas en diferentes lneas. As, el ejemplo $ue venimos proponiendo
podemos escribirlo<
(DEFUN C:Compara ()
--(SETQ Punto1 (GETPOINT "Primer punto: \n"))
--(SETQ Punto2 (GETPOINT "Segundo punto: \n"))
--(IF (EQUAL Punto1 Punto2)
----(PROMPT "Son iguales.")
----(PROMPT "No son iguales.")
60
--)
)
(ero el resultado es distinto< hace la peticin del punto y salta a una nueva lnea antes
de $ue lo introduzcamos.
(or otra parte, la funcin PRIN1 la escribiremos como norma general al final de cada
programa para producir un final FlimpioF del mismo<
(DEFUN C:Compara ()
--(SETQ Punto1 (GETPOINT "Primer punto: ")) (TERPRI)
--(SETQ Punto2 (GETPOINT "Segundo punto: ")) (TERPRI)
--(IF (EQUAL Punto1 Punto2)
----(PROMPT "Son iguales.")
----(PROMPT "No son iguales.")
--)
--(PRIN1)
)
#e esta forma evitamos el mensaje nil al final de la ejecucin.
NOTA: +omo ya hemos comentado, hablaremos profundamente de PRIN1 cuando
llegue el momento, ya $ue tiene diversas funciones y )sta es una caracterstica
especial derivada de ellas. (or ahora, tomemos como norma lo dicho y cremonoslo sin
ms.
'iguiendo ahora con las estructuras alternativas $ue habamos apartado un poco para
ver estas funciones de escritura y salto de lnea, pasemos al estudio de PROGN.
(PROGN expresin1 [expresin2...] )
Esta funcin admite como argumentos todas las e%presiones indicadas y las evala
secuencialmente, devolviendo el valor de la ltima evaluada.
La siguiente e%presin<
(PROGN (+ 2 3) (- 1 2) (/= 23 23) (SETQ s 5.5))
e$uivale a indicar todas las e%presiones $ue incluye en sus argumentos de forma
separada y continuada dentro de un programa o en la lnea de comandos. Es decir, los
siguientes dos ejemplos son id)nticos, en cuanto a resultado<
(DEFUN C:Ejem1 ()
--(SETQ X 5 Y 23.3)
--(+ X Y)
--(- X Y)
--(/ X Y)
--(* X Y)
)
y
61
(DEFUN C:Ejem2 ()
--(PROGN
----(SETQ X 5 Y 23.3)
----(+ X Y)
----(- X Y)
----(/ X Y)
----(* X Y)
--)
)
Entonces, Ppara $u) puede servir PROGNQ PROGN se utiliza en funciones cuyo formato
slo admite una e%presin en determinados argumentos y nosotros deseamos indicar
ms. :n ejemplo muy claro es el de la funcin IF. +omo hemos e%plicado, e%iste esa
pe$ue!a restriccin de IF $ue nicamente permite especificar una e%presin en cada
uno de sus argumentos. +on PROGN tendremos la posibilidad de especificar ms de una
accin, tanto si se cumple la condicin como si no. .eamos un pe$ue!o ejemplo
primero y despu)s otro ms elaborado $ue servir de pe$ue!o repaso de muchos
aspectos vistos hasta ahora.
(DEFUN C:Condic ()
--(SETQ Valor (GETREAL "Introduce un valor: "))
--(IF (> Valor 100)
----(PROGN
------(PROMPT "Es un valor mayor de 100.") (TERPRI)
----)
----(PROGN
------(PROMPT "Es un valor menor de 100,") (TERPRI)
------(PROMPT "qu te parece?")
----)
--)
(PRIN1)
)
#e esta manera, cada argumento de la funcin IF ejecuta no slo una e%presin, sino
varias. En realidad nicamente ejecuta una, PROGN, $ue es lo $ue admite IF, pero ella
es una $ue permite evaluar ms una dentro de s misma.
.eamos ahora el ejemplo siguiente. 6iene relacin con un ejercicio propuesto anterior,
pero con mucho ms jugo.
(DEFUN Aro (/ Centro Radio Grosor Rint Rext Dint Dext Op)
--(SETQ Centro (GETPOINT "Centro del aro: ")) (TERPRI)
--(SETQ Radio (GETDIST "Radio intermedio: ")) (TERPRI)
--(SETQ Grosor (GETDIST "Grosor del aro: ")) (TERPRI)
--(INITGET "Hueco Relleno")
--(SETQ Op (GETKWORD "Aro Hueco o Relleno (<H>/R): ")) (TERPRI)
--(IF (OR (= Op "Hueco") (= Op \n))
----(PROGN
------(SETQ Rint (- Radio (/ Grosor 2)))
------(SETQ Rext (+ Radio (/ Grosor 2)))
------(COMMAND "_circle" Centro Rext)
------(COMMAND "_circle" Centro Rint)
----)
----(PROGN
62
------(SETQ Dint (* (- Radio (/ Grosor 2))2))
------(SETQ Dext (* (+ Radio (/ Grosor 2))2))
------(COMMAND "_donut" Dint Dext Centro "")
----)
--)
)
(DEFUN C:Aro ()
--(SETVAR "cmdecho" 0)
--(Aro)
--(SETVAR "cmdecho" 1)
--(PRIN1)
)
(PROMPT "Nuevo comando Aro definido.") (PRIN1)
E%pli$uemos el ejemplo. El programa dibuja aros, huecos o rellenos, solicitando el
centro del mismo, su radio intermedio y su grosor.
'e crea un nueva funcin de usuario a la $ue se atribuyen una serie de variables
locales -las $ue luego sern utilizadas-. 'e pregunta por los tres datos
determinantes para el dibujo de aro *centro, radio intermedio y grosor,, los cuales se
guardan en tres variables *Centro, Radio y Grosor,. A continuacin se inicializa
*INITGET, el siguiente GETKWORD para $ue admita dos palabras claves *Hueco y
Relleno, con sus respectivas abreviaturas. 7tese $ue no se indica ningn cdigo para
$ue no admita un INTRO por respuesta, ya $ue luego nos ser til.
(regunta el programa si el aro $ue va a dibujar ser hueco o relleno. (or defecto se
nos ofrece la opcin correspondiente a hueco *entre corchetes angulares <> para
indicarlo como los comandos tpicos de AutoCAD,. A$u para tomar la opcin por
defecto podremos pulsar directamente INTRO *lo normal en AutoCAD,, por ello nos
interesaba antes poder aceptar un INTRO. Adems podremos elegir teclear la opcin
segunda o la primera.
'eguidamente hemos de controlar la entrada del usuario $ue se ha guardado en la
variable Op. (ara ello utilizamos una funcin IF $ue nos dice $ue, si Op es igual a Hueco
*o a h, hu, hue, huec, tanto maysculas como minsculas; recordemos $ue la salida de
GETKWORD es la indicada completa en el INITGET, o *OR, igual a un INTRO *\n, opcin
por defecto,, se realizar todo lo contenido en el primer PROGN. 'i no, se pasar a
evaluar lo contenido en el segundo PROGN *argumento accin_no_se_cumple de IF,.
#e esta forma el usuario slo tiene dos alternativas, aro hueco o aro relleno. 'i escribe
otra cosa no ser aceptada por GETKWORD. As, al indicar luego en el IF $ue si la opcin
no es la de aro hueco pase por alto el primer argumento, sabremos de buena tinta $ue
lo $ue no es Hueco ha de ser forzosamente Relleno.
En la secuencia de funciones para un aro hueco, se calculan el radio interior y e%terior
del mismo y se dibujan dos crculos conc)ntricos $ue representan el aro. (or su lado,
en la secuencia para un aro relleno, se calculan los dimetros interior y e%terior y se
dibuja una arandela. La razn para calcular dimetros a$u es $ue el comando
ARANDELA *DONUT en ingl)s, de AutoCAD solicita dimetros y no radios.
63
6ras cerrar todos los par)ntesis necesarios -el del ltimo PROGN, el del IF y el de
DEFUN- se pasa a crear el comando propio para AutoCAD *C:Aro,. #e desactiva el
eco de mensajes en la lnea de comandos, se llama a la funcin (Aro), se vuelve a
activar el eco y se introduce una e%presin PRIN1 para un final FlimpioF del programa
*sin nil ni ningn otro eco o devolucin de AutoL&'(,.
(or ltimo, y fuera de cual$uier DEFUN, se introduce una funcin PROMPT $ue escribe un
mensaje en la lnea de comandos. 6odas las funciones de AutoL&'( $ue no est)n
contenidas dentro de los DEFUN en un programa se ejecutan nada ms cargar )ste. (or
ello, al cargar este programa aparecer nicamente el mensaje Nuevo comando Aro
definido. L al ejecutar el comando, escribiendo Aro en lnea de comandos, este
PROMPT no se evaluar al no estar dentro de ningn DEFUN.
El PRIN1 detrs de este ltimo PROMPT hace $ue no devuelva nil. 6ampoco se
ejecutar al correr el programa, ya $ue est fuera de los DEFUN, sino slo al cargarlo.
Es por ello, $ue para el programa en s se utilice otro PRIN1, el e%puesto antes e
incluido en el segundo DEFUN.
(COND ( condicin1 resultado1 ) [ (condicin2 resultado2 )...] )
La funcin COND de AutoL&'( $ue vamos a ver ahora establece varias condiciones
consecutivas asignando diferentes resultados a cada una de ellas. Es decir, es una
generalizacin de la funcin IF $ue, sin embargo, resulta ms cmoda a la hora de
establecer diversas comparaciones. .eamos un ejemplo sencillo<
(DEFUN Compara ()
--(SETQ X (GETREAL "Introduce el valor de X entre 1 y 2: "))
--(COND ((= X 1) (PROMPT "Es un 1.") (TERPRI))
--------((= X 2) (PROMPT "Es un 2.") (TERPRI))
--------((< X 1) (PROMPT "Es menor que 1, no vale.") (TERPRI))
--------((> X 2) (PROMPT "Es mayor que 2, no vale.") (TERPRI))
--------(T (PROMPT "Es decimal entre 1 y 2.") (TERPRI))
--)
)
'e establecen una serie de comparaciones $ue e$uivaldra a una batera de funciones
IF seguidas. En la ltima condicin no es una lista, sino el valor de cierto T. Esto
garantiza $ue, si no se han evaluado las e%presiones anteriores se evalen las de esta
ltima lista. L es $ue COND no evala todas las condiciones, sino $ue va
inspeccionndolas hasta $ue encuentra una $ue sea diferente de nil. En ese
momento, evala las e%presiones correspondientes a esa condicin y sale del COND, sin
evaluar las siguientes condiciones aun$ue sean T.
'i se cumple una condicin y no e%iste un resultado *no est especificado,, COND
devuelve el valor de esa condicin.
:na aplicacin muy tpica de COND es el proceso de las entradas por parte del usuario
en un GETKWORD. (or ejemplo<
(DEFUN Proceso ()
--(INITGET 1 "Constante Gradual Proporcional Ninguno")
64
--(SETQ Op (GETKWORD "Constante/Gradual/Proporcional/Ninguno: ")
--(COND ((= Op "Constante") (Constante))
--------((= Op "Gradual") (Gradual))
--------((= Op "Proporcional") (Proporcional))
--------((= Op "Ninguno") (Ninguno))
--)
)
...
En este ejemplo se toman como condiciones las comparaciones de una respuesta de
usuario frente a GETKWORD, haciendo llamadas a funciones diferentes dentro del mismo
programa segn el resultado.
NOTA: +omo podemos observar, los par)ntesis indicados en la sinta%is tras COND son
obligatorios *luego cerrarlos antes de la segunda condicin,. Estas listas engloban cada
condicin y resultado por separado.
NOTA: +omo observamos en el primer ejemplo, con COND podemos especificar ms de
una e%presin para el resultado de una comparacin, y sin necesidad de PROGN. La
primera lista se toma como condicin y todas las dems, hasta $ue se cierre el
par)ntesis $ue engloba a una condicin con sus respectivos resultados, se toman como
resultados propios de dicha condicin.
L continuando con las estructuras bsicas de la programacin, vamos a ver ahora una
muy recurrida y usada; se trata de REPEAT. REPEAT representa la estructura repetitiva
en AutoL&'( y sus sinta%is es la siguiente<
(REPEAT veces expresin1 [expresin2...] )
Esta funcin repite un determinado nmero de veces *especificado en veces, la
e%presin o e%presiones $ue se encuentren a continuacin, hasta el par)ntesis de
cierre de REPEAT. El nmero de repeticiones ha de ser positivo y entero. REPEAT
evaluar dicho nmero de veces las e%presiones contenidas y devolver el resultado de
la ltima evaluacin. .eamos un ejemplo<
*DEFUN Poligonal ()
--(SETQ Vert (GETINT "Nmero de vrtices de la poligonal: "))
--(SETQ Lin (- Vert 1))
--(SETQ Pto1 (GETPOINT "Punto primero: "))
--(REPEAT Lin
----(SETQ Pto2 (GETPOINT "Siguiente punto: "))
----(COMMAND "_line" Pto1 Pto2 "")
----(SETQ Pto1 Pto2)
--)
)
El ejemplo pide el nmero de v)rtices de una poligonal $ue se dibujar con lneas.
Evidentemente el nmero de lneas $ue se dibujarn ser el nmero de v)rtices menos
uno, por lo $ue se establece en la variable Lin dicho valor. 6ras pedir el primer punto
se comienza a dibujar las lneas en la estructura repetitiva *tantas veces como lneas
hay,. Lo $ue hace la lnea (SETQ Pto1 Pto2) es actualizar la variable Pto1 con el valor
65
de Pto2 cada vez $ue se dibuja una lnea. #e esta forma se consigue tomar como
punto de la primera lnea el punto final de la anterior.
(WHILE condicin expresin1 [expresin2...] )
La funcin WHILE establece estructuras repetitivas al igual $ue REPEAT. La diferencia
estriba en $ue WHILE proporciona un control sobre la repeticin, ya $ue la serie de
e%presiones *o nica e%presin como mnimo, se repetir mientas se cumpla una
determinada condicin especificada en condicin.
=ientras el resultado de la condicin sea diferente de nil *o sea T,, WHILE evaluar las
e%presiones indicadas. En el momento en $ue la condicin sea igual a nil, WHILE
terminar, dejando de repetirse el ciclo. .eamos el anterior ejemplo de REPEAT un poco
ms depurado con WHILE<
*DEFUN Poligonal ()
--(SETQ Vert (GETINT "Nmero de vrtices de la poligonal: "))
--(SETQ Lin (- Vert 1))
--(SETQ Pto1 (GETPOINT "Punto primero: "))
--(WHILE (> Lin 0)
----(SETQ Pto2 (GETPOINT "Siguiente punto: "))
----(COMMAND "_line" Pto1 Pto2 "")
----(SETQ Pto1 Pto2)
----(SETQ Lin (1- Lin))
--)
)
#e esta forma se establece una estructura repetitiva controlada por el nmero de
lneas, el cual va decrementndose en A/< (SETQ Lin (1- Lin)) cada vez $ue se
repite el proceso. =ientras Lin sea mayor de J se dibujarn lneas, en el momento en
$ue no sea as se terminar el proceso.
WHILE se utiliza mucho para controlar entradas de usuario y procesar errores, por
ejemplo<
...
(SETQ DiaCj (GETREAL "Dimetro de la cajera: ")
(SETQ Dia (GETREAL "Dimetro del agujero: "))
(WHILE (> Dia DiaCj)
--(PROMPT "El dimetro del agujero debe ser menor que el de la
cajera.\n")
--(SETQ Dia (GETREAL "Dimetro del agujero: "))
)
...
E%iste una forma muy particular de usar funciones como WHILE o IF. .emos el ejemplo
siguiente<
(DEFUN Haz (/ ptb pt)
--(INITGET 1)
--(SETQ ptb (GETPOINT "Punto de base: ")) (TERPRI)
--(WHILE (SETQ pt (GETPOINT ptb "Punto final (INTRO para terminar): "))
66
(TERPRI)
--(COMMAND "_line" ptb pt "")
)
El ejemplo dibuja segmentos rectos en forma de haz de rectas desde un punto de base
a diversos puntos $ue es usuario introduce. E%aminemos cmo se realiza la
comparacin en el WHILE. #e suyo la comparacin no e%iste como tal, pero sabemos
$ue WHILE contina mientras no obtenga nil. Ah est el truco. En el momento en el
pulsemos INTRO, pt guardar nil, por lo $ue WHILE no continuar. 'i introducimos
puntos, WHILE no encuentra nil por lo $ue realiza el bucle.
A continuacin vamos a ver tres funciones $ue no se refieren a repeticin de
e%presiones en s, sino a repeticiones de proceso con elementos de listas. Estas tres
funciones son FOREACH, APPLY y MAPCAR.
(FOREACH variable lista expresin )
Esta funcin procesa cada elemento de una lista *lista, aplicndole una e%presin
*expresin, indicada. (ara ello se utiliza un smbolo *variable, $ue debe aparecer en
dicha e%presin. El funcionamiento es el siguiente< se toma cada elemento de la lista y
se hace intervenir en la e%presin en los lugares donde aparece el smbolo. #espu)s se
evala cada una de las e%presiones resultantes para cada elemento de la lista. .amos
a estudiar un ejemplo<
(FOREACH Var '(10 20 30) (* 2 Var))
Lo $ue se pretende a$u es multiplicar cada uno de los elementos de la lista por B. #e
esta forma, y como hemos e%plicado, en principio se define una variable *Var,. Esta
variable ser sustituida por cada uno de los elementos de la lista $ue sigue en la
e%presin del final. As, Var es sustitua por 10, por 20 y por 30 respectivamente en la
e%presin del producto $ue se indica en ltimo lugar.
Al final, FOREACH devuelve el resultado de la ltima e%presin evaluada.
.eamos otro ejemplo $ue dibuja lneas desde el punto J,J hasta cuatro puntos B#
indicados en una lista<
(FOREACH Pto '((10 10) (20 20) (25 40) (100 170)) (COMMAND "_line" "0,0"
Pto ""))
(APPLY funcin lista )
APPLY aplica la funcin indicada a todos los elementos de una lista tambi)n indicada.
Ejemplo<
(APPLY '* '(2 3 4))
Este ejemplo aplica la funcin * inherente a AutoL&'( a la lista especificada. El
resultado habra sido el mismo $ue si hubi)ramos escrito<
(* 2 3 4)
67
aun$ue en determinadas situaciones puede ser interesante su uso.
'e aprecia $ue tanto la lista *como ya sabamos, como la funcin indicada han de
llevar un apstrofo delante al ser literales. La funcin puede ser una su%r de AutoL&'(
o una funcin definida previamente por el usuario.
(MAPCAR funcin lista1... listan )
(or su lado, MAPCAR aplica la funcin indicada a elementos sucesivos de listas. (or
ejemplo, supongamos n listas cada una con un nmero m de elementos. MAPCAR
aplicar la funcin especificada al primer elemento *,&,, 1&,,... n&m, de cada lista
*lista,, lista1,... listan, y el resultado ser guardado como primer elemento de la lista
de resultado. #espu)s realiza lo mismo con los m elementos de las n listas. El
resultado final ser una lista cmulo de los resultados parciales. .eamos un ejemplo
sencillo<
(MAPCAR '+ '(8 2 3) '(2 1 1) '(0 0 0))
El resultado ser<
(10 3 4)
Las mismas consideraciones en cuanto a literales $ue para APPLY.
A continuacin vamos a estudiar a$u una funcin $ue no es $ue tenga $ue ver con
estas ltimas, pero se suele utilizar con ellas, sobre todo con APPLY y MAPCAR. Esta
funcin es<
(LAMBDA argumentos expresin1 [expresin2...] )
LAMBDA define una funcin de usuario sin nombre. 'u formato y funcionamiento es el
mismo $ue DEFUN, pero al no tener nombre slo puede utilizarse en el momento de
definirla y no puede ser llamada posteriormente. 'e utiliza cuando se necesita definir
una funcin slo momentneamente y no se desea ocupar espacio en memoria de
manera innecesaria.
LAMBDA devuelve el valor de la ltima e%presin evaluada, lo mismo $ue DEFUN. 'e
puede usar en combinacin con APPLY y MAPCAR -como decamos- para aplicar una
funcin temporal a los elementos de una o varias listas<
(APPLY '(LAMBDA (x y z) (/ (- x y) z))
--'(25 5 2)
)
En el ejemplo se define una funcin temporal con tres variables. 'u cometido es
restarle y a x y dividir el resultado entre z. 'e aplica esa funcin con APPLY a la lista
$ue suministra los tres argumentos re$ueridos. El resultado ser 31/ & /5 7 1, es decir
,-.
68
#e manera similar se utiliza con MAPCAR, cuando se $uiere obtener una lista de
resultados. (or ejemplo una funcin para dibujar lneas entre una serie de puntos
iniciales y una serie de puntos finales podra ser<
(MAPCAR '(LAMBDA (pin pf) (COMMAND "linea" pin pf ""))
--(LIST pin1 pin2 pin3)
--(LIST pf1 pf2 pf3)
)

B; 4a#e interme+ia +e e-ercicio#
1ealizar un programa $ue dibuje crculos conc)ntricos. La aplicacin solicitar el
centro de la serie de crculos, al nmero de crculos y el radio interior y e%terior del
conjunto. Los crculos se dispondrn de manera e$uidistante.
1ealizar un programa $ue dibuje crculos conc)ntricos a partir de un crculo base. Los
radios de los dems crculos se irn introduciendo a medida $ue se dibujan *por el
usuario,.

1G. 6AN&CO D& LISTAS
En esta seccin, y avanzando un poco ms en este curso, vamos a ver una serie de
funciones de AutoL&'( muy sencillas $ue se utilizan para el manejo de listas. La hemos
visto en varios ejemplos tipos de listas, como las de las coordenadas de un punto, por
ejemplo. Aprenderemos ahora a acceder o capturar todo o parte del contenido de una
lista, as como a formar listas con diversos elemento independientes. El tema es corto
y fcilmente asimilable, pero no por ello menos importante, ya $ue esta caracterstica
se utiliza mucho en la programacin de rutinas AutoL&'(, sobre todo a la hora de
acceder a la "ase de #atos interna de AutoCAD.
Lo primero $ue vamos a ver es cmo acceder a elementos de una lista. (ara ello
disponemos de una serie de funciones $ue iremos estudiando desde ahora.
(CAR lista )
La funcin CAR de AutoL&'( devuelve el primer elemento de una lista. 'i se indica una
lista vaca () se devuelve nil, si no se devuelve al valor del elemento. .eamos un
ejemplo. 'i $ueremos capturar la coordenada 2, para su posterior proceso, de un
punto introducido por el usuario, podramos introducir las lneas siguientes en nuestro
programas<
(SETQ Coord (GETPOINT "Introduce un punto: "))
(SETQ X (CAR Coord))
#e esta manera, guardamos en la variable X el primer elemento de la lista guardada en
Coord, es decir la coordenada 2 del punto introducido por el usuario.
69
1ecordemos $ue si se emplean listas directamente, )stas han de ir indicadas como
literales *precedidas del apstrofo,<
(CAR '(5 20 30))
'i la lista slo tiene un elemento se devuelve dicho elemento. .emos unos ejemplos<
(CAR '((/ 1 2.2) -80.2 -23.002 (* 2 3.3))) devuelve (/ 1 2.2)
(CAR '(34.45 dcimo -12)) devuelve 34.45
(CAR '(x y z)) devuelve X
(CAR '(3)) devuelve 3
(CDR lista )
Esta funcin devuelve una lista con los elementos segundo y siguientes de la lista
especificada. Esto es, captura todos los elementos de una lista e%cepto el primero
*desde el segundo, inclusive, hasta el final, y los devuelve en forma de lista. 'i se
especifica una lista vaca, CDR devuelve nil. Ejemplos<
(CDR '(8 80.01 -23.4 23 34.67 12)) devuelve (80.01 -23.4 23 34.67 12)
(CDR '(x y z)) devuelve (Y Z)
(CDR (CAR '((1 2 4) (3 5 7) (8 1 2)))) devuelve (2 4)
'i se indica un lista con dos elementos, CDR devuelve el segundo de ellos pero, como
sabemos, en forma de lista. (ara capturar una segunda coordenada L de un punto B#
por ejemplo, habramos de recurrir a la funcin CAR -vista antes- para obtener dicho
punto. .)anse estos dos ejemplos<
(CDR '(30 20)) devuelve (20)
(CAR (CDR '(30 20))) devuelve 20
#e esta manera, es decir, con la mezcla de estas dos funciones se puede obtener la
coordenada L de cual$uier punto, o el segundo elemento de cual$uier lista, $ue es lo
mismo<
(CAR (CDR '(20 12.4 -3))) devuelve 12.4
(CAR (CDR '(34 -23.012 12.33))) devuelve -23.012
(CAR (CDR '(23 12))) devuelve 12
(CAR (CDR '(10 20 30 40 50 60))) devuelve 20
'i se especifica una lista con slo un elemento, al igual $ue con listas vacas se
devuelve nil.
NOTA: 'i la lista es un tipo especial de lista denominado par punteado con slo dos
elementos *se estudiar ms adelante,, CDR devuelve el segundo elemento sin incluirlo
en lista alguna. Este tipo de listas es fundamental en la "ase de #atos de AutoCAD,
como se ver en su momento, y de ah la importancia de estas funciones para acceder
a objetos de dibujo y modificarlos.
Las funciones siguientes son combinaciones permitidas de las dos anteriores.
70

(CADR lista )
Esta funcin devuelve directamente el segundo elemento de una lista. E$uivale por
completo a (CAR (CDR lista)). #e esta forma resulta mucho ms cmoda para
capturar segundos elementos, como por ejemplo coordenadas L. Ejemplos<
(CADR '(10 20 34)) devuelve 20
(CADR '(23 -2 1 34 56.0 (+ 2 2))) devuelve -2
(CADR '(19 21)) devuelve 21
(CADR '(21)) devuelve nil
(CADR '()) devuelve nil
El resto de las funciones ms importante se e%plicarn con un solo ejemplo, el
siguiente<
(SETQ ListaElem '((a b) (x y)))
(CAAR lista )
(CAAR ListaElem) devuelve A
E$uivale a (CAR (CAR ListaElem)).
(CDAR lista )
(CDAR ListaElem) devuelve (B)
E$uivale a (CDR (CAR ListaElem)).
(CADDR lista )
(CADDR ListaElem) devuelve nil
E$uivale a (CAR (CDR (CDR ListaElem))).
(CADAR lista )
(CADAR ListaElem) devuelve B
E$uivale a (CAR (CDR (CAR ListaElem))).
(CADDAR lista )
(CADDAR ListaElem) devuelve A
E$uivale a (CAR (CDR (CDR (CAR ListaElem)))).
71
L as todas las combinaciones posibles $ue podamos realizar. +omo se ha visto, para
obtener el tercer elemento *coordenada S por ejemplo, de una lista utilizaremos
CADDR<
(CADDR '(30 50 75)) devuelve 75
En el ejemplo anterior, esta funcin habamos visto $ue devolva nil. Esto es por$ue
era una lista de dos elementos, y si el elemento buscado no e%iste se devuelve, nil.
(or ejemplo<
(CDDDR '(30 60 90)) devuelve nil
La manera de construir funciones derivadas es bien sencilla. 6odas comienzan con C y
terminan con R. En medio llevan la otra letra, ya sea la A de CAR o la D de CDR, tantas
veces como se repita la funcin y en el mismo orden. .eamos unos ejemplos<
CARACARACAR X CAAAR, p.e. (CAR (CAR (CAR ListaElem)))
CDRACDRACDRACAR X CDDDAR, p.e. (CDR (CDR (CDR (CAR ListaElem))))
CARACDRACARACARACDRACDR X CADAADDR, p.e. (CAR (CDR (CAR (CAR (CDR (CDR
ListaElem))))))
L as sucesivamente. 6odas esta combinaciones son e%tremadamente tiles, tanto para
manejar listas en general como para gestionar directamente la "ase de #atos de
AutoCAD.
.eamos ahora otra funcin muy til y verstil.
(LIST expresin1 [expresin2...] )
La funcin LIST rene todas las e%presiones indicadas y forma una lista con ellas, la
cual devuelve como resultado. 'e debe indicar al menos una e%presin.
&maginemos $ue $ueremos formar una lista de las tres coordenadas de un punto
obtenidas por separado y guardadas en tres variables llamadas X, Y y Z. X vale 10, Y
vale 20 y Z vale 30. 'i hacemos<
(SETQ Punto (X Y Z))
AutoL&'( devuelve error: bad function. AutoL&'( intenta evaluar el par)ntesis
por$ue es una lista. Al comenzar comprueba $ue X no es ninguna funcin y da el
mensaje de error.
'i hacemos<
(SETQ Punto '(X Y Z))
La lista con las tres coordenadas se guarda en Punto, pero ojo, como un literal. 'i
introducimos ahora lo siguiente el resultado ser el indicado<
!Punto devuelve (X Y Z)
72
(ara ello tenemos la funcin LIST por ejemplo. Kagamos ahora lo siguiente<
(SETQ Punto (LIST X Y Z))
L ahora, al hacer lo $ue sigue se devuelve lo siguiente<
!Punto devuelve (10 20 30)
Kemos conseguido introducir valores independientes en una lista asignada a una
variable.
.amos a ver un ejemplo de un programa $ue utiliza estas funciones. El listado del
cdigo es el siguiente<
(DEFUN Bornes (/ pti dia ptf ptm)
--(INITGET 1)
--(SETQ pti (GETPOINT "Punto inicial de conexin: "))(TERPRI)
--(INITGET 5)
--(SETQ dia (GETREAL "Dimetro de bornes: "))(TERPRI)
--(WHILE (SETQ ptf (GETPOINT "Punto de borne (INTRO para terminar): "))
----(TERPRI)
----(SETQ ptm (LIST (CAR pti) (CADR ptf)))
----(COMMAND "_line" pti "_non" ptm "_non" ptf "")
----(COMMAND "_donut" "0" (+ dia 0.0000001) "_non" ptf "")
--)
)
(DEFUN c:bornes ()
--(SETVAR "cmdecho" 0)
--(Bornes)
--(SETVAR "cmdecho" 1)(PRIN1)
)
(PROMPT "Nuevo comando BORNES definido")(PRIN1)
NOTA: En programas $ue definan ms de una funcin *este no es el caso,, sin contar
la $ue empieza con C:, deberemos de poner cuidado a la hora definir variables locales.
'i lo hacemos por ejemplo en un DEFUN y luego otro necesita de esas variables, el
segundo no funcionar. Las variables locales nicamente funcionan para su funcin, es
decir para su DEFUN. La forma de conseguir $ue fueran variables locales compartidas -
slo dentro del propio programa- sera declarndolas en el DEFUN $ue sea comando de
AutoCAD *C:,.
Este ltimo ejemplo solicita los datos necesarios y comienza el bucle de WHILE. La
condicin es un tanto e%tra!a pero fcil de comprender. 'abemos $ue 5K&LE acepta
una condicin como vlida si no devuelve nil, por lo tanto la condicin es el propio
valor de la variable ptf. Al darle un valor mediante GETPOINT, WHILE continuar. En el
momento en $ue pulsemos INTRO para terminar el programa, ptf no tendr valor, ser
nil, por lo $ue WHILE no prosigue y acaba.
El bucle lo $ue realiza es guardar en la variable ptm el valor de una lista, formada
mediante la funcin LIST, y $ue guarda el primer elemento de la lista guardada en pti
73
*punto inicial de cone%in,, es decir la coordenada 2, y el segundo elemento de la lista
guardada en ptf *punto de situacin del borne,, la coordenada L. #espu)s se dibujan
la lnea vertical y horizontal de cone%in y el borne en el e%tremo *mediante
ARANDELA,.

E; 4a#e interme+ia +e e-ercicio#
1ealizar un programa $ue dibuje rectngulos con grosor y con es$uinas redondeadas.
'e solicitar al usuario el grosor del rectngulo, el radio de redondeo de las es$uinas y
la primera y segunda es$uina del rectngulo en s.
1ealcese un programa $ue dibuje ventanas con celosa en cruz. Al usuario se le
solicitar el grosor de rectngulo e%terior y la anchura de los marcos. As tambi)n,
evidentemente, la posicin de dos v)rtices opuestos por una de las diagonales del
rectngulo.

11. =UNCION&S D& CON&RSIN D& DATOS
#e lo $ue hablaremos en esta seccin es de la posibilidad $ue tenemos mediante
AutoL&'( de conversin de los tipos de datos disponibles para utilizar, esto es, valores
enteros, valores reales, ngulos, distancias y cadenas de te%to alfanum)rico. Adems,
y en ltimo t)rmino, se e%plicar una funcin $ue es capaz de convertir cual$uier valor
de un tipo de unidades a otro.
+on lo $ue comenzaremos ser con una funcin capaz de convertir cual$uier valor
*entro o real, en un valor real. Esta funcin es la siguiente<
(FLOAT valor )
valor determina el nmero $ue $ueremos convertir. 'i es real lo deja como est, si el
entero lo convierte en real. .eamos unos ejemplos<
(FLOAT 5) devuelve 5.0
(FLOAT 5.25) devuelve 5.25
(FLOAT -3) devuelve -3.0
(FLOAT 0) devuelve 0
(ITOA valor_entero )
Esta otra funcin convierte un valor entero, y slo entero, en una cadena de te%to $ue
contiene a dicho valor. (or ejemplo<
(ITOA 5) devuelve "5"
(ITOA -33) devuelve "-33"
ITOA reconoce el signo negativo si e%iste y lo convierte en un guin.
74
Esta funcin resultar especialmente til cuando se e%pli$ue en este mismo MDULO
la interaccin con letreros de dilogo en #+L. Adems, puede servir para introducir
valores de variables en una concatenacin de cadenas, por ejemplo, $ue
pr%imamente veremos.
NOTA: 'i se especifica un nmero real o una cadena como argumento de ITOA se
produce un error de AutoL&'(.
(RTOS valor_real [modo [precisin]] )
RTOS convierte valores reales en cadenas de te%to. Al contrario $ue ITOA, RTOS admite
nmeros enteros. .eamos algn ejemplo<
(RTOS 33.4) devuelve "33.4"
(RTOS -12) devuelve "-12"
El argumento modo se corresponde con la variable de AutoCAD 14 LUNITS. Es decir,
solamente puede ser un nmero entero entre 1 y 5 cuyo formato es el $ue se indica<
Modo ........ =ormato
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
1 AAAAAAAAAAA +ientfico
2 AAAAAAAAAAA #ecimal
3 AAAAAAAAAAA (ies y pulgadas & *fraccin decimal,
4 AAAAAAAAAAA (ies y pulgadas && *fraccin propia,
H AAAAAAAAAAA Oraccionario
'i no se especifica se utiliza el formato actual de la variable en cuestin. As<
(RTOS 34.1 1) devuelve "3.4100E+01"
(RTOS 34.1 2) devuelve "34.1"
(RTOS 34.1 3) devuelve "2'-10.1''"
(RTOS 34.1 4) devuelve "2'-10 1/8"
(RTOS 34.1 5) devuelve "34 1/8"
El argumento precisin se corresponde con la variable LUPREC e indica la precisin en
decimales para la cadena de te%to $ue se desea obtener. 'i no se indica, y al igual $ue
con el argumento modo, se supone el valor de variable en la sesin actual de dibujo.
As<
(RTOS (/ 1 3) 2 0) devuelve "0"
(RTOS (/ 1 3) 2 1) devuelve "0.3"
(RTOS (/ 1 3) 2 4) devuelve "0.3333"
75
(RTOS (/ 1 3) 2 13) devuelve "0.3333333333333"
(RTOS (/ 1 3) 2 16) devuelve "0.3333333333333333"
NOTA: +omo deberamos saber, AutoCAD internamente trabaja siempre con /C
decimales, indi$ue lo $ue se le indi$ue, otra cosa es la forma en $ue nos devuelva los
resultados. Es por ello $ue a RTOS podemos indicarle una precisin superior a diecis)is,
pero lo m%imo $ue nos va a devolver sern esos diecis)is decimales.
9tros ejemplos<
(RTOS 2.567 1 2) devuelve "2.57E+00"
(RTOS -0.5679 5 3) devuelve "-5/8"
(RTOS 12 3 12) devuelve "1'"
NOTA: La variable UNITMODE tiene efecto en los modos 3, 4 y 5.
(ANGTOS valor_angular [modo [precisin]] )
Esta su%r de AutoL&'( toma el valor de un ngulo y lo devuelve como cadena de te%to.
#icho valor habr de ser un nmero en radianes.
El argumento modo se corresponde con la variable AUNITS de AutoCAD 14. 'us
valores estn en el intervalo de 0 a 4 segn la siguiente tabla<
Modo ............ =ormato
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
0 AAAAAAAAAAA Trados
1 AAAAAAAAAAA Trados8minutos8segundo
2 AAAAAAAAAAA Trados centesimales
3 AAAAAAAAAAA 1adianes
0 AAAAAAAAAAA :nidades geod)sicas
(or su lado, precisin se corresponde con la variable AUPREC de AutoCAD. Especifica el
nmero de decimales de precisin. .eamos algunos ejemplos<
(ANGTOS PI 0 2) devuelve "180"
(ANGTOS 1.2 3 3) devuelve "1.2r"
(ANGTOS (/ PI 2.0) 0 4) devuelve "90"
(ANGTOS 0.34 2 10) devuelve "21.6450722605g"
(ANGTOS -0.34 2 10) devuelve "378.3549277395g"
76
El ngulo indicado puede ser negativo, pero el valor es siempre convertido a positivo
entre J y B.
NOTA: La variable UNITMODE afecta slo al modo 4.
.eamos ahora las funciones inversas o complementarias a estas tres ltimas
e%plicadas.
(ATOI cadena )
ATOI convierte la cadena especificada en un nmero entero. 'i la cadena contiene
decimales la trunca. Ejemplos<
(ATOI "37.4") devuelve 37
(ATOI "128") devuelve 128
(ATOI "-128") devuelve -128
'i ATOI encuentra algn carcter A'+&& no num)rico en la cadena, nicamente
convierte a num)rico hasta dicho carcter. 'i no hay ningn carcter num)rico y son
todos no num)ricos, ATOI devuelve 0. (or ejemplo<
(ATOI "-12j4") devuelve -12
(ATOI "casita") devuelve 0
(ATOF cadena )
+onvierte cadenas en valores reales. Admite el guin $ue convertir en signo negativo.
Las mismas consideraciones con respecto a caracteres no num)ricos $ue para ATOI.
Ejemplos<
(ATOF "35.78") devuelve 35.78
(ATOF "-56") devuelve -56.0
(ATOF "35,72") devuelve 35.0
(ATOF "23.3h23) devuelve 23.3
(ATOF "pescado") devuelve 0.0
(DISTOF cadena [modo] )
DISTOF convierte una cadena en nmero real. El argumento modo especifica el formato
del nmero real y sus valores son los mismos $ue los e%plicados para RTOS. 'i se omite
modo se toma el valor actual de LUNITS. 'e pueden probar los ejemplos inversos a
RTOS, son complementarios.
(ANGTOF cadena [modo] )
+onvierte una cadena de te%to, $ue representa un ngulo en el formato especificado
en modo, en un valor num)rico real. modo admite los mismo valores $ue ANGTOS. 'i se
omite modo se toma el valor actual de la variable AUNITS. 'e pueden probar los
ejemplos inversos a ANGTOS, son complementarios.
77

11.1. Con/er#in +e uni+a+e#
.eamos ahora una ltima funcin un poco diferente. CVUNIT convierte un valor
indicado de un tipo de unidades a otro, ambos tambi)n especificado en la sinta%is.
#icha sinta%is es la $ue sigue<
(CVUNIT valor unidad_origen unidad_destino )
valor representa el valor num)rico $ue se desea convertir. unidad_origen y
unidad_destino son, respectivamente, la unidades actuales del valor y la unidades a
las $ue se $uiere convertir.
Estos dos argumentos ltimos hay $ue especificarlos como cadenas *entre comillas
dobles,. Los nombres $ue contengan dichas cadenas debern e%istir en el archivo
ACAD.UNT, archivo de conversin de unidades suministrado con AutoCAD 14
precisamente para el buen funcionamiento de esta funcin de AutoL&'(. Este archivo es
A'+&& y puede ser editado y personalizado, por ello, vamos a estudiar a$u y ahora
cmo crear nuestras propias definiciones de conversin de unidades.

11.1.1. Per#ona$i<ar e$ arc3i/o ACAD.UNT
Al abrir este archivo mediante un editor A'+&& podremos observar $ue se asemeja
completamente a muchos de los archivos personalizables de AutoCAD 14 $ue ya
hemos aprendido a modificar y crear en otros MDULOS de este curso, como por
ejemplo a los de definiciones de tipos de lnea, patrones de sombreado o formas. El
motivo de $ue se haya dejado esta e%plicacin para este punto es la relacin entre
este archivo ACAD.UNT y la funcin CVUNIT de AutoL&'(.
El archivo de definicin de unidades de AutoCAD, ACAD.UNT, permite definir factores
para convertir datos de un sistema de unidades a otro. Estas definiciones, $ue son
utilizadas por la funcin de conversin de unidades CVUNIT de AutoL&'(, deben
incluirse en este archivo en formato A'+&&.
+ada definicin consta de dos lneas en el archivo< el nombre de la unidad y su
definicin. La primera lnea debe llevar un asterisco **, en la primera columna, seguido
del nombre de la unidad. Este nombre puede llevar varias abreviaturas o formas de
escritura alternativas separadas por comas. El siguiente formato permite incluir un
nombre de unidad en singular y en plural<
*[ [com*n] [ ( [singular.] plural) ] ]...
(ueden especificarse varias e%presiones *singular y plural,. 7o es necesario $ue vayan
situadas al final de la palabra, y tampoco es necesario incluir la forma en plural.
Ejemplos<
78
*pulgada(s)
*mileni(o.os)
*pi(e.es)
*metro(s),meter(s),metre(s),m
En esta ltima lnea por ejemplo, la unidad definida permite llamarla despu)s como
argumento de CVUNIT de las formas siguientes< metro, metros, meter, meters, metre,
metres o m. En el caso de la unidad de medida en pies del ejemplo< pie o pies.
La lnea $ue sigue a esta primera define la unidad como fundamental o derivada. :na
unidad fundamental es una e%presin formada por constantes. 6oda lnea $ue siga a la
del nombre de la unidad y no empiece por un signo igual, define una unidad
fundamental. +onsta de cinco enteros y dos nmeros reales, de la siguiente forma<
c, e, +, ,, m, r1, r2

Los cinco enteros corresponden a los e%ponentes de estas cinco constantes<
Con#tante ... Signi4ica+o
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
C AAAAAAAAAAAA .elocidad de la luz en el vaco
E AAAAAAAAAAAA +arga del electrn
@ AAAAAAAAAAAA +onstante de (lanc?
F AAAAAAAAAAAA +onstante de "oltzman
> AAAAAAAAAAAA =asa del electrn en reposo
6odos estos e%ponentes juntos definen la magnitud medida por la unidad< longitud,
masa, tiempo, volumen, etc)tera.
El primer nmero real *r1, es un multiplicador, mientras $ue el segundo *r2, es un
desplazamiento de escala aditivo $ue slo se utiliza para conversiones de temperatura.
La definicin de una unidad fundamental permite escribir el nombre de distintas formas
*por ejemplo, metro y m, y no importa $ue est) en maysculas o en minsculas. A
continuacin se define una unidad fundamental a modo de ejemplo<
*metro(s),metro(s),m
-1,0,1,0,-1,4.1214856408e11,0
En este ejemplo, las constantes $ue forman un metro son
33, 7 5 9 ' 9 3 , 7 m55 9 38A,1,8</; 9 3,- G ,,55
79
Las unidades derivadas se definen en funcin de otras unidades. 'i la lnea $ue sigue a
la del nombre de la unidad comienza con un signo igual *=, se trata de una unidad
derivada. Los operadores vlidos para estas definiciones son * *multiplicacin,, /
*divisin,, + *suma,, - *resta, y ^ *e%ponenciacin,. (uede hacerse referencia a las
unidades predefinidas bien por su nombre o bien por sus abreviaturas *si tienen,. Los
elementos $ue componen la frmula se multiplican todos, a menos $ue se especifi$ue
lo contrario mediante el operador correspondiente. (or ejemplo, la base de datos de
unidades define los nombres de mltiplos y submltiplos sin magnitudes, por lo $ue
pueden especificarse unidades como micropulgadas introduciendo micropulgada. A
continuacin ofrecemos algunas definiciones de unidades derivadas a modo de
ejemplo.
; Unidades de superficie
*township(s)
=93239571.456 meter^2
'e define una ciudad *toHns'ip, como I3.B3I.HD/,0HC metros cuadrados. +omo
vemos, las unidades cuadradas o cbicas se indican mediante un nombre de unidad
definido, el signo de e%ponenciacin y el e%ponente. =etros cuadrados podra ser<
meter^2, m^2, metros^2 y todas las dems combinaciones posibles; metros cbicos<
m^3, metro^3,...
; Unidades electromagnticas
*voltio(s),v
=vatio/amperio
En este ejemplo se define un voltio como el resultado de dividir un vatio por un
amperio. En el archivo ACAD.UNT, tanto los vatios como los amperios estn definidos
como unidades fundamentales.
+omo podemos observar, para incluir comentarios basta con colocar al principio de la
lnea un punto y coma. El comentario contina hasta el final de la lnea.

11.1.'. &-em%$o# +e CVUNIT
'e pueden convertir de unas unidades a otras no slo valores num)ricos sino tambi)n
valores de punto *listas de dos o tres coordenadas,. .eamos algunos ejemplos<
(CVUNIT 180 "degree" "radian") devuelve 3.14159
(CVUNIT 10 "cm" "inch") devuelve 3.93701
(CVUNIT 25 "celsius" "kelvin") devuelve 298.15
(CVUNIT 1.25 "horas" "segundos") devuelve 4500
(CVUNIT 2500 "m^2" "acre") devuelve 0.617763
(CVUNIT 15 "kg" "libras") devuelve 33.0693
(CVUNIT '(2 5 7) "mm" "pulgadas") devuelve (0.0787432 0.19685 0.275591)
(CVUNIT 760 "grados" "crculo") devuelve 2.11111
80
(ara la conversin de unidades, AutoL&'( necesita acceder cada vez al archivo
ACAD.UNT y leer su contenido. Esto resulta asaz lento, por eso, si un programa re$uiere
efectuar una conversin de diversos valores a las mismas unidades, es preferible
calcular un factor con CVUNIT para un valor 1 y, despu)s emplear este factor con los
dems valores num)ricos.
NOTA: 'i alguna de las unidades no e%iste o la conversin resulta incoherente,
AutoL&'( devuelve nil.

F; 4a#e interme+ia +e e-ercicio#
1ealcense diversos ejercicios de conversin de datos y unidades.
#esarrollar un programa $ue dibuje una curva helicoidal tridimensional sin grosor
mediante una spline. 'e indicar el radio inicial, radio final, precisin en puntos en
cada vuelta, nmero de vueltas y paso o altura *se dar para elegir,. La curva se
generar en el plano 2L del '+( actual y alineada con el eje S.
1'. 6ANIPULACIN D& CAD&NAS D& T&XTO
E%plicaremos a continuacin todo lo referente a las funciones de AutoL&'( para el
manejo de cadenas de te%to. Es frecuente en un programa la aparicin de mensajes en
la lnea de comandos, para la solicitud de datos por ejemplo. (ues bien, muchas veces
nos interesar utilizar las funciones $ue aprenderemos a continuacin para $ue dichos
mensajes sean ms interesantes o prcticos. Adems, determinadas especificaciones
de un dibujo en la "ase de #atos de AutoCAD se encuentran almacenadas como
cadenas de te%to, l)ase nombres de capa, estilos de te%to, variables de sistema,
etc)tera. (or todo ello, ser muy interesante asimilar bien los conocimientos sobre
cadenas de te%to para ascender un escalafn ms en la programacin en AutoL&'(
para AutoCAD 14.
+omencemos pues, sin ms dilacin, con una funcin sencilla<
(STRCASE cadena [opcin] )
STRCASE toma la cadena de te%to especificada en cadena y la convierte a maysculas o
minsculas segn opcin. Al final se devuelve el resultado de la conversin.
'i opcin no e%iste o es nil, la cadena se convierte a maysculas. 'i opcin es T, la
cadena de convierte a minsculas. .eamos unos ejemplos<
(STRCASE "Esto es un ejemplo") devuelve "ESTO ES UN EJEMPLO"
(STRCASE "Esto es un ejemplo" nil) devuelve "ESTO ES UN EJEMPLO"
(STRCASE "Esto es un ejemplo" T) devuelve "esto es un ejemplo"
(STRCASE "Esto es un ejemplo" (= 3 3)) devuelve "esto es un ejemplo"
81
(STRCASE "Esto es un ejemplo" (/= 3 3)) devuelve "ESTO ES UN EJEMPLO"
(STRCASE "MINSCULAS" T) devuelve "minsculas"
(STRCASE "maysculas") devuelve "MAYSCULAS"

La siguiente funcin es muy usada a la hora de programar, como veremos. STRCAT,
$ue as se llama, devuelve una cadena $ue es la suma o concatenacin de todas las
cadenas especificadas. .eamos su sinta%is<
(STRCAT cadena1 [cadena2...] )
:n ejemplo puede ser el siguiente<
(SETQ cad1 "Esto es un ")
(SETQ cad2 "ejemplo de")
(SETQ cad3 " concatenacin ")
(SETQ cad4 "de cadenas.")
(STRCAT cad1 cad2 cad3)
Esto devuelve lo siguiente<
"Esto es un ejemplo de concatenacin de cadenas."
+omo vemos, ya sea en un lado o en otro, hemos de dejar los espacios blancos
convenientes para $ue la oracin sea legible. :n espacio es un carcter A'+&& ms, por
lo $ue se trata igual $ue los dems.
Los argumentos de STRCAT han de ser cadenas forzosamente, de lo contrario AutoL&'(
mostrar un mensaje de error.
NOTA: 1ecordamos $ue al final de este MDULO e%iste una seccin en la $ue se
muestran todos los mensajes de error de AutoL&'( con sus significados
correspondientes.
+ada cadena nicamente puede contener /3B caracteres, sin embargo es posible
concatenar varios te%tos hasta formar cadenas ms largas.
:na utilidad muy interesante de esta funcin es la de visualizar mensajes $ue
dependen del contenido de ciertas variables, por ejemplo<
(SETQ NombreBloque (GETSTRING "Nombre del bloque: "))
(SETQ PuntoIns (GETPOINT (STRCAT "Punto de insercin del
bloque " NombreBloque ": "))
L tambi)n con variables de tipo num)rico, $ue deberemos convertir antes en un
cadena con alguna de las funciones aprendidas en la seccin anterior<
(SETQ Var1 (GETINT "Radio del crculo base: "))
(SETQ Var2 (GETINT (STRCAT "Nmero de crculos de radio " (ITOA Var1)
" que se dibujarn en una lnea")))
82
#e esta manera, pensemos $ue podemos introducir, en esa pe$ue!a cu!a $ue es la
variable dentro del te%to, el ltimo dato introducido por el usuario como valor por
defecto, por ejemplo. Lo veremos en algn ejemplo o ejercicio a lo largo de este
MDULO.
(SUBSTR cadena posicin [longitud...] )
Esta funcin e%trae longitud caracteres de cadena desde posicin inclusive. Esto es,
devuelve una subcadena, $ue e%trae de la cadena principal, a partir de la posicin
indicada y hacia la derecha, y $ue tendr tantos caracteres de longitud como se
indi$ue.
6anto la posicin de inicio como la longitud han de ser valores enteros y positivos.
.eamos unos ejemplos<
(SETQ Cadena "Buenos das")
(SUBSTR Cadena 2 3) devuelve "uen"
(SUBSTR Cadena 1 7) devuelve "Buenos "
(SUBSTR Cadena 7 1) devuelve " "
(SUBSTR Cadena 11 1) devuelve "s"
(SUBSTR Cadena 11 17) devuelve "s"
(SUBSTR Cadena 1 77) devuelve "Buenos das"
(STRLEN [cadena1 cadena2...] )
STRLEN devuelve la longitud de la cadena indicada. 'i no se indica ninguna o se indica
una cadena vaca *"",, STRLEN devuelve 0. El valor de la longitud es un nmero entero
$ue e%presa el total de caracteres de la cadena. 'i se indican varias cadenas devuelve
la suma total de caracteres. Ejemplos<
(STRLEN "Buenos das") devuelve 11
(STRLEN "Hola" "Buenos das") devuelve 15
(STRLEN) devuelve 0
(SETQ C1 "Hola, " C2 "buenos das.")
(STRLEN (STRCAT C1 C2)) devuelve 18

(ASCII cadena )
ASCII devuelve un valor entero $ue es el cdigo decimal A'+&& del primer carcter de
la cadena indicada. .eamos unos ejemplos<
(ASCII "d") devuelve 100
(ASCII "7") devuelve 55
(ASCII "+") devuelve 43
(ASCII "AutoLISP") devuelve 65
(ASCII "Programacin") devuelve 80
83
Esta funcin puede ser interesante a la hora de capturar pulsaciones de teclas. .eamos
el siguiente ejemplo<
(SETQ Tecla (GETSTRING "Teclee un radio o INTRO para terminar: "))
--(WHILE (/= (ASCII Tecla) 0)
--(PROMPT "An no terminamos...")
--(SETQ Tecla (GETSTRING "\nTeclee un radio o INTRO para terminar: "))
)
(PROMPT "FIN.")
En el momento en $ue pulsemos INTRO, $ecla guardar una respuesta nula cuyo
cdigo A'+&& es 0. En ese momento el programa acabar. 7o confundir con el cdigo
A'+&& del INTRO $ue es el 13, $ue no podramos utilizar por$ue lo $ue se guarda en
$ecla -$ue es lo $ue se compara- al pulsar INTRO es una cadena vaca "".
(CHR cdigo_-./&& )
CHR funciona complementariamente a A'+&&, es decir, devuelve el carcter cuyo cdigo
A'+&& coincide con el valor especificado. Ejemplos<
(CHR 54) devuelve "6"
(CHR 104) devuelve "h"
(CHR 0) devuelve ""
NOTA: Apr)ciese $ue CHR devuelve cadenas de te%to entrecomilladas.
(WCMATCH cadena filtro )
Esta funcin aplica un filtro o patrn a la cadena de te%to. 'e compara pues la cadena
con dicho patrn indicado y se devuelve T si lo cumple; si no se devuelve nil.
La manera de formar filtros es mediante un conjunto de caracteres globales o comodn,
$ue algunos recuerdan a la forma de trabajo al ms puro estilo ='A#9'. La relacin y
significado de los posibles filtros utilizables se muestra en la siguiente tabla<
Car:cter .... Nom,re ........... De4inicin
-------------------------------------------------------------------------
-------
# AAAAAAAAAAAA Almohadilla AAAAAAAA +ual$uier dgito num)rico.
@ AAAAAAAAAAAA A de arroba AAAAAAA +ual$uier carcter alfab)tico.
. AAAAAAAAAAAA (unto AAAAAAAAAAAAA +ual$uier carcter no alfanum)rico.
* AAAAAAAAAAAA Asterisco AAAAAAAAA +ual$uier secuencia de caracteres, incluida una vaca.
? AAAAAAAAAAAA 'igno de interrogacin A +ual$uier carcter.
84
~ AAAAAAAAAAAA 6ilde *ALT+126, AAA 'i es el primer carcter del patrn, cual$uier
elemento e%cepto el patrn.
[...] ------ +orchetes $uebrados A +ual$uiera de los caracteres encerrados.
[~...] AAAAAA 0 4 [] AAAAAAAAAAAAA +ual$uiera de los caracteres no encerrados.
- AAAAAAAAAAAA Tuin AAAAAAAAAAAA Entre corchetes siempre para especificar un rango para
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA un carcter nico.
, AAAAAAAAAAAA +oma AAAAAAAAAAAAAA 'epara dos patrones.
`AAAAAAAAAAAA Apstrofo invertido AA 9mite caracteres especiales *lee el siguiente
carcter de forma literal,.
Nota: 'i la cadena es muy larga se comparan slo del orden de HJJ caracteres.
.eamos una serie de ejemplos<
- #etectar si una cadena comienza con la letra F"F<
(WCMATCH "Bloques" "B*") devuelve T
- #etectar si una cadena tiene cinco caracteres<
(WCMATCH "Bloques" "?????") devuelve nil
- #etectar si una cadena contiene la letra F$F<
(WCMATCH "Bloques" "*q*") devuelve T
- #etectar si una cadena no contiene ninguna letra F$F<
(WCMATCH "Bloques" "~*q*") devuelve nil
- #etectar si una cadena contiene una coma *hay $ue indicar el literal de la coma,<
(WCMATCH "Bloques,armario" "*',*") devuelve T
- #etectar si una cadena comienza con la letra F"F o FbF<
(WCMATCH "Bloques" "B*,b*") devuelve T
- #etectar si una cadena comienza por un carcter en mayscula *cual$uiera,<
(WCMATCH "Bloques" "[A-Z]*") devuelve T
(READ [cadena] )
85
.eamos una funcin muy til. READ devuelve la primera e%presin de la cadena
indicada. 'i la cadena no contiene ningn par)ntesis y es un te%to con espacios en
blanco, READ devuelve el trozo de te%to hasta el primer espacio *en general ser la
primera palabra del te%to,.
'i la cadena contiene par)ntesis, se considera su contenido como e%presiones en
AutoL&'(, por lo $ue devuelve la primera e%presin. 'e recuerda $ue los caracteres
especiales $ue separan e%presiones en AutoL&'( son< espaio %lano, (, ), ', " y ;. A
continuacin se ofrecen unos ejemplos<
(READ "Buenos das") devuelve BUENOS
(READ "Hola;buenas") devuelve HOLA
(READ "Estoy(ms o menos)bien" devuelve ESTOY
Kay un aspecto muy importante $ue no debemos pasar por alto, y es $ue READ
e%amina la cadena de te%to pero analiza su contenido como si fueran e%presiones
AutoL&'(. (or ello devuelve no una cadena de te%to, sino una e%presin de AutoL&'(.
#e ah $ue los ejemplos anteriores devuelvan un resultado $ue est en maysculas.
L es $ue la utilidad real de READ no es analizar contenidos te%tuales, sino e%presiones
de AutoL&'( almacenadas en cadenas de te%to. (or ejemplo<
(READ "(setq x 5)") devuelve (SETQ X 5)
(READ "(SetQ Y (* 5 3)) (SetQ Z 2)") devuelve (SETQ Y (* 5 3))
Es decir $ue devuelve siempre la primera e%presin AutoL&'( contenida en la cadena
de te%to. 'i slo hay una devolver esa misma.
Estas e%presiones pueden ser posteriormente evaluadas mediante la funcin EVAL cuya
sinta%is es<
(EVAL expresin )
Esta funcin evala la e%presin indicada y devuelve el resultado de dicha evaluacin.
As por ejemplo<
(EVAL (SETQ x 15))
devuelve
15
Esto e$uivale a hacer directamente (SETQ x 15), por lo $ue parece $ue en principio no
tiene mucho sentido. L es $ue la funcin EVAL nicamente cobra sentido al utilizarla
junto con la funcin READ.
.amos a ver un ejemplo $ue ilustra perfectamente el funcionamiento de READ y EVAL
juntos. Aun$ue la verdad es $ue no es un ejemplo muy prctico, ya $ue re$uiere
conocimientos de AutoL&'( por parte del usuario del programa, pero e%amin)moslo
86
*ms adelante se mostrar otro ejemplo mejor,. Adems este programa nos ayudar a
afianzar conocimientos ya aprehendidos<
(DEFUN datos_curva ( / mens fun fundef pini pfin y1)
--(IF fun0 () (SETQ fun0 ""))
--(SETQ mens
--(STRCAT "Expresin de la funcin en X <" fun0 ">: "))
--(IF (= "" (SETQ fun (GETSTRING T mens))) (SETQ fun fun0))(TERPRI)
--(SETQ fundef (STRCAT "(defun curvaf (x)" fun ")"))
--(EVAL (READ fundef))
--(INITGET 1)
--(SETQ pini (GETPOINT "Inicio de curva en X: "))(TERPRI)
--(SETQ x1 (CAR pini) yb (CADR pini))
--(SETQ y1 (+ yb (curvaf x1)))
--(SETQ p1 (LIST x1 y1))
--(SETQ fun0 fun)
--(SETQ orto0 (GETVAR "orthomode")) (SETVAR "orthomode" 1)
--(INITGET 1)
--(SETQ pfin (GETPOINT pini "Final de curva en X: "))(TERPRI)
--(SETQ xf (CAR pfin))
--(WHILE (= xf x1)
----(PROMPT "Deben ser dos puntos diferentes.")(TERPRI)
----(INITGET 1)
----(SETQ pfin (GETPOINT pini "Final de curva en X: "))(TERPRI)
----(SETQ xf (CAR pfin))
--)
--(INITGET 7)
--(SETQ prx (GETREAL "Precisin en X: "))(TERPRI)
--(IF (< xf x1) (SETQ prx (- prx)))
--(SETQ n (ABS (FIX (/ (- xf x1) prx))))
)
(DEFUN curva (/ x2 y2 p2)
--(COMMAND "_pline" p1)
--(REPEAT n
----(SETQ x2 (+ x1 prx))
----(SETQ y2 (+ yb (curvaf x2)))
----(SETQ p2 (LIST x2 y2))
----(COMMAND p2)
---- (SETQ x1 x2 p1 p2)
--)
)
(DEFUN ult_curva (/ p2 yf)
--(SETQ yf (+ yb (curvaf xf)))
--(SETQ p2 (list xf yf))
--(COMMAND p2 "")
)
(DEFUN C:Curva (/ xf yb prx p1 n x1)
--(SETVAR "cmdecho" 0)
--(SETQ refnt0 (GETVAR "osmode"))(SETVAR "osmode" 0)
--(COMMAND "_undo" "_begin")
--(datos_curva)
--(curva)
--(ult_curva)
87
--(COMMAND "_undo" "_end")
--(SETVAR "osmode" refnt0)(SETVAR "cmdecho" 1)(PRIN1)
)
(PROMPT "Nuevo comando CURVA definido.")(PRIN1)
El programa dibuja el trazado de la curva de una funcin cual$uiera del tipo y 0 f 3x5.
(ara ello se solicita al usuario la e%presin de la curva, $ue habr de introducir con el
formato de una e%presin de AutoL&'(; por ejemplo (+ (* 5 x x) (- (* 7 x)) 3)
se correspondera con la funcin y 0 /x
1
. :x 4 2. El programa tambi)n solicita el
punto inicial y final de la curva, as como el grado de precisin de la misma, ya $ue se
dibujar con tramos rectos de polilnea. Esta precisin viene a ser la distancia entre
puntos de la polilnea.
El primer paso del programa consiste en desactivar el eco de los mensajes, guardar en
refnt0 el valor de los modos de referencia activados *variable OSMODE, para luego
restaurarlo, y poner dicha variable a 0, y colocar una se!al de iniio del comando
DESHACER. 6ras ejecutar todas la funciones, se coloca una se!al de fin y todo esto para
$ue se puedan deshacer todas las operaciones del programa con un solo H o un solo
DESHACER.
Esto es una prctica normal en los programas AutoL&'(. Lo $ue ocurre es $ue los
programas realizan una serie de ejecuciones de comandos de AutoCAD pero en el
fondo, todo se encuentra soterrado transparentemente bajo un nico comando. 'i no
estuvi)ramos conformes con el resultado de una ejecucin de un programa, al utilizar
el comando H slo se deshara el ltimo comando de la serie de comandos de la rutina.
#e la forma e%plicada se deshace todo el programa.
Lo primero $ue realiza el programa, tras lo e%plicado, es comprobar, con una funcin
IF, si la variable fun0 contiene alguna e%presin o no. La forma de realizarlo es similar
a un ejemplo de WHILE $ue ya se e%plico. En esta variable se guardar la ltima
e%presin introducida por el usuario y se utilizar como valor por defecto en la solicitud
*siguientes lneas,.
Lo $ue hace el IF es comprobar si fun0 devuelve T o nil. 'i devuelve T es $ue
contiene algo, por lo $ue no hace nada *lista vaca (),. (or el contrario, si devuelve
nil es $ue est vaca, es decir, es la primera vez $ue se ejecuta el programa, por lo
$ue la hace igual a una cadena vaca "". Esto se realiza as para $ue al imprimir el
valor por defecto en pantalla, no se produzca ningn error al ser dicha variable nil. Es
un m)todo muy manido en la programacin en AutoL&'(.
NOTA: 7tese $ue la variable fun0 no ha sido declarada como local en los argumentos
de DEFUN. Esto es debido a $ue necesita ser global para guardarse en memoria y
utilizarse en todas la ejecuciones del programa.
A continuacin, el programa presenta el mensaje de solicitud de la funcin en la lnea
de comandos. (or defecto se presentar la ltima funcin introducida *fun0, si e%iste,
si no los corchetes angulares estarn vacos, pero no habr ningn error. La manera de
presentar este mensaje es mediante una concatenacin de cadenas y un posterior
GETSTRING sin te%to. La funcin introducida por el usuario se guarda en fun. Luego,
88
con el IF siguiente nos aseguramos de darle a fun el valor de fun0 si fun es igual a
una cadena vaca, es decir si se ha pulsado INTRO para aceptar la funcin por defecto.
'eguidamente se forma, mediante una concatenacin de cadenas, la funcin completa,
a!adi)ndole un (DEFUN CURVAF (X) por delante y un ) por detrs. #e esta manera
tendremos una funcin de usuario evaluable por AutoL&'(.
NOTA: Esta manera de definir funciones con una variable asociada se e%pone al final
de esta e%plicacin del ejercicio.
A continuacin se evala mediante EVAL la funcin contenida en la cadena fundef $ue
se lee con la funcin de AutoL&'( READ. El resultado es $ue se ejecuta el DEFUN y la
funcin curvaf $ueda cargada en memoria para su posterior utilizacin.
Ahora se pide el punto de inicio de la curva en 2, y se capturan sus coordenadas 2 e L
en las variables x1 e yb mediante las funciones CAR y CADR. &nmediatamente se calcula
el inicio en L *y1, llamando a la reci)n creada funcin curvaf y se guarda el punto
como una lista de sus coordenadas *LIST, en p1. #espu)s se guarda en fun0 el valor
de fun para $ue en pr%imas ejecuciones del programa aparezca como opcin por
defecto.
A continuacin se guarda en orto0 el valor de ORTHOMODE -para despu)s restaurar- y
se establece a 1 para activarlo. #e esta forma se indica $ue la curva se trazar con una
base horizontal. 'e pregunta por la coordenada 2 final y se introduce el control del
WHILE para $ue las coordenadas 2 inicial y final sean diferentes. 'e restablece le valor
de ORTHOMODE.
(or ltimo en cuestin se solicitud de datos se solicita la precisin en 2. 'i el punto
final est a la iz$uierda del inicial se establece la precisin negativa. El programa
calcula el nmero de tramos de polilnea $ue almacena en n. FIX toma el valor entero
del cociente; este valor es el nmero de tramos completos. (ara dibujar el ltimo
tramo con intervalo incompleto se utiliza la funcin ult-curva.
A continuacin, y ya en la funcin curva, se produce el dibujado de los tramos
completos de la curva y, en la funcin ult-curva, del ltimo tramo incompleto. Oin de
la aplicacin.
Llegados a este punto toca e%plicar la nueva manera de definir funciones de usuario
con DEFUN. .eamos el siguiente ejemplo<
(DEFUN Seno (x)
--(SETQ xr (* PI (/ x 180.0)))
--(SETQ s (SIN xr))
)
+omo vemos, este ejemplo utiliza una variable global, pero $ue luego es utilizada
como argumento de la operacin cociente sin estar definida. Esto no es del todo cierto,
la variable est definida en el DEFUN, lo $ue ocurre es $ue no tiene valor. Este tipo de
variables se denominan asociadas, ya $ue se asocian a una e%presin.
89
As, al ejecutar este programa desde AutoCAD no podramos hacer simplemente<
(seno)
ya $ue producira un mensaje de error, sino $ue habra $ue introducir un valor
directamente a su variable asociada, por ejemplo<
(seno 90)
lo $ue calculara el seno de IJ grados se%agesimales. .eamos otro ejemplo<
(DEFUN Suma (x y z)
--(SETQ Sum (+ x y z))
)
+on este ejemplo habramos de escribir en la lnea de comandos, por ejemplo<
(suma 13 56.6 78)

1G; 4a#e interme+ia +e e-ercicio#
1ealizar un programa $ue facilite la edicin de los archivos A'+&& de AutoL&'(. La
rutina solicitar el nombre del archivo $ue se desea editar, proponiendo por defecto el
ltimo editado $ue se aceptar pulsando INTRO. 6ras esto, el programa correr el "loc
de notas de =icrosoft *suministrado con =icrosoft 5indo4s, con el fichero especificado
abierto.
1ealizar un programa $ue sea capaz de distribuir un te%to introducido por el usuario
en forma de arco< alrededor de un centro y con un radio especificado. El te%to se
generar en sentido horario.


1(. DN5ULOS 8 DISTANCIAS
6ras el estudio de cadenas vamos a estudiar un pe$ue!o grupo de funciones $ue nos
permiten manejar dos de los tipos de datos ms utilizados por AutoCAD< los ngulos y
las distancias. 1ecordemos a$u $ue dentro de AutoL&'( los ngulos se miden siempre
en radianes *como en casi todos los lenguajes de programacin e%istentes,.
+omenzamos por una funcin $ue se encarga de medir ngulos. Esta funcin es<
(ANGLE punto1 punto2 )
ANGLE devuelve el ngulo determinado por la lnea $ue une los dos puntos
especificados *punto1 y punto2, y la direccin positiva del actual eje 2 en el dibujo. As
90
pues, entre punto1 y punto2 se traza una lnea imaginaria y, el ngulo es el formado
por esa lnea con respecto al eje 2 positivo.
+omo sabemos, el ngulo se mide en radianes y su sentido positivo es el antihorario o
trigonom)trico. .eamos un pe$ue!o ejemplo<
(SETQ Inicio (GETPOINT "Primer punto: "))
(SETQ Final (GETPOINT Inicio "Segundo punto: "))
(SETQ Ang (ANGLE Inicio Final))
(ara pasar este valor a grados se%agesimales, como comentamos ya, habra $ue
hacer<
(SETQ AngSex (/ (* 180 Ang) PI))
.emos $ue es una funcin muy similar a GETANGLE o GETORIENT. La diferencia estriba
en $ue estas dos solicitan un ngulo, ya sea marcando dos puntos para calcularlo o por
teclado, y ANGLE calcula el ngulo entre dos puntos. 'i se indican dos puntos en
pantalla con GETORIENT o GETANGLE el resultado es el mismo $ue con dos GETPOINT y
la funcin ANGLE.
Es importante tener cuidado a la hora de introducir ambos puntos, argumentos de la
funcin ANGLE. El orden en $ue sean introducidos determina la medida de un ngulo
$ue no coincidir en absoluto si se indica su posicin de manera inversa. As por
ejemplo, si en el caso anterior se hubiera escrito (SETQ Ang (ANGLE Final Inicio)),
el ngulo devuelto no se correspondera con el $ue se devuelve al escribir (SETQ Ang
(ANGLE Inicio Final)). Esto mismo ocurra con GETANGLE y GETORIENT.
NOTA: 'i los puntos introducidos son en 3#, se proyectan ortogonalmente en el plano
2L actual.
(DISTANCE punto1 punto2 )
Esta funcin devuelve la distancia 3# entre los dos puntos especificados. Lgicamente,
con DISTANCE es indiferente el orden de introduccin de puntos. Ounciona de la misma
manera, con dos GETPOINT, $ue GETDIST. (ero DISTANCE se puede utilizar para calcular
la distancia entre dos puntos cuales$uiera del proceso de un programa, es decir, $ue
no hayan sido solicitados directamente al usuario. .eamos un ejemplo<
(DISTANCE (GETPOINT "Primer punto: ") (GETPOINT "Segundo punto: "))
El valor devuelto por DISTANCE es un nmero real, distancia 3# entre ambos puntos de
acuerdo a sus coordenadas en el '+( actual.
Las unidades son siempre decimales, independientemente de la configuracin de
unidades actual en el dibujo. 'i uno de los puntos especificado es B# *no se indica su
coordenada S,, se ignorar la coordenada S del otro punto y se devolver una
distancia B#. Evidentemente si los dos puntos son B#, la distancia es tambi)n B#.
(POLAR punto ngulo distancia )
91
La funcin POLAR devuelve un punto obtenido mediante coordenadas relativas polares
a partir del punto especificado, es decir, se devuelven las coordenadas de un punto.
#esde punto se lleva distancia en la direccin marcada por ngulo. +omo siempre, el
ngulo introducido se considera en radianes y positivo en sentido trigonom)trico.
Aun$ue el punto introducido como argumento pueda ser 3#, el valor del ngulo
*argumento tambi)n, se toma siempre respecto al plano 2L actual.
.eamos un pe$ue!o programa ejemplo de POLAR<
(DEFUN C:Balda (/ Punto1 Punto2 Ortho0 Dist)
--(SETQ Ortho0 (GETVAR "orthomode")) (SETVAR "orthomode" 1)
--(SETQ Punto1 (GETPOINT "Primer punto de la balda: ")) (TERPRI)
--(SETQ Punto2 (GETCORNER Punto1 "Segundo punto de la balda: ")) (TERPRI)
--(COMMAND "_rectang" Punto1 Punto2)
--(SETQ Dist (GETDIST Punto1 "Distancia a la siguiente balda: "))
(TERPRI)
--(COMMAND "_select" "_l" "")
--(WHILE (/= Dist nil)
----(COMMAND "_copy" "_p" "" Punto1 (POLAR Punto1 (/ PI 2) Dist))
----(SETQ Dist (GETDIST Punto1 "Distancia a la siguiente balda: "))
--)
--(SETVAR "orthomode" Ortho0)
)
Este programa dibuja baldas a distancias perpendiculares a la horizontal indicadas por
el usuario. 6ras el comienzo de la funcin se guarda el valor del modo 9rto para
restaurarlo posteriormente y se establece como activado. 'e pregunta por el primer y
segundo punto de la diagonal del rectngulo $ue formar la primera balda. :na vez
hecho esto, se dibuja la balda.
La siguiente fase consiste en copiar dicha balda las veces $ue se necesite en
perpendicular. (ara ello se pregunta por la distancia a la siguiente balda; el punto de
base siempre ser la primera es$uina dibujada de la primera balda. A continuacin se
establece el ltimo objeto dibujado *la primera balda, como conjunto de seleccin para
recurrir a )l despu)s como previo.
La dentro del bucle se van copiando baldas a los puntos designados por el usuario cada
vez. (ara ello se utiliza la funcin POLAR. +omo punto de inicio se utiliza siempre el de
la es$uina primera de la primera balda -como ya se ha dicho-, como ngulo (& 8 B,
es decir, IJ grados se%agesimales, y como distancia la $ue cada vez indi$ue el usuario
*variable Dist,.
#e este programa se sale pulsando INTRO cuando se nos pregunte por una distancia.
Esto lo controla el bucle WHILE de la forma $ue ya se ha e%plicado alguna vez. En el
momento en $ue se pulse INTRO, Dist ser igual a nil y WHILE no continuar. 'e
saldr del bucle y se restablecer el valor original de 9rto para acabar.
.eamos la ltima de este tipo de funciones. Es INTERS y se utiliza para obtener puntos
por interseccin entre dos lneas. 7o es e%actamente una funcin $ue calcule ngulos o
distancias, pero por su similitud de funcionamiento con ellas se ha incluido a$u. 'u
sinta%is es<
92
(INTSERS punto1 punto2 punto3 punto1 [prolongacin] )
Esta funcin toma los puntos punto1 y punto2 como e%tremos de una lnea *aun$ue no
lo sean,, los puntos punto3 y punto1 como e%tremos de otra, y calcula el punto
interseccin de ambas, el cual devuelve. .eamos un ejemplo<
(INTERS '(10 10) '(20 20) '(15 10) '(0 50))
esto devuelve
(13.6364 13.6364)
$ue es el punto interseccin.
El argumento prolongacin es optativo. 'i su valor es nil, la funcin INTERS
considera las lneas como infinitas y devuelve su punto de interseccin no slo entre
los lmites indicados, sino tambi)n en su prolongacin *si se cortan evidentemente,. En
este caso todas las lneas B# tendran interseccin, salvo $ue fueran paralelas.
'i prolongacin no se indica o su valor es diferente de nil, entonces el punto de
interseccin slo se devuelve si se encuentra entre los lmites indicados.
'i las rectas se cortan en su prolongacin pero no est indicado el parmetro
necesario, o si no se cortan de ninguna manera, INTERS devuelve nil. .eamos unos
ejemplos<
(INTERS '(10 10) '(20 20) '(15 10) '(20 0)) devuelve nil
(INTERS '(10 10) '(20 20) '(15 10) '(20 0) nil) devuelve (13.3333 13.3333)
(INTERS '(10 10) '(20 20) '(15 10) '(20 0) T) devuelve nil
(INTERS '(10 10) '(20 20) '(15 10) '(20 0) (/= 2 2)) devuelve (13.3333
13.3333)
Kay $ue tener cuidado en indicar los cuatro puntos en el orden correcto, pues en caso
contrario, las lneas cuya interseccin calcula INTERS sern diferentes. Evidente.

11; 4a#e interme+ia +e e-ercicio#
+r)ese un nuevo =odo de 1eferencia a 9bjetos $ue se FengancheF de puntos medios
virtuales, es decir de puntos medios cuales$uiera entre otros dos puntos $ue se habrn
de se!alar.
1ealizar un programa $ue dibuje nmeros de marca de despieces. 'e solicitar el
dimetro del punto de se!alizacin, el dimetro del crculo de marca, los puntos de
situacin y el nmero de marca. 6ras esto, se dibujar respetando dichos datos.

14. RUTINAS D& CONTROL D& &RROR&S
93
'e va a e%plicar bajo esta seccin una parte muy importante de la programacin en
cual$uier lenguaje, slo $ue a$u orientada al lenguaje $ue nos ocupa, orientada a
AutoL&'(. Esta parte a la cual nos referimos es el tratamiento de errores en un
programa.
+on todo lenguaje de programacin e%iste una funcin muy importante $ue debe
realizar un programador a la hora de dise!ar su aplicacin. Esta funcin es la $ue se
refiere al depuramiento o depuracin de un programa, es decir, a la total eliminacin
de los errores de sinta%is o programacin $ue pudiera contener un programa. :na vez
hecho esto se puede decir $ue el programa funciona correctamente, pero Pes esto
ciertoQ :na depuracin e%haustiva no consiste nicamente en revisar lnea por lnea de
cdigo buscando errores de sinta%is, variables mal declaradas, etc. Al programa hay
$ue lograr ponerlo bajo las condiciones ms duras de trabajo, hay $ue hacer $ue
ejecute su listado al borde de los lmites y ms all. En definitiva, hay $ue suponer
todos los casos con los $ue se va encontrar un futuro usuario al ejecutar la aplicacin.
Entre todos estos casos a los $ue nos referimos e%isten multitud de situaciones
inestables $ue producen error en un programa y hacen $ue )ste aborte su ejecucin
inesperadamente. Estas situaciones son las $ue debe prever el programador.
:n programa puede llegar a abortar no por un mal dise!o de su cdigo, sino
simplemente por$ue se intente buscar un archivo para ser abierto en la unidad de
disco fle%ible, por ejemplo, y el disco no est) introducido. El programador no puede
adivinar la voluntad FmaliciosaF de un usuario $ue no desea introducir el disco en la
dis$uetera para $ue el programa Fcas$ueF, o el olvido, o simplemente el despiste del
manejador del programa. 'in embargo puede suponer $ue el caso puede producirse e
introducir una rutina $ue controle dicho error y no deje abortar al programa.
En AutoL&'( el problema es un poco diferente; no disponemos de las instrucciones o
funciones potentes de control de errores $ue disponen otros lenguajes de
programacin. L es $ue con AutoL&'( siempre se dise!arn aplicaciones, rutinas,
comandos, etc)tera $ue corran bajo AutoCAD, y $ue un programa nuestro aborte no
$uiere decir $ue vaya a abortar AutoCAD. 'implemente habr sido un comando
fallido.
E%aminemos, por ejemplo, $u) ocurre cuando intentamos e%truir una polilnea abierta.
6ras solicitarnos todos los datos pertinentes, AutoCAD intenta e%truir el objeto y,
cuando llega a la conclusin de $ue no puede, nos muestra un mensaje de error $ue
nos indica la imposibilidad de realizar esa operacin con ese objeto. (odra habernos
dicho $ue no poda ser al designar la polilnea, pero no, ha ocurrido al final. P>u) es lo
$ue ha sucedido internamenteQ (ensemos en ello.
AutoCAD contiene un comando interno $ue posibilita la e%trusin de objetos planos
con superficie para convertirlos en slidos. Este comando responde a un programa $ue
ejecuta una serie de operaciones hasta llegar al resultado final. 'i nosotros
designamos, como en este caso, un objeto $ue no puede ser e%trudo, AutoCAD Fse lo
tragaF en un principio, es decir, no comprueba si el objeto designado es factible de ser
e%trudo o no. (ero al realizar las operaciones pertinentes un error *evidente, se
produce en su cdigo interno. El caso es $ue este error no se nos materializa de forma
escandalosa haciendo $ue aborte AutoCAD o $ue el sistema $uede inoperante -$ue
as podra haber sido si no estuviera controlado-, sino $ue simplemente nos advierte
94
FamablementeF $ue a susodicho objeto no se le puede aplicar una e%trusin. L acaba
la orden.
Este es un buen ejemplo del control de errores $ue deberemos realizar nosotros. En
AutoL&'( no pretenderemos $ue un comando creado no aborte, por$ue siempre lo
har si encuentra algn problema, sino $ue procuraremos canalizar ese error para $ue
no parezca tan grave o aparatoso y simplemente acabe de manera FlimpiaF el
programa o, por ejemplo, nos ofrezca la posibilidad de volver a ejecutar el comando
*$ue no es lo normal,.
.eremos por ejemplo $ue con .isual "asic el control de errores ser mucho ms
e%haustivo y real.
NOTA: Los comandos y aplicaciones $ue realicemos para AutoCAD 14 en AutoL&'(
siempre deben ser lo ms parecido a los propios comandos y aplicaciones nativos del
programa. 6anto en solicitud de opciones, como en control de errores, como en dise!o
de cuadros de dilogo, debemos guardar esa lnea tan caracterstica $ue distingue a
AutoCAD de todos los dems.
.eamos pues la manera de aplicar esto con AutoL&'(.

14.1. De4inir una 4uncin +e error
La manera de definir una funcin de error en AutoL&'( es, precisamente, con la funcin
para definir funciones de usuario, con DEFUN. La funcin $ue concretamente hemos de
definir no puede ser cual$uiera, sino $ue ha de ser una concreta llamada *error*. La
sinta%is para esta funcin especial se corresponde con cual$uier definicin de funcin,
nicamente hemos de saber $ue el argumento siempre ser la declaracin de una
variable global $ue guardar el te%to del mensaje devuelto por AutoL&'( en un evento
de error.
La funcin *error* es una funcin predefinida de manipulacin de errores. Al
comenzar una sesin de dibujo, esta funcin tiene un tratamiento de errores por
defecto. +ada vez $ue ocurre un error al ejecutarse un programa AutoL&'(, se realiza
el tratamiento incluido en ella. Lo $ue vamos a hacer nosotros simplemente es
redefinirla para personalizar dicho tratamiento a nuestro gusto. .eamos un ejemplo<
(DEFUN *error* (cader)
--(IF (= cader "tipo de argumento errneo") (err_arg))
)
En este ejemplo, al producirse un error, AutoL&'( suministra el te%to con su descripcin
como argumento a la funcin *error*. En este caso la variable cader almacena el
valor de ese te%to. 'e e%amina haber si esa cadena es "tipo de argumento errneo"
y, en caso afirmativo se llama a una determinada funcin de tratamiento, en este caso
err_arg, $ue har lo $ue tenga $ue hacer.
:n tratamiento estndar sera el siguiente cdigo<
95
(DEFUN *error* (Cadena)
--(PRINC "Error: ") (PRINC Cadena) (TERPRI)
--(PROMPT "*No vlido.*") (PRIN1)
)
+uando se produce un error de AutoL&'( en un programa, )ste $ueda abortado y se
nos devuelve la parte del listado del programa donde se ha producido dicho error,
adems de todas las funciones $ue engloban esa parte, es decir, hasta el par)ntesis
ms e%terno $ue es normalmente un DEFUN. Este listado puede resultar molesto y
desagradable a los ojos del usuario. :na rutina sencilla para evitarlo es )sta e%puesta
a$u.
Al producirse un error, el te%to de ese error se escribe con PRINC *$ue ya veremos en
su momento, y, en lugar de ofrecer el listado, se ofrece un mensaje *No vlido*. En
general ser necesario realizar un control ms profundo como el $ue vamos a e%plicar
ahora.
'ea el ejemplo siguiente, ya e%plicado anteriormente pero un poco mejorado con
detalles $ue ya conocemos<
(DEFUN Aro (/ Centro Radio Grosor Rint Rext Dint Dext)
--(INITGET 1)
--(SETQ Centro (GETPOINT "Centro del aro: ")) (TERPRI)
--(INITGET 7)
--(SETQ Radio (GETDIST Centro "Radio intermedio: ")) (TERPRI)
--(INITGET 7)
--(SETQ Grosor (GETDIST "Grosor del aro: ")) (TERPRI)
--(INITGET "Hueco Relleno")
--(SETQ Op (GETKWORD "Aro Hueco o Relleno (<H>/R): ")) (TERPRI)
--(IF (OR (= Op "Hueco") (= Op \n))
----(PROGN
------(SETQ Rint (- Radio (/ Grosor 2)))
------(SETQ Rext (+ Radio (/ Grosor 2)))
------(COMMAND "_circle" Centro Rext)
------(COMMAND "_circle" Centro Rint)
----)
----(PROGN
------(SETQ Dint (* (- Radio (/ Grosor 2))2))
------(SETQ Dext (* (+ Radio (/ Grosor 2))2))
------(COMMAND "_donut" Dint Dext Centro "")
----)
--)
)
(DEFUN C:Aro ()
--(SETVAR "cmdecho" 0)
--(COMMAND "_undo" "_begin")
--(Aro)
--(COMMAND "_undo" "_end")
--(SETVAR "cmdecho" 1)
--(PRIN1)
)
96
(TERPRI)
(PROMPT "Nuevo comando Aro definido.") (PRIN1)
Este programa dibuja aros huecos o rellenos, segn se indi$ue. =ientras todo funcione
correctamente y los datos introducidos no sean descabellados, no habr problema
alguno. (ero probemos a pulsar ESC cuando se nos pida un dato. El resultado en lnea
de comandos ser el siguiente, por ejemplo<
error: Function cancelled
(COMMAND "_circle" CENTRO REXT)
(PROGN (SETQ RINT (- RADIO (/ GROSOR 2))) (SETQ REXT (+ RADIO (/ GROSOR
2)))
(COMMAND "_circle" CENTRO REXT) (COMMAND "_circle" CENTRO RINT))
(IF (OR (= OP "Hueco") (= OP \N)) (PROGN (SETQ RINT (- RADIO (/ GROSOR
2)))
(SETQ REXT (+ RADIO (/ GROSOR 2))) (COMMAND "_circle" CENTRO REXT)
(COMMAND
"_circle" CENTRO RINT)) (PROGN (SETQ DINT (* (- RADIO (/ GROSOR 2)) 2))
(SETQ
DEXT (* (+ RADIO (/ GROSOR 2)) 2)) (COMMAND "_donut" DINT DEXT CENTRO
"")))
(ARO)
(C:ARO)
Diameter/<Radius> <19.6581>:
NOTA: A$u se trabaja con los mensajes en ingl)s, pero con la versin castellana el
modo de hacer es el mismo.
.emos $ue el programa ha sido abortado. El te%to de error $ue lanza AutoL&'( es
Function cancelled *detrs de error:,. Estos son los mensajes $ue guardar la
variable asociada a la funcin de control de errores. .amos pues a intentar controlar
este error.
A la funcin $ue define el comando de AutoCAD *C:Aro, le vamos a a!adir la lnea
siguiente< (SETQ error0 *error* *error* ControlErrores), justo detrs de la
desactivacin del eco de la lnea de comandos *variable CMDECHO, por razones obvias.
+on esto lo $ue hacemos es, primero guardar la definicin predeterminada de la
funcin predefinida *error* *en error0, para volver a restaurarla despu)s; as nos
aseguramos de dejarlo todo como estaba. L segundo, una vez salvaguardado el
contenido de esta funcin, asignarle el valor de la nueva funcin de control errores
ControlErrores, $ue enseguida definiremos. 6odo ello lo hacemos en un solo SETQ,
$ue no despiste, lo podramos haber hecho en dos.
+omo siguiente paso evidente definiremos la nueva funcin ControlErrores as<
(DEFUN ControlErrores (CadenaError)
--(SETQ *error* error0)
--(IF (= CadenaError "Function cancelled")
----(PROMPT "La funcin ha sido interrumpida por el usuario.")
--)
97
--(TERPRI)
--(PRIN1)
)
#e esta manera asociamos la variable CadenaError a la funcin, lo $ue har $ue se
guarde en dicha variable el contenido de la cadena de error lanzada por AutoL&'( *si
un error se produjera,. A continuacin restauramos el valor de la funcin predefinida
*error*. #espu)s comparamos el valor de CadenaError con el te%to $ue proporciona
AutoL&'( si se presiona ESC a una peticin y, si el valor es cierto, se muestra el
mensaje del PROMPT. (or fin, realizamos un salto de lnea con TERPRI para $ue el
*Cancel* $ue devuelve AutoL&'( no $uede pegado a nuestro mensaje y acabamos con
PRIN1.
+on esta funcin habremos controlado la salida de una pulsacin de ESC. (odremos
deducir fcilmente cmo hacer para $ue la pulsacin de ESC devuelva nicamente el
mensaje por defecto de AutoCAD, es decir el *Cancel*, sin nada ms *como ocurre
con los comandos del programa,.
'i $uisi)ramos controlar as todos los errores, la rutina sera un tanto e%tensa. (or ello,
lo $ue siempre se suele hacer es definir una rutina de tratamiento como la $ue sigue,
por ejemplo<
(DEFUN ControlErrores (CadenaError)
--(SETQ *error* error0)
--(IF (= CadenaError "quit / exit abort")
----(PRINC "\nDatos no vlidos. Fin del programa.")
----(PRINC (STRCAT "\nError: " CadenaError "."))
--)
--(TERPRI)
--(PRIN1)
)
#e esta forma controlamos si el error ha sido producido por una funcin QUIT o EXIT
de AutoL&'( *$ue enseguida veremos, o por cual$uier otra circunstancia. 'i el caso es
el primero se muestra un mensaje fijo y, si es el segundo se muestra el mensaje
Error: y a continuacin el propio error de AutoL&'(. #e esta manera tenemos
cubiertas todas las posibilidades.
Estos mensajes se pueden personalizar para cada tipo de error o incluso definir
diversas funciones de tratamiento de errores para cada funcin del programa, por
ejemplo. As, si sabemos $ue el usuario habr de introducir una serie de datos $ue, al
final, pueden producir una divisin entre J, si este error ocurre el mensaje podra
indicar especficamente $ue el programa no ha podido continuar por$ue se ha
intentado realizar una divisin entre cero no permitida *algo parecido a lo $ue
e%plicbamos $ue haca EXTRUSION,.
(ero an nos $ueda algn problema por resolver. 'i nos fijamos en el ejemplo del
listado devuelto tras un mensaje de error *antes de controlar, $ue hemos
proporcionado anteriormente, al final del listado vemos $ue AutoCAD reanuda el
comando CIRCULO pidiendo nuevos datos. +on el control $ue hemos proporcionado ya
no aparecera, pero fij)monos en el ejemplo siguiente<
98

(DEFUN C:EscribeHola ()
--(COMMAND "_text" "_s" "fantastic" "\\" "\\" "\\" "Hola")
)
Este pe$ue!o ejemplo escribe Hola con el punto de insercin, la altura de te%to y el
ngulo de rotacin proporcionados por el usuario *recordemos $ue "\\" es igual $ue
pause, y espera en medio de un comando una introduccin de un dato por el usuario,.
El problema es $ue si el estilo de te%to FANTASTIC no e%iste el programa $ueda
abortado pero AutoCAD sigue solicitando datos del comando TEXTO.
La manera de solucionar esto es incluyendo en la funcin de tratamiento de errores
una llamada a la funcin COMMAND sin argumentos. #e esta forma se cancela cual$uier
comando en curso *algo parecido a los caracteres ^C^C $ue incluamos en macros de
mens y botones de barras de herramientas,. As nuestra rutina de control de errores
$uedara<
(DEFUN ControlErrores (CadenaError)
--(SETQ *error* error0)
--(IF (= CadenaError "quit / exit abort")
----(PRINC "\nDatos no vlidos. Fin del programa.")
----(PRINC (STRCAT "\nError: " CadenaError "."))
--)
--(COMMAND)
--(TERPRI)
--(PRIN1)
)
L otro problema $ue $ueda en el aire es la restauracin de las variables cambiadas, as
como la colocacin de la marca de final del comando DESHACER. +uando un programa
$ueda abortado se cede el control a la funcin de tratamiento de errores y ya no
vuelve a pasar por el resto de las funciones. (or eso todo a$uello $ue hayamos variado
habremos de restaurarlo antes de terminar. :na forma, y siempre dependiendo del
programa, podra ser<
(DEFUN ControlErrores (CadenaError)
--(SETQ *error* error0)
--(IF (= CadenaError "quit / exit abort")
----(PRINC "\nDatos no vlidos. Fin del programa.")
----(PRINC (STRCAT "\nError: " CadenaError "."))
--)
--(COMMAND "_undo" "_end")
--(SETVAR "blipmode" blip0) (SETVAR "osmode" refnt0)
--(SETVAR "cmdecho" 1)
--(COMMAND)
--(TERPRI)
--(PRIN1)
)
As tambi)n, si el programa hubiera dibujado ya algo en pantalla antes de producirse el
error, se podra hacer $ue lo deshiciera todo para no dejar rutinas a medias.
99
7tese $ue hemos dicho $ue un el programa cede el control a la rutina de tratamiento
de errores al producirse un error, no $ue aborte inesperadamente. (or lgica se puede
deducir $ue podemos realizar un control tal $ue el programa, por ejemplo, vuelva a
reiniciarse por completo o ceda el control a la funcin fallida para volver a introducir
datos o lo $ue sea.
+omo sabemos y ya hemos dicho, los comandos de AutoCAD no vuelven a repetirse si
se da un error de estas magnitudes. ' lo hacen a la hora de introducir datos, por$ue
los vuelven a pedir si son errneos, pero eso ya lo controlamos con los INITGET. (or lo
tanto, lo ms lgico ser coincidir con la lnea de AutoCAD y salir de la rutina, eso s,
de una forma controlada y vistosa.
Adems de todo lo e%puesto decir $ue la variable de sistema ERRNO almacena un valor
cuando una llamada de funcin de AutoL&'( provoca un error $ue AutoCAD detecta
despu)s. Las aplicaciones de AutoL&'( pueden consultar el valor actual de ERRNO
mediante GETVAR para obtener informacin de las causas de un error. A no ser $ue se
consulte inmediatamente despu)s de $ue una funcin AutoL&'( informe de un error, el
error $ue su valor indica puede ser enga!oso. Esta variable siempre se inicializa a cero
al empezar o abrir un dibujo.
NOTA: 'i siempre utilizamos la misma rutina de control de errores, podemos escoger
incluirla en el archivo ACAD.LSP para $ue siempre est) definida de la misma forma. La
funcin de este archivo se estudiar en la seccin 15..
NOTA: Al final de este MDULO e%iste una relacin completa de todos los cdigos de
error e%istentes *variable ERRNO, y de todos los mensajes devueltos por AutoL&'(
*funcin *error*,.

14.'. Otra# caracterH#tica# +e$ contro$ +e errore#
E%isten tres funciones en AutoL&'( $ue tambi)n se utilizan a la hora de detectar y
procesar un error. La primera de ellas es ALERT, cuya sinta%is es<
(ALERT mensa%e )
ALERT presenta un sencillo letrero de dilogo con el mensaje de advertencia
especificado en el argumento mensa%e. El letrero slo contiene un botn Aeptar $ue,
al pulsarlo har $ue desaparezca el cuadro. Ejemplo<
(ALERT "Procedimiento no permitido")
&ncluyendo el cdigo de control \n podemos separar el mensaje en varias lneas<
(ALERT "Procedimiento no\npermitido")
El nmero de lneas de estos cuadros de advertencia y su longitud dependen de la
plataforma, el dispositivo y la ventana utilizada. AutoCAD trunca las cadenas cuya
longitud supere el tama!o del cuadro advertencia dependiendo de la plataforma.
100
ALERT puede ser utilizado en el momento $ue se detecta un error para presentar una
advertencia en pantalla y, por ejemplo, solicitar de nuevo los datos. .eamos un
ejemplo<
(DEFUN Datos1 ()
--(SETQ PuntoInicio (GETPOINT "Punto de inicio: ")) (TERPRI)
--(SETQ Radio (GETDIST PuntoInicio "Radio:" )) (TERPRI)
)
(DEFUN Datos_Vuelt ()
--(IF (SETQ Vueltas (GETINT "Nmero de vueltas: "))
----()
----(PROGN
------(ALERT "Debe introducir un nmero de vueltas")
------(Datos_Vuelt)
----)
--)
)
...
(DEFUN C:Vuelt ()
--(Datos1)
--(Datos_Vuelt)
...
)
Las otras dos funciones $ue comentaremos son EXIT y QUIT. 'us respectivas sinta%is
son<
(EXIT)
y
(QUIT)
Ambas producen el mismo efecto, esto es, interrumpen la aplicacin actual en el
momento en el $ue son ledas, devolviendo el mensaje de error quitar / salir
abandonar *en ingl)s es quit / exit abort, como ya hemos visto,.
'e pueden utilizar para acabar el programa directamente en el momento en $ue se
detecte un error. (odremos utilizarlos de la manera siguiente, por ejemplo<
(DEFUN Datos1 ()
--(SETQ PuntoInicio (GETPOINT "Punto de inicio: ")) (TERPRI)
--(SETQ Radio (GETDIST PuntoInicio "Radio:" )) (TERPRI)
)
(DEFUN Datos_Vuelt ()
--(SETQ Vueltas (GETINT "Nmero de vueltas: "))
--(IF (< (SETQ Vueltas (GETINT "Nmero de vueltas: ")) 1)
----(QUIT)
--)
101
)
...
(DEFUN C:Vuelt ()
--(Datos1)
--(Datos_Vuelt)
...
)
+laro $ue habra $ue controlar la salida como ya hemos e%plicado.
NOTA< 7ormalmente estas funciones se utilizan tambi)n en la depuracin de un
programa. #etenemos la ejecucin con QUIT o EXIT para evaluar distintas variables y
dems.

1'; 4a#e interme+ia +e e-ercicio#
(rogramar una rutina AutoL&'( $ue dibuje remates de tubos cortados en B#. 'e
solicitarn los datos convenientes y se a!adir una rutina de control de errores.
1ealizar un programa con control de errores $ue dibuje puertas en planta cortando
tabi$ues y muros. 'olicitar los datos pertinentes.
1). CAR5A 8 D&SCAR5A D& APLICACION&S
Kasta ahora hemos hablado de la forma de cargar nuestras aplicaciones o rutinas
AutoL&'( desde AutoCAD 14. 6ras haber escrito el archivo de te%to correspondiente,
accedamos a @errABCar#ar Apliai*nAAA y desde all cargbamos nuestro programa.
Esto e$uivale a ejecutar el comando APPLOAD en lnea de comandos. (ues bien, e%iste
una serie de funciones de AutoL&'( para manejar esta carga de programas desde otros
programas AutoL&'(. Esas funciones son las $ue vamos a estudiar seguidamente.
102
La primera funcin $ue veremos es LOAD. 'u sinta%is es<
(LOAD nombre_arc+ivo [fallo] )
Esta funcin carga en memoria el archivo AutoL&'( especificado y devuelve su nombre.
+omo sabemos, estos archivos podrn o no estar en uno de los caminos de soporte del
programa. 'i s estuvieran, con indicar el nombre es suficiente, si no habra $ue
escribir la ruta de acceso o camino completo.
NOTA: 1ecordemos $ue los archivos de soporte los configuramos desde
@errAB"refereniasAAA.
El nombre del archivo en cuestin no hace falta indicarlo con la e%tensin .LSP -
aun$ue se aconseja por claridad en programas grandes $ue llamen a archivos .LSP,
.DCL y8o a otros- si tiene esta e%tensin; si tuviera otra hay $ue especificarla
obligatoriamente, ya $ue AutoCAD le coloca el .LSP detrs en el momento en $ue no
e%iste. .eamos algn ejemplo<
(LOAD "circul")
(LOAD "escalera.lsp")
(LOAD "ventana.mio")
(LOAD "circuit.txt")
NOTA: +omo se ve, los nombres de archivo han de ir entrecomillados por ser cadenas.
La ruta de acceso indicada se establece al estilo ='A#9', pero con la particularidad de
$ue no podemos utilizar caracteres contrabarra *\, como separadores de directorios o
carpetas. Esto es debido a $ue, como sabemos, la contrabarra es un carcter de
control en AutoL&'(. L si revisramos el comienzo de este MDULO, cuando
hablbamos de los caracteres de control, veramos $ue la contrabarra hemos de
indicarla con dos caracteres contrabarra *\\,. (recisamente el primero es el carcter
de control y el segundo la contrabarra en s. (or ejemplo<
(LOAD "c:\\autocad\\program\\rutin\\caldera.lsp")
(or compatibilidad con sistemas :7&2, las rutas o caminos de acceso se pueden indicar
con el carcter de barra inclinada normal */,. Esto casi siempre resulta ms cmodo
$ue el m)todo anterior<
(LOAD "c:/autocad/program/rutin/caldera.lsp")
El argumento fallo ser devuelto si el programa fracasa a la hora de ser cargado. 'i
este argumento no e%iste y el programa falla al ser cargado, AutoL&'( de volver un
mensaje de error propio. (or ejemplo<
(LOAD "a:/miprog.lsp" "El archivo no se encuentra o el disco no est en
la unidad")
Este argumento tambi)n ha de ser indicado como cadena y se devuelve como tal, es
decir, entre comillas dobles.
103
La funcin LOAD la podemos usar para llamar a programas de AutoL&'( desde otro
programa, cargndolo antes con ella. (or ejemplo<
(DEFUN Prog1 ()
--(SETQ Pto1 (GETPOINT "Punto 1: "))
--(SETQ Pto2 (GETPOINT "Punto 2: "))
--(LOAD "c:/lisp/prog2.lsp")
--(prog2)
--(SETQ Result (/ (- NewPto1 NewPto2) 2.0))
)
En este caso, el programa llega a la funcin LOAD, carga el programa y lo ejecuta a
continuacin. 6ras haber acabado el otro programa se devuelve el control a este
primero.
NOTA: =ucho cuidado al declarar variables en este tipo de estructuras de llamadas a
programas. 'i las variables son locales y las necesita el otro programa, )ste no
funcionar. #eclararemos pues como locales nicamente a$uellas $ue no vayan a ser
utilizadas ms $ue en la rutina actual.
NOTA: Las aplicaciones AutoL&'( hoy por hoy no se pueden descargar de memoria.
(AUTOLOAD nombre_arc+ivo lista_comandos )
La funcin AUTOLOAD por su lado har $ue ahorremos memoria mientras no estemos
utilizando los programas o rutinas AutoL&'(. Esta funcin efecta la carga del archivo
especificado en nombre_arc+ivo al igual $ue LOAD, pero nicamente la primera vez
$ue se utilice uno de los comandos indicados en lista_comandos. As por ejemplo<
(AUTOLOAD "c:/lisp/rosca.lsp" '("rosca" "rc"))
Al ser una lista el segundo argumento debe ir indicado como tal. L los t)rminos deben
ir entrecomillados.
Esta lnea har $ue se cargue y ejecute automticamente el programa guardado en
rosca.lsp al escribir en lnea de comandos rosca o rc. 'i no se hace esto el programa
no se cargar, con el consiguiente ahorro de memoria.
#eberemos tener un par de consideraciones. La primera es $ue las palabras con las
cuales podemos llamar al programa indicado deben ser el nombre de funciones
contenidas en dicho archivo. L la segunda es $ue todas las funciones implicadas
debern estar definidas como comandos de AutoCAD, es decir con C: delante del
nombre. As por ejemplo, para $ue la lnea anterior funcionara, el archivo ROSCA.LSP
debera contener lo siguiente<
(DEFUN C:Rosca ()
...
)
(DEFUN C:Rc ()
--(c:rosca)
)
104
Es decir, los comandos con los $ue se puede acceder, uno de ellos definido como
abreviatura, pero definido en el propio archivo.
+on respecto a los directorios de soporte, las mismas consideraciones $ue para la
funcin LOAD.
NOTA: #esactivando la casilla Volver a ar#ar apliaiones de Auto!IS" entre di%u(os,
sita en la pesta!a Compati%ilidad del cuadro de dilogo "referenias, al $ue se accede
bajo @errAB"refereniasAAA, haremos $ue cada vez $ue entremos en un dibujo nuevo no
se pierdan los programas y variables globales de AutoL&'( cargados en memoria. El
te%to de la casilla es confuso sobremanera, as $ue cuidado< la casilla activada hace
$ue no se guarden estos programas en memoria. Esta misma caracterstica,
denominada de AutoL&'( persistente, se controla mediante la variable LISPINIT de
AutoCAD 14.
(ero tener $ue teclear lneas de estas cada vez $ue entramos en AutoCAD es un poco
pesado. 'i lo $ue $ueremos es $ue nada ms cargar AutoCAD, o nada ms entrar en
un dibujo o abrir uno nuevo, se carguen en memoria determinadas rutinas o funciones,
utilizaremos los archivos $ue vamos a e%plicar a continuacin.

1).1. ACADR14.LSP, ACAD.LSP " *.MNL
E%isten dos archivos, entre otros muchos, $ue se cargan nada ms arrancar AutoCAD,
y tambi)n cada vez $ue abrimos un dibujo o comenzamos uno nuevo *si est activada
la casilla de AutoL&'( persistente antes mencionada,. Estos dos archivos son el
ACADR14.LSP y el ACAD.LSP. ACADR14.LSP es un archivo $ue se suministra con
AutoCAD 14 y en el $ue podemos encontrar una serie de rutinas $ue los
desarrolladores de Autodes? han incluido ah para $ue se carguen nada ms comenzar
un dibujo. (or normal general este archivo no lo modificaremos, ni tampoco
a!adiremos lneas de cdigo a )l.
(ara la misma caracterstica disponemos de un archivo ACAD.LSP. Este archivo se
carga de manera igual al comenzar cual$uier dibujo, pero est pensado para $ue los
usuarios introduzcamos en )l nuestras modificaciones. (robablemente no e%ista en un
e$uipo en el $ue nunca haya sido creado, sea por el usuario o sea por aplicaciones
verticales para AutoCAD 14. 'i no e%iste nicamente deberemos crearlo, eso s, con
dicho nombre y e%tensin.
NOTA: El archivo ACAD.LSP ha de estar en un directorio de soporte para $ue sea
cargado. 'i e%iste ms de un ACAD.LSP en uno o varios directorios de soporte,
AutoCAD slo carga el primero $ue encuentra.
(odemos suponer pues $ue todas las definiciones de cdigo AutoL&'( incluidas en
estos archivos se cargarn nada ms entrar en AutoCAD y al comenzar nuevos
dibujos o abrir dibujos e%istentes. (or ello, si en ellos incluimos funciones LOAD, los
programas a los $ue llamen sern cargados nada ms abrir el editor de dibujo.
105
=ucho ms lgico, y en la prctica es lo $ue se hace, es introducir funciones AUTOLOAD,
$ue guarden una o varias palabras $ue, al ser escritas, cargarn programas AutoL&'( y
los ejecutarn automticamente.
NOTA: 'i la casilla de AutoL&'( persistente est desactivada, como hemos dicho los
programas y variables globales permanecern en memoria, pero no se cargarn los
archivos ACAD.LSP y ACADR14.LSP al entrar en un nuevo dibujo o en uno e%istente,
sino slo al arrancar AutoCAD. 'in embargo si la casilla est activada, estos archivos
se cargan siempre al cambiar de dibujo, pero los programas y variables globales no
permanecern en memoria. #ios lo entiende... (arece $ue la prctica ms habitual
consiste en activar dicha casilla e incluir funciones LOAD o AUTOLOAD en el ACAD.LSP. #e
esta manera dispondremos de las rutinas y programas en memoria *o preparados, en
cual$uier momento y sesin de dibujo.
Los archivos ACAD.LSP y ACADR14.LSP funcionan como cual$uier otro archivo de
AutoL&'( normal, es decir, lo $ue no est dentro de ningn DEFUN se evala
automticamente al ser cargado el programa; lo $ue est) dentro de algn DEFUN se
evaluar cuando se llame a la funcin en cuestin.
(or ltimo hemos de recordar en este punto la utilidad de los archivos .MNL de mens.
Estos archivos contienen normalmente las rutinas necesarias para el funcionamiento de
opciones de un nuevo men creado *si las necesita,. Es decir, si un men llama a
comandos programados en AutoL&'(, el cdigo de estos comandos se puede introducir
en un archivo $ue tenga el mismo nombre $ue el men y la e%tensin .MNL.
'i el cdigo es muy e%tenso, o por mayor organizacin, se pueden incluir en este
archivo llamadas a los programas necesarios con LOAD o AUTOLOAD. Los .MNL funcionan
de la misma forma $ue el ACAD.LSP y el ACADR14.LSP, y se cargan en memoria al
cargar el men correspondiente o al abrir un dibujo $ue lleve implcitamente cargado
ese men.

1).1.1. Con4iguracione# mI$ti%$e#
'i un usuario trabaja con mltiples configuraciones de AutoCAD, o hay varios usuarios
utilizando AutoCAD en un mismo puesto de trabajo, puede ser necesario cargar
diferentes rutinas en cada caso. Esto se consigue fcilmente estableciendo un
directorio o carpeta de inicio diferente para cada configuracin y definiendo en ella un
archivo ACAD.LSP con las instrucciones re$ueridas.
La carpeta de inicio se establece desde el acceso directo a AutoCAD 14 en 5indo4s,
como sabemos. 'i en el momento de iniciar la sesin, AutoCAD detecta un archivo
ACAD.LSP en dicha carpeta, carga automticamente su contenido. #e esta manera,
pueden coe%istir en disco duro varios archivos ACAD.LSP situados en diferentes
carpetas.
#e hecho, )ste es el procedimiento ms sencillo $ue utilizan los desarrolladores de
aplicaciones. Al instalarse una aplicacin $ue funciona sobre AutoCAD, se crea una
106
carpeta propia con un archivo ACAD.LSP y un acceso directo $ue inicia AutoCAD desde
esa carpeta.

1).1.'. De4inir 4uncin como S::STARTUP
Llegado este momento vamos a e%plicar esta forma un poco especial de definir una
funcin. +omo sabemos, dentro de los archivos comentados anteriormente las
funciones LOAD y AUTOLOAD hacen $ue se carguen programas automticamente al
arrancar AutoCAD. (ero si tambi)n $ueremos $ue algunas funciones se ejecuten
automticamente al abrir el programa deberemos incluirlas bajo una funcin definida
como S::STARTUP de la siguiente forma<
(DEFUN S::STARTUP ()
...
)
6odo lo $ue haya entre los dos par)ntesis del DEFUN se ejecutar automticamente.
.iene a ser lo mismo $ue dejarlo fuera de cual$uier DEFUN, pero de manera ms
ordenadas y clara. .eamos un ejemplo<
(DEFUN S::STARTUP ()
--(COMMAND "_purge" "_all" "" "_n")
)
#e esta manera, al entrar en cual$uier dibujo se limpiar automticamente todo lo no
utilizado< capas, estilos de te%to, tipos de lnea...
El prefijo S:: de esta funcin especial debe considerarse como reservado y es mejor no
utilizarlo en ninguna funcin de usuario.
.eamos otro ejemplo ms utilizado<
(DEFUN c:guardarr ()
...
)
(DEFUN c:guardarcomo ()
...
)
(DEFUN S::STARTUP ()
--(COMMAND "anuladef" "guardarr")
--(COMMAND "anuladef" "guardarcomo")
)
'i $uisi)ramos redefinir estos comandos de AutoCAD, de la versin castellana del
producto, podramos haber escrito esto en el ACAD.LSP. As cargaran en memoria las
nuevas definiciones de los comandos GUARDARR y GUARDARCOMO y, al ejecutarse
automticamente S::STARTUP, con el comando de AutoCAD ANULADEF se anularan las
107
actuales definiciones de esos dos comandos. (ara recuperar las definiciones normales
de ambos comandos, basta emplear el comando de AutoCAD REDEFINE. 'e recuerda
a$u $ue para utilizar la definicin habitual de comandos de AutoCAD redefinidos,
basta preceder su nombre de un punto *para ms informacin debemos dirigirnos al
MDULO SIETE de este curso,.

1).'. A%$icacione# ADS
Kay una serie de funciones de AutoL&'( para gestionar las aplicaciones A#' *ya
obsoletas,. En esta seccin las vamos a e%plicar.
(XLOAD nombre_arc+ivo [fallo] )
Ounciona de la misma manera $ue LOAD para las aplicaciones AutoL&'(. En este caso de
aplicaciones A#', al mismo tiempo $ue se cargan se comprueban si son compatibles
con AutoL&'(. En el caso de detectarse incorrecciones el proceso $uedara abortado.
(AUTOXLOAD nombre_arc+ivo lista_comandos )
Ounciona de la misma manera de AUTOLOAD para las aplicaciones AutoL&'(.
(XUNLOAD nombre_arc+ivo [fallo] )
#escarga aplicaciones A#' de la memoria. El nombre en nombre_arc+ivo debe ser el
mismo $ue el $ue se utiliz al cargar la aplicacin con XLOAD. 'i se indic un camino de
directorios al cargar con XLOAD, es posible omitirlo al descargar la misma aplicacin con
XUNLOAD. 'i la aplicacin se descarga correctamente se devuelve el nombre de la
misma, si no un mensaje de error; a no ser $ue se indi$ue algo en el argumento
optativo fallo.
(ADS)
#evuelve una lista con los nombres y rutas de acceso *si hiciera falta, de las
aplicaciones A#' actualmente cargadas. (or ejemplo<
(ADS) podra devolver ("c:\\lsp\\prg.exp" "rut.exe" "ventn.exe")
(GETCFG nombre_parmetro )
El archivo ACAD14.CFG almacena la configuracin de AutoCAD. 'e trata de un archivo
de te%to al cual se puede acceder para a!adir especificaciones o modificar las
e%istentes. +ontiene una seccin denominada AppData $ue permite a los usuarios y
programadores almacenar informacin relativa a la configuracin de sus aplicaciones.
La funcin GETCFG recupera el valor del parmetro cuyo nombre se indi$ue. Este
nombre debe ser una cadena de te%to en la forma<
108
"AppData/nombre_aplicacin/nombre_seccin/.../nombre_parmetro"
(SETCFG nombre_parmetro valor )
Esta funcin es complementaria de la anterior y permite escribir un valor concreto en
la seccin AppData del archivo de configuracin ACAD14.CFG para el parmetro cuyo
nombre se indi$ue. Este parmetro debe especificarse en una cadena de te%to cuyo
formato es el mismo $ue para la funcin GETCFG.

1).(. A%$icacione# ARX
E%iste tambi)n una serie de funciones de AutoL&'( para gestionar las aplicaciones A12.
.amos a verlas.
(ARXLOAD nombre_arc+ivo [fallo] )
Ounciona de la misma manera $ue XLOAD para las aplicaciones A#' y LOAD para
aplicaciones AutoL&'(. 6ambi)n se comprueba la compatibilidad del archivo con
AutoL&'( como con XLOAD.
(AUTOARXLOAD nombre_arc+ivo lista_comandos )
Ounciona de la misma manera de AUTOXLOAD para aplicaciones A#' y $ue AUTOLOAD
para las aplicaciones AutoL&'(.
(ARXUNLOAD nombre_arc+ivo [fallo] )
Ounciona de la misma manera de XUNLOAD para la aplicaciones A#'.
(ARX)
#evuelve una lista con los nombres y rutas de acceso *si hiciera falta, de las
aplicaciones A12 actualmente cargadas. (or ejemplo<
(ARX) podra devolver ("acadapp.arx" "oleaprot.arx")

1).4. Acce#o a coman+o# e2terno#
*6oda esta seccin se proporciona en el archivo comext.zip para su ptima
visualizacin,.

1).). Inicio +e a%$icacione# Jin+oK#
109
E%iste una funcin $ue nos permite iniciar aplicaciones basadas en plataforma 5indo4s
desde AutoL&'(. Esta funcin es<
(STARTAPP aplicacin [arc+ivo] )
aplicacin dice referencia al programa $ue $ueremos iniciar y arc+ivo al archivo $ue
$ueremos abrir directamente con dicho programa. 'i no se indica una ruta de acceso
completa, la aplicacin se busca en la ruta de bs$ueda especificada en la variable de
entorno "AT@ del sistema operativo. .eamos tres de ejemplos<
(STARTAPP "notepad" "ejemplo.txt")
(STARTAPP "c:/windows/app/miprog.exe")
(STARTAPP "wordpad" "a:\\lisp\\tuerca.lsp")
'i STARTAPP se evala correctamente devuelve un nmero entero, en caso contrario
devuelve nil.

1(; 4a#e interme+ia +e e-ercicio#
(robar las diferentes funciones estudiadas en estas secciones anteriores con rutinas
$ue llamen a otras rutinas, programas $ue utilicen los comandos e%ternos comentados
y dems. (ersonalcese tambi)n un archivo ACAD.LSP como prc
1@. INT&RACCIN CON L&TR&ROS &N DCL
#esde la versin /B de AutoCAD el usuario tiene la posibilidad de elaborar sus propios
cuadros o letreros de dilogo en lenguaje #+L para formar parte de aplicaciones
personales. 6odo lo referente al dise!o de estos cuadros ya ha sido estudiado en el
MDULO DIEZ de este curso. (ero como se dijo entonces, con #+L elaboramos la
parte visible del cuadro, es decir su dise!o grfico aparente nicamente. (ara hacer
$ue funcionen y para controlarlos debemos recurrir, por ejemplo, a aplicaciones
programadas en AutoL&'(.
En la presente seccin vamos a e%plicar todas las funciones del lenguaje AutoL&'(
referentes al control de letreros de dilogo programados en #+L. 'e estudiarn todos
los m)todos para controlar un cuadro y se dispondrn diversos ejemplos $ue harn
referencia al funcionamiento de los cuadros dise!ados en el MDULO DIEZ.
Empecemos sin ms dilacin.

1@.1. Carga, mue#tra, inicio, 4in " +e#carga
110
Las primeras funciones $ue vamos a estudiar las hemos comentado ya a la hora de
hablar del dise!o en #+L. 'on las utilizadas para cargar, visualizar y activar un cuadro
de dilogo.
+omo sabemos, para $ue un programa #+L funcione hace falta utilizar como mnimo
tres e%presiones AutoL&'(< una para cargar el dise!o del cuadro en memoria
LOAD_DIALOG, otra para mostrarlo en pantalla NEW_DIALOG y otra para activarlo
START_DIALOG.
(LOAD_DIALOG arc+ivo_2/3 )
LOAD_DIALOG carga en memoria el archivo .DCL de definicin de cuadros de dilogo
especificado. :n archivo .DCL puede tener ms de una definicin de cuadros de
dilogo, en este caso se cargaran todas ellas. #e la misma forma, es posible utilizar
varias veces LOAD_DIALOG para cargar varios archivos .DCL, cada uno con uno o ms
dise!os de letreros. arc+ivo_2/3 es la ruta y nombre del archivo en cuestin; es una
cadena. Ejemplos<
(LOAD_DIALOG "prueba")
(LOAD_DIALOG "c:/archivs/lisp/cuadro.dcl")
(LOAD_DIALOG "c:\\mislsp\\helic-pol.dcl")
NOTA: 7o es imprescindible indicar la e%tensin, pero es conveniente por claridad.
'i la carga del archivo es fructfera se devuelve un nmero entero positivo $ue es un
ndice de carga $ue luego utilizaremos. Este ndice comienza en 1, la primera vez $ue
se carga un archivo con esta funcin, y contina con 2, 3, 4, 5... 'i la carga resulta
fallida, se devuelve cero *0, o un nmero negativo.
NOTA: 6odas estas indicaciones, a lo largo de este curso, acerca de lo $ue devuelve
una funcin *si falla, si no falla, si encuentra o no un archivo, etc., no son puro
capricho, sino muy tiles a la hora de programar. 7tese $ue, tras haber estudiado el
control de errores, podemos utilizar estas respuestas de AutoL&'( para controlar el
normal flujo de un programa. En este caso $ue nos ocupa, el hecho de $ue
LOAD_DIALOG devuelva 0 si el proceso de carga falla, nos ofrece la posibilidad de
controlar desde el propio programa AutoL&'( la correcta o incorrecta carga en memoria
de un archivo .DCL; tomando las oportunas decisiones en consecuencia.
El hecho de $ue LOAD_DIALOG devuelva un ndice de carga nos hace pensar la manera
de capturarlo para utilizarlo luego con la siguiente funcin. La manera es bien sencilla,
ya $ue se hace mediante un simple SETQ. Esta ser la forma habitual de suministrar
esta funcin, por ejemplo<
(SETQ Ind (LOAD_DIALOG "c:/lisp/torno.dcl"))
#e esta forma guardamos en una variable el ndice $ue devuelva LOAD_DIALOG.
(NEW_DIALOG nombre_letrero !ndice_carga [accin [punto_pantalla]] )
111
Esta funcin muestra en pantalla el letrero cuyo nombre se indi$ue. 7o hemos de
confundir este nombre de letrero con el nombre del archivo .DCL $ue, si el archivo slo
contiene una definicin de cuadro de dilogo coincidir habitualmente. El nombre del
letrero es el $ue precede a :dialog en el archivo .DCL. 6engamos en cuenta $ue,
como ya hemos dicho, un archivo puede contener la definicin de varios letreros, por
eso hay $ue indicar el nombre del $ue $ueremos visualizar. +on LOAD_DIALOG
suministrbamos el nombre del archivo .DCL.
6ambi)n habremos de indicar obligatoriamente con NEW_DIALOG el ndice de carga
devuelto por LOAD_DIALOG. As, una manera tpica de utilizar esta funcin tras usar
LOAD_DIALOG y haber guardado el ndice de carga en una variable llamada Ind *como
en el ejemplo anterior,, sera<
(NEW_DIALOG "torno" Ind)
NOTA: A$u vemos como puede coincidir el nombre del archivo .DCL con el nombre del
letrero *ver ejemplo anterior,.
El argumento accin especifica la accin por defecto, en forma de e%presin de
AutoL&'(, $ue se asignar a todos los elementos del cuadro $ue no tengan una accin
asignada en el programa. .olveremos sobre este argumento de NEW_DIALOG cuando
e%pli$uemos mejor esto de las acciones.
El argumento punto_pantalla es un punto en B# $ue especifica la posicin inicial del
letrero en pantalla, generalmente por la es$uina superior iz$uierda. La posicin por
defecto es el centro de la pantalla, aun$ue hablaremos un poco ms de este tema
cuando se estudie la funcin DONE_DIALOG.
'i NEW_DIALOG se evala correctamente devuelve T, si no devuelve nil.
NOTA: En 5indo4s el letrero $ueda ya inicializado con NEW_DIALOG, antes de utilizar la
siguiente funcin. Kay $ue tener en cuenta este aspecto a la hora de hacer llamadas
interactivas de NEW_DIALOG cuando hay casillas de un letrero $ue llaman a otro.
(START_DIALOG)
START_DIALOG inicializa el letrero de dilogo anteriormente mostrado en pantalla con
NEW_DIALOG.
:na vez utilizada esta funcin, la cual no tiene argumentos, el letrero permanece
activo hasta $ue el usuario se!ale un elemento $ue lleve asociada una accin de final
de letrero *DONE_DIALOG, $ue lo cierre. Esta accin suele estar asociada habitualmente
a los botones Aeptar y Canelar.
START_DIALOG devuelve el estado en el $ue se ha cerrado el letrero. 'i se ha hecho
mediante la casilla Aeptar devuelve 1; si se ha pulsado Canelar devuelve 0; si haba
letreros superpuestos y se han cerrado todos a la vez mediante TERM_DIALOG devuelve
-1.
112
(or ltimo, decir $ue, como enseguida veremos, en cada llamada a DONE_DIALOG se
puede indicar un estado de terminacin. 'i as se ha hecho, START_DIALOG devuelve
ese nmero de estado.
NOTA: mientras un cuadro permanece activo no es posible llamar a funciones de
AutoL&'( $ue afectan a la pantalla o re$uieren entradas del usuario $ue no tienen $ue
ver con el cuadro. Esto ocurre por ejemplo con COMMAND y con todas las funciones
"#$.... La funcin SSGET -ya veremos- se puede utilizar, siempre $ue no sea una de
sus opciones interactivas $ue solicita la accin del usuario.
(DONE_DIALOG [estado] )
Esta funcin cierra el letrero activo actual. #ebe ser llamada desde una e%presin de
control de los componentes de un letrero. Teneralmente ser llamada desde la funcin
$ue defina la accin del botn Aeptar *enseguida veremos todo esto,.
La funcin DONE_DIALOG devuelve las coordenadas 2 e L *generalmente de la es$uina
superior iz$uierda, correspondientes a la posicin del letrero en el momento de
cerrarse. Estas coordenadas pueden ser utilizadas para luego proporcionarlas en
sucesivas llamadas a NEW_DIALOG $ue, como hemos comentado antes, admite como
argumento unas coordenadas.
Entonces, si calculramos un valor por defecto para las coordenadas de un cuadro a la
hora de abrirse por primera vez *siempre $ue no e%ista ya un valor de coordenadas, y
capturramos la salida de DONE_DIALOG as, por ejemplo<
(SETQ CoorCuadro (DONE_DIALOG))
podramos luego llamar al mismo cuadro utilizando dichas coordenadas. #e esta
manera el cuadro siempre aparecera en el ltimo lugar en pantalla en el $ue se cerr.
A veces esto puede resultar til y a veces molesto.
'i se especifica un argumento en estado, debe ser un valor entero positivo. Este
argumento indica un estado de terminacin $ue ser el $ue se devuelva en sucesivas
llamadas a START_DIALOG. #e esta forma se podr asignar una accin diferente
dependiendo desde $u) casilla o botn se haya realizado el cierre.
(TERM_DIALOG)
Esta funcin cancela todos los letreros anidados en pantalla, si los hubiera. 'iempre
devuelve nil. START_DIALOG, $ue ha activado el primer letrero desde el $ue despu)s
han salido los dems, devuelve en este caso -1 una vez cancelados todos.
(UNLOAD_DIALOG !ndice_carga )
:na vez utilizado el dise!o del cuadro #+L, es decir una vez mostrado en pantalla, el
cuadro puede ser descargado mediante la funcin UNLOAD_DIALOG *aun$ue se siga
interactuando con )l,. 9 sea, el cuadro puede ser descargado inmediatamente despu)s
de utilizar START_DIALOG *para liberar espacio en memoria,. UNLOAD_DIALOG siempre
devuelve nil.
113
A modo de resumen podramos decir $ue el epgrafe de esta seccin 16.1. describe
muy bien la manera bsica de manejo de cuadros desde AutoL&'(. .eamos un ejemplo
simplificado<
(SETQ Ind (LOAD_DIALOG "archivo")); Carga
(NEW_DIALOG "cuadro" Ind); Muestra
...
(START_DIALOG); Inicio
(UNLOAD_DIALOG Ind); Descarga
...
(DONE_DIALOG); Fin
...

1@.'. 5e#tin +e e$emento# +e$ $etrero
:na vez estudiada la manera de iniciar y terminar un cuadro en pantalla, vamos a ver
cmo gestionar sus componentes incluidos, estableciendo as valores por defecto en el
inicio, e%trayendo del letrero dichos valores para su proceso, asignando acciones a
botones, etc)tera. Adems afianzaremos lo aprendido anteriormente viendo ya
ejemplos prcticos.
(ara todo ello vamos a ir desarrollando un ejemplo al cual se referirn todas las
e%plicaciones. Este ejemplo se corresponde con uno de los e%plicados en el MDULO
DIEZ, concretamente el de control de variables de AutoCAD 14. (ara mayor
comodidad mostramos a$u el letrero de dilogo y su cdigo en #+L *un poco variado
al final,<
NOTA: Los ejemplos $ue mostremos irn precedidos de epgrafes $ue estarn
identificados por nmero de ejemplo y nmero de parte.
Letrero 1
114

C+igo DCL 1 L VARIABLES.DCL L
dcl1.zip
La funcin con la $ue comenzaremos es SET_TILE. SET_TILE asigna un valor al
elemento cuya clave -atributo key de #+L- se indica. El atributo valor es una
cadena de te%to $ue especifica el valor $ue se asignar a determinado tile o elemento,
como ya hemos dicho, identificado por su key.
6odo te%to $ue aparece en un letrero de dilogo ha de ser una cadena, es decir, te%to
alfanum)rico en formato A'+&&, y no valores num)ricos en formato num)rico. As por
ejemplo<
(SET_TILE "Num" "23.32")
(SET_TILE "Telef" "944661234")
(SET_TILE "ValText" "Marca de moleteado")
'er muchas veces prctica habitual rellenar casillas de un cuadro con valores del
sistema por defecto. En este caso, si el valor corresponde a una variable alfanum)rica
*de AutoCAD o del usuario, no habr ningn problema en especificar, por ejemplo<
(SET_TILE "Estilo" (GETVAR "textstyle"))
lo $ue coger el valor de la variable de AutoCAD 14 TEXTSTYLE y la introducir en el
elemento con key="Estilo", $ue podra ser una :edit_box. (ero si el valor es
num)rico, habremos de convertirlo antes a formato A'+&& para despu)s introducirlo en
el elemento en cuestin. Esto lo realizaremos con cual$uiera de las funciones a tal
efecto ya estudiadas, por ejemplo<
(SET_TILE "TiempSal" (ITOA (GETVAR "savetime")))
lo $ue coger el valor de SAVETIME, $ue es num)rico entero, lo convertir a cadena
A'+&& con la funcin ITOA y lo asignar al tile identificado por TiempSal.
NOTA: En la relacin de variables de AutoCAD 14 $ue aparece en el APNDICE B de
este curso, se especifica para cada una el tipo de formato de datos, as como los
valores $ue admite. #e toda maneras, para saber si una variable es num)rica o
alfanum)rica nicamente deberemos teclear su nombre. 'i al preguntarnos por el
nuevo valor *si no es de slo lectura, el valor por defecto aparece entrecomillado, es
una cadena o variable alfanum)rica; si no, es num)rica.
Lo primero $ue debemos hacer en un programa AutoL&'( $ue controla un letrero de
dilogo, y despu)s de cargarlo y mostrarlo en pantalla, es rellenar sus casillas con
valores por defecto, activar las opciones de casillas de activacin y botones e%cluyentes
por defecto, etc)tera. +omo sabemos, esto lo podemos hacer en el propio archivo .DCL
*atributo value,, pero es preferible realizarlo desde AutoL&'(.
115
'i inicializramos elementos desde #+L y posteriormente desde AutoL&'(, se dara una
redundancia no deseada. (or ejemplo, si inicializamos una casilla de edicin :edit_box
en #+L, $ue contiene una valor de una variable de AutoCAD, como value="25" y
luego, desde AutoL&'( la volvemos a inicializar con el valor de la variable en el
momento de mostrar el cuadro *$ue es lo lgico,, se producir un instantneo FbaileF
de nmeros *entre el de value y el actual, si no coinciden, $ue no es vistoso para el
usuario. (or ello, normalmente desecharemos la asignacin por defecto desde #+L y la
realizaremos desde AutoL&'(.
6odas la operaciones de relleno de casillas, asignacin de acciones a botones, y en
general todos los acceso al cuadro de dilogo *$ue ya veremos, se introducen antes de
la funcin START_DIALOG y despu)s de NEW_DIALOG, si no no funcionar. .eamos ahora
entonces cmo comenzaramos el ejemplo de programa $ue nos ocupa.
C+igo AutoLISP 1 L VARIABLES.LSP L >%rimera %arte?
lisp1-1.zip
Comentario# a$ c+igo AutoLISP 1 L VARIABLES.LSP L >%rimera %arte?
Lo primero $ue hacemos a$u es definir una funcin $ue es comando de AutoCAD
*Var,; como sabemos podramos haber definido una funcin interna para luego
llamarla desde otra $ue sea comando de AutoCAD.
(osteriormente cargamos el cuadro de dilogo con LOAD_DIALOG guardando en la
variable Ind el ndice de carga. A continuacin, mostramos el cuadro en pantalla con
NEW_DIALOG proporcionando el ndice devuelto por la funcin anterior y guardado en
Ind.
:na vez hecho esto tenemos $ue inicializar todas las casillas, introduciendo
correlativamente en cada elemento, identificado por su key, el valor correspondiente.
7tese $ue este caso son valores de variables num)ricas de AutoCAD, por lo $ue
debemos utilizar funciones ITOA y RTOS *esta ltima en el caso del suavizado por ser
valor real, para convertir los datos a cadenas de te%to.
NOTA: +omo ya dijimos en el MDULO DIEZ, en #+L se realiza distincin entre
maysculas y minsculas, por lo $ue al identificar las key hay $ue introducir el mismo
nombre $ue se escribi en el archivo .DCL; no es lo mismo Suav $ue suav.
+omo sabemos, en el caso de casillas de activacin :toggle *y de otros elementos
como botones e%cluyentes,, un valor de 0 significa desactivado y un valor de 1 significa
activado. An as, 1 y 0 siguen siendo valores num)ricos enteros, por lo $ue se utiliza
para su conversin la funcin ITOA.

(ACTION_TILE clave accin )
Esta es la siguiente su%r de AutoL&'( $ue vamos a e%plicar. ACTION_TILE asigna una
e%presin AutoL&'( indicada en accin al elemento o tile e%presado por la clave de su
116
atributo key en el dise!o #+L. Ambos argumentos han de e%presarse entre comillas
dobles *"", por ser cadenas. (or ejemplo<
(ACTION_TILE "bot1" "(SETQ Var1 12) (SETQ Var2 0)")
Lo ms lgico parece ser indicar bastantes ms acciones $ue realizar en una asignacin
con ACTION_TILE. (or eso, la prctica habitual aconseja asignar como accin una
llamada a una subrutina o funcin interna dentro del programa AutoL&'(, as<
(ACTION_TILE "bot1" "(Acc1)")
#e esta forma asignamos al tile $ue tenga como key bot1 una secuencia de acciones
contenidas en la funcin Acc1. Esta funcin deber estar definida posteriormente, y ya
detrs de START_DIALOG, con su DEFUN particular. 'igamos con nuestro ejemplo para
entenderlo mejor.
C+igo AutoLISP 1 L VARIABLES.LSP L >#egun+a %arte?
lisp1-2.zip
Comentario# a$ c+igo AutoLISP 1 L VARIABLES.LSP L >#egun+a %arte?
Los dos primeros ACTION_TILE $ue se definen asignan a cada unos de los botones de
valores por defecto del letrero un par de acciones, englobadas ellas en sendas
subrutinas $ue luego se definirn. El tercer y ltimo ACTION_TILE asigna al botn
Aeptar *recordemos $ue se le da predeterminadamente accept como key, otra
subrutina denominada Chequear. Gsta comprobar la e%istencia de errores en las
entradas realizadas por el usuario en el cuadro y, cuando termine, ceder el control a
la siguiente funcin, al IF. 'i errores, $ue es una variable $ue definiremos despu)s,
tiene algn valor no se realizar nada *slo se mostrar un mensaje de error $ue
veremos luego en la funcin Chequear,. 'i errores es nil, es decir si no hay errores
*como veremos,, se pasa a la funcin Aceptar, $ue terminar el cuadro *como
veremos,.
NOTA: 7o slo podemos asignar acciones a los botones, sino a casi cual$uier elemento
de un letrero de dilogo. &maginemos, por ejemplo, la posibilidad de realizar una serie
de acciones al activar una casilla :toggle *mostrar otro cuadro, comprobar valores...,,
aun$ue no sea muy usual.
A continuacin, y tras la definicin y asignacin de valores y acciones en el cuadro, se
activa con START_DIALOG y se descarga de memoria con UNLOAD_DIALOG, pues ya no
interesa ocupar memoria con )l.
+omo ya se dijo, y ahora comprenderemos, con la funcin NEW_DIALOG se puede
indicar una accin por defecto. Esta accin por defecto se aplicar a todos a$uellos
elementos $ue no tengan despu)s una accin asignada. As si deseamos asignar la
misma accin a varios elementos de un cuadro, podemos hacerlos en NEW_DIALOG,
ahorrndonos espacio en el archivo AutoL&'( y su consiguiente memoria en el sistema.
117
NOTA: 'i un elemento tiene asignada una accin con ACTION_TILE, )sta se efecta
ignorando la opcin por defecto de NEW_DIALOG. Es posible una tercera manera de
asignar una accin a un elemento< el atributo action dentro de un archivo en #+L.
6ambi)n en este caso ACTION_TILE tiene prioridad sobre action. +omo norma general
usaremos ACTION_TILE para asignar acciones a los diversos tiles de un letrero de
dilogo.
La e%presin de accin asignada a un elemento puede acceder a una serie de variables
$ue informan sobre el estado del elemento o la manera en $ue el usuario ha
modificado dicho elemento. Estas variables son de slo lectura y pueden verse en la
tabla siguiente<
aria,$e .... Signi4ica+o
............................................................................................
$key AAAAAAAA 'e ha seleccionado el atributo key del componente. Esta variable se
aplica
a todas las acciones.
$value AAAAAA Es el valor actual del componente e%presado como cadena. Esta variable
se
aplica a todas las acciones. 'i el componente es una casilla de edicin :edit_box
se mostrar su valor como cadena; si es una casilla de verificacin :toggle o un botn
e%cluyente :radio_button, se mostrar una cadena "0", para el componente
desactivado, o una cadena "1", para el componente activado. 'i el componente es un
cuadro de lista :list_box o una lista desplegable :popup_list y ningn elemento se
encuentra seleccionado, el valor de $value ser nil.
$data AAAAAAAA 'on los datos gestionados por la aplicacin *si los hay, establecidos
justo despu)s de NEW_DIALOG mediante CLIENT_DATA_TILE *se ver,. Esta variables se
aplica a todas las acciones, pero no tiene sentido amenos $ue la aplicacin ya la haya
inicializado llamando aCLIENT_DATA_TILE.
$reason AAAAAA Es el cdigo de razn $ue indica la accin del usuario $ue ha
provocadola accin. 'e emplea con los tiles :edit_box, :list_box, :image_button y
:slider. Esta variable indica por $u) se ha producido la accin. 'u valor se define
para cual$uier tipo de accin, pero slo hace falta inspeccionarla cuando dicha accin
est asociada a alguno de los componente comentados.
$x AAAAAAAAAAAAA La coordenada 2 de una seleccin de :image_button. Es la cadena $ue
contiene la coordenada 2 del punto designado por el usuario al escoger un componente
:image_button. 7o tiene ningn significado para los dems tiles. La coordenada 2
forma parte del rango $ue devuelve DIMX_TILE para el componente, $ue ya
estudiaremos.
$y AAAAAAAAAAAAAA Lo mismo $ue la anterior pero para la coordenada L. Oorma parte del
rango de DIMY_TILE.
118
(or ejemplo, si se $uiere detectar cul es el botn concreto $ue ha seleccionado un
usuario, se asigna la misma e%presin *variable, a los botones, incluyendo en ella la
variable $key<
(ACTION_TILE "botn1" "(SETQ elem $key)(DONE_DIALOG)")
(ACTION_TILE "botn2" "(SETQ elem $key)(DONE_DIALOG)")
En cuanto el usuario se!ala un botn, $key devuelve la clave asociada a dicho
elemento, $ue se almacena en la variable elem y se cierra el cuadro. Al salir,
e%aminando la variable elem se puede averiguar $u) botn ha sido pulsado.
Ejemplo con $value<
(ACTION_TILE "casilla" "(SETQ val $value)")
En este segundo ejemplo, al introducir el usuario un valor en una casilla de edicin
cuya clave key es casilla la variable $value devuelve ese valor y la e%presin de
accin lo almacena en val.
La variable $reason devuelve el cdigo de razn $ue indica el tipo de accin $ue el
usuario ha realizado sobre el elemento. La mayora de las veces el valor devuelto es 1,
$ue indica $ue se ha designado dicho elemento. (ero hay cuatro tipos de elementos
$ue pueden e%presar otras acciones del usuario $ue la simple designacin< casillas de
edicin, listas, imgenes y deslizadores. A continuacin se e%plican de una manera
ms detallada los cdigos de razn $ue puede devolver $reason *tambi)n
denominados de retorno de llamada,.
+digo 1< El usuario ha designado el elemento, o ha pulsado INTRO si se trataba del
elemento por defecto. 'e aplica a todos los elementos, pero slo es necesario
e%aminar este valor para los cuatro tipos enumerados ms arriba, puesto $ue en los
dems es el nico valor posible.
+digo 2< 'e aplica a casillas de edicin. 'ignifica $ue el usuario ha entrado en la
casilla, ha realizado modificaciones en el te%to contenido, pero ha salido de ella
pulsando tabulador o seleccionando otro componente. +onviene comprobar en este
caso la validez del valor de la casilla antes de realizar ninguna accin, pues el usuario
podra haber dejado incompleta su modificacin del te%to.
+digo 3< 'e aplica a cursores deslizantes. 'ignifica $ue el usuario ha arrastrado el
cursor deslizante, pero no ha realizado una seleccin final. En este caso conviene
mostrar el valor en $ue ha dejado el usuario el cursor, bien mediante un te%to o en la
casilla de edicin $ue pueda haber junto al deslizador, pero sin realizar la accin
asignada al elemento por si el usuario modifica posteriormente el cursor deslizante.
+digo 4< 'e aplica a cuadros de lista y casilla de imagen. En el caso de cuadros de
lista significa $ue el usuario ha realizado una doble pulsacin sobre uno de los nombres
de la lista. 'i el cuadro de lista es el elemento principal de un cuadro, la doble
pulsacin debe tener asociada la seleccin del nombre y adems el cierre del cuadro.
En este caso, la accin asignada debe distinguir el cdigo de razn 1 *una simple
pulsacin $ue selecciona el nombre de la lista pero no cierra el cuadro, del cdigo 4
119
*seleccin del nombre y cierre,. 'i el cuadro de lista es un elemento $ue acompa!a a
otros en el cuadro, la doble y la simple pulsacin se traducen en el mismo efecto de
seleccionar un nombre, con lo $ue la accin asignada no tendra por $u) distinguir en
principio los dos cdigos posibles. En el caso de casilla de imagen, tambi)n significa
$ue el usuario ha realizado una doble pulsacin sobre ella. La accin asignada puede
as distinguir una simple de una doble pulsacin y realizar operaciones diferentes si
procede.
(GET_TILE clave )
La funcin GET_TILE e%trae el valor actual del elemento del cuadro de dilogo
identificado por su key en clave.
'uele ser habitual emplear GET_TILE a la hora de realizar la accin asignada al botn
Aeptar. #e esta forma e%traemos los valores ltimos introducimos por el usuario
haci)ndolos efectivos. 6ambi)n se puede utilizar en la funcin $ue controle los errores
del cuadro para escribir un mensaje en la lnea de errores *key error,. Lo veremos
enseguida en nuestro primer ejemplo, a continuacin de MODE_TILE.
(MODE_TILE clave modo )
MODE_TILE establece un modo para el elemento cuya clave se indi$ue. Los valores de
modo se e%presan en la siguiente tabla<
Modo .. De#cri%cin
......................................................
/. Kabilita el elemento *lo pone en negro,.
B. &nhabilita el elemento *lo pone en gris,.
3. &lumina, resalta o hace $ue parpadee el elemento.
0. 'elecciona el contenido de una casilla de edicin :edit_box.
H. 1esalta una casilla de imagen o anula el resaltado.
Esta funcin podemos utilizarla para controlar el aspecto de determinados elementos
con respecto a otros, por ejemplo si al seleccionar una casilla de seleccin nos interesa
$ue otra determinada se inhabilite, por$ue son incompatibles. Lo vemos ahora en la
siguiente parte de nuestro ejemplo.
C+igo AutoLISP 1 L VARIABLES.LSP L >I$tima %arte?
lisp1-3.zip
Comentario# a$ c+igo AutoLISP 1 L VARIABLES.LSP L >I$tima %arte?
A partir de donde lo habamos dejado, el siguiente paso consiste en crear las funciones
a las $ue llaman las diferentes acciones de los botones.
120
Las funciones Defecto1 y Defecto2, correspondientes a la pulsacin de uno de los dos
botones $ue rellenan su parte de cuadro con los valores por defecto, contienes
funciones SET_TILE $ue colocan en cada casilla o cuadro de edicin un valor $ue
nosotros hemos considerado por defecto para cada variable. Adems, contienen una
ltima funcin SET_TILE $ue asigna una cadena vaca a la lnea de error, identificada
por la key error, como sabemos. #e esto hablaremos ahora mismo al comentar la
funcin Chequear.
La funcin Chequear lo primero $ue hace es iniciar una variable denominada errores
como nula, sin valor *nil,. Esto se hace por si el cuadro ya haba sido utilizado y la
variable valiera T *haber cometido un error y salir con Canelar sin arreglarlo,, lo cual
sera antiproducente para nuestros objetivos.
A continuacin se e%trae mediante GET_TILE el valor de cada uno de los elementos del
cuadro de dilogo, guardndolos en variables de usuario *previa transformacin en
valores num)ricos enteros o reales, con ATOI o ATOF respectivamente,, y se comparan
mediante IF con los valores permitidos por AutoCAD para cada variable de sistema.
Es decir, si SURFTAB1 es menor de B, por ejemplo, sabemos $ue AutoCAD produce un
error. Lo mismo con los valores o rangos de las dems variables.
NOTA: 1ecordar $ue en el APNDICE B de este curso se ofrecen todos los valores
posibles a todas las variables de AutoCAD 14. An as, si introducimos un valor
descabellado a la pregunta de una variable en la lnea de comandos, normalmente se
nos ofrece un mensaje de error acompa!ado del rango de valores aceptados.
NOTA: La razn de $ue en este ejemplo no se controlen los valores altos de variables
como SURFTAB1 o SURFTAB2, es por$ue desde un principio se limit la entrada en las
casillas de edicin a un nmero m%imo de 3 caracteres *argumento edit_limit,. (or
ello no es necesario un control tan e%haustivo. (ara $ue el programa fuera completo,
habra $ue permitir dichos valores y controlar sus entradas, a$u no se hizo por$ue
valores de SURFTAB1 o SURFTAB2 mayores de 999 son realmente e%agerados *ambos
admiten hasta 32766,. 'i se $uisieran introducir valores ms altos habra $ue hacerlo
desde lnea de comandos.
'eguimos. 'i se introduce un valor no vlido en una casilla, se establece errores como
T y se imprime un mensaje en la lnea de errores. Esto se logra con SET_TILE,
asignando a la key error un mensaje entre comillas. A continuacin, se establece con
MODE_TILE un modo 2 para el elemento $ue contiene el error, es decir, $ue se
iluminar *generalmente en azul,.
6odo esto se realiza al pulsar el botn Aeptar. Al terminar la funcin de che$ueo de
errores, el programa devuelve el control a la siguiente instruccin desde donde fue
llamada dicha funcin, al IF del principio. 'i errores tiene un valor no ocurre nada
*lista vaca,, se muestra el error pertinente *ya estaba mostrado, y no se sale del
cuadro.
Al corregir el error y volver a pulsar Aeptar se repite todo el proceso. 'i no hay ningn
error se puede seguir adelante. 6ambi)n por ello al iniciar la rutina de control de
errores hay $ue restablecer errores a nil.
121
+uando todo est bien se pasa a la subrutina Aceptar, la cual introduce finalmente los
valores vlidos en las variables de sistema mediante SETVAR, e%tray)ndolas de los
correspondientes tiles mediante GET_TILE *previa transformacin a valores num)ricos
como anteriormente hemos e%plicado,.
Al final es necesario acabar con DONE_DIALOG. +omo sabemos, la key accept es
predefinida y lleva una funcin predeterminada inherente. Al asociar nosotros accept
con una rutina Aceptar, lo $ue hacemos es sobreescribir la rutina por defecto de
accept -$ue lleva ya implcito un DONE_DIALOG-. Es por eso $ue debemos incluir
DONE_DIALOG, por$ue si no el cuadro no se cerrara. El botn Canelar cierra el cuadro
sin ms.
E%isten un par de funciones ms dentro de este grupo $ue no hemos e%plicado por no
estar incluidas en el ejemplo, aun$ue una la hemos mencionado de pasada. 'on
CLIENT_DATA_TILE y GET_ATTR. La sinta%is de la primera *CLIENT_DATA_TILE, es la
siguiente<
(CLIENT_DATA_TILE clave datos_cliente )
Esta funcin asocia datos procesados mediante una aplicacin a un elemento de un
letrero de dilogo. El argumento datos, as como el argumento clave, debe ser una
cadena de te%to. :na accin asignada al elemento puede hacer referencia a estos
datos a trav)s de la variables $data.
:na aplicacin tpica es la asignacin de datos en una lista a una casilla desplegable<
(CLIENT_DATA_TILE "mod_sombra" "256_colores
256_col_resaltar_16_col_resaltar
16_col_rellenar")
#e esta manera se asignan a la casilla con clave mod_sobra los cuatro elementos
especificados lista.
(osteriormente, y mediante ACTION_TILE, es posible referirse a la lista a trav)s de la
variable $data, y8o al elemento o elementos seleccionados a trav)s de la variables
$value.
(GET_ATTR clave atributo )
+uando definimos un archivo en #+L utilizamos diversos atributos asignados a los
diversos elementos o tiles del letrero de dilogo. +on GET_ATTR podemos capturar los
valores de esos atributos *label, value, width, edit_limit, key..., de cada
elemento, indicando el valor de su clave o atributo key. 6anto clave como atributo
son cadenas.
(or ejemplo, para e%traer el valor por defecto con el $ue fue inicializado el cuadro en
determinado componente, podramos hacer<
(GET_ATTR "casilla" "value")
122

1@.(. 5e#tin +e com%onente# +e imagen
En esta siguiente seccin se van a e%plicar unas funciones especiales para el control de
las imgenes de los letreros #+L. (ara ello recurriremos a un segundo ejemplo $ue
viene como el anterior de uno de los ejemplos del MDULO DIEZ. En este caso
utilizaremos el la creacin de una curva helicoidal o h)lice 3# mediante un polilnea 3#.
NOTA: El cdigo de este programa *sin letrero de dilogo, se puede e%aminar en uno
de los ejercicios resueltos de este mismo MDULO. A$u, evidentemente, variar un
tanto para adaptarlo a la introduccin de datos desde el letrero.
(ero antes de comenzar con el ejemplo mostraremos antes el cdigo AutoL&'( de la
primera parte del programa, el cual se refiere al relleno de casillas y control de valores
por defecto. Esta parte todava no incluye control de imgenes, por lo $ue dejaremos
este tema para despu)s.
(ara mayor comodidad, se muestra a$u tambi)n tanto el letrero de dilogo en s como
el cdigo #+L $ue lo define.
Letrero '

C+igo DCL ' L HELICE-POL.DCL L
dcl2.zip
C+igo AutoLISP ' L HELICE-POL.LSP L >%rimera %arte?
lisp2-1.zip
Comentario# a$ c+igo AutoLISP ' L HLICE-POL.LSP L >%rimera %arte?
Lo primero $ue hacemos, como ya hemos de saber, es cargar y mostrar el letrero en
pantalla. 'eguidamente, y entre NEW_DIALOG y START_DIALOG se introduce toda la
batera de funciones AutoL&'( para rellenar el cuadro, establecer los valores por
defecto y declarar las funciones de accin. .amos a ir paso por paso.
La manera $ue se ha utilizado en este programa para rellenar los elementos del cuadro
es un tanto diferente a la usada en el ejemplo anterior. 1ecu)rdese $ue en dicho
123
ejemplo lo $ue hacamos era leer el valor de cada variable del sistema y rellenar las
casillas. En )ste la t)cnica es diferente, por$ue no son variables de sistema y tenemos
$ue darle un valor por defecto. (ara ello, nos inventamos unas variables *las acabadas
en 0, $ue guardarn los valores por defecto o los ltimos introducidos al volver a abrir
el cuadro. Esta t)cnica ya se ha utilizado en otros ejemplos de programas hasta ahora.
'e comprueba si la variable e%iste y, si no se le da un valor por defecto. La pr%ima
vez $ue se abra el cuadro, la variable ya tendr un valor *el dado por el usuario la
ltima vez,.
7os inventamos tambi)n otras tres variables *op1, op2 y op3, $ue contendrn los
valores por defecto de las dos :radio_row y de la :popup_list.
op1 se refiere a los botones e%cluyentes de I#uales y Diferentes. Entonces, si op1 no
tiene valor *no e%iste; igual a nil,, se le da un valor por defecto de 1. &nmediatamente
despu)s se comprueba el valor de op1; si es 1 se activa la casilla de I#uales y se llama
a la subrutina Iguales; si no es 1 se activa la casilla Diferentes y se llama a la
subrutina Diferentes. Ambas subrutinas se mostrarn ms adelante *contienen los
MODE_TILE para $ue se inhabilite o no la casilla del radio final dependiendo si ambos
son iguales o diferentes,.
op2 se refiere a la lista desplegable "reisi*n:. 'i no tiene un valor se le da por defecto
0. A continuacin se asigna dicho valor a la lista desplegable. En las listas desplegables
y cajas de lista, el primer valor es identificado como 0, el segundo como 1, el tercero
como 2, y as sucesivamente. #e esta forma aprovechamos esta nomenclatura para
declarar la variable.
(or su lado, op3 funciona de manera igual $ue op1. =s adelante en el programa
incluiremos las funciones necesarias $ue lean el cuadro a la hora de cerrarlo para
actualizar todos estos valores por los indicados por el usuario.
A continuacin se asignan las subrutinas de accin a los elementos $ue las necesitan,
es decir, al botn Aeptar y a los elementos :radio_button, $ue debern inhabilitar o
no determinadas casillas segn $u) condiciones.
(or ltimo de incluye el START_DIALOG y la llamada a la subrutina $ue realiza el dibujo
final de la h)lice. .eremos luego por $u) se escribe a$u.
A continuacin se e%plican las funciones para controlar componentes de imagen y se
sigue despu)s con el ejemplo.
(START_IMAGE clave )
Esta funcin inicia la creacin de una imagen en un cuadro de imagen. Kay $ue
suministrarle como argumento la clave o atributo key de la casilla de imagen
correspondiente en el archivo en #+L.
Las llamadas al resto de funciones $ue gestionen el componente de imagen se
realizarn entre START_IMAGE y END_IMAGE, la cual enseguida veremos.
124
(SLIDE_IMAGE 4 5 anc+ura altura arc+ivo_foto )
SLIDE_IMAGE visualiza una foto de AutoCAD en la casilla de imagen $ue se ha
inicializado con START_IMAGE.
Los argumento 4 e 5 se refieren al v)rtice superior iz$uierdo de la imagen de la foto
con respecto al origen de la casilla, es decir, especifican un desfase de la posicin de la
foto en referencia a la casilla $ue la contiene. Evidentemente, si se indican ambos
como 0, el v)rtice superior iz$uierdo de la foto coincide con el de la casilla.
Los argumentos anc+ura y altura especifican ambos tama!os de la imagen de foto. L
por ltimo se escribe el nombre de la foto de AutoCAD y la ruta de acceso si es
necesario. 'i la foto se encuentra en una biblioteca de fotos o fototeca, hay $ue indicar
el nombre de esta y, despu)s, el nombre de la foto entre par)ntesis. Este ltimo
argumento ir entre comillas por ser una cadena. La e%tensin .SLD no es obligatoria,
pero conveniente por claridad.
.eamos unos ejemplos<
(SLIDE_IMAGE 0 0 10 10 "planta")
(SLIDE_IMAGE 1 0 12 45 "c:/dcl/fotos/planta.lsd")
(SLIDE_IMAGE 0 0 100 100 "c:\\dcl\\fotos\\fotos1(planta)")
+on respecto a la altura y la anchura de la foto, se puede pensar $ue puede resultar un
poco complicado calcularlas, ya $ue en #+L se miden las distancias en caracteres y
nunca sabremos e%actamente cunto darle a cada valor, por$ue el resultado final es un
tanto arbitrario. (ara ahorrarnos dicho clculo, podemos hacer $ue AutoL&'( calcule
por nosotros ambas medidas. Esto se realiza con las dos siguientes funciones $ue
e%plicamos.
(DIMX_TILE 4 clave )
y
(DIMY_TILE 4 clave )
Estas dos funciones de AutoL&'( devuelven la anchura o dimensin 2 *DIMX_TILE, y la
altura o dimensin L *DIMY_TILE, del elemento #+L cuya clave se indica. (odemos
utilizarlo con cual$uier tile, aun$ue habitualmente se usan con los $ue implican
imgenes.
El origen de la casilla siempre se considera el v)rtice superior iz$uierdo. Los valores
devueltos son siempre relativos a ese origen, por eso hay $ue considerarlos hacia la
derecha y hacia abajo. #e esta manera podramos escribir una muestra de imagen con
SLIDE_IMAGE as<
(SLIDE_IMAGE 0 0 (DIMX_TILE "casilla") (DIMY_TILE "casilla") "foto1.sld")
#e esta forma no habremos de preocuparnos por calcular el ancho y el alto $ue debe
ocupar la foto.
125
E%iste otra forma de utilizar estas dos funciones. +omo sabemos tambi)n hay un
elemento $ue no es slo una imagen, sino un botn de imagen. 7ormalmente esta
casilla de imagen se utiliza como un simple botn, es decir, su designacin da lugar a
una accin. 'in embargo, se pueden definir regiones o zonas de la casilla, de manera
$ue la accin $ue haya $ue efectuar sea diferente segn en $u) zona se!ala el usuario.
El retorno de llamada de una casilla de imagen, es la posicin 2 e L del punto en $ue
ha se!alado el usuario. Esta posicin se puede obtener de las variables $x y $y ya
vistas. E%aminando las dimensiones de la casilla, se averigua en $u) zona se ha
se!alado. Este mecanismo se utiliza por ejemplo en el cuadro de DDVPOINT para
seleccionar los dos ngulos del punto de vista.
(or ejemplo, se dispone de una casilla de imagen cuya clave es ventanas y se desea
considerar cuatro zonas diferenciadas, todas del mismo tama!o<
(ACTION_TILE "ventanas" "(sel_ventana $x $y)")
...
(DEFUN sel_ventana (x y)
--(SETQ mitadx (/ (DIMX_TILE "ventanas") 2) mitady (/ (DIMY_TILE
"ventanas") 2))
--(COND
----(AND (< x mitadx)(> y mitady)) (SETQ accin "II"))
----(AND (< x mitadx)(< y mitady)) (SETQ accin "SI"))
----(AND (> x mitadx)(> y mitady)) (SETQ accin "ID"))
----(AND (> x mitadx)(< y mitady)) (SETQ accin "SD"))
--)
)
La accin asignada a la casilla ventanas es la funcin sel_ventana $ue tiene dos
variables dependientes x e y. Al se!alar en la casilla, las variables $x y $y devuelven
las coordenadas del punto de se!alamiento, siempre referidas al origen en el v)rtice
superior iz$uierdo de la casilla. La funcin sel_ventana se ejecuta con esos dos
valores como variables dependientes o asociadas. +alcula en primer lugar la mitad de
tama!o en 2 y en L de la casilla. A continuacin e%amina los valores de las variables x
e y $ue son las devueltos por $x y $y. En funcin de $ue las coordenadas del punto
se!alado sean mayores o menores $ue las de la mitad de la casilla, tanto en X como en
Y, se averigua en $u) cuadrante ha se!alado el usuario. La variable accin
almacenar el resultado como una cadena de te%to con las iniciales combinadas de
inferior, superior, iDIuierda y dere'a.
(FILL_IMAGE 4 5 anc+ura altura color )
Esta funcin rellena con un color plano uniforme la casilla inicializada con
START_IMAGE. Kemos de indicar tambi)n un origen en 2 y en L y una altura y anchura
*normalmente con las dos funciones vistas anteriormente,.
El argumento color especifica el color de AutoCAD *0 a 255, con el $ue se realizar el
relleno. Adems es posible indicar un nmero de color lgico segn se indica en la
siguiente tabla<
Co$or $gico ....... Signi4ica+o
126
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AB AAAAAAAAAAAAAAAAA +olor de fondo actual de la pantalla grfica de AutoCAD.
A/H AAAAAAAAAAAAAAAA +olor de fondo del letrero de dilogo actual.
A/C AAAAAAAAAAAAAAAA +olor de primer plano *del te%to, del letrero de dilogo actual.
A/E AAAAAAAAAAAAAAAA +olor de lneas del letrero de dilogo actual.
As podremos, por ejemplo, hacer $ue desaparezca una casilla de imagen rellenndola
con el color de fondo del letrero, o eliminar una foto representada para representar
otra *sino se superpondran,.
(END_IMAGE)
'implemente finaliza la gestin de un cuadro de imagen.
(or lo tanto podramos resumir el proceso principal de gestin de una imagen as, por
ejemplo<
(START_IMAGE "claveimg")
(SLIDE_IMAGE 0 0 (DIMX_TILE "claveimg") (DIMY_TILE "claveimg") "foto")
...
(END_IMAGE)
C+igo AutoLISP ' L HELICE-POL.LSP L >#egun+a %arte?
lisp2-2.zip
Comentario# a$ c+igo AutoLISP ' L HLICE-POL.LSP L >#egun+a %arte?
6ras lo ya comentado, a$u definimos las dos primeras funciones internas de accin. En
cada una de ellas se inicializa la casilla de imagen definida en el archivo #+L. A
continuacin se rellena de negro *color con el $ue se defini,. Esto se hace por$ue, al
cambiar entre radios iguales y diferentes $ueremos $ue la foto vare, presentndose
as una h)lice recta o una h)lice cnica segn el caso. (or eso debemos hacer un
relleno de negro, para $ue al cambiar de foto no se superponga a la $ue anteriormente
haba.
#espu)s se muestra la imagen correspondiente -una u otra- y se finaliza con
END_IMAGE. (or ltimo, se utiliza MODE_TILE para activar o desactivar la casilla del
radio final segn convenga.
NOTA: Apr)ciese la utilizacin de DIMX_TILE y DIMY_TILE.
NOTA: :n truco para sacar las fotos en AutoCAD, las cuales luego rellenarn casillas
de imgenes en cuadros de dilogo, es minimizar la sesin y ajustar la ventana del
programa lo ms posible a una e$uivalencia al cuadro $ue contendr la imagen *a
escala mayor,. 'i no hacemos esto, la foto se sacar en un formato $ue nada tiene $ue
ver con el de la casilla en cuestin y, probablemente, se ver pe$ue!a o descentrada.
127
C+igo AutoLISP ' L HELICE-POL.LSP L >tercera %arte?
lisp2-3.zip
Comentario# a$ c+igo AutoLISP ' L HLICE-POL.LSP L >tercera %arte?
:na vez establecidas las acciones para el cuadro de imagen, se definen las restantes,
es decir la del paso y la de la altura. En este caso, nicamente se habilitan o inhabilitan
las casillas correspondientes segn el caso.
#espu)s se define la funcin $ue controla los errores introducidos en el cuadro de
dilogo al pulsar el botn Aeptar. Esto se hace de manera anloga al primer ejemplo
e%plicado.
(or ltimo, se define la funcin de aceptacin. Lo $ue hace )sta es, primero asignar a
las variables correspondientes los valores capturados de las casillas del paso y de la
altura. 'egundo, realiza lo mismo con las variables op1, op2 y op3. 6ercero, e%trae el
valor de op2 *el de la precisin, y, segn dicho valor, asigna una precisin u otra a la
variable pv $ue se utilizar despu)s en el dibujado de la h)lice. Al final, se acaba con
DONE_DIALOG y se asignan los valores pertinentes de las variables $ue se utilizan para
guardar los valores por defecto a las variables $ue se usarn en la rutina de dibujo.
NOTA: 7tese $ue si los valores de la lista desplegable no hubieran sido cadenas con
te%to *< ptosA, ,; ptosA, etc.,, sino cadenas con un valor simple *<, ,;...,, podramos
haber capturado directamente el valor actual designado con la variable $value de
ACTION_TILE y asignrselo como tal *pasndolo a valor num)rico, a la variable pv.
+omo ya hemos comentado, mientras un cuadro de dilogo est) activo no se pueden
realizar operaciones de dibujo en el rea grfica. +uando se ejecuta un programa
AutoL&'( como el $ue estamos viendo, tras leerse el principio, se $ueda FesperandoF
en el START_DIALOG hasta $ue se produzca un DONE_DIALOG y un final de letrero,
realizando las llamadas a las subrutinas necesarias en cada momento. 'in embargo,
hasta $ue el cuadro no est) cerrado del todo no se puede realizar ningn proceso ms.
Esto es, cuando se produce el DONE_DIALOG, el control se devuelve a la siguiente
instruccin de START_DIALOG y es entonces cuando el cuadro estar perfecta y
completamente cerrado.
'i hubi)ramos puesto la llamada a la subrutina de dibujo *Dibujar_Hlice, despu)s
del DONE_DIALOG *en la rutina Aceptar,, el cuadro no habra estado cerrado por
completo, por lo $ue no se dibujara la h)lice y se producira un mensaje de error. Al
colocar susodicha llamada inmediatamente despu)s de START_DIALOG, se produce el
DONE_DIALOG, se devuelve el control a START_DIALOG y, ahora, el cuadro ya est
cerrado, pudi)ndose realizar la llamada y el consiguiente proceso de dibujado de la
h)lice.
La razn para la inclusin de la comparacin con el IF es $ue, si sale con el cdigo 1 de
DONE_DIALOG es $ue viene el control de la rutina de aceptacin, por lo $ue proseguir
el programa; si sale con un cdigo distinto *0 en este caso, es $ue se ha pulsado
Canelar, por lo $ue no se proseguir el programa.
128
C+igo AutoLISP ' L HELICE-POL.LSP L >I$tima %arte?
lisp2-4.zip
Comentario# a$ c+igo AutoLISP ' L HLICE-POL.LSP L >I$tima %arte?
(or ltimo, se define la rutina de dibujo, la de control de errores en tiempo de corrida y
la $ue define el nuevo comando HLICE de AutoCAD 14.
E%iste una funcin ms de gestin de imgenes de cuadros de dilogo $ue no hemos
visto por no estar incluida en el ejemplo. .emosla ahora<
(VECTOR_IMAGE 41 51 42 52 color )
La funcin AutoL&'( VECTOR_IMAGE dibuja un vector en la casilla de imagen cuyo
proceso se haya iniciado mediante START_IMAGE.
(ara el dibujo de dicho vector se indican unas coordenadas 2 e L de origen
*argumentos 41 e 51,, unas coordenadas 2 e L de destino *argumentos 42 e 52, y un
color *argumento color,. Las coordenadas siempre referidas al v)rtice superior
iz$uierdo de la casilla de imagen; el color puede ser cual$uiera de los de AutoCAD o
cual$uiera de los colores lgicos e%puestos en la tabla de la funcin FILL_IMAGE.
Esta funcin se puede utilizar para representar dibujos sencillos en las casillas o para
dividirlas en cuadrantes, por ejemplo.

1@.4. 5e#tin +e ca#i$$a# +e $i#ta " $i#ta# +e#%$ega,$e#
Al igual $ue lo visto hasta ahora, e%isten tambi)n tres funciones especficas para el
manejo de casillas o cajas de listas y de listas desplegables. En este tipo de elementos
del letrero, el programa de control AutoL&'( debe tener acceso por un lado a la lista
completa asignada al elemento y, por otro lado debe disponer de un retorno de
llamada $ue especifi$ue el elemento o elementos de la lista designados por el usuario.
La diferencia entre ambos elementos es $ue en las casillas con listados es posible
permitir varias designaciones al tiempo, mientras $ue en las listas desplegables slo es
posible una.
Las funciones en concreto las veremos a enseguida y, para ello, vamos a utilizar un
pe$ue!o ejemplo de prueba cuyo cdigo #+L se muestra a continuacin del cuadro en
s.
Letrero (
129

C+igo DCL ( L PRUEBA.DCL L
dcl3.zip
Antes de ver el ejemplo en AutoL&'( vamos a e%plicar estas tres funciones de control
de cuadros de lista y listas desplegables.
(START_LIST clave [operacin [!ndice]] )
Esta funcin START_LIST inicia el proceso de control de una lista de casilla o
desplegable. Ka de encontrarse situada entre NEW_DIALOG y START_DIALOG.
El argumento clave suministra la clave o atributo key del elemento en cuestin. (or su
lado, operacin es un nmero entero $ue puede tener uno de los valores siguientes<
Operacin ... Signi4ica+o
-----------------------------------------------------------------
1 +ambiar contenido seleccionado de la lista.
2 A!adir nueva entrada a la lista.
3. 'uprimir lista actual y crear una nuevo *es el valor por defecto,.
Estos valores de operacin controlan la manera en $ue sucesivas funciones ADD_LIST
*$ue ahora veremos, van a modificar la lista. El argumento !ndice slo tiene efecto si
se ha indicado un cdigo 1 para operacin. En este caso, !ndice especifica el nmero
de orden *comenzando desde 0 como sabemos, del elemento de la lista $ue ser
cambiado en la posterior utilizacin de ADD_LIST. .eamos un ejemplo<
(START_LIST "listaobjetos" 1 4)
--(ADD_LIST "Objeto1")
(END_LIST)
130
Este ejemplo cambia el elemento $uinto de la casilla por uno nuevo denominado
Objeto1.
9tro ejemplo<
(SETQ ListaObjs '("Objeto1" "Objeto2" "Objeto3"))
(START_LIST "listaobjetos" 2)
(MAPCAR 'ADD_LIST ListaObjs)
Este ejemplo a!ade varios elementos al final de la lista ya e%istente.
Wltimo ejemplo<
(SETQ ListaObjs '("Objeto1" "Objeto2" "Objeto3"))
(START_LIST "listaobjetos")
(MAPCAR 'ADD_LIST ListaObjs)
Este ejemplo reemplaza todos los elementos de la lista e%istente por los de la lista
proporcionada. 'e podra haber indicado el ndice 3.
NOTA: 7o es posible eliminar o insertar en medio un elemento nuevo en la lista. (ara
hacerlo habra $ue reconstruir la lista desde el primer elemento.
(ADD_LIST cadena )
Esta funcin realiza una u otra funcin segn el cdigo de operacin e%plicado en
START_LIST. 'lo se puede incluir una cadena por cada ADD_LIST. (ara a!adir ms de
un elemento a una lista, por ejemplo, habra $ue hacer sucesivas llamadas a ADD_LIST.


(END_LIST)
Oinaliza el proceso de control de caja de lista o lista desplegable iniciado por
START_LIST. 'iempre ir la ltima tras )sta y ADD_LIST.
(or lo tanto, la manera gen)rica de utilizar estas tres funciones es<
(START_LIST "lista")
--(ADD_LIST "cadena")
(END_LIST)
.eamos ahora pues el cdigo AutoL&'( de nuestro ejemplo<
C+igo AutoLISP ( L PRUEBA.LSP L >%rimera %arte?
131
lisp3-1.zip
Comentario# a$ c+igo AutoLISP ( L PRUEBA.LSP L >%rimera %arte?
En esta primera del cdigo en AutoL&'( todava no se utilizan las funciones de cajas de
listas y listas desplegables, sino $ue se preparan dos lista para luego a!adir a las
predefinidas en el archivo .DCL.
'e le pide al usuario el nmero de t)rminos $ue va a a!adir a la caja de lista y,
posteriormente, el nmero de t)rminos $ue va a a!adir a la lista desplegable. (ara
cada t)rmino se va solicitando un valor con el $ue se ir formando cada lista. 'i es el
primer valor se forma una lista con )l, en los sucesivos se van a!adiendo t)rminos a la
primera lista.
NOTA: La funcin APPEND an no la hemos estudiado, pero se puede deducir fcilmente
se funcionamiento.
C+igo AutoLISP ( L PRUEBA.LSP L >I$tima %arte?
lisp3-2.zip
Comentario# a$ c+igo AutoLISP ( L PRUEBA.LSP L >I$tima %arte?
A continuacin de lo anterior, se inicializa el cuadro y los distintos elementos tambi)n.
Adems se declaran los ACTION_TILE necesarios para el funcionamiento de los
elementos con accin asociada. Estos elementos son el botn Aeptar, el cul
inicializar de nuevo lo elementos con su valores originales y cerrar el cuadro; la caja
de lista, en la $ue al seleccionar un elemento se escribir su nmero de orden en la
casilla de edicin inferior; y la lista desplegable, $ue realiza lo mismo $ue la caja de
lista en la casilla inferior a ella. Estas acciones las podemos ver definidas en las
subrutinas correspondientes; v)ase el funcionamiento y utilizacin de la variable
$value.
La manera de a!adir los elementos nuevos en la lista es la e%plicada en al teora.
Wnicamente e%plicar $ue se utiliza la funcin NTH $ue va cogiendo cada elemento de la
lista por su nmero de orden *empezando por el cero,. Esta funcin se e%plicar en
breve.
(or ltimo, se define el nuevo comando de AutoCAD Prueba.

14; 4a#e interme+ia +e e-ercicio#
#esarrllese un programa AutoL&'( para controlar y hacer funcionar cada uno de los
cuadros de dilogo de los ejercicios propuestos del MDULO DIEZ.
132
1B. OTRAS =UNCION&S D& 6AN&CO D& LISTAS
En la seccin 10. ya se e%plic una serie de funciones las cuales tenan como
cometido manejar listas. Ahora veremos un complemento a lo ya aprendido.
Las funciones $ue vamos a estudiar manejan listas de la misma forma $ue las
mencionadas en dicha seccin 10., pero )stas son mucho ms completas y
funcionales. #escubriremos maneras de realizar trabajos, $ue antes podan resultar
tediosos, de forma sencilla, rpida y eficaz. (ero sobre todo, aprenderemos las
funciones bsicas $ue luego nos permitirn acceder a la "ase de #atos interna de
133
AutoCAD $ue, como ya se comentar, est estructurada en forma de listas y
sublistas.
6odo esto no $uiere decir $ue hemos de olvidar las otras funciones de manejo de listas
estudiadas, pues dependiendo del ejercicio $ue se deba realizar pueden ser tiles.
Adems, ciertos problemas nicamente pueden resolverse con ellas.
+omencemos pues con la primera de estas nuevas funciones, llamada ASSOC; su
sinta%is es la siguiente<
(ASSOC elemento_clave lista_asociaciones )
ASSOC busca el elemento especificado en elemento_clave en la lista especificada en
lista_asociaciones; devuelve la lista asociada cuyo primer elemento es el
especificado. (ara ello, esta lista debe ser una lista de asociaciones, es decir, $ue
contenga sublistas incluidas con elementos asociados, si no no funcionar.
.eamos un ejemplo sencillo. 'upongamos una lista $ue contenga varias sublistas de
asociaciones y definida de la siguiente forma<
(SETQ milista (LIST '(largo 10) '(ancho 20) '(alto 30)))
es decir, $ue el valor de la lista MiLista es un conjunto de listas de asociacin. Las
siguientes funciones ASSOC devolveran lo $ue se indica<
(ASSOC largo milista) devuelve (LARGO 10)
(ASSOC ancho milista) devuelve (ANCHO 20
(ASSOC alto milista) devuelve (ALTO 30
(ASSOC volumen milista) devuelve nil
.eremos ahora otra tambi)n muy utilizada cuya sinta%is es<
(CONS primer_elemento lista )
Esta funcin toma la lista indicada y le a!ade un nuevo primer elemento, devolviendo
la lista resultante. As, si tenemos una lista definida de la manera siguiente<
(SETQ milista '(10 20 30))
podemos hacer<
(CONS 5 milista) devuelve (5 10 20 30)
(ero atencin; este comando a!ade el elemento y devuelve la lista completa, pero el
cambio no es permanente. 'i $ueremos actualizar la lista para futuros usos, la manera
sera<
(SETQ milista (CONS 5 milista))
134
6ambi)n, evidentemente podramos hacer algo como lo siguiente *sin ningn
problema,<
(SETQ lista3 (CONS (CAR lista1) (CDR lista2)))
#e esta forma, a!adimos a la lista lista2 *e%ceptuando el primer elemento, el primer
elemento de la lista lista1. 6odo ello lo guardamos en lista3.
E%iste un modo particular de trabajar con la funcin CONS. L es $ue si como argumento
lista no especificamos una lista, sino un valor concreto o el nombre de una variable
definida, la funcin construye un tipo especial de lista de dos elementos llamado par
punteado *se denomina as por tener un punto de separacin entre ambos elementos,.
Los pares punteados ocupan menos memoria $ue las listas normales y son muy
utilizados en la "ase de #atos de AutoCAD. As<
(CONS 'clase 1) devuelve (CLASE . 1)
(CONS 'nombre 'antonio) devuelve (NOMBRE . ANTONIO)
(CONS 'nota 5.5) devuelve (NOTA . 5.5)
NOTA: A estos elementos de par punteado se accede directamente con las funcionas
CAR *para el primero, y CDR *para el segundo,, no CADR.
(SUBST elemento_nuevo elemento_antiguo lista )
El cometido de esta funcin es sustituir un elemento de una lista. (ara ello, busca en la
lista indicada como ltimo argumento *lista, el elemento indicado como segundo
argumento *elemento_antiguo, y lo sustituye por el elemento indicado como primer
argumento *elemento_nuevo,.
(or ejemplo, la variable lin contiene una lista $ue es el par punteado (8 . "0") y
$ueremos cambiar su segundo elemento<
(SETQ lin (SUBST "pieza" "0" lin))
El nuevo par punteado ser (8 . "PIEZA").
NOTA: 'in $uerer acabamos de ver un ejemplo en el $ue cambiamos a una lnea de
capa, ya $ue 8 es el cdigo de la "ase de #atos de AutoCAD 14 para el nombre de la
capa y se e%presa como una sublista de asociaciones *por$ue asocia un valor a un
cdigo,, $ue es un par punteado. La mecnica bsica es )sta, entre otras operaciones,
pero ya lo veremos ampliamente ms adelante. 'irva de introduccin.
La funcin siguiente APPEND rene todos los elementos de las listas especificadas en
una sola lista $ue los engloba. 'u sinta%is es la siguiente<
(APPEND lista1 lista2... )
.eamos un ejemplos<
(APPEND '(e1 e2) '(e3 e4)) devuelve (E1 E2 E3 E4)
135
NOTA: 9bs)rvese $ue no se devuelve ((E1 E2)(E3 E4)). Es decir, lo $ue rene son
los elementos de las listas y no las listas mismas. As<
(APPEND '(e1 (e2 e3)) '(e4 (e5))) devuelve (E1 (E2 E3) E4 (E5))
ya $ue (e2 e3) y (e5) son sublistas $ue, en realidad, son elementos de las listas $ue
los contienen.
Los argumentos de APPEND han de ser siempre listas. Esto es lo $ue diferencia a esta
funcin de LIST -ya estudiada-, $ue rene elementos sueltos y forma una lista. Es
por ello $ue a APPEND no se le pueda indicar como lista elementos de una lista
e%trados con CAR o CDR por ejemplo. Kabramos de formar listas previas con ellos para
luego utilizarlas con esta funcin APPEND.
NOTA: APPEND no funciona con pares punteados directamente.
Estas cuatro funciones vistas hasta a$u *ASSOC, CONS, SUBST y APPEND, son las ms
habituales en la gestin de la "ase de #atos de AutoCAD. .eremos a continuacin
otras tambi)n muy interesantes.
(LENGTH lista )
Esta funcin devuelve la longitud de la lista indicada, es decir, su nmero de
elementos. La devolucin de LENGTH ser siempre un nmero entero, evidentemente.
.eamos uno ejemplos<
(LENGTH '(10 n es 14 5 o)) devuelve 6
(LENGTH '(10 20 (10 20 30))) devuelve 3
(LENGTH '()) devuelve 0
NOTA: LENGTH no funciona con pares punteados directamente.
(LAST lista )
Esta funcin devuelve el ltimo elemento de la lista especificada. .eamos unos
ejemplos<
(LAST '(10 n es 14 5 o)) devuelve O
(LAST '(10 20 (10 20 30))) devuelve (10 20 30)
(LAST '(nombre)) devuelve NOMBRE
(LAST '()) devuelve nil
Aun$ue parezca evidente, LAST no es nada aconsejable para devolver la coordenada S
de una lista $ue represente un punto. L es $ue si el punto slo tuviera las coordenadas
2 e L *punto B# sin SXJ,, LAST devolvera la L. En cambio, con CADDR -ya estudiado-
tenemos la seguridad de obtener siempre la coordenada S, pues devolvera nil en
caso de no e%istir.
NOTA: LAST no funciona con pares punteados directamente.
136
(MEMBER elemento lista )
MEMBER busca el elemento especificado en la lista indicada y devuelve el resto de la
lista a partir de ese elemento, incluido )l mismo. .eamos algunos ejemplos<
(MEMBER 'x '(n h x s u w)) devuelve (X S U W)
(MEMBER 'd1 '(n d1 x d1 u)) devuelve (D1 X D1 U)
(MEMBER '(3 4) '((1 2) (3 4) 5)) devuelve ((3 4) 5)
+omo vemos en el segundo ejemplo, si el elemento en cuestin se repite en la lista se
toma la primera aparicin.
'i el elemento buscado no e%iste, MEMBER devuelve nil.
NOTA: MEMBER no funciona con pares punteados directamente.
(NTH n*mero_orden lista )
NTH devuelve el elemento de la lista lista $ue se encuentre en la posicin
n*mero_orden.
Esta funcin puede resultar harto interesante a la hora de acceder a elementos
FlejanosF en una lista, ya $ue evitaremos el uso de las combinaciones de CAR y CDR $ue
pueden dar lugar a confusin.
#ebemos tener en cuenta $ue el primer elemento de la lista para NTH es el 0, luego el
1, el 2, etc)tera. 'i la posicin especificada es mayor $ue la posicin del ltimo
elemento de la lista, NTH devuelve nil. .amos a ver algn ejemplo<
(NTH 2 '(10 20 30)) devuelve 30
(NTH 0 '(10 20 30)) devuelve 10
(NTH 1 '(10 (10 20) 20)) devuelve (10 20)
(NHT 3 '(10 20 30)) devuelve nil
NOTA: NTH no funciona con pares punteados directamente.
(REVERSE lista )
REVERSE tiene como misin nica y e%clusiva devolver la lista indicada con todos sus
elementos invertidos en el orden. Ejemplos<
(REVERSE '(10 20 30 40)) devuelve (40 30 20 10)
(REVERSE '(x y (10 20) z)) devuelve (Z (10 20) Y X)
(REVERSE '(nombre)) devuelve (NOMBRE)
(REVERSE '()) devuelve nil
NOTA: REVERSE no funciona con pares punteados directamente.
137
(ACAD_STRLSORT lista )
6oma la lista especificada, ordena las cadenas de te%to contenidas alfab)ticamente y
devuelve la lista resultante. La lista slo puede contener cadenas entre comillas.
Ejemplos<
(ACAD_STRLSORT '("z" "s" "a" "g" "p")) devuelve ("a" "g" "p" "s" "z")
(ACAD_STRLSORT '("zar" "aire" "12" "4")) devuelve ("12" "4" "aire" "zar")
(ACAD_STRLSORT '("sol" "sal" "s" "s")) devuelve ("s" "s" "sal" "sol")
NOTA: +omo se puede observar, los nmeros se ordenan como las palabras, es decir,
comenzando por el primer dgito, siguiendo con el segundo y as sucesivamente *tipo
5indo4s,.
NOTA: ACAD_STRLSORT no funciona con pares punteados directamente.
(ara terminar vamos a ver un ejemplo de un programa $ue, aun$ue nicamente utiliza
una de las funciones vistas en esta seccin, puede resultar muy jugoso como ejemplo.
A la hora de estudiar el acceso a la "ase de #atos de AutoCAD, ser cuando
comencemos a sacar partido de estas funciones. (or ahora, slo $ueda $ue el lector
practi$ue particularmente con ellas; son muy sencillas de comprender.
El ejemplo $ue veremos se corresponde con un programa $ue permite dibujar tornillos
normalizados rpidamente. Este programa maneja un cuadro de dilogo, por lo tanto
se proporciona tambi)n el mismo, as como su cdigo #+L. El cuadro del programa es
el siguiente<
138

A continuacin se muestra el cdigo #+L de este cuadro de dilogo en el siguiente
archio.
+omo se puede apreciar, el cuadro posee varias reas para solicitar los datos
necesarios al usuario y as dibujar el tornillo. En el rea de la norma nicamente hay
una lista desplegable $ue slo posee una sola norma invariable *#&7 I3/,, no se ha
dise!ado para ms. Es por ello $ue el contenido de esa lista lo a!adimos en el cdigo
#+L; los componentes de las dems listas sern agregados en la rutina AutoL&'(.
.emosla pues en el archio siguiente.
+omo vemos, el programa carga el cuadro de dilogo *tras las tpicas operaciones,, as
como la foto *$ue evidentemente deberemos tener,. #espu)s inicializa las listas y las
rellena y rellena los dems elementos con valores por defecto.
Es interesante ver cmo maneja el cuadro las salidas con DONE_DIALOG y
START_DIALOG, sobre todo en el botn de designar un punto de insercin, $ue sale del
letrero y vuele a entrar *conservando valores,. El truco est en asignar a una variable
la devolucin de START_DIALOG *en este caso SD, y controlar la pulsacin de cada
botn mediante dicha variable *asignando un nmero de salida a cada DONE_DIALOG,.
Evidentemente, al volver a entrar en el cuadro tras designar un punto de insercin, la
variable ha de hacerse nil *v)ase,.
9tro tema interesante es el control de la carga o no del cuadro en memoria. Al volver a
entrar en el letrero despu)s de designar un punto de insercin, el cuadro no ha de
cargarse en memoria de nuevo -ya est cargado-, sino simplemente mostrarse. Esto
se controla averiguando si e%iste ya o no un punto de insercin.
#e la misma manera se controlan y se escriben las coordenadas de dicho punto de
insercin encima del botn para designar.
La manera de asignar valores de m)trica y longitud se realiza recurriendo a la funcin
NTH, vista en esta seccin. +on ella se e%trae cada valor de cada lista y, previa
conversin a valor num)rico entero, se asigna a la variable correspondiente. #e esta
forma tendremos la posibilidad de variar el mbito de valores de rango del programa
simplemente cambiando unas cuantas lneas.
Lo restante dice relacin al propio dibujo del tornillo, as como al control de errores
tpico, tanto de #+L como del programa AutoL&'( en s, y a funciones de
FembellecimientoF del programa. Entre esta ltimas e%iste una $ue an no hemos
estudiado, es GRAPHSCR. 'e ha incluido por$ue la veremos enseguida, en la siguiente
seccin, con otras anlogas.

1); 4a#e interme+ia +e e-ercicio#
&ndicar el resultado de AutoL&'( ante las siguientes proposiciones<
139
(ASSOC 'x '((t y u) (r s e) (x g f) (12 34)))
(CONS (CADR '(14 56 45)) (CDR '(34 56 78 65.6)))
(CONS (NTH 1 '(vivo resido)) '(aqu mismo))
(CONS 'tipo 32)
(SUBST '5 '78 '(45 32 78 2 4))
(APPEND '(12 er 45 fg) '(dr fr 54 3.45) '((12 34) (df fr)))
(LENGTH '(23 hg 78 (ty gh) 89 (ju hg gft 89) ed 34.56 t))
(LAST '(yh yh hy yh))
(LAST '(12.3 78.87 (23.45 54.43)))
(MEMBER 't1 '(n 1 (t1 t2) 1))
(NTH 4 '(c1 cd c4 cf c5 g6 hy7 (fr 45)))
(NTH 3 '(12 34.43 56))
(REVERSE '(mismo aqu resido))
(ACAD_STRLSORT '("as" "aw" "h" "perro" "perra" "12" "01" "02"))

1E. 6ISC&LDN&A D& =UNCION&S MTIL&S
'e ha $uerido incluir esta seccin a$u por a$uello de $ue vamos a estudiar una serie
de funciones $ue, sin bien no pueden englobarse en un grupo general, son muy tiles
a la hora desarrollar programas mnimamente presentables. Es tiempo ahora, una vez
aprendida la base -y algo ms- de la programacin en AutoL&'(, de $ue comencemos
a hurgar un poco ms profundo en el acceso a las caractersticas de AutoCAD.
+on estas nuevas funciones podremos forzar la aparicin de la ventana de te%to de
AutoCAD, visualizar la versin num)rica e idiomtica del programa y etc)tera.
+omenzamos.

1E.1. A#egur:n+ono# +e cierto# +ato#
(GRAPHSCR)
Esta funcin no tiene argumentos y su utilidad es conmutar a pantalla grfica. 6iene el
mismo efecto $ue pulsar F2 mientras se est en el modo de pantalla de te%to. 'i ya
estamos en pantalla grfica, simplemente se $ueda como est.
'e utiliza para asegurarnos de $ue AutoCAD se encuentra en pantalla grfica cuando
es preciso procesar objetos de dibujo. +omo hemos visto la hemos utilizado en el
ltimo ejemplo, aun$ue en ese caso no hara falta, pues al arrancar un cuadro de
dilogo siempre se conmuta a pantalla grfica automticamente.
En configuraciones con dos pantallas, una grfica y otra de te%to, esta funcin no tiene
efecto.
(TEXTSCR)
140
Esta funcin no tiene argumentos y su utilidad es conmutar a pantalla de te%to. 6iene
el mismo efecto $ue pulsar F2 mientras se est en el modo de pantalla grfica. 'i ya
estamos en pantalla de te%to, simplemente se $ueda como est.
'e utiliza para asegurarnos de $ue AutoCAD se encuentra en pantalla de te%to cuando
es preciso mostrar listados de capas, objetos, propiedades, etc. #e esta forma, por
ejemplo, para mostrar una lista de todos los objetos designados deberamos utilizarla,
ya $ue con una configuracin de dos o tres lneas en lnea de comandos *$ue viene a
ser lo tpico, no se vera nada. L as, adems, evitamos $ue el usuario tenga $ue
pulsar F2 al aparecer la lista. Algunos comandos de AutoCAD *LIST por ejemplo, as
lo hacen.
En configuraciones con dos pantallas, una grfica y otra de te%to, esta funcin no tiene
efecto.
(TEXTPAGE)
TEXTPAGE conmuta a pantalla de te%to, de manera similar a TEXTSCR. La diferencia
radica en $ue TEXTPAGE efecta adems un borrado o limpiado de pantalla, es decir, el
cursor se sita al principio de la pantalla de te%to.
Esta funcin resulta til cuando se escriben listados y no se desea el efecto de sroll o
persiana en la pantalla.
(VER)
VER es una funcin de AutoL&'( sin argumentos y meramente informativa. #evuelve
una cadena de te%to $ue contiene el nmero de versin actual y dos letras entre
par)ntesis $ue indican el idioma de la misma, adems de un te%to fijo.
(or ejemplo, en una versin en castellano de AutoCAD 14, VER devolvera<
"AutoLISP Versin 14.0 (es)"
y en una versin inglesa devolvera<
"AutoLISP Release 14.0 (en)"
VER se suele utilizar para comparar la compatibilidad entre programas. (or ejemplo,
imaginemos $ue hemos dise!ado un programa en AutoL&'( /0 $ue utiliza funciones
inherentes $ue no e%istan en la versin /3. Lo primero $ue podra hacer el programa
es comprobar el te%to $ue muestra la funcin VER para obtener el nmero de versin.
'i no es la /0 mostrara un mensaje de error y acabara.
9tra utilidad sera capturar el idioma y, dependiendo de $ue sea uno u otro, escribir
determinados te%tos en dicho idioma.

141
1E.'. Acce#o a %anta$$a gr:4ica

(GRCLEAR)
NOTA: Esta funcin se encuentra obsoleta en la versin /0 de AutoCAD, esto es, no
realiza su funcin. An as, se mantiene por compatibilidad con programas escritos
para versiones anteriores. En AutoCAD 14 simplemente devuelve nil, sin efecto
alguno aparente. En versiones anteriores realizaba la funcin $ue a$u se e%pone a
continuacin.
GRCLEAR despeja la pantalla grfica actual. El efecto es el mismo $ue utilizar, por
ejemplo, el comando MIRAFOTO de AutoCAD para mostrar una foto sin objeto alguno,
es decir, Fen blancoF. 'e puede volver luego a la situacin actual con un simple
redibujado.
Esta funcin slo afecta al rea grfica, no a la lnea de estado, lnea de comandos o
rea de men de pantalla.
(GRDRAW inicio fin color [resaltado] )
Esta funcin dibuja un vector virtual en el rea grfica de la pantalla, entre los dos
puntos indicados en inicio y fin. Los puntos, como siempre, son listas de dos o tres
nmeros reales; las coordenadas se refieren al '+( actual del dibujo.
El vector de visualiza con el color especificado -nmero entero- por el tercer
argumento *color,. 'i se indica -1 como nmero de color, el vector se visualiza como
tinta ?OR *FO e%clusivoF,, es decir, se complementa al dibujarse por encima de algo y
se suprime si se dibuja algo nuevo por encima de )l.
'i se especifica un argumento resaltado diferente a nil, el vector se visualiza
destacado como vdeo inverso, brillo, lnea de trazos u otro sistema.
Los vectores dibujados con esta funcin son virtuales -como ya se ha dicho- es decir,
no forman parte del dibujo y desaparecern con un redibujado o una regeneracin.
Ejemplo<
(GRDRAW '(50 50) '(200 200) 1 T)
(GRVECS lista_vectores [transformacin] )
(ermite dibujar en pantalla una serie de vectores virtuales. El primer argumento
lista_vectores es una lista con el color para los vectores y sus coordenadas inicial y
final. El ejemplo siguiente dibuja un cuadrado de /J /J con cada lnea de un color
diferente<
142

(GRVECS '( 2 (10 10) (20 20)
------------4 (20 10) (20 20)
------------1 (20 20) (10 20)
------------3 (10 20) (10 10)
---------)
)
El primer color especificado *2 en el ejemplo, se aplicar a los vectores siguientes
dentro de la lista hasta $ue se indi$ue otro color. 'i el valor del color es mayor de BHH,
se dibujarn en tinta ?OR; si es menor de J, el vector $uedar resaltado segn el
dispositivo de visualizacin, normalmente en lnea discontinua.
El segundo argumento, optativo, es una matriz de transformacin $ue aplicada a la
lista de vectores, permite cambiar el emplazamiento y la escala de los vectores $ue se
generarn. (or ejemplo<
'( (2.0 0.0 0.0 30.0)
---(0.0 2.0 0.0 45.0)
---(0.0 0.0 2.0 0.0)
---(0.0 0.0 0.0 1.0)
)
Esta matriz, aplicada al ejemplo anterior, dibujara un cuadrado al doble de su tama!o
y a 3J unidades de desplazamiento en 2 y 0H en L.
(GRTEXT [rectngulo texto [resaltado]] )
Esta funcin se utiliza para escribir te%tos virtuales en las reas de te%to de la pantalla
grfica de AutoCAD. 'egn en cul de las tres reas de te%to se $uiera escribir, se
utilizar la funcin de manera diferente.
Drea +e$ menI +e %anta$$a.
'e indica el nmero de casilla del rea de men. Este nmero debe ser un entero
positivo 0. Las casillas se numeran de arriba abajo empezando por el 0, hasta el
nmero m%imo de lneas permitidas por la interfaz grfica. (or ejemplo una tarjeta
grfica .TA permite hasta BC lneas en esta rea del men; por lo tanto las casillas se
numeran de 0 a 25.
:na vez indicado el nmero de casilla, se especifica el te%to *entre comillas, $ue se
desea visualizar en esa casilla. El te%to se truncar si no cabe entero en la casilla, o se
completar con blancos en el caso de $ue sobren caracteres.
'i se indica el argumento resaltado *debe ser un nmero entero, y su valor es
diferente de 0, el te%to se pondr de relieve en la casilla correspondiente. 'i su valor
es 0, el te%to vuelve a su visualizacin normal. Al indicar un argumento de resaltado,
no cambia el te%to de la casilla sino slo su visualizacin. (or ejemplo<
143
(GRTEXT 8 "HOLA")
(GRTEXT 8 "QU TAL" 1)
La primera utilizacin de GRTEXT escribe el te%to HOLA en la casilla 8. En la segunda
utilizacin se produce un resaltado en esa casilla, pero el te%to sigue siendo HOLA, no
ha cambiado. (or eso hay $ue escribir primero el te%to $ue se desee y despu)s
resaltarlo<
(GRTEXT 8 "HOLA")
(GRTEXT 8 "HOLA" 1)
En este caso, para poner de relieve el te%to de la casilla 8, se ha indicado el mismo
te%to $ue ya tiene escrito. 'i se suministra un valor de te%to diferente, se pueden
producir comportamientos anmalos del programa en AutoL&'(.
El te%to escrito en la casilla indicada es virtual, no modifica la opcin de men
contenida debajo. En cuanto se cambie de submen o se produzca un redibujado del
rea de men, desaparecern los te%tos virtuales escritos con GRTEXT. +omo el men
de pantalla suministrado por AutoCAD utiliza hasta BC lneas, todo lo $ue se escriba
ms abajo con GRTEXT si hay sitio, permanecer normalmente en pantalla. La variable
de AutoCAD SCREENBOXES almacena el nmero de casillas disponibles.
LHnea +e e#ta+o >:rea +e mo+o#?
(ara visualizar un te%to en la lnea de estado, en el rea donde se escriben los modos
activados, rejilla, forzado de cursor, etc., hay $ue especificar un nmero de casilla -1.
La longitud m%ima del te%to depende de la tarjeta grfica *generalmente se admiten
ms de 0J caracteres,. El argumento de resaltado no tiene efecto. 7ormalmente el
te%to se situar a la iz$uierda del rea de coordenadas. +ual$uier actuacin sobre los
modos eliminar el te%to.
(GRTEXT -1 "DISEO ASISTIDO POR ORDENADOR")
LHnea +e e#ta+o >:rea +e coor+ena+a#?
(ara escribir el te%to en la lnea de estado, en la zona de visualizacin de coordenadas,
hay $ue indicar un nmero de casilla -2. El argumento de resaltado no tiene efecto.
(ara $ue se vea el te%to, debe estar desactivado el seguimiento de coordenadas. En
cuanto se active o se acte sobre los modos, se eliminar el te%to.
(GRTEXT -2 "EJECUTANDO AutoLISP")
(or ltimo, si se llama a GRTEXT sin argumentos, se restablecern todas las reas a su
estado original, desapareciendo todos los te%tos virtuales $ue se hayan escrito.

1E.(. Lectura +e +i#%o#iti/o# +e entra+a
144
(GRREAD [seguimiento] [claves [tipo_cursor]] )
Esta funcin permite la lectura directa de dispositivos de entrada. 'i se suministra el
argumento seguimiento con un valor diferente de nil, se activa la lectura continua de
dispositivos se!aladores en movimiento. En este caso GRREAD acepta el primer valor
del dispositivo, sin esperar a $ue se pulsen botones selectores.
El segundo argumento claves deber ser un nmero entero con los siguientes valores
posibles<
C$a/e ...... Signi4ica+o
-------------------------------------------------------------------------
-----------
1 ...... #evuelve las coordenadas en modo arrastre, segn la posicin del cursor.
2 ...... #evuelve todos los valores de las teclas y no desplaza el cursor cuando se
pulse una tecla de cursor.
4 ...... :tiliza el valor del tercer argumento tipo_cursor.
8 ...... 9mite el mensaje de error6console brea, cuando se pulsa CTRL+C.
El tercer argumento tipo_cursor establece el tipo de cursor con tres valores posibles<
Ti%o ....... Signi4ica+o
------------------------------------------------------------------------
0 ....... =uestra el cursor en cruz habitual.
/ ....... 9mite el cursor.
2 ....... =uestra en el cursor la mira de designacin de objetos.
En todos los casos GRREAD devuelve una lista cuyo primer elemento es un cdigo $ue
indica el tipo de dato $ue viene a continuacin. El segundo elemento es el dato
concreto $ue se trate. Los cdigos son los de la ta!la de este archio<
NOTA: (ara poder utilizar convenientemente estas ltimas funciones es necesario
estudiar el acceso a la "ase de #atos de AutoCAD, cosa $ue se ver en su momento
oportuno. 'er entonces cuando se proponga un ejemplo e%plicativo.

1E.4. Atri,uir e2%re#in a #Hm,o$o $itera$
145
(SET s!mbolo_literal expresin )
La funcin SET no es muy utilizada, por lo $ue se propone a$u ya $ue es interesante
verla.
SET atribuye el valor de una e%presin especificada a un literal de un smbolo. Este
smbolo se considera sin evaluar. La diferencia de SET con SETQ es $ue a$u se atribuye
o asocia el valor de la e%presin al literal del smbolo, haciendo ambos e$uivalentes.
+on SETQ se almacena, como sabemos ya, valores en smbolos de variables no
literales. .eamos un ejemplo. 'i hacemos primero<
(SET 'x 'a)
y luego<
(SET x 25)
atribuimos al smbolo x el valor del smbolo a. 'i e%traemos el valor asociado a x<
!x
AutoL&'( devolver<
A
'i e%traemos ahora el valor de a<
!a
AutoL&'( devolver<
25

1@; 4a#e interme+ia +e e-ercicio#
1esponder a las siguientes preguntas<
P>u) funcin AutoL&'( nos permite cambiar a pantalla grficaQ
PL a pantalla de te%toQ
P(ara $u) se utilizan ambasQ
P>u) devolvera la funcin VER en AutoCAD 14 versin americanaQ
P>u) diferencia hay entre SET y SETQQ

1F. ACC&SO A OTRAS CARACT&R*STICAS
146
En su momento estudiamos el acceso a variables de AutoCAD, a comandos e%ternos,
a aplicaciones, etc)tera. As mismo, acabamos de ver el acceso a la pantalla grfica. Lo
$ue en esta seccin se tratar es el acceso a otras caractersticas del programa, como
pueden ser los mens desplegables, la tableta digitalizadora, los modos de referencia a
objetos o los archivos de ayuda *visto esto ltimo por encima en el MDULO SEIS,
sobre creacin de archivos de ayuda,.

1F.1. 6o+o# +e re4erencia
Empezaremos por los modos de referencia, aplicacin $ue nos permitir manejar esta
caracterstica de AutoCAD en determinados momentos.
(OSNAP punto modo )
Esta funcin aplica el modo o modos de referencia indicados al punto especificado.
OSNAP devuelve un punto como resultado. El modo ser una cadena de te%to, por lo
$ue habr de ir entre comillas. 'i se indican varios modos, estos irn separados por
comas. :n ejemplo<
(SETQ PuntoMedio (OSNAP '(10 10 0) "med")
Esto e$uivaldra a haber seleccionado un modo de referencia "unto medio y haber
se!alado con el cursor en el punto indicado. +omo sabemos, dependiendo del valor del
punto de mira de los modos de referencia *variable APERTURE,, si se encuentra un
objeto dentro de dicha mirilla, su punto medio $uedara almacenado en la variable
PuntoMedio. En caso de no encontrar ningn objeto o no e%istir un punto medio.
devuelve nil.
NOTA: 7o confundir el valor APERTURE de la mirilla *cruceta, de modos de referencia a
objetos, con el valor PICKBOX de la mira *cuadrado, de designacin de objetos. La mira
de referencia acta de la siguiente forma< cuando tenemos un modo de referencia a
objetos activado, por ejemplo el "unto medio, al pasar cerca de objetos, la mira
captura o se FenganchaF a sus puntos medios *aparece el marcador triangular si la
caracterstica AutoSnap est activada,. Lo FcercaF $ue ha de pasar para $ue esto
ocurra es precisamente el tama!o de dicha mirilla.
'e observa entonces $ue el hecho de $ue se encuentre o no el punto buscado depende
en gran medida del valor actual de la variable APERTURE. :n valor demasiado pe$ue!o
dificulta la operacin; un valor demasiado grande puede atrapar otro punto pr%imo
$ue no interese.
La t)cnica mejor $ue impone la costumbre no consiste en ampliar o reducir el valor de
APERTURE en tiempo de ejecucin, sino el asegurar -siempre $ue se pueda- puntos
reales de los objetos. (or ejemplo, si dibujamos una lnea y $ueremos guardar en una
variable su punto medio, por$ue luego nos interesa, lo lgico es proporcionarle a OSNAP
un punto conocido de la lnea<
(COMMAND "_line" '(0 0) '(100 100) "")
147
As dibujamos la lnea. Ahora guardaremos su punto medio en la variable PtoMed<
(SETQ PtoMed (OSNAP '(100 100) "_mid"))
#e esta manera podremos dibujar ahora, por ejemplo, un crculo con centro en el
punto medio de la lnea<
(COMMAND "_circle" PtoMed 25)
Al indicar un punto de la lnea, APERTURE siempre lo va a englobar, por muy baja $ue
est) definida, ya $ue es un punto e%acto coincidente pues con el cruce de los ejes del
cursor.
NOTA: 'e observa $ue los modos de referencia son cadenas $ue llaman a los modos
incluidos en AutoCAD 14, por lo $ue dependiendo de la versin idiomtica del
programa habremos de introducirlos en un idioma o en otro. E%iste la posibilidad, como
vemos, de especificarlos con el guin bajo de subrayado para cual$uier versin en
cual$uier idioma.
+omo hemos dicho, si $ueremos aplicar ms de un modo de referencia a la funcin
OSNAP, hemos de especificarlos entre comas<
(SETP PIn (OSNAP Pto1 "med,int,fin"))
NOTA: Los modos pueden introducirse con su nombre completo o con su abreviatura
por convenio. As, valdra igual medio $ue med.
La variable $ue controla los modos de referencia actualmente activados en AutoCAD
es OSMODE. Esta variable ya la hemos utilizado en algn programa, accediendo a ella
para guardar su valor, estableciendo otro y recuperando el valor inicial al terminar el
programa.
OSMODE representa los modos almacenados como fijos con los comandos REFENT
*OSNAP en ingl)s, o DDOSNAP. Estos modos se pueden cambiar con REFENT *OSNAP,, $ue
abre el mismo cuadro de dilogo $ue DDOSNAP o, desde la lnea de comandos, con -
REFENT *-OSNAP en versiones inglesas,, introduciendo el guin *-, para ello. #esde
lnea de comandos se introducen como con la funcin OSNAP de AutoL&'(, con t)rminos
literales *a$u sin comillas, y separados por comas si hay ms de uno.
(ero lo ms lgico de un programa en AutoL&'( es acceder a la variable OSMODE y
cambiar su valor, para as variar los modos establecidos como fijos. Los valores
posibles para OSMODE son los de esta ta!la<
Kay $ue tener en cuenta $ue el modo RJpido no puede establecerse aisladamente sino
en combinacin con algn otro modo de referencia, evidentemente.
Los modos con OSMODE se establecen sumando valores; as "unto medio, Inseri*n,
Tan#ente y Cuadrante activados, daran un valor para la variable de 338 *2 @ 64 @ 256
@ 16,.
148
6engamos tambi)n en cuenta $ue en sucesivas llamadas a OSMODE *$ue haremos con
GETVAR y SETVAR evidentemente, los modos no se acumulan. As si una vez le hemos
dado un valor de 12 para activar "unto y Centro, si posteriormente le damos 1 para
activar "unto final, los dos anteriores se eliminarn y slo $uedar activado el ltimo.
(ara anular todos ellos, utilizaremos el modo Nin#uno *valor 0 para OSMODE,.
Las siguientes lneas suelen ser tpicas en muchos programas. Al iniciar<
...
(SETQ Modos (GETVAR "osmode"))
(SETVAR "osmode" 1)
...
'e guarda en una variable la actual configuracin de modos de referencia y se
especifica la $ue nos interesa. L al acabar el programa *sea naturalmente o en rutina
de control de errores,<
...
(SETVAR "osmode" Modos)
...
(ara restituir la configuracin primitiva del usuario y )ste no aprecie nada.
.eamos ahora un m)todo $ue tenemos -bastante completo- de redibujado de
objetos.

1F.'. &$ re+i,u-a+o
(REDRAW [nombre_entidad [modo]] )
La funcin REDRAW efecta un redibujado total -al igual $ue el comando de AutoCAD
- de toda de ventana grfica actual si se suministra sin argumento alguno<
(REDRAW)
'i se indica un nombre de entidad solamente se redibujar esa entidad. (ara
especificar dicho nombre habremos de e%traerlo de la lista de definicin de la entidad
en "ase de #atos, cosa $ue se ver ms adelante.
'i se ha despejado la ventana grfica con la funcin GRCLEAR *ya estudiada en la
seccin 18.2.,, con REDRAW se pueden redibujar las entidades $ue se deseen y slo
ellas se harn visibles en pantalla. (or ejemplo, si en un dibujo de circuitera
electrnica se desea averiguar cuntos blo$ues de un componente determinado se
149
encuentran insertados, se e%trae de la "ase de #atos del dibujo todas las inserciones
de blo$ue *se ver,, se despeja la pantalla de GRCLEAR y se redibujan con REDRAW slo
las entidades capturadas.
'i adems de un nombre se suministra el argumento modo, se puede controlar la
manera en $ue se hace el redibujado, de acuerdo a la tabla siguiente<
6o+o ....... &4ecto
------------------------------------------------------------------------
1 AAAAAAAAAAA 1edibuja la entidad en pantalla.
2 AAAAAAAAAAA Elimina la entidad de la pantalla, es decir, la oculta. 1eaparece con 1.
3 AAAAAAAAAAA .isualiza la entidad en relieve *vdeo inverso o doble intensidad,.
4 AAAAAAAAAAA 'uprime la visualizacin en relieve.
'i el nombre de la entidad indicado se corresponde con un objeto compuesto *blo$ue
con atributo, polilnea no optimizada...,, el efecto de REDRAW se e%tiende a sus
componentes simples. 'in embargo, si el cdigo de modo se indica con signo negativo
*-1, -2, -3 -4,, el efecto de REDRAW slo afectar a la entidad principal.
Esta funcin es muy utilizada en el manejo de la "ase de #atos del programa. .eremos
ahora TRANS, $ue tambi)n se usa mucho en dicho menester.

1F.(. Tran#4ormacin entre Si#tema# +e Coor
+ena+a#
(TRANS punto sistema_origen sistema_destino [desplazamiento] )
Esta funcin convierte un punto o un vector de desplazamiento desde un 'istema de
+oordenadas a otro. El valor del punto o del desplazamiento se indica como una lista
de tres nmero reales. 'i se indica el argumento desplazamiento y su valor es
diferente de nil, entonces la lista de tres nmeros reales se considera un vector de
desplazamiento.
Los argumentos para los 'istemas de +oordenadas se pueden especificar de tres
maneras diferentes. La primera es mediante un cdigo especificativo; los cdigos son<
C+igo ..... Si#tema +e Coor+ena+a#
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
A
0 AAAAAAAAAAA 'istema de +oordenadas :niversal *'+:,
150
1 AAAAAAAAAAA Actual 'istema de +oordenadas (ersonal *'+(,
2 AAAAAAAAAAA Actual 'istema de +oordenadas de la .ista *'+.,
3 AAAAAAAAAAA 'istema de +oordenadas del Espacio (apel *slo en combinacin con 2,

La segunda forma es mediante un nombre de entidad $ue indica el 'istema de
+oordenadas de la Entidad *'+E, relativo -o 'istema de +oordenadas del 9bjeto
*'+9,, segn convencin-. Esto es e$uivalente a la opcin O%(eto del comando '+(
de AutoCAD.
La tercera y ltima manera es con un vector de altura de objeto 3#, indicado como
lista de tres nmeros reales. Este vector e%presa la orientacin de la altura de objeto
en el nuevo '+( con respecto al '+:. Este procedimiento no sirve cuando la entidad ha
sido dibujada en el '+: *su '+E coincide con el '+:,.
La funcin TRANS devuelve el punto o vector de desplazamiento como una lista de tres
elementos e%presada en el nuevo 'istema de +oordenadas indicado en
sistema_destino. (or ejemplo, si el '+( actual se ha obtenido girando desde el '+:
IJ grados sobre el eje L<
(TRANS '(1 2 3) 0 1) devuelve (-3.0 2.0 1.0)
(TRANS '(-3 2 1) 1 0) devuelve (1.0 2.0 3.0)
En el primer caso, el punto (1 2 3) en el '+: *cdigo 0, se e%presa en el '+( actual
*cdigo 1, como (-3 2 1). En el segundo caso se hace la operacin inversa.
A la hora de introducir coordenadas o desplazamientos para utilizar comandos de
AutoCAD, hay $ue tener muy presente $ue siempre se consideran respecto al '+(
actual *salvo $ue vayan precedidas de asterisco,. (or eso si se dispone de unas
coordenadas calculadas en otro sistema, hay $ue pasarlas siempre al '+( actual
mediante TRANS.
En la "ase de #atos de AutoCAD los puntos caractersticos de cada entidad se
encuentran e%presados en el 'istema de coordenadas del 9bjeto *'+9,. Es necesario
siempre tener en cuenta cul es el '+( actual y utilizar el comando TRANS para
convertir esos puntos. (ara ello, como ya se ha dicho, se indica el nombre de la
entidad en vez de un cdigo. 'e ver.
El 'istema de +oordenadas de la .ista *'+., es el sistema hacia el cual se convierten
las imgenes antes de ser visualizadas en pantalla. 'u origen es el centro de la
pantalla y el eje S la lnea de visin *perpendicular hacia la pantalla,. Es importante
cuando se pretende controlar cmo van a visualizarse las entidades. (or ejemplo, si el
usuario se!ala un punto y se desea averiguar a $u) e%tremo de una lnea e%istente se
encuentra ms pr%imo, se convierte el punto se!alado desde el '+( actual al '+. de
la forma<
151
(TRANS punto 1 2)
#espu)s, para efectuar la comparacin, hay $ue convertir cada uno de los puntos
finales de la lnea *e%trados de la "ase de #atos tal como se e%plicar ms adelante,
al '+. tambi)n.
(TRANS punto_final1 nombre_de_l!nea 2)
(TRANS punto_final2 nombre_de_l!nea 2)
:na vez hecho esto, ya se pueden calcular las distancias entre el punto del usuario y
los dos puntos finales, medida en el '+., para determinar cul es la menor.
'i el punto o vector de desplazamiento indicado en TRANS es en B#, la propia funcin lo
convierte en 3# suministrando la coordenada S $ue falta. Esta coordenada S
depender de cul es el 'istema de +oordenadas desde el cual se considera el punto<
- 'i es el :niversal *'+:,, la coordenada S es 0.0.
- 'i es el (ersonal actual *'+(,, la coordenada S es el valor de la elevacin actual.
- 'i es el 'istema de +oordenadas de 9bjeto *'+9,, S es 0.0.
- 'i es el 'istema +oordenadas de la .ista *'+., en Espacio =odelo o (apel, el valor
de S es la proyeccin del punto en el plano 2L actual de acuerdo con la elevacin
actual.

1F.4. entana# " /i#ta#
(VPORTS)
#evuelve una lista con la configuracin de ventanas actual. La lista contiene en forma
de sublistas los descriptores de todas las ventanas de la configuracin actual. +ada
descriptor es a su vez una lista con tres elementos< nmero de identificacin de
ventana *correspondiente a la variable de sistema de AutoCAD CVPORT,, es$uina
inferior iz$uierda y es$uina superior derecha de cada ventana.
Las dos es$uinas aparecen en fracciones de anchura y altura de pantalla, igual $ue en
el listado del comando VENTANAS opcin K. As, (0 0) corresponde al v)rtice inferior
iz$uierdo de la pantalla, (1 1) al superior derecho y (0.5 0.5) al centro de la
pantalla.
(or ejemplo si la configuracin actual en pantalla es de cuatro ventanas iguales de
tama!o, VPORTS podra devolver<
((3 (0.5 0.5) (1.0 1.0))
(2 (0.5 0.0) (1.0 0.5))
(6 (0.0 0.5) (0.5 1.0))
(9 (0.0 0.0) (0.5 0.5))
)
152
El primer nmero de identificacin $ue aparece *en el ejemplo el 3, es el de la ventana
activa actual.
'i TILEMODE tiene valor 0, la lista devuelta describir las entidades de ventanas
grficas creadas con VMULT en el Espacio (apel. La ventana del Espacio (apel siempre
tiene el nmero 1 y su tama!o se e%presa en unidades del dibujo. (or ejemplo, podra
devolver la lista<
(1 (0.0 0.0) (483.717 297.0))
(SETVIEW descriptor_vista [identificador_ventana] )
'i e%iste una vista en el dibujo previamente almacenada, esta funcin restablece dicha
vista en una ventana grfica. 'i se omite el segundo argumento, la vista se restablece
en la ventana grfica actual. 'i se indica el identificador de la ventana, $ue es el valor
almacenado en la variable de AutoCAD CVPORT, la vista se restablece en esa ventana.
El descriptor de la vista almacenada debe ser del tipo de la lista devuelta por
TBLSEARCH, funcin $ue se estudiar al hablar del acceso a la "ase de #atos de
AutoCAD.
1F.). Ca$i,racin +e$ ta,$ero +igita$i<a+or
(TABLET modo [fila1 fila2 fila3 direccin] )
'e utiliza para almacenar, recuperar y crear calibraciones de tablero. 'i el argumento
modo es 0, se devuelve una lista con la calibracin actual. 'i es 1, se define la nueva
calibracin aportndola mediante tres puntos 3# $ue forman las tres filas de la matriz
de transformacin del tablero, y un vector 3# $ue define la direccin normal al plano
formado por los tres puntos anteriores. La variable de AutoCAD TABMODE permite
activar o desactivar el modo 6ablero.

1F.@. Contro$ +e e$emento# +e menI
(MENUCMD cadena )
Esta funcin controla la visualizacin de submens del men actual cargado por
AutoCAD. =uestra, modifica o solicita un submen, permitiendo desarrollar alguna
accin en el mismo. #e este modo se puede ejecutar un programa en AutoL&'(
asocindole un men *ya sea de pantalla, tableta, desplegable, etc., $ue podra
contener por ejemplo opciones para seleccionar por el usuario desde el propio
programa en AutoL&'(.
MENUCMD devuelve siempre nil. La cadena de te%to indicada *entre comillas, es de la
forma<
153
identificador de men* 7 nombre de submen*
rea de men* 7 accin
En el primer caso, se especifica la inicial del identificador de seccin de men. Estas
iniciales son las siguientes<
Inicia$e# .......... 6enI#
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
B1-B4 AAAAAAAAAAAAA =ens de pulsadores / a 0
A1-A4 AAAAAAAAAAAAA =ens au%iliares / a 0
P0 AAAAAAAAAAAAAAAA =en de cursor
P1-P16 AAAAAAAAAAA =ens desplegables / a /C
I AAAAAAAAAAAAAAAAA =en de imgenes
S AAAAAAAAAAAAAAAAA =en de pantalla
T1-T4 AAAAAAAAAAAAA =ens de tablero / a 0
M AAAAAAAAAAAAAAAAA E%presiones #&E'EL
"menugroup.id AA Trupo de men e identificador de men
El nombre de submen al $ue se llama tiene $ue e%istir en la seccin de men
correspondiente *tiene $ue haber un identificador de submen con el nombre en
cuestin precedido por dos asteriscos,. (or ejemplo<
(MENUCMD "S=REFENT")
hara aparecer en el rea de men de pantalla el submen REFENT.
(MENUCMD "P2=MALLAS")
En este caso se llama a un submen MALLAS en la seccin de men desplegable 2
*POP2,. Este submen debe e%istir en esa seccin con su correspondiente identificador
**MALLAS.
E%iste una segunda forma de cadena de te%to para MENUCMD. +onsiste en especificar un
rea de men, indicando el identificador de men y el nmero de elemento $ue se ha
de e%aminar o modificar, separados por un punto. (or ejemplo<
(SETQ Act (MENUCMD "P12.5=?"))
(IF (= Act "")
(MENUCMD "P12.5=~")
)
154
La primera e%presin e%amina el estado actual de la opcin nmero 5 del desplegable
P12. 'i la opcin contiene una se!al de activacin, se devolvera la misma. En caso de
no contener dicha se!al, devuelve cadena vaca. 'i esto ocurre se utiliza de nuevo
MENUCMD para asignar a la opcin el valor ~ $ue hace el efecto de poner una se!al de
activacin en el men. Kay $ue tener en cuenta $ue esta se!al de activacin podra
cambiar en diferentes plataformas *podra ser por ejemplo !,, como ya debemos saber.
.eremos un par de ejemplos de esta funcin en la seccin 1...
(MENUGROUP nombre_grupo )
'e especifica el nombre de un grupo de mens. 'i el grupo est cargado, la funcin
devuelve su nombre. 'i no e%iste, devuelve nil.

1F.B. Letrero +e #e$eccin +e co$or
(ACAD_COLORDLG n*mero_color [indicador] )
=uestra en pantalla el cuadro de dilogo estndar para la seleccin de color. El primer
argumento especifica el nmero de color $ue se ofrece por defecto. Kay $ue tener en
cuenta $ue un valor 0 significa PorBloque y un valor 256 PorCapa. 'i el segundo
argumento indicador es nil, entonces se desactivan en el cuadro los botones
"ORCA"A y "ORB!OL+E. 'i no se especifica o es diferente de nil ambas casillas se
encuentran disponibles. La funcin devuelve el nmero de color seleccionado mediante
el cuadro.

1F.E. =uncione# +e mane-o +e a"u+a
(ACAD_HELPDLG arc+ivo_ayuda tema )

Esta es la funcin de ayuda en todas las plataformas. 'e conserva nicamente por
compatibilidad, pero ha sido sustituida totalmente por la siguiente.
(HELP [arc+ivo_ayuda [tema [comando]]] )
Esta funcin la vimos someramente al e%plicar la creacin de archivos de ayuda en el
MDULO SEIS. Ahora e%plicaremos todas sus caractersticas.
HELP llama a la utilidad de ayuda en todas las plataformas. El primer argumento es el
nombre del archivo de ayuda con el $ue se va a trabajar. 'i se indica uno de AutoCAD
*e%tensin .AHP, se utiliza el lector de ayuda de AutoCAD para e%aminarlo. 'i se
indica un archivo de ayuda de 5indo4s tipo Ein@elp *e%tensin .HLP, se utiliza el
programa Ayuda de 5indo4s *WINHLP32.EXE, para mostrarlo, funcionando como la
155
ayuda en entornos 5indo4s. 'i se indica una cadena vaca o se omite, se abre el
archivo de ayuda por defecto de AutoCAD 14.
El segundo argumento tema especifica el tema cuya ayuda se muestra en primer lugar
en la ventana del te%to de ayuda. 'i es una cadena vaca se mostrar la ventana inicial
de la ayuda. El tercer argumento comando es una cadena de te%to $ue especifica el
estado inicial de la ventana de ayuda. 'us valores posibles son<
HELP_CONTENTS< =uestra el primer tema del archivo de ayuda.
HELP_HELPONHELP< =uestra la ayuda sobre la utilizacin de ayuda.
HELP_PARTIALKEY< =uestra el dilogo de bs$ueda utilizando tema como bs$ueda
inicial
'i no se producen errores, la funcin devuelve el nombre del archivo de ayuda. 'i hay
errores, devuelve nil.
(SETFUNHELP C: nombre_comando [arc+ivo_ayuda [tema [comando]]] )
1egistra una comando para $ue se pueda utilizar con )l la ayuda sensible al conte%to.
7ormalmente el comando ser nuevo, definido desde un programa en AutoL&'(, por lo
$ue hay $ue indicar los caracteres C:.
+uando se crea un nuevo comando mediante DEFUN, si e%iste ya como comando
registrado mediante SETFUNHELP se suprime del registro. (or eso SETFUNHELP slo
debe ser utilizada en el programa despu)s de crear el comando nuevo con DEFUN.
:na vez registrado el nuevo comando, durante su utilizacin se podr llamar a la ayuda
transparente mediante '? o 'AYUDA *'HELP en ingl)s, y mediante la tecla de funcin
F1. Automticamente se muestra el te%to de ayuda disponible para el nuevo comando.
Los argumentos arc+ivo_ayuda, tema y comando tienen el mismo significado $ue para
HELP.
(or ejemplo, se ha creado un nuevo comando llamado MUESTRA y se dispone de un
archivo de ayuda LISP.AHP con te%to de ayuda especfica dentro del tema >+ESTRA<
(DEFUN c:muestra ()
...
)
(SETFUNHELP "c:muestra" "lisp.ahp" "MUESTRA")

1F.F. &2%re#ione# DI&S&L en %rograma# +e AutoLISP
156
+omo vimos en su momento, las e%presiones en #&E'EL $ue se referan a la
personalizacin de la lnea de estado se guardaban en una variable de sistema llamada
MODEMACRO. 7ada nos impide rellenar esta variable desde AutoL&'( con la funcin
SETVAR, o recoger su contenido con GETVAR.
#esde AutoL&'( incluso lo tenemos ms fcil y menos engorroso, por$ue no
necesitamos escribir toda la e%presin en una sola lnea, ya $ue podemos dividirla en
varias $ue $ueden concatenadas finalmente con la funcin STRCAT. .eamos un
ejemplo<
(SETVAR "modemacro"
--(STRCAT
----"MI SISTEMA Capa: $(SUBSTR,$(GETVAR,clayer),1,8)"
----"$(IF,$(GETVAR,snapmode),"
----"ForzC X: $(RTOS,$(INDEX,0,$(GETVAR,snapunit)),2,0)"
----"Y: $(RTOS,$(INDEX,1,$(GETVAR,snapunit)),2,0))"
----"$(IF,$(GETVAR,osmode), REFENT)"
--)
)
NOTA: +omo se e%plic en su momento, el tama!o m%imo de una cadena para
MODEMACRO es de BHH caracteres, sin embargo desde AutoL&'( se pueden incluir
tama!os mayores, concatenando cadenas mediante STRCAT *$ue por cierto,
nicamente admite /3B caracteres por cadena, segn ya se dijo,.
NOTA: (ara $ue una lnea de estado se muestre modificada permanentemente,
podemos recurrir a archivos del tipo ACAD.LSP *seccin 15.1., donde incluir la rutina
AutoL&'( $ue acceda a MODEMACRO.
Las e%presiones #&E'EL en mens, por ejemplo, pueden ser combinadas con acciones
desde programas AutoL&'(, utilizando la funcin estudiada MENUCMD<
DEFUN c:ventanam ()
--(SETVAR "tilemode" 0)
--(COMMAND "espaciop")
--(SETQ ptb (GETPOINT "Vrtice inferior izquierdo de ventana: "))
--(MENUCMD "p12=ventanam")
--(PROMPT "\nSeleccione tamao desde el men de pantalla.")
--(SETQ alto (GETREAL "Altura de ventana en fraccin de
-----pantalla:"))(SETQ propor (/ (CAR (GETVAR "screensize")) (CADR
(GETVAR "screensize")))
--)(SETQ ancho (* alto propor))(SETQ pt1 (POLAR ptb 0 ancho))
--(SETQ pt2 (POLAR pt1 (/ PI 2) alto))
--(COMMAND "vmult" ptb pt2)(PRIN1)
)
La funcin define un nuevo comando, desactiva TILEMODE y llama a la orden ESPACIOP.
'olicita se!alar en pantalla un punto de base ptb. A continuacin llama a un men
desplegable POP12 con las opciones de tama!o, mediante la funcin MENUCMD. 'e
visualiza un mensaje y a continuacin se solicita la altura de la ventana en fracciones
de pantalla, esperando a $ue el usuario se!ale una de las opciones. Este submen de
opciones de tama!o, dentro de la seccin de men ***POP12, podra ser<
157
**ventanam
[Tamaos]
[ 1]$M=$(getvar,viewsize)
[ 3/4]$M=$(*,$(getvar,viewsize),0.75)
[ 5/8]$M=$(*,$(getvar,viewsize),0.625)
[ 1/2]$M=$(*,$(getvar,viewsize),0.5)
[ 3/8]$M=$(*,$(getvar,viewsize),0.375)
[ 1/4]$M=$(*,$(getvar,viewsize),0.25)
Al seleccionar una opcin, la e%presin #&E'EL obtiene la altura actual de la ventana
del Espacio (apel de la variable VIEWSIZE. 'egn la fraccin seleccionada, multiplica
dicha altura por la fraccin. El valor resultante se admite como respuesta a GETREAL,
$ue lo almacena en la variable alto. A continuacin calcula la proporcin entre achura
y altura, dividiendo los dos valores almacenados en SCREENSIZE. La anchura de la
ventana $ue se desea abrir ser el producto de la altura seleccionada por el usuario y
el factor de proporcin. #e esta manera la ventana obtenida guardar la misma
relacin ancho8alto $ue la pantalla. (or ltimo, el programa calcula el segundo v)rtice
de la ventana pt2 y llama al comando VMULT para abrir la ventana. 1izar el rizo.
6ambi)n disponemos de la posibilidad de utilizar e%presiones #&E'EL como tales en el
propio programa de AutoL&'(. Esto lo haremos llamando a la funcin MENUCMD con la
inicial de identificador M para leguaje #&E'EL *parecido a lo $ue hacamos para los
mens con #&E'EL,.
(or ejemplo, un nuevo comando de AutoCAD llamado FECHA para obtener la fecha y
hora del sistema en un formato completo podra ser<
(DEFUN c:fecha ()
--(SETQ fecha
----(MENUCMD "M=$(edtime,$(getvar,date),DDDD D MON YY - H:MMam/pm)")
--)
)
La e%presin #&E'EL lee la variable DATE y le aplica el formato de fecha especificado
mediante EDTIME, as al introducir el nuevo comando FECHA en AutoCAD se podra
devolver<
Sbado 1 Ago 98 - 4:02pm
'e puede utilizar este mecanismo para introducir e%presiones #&E'EL desde la lnea de
comando de AutoCAD y observar los resultados $ue devuelven. El programa en
AutoL&'( para conseguirlo sera<
(DEFUN C:Diesel ()
--(WHILE (/= Expr "M=")
----(SETQ Expr (STRCAT "M=" (GETSTRING T "\nExpresin DIESEL: ")))
----(PRINC (MENUCMD Expr))
--)(PRIN1)
)
158
Al llamar al nuevo comando DIESEL, se visualiza una solicitud de e%presin. +uando el
usuario la introduce, GETSTRING la acepta como una cadena de te%to, STRCAT le a!ade
por delante M= y la variable Expr almacena el resultado. A continuacin, MENUCMD llama
a esa cadena con la e%presin #&E'EL y devuelve su resultado. PRINC lo escribe en
pantalla.
NOTA: 1ecordemos la funcin de la variable MACROTRACE *v)ase MDULO NUEVE,.
NOTA: Las variables de AutoCAD USERS1, USERS2, USERS3, USERS4 y USERS5 pueden
ser utilizadas para traspasar informacin de una rutina AutoL&'( a una e%presin
#&E'EL. .)anse en el MDULO NUEVE y en el APNDICE B.

1F.1G. 6acro# AutoLISP en menI# " ,otone#
Es totalmente factible la inclusin de funciones AutoL&'( en las definiciones de
opciones en archivos de mens, del tipo<
[Dibujar &Lnea](command "_.line" "0,0" "10,10" "")
o ms complejas, y tambi)n en macros de botones de barras de herramientas. E
inclusive llamadas a programas AutoL&'(, escribiendo el nombre de la funcin definida
o del nuevo comando.
(i)nsese $ue, en ltima instancia, lo $ue se ejecuta al hacer clic en una opcin de
men o en un botn, es lo mismo $ue podramos escribir en la lnea de comandos de
AutoCAD.

1F.11. 6acro# AutoLISP en arc3i/o# +e guin
(or ltimo, decir $ue tambi)n es posible escribir instrucciones AutoL&'( *o llamadas a
programas, dentro de un archivo de guin o sript. Estos archivos como sabemos,
ejecutan por lotes las lneas incluidas en ellos como si de su escritura en la lnea de
comando se tratara.

1F.1'. aria,$e# +e entorno
(GETENV nombre_variable )
#evuelve una cadena de te%to *entre comillas, $ue es el valor atribuido a la variable de
entorno indicada. La variable en cuestin habremos de indicarla tambi)n como cadena,
por ejemplo<
(GETENV "acadcfg")
159
Este ejemplo podra devolver "C:\\misdoc~1\\autocad", $ue es el directorio donde se
guarda el fichero de configuracin ACAD14.CFG. Esto puede resultar til para saber
dnde se encuentra y acceder a )l para leer datos de la configuracin de AutoCAD en
el e$uipo donde se ejecuta la funcin y actuar en consecuencia. La manera de acceder
a archivos directamente desde AutoL&'( se estudia ms adelante en este mismo
MDULO, en la seccin 21. concretamente.

1B; 4a#e interme+ia +e e-ercicio#
1ealizar un programa $ue permita insertar un blo$ue en medio de una lnea ya
dibujada, partiendo )sta automticamente para permitir la insercin. La nica
condicin impuesta al usuario ser $ue el blo$ue sea unitario en la direccin de la
lnea, para no complicar mucho el clculo de los puntos entre los cuales se abrir
hueco.
'G. ACC&SO A LA !AS& D& DATOS D& AutoCAD
'i lo $ue hemos programado hasta ahora nos pareca importante, donde de verdad se
aprovecha al m%imo la potencial real de AutoL&'( es en el acceso directo a la "ase de
#atos de AutoCAD. Kasta ahora nicamente habamos producido objetos de dibujo -
adems del tratamiento de otros temas-; con los conocimientos $ue ad$uiriremos en
esta seccin 20 tendremos la posibilidad de acceder a lo $ue ya est dibujado para
editarlo, eliminarlo, copiarlo, moverlo, y un sinfn de acciones $ue slo tienen final en
nuestra capacidad para discurrir y en nuestra imaginacin y perspicacia como
programadores avanzados.

'G.1. Organi<acin +e $a !a#e +e Dato#
'G.1.1. Intro+uccin
NOTA: 'i con la integracin de AutoCAD en 5indo4s *desde la versin /B, lo $ue
siempre se haba denominado entidad pas a llamarse objeto, en relacin a la "ase de
#atos interna seguimos refiri)ndonos a entidades de dibujo. +uestin de convenciones.
6odas las entidades de dibujo de AutoCAD se encuentran definidas en su "ase de
#atos interna por medio de una serie de cdigos encerrados en listas. +omo ya hemos
comentado alguna vez, cuando AutoCAD guarda un dibujo, )ste no se guarda como
tal. (or ejemplo, un crculo no se guarda como el objeto de dibujo $ue es, sino como
una serie de cdigos $ue describen $ue es un crculo, las coordenadas de su centro y
su radio, adems de su capa, color, tipo de lnea, etc)tera. Al volver a abrir el dibujo,
AutoCAD interpreta dichos cdigos y representa en pantalla los objetos
correspondientes basndose en ellos -en los cdigos-.
160
Este tipo de almacenamiento, $ue podramos denominar vectorial, es mucho ms
eficaz para nosotros $ue, por ejemplo un mapa de bits, ya $ue podemos acceder a la
"ase de #atos y modificar los parmetros correspondientes para alterar la geometra;
y todo ello sin tocar el crculo en cuestin para nada, por ejemplo.
En el caso del almacenamiento como mapa de bits, adems, nos percatamos de $ue al
acercarnos cada vez ms al dibujo, )ste pierde su definicin. 'in embargo, en
AutoCAD no ocurre esto, ya $ue el programa tiene la posibilidad de recalcular la "ase
de #atos y volver a representar el crculo como tal. Es por ello, $ue si actuamos sobre
una geometra con el comando ZOOM *en cual$uiera de sus modalidades, )sta no pierde
definicin. A veces, es necesario provocarle a AutoCAD para $ue recalcule toda la
geometra; es lo $ue se consigue con el comando REGEN.
Esta posibilidad de la $ue disponemos, de acceder directamente a la "ase de #atos
interna, proporciona una potencia e%tra a AutoL&'(, ya $ue podremos dise!ar
programas $ue modifi$uen directamente los objetos de un dibujo en tiempo real y sin
la intervencin del usuario.

'G.1.'. &#tructura %ara enti+a+e# #im%$e#
+omo decamos, las entidades se representan en la "ase de #atos mediante un
conjunto de listas, una para cada entidad. Adems e%isten otras listas
correspondientes a tablas de smbolos y diccionarios, las cuales representan objetos no
grficos como capas, tipos de lnea y dems. (or ltimo, e%isten tambi)n definiciones
propias para los blo$ues. 7os centraremos por ahora en las entidades grficas simples.
La lista de cada entidad es una lista de pares punteados *ya estudiados, o sublistas
normales. Los pares punteados, como sabemos, contienes dos valores< el primero es el
cdigo $ue indica el tipo de dato contenido en el segundo, y )ste contiene el dato
concreto *coordenadas de un punto, nombre, etc.,. As por ejemplo, el siguiente par
punteado contiene la definicin para una entidad $ue dice $ue est en la capa 0<
(8 . "0")
8 es el cdigo $ue define la propiedad de capa y "0" el nombre de la capa en s.
'egn el tipo de dato almacenado, la sublista puede no ser un par punteado y
contener dos o ms elementos. (or ejemplo, cuando se trata de un punto, contiene
cuatro elementos< el cdigo $ue indica $ue es un punto y las coordenadas 2, L y S de
dicho punto. En el siguiente ejemplo se muestra la lista $ue contiene las coordenadas
del punto inicial de una lnea<
(10 0.0 10.0 25.0)
10 es el cdigo para el punto inicial en el caso de las lneas, 0.0 es la coordenada 2 del
punto en cuestin, 10.0 es la coordenada L y 25.0 la coordenada S.
161
As pues, y visto hasta a$u, podemos e%plicar un ejemplo mayor $ue se corresponde
con la lista *casi, completa de una lnea ms o menos ordenada. La lista podra ser la
siguiente<
((-1 . <Nombre de objeto: bd75a0>)
(0 . "LINE")
(8 . "PIEZA")
(62 . 1)
(6 . "TRAZOS")
(10 0.0 10.0 25.0)
(11 10.0 100.0 25.0)
)
'e trata pues de una lista con siete sublistas incluidas. La e%plicacin de cada una de
ellas es la $ue sigue.
(-1 . <Nombre de objeto: bd75a0>) es la lista $ue define el nombre de la entidad;
-1 es el cdigo especfico para este nombre. Esta lista siempre se representa de la
misma forma< es un par punteado $ue como primer elemento tiene el cdigo de
nombre de entidad *-1, y, como segundo elemento, el te%to fijo Nombre de objeto:,
ms un nombre en he%adecimal para la entidad, encerrado todo este ltimo elemento
entre corchetes angulares.
NOTA: En versiones inglesas de AutoCAD, Nombre de objeto: cambia por Entity
name:.
Los nombres $ue se asignan a cada entidad de dibujo son, en realidad, posiciones de
memoria -por eso estn en he%adecimal-. Es por ello $ue un mismo objeto de dibujo
siempre va a tener un nombre identificativo y nico, en una misma sesin de dibujo,
$ue lo diferencie de todos los dems. En el momento en $ue cerremos el dibujo y lo
volvamos a abrir, es posible *y casi seguro, $ue el objeto ad$uiera otro nombre, pero
ser tambi)n nico para )l en esa sesin de dibujo. #ebido a esto, esta propiedad de
los objetos no puede ser modificada.
(0 . "LINE") es la lista para el tipo de entidad; 0 es el cdigo $ue define este tipo. El
segundo elemento de la lista, $ue es par punteado, indica el tipo de entidad. Kay $ue
tener en cuenta $ue este tipo siempre se representa en la "ase de #atos en ingl)s, por
lo $ue cuando se haga referencia a )l desde los programas en AutoL&'( habr $ue
hacerlo en este idioma. Adems, se trata de una cadena de te%to, y por eso va entre
comillas *y en maysculas,.
(8 . "PIEZA") indica la capa en la cual se encuentra actualmente la lnea; 8 es el
cdigo para la capa. El segundo elemento de la lista, $ue es par punteado, describe,
como cadena de te%to y en maysculas, el nombre de la capa en cuestin.
(62 . 1) especifica el color de la lnea; 62 es el cdigo para el color. El segundo
elemento del par punteado es el cdigo de color de AutoCAD 14, en este caso / $ue
se corresponde con el rojo.
(6 . "TRAZOS") es el tipo de lnea de la entidad, lnea en este caso; 6 es el cdigo
correspondiente al tipo de lnea. El segundo elemento del par punteado es el nombre
del tipo de lnea, $ue aparecer en maysculas y entre comillas por ser cadena.
162
(10 0.0 10.0 25.0) indica el punto inicial de la lnea; en este caso 10 es el cdigo
del punto inicial, en otros casos *con otras entidades, significar otra cosa. Esta lista
no es un par punteado, sino $ue contiene varios elementos. #ichos elementos son las
coordenadas 2 *0.0,, L *10.0, y S *25.0, del punto de inicio de la entidad de lnea.
Los puntos son separadores decimales.
(11 10.0 100.0 25.0) es el punto final de la lnea; 11 es el cdigo de punto final
para las entidades $ue sean lneas; en otros casos ser otra cosa. #e la misma forma,
la lista contiene despu)s las coordenadas cartesianas del punto.
NOTA: En un caso real, la lista de una simple lnea ofrecera ms sublistas con otros
cdigos especficos $ue ya se estudiarn.
+omo vemos, la manera en $ue estn definidas las entidades en la "ase de #atos de
AutoCAD es bien sencilla. Al ser listas pueden ser fcilmente tratadas desde AutoL&'(.
(ara entidades complejas, tipo polilneas o blo$ues, el formato vara un poco, es por
ello $ue se estudiar bajo el siguiente epgrafe. Las entidades no grficas se vern
tambi)n ms adelante.
'e puede observar $ue para acceder a las propiedades y caractersticas de las
entidades es necesario conocer los cdigos normalizados. Estos cdigos pueden ser
comunes a todas las entidades o depender del tipo de entidad de $ue se trate. As por
ejemplo -como se ha indicado en su momento-, el cdigo 8 representa la capa en la
cual se encuentra la entidad actualmente; este cdigo es comn a todas las entidades
de dibujo. En cambio el cdigo 10, $ue en el ejemplo de la lnea representaba su punto
inicial, en un crculo indica su centro *al igual $ue en un arco,, en un te%to o en un
blo$ue indica su punto de insercin, etc)tera. La lista completa de todos los cdigos de
entidades para AutoCAD 14 se proporciona ms adelante * 20.1.5.,.
En algn caso especial pueden e%istir varias sublistas con el mismo cdigo como
primer elemento. Esto ocurre por ejemplo con las splines, $ue mediante el cdigo 10
representan todos sus puntos de control, mediante el cdigo 11 todos sus puntos de
ajuste, mediante el cdigo 40 todos los valores de nodos, y dems.
(or otro lado, decir $ue hay $ue tener muy en cuenta un aspecto importantsimo
cuando se trabaja con ciertas entidades, como polilneas, blo$ues u objetos en tres
dimensiones, entre otras. L es $ue las coordenadas de sus puntos caractersticos estn
referidas al llamado '+E *'istema de +oordenadas de la Entidad, -o '+9 *'istema de
+oordenadas del 9bjeto,-. (ara poder trabajar con ellas habr $ue convertir dichos
puntos previamente mediante la funcin TRANS *ya estudiada,. (or ejemplo, en una
polilnea trazada mediante varios puntos, el primero de ellos est referido al '+(
absoluto actual, sin embargo las dems coordenadas son relativas a dicho primer
punto, es decir, estn en el '+E. Esto hace $ue el proceso de regeneracin de un
dibujo en AutoCAD ahorre bastante tiempo, ya $ue slo ha de recalcular el primer
punto *los dems son relativos a )l,.

'G.1.(. &#tructura %ara enti+a+e# com%ue#ta#
163
7os dedicaremos ahora al estudio de la estructura $ue representa en la "ase de #atos
a las entidades complejas o compuestas.
Estas entidades compuestas no poseen una sola lista con sublistas, sino $ue se
estructuran en varias listas separadas *cada una con sus propias sublistas de
asociacin,< una lista de cabecera, varias listas de componentes y al final una lista de
fin de secuencia. Las entidades compuestas $ue presentan estas caractersticas son<
(olilneas no optimizadas *versiones anteriores a la /0,< tanto polilneas B#
adaptadas a curva como polilneas 3# y tambi)n mallas.
&nserciones de blo$ue con atributos.

'G.1.(.1. Po$i$Hnea# no o%timi<a+a#
En versiones anteriores a la /0 de AutoCAD, las polilneas tenan un tratamiento
diferente en la "ase de #atos interna de la aplicacin. En AutoCAD 14 aparece el
concepto de polilneas optimizadas, las cuales tienen una forma de guardarse junto al
resto del dibujo ms eficaz y controlada.
Estas nuevas polilneas optimizadas estn consideradas como entidades simples en la
"ase de #atos, y as se representan *su tipo de entidad, cdigo 0, es LWPOLYLINE,. 7o
obstante, las polilneas adaptadas a curva o curva " *spline, se convierten a polilneas
de versiones anteriores *tipo de entidad POLYLINE,. 6ambi)n las polilneas 3# y las
mallas de AutoCAD son tipos de polilneas no optimizadas. En este apartado pues, se
ver este tipo de polilneas, ya $ue son entidades compuestas.
NOTA: La variable de sistema de AutoCAD 14 PLINETYPE especifica si el programa
utiliza polilneas B# optimizadas. 'us valores se pueden observar en la lista de
variables proporcionada en el APNDICE B.
Las polilneas no optimizadas aparecen en la "ase de #atos de AutoCAD 14 de la
siguiente manera<
/Z La lista correspondiente a la entidad compuesta *tipo de entidad POLYLINE,,
conteniendo las caractersticas y propiedades globales de la polilnea. Es la denominada
a%eera de la entidad en la "ase de #atos. Esta lista contiene un cdigo especial 66
$ue especifica $ue las siguientes listas pertenecen a la polilnea.
BZ :n conjunto de listas de los v)rtices de la polilnea. A cada v)rtice le corresponde
una lista *tipo de entidad VERTEX, $ue contiene las propiedades y caractersticas
individuales de cada elemento *segmentos por ejemplo, de la polilnea.
3Z :na lista de Ffin de secuenciaF, $ue es un tipo de entidad especial llamado SEQEND
$ue especifica el final de las listas de v)rtices, y por lo tanto de la polilnea. Esta lista
contiene el cdigo especial -2 $ue indica el nombre de la entidad principal, es decir de
la cabecera.
164
(or ejemplo, una polilnea sencilla $ue contuviera nicamente dos segmentos, cada
uno de ellos con espesores diferentes, podra contener en la "ase de #atos las
siguientes listas y sublistas *entre otras,<
((-1 . <Nombre de objeto: 26a0a20>)
(0 . "POLYLINE")
(8 . "PIEZA")
(66 . 1)
(67 . 0)
(10 0.0 0.0 0.0)
(70 . 0)
(40 . 5.0)
(41 . 5.0)
(210 0.0 0.0 1.0)
)
Esta primera lista de cabecera contiene el tipo de entidad POLYLINE, $ue es la entidad
principal o compuesta. En este caso se encuentra en la capa PIEZA. 'u color es
PorCapa, pues no aparece ninguna lista con el cdigo 62. El grosor inicial y el grosor
final globales de la polilnea *cdigos 40 y 41, son ambos de 5.0. El resto de sublistas
-alguna de ellas no se muestra a$u- hacen referencia a aspectos tales como si la
polilnea es abierta o cerrada, si est adaptada curva, la orientacin de su altura de
objeto respecto al '+( actual, etc. El cdigo 66 con valor 1 es el $ue indica $ue siguen
otras listas de componentes de v)rtice.
NOTA: Apreciamos un aspecto an no comentado, $ue es el hecho de $ue si no e%iste
alguna de las listas significa $ue se toman unos valores por defecto, como por ejemplo
PorCapa para el color *veremos ms ejemplos,.
La segunda de las listas de la polilnea podra ser la siguiente<
((-1 . <Nombre de objeto: 26a0a28>)
(0 . "VERTEX")
(8 . "PIEZA")
(67 . 0)
(10 100.0 110.0 0.0)
(70 . 0)
(40 . 5.0)
(41 . 5.0)
(42 . 0.0)
(50 . 0.0)
)
Esta segunda lista, con el tipo de entidad VERTEX, contiene las sublistas para el primer
v)rtice de la polilnea. 'u capa es PIEZA, las coordenadas *cdigo 10, son en este caso
2 X /JJ, L X //J y S X J. El grosor inicial y final del segmento $ue empieza en ese
v)rtice *cdigos 40 y 41, son ambos 5.0. El resto de datos se refieren a si hay curva
adaptada, la direccin de la tangente, etc.
La tercera lista<
((-1 . <Nombre de objeto: 26a09e8>)
(0 . "VERTEX")
165
(8 . "PIEZA")
(67 . 0)
(10 120.0 130.0 0.0)
(70 . 0)
(40 . 5.0)
(41 . 0.0)
(42 . 0.0)
(50 . 0.0)
)
Esta tercera lista corresponde al segundo v)rtice. En este caso sus coordenadas son 2
X /BJ, L X /3J y S X J. El grosor inicial del segmento $ue empieza en ese v)rtice es
5.0, pero el grosor final a$u es 0.0.
Wltimo v)rtice de la polilnea<
((-1 . <Nombre de objeto: 26a12a5>)
(0 . "VERTEX")
(8 . "PIEZA")
(67 . 0)
(10 160.0 140.0 0.0)
(70 . 0)
(40 . 0.0)
(41 . 0.0)
(42 . 0.0)
(50 . 0.0)
)
Esta cuarta lista contiene los datos del tercer v)rtice. 'us coordenadas son 2 X /CJ, L
X /0J y S X J,. Al ser una polilnea abierta, el grosor inicial y final coinciden puesto
$ue no hay ningn segmento $ue parta de este v)rtice. El grosor en este caso es 0.
L la lista de fin de secuencia<
((-1 . <Nombre de objeto: 26a12e7>)
(0 . "SEQEND")
(8 . "PIEZA")
(67.0)
(-2 . <Nombre de objeto: 26a0a20>)
)
Esta ltima lista indica $ue la polilnea ya no contiene ms v)rtices. El tipo de entidad
es SEQEND. El cdigo -2 indica el nombre de entidad de cabecera $ue repite el ya
indicado en la primera lista.

'G.1.(.'. In#ercione# +e ,$oNue con atri,uto#
Las inserciones de un blo$ue son referencias a dicho blo$ue y estn consideradas como
entidades simples, con una nica lista en la "ase de #atos de AutoCAD. La definicin
de las entidades $ue forman dicho blo$ue se encuentran contenidas en las
denominadas ta%las de s$m%olos, $ue veremos en el apartado siguiente.
166
'in embargo, si el blo$ue en cuestin contiene atributos es considerado como una
entidad compuesta o compleja, de forma $ue la referencia del blo$ue es la entidad de
cabecera y cada uno de los atributos viene definido en otras tantas listas siguientes. Al
final, una lista de fin de secuencia cierra la entidad compuesta, como en el caso de las
polilneas no optimizadas.
Las referencias de blo$ues con atributos aparecen en la "ase de #atos de AutoCAD
14 de la siguiente manera<
/Z La lista correspondiente a la entidad compuesta, en este caso una referencia de
blo$ue *tipo de entidad INSERT,. Es la cabecera.
BZ :n conjunto de listas para cada atributo *tipo de entidad ATTRIB,.
3Z :na lista de Ffin de secuenciaF *tipo de entidad SEQEND).
As pues, un sencillo blo$ue $ue representara una resistencia el)ctrica, conteniendo un
atributo para el valor de la resistencia, tendra en la "ase de #atos una serie de listas
parecidas a las $ue siguen<
((-1 . <Nombre de objeto: 26a0af8>)
(0 . "INSERT")
(8 . "ELEMENTOS")
(67 . 0)
(66 . 1)
(2 . "RES")
(10 80.0 100.0 0.0)
(41 . 1.0)
(42 . 1.0)
(50 . 0.0)
(43 . 1.0)
(210 0.0 0.0 1.0)
)
El tipo de entidad INSERT indica $ue se trata de una insercin de blo$ue. El blo$ue se
llama RES *cdigo 2,. 'e encuentra insertado en la capa ELEMENTOS. El cdigo 66 con
un valor 1 indica $ue el blo$ue contiene atributos y $ue siguen listas para cada
atributo. El cdigo 10 indica las coordenadas del punto de insercin del blo$ue. Los
cdigos 41, 42 y 43 indican las escalas 2 , L y S de insercin del blo$ue. El cdigo 50
es el ngulo de rotacin de la insercin. El ltimo cdigo es para la orientacin de la
altura de objeto.
La siguiente lista $ue aparece en la "ase de #atos es la correspondiente al atributo
incluido en el blo$ue<
((-1 . <Nombre de objeto: 26a0b00>)
(0 . "ATTRIB")
(8 . "ELEMENTOS")
(10 120.0 80.0 0.0)
(40 . 16.0)
(1 . "250K")
(2 . "RESIS")
167
(67 . 0)
(70 . 4)
(73 . 0)
(50 . 0.0)
(41 . 1.0)
(51 . 0.0)
(7 . "TS1")
(71 . 0)
(72 . 4)
(11 150.0 100.0 0.0)
(210 0.0 0.0 1.0)
)
El tipo de entidad es ATTRIB y se encuentra en la misma capa $ue la insercin del
blo$ue. El punto de insercin del te%to del atributo tiene coordenadas 2 X /BJ, L X EJ
y S X J. La altura de este te%to *cdigo 40, es 16. Los cdigos 1 y 2 indican el valor del
atributo *a$u es 250K, y el identificador *a$u RESIS, respectivamente. El cdigo 70
con valor 4 indica $ue se trata de un atributo verifia%le. El cdigo 50 indica el ngulo
de rotacin del te%to. Los cdigos siguientes hacen referencia al estilo de te%to del
atributo; en este caso tiene factor de proporcin 1, ngulo de inclinacin 0, estilo TS1,
generacin normal, y es un te%to con opcin rodear *cdigo 72 con valor 4,. El punto
indicado para rodear est en el cdigo 11.
La ltima lista con el tipo de entidad SEQEND, puesto $ue ya no hay ms atributos sera
la siguiente<
((-1 . <Nombre de objeto: 26a0b08>)
(0 . "SEQEND")
(8 . "ELEMENTOS")
(67 . 0)
(-2 . <Nombre de objeto: 26a0af8>)
)
El ltimo cdigo -2 contiene el nombre de la entidad principal o de cabecera, $ue es la
referencia del blo$ue.

'G.1.4. &#tructura %ara o,-eto# no gr:4ico#
Los objetos no grficos de AutoCAD son datos $ue contiene el dibujo pero $ue no
pertenecen a objeto grficos como tal. 'e subdividen en diionarios, ta%las de
s$m%olos y blo$ues. 'u estructura en la "ase de #atos consiste tambi)n en una serie
de listas de asociacin similares a las de las entidades grficas, pero $ue no contienen
entidades propiamente dichas sino definiciones y caractersticas propias de los objetos
no grficos.
Las tablas de smbolos y los blo$ues comprenden I objetos no grficos<
+apas
Estilos de te%to
6ipos de lnea
168
Estilos de acotacin
.istas almacenadas
+onfiguraciones de ventanas mltiples
'+(s almacenados
#efiniciones de blo$ues
Aplicaciones registradas
Los objetos de diccionario renen B objetos a!adidos en la versin /3 de AutoCAD<
Estilos de lnea mltiple
Trupos de seleccin
A partir de la revisin c0 de la versin /3, y en la versin /0, se han a!adido otros
tipos de objetos ms especficas como XRECORD para almacenar datos arbitrarios o
ACAD_PROXY_OBJECT para objetos proxy procedentes de aplicaciones no reconocidas
por AutoCAD.
La organizacin de estos objetos en la "ase de #atos, como hemos dicho, es similar a
la de las entidades grficas, a base de listas de asociaciones $ue poseen un cdigo
como primer elemento $ue indica el tipo de dato $ue viene a continuacin. Los tipos de
datos correspondientes a estos objetos para el tipo de entidad *cdigo J, son los $ue
siguen<
Ti%o +e enti+a+ .... O,-eto no gr:4ico
------------------------------------------------
LAYER AAAAAAAAAAAAAA +apa
LTYPE AAAAAAAAAAAAAA 6ipo de lnea
STYLE AAAAAAAAAAAAAA Estilo de te%to
DIMSTYLE AAAAAAAAAA Estilo de acotacin
VIEW AAAAAAAAAAAAAA .ista almacenada
VPORT AAAAAAAAAAAAA +onfiguracin de ventanas mltiples
UCS AAAAAAAAAAAAAAA '+( almacenado
BLOCK AAAAAAAAAAAA #efinicin de blo$ue
ENDBLK AAAAAAAAAAA Oinal de definicin de blo$ue
APPID AAAAAAAAAAAA Aplicacin registrada
GROUP AAAAAAAAAAAA Trupo de seleccin
169
MLINESTYLE AAAAAA Estilo de lnea mltiple
En el caso de las definiciones de blo$ue, adems de la lista con las caractersticas
globales e%isten listas con todas las entidades $ue componen el blo$ue. A continuacin
veremos ejemplos de listas de algunos de los objetos no grficos.

'G.1.4.1. Ca%a
La lista de definicin de una capa en la tabla de smbolos podra ser la siguiente<
((0 . "LAYER")
(2 . "EJES")
(70 . 4)
(62 . -7)
(6 . "TRAZO_Y_PUNTO")
)
En este caso, el cdigo 0 con valor asociado LAYER indica $ue se trata de una capa. 'u
nombre es EJES. El color asociado es blanco y, como el nmero de color aparece con
signo negativo *-7,, $uiere decir $ue se encuentra en este momento desactivada. El
tipo de lnea asociado a la capa es TRAZO_Y_PUNTO.

'G.1.4.'. &#ti$o +e te2to
La lista de definicin de un estilo de te%to podra ser como la $ue sigue<
((0 . "STYLE")
(2 . "TS1")
(40. 0.0)
(41 . 1.0)
(50 . 0.0)
(71 . 0)
(42 . 3.5)
(3 . "romans.shx")
(4 . "")
)
El nombre del estilo de te%to es TS1; la altura en la definicin del estilo *cdigo 40, es
0; el factor de proporcin *cdigo 41, es 1; el ngulo de inclinacin del estilo *cdigo
50, es 0; la generacin del estilo es normal *cdigo 71 igual a 0,; la altura actual de los
te%tos por defecto *cdigo 42, es 3.5; y el archivo de definicin de tipos de letra en
$ue est basado el estilo es ROMANS.SHX.
'G.1.4.(. Ti%o +e $Hnea
170
La lista correspondiente a la definicin de un tipo de lnea cargado en el dibujo
presenta un aspecto como el siguiente<
((0 . "LTYPE")
(2 . "TRAZOS")
(3 . "-- -- -- -- -- -- -- -- --")
(72 . 65)
(73 . 2)
(40 . 0.75)
(49 . 0.5)
(49 . -0.25)
)
El nombre del tipo de lnea es TRAZOS; el aspecto $ue presenta en el archivo de
definicin ACAD.LIN o ACADISO.LIN, segn preferencias, es el $ue aparece asociado
como una cadena de te%to al cdigo 3; el cdigo 72 indica un factor de alineamiento A,
$ue como se sabe es obligatorio para los tipos de lnea de AutoCAD. El cdigo 73
indica el nmero de parmetros *sucesin de tramos, huecos y puntos, $ue definen el
patrn de la lnea. En este caso son dos, un trazo y un hueco. El cdigo 40 proporciona
la longitud total del patrn y el cdigo 49 da en varias listas los valores de ese patrn<
positivos para trazos, negativos para huecos y 0 para puntos.

'G.1.4.4. De4inicin +e ,$oNue
La lista de cabecera de la definicin de un blo$ue tiene una caracterstica especial y es
$ue contiene un cdigo -2 con el nombre de la primera entidad de las $ue compone
ese blo$ue. (or ejemplo<
((0 . "BLOCK")
(2 . "RES")
(70 . 66)
(10 0.0 0.0 0.0)
(-2 . <Nombre de objeto: 26a0b07>)
)
El blo$ue definido se llama RES, su punto de insercin es el de coordenadas 2 X J, L X
J y S X J, y el nombre de la primera entidad de la $ue est compuesta el blo$ue es
26a0b07.
+omo veremos seguidamente, a partir de ese nombre se podra acceder a todas las
listas con las entidades $ue componen el blo$ue, e%actamente del mismo modo $ue
para las entidades sueltas. A$u al e%plorar las listas de entidades en orden correlativo
*ENTNEXT,, despu)s de la ltima se devuelve nil. 7o obstante, al construir las listas
mediante ENTMAKE se re$uiere una lista final del tipo ENDBLK $ue indica $ue ya no hay
ms listas de componentes del blo$ue.
NOTA: Estas funciones AutoL&'( se estudiarn tras la tabla de cdigos de entidades.

171
'G.1.). C+igo# +e acce#o a !a#e +e Dato#
'G.'. =uncione# +e ge#tin +e $a !a#e +e Dato#
:na vez vista toda la teora acerca de la "ase de #atos interna de AutoCAD,
pasaremos a la prctica estudiando las funciones $ue nos permiten gestionarla. En este
apartado vamos a tratar cuatro grupos de funciones distintos< funciones para trabajar
con conjuntos designados, funciones $ue gestionan nombres de entidades, funciones
para acceder a los datos de las entidades y funciones especficas para gestionar
objetos no grficos. 6odas ellas, convenientemente combinadas *y con algunas
funciones de manejo de listas concretas,, nos darn acceso libre y directo a la "ase de
#atos de AutoCAD 14.
#e todas formas no vamos a ver dichas funciones de un modo ordenado. (ara sacarle
ms partido a la e%plicacin las mezclaremos, de este modo podremos ir siguiendo
paso a paso el modo de acceder a la "ase de #atos.

'G.'.1. Crear un con-unto +e #e$eccin
'i bien las funciones del tipo "#$... nos permitan obtener del usuario puntos,
distancias, ngulos y dems, evidente es $ue necesitaremos otro tipo de funciones con
las $ue obtener entidades completas o grupos de entidades para su proceso. Este
conjunto de funciones ..... son las $ue vamos a comenzar a ver con SSGET, aun$ue
como ya hemos dicho no veremos las dems en orden temtico.
172
(SSGET [modo] [punto1 [punto2]] [lista_puntos] [lista_filtros] )
La funcin SSGET acepta el conjunto designado de entidades. 'e puede utilizar sin
parmetros as<
(SSGET)
SSGET presenta el mensaje Designar objetos: en lnea de comandos *Select
objects: en versiones inglesas de AutoCAD,. La designacin puede hacerse mediante
cual$uiera de los modos de designacin permitidos< por un punto, una ventana, una
captura, un polgono, etc)tera. En el momento de pulsar INTRO, la funcin acepta del
conjunto de designacin, presentando un mensaje del tipo <Conjunto de seleccin:
n> *<Selection set: n> en ingles,, donde n es un nmero de orden entero $ue
representa el conjunto de seleccin actual.
La forma lgica de utilizacin de SSGET pasa por el almacenamiento en una variable del
conjunto de seleccin en cuestin, el cual luego podr ser llamado por los diversos
comandos de AutoCAD o por otra funcin de AutoL&'( para su proceso. (or ejemplo<
(SETQ Conjunto (SSGET))
(COMMAND "_.move" Conjunto "" "10,0" "")
NOTA: 1ecordemos la utilidad del punto *., antes del comando por si estuviera
redefinido *MDULO SIETE,.
Esta rutina solicita al usuario una designacin de objetos, los cuales sern recogidos en
un conjunto de seleccin y guardados en la variable Conjunto. (osteriormente, se
desplazan los objetos una distancia de /J unidades de dibujo en el eje 2.
NOTA: 'i $ueremos hacer pruebas en lnea de comandos para comprobar la
funcionalidad de SSGET, una vez ejecutada la funcin, podemos hacer una llamada a
cual$uier comando $ue solicite designar objetos e introducir el nombre de la variable
como conjunto de seleccin, pero con el signo de cerrar admiracin *!, por delante.
#esde rutinas o programas AutoL&'( no es necesario incluir dicho smbolo,
evidentemente.
NOTA: La diferencia entre SSGET y el comando DESIGNA es evidente. SSGET permite
designar cual$uier conjunto y guardarlo en una variable; de este modo podemos
disponer de varios conjuntos de seleccin para ser utilizados. DESIGNA permite
designar una serie de objetos $ue se incluirn en un conjunto de seleccin, el cual
puede ser referenciado posteriormente mediante el modo "revio de seleccin; en el
momento en $ue volvamos a hacer DESIGNA el conjunto anterior desaparece. Adems
no tiene sentido guardar en una variable el resultado de un DESIGNA ya $ue luego no
funciona a la hora llamarlo para algn comando. DESIGNA viene muy bien para su
utilizacin en macros, en los programas de AutoL&'( usaremos como norma general
SSGET.
El argumento modo especifica el m)todo de designacin. modo puede tener cual$uiera
de los siguiente valores<
173
"P". +rea un conjunto de seleccin con el ltimo conjunto de objetos previamente
seleccionado. E$uivale al modo de designacin "revio.
"U". +rea un conjunto de seleccin con la ltima entidad a!adida a la "ase de #atos
del dibujo de las visibles en pantalla, es decir la ltima entidad dibujada y no borrada
de las visibles en pantalla. E$uivale al modo de designacin Mltimo.
"I". +rea un conjunto de seleccin con el conjunto implcito designado *variable
PICKFIRST de AutoCAD activada,.
p1. +rea un conjunto de seleccin con la entidad $ue pasa por el punto p1. E$uivale a
se!alar ese punto en la pantalla. El resultado depender del modo o modos de
referencia a objetos actuales, es decir del valor de la variable OSMODE.
"V" p1 p2. +rea un conjunto de seleccin a partir de la Ventana cuyos v)rtices son
los puntos p1 y p2. Ambos puntos no se pueden omitir.
"C" p1 p2. +rea un conjunto de seleccin a partir de la Captura cuyos puntos son los
puntos p1 y p2. Ambos puntos no se pueden omitir.
"PV" lista_puntos. +rea un conjunto de seleccin a partir del "ol$#ono&Ventana
cuyos v)rtices son los puntos indicados en la lista. La lista no se puede omitir.
"PC" lista_puntos. +rea un conjunto de seleccin a partir del "ol$#ono&Captura
cuyos v)rtices son los puntos indicados en la lista. La lista no se puede omitir.
"B" lista_puntos. +rea un conjunto de seleccin a partir del Borde cuyos v)rtices
son los puntos indicados en la lista. La lista no se puede omitir.
"X". +rea un conjunto de seleccin todas las entidades de la "ase de #atos, visibles
o no visibles en pantalla. E$uivale al modo de designacin Todo.
NOTA: Los valores entre comillas son cadenas $ue deben indicarse como tales.
NOTA: Los valores entre comillas representan a los modos de designacin de AutoCAD
14 y se introducen como cadenas por ser una llamada a dichos modos. Es por ello, $ue
en versiones idiomticas diferentes a la castellana han de indicarse de forma
conveniente. (or ejemplo, en lugar de "U" indicar "L", para Mltimo; es factible la
sinta%is "_L" , por ejemplo, para cual$uier versin idiomtica del programa.
.eamos un ejemplo sencillo. La siguiente rutina dibuja una lnea en pantalla y luego la
borra<
(COMMAND "_.line" "0,0" "100,100" "")
(COMMAND "_.erase" (SSGET "_l") "")
9tro ejemplo; )ste dibuja un rectngulo y luego lo borra tambi)n<
174
(COMMAND "_.rectang" "100,100" "300,300")
(SETQ Conjunto (SSGET "_c" '(100 100) '(300 300)))
(COMMAND "_.erase" Conjunto "")
Adems de todo esto, disponemos de la posibilidad de introducir filtros de seleccin.
Estos filtros han de ser listas de asociaciones $ue filtran o realizan una criba de los
objetos segn determinadas condiciones, $uedndose con a$uellas entidades de la
"ase de #atos $ue cumplen dichas condiciones.
'e puede a!adir una lista de filtros a cual$uiera de las modalidades de seleccin
e%puesta arriba. Los filtros de seleccin se a!aden detrs de los parmetros propios de
seleccin *como "P", "V" p1 p2 o "X",.
Las listas de filtros hacen referencia a las propiedades de la entidad, como el color, su
capa, tipo de lnea, etc. 9 tambi)n a puntos u otras caractersticas. (ara construir una
lista de filtro deberemos construir la propia lista con cada una de sus sublistas, las
cuales sern las caractersticas o propiedades de las entidades $ue $ueremos filtrar.
Las sublistas pueden ser pares punteados construidos con CONS o no.
As, un ejemplo muy tpico es a$uel $ue permite seleccionar todos los objetos de un
dibujo $ue tengan unas determinadas caractersticas. (or ejemplo, para designar todos
los crculos del dibujo actual, $ue adems est)n en la capa PIEZA y tengan asignado el
color rojo, haramos<
(SSGET "x" (LIST (CONS 0 "CIRCLE")
-----------------(CONS 8 "Pieza")
-----------------(CONS 62 1)
-----------)
)
+onstruimos pues una lista con LIST $ue recoge las condiciones del filtro, $ue no son
otra cosa sino propiedades de la entidad. AutoL&'( e%plorar toda *"X", la "ase de
#atos del dibujo actual y seleccionar *"SSGET", las entidades $ue posean dichas
propiedades.
9tro ejemplo puede ser la designacin o seleccin de todas la lneas $ue comiencen en
un punto<
(SSGET "x" (LIST (CONS 0 "LINE")
-----------------'(10 10.0 10.0 0.0)
-----------)
)
+omo se ve a$u, la segunda condicin no es par punteado, ya $ue dice relacin a los
puntos iniciales de las lneas *en este caso de coordenadas 2 X /J, L X /J y S XJ,,
por lo $ue se construye como una lista normal *con el apstrofo ' de literal,.
Las listas de filtros pueden ser enteramente construidas como literales tambi)n. En el
primero de los ejemplos sera as<
(SSGET "x" '((0 . "CIRCLE")
-------------(8 . "Pieza")
175
-------------(62 . 1)
------------)
)
En estos casos habremos de describir correctamente la notacin de los pares
punteados, es decir< el primer valor, un espacio, el punto, otro espacio y el segundo
valor, todo ello entre par)ntesis. Aun$ue resulta ms elegante y sencillo, $uizs, hacer
mediante CONS.
En principio, cada elemento de una lista de filtros de seleccin se a!ade como una
condicin ms $ue se debe cumplir. 'in embargo, e%iste la posibilidad de a!adir
operadores relacionales y booleanos a estos filtros. Esto se realiza con el cdigo
especial -4, por ejemplo<
(SSGET "x" (LIST (CONS 0 "TEXT")
-----------------(CONS -4 "<=")
-----------------(CONS 40 5)
-----------)
)
El operador relacional, $ue ha de ser una cadena, se aplica a la condicin $ue le siga
en la lista. En este ltimo ejemplo, SSGET selecciona entidades de te%to cuya altura
*cdigo 40, sea menor o igual *"<=", $ue H unidades de dibujo.
La tabla siguiente muestra cules son los operadores relacionales $ue se pueden incluir
en los filtros, con su correspondiente descripcin<
O%era+or re$aciona$ ...... De#cri%cin
-------------------------------------------------------------------------
------------
"*" AAAAAAAAAAAAAAAAAAAAAA +ual$uier valor *siempre verdadero,
"=" AAAAAAAAAAAAAAAAAAAAAA &gual $ue
"!=" AAAAAAAAAAAAAAAAAAAAA #istinto de
"+/=" AAAAAAAAAAAAAAAAAAAA #istinto de
"<>" AAAAAAAAAAAAAAAAAAAAA #istinto de
"<" AAAAAAAAAAAAAAAAAAAAAA =enor $ue
"<=" AAAAAAAAAAAAAAAAAAAAA =enor o igual $ue
">" AAAAAAAAAAAAAAAAAAAAAA =ayor $ue
">=" AAAAAAAAAAAAAAAAAAAAA =ayor o igual $ue
"&" AAAAAAAAAAAAAAAAAAAAAA AND binario *slo grupos de nmeros enteros,
"&=" AAAAAAAAAAAAAAAAAAAAA &gual a enmascarado binario *slo grupos de nmeros
enteros,
7o se puede especificar un nombre de capa menor o igual $ue otro *ni por orden
alfab)tico,, por ejemplo, por lo $ue estos operadores se aplican slo a datos
num)ricos. (ara establecer filtros con los datos te%tuales o alfanum)ricos se utilizan los
caracteres comodn e%plicados con la funcin WCMATCH, en la seccin 12..
176
(ara condiciones $ue afectan a puntos es factible agrupar operadores en grupos de
tres, separados por comas. (or ejemplo<
(SSGET "x" (LIST (CONS 0 "LINE")
-----------------(CONS -4 "<,>,*")
-----------------'(11 10 100)
-----------)
)
En este ejemplo se buscan todas las lneas cuyas coordenadas de punto final sean< en
2 menores $ue /J, en L mayores $ue /JJ y sus coordenadas S cuales$uiera.
+omo hemos dicho, adems de operadores relacionales, los cuales afectan slo a la
siguiente condicin, se pueden agrupar condiciones mediante operadores booleanos,
empleando un operador de comienzo y otro de final. Estos operadores tambi)n se
especifican con el cdigo -4 y son los de la ta!la de este archio.
En el ejemplo siguiente se designarn todos los te%tos de la capa NOTAS y todos los
arcos de radio 10<
(SSGET "X" '((-4 . "<OR")
-------------(-4 . "<AND")(0 . "TEXT")(8 . "NOTAS")(-4 . "AND>")
-------------(-4 . "<AND")(0 . "ARC") (40 . 10) (-4 . "AND>")
-------------(-4 . "OR>")
------------)
)
Los conjuntos de seleccin ocupan archivos temporales de AutoCAD. (or esa razn
e%iste una limitacin en cuanto al nmero m%imo de conjuntos almacenados en
variables, $ue es de /BE a la vez. :na vez alcanzado este lmite, SSGET rechaza la
posibilidad de crear un nuevo conjunto y devuelve nil. (ara acceder a ms conjuntos
de seleccin es preciso eliminar alguno de los almacenados poniendo la variable a nil.

'G.'.'. O,tener e$ nom,re +e una enti+a+
:na vez seleccionadas las entidades y agrupadas en un conjunto de seleccin,
deberemos e%traer el nombre de la $ue o las $ue nos interesen para trabajar con ellas.
+omo sabemos, en la "ase de #atos la entidades se encuentran referenciadas
mediante un nombre $ue es en realidad un nmero he%adecimal $ue indica la posicin
en memoria. Este nombre es nico para cada entidad en cada sesin de dibujo, de
forma $ue la identifica ine$uvocamente y la distingue de todas las dems del dibujo.
(or todo ello, para capturar una entidad, y solo esa, de un conjunto de seleccin lo
ms lgico es referirse a su nombre, y para e%traer su nombre disponemos de la
funcin SSNAME.
(SSNAME con%unto !ndice )
177
SSNAME devuelve el nombre de entidad *cdigo -1,, del conjunto de seleccin
especificado, situada en el lugar indicado por el ndice. Las entidades dentro de un
conjunto comienzan a numerarse por el 0. As, en un conjunto con cuatro entidades,
)stas estaran numeradas de 0 a 3. .eamos un ejemplo<
(SETQ Entidad (SSNAME (SSGET) 0))
#e esta forma designaramos una o varias entidades en pantalla cuando nos lo pidiera
SSGET y el nombre de la primera de ellas *SSNAME con ndice 0, se guardara en la
variable Entidad.
:na vez obtenido el nombre de una entidad, puede ser procesado por otras funciones
$ue veremos a continuacin.
NOTA: Los nombres $ue devuelve SSNAME son slo de entidades principales; esta
funcin no puede acceder a las entidades $ue forman parte de una polilnea o un
blo$ue.

'G.'.(. &2traer $a $i#ta +e una enti+a+
Ahora $ue ya hemos designado una entidad y $ue podemos conocer su nombre, slo
$ueda e%traer su lista de definicin para poder modificarla o editarla. (ara ello
disponemos de la funcin ENTGET.
(ENTGET nombre_entidad [lista_aplicaciones] )
Esta funcin ENTGET busca en la "ase de #atos el nombre indicado de una entidad y
devuelve la lista completa correspondiente a esa entidad. 'e observa $ue se re$uiere
el nombre de una entidad *cdigo -1 en "ase de #atos, y por lo tanto se hace
necesario obtenerlo previamente con SSNAME -u otras $ue veremos-.
El ejemplo tpico de descubrimiento de esta funcin *combinada con las anteriores, es<
(SETQ ListaEntidad (ENTGET (SSNAME (SSGET) 0)))
+on este ejemplo obtendremos la lista de definicin en "ase de #atos de cual$uier
entidad $ue designemos en pantalla y lo guardaremos en la variable ListaEntidad
para su posterior proceso; si designamos varias slo aceptar la primera de ellas
*debido al ndice 0 de SSNAME, como sabemos,. :na lista de un crculo designado, por
ejemplo, podra ser<
((-1 . <Nombre de objeto: 2770500>)
(0 . "CIRCLE")
(5 . "20")
(100 . "AcDbEntity")
(67 . 0)
(8 . "0")
(100 . "AcDbCircle")
(10 144.409 168.958 0.0)
178
(40 . 17.2339)
(210 0.0 0.0 1.0)
)
NOTA: Ahora podremos comprobar de manera factible toda la teora e%plicada
anteriormente sobre la "ase de #atos de AutoCAD 14.
La manera ms sencilla y utilizada de acceder a los datos de una entidad es mediante
ASSOC *ya estudiada,, para obtener la lista de asociaciones deseada, y luego con CAR,
CDR, CADR, CADDR, etc., para capturar sus componentes *recordemos $ue funciones del
tipo NTH no funcionan directamente con pares punteados,.
#e este modo, en el ejemplo anterior, y si hubi)semos designado el crculo cuya lista
se propone, podramos e%traer la capa en la $ue se encuentra directamente<
(SETQ Capa (CDR (ASSOC 8 ListaEntidad)))
Lo $ue hacemos a$u es guardar en Capa el segundo elemento *CDR, de la sublista de
asociacin cuyo primer elemento *ASSOC, sea 8 *cdigo para la capa,.
NOTA: 1ecu)rdese la necesidad de utilizar CDR y no CADR para capturar el segundo
elemento de un par punteado.
'i $uisi)ramos e%traer ahora por ejemplo la coordenada L del centro del crculo
haramos<
(SET CentroY (CADDR (ASSOC 10 ListaEntidad)))
La $ue esta lista no es par punteado, el primer elemento saldra con CAR *el cdigo 10
de coordenadas del centro para un crculo,, el segundo con CADR *la coordenada 2, y el
tercero *coordenada L, con CADDR. (ara la coordenada S utilizaramos CADDDR.
NOTA: +omo se e%plic en su momento, las coordenadas de los puntos de las
entidades se e%presan en el 'istema de +oordenadas de Entidad o de 9bjeto *'+E o
'+9 segn la denominacin adoptada,. En la mayora de las entidades dibujadas en el
'istema de +oordenadas :niversal '+:, las coordenadas en la base de datos coinciden
con las universales. (ero si se han dibujado en cual$uier 'istema de +oordenadas
(ersonal *'+(,, se hace necesario recurrir a la funcin TRANS para efectuar las
conversiones.
(or ltimo decir $ue el argumento opcional lista_aplicaciones de ENTGET permite
incluir en la lista devuelta los datos e%tendidos de entidades *los $ue siguen al cdigo
especfico -3,. #e este tema hablaremos en la seccin 20.2.1!..

'G.'.4. Actua$i<ar $i#ta " !a#e +e Dato#
179
:na vez accedido al elemento $ue nos interesa, deberemos realizar los cambios
necesarios en la lista para modificar la entidad. (ara ello utilizaremos bsicamente
funciones del tipo SUBST o APPEND, ya e%plicadas.
NOTA: 1ecordar $ue nos estamos moviendo entre listas y $ue cual$uier funcin de
manejo de listas nos puede ser til< CONS, LIST, etc)tera.
As pues, retomemos el ejemplo anterior del crculo. 6ras escribir<
(SETQ ListaEntidad (ENTGET (SSNAME (SSGET) 0)))
y designar un crculo, AutoL&'( nos devuelve<
((-1 . <Nombre de objeto: 2770500>)
(0 . "CIRCLE")
(5 . "20")
(100 . "AcDbEntity")
(67 . 0)
(8 . "0")
(100 . "AcDbCircle")
(10 144.409 168.958 0.0)
(40 . 17.2339)
(210 0.0 0.0 1.0)
)
'i ahora $uisi)ramos, por ejemplo, cambiar la capa del crculo, habramos de hacer<
(SETQ ListaEntidad (SUBST (CONS 8 "Ejes") (CONS 8 "0") ListaEntidad))
NOTA: 'i la capa no e%iste se crea.
+omo hemos de saber ya, CONS nos devolver la nueva lista renovada. 'i ocurre algn
error, CONS devolver la lista sin renovar.
(ero si $uisi)ramos en este caso cambiar el color del crculo, no podramos utilizar
CONS, ya $ue la lista del color *cdigo 62, no aparece por$ue es PorCapa, por lo $ue no
podemos decir $ue sustituya una nueva lista por otra $ue no e%iste.
En estos casos se utiliza APPEND, $ue nos permite a!adir nuevos elementos a la lista
por su manera de actuar. As pues, para cambiar el crculo de color haramos<
(SETQ ListaEntidad (APPEND ListaEntidad (LIST (CONS 62 1))))
NOTA: 6odo ello en lnea de comandos.
NOTA: (rocrese con APPEND a!adir a la lista de una entidad una nueva lista, y no una
nueva lista a la lista de una entidad. Es decir, la lista general ir antes, como
argumento de APPEND, $ue la lista $ue debe agregarse. 'i se realiza esto al rev)s, la
nueva lista se a!adir por delante a la lista de la entidad y esto har $ue no funcione
correctamente. +omo norma general los dos primeros elementos de una lista de
entidad habrn de ser el nombre *con cdigo -1, y el tipo *cdigo 0,, respectivamente;
180
con las restantes sublistas *capa, color, punto inicial, centro, tipo de lnea..., no
importa el orden generalmente.
La razn de tener $ue formar una lista con la propia lista de asociacin del color es
$ue, si no lo hacemos, APPEND a!ade los valores de la lista sin asociar y provoca un
error bad list. 'i recordamos, APPEND toma los componentes de las listas y los junta
todos en una. 'i hacemos $ue la lista de par punteado se encuentre dentro de otra
lista, APPEND tomar el par punteado como un solo elemento y se lo a!adir al resto
*$ue tambi)n son sublistas, de la lista de la entidad.
NOTA: 1epsense estas funciones en la seccin 17..
Kemos de comprender $ue actualizar as la variable $ue contiene la lista de la entidad
no actualiza el dibujo. Esta variable contiene una copia de la definicin de la entidad en
la "ase de #atos, pero no la definicin propiamente dicha.
(ara actualizar pues, y como paso ltimo, la "ase de #atos de AutoCAD y $ue los
objetos se vean realmente modificados, debemos recurrir a una funcin $ue se
encarga de ello<
(ENTMOD lista_entidad )
ENTMOD pues actualiza la lista de una entidad en la "ase de #atos de AutoCAD 14. 'u
funcionamiento es tan sencillo como pasarle como argumento nico la lista de la
entidad $ue hay $ue modificar, y ella se encarga del resto.
As pues, en el ejemplo del crculo $ue venimos arrastrando slo $uedara escribir<
(ENTMOD ListaEntidad)
para $ue ese crculo cambiara su capa y su color.
El funcionamiento principal de modificacin de las entidades de la "ase de #atos se
basa en los pasos $ue hemos venido siguiendo, esto es, la designacin de la entidad o
entidades $ue $ueremos tratar, la obtencin de sus nombres y con ello sus listas, la
modificacin de las mismas y, por ltimo, la actualizacin de la "ase de #atos
mediante ENTMOD. El resto de las funciones $ue veremos a$u se refieren a otros tipos
de e%traer nombres de entidades o sus listas, o de trabajar con los conjuntos.
La funcin ENTMOD presenta algunas restricciones en cuanto al tipo de dato $ue puede
actualizar para una entidad. 7o puede modificar ni el nombre de entidad *cdigo -1, ni
el tipo *cdigo 0,, evidentemente. 'i se modifica el nombre de estilo de te%to, tipo de
lnea o nombre de blo$ue, estos deben estar previamente definidos o cargados en el.
'i se modifica el nombre de capa en cambio, se crea una nueva capa si no e%istiera
previamente -como hemos podido comprobar-. 'i se modifica la lista de una entidad
principal, se actualiza su imagen en pantalla. 'i se modifica la lista de una subentidad
*v)rtices de polilnea o atributos, la imagen en pantalla no cambia hasta $ue se utiliza
ENTUPD *la veremos a continuacin,.
7o se pueden modificar con ENTMOD entidades de ventanas grficas *tipo VIEWPORT,.
6ampoco las entidades incluidas en la definicin de un blo$ue.
181
(ENTUPD nombre_entidad )
+omo hemos comentado pues, mediante ENTMOD se actualiza en la "ase de #atos una
entidad a la $ue se le han cambiado sus caractersticas. 'i se trata de una entidad
principal, ENTMOD regenera directamente la entidad y )sta se visualiza en pantalla ya
actualizada. (ero si se modifica un componente de una entidad compuesta -como
v)rtices de una polilnea o un atributo de un blo$ue-, aun$ue se actualice la "ase de
#atos el aspecto de la entidad no cambiar en pantalla hasta $ue se produzca una
regeneracin general de todo el dibujo.
=ediante ENTUPD, indicando simplemente el nombre de la entidad *por ejemplo, el
v)rtice de una polilnea modificada,, se busca cul es la cabecera de esa entidad y se
regenera, con lo $ue se actualiza su aspecto en pantalla. En general, ENTUPD regenera
la entidad cuyo nombre se especifi$ue, incluidas todas las subentidades.
(ues llegados a este punto, ya podemos ver algn ejemplo un poco ms trabajado. El
siguiente es un ejemplo tpico de toda la vida. :n programa AutoL&'( $ue permite
cambiar la capa actual de trabajo simplemente designando un objeto $ue se encuentre
en la capa a la $ue $ueremos cambiar. Adems, y para introducir una pe$ue!a
variacin, las dems capas sern desactivadas. El listado sencillo es el siguiente<
(DEFUN C:DesCapa ()
--(SETQ ListaEnt (ENTGET (SSNAME (SSGET) 0)))
--(SETQ ListaCapa (ASSOC 8 ListaEnt))
--(SETQ Capa (CDR ListaCapa))
--(SETVAR "CLAYER" Capa)
--(COMMAND "_.layer" "_off" "*" "_n" "")
)
+omo podemos ver, a$u se crea un nuevo comando de AutoCAD llamado DESCAPA
para realizar lo propuesto. Lo primero es solicitar al usuario un objeto *SSGET,, si se
seleccionan varios nicamente se elige el primero despu)s *ndice 0 de SSNAME,, y se
guarda su lista de especificacin *ENTGET, en la variable ListaEnt. A continuacin se
e%trae la lista de la capa *cdigo 8 con ASSOC, de la lista completa ListaEnt y se
guarda en ListaCapa, y luego se almacena en la variable Capa la capa en cuestin,
$ue es el segundo elemento *CDR, del par punteado $ue guarda la capa *ListaCapa,.
(or ltimo se establece dicha capa como actual con la variable CLAYER y se desactivan
todas las dems *e%ceptuando la actual, como decimos, con el comando CAPA *LAYER
en ingl)s, de AutoCAD 14.
NOTA: Al recibir el comando CAPA desde un archivo .LSP, AutoCAD lo activa en su
modo de lnea de comandos automticamente, por lo $ue no es necesario indicar -
CAPA *o incluso _.-LAYER,. Esa notacin es ms $ue nada para macros, aun$ue puede
ser interesante incluirla a$u para no perder la costumbre.
En el ejemplo $ue acabamos de ver, es factible seleccionar ms de un objeto y, aun$ue
slo se elija el primero despu)s, no parece lgico utilizar este m)todo en este caso. A
continuacin conoceremos una funcin $ue nos abrir los ojos un poco ms en este
sentido.
182

'G.'.). Nom,re +e enti+a+ %or un %unto
E%isten diversos comandos de AutoCAD $ue procesan entidades teniendo en cuenta el
punto de designacin con el $ue se ha actuado sobre las mismas, es el caso por
ejemplo del comando PARTE. .eamos la sinta%is de la siguiente funcin<
(ENTSEL [mensa%e_solicitud] )
La funcin ENTSEL espera a $ue el usuario designe una nica entidad mediante un
punto y devuelve una lista cuyo primer elemento es el nombre de la entidad *cdigo -
1, designada, y su segundo elemento las coordenadas 2, L y S del punto de
designacin. #e esta forma se tienen asociados ambos valores para procesarlos
posteriormente.
Esta lista devuelta por ENSEL se puede indicar en las llamadas a los comandos de
AutoCAD $ue re$uieren se!alar una entidad por un punto. As por ejemplo, si en lnea
de comandos hacemos<
(SET PuntoParte (ENTSEL))
y marcamos un punto de una lnea, por ejemplo. L despu)s ejecutamos el comando
PARTE, y como primer punto para seleccionar objeto le decimos<
!PuntoParte
dicho punto ser aceptado por el comando de manera normal.
'e puede indicar una cadena de te%to como argumento opcional de ENTSEL; esta
cadena es un mensaje de solicitud. (or ejemplo<
(SETQ NomEnt (ENSET "Designar entidad por un punto: "))
'i no se especifica un mensaje, ENTSEL presenta el mismo $ue SSGET o DESIGNA, pero
en singular, es decir, si para esos dos comentados era Designar objetos:, para
E76'EL es Designar objeto: *Select object: en ingl)s,.
:na vez visto ENTSEL nos parecer ms lgico utilizarlo para el ejemplo anterior
DESCAPA. El ejercicio tratado con ENTSEL, y un poco ms trabajado, se presenta en el
siguiente archio.
El ejemplo es tan sencillo $ue se ha definido todo )l en una sola orden de usuario
nueva.
6ras designar el objeto por un punto *ENTSEL, y guardar su nombre y punto de
designacin *$ue es lo $ue devuelve ENTSEL, en Ent, se guarda en EntName
nicamente su nombre, e%trayendo el primer elemento de la lista con CAR.
183
A continuacin se guarda en Capa el segundo elemento *CDR, del par punteado $ue
comience con 8 *ASSOC, dentro de la lista de la entidad *ENTGET, cuyo nombre es
EntName.
(or ltimo se define la capa como actual, esta vez con el propio comando CAPA y se
acaba el programa. El resto se corresponde con el procedimiento de rigor de control de
errores y control de variables de AutoCAD.

'G.'.@. AOa+ir, e$iminar " $oca$i<ar enti+a+e#
.eremos ahora tres funciones $ue nos permitirn a!adir, eliminar y localizar una
entidad dentro de un conjunto de seleccin. (ero antes, e%pli$uemos un poco otra $ue
nos permite averiguar el nmero de entidades de un conjunto. 'u sinta%is es<
(SSLENGTH con%unto )
+omo decimos, SSLENGTH determina el nmero de entidades $ue e%isten en el
conjunto de seleccin indicado. El nmero es siempre entero positivo, salvo si es
mayor de 3B.DCD, en cuyo caso es un nmero real. .eamos un ejemplo simple<
(SETQ Conjunto (SSGET "_l")) (SSLENGTH Conjunto)
SSLENGTH devolver siempre 1 en este caso, ya $ue SSGET almacena en Conjunto el
ltimo *"_l", objeto dibujado y visible. 'encillo.
(or otro lado, para a!adir una entidad a un conjunto de seleccin ya e%istente se
utiliza la funcin SSADD. 'u sinta%is es la siguiente<
(SSADD [nombre_entidad [con%unto]] )
'i se emplea sin ningn argumento construye un conjunto de seleccin vaco, si
elementos. 'i se indica slo un nombre de entidad, construye un conjunto de seleccin
$ue contiene slo esa entidad. 'i se especifica un nombre de entidad y tambi)n un
conjunto de seleccin e%istente, a!ade la entidad al conjunto, con lo $ue este pasa a
tener un elemento ms.
La funcin SSADD siempre devuelve un valor de conjunto. 'i se indica sin argumentos o
slo con el nombre de una entidad, dado $ue crea un conjunto nuevo, devuelve su
valor. 'i se especifica un conjunto ya e%istente, devuelve ese mismo valor especificado
puesto $ue el efecto es a!adirle una entidad, pero el identificador del conjunto sigue
siendo el mismo.
El siguiente ejemplo muestra el funcionamiento de SSADD<
(DEFUN C:BorraEnt ()
--(SETQ Entidades (SSGET))
--(SETQ NuevaEntidad (CAR (ENTSEL "Designar objeto que se aadir: ")))
--(SSADD NuevaEntidad Entidades)
184
--(COMMAND "_.erase" Entidades "")
)
Este programa permite designar un conjunto de objetos en pantalla con SSGET para
luego a!adir uno al conjunto, seleccionndolo mediante ENTSEL. SSADD a!ade el nuevo
objeto al conjunto de seleccin Entidades ya e%istente, lo cual se puede comprobar
cuando en la ltima lnea se borran los objetos del conjunto.
(SSDEL nombre_entidad con%unto )
SSDEL, por su lado, elimina la entidad, cuyo nombre se especifi$ue, del conjunto de
seleccin indicado. #igamos $ue es el proceso contrario a SSADD.
El nombre del conjunto sigue siendo el mismo y por eso SSDEL devuelve ese nombre.
'i la entidad no e%iste en el conjunto, SSDEL devuelve nil.
El siguiente ejemplo de SSDEL es el contrario del anterior<
(DEFUN C:BorraEnt2 ()
--(SETQ Entidades (SSGET))
--(SETQ ViejaEntidad (CAR (ENTSEL "Designar objeto que se eliminar: ")))
--(SSDEL ViejaEntidad Entidades)
--(COMMAND "_.erase" Entidades "")
)
Este programa permite designar un conjunto de objetos en pantalla con SSGET para
luego eliminar uno del conjunto, seleccionndolo mediante ENTSEL. SSDEL elimina el
nuevo objeto del conjunto de seleccin Entidades ya e%istente, lo cual se puede
comprobar cuando en la ltima lnea se borran los objetos del conjunto.
(SSMEMB nombre_entidad con%unto )
Esta ltima funcin de esta seccin e%amina el conjunto de seleccin especificado para
ver si la entidad cuyo nombre se indica est en )l. 'i la encuentra devuelve su nombre,
si no devuelve nil.


'G.'.B. A%$icar " +eterminar %in<amiento#
(SSSETFIRST con%unto_pinzamientos con%unto_seleccionados )
Esta funcin aplica pinzamientos a los conjuntos especificados. Los pinzamientos se
aplican al primer conjunto, pero sin $ue $ueden sus entidades seleccionadas. 'i se
indica un segundo conjunto, adems de aplicar pinzamientos, sus entidades $uedan
seleccionadas. 'i hay entidades comunes en ambos conjuntos, slo se pinza y
selecciona del segundo, ignorndose el primero. La funcin devuelve una lista con los
dos conjuntos de seleccin.
185
(SSGETFIRST)
Esta funcin devuelve una lista con dos conjuntos de seleccin< el primero con todas
las entidades del dibujo $ue tienen aplicados pinzamientos pero sin estar
seleccionadas, y el segundo con todas las entidades $ue adems de tener aplicados
pinzamientos estn seleccionadas.

'G.'.E. O,tener nom,re con mo+o +e #e$eccin
(SSNAMEX con%unto [!ndice] )
Esta funcin, al igual $ue SSNAME, devuelve el nombre de la entidad del conjunto
especificado $ue se encuentre en el lugar determinado por !ndice. La diferencia con la
otra funcin de nombre casi igual, es $ue SSNAMEX, junto con dicho nombre, devuelve
tambi)n los datos $ue describen el tipo de seleccin realizada sobre dicha entidad por
el usuario.
Los datos son devueltos en forma de una lista con sublistas, una para cada entidad, de
la forma<
(id_seleccin nombre_entidad (datos))
+ada una de estas sublistas tiene tres elementos, como vemos. #ichos elementos se
comentan detalladamente a continuacin.
- id_seleccin es un nmero identificador del m)todo de seleccin empleado con la
entidad. Los nmeros posibles se indican en la siguiente tabla<
I+enti4ica+or ..... De#cri%cin
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
0 AAAAAAAAAAAAAAAAA 'eleccin no especfica *Mltimo, "revio, Todo...,
1 AAAAAAAAAAAAAAAAA #esignacin mediante cursor
2 AAAAAAAAAAAAAAAAA Ventana o "ol$#ono&Ventana
3 AAAAAAAAAAAAAAAAA Captura o "ol$#ono&Captura
4 AAAAAAAAAAAAAAAAA Borde
- nombre_entidad es el nmero he%acimal $ue es nombre de la entidad; el del cdigo
-1.
- datos es el conjunto de datos de informacin sobre el tipo de seleccin para la
entidad. 'i la seleccin ha sido no especfica *identificador 0, no hay datos a!adidos. 'i
186
ha sido se!alado directamente con el cursor *identificador 1,, se ofrece una lista con el
punto de designacin. #ependiendo del punto de vista 3#, el punto de designacin se
puede representar como una lista infinita, un rayo *semiAinfinita, o un segmento de
lnea *finita,. El punto en cuestin se ofrece en una lista con sus tres coordenadas,
precedida esta lista por un cdigo $ue puede ser uno de los siguientes<
C+igo .................. De#cri%cin
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
0 AAAAAAAAAAAAAAAAAAAAAAAA Lnea infinita
1 AAAAAAAAAAAAAAAAAAAAAAAA 1ayo semiAinfinito
2 AAAAAAAAAAAAAAAAAAAAAAAA 'egmento de lnea finito
Adems, a las tres coordenadas sigue un vector opcional $ue describe la direccin de
la lnea infinita o el desplazamiento al otro e%tremo del segmento de lnea. 'i se omite
en el listado, significa $ue el punto de vista es en planta. (or ejemplo, la siguiente lista
es devuelta para un objeto designado en el punto de 2 X HJ e L X HJ en una vista en
planta del '+:<
(1 <Nombre de objeto: 26a0b07> (0 (50.0 50.0)))
'i la seleccin es del tipo Ventana o Captura, sus datos se ofrecen en una lista $ue
empieza por un identificador de polgono con nmero negativo *-1, -2, -3, etc., y
despu)s sublistas con todos los v)rtices del rectngulo o polgono, indicndose en cada
una el tipo de punto *0, 1 2, y las tres coordenadas. (or ejemplo, la siguiente lista es
devuelta por una designacin de Captura en una vista en planta<
((3 <Nombre de objeto: 26a0c12> -1 ) ((-1 (0 (20.0 10.0 0.0)))
(0 (50.0 10.0 0.0))
(0 (50.0 40.0 0.0))
(0 (20.0 40.0 0.0))
)
)
'i la seleccin es del tipo Borde, los datos son una lista de puntos de interseccin entre
la lnea de Borde y la entidad. (or ejemplo, la siguiente lista es devuelta por una
designacin de Borde, $ue ha intersectado con la entidad en el punto 3B,HC.
(4 <Nombre de objeto: 26a5c09> (0 (32.0 56.0 0.0)))

'G.'.F. Otra# 4orma# +e o,tener nom,re#
+omo hemos comprobado para acceder a una entidad en la "ase de #atos necesitamos
su nombre. Ounciones $ue lo e%traigan hemos visto hasta ahora SSNAME, SSNAMEX y
ENTSEL, pero e%isten tambi)n otras $ue cumplen esa misin dependiendo de la
situacin en la $ue nos encontremos. .emoslas.
187
(ENTNEXT [nombre_entidad] )
Esta funcin devuelve el nombre de la primera entidad de la "ase de #atos $ue sigue a
la entidad cuyo nombre se indica en nombre_entidad. +omo vemos, este argumento o
parmetro de la sinta%is de ENTNEXT es opcional, y es $ue si no lo especificamos, la
funcin devuelve el nombre de la primera entidad no eliminada de la "ase de #atos.
:n ejemplo tpico de uso de ENTNEXT es la de rastrear de modo repetitivo la "ase de
#atos del dibujo para obtener todos los nombres de todas las entidades de dibujo *de
un dibujo no muy e%tenso, claro est,, o los de las tres primeras, por ejemplo<
(SETQ Entidad1 (ENTNEXT))
(SETQ Entidad2 (ENTNEXT Entidad1))
(SETQ Entidad3 (ENTNEXT Entidad2))
ENTNEXT no slo accede a las entidades principales, sino tambi)n a las contenidas en
ellas. As pues, otro ejemplo ms lgico y utilizado se refiere a la e%traccin de todos
los v)rtices de una polilnea no optimizada, o los atributos de un blo$ue. 'e puede
poner como condicin $ue recorra todas las entidades hasta $ue encuentre "SEQUEND".
'i lo $ue $ueremos es saber a $u) polilnea de antigua definicin pertenece
determinado v)rtice, habr $ue ir e%plorando todas las polilneas del dibujo hasta dar
con alguna caracterstica de dicho v)rtice. En dicho momento, y tras la entidad
"SEQEND", se e%trae el valor del cdigo -2 $ue da el nombre de la entidad principal.
(ENTLAST)
Esta funcin devuelve el nombre de la ltima entidad principal no eliminada de la "ase
de #atos. 'lo entidades principales.
Kabitualmente se utiliza para capturar el nombre de una entidad reci)n dibujada
mediante COMMAND desde un programa AutoL&'(. (resenta la gran ventaja de $ue
obtiene el nombre de la entidad aun$ue no sea visible en pantalla o se encuentre en
una capa inutilizada.
En el siguiente ejemplo, la variable EntidadLnea almacena el nombre de la entidad
tipo lnea reci)n dibujada, sin necesidad de tener $ue designarla. +on este nombre ya
es posible acceder a la "ase de #atos y realizar las operaciones convenientes<
(COMMAND "_.line" "0,0" "100,100" "")
(SETQ EntidadLnea (ENTLAST))
(NENTSEL [mensa%e_solicitud])
Esta funcin permite acceder en la "ase de #atos a una entidad $ue se encuentre
formando parte de una entidad compuesta *polilnea no optimizada o blo$ue,. La
cadena de te%to opcional es el mensaje para la solicitud de designacin de entidad.
+uando la entidad $ue se designa no forma parte de otra compuesta, NENTSEL
devuelve la misma informacin $ue ENTSEL, es decir, una lista cuyo primer elemento es
el nombre de la entidad y su segundo elemento el punto de designacin.
188
+uando con NENTSEL se designa un componente de una polilnea no optimizada,
devuelve una lista cuyo primer elemento es el nombre de la subentidad, es decir el
v)rtice *tipo de entidad "VERTEX", inicial del segmento de polilnea designado. El
segundo elemento de la lista sigue siendo el punto de designacin. (or ejemplo<
(NENTSEL "Designar segmento de polilnea: ")
podra devolver<
(<Nombre de objeto: 26b004e> (5.65 6.32 0.0))
+uando con NENTSEL se designa un componente de un blo$ue devuelve una lista con
cuatro elementos<
- El primer elemento es el nombre de la entidad componente del blo$ue, e%trada de
la
tabla de smbolos con la definicin de ese blo$ue.
- El segundo elemento es una lista con las coordenadas del punto de designacin.
- El tercer elemento es una lista $ue contiene a su vez cuatro listas< es la matriz de
transformacin del 'istema de +oordenadas =odelo *'+=, al :niversal *'+:,. El
'istema de +oordenadas =odelo *'+=, es a$u)l al $ue estn referidas todas las
coordenadas en la definicin del blo$ue. 'u origen es el punto de insercin del blo$ue.
La matriz de transformacin permite trasladar las coordenadas de la definicin del
blo$ue al 'istema de +oordenadas :niversal *'+:,, para a partir de ah referirlas al
'istema de +oordenadas ms conveniente para el usuario.
- El cuarto elemento es una lista con el nombre de entidad $ue contiene a la
designada. 'i e%isten varios blo$ues anidados, la lista contiene todos los nombres
desde el blo$ue ms interior hasta el ms e%terior de los $ue engloban a la entidad
designada.
(or ejemplo, la designacin de una entidad $ue forma parte de un blo$ue, $ue a su vez
se encuentra incluido en otro blo$ue podra hacer $ue NENTSEL devolviera<
(<Nombre de objeto: 26c009d>
(6.65 5.67 0.0)
( (1.0 0.0 0.0)
(0.0 1.0 0.0)
(0.0 0.0 1.0)
(5.021 4.021 0.0)
)
(<Nombre de objeto: 26c010e> <Nombre de objeto: 26c01ba>)
)
La e%cepcin a lo dicho son los atributos contenidos en un blo$ue. 'i se designa un
atributo, NENTSEL devuelve una lista con slo dos elementos< el nombre de la entidad
de atributo y el punto de designacin.
(NENTSELP [mensa%e_solicitud][punto] )
189
#e manera similar a la funcin anterior, NENTSELP permite acceder a todos los datos de
definicin de entidades contenidas en un blo$ue. 'e puede especificar un mensaje de
solicitud y un punto de designacin.
NENTSELP obtiene una matriz de transformacin de 0 0 elementos definida as<
=JJ AAAAAAAA =J/ AAAAAAAA =JB AAAAAAAA =J3
=/J AAAAAAAA =// AAAAAAAA =/B AAAAAAAA =/3
=BJ AAAAAAAA =B/ AAAAAAAA =BB AAAAAAAA =B3
=3J AAAAAAAA =3/ AAAAAAAA =3B AAAAAAAA =33
Las tres primeras columnas de la matriz e%presan la escala y rotacin, y a cuarta
columna es un vector de traslacin. La ltima fila de la matriz no se toma en cuenta en
las funciones $ue operan con este tipo de matrices. Esta matriz sirve para aplicar
transformaciones a puntos.
(HANDENT identificador )
#evuelve el nombre de la entidad asociada al rtulo o identificador indicado. Kasta
ahora se ha visto $ue los nombres de entidades eran nicos y las identificaban
ine$uvocamente. (ero al terminar la sesin y salir de AutoCAD, esos nombres se
pierden. En cambio, los identificadores se asocian a cada entidad y no cambian en las
diferentes sesiones de dibujo. Estos identificadores se obtienen en la "ase de #atos
mediante el cdigo 5.
(ara comprobarlo podemos ejecutar el comando DDMODIFY con cual$uier objeto. En el
cuadro de dilogo $ue despliega este comando, arriba a la derecha, aparece el
identificador en cuestin de cada objeto. 'i deseamos, podemos e%traer luego la lista
de dicho objeto -con un simple (ENTGET (CAR (ENTSEL)))- para ver $ue asociado al
cdigo 5 se encuentra dicho identificador.

'G.'.1G. !orrarPrecu%erar enti+a+e#
.eremos ahora una funcin muy sencilla $ue elimina o recupera una entidad. Esta
funcin es<
(ENTDEL nombre_entidad )
ENTDEL elimina de la "ase de #atos la entidad, cuyo nombre se indica, si e%iste en ella
en el dibujo actual; ENTDEL recupera la entidad cuyo nombre se indica si haba sido
previamente borrada de la "ase de #atos.
Esto $uiere decir $ue las entidades borradas con ENTDEL pueden ser posteriormente
recuperadas con el mismo ENTDEL, antes de salir de la actual sesin de dibujo
190
evidentemente. Al salir del dibujo actual, las entidades borradas con ENTDEL se pierden
definitivamente, sin haber posibilidad de recuperacin.
ENTDEL solo accede a entidades principales; no es posible eliminar v)rtices de
polilneas sin optimizar ni atributos de blo$ue.
Ejemplo<
(DEFUN C:Eli ()
--(SETQ Nombre (CAR (ENTSEL "Designar un objeto para ser borrado: ")))
--(ENTDEL Nombre)
--(INITGET 1 "S No")
--(SETQ Recup (GETKWORD "Recuperarlo ahora (S/N)? "))
--(IF (= Recup "S")
--(ENTDEL Nombre)
)
Este ejemplo permite eliminar cual$uier objeto del dibujo actual. 6ras ello, nos ofrece
la posibilidad de recuperarlo o no.

'G.'.11. O,tener rect:ngu$o +e te2to
La funcin TEXTBOX devuelve las coordenadas de la caja de abar$ue o rectngulo
contenedor de una entidad te%to cuya lista se especifi$ue. 'u sinta%is es la $ue sigue<
(TEXTBOX lista_entidad_texto )
lista_entidad_texto puede ser la lista completa de la entidad de te%to en cuestin o
una lista parcial $ue contenga nicamente el valor de cadena del te%to *par punteado
con cdigo 1 en la lista de entidad de te%to,. (or ejemplo<
(TEXTBOX (ENTGET (CAR (ENTSEL "Seleccione texto: "))))
Este ejemplo trabaja con la lista completa de un te%to; el siguiente nicamente con la
sublista de asociacin de la cadena de te%to<
(TEXTBOX '((1 . "Hola")))
'i se indica slo la lista parcial con el te%to, se utilizan los valores actuales por defecto
de los parmetros de definicin del te%to. 'i se indica la lista completa, se utilizan los
valores contenidos en ella.
Las coordenadas devueltas por TEXTBOX son el v)rtice inferior iz$uierdo y el superior
derecho del rectngulo de abar$ue, tomndose siempre como punto de insercin el
J,J,J. El primer punto nicamente es diferente de J cuando se trata de un te%to de
generacin vertical o contiene letras con astas verticales por debajo de la lnea de
base.
191

'G.'.1'. Con#truccin +e una enti+a+
(ENTMAKE [lista_entidad] )
Esta funcin permite a!adir una entidad nueva al dibujo, construyendo directamente
su lista completa en la "ase de #atos. 'i la lista introducida es correcta, devuelve esa
lista. En caso contrario devuelve nil. Las listas se indican generalmente como literales,
con QUOTE *',.
La lista debe contener todas las sublistas de asociaciones necesarias para definir
completamente cada tipo de entidad. 'i se omite alguna se produce un error. Es
posible omitir algn dato optativo y entonces se asume la opcin por defecto. As por
ejemplo si no se indica la capa, la entidad construida asume la capa actual.
:na forma cmoda de a!adir una nueva entidad a la "ase de #atos es partir de una
entidad ya e%istente, obtener su lista con ENTGET modificar y a!adir lo $ue sea preciso
y crear la nueva entidad con ENTMAKE. Esto evita tener $ue construir la lista completa
desde el programa en AutoL&'(.
El tipo de entidad debe ir siempre en ingl)s, como sabemos *por ejemplo "CIRCLE",
"LINE", "ARC", etc., y debe ser el primer o segundo elemento de la lista. Lgicamente,
todos los cdigos de las sublistas de asociaciones debern ser correctos.
(ara construir una entidad compleja como definiciones de blo$ues, referencias de
blo$ue con atributos, o polilneas no optimizadas, es preciso construir todas las listas
necesarias empleando varias veces ENTMAKE< la lista de cabecera o de la entidad
principal, las listas con cada subentidad componente y la lista final del tipo "SEQEND" o
"ENDBLK" para las definiciones de blo$ue.
Aun$ue para e%plorar todas las entidades contenidas en las definiciones de blo$ue con
ENTNEXT no es necesario buscar un tipo de entidad final *como "SEQEND" para las
polilneas y atributos, pues al llegar a la ltima ENTNEXT devuelve nil, a la hora de
construir las listas completas de la definicin de un blo$ue, es preciso a!adir como
ltima lista un tipo de entidad llamado "ENDBLK".
(or ejemplo, para construir un cuadrado como polilnea no optimizada, evidentemente
con cuatro v)rtices, en la capa actual y con color rojo *nmero 1, se podra hacer<
(ENTMAKE '((0 . "POLYLINE")
-----------(62 . 1)
-----------(66 . 1)
-----------(70 . 1)
----------)
)
(ENTMAKE '((0 . "VERTEX")
-----------(10 0.0 0.0 0.0)
----------)
)
192
(ENTMAKE '((0 . "VERTEX")
-----------(10 0.0 10.0 0.0)
----------)
)
(ENTMAKE '((0 . "VERTEX")
-----------(10 10.0 10.0 0.0)
----------)
)
(ENTMAKE '((0 . "VERTEX")
-----------(10 10.0 0.0 0.0)
----------)
)
(ENTMAKE '((0 . "SEQEND")
----------)
,
En la cabecera de la polilnea, el cdigo 66 debe ir seguido obligatoriamente del valor 1
$ue indica $ue siguen v)rtices. (ara $ue la polilnea sea cerrada, hay $ue incluir una
lista con cdigo 70 y valor 1.
NOTA: 6ambi)n se pueden construir directamente listas de objetos no grficos
mediante ENTMAKE.
(ENTMAKEX [lista_entidad] )
Esta funcin es similar a ENTMAKE, pero la entidad se crea sin propietario. 'e
suministra una lista correcta de definicin y se crea un objeto, grfico o no grfico.
(ero al no tener propietario, este objeto no se escribe en los archivos .DWG o .DXF.

'G.'.1(. 6ane-o +e ta,$a# +e #Hm,o$o#
E%iste una serie de funciones especficas para gestionar los objetos no grficos de
AutoCAD. Es posible modificar algunos de los datos de estos objetos, aun$ue la
mayora de ellos no se pueden crear e%presamente mediante ENTMAKE El grupo de
objetos de diccionario se denomina as por contener el tipo de smbolo DICTIONARY y
aparecer en los formatos de intercambio #2O en ese grupo. (ero en realidad contiene
dos tipos de objetos no grficos incorporados en la .ersin /3 de AutoCAD< estilos de
lnea mltiple y grupos de seleccin.
.eremos a continuacin dichas funciones.
(TBLNEXT nombre_tabla [retroceso] )
Esta funcin devuelve una lista con el contenido de la tabla de smbolos cuyo nombre
se indi$ue. El nombre tiene $ue ser "LAYER", "LTYPE", "VIEW", "STYLE", "BLOCK",
"UCS", "VPORT", "DIMSTYLE" o "APPID", $ue son los nicos admitidos. La funcin
193
devuelve la primera tabla de smbolos e%istente de ese tipo, la primera vez $ue se
utiliza. #espu)s va devolviendo las siguientes conforme se utiliza repetidamente.
(or ejemplo, en un dibujo con tres capas< 0, PIEZA y OCULTAS, TBLNEXT se utilizara
tres veces para obtener las caractersticas de las tres capas. Al escribir<
(TBLNEXT "layer")
se devuelve<
((0 . "LAYER")
(2 . "0")
(6 . "CONTINUOUS")
(70 . 0)
(62 . 7)
)
La capa 0 tiene asociados un tipo de lnea CONTINUOUS y un color 7 *blanco,.
Empleando de nuevo TBLNEXT se devuelve la siguiente definicin de capa. Al escribir<
(TBLNEXT "layer")
se devuelve<
((0 . "LAYER")
(2 . "PIEZA")
(6 . "CONTINUOUS")
(70 . 0)
(62 . 1)
)
La capa PIEZA tiene asociados un tipo de lnea CONTINUOUS y un color 1 *rojo,. (or
ltimo, al escribir<
(TBLNEXT "layer")
se devuelve<
((0 . "LAYER")
(2 . "OCULTAS")
(6 . "TRAZOS")
(70 .3)
)
La capa OCULTAS tiene asociados un tipo de lnea TRAZOS y un color 3 *verde,.
'i se empleara TBLNEXT para la tabla LAYER por cuarta vez, se devolvera nil puesto
$ue ya no e%isten ms definiciones de capas.
(ara e%aminar los componentes de la definicin de un blo$ue, se accede a su tabla de
smbolos mediante (TBLNEXT "block") o TBLSEARCH *$ue ahora veremos,. El cdigo
194
-2 de la lista devuelta, contiene el nombre de la primera entidad de la definicin del
blo$ue. 'e obtiene y se suministra a ENTNEXT, de manera $ue sucesivos ENTNEXT van
devolviendo todas las listas de los componentes del blo$ue, hasta $ue al llegar a la
ltima ENTNEXT devuelva nil.
'i el argumento retroceso no se omite y tiene un valor diferente de nil la funcin
TBLNEXT empieza a buscar desde la primera tabla de smbolos.
(TBLSEARCH nombre_tabla s!mbolo [siguiente] )
Esta funcin busca en el tipo de tabla $ue se indi$ue, el nombre de smbolo
especificado a continuacin y devuelve la lista correspondiente. #e esta forma se
puede buscar por ejemplo directamente la lista correspondiente a la capa llamada
PIEZA, haciendo<
(TBLSEARCH "layer" "pieza")
7ormalmente se utiliza para determinar si e%iste una capa, un estilo de te%to, etc)tera.
En el ejemplo siguiente se controla la e%istencia de carga de un tipo de lnea<
(TBLSERACH "LTYPE" "Vas")
'i el tipo de lnea e%iste se devuelve su lista de definicin, si no e%iste se devuelve
nil. Esto puede ser muy til, ya $ue, como sabemos por ejemplo, el tipo de lnea no
se representa en la definicin de una entidad si es PorCapa, por lo $ue no surtir
efecto alguno el $ue un usuario intente asignar, mediante un programa, dicho tipo de
lnea a una entidad si no est cargado. 7os preocuparemos de comprobar su e%istencia
para emitir un mensaje de error si no estuviera cargado.
'i se pretendiera acceder a la definicin de un estilo de te%to definido en el dibujo y
llamado TS1, haciendo (TBLSEARCH "STYLE" "TS1"), podra ser devuelta la siguiente
lista<
((0 . "STYLE")
(2 . "TS1")
(3 . "ROMANS")
(4 . "")
(70 .0)
(40 . 0.0)
(41 . 1.0)
(50 . 0.0)
(71 . 0)
)
El contenido de la tabla informa $ue el estilo est basado en la fuente o tipo de letra
ROMANS, con altura 0, factor de proporcin 1, ngulo de inclinacin 0 y generacin
normal.
195
'i el argumento siguiente no se omite y tiene un valor diferente de nil el contador
de TBLNEXT se ajusta de manera $ue la pr%ima llamada de TBLNEXT buscar la
siguiente tabla a la obtenida por TBLSEARCH.
(TBLOBJNAME nombre_tabla s!mbolo )
"usca en la tabla indicada el nombre de smbolo especificado, devolviendo el nombre
de entidad de dicha tabla *recordemos $ue la funcin anterior haca lo mismo pero
devolva la lista completa,. A pesar de no ser objetos grficos, las tablas de smbolos
pueden gestionarse mediante ENTGET y ENTMOD como si fueran entidades grficas. (ara
ello se necesita suministrar su nombre de entidad *cdigo -1, y )ste es el $ue obtiene
TBLOBJNAME. Este mecanismo permite modificar directamente en la "ase de #atos el
nombre de un estilo de te%to, el color asociado a una capa, etc. =uy interesante;
adems puede utilizarse como la anterior para controlar la e%istencia de este tipo de
objetos.
(SNVALID nombre_tabla [indicador] )
Esta funcin comprueba la validez de los caracteres del nombre de tabla de smbolos.
'i es un nombre vlido devuelve T y en caso contrario nil. Los nombres deben
contener slo caracteres alfanum)ricos y caracteres especiales como el de dlar $,
guin de subrayado _ y guin normal -. 6ambi)n muy utilizado a la hora de comprobar
si los nombres son vlidos.
(NAMEDOBJDICT)
Esta funcin es bsica para acceder a todos los objetos no grficos del grupo de
diccionarios. #evuelve el nombre de entidad del diccionario de objetos no grficos del
dibujo actual. 'e utiliza en las funciones de e%ploracin de esos objetos DICTNEXT y
DICTSEARCH.
(DICTNEXT nombre_diccionario [retroceso] )
#evuelve la lista con el contenido de objetos no grficos del grupo de diccionarios. El
nombre de diccionario suministrado debe haberse obtenido previamente mediante
NAMEDOBJDICT. La funcin devuelve el primer objeto de diccionario cuando se utiliza
por primera vez. #espu)s devuelve sucesivamente los dems objetos no grficos hasta
el ltimo, tras el cual devuelve nil. 'u funcionamiento es similar a TBLNEXT.
Actualmente, los dos nicos objetos no grficos accesibles en el grupo de diccionarios
son los estilos de lnea mltiple ACAD_MLINESTYLE y los grupos de seleccin
ACAD_GROUP, por lo $ue DICTNEXT devolver dos listas< la primera con los nombres de
todos los estilos de lnea mltiple creados y la segunda con los nombres de todos los
grupos de seleccin creados.
'i el argumento retroceso no se omite y tiene un valor diferente de nil la funcin
DICTNEXT empieza a buscar desde el primer objeto no grfico de diccionario.
(DICTSEARCH nombre_diccionario s!mbolo [retroceso] )
196
Esta funcin busca en el grupo de diccionarios el tipo de objeto no grfico indicado en
s!mbolo y devuelve la lista correspondiente. El tipo de objeto slo puede ser
"ACAD_MLINESTYLE", para los estilos de lnea mltiple, y "ACAD_GROUP", para los
grupos de seleccin. La lista devuelta es la misma $ue en DICTNEXT.
'i el argumento siguiente no se omite y tiene un valor diferente de nil el contador
de DICTNEXT se ajusta de manera $ue la pr%ima llamada de DICTNEXT buscar la
siguiente tabla a la obtenida por DICTSEARCH.
(DICTADD nombre_diccionario s!mbolo nuevo_ob%eto )
A!ade el nuevo objeto no grfico al diccionario especificado. Los objetos no grficos
son estilos de lnea mltiple y grupos de seleccin. El argumento s!mbolo es el nombre
clave del objeto $ue se va a a!adir.
(DICTREMOVE nombre_diccionario s!mbolo )
Elimina el objeto no grfico indicado en s!mbolo del diccionario especificado.
(DICTRENAME nombre_diccionario s!mbolo_antiguo s!mbolo_nuevo )
+ambia el nombre de la entrada representada por s!mbolo_antiguo, por el nuevo
nombre indicado a continuacin en el diccionario especificado en primer lugar.

'G.'.14. =uncione# re$ati/a# a +ato# e2ten+i+o#
En AutoCAD, al emplear aplicaciones A#' o A12, en la "ase de #atos del dibujo se
a!ade un nuevo tipo de tabla de smbolos llamado "APPID". +ada tabla de este tipo
contiene el nombre de una aplicacin A#' o A12 utilizada para datos e%tendidos de
entidades. #e esta forma, cada tipo de aplicacin puede a!adir los datos necesarios
para su funcionamiento a las entidades de AutoCAD. +omo en los dems casos, estos
datos son accesibles a trav)s de listas de asociaciones. (ara distinguirlos del resto
comienzan con el cdigo -3.
(REGAPP nombre_aplicacin )
Esta funcin registra un nombre de aplicacin e%terna en el actual dibujo de AutoCAD.
1egistrando las aplicaciones con un nombre, es posible despu)s acceder a los datos
e%tendidos de las entidades. 'i el registro de la aplicacin es correcto, REGAPP
devuelve el nombre registrado. En caso contrario *por ejemplo al especificar un
nombre de aplicacin $ue ya e%iste,, devuelve nil. El nombre puede contener hasta
3/ caracteres alfanum)ricos y algunos especiales como dlar $, subrayado _ y guin -.
:na vez registrado, el nombre de la aplicacin se a!ade en la "ase de #atos como un
tabla de smbolos del tipo "APPID".
'i en la funcin ENTGET se especifica una lista de nombres de aplicaciones registrados
con REGAPP, la lista devuelta incluye tambi)n el cdigo -3 $ue es el denominado
entinela o indicador de $ue la entidad contiene datos e%tendidos, y todas las listas de
197
datos $ue siguen a dicho cdigo. Estos datos se encuentran asociados a cdigos de
1000 a 1071. Los datos e%tendidos propios de AutoCAD 14 se obtienen indicando
como nombre de aplicacin el de "ACAD". (or ejemplo<
(ENTGET (ENTLAST) '("acad"))
'lo algunos tipos de entidades contienen en AutoCAD datos e%tendidos, como por
ejemplo las ventanas grficas, los blo$ues de sombreados, las cotas, directrices y
tolerancias geom)tricas.
(XDROOM nombre_entidad )
XDROOM devuelve el espacio de memoria disponible para los datos e%tendidos de la
entidad cuyo nombre se indica. El espacio m%imo disponible para cada entidad es de
/C3E3 octetos. El valor devuelto por XDROOM es entonces la diferencia entre este
m%imo y lo $ue ocupan las datos e%tendidos ya e%istentes para la entidad. (or
ejemplo<
(XDROOM (ENTLAST))
podra devolver<
16264
(XDSIZE lista_datos_extendidos )
#evuelve la longitud, en octetos o bytes, $ue la lista indicada ocupa cuando es a!adida
como datos e%tendidos de una entidad. Es complementario del anterior XDROOM y se
utiliza para controlar cunto van ocupando en memoria los datos e%tendidos de una
entidad.
La lista debe contener un nombre de aplicacin previamente registrado con REGAPP. 'i
e%isten varios nombres de aplicaciones, se forma una lista $ue englobe a las dems
*por ejemplo con LIST,.
Kasta a$u todas las funciones relacionadas directamente con el acceso a la "ase de
#atos de AutoCAD 14. A continuacin, estudiaremos cuatro ejemplos de programas
completos $ue nos ayudarn a la comprensin prctica de este tema.
El primer ejemplo $ue veremos se corresponde con un programa $ue permite distribuir
un te%to indicado por el usuario a lo cargo de cual$uier entidad de condicin curva, sea
arco, crculo, elipse, polilnea o spline, y8o de lneas. El listado del programa se
encuentra en este archio.
El programa tiene el siguiente funcionamiento. El comando nuevo de AutoCAD
TXCURVA, llama primero a la funcin datos_txcurva y despu)s a txcurva.
La funcin de datos solicita en primer lugar la altura del te%to y la separacin entre el
te%to y la curva en la cual se va a alinear. :n valor positivo deja al te%to a un lado o
Fpor encimaF y un valor negativo por el otro lado o Fpor debajoF, siempre segn el
198
sentido de creacin de la curva. (ara ambos datos, ofrece como valores por defecto los
ltimos utilizados *cosa $ue ya hemos estudiado con otros ejemplos,.
El programa crea un blo$ue $ue le resulta necesario para insertarlo con el comando
GRADUA *MEASURE,. Este blo$ue contiene simplemente un punto y se le da el nombre
de $txcurva. El carcter $ al principio es para distinguirlo de otros blo$ues $ue pueda
contener el dibujo. Este blo$ue ser limpiado al final se la rutina. (rimero se
comprueba mediante TBLSEARCH si ya e%iste.
(ara el espaciado entre caracteres el programa tiene en cuenta el estilo actual,
e%trado de la variable de AutoCAD TEXSTYLE. El cdigo 41 contiene la anchura del
estilo. El producto de ese factor por la altura y una cantidad de 1.2 es el espaciado
entre caracteres. 'e trata de un clculo estimativo. El valor adecuado depender del
estilo de te%to. =s adelante se tendrn en cuenta determinados caracteres como "i",
"l", "j", etc)tera para modificar ese espaciado.
'e solicita designar la entidad para alinear el te%to. 'e establece un control por si se
falla en la designacin. La funcin ENTSEL slo permite designar una entidad. A
continuacin se e%trae el tipo de entidad *cdigo 0, y se almacena en tent. 'i el tipo
de entidad no es una de las vlidas para graduar, se visualiza un mensaje de
advertencia y se vuelve a solicitar.
'e llama al comando GRADUA, con el espaciado entre caracteres calculado ms arriba, y
se inserta el blo$ue $txcurva alinendolo con la curva. +on SSGET "_p" se almacena
el conjunto de puntos de graduacin, y se averigua su nmero en lconj. 'e utiliza
lontx para controlar el nmero m%imo de caracteres $ue caben a lo largo de la
curva. 'e ofrece esa informacin al usuario y se solicita el te%to $ue se alinear
*cadtx,. 'e almacena su longitud en lontx y si es superior a la m%ima, se vuelve a
solicitar.
(or su lado, en la funcin txcurva se inicializa la variable ntx $ue controla el nmero
de orden de cada carcter en la cadena de te%to para alinear, y desig $ue almacena
un conjunto de seleccin vaco con SSADD.
A continuacin se establece un ciclo $ue se repetir tantas veces como caracteres haya
en la cadena de te%to. 'e e%traen de la cadena los caracteres uno a uno. 'e averigua
en el conjunto de blo$ues de punto el punto de insercin *cdigo 10, y el ngulo de
insercin *cdigo 50,, mediante el mecanismo con SSNAME, ENTGET y ASSOC $ue ya
conocemos.
El punto de insercin de cada carcter se calcula a partir del punto de insercin del
blo$ue, llevando en perpendicular una distancia igual a la separacin indicada por el
usuario. 'i el carcter es estrecho *"l", "i", "I", "j" o "1",, se desplaza
previamente el punto de insercin hacia delante una se%ta parte de la altura del te%to.
'i es "m", se desplaza hacia atrs. +on esto se persigue $ue esos caracteres no se
solapen o se $ueden ms pegados al precedente $ue al siguiente. 'e traslada el ngulo
de rotacin de radianes a grados, puesto $ue as hay $ue indicarlo en el comando
TEXTO. 'e van insertando los caracteres uno a uno. 'e a!ade cada uno al conjunto de
seleccin desig para poder almacenar mediante el comando DESIGNA dicho conjunto.
Esto permitir referirse posteriormente a todo el te%to a la vez con el modo "revio.
199
(or ltimo se borran todas las inserciones del blo$ue y se redibuja. El resto de
mecanismos de control de errores y dems ya est lo suficientemente e%plicado.
El segundo programa traza una lnea de tubera en tres dimensiones. 6uberas y codos
se generan mediante mallas. El trazado deber haber sido previamente mediante
lneas *slo lneas,, de forma $ue los e%tremos de los tramos se to$uen. El listado en el
siguiente archio.
La funcin inic_tubos solicita la designacin de lneas $ue son los ejes del trazado de
tubos, una a una y en orden. Establece un control con WHILE para garantizar $ue se ha
designado alguna entidad. E%amina el conjunto designado para rechazar las entidades
$ue no sean lneas. 'i no e%isten lneas o slo hay una, visualiza mensajes de
advertencia. Al final, el conjunto lin contiene nicamente las entidades de lnea
se!aladas por el usuario.
La funcin datos_tubos va solicitando los datos necesarios. En primer lugar el
dimetro e%terior de los tubos, despu)s el de los codos *ofreciendo como opcin por
defecto el mismo $ue para los tubos y evitando $ue sea menor $ue el de ellos,. Las
variables almacenan en cada caso el valor de los radios. A continuacin se pide el radio
interior de curvatura del codo. (or ltimo la precisin del mallado para las superficies
de cada tubo.
Las curvas de apoyo para el trazado se situarn en una capa cuyo nombre se forma
con el de la capa actual y un prefijo $cA.
'e toman los tres primeros puntos de la conduccin *primer punto de la primera lnea
y primer y ltimo punto de la segunda lnea, y se almacenan esos puntos en el
'istema de +oordenadas de Entidad $ue es como se encuentran en la "ase de #atos.
'e trasladan esos puntos al '+( actual. 'e almacenan tambi)n los nombres de las
entidades de lnea a $ue pertenecen. (or ltimo se inicializa el contador de tramos n, y
se pone a cierto T la variable prim para controlar $ue se trata del primer tramo $ue se
dibuja.
tramo_tubos se encarga de dibujar cada tramo con su tubo y su codo. Establece el
'+( adecuado de acuerdo con el plano formado por las dos lneas $ue definen el
tramo. +alcula el ngulo formado por esas lneas en el nuevo '+( y la distancia dis del
v)rtice a la $ue termina el tubo y empieza el codo. +alcula la precisin de mallado
tabcod del codo de acuerdo con el ngulo abarcado por el mismo.
+ambia a un nuevo '+( perpendicular al anterior para trazar los crculos $ue van a
definir las mallas. Los centros de estos crculos sern los puntos en $ue empieza y
termina el tubo pri y prf. 'e trazan los crculos y se forman listas $ue contengan el
nombre de cada uno con un punto de designacin *del tipo de las devueltas por
ENTSEL,. Kay $ue tener la precaucin de trasladar los puntos al '+( actual.
El codo se va a trazar como una superficie de revolucin y esto obliga a dibujar el eje y
almacenarlo tambi)n como una lista con nombre y punto de designacin. 'i se trata
del primer tramo, o bien si el dimetro del codo es igual al de la tubera, entonces se
evita dibujar las mallas de transicin entre ambos dimetros, $ue visualizan el espesor
del codo.
200
:na vez trazadas todas las curvas, se generan las mallas con SUPREGLA y SUPREV. 'e
cambian las curvas de apoyo a la capa capl. :na vez recorrido el primer tramo se
cambia la variable de control prim a nil para el resto de tramos.
act_tubos se encarga de actualizar los valores de las variables para empezar el nuevo
tramo en la repetitiva. Almacena la distancia dis de final del ltimo tramo para
utilizarla en disant como distancia de principio del nuevo tramo. +alcula los puntos
necesarios para obtener el '+( del plano formado por las dos lneas del nuevo tramo y
suma uno al contador n.
La subrutina tramof_tubos dibuja el tramo final, alterando el orden de los puntos
utilizados para formar el '+( adecuado. #ibuja los ltimos crculos y obtiene las mallas
correspondientes. (ara obtener los puntos necesarios, siempre se parte del '+E de la
"ase de #atos y de su traslado al '+( actual.
c:tubos es la funcin $ue compone el comando de AutoCAD. Llama a la funcin
inic_tubos y establece una condicin. 'i el usuario ha designado ms de una entidad
de lnea, entonces pueden trazarse los tubos. En caso contrario se visualiza un
mensaje *No vale*.
(or lo dems, funciones de control de errores y dems.
.eamos un tercer ejemplo $ue maneja un cuadro de dilogo. El siguiente programa
acta como DDMODIFY a pe$ue!a escala, es decir, permite modificar las propiedades de
una entidad y8o visualizarlas, pero en este caso slo de crculos. +oncretamente se
puede actuar sobre las coordenadas del centro del crculo, su radio, capa, tipo de lnea
y color. .eamos primeramente el dise!o en #+L *en este archio, y el aspecto del
cuadro de dilogo en cuestin<
El cuadro es este<
El programa en AutoL&'( est en este archio.
201
'e define un nuevo comando MODICIR y una abreviatura MC a )l. 6ras la declaraciones
de rigor, el programa llama a la funcin Datos, en la cual se nos pide designar un
crculo. 'e comprueba si realmente es un crculo e%trayendo el par punteado de su
nombre; si no lo es se vuelve a realizar la pregunta y, si s es un crculo, se llama a la
funcin Cuadro.
Cuadro carga el letrero de dilogo y rellena sus casillas accediendo a la lista de la
entidad. En el caso del punto del centro, se distingue entre tomar las coordenadas de
la lista de la entidad designada o del punto designado mediante el botn Desi#nar
punto N, dependiendo pues si se entra al cuadro por primera vez o tras haber
designado un nuevo centro. :na vez hecho esto se establecen las correspondencias de
los ACTION_TILE.
La funcin Designar permite designar un nuevo centro y vuelve al cuadro. 1ecu)rdese
la t)cnica ya comentada de asignar una variable a lo devuelto por START_DIALOG y de
hacerla nil al entrar al cuadro para $ue no d) problemas. 6ambi)n hemos de tener
presente la posibilidad de cargar o no cargar el cuadro, dependiendo de si ya lo
estuviera por$ue se viene de Designar, o si no lo estuviera por$ue se acaba de
ejecutar el comando.
6ras pulsar el botn Aeptar se nos manda a la subrutina Tiles, la cual lo primero $ue
hace es llevarnos a ControlDCL. ControlDCL controla si alguna casilla del letrero est
vaca. 'i as fuera, se muestra un mensaje de error, se resalta la casilla y da valor T a
la variable ErrorDCL, $ue hace $ue el cuadro no se cierre al establecer esa condicin
en el ACTION_TILE para accept.
#espu)s de ControlDCL seguimos en Tiles. En esta subrutina se asignan los valores
correspondientes a cada una de las variables implicadas, e%tray)ndolo de los propios
tiles. En el caso del radio se comprueba $ue no sea cero o negativo; si as fuera se
establece ErrorDCL a T para lo mismo $ue lo e%plicado anteriormente. En el caso del
tipo de lnea y del color, se comprueba $ue el tipo est) cargado y $ue el color no sea
menor de J ni mayor de BHC, respectivamente. L se hace lo propio con ErrorDCL.
6ras acabar a$u, nos vamos a Aceptar, $ue se encarga de modificar la lista y
sustituirla en la "ase de #atos. En los casos del centro, el radio y la capa no hay
problema alguno, simplemente hay $ue sustituir una lista por otra. (ero en el caso del
tipo de lnea y el color, el problema se presenta.
'i el tipo de lnea es PorCapa, en la lista de definicin de la "ase de #atos el par
punteado correspondiente no aparecer, por lo $ue habr $ue a!adirlo *APPEND,. (ero
si es distinto de PorCapa, el par punteado s aparece, as $ue habr $ue sustituirlo
*SUBST,. En el caso del color ocurre e%actamente lo mismo.
(or ltimo, se introducen los cambios en la "ase de #atos y se cierra el cuadro.
El resto corresponde a lo $ue ya conocemos< control de errores AutoL&'( y otras
caractersticas de relleno.
202
El ltimo ejemplo dice relacin a un programa $ue permite juntar dos curvas splines en
una sola. La nica condicin es $ue deben tocarse. 'e pueden juntar sucesivas splines
dos a dos. .eamos el listado en este archio<
El programa utiliza el comando EDITSPLINE con la primera spline y, mediante la opcin
Ajustar, subopcin aadir, va a!adiendo todos los puntos de ajuste de la segunda
spline. Las tangencias en el punto de contacto de ambas splines se pierden. 'egn cul
de las dos se se!ale primero, la curva final resultante diferir ligeramente. Esto se
hace apreciable sobre todo en el primer tramo de la segunda spline $ue se junta.
La funcin inicial solicita se!alar las splines $ue unir. 'e establece mediante WHILE un
primer control para obligar al usuario a $ue se!ale al menos una entidad. La funcin
ENTSEL se utiliza para se!alar una nica entidad por un punto. :na vez se!alada una
entidad, es preciso comprobar $ue se trata de una spline. Esto se hace accediendo a la
"ase de #atos y e%trayendo el tipo de entidad, asociado al cdigo 0. Adems, podra
tratarse de una spline cerrada, en cuyo caso no sera posible juntarle a otra. Las
splines de este tipo tienen un valor impar asociado al cdigo 70. (or eso se e%trae
dicho valor, se divide entre 2 y se obtiene el resto mediante REM. 'i es 1 significa $ue el
valor es impar y por lo tanto una spline cerrada.
En resumen, si la entidad se!alada por el usuario no es spline, o es una spline cerrada,
entonces se vuelve a solicitar su designacin. +uando se obtiene una entidad correcta,
su nombre de identificacin *e%trado con CAR, se almacena en splb. A continuacin se
solicita se!alar la spline para juntar. 'e establecen los mismos controles, pero se
a!ade otra posibilidad. 'i la entidad se!alada es un spline no cerrada, se comprueba si
se trata de la misma curva se!alada en primer lugar. Esto se hace comparando los dos
nombres de identificacin splb y splj. 'lo cuando no sean iguales, se aceptar la
segunda spline.
La funcin para juntar e%trae las listas en la "ase de #atos de ambas splines mediante
ENTGET y las almacena en lisb y lisj. Los v)rtices de ajuste se encuentran en
sucesivas sublistas con cdigo 11. =ediante MEMBER se e%trae el resto de lista a partir
de la primera aparicin de un v)rtice. As, la lista lisv contiene las coordenadas de
todos los v)rtices en sublistas asociadas al cdigo 11. El nmero de v)rtices de ajuste
se obtiene de la sublista asociada al cdigo 74. Los v)rtices e%tremos, $ue son el
primero y ltimo de la spline se obtienen mediante NTH. 'e almacenan en pb1 y pb2.
La misma operacin se realiza con la lista de la segunda spline $ue se juntar a la
primera. 'us datos se almacenan en las mismas variables, pues los de la primera
spline ya no interesan, una vez obtenidos sus v)rtices e%tremos. As, lisv contendr la
lista con sublistas de v)rtices, numv el nmero de v)rtices y pj1 y pj2 los v)rtices
e%tremos de la segunda spline.
'e utiliza COND para e%aminar las cuatro posibilidad y ver por $u) e%tremos se tocan
las splines. 'i no se tocan, se visualiza un mensaje y se aborta el programa mediante
QUIT. En funcin de $u) e%tremos se to$uen, se invierte la lista de v)rtices o se
modifica pb2 para $ue almacene siempre el punto de contacto. 'e utiliza EQUAL para
comparar la igualdad de puntos, estableciendo una cifra de apro%imacin.
203
El mecanismo de unin de las splines va a ser el siguiente< mediante el comando
EDITSPLINE se designa la primera curva. 'e utiliza la opcin Ajustar y dentro de ella
la subopcin aadir. 'e se!ala el v)rtice de contacto como punto a partir del cual
a!adir los dems, y se van proporcionando en orden todos los v)rtices de la segunda
spline $ue $uedan as incorporados a la primera. (ero como el nmero de v)rtices es
variable, la e%presin debe formarse concatenando una cadena de te%to $ue despu)s
ser convertida en e%presin de AutoL&'( y evaluada mediante el mecanismo (EVAL
(READ expr)) ya estudiado, $ue comentamos en su momento de pasada y a$u lo
vemos en accin.
Los v)rtices se suministran e%tray)ndolos de la lista lisv con NTH y CDR. :na vez
a!adidos todos los v)rtices de la segunda spline a la primera, se borra a$u)lla
mediante ENTDEL. 'e redibuja la spline global resultante mediante REDRAW. 'i las
splines tienen muchos v)rtices, la operacin de juntar puede llevar unos cuantos
segundos de tiempo.

1E; 4a#e interme+ia +e e-ercicio#
1ealizar un programa $ue facilite la modificacin global de las propiedades de varios
te%tos a la vez.
1ealizar un programa $ue permita juntar dos polilneas 3# en una sola.
#ise!ar un programa $ue haga resaltar las inserciones de todos los blo$ues de un
dibujo utilizando la generacin de vectores virtuales *e%plicado esto en la seccin
18.2.,. Las inserciones sern resaltadas poni)ndolas en relieve mediante vdeo inverso
y, al mismo tiempo, visualizando una flecha virtual $ue se!ale el punto de insercin de
cada blo$ue.
'1. ACC&SO A ARCAIOS
"ajo esta seccin vamos a estudiar una importante aplicacin de los programas en
AutoL&'(, esto es, la posibilidad de gestionar directamente archivos de te%to A'+&&.
6odo lenguaje de programacin $ue se precie goza de esta caracterstica, ya $ue le
permite acceder a un archivo de te%to para leerlo, crearlo o modificarlo.
'i nos damos cuenta, la totalidad de los archivos $ue hemos venido estudiando en este
curso como archivos de personalizacin, .MNU, .LIN, .PAT, .AHP, .SCR, etc)tera, son
archivos de te%to A'+&&. Es por ello, $ue desde un programa en AutoL&'( podremos
acceder a sus lneas en cual$uier momento, as como crear archivos propios de una
manera automtica.

204
'1.1. =un+amento terico #omero #o,re e$
acce#o a arc3i/o#
A grandes rasgos, los archivos o ficheros de te%to o datos a los $ue podemos acceder
desde la mayora de los lenguajes de programacin son dos< archivos de acceso
secuencial y archivos de acceso aleatorio o directo. La diferencia principal entre ambos
estriba en la forma en la $ue almacenan los datos. (or un lado, los archivos de acceso
secuencial guardan la informacin secuencialmente, es decir, dato tras dato
organizados todo ellos en una serie de lneas. 6ras cada lnea se reconoce un retorno
de carro con salto de lnea *INTRO, y al final del archivo un marca de fin de archivo.
'on archivos A'+&& $ue si se abren con cual$uier editor se pueden e%aminar
fcilmente.
(or otro lado, los archivos de acceso directo tienen una forma ms eficaz de almacenar
la informacin. En la teora del acceso a estos archivos entra en juego el concepto de
ampo lave. Los datos son guardados segn un campo clave o principal $ue los
ordena basndose en su condicin. #e esta forma, una serie de registros almacenados
segn un campo clave num)rico, sern introducidos en el archivo en su posicin
correcta, nica e ine$uvoca.
+omo norma general pues, los programas $ue manejen archivos de acceso aleatorio o
directo llegarn mucho antes a la informacin buscada por el usuario, mientras $ue los
programas $ue manejen archivos de acceso secuencial vern incrementado su tiempo
de acceso, ya $ue han de recorrer todo el fichero hasta dar con la informacin
buscada. 'in embargo, este ltimo tipo de archivos ocupa bastante menos espacio en
disco, por la no organizacin de sus registros *unos detrs de otros,, mientras $ue los
archivos de acceso directo ocupan ms espacio, ya $ue los datos se escriben
ordenados segn dicho campo clave, dejando espacio para los registros vacos an no
rellenados.
AutoL&'( slo es capaz de acceder a ficheros de acceso secuencial. Estos ficheros,
pueden ser archivos de te%to como un archivo de men o de definicin de tipos de
lnea, o ficheros de datos -tambi)n de te%to A'+&&- $ue contengan, por ejemplo,
coordenadas de puntos de un levantamiento topogrfico *tpico fichero de salida de
una estacin total, por ejemplo,.
Los ficheros o archivos de te%to $ue no guarden datos divididos en campos y registros,
estarn escritos como su autor lo $uiso hacer, sin ningn orden lgico aparente. 'in
embargo, los ficheros de datos de salida de muchos utensilios *instrumentos
topogrficos, m$uinas de control num)rico, etc., o programas *bases de datos, hojas
de clculo o el propio AutoCAD, s guardan una estructura tipificada y normalizada. La
mayora de ellos dividen sus registros *lneas, por retornos de carro con salto de lnea
*INTRO, y separan sus campos *columnas, por algn carcter especial< una coma
*formato +#O,, un espacio blanco *formato '#O,, u otros. Adems, los campos suelen
estar encerrados entre comillas dobles o simples si son cadenas o sin ningn carcter
delimitador si son campos num)ricos. 9tros ficheros, separarn registros y campos, o
encerrarn datos, con cual$uier otro carcter o t)cnica.
'ea cual fuere la opcin o el tipo de fichero, el programador en AutoLISP habr de
e%aminar antes bien su contenido para estudiar la forma de llegar a e%traer los datos
necesarios del mismo.
205
(or ltimo decir $ue e%isten tres formas bsicas de acceder a un fichero *enseguida
veremos cmo se hace en AutoL&'(, desde los lenguajes de programacin< la de
lectura, en la $ue un imaginario puntero se coloca al principio del archivo
e%clusivamente para leer datos; la de escritura, en la $ue el puntero se coloca tambi)n
al principio para escribir datos, eliminando los $ue ya hay; y la de a!adir datos, en la
$ue el puntero se coloca al final del archivo para agregar datos al mismo, sin afectar a
lo $ue ya est guardado. Es muy importante tener esta ltima caracterstica en cuenta
para evitar errores fatales para el usuario.

'1.'. =uncione# %ara e$ mane-o +e arc3i/o#
A continuacin iremos describiendo cada una de las funciones de las $ue disponemos
en AutoL&'( para acceder y8o manejar ficheros. +omenzaremos evidentemente por la
manera de abrir uno de estos archivos. (ara ello debemos recurrir a la funcin
inherente OPEN, cuya sinta%is es<
(OPEN nombre_arc+ivo modo )
Esta funcin abre un archivo para permitir el acceso a las funciones de entrada y salida
de AutoL&'(. OPEN devuelve un valor de descriptor de archivo $ue posteriormente
utilizaremos para acceder a )l, por lo $ue la prctica lgica consistir en guardar dicho
descriptor para ser posteriormente utilizado. .iene a ser algo parecido $ue lo $ue
hacamos con la funcin LOAD_DIALOG para guardar el ndice devuelto y luego usarlo en
el acceso al cuadro de dilogo.
El nombre de archivo $ue proporcionamos a OPEN ser una cadena entrecomillada en la
$ue se especificar el nombre, y en su caso *si no se encuentra en el directorio actual,
la ruta de acceso completa, del archivo o fichero en cuestin. (or su lado, el
argumento modo, indica la manera en $ue se abrir el archivo, segn la tabla siguiente
*el modo tambi)n se indica entre comillas dobles,<
Argumento "o#o .. De#cri%cin
-------------------------------------------------------------------------
-----------
"r" AAAAAAAAAAAAAAAA Abre en modo lectura. 'lo se pueden leer o e%traer datos del
AAAAAAAAAAAAAAAAAAAA archivo. 'i el archivo indicado no e%iste se devuelve nil.
"w" AAAAAAAAAAAAAAAA Abre en modo escritura. 'e escriben datos en el archivo y, si
AAAAAAAAAAAAAAAAAAAA ya e%istan otros datos, se sobreescriben. 'i el archivo indicado
AAAAAAAAAAAAAAAAAAAA no e%iste se crea.
"a" AAAAAAAAAAAAAAAA Abre en modo aditivo. 'e escriben datos en el archivo al final del
AAAAAAAAAAAAAAAAAAAA mismo, tras los datos e%istentes si hay. 'i el archivo indicado no
AAAAAAAAAAAAAAAAAAAA e%iste se crea.
.eamos varios ejemplos<
206
(SETQ Archivo (OPEN "ejemplo.txt" "w"))
(SETQ Arch (OPEN "c:/clientes/datos/text/bilbao.dat" "a"))
(SETQ Des (OPEN "a:\\move.scr" "r"))
(SETQ Archivo (OPEN "acadiso.lin" "r"))

(CLOSE descriptor_arc+ivo )
CLOSE cierra el archivo vlido abierto identificado por su descriptor de archivo *el
obtenido por OPEN,. :na vez cerrado el archivo, se devuelve nil y ya no se puede hacer
ninguna operacin con )l. El descriptor de archivo deja de ser vlido y al volver a
abrirse mediante OPEN cambiar.
Es necesario cerrar los archivos cuando ya no se van a utilizar. Ejemplo<
(CLOSE Archivo)
(READ-LINE [descriptor_arc+ivo] )
:na vez abierto un archivo para lectura, utilizaremos la funcin READ-LINE para leer
una lnea completa de dicho archivo, es decir, hasta el salto de lnea. (ara ello
deberemos indicar el descriptor de archivo $ue devolvi la funcin OPEN al abrirlo.
READ-LINE devuelve cada vez una de las lneas como cadena, es decir, entre comillas
dobles, hasta $ue al llegar al final del archivo devuelve nil.
(or ejemplo, imaginemos un archivo de te%to llamado DATOS.ML1 $ue se encuentra en
el directorio raz de un disco duro *por ejemplo C:\,. #icho archivo contiene las
siguientes lneas<
Esto es una prueba
de lectura de archivos.
(rimero pues deberemos abrirlo para lectura, guardando el descriptor de archivo en
una variable $ue llamaremos Arch<
(SETQ Arch (OPEN "c:\\datos.ml1))
A continuacin, si hacemos<
(READ-LINE Arch)
AutoL&'( devuelve<
"Esto es una prueba"
:na siguiente instruccin igual READ-LINE devolver<
"de lectura de archivos."
207
:na siguiente instruccin igual devolver nil, ya $ue se ha llegado al final del archivo.
'i se desea retornar el puntero de lectura al principio del archivo, es necesario cerrarlo
y volverlo a abrir, si no, como observamos, el puntero se sita en la siguiente lnea a la
ltima leda.
El siguiente pe$ue!o programa comprueba si el tipo de lnea TRAZO_Y_PUNTOX2 se
encuentra definido en el archivo ACADISO.LIN de AutoCAD 14<
(DEFUN C:BuscaLin ()
--(SETQ Existe nil)
--(SETQ Arch (OPEN "c:\\archiv~1\\autoca~1\\support\\acadiso.lin" "r"))
--(WHILE (SETQ Lin (READ-LINE Arch))
----(SETQ Lin (STRCASE Lin T))
----(IF (WCMATCH Lin "*trazo_y_puntox2*")
------(SETQ Existe T)
------(IF Existe () (SETQ Existe nil))
----)
--)
--(IF Existe
----(PROMPT "\nExiste.")
----(PROMPT "\nNo existe.")
--)
--(CLOSE Arch)
--(PRIN1)
)
En un principio se establece la variable Existe como nil, para futuras ejecuciones del
programa, y se abre el archivo en cuestin para lectura. 'e establece una condicional
$ue dice $ue mientras e%ista la variable Lin, $ue almacena una lnea leda del archivo,
se realiza todo lo dems. Es decir, mientras Lin tenga valor, es igual a$u a mientras
$ueden lneas por leer en el archivo. En el momento en $ue Lin valga nil *fin de
archivo, ya no se ejecutar ninguna funcin de la repetitiva condicional.
En esa repetitiva se convierte el contenido de Lin *cada lnea del archivo, a minsculas
con STRCASE y la opcin T. Esto se realiza por$ue al ser una cadena se distingue entre
maysculas y minsculas, de tal forma $ue al intentar buscar posteriormente la
subcadena trazo_y_puntox2 en Lin *con WCMATCH,, no se produzca ningn error de
interpretacin.
'i la subcadena buscada e%iste se establece Existe como T, y si no e%iste se mira si
Existe ha tomado alguna vez el valor T *ha e%istido,. 'i as fuera no se hara nada, si
no se establecera a nil.
:na vez terminado de leer el fichero, se comprueba si la variable Existe tiene valor T
o nil *e%iste o no, y se acta en consecuencia, emitiendo el mensaje adecuado. 'e
termina cerrando el archivo y con un PRIN1 para evitar el nil de CLOSE.
'i a la funcin READ-LINE no se le especifica un descriptor de archivo, lee una cadena
de te%to completa desde el teclado. As por ejemplo, si escribimos en lnea de
comandos<
(READ-LINE)
208
y ahora escribimos en la propia lnea de comandos Prueba de lectura desde
teclado., AutoL&'( devuelve<
"Prueba de lectura desde teclado.".
(WRITE-LINE cadena [descriptor_arc+ivo] )
WRITE-LINE funciona de forma inversa a READ-LINE, esto es, escribe la cadena
indicada como una lnea completa en el archivo especificado por su descriptor vlido.
Evidentemente el archivo deber estar abierto para escribir o a!adir datos,
dependiendo de la modalidad $ue nos interese.
El siguiente programa permite crear automticamente archivos de guin<
(DEFUN C:CreaSCR ()
--(SETQ NombreArchivo (GETSTRING "Introduzca nombre de archivo: "))
--(SETQ DesArchivo (OPEN NombreArchivo "a"))
--(WHILE (/= (SETQ Lnea (GETSTRING "Introduzca comando (INTRO fin): "
T)) "")
----(WRITE-LINE Lnea DesArchivo)
--)
--(CLOSE DesArchivo)
)
6ras introducir un nombre para el archivo y abrirlo, se piden continuamente los
comandos necesarios, los cuales se van escribiendo al archivo en cuestin. Al introducir
un INTRO se termina el programa -ya $ue Lnea es igual a una cadena nula *"",- y
se cierra el archivo.
En este tipo de programas es lgico introducir bastantes controles, por ejemplo para
$ue el usuario introduzca la ruta de acceso con contrabarras y el propio programa las
cambie a formato de AutoL&'(; es cuestin de jugar con las variables de manejo de
cadenas estudiadas.
WRITE-LINE devuelve la cadena en cuestin entre comillas. 'i no se indica un
descriptor de archivo, la funcin escribe la cadena, capturada desde el teclado, en la
lnea de comandos.
(READ-CHAR [descriptor_arc+ivo] )
La siguiente funcin $ue veremos, READ-CHAR, lee un carcter del archivo especificado
*abierto para lectura, por su descriptor cada vez, y devuelve su cdigo A'+&&. As por
ejemplo, si un archivo de te%to llamado EJEMPLO.DAT *en C:\, contuviera las dos
siguientes lneas<
Hola
Hola yo
y si se abriera as<
209
(SETQ Hola (OPEN "c:/ejemplo.dat" "r"))
sucesivas llamadas con READ-CHAR as<
(READ-CHAR Hola)
devolveran lo siguiente<
72
111
108
97
10
72
111
108
97
32
121
111
nil
+ada vez se lee un carcter ms y se devuelve su cdigo A'+&&. El cdigo 10
corresponde al INTRO entre las dos lneas *retorno de carro con salto de lnea,. (or
compatibilidad con :7&2, en el $ue el final de lnea es siempre el cdigo A'+&& 10,
READ-CHAR devuelve este cdigo cuando se utiliza en plataformas #9'85indo4s y se
detecta un INTRO, a pesar de $ue en realidad el cdigo A'+&& de este carcter es el 13.
.)ase la lista de cdigos A'+&& en el APNDICE $. +uando no hay ms caracteres,
READ-CHAR devuelve nil.
+omo sabemos, para volver a leer el archivo desde el principio *el puntero de lectura
se colo$ue en el inicio, deberemos cerrarlo y volverlo a abrir.
NOTA: (ara poder tratar con estos cdigos A'+&&, recu)rdense las funciones ASCII y
CHR de conversin carcter8cdigo y cdigo8carcter respectivamente, estudiadas en la
seccin 12..
'i a la funcin READ-CHAR no le acompa!a un descriptor de archivo, lee un carcter de
la memoria temporal de entrada del teclado *%uffer del teclado, y devuelve su cdigo
A'+&&. 'i el %uffer contiene varios caracteres en el momento de ejecucin de READ-
CHAR, devuelve el primero de ellos. Al igual $ue con los ficheros de te%to, sucesivas
llamadas devolvern los siguientes caracteres. 'i no hay ningn carcter en el %uffer
de teclado en dicho momento, READ-CHAR espera a $ue el usuario entre una serie de
caracteres, finalizados con INTRO. Entonces devuelve el primero de los caracteres
introducidos; los siguientes READ-CHAR devolvern el resto.
El siguiente ejemplo de READ-CHAR *combinado con READ-LINE, controla si el primer
carcter de cada lnea de un archivo .LSP es un punto y coma *;,. 'i as fuera agrega
una unidad a un contador. Al final, muestra el nmero de lneas ntegras de
comentarios $ue e%isten en el archivo<
210
(DEFUN C:Coment ()
--(SETQ Contador 0)
--(SETQ Archivo (GETSTRING "\nCamino y nombre del archivo .LSP: "))
--(SETQ Desc (OPEN Archivo "r"))
--(WHILE (SETQ Lin (READ-CHAR Desc))
----(IF (= (CHR Lin) ";")
------(PROGN
--------(SETQ Contador (1+ Contador))
--------(READ-LINE Desc)
------)
------(READ-LINE Desc)
----)
--)
--(CLOSE Desc)
--(PROMPT (STRCAT "\nEl total de lneas ntegras de comentarios es: "
(ITOA
--------------------Contador) "."))
--(PRIN1)
)
9bs)rvese la manera conjunta de trabajar READ-CHAR y READ-LINE. READ-CHAR lee el
primer carcter de la lnea, si es un punto y coma *convertido el cdigo con CHR, a!ade
una unidad al contador y con READ-LINE se lee el resto de la lnea. #e esta manera
hacemos $ue el puntero de lectura se colo$ue al principio de la siguiente lnea, con lo
$ue podemos volver a empezar. En el caso en el $ue el primer carcter no sea un
punto y coma, se realiza la misma funcin con READ-LINE pero sin incrementar el
contador.
(WRITE-CHAR cdigo_-./&& [descriptor_arc+ivo] )
WRITE-CHAR realiza la funcin inversa a READ-CHAR, es decir, escribe en un archivo cuyo
descriptor se especifica, o en pantalla si no se especifica ningn descriptor, el carcter
cuyo cdigo A'+&& se indica. Adems, devuelve este cdigo A'+&&.
As pues, si escribimos<
(WRITE-CHAR 72 Desc)
siendo Desc un descriptor vlido de archivo, en dicho archivo se escribir H, esto es, el
carcter correspondiente al cdigo A'+&& 72. 'i escribi)ramos en lnea de comandos<
(WRITE-CHAR 72)
AutoL&'( devolvera<
H72
ya $ue, como hemos dicho, escribe el carcter y devuelve el cdigo.
(or las mismas razones de compatibilidad con :7&2 $ue en el caso de READ-CHAR,
tanto el cdigo A'+&& 10 como el 13 pueden indicarse para escribir retornos de carro
con salto de lnea *INTRO, o fines de lnea.
211
.eamos ahora otras tres funciones muy tiles para escribir datos en un archivo. La
primera es PRIN1, y las otras dos derivadas *PRINT y PRINC, sin similares a ella con
alguna pe$ue!a diferencia $ue e%plicaremos. La sinta%is de PRIN1 es<
(PRIN1 [expresin [descriptor_arc+ivo]] )
Esta funcin escribe e%presiones en un archivo, si se indica un descriptor vlido, o en
la lnea de comandos, si no se indica descriptor alguno. #evuelve la propia e%presin.
A diferencia de WRITE-LINE y WRITE-CHAR, PRIN1 permite escribir cual$uier e%presin
en un fichero, sin necesidad de $ue sea una cadena de te%to. As por ejemplo, la
siguiente secuencia<
(SETQ Archivo (OPEN "c:/datos.dat" "w"))
(SETQ Mensualidad (* 2 2350))
(PRIN1 "Mensualidad" Archivo)
(PRIN1 Mensualidad Archivo)
(CLOSE Archivo)
abre un archivo para escritura. Asigna a la variable Mensualidad el valor de un
producto y, a continuacin, escribe en dicho archivo un te%to o cadena fija y el valor de
la variable e%puesta. (or ltimo, el fichero es cerrado. La apariencia ahora del archivo
#A69'.#A6 sera la $ue sigue<
"Mensualidad"4700
Es decir, las e%presiones se a!aden sin separacin de lneas o interlineado y, adems
las cadenas literales son incluidas con sus comillas dobles correspondientes, al
contrario $ue con WRITE-LINE. (or el contrario, si las e%presiones son literales con
apstrofo<
(PRIN1 'Mensualidad Archivo)
(PRIN1 '(SetQ x 5.5) Archivo)
se a!adiran como tales, pero en maysculas, evidentemente<
MENSUALIDAD(SETQ X 5.5)
'i la e%presin es una cadena con caracteres de control, PRIN1 escribe esos caracteres
con contrabarra y el nmero de su cdigo octal. (or ejemplo<
(PRIN1 (CHR 2) Archivo) escribe y devuelve "\002"
(PRIN1 (CHR 10) Archivo) escribe y devuelve "\n"
(PRIN1 (CHR 13) Archivo) escribe y devuelve "\r"
'e puede utilizar PRIN1 sin ningn argumento, $ue es lo $ue venimos haciendo en los
programas hasta ahora. #e esta forma, la funcin devuelve una cadena nula, es decir,
simplemente salta una lnea en la lnea de comandos de AutoCAD 14, sin ningn otro
mensaje. Al incluir pues PRIN1 sin argumentos como ltima e%presin de un programa,
haremos $ue su final sea FlimpioF. Esta particularidad no se puede utilizar con archivos
evidentemente.
212
NOTA: La utilidad real de PRIN1 es la de escribir e%presiones compatibles por ejemplo
con LOAD o con COMMAND, $ue llama, este ltimo, a comandos de AutoCAD cuyos
mensajes con admiten todos los cdigos A'+&&.
(PRINT [expresin [descriptor_arc+ivo]] )
6otalmente id)ntica a PRIN1, salvo $ue salta a nueva lnea antes de visualizar o escribir
la e%presin y a!ade un espacio blanco al final. La siguiente secuencia<
(SETQ Archivo (OPEN "c:/datos.dat" "w"))
(SETQ Mensualidad (* 2 2350))
(PRINT "Mensualidad" Archivo)
(PRINT Mensualidad Archivo)
(CLOSE Archivo)
escribira<

"Mensualidad"
4700
dejando la primera lnea en blanco, ya $ue antes de escribir la cadena salta una lnea
tambi)n. Al final de ambas lneas hay un espacio blanco.
(PRINC [expresin [descriptor_archivo]])
6otalmente id)ntica a PRIN1, salvo $ue los caracteres de control se escriben como
tales, no representados por su cdigo octal. Alguno de estos caracteres puede ser
representado en el archivo por un smbolo, cosa $ue apreciaremos al abrirlo con un
editor A'+&&.
A diferencia de PRIN1, la funcin PRINC escribe cual$uier carcter admitido en un
archivo de te%to y las e%presiones pueden ser ledas directamente con funciones como
READ-LINE.
(or ejemplo las siguientes inclusiones del cdigo A'+&& del salto de lnea con retorno
de carro, no aparecern en octal en el archivo, sino $ue sern caracteres INTRO
verdaderos, es decir, se producirn los saltos de lnea con sus retornos de carro<
(SETQ k (OPEN "c:/ejem1.doc" "a"))
(PRIN1 "w" k)
(PRINC (CHR 10) k)
(PRIN1 "x" k)
(PRIN1 "y" k)
(PRINC (CHR 10) k)
(PRIN1 "z" k)
El resultado ser<
213
F4F
F%FFyF
FzF
L veamos por ltimo otras dos funciones muy utilizadas.
(FINDFILE nombre_arc+ivo )
La funcin FINDFILE e%plora directorios en busca del archivo especificado. El archivo se
indica entre comillas por ser cadena. 'i se especifica sin ruta o camino de acceso,
FINDFILE buscar en los caminos de archivos de soporte incluidos en el cuadro
"referenias, en la pesta!a Ar'ivos *carpeta Camino de %OsIueda de ar'ivo de
soporte,. 'i se escribe una ruta de acceso en el argumento nombre_arc+ivo, FINDFILE
buscar el archivo en la ruta especificada.
'i la funcin FINDFILE encuentra el archivo buscado devuelve la cadena $ue indica su
camino y nombre en formato vlido de AutoL&'(, si no es as, devuelve nil.
FINDFILE se utiliza eminentemente para comprobar la e%istencia de archivos o ficheros
indicados por el usuario para ser abiertos, ya $ue de no e%istir se producira un error
en tiempo de corrida de AutoL&'(. .amos a ver un ejemplo ya e%plicado en el $ue se
ha a!adido esta nueva caracterstica; se corresponde con el programa contador de
lneas ntegras de comentarios en los ficheros .LSP<
(DEFUN C:Coment ()
--(SETQ Contador 0)
--(SETQ Archivo (GETSTRING "\nCamino y nombre del archivo .LSP: "))
--(IF (NOT (FINDFILE Archivo))
----(PROGN
------(PROMPT "\nError: el archivo especificado no existe.\n")
------(EXIT)
----)
--)
--(SETQ Desc (OPEN Archivo "r"))
--(WHILE (SETQ Lin (READ-CHAR Desc))
----(IF (= (CHR Lin) ";")
------(PROGN
--------(SETQ Contador (1+ Contador))
--------(READ-LINE Desc)
------)
------(READ-LINE Desc)
----)
--)
--(CLOSE Desc)
--(PROMPT (STRCAT "\nEl total de lneas ntegras de comentarios es: "
(ITOA
-------------------Contador) "."))
--(PRIN1)
)
(GETFILED t!tulo_letrero arc+ivo_defecto patrn_extensin modo )
214
La funcin GETFILED muestra el letrero estndar de gestin de archivos de AutoCAD
14. (uede ser muy til cuando se programe con cuadros de dilogo en #+L, ya $ue es
ms vistoso escoger un archivo de un letrero $ue escribirlo en lnea de comandos.
Esta funcin devuelve una cadena $ue contiene la ruta y el nombre del archivo
seleccionado en el cuadro. Este nombre y ruta estn en formato AutoL&'(, por lo $ue
pueden ser perfectamente guardados en una variable y posteriormente utilizados por
la funcin OPEN, por ejemplo. E%pli$uemos los argumentos.
t!tulo_letrero es una cadena $ue formar el nombre en la parte superior el
cuadro, en la barra de ttulo *azul comnmente,. 'i se indica una cadena nula *"",,
aparecer el ttulo por defecto A%rir di%u(o.
arc+ivo_defecto es el archivo $ue aparecer en la casilla Nom%re de ar'ivo: por
defecto. 'u e%tensin ser la indicada con el siguiente argumento, si se indica. 'i se
introduce cadena nula *"",, no aparecer ningn archivo por defecto.
patrn_extensin especifica la e%tensin o e%tensiones $ue admitir el cuadro. 'e
pueden indicar varias separadas por punto y coma *mnu;mns;mnl;*,, siendo la primera
de ellas la $ue aparecer primera en la lista desplegable Tipos de ar'ivos: y la $ue
aparecer por defecto en la casilla Nom%re de ar'ivo:, siempre $ue haya un archivo
indicado por defecto. 'i se indica una cadena nula *"",, se especifica el patrn Todos
los ar'ivos 39A95. Este patrn tambi)n se consigue con una cadena $ue encierre un
nico asterisco "*".
modo es un valor entero *codificado en bits, $ue condiciona el letrero segn los
valores siguientes<
a$or +e modo --------- De#cri%cin
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAA
0 7o es en realidad un valor de bit. 'e define cuando no se indica ninguno de los
siguientes. El archivo seleccionado habr de e%istir y en el botn de la derecha de la
casilla Nom%re de ar'ivo: apaArecer la leyenda A%rir, ya $ue es un cuadro para leer
de un archivo.
1 El archivo seleccionado habr de ser nuevo, es decir, ser un archivo $ue se crear.
(or lo tanto, lo lgico ser escribir un nombre de archivo no e%istente en la casilla
Nom%re de ar'ivo:, tras escoger el directorio donde se crear. A la derecha de esta
casilla la leyenda del botn adjunto ser Cuardar, ya $ue es un cuadro para escribir en
un archivo. 'i se elige un archivo e%istente aparecer un mensaje de error advirtiendo
de su e%istencia, ofreci)ndonos la posibilidad de sobreescribirlo. El valor 1 es el bit J.
2 #esactiva el botn Telearlo. Este bit se define si se llama a la funcin GETFILED
mientras otro cuadro de dilogo est activo *en caso contrario, obliga a cerrar el otro
cuadro de dilogo,. 'i no se define este bit, se activa el botn Telearlo. +uando el
usuario selecciona el botn, el cuadro de dilogo desaparece y GETFILED devuelve 1. El
valor 2 es el bit /.
215
4 (ermite al usuario escribir una e%tensin de nombre de archivo arbitraria o bien no
escribir ninguna. 'i no se define este bit, GETFILED slo acepta la e%tensin o
e%tensiones especificadas en el argumento patrn_extensin, y si el usuario la
escribe en la casilla de te%to Nom%re de ar'ivo:, la a!ade al nombre del archivo. El
valor 4 es el bit B.
8 'i se define este bit y no se define el bit J *valor 1,, GETFILED inicia en la biblioteca
una bs$ueda del nombre de archivo escrito. 'i encuentra el archivo y el directorio en
el orden de bs$ueda en la estructura, descompone el camino y slo devuelve el
nombre del archivo. Esto no ocurre si los archivos $ue se buscan tienen el mismo
nombre pero se encuentran en distintos directorios. 'i no se define este bit, GETFILED
devuelve el nombre completo del archivo, incluido el nombre del camino. #efiniremos
este bit si utilizamos el cuadro de dilogo para abrir un archivo e%istente cuyo nombre
deseamos guardar en el dibujo *u otra base de datos,. El valor 8 es el bit 3.
Los valores mencionados pueden sumarse para combinar las distintas acciones,
pudiendo pues indicar valores desde 0 hasta 15 para el argumento modo.
'i se abre un cuadro de gestin de archivos para abrir uno *con valor de modo 0, por
ejemplo, y la e%tensin patrn nica o principal *la primera, es dwg, al cuadro se le
a!ade un ane%o por la derecha para mostrar una presentacin preliminar del dibujo de
AutoCAD 14, si la tuviere.
+omo ya se ha dicho, la devolucin de TE6O&LE# est en formato AutoL&'(,
concretamente con doble contrabarra *contrabarra carcter de control y carcter
contrabarra, para separar directorios, por lo $ue una secuencia como la $ue sigue, por
ejemplo, sera totalmente vlida<
(SETQ Archivo (GETFILED "Abrir archivo ASCII" "" "txt;dat;*" 0))
(SETQ Des (OPEN Archivo "r"))

1F; 4a#e interme+ia +e e-ercicio#
+rear un programa para realizar conversiones de unidades con respecto a las
e%istentes en el archivo ACAD.UNT. (resentar un men te%tual en el $ue se podr
escoger la categora de las unidades y, posteriormente, el tipo de unidad de origen y el
de destino.
1ealizar un programa $ue permita crear de un modo automtico tipos de lnea
complejos con te%to. 'e solicitarn al usuario todos los datos necesarios y despu)s de
presentar una muestra del tipo de lnea creado. 6ras la aceptacin por parte del
usuario, se incluir la definicin en el archivo indicado por )l tambi)n.

''. =UNCION&S D& CA&1U&O
216
'e estudian ahora las funciones de AutoL&'( $ue se utilizan para e%aminar los
smbolos de los programas, sean variables de usuario, su%rs, valores concretos,
funciones, etc)tera, y detectar una caracterstica en concreto. 'e puede conocer de
este modo si un dato es cero o no, si una variable e%iste o es nil, y dems.
6odas estas funciones las hemos venido sustituyendo por otros mecanismos totalmente
lcitos y $ue, en el fondo, se utilizan ms. 'in embargo, hemos de conocerlas e incluso
veremos alguna $ue nos descubra nuevas posibilidades.
La primera $ue veremos se corresponde con la sinta%is<
(ATOM elemento )
ATOM e%amina el elemento indicado como argumento nico y devuelve T si se trata de
un tomo o nil si es una lista. 6odo lo $ue no sea una lista se considera un tomo.
.eamos algunos ejemplos<
(ATOM '(3 5)) devuelve nil
(ATOM 6) devuelve T
(ATOM k) devuelve T
(ATOM (SETQ x 6.7)) devuelve T
(ATOM '(SETQ x 6.7)) devuelve nil
(BOUNDP elemento )
Esta funcin devuelve T si el smbolo indicado est asociado a un valor distinto de nil.
El smbolo puede ser una variable, un nombre de funcin de usuario o incluso el
nombre de una subrutina de AutoL&'(. Wnicamente si el smbolo es nil, BOUNDP
devuelve nil.
(uesto $ue BOUNDP e%amina smbolos, hay $ue indicar estos sin evaluar, es decir
precedidos del carcter de QUOTE< el apstrofo *',. .eamos unos ejemplos;
supongamos las siguientes declaraciones<
(SETQ x 24)
(DEFUN FuncMi () (SETQ n (1+ n)))
(SETQ y x)
.eamos los resultados de la aplicacin de BOUNDP<
(BOUNDP 'x) devuelve T
(BOUNDP 'FuncMi) devuelve T
(BOUNDP 'y) devuelve T
(BOUNDP 'h) devuelve nil
(BOUNDP 'FuncOt) devuelve nil
(BOUNDP 'getpoint) devuelve T
Esta funcin puede resultarnos til en ciertos momentos. >uiz para saber si una
variable es nil o T no la utilizaremos nunca, ya $ue estas e%presiones son iguales<
217
(IF Radio...
(IF (BOUNDP 'Radio)...
(ero estudiemos un ejemplo< $uizs un programa necesite saber en tiempo real si una
variable a la $ue se va a dar un valor e%iste como funcin inherente de AutoL&'(.
'abemos $ue no debemos utilizar variables $ue sean nombres de funciones AutoL&'(,
ya $ue perdern, las funciones, su utilidad y valor. 'abemos tambi)n $ue e%iste la
funcin ATOMS-FAMILY $ue nos permite saber si cierta su%r e%iste o no, o incluso si un
nombre de variable est ya utilizado o no. (uede $ue ATOMS-FAMILY sea ms
engorroso de utilizar $ue BOUNDP dentro de un programa.
En estos casos podremos utilizar BOUNDP con este objetivo< conocer si una variable $ue
va a ser creada en tiempo real e%iste ya, sea de usuario o como nombre de inherente
de AutoL&'(, o no.

(LISTP elemento )
LISTP, por su lado, e%plora el elemento indicado y devuelve T en el caso de $ue se
trate de una lista y nil si no lo es. 'upongamos<
(SETQ JogtGt '(10 25 0))
(SETQ x 45)
.eamos los resultados<
(LISTP JogtGt) devuelve T
(LISTP 'JogtGt) devuelve nil
(LISTP x) devuelve nil
(LISTP (LIST y z)) devuelve T

(NUMBERP elemento )
NUMBERP e%amina el resultado de la evaluacin del elemento indicado como argumento
y devuelve T si dicho resultado es un nmero entero o real. #e lo contrario devuelve
nil. 'upongamos<
(SETQ x 25)
(SETQ a "Hola, qu tal?")
.eamos los resultados<
(NUMBERP x) devuelve T
(NUMBERP a) devuelve nil
(NUMBERP (SETQ y (+ 4.5 67))) devuelve T
(NUMBERP 'x) devuelve nil
218
:na funcin $ue puede resultar interesante a la hora de operar con ciertas variables de
las cuales no conocemos su tipo de contenido e%acto.
(MINUSP elemento )
MINUSP devuelte T si el valor del elemento indicado es un nmero real o entero
negativo. En caso contrario devuelve nil. Ejemplos<
(MINUSP -5) devuelve T
(MINUSP -1.8936) devuelve T
(MINUSP (* 2 5)) devuelve nil
(MINUSP (+ -5 6)) devuelve nil
(MINUSP (+ -5 4)) devuelve T
(MINUSP (SETQ z -78)) devuelve T
(ZEROP elemento)
ZEROP devuelte T si el valor del elemento indicado es cero; en caso contrario devuelve
nil. El resultado ha de ser num)rico, si no se produce un error bad argument type.
'upongamos<
(SETQ x 25)
(SETQ y 0)
.emos ahora los resultados<
(ZEROP x) devuelve nil
(ZEROP y) devuelve T
(ZEROP (- x x)) devuelve T
(ZEROP (* y -1)) devuelve T


(NULL elemento )
Esta funcin e%amina el valor asociado al elemento y devuelve T si dicho valor es nil.
En caso contrario devuelve nil.
E%iste una diferencia importante entre esta funcin y BOUNDP. En este caso se
e%aminan resultados de evaluacin de smbolos y no los propios smbolos. (or eso no
interesa indicar literales con NULL, puesto $ue el resultado de la evaluacin de un
literal de un smbolo es el propio nombre del smbolo. +omo ese valor no es nil, NULL
aplicado a literales devolver siempre nil.
'upongamos las siguientes igualdades y la funcin definida<
219
(SETQ x 35)
(DEFUN GoiBeh () (SETQ n (1+ n)))
(SETQ y x)
.eamos los distintos resultados<
(NULL x) devuelve nil
(NULL GoiBeh) devuelve nil
(NULL 'GoiBeh) devuelve nil
(NULL ghtF) devuelve T
(NULL w) devuelve T
.eremos ahora una funcin importante a la $ue podemos sacar mucho partido.
(TYPE elemento )
La funcin TYPE devuelve el tipo de elemento indicado. Este elemento puede ser un
smbolo, un valor concreto, una e%presin AutoL&'(, un nombre de funcin...
TYPE devuelve el nombre del tipo atendiendo a la siguiente tabla<
De/o$ucin ........ Signi4ica+o
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
REAL AAAAAAAAAAAAAAA .alor num)rico real.
INT AAAAAAAAAAAAAAA .alor num)rico entero.
STR AAAAAAAAAAAAAAA .alor te%tual *cadena alfanum)rica,.
FILE AAAAAAAAAAAAAA #escriptor de archivo.
PICKSET AAAAAAAAAA +onjunto de seleccin de AutoCAD.
ENAME AAAAAAAAAAAA 7ombre de entidad de AutoCAD.
SYM AAAAAAAAAAAAAAA 'mbolo *variable,.
LIST AAAAAAAAAAAAAA Lista o funcin de usuario.
SUBR AAAAAAAAAAAAAA Ouncin inherente de Autolisp o subrutina.
PAGETB AAAAAAAAAAA 6abla de paginacin de funciones.
EXSUBR AAAAAAAAAAA 'ubrutina e%terna.
'upongamos las siguientes declaraciones como ejemplo<
220
(SETQ x 53 y 27.5 Txt "HOLA" Lista1 '(a b c))
(SETQ IndArch (OPEN "prueba.lsp" "a"))
(SETQ Conj (SSGET) NomEnt (SSNAME Conj 0))
.eamos ahora como responderan los diversos elementos a una funcin TYPE<
(TYPE x) devuelve INT
(TYPE 'x) devuelve SYM
(TYPE y) devuelve REAL
(TYPE IndArch) devuelve FILE
(TYPE Conj) devuelve PICKSET
(TYPE NomEnt) devuelve ENAME
(TYPE Txt) devuelve STR
(TYPE Lista1) devuelve LIST
(TYPE setq) devuelve SUBR
(TYPE (SETQ z (+ 1 3))) devuelve INT
NOTA: Las tablas de paginacin *tipo PAGETB, son elementos $ue se a!aden como
primer t)rmino de las listas $ue definen funciones de usuario, cuando la paginacin
virtual de funciones se encuentra activada. #e todo esto se hablar al e%plicar la
funcin VMON en la seccin 2!..
El tipo devuelto por TYPE siempre est en maysculas y es un nombre no una cadena
*no est entrecomillado,.

''.1. Ra#treo
(ara acabar esta seccin veremos dos ltimas funciones denominadas de rastreo. 'e
llaman as por$ue se dedican a la parte de depuracin de un programa en AutoL&'(.
Estas dos funciones se llaman TRACE y UNTRACE.
(TRACE funcin1 [funcin2...] )
TRACE marca las funciones indicadas con un atributo de rastreo y devuelve el nombre
de la ltima funcin. La forma de utilizar TRACE es, generalmente, escribi)ndola en la
lnea de comando de AutoCAD. :na vez definidas as las funciones $ue $ueremos
rastrear, ejecutamos el programa en cuestin.
+ada vez $ue la funcin indicada en TRACE es evaluada se visualiza en pantalla la
llamada a esa funcin y, cuando termina, el resultado de la evaluacin. Las distintas
llamadas aparecen con sangrados de lnea proporcionales al nivel de anidacin de las
funciones. El te%to $ue indica la entrada en la funcin es Entrada de 8uncin:,
siendo en las versiones anglosajonas del programa< Entering 8uncin: *8uncin se
refiere al nombre de la funcin,. El resultado se precede del te%to fijo Resultado:
*Result: en ingl)s,.
221
NOTA: El nombre de la funcin utilizada en TRACE ha de ser uno de una funcin
definida por el usuario. TRACE se puede utilizar antes de cargar el programa en
memoria o despu)s.
(UNTRACE funcin1 [funcin2...] )
Esta funcin desactiva los atributos de rastreo activados por TRACE. #evuelve el
nombre de la ltima funcin indicada.
(ara aclarar el significado de estas funciones veamos un pe$ue!o ejemplo.
'upongamos el siguiente programa<
(DEFUN PidePto ()
--(SETQ pt2 (GETPOINT pt1 "Nuevo punto: "))(TERPRI)
--(COMMAND "linea" pt1 pt2 "")
--(SETQ pt1 pt2)
)
(DEFUN C:DibuLin ()
--(SETQ pt1 (GETPOINT "Introducir punto: "))(TERPRI)
--(REPEAT 4
----(PidePto)
--)
)
'i hici)ramos<
(TRACE PidePto)
y ejecutramos el nuevo comando de AutoCAD DIBULIN, el resultado podra ser<
----Entrada de PIDEPTO:
Comando: Resultado: (200.0 50.0 0.0)
----Entrada de PIDEPTO:
Comando: Resultado: (205.0 65.0 0.0)
----Entrada de PIDEPTO:
Comando: Resultado: (230.0 70.0 0.0)
----Entrada de PIDEPTO:
Comando: Resultado: (250.0 100.0 0.0)
+ada vez $ue se llama a la funcin dentro de la repetitiva *REPEAT 4,, esto es un total
de cuatro veces, aparece el mensaje Entrada de PIDEPTO:, $ue aparece con dos
sangrados sucesivos, por$ue esta llamada est incluida dentro del DEFUN C:Dibulin y
a su vez dentro de REPEAT 4, por lo tanto en un segundo nivel de anidacin. :na vez
evaluada la funcin se visualiza el resultado
222
'(. OP&RACION&S !INARIAS L5ICAS
"ajo esta seccin se agrupa una serie de funciones de AutoL&'( $ue realizan
operaciones a nivel binario. Esto $uiere decir $ue, aun$ue admiten $ue se indi$uen los
nmeros en decimal o en he%adecimal, los consideran como binarios *conjunto de unos
y ceros,. 'u utilidad es por tanto muy especfica.
NOTA: La e%plicacin e%haustiva del sistema binario *funcionamiento, operaciones,
conversiones..., o del lgebra de "oole *tablas de verdad, verdad y falsedad..., escapa
a los objetivos de este curso. A$u nos limitaremos nica y e%clusivamente a mostrar
las funciones AutoL&'( $ue manejan cifras binarias a nivel lgico.
(~ valor_num9rico )
Esta funcin devuelve la negacin lgica *')$, de una cifra binaria, es decir el
complemento a /. El nmero indicado ha de ser entero. .eamos unos ejemplos<
(~ 5) devuelve -6
(~ -6) devuelve 5
(~ 0) devuelve -1
(~ 54) devuelve -55
223
1ecordemos $ue el carcter ~ *tilde, corresponde al cdigo A'+&& /BC, por lo $ue se
escribe con la combinacin ALT+126.
(BOOLE operacin [valor_entero1 valor_entero2...] )
BOOLE realiza una operacin booleana general a nivel binario. El argumento operacin
es un nmero entre 0 y 15 $ue representa una de las /C operaciones booleanas
posibles. Los valores enteros indicados se combinarn bit a bit de acuerdo con la
funcin booleana especificada.
Esto significa $ue el primer bit del primer entero se combina con el primer bit del
segundo entero y as sucesivamente. El resultado final ser 0 1 segn la tabla de
verdad de la funcin booleana indicada. Lo mismo con el resto de bits de los valores
enteros especificados. La combinacin final de todos los bits resultantes dar el
nmero entero final $ue devuelve la funcin.
Algunos de los valores de operacin se corresponden con las operaciones booleanas
estndar. Estos valores, sus correspondencias y el resultado cierto *1, dependiendo de
los nmeros enteros se muestran en la tabla siguiente<
a$or +e operacin ...... !oo$eana e#t:n+ar ....... Re#u$ta+o e# 1 #i...
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
1 AAAAAAAAAAAAAAAAAAAAAAAA -'2 *= lgico, AAAAAAAAAAAAA todos los bits de entrada
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA son 1 *A y BAAA,.
6 AAAAAAAAAAAAAAAAAAAAAAAA 4)( *O lgico e%clusivo, AAAA slo uno de los bits de
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA entrada es 1 *o A o BAAA,.
7 AAAAAAAAAAAAAAAAAAAAAAAA )( *O lgico, AAAAAAAAAAAAAA al menos / de los bits de
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA entrada es 1 *A o BAAA,.
8 AAAAAAAAAAAAAAAAAAAAAAAA ')$ *NO lgico, AAAAAAAAAAAA ninguno de los bits de
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA entrada es 1 *no A no BAAA,.
.eamos un ejemplo. 'upongamos $ue escribimos<
(BOOLE 6 8 12 7)
Esto e$uivale a un 4)( de<
8 $ue en binario es 1000
12 $ue en binario es 1100
7 $ue en binario es 111
(or lo tanto, la operacin 4)( se realizar cuatro veces<
224
4)( de 1 1 0 devuelve 0
4)( de 0 1 1 devuelve 0
4)( de 0 0 1 devuelve 1
4)( de 0 0 1 devuelve 1
El resultado final es el nmero binario 0011 $ue e$uivale al 3 decimal. (or lo tanto<
(BOOLE 6 8 12 7) devuelve 3
(LOGAND [valor_entero1 valor_entero2...] )
Esta funcin realiza un = lgico *-'2, a nivel binario de los valores indicados. Estos
valores han de ser enteros; el resultado es tambi)n un entero.
En un caso particular de operacin booleana con BOOLE, LOAGAND e$uivale a hacer
BOOLE 1. Ejemplo<
(LOGAND 5 7 12 14) devuelve 4
(LOGIOR [valor_entero1 valor_entero2...] )
1ealiza un O lgico *)(, a nivel binario. Los valores sern enteros y el resultado
tambi)n *e$uivale a BOOLE 7,. Ejemplo<
(LOGIOR 1 4 9) devuelve 13
(LSH valor_entero n*mero_bits )
Esta funcin devuelve el desplazamiento a nivel binario de un registro del nmero
entero indicado en un valor del nmero de bits especificado como segundo argumento.
'i )ste es positivo, el entero se desplaza hacia la iz$uierda. 'i el nmero de bits es
negativo, el entero se desplaza a la derecha. Los dgitos $ue faltan entran como ceros,
y se pierden los dgitos salientes.
En la siguiente tabla se muestran varios ejemplos donde se indica en primer lugar la
funcin AutoL&'(, despu)s el nmero entero original indicado en la funcin; a
continuacin el binario e$uivalente a dicho entero; despu)s el valor del desplazamiento
especificado; a continuacin el binario resultante una vez aplicado ese desplazamiento;
por ltimo el entero e$uivalente a ese binario, $ue es el resultado final $ue devuelve
LSH<
=uncin .... & ..... !inario ..... De#%$a<am. ....... !inario re#. .. &ntero re#.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
225
(LSH 2 1) - 2 --- 10 --------- 1 -------------- 100 -------- 4
(LSH 2 -1)- 2 --- 10 --------- -1 ------------- 1 ---------- 1
(LSH 40 2)- 40 -- 101000 ----- 2 -------------- 10100000 --- 160
(LSH 11 -1)-11 -- 1011 ------- -1 ------------- 101 -------- 6

'4. 5&STIN D& LA 6&6ORIA
Esta ltima seccin contiene funciones de AutoL&'( $ue gestionan la memoria
disponible para almacenar las variables, definiciones de funciones y valores de los
programas cargados. 1esultan tiles cuando los re$uerimientos de memoria son
grandes o la memoria disponible es reducida, lo $ue puede provocar problemas.
AutoCAD utiliza automticamente la cantidad de memoria $ue necesita en cada caso.
(ero en sistemas con una capacidad limitada puede hacerse necesario un ajuste de la
misma. Kay $ue tener siempre presente $ue cuanto mayor es el nmero de variables y
de funciones definidas, mayores son las necesidades de memoria. Al mismo tiempo, si
sus nombres ocupan ms de seis caracteres se consume ms memoria. 6odas estas
circunstancias pueden forzar al usuario a liberar memoria o a activar la llamada
paginacin virtual de funciones, concepto $ue se e%plica a continuacin.
Enfilemos pues la recta final de este MDULO.
(VMON)
Esta funcin activa la pa#inai*n virtual de funiones. Gsta no resulta necesaria hasta
$ue se agotan todos los dems tipos de memoria virtual, lo $ue ocurre muy raramente
en la mayora de las plataformas. En algn caso, cuando se tiene cargado en memoria
un programa e%tenso de AutoL&'( o varios programas, puede ser insuficiente el
espacio de memoria nodal disponible. La memoria nodal almacena todos los smbolos
de funciones de usuario y de variables cargados en memoria. Estos smbolos son los
tambi)n llamados nodos.
'i esto ocurre, se puede emplear VMON para activar la paginacin virtual de funciones.
#esde el momento en $ue se llame a VMON, esa paginacin virtual afectar nicamente
a las funciones de usuario cargadas a partir de ese momento. +ada vez $ue se carguen
nuevas funciones de usuario y la memoria nodal sea insuficiente, AutoL&'( ir
evacuando las funciones poco utilizadas a un archivo temporal controlado por la
paginacin de archivos de AutoCAD. 'i esas funciones evacuadas se volvieran a
necesitar, AutoL&'( volvera a cargarlas en memoria nodal. Estos intercambios son
automticos y transparentes de cara al usuario.
'i se dispone de suficiente memoria 1A= ampliada o paginada, la utilizacin de esa
memoria ser lgicamente mucho ms rpida $ue la paginacin en disco.
Las funciones de usuario cargadas antes de la llamada a VMON no pueden ser
evacuadas de la memoria nodal, por lo tanto seguirn ocupando espacio. #e la misma
226
manera, todos los smbolos de variables continan en memoria nodal y no son
afectados por VMON. Esto $uiere decir $ue aun$ue se hayan ampliado mucho las
posibilidades de cargar programas largos, sigue e%istiendo una limitacin de memoria
nodal disponible.
+on VMON activada, todas las nuevas DEFUN colocan un nuevo nodo llamado ta%la de
pa#inai*n como primer elemento a!adido a la lista de AutoL&'( $ue define la funcin.
Este primer elemento no es visible a la hora de escribir *en pantalla o en un archivo,
esa funcin. (ero se puede obtener con CAR. La funcin TYPE devuelve el tipo de
elemento PAGETB para esas tablas de paginacin *como se e%plic en su momento,.
(GC)
+ada vez $ue se pretende cargar en memoria un nuevo smbolo de funcin o de
variable, AutoL&'( busca en la memoria nodal nodos libres donde almacenarlo. La
simple operacin de crear una variable y atribuirle un valor, por ejemplo<
(SETQ Var 27.53)
re$uiere dos nodos< uno para almacenar en memoria el nombre del smbolo *en este
caso Var, y otro para almacenar su valor *a$u BD.H3,.
'i el nombre del smbolo tiene seis caracteres o menos, se almacena directamente en
el nodo. 'i tiene ms, se toma espacio adicional de la memoria nodal o montn. #e ah
la importancia de utilizar nombres de smbolos *funciones de usuario o variables, con
menos de seis caracteres.
'i no e%isten nodos libres para almacenar ese smbolo, AutoL&'( recupera
automticamente el espacio inutilizado *nodos $ue se han liberado por$ue ya no tienen
ningn smbolo asociado,. 'i esto resulta insuficiente, solicita memoria adicional del
montn para crear nuevos nodos. En el momento en $ue se agote esta memoria,
tendra $ue recurrir a la paginacin virtual de funciones si se encuentra activada *si se
ha empleado VMON,.
El espacio de memoria tomada del montn para crear nuevos nodos ya no puede ser
devuelta al montn hasta salir de AutoCAD. 'in embargo e%iste la posibilidad de
forzar la recuperacin de esa memoria mediante GC. Esta recuperacin de memoria
lleva bastante tiempo y su utilidad es limitada. Es preferible dejar $ue AutoL&'( vaya
recuperando automticamente los nodos liberados en memoria sin necesidad de llamar
a esta funcin.
(ALLOC valor_entero )
Los nodos en AutoL&'( tienen un tama!o de /B octetos. (ara evitar un fraccionamiento
e%cesivo de la memoria nodal, los nodos se agrupan en segmentos. +ada segmento
tiene un tama!o implcito de H/0 nodos, es decir, C/CE octetos.
'i se desea especificar un nmero de nodos diferente a H/0 como tama!o del
segmento, se puede hacer con ALLOC<
(ALLOC 1024)
227
Este ejemplo asignar a cada segmento un tama!o de /JB0 nodos, lo $ue
representar /JB0J octetos.
Asignando un tama!o adecuado a los segmentos se pueden reducir las operaciones de
recuperacin de memoria inutilizada, ganando en velocidad de ejecucin del programa.
#e todas formas, es preferible dejar la tarea de gestin de memoria al mecanismo
automtico de atribucin de nodos de AutoL&'(.
(EXPAND valor_entero )
El espacio de memoria para almacenar valores de cadenas se toma de la misma
memoria montn $ue los segmentos de nodos. Estos valores de cadenas son de todo
tipo< nombres de smbolos de ms de seis caracteres, valores concretos de variables
de te%to, te%tos de mensajes, te%tos de opciones de men, etc)tera.
(or lo tanto en la memoria de montn, adems de la utilizada para los segmentos de
nodos, se re$uiere una parte para cadenas de te%to. La funcin EXPAND reserva
e%plcitamente para nodos, un nmero determinado de segmentos de la memoria
montn. Ejemplo<
(EXPAND 10)
Este ejemplo reservar /J segmentos $ue, si son de H/0 nodos cada uno,
representarn un espacio de H/0JJ octetos. 7o es posible reservar toda la memoria
montn disponible para segmentos de nodos. AutoL&'( necesita $ue e%ista una parte
libre para la memoria de cadenas.
(MEM)
Esta funcin visualiza el estado actual de la memoria en AutoL&'(, y devuelve nil. (or
ejemplo la funcin podra visualizar<
Nodos: 20224
Nodos libres: 40
Segmentos: 76
Asignado: 256
Colecciones: 5
nil
En versiones idiomticas inglesas de AutoCAD 14 la lista sera as<
Nodes: 20224
Free nodes: 40
Segments: 76
Allocate: 256
Collections: 5
nil
+ada t)rmino indica lo siguiente<
228
- Nodos< el nmero total de nodos atribuidos hasta ese momento.
- Nodos libres< es el nmero de nodos $ue se encuentran libres como consecuencia
de la recuperacin de memoria no utilizada.
- Segmentos< es el nmero de segmentos atribuidos.
- Asignado< indica el tama!o en nodos del segmento actual.
- Colecciones< es el total de recuperaciones de memoria no utilizada, $ue han sido
efectuadas *ya sea automtica o manualmente,.
'4. CDI5OS 8 6&NSAC&S D& &RROR
'4.1. C+igo# +e error
En la tabla siguiente se muestran los valores de cdigos de error generados por
AutoL&'(. La variable de sistema ERRNO toma uno de estos valores cuando una llamada
de funcin de AutoL&'( provoca un error $ue AutoCAD detecta despu)s.
C+igo ..... Signi4ica+o
-------------------------------------------------------------------------
-----------
J AAAAAAAAAAA 'in errores
/ AAAAAAAAAAA 7ombre no vlido de tabla de smbolos
B AAAAAAAAAA 7ombre no vlido de conjunto de seleccin o entidad
3 AAAAAAAAAA 'e ha superado el nmero m%imo de conjuntos de seleccin
0 AAAAAAAAAA +onjunto de seleccin no vlido
229
H AAAAAAAAAA :so no adecuado de definicin de blo$ue
C AAAAAAAAAA :so no adecuado de referencia e%terna
D AAAAAAAAAA 'eleccin de objeto< fallo en la designacin
E AAAAAAAAAA Oinal de archivo de entida
I AAAAAAAAAA Oinal de archivo de definicin de blo$ue
/J AAAAAAAAA 7o se ha encontrado la ltima entidad
// AAAAAAAAA &ntento no vlido de suprimir un objeto de ventana grfica
/B AAAAAAAAA 9peracin no permitida durante el comando POL
/3 AAAAAAAAA &dentificador no vlido
/0 AAAAAAAAA &dentificadores no activados
/H AAAAAAAAA Argumentos no vlidos en la peticin de transformacin de coordenadas
/C AAAAAAAAA Espacio no vlido en la peticin de transformacin de coordenadas
/D AAAAAAAAA :so no vlido de entidad suprimida
/E AAAAAAAAA 7ombre de tabla no vlido
/I AAAAAAAAA Argumento de funcin de tabla no vlido
BJ AAAAAAAAA &ntento de definir una variable de slo lectura
B/ AAAAAAAAA 7o puede utilizarse el valor cero
BB AAAAAAAAA .alor incorrecto
B3 AAAAAAAAA 1egeneracin compleja en curso
B0 AAAAAAAAA &ntento de cambiar el tipo de entidad
BH AAAAAAAAA 7ombre de capa errneo
BC AAAAAAAAA 7ombre de tipo de lnea errneo
BD AAAAAAAAA 7ombre de color errneo
BE AAAAAAAAA 7ombre de estilo de te%to errneo
BI AAAAAAAAA 7ombre de forma errneo
230
3J AAAAAAAAA +ampo para el tipo de entidad errneo
3/ AAAAAAAAA &ntento de modificar una entidad suprimida
3B AAAAAAAAA &ntento de modificar una subentidad SEQEND
33 AAAAAAAAA &ntento de cambiar identificador
30 AAAAAAAAA &ntento de modificar la visibilidad en pantalla grfica
3H AAAAAAAAA Entidad en capa blo$ueada
3C AAAAAAAAA 6ipo de entidad errnea
3D AAAAAAAAA Entidad polilnea errnea
3E AAAAAAAAA Entidad compleja incompleta en el blo$ue
3I AAAAAAAAA +ampo de nombre de blo$ue no vlido
0J AAAAAAAAA +ampos de identificador de blo$ue repetidos
0/ AAAAAAAAA +ampos de nombre de blo$ue repetidos
0B AAAAAAAAA .ector normal errneo
03 AAAAAAAAA Oalta el nombre de blo$ue
00 AAAAAAAAA Oaltan los indicadores de blo$ues
0H AAAAAAAAA "lo$ue annimo no vlido
0C AAAAAAAAA #efinicin de blo$ue no vlida
0D AAAAAAAAA Oalta un campo obligatorio
0E AAAAAAAAA 6ipo de datos e%tendidos *XDATA, no reconocido
0I AAAAAAAAA Anidacin errnea de lista en XDATA
HJ AAAAAAAAA :bicacin errnea del campo APPID
H/ AAAAAAAAA 'e ha superado el tama!o m%imo de XDATA
HB AAAAAAAAA 'eleccin de entidad< respuesta nula
H3 AAAAAAAAA APPID duplicada
H0 AAAAAAAAA &ntento de crear o modificar objeto de pantalla grfica
231
HH AAAAAAAAA &ntento de crear o modificar 1ef2, 2#ef o 2#ep
HC AAAAAAAAA Oiltro SSGET< fin de lista no esperado
HD AAAAAAAAA Oiltro SSGET< falta operando de prueba
HE AAAAAAAAA Oiltro SSGET< cadena opode *-4, no vlida
HI AAAAAAAAA Oiltro SSGET< anidacin errnea o clusula condicional vaca
CJ AAAAAAAAA Oiltro SSGET< incoherencia en principio y final de clusula condicional
C/ AAAAAAAAA Oiltro SSGET< nmero errneo de argumentos en clusula condicional *con
NOT o XOR,
CB AAAAAAAAA Oiltro SSGET< superado el lmite m%imo de anidacin
C3 AAAAAAAAA Oiltro SSGET< cdigo de grupo no vlido
C0 AAAAAAAAA Oiltro SSGET< prueba de cadena no vlida
CH AAAAAAAAA Oiltro SSGET< prueba de vector no vlida
CC AAAAAAAAA Oiltro SSGET< prueba de nmero real no vlida
CD AAAAAAAAA Oiltro SSGET< prueba de nmero entero no vlida
CE AAAAAAAAA El digitalizador no es un tablero
CI AAAAAAAAA El tablero no est calibrado
DJ AAAAAAAAA Argumentos de tablero no vlidos
D/ AAAAAAAAA Error A#'< no es posible asignar buffer nuevo de resultados
DB AAAAAAAAA Error A#'< se ha detectado un puntero nulo
D3 AAAAAAAAA 7o es posible abrir el archivo ejecutable
D0 AAAAAAAAA La aplicacin ya est cargada
DH AAAAAAAAA 7mero m%imo de aplicaciones ya cargadas
DC AAAAAAAAA 7o es posible ejecutar la aplicacin
DD AAAAAAAAA 7mero de versin no compatible
DE AAAAAAAAA 7o es posible descargar la aplicacin anidada
232
DI AAAAAAAAA La aplicacin no se descarga
EJ AAAAAAAAA La aplicacin no est cargada
E/ AAAAAAAAA =emoria insuficiente para cargar la aplicacin
EB AAAAAAAAA Error A#'< matriz de transformacin no vlida
E3 AAAAAAAAA Error A#'< nombre de smbolo no vlido
E0 AAAAAAAAA Error A#'< valor de smbolo no vlido
EH AAAAAAAAA 9peracin AutoL&'(8A#' no permitida mientras se presenta un cuadro de
dilogo

'4.'. 6en#a-e# +e error
+omo ya sabemos, cuando AutoL&'( detecta una condicin de error, cancela la funcin
en proceso y llama a la funcin *error* del usuario con un mensaje $ue indica el tipo
de error. 'i no se define ninguna funcin *error* *o si *error* se limita a cero,, la
accin estndar es presentar el mensaje en la forma siguiente<
error: mensa%e
El mensaje va seguido de un indicador de funcin. 'i hay una funcin *error* definida
por el usuario, el indicador no acta, sino $ue se hace referencia a dicha funcin de
usuario con mensa%e como argumento nico.
A continuacin se muestra una lista completa de los mensajes de error $ue puede
proporcionar AutoL&'( en programas de usuario, adems de una e%plicacin de cada
uno. La lista recoge los mensajes nicamente en castellano, e%cepto los $ue se
encuentran en ingl)s en todas las plataformas idiomticas.

Li#ta 1
Los argumentos de defun no pueden tener el mismo nombre
:na funcin definida con varios argumentos $ue tengan el mismo nombre fallar y
generar este mensaje.
AutoCAD rechaz la funcin
Los argumentos suministrados a una funcin de AutoCAD no son vlidos *como en
SETVAR con una variable de sistema de slo lectura o TBLNEXT con un nombre de tabla
no vlido, o la propia funcin no es vlida en el conte%to actual. (or ejemplo, no se
233
puede utilizar una funcin "#$... de introduccin de datos del usuario dentro de la
funcin COMMAND.
Desbordamiento de pila de AutoLISP
'e ha superado el espacio de almacenamiento de pila de AutoL&'(. El motivo puede ser
una repeticin e%cesiva de funciones o listas de argumentos muy largas.
tipo de argumento errneo
'e ha pasado un tipo de argumento incorrecto a una funcin (or ejemplo, no se puede
obtener la STRLEN de un nmero entero.
bad association list
La lista suministrada a la funcin ASSOC no est formada por listas de valor clave.
cdigo de conversin errneo
El identificador SPACE suministrado a la funcin TRANS no es vlido.
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
:na de las sublistas de la lista de asociacin suministrada a ENTMOD contiene un valor
errneo.
lista de argumento formal inadecuada
Al evaluar esta funcin, AutoL&'( ha detectado una lista de argumento formal no
vlida. >uizs no se trate de una funcin, sino ms bien de una lista de datos.
funcin incorrecta
El primer elemento de la lista no es un nombre de funcin vlido; $uizs se trate de un
nombre de variable o de un nmero. Este mensaje tambi)n puede indicar $ue la
funcin especificada no est bien definida *no olvidar la lista de argumentos formal
obligatoria,.
cdigo de funcin errneo
El identificador de funcin suministrado al comando TABLET no es correcto.
bad grvecs list value
El valor pasado en una lista GRVECS no es un punto B# o un punto 3#.
234
bad grvecs matrix value
La matriz $ue se ha suministrado a GRVECS contiene errores de formacin o de tipo de
datos *por ejemplo< STR, SYM, etc.,.
lista incorrecta
'e ha suministrado una lista con errores de forma a una funcin. Esto puede suceder si
un nmero real empieza con un separador decimal. Kemos 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 $ue no son puntos.
'e utilizan con SSGET y GRVECS.
bad node
La funcin TYPE ha encontrado un tipo de elemento no vlido.
tipo de nodo errneo en la lista
La funcin FOREACH ha encontrado un tipo de elemento no vlido.
argumento de puntos incorrecto valor de punto incorrecto
'e ha pasado un punto mal definido *una lista de dos nmeros reales, a una funcin
$ue esperaba un punto. :n nmero real no puede empezar por un separador decimal;
en dicho caso, hay $ue incluir el cero inicial.
detectado nmero real incorrecto
'e ha intentado transmitir un nmero real no vlido de AutoL&'( 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
:na de las sublistas de la lista de asociaciones suministrada a SSGET "X" contiene un
valor errneo.
cadena modo ssget incorrecta
Este error se produce cuando SSGET recibe una cadena no vlida en el argumento
modo.
lista de xdata incorrecta
235
Este error se genera cuando XDSIZE, SSGET, ENTMOD, ENTMAKE o TEXTBOX recibe una
lista de datos de entidad e%tendida con errores de forma.
se requiere punto de base
'e ha llamado a la funcin GETCORNER sin el argumento de punto base obligatorio.
Boole arg1 0 or 15
El primer argumento de la funcin booleana ha de ser un nmero entero entre 0 y 15.
imposible evaluar la expresin
'eparador decimal mal colocado o alguna otra e%presin incorrecta.
no es posible abrir (archivo) para entrada; fallo de LOAD
7o se ha encontrado el archivo designado en la funcin LOAD, o el usuario no tiene
permisos de lectura sobre ese archivo.
imposible volver a entrar en AutoLISP
:na funcin activa est utilizando el buffer de comunicacin AutoCAD8AutoL&'(; no se
podr llamar a otra nueva funcin hasta $ue la actual haya finalizado.
interrupcin desde el teclado
El usuario ha tecleado CTRL+C durante el proceso de una funcin.
divide by zero
7o se puede dividir por cero.
desbordamiento en divisin
La divisin por un nmero muy pe$ue!o ha dado como resultado un cociente no
vlido.
exceeded maximum string length
'e ha pasado a una funcin una cadena con ms de /3B caracteres.
extra right paren
'e ha encontrado uno o ms par)ntesis cerrados de los necesarios.
file not open
El descriptor de archivo para la operacin de E8' no es el de un archivo abierto.
236
lectura de archivo, memoria de cadenas insuficiente
=emoria de cadenas agotada mientras AutoL&'( lea un archivo.
file size limit exceeded
:n archivo ha superado el lmite de tama!o permitido por el sistema operativo.
floating-point exception
'lo sistemas :7&2. El sistema operativo ha detectado un error aritm)tico de coma
flotante.
funcin 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 lmites permitidos.
function undefined for real
'e ha suministrado un nmero real como argumento de una funcin $ue e%ige un
nmero entero, por ejemplo (LSH 2.2 1).
falta punto final grvecs
Oalta un punto final en la lista de vectores $ue se ha suministrado a GRVECS.
illegal type in left
El archivo .LSP no es A'+&& puro, sino $ue se ha guardado con un programa de
tratamiento de te%tos e incluye cdigos de formato.
improper argument
El argumento para GCD es negativo o cero.
inappropriate object in function
El paginador de funciones VMON ha detectado una funcin mal e%presada.
nmero incorrecto de argumentos
La funcin QUOTE slo espera un argumento concreto, pero se le han proporcionado
otros.
nmero incorrecto de argumentos para una funcin
237
El nmero de argumentos para la funcin creada por el usuario no coincide con el
nmero de argumentos formales especificado en DEFUN.

solicitud inadecuada de datos sobre lista de comandos
'e ha encontrado una funcin de comando pero no se puede ejecutar por$ue hay otra
funcin activa o por$ue el int)rprete de comandos no est completamente inicializado.
Este error puede producirse desde una llamada a la funcin COMMAND en ACAD.LSP,
ACADR14.LSP o en un archivo .MNL.
entrada interrumpida
'e ha detectado un error o condicin de fin de archivo prematuro, lo $ue ha provocado
la finalizacin de la introduccin de datos en el archivo.
insufficient node space
7o hay espacio suficiente en la pila de almacenamiento para la accin solicitada.
insufficient string space
7o hay espacio en la pila de almacenamiento para la cadena de te%to especificada.
invalid argument
6ipo de argumento errneo o argumento sobrepasa los lmites permitidos.
lista de argumentos no vlida
'e ha pasado a una funcin una lista de argumentos $ue contiene errores.
invalid character
:na e%presin contiene un carcter errneo.
par punteado no vlido
7o se ha dejado el espacio pertinente antes y despu)s del punto en la construccin
manual del par punteado. Este mensaje de error tambi)n puede deberse a un nmero
real $ue empieza por el separador decimal, en cuyo caso ha de incluir el cero inicial.
valor de nmero entero no vlido
'e ha encontrado un nmero menor $ue el entero ms pe$ue!o o mayor $ue el
nmero entero ms grande.
desbordamiento LISPSTACK
238
'e ha superado el espacio de almacenamiento de pila de AutoL&'(. El motivo puede ser
una repeticin e%cesiva de funciones o listas de argumentos muy largas.
malformed list
'e ha terminado prematuramente una lista $ue se estaba leyendo en un archivo. La
causa ms comn es una incoherencia en el emparejamiento de las aperturas y cierres
de par)ntesis o comillas.
malformed string
'e ha terminado prematuramente una cadena $ue se estaba leyendo en un archivo.
misplaced dot
:n nmero real comienza con el separador decimal. 'e ha de incluir un cero inicial en
este caso.
funcin nula
'e ha intentado evaluar una funcin $ue tiene una definicin vaca.
quitar/salir abandonar
'e ha llamado a la funcin QUIT o EXIT.
cadena demasiado larga
La cadena $ue se ha pasado a SETVAR es demasiado larga.
too few arguments
'e han pasado pocos argumentos a una funcin integrada.
argumentos insuficientes para grvecs
7o se han pasado suficientes argumentos a GRVECS.
demasiados argumentos
'e han pasado demasiados argumentos a una funcin integrada.

La siguiente lista muestra los errores internos de AutoL&'( $ue no tienen $ue ver con
el programa de usuario. Estos errores, si se producen, hay $ue notificarlos a Autodes?
de forma inmediata ya $ue se pueden deber a %u#s o fallos en la programacin de
AutoCAD 14 o en la implementacin de AutoL&'( en )l. (ara ms informacin v)ase la
ayuda del programa.
239

Li#ta '
bad argument to system call
'lo sistemas :7&2. El sistema operativo ha detectado una llamada errnea generada
por AutoL&'(.
bus error
'lo sistemas :7&2. El sistema operativo ha detectado un error de bus.
hangup
'lo sistemas :7&2. El sistema operativo ha detectado una se!al 'an#up *colgado,.
illegal instruction
'lo sistemas :7&2. El sistema operativo ha detectado una instruccin de m$uina no
vlida.
segmentation violation
'lo sistemas :7&2. El sistema operativo ha detectado un intento de direccionamiento
e%terno al rea de memoria especificada para este proceso.
unexpected signal nnn
'lo sistemas :7&2. El sistema operativo ha emitido una se!al inesperada.

=IN. &C&RCICIOS PROPU&STOS
&. #ise!ar un programa en AutoL&'( $ue permita dibujar un perfil doble 6
parametrizado. El programa solicitar en lnea de comandos la altura total y la
altura del alma, la anchura del ala y del alma y el punto de insercin. El perfil se
dibujar con ngulo de insercin J.
&&. 1ealizar un programa $ue e%traiga todos los blo$ues e%istentes en el dibujo
actual y los guarde en disco en la unidad y directorio $ue el usuario indi$ue. El
programa contendr una rutina de control de errores y funcionar desde lnea
de comandos. El resto al gusto del programador.
&&&. 1ealizar un programa $ue permita dibujar un agujero en alzado seccionado.
6ras solicitar el punto de insercin se irn pidiendo los dems datos. El usuario
dispondr de la posibilidad de dibujar el agujero con o sin cajera y8o roscado o
no. La cajera *si e%istiera, y el agujero se dibujarn en la capa actual; la rosca
*si e%istiera, y el eje de simetra se dibujarn en sendas capas cuyos nombres
sern solicitados al usuario. El programa funcionar bajo lnea de comandos
nicamente.
240
&.. +rear un programa en AutoL&'( $ue dibuje una curva de nivel cartogrfica a
partir de los puntos contenidos en un fichero topogrfico. El programa
funcionar mediante un cuadro dise!ado en #+L $ue tendr el siguiente
aspecto<
+omo se puede apreciar en este letrero de dilogo, el usuario dispondr de la
posibilidad de escoger un fichero en entrada -donde estn los datos- y un
fichero de salida. En este ltimo se guardarn las coordenadas de los puntos
precedidas de un nmero de orden o marca $ue ser el $ue se dibuje en
pantalla al lado de cada punto. Adems, 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 A'+&& *tipo "loc de 7otas, con el fichero en cuestin, y la
posibilidad de no generar este fichero, en cuyo caso no se generar *al elegir
esta opcin habrn de desactivarse la innecesarias,.
+omo segundo paso se elegir el tipo de curva con el $ue se dibujar la curva
de nivel *seccin Cenerar urva,. #espu)s elegiremos las propiedades de la
curva< capa, color y tipo de lnea. En cada lista desplegable se reflejarn los
elementos actuales en el dibujo.
+omo se ve en el cuadro, habremos de especificar tambi)n un estilo de te%to,
su rotacin y su altura, as como dispondremos de la posibilidad de no escribir
las marcas en pantalla. 6ambi)n se ofrece en esta seccin del letrero una casilla
de edicin para indicar cul ser la primera de las marcas.
(or ltimo escogeremos el separador de coordenadas en el archivo de entrada,
es decir, cul es el carcter $ue divide unas componentes de otras< una coma
241
*formato +#O,, un espacio blanco *formato '#O, o cual$uier otro $ue, en su
caso, se especificar.
El programa dispondr de una rutina de control de errores, tanto del cuadro de
dilogo *para no introducir valores incorrectos, como de errores AutoL&'(.
.. +rear un programa mediante AutoL&'( y #+L $ue dibuje escaleras de caracol en
3#. El cuadro de dilogo puede ser el $ue sigue<
+omo observamos habremos de introducir todos los datos necesarios para el
dibujo de la escalera. La opcin @ueo interior determina si en por dentro
e%istir hueco o una columna cilndrica. #ispondremos de un botn para
designar un punto de insercin en pantalla.
+r)ense rutinas de control de errores y dems.
.&. #ise!ar un programa AutoL&'(8#+L cuyo cometido ser sumar o acumular
todas distancias de tramos rectos y curvos de las lneas y8o polilneas y8o arcos
e%istentes en una capa del dibujo actual. Al final, el programa escribir un te%to
personalizable con las cantidades acumuladas. Este programa puede serle muy
til a todo a$uel $ue necesite saber en un momento el total de tramos trazados
en un dibujo *en una capa,, sean tuberas, circuitos el)ctricos, carreteras,
etc)tera.
242
El cuadro de dilogo principal del programa ser el $ue se puede observar en la pgina
siguiente.
EL rea Atuar en apa define la capa en la cual se realizarn las mediciones. +omo
vemos puede ser una elegida de la lista desplegable -$ue contendr todas las capas
del dibujo-, la capa actual o la correspondiente al objeto $ue se designar *si se elige
la ltima opcin,. En estos dos ltimo casos la primera opcin $uedar inhabilitada,
evidentemente; en el ltimo caso, se pedir designar objeto al pulsar el botn Aeptar,
antes de proceder a la medicin.
En el rea Aumular se especifica el tipo de objeto sobre el $ue actuar< lnea,
polilnea, arcos o todos *con las correspondientes combinaciones,.
En el rea Inseri*n del te%to habremos de pulsar el botn designar para
escoger un punto de insercin en pantalla. Al volver el cuadro, se reflejarn en
las casillas correspondientes las coordenadas 2, L y S de dicho punto. Adems,
escogeremos a$u la capa donde se insertar el te%to *Actuacin dice relacin
a la capa elegida en el rea primera,.
(or ltimo, en el rea >ostrar texto describiremos las propiedades del te%to
*estilo, altura y rotacin,, as como el te%to $ue aparecer antes del total
acumulado y despu)s del mismo.
243
El botn "refereniasAAA nos lleva a otro cuadro de dilogo, cuyo dise!o lo
vemos en la pgina siguiente. En este nuevo cuadro elegiremos diversas
preferencias *si as lo deseamos, para el te%to final escrito en pantalla. As
pues, dispondremos de la posibilidad de mostrar el subtotal de tramos rectos y
de tramos curvos -con sus correspondientes te%tos inicial y final-, la fecha y
la hora de la medicin y el autor de la misma, as como su empresa y la
ubicacin de )sta.
Este programa representa ya un alto nivel en la programacin en
AutoL&'(8#+L. 'e puede hacer de variadas formas, sobre todo el cuerpo
principal donde se realiza la medicin. &ntentemos escoger la $ue nos resulte
ms sencilla y verstil a la hora de tener en cuenta otros aspectos del
programa.
244
245

Potrebbero piacerti anche