Вы находитесь на странице: 1из 45

AUTOLISP

tutoriales de Robierzo.
TEMA 1: INTRODUCCION: 1-. AutoLisp es un lenguaje de programacin para Autocad. Es decir, si no trabajas con autocad es bastante ilgico aprender una herramienta que slo funciona bajo Autocad. A partir de Autocad 14 nace el VisualLisp, que no es otra cosa que Autolisp, pero con una cantidad enorme de nuevas funciones que facilitan mucho las cosas. "Para quien lo domine, claro, pues no es mi caso. 2-. Cuantos ms conocimientos se tienen de autocad mas fcil es de elaborar las rutinas en autolisp. Al fin y al cabo, se trata de realizar un programita que haga lo que auocad no hace, o que hace a medias, o que hace de modo lento y tedioso. 3-. Las rutinas son ficheros de texto, de extensin "lsp", que normalmente se guardan en las carpetas de acceso directo de autocad, normalmente en la carpeta SUPPORT. Si echis un vistazo en esta carpeta, encontraris muchos de estos ficheritos con extensin *.lsp. Normalmente ocupan muy poco, pues son ficheros de texto, editables con cualquier editor de texto. Si editis uno de estos ficheritos, veris el cdigo original de una rutina normal y corriente de Autolisp. Muchas veces el autor de una rutina de stas opta por compilarla. La compilacin lo que hace es crear un fichero en lenguaje mquina, mas accesible para nuestro ordenador, que acelera las operaciones de la rutina, y adems oculta el contenido real de la rutina. Estos ficheros compilados tienen extensin *.fas. Son exactamente igual que los *.lsp, pero como digo, en lenguaje mquina. De esta manera podemos proteger nuestras rutinas de cambios o intrusismo por parte de otros piratillas que quieran hacerlas de su propiedad. 4-. Autocad, a partir de su versin 14, incorpora una herramienta a modo de editor, que podis encontrar en la barra de mens: "Herramientas/Autolisp/editor de VsualLisp" Desde aqu se abre el editor de Visual-Lisp/AutoLisp. Una vez abierto el editor vamos a Archivo/nuevo archivo y ya estamos en disposicin de empezar a elaborar nuestra nueva rutina. ----------------------------------------------------------------------------Yo soy desconocedor de gran parte de los iconos y herramientas del editor de VisualLisp, por lo que si alguien puede ampliar el funcionamiento de los mismos, pues todos encantados. Si bien, yo nac con autolisp de la versin 11 de Autocad, y entonces slo caba la posibilidad de crear las rutinas con un simple editor de texto de MS-DOS, para probarlas luego en autocad. Ahora utilizo el editor de VisualLisp, muy til por su sistema de presentacin, pues utiliza de forma automtica colores distintos para comandos de autolisp, aclaraciones, variables, textos,.... Os resultar fcil comprenderlo. Podis abrir cualquier fichero *.lsp para echarle un vistazo, eso s. Sin cambiar nada, de momento. ----------------------------------------------------------------------5-. Existen 2 mximas en programacin: 1 mxima: Ningn programa funciona a la primera. Es ms. Yo dira que ningn programa funciona a la segunda. (Si tu eres de los que lo consigues, enhorabuena). As que no desesperis si las cosas no salen a las primeras de cambio. 2 mxima: Cualquier programa es mejorable. Si creis que sois unos monstruos de la creacin por hacer un excelente programa, sabed que vendr alguien que os dejar hechos polvo, simplemente aadiendo una coma a vuestra magnfica rutina. Por qu creis que autocad va por la ensima versin? 6-. Las maneras de cargar una rutina en autocad son dos: 1: Desde la barra de mens de autocad Herramientas/Autolisp/cargar o 2: desde la lnea de comandos, escribiendo: (loadnombre rutina) Ej.: si tenemos una rutina que se llama prueba.lsp, escribiramos: (loadprueba) 7-. Y para terminar esta tediosa introduccin, un par de cositas ms. En autolisp hay dos elementos que son imprescindibles. El parntesis ()y el punto y coma ; . Todas las funciones o expresiones deben ir precedidas de un punto y coma o metidas entre parntesis. De esto ya hablaremos en la prxima cita. Os adjunto, diligencia de DEVIGT, las funciones matemticas que vamos a utilizar habitualmente, para que os vayis familiarizando: Pasar a describir las distintas funciones de lisp por temas. Empecemos por la de Matemticas.

+ suma - resta * multiplica / divide rem resto de una divisin de enteros 1+ suma 1 1- resta 1 abs valor absoluto fix la parte entera de un numero real float convierte un entero en un real gcd mximo comn denominador min el ms pequeo de un grupo max el mayor de un grupo sqrt la raz cuadrada expt exponente exp potencia de e , base de los logaritmos naturales log logaritmo natural cvunit conversor de unidades Sigamos por cmo se usan estas funciones. Lisp tiene un modo particular de expresar las operaciones matemticas , segn tengo entendido se deriva de la Notacin polaca inversa, no es igual pero se le asemeja. las operaciones se escriben poniendo como prefijo el operador por ejemplo para sumar 2 + 3 pondremos + suma ( + 2 3 ) devuelve 5 , por supuesto ( + 4 5.6 -2 ) da 7.6, en este caso es la suma de dos nmeros positivos mas un negativo Les comento algo , no hace falta escribir un programa para verificar esto, tan solo pongan en la linea de comandos de acad la operacin tal como la he puesto arriba , abren parntesis , el signo mas, el 2, el 3 , cierran parntesis y dan intro enter y podrn ver el resultado en la lnea de comando. y as para todas las operaciones - resta (-97) ( - 8 4 0.5 ) Multiplica ( * 6 7) ( * 2 -3 1.5 ) Division ( / 12 6 ) ( / 11 6) , fjense que pasa con esta division , y aqu vale la pena hablar sobre enteros INT y reales . 11 y 6 son dos enteros y por lo tanto darn como resultado la parte entera de la divisin que ser 1 ahora si tan solo ponen el divisor como real , el resultado ser un real

( / 11 6.0) basta decir que para que un nmero sea real debe tener expresada su parte decimal , aunque sean 0 6 es un entero 6.0 es un real PRESTEN ATENCIN A ESTE TEMA , YA QUE ES MOTIVO DE ERRORES QUE SON AVECES CASI IMPOSIBLES DE DETECTAR. bueno por ahora los dejo , pero antes les dejo una leccin completa , lamentablemente est en ingls , pero es lo nico que tengo a mano Cita: Function Definitions -------------------------------------------------------------------------------1 - Mathematics -------------------------------------------------------------------------------+ ..... Adds (+ 2 3) returns 5 (+ 4 5.6 -2) returns 7.6 After (setq a 20 b 9) (+ a b) returns 29 -------------------------------------------------------------------------------- ..... Subtracts (- 9 7) returns 2 (- 8 4 0.5) returns 3.5 After (setq a 20 b 9) (- a b) returns 11 (- b a) returns -11 (- a) returns -20. When only one argument is supplied, its value is subtracted from 0, switching the sign of any number.

-------------------------------------------------------------------------------* ..... Multiplies (* 6 7) returns 42 (* 2 -3 1.5) returns -9.0 After (setq a 3 b 4.5) (* a b) returns 13.5 (* a a) returns 9

-------------------------------------------------------------------------------/ ..... Divides (/ 12 6) returns 2 (/ 11 6) returns 1 (Division using only integers ignores any remainder. Beware of "integer division.") (/ 11 6.0) returns 1.833333 (/ 12 3 2) returns 2 (/ 12 -2.0) returns -6.0

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

rem ..... Returns a remainder resulting from division (rem 10 3) returns 1 (rem 10 5) returns 0 (rem 6.2 1.2) returns 0.2

-------------------------------------------------------------------------------1+ ..... Increments by 1 (1+ 16) returns 17 After (setq a 21) (1+ a) returns 22. Used with setq, this serves as a loop counter for iteration. For example, (setq c (1+ c)). (1+ -4) returns -3

-------------------------------------------------------------------------------1- ..... Decrements by 1 (1- 16) returns 15 After (setq a -8) (1- a) returns -9

-------------------------------------------------------------------------------abs ..... Returns the absolute of a number (abs 7.0) returns 7.0 (abs -6) returns 6

-------------------------------------------------------------------------------fix ..... Discards fractional portion of a number and returns an integer (fix 7. 1) returns 7 (fix 7.9) returns 7 (fix -4.6) returns -4

-------------------------------------------------------------------------------float ..... Converts a number to a real number (floating point decimal number) (float 5) returns 5.0 (float 5.82) returns 5.82

-------------------------------------------------------------------------------gcd ..... Returns the greatest factor (divisor) common to two or more integers. Arguments must be positive integers. (gcd 21 39) returns 3 (gcd 102 138) returns 6 (gcd 30 45 60) returns 15 Autodesk says this function returns the "greatest common denominator" (a meaningless phrase). It is better to think of it as "greatest common divisor."

-------------------------------------------------------------------------------min ..... Returns the smallest (lowest) of two or more numbers (min 8 3 11.88 14 6) returns 3.0 (min 13 -28 2 66) returns -28

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

max ..... Returns the greatest of two or more numbers (max 8 3 11.88 14 6) returns 14.0 (max -22 -2 16) returns 16

-------------------------------------------------------------------------------sqrt ..... Returns the square root of a number as a real (sqrt 16) returns 4.0 (sqrt 2.0) returns 1.414214

-------------------------------------------------------------------------------expt ..... Raises a given number to a given power (expt 3 4) returns 81 (expt 2.0 5.0) returns 32 (expt 3 -2) returns 0 (negative exponents applied to integers can appear to give incorrect results because of integer division) (expt 3.0 -2.0) returns 0.111111 (expt 256 0.25) returns 4.0 After (setq a 2.25 b 0.5) (expt a b) returns 1.5

-------------------------------------------------------------------------------exp ..... Returns e raised to a given power (exp 1.0) returns 2.71828 (exp 2.14) returns 8.49944 (exp 0.4) returns 1.49182 (exp -2.0) returns 0.135335 Euler's number, e, is the base of natural logarithms, and equals approximately 2.71828. It is used to simplify certain formulas in calculus. Compare log below.

-------------------------------------------------------------------------------log ..... Returns the natural log (base e) of a number. Compare exp above. (log 3) returns 1.09861 (log 1.82) returns 0.598837 (log 0.25) returns -1.38629

-------------------------------------------------------------------------------cvunit ..... Converts a value, or a list of values, from one unit to another. The first argument is the number to be converted, the second argument is the unit from which you are converting, the third argument is the unit to which you are converting. (cvunit 10 "inch" "mm") returns 254.0 (cvunit 100 "mm" "inch") returns 3.93701 (cvunit 25 "lb" "kg") returns 11.3398 (cvunit (list 6 5 24) "inch" "feet") returns (0.5 0.416667 2.0) After (setq a 1 b 2) (cvunit a "inch" "mm") returns 25.4 (cvunit (list (eval a) (eval b)) "inch" "mm") returns (25.4 50.8) The unit names for the second and third arguments must be spelled as they appear in the ACAD.UNT file. The cvunit function depends on the values in ACAD.UNT. Therefore, for most conversions, simple multiplication or division by the appropriate factor within the AutoLISP expression is preferred over dependence on an external file.

TEMA 2: PRIMEROS PASOS Como ya adelant hace unos das nuestro amigo Gabriel, empezaremos hablando de algunos caracteres especiales bsicos en Autolisp, no sin antes aclarar que la mayora de comentarios y notaciones empleadas a partir de ahora han sido tomadas de los libros cuya bibliografa paso a detallar, y que recomiendo le echis un vistazo: Autor: Jose Antonio Tajadura y Javier Lpez Tit: Autolisp 12,13,14 Edit: Mc Graw Hill Autor:Reinaldo togores y Csar Otero Tit: Programacin en Autocad con Visual Lisp Ed.: Mc Graw Hill 1 Punto y coma: ; Sirve para aadir comentarios o aclaraciones que nos ayuden a entender mejor nuestra rutina. Todo lo que vaya detrs del punto y coma, en realidad podramos borrarlo y el programa no sufrira alteraciones. As que este carcter slo lo usaremos para esto. 2 Parntesis: ( ) Debe haber el mismo nmero de parntesis de apertura que de cierre. De lo contrario se producir un error. Los utilizaremos para preceder cualquier comando de Autolisp y para dar fin a dicho comando. 3 Comillas: " " Se utilizan para encerrar expresiones de texto que queremos que aparezcan en la pantalla, ya sea en la lnea de comando o en una ventana. Todo lo que est entre comillas ser considerado como una cadena de texto, incluso los parntesis, comas, punto y comas.... Como los parntesis, debe haber un nmero par de comillas. 4 Punto: . Se usa como punto decimal. 5 Apstrofo: Equivale al comando (QUOTE). Devuelve el literal de la expresin. 6 Contrabarra: \ Dentro de una cadena de texto podemos incluir una contrabarra seguida de uno de los siguientes caracteres: \n: Retorno de carro, nueva lnea \r: Return \t: tabulador Es decir. Si escribimos: (GETPOINT pt "\nSeala un punto") , cuando Autolisp evale esta expresin, antes de escribir "Seala un punto" en la lnea de comando, har un salto de carro para que no aparezcan dos o ms expresiones distintas, unas a continuacin de otras. 7 Cierre admiracin: ! Sirve para extraer desde la lnea de comandos, el valor de una variable. Ej.: (SETQ radio 5.639) Si tecleamos !radio en la lnea de comandos nos aparecer 5.639 ACLARACIONES *Autolisp no distingue entre maysculas y minsculas. *Es conveniente usar el nombre de las rdenes de Autocad en ingls. Si trabajamos con Autocad espaol y queremos saber el nombre en ingls tecleamos en la lnea de comando: (GETCNAME "orden en catellano") Ej.: (GETCNAME texto) y aparece "_text" *Autolisp siempre trabaja en radianes *PI es el nmero 3.1415926....., por lo que ninguna variable podr llamarse PI. *T es el smbolo de True, cierto, por lo que ninguna variable podr llamarse T. *nil es el smbolo de falso, por lo que ninguna variable podr llamarse nil. Siempre aparecer en minsculas, nunca NIL. (DEFUN <simb> <arg>) DEFINIR FUNCIONES Las distintas funciones que forman una rutina se definen mediante el comando (DEFUN <simb> <arg>) Dentro de una rutina podr haber decenas de funciones. Lo que suele hacerse es crear una funcin principal, desde la cual se irn llamando al resto de funciones secundarias. Es como si tuvisemos varias rutinas dentro de otras. <simb> es el nombre de nuestra funcin <arg> es el nombre de las variables que vamos a tener dentro de esta funcin Importante: Las variables pueden ser locales o globales. Esto quiere decir que: Si son globales, podremos seguir utilizndolas fuera de esta funcin. Si son locales, slo tendrn valor dentro de esta funcin. Tanto unas como otras van entre parntesis. Las locales van precedidas de una barra / Si ponemos un parntesis sin nada (), daremos por supuesto que todas son globales. Hay que tener en cuenta que en rutinas muy largas, donde existen muchas variables, y donde utilizamos otras rutinas, cuantas ms variables globales tengamos, ms lentos pueden ser los clculos. Una ves cargada una rutina, para ejecutarla en otras ocasiones dentro de la misma sesin de Autocad sin tener que volver a cargarla, debemos aadir c: delante del nombre de la funcin, para que, tecleando dicho nombre en la lnea de comando ya arranque de nuevo. (SETQ <simb1> <expr1> <simb2> <expr2>.....) ATRIBUIR VALORES Pues eso, sirve para atribuir valores a una variable. Ej: (SETQ radio 5 x 155.36 y 785.961 nombre "Soy un monstruo") Si tecleamos esto en la lnea de comandos y luego vamos tecleando sucesivamente:

!radio aparece 5 !x aparece 155.36 !y aparece 785.961 !nombre aparece "Soy un monstruo" (PROMPT <mensaje>) ESCRIBE MENSAJE Escribe un mensaje en la lnea de comandos (TERPRI) SALTA A UNA NUEVA LINEA (GETPOINT <punto> <mensaje>) INTRODUCE UN PUNTO Bien mediante sealamiento en pantalla, o bien mediante teclado. Ej.: (SETQ pt (GETPOINT "\nIntroduce un punto:")) Despus de introducir un punto, sus coordenadas se almacenan en la variable pt. (COMMAND <arg>) EJECUTA UNA ORDEN DE AUTOCAD Decir antes de nada que es recomendable utilizar el nombre de la orden en ingls, precedido de un guin bajo. As, independientemente de la versin de Autocad y del idioma, salvo en casos excepcionales, nuestra rutina funcionar siempre. Ej.: (COMMAND "_line" pt '(150 120) "") En este caso dibuja una lnea desde el punto pt, cuyas coordenadas ya habrn sido determinadas antes, hasta el punto de coordenadas x=150 e y=120. El nombre de la orden debe ir siempre entre comillas, as como cualquier opcin propia de la orden, como por ejemplo el "enter" final. Ejemplo general: Copiar esta rutina en el editor de Visual Lisp.
Cdigo: ;;;;;;;;;;;;Rutina para dibujar tres lneas desde un punto. (DEFUN c:dib_lineas ( / pt1 pt2 pt3 pt4) ;(DEFUN c:dib_lineas () (PROMPT "\nEste programa dibuja tres lnas desde un punto") (SETQ pt1 (GETPOINT "\nPrimer punto: ")) (SETQ pt2 (GETPOINT "\nSegundo punto: ")) (COMMAND "_line" pt1 pt2 "") (SETQ pt3 (GETPOINT "\nTercer punto: ")) (COMMAND "_line" pt1 pt3 "") (SETQ pt4 (GETPOINT "\nCuarto punto: ")) (COMMAND "_line" pt1 pt4 "") )

Como observaris, hemos creado una funcin llamada dib_lineas, a la que hemos aadido el prefijo c: para poder ejecutarla cuando queramos desde la lnea de comandos, una vez la hayamos cargado, como ya se explic en el TEMA 1. Esta funcin contiene 4 variables que le hemos dado carcter local, con lo que, una vez termine, se perdern los valores de sus variables. Sin embargo, si cambias el punto y coma de la segunda lnea ;(DEFUN c:dib_lineas () y lo pasis a la primera lnea (DEFUN c:dib_lineas ( / pt1 pt2 pt3 pt4), la rutina queda exactamente igual, pero ahora las variables son globales y podemos utilizarlas en otro momento o conocer su valor tecleando en la lnea de comando: !pt1, !pt2..... Haced la prueba de las dos maneras. Tambin observaris que hemos utilizado \n para salto de lnea. Podis eliminarlo y ver lo que pasa. Un detalle importante. A mi me gusta poner el abre parntesis y el cierra parntesis en la misma lnea. Pero si se hace muy largo, como es el caso del cierra parntesis de una funcin, me gusta ponerlo en la lnea vertical del que abre. Y con esto doy por terminada esta leccin. Como siempre, si alguien desea aadir o rectificar algo, pues ya sabe.[/code]

TEMA 3: FUNCIONES GET Y USO DE LISTAS:

Vamos a hacer un primer acercamiento a algunas de las funciones GET... ms comunes. Estas funciones, por lo general, solicitan la introduccin de datos, ya sea mediante teclado o bien mediante sealamiento en pantalla. En el TEMA 2 ya vimos la funcin (GETPOINT...). Recordamos que: (GETPOINT <punto> <mensaje>) INTRODUCE UN PUNTO Sirve para introducir un punto, bien mediante sealamiento en pantalla, o bien mediante teclado. Ej.: (SETQ pt (GETPOINT "\nIntroduce un punto:")) Despus de introducir un punto, sus coordenadas se almacenan en la variable pt. "Recordaros que estas instrucciones podis copiarlas directamente en la lnea de comandos para probar su funcionamiento y ver qu es lo que hacen, sin necesidad de abrir el editor de VisualLisp." (GETCORNER <punto> <mensaje>) INTRODUCE UNA ESQUINA Partiendo de un punto especificado en <punto>, solicita al usuario que introduzca otro punto, a la vez que visualiza de forma dinmica un rectngulo entre ambos. Es igual que GETPOINT, slo que aqu visualizamos un rectngulo gua. Ojo. GETCORNER no dibuja el rectngulo, sino que devuelve las coordenadas del punto sealado en pantalla. Si queremos dibujar el rectngulo tendremos que hacerlo mediante la orden COMMAND Ej.:
Cdigo: (DEFUN rectngulo (/ pt1 pt2 pt3 pt4) (SETQ pt1 (GETPOINT "\nPrimera esquina del rectngulo:")) (SETQ pt3 (GETCORNER pt1 "\nSegunda esquina del rectngulo:")) (SETQ pt2 (LIST (CAR pt3) (CADR pt1))) (SETQ pt4 (LIST (CAR pt1) (CADR pt3))) (COMMAND "_line" pt1 pt2 pt3 pt4 "_c") )

Hay algunas funciones que an no conocemos, como LIST, CAR, CADR, pero que iremos viendo a lo largo de este captulo. (GETINT <mensaje>) INTRODUCE UN NMERO ENTERO Solicita al usuario un nmero entero entre 32768 y 32767. Si se introduce un nmero no entero o un texto, devuelve un error y solicita de nuevo un nmero entero. Ej.: (SETQ numero_entero (GETINT "\nIntroduce un nmero entero:")) Esta instruccin almacena en la variable numero_entero el valor introducido. (GETREAL <mensaje>) INTRODUCE UN NUMERO REAL Es como el anterior, slo que acepta nmero reales. Si introducimos un entero lo considera como real. Podemos introducir tantos decimales como queramos, separados por un punto decimal (.). No sirve la coma ( ,) Ej.: (SETQ numero_real (GETREAL "\nIntroduce un nmero real:")) Si introducimos 489, !numero_real devuelve 489.0 (GETDIST <punto> <mensaje>) INTRODUCE UNA DISTANCIA Introduce una distancia, bien mediante teclado o mediante sealamiento de dos puntos en pantalla. GETDIST devuelve siempre un nmero real, aunque introduzcamos un entero. Ej.: (SETQ distan (GETDIST '(100.54 78.63) "\nSeala el segundo punto")) Aqu consideramos que la distancia que queremos obtener va desde el punto de coordenadas X=100.54 Y=78.63, hasta un punto que podemos sealar en el dibujo o podemos introducir mediante teclado, ya sea en coordenadas absolutas o relativas. El valor de dicha distancia lo almacena en la variable distan. Ej.: (SETQ distan (GETDIST ))

Aqu espera a que introduzcamos una distancia mediante teclado o bien a que sealemos dos puntos en pantalla. (GETSTRING <control> <mensaje>) INTRODUCE CADENA DE TEXTO Acepta una cadena de caracteres introducida desde el teclado y devuelve esa cadena. Slo admite 132 caracteres. Si pones ms de 132 devuelve la cadena hasta el carcter 132. No admite espacios en blanco, a no ser que especifiquemos TRUE (T) como argumento en <control>. Si control es igual a T entonces admite la introduccin de espacios en blanco. Si <control> es igual a "nil" o no existe, el primer espacio en blanco que introduzcamos ser considerado como "RETURN" y dar por finalizado el texto. Ej.: (SETQ cadena (GETSTRING "Introduce texto: ")) Si tecleamos "Textosinespacios" , la variable cadena almacena "Textosinespacios" Ej.: (SETQ cadena (GETSTRING T "Introduce texto: ")) Si tecleamos "Texto con espacios" , la variable cadena almacena "Texto con espacios" Ej.: (SETQ cadena (GETSTRING "Introduce texto: ")) Si pulsamos "RETURN", la variable cadena almacena "" (GETANGLE <punto> <mensaje>) INTRODUCE NGULO Introduce un ngulo, bien mediante teclado o bien mediante sealamiento de dos puntos en pantalla. Aunque las unidades especificadas en el dibujo sean distintas de radianes, el ngulo devuelto es en radianes y siempre medido en sentido contrario a las agujas del reloj, y con el origen en la posicin Este (Las tres del reloj) Como en GETDIST, podemos especificar un punto base y nos pedir el segundo punto. O bien no especificar nada y nos pedir los dos puntos. Ej.: (SETQ angulo (GETANGLE)) Espera a que introduzcamos un valor por teclado o a que sealemos un punto para pedirnos despus el segundo. Ej.: (SETQ angulo (GETANGLE '(100 50.50) "Seala el segundo punto:")) Aqu nos pide el segundo punto, y traza una lnea auxiliar de referencia hasta que sealamos el punto. (GETORIENT <punto> <mensaje>) INTRODUCE NGULO Es igual que GETANGLE pero considera el sentido y el origen de ngulos, segn est definido en "Unidades". Si bien, devuelve el valor en radianes. Esto hay que tenerlo en cuenta, pues los radianes son las unidades con las que trabaja siempre Autolisp. Ej.: (SETQ angulo (GETORIENT)) Espera a que introduzcamos un valor por teclado o a que sealemos un punto para pedirnos despus el segundo. Ej.: (SETQ angulo (GETORIENT '(100 50.50) "Seala el segundo punto:")) Aqu nos pide el segundo punto, y traza una lnea auxiliar de referencia hasta que sealamos el punto. Aunque faltan algunas funciones ms del tipo (GET...), las veremos en temas posteriores. Vamos a ver ahora la utilizacin de listas en un primer acercamiento. (LIST <expresion>) CREA UNA LISTA Sirve para crear una lista con todas las expresiones que aparecen en <expresion>. Los distintos elementos de una lista van separados por un espacio. Se utiliza sobre todo para crear listas con las coordenadas de puntos que hemos obtenido previamente mediante otras herramientas. Ej.: (SETQ x 52.36 y 48.98 z 75.0) (SETQ punto1 (LIST x y z)) Aqu tenemos almacenadas en las variables x y z las coordenadas de un punto. Mediante la orden LIST creamos una lista que es almacenada en la variable punto1. Orden: !punto1 (52.36 48.98 75.0) Aqu vemos cmo las tres 3 coordenadas del punto son tres elementos de la lista, separados por un espacio. Como veis, las listas tambin van entre parntesis, como todas las funciones en Autolisp. Vamos a hacer ahora el paso inverso. Supongamos que tenemos un punto almacenado en la variable punto1, que hemos obtenido mediante cualquiera de las funciones que hemos visto hasta ahora. Y queremos saber cules son las coordenadas X, Y, y Z de ese punto. (CAR <lista>) DEVUELVE EL PRIMER ELEMENTO DE LA LISTA (CADR <lista>) DEVUELVE EL SEGUNDO ELEMENTO DE LA LISTA

(CADDR <lista>) DEVUELVE EL TERCER ELEMENTO DE LA LISTA (CADDDR <lista>) DEVUELVE EL CUARTO ELEMENTO DE LA LISTA No se permite la obtencin del quinto elemento de una lista de modo directo, por lo que tendramos que recurrir a la funcin: (CDR <lista>) OBTIENE EL SEGUNDO ELEMENTO Y RESTO DE LA LISTA De esta forma podramos ir anidando hasta llegar al elemento que nos interesa. "Muy importante: Todas estas funciones son muy tiles para manejar listas en general y para acceder a la base de datos de Autocad. Autocad se gestiona mediante listas. Cualquier elemento de nuestro dibujo, una lnea, un arco, un bloque, est formado por una lista, donde aparece su color, tipo de lnea, tipo de objeto.... Podemos acceder a estas listas para modificarlos o trabajar con ellos, por lo que nos ser muy til en posteriores trabajos. Todo esto lo veremos ms adelante." Rutina para aplicar lo que hemos visto hasta ahora. Vamos a hacer un programita que nos dibuje un perfil parametrizado, en funcin de 4 variables. (Sacado del libro: Autolisp v.12 de J.A.Tajadura y J. Lpez. Edt. Mc Graw Hill.

Se nos pide la altura del perfil h, la altura del alma e, la anchura del ala m, y el espesor del alma a. Procurad no introducir datos que puedan incurrir en errores pues no est prevista ninguna instruccin para salvar dichos errores. En esta rutina aparecen algunas funciones matemticas muy simples, sumar restar y dividir, que no ofrecen ninguna complejidad y que ya se habl de ellas en el TEMA 1. Si bien, en el prximo TEMA 4 abordaremos estas y el resto de funciones matemticas. Rutina:
Cdigo: ; Rutina para dibujar perfil parametrizado. (defun c:perfil (/ h e m a pb x1 x2 x3 x4 y1 y2 y3 y4 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11) (setq h (getreal "\nAltura del perfil: ")) (setq e (getreal "\nAltura del alma: ")) (terpri) (setq m (getreal "Anchura del ala: ")) (terpri) (setq a (getreal "Espesor del alma: ")) (setq pb (getpoint "\nPunto de base para el trazado: ")) (terpri) (setq x1 (car pb) y1 (cadr pb)) (setq x2 (+ x1 (/ (- m a)2))) (setq x3 (+ x2 a)) (setq x4 (+ x1 m)) (setq y2 (+ y1 (/ (- h e) 2))) (setq y3 (+ y2 e) y4 (+ y1 h)) (setq p1 (list x4 y1)) (setq p2 (list x4 y2)) (setq p3 (list x3 y2)) (setq p4 (list x3 y3)) (setq p5 (list x4 y3)) (setq p6 (list x4 y4)) (setq p7 (list x1 y4)) (setq p8 (list x1 y3))

(setq p9 (list x2 y3)) (setq p10 (list x2 y2)) (setq p11 (list x1 y2)) (command "_pline" pb p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 "_c") )

Funcionamiento: Partiendo del punto base pb obtenemos las coordenadas X e Y, para ir calculando el resto de puntos del perfil, con slo sumar o restar los incrementos correspondientes. Dichos puntos los creamos construyendo sus listas correspondientes, mediante LIST. Finalmente trazamos una polilnea que pasa por todos los puntos, mediante COMMAND. OBSERVACIN: Yo suelo grabar mis rutinas con un nombre igual que el comando que ejecuta la rutina, en este caso perfil. As, esta rutina la grabaramos en un archivo llamado perfil.lsp. A veces la funcin principal, este no es el caso pues slo hay una, no es la ltima y no aparece el comando que ejecuta la rutina. Por eso yo siempre acostumbro a poner como ltima la funcin principal.

TEMA 4: OPERADORES MATEMATICOS Y LOGICOS:

Respecto a los operadores matemticos, ya vimos en el TEMA 1 prcticamente todo. Vamos a hacer un breve repaso. Como apuntaba DEVITG, en Autolisp se antepone el smbolo de la operacin a realizar, a los trminos de dicha operacin. Ej.:
Cdigo: (+ 5.36 6 89.4 146)

Esta operacin suma 5.36 ms 6 ms 89.4 ms 146 Conviene no olvidar lo que tambin apuntaba DEVITG, sobre los nmeros enteros y los nmeros reales. Si dividimos 22 entre 7 (/ 22 7), el resultado ser 3. Pues tanto el dividendo como el divisor son nmeros enteros y en consecuencia el cociente lo ser tambin. Sin embargo, si hacemos (/ 22.0 7) el resultado ser 3.1428..., pues hemos considerado el dividendo como un nmero real, y en consecuencia el cociente tambin lo ser. Recordamos tambin el comando 1+ y 1- , que es lo mismo que sumar o restar una unidad, pero de manera ms abreviada. (1+ 8) = (+ 8 1) = 9 (1- 9) = (- 9 1) = 8 Del resto de comandos matemticos que ya vimos en el TEMA 1 no vamos a hablar por la sencillez de su comprensin. S vamos a hablar de los comandos de las razones trigonomtricas: seno, coseno, tangente y arco tangente. (SIN <ang>) DEVUELVE EL SENO DE UN NGULO Como ya hemos comentado en alguna otra ocasin, Autolisp siempre utiliza los radianes como unidades angulares, independientemente de lo que tengamos definido en nuestro dibujo. Por lo que <ang> debe estar expresado en radianes.
Cdigo: (SIN (/ PI 2))

devolver 1.0 Parece obvio decir que 2PI radianes = 400 grados centesimales = 360 grados SPAM. Con una simple regla de 3 podemos hacer la conversin.

(COS <ang>) DEVUELVE EL COSENO DE UN NGULO


Cdigo: (COS (/ PI 2))

devolver 0.0 (ATAN <num1> [<num2>]) DEVUELVE EL ARCO TANGENTE Devuelve el arco tangente de <num1>, por supuesto, en radianes. Si aparece <num2>, devuelve el arco tangente del cociente entre <num1> y <num2>. Es decir: si <num1> es el seno de un ngulo y <num2> es el coseno, la expresin devolver el arco tangente de la tangente, dado que la tangente es el cociente del seno y el coseno.
Cdigo: (ATAN (SIN (/ PI 4)) (COS (/ PI 4)))

Devuelve 0.785398....= PI/4

OPERADORES DE COMPARACIN
(=) (/=) (<) (>) (<=) (>=) IGUAL, DISTINTO, MENOR QUE, MAYOR QUE, MENOR O IGUAL QUE, MAYOR O IGUAL QUE. Estos comandos efectan una comparacin entre valores o expresiones textuales. No entre listas. Si se cumple la comparacin devuelve T. Si no se cumple devuelve nil.
Cdigo: (SETQ a 56 b "comparadores" c 45.98 d PI e 3.25 f c g (* 7 8))

En este caso: (/= a g) devuelve "nil" (= g 56) devuelve "T" (< g c) devuelve "nil" (>= c f) devuelve "T" (<= b d) devuelve error, pues hemos comparado una cadena textual con un nmero. (EQUAL <exp1> <exp2> [<margen de error>]) EVALA Y COMPARA Evala dos expresiones y devuelve T si son idnticas o nil en caso contrario. Este comando s sirve para evaluar listas, por ejemplo de dos puntos con coordenadas. La opcin de indicar <margen de error> es sobre todo para comparar dos nmeros reales que pueden ser distintos a partir del cuarto o quinto decimal.
Cdigo: (SETQ n1 2.58963 n2 2.58966) (EQUAL n1 n2)

devuelve nil.
Cdigo: (EQUAL n1 n2 0.00003)

devuelve T (EQ <exp1> <exp2>) COMPARA LA IDENTIDAD ESTRUCTURAL No evala las expresiones, sino que compara la identidad estructural. Para nmeros enteros y cadenas textuales es igual que (=).

OPERADORES LGICOS
Estos comandos suelen utilizarse con los comandos condicionales que veremos a continuacin de este apartado. (AND <exp1> <exp2>...) Y LGICO, (OR <exp1> <exp2>...) O LGICO, (NOT <exp1>) NO LGICO Devuelven "T" o "nil", en funcin de si es cierto o no, el resultado de evaluar las expresiones.
Cdigo:

(SETQ a 25.63 b 89 c a d 25.64) (AND (= c 25.63) (< b 79))

Devuelve "nil". Aqu, c es igual a 25.63 y b no es menor que 79, luego no se cumple que sean ciertas todas las expresiones y devuelve "nil".
Cdigo: (OR (= c 25.63) (< b 79))

Devuelve "T". Aqu, aunque b no es menor que 79, c s es igual a 25.63, luego se cumple que una de las expresiones es cierta y devuelve "T"
Cdigo: (NOT (/= a c))

Devuelve "T". Si el resultado de evaluar la expresin es nil, NOT devuelve "T". Pero si el resultado de evaluar la expresin es distinto de nil, devuelve nil. Es como negar una negacin. El resultado es una afirmacin.

OPERADORES CONDICIONALES
Estos comandos permiten que, en funcin de unos resultados, se tomen unas decisiones u otras. (IF <cond> <accin cierto> [<accin falso>]) SI CONDICIONAL Una traduccin literal de este comando sera: Si ocurre esto, haz esto otro; y si no haz aquello. Este es un comando bsico y de gran utilidad, que debemos conocer y manejar bien. Si <cond> es falso y no aparece <accin falso> la rutina contina normalmente, sin ejecutar <accin cierto>. Otro punto importante es que podemos anidad tantos (IF....) como queramos. Es decir: dentro de <accin cierto> o de <accin falso> podemos incluir otro (IF <accin cierto> <accin falso>), y as sucesivamente. Para que nos entendamos, un ejemplo en cristinao. Si salgo de casa y llueve, voy en coche al trabajo, y si no llueve voy en BUS. Ahora bien. Resulta que llueve y cojo el coche. En este caso, si voy por la calle del programador, paso por donde la ta Gertru y le subo el peridico; y si no, hago una quiniela en el quiosco. (IF <llueve> (IF <voy por calle programador> <ta Gertru> <hago quiniela>) <voy en Bus>) (PROGN <exp1> <exp2>....) ACCIONES CONSECUTIVAS. Permite ejecutar varias acciones consecutivas. Siguiendo con el ejemplo anterior: (IF <llueve> (IF <voy por calle programador> (PROGN<ta Gertru> <me tomo un caf en bar Manolo> <paso por el taller>) <hago quiniela>) <voy en Bus>) Vemos que, si llueve cojo el coche. Y si voy por la calle programador, visito a la ta Gertru, me tomo un caf en el bar de Manolo, y me paso por el taller. Pero si no voy por la calle programador me paro a echar una quiniela . Si no llueve me voy en BUS. En este caso tambin podramos anidar otros condicionales, pero creo que con lo visto debera quedar claro. (REPEAT <veces> <exp1> <exp2>....) REPITE N VECES Establece una secuencia repetitiva n veces, donde podemos incluir cuantas expresiones queramos, tan complejas como queramos. (WHILE <cond> <exp1> <exp2>....) REPITE SEGN CONDICIN Es igual que REPEAT, pero no repite n veces sino que lo hace mientras se cumpla la condicin expresada. Tanto REPEAT como WHILE suelen utilizarse con IF. Y con esto creo que damos por concluido este tema. Vamos a elaborar un pequeo programilla que sirva de aplicacin de lo dicho. Se trata de una rutina que hace n paralelas a una entidad sealada en pantalla. Es como el comando ofsset, pero que incluya la opcin de hacer varias a la vez. Como en otras ocasiones, no se contempla la introduccin de datos inadecuados, por lo que debis procurar no incurrir en incoherencias.
Cdigo: ;;;;;;;;;; REALIZA n PARALELAs A UNA ENTIDAD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Introduccin de datos ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN datos () (if (= dist-perf nil)(setq dist-perf 0)) (if (= num_paralelas nil)(setq num_paralelas 1)) ;selecciona eje (setq tipo-obj "") (while (AND (/= tipo-obj "LWPOLYLINE") (/= tipo-obj "POLYLINE") (/= tipo-obj "LINE") (/= tipo-obj "CIRCLE") (/= tipo-obj "ARC") ) (setq nomb-ent (car (entsel "\nSelecciona entidad: "))) (setq listaobj (entget nomb-ent)) (setq tipo-obj (cdr (assoc 0 listaobj))) (if (and (/= tipo-obj "LWPOLYLINE") (/= tipo-obj "POLYLINE") (/= tipo-obj "LINE") (/= tipo-obj "CIRCLE") (/= tipo-obj "ARC") ) (prompt "\nNo se puede hacer paralela a la entidad designada"); NO CONFUNDIR CON PROGN ) ) ;distancia para hacer la paralela (princ "\nIntroduce distancia o [selecciona Dos puntos] <")(princ dist-perf)(princ ">: ") (SETQ dist-perftx (getstring)) (if (and (/= dist-perftx "") (/= dist-perftx "d") (/= dist-perftx "D")) (setq dist-perf (atof dist-perftx)) ) (if (= dist-perftx "") (setq dist-perf dist-perf)) (if (or (= dist-perftx "d") (= dist-perftx "D")) (progn (setq pt1 (getpoint "\nPrimer punto:")) (setq pt2 (getpoint "\nSegundo punto:")) (setq dist-perf (distance pt1 pt2)) ) ) ;Condicin para que el valor introdicido sea mayor que cero. (while (<= dist-perf 0) (princ "\nIntroduce distancia o [selecciona Dos puntos] <")(princ dist-perf)(princ ">: ") (SETQ dist-perftx (getstring)) (if (and (/= dist-perftx "") (/= dist-perftx "d") (/= dist-perftx "D")) (setq dist-perf (atof dist-perftx)) ) (if (= dist-perftx "") (setq dist-perf dist-perf)) (if (or (= dist-perftx "d") (= dist-perftx "D")) (progn (setq pt1 (getpoint "\nPrimer punto:")) (setq dist-perf (getdist pt1 "\nSegundo punto:")) ) ) ) (setq pt3 (getpoint"\nSelecciona un punto en el lado del desplazamiento:")) (princ "\nNumero de paralelas a ejecutar <")(princ "1")(princ ">: ") (SETQ num_paral_tx (getstring)) (if (= num_paral_tx "") (setq num_paralelas 1) (setq num_paralelas (fix (atof num_paral_tx))))

) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; OPERACIONES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun operaciones () (setq repeticion 1) (setq nueva_dist dist-perf) (repeat num_paralelas (command "_offset" nueva_dist nomb-ent pt3 "") (setq repeticion (1+ repeticion)) (setq nueva_dist (* dist-perf repeticion)) ) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; INICIO PROGRAMA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;

(DEFUN c:eq2() (datos) (operaciones) (PROMPT " Roberto Gonzlez ;-)")(terpri) )

La rutina se llama eq2.lsp. Incluye una funcin principal c:eq2 y dos ms que son llamadas desde la principal: datos operaciones. Como veis, la rutina se ejecuta tecleando eq2 en la lnea de comandos. Hay algunos comandos referentes al trabajo con entidades de dibujo que ya veremos en temas sucesivos. Son: (ENTSEL) (ENTGET) (ASSOC). Con estos comandos averiguamos el nombre de la entidad seleccionada y vemos si se trata de una lnea, polilinea, lwpolilinea, arco o circunferencia. Despus, mediante el comando WHILE chequeamos si es as o no, y no nos permite salir de ese bucle hasta que seleccionemos una de esas entidades. Tambin est el comando (ATOF) que convierte una cadena de texto en un nmero real. El resto de comandos ya los hemos visto. Mediante la funcin datos se nos pide que seleccionemos la entidad a la que vamos a hacer la paralela, la distancia, el lado, y el nmero de paralelas. Con la funcin operaciones y el comando REPEAT terminamos el proceso. En el prximo TEMA 5 veremos algunas funciones que complementan lo visto hasta ahora.

TEMA 5: ANGULOS, DISTANCIAS, FUNCIONES GET II: A fuerza de ser pesado, vamos a recordar otra vez que en Autolisp los ngulos siempre se miden en radianes. Con lo que hemos visto hasta ahora no nos ser difcil crear una o varias funciones que conviertan los datos que introduzcamos mediante teclado a radianes con los que trabaje el sistema. Para pasar de grados SPAM a radianes y viceversa:
Cdigo: (DEFUN SPAM (grad_s)

(* PI (/ grados 180.0)) ) Cdigo: (DEFUN rad_sexa (radianes) (/ (* radianes 180.0) PI) )

Para pasar de grados centesimales a radianes y viceversa:


Cdigo: (DEFUN cente_rad (grad_c) (* PI (/ grados 200.0)) ) Cdigo: (DEFUN rad_cente (radianes) (/ (* radianes 200.0) PI) )

(ANGLE <pt1> <pt2>) ANGULO DEFINIDO POR DOS PUNTOS Devuelve el ngulo de la recta definida por dos puntos. El ngulo se mide respecto al eje X actual del dibujo y en sentido contrario a las agujas del reloj. Es evidente que no ser lo mismo introducir primero el punto 1 que el punto 2. Angulo de pt2 a pt1 = ngulo de pt1 a pt2 + PI Si recordamos un poco, a diferencia de (GETANGLE....), con este comando es necesario sealar dos puntos en pantalla. Sin embargo, (GETANGLE...) permita introducir un punto base para sealar el segundo.
Cdigo: (SETQ pt1 (GETPOINT "Seala el primer punto:")) (SETQ pt2 (GETPOINT "Seala el segundo punto:")) (SETQ angulo (ANGLE pt1 pt2))

Si quisiramos convertirlo a nuestras unidades de trabajo, podramos utilizar una de las funciones anteriores que pasan de radianes a SPAM o centesimales. (DISTANCE <pt1> <pt2>) DISTANCIA ENTRE DOS PUNTOS Devuelve un nmero real, resultado de calcular la distancia entre dos puntos sealados en pantalla. No importa las unidades que tengamos definidas como actuales. Siempre devuelve en sistema decimal. Igual que en el caso anterior, la diferencia con (GETDIST...) es que no permite definir ningn punto como punto base y deberemos sealar los dos puntos en pantalla.
Cdigo: (SETQ pt1 (GETPOINT "Seala el primer punto:")) (SETQ pt2 (GETPOINT "Seala el segundo punto:")) (SETQ distancia (DISTANCE pt1 pt2))

(POLAR <pt1> <ang> <dist>) COORDENADAS X-Y DE UN PUNTO POR POALRES Devuelve las coordenadas X eY de un punto obtenidas a partir de un ngulo y una distancia, desde otro punto origen <pt1>. El ngulo introducido en <ang> se considera en radianes, como siempre, y positivo en sentido retrgrado. (ANGTOS <ang> [<modo> [<precision>]]) CONVERSIN DE NGULOS Devuelve una cadena de texto ente comillas, ojo con esto, a partir de un ngulo en radianes <ang>, segn el formato especificado en <modo> y <precision>. Si no se especifican el <modo> y <precision>, sern tomados los actuales correspondientes a las variables de sistema AUNITS y AUPREC. <modo> debe ser un nmero entero entre 0 y 4.

Modo 0: Grados Modo 1: Grados SPAM (grados, minutos, segundos) Modo 2: Grados centesimales Modo 3: Radianes. Modo 4: Grados geodsicos. (RTOS <num> [<modo> [<precision>]]) CONVERSIN DE NMEROS Devuelve una cadena de texto ente comillas, ojo con esto, a partir de un nmero real especificado en <num>, segn el formato especificado en <modo> y <precision>. Si no se especifican el <modo> y <precision>, sern tomados los actuales correspondientes a las variables de sistema LUNITS y LUPREC. <modo> debe ser un nmero entero entre 1 y 5. Modo 1: Cientfico. Modo 2: Decimal. Modo 3: Pies y pulgadas con fraccin decimal. Modo 4: Pies y pulgadas con fraccin propiamente dicha. Modo 5: Fracciones de cualquier unidad. (CVUNIT <valor> <actuales> <nuevas>) CONVIERTE VALOR A NUEVAS UNIDADES Existe un archivo en AutoCad, llamado acad.unt, donde se definen todas las unidades que emplea Autocad. Es conveniente que le echis un vistazo, eso s, sin modificar nada. Ah aparecen todas las unidades con las que se puede trabajar. Por ejemplo, los metros se pueden indicar como: metro, metros, meter, meters, metre, metres, o m. Pues as se define en este fichero. (CVUNIT 5 cm pie) Devuelve 0.16404. Esto equivale a decir que 5 cm. son 0.1640 pies. (CVUNIT 100 meter^2 are) Devuelve 1. Esto equivale a decir que 100 m2 es 1 rea. (INTERS <pt1> <pt2> <pt3> <pt4> [<para>]) DEVUELVE LA INTERSECCIN Devuelve el punto interseccin, resultado de analizar las dos rectas definidas por los puntos pt1-pt2 y pt3-pt4. <para> es opcional. Si <para> = nil, devuelve la interseccin ficticia, considerando las rectas infinitas. Si <para> no existe o es diferente de nil, solo calcula el punto interseccin si las rectas se cortan visiblemente. En caso contrario devuelve nil. Vamos a ver ahora algunas funciones del tipo GET que dejamos sin ver en el tema 3. Prestaremos especial atencin a la siguiente funcin: (INITGET [<valor>] [<cadena>]) MODO DE OPERAR LAS FUNCIONES GET Mediante esta funcin vamos a especificar el modo en el que va a trabajar la siguiente funcin del tipo GET. Esto no afecta a la funcin (GETSTRING), ya vista en el tema 3, ni (GETVAR), que veremos en prximos temas. Es necesario tener en cuenta que el comando (INITGET) slo tiene efectos sobre la primera orden del tipo GET que utilicemos, y no sobre las sucesivas. Si deseamos que tenga efectos sobre otras ordenes, debemos volver a especificarlo antes de cada funcin GET. <valor> puede tener los siguientes valores: 1: No admite valores nulos, ni INTRO. 2: No admite valor cero 4: No admite valores negativos 8: No verifica lmites aunque estn activados. 16: Hasta Autocad v12: Devuelve puntos en 3D, en vez de 2D. En versiones posteriores no tiene aplicacin. 32: Dibuja la lnea elstica con lnea discontinua en vez de continua. 64: Ignora la coordenada Z para el clculo de una distancia entre puntos en 3D. 128: Devuelve la entrada del teclado. Al pulsar INTRO devuelve una cadena vaca. La suma de estos valores implica la acumulacin de modos de operar. Es decir: si ponemos (INITGET 4) estamos indicando que el prximo comando GET no admitir como entrada valores nulos, ni el valor cero, ni valores negativos. Los modos establecidos mediante el comando (INITGET) slo se tendrn en cuenta cuando la orden GET utilizada a continuacin sea coherente con el modo especificado. No tiene sentido utilizar un modo 4 cuando vamos a usar la orden (GETINT), pues los nmeros enteros pueden ser negativos. Tendra sentido utilizar las siguientes rdenes con uno o varios de los siguientes modos:

GETINT: 1,2,4,128. Admite palabras clave. GETREAL: 1,2,4,128. Admite palabras clave. GETDIST: 1,2,4,32,64,128. Admite palabras clave. GETANGLE: 1,2,32,128. Admite palabras clave. GETORIENT: 1,2,32,128. Admite palabras clave. GETPOINT: 1,8,32,128. Admite palabras clave. GETCORNER: 1,8,32,128. Admite palabras clave. GETKWORD: 1,128. Admite palabras clave. La opcin <cadena> es una cadena de texto que define una serie de respuestas alternativas al comando GET, sin que se produzca un error. En este caso devuelve esa cadena en vez de producir un error.
Cdigo: (INITGET 1 "S N V") (SETQ pt1 (GETPOINT "Seala un punto"))

En este caso, el 1 no nos permitir introducir un valor nulo como podra ser INTRO. Pero s aceptara la S, la N o la V como valores vlidos. Tambin admite las minsculas s, n, o v. Si indicamos (INITGET 1 VAle) Admitira como vlida la introduccin de VA, va o la palabra completa Vale. En este caso, las maysculas de la palabra VAle indican las abreviaturas correctas que se pueden introducir. El comando (INITGET) es fundamental para la solicitud de datos en las rutinas, por lo que debemos aprender a utilizarlo bien y con fluidez. (GETKWORD [<mensaje>]) ADMITE PALABRAS CLAVE Permite introducir nicamente las palabras clave especificadas en (INITGET). Si no es as (GETKWORD) solicita otra vez que introduzcas los datos. (GETENV <variable>) DEVUELVE EL VALOR DE LA VARIABLE ESPECIFICADA Este comando devuelve el valor, entre comillas, de la variable de entorno especificada en <variable>. El nombre de la variable debe darse entre comillas. (GETENV temp) Devuelve C:\\WINDOWS\\TEMP, que es el directorio de archivos temporales. Y por ltimo, vamos a ver un comando que nos qued sin ver en el tema 4, y que deberamos incluir en el apartado de OPERADORES CONDICIONALES. (COND (<cond1> <accion1>) (<cond2> <accion2>)..) CONDICIONAL Cuando existen varias condiciones a analizar, es ms til utilizar este comando que (IF) El comando (COND.) analiza una serie de condiciones, tantas como se quiera, y ejecuta la accin de la primera condicin que se cumpla. A partir de ese momento, el resto de condiciones es ignorado, aunque tambin se cumplan. Y para terminar, vamos a analizar la rutina del tema 4 y vamos a emplear los comandos vistos en este tema para mejorar y hacer ms sencillo su entendimiento y creacin. Para no complicar mucho la rutina, hay casos que producen error y que no se contemplan. Incluso, cuando aparece la abreviatura D en el comando (INITGET 134 D) se podra eliminar por no ser necesaria, pues el comando (GETDIST ) ya lleva implcita la posibilidad de indicar la distancia mediante dos puntos. Se ha puesto as para ver de manera ms explcita el funcionamiento de (INITGET). Rutina eq3.lsp

Cdigo: ;;;;;;;;;; REALIZA n PARALELAs A UNA ENTIDAD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Introduccin de datos ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN datos () (if (= dist-perf nil)(setq dist-perf 0.0)) (if (= num_paralelas nil)(setq num_paralelas 1)) ;selecciona eje (setq tipo-obj "") (while (AND (/= tipo-obj "LWPOLYLINE") (/= tipo-obj "POLYLINE") (/= tipo-obj "LINE") (/= tipo-obj "CIRCLE") (/= tipo-obj "ARC") ) (setq nomb-ent (car (entsel "\nSelecciona entidad: "))) (setq listaobj (entget nomb-ent)) (setq tipo-obj (cdr (assoc 0 listaobj))) (if (and (/= tipo-obj "LWPOLYLINE") (/= tipo-obj "POLYLINE") (/= tipo-obj "LINE") (/= tipo-obj "CIRCLE") (/= tipo-obj "ARC") ) (prompt "\nNo se puede hacer paralela a la entidad designada"); NO CONFUNDIR CON PROGN ) ) ;distancia para hacer la paralela (initget 134 "D") (setq mensaje (strcat "\nIntroduce distancia [Dos puntos] <" (rtos dist-perf 2 3) ">: " ) ) (setq dist-perftx (getdist mensaje)) (cond ((= dist-perftx "D") (setq dist-perf(getdist "\nSelecciona dos puntos en pantalla: "))) ((= dist-perftx nil) (setq dist-perf dist-perf)) ((and(/= dist-perftx nil) (/= dist-perftx "D")) (setq dist-perf dist-perftx)) ) (setq pt3 (getpoint"\nSelecciona un punto en el lado del desplazamiento:")) (initget 134) (setq num_paral_tx (getint "\nNumero de paralelas a ejecutar <1>: ")) (cond ((= num_paral_tx nil) (setq num_paralelas 1)) ((/= num_paral_tx nil) (setq num_paralelas num_paral_tx)) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; OPERACIONES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun operaciones () (setq repeticion 1) (setq nueva_dist dist-perf) (repeat num_paralelas (command "_offset" nueva_dist nomb-ent pt3 "") (setq repeticion (1+ repeticion))

(setq nueva_dist (* dist-perf repeticion)) ) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; INICIO PROGRAMA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;

(DEFUN c:eq3() (datos) (operaciones) (PROMPT " Roberto Gonzlez ;-)")(terpri) )

TEMA 6: CADENAS DE TEXTOS Y OPERACIONES CON ARCHIVOS: Muchos de los datos que Autocad guarda en su base de datos lo hace en forma de una cadena de texto. Adems, muchos de los mensajes y peticiones que realiza son en forma de cadenas de texto. Por otra parte, tambin son cadenas de texto los datos que obtenemos de la lectura de un fichero ASCII, a los que en numerosas ocasiones debemos acudir como fuente de informacin. Por ello que es importante conocer bien las siguientes funciones. (STRCASE <cadena> [<expresin>]) CAMBIA DE MAYSCULAS A MINSCULAS O BICEVERSA Devuelve una cadena en maysculas o minsculas, dependiendo del valor de <expresin>. Si <expresin> es nil o no existe, devuelve una cadena en maysculas. Si tiene cualquier valor distinto de nil, devuelve una cadena en minsculas. (STRCASE Convierte a maysculas) Devuelve CONVIERTE A MAYSCULAS (STRCASE ConVierte a MINSCULAs 0) Devuelve convierte a minsculas (STRCAT <cadena1> <cadena2>) CONCATENA CADENAS DE TEXTO Devuelve una cadena de texto, resultado de concatenar tantas expresiones como aparezcan en <cadena1> <cadena2> (SETQ cad1 Manual ) (SETQ cad2 de ) (STRCAT cad1 cad2 AutoLisp) (ATOI <cadena>) CONVIERTE UNA CADENA DE TEXTO EN UN ENTERO Si <cadena> contiene un nmero entero con decimales, los trunca y deja la parte entera. Si <cadena> no es un texto que se corresponda con un valor numrico, devuelve el valor 0. (ATOI 106.981) Devuelve 106 (ATOI Son 106.98 euros) Devuelve 0 (ITOA <entero>) CONVIERTE UN ENTERO EN UNA CADENA DE TEXTO Es la funcin complementaria de (ATOI)Si <entero> es una cadena o un nmero real, devuelve un error. (ATOF <cadena>) CONVIERTE UNA CADENA DE TEXTO EN UN NMERO REAL Si <cadena> no es un texto que se corresponda con un valor numrico, devuelve el valor 0.0 Admite el guin inicial como signo menos. Si <cadena> contiene al principio nmeros y despus texto, convierte los nmeros y desecha el resto. (ATOF 106.981) Devuelve 106.981 (ATOF Son 106.98 euros) Devuelve 0.0 (ATOF -106 euros) Devuelve -106.0 (DISTOF <cadena> [<modo>]) CONVIERTE UNA CADENA DE UN NMERO REAL EN UN NMERO REAL

Es similar a (ATOF) pero en este caso podemos indicar el <modo>: 1 Cientfico. 2 Decimal. 3 Pies y pulgadas (decimal). 4 Pies y pulgadas (fraccional). 5 Fraccional Si os acordis, en el Tema 5 vimos la funcin (RTOS) que haca exactamente lo contrario a (DISTOF). (RTOS) converta un nmero real en una cadena de texto. (ANGTOF <cadena> [<modo>]) CONVIERTE UNA CADENA DE TEXTO DE UN NGULO EN UN NGULO Devuelve un ngulo en radianes. <cadena> es un valor angular . <modo> es: 0 Si el formato de la cadena est en grados, sistema decimal. 1 Si est en grados, sistema SPAM. 2 Si est en grados, sistema centesimal. 3 Radianes. 4 Unidades geodsicas. (ANGTOF 90.0000 0) Devuelve 1.570796327 (ANGTOF 100 2) Devuelve 1.570796327 (SUBSTR <cadena> <inicio> [<long>]) PARTE DE UNA CADENA DE TEXTO Devuelve parte de una cadena de texto indicada en <cadena>, a partir del nmero de carcter indicado en <inicio>, y con una longitud de caracteres determinada <long>. Si no se indica <long>, se entiende que es hasta el final. (SETQ cadena Aprendizaje de AutoLisp) (SUBSTR cadena 1 3) Devuelve Apr (SUBSTR cadena 16) Devuelve Autolisp (STRLEN <cad1> <cad2>.) LONGITUD DE UNA CADENA DE TEXTO Devuelve un nmero entero, resultado de contar el nmero de caracteres que forman una o varias cadenas, en cuyo caso devolver el total de todas las cadenas. (ASCII <cadena>) CDIGO DEL PRIMER CARCTER DE UNA CADENA Devuelve un nmero entero, correspondiente al cdigo ASCII del primer carcter de <cadena>.

(CHR <entero>) CARCTER CORRESPONDIENTE AL CDIGO ASCII Devuelve el carcter correspondiente al cdigo ASCII del nmero <entero>. Hace lo mismo que el anterior, pero a la inversa. Dado que es una cadena de texto, el resultado lo devuelve entre comillas. Y al hilo de un tema surgido en este foro sobre caracteres especiales, a continuacin aparece una tabla con los cdigos ASCII estndar, que son los que van desde el 0 al 127. Diremos que del 0 al 31 son caracteres de control, no imprimibles. Y del 32 al 127 son los del teclado o imprimibles. Despus estn los caracteres extendidos que son los que van del 128 al 255, aunque aqu no aparecen. Adems aparecen los cdigos correspondientes en sistema hexadecimal y octal.

Cdigo: ;Nombre Dec Hex Octal Car.(CHR <dec>) ;Nulo 0 0 0 NUL "" ;Inicio de cabecera 1 1 1 SOH "\001" ;Inicio de texto 2 2 2 STX "\002" ;Fin de texto 3 3 3 ETX "\003" ;Fin de transmisin 4 4 4 EOT "\004" ;enquiry 5 5 5 ENQ "\005" ;acknowledge 6 6 6 ACK "\006" ;Campanilla (beep) 7 7 7 BEL "\007"

;backspace 8 8 10 BS "\010" ;Tabulador horizontal 9 9 11 HT "\t" ;Salto de lnea 10 0A 12 LF "\n" ;Tabulador vertical 11 0B 13 VT "\013" ;Salto de pgina 12 0C 14 FF "\014" ;Retorno de carro 13 0D 15 CR "\r" ;Shift fuera 14 0E 16 SO "\016" ;Shift dentro 15 0F 17 SI "\017" ;Escape lnea de datos 16 10 20 DLE "\020" ;Control dispositivo 1 17 11 21 DC1 "\021" ;Control dispositivo 2 18 12 22 DC2 "\022" ;Control dispositivo 3 19 13 23 DC3 "\023" ;Control dispositivo 4 20 14 24 DC4 "\024" ;neg acknowledge 21 15 25 NAK "\025" ;Sincronismo 22 16 26 SYN "\026" ;Fin bloque transmitido 23 17 27 ETB "\027" ;Cancelar 24 18 30 CAN "\030" ;Fin medio 25 19 31 EM "\031" ;Sustituto 26 1A 32 SUB "\032" ;Escape 27 1B 33 ESC "\e" ;Separador archivos 28 1C 34 FS "\034" ;Separador grupos 29 1D 35 GS "\035" ;Separador registros 30 1E 36 RS "\036" ;Separador unidades 31 1F 37 US "\037"

Si os fijis, he incluido una ltima columna en la que aparece el comando (CHR <dec>). Si utilizamos este comando con los 31 caracteres no imprimibles obtendremos el resultado que aparece en la tabla. Cabe significar que: 1-. En todos los casos el valor devuelto est entre comillas, luego es una cadena de texto. 2-. Simpre va precedido de una contrabarra. 3-. Cuando dicha contrabarra va sucedida de un nmero, ste se corresponde con el valor octal. Tambin diremos que nuestro ordenador entender cualquiera de estos sistemas empleados, pero siempre teniendo en cuenta que si expresamos un carcter en hexadecimal, lo haremos con una contrabarra y una h \h. Y si lo hacemos en octal, con una contrabarra y un cero \0. Por ejemplo: El retorno de carro, cuyo valor decimal es 13, podremos indicarlo: \h0D En Hexadecimal \015 En Octal \r ASCII Cadena vaca que equivale a RETURN.

Cdigo: Dec Hex Octal Car. 32 20 40 Espacio 33 21 41 ! 34 22 42 " 35 23 43 # 36 24 44 $ 37 25 45 % 38 26 46 & 39 27 47 ' 40 28 50 ( 41 29 51 ) 42 2A 52 * 43 2B 53 + 44 2C 54 , 45 2D 55 46 2E 56 . 47 2F 57 / 48 30 60 0 49 31 61 1 50 32 62 2 51 33 63 3 52 34 64 4 53 35 65 5 54 36 66 6

55 56 57 58 59 60 61 62 63

37 38 39 3A 3B 3C 3D 3E 3F

67 70 71 72 73 74 75 76 77

7 8 9 : ; < = > ?

Cdigo: Dec Hex Octal Car. 64 40 100 @ 65 41 101 A 66 42 102 B 67 43 103 C 68 44 104 D 69 45 105 E 70 46 106 F 71 47 107 G 72 48 110 H 73 49 111 I 74 4A 112 J 75 4B 113 K 76 4C 114 L 77 4D 115 M 78 4E 116 N 79 4F 117 O 80 50 120 P 81 51 121 Q 82 52 122 R 83 53 123 S 84 54 124 T 85 55 125 U 86 56 126 V 87 57 127 W 88 58 130 X 89 59 131 Y 90 5A 132 Z 91 5B 133 [ 92 5C 134 \ 93 5D 135 ] 94 5E 136 ^ 95 5F 137 _ Cdigo: Dec 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 Hex Octal Car. 60 140 ` 61 141 a 62 142 b 63 143 c 64 144 d 65 145 e 66 146 f 67 147 g 68 150 h 69 151 i 6A 152 j 6B 153 k 6C 154 l 6D 155 m 6E 156 n 6F 157 o 70 160 p 71 161 q 72 162 r 73 163 s 74 164 t

117 118 119 120 121 122 123 124 125 126 127

75 76 77 78 79 7A 7B 7C 7D 7E 7F

165 166 167 170 171 172 173 174 175 176 177

u v w x y z { | } ~ DEL

Como habris podido observar, lo de las tablas no se entiende un carajo. Al pasarlo aqu se desvirta todo y se juntan todas las columnas. El que invent este sistema de escritura de mensajes debi quedar cansado. Da ms trabajo escribir aqu los mensajes que cavar una via de 2 hectreas. Lo siento, pero si el "jefe" no lo arregla, yo no tengo ni idea de cmo hacerlo. Tendris que echarle un poco de imaginacin. Bueno. Despus de pelear con la coa marinera, al final he conseguido que sea un poco legible. (WCMATCH <cadena> <filtro>) COMPARA UNA CADENA DE TEXTO CON UN FILTRO Compara una cadena de texto con un filtro, devolviendo T si lo cumple, o nil en caso contrario. El filtro lo formaremos con una serie de caracteres que se relacionan a continuacin: #: Rejilla. Corresponde a un dgito numrico. @: Arroba. Corresponde a un carcter alfabtico. . : Punto. Corresponde a un carcter no alfanumrico. *: Asterisco. Corresponde a cualquier combinacin de caracteres. ?: Interrogante. Corresponde a un carcter cualquiera. ~: Tilde. Negacin del filtro que va despus. [.]: Corresponde a los caracteres indicados entre corchetes. [~.]: Corresponde a los caracteres no indicados entre corchetes. -: Guin. Indica un rango de caracteres entre corchetes. ,: Coma. Separador de filtros. : Apstrofo: Corresponde al literal de carcter que va a continuacin. Es posible indicar varios filtros separados por una coma. En estos casos devuelve T si se cumple cualquiera de los filtros indicados. Los filtros se indicarn entre comillas. (SETQ cadena Programacin en AutoLisp. Una ventana al AutoCad) (WCMATCH cadena *Lis*) Devuelve T, ya que cadena contiene la subcadena Lis (WCMATCH cadena ?????????) Devuelve nil, ya que cadena contiene ms de 9 caracteres. (WCMATCH cadena p*) Devuelve nil, ya que cadena empieza por P y no por p. (WCMATCH cadena ~*v*) Devuelve nil, ya que cadena s contiene una v. (WCMATCH cadena *.*) Devuelve T, ya que cadena s contiene un punto. Vemos cmo en este caso nos hemos valido del apstrofo para indicar el carcter punto . (WCMATCH cadena [A-Z]*) Devuelve T, ya que cadena empieza por P, que es un carcter comprendido entre la A y la Z. (READ <cadena>) PRIMERA EXPRESIN DE UNA CADENA DE TEXTO Antes de nada, decir de este comando que se utiliza ms bien para trabajar con expresiones de Autolisp. Recordemos que los caracteres especiales que utiliza Autolisp para evaluar el tipo de expresin que estamos utilizando son: ( ): Parntesis. : Apstrofo. : Comillas ; : Punto y coma. :Espacio en blanco Este comando NO devuelve una cadena de texto, sino una expresin de Autolisp. Devuelve la primera expresin de <cadena>. (READ Que tal estas) Devuelve QUE (READ Bien;no?) Devuelve BIEN (READ (SETQ producto (* 5 8))) Devuelve (SETQ PRODUCTO (* 5 8) Este comando se usa, sobre todo, para introducir desde el teclado, durante la ejecucin de una rutina y a peticin de sta, una expresin que la propia rutina evaluar para incorporar posteriormente al desarrollo de la misma.

En lo referente a las cadenas de texto no veremos nada ms. Vamos a estudiar en este mismo tema el tratamiento y operaciones con ficheros de texto. (OPEN <nombre de archivo> <modo>) ABRIR UN FICHERO Este comando devuelve un descriptor de archivo que ser el que utilizaremos para realizar cualquier operacin con este archivo. El descriptor de archivo no es otra cosa que un cdigo mediante el cual Autocad identifica ese archivo. Por eso debemos almacenarlo en una variable. No confundir descriptor de archivo con nombre de archivo. <nombre de archivo> es el nombre del fichero con su extensin, escrito entre comillas. Autolisp entiende que el archivo se encuentra en la carpeta de inicio de AutoCad. De no ser as, debemos indicar su ruta completa, teniendo en cuenta que la contrabarra ha de ser doble. <modo> tambin va entre comillas y puede ser: r: Se abre el archivo en modo de slo lectura. Si no existe devuelve nil. w: Abre un archivo para escribir en l. Si no existe lo crea. Si existe, borra su contenido para escribir los nuevos datos. a: Abre un archivo para escribir en l. Si no existe lo crea. Si existe, se sita al final para aadir nuevos datos. (SETQ descriptor_archivo (OPEN prueba.doc r)) Si no existe devuelve nil. (SETQ descriptor_archivo (OPEN prueba.doc w)) Si no existe lo crea. Si existe borra su contenido. (SETQ descriptor_archivo (OPEN c:\\temp\\prueba.doc a)) Si no existe lo crea. Si existe se coloca al final para aadir nuevos datos. (CLOSE <descriptor de archivo>) CIERRA FICHERO Cierra el archivo especificado en <descriptor de archivo>. OJO. Es necesario conocer el descriptor mediante una de las operaciones con el comando anterior. Aunque conozcamos el nombre del fichero, debemos conocer el descriptor. (FINDFILE <nombre archivo>) RUTA COMPLETA DE FICHERO Busca en las carpetas de soporte de Autocad y devuelve la ruta completa de <nombre fichero>. En este caso no es necesario conocer el descriptor. Pero conviene tener en cuenta que slo busca en las carpetas de soporte de Autocad. Devuelve la ruta completa entre comillas, y siempre con la doble contrabarra. (GETFILED <titulo> <nombre de archivo> <extensin> <bits>) APERTURA DE CAJA DE DILOGO PARA GESTIN DE ARCHIVOS Abre una caja de dilogo estndar de Autocad para apertura de archivos, donde aparecer con el ttlo que nosotros queramos, indicado en <titulo>; la carpeta o el archivo por defecto, indicado en <nombre de archivo>; la extensin o extensiones separadas por punto y coma, indicadas en <extensin>; y <bits>, que puede ser la suma de uno o varios de los siguientes valores: 1: Nombre de un nuevo archivo a crear. 2: En las nuevas versiones de Autocad no se usa. 4: Permite introducir cualquier extensin. Si este bit no est activado, slo podremos seleccionar un archivo con la extensin especificada en <extensin>. 8: Si no se activa, devuelve el nombre del archivo incluyendo la ruta completa. 16: Si se activa y el <nombre de archivo>termina en / o \\, entiende que no hay nombre de archivo por defecto y que es esa carpeta donde debe buscar. 32: Si se activa este bit junto con el 1, no se avisar cuando se vaya a sobrescribir un archivo existente. En el ejercicio que se desarrolla al final de este tema podris observar un ejemplo de este comando. (PRIN1 <expresin> [<descriptor de archivo>]) ESCRIBE UNA EXPRESIN Si no se especifica descriptor de archivo, escribe <expresin> en la lnea de comandos. Si se especifica descriptor lo hace en el archivo al que hace referencia >descriptor de archivo>. <expresin> puede ser una cadena de texto o un nmero. (SETQ a Escritura b 75.23) (PRIN1 a) Devuelve Escritura (PRIN1 b) Devuelve 75.23 (PRIN1 (CHR 13)) Devuelve \r (SETQ fichero (OPEN prueba.lsp)) (PRIN1 ESCRITURA fichero) Escribe en el archivo prueba.lsp la palabra ESCRITURA, entre comillas.

Se suele poner un (PRIN1) al final de nuestra rutina para que aparezca una lnea en blanco y no muestre ningn mensaje en la lnea de comandos. (PRINT <expresin> [<descriptor de archivo>]) ESCRIBE UNA EXPRESIN Es igual que (PRIN1) pero antes de escribir salta a una nueva lneas. Adems aade un espacio en blanco al final. (PRINC <expresin> [<descriptor de archivo>]) ESCRIBE EXPRESIN ASCII Es igual que (PRIN1) pero no se incluyen las comillas ni cualquier otro carcter adicional. (READ-CHAR [<descriptor de archivo>]) LEE CARCTER Si no se especifica un descriptor de archivo, lee un carcter de la memoria temporal y devuelve el cdigo ASCII. Si en ese momento la memoria est vaca, solicita la entrada de un carcter por teclado. En este caso, si introducimos varios, las sucesivas llamadas al comando van devolviendo los cdigos ASCII de todos los caracteres introducidos. Si se especifica un descriptor de archivo, lee el primer carcter del archivo y sucesivas llamadas al comando van mostrando los cdigos del resto de caracteres. (READ-CHAR) Solicita una entrada. Escribimos AutoLisp. Devuelve 65, ASCII de A. (READ-CHAR) Devuelve 85, ASCII de u (READ-CHAR) Devuelve 84, ASCII de t (READ-CHAR) Devuelve 112, ASCII de p (READ-LINE [<descriptor de archivo>]) LEE LNEA Devuelve, entre comillas, una cadena de texto introducida desde el teclado o leda desde un archivo, si se especifica un descriptor. En este caso, al llegar al final del archivo devuelve nil. (WRITE-CHAR <num> [<descriptor de archivo>]) ESCRIBE CARCTER ASCII Escribe el carcter ASCII correspondiente al nmero <num>. Si se especifica un descriptor, se escribe en el archivo correspondiente. (WRITE-CHAR 65) Devuelve A (WRITE-LINE <cadena> [<descriptor de archivo>]) ESCRIBE LNEA Escribe una cadena de texto. Si se especifica un descriptor, escribe en el archivo correspondiente. Aunque devuelve la cadena entre comillas, al escribir en el archivo lo hace sin comillas. Y con esto damos por concluido este tema. Vamos a realizar ahora una rutina que es solicitada en muchas ocasiones, para incorporar a nuestro dibujo un fichero de puntos en formato ASCII, donde los campos estn separados por comas y representan: No del punto , X del punto , Y del Punto , Z del punto , Cdigo del puntoEj.: 15,158.632,456.305,45.984,Bordillo El campo Cdigo del punto puede no existir, con lo que tambin funcionara si el archivo tiene este formato: No del punto , X del punto , Y del Punto , Z del punto Ej.: 15,158.632,456.305,45.984 La rutina tiene una funcin principal que es c:lectura y 4 secundarias: configura,selec, textos, asci. Utiliza 2 funciones no vistas hasta ahora que son: (TBLSEARCH) y (SETVAR). Mediante la primera comprobamos si existen las capas que vamos a usar para volcar los puntos. Si no existen las creamos. Mediante la segunda vamos cambiando la capa actual segn el tipo de dato que vamos insertando en el dibujo. La rutina lo que hace es crear las siguientes capas: 1: donde colocar el nmero de punto. 2: donde colocar el texto con la cota del punto. 3: donde colocar el cdigo del punto Puntos_2d: donde colocar los puntos con cota 0. Puntos_3d: donde colocar los puntos en 3D. Para ello debemos introducir el fichero ASCII con los puntos, la altura de los textos y la distancia de stos al punto. Normalmente yo le pongo la misma altura y distancia.

Cdigo: ;;;;;;;;;;;;;;;;;;;;;;LECTURA DE FICHERO DE PUNTOS ASCII;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;; ;;;;;; El fichero ascii debe tener el formato: n punto,X punto, Y punto, Z punto, Cdigo ;;;;;; Los campos deben estar separados por comas. ;;;;;; Los puntos repetidos tambin los pone.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;PARMETROS DE CONFIGURACIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN configura() (if (not (tblsearch "layer" "puntos_2d")) (COMMAND "_-layer" "_n" "puntos_2d" "") (COMMAND "_-layer" "_t" "puntos_2d" "") ) (if (not (tblsearch "layer" "puntos_3d")) (COMMAND "_-layer" "_n" "puntos_3d" "") (COMMAND "_-layer" "_t" "puntos_3d" "") ) (if (not (tblsearch "layer" "1")) (COMMAND "_-layer" "_n" "1" "_c" "1" "1" "") (COMMAND "_-layer" "_t" "1" "") ) (if (not (tblsearch "layer" "2")) (COMMAND "_-layer" "_n" "2" "_c" "2" "2" "") (COMMAND "_-layer" "_t" "2" "") ) (if (not (tblsearch "layer" "3")) (COMMAND "_-layer" "_n" "3" "_c" "3" "3" "") (COMMAND "_-layer" "_t" "3" "") ) (setq npuntos 0) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;Selecciona archivo de puntos ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN selec() (SETQ fich (OPEN (GETFILED " Selecciona archivo ASCII" "c:\\" "txt;doc" 28) "r")) (SETQ linea (read-line fich));Esta lnea en realidad no pinta nada aqu. Lo que ocurre ;es que esta rutina est sacada de otra que adems contempla la apertura de otro tipo de ficheros ;y la lectura de la primera lnea indica qu tipo de fichero sera. Si queris podis implementar ;esta rutina con otras opciones. ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;Parmetros de configuracin de los textos ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN textos() (SETQ dt (GETDIST "\nDistancia del punto al texto: ")) (SETQ at (GETDIST "\nAltura de los textos: ")) (COMMAND "_-style" "standard" "romans.shx" at "1" "0" "_N" "_N" "_N") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Si el archivo es un ASCII ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN asci (/ n1 n1tx longn1tx x1 x2 x2tx longx2tx y1 y2 y2tx longy2tx z1 z2 z2tx longz2tx c1) ;Como ya hemos leido la primera lnea pasamos directamente a calcular el primer punto

;Primer punto (setq n1 (atof linea)) (setq n1tx (rtos n1 2 0)) (setq longn1tx (strlen n1tx)) ;;; X del punto 1 (setq x1 (substr linea (+ longn1tx 2))) (setq x2 (atof x1)) (setq x2tx (rtos x2)) (setq longx2tx (strlen x2tx)) ;;; Y del punto 1 (setq y1 (substr linea (+ longn1tx 1 longx2tx 2))) (setq y2 (atof y1)) (setq y2tx (rtos y2)) (setq longy2tx (strlen y2tx)) ;;; Z del punto 1 (setq z1 (substr linea (+ longn1tx 1 longx2tx 1 longy2tx 2))) (setq z2 (atof z1)) (setq z2tx (rtos z2)) (setq longz2tx (strlen z2tx)) ;;; Cdigo del punto 1 (setq c1 (substr linea (+ longn1tx 1 longx2tx 1 longy2tx 1 longz2tx 2))) (SETQ numpto1 n1tx) (SETQ coordx1 x2tx) (SETQ coordy1 y2tx) (SETQ coordz1 z2tx) (SETQ codigo c1) (dibujapunto) ;;;;; Resto de puntos (WHILE (/= linea nil) (SETQ linea (read-line fich)) (if (/= linea nil);Cuando se cumpla es que ya se habr acabado el fichero (progn ;;;numero del punto (setq n1 (atof linea)) (setq n1tx (rtos n1 2 0)) (setq longn1tx (strlen n1tx)) ;;; X del punto (setq x1 (substr linea (+ longn1tx 2))) (setq x2 (atof x1)) (setq x2tx (rtos x2)) (setq longx2tx (strlen x2tx)) ;;; Y del punto (setq y1 (substr linea (+ longn1tx 1 longx2tx 2))) (setq y2 (atof y1)) (setq y2tx (rtos y2)) (setq longy2tx (strlen y2tx)) ;;; Z del punto (setq z1 (substr linea (+ longn1tx 1 longx2tx 1 longy2tx 2))) (setq z2 (atof z1)) (setq z2tx (rtos z2)) (setq longz2tx (strlen z2tx)) ;;; Cdigo del punto (setq c1 (substr linea (+ longn1tx 1 longx2tx 1 longy2tx 1 longz2tx 2))) (SETQ numpto1 n1tx) (SETQ coordx1 x2tx) (SETQ coordy1 y2tx) (SETQ coordz1 z2tx) (SETQ codigo c1)

(dibujapunto) ) ) ) )

;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Dibuja los puntos ;;;;;;;;;;;;;;;;;;;;;;;;;;; (DEFUN dibujapunto (/ numpto coordz coordz2 pto2d pto3d xcota ycota xnumero ynumero xcodigo ycodigo conj controlbase enti nomb num numpto) (if (/= npuntos 0)(setq puntoa (list coordx coordy))) (SETQ numpto (itoa (ATOI numpto1))) (SETQ coordx (distof coordx1)) (SETQ coordy (distof coordy1)) (SETQ coordz (DISTOF coordz1)) (setq coordz2 (rtos coordz 2 2)) (SETQ pto2d (LIST coordx coordy)) (SETQ pto3d (LIST coordx coordy coordz)) (SETQ xcota (+ coordx dt)) (SETQ ycota coordy) (SETQ xnumero xcota) (SETQ ynumero (+ ycota at 0.2)) (SETQ xcodigo xcota) (SETQ ycodigo (- ycota (+ 0.2 at))) ; inserta y dibuja los puntos (setvar "clayer" "puntos_2d") (COMMAND "_point" pto2d) (setvar "clayer" "puntos_3d") (COMMAND "_point" pto3d) (setvar "clayer" "1") (SETQ ptx (LIST xnumero ynumero)) (COMMAND "_text" ptx "" numpto) (setvar "clayer" "2") (SETQ ptx (LIST xcota ycota)) (COMMAND "_text" ptx "" coordz2) (setvar "clayer" "3") (SETQ ptx (LIST xcodigo ycodigo)) (if (/= codigo " ") (COMMAND "_text" ptx "" codigo)) (setq npuntos (+ npuntos 1)) ) ;;;;;;;;;;;;;;;;;;;;;; ;;;;;INICIO PROGRAMA ;;;;;;;;;;;;;;;;;;;;;;; (DEFUN c:lectura (/ dt at unecod fich linea lineatipo tipoarch tipo numpto1 coordx1 coordy1 coordz1 codigo1 codigo puntoa puntob codpuntoa codpuntob coordx coordy) (configura) (selec) (textos) (asci) (terpri) (prompt "Dibujando nube de puntos.....") (setvar "clayer" "puntos_2d") (setvar "cmdecho" 1) (setvar "osmode" 8) (command "_zoom" "_e") ;(PROMPT "\nSe han insertado ")

(princ "\nSe han insertado ") (PRIN1 npuntos) (princ " puntos") (TERPRI) (princ " Roberto Gonzlez ;-)") (PRIN1) )

TEMA 7: VARIABLES DE SISTEMA Y USO DE LISTAS: En primer lugar vamos a hablar de las variables de sistema, que si bien no todas pueden ser modificadas desde Autolisp, pues algunas son de slo lectura, la mayora s son susceptibles de ser modificadas. En muchos casos nos bastar con extraer el valor de dicha variable y en otros ser necesario cambiarlo para un correcto funcionamiento de nuestra rutina. Dada la enorme cantidad de variables que existen, es imposible que las veamos todas. Entre otras cosas porque yo no conozco ni la cuarta parte. Si tecleamos en la lnea de comandos modivar, aparecer una lista con todas las variables de sistema y su valor correspondiente en ese momento. Para saber qu es lo que hace cada variable y cules son los valores posibles, podemos recurrir a la ayuda de Autolisp. Si tecleamos system variables, en el espacio de bsqueda, nos aparecern todas las variables y la informacin correspondiente a cada una. Antes de modificar una variable de sistema desde una rutina, es conveniente leer su valor actual y guardarlo dentro de una variable de la rutina, para devolverle dicho valor al trmino de la rutina. Dicho esto, pasamos a ver los comandos de Autolisp, propiamente dichos. (SETVAR <variable> <valor>) ASIGNA VALOR A UNA VARIABLE Asigna un valor a una variable especificada. El nombre de la variable debe ir entre comillas. (SETVAR blipmode 1) En este caso activa la visualizacin de una marca en cada punto sealado en pantalla. (GETVAR <variable>) EXTRAE EL VALOR DE UNA VARIABLE Devuelve el valor de la variable especificada entre comillas. Si no existe devuelve nil. (SETQ version (GETVAR acadver)) Asigna el valor de acadver, que es la versin de nuestro autocad, a la variable version. (OSNAP <punto> <modo>) PUNTO CON MODO DE REFERENCIA Devuelve un punto seleccionado, considerando el modo de referencia establecido en <modo>. El modo debe ir entre comillas. Se pueden aplicar varios modos a la vez, en cuyo caso irn separados por comas, tambin entre comillas. (SETQ pt (OSNAP pt1 med,cer,fin) En este caso almacena el punto seleccionado en la variable pt. Los modos pueden ser: Fin,Med,Cen,Pun,Cua,Int,Ins,Per,Tan,Cer,Fic Int,Ext,Par. La variable de sistema OSMODE almacena el modo que tengamos asignado en cada momento, mediante un bit que puede ser: 0: Ninguno. 1: Punto Final. 2: Punto Medio 4: Centro 8: Punto 16: Cuadrante 32: Interseccin 64: Insercin 128: Perpendicular 256: Tangente 512: Cercano 1024: Elimina todas las referencias a objetos 2048: Interseccin ficticia 4096: Extensin

8192: Paralelo 16383: Se especifican todas las referencias a objetos. Como en otras ocasiones se pueden sumar de varios de estos valores para establecer varios modos de referencia. (SETVAR osmode 513) Establece como modo de referencia a objetos: Cercano y punto final. (TRANS <punto> <scp origen> <scp final> [<desplaza>]) PASA DE UN SCP A OTRO Devuelve un punto, en forma de lista con tres elementos. <punto> es una lista con tres elementos. Si <desplaza> existe y es distinto de nil, considera que <punto> es un vector y no un punto. <scp origen> es el scp desde el que vamos a hacer el desplazamiento. <scp final> es el scp hasta el que vamos a hacer el desplazamiento. Ambos, <scp origen> y <scp final>, se pueden expresar mediante: Un cdigo. 0: Sistema de coordenadas Universal. SCU 1: Sistema de coordenadas Personal. SCP. El sistema de coordenadas actual. 2: Sistema de coordenadas de la vista actual. SCV. 3: Sistema de coordenadas del Espacio Papel. SCVEP. Slo se usa en combinacin con el 2. Un nombre de entidad. Que indica el sistema de coordenadas relativo a esa entidad. Tambin vamos a ver en este tema el uso de listas y el manejo de funciones para manipulacin y creacin de listas. En el TEMA 3 ya vimos algunas funciones sobre este particular. Recodemos que habamos visto la funcin (LIST), que sirve para crear listas. Y las funciones (CAR) (CADR) (CADDR) (CADDDR) y (CDR), que sirven para extraer un elemento de la lista. Como tambin ya se dijo, las listas son los rganos bsicos de funcionamiento de AutoCad, pues la Base de Datos se encuentra organizada por listas. Cualquier entidad est formada por una lista de sublistas, que lo definen y hacen nico en nuestro dibujo. (ASSOC <elemento> <lista>) SUBLISTA DE UNA LISTA Este es un comando esencial para el acceso a la Base de Datos de Autocad. Devuelve la sublista de una <lista>, cuyo primer elemento coincida con <elemento>. (SETQ fulanito (LIST '(nombre fulano) '(edad 25) '(altura 1.86))) (ASSOC 'edad fulanito) En este caso, hemos creado una lista llamada fulanito con tres sublistas. En la primera sublista almacenamos el nombre, en la segunda la edad y en la tercera la altura. El comando (ASSOC) devuelve la sublista (EDAD 25). Cabe sealar que la lista fulanito la hemos construido con tres sublistas que no se han evaluado, y por eso van precedidas del apstrofo, o lo que es lo mismo, el comado (QUOTE). De no ser as, Autolisp evaluara la expresin y dara error por considerar que (nombre fulano) es una llamada a una funcin.

(CONS <primer elem> <lista>) AADE PRIMER ELEMENTO A LISTA Mediante este comando insertamos un nuevo elemento en una lista existente, situndolo en primer lugar de la lista.
Cdigo: (SETQ lista_nueva nil num 0) (SETQ lista_nueva (CONS (SETQ num (+ 1 num)) lista_nueva)); Devuelve (1) (SETQ lista_nueva (CONS (SETQ num (+ 1 num)) lista_nueva)); Devuelve (2 1) (SETQ lista_nueva (CONS (SETQ num (+ 1 num)) lista_nueva));Devuelve (3 2 1)

Fijaos en la diferencia, si ponemos un apstrofo en la expresin:


Cdigo: (SETQ lista_nueva nil num 0) (SETQ lista_nueva (CONS (SETQ num (+ 1 num)) lista_nueva)); Devuelve (1) (SETQ lista_nueva (CONS '(SETQ num (+ 1 num)) lista_nueva)); Devuelve ((SETQ num (+ 1 num)) 1)

(SETQ lista_nueva (CONS '(SETQ num (+ 1 num)) lista_nueva));Devuelve ((SETQ num (+ 1 num)) (SETQ num (+ 1 num)) 1)

Par punteado. Este es un tipo de lista especial que se construye cuando, en vez de una lista como segundo argumento de (CONS), se especifica un valor concreto o el de una variable. Este tipo de listas tienen slo dos elementos separados por un punto, y ocupan menos memoria que las listas normales. Por ello son muy utilizadas por AutoCad. Con los comandos (CAR) y (CDR) podemos extraer directamente el primer y segundo elemento de estas listas. (CONS 'edad 25); devuelve (EDAD . 25) (SUBST <nuevo elem> <elem anterior> <lista>) SUSTITUIR ELEMENTO Busca en la lista indicada en <lista> el elemento <elem anterior> y lo sustituye por <nuevo elem>. Si <elem anterior> no existe, devuelve la lista tal cual estaba. Ej. 1
Cdigo: (SETQ fulanito (LIST '(nombre "Fulano") '(edad 25) '(altura 1.86))) (SETQ menganito (SUBST '(nombre "Citano") '(nombre "Fulano") fulanito))

Hemos creado una nueva lista,menganito, igual que la anterior, fulanito, pero con otro nombre. Ej.2
Cdigo: (SUBST (list "p" "q" "r") "c" (list "a" "b" "c" "d" "e")); Devuelve ("a" "b" ("p" "q" "r") "d" "e")

En el primer caso lo que se suele hacer es trabajar con pares punteados.


Cdigo: (SETQ fulanito (LIST (CONS "nombre" "Fulano") (CONS "edad" 25) (CONS "altura" 1.86)))

Esta operacin construye una lista, fulanito, con las siguientes sublistas en forma de pares punteados. (("nombre" . "Fulano") ("edad" . 25) ("altura" . 1.86)) Y si hacemos ahora:
Cdigo: (SETQ menganito ( SUBST '("nombre" . "Citano") '("nombre" . "Fulano") fulanito))

Nos devuelve la lista menganito,


Cdigo: (("nombre" . "Citano") ("edad" . 25) ("altura" . 1.86))

(APPEND <lista 1> <lista 2>.) UNE LISTAS Devuelve una nica lista con todos los elementos de las listas especificadas como argumentos. Los argumentos tienen que ser siempre listas. (APPEND '( a1 a2 a3) '(b1 b2 b3)); Devuelve (a1 a2 a3 b1 b2 b3) (APPEND '( a1 (a2 a3)) '((b1) b2 b3)); Devuelve (a1 (a2 a3) (b1) b2 b3) (APPEND '( a1 a2) a3); Devuelve (a1 a2), ya que a3 no es una lista. (LENGTH <lista>) LONGITUD DE UNA LISTA Devuelve un nmero entero que indica el nmero de elementos que tiene la lista. (LENGTH '(a1 b2 5.46 (c d e)); Devuelve 4 (LAST <lista>) LTIMO ELEMENTO DE LA LISTA Devuelve el ltimo elemento de la lista.

(LAST '(a1 b2 5.46 (c d e))); Devuelve (c d e) (MEMBER <elemento> <lista>) LISTA A PARTIR DE ELEMENTO Busca el elemento indicado en la lista y devuelve el resto de la lista a partir de ese elemento, pero con l incluido. Si no ecuentra <elem> devuelve nil. (MEMBER 'b2 '(a1 b2 5.46 (c d e))); Devuelve (b2 5.46 (c d e)) (NTH <numero> <lista>) ELEMENTO ENSIMO DE LA LISTA Devuelve el elemento de la lista <lista> que ocupa la posicin <numero>. Hay que tener en cuenta que el primer elemento de la lista ocupa la posicin cero. (NTH 0 '(a1 b2 5.46 (c d e))); Devuelve a1 (NTH 1 '(a1 b2 5.46 (c d e))); Devuelve b2 (NTH 3 '(a1 b2 5.46 (c d e))); Devuelve (c d e) (NTH 4 '(a1 b2 5.46 (c d e))); Devuelve nil (REVERSE <lista>) LISTA INVERTIDA Devuelve una lista con sus elementos en orden inverso. (FOREACH <smbolo> <lista> <expresin 1> <expresin 2>) APLICA EXPRESION A LISTA Dada una lista, a cada uno de los elementos de dicha lista le aplica una o varias expresiones en las que aparece un smbolo que es sustituido, sucesivamente, por cada uno de los elementos de la lista.
Cdigo: (SETVAR "osmode" 0) (SETQ p1 '(20 40 0) p2 '(60 80 15) p3 '(70 30 12)) (SETQ lista_nueva (CONS p3 lista_nueva)) (SETQ lista_nueva (CONS p2 lista_nueva)) (SETQ lista_nueva (CONS p1 lista_nueva)) (FOREACH sim lista_nueva (COMMAND "_line" "100,100" sim ""))

En este caso hemos creado una lista con tres puntos, lista_nueva. Al ejecutar FOREACH hemos incluido una funcin que no es ms que una orden de autocad que traza una lnea desde el punto de coordenadas "100,100,0" hasta sim, que es donde se insertarn cada una de las sublistas de lista_nueva. De esta forma trazaremos tres lneas con el mismo origen y con final en cada uno de los puntos que contiene lista_nueva. Observad que hemos incluido un valor 0 para la variable osmode, pues de lo contrario, si tenemos activado otro valor, corremos el riesgo de que las lneas no se tracen correctamente. El resultado sera el mismo si hacemos:
Cdigo: (SETVAR "osmode" 0) (SETQ p1 '(20 40 0) p2 '(60 80 15) p3 '(70 30 12)) (FOREACH sim (LIST p1 p2 p3) (COMMAND "_line" "100,100" sim ""))

(APPLY <function> <lista>) APLICA UNA FUNCIN A UNA LISTA Aplica una funcin , ya sea una definida por el usuario o bien un comando de Autolisp, a todos los elementos de una lista. El nombre de la funcin debe expresarse como un literal, mediante QUOTE o apstrofo. (APPLY '/ '(5 4 3 2 1)); Dvuelve 0 (APPLY '/ '(5.0 3 2 1)); Dvuelve 0.2083333 (APPLY 'STRCAT '(Este temario es un calvario)); Dvuelve Este temario es un calvario (MAPCAR <funcion> <lista 1> <lista 2>.) APLICA UNA FUNCIN A VARIAS LISTAS Es igual que APPLY pero en este caso las listas pueden ser varias. En este caso, en primer lugar aplica la funcin a todos los primeros elementos de todas las listas, empezando por la lista que aparece en primer lugar. Despus aplica la funcin a todos los segundos elementos de todas las listas, empezando por la lista que est en primer lugar. Y as sucesivamente hasta terminar con todos los elementos de todas las listas. Al final devuelve una lista cuyos elementos son los sucesivos resultados de ir aplicando la funcin a todos los elementos

de las listas. (MAPCAR '* '(3 2 1) '(7 8 9) '(5.12 5 7)); Devuelve (107.52 80 63) 107.52 es el resultado de multiplicar 3 x 7 x 5.12, que son los primeros elementos de las tres listas. 80 es el resultado de multiplicar 2 x 8 x 5, que son los segundos elementos de las tres listas. 63 es el resultado de multiplicar 1 x 9 x 7, que son los terceros elementos de las tres listas. Lgicamente todas las listas deben tener el mismo nmero de elementos. Y por hoy no vamos a ver ms funciones. A continuacin aparecen, a modo de ejemplos, las listas de algunas entidades que podemos dibujar en Autocad, y que son guardadas en la Base de datos. Como ya dijimos, cada entidad de dibujo es almacenada en la Base de Datos de Autocad mediante una lista de sublistas. Ser conveniente tener claro la composicin de la lista de cada entidad. Como observaris, la mayora de sublistas son pares punteados. El primer elemento de las sublistas es un cdigo o clave DXF que nos indica qu tipo de datos contiene esa sublista. En la ayuda del editor de VLisp podis encontrar el significado de cada clave, para cada entidad. Ayuda del editor VLisp / Manual de referencia de DXF / Seccin Tables-Blocks-Entities. Hay unas claves que son comunes a todas las entidades pero la mayora, dependiendo de la entidad, tienen un significado u otro. Dado que es imposible aprenderse de memoria todas las claves de todas las entidades de dibujo, es importante tener presente estas tablas a la hora de obtener datos de nuestro dibujo. Para obtener la lista de cualquier elemento de dibujo y de forma rpida, podemos hacerlo de la siguiente forma: En primer lugar debemos averiguar el nombre de la entidad cuya lista queremos obtener. Lo podemos hacer mediante cualquier comando que hemos visto para obtener este dato. Supongamos que acabamos de dibujar un crculo y queremos obtener la lista correspondiente. Pues bien. Abrimos el editor de Autolisp. Vamos a la Consola de VLisp y tecleamos: (SETQ ultima_entidad (ENTGET (ENTLAST))) y pulsamos INTRO. En este momento obtendremos la lista que buscbamos, correspondiente a la ltima entidad dibujada, que es el crculo. Si seleccionamos el resultado devuelto, lo pegamos en un nuevo trabajo de Autolisp y pulsamos CTRL+ALT+F (Formatear ventana de edicin), nos lo pondr en forma de cdigo, que lo entenderemos mucho mejor. Relacin de ejemplos de las listas de algunas entidades de dibujo: Punto
Cdigo: ((-1 . <Nombre entidad: 7272b678>) (0 . "POINT") (330 . <Nombre entidad: 7ef7acf8>) (5 . "D62BF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "datos") (62 . 6) (100 . "AcDbPoint") (10 784.955 788.004 125.644) (210 0.0 0.0 1.0) (50 . 2.42209) )

Lnea
Cdigo: ((-1 . <Nombre entidad: 7272b688>) (0 . "LINE") (330 . <Nombre entidad: 7ef7acf8>) (5 . "D62C1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "EJE") (62 . 3) (100 . "AcDbLine") (10 163.02 485.942 0.0)

(11 546.475 896.441 0.0) (210 0.0 0.0 1.0) )

Crculo:
Cdigo: ((-1 . <Nombre entidad: 7272b670>) (0 . "CIRCLE") (330 . <Nombre entidad: 7ef7acf8>) (5 . "D62BE") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "cajon3+710") (62 . 6) (100 . "AcDbCircle") (10 152.364 485.001 0.0) (40 . 0.801218) (210 0.0 0.0 1.0) )

Arco:
Cdigo: ((-1 . <Nombre entidad: 7272b6e8>) (0 . "ARC") (330 . <Nombre entidad: 7ef7acf8>) (5 . "D62CD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Escollera") (100 . "AcDbCircle") (10 301.164 2023.47 0.0) (40 . 494.779) (210 0.0 0.0 1.0) (100 . "AcDbArc") (50 . 4.23078) (51 . 5.82005) )

LwPolilinea:
Cdigo: ((-1 . <Nombre entidad: 7272b700>) (0 . "LWPOLYLINE") (330 . <Nombre entidad: 7ef7acf8>) (5 . "D62D0") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "PLAT") (62 . 4) (100 . "AcDbPolyline") (90 . 4) (70 . 128) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 1396.76 2256.28) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 1813.12 2138.08) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 1836.79 1849.71) (40 . 0.0)

(41 . 0.0) (42 . 0.0) (10 1524.51 2024.62) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0) )

Ventana de presentacin:
Cdigo: ((-1 . <Nombre entidad: 733c60b8>) (0 . "VIEWPORT") (330 . <Nombre entidad: 780ddca0>) (5 . "28E3DF") (100 . "AcDbEntity") (67 . 1) (410 . "Presentacin1") (8 . "ventana") (62 . 0) (100 . "AcDbViewport") (10 -47.9933 107.561 0.0) (40 . 181.841) (41 . 140.099) (68 . 10) (69 . 10) (12 -3.25658e+006 -3.49418e+006 0.0) (13 0.0 0.0 0.0) (14 1.0 1.0 0.0) (15 0.0 0.0 0.0) (16 0.0 0.0 1.0) (17 0.0 0.0 0.0) (42 . 50.0) (43 . 0.0) (44 . 0.0) (45 . 56.0395) (50 . 0.0) (51 . 2.49683) (72 . 100) (90 . 49152) (281 . 0) (71 . 1) (74 . 0) (110 502775.0 4.74993e+006 0.0) (111 -0.799243 -0.601007 0.0) (112 0.601007 -0.799243 0.0) (79 . 0) (146 . 0.0) (170 . 0) )

Bloque:
Cdigo: ((-1 . <Nombre entidad: 71c8a9f8>) (0 . "INSERT") (330 . <Nombre entidad: 7ef79cf8>) (5 . "11D237") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "COTAS") (100 . "AcDbBlockReference") (2 . "Vuelo") (10 10.1866 12.2462 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0)

(70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) )

Muchos de los comandos vistos en este tema se usan conjuntamente con los que veremos en el tema prximo por lo que no vamos a hacer ninguna rutina hasta la prxima entrega, donde s los utilizaremos. Si alguien tiene o quiere aadir una rutina que utilice lo visto en este tema puede hacerlo y todos tan contentos. Hasta la prxima.

TEMA 8: LA BASE DE DATOS DE AUTOCAD:

En este captulo vamos a ver cmo podemos trabajar con las entidades de dibujo, accediendo a la base de datos de Autocad. En primer lugar veremos los comandos utilizados para seleccionar entidades. Despus veremos los utilizados para editar y modificar estas entidades de dibujo. En la mayora de los casos ser preciso conocer el nombre de la entidad seleccionada para poder manipularla. Dicho nombre es un nmero hexadecimal y corresponde a la clave -1, de la lista de la entidad. Si echis un vistazo a las listas que aparecen en el tema anterior, podis observar que todas empiezan con una sublista cuyo primer elemento es -1 y el segundo es el nombre de la entidad. SELECCIN DE OBJETOS Los comandos de seleccin de entidades de dibujo comienzan pidiendo al usuario que Designe objeto. Tras esta operacin de designacin, los objetos seleccionados son introducidos en un conjunto, al que daremos nombre con una variable. En autolisp podemos tener abiertos simultneamente hasta 128 conjuntos, siempre que la memoria nos lo permita. Cuando un conjunto creado ya no sea til, es conveniente asignarle valor nil, para liberar espacio de la memoria. Cuando la operacin que queremos realizar slo requiere la designacin de una entidad podemos usar: (ENTLAST) NOMBRE DE LA LTIMA ENTIDAD DIBUJADA Devuelve el nombre de la ltima entidad dibujada y que no ha sido borrada.
Cdigo: (COMMAND "_line" p1 p2 "") (SETQ nombre (ENTLAST))

En este caso dibujamos una lnea y almacenamos el nombre en la variable nombre. El resultado podra ser: <Nombre entidad: 7ef5ef78>, que quedara almacenado, tal cual, en la variable nombre. Si dibujas una entidad en Autocad y tecleas en la lnea de comandos (SETQ nombre (ENTLAST)), pulsas INTRO. Y despus tecleas !nombre, y pulsas INTRO, observars que se produce el efecto indicado. (ENTNEXT [<nom>]) NOMBRE DE LA SIGUIENTE ENTIDAD Devuelve el nombre de la entidad que sigue a la indicada en <nom>, segn aparece en la Base de Datos. Si no aparece <nom>, devuelve el nombre de la primera entidad que aparece en la Base de Datos y que no ha sido borrada.
Cdigo: (COMMAND "_line" p1 p2 "") (SETQ nombre1 (ENTLAST)) (COMMAND "_circle" p1 rad)

(SETQ nombre2 (ENTLAST)) (SETQ nombre3 (ENTNEXT nombre1))

En este caso nombre2 y nombre3 son iguales, ya que con el ltimo comando lo que hemos hecho es asignar a la variable nombre3 el nombre de la entidad que sigue a nombre1, en este caso nombre2.Alguien se ha perdido? Je,je,je. (ENTSEL [<dialogo>]) NOMBRE DE ENTIDAD Y PUNTO DE DESIGNACIN Devuelve una lista con dos elementos. El primero es el nombre de la entidad y el segundo es una sublista con las coordenadas del punto de designacin. Si <dialogo> no aparece, mostrar el mensaje por defecto, que muestran siempre este tipo de funciones: Designe objeto. Si no acertamos en la designacin, devuelve nil. (SETQ listaent (ENTSEL Designa una entidad:)) En este caso la variable listaent podra almacenar un resultado como este: (<Nombre entidad: 7ef5ef78> (50.456 75.002 0.0)) Si ahora quisiramos saber el nombre, recordando lo visto en el TEMA 7, haramos: (SETQ nombre (NTH 1 listaent)) O tambin: (SETQ nombre (CAR listaent)) Con lo que almacenaramos en la variable nombre el primer elemento de la lista listaent. Que es <Nombre entidad: 7ef5ef78>. Cuando la operacin que queremos realizar requiere la designacin de varias entidades, primero tendremos que crear un conjunto de designacin, donde almacenaremos todas las entidades seleccionadas. Podemos usar: (SSGET [<modo>] [<pt1>] [<pt2>] [<lista-pt>] [<lista-filtros>]) CREA UN CONJUNTO DE SELECCIN Este es un comando complicado pero muy interesante y con un amplsimo abanico de posibilidades de seleccin. Sin ningn argumento, solicita la designacin mediante cualquier mtodo. Slo sirve para designar objetos visibles en el rea de pantalla. El <modo> indica el tipo de seleccin elegida. Siempre debe ir entre comillas. Puede ser: _C: Queda seleccionado todo aquello que est dentro, total o parcialmente, de un rectngulo definido por <pt1> y <pt2>. (SETQ conj (SSGET _C pt1 pt2)) _CP: Queda seleccionado todo aquello que est dentro, total o parcialmente, de un polgono formado por la lista de puntos <lista-pt>. (SETQ polig (LIST pt1 pt2 pt3 pt4 pt5)) (SETQ conj (SSGET "_CP" polig)) _F: Queda seleccionado todo aquello que intersecte con una poligonal definida por sus vrtices. (SETQ polig (LIST pt1 pt2 pt3 pt4 pt5 pt6)) (SETQ conj (SSGET "_F" polig)) _I: Si se utiliza con filtros de seleccin., slo tiene en cuenta los objetos preseleccionados que muestran pinzamientos. La variable PICKFIRST debe estar activa. _L: Selecciona la ltima entidad dibujada y no borrada. _P: Vuelve a seleccionar el ltimo conjunto creado. _W: Queda seleccionado todo aquello que est dentro, totalmente, de un rectngulo definido por <pt1> y <pt2>. (SETQ conj (SSGET _W pt1 pt2)) _WP: Queda seleccionado todo aquello que est dentro, totalmente, de un polgono formado por la lista de puntos <lista-pt>. (SETQ conj (SSGET _WP polig)) _X: Sirve para seleccionar todos los objetos del dibujo, estn dentro o fuera del rea visible de pantalla, estn en capas activadas o no, e incluso en capas inutilizadas. Tiene la particularidad de que se pueden usar listas de filtros para seleccionar objetos con determinadas caractersticas. (SETQ conj (SSGET _X (LIST (CONS 0 ARC) (CONS 8 rotura) (CONS 62 3)))) En este caso almacena todas las entidades que sean arcos, que estn en la capa "rotura" y que tengan color verde, que es el numero 3. Como veis, hemos utilizado como filtros los cdigos DXF 0,8 y 62. Se pueden utilizar todos los cdigos

DXF excepto el -1, el 5, y los mayores de 1000. (SETQ conj (SSGET (0 . CIRCLE))); Solicita seleccin de entidades, y de todos los objetos seleccionados, slo almacena los crculos. (SETQ conj (SSGET _X ((0 . LINE))); Selecciona todas las lneas del dibujo. (SETQ conj (SSGET _I ((0 . LINE) (62 . 2)))); Almacena todas las lneas del dibujo que tengan color amarillo y que estn preseleccionadas. FILTROS DE SELECCIN Hay una serie de filtros que podemos utilizar con (SSGET) para realizar una seleccin ms particular. _:E: Queda seleccionado todo lo que se encuentra dentro de la caja del cursor. _:N: Slo se puede usar con selecciones grficas(ventana, captura). Selecciona subentidades de un bloque, polilinea 3D _:S: Una vez realizamos la primera seleccin, no continua pidiendo que designemos ms objetos. _:D: Acepta la seleccin de entidades repetidas. _:P: No selecciona ventanas grficas del Espacio Papel. _:L: No selecciona objetos de capas bloqueadas. FILTROS DE COMPARACIN Mediante el cdigo especial -4 podemos indicar una serie de operadores de comparacin para realizar la seleccin. La comparacin se aplica slo a la sublista que sigue a la lista del cdigo -4. Podemos agrupar varios operadores separados por comas.Siempre van entre comillas y pueden ser: *: Comodn =: Igualdad !=: Desigualdad /=: Desigualdad <>: Desigualdad <: Menor que <=: Menor o igual que >: Mayor que >=: Mayor o igual que &: AND binario. Se aplica para comprobar el bit asociado a la clave DXF de una sublista. &=: Igualdad AND binario. Se aplica para comprobar el bit asociado a la clave DXF de una sublista. (SSGET _X ((0 . CIRCLE) (-4 . >=) (40 . 50.4) (62 . 3))) En este caso se seleccionan los circulos -(0 . CIRCLE)-, cuyo radio sea mayor o igual que 50.4 -(-4 . >=) (40 . 50.4)-, y cuyo color sea el verde -(62 . 3)-. (SSGET _X ((0 . LWPOLYLINE) (-4 . &) (70 . 129))) En este caso se seleccionan las lwpolylines cerradas, bit 1 de la clave 70 de una lwpolyline, independientemente del patrn de tipo de linea que tengan activado, bit 128 de la clave 70 de una lwpolyline. Como veis, no es necesario que aparezca el bit 1 en la expresin de Autolisp. ste est incluido en el bit 129, pero lo controla igual. AGRUPACIN DE FILTROS Como los filtros de comparacin, tambin stos se deben indicar mediante el cdigo especial -4. Estos operadores van en pareja, y a cada operador de apertura le debe corresponder otro igual de cierre. <AND con AND>: Deben cumplirse todos los criterios. <OR con OR>: Debe cumplirse al menos un criterio. <XOR con XOR>: de dos criterios existentes, debe cumplirse uno u otro, pero no los dos. <NOT con NOT>: No debe cumplirse el criterio. En el ejemplo que sigue, seleccionamos todos los arcos, circulos, lineas y lwpolilineas cuya elevacin sea distinta de cero.
Cdigo: (SETQ conj_dibujo (SSGET "_X" '((-4 . "<OR") (-4 . "<AND") (0 . "LINE") (-4 . "*,*,!=")(10 1 1 0) ;Pto inicio con Z distinta de 0 (-4 . "*,*,!=")(11 1 1 0) ;Pto final con Z distinta de 0 (-4 . "AND>") (-4 . "<AND") (0 . "LWPOLYLINE") (-4 . "!=")(38 . 0) ;Elevacin de polilnea distinta de 0 (-4 . "AND>")

(-4 . "<AND") (0 . "ARC") (-4 . "*,*,!=")(10 1 1 0) ;Pto centro con Z distinta de 0 (-4 . "AND>") (-4 . "<AND") (0 . "CIRCLE") (-4 . "*,*,!=")(10 1 1 0) ;Pto centro con Z distinta de 0 (-4 . "AND>") (-4 . "OR>") ) ) ;_fin de SSGET )

(SSADD [<nom> [conj>]]) AADE ENTIDAD A CONJUNTO Aade una entidad a un conjunto designado. Empleado sin argumentos crea un conjunto vaco sin elementos. (SSDEL <nom> <conj>) BORRA ENTIDAD DE UN CONJUNTO Elimina la entidad <nom> de el conjunto <conj>. OTROS COMANDOS PARA OPERAR CON ENTIDADES (SSLENGTH <conj>) NUMERO DE ENTIDADES DE CONJUNTO Devuelve el nmero de entidades de un conjunto. (SSNAME <conj> <posicin>) NOMBRE DE ENTIDAD Devuelve el nombre de una entidad perteneciente a un conjunto, situada en una posicin determinada. Las entidades de un conjunto ocupan una posicin que se empieza a contar desde cero. Un conjunto con 5 entidades estara numerado de 0 a 4. (SSMEMB <nom> <conj>) COMPRUEBA SI ENTIDAD EST EN CONJUNTO Si el nombre indicado est en <conj>, devuelve ese nombre y si no est devuelve nil. (NENTSEL [<mensaje>]) SELECCIONA ENTIDAD COMPONENTE DE UNA ENTIDAD COMPUESTA. Funciona igual que (ENTSEL) . Sirve para extraer datos de entidades que forman parte de otras entidades, como un bloque o una polilinea. Devuelve una lista con dos elementos. El primero es el nombre de la subentidad y el segundo es el punto de designacin. (NENTSELP [<mensaje>] [<punto>]) SELECCIONA ENTIDAD COMPONENTE DE UNA ENTIDAD COMPUESTA MEDIANTE PUNTO DE DESIGNACIN Es igual que (NENTSEL) pero con la posibilidad de indicar el punto de designacin. (ENTGET <nom>) LISTA ENTIDAD Busca en la base de datos el nombre de la entidad indicada y devuelve una lista completa de dicha entidad. Lgicamente, debemos obtener el nombre previamente, mediante cualquiera de los comando que ya vimos para tal fin: SSNAME, ENTLAST, ENTNEXT Una vez obtenida la lista, podemos acceder a todos los datos de la entidad mediante el comando (ASSOC) visto en el Tema 7. Supongamos que acabamos de dibujar un arco. (SETQ lista_ent (ENTGET (ENTLAST))) Con esto almacenamos en la variable lista_ent la lista perteneciente al arco que acabamos de dibujar, que podra ser esta:
Cdigo: ((-1 . <Nombre entidad: 7272b6e8>) (0 . "ARC")

(330 . <Nombre entidad: 7ef7acf8>) (5 . "D62CD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Escollera") (100 . "AcDbCircle") (10 301.164 2023.47 0.0) (40 . 494.779) (210 0.0 0.0 1.0) (100 . "AcDbArc") (50 . 4.23078) (51 . 5.82005) )

Si queremos saber la coordenada X del centro, debemos saber primero que la clave DXF 10 contiene las coordenadas del centro. As:
Cdigo: (SETQ Xcentro (CADR (ASSOC 10 lista_ent))); Coordenada X del centro del arco.Es el segundo elemento de la sublista. (SETQ Ycentro (CADDR (ASSOC 10 lista_ent))); Coordenada Y del centro del arco. Es el tercer elemento de la sublista. (SETQ Zcentro (CADDDR (ASSOC 10 lista_ent))); Coordenada Z del centro del arco. Es el cuarto elemento de la sublista. (SETQ radio (CADR (ASSOC 40 lista_ent))); Valor del radio

(ENTDEL <nom>) BORRA O RECUPERA ENTIDAD Si la entidad <nom> existe, es borrada. Pero si no existe es recuperada, siempre y cuando haya sido borrada con ENTDEL. Slo vale para la actual sesin de dibujo. (ENTMOD <lista-entidad>) ACTUALIZA LISTA Sirve para actualizar una lista de una entidad, previa modificacin de esta. Supongamos el caso visto antes, del arco.
Cdigo: (SETQ lista_ent (ENTGET (ENTLAST))) (SETQ nueva_lista (SUBST (CONS 8 "Muro") (ASSOC 8 lista_ent) lista_ent)) (ENTMOD nueva_lista)

Lo que hemos hecho es, partiendo de la lista del arco lista_ent, hemos creado una nueva lista nueva_lista, donde hemos cambiado el arco de capa, pasndolo de la capa Escollera a la capa Muro. (ENTMAKE <lista>) CONSTRUYE UNA ENTIDAD EN LA BASE DE DATOS Podemos construir una entidad de dibujo definiendo correctamente su lista completa, con todos los elementos necesarios. Si omitimos algn dato no imprescindible, como puede ser la capa, la entidad va a la capa actual. (ENTMAKE ((0 . line) (10 50 20 0) (11 100 200 0))) En este caso construimos una lnea partiendo nicamente de los datos de sus coordenadas de los puntos inicial y final. Como no especificamos el color ni la capa, considera los actuales del dibujo. Nos quedara por ver lo referente a tablas de smbolos, que aunque no son entidades de dibujo, tambin son accesibles y pueden ser modificadas. Lo dejamos para el prximo tema. He hecho una rutina sencillita para contar bloques. Aunque en las versiones ms recientes de Autocad ya existe un comando que lo hace, y bastante ms completo, supongo que para practicar servir.
Cdigo: ;;;;;;;;;;;;; CUENTA BLOQUES ;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;

;;;;;; (DEFUN c:cuenta(/ listaent) (while (/= (cdr (assoc 0 listaent)) "INSERT") (setq nomblist1 (entsel "\nSelecciona bloque:")); lista con nombre y punto de designacion, de la entidad seleccionada (setq nomblist (car nomblist1)); Nombre de la entidad seleccionada (setq listaent (ENTGET nomblist)); lista completa de la entidad seleccionada (if (/= (cdr (assoc 0 listaent)) "INSERT") (princ "\nEl elemento seleccionado no es un bloque") ) ); Fin while (setq nombloc (cdr (assoc 2 listaent))); nombre del bloque (SETQ conj1 (SSGET "_X" (LIST(CONS 0 "insert")))); Conjunto con todos los bloques del dibujo (SETQ conj (SSGET "_X" (LIST (CONS 0 "insert") (CONS 2 nombloc) ) ) ); conjunto con los bloques de igual nombre que el seleccionado (SETQ enti1 (SSLENGTH conj1)) (SETQ enti (SSLENGTH conj)) (prompt "\nDe los ") (prin1 enti1) (prompt " bloques existentes en el dibujo, ") (prin1 enti) (prompt " son igual que el seleccionado") (prompt "\n Roberto Gonzlez ;-)") )

TEMA 9: TABLAS DE SIMBOLOS, FUNCION ERROR, CONCLUSIONES: Ya vimos en el captulo 7, referente a las variables de sistema y uso de listas, cmo podamos acceder a las entidades de dibujo y sus caractersticas, mediante el acceso a las listas que los definan. Pues bien. Existen las denominadas Tablas de Smbolos, que son listas pertenecientes a objetos de Autocad que pueden ser no visibles en pantalla, y que contienen datos de la configuracin de nuestro dibujo. Existen un total de 9 Tablas de smbolos en Autocad: LAYER, STYLE, LTYPE, UCS, VPORT, VIEW, DIMSTYLE, APPID y BLOCK RECORD. Al igual que con las entidades de dibujo, hay unos cdigos DXF que son comunes para todas las Tablas y otros que son especficos de cada una en particular. Al igual que ya dijimos en el captulo 7, en la ayuda del editor de VLisp podis encontrar el significado de cada clave, para cada tabla. Ayuda del editor VLisp / Manual de referencia de DXF / Seccin Tables-Blocks-Entities. Destacar que el cdigo 0 es comn a todas las tablas, as como el 2, el 5 y el 70, entre otros. 0: Tipo de tabla. LAYER, STYLE, LTYPE.....

2: Nombre de la tabla. Ej.: Si es una capa, nombre de la capa. Si es un estilo de texto, nombre del estilo....... 5: Identificador. 70: Nmero mximo de entradas de la tabla. Nota: Es importante saber que las tablas de smbolos son de slo lectura. Podemos acceder a su contenido, pero no podemos modificarlo. Existen dos comandos para acceder a las Tablas de Smbolos: (TBLNEXT <nombre de la tabla> [<sig>]) DEVUELVE EL CONTENIDO DE UNA TABLA. Devuelve el contenido de una tabla de smbolos, cuyo nombre se especifica y que debe ser uno de los nueve que ya hemos comentado: LAYER, STYLE, LTYPE.... Si existen varias tablas de la especificada, cada vez que utilicemos el comando (TBLNEXT.....) ir devolviendo la siguiente tabla hasta terminar. Si el parmetro <sig> no es nil, vuelve a la primera tabla. (TBLSEARCH <nombre de la tabla> <simb> [<sig>]) DEVUELVE EL CONTENIDO DE UNA TABLA CUYO NOMBRE SE ESPECIFICA. Es igual que (TBLNEXT...), pero en este caso especificamos el nombre de la tabla. Ej.:
Cdigo: (IF(NOT(TBLSEARCH "layer" "puntos_2d")) (COMMAND "_-layer" "_n" "puntos_2d" "") )

En este caso hemos utilizado el comando (TBLSEARCH) para crear una nueva capa, previa bsqueda de la misma. Como la capa que buscbamos no existe, la creamos. Se trata de la capa puntos_2d. Ejemplo de listas de las Tablas de Smbolos: CAPA:
Cdigo: ((0 . "LAYER") (2 . "POLIGONOS") (70 . 0) (62 . 7) (6 . "CONTINUOUS") )

TIPO DE LINEA:
Cdigo: ((0 . "LTYPE") (2 . "CONTINUOUS") (70 . 0) (3 . "Solid line") (72 . 65) (73 . 0) (40 . 0.0) )

ESTILO DE TEXTO:
Cdigo: ((0 . "STYLE")

(2 . "STANDARD") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (71 .0) (42 . 0.0) (3 . "romans.shx") (4 . "") )

ESTILO DE ACOTACIN:
Cdigo: ((0 . "DIMSTYLE") (2 . "CAJAS") (70 . 0) (3 . "") (4 . "") (5 . "") (6 . "") (7. "") (40 . 1.0) (41 . 0.2) (42 . 0.0625) (43 . 0.38) (44 . 0.18) (45 . 0.0) (46 . 0.0) (47 . 0.0) (48 . 0.0) (140 . 0.18) (141 . 0.09) (142 . 0.0) (143 . 25.4) (144 . 1.0) (145 . 0.0) (146 . 1.0) (147 . 0.09) (71 . 0) (72 . 0) (73 . 1) (74 . 1) (75 . 0) (76 . 0) (77 . 0) (78 . 0) (170 . 0) (171 . 2) (172 . 0) (173 . 0) (174 . 0) (175 . 0) (176 . 0) (177 . 0) (178 . 0) (270 . 2) (271 . 3) (272 . 3) (273 . 2) (274 . 2) (340 . <Nombre de entidad: 7ef99f18>) (275 . 0) (280 . 0) (281 . 0) (282 . 0) (283 . 1) (284 . 0)

(285 . 0) (286 . 0) (287 . 3) (288 . 0) )

*ERROR* <cadena> FUNCIN DE ERROR Este no es un comando propiamente dicho, sino una funcin que se emplea para salvaguardar el buen funcionamiento de nuestras rutinas, de manera que cuando se produzca un error, el programa no se quede colgado y pueda finalizar correctamente. Cada vez que se produzca un error en nuestra rutina, se ejecutar esta funcin. Esta funcin suele emplearse con el comando (IF....), de forma que, si se produce el error, se resuelva mediante una serie de operaciones alternativas. El nico argumento que admite es una <cadena> donde quedar almacenado el tipo de error producido, mediante una cadena de texto. Esto quiere decir que debemos contemplar la posibilidad de que dentro de una rutina se puedan producir errores distintos que devuelvan una cadena diferente. Para eso utilizaremos el (IF (= cadena ......)). Ej.:
Cdigo: (DEFUN *error* (cadena) (IF (= cadena "bad argument type").......) (IF (= cadena "bad suscript").......) (IF (= cadena .....).....) )

Y con esto damos por concluida este tema y este entretenido temario. Si bien aqu no aparecen todas las funciones de AutoLisp, s podemos decir que estn las ms importantes. Aquellas que no aparecen y otras muchas curiosidades las dejo a merced del espritu de investigacin y el nimo de aprender de cada uno. Como la pretensin de este curso no era otra que la de iniciarse en el mundo de la programacin para AutoCad, creo que para empezar puede servir. Todas aquellas dudas, consultas, sugerencias y dems menesteres, estoy seguro que mis compaeros del foro de Autolisp, ms sabios y expertos que yo, estarn encantados de responder y solucionar. Posterior al lenguaje Autolisp, y con intencin de solucionar algunas carencias y simplificar algunos tratamientos, naci VisualLisp. Este nuevo lenguaje incorpora multitud de nuevas funciones, que unidas a las ya existentes de AutoLisp, lo convierten en una excelente herramienta de ayuda en el uso de AutoCad. Cabe sealar que AutoLisp y VisualLisp van de la mano. Es decir. No son programas independientes y sus comandos se pueden combinar sin ningn problema. El propio editor de Autolisp sirve para VisualLisp, y la estructura de las rutinas es exactamente la misma. Con sus funciones, variables locales, globales, etc. Otra herramienta que tambin es muy interesante y complementa a la perfeccin todo lo visto hasta ahora es el uso de cajas de dilogo, que los propios manuales de AutoLisp y VisualLisp desarrollan. Y el uso de mens personalizados. En el foro de tutoriales existen dos temas al respecto, donde aprenderemos sin problemas todo lo referente a este ltimo apartado. Espero que haya sido de utilidad todo lo visto en este mini curso on-line. Pido perdn por las carencias y meteduras de pata, que seguro que las hay. Y deseo que salgan grandes maestros y doctores en la materia, que hagan ms grande este foro y ayuden a los que no sabemos y deseamos aprender. Y ya para terminar, quiero recordaros que estos tutoriales han sido elaborados siguiendo las pautas y directrices de dos libros ya editados: Autor: Jose Antonio Tajadura y Javier Lpez Tit: Autolisp 12,13,14 Edit: Mc Graw Hill Autor:Reinaldo togores y Csar Otero Tit: Programacin en Autocad con Visual Lisp Ed.: Mc Graw Hill ROBIERZO.