Vous êtes sur la page 1sur 43

FAQ sobre AutoLISP del comp.cad.autocad Ttulo: FAQ sobre AutoLISP del comp.cad.

autocad Nombre de archivo: CAD/autolisp-faq-es URL de la versin original en Ingls: xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html <http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html> Versin: 2.28 ltima modificacin: "2001-06-18 13:39:42" Versin original publicada por: Reini Urban <rurban@x-ray.at> Frecuencia de publicacin: Mensual Copyright: Ver Apendice [A] Bienvenido al FAQ sobre AutoLISP del comp.cad.autocad! AutoLISP es un lenguaje de programacin para AutoCAD, un famoso programa de CAD. La versin original en Ingls de este FAQ sobre AutoLISP se publica en comp.cad.autocad, alt.cad.autocad y los grupos *.answers mensualmente. Algunos FAQs de AutoCAD estn en <http://www.autodesk.com/support/autocad/> pero no se publican en el comp.cad.autocad. El contenido y los ejemplos son aplicables a todas las versiones de AutoLISP desde la versin 10, incluyendo Visual LISP, Vital LISP y ACOMP. No existe un grupo de noticias especifico para AutoLISP. Los mejores son comp.cad.autocad o autodesk.autocad.customization, pero por favor no molesteis en comp.lang.lisp! El cdigo fuente de todas las rutinas de este FAQ est en FAQ-CODE.LSP (para localizarlo ver [A.1]). Gracias a todos los que han contribuido. Las correcciones y contribuciones sern bien recibidas en rurban@x-ray.at <mailto:rurban@x-ray.at?subject=FAQ>. Por favor, mira en AcadWiki:RulesToLiveBy <http://xarch.tu-graz.ac.at/acadwiki/RulesToLiveBy> las normas de netiqueta. Se utiliza la siguiente notacin en el ndice de contenidos: | Modificado + Aadido <..> Comentarios personales o datos por confirmar ndice de contenidos Parte 1: General [0] El Futuro de AutoLISP? Debera aprenderlo o VB en su lugar? [0.1] Qu ha cambiado con AutoCAD 2000? [0.2] No podremos crear ARX nunca ms? [1] Dnde puedo encontrar rutinas de AutoLISP en Internet? [1.1] Se almacenan los artculos del comp.cad.autocad en algn lugar? [1.2] El SDK de Autodesk [2] Cules son los mejores libros para aprender AutoLISP? [2.1] Documentacin en linea sobre AutoLISP, archivos de ayuda [borrado] [2.2] Estilo del cdigo en AutoLISP [3] Cmo depurar los programas de AutoLISP? [3.1] Depuradores nativos de AutoLISP [3.2] Estilo modular, TRACE [3.3] La funcin BREAK, debug-print [4] Cmo puedo proteger mis programas de AutoLISP? Seguridad [4.1] Kelvinate [4.2] Protect [4.3] Kelvinate y Protect [4.4] Convert [4.5] ACOMP [4.6] Vital LISP Professional

[4.7] Lisp2C [4.8] Visual Lisp de Autodesk [5] Compiladores de AutoLISP [5.1] ACOMP [5.2] Vital LISP Professional [5.3] Visual Lisp de Autodesk [5.4] Los mejores: Common Lisp y Scheme [6] Editores de AutoLISP y otras herramientas [6.1] Editores de AutoLISP [6.2] Analizadores, empaquetadores y detectores de parntesis [6.3] Formateadores de cdigo [7] AutoLISP: problemas y errores [aadido] [8] Clasificando con AutoLISP [aadido] [9] Recursividad [10] Iteracin con MAPCAR,... [11] Mis Lisps no se cargan al iniciar [fijo] [12] Cmo cargar automticamente mis programas? [13] Cmo pasar un nmero variable de argumentos a una funcin Lisp? [14] Cmo puedo evitar los rebosamientos de pila? [cambios] [15] (command "_ROTATE3D") no funciona! Por qu? [16] Rutinas AutoLisp operando sobre mltiples dibujos [17] Cmo exportar las funciones de Visual LISP a AutoLISP/AutoCAD? Parte 2: Ejemplos, cdigo [20] Funciones de utilidad general [20.1] Manipulacin de listas [20.2] Manipulacin de cadenas de texto [20.3] Smbolo -> Cadena de texto [20.4] Acceso a las entidades de AutoCAD [21] Ejemplos de programas de Lisp: [21.1] Cambio global de textos, polilneas, utilidades para capas, date stamp [21.2] Letrero de impresin desde Lisp. Usando DDE o ActiveX [21.3] (entmod) y (entmake) capas, sin (command "_LAYER"...) [21.4] Cmo seleccionar mltiples archivos en Lisp? (como en ARCHIVOS - Desbloquear) [21.5] Reemplazar bloques mltiples [21.6] (vports), la entidad VIEWPORT, conversin de pixels [21.7] Seleccionar todos los objetos visibles: coordenadas del zoom [21.8] Cmo escribir las coordenadas XYZ de los objetos seleccionados, en un archivo? [22] Atributos de los bloques [22.1] Cmo acceder a los atributos de un bloque? [22.2] Cmo modificar los atributos de un bloque? DATESTAMP.LSP [22.3] Cmo actualizar los atributos de un bloque? [22.4] Cmo crear con ENTMAKE un Bloque complejo en AutoLISP? [23] Polilneas [23.1] Cmo acceder a los vrtices de una polilnea? [23.2] <http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html> Cmo unir mltiples lneas en polilneas? [23.3] Cambiar el grosor de mltiples polilneas [23.4] Crear una polilnea o spline: con (ENTMAKE) o (COMMAND) [23.5] Cmo calcular la longitud de polilneas? [23.6] Cmo invertir el sentido de una polilnea?

[23.7] Cmo obtener el centro de una polilnea? [nuevo] [24] Geometra de Circulo/Arco: BULGE, algo de trigonometra [25] DCL: listboxes con tabuladores o fuentes monotext [26] EED Extended Entity Data: Obtener y almacenar [26.1] Seleccionar objetos sobre sus EED con (ssget "X") [26.2] Conseguir EED desde un objeto [27] Cmo interrumpir un comando en Lisp? [27.1] Cmo hacer un nmero ilimitado de mensajes para el usuario? [28] <http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html> Cmo descifrar la geometra interna de ACIS con Lisp? [A] Notas del autor + [A.1] Localizaciones del FAQ [B] Agradecimientos [C] Cambios Recientes

[0] El Futuro de AutoLISP? Debera aprenderlo o VB en su lugar?


AutoLISP ser soportado definitivamente en las futuras versiones. VB fue aadido para simplificar la Automatizacin con los programas de ofimtica: ACAD <-> Excel / Access. Ambos lenguajes tienen ventajas e inconvenientes. Deberas echar un vistazo a ambos. VB parece ser ms grfico y AutoLISP ms lgico. El concepto de objeto de VBA parece ser ms fcil de aprender, pero no puedes ejecutar comandos de AutoCAD como en AutoLISP. El nuevo VBA (>= R14.01) es extremadamente rpido. Ver tambin [5.2]. El futuro de AutoLISP ya es Visual LISP. Visite: www.autodesk.com/vlisp <http://www.autodesk.com/vlisp>, www.autodesk.com/develop/devres/visual/faq.htm <http://www.autodesk.com/develop/devres/visual/faq.htm>, y tambin [0.1] ms abajo.

[0.1] Qu ha cambiado con AutoCAD 2000?


El nombre :) No, hay mucho ms, pero deberias llamarlo edicin 2000, R15 (piensa que 15 es el nmero de la versin y no el nmero de la edicin), A2000 o abrebiado A2K. El nuevo kernel del Visual Lisp reemplaza al antiguo kernel de AutoLISP. Qu problemas deberas esperar con Visual Lisp en A2000? (solo las malas noticias) En xarch.tu-graz.ac.at/autocad/docs/r2000-news.txt <http://xarch.tu-graz.ac.at/autocad/docs/r2000news.txt> las he reunido. Usa el LCA para chequear tus lisps. Los puntos principales son: Estrictos errores chequeando en la carga. ACAD.LSP vs ACADDOC.LSP, No puedes / necesitas compilar a ARX nunca ms. Incompatibilidades AutoLISP - Visual LISP: Las funciones de AutoLISP son elementos, no listas. Simbolos protegidos. Mejora de las excepciones de manejo. Ruta de los VLX cargados? vl-export-symbol -> vl-doc-set ..., Nombres largos en las tablas de simbolos: EXTNAMES. ActiveX automation, variantes y SAFEARRAYs. FAS4 no puede cargarse en la R14.

[0.2] No podremos crear ARX nunca ms?


Con AutoCAD 2000 no podrs hacerlo nunca ms tal como hacas con ViLL o VLISP 4. En cambio compilas a VLX (Visual Lisp Extension), el cual tiene bsicamente la misma funcin que el antiguo ARX de Visual Lisp/Vital Lisp, con las siguientes diferencias: Tendrs que cargar (load) la aplicacin. Antes haba que usar (arxload). Pro: La inicializacin es ms sencilla. El VLX no aborta por completo si se produce cualquier error en la carga. Antes el ARX entero fallaba al mnimo error. Pro: VLX es mucho menor porque no lleva el entorno Lisp entero, el VLRTS. En cambio hay un nico entorno, VL.ARX, distribuido con el propio AutoCAD. As que podrs crear aplicaciones mucho menores. Contra: Con la carga VLX no hay un camino fcil para obtener la ruta de la aplicacin. Antes era posible con (arx) o (vl-exe-filename). VLX tiene la opcin de crear ARX independientes o uno comn. Con ARX independientes tienes unicamente la opcin de entornos independientes (de hecho entornos lisp completamente independientes). Pro: Esto significa que ahora puedes seleccionar el modo de compilacin ms rpido y seguro (LINK, DROP) y an mantener un nombre de entorno comn. (La mayora de mis aplicaciones se benefician de eso. Yo separo mis aplicaciones en un mdulo principal y muchos otros pequeos) Pro: ARX es solo compatible por edicin, es decir completamente incompatible! VLX es nuevo y por tanto compatible solo con las nuevas versiones (R16, ...) pero como las aplicaciones lisp es por mucho ms compatible que las aplicaciones ARX. Las aplicaciones ARX cargadas con (arx) devuelven la ruta, al cargar las aplicaciones VLX con (vl-list-loaded-vlx) solo devuelve un simbolo, no la ruta. Esto es una deficiencia de diseo. No necesitaras los mdulos ARX nunca ms. Esto es una caracteristica, no un error.

[1] Dnde puedo encontrar rutinas de AutoLISP en Internet?


Los mayores sitios con utilidades para AutoCAD, son: AutoCAD Plugin Store por beyond.com. www.cadplugins.com/ <http://www.cadplugins.com/> Este es el sitio con utilidades "oficialmente recomendado" por AutoDESK. CADalog - The AutoCAD Shareware Clearinghouse (Mike Clark) www.cadalog.com/ <http://www.cadalog.com/> The CAD Depot Conocido formalmente como CADSyst (David Whynot) www.caddepot.com/ <http://www.caddepot.com/>, recently <http://www.tenlinks.com/CAD/News/041800tenlinks.htm> llevado por TenLinks. Estn especializados en software para AutoCAD y tienen una muy buena coleccin de AutoLISP. Otras direcciones con programas shareware de AutoLISP se publican habitualmente en el grupo de noticias. Otros sitios relevantes son: [nuevo] TenLinks <http://www.tenlinks.com/CAD/cad_news.htm> y el UpFront <http://www.upfrontezine.com/> EZine son las mejores fuentes de noticias. Autodesk inicio el portal Point A <http://www.autodesk.com/pointa>. Algunos otros sitios con colecciones de AutoLISP son: xarch AutoCAD Info & Tools (Reini Urban) xarch.tu-graz.ac.at/autocad/ <http://xarch.tugraz.ac.at/autocad/> (con buscador) CAD Users Webring <http://nav.webring.org/hub?ring=caduser&list> [nuevo] CADalyst magazine code (compilado por "Hot Tip Harry" Art Liddle) www.cadonline.com/code/ <http://www.cadonline.com/code/> Owen Wengerd

<http://www.manusoft.com/> Terry Dotson www.dotsoft.com/ <http://www.dotsoft.com/> AcadX [nuevo] <http://www.acadx.com/> Paul Turvill [nuevo] www.turvill.com/t2/ <http://www.turvill.com/t2/> Vladimir Nesterovky vnestr.tripod.com/ <http://vnestr.tripod.com/> Theo L.A. Groenenberg members.xoom.com/acadvice/autolisp.htm <http://members.xoom.com/acadvice/autolisp.htm> The CADshack (Jeff Foster) www.cadshack.com/ <http://www.cadshack.com/> Lisp Factory (Jay Garnett) www.enteract.com/~jgarnett/ <http://www.enteract.com/~jgarnett/> Rakesh Rao - AutoCAD Tech Center www.4dtechnologies.com/techcenter <http://www.4d-technologies.com/techcenter> Enlaces antiguos o rotos: AutoCAD Tech Journal code (Peter Sheerin) [antiguo] <http://www.atj.com/> CADENCE magazine code (Peter Sheerin) [antiguo, roto] www.cadence-mag.com/ <http://www.cadencemag.com/> UCCB AutoCAD and AutoLISP page (Paul Standing) [roto] ucad1.uccb.ns.ca/acad/cad.htm <http://ucad1.uccb.ns.ca/acad/cad.htm> Dr.Lisp Utilities (Alexander Medwedew) [fijo] idt.net/~compvent/ <http://idt.net/~compvent/> McNeel's lisp archive [roto] <ftp://ftp.mcneel.com/lisp/> Desi Moreno [roto] www.invsn.com/desmos/autolisp.htm <http://www.invsn.com/desmos/autolisp.htm> PIRS Online www.insa.com/ <http://www.insa.com/> Henry Francis [roto] www.ez-sys.net/~coopfra/ <http://www.ezsys.net/~coopfra/> SimTel - Coast To Coast - Archive [fijo, muy antiguo] www.simtel.net/pub/msdos/autocad.html <http://www.simtel.net/pub/msdos/autocad.html> En support.autodesk.com <http://support.autodesk.com/><http://support.autodesk.com/> hay documentos del soporte tecnico de AutoDESK contestando preguntas tcnicas. (Sus FAQ'S) La ASA (Support Assistance, algn tipo de FAQs) tena una en www.autodesk.com/support/autocad/asa2000.htm <http://www.autodesk.com/support/autocad/asa2000.htm>, una mejor pero ms lenta utilidad est en support.autodesk.com/KnowledgeBase.asp <http://support.autodesk.com/KnowledgeBase.asp> <http://support.autodesk.com/KnowledgeBase.asp>

[1.1] Se almacenan los artculos del comp.cad.autocad en algn lugar?


No hay ningn archivo del comp.cad.autocad ni nada similar, pero hay algunos motores de bsqueda que almacenan los artculos de los grupos de noticias. En particular: groups.google.com/ <http://groups.google.com/> - El mayor archivo de las news. [new] Conocido formalmente como deja.com/usenet. www.altavista.com/ <http://www.altavista.com/> www.altavista.com/cgi-bin/query?pg=aq&what=news <http://www.altavista.com/cgi-bin/query? pg=aq&what=news> www.excite.com/ <http://www.excite.com/> www.excite.com/search.gw? collection=news <http://www.excite.com/search.gw?collection=news> Phoaks - People Helping One Another Know Stuff - Automatic Links Extractor <http://www.phoaks.com/phoaks2/newsgroups/comp/cad/autocad/index.html> Los foros de noticias de Autodesk tienen tambin un dispositivo de bsqueda en discussion.autodesk.com <http://discussion.autodesk.com/>. Algunos mensajes especficos de hace tiempo se almacenan en xarch.tugraz.ac.at/autocad/news/contents.htm <http://xarch.tu-graz.ac.at/autocad/news/contents.html><http://xarch.tugraz.ac.at/autocad/news/contents.html>.

[1.2] El SDK de Autodesk


Desde la versin 12 un Kit para desarrolladores de software est disponible directamente en Autodesk. El SDK2 se integra en la R12 de forma gratuita. Incluye un montn de cdigo fuente de AutoLISP, ADS y libreras. Comenzando con la R13 Autodesk proporciona una red especial para desarrolladores, comparable a la de Microsoft, el ADN. El CD es comparable al viejo SDK pero ms enfocada para desarrolladores de ObjectARX. Llama a tu distribuidor de AutoDESK ms cercano para hacerte miembro del ADN. Algunos LISP estn en xarch.tu-graz.ac.at/autocad/code/adesk/SDK2/ <http://xarch.tugraz.ac.at/autocad/code/adesk/SDK2/>

En USA, ser miembro del ADN cuesta $600.00 al ao. Los CDs no incluyen cualquier SDK por si mismo, pero la mayora del material en el SDK original se incluye de una forma u otra. (Owen)

[2] Cules son los mejores libros para aprender AutoLISP?


AutoLISP to Visual LISP [nuevo] Kevin Standiford, Autodesk Press, ISBN 0-7668-1517 AutoLISP: Programming for Productivity, William Kramer, Autodesk Press, ISBN 0-8273-5832-6 Essential AutoLISP, Roy Harkow, Springer-Verlag, ISBN 0-387-94571-7 AutoLISP in Plain English; A Practical Guide for Non-Programmers, George O. Head, Ventana Press, ISBN: 1566041406 "Maximizing AutoLISP" Rusty Gesner, Tony y Mark Middlebrook, Tony Tanzillo. Ms informacin en www.group-a.com/~rusty/ <http://www.group-a.com/~rusty/> "AutoLISP Reference Manual" De Autodesk Press. Hasta la R12 vino como un libro de referencia de AutoLISP independiente. En la R13 se convirtio en una parte de la Guia de personalizacin. Con la R14 esta gua se ha compilado como un winhelp. Hay muchos ms libros de AutoLISP. Otros libros recomendables de LISP (no AutoLISP) son: ANSI Common Lisp, (Common Lisp primer) Paul Graham, Prentice Hall, ISBN 0-13370875-6 Structure and Interpretation of Computer Programs, (high-level Scheme) H.Abelson, GJ. Sussman, J. Sussman, MIT Press, ISBN 0-262-01153-0 "Indudablemente uno de los mejores libros de informtica que se han escrito ." LISP 3rd Edition, Patrick Henry Winston y Berthold Klaus Paul Horn, Addison-Wesley Publishing Company ISBN 0-201-08319-1 Looking at LISP, Tony Hasemer, Addison-Wesley Publishing Company, ISBN 0-201-120801

[2.1] Documentacin en linea sobre AutoLISP, archivos de ayuda [borrado en la edicin publicada] La R14 se distribuy con los manuales completos convertidos a Winhelp. Pueden encontrarse los ficheros de ayuda de AutoLISP con: R14 (El conjunto de libros completo) Visual LISP de Autodesk ver [5.3] El antiguo editor Visual Lisp (1.0 es gratuito), ver [1] Vital LISP, (la ayuda tambin est incluida en la demo), ver [6.1] Para DOS existe un programa residente en memoria llamado LISPHLP.EXE <ftp://xarch.tugraz.ac.at/pub/autocad/lsp_tools/lisphlp.zip> (activado con Ctrl-RightShift-R, desde 1988) LSPDOC: En xarch.tu-graz.ac.at/autocad/lsp_tools/#lspdoc <http://xarch.tugraz.ac.at/autocad/lsp_tools/> es una herramienta que automticamente crea winhelp para archivos de LISP.

[2.2] Estilo del cdigo en AutoLISP


La mayora de los ejemplos publicados por revistas o en diversos Webs estn muy mal escritos, haciendo el proceso de aprender AutoLISP ms difcil para los principiantes. LISP es difcil de leer de cualquier manera, por causa de su estructura y la cuenta de parntesis. Todos se esfuerzan en escribir el cdigo claro y legible. Los ejemplos de AutoDESK estn bastantes bien escritos pero a veces ellos lo exageran. :) Existen formateadores automticos de cdigo (ver [6.3]) que automticamente formatean el cdigo de

acuerdo con el formato recomendado. En el CD de la R12, en el SDK2 ACG.DOC o en xarch.tu-graz.ac.at/autocad/docs/acg.txt <http://xarch.tu-graz.ac.at/autocad/docs/acg.txt> hay una excelente documentacin de AutoDESK sobre normas de codificacin, comentarios e tabulacin para mantener el cdigo legible. Los puntos ms importantes son: Comente su cdigo. Usando";;;" en la columna 1, ";;" dentro del cdigo (tabulado) y ";" para insertar comentarios (en la columna 39) Siga las normas de tabulado como son dadas por los formateadores automticos para escribir el cdigo mejor estructurado, que es ms legible. Intente evitar las variables globales. Si las usa, para resaltarlas, nmbrelas con asteriscos y en maysculas *GLOBAL*. No olvidarse de hacer sus variables locales (detrs de / en la lista de definicin de parmetros del comando defun). Durante la depuracin tal vez se quieran convertir temporalmente en globales. Nombres protegidos: AutoLISP no provee ninguna proteccin para los nombres y es fcil sobreescribir las funciones de sistema. Por favor use nicamente prefijos cortos, por lo menos cuando publique o envie su cdigo. Yo uso UR- para funciones y UR: para variables. El ADGE y AutoDESK utilizan siempre 4 letras de prefijo. Entonces tus nombres estn a salvo de ser sobreescritos por otras funciones. Siempre usar el prefijo "_" con cualquier cadena de texto (comandos y opciones) pasada a la funcin command y osnap. Hay programas comerciales que no trabajan sobre versiones internacionales. (command "_PEDIT" ss "_J") es mejor que (command "PEDIT" ss "J"). No abusar de la funcin setq: LISP era originalmente un lenguaje basado en funciones, sin variables. Hay bastantes construcciones que trabajan eficientemente con listas, y sin la necesidad de almacenar los valores intermedios en variables. (Ver ejemplos de cdigo [21]). Pero para hacer el programa fcil de entender y depurar deberas siempre definir variables. Una vieja norma de AutoLISP es: Cualquier funcin buena no es ms larga de 6 lneas. (LISP es el segundo lenguaje de computadora ms antiguo, inventado por John McCarthy del MIT en 1958). Es preferible utilizar CONS en lugar de APPEND: 3 CONS y un REVERSE es mejor que un APPEND. Para trucos con APPEND (omitiendo NIL) vea los ejemplos de Serge: i.e. REMOVE en [20.1] o la comparacin de estilo en [23.1]) Use simbolos y comentarios en ingls. No usar t, min, max o last como simbolos, pues son funciones de sistema.

[3] Cmo depurar los programas de AutoLISP?


[3.1] Depuradores nativos de AutoLISP
Hay tres depuradores nativos de AutoLISP. Visual Lisp y Vital LISP Professional contenidos en el IDE (los mejores). ACOMP para R10 tena uno, gratis, que puede usarse todava pero utilizando solo las funciones LISP para la versin 10. Por ejemplo no puede usarse la funcin WCMATCH. Ld, depurador de AutoLISP para R14, R13C4 y R12/DOS de Cz (gratuito) en www.cadstudio.cz/ftp.htm <http://www.cadstudio.cz/ftp.htm> Ver [5] compiladores de AutoLISP.

[3.2] Estilo Modular, TRACE


La mejor ayuda que puedes tener para depurar un programa es escribir el cdigo con un buen dise,

con estilo modular, separando las distintas tareas en funciones e ir llamando a las funciones cuando hagan falta. Esto te permitir usar la funcin (TRACE) para detectar errores.

[3.3] Se puede incluir una funcin de parada y un print para depurar su cdigo fuente
Ejemplos: ;;; Debugging functions (defun break (s) (if *BREAK* (progn (princ "BREAK>> (stop with )\nBREAK>> ") (princ s) (while (/= (setq s (getstring "\nBREAK>> ")) "") (print (eval (read s))) ) ) ) ) ;bugfix from v1.3! (defun dbg-print (s) ;accepts atoms and lists (if *DEBUG* (if (listp s) (mapcar 'print s) (print s) ) ) ) (defun C:DEBUG () (setq *DEBUG* (not *DEBUG*))) ;switch it on and off (defun C:BREAK () (setq *BREAK* (not *BREAK*))) (defun CONT () (setq *BREAK* nil)) ;continue without any interruption ;;;Example (setq *BREAK* T *DEBUG* T) (defun C:TEST () (foreach x '("1" "1.0" "1e-3") (break "in foreach") ; stops evaluation if *BREAK* is on, you can ; enter x and the value of x is printed ; until you enter Enter (setq x (atof x)) ; this is some code which manipulates x (dbg-print x) ; this prints the new value of x ; if *DEBUG* is on ) ) Command: TEST BREAK>> (stop with <Enter>) BREAK>> in foreach BREAK>> x 1.0 BREAK>> (CONT) ; turn off the break nil BREAK>> <Enter> 1.0

1.0 0.001 Tambin puedes desactivar el depurador con BREAK>> (setq *DEBUG* nil) para continuar en bucles largos.

[4] Cmo puedo proteger mis programas de AutoLISP?


"Tienes realmente que protegerlos? Si simplemente quieres compartir rutinas con tus amigos, por qu no les das el cdigo? Tu cdigo est protegido de todos modos por el copyright, siempre impicito. Trabajar con otros puede ser una excelente manera de conseguir nuevas ideas y mejorar una aplicacin. Algunas de las mejores utilidades que tengo son las que mis amigos han mejorado, o algunas que yo he mejorado de mis amigos." (Dennis) [4.1] Kelvinate Con kelv.exe (en el CD de la R12 o en las direcciones de [1]). Des-Kelvinate los LISP con cualquier formateador automtico. Pero los nombres de las variables permanecern encriptados y se perderan los comentarios. [4.2] Protect Con protect.exe (en el CD de la R12 o en las direcciones de [1] <../../Con%20protect.exe%20(en%20el %20CD%20de%20la%20R12%20o%20en%20direcciones%20de%20%5B1%5D).%20Pero %20existen%20desprotectores.>). Pero existen desprotectores. Gratuito. [4.3] Kelvinate y Protect Primero kelvinate lo hace ilegible, entonces Protect lo protege. Gratuito. [4.4] Convert Encriptador y desencriptador Shareware de Maciej Lukasiewicz. Con Convert se pueden proteger los LISP encriptados y no pueden ser desprotegidos por otros programas, pero si por el propio Convert. [4.5] ACOMP Compilador de AutoLISP ACOMP.EXE, en la R12 internacional o las direcciones web de AutoLISP. Gratuito. Ms informacin sobre ACOMP en xarch.tu-graz.ac.at/autocad/bi4 <http://xarch.tugraz.ac.at/autocad/bi4/> Ver tambin [5.1] Compiladores de AutoLISP. [4.6] Vital LISP Professional www.basissoftware.com/vill.htm <http://www.basissoftware.com/vill.htm> Llamado "Vill". Anticuado. Ver [5.2] Compiladores de AutoLISP. [4.7] Lisp2C Convierte ficheros de LISP a C, para R12/R13/R14 Dos/Windows (Watcom, Metaware, MSVC Libreras). Es necesario un compilador de C/C++. <http://www.basic.si/> [4.8] Visual Lisp de Autodesk Tambin llamado "vlisp". El futuro. Ver [5.3] FAS seguridad: Hubo recientemente una larga discusin sobre FAS seguridad en ambos grupos de noticias. Aparentemente FAS puede descompilarse a cdigo fuente, pero dicha utilidad no est disponible en la red an. Hay rumores que dicen que los archivos MNC pueden tambin descompilarse pero tampoco existen en la red. FAS/VLX enlazado y suelto (compilados con optimizado/Interno) es similar a la kelvination. Los nombres de los simbolos, cadenas de textos y nmeros son ms inseguros que los algoritmos. Resumen: Una encriptacin realmente seria es nicamente proporcionada por Vital LISP y sus sucesores. Kelvinate [4.1] hace los ficheros LISP ilegibles y se cargan ms rpido. Los ficheros protegidos con Protect [4.2] pueden desprotegerse fcilmente. Con Convert -e$GUARD los ficheros solo pueden

desprotegerse con el propio Convert.

[5] AutoLISP compilers


Hay tres compiladores de AutoLISP, algunos mejores podran utilizarse en el futuro. Algunos lisp y plataformas de proyecto ya soportan, o lo harn, ActiveX o un simple FFI. [5.1] ACOMP Acomp fue soportado hasta R12 nicamente por las versiones internacionales. Es gratuito, y no trabaja con R13 ni con el R12 win. Genera archivos con extensin *.BI4 y necesita un ACADL.EXP proporcionado como ACADLC.EXP. Vea xarch.tu-graz.ac.at/autocad/bi4/ <http://xarch.tugraz.ac.at/autocad/bi4/>. Los avisos del compilador son ms explcitos en simbolos locales que en el ViLL/VLisp. [5.2] Vital LISP Professional Creado por Basis Software, USA. Licencia gratuita para R12/R13/R14 DOS/Windows/NT. Basis no continuar desarrollando Vital Lisp. Ver tambin [6.1] y [4.6] [5.3] Visual Lisp by Autodesk VLISP 4 (para R14), el sucesor del Vital LISP, es basicamente el mismo que el ViLL 3.2. Solo el GUI, algunos nombres de funciones y la documentacin ha cambiado: vill- => vlisp-, vlx- => vl- prefijos. Algunas funciones vlax- tienen ms opciones. Con AutoCAD 2000 VLISP reemplaza el antiguo motor de AutoLISP. Ver [0.1] los archivos VLX son empaquetados en archivos FAS con recursos opcionales de DCL, usados por R14/R15. R15 FAS/VLX son incompatibles con las versiones anteriores (FAS2-> FAS4) debido a los dispositivos aadidos al lenguaje (nombres de entorno independientes). [5.4] Los mejores: Common Lisp y Scheme El ARX nativo existe para Corman Common Lisp (una consola simple), COM es soportado por Allegro Common Lisp 5, Lisp funcionan para Windows y en el futuro para GambitC. Via un FFI <http://xarch.tu-graz.ac.at/autocad/lisp/ffis.html> ("Foreign Function Interface") casi todo lisp o scheme puede comunicarse con AutoCAD. Poco trabajo se hizo con Corman Lisp y ACL5, actualmente un producto comercial utiliza ACL5 ("Design++" <http://www.dp.com/> de Design Power) Ver xarch.tu-graz.ac.at/autocad/bi4/ <http://xarch.tu-graz.ac.at/autocad/bi4/> para ms informacin. Resumen: Los compiladores de AutoLISP son compiladores de cdigo byte necesitando un sistema de ejecucin. AutoCAD 2000 ahora utiliza VLISP, as que el sistema de ejecucin est incluido. No puedes crear programas independientes. Aunque ViLL / VLISP (<= R14) creo un ARX independientemente. Las variables estn encriptadas.

[6] Editores de AutoLISP y otras herramientas [6.1] Editores de AutoLISP


Visual Lisp de Autodesk Ver [5.3]. El mejor y la herramienta ms recomendable. Con AutoCAD 2000 es incluido gratuitamente. Emacs para NT Editor enorme y bastante difcil de aprender pero est escrito y es personalizable en elisp, que es muy similar al AutoLISP. La madre de todos los editores. Gratis, para todas las plataformas. Viene en dos sabores, XEmacs o GNU ntemacs. El modo de AutoLISP en <http://xarch.tu-graz.ac.at/autocad/lsp_tools/ntemacs.html> Vital LISP Actualizado por el Visual Lisp. No volver a estar disponible. Ver [5.2] Compiladores de AutoLISP LispLink 2000 Editor de AutoLISP comercial con resaltador de sintaxis, controlador de

parntesis, gestor de proyectos, previsualizacin de letreros de dialogo y soporte para las funciones de Visual LISP y la compilacin a FAS. www.caelink.com/ <http://www.caelink.com/> CodeMagic [new] Editor de texto freeware con reslatador de sintasix de AutoLISP. Material antiguo: LispPad Editor para AutoLISP de Tony Tanzillo. Visual Lisp de WSSW. Antiguo y pequeo editor de Lisp para Windows. Version 1.0 era an gratuita. No mezclar con Visual Lisp, el nuevo AutoLISP. Este es solo un pequeo editor. Ver [1] WCEDIT 2.02 Editor de ADS para DOS R12, puede evaluar cdigo lisp desde el editor, gratuito. Ver [1] CODEKEY Antiguo IDE DOS, formateador de cdigo interno, protect, unprotect, kelvinator, <disponible?> ALLY 3.0 and CADET Editor y analizador shareware de Lisp. Ver [6.2] pred Gratuito, pequeo editor de DOS que dispone de un resaltador de parntesis. En <ftp://xarch.tu-graz.ac.at/pub/autocad/lsp_tools/pred.zip> Un editor similar es ADE. Los editores de proposito general personalizables como Multiedit Pro 7, Winedit, E!, TextPad, UltraEdit o PFE son tambin bastante utilizados. No proporcionan la sintaxis de parntesis de AutoLISP o formateado del cdigo, pero si busquedas multi-ficheros y resaltado de texto personalizable.

[6.2] Analizadores, empaquetadores y detectores de parntesis


Los detectores de parntesis no deberan utilizarse nunca ms, deberan estar incorporados dentro del editor. Los analizadores generan una refencia cruzada de funciones, el arbol de llamadas a las funciones y su inverso. Los empaquetadores se emplean para generar librerias a partir de varios archivos fuente, copiando todas las funciones necesarias. Actualmente no hay paseadores de cdigo que puedan internacionalizar las cadenas de texto de los comandos, pero con la R15 vena un analizador de lisp (LCA). VLISP [5.3] Su compilador analiza (compila con todos los mensajes) y chequea parntesis (CTRL+ALT+C). Reini's AutoLISP Packager xarch.tu-graz.ac.at/autocad/lsp_tools/#Packager <http://xarch.tugraz.ac.at/autocad/lsp_tools/> Bscdor de referencias cruzadas de funciones, arbol inverso al de llamada, crea una librera a partir de los archivos fuente. ("Empaquetador" o "meneador de funciones"). PEI's Findvars Similar al anterior, pero no solo trabaja con funciones, adicionalmente detecta simbolos para ser localizados <http://www.perceptual-eng.com/>. Yo personalmente uso este y mi empaquetador. RapidLisp v1.0c analizador lisp shareware para la R14 www.cps.de/cad/rapidlisp/ <http://www.cps.de/cad/rapidlisp/> AVC - AutoLISP Variable Collector. Gratuito. Busca todas las variables a ser declaradas por funcin users.actcom.co.il/sysoft/vc.htm <http://users.actcom.co.il/sysoft/vc.htm> LCA - Autodesk's AutoLISP Compatibility Analyzer [new] En el CD de migracin. Especifica los detalles de compatibilidad con AutoCAD 2000 encontrados en archivos especficos de AutoLISP (LSP) o de menus lisp (MNL). ALLY30.ZIP (antiguo) Analizador lisp shareware. Chequea la sintaxis y muestra estadisticas (arbol de dependencia de funciones), ver [1] lck21b.zip (antiguo) LCK LISP Checker 2.1b (grfico) paran.zip (antiguo) Sencillo. PARNCH.ZIP (antiguo) Sencillo. Tambin existen programas de AutoLISp que cuentan parntesis.

[6.3] Formateadores de cdigo


Externos: FMT202S.ZIP Formateador del cdigo para Lisp, DCL y FRM. LB.EXE Corrector de cdigo de Autodesk. En el SDK2 o en [1]. Tiene problemas con cadenas de texto largas, y comentarios en lnea con nuevos estilos. PPRINT.LSP en el SDK2 o en [1] . Internos: Visual Lisp, Vital LISP, Emacs and Codekey proporcionan correctores de cdigo internos.

[7] AutoLISP problems and bugs


Para AutoCAD 2000 y usuarios sin experiencia con vlisp, ver [0.1]. Alli estn los ms importantes bugs conocidos. El interprete del lenguaje (ACADL.EXE/.EXP, VLISP) funciona indudablemente bien. Algunas restricciones estn basadas en AutoCAD, ActiveX o el Proteus (DCL). Algunos archivos de soporte LISP (i.e. DDMODIFY.LSP) tienen a veces defectos. Para Visual Lisp ver el archivo README.txt que lista una serie de bugs y limitaciones. Los errores con los reactores son producidos por bugs de Acad. Existen 2 listas no oficiales de bugs en: www.cadonline.com/exclusive/bugs/bugwatchlist.htm <http://www.cadonline.com/exclusive/bugs/bugwatchlist.htm> (la mayor) www.dotsoft.com/buglist.htm <http://www.dotsoft.com/buglist.htm> (una privada y menor) Listado de bugs: + LDATA por Tom Berger (VLISP para R14 y A2000) En resumen: No use LDATA por todo. Puede destruir archivos DXF y DWG en A2000. Es tabbin muy dificil librarse de ellos. Las listas de argumentos con pares punteados pasados de AutoLISP a Visual LISP o devueltos, pueden perder el parentesis exterior. Ver el fichero README.TXT del Visual LISP (indocumentado en Vital Lisp). Las listas de elementos simples se devuelven incorrectamente desde aplicaciones externas. Visual LISP no puede distinguir entre una lista y un elemento simple, y un elemento devuelto desde una aplicacin externa ObjectARX o ADS. (entget) usado con LWPOLYLINE, HATCH (solo R14). La coordenada Z (caddr (getval 10 ele)) es un nmero aleatorio y frecuentemente ocasiona un fallo porque puede ser demasiado bajo o alto. Ver [23.1]. ENTMAKE vertices por Terry Dotson (solo R14). Puede ocurrir un problema usando (entmake) para crear polilneas, debes asignar la capa a cada definicin de vrtice (como nos ha dicho Autodesk), pero debes tambin asignar la capa a la secuencia final SEQEND. De no hacerlo, causa que SEQEND termine en la capa actual, que puede ser congelada despus. Los intentos de mover esta parte de la geometria causaran un error en el REGEN y fallar (solo en R14 ). acad_strlsort: Extraa forma de ordenar en Windows. Los caracteres en Windows no son clasificados segn su carcter ASCII. En lugar de hacerlo conforme al actual codepage (getvar "SYSCODEPAGE") que es diferente. Windows: (acad_strlsort '("-1" "+1")) -> ("-1" "+1"), DOS: (acad_strlsort '("- 1" "+1")) -> ("+1" "- 1") Ambos: (mapcar 'ascii ("-" "+")) -> (45 43) Ms en xarch.tu-graz.ac.at/autocad/docs/strlsort-bug.html <http://xarch.tugraz.ac.at/autocad/docs/strlsort-bug.html> ai_propchk se convirti en C:AI_PROP en el parche de actualizacin a la versin R13C3, para que se comporte de forma similar a otros comandos. Esto permite presionar RETURN para volver a coger DDMODIFY si lo seleccion desde la barra de herramientas." Los intentos fallidos de volver a AutoCAD desde un DCL en la r13 bloquean AutoCAD.

Este es un error en la r13 en el cual AutoCAD se bloquea con un error fatal si ocurre un error en el cdigo de AutoLISP durante una accin desde una barra de desplazamiento en un letrero de dilogo. Si intentas evaluar una funcin nula durante el retroceso, AutoCAD se bloquea instantneamente. Tecnicamente, no es un error en el interprete de AutoLISP, pero nos gustara llamarlo un bug de AutoLISP. No se puede asignar el valor de bits 64 en el cdigo 70 en las tablas de smbolos desde la r13, pero en versiones anteriores si. Vea la lista no oficial de AutoCAD recopilada por Steve Johnson para ver ms errores en programas AutoLISP en www.cadonline.com/exclusive/bugs/bugwatchlist.htm <http://www.cadonline.com/exclusive/bugs/bugwatchlist.htm> (esp: 33, 124, 126, 127, 139, 153, 158, 165, 176, 182, 192, 193, 238, 240, 254, 272, 295). Archivos de AutoLISP protegidos. En la versin pre-c4a R13 los archivos de AutoLISP protegidos no permanecen protegidos en memoria. En nuestra opinin, este problema debe hacerse pblico, as los desarrolladores no desadvertirn que su cdigo protegido est seguro de ojos espas. Este asunto causo el principal problema en los foros moderados de Compuserve sobre AutoCAD. Pero existen buenos mtodos de seguridad. Ver [4]. Nmero limitado de selecciones realizadas. Estas son almacenadas inmediatamente en ficheros temporales. Deshacerse de las selecciones no necesarias asignando a los simbolos nil y ejecutando (gc), el colector de basura, el cual entonces cierra realmente los archivos. El mximo nmero depende del sistema operativo, por ejemplo en MS-DOS depende del valor asignado a FILES en el config.sys R13 mejora el nmero. Nmeros: rango, exactitud, precisin numrica. Los nmeros enteros son internamente nmeros fijos largos (32-bit), pero la comunicacin entre AutoLISP y AutoCASD acepta slo fijos cortos (16-bit), en el rango -32766 ... +32767, porque AutoCAD necesita solo nmeros fijos cortos. Los puntos con coma flotante son dobles (32-bit IEEE). Todos los calculos internos de AutoLISP y AutoCAD trabajan con este formato de nmeros, que debera ser suficiente. Al menos los primeros 14 decimales son exactos. Sin embargo, con comparaciones geomtricas suelen suceder errores de redondeo, as que prudente comparar puntos con "(equal pt1 pt2 1e-6) ;0.000001 rounding error tolerance" en lugar de (equal pt1 pt2), especialmente con ngulos. Ver tambin <http://www.autodesk.com/support/techdocs/acadfc/td301207.htm> VB: Fue informado tambin recientemente, que con ciertos controles cargados, la precisin numrica y las normas de escritura locales (`, vs `.) tenan otros efectos indeseados. Una solucin y explicacin de este problema est pendiente. (Principalmente en cuanto al uso de "," como delimitador decimal en algunos paises como Alemania). El estricto (EQ) de ACOMP. Con el compilador ACOMP [5.1] hay que tener cuidado pues la conducta de (EQ) en BI4 es mucho ms estricta que en sencillamente en AutoLISP. En AutoLISP (EQ "1" "1 ") es T, mientras que al compilar el cdigo con ACOMP devuelve nil. Lo siguiente no son realmente bugs, que hacen fallar AutoLISP o devolver resultados erroneos. Son simplemente malas implementaciones del lenguaje. AND y OR deberan devolver el valor del argumento que no sea nil, en lugar del T. Ver xarch.tugraz.ac.at/autocad/docs/and-bug.html <http://xarch.tu-graz.ac.at/autocad/docs/and-bug.html> MAX y MIN deberan manejar cadenas de texto tambin, porque < y > aceptan y procesan cadenas de texto. Ver ACAD_STRLSORT arriba Para los errores de rebosamiento de pila, ver [14]

[8] Clasificando con AutoLISP


En resumen: Use VL-SORT (genrico) o ACAD_STRLSORT (slo cadenas de texto). Pero cuidado: VL-SORT elimina las entradas duplicadas (aquellas que son EQ)!

He publicado una breve documento en xarch.tu-graz.ac.at/autocad/lisp/#sort <http://xarch.tugraz.ac.at/autocad/lisp/> En lisp el mtodo de clasificacin ms comn es la fusin de clases (tambin usado en (str-sort) en el ejemplo TABLES.LSP de Autodesk) porque este es el mtodo natural para listas enlazadas. Habitualmente (por ejemplo en C) se usan pilas de clases (para cualquier dato) o qsort (para datos aleatorios) y clases de insercin para listas pequeas (< 7) o sublistas con el algoritmo. Hay cdigo lisp para autoclasificar, burbujear-clasificar, clasificar por insercin, clasificar rpidamente para cualquier dato, listas de listas e indices a listas. En lisp puedes pasar la funcin predicado para clasificar, la cual es evaluada en tiempo de ejecucin. (aqui llamado "mtodo"). Este es el por qu de que necesites una nica funcin de clasificado para mltiples tipos de datos (por ejemplo nmeros, puntos sobre x o y,cadenas de texto,...) (mtodo de clasificado de datos); mtodo: menor que el predicado ; por defecto para nmeros '< Algunos ejemplos desde xarch.tu-graz.ac.at/autocad/lisp/sort/ur_sort.lsp <http://xarch.tugraz.ac.at/autocad/lisp/sort/ur_sort.lsp>: ordenando 100 elementos: burbujear-clasificar 13.639008 seg/30.08% clasificar por insercin: 13.368042 seg/ 29.48% (ms rpido para listas pequeas) autoclasificar: 13.478973 seg/ 29.73% (pobre implementacin) fusin de clases: 2.232971 seg/ 4.92% clasificado rpido: 2.433960 seg/ 5.37% vlx-sort : 0.099976 seg/ 0.22% (interno del Vital LISP) acad_strlsort: 0.089996 seg/ 0.20% (interno de AutoLISP, solo cadenas de texto). Estn pendientes los tiempos de vl-sort, vl-isort, STDLIB std-fast-sort, std-sort, std-stable-sort y el nuevo merge-sort de Vladimir.

[9] Recursividad
Esta no es una respuesta a una pregunta frecuente pero si es bastante interesante, porque LISP se define a si mismo recursivamente y es un sencillo mtodo de articular problemas difciles. Hay algunos documentos interesantes sobre recursividad en xarch.tu-graz.ac.at/autocad/lisp <http://xarch.tugraz.ac.at/autocad/lisp> especialmente el tutorial xarch.tu-graz.ac.at/autocad/lisp/recursive.html <http://xarch.tu-graz.ac.at/autocad/lisp/recursive.html> de Dennis Shinn. Lo explica con detalle (defun FACT (n) (cond ((zerop n) 1) (T (* n (fact (1- n)))))) Nota:Hay tambin un ejemplo de automodificacin de esta funcin explicada en xarch.tugraz.ac.at/autocad/lisp/self-mod.lsp <http://xarch.tu-graz.ac.at/autocad/lisp/self-mod.lsp>

[10] Iteracin con MAPCAR,...


Al igual que la recursividad, esta no es una respuesta a una pregunta frecuente, pero tambin es algo dificil de comprender. Las funciones de iteracin en AutoLISP son: WHILE, REPEAT, FOREACH y MAPCAR. Las utilizamos ampliamente en el cdigo de este FAQ porque permiten crear poco cdigo. Hay un pequeo curso sobre LAMBDA, QUOTE, MAPCAR... creado por Vladimir Nesterowsky: >> " Tenemos 14 rutas y 12 cerdos. >> Cmo puede haber 24 patos?" >> Existe un comando lisp que me permitir escoger estas >> lneas de texto, y reconocer el nmero(s) de cada lnea, >> en arreglo a, decir, elevar cada nmero a dos? >> Manteniendo la estructura de la expresin, etc, intactas?. Existe un mtodo. (Estoy seguro de que existen otros muchos). (defun MULT2 (strng) ; by Vladimir Nesterowsky (strlgather (mapcar '(lambda (s / n) (if (zerop (setq n (atof s)))

s (rtos (* n 2)) ) ) (strlparse strng " ") ) ; parse by spaces " " ) ) ; gather back with spaces Est explicada en members.tripod.com/~vnestr/mapcar.txt <http://members.tripod.com/~vnestr/mapcar.txt> ;;; Invertir filas y columnas en una matriz (defun TRANSPOSE (l) ; by Doug Wilson (apply 'mapcar (cons 'list l)) ) Est explicada en xarch.tu-graz.ac.at/autocad/lisp/transpose.002.html <http://xarch.tugraz.ac.at/autocad/lisp/transpose.002.html>

[11] Mis Lisps no se cargan al iniciar


Los archivos de AutoLISP pueden cargarse al iniciar la sesin de AutoCAD utilizando LOAD en el ACAD.LSP. Algunos LISPs, requeridos en un men para funcionar, deberan cargarse con el correspondiente archivo <menu>.MNL. El archivo <menu>.MNL - si es diferente - debera cargar el ACAD.MNL. Las funciones LISP que ejecutan comandos al iniciarse la sesin deberan estar definidas en S::STARTUP del ACAD.LSP. Esta funcin es ejecutada automticamente despus de iniciar la sesin. De otro modo se obtiene el mensaje de error "Command list interruption (6 . 2)". Nota: (command) puede ser ejecutada de forma segura desde dentro de los archivos MNL. (S::STARTUP) es utilizada ahora principalmente para chequear los mens parciales. Si el nombre del archivo se proporciona sin extensin, la funcin LOAD asume .LSP. Si el nombre del archivo se indica sin su ruta de directorios, se busca en los directorios de soporte de AutoCAD, que son, exactamente en este orden: El directorio actual. El directorio del dibujo actual. Los directorios definidos en la variable de entorno ACAD (configurable en el letrero de dilogo Preferencias, archivos de soporte) El directorio del acad.exe. Si el programa no se carga nunca ms automticamente, comprueba los directorios de soporte de AutoCAD. Con ACADLC (de ACOMP) y la versin R12 de AutoCAD, ACAD.LSP no se carga automticamente. Por lo tanto deberas aadir (load "ACAD" -1) a tu ACAD.MNL. Ejemplo de ACAD.LSP: ;;;ACAD.LSP ;;; Fred the Beaver, 12/12/94 (load "init" -1) ; this loads some tools of mine (defun S::STARTUP () (load "new-end" -1) ; this redefines the END command ) El argumento -1 previene a LOAD de una interrupcin del proceso de inicio, si algn LOAD falla (por causa de un error de AutoLISP). Si se produce algn fallo al cargar archivos, devuelve -1, pero la evaluacin no se para. -1 puede ser tambin una expresin. Prueba el cdigo para mejorar S::STARTUP en tu cdigo. Con el cdigo compilado de VILL/VLISP esto no funcionar, debe estar definido con DEFUN-Q. Las funciones generalmente no sern listas nunca ms! Mejor que utilizar DEFUN-Q en S::STARTUP

es chequear los enlaces conocidos, una lista de funciones definidas por el usuario que es insertada y evaluada en tiempo de ejecucin. (defun MY::STARTUP () ;your startup code goes here ;.. (princ) ) (setq S::STARTUP (if (and S::STARTUP (listp S::STARTUP)) ;already defined in ACAD.LSP ; or elsewhere (append S::STARTUP (cdr MY::STARTUP)) ;append your code MY:STARTUP ) ) ;just your code o uno ms simple: (if (and S::STARTUP (listp S::STARTUP)) (setq S::STARTUP (append S::STARTUP (list func '(princ)))) (setq S::STARTUP (list nil func '(princ))) ) Vea tambin [12] Cmo cargar automticamente mis programas?

[12] Cmo cargar automticamente mis programas?


Cmo cargar automticamente mis programas? Puedes cargar todos tus programas al iniciar la sesin (ver [11] Mis Lisps no se cargan al iniciar) lo que requiere ms tiempo y memoria al iniciar, o puedes definir un mecanismo de autocarga. Desde la R14 en programas ARX se emplea un nuevo mtodo de autocarga (llamado "carga bajo demanda") con algunas entradas de registro y no desde ACADRxx.LSP. Observa al final de tu ACADRxx.LSP cmo autocarga AutoCAD sus programas. ;;;===== AutoLoad LISP Applications ===== ... (autoload "dline" '("dline" "dl")) ... Esto define los comandos DLINE y DL en la lista para ser cargados desde el archivo DLINE.LSP cuando el usuario ejecute por primera vez el comando DLINE o DL. Antes de esto la funcin era simplemente definida como esta: (defun C:DL () (load "DLINE")(C:DL)) De hecho la definicin es ms complicada debido a un error de manejo: CTRL+C, errores de carga, archivos o rutas incorrectas. Despus de la primera llamada la funcin se sobreescribe con la definida en el programa. Ventajas de la autocarga: El inicio es ms rpido, ya que no hay que cargar todas las aplicaciones. Tan slo se define la simple definicin envuelta de arriba. Esto se hace por la funcin (autoload) Se necesita menos memoria Desventajas: En caso de error en tus programas puede entrarse en un bucle sin interrupcin, que puede terminar solo despues de un rebosamiento de pila o CTRL+C. Nota: Con cdigo compilado con ACOMP hasta CTRL+C es imposible, inserte una llamada a un (princ) sin compilar en algn lugar. Hay que definir y mantener todos los nombres de los comandos de tus programas en la funcin de autocarga. Los cambios en el archivo lisp o el nombre del comando provocaran un error. &iquest;Dnde poner las definiciones (autoload)? No en el ACADR14.LSP. Es ms recomendable ponerlas en un archivo de inicializacin de tus

programas y no en el ACAD.LSP porque ste es frecuentemente modificado por diferentes aplicaciones y el ACAD.LSP debera mantenerse bastante pequeo. Por ejemplo, ponlas en un AUTOLOAD.LSP o INIT.LSP, el cual es cargado por el ACAD.LSP. Ver [11] Mis Lisps no se cargan al iniciar Debera mencionarse que los usuarios *NO* deberan modificar ACADRxx.LSP. Como el ACAD.LSP no es sobreescrito en las actualizaciones, est garantizado que permanece a salvo. Adems (como vimos con la actualizacin R13c4a) si el archivo ACADR13.LSP ha sido modificado, entonces el proceso de actualizacin rechazaba actualizarlo, as resultando en malfunciones del programa.

[13] Cmo pasar un nmero variable de argumentos a una funcin Lisp?


Con puro AutoLISP no es posible. Puedes sin embargo pasar todos los argumentos en una lista como esta: ;;; print a variable number of arguments (of any type) (defun MY-PRINC (x) ;; simple version, for better stuff look at the SDK2: PRINTF.LLB (if (listp x) (mapcar 'princ x) (princ x)) ) O puedes definir la funcin en ADS o ARX y exportarla a AutoLISP. Entonces eres libre de escribir: (ads-print "Hola " "Mundo" 1 2 3) o escribir (ads-printf "Hola %s %i %i" "Mundo" 2 3) Mira en los ejemplos ADS de Reini Urban y Vladimir Nesterovsky en xarch.tu-graz.ac.at/autocad/ads/ <http://xarch.tu-graz.ac.at/autocad/ads/> para implementaciones de los ejemplos anteriores. Se anotaron suplicas oficiales en AutoDesk con relacin a mejorar el lenguaje AutoLISP, pero no ser implementado de momento.

[14] Cmo puedo evitar los rebosamientos de pila?


En el antiguo AutoLISP el tamao de la pila era limitado. No poda extenderse, pero su tamao debera ser suficiente para la mayoria de los casos. En el IDE del Visual Lisp el rebosamiento de pila es simulado a 984 recursiones, en la lnea de comandos del A2000 o cargando programas desde fuera del IDE ya no hay rebosamiento. Esto es peligroso con los errores en tus recursiones, ver [9]. La mayora de los errores de rebosamiento de pila suceden en errores de vuestros programas, previniendo al sistema contra la cada en un bucle sin fin, o contra el uso de funciones recursivas sobre largas listas. Por lo tanto estas limitado a listas bastante cortas con funciones recursivas y versiones antiguas. No puedes reducir el tamao de pila empleado mediante el uso de parmetros locales en tus funciones recursivas. Sin embargo no uses APPLY, EVAL o MAPCAR para llamar a tus funciones recursivas, porque se comeran la pila. Usando la cola de recursin tampoco se soluciona. Tienes que convertir tus funciones recursivas en otras iterativas. (Hay un teorema matemtica que dice, que toda funcin recursiva puede ser convertida en una iterativa, las de cola-recursiva hasta de forma automtica.) Las funciones iterativas deben usar pilas al igual que las funciones como (push) y (pop), pero aquellas versiones almacenan la pila en el montn (espacio de nodos de AutoLISP), cuyo tamao est solo limitado por tu tamao de memoria virtual disponible. Puedes chequear el desbordamiento de pila con esta simple funcin: ;;; create a list of n numbers (zero based) (defun INTLST (l n) (cond

((zerop n) l ) (T (intlst (cons (1- n) l) (1- n)) ) ) ) y prueba: (setq n 100) (while (intlst nil (setq n (+ 10 n)))(print n)) En AutoLISP de R12/DOS alcanzas el lmite de la pila con (intlst nil 138), en A13/Win con (intlst nil 240), en ACOMP con (intlst nil 1240), en el IDE de Vital Lisp con (intlst nil 984), con R10c10, la primera versin de MS-DOS con Lisp extendido, podas mejorar el tamao de pila de lisp con la variable de entorno LISPSTACK. Acomp para R10 tena COMPSTACK. Con Vital LISP o Visual LISP RTS o A2000 (fuera del IDE) el tamao de pila es ilimitado. La conversin a funciones iterativas devuelve el resultado requerido: (defun INTLST (n / l) (repeat n (setq l (cons (setq n (1- n)) l)) ) ) Parece feo, pero funciona.

[15] (command "ROTATE3D") no funciona! Por qu?


Algunos comandos no son en realidad comandos internos de AutoCAD, son simples programas de AutoLISP que comienzan por C: hasta si estn definidos en programas ADS. Solo las aplicaciones Rx nativas (o ahora con vlax-add-cmd) exportan verdaderos comandos. Una lista de estos comandos se encuentra en ACADR13.LSP en la seccin AUTOLOAD. (Ver tambin [12]) Todos estos comandos tienen que llamarse con (C:ROTATE3D) en lugar de (command "ROTATE3D"). Sin embargo las funciones ADS pueden tener argumentos opcionales. Ver el manual de personalizacin para ms informacin. Por ejemplo (c:rotate3d ss p1 p2 angle) es tambin vlido, hasta (rotate3d ...)

[16] Rutinas Autolisp operando sobre mltiples dibujos


"He tenido problemas con un archivo lisp que abrira un dibujo y continuar ejecutndose. Una vez que el dibujo nuevo se abre el archivo lisp deja de existir en la memoria de AutoCAD. Tiene que ser recargado para reconocer los comandos." La memoria LISP es recargada para cada dibujo. Hay varios mtodos de ejecutar un archivo LISP sobre mltiples dibujo: Mediante un fichero de guin que se ejecute en mltiples archivos. MYSCRIPT.SCR. (load "mylisp") _QSAVE _OPEN !nextdwg (load "mylisp") _QSAVE _OPEN !nextdwg ... Mdulos externos como RunLisp or DDSCRIPT automatizan el primer paso.

La R14 tiene una nueva caracterstica, llamada "LISP persistente". Se establece en OpcionesCompatibilidad-Lisp persistente Vital LISP incorpora una variable para activar el lisp persistente: (setq *VILL-NEW-FULL-INIT* nil) ;keep symbols between sessions VLISP renamed it to *VLISP-NEW-FULL-INIT*

[17] Cmo exportar las funciones de Visual LISP a AutoLISP/AutoCAD?


Las funciones C: son exportadas automticamente a AutoLISP. Las funciones simples de vlisp/vill lisp deben ser exportadas con (vl-acad-defun 'myx-funcname) o sus simbolos pueden ser exportados con una compilacin especial, definidos en todo caso en el archivo LSP o en el archivo GLD (Declaraciones globales). Es mejor emplear prefijos especiales para dichas funciones. GLD: (AUTOEXPORT-to-ACAD-PREFIX ;Doy nombre a los prefijos de las funciones que van a ser exportadas al AutoCAD: (strings) |; "myx-*" ) o una a una LSP: (pragma '((export-to-acad myx-func1 myx-func2))) Nota: Pueden existir errores conocidos en vlisp y vill con listas de simbolos y listas de pares punteados en tales funciones argumentos y valores devueltos. Ver [7]. Las funciones exportadas por aplicaciones externas que son empleadas en tus aplicaciones deben estar definidas via XDF. Los simbolos (variables) cuyo valor es actualizado en Visual Lisp y los cuales tambin son utilizados en AutoLISP o AutoCAD (por ejemplo el menu), primero se deben marcar para la compilacin pasa ser externas con: (pragma '((not-localize myx:symbol))) pero el valor puede exportarse con (vlisp-export-symbol 'myx:symbol) cada vez que el valor cambia en Visual Lisp y el control es devuelto a AutoCAD para ser capaz de obtener el ltimo valor en AutoLISP o en AutoCAD con !
myx:symbol

En AutoCAD 2000 es mucho ms sencillo, sin embargo podras necesitar exportar tu funcin desde el entorno protegido con VL-DOC-SET. Ver tambin www.autodesk.com/support/techdocs/td17/td175363.htm <http://www.autodesk.com/support/techdocs/td17/td175363.htm>

Parte 2: Ejemplos, cdigo [20] Funciones de utilidad general


Puedes encontrar ms funciones generales de AutoLISP en la Librera Standard de AutoLISP en xarch.tu-graz.ac.at/autocad/stdlib/ <http://xarch.tu-graz.ac.at/autocad/stdlib/> otros cdigos estn disponibles en otros sitios sobre AutoLISP [1] o incluidos en el SDK de Autodesk [1.2] He incluido aqui algunas tiles funciones de ayuda de pequeos ejemplos de respuesta en la red. Podrias fiarte del hecho que estas funciones son de conocimiento pblico tal como la famosa funcin dxf, la cual est definida como: (defun dxf (grp ele) (cdr (assoc grp ele)) ) y el especfico duplicado de (getval) el cual funciona con nombres de entidades o listas de entidades. [20.1] Manipulacin de listas Ver tambin <http://xarch.tu-graz.ac.at/autocad/stdlib/STDLIST.LSP> Funciones de utilidad para manipular listas son: ;;; a not empty list?

(defun CONSP (x) (and x (listp x)) ) ;;; Returns the index of the first element in the list , ;;; base 0, or nil if not found ;;; (position 'x '(a b c)) -> nil, (position 'b '(a b c d)) -> 1 (defun POSITION (x lst / ret) (if (not (zerop (setq ret (length (member x lst))))) (- (length lst) ret) ) ) ;;; Removes an item from a list (double elements allowed) ;;; (remove 0 '(0 1 2 3 0)) -> (1 2 3) (defun REMOVE (ele lst) ; by Serge Volkov (apply 'append (subst nil (list ele) (mapcar 'list lst))) ) ;;; Conditional remove from flat list. ;;; fun requires exactly 1 arg ;;; (remove-if 'zerop '(0 1 2 3 0)) -> (1 2 3) ;;; (remove-if 'numberp '(0 (0 1) "")) -> ((0 1) "") (defun REMOVE-IF (fun from) (cond ((atom from) from) ;nil or symbol (return that) ((apply fun (list (car from))) (remove-if fun (cdr from)) ) (t (cons (car from) (remove-if fun (cdr from)))) ) ) ;;; Keeps all elements to which the predicate applies. ;;; Say: "keep if". It need not be defined recursively, also like this. ;;; [fixed, thanks to Serge Pashkov, in FAQ-CODE.LSP it was okay] (defun REMOVE-IF-NOT (pred lst) ; by Vladimir Nesterowsky (apply 'append (mapcar '(lambda (e) (if (apply pred (list e)) (list e))) lst)) ) ;;; Conses ele to list if not already in list ;;; trick: accepts quoted lists too such as ;;; (setq l '(1 2 3) (adjoin 0 'l) ;;; -> !l (0 1 2 3) (defun ADJOIN (ele lst / tmp) (if (= (type lst) 'SYM) (setq tmp lst lst (eval tmp)) ) (setq lst (cond ((member ele lst) lst) (t (cons ele lst)) ) ) (if tmp (set tmp lst) lst)

) ;;; ROT1 - put the first element to the end, simple version ;;; (rotate by one) (defun rot1 (lst) (append (cdr lst) (list (car lst))) ) ;;; BUTLAST - the list without the last element (defun butlast (lst) (reverse (cdr (reverse lst))) ) [20.2] Manipulacin de cadenas de texto Por favor, mira <http://xarch.tu-graz.ac.at/autocad/stdlib/STDSTR.LSP> Algunas tiles funciones para manipular cadenas de texto podrian ser: Predicado: (stringp expr) - string predicate, is expr a string? (defun stringp (s) (= (type s) 'STR) ) (string-not-emptyp str) - is str a not empty string? (defun string-not-emptyp (s) (and (stringp s) (/= s "")) ) Recortando: (str-trim string) - str without any whitespace, to the right and left, defined in AI_UTILS.LSP, as well as: (str-left-trim string), (str-right-trim string), (str-left-trim-bag string bag), (str-right-trim-bag string bag) - remove all chars in bag (= STR) Busqueda: (strpos string substr) - position of substring in string (1 based) Funciones de conversin listas <-> Cadenas de texto: (strtok str tokens) - string -> list delimited by tokens (strlcat lst delim) - concat list -> string seperated by delim (string->list str) - string -> list of chars (list->string str) - list of chars -> string Todas ellas y muchas ms incluidas en el Stdlib (ver arriba). Algunas estn en xarch.tugraz.ac.at/autocad/code/vnestr/strtok.lsp <http://xarch.tu-graz.ac.at/autocad/code/vnestr/strtok.lsp> o en tu AI_UTILS.LSP. Las necesitaras especialmente para trabajar con letreros de dialogo. [20.3] simbolo -> cadena de texto La funcin inversa a (read) sera (symbol-name). Lo siguiente es solo el mtodo general, pero existen mtodos especiales mejores. ;;; SYMBOL-NAME returns the name of a symbol as string ;;; converts any valid lisp expression to its printed representation ;;; (symbol-name a) -> "a", (symbol-name '(0 1 2 a)) -> "(0 1 2 A)"

(defun SYMBOL-NAME (sym / f str tmp) (setq tmp "$sym.tmp") ;temp. filename, should be deleted (setq f (open tmp "w")) (princ sym f) (close f) (setq f (open tmp "r") str (read-line f) f (close f)) str ) Para simbolos sencillos existe un mtodo mejor explicado por Christoph Candido en <http://xarch.tugraz.ac.at/autocad/news/symbol-string.txt> ViLL/VLISP introduce un rpido VL-SYMBOL-NAME. Ver tambin <http://xarch.tu-graz.ac.at/autocad/stdlib/STDINIT.LSP> [20.4] Acceder a las entidades de AutoCAD [renombrado SSAPPLY a SSMAP] Ver tambin <http://xarch.tu-graz.ac.at/autocad/stdlib/STDENT.LSP> ;;; returns the first group value of an entity. ;;; like the wellknown (dxf) function but accepts all kinds of ;;; entity representations (ename, entget list, entsel list) ;;; NOTE: For getting 10 groups in LWPOLYLINE's not usable! (defun GETVAL (grp ele) ;"dxf value" of any ent... (cond ((= (type ele) 'ENAME) ;ENAME (cdr (assoc grp (entget ele))) ) ((not ele) nil) ;empty value ((not (listp ele)) nil) ;invalid ele ((= (type (car ele)) 'ENAME) ;entsel-list (cdr (assoc grp (entget (car ele)))) ) (T (cdr (assoc grp ele))) ) ) ;entget-list ;;; Ex: (gettyp pline) => "POLYLINE" (defun GETTYP (ele) ;return type (getval 0 ele) ) ;;; assure ENAME ;;; convert the entity to type ENAME (to write shorter code) (defun ENTITY (ele) ;convert to element name (cond ;accepts the following types: ((= (type ele) 'ENAME) ele) ; ENAME ((not (listp ele)) nil) ; error: no list ((= (type (car ele)) 'ENAME) (car ele)) ; entsel-list ((cdr (assoc -1 ele))) ; entget-list or nil ) ) ;and now just: (defun getval (grp ele) (cdr (assoc grp (entget (entity ele)))) ) ;;; Ex: (istypep ele "TEXT") ;;; is element a "SOLID"?

(defun istypep (ele typ) ;check type (= (gettyp ele) typ) ) ;;; Ex: (istypep ele '("TEXT" "ATTDEF")) ;;; is element a "TEXT" or a "ATTDEF"? (defun ISTYPEP (ele typ) ;better implementation to accept lists too (cond ((listp typ) (member (gettyp ele) typ) ) ;fixed ((stringp typ) (= (gettyp ele) typ) ) ;assume typ uppercase, wcmatch (T nil) ) ) ; would be nice but slower ;;; Ex: (getpt (entsel)) => ( 0.1 10.0 24) (defun GETPT (ele) ;return the startpoint of any element (getval 10 ele) ) ;group 10 ;;; Ex: (getflag pline) => 1 if closed (defun GETFLAG (ele) (getval 70 ele) ) ;same with the entity flag ;;; bitvalue val in flag of element set? ;;; Ex: (flagsetp 1 pline) => T if closed ;;; Ex: (flagsetp 16 vertex) => T if spline control point (defun FLAGSETP (val ele) (bitsetp val (getflag ele)) ) ;;; Ex: (bitsetp 4 12) => T ;bitvalue 4 (=2.Bit) in 12 (=4+8) is set (defun BITSETP (val flag) (= (logand val flag) val) ) ;;; convert selection set to list. slow, but easy to write. ;;; Note: it's also wise to use ai_ssget, because some ents could be ;;; on locked layers ;;; Ex: (sslist (ai_ssget (ssget))) => list of selected unlocked ents ;;; or (mapcar 'entupd (sslist (ssget "X" '((8 . "TEMP"))))) ;;; - regens all entities on layer TEMP (defun SSLIST (ss / n lst) (if (= 'PICKSET (type ss)) (repeat (setq n (sslength ss)) (setq n (1- n) lst (cons (ssname ss n) lst) ) ) ) ) ;;; Map a function over each entity in ss, in reversed order.

;;; Faster, but not so easy to understand. see [22.2] ;;; [renamed from SSAPPLY to SSMAP to match the stdlib name] ;;; Ex: (ssmap 'entupd (ssget)) ; regenerate only some entities (defun SSMAP (fun ss / n) (if (= 'PICKSET (type ss)) (repeat (setq n (sslength ss)) (apply fun (list (ssname ss (setq n (1- n))))) ) ) ) [21] Ejemplos de programas en AutoLISP: [21.1] Cambio global de textos, polilneas, utilidades para capas, datestamp Para cambiar globalmente los atributos de textos utiliza CHTEXT.LSP de tu directorio de ejemplos. Para cambiar globalmente los atributos de polilneasm, congela las capas designandolas y otras utilidades similares busca herramientas de AutoLISP gratuitas en cualquier sitio sobre AutoLISP. Mira tambin [1] y algo de cdigo en [22], [23], y [24]. Para poner un sello con la fecha (datestamp) y otros en tus impresiones automticamente, primero comprueba que tu plotter soporta HPGL/2. Entonces utiliza edriver interno de HPGL/2 y configuralo en HPCONFIG. DATESTAMP.LSP Cambia los atributos de encabezados del ploteado por ti mismo como en [22.2]. Una rutina profesional de plotstamp est aqui: <http://ourworld.compuserve.com/homepages/tonyt/plotstmp.htm> [21.2] Letrero de impresin desde LISP. Utilizando DDE o ActiveX Desde R14 utilizando INITDIA (initdia) (command "_PLOT") Llamar al letrero de dialogo de impresin antes de la versin 14 era posible slo bajo Windows por ejemplo con LISPPLOT de Mike Dickason. Esta aburre al buffer de teclado con pulsaciones de tecla. www.cadalog.com/cadalog/files/lispd-l/lspplw.zip <http://www.cadalog.com/cadalog/files/lispdl/lspplw.zip> o tambin: <ftp://ftp.mcwi.com/pub/mcwi/lisp/winplt.lsp> En otro caso crea un script y ejecutalo al final de tu rutina de LISP, pero esto no mostrar el letrero de dialogo. Xiang Zhu: Puedes utilizar "ddelisp" bajo Windows para hacer algo similar a lo siguiente: ;;; [fixed for all releases] (defun DDECMD (str / tmp acadver ddestr) (if (not (boundp 'initiate)) (cond ((= 14 (setq acadver (atoi (getvar "ACADVER")))) (setq ddestr "AutoCAD.R14.DDE") (arxload "ddelisp") ) ((= 13 acadver) (setq ddestr "autocad.r13.dde") (xload "ddelisp") ) ((= 12 acadver) (setq ddestr "autocad.dde") (xload "ddelisp") ) (T

(princ "DDE not supported") (exit) ) ) ) (if (not (zerop (setq tmp (initiate ddestr "system")))) (progn (execute tmp (strcat "[" str "]")) (terminate tmp) str ) ) ) Para R12 usa "autocad.dde" como nombre del servidor. Entonces, dentro de tu lisp o script, puedes hacer (ddecmd "_plot "). La funcin DDECMD devolver nil si algo va mal, o la cadena de texto que le has pasado si todo va bien. La cadena de texto es lo que tecleas en la lnea de comandos desde el teclado, asi que necesitas poner un espacio o un Intro, el cual es "^13" aqui, para terminar la
cadena de texto. Igualmente, la funcin es muy utilizada en la siguiente situacin: Si en un lisp, necesitas llamar a un comando transparente de AutoCAD como _LAYER, normalmente utilizaras (command "_layer"), pero despues de ejecutar esta lnea el lisp ya no ser transparente. Utilizando la funcin solucionas este problema

Desconfa de que AutoCAD acepte solo comandos DDE si la lnea de comandos est activa, esto significa que ningn letrero de dialogo debe estar abierto. Con los mtodos de VLISP/ViLL ActiveX puede ser empleado tambin: ;;; vlisp syntax: (setq vlax:ActiveDocument (vla-get-ActiveDocument (vlax-get-Acad-Object))) (setq plt (vla-get-plot vlax:ActiveDocument)) ;=> plot object (vla-PlotWindow plt pt1 pt2) ; define window (pts in WCS) (vla-PlotPreview plt 1) ; 0 for partial, 1 for full (vla-PlotToDevice plt "Default System Printer") ; if it exists With R14 INITDIA was introduced, which can be applied to most (but not all) dialogs: (initdia) (command "_PLOT") Con A2000 usa OLE (los mtodos VLA- ) en lugar de DDE. [21.3] (entmod) y (entmake) capas, sin (command "_LAYER"...) ENTMOD una capa Intento cambiar una propiedad de una capa sin ejecutar la funcin COMMAND dentro de una rutina de LISP. Desde la R13, utilizando la siguiente expresin: (setq tbl_lst (entget (tblobjname "LAYER" "ANY_LAYER")) clr_grp (assoc 62 tbl_lst) ) (entmod (subst (cons 62 (- (cdr clr_grp))) clr_grp tbl_lst)) Puedes activar o desactivar la capa "ANY_LAYER", incluso si se trata de la capa actual. Pero AutoCAD no sabe que la entrada de una tabla ha sido modificada hasta que selecciones el Gestor de capas en la barra de herramientas o algo similar. Asimismo, puedes ejecutar 'DDLMODES para ver si la propiedad activada / desactivada de la capa "ANY_LAYER" ha cambiado. Haciendo lo mismo para congelar una capa, vers que las entidades de dicha capa todava se visualizan en pantalla, pero no puedes seleccionarlas, hasta que hagas algo relacionado con la gestin de capas, y AutoCAD ocultar dichas entidades.

ENTMAKE una capa Debes obtener tu modelo con entget, usando el nombre de la entidad de tabla como argumento. Este nombre de entidad de tabla puede ser recuperado con la funcin TBLOBJNAME (entget (tblobjname "LAYER" "Any Layer Name")) ; R2000 can have spaces! ;;; This routine will create a layer with any name you type: (defun C:MLAY () ; by Reinaldo Togores (setq laynam (getstring "\nLayer name: ")) (entmake (list '(0 . "LAYER") '(5 . "28") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 laynam) '(70 . 64) '(62 . 7) '(6 . "CONTINUOUS") ) ) ) [21.4] Cmo seleccionar mltiples archivos en Lisp? (como en ARCHIVOS - Desbloquear) DOSLIB v4.3 de McNeel contiene dos_getfilem, www.mcneel.com/products.htm#Utilities <http://www.mcneel.com/products.htm> STDLIB contiene std-getfilem xarch.tu-graz.ac.at/autocad/stdlib/GETFILEM.LSP <http://xarch.tu-graz.ac.at/autocad/stdlib/GETFILEM.LSP> En xarch.tu-graz.ac.at/autocad/progs/MGETFILD.ZIP <http://xarch.tugraz.ac.at/autocad/progs/MGETFILD.ZIP> hay otra rutina de utilidad de LISP para seleccionar mltiples archivos con DCL. Necesitaras tambin VLISP, DOSLIB o el STDLIB para las funciones de directorios. Otra versin de LISP est en xarch.tugraz.ac.at/autocad/stdlib/Reini_MFD.LSP <http://xarch.tugraz.ac.at/autocad/stdlib/Reini_MFD.LSP> [21.5] Reemplazar bloques mltiples Una bsqueda en los archivos de lisp ofreci los siguientes enlaces: Cadalyst: www.cadonline.com/search.phtml <http://www.cadonline.com/search.phtml> => 97code.htm y una pregunta de tu nombre de usuario, el cual puede obtenerse gratis y automticamente xarch: xarch.tu-graz.ac.at/autocad/code <http://xarch.tu-graz.ac.at/autocad/code> y busca por "BLOCK;REPLACE" => xarch.tu-graz.ac.at/autocad/code/cadalyst/94-02/replace.lsp <http://xarch.tugraz.ac.at/autocad/code/cadalyst/94-02/replace.lsp> Tambin en Cadalog: www.cadalog.com/find.htm <http://www.cadalog.com/find.htm> palabra clave "Block Replace" => www.cadalog.com/cadalog/files/lispr-z/replace.zip
<http://www.cadalog.com/cadalog/files/lispr-z/replace.zip> (Este es el mejor)

[21.6] (vports), la entidad VIEWPORT, conversin de pixels La entidad Viewport: La respuesta a "Puedo hacer (entget) con una entidad VIEWPORT y obtener sus vrtices inferior izquierdo (grupo DXF 10) y superior derecho (grupo DXF 11). Pero parece que esas coordenadas estn en el sistema de espacio papel. En lo que estoy interesado es en obtener que porcin del dibujo real (el del espacio modelo) est mostrandose actualmente en esa ventana flotanyte." est en xarch.tugraz.ac.at/autocad/news/vports.lsp <http://xarch.tu-graz.ac.at/autocad/news/vports.lsp> www.ez-sys.net/~coopfra/lisp.htm#view <http://www.ez-sys.net/~coopfra/lisp.htm> tiene tambin algunos trucos. Cmo cambiar de ventana flotante en AutoLISP?

Con (setvar "CVPORT" vport-id) vea xarch.tu-graz.ac.at/autocad/news/change_vports.html <http://xarch.tu-graz.ac.at/autocad/news/change_vports.html> Con las siguientes funciones conviertes pixels <-> unidades de dibujo: ;;; Conversion pixel to drawing units (defun PIX->UNITS (pix) (* pix (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE")) ) ) ) ;;; Conversion drawing units to pixel (defun UNITS->PIX (units) (* units (/ (cadr (getvar "SCREENSIZE")) (getvar "VIEWSIZE") ) ) ) Observe tambin la "Desactivacin de pixels por uno" errores en AutoCAD, escrito por Vibrant <http://xarch.tu-graz.ac.at/autocad/news/pixel-off-by-one-error.txt> [21.7] Seleccionar todos los objetos visibles: coordenadas del zoom Cuidado ya que con (ssget) solo obtendras entidades visibles, porque todas las funciones de interfaz (entsel, ssget, osnap) trabajan con pixels, solo (ssget "X") seleccionar entidades no visibles. ;;; returns a list of the actual viewport corners in WCS (defun ZOOMPTS ( / ctr h screen ratio size size_2) (setq ctr (xy-of (getvar "VIEWCTR")) ;3D -> 2D h (getvar "VIEWSIZE") ;real screen (getvar "SCREENSIZE") ;2D: Pixel x,y ratio (/ (float (car screen)) ;aspect ratio (cadr screen) ) size (list (* h ratio) h) ;screensize in coords size_2 (mapcar '/ size '(2.0 2.0)) ) (list (mapcar '- ctr size_2) (mapcar '+ ctr size_2) ) ) (defun XY-OF (pt) (list (car pt) (cadr pt) ) ) ;assure 2D coords Nota: Los puntos devueltos desde la entidad estn en WCS pero esto es correcto porque las opciones "CP" "WP" y "P" de ssget esperan puntos en WCS ("W" y "C" requieren puntos en UCS - Por qu la diferencia? No lo se) ;;; one way to define this function

(defun SSALL-VISIBLE (/ l) (ssget "C" (car (setq l (maptrans0-1 (zoompts)))) (cadr l)) ) ;;; or another (defun SSALL-VISIBLE-1 () ;combine "C" and (p1 p2) to one list (apply 'ssget (append '("C") (maptrans0-1 (zoompts)))) ) ;;; map some pts from WCS to UCS, easier with just one argument [doc fixed] (defun MAPTRANS0-1 (pts) (mapcar '(lambda (pt)(trans pt 0 1)) pts) ) [21.8] Cmo escribir las coordenadas XYZ de los objetos seleccionados, en un archivo? ;;; CDF - comma delimited string (defun cdf-point (pt) (strcat (car pt) ", " (cadr pt) ", " (caddr pt)) ) ;;; SDF - space delimited, may easier be read back in to AutoCAD (defun sdf-point (pt) (strcat (car pt) " " (cadr pt) " " (caddr pt)) ) ;;; convert this SDF format back to a point with (defun str->point (s) (eval (read (strcat "(" s ")"))) ) ;;; Write a XYZ file of all selected objects (SDF see below) (defun C:XYZ (/ ss fname f) (if (and (setq ss (ssget)) (setq fname (getfiled "Write XYZ to file" (strcat (getvar "DWGNAME") ".XYZ") "XYZ" 7)) (setq f (open fname "w")) ) (foreach ele (sslist ss) ; -> [20.4] (foreach pt (getpts ele) ; -> [23.1] (write-line (cdf-point pt) f) ) ) ) (if f (close f)) ) ;;; => .xyz ;;; 0.45, 12.3, -34.0 Para un archivo ASC (formato SDF) simplemente cambia todos los XYZ por ACS y cdf-point por sdfpoint en la funcin anterior. Para el sentido inverso , crear PLINES desde un archivo ascii x,y es mejor convertir el archivo en un script como: PLINE 300.2,10 350.4,10.4 [22] Atributos de los bloques [22.1] Cmo acceder a los atributos de un bloque? Verifica todas las subentidades despus de la insercin hasta que el atributo es encontrado. Ver

xarch.tu-graz.ac.at/autocad/stdlib/STDENT.LSP <http://xarch.tugraz.ac.at/autocad/stdlib/STDENT.LSP> ;;; returns entget-list of attribute s (STRING) in element ele (ENAME) ;;; or nil if no found (defun ATTELE (ele attname / rslt) (if (and (istypep ele "INSERT") (= (getval 66 ele) 1) ) (progn (setq ele (entnext (entity ele))) (while (and ele (istypep ele "ATTRIB")) (if (= (strcase (getval 2 ele)) (strcase attname)) (setq rslt (entget ele) ele nil ) ;break the loop (setq ele (entnext ele)) ) ) ) ) rslt ) ;;Example: (attele (entsel) "TEST") ; returns entget-list of ; attribute "TEST" if the block has it BTW: Even trickier functions to get entities DXF group codes are GET and EDLGETENT by Vladimir Nesterowsky. ;;;Sample calls: ;;; return list of 2,1 and -1 group values (defun get-attribs-look-up (block-ename) (get '(2 1 -1) (cdr (edlgetent block-ename))) ) (defun all-verticies-and-bulges (pline-ename) (get '(10 42) (cdr (edlgetent pline-ename))) ) available at members.tripod.com/~vnestr/ <http://members.tripod.com/~vnestr/> [22.2] Cmo modificar los atributos de un bloque? DATESTAMP.LSP Para un muy simple DATESTAMP.LSP simplemente la lista de entidad del atributo DATE en tu bloque plotstamp, devuelto por (attele) como antes. ;;; change the attribute value to new, group 1 (defun ATTCHG (ele attname new / b) (if (setq b (attele ele attname)) (entmod (subst (cons 1 new) (getval 1 b) b)) ) ) ;;; Change all DATESTAMP attributes in all inserted PLOT* blocks (defun C:DATESTAMP () (ssmap ; fixed and renamed '(lambda (ele) (attchg ele "DATESTAMP" (today))

(entupd ele) ) (ssget "X" '((0 . "INSERT")(2 . "PLOT*"))) ) ) ;;;return todays date, could be a DIESEL or this string conversion (defun TODAY (/ s) (setq s (rtos (getvar "CDATE") 2)) ;gets the julian date (strcat (substr s 5 2) "-" (substr s 7 2)"-"(substr s 3 2)) ) Un datestamps automtico se realiza con RTEXT (bonus/express tools) o con HPCONFIG con un plotter HPGL/2. (<a2000i) [22.3] Cmo actualizar los atributos de un bloque? Existe un SUPPORT\ATTREDEF.LSP para actualizar las propiedades de los atributos (posicin, capa, ...) para bloques ya insertados. Sobre entidades complejas debes entupd el encabezado de la entidad, para verlas actualizadas en pantalla (esto fuerza el regenerado de un elemento). ;;; Example: (setq s (getstring "Change Attribute to: ")) (attchg (attele (setq b (entsel "of block: ")) s)) (entupd (car b)) ; the block, not the attribute ;;; some more helper funcs to get the main entity of any attribute ;;; or vertex (defun MAIN-ENTITY (ele) (setq b (entity b)) ;force ENAME (while (istypep b '("ATTRIB" "ATTDEF" "VERTEX")) (setq b (entnext b)) ) ; loop until no more sub-entities (if (istypep b '("SEQEND" "ENDBLK")) (getval -2 b) ;complex entity - header b ;normal entity ) ) [22.4] Cmo crear con ENTMAKE un Bloque complejo en AutoLISP? Ver xarch.tu-graz.ac.at/autocad/stdlib/ENTMAKE.LSP <http://xarch.tugraz.ac.at/autocad/stdlib/ENTMAKE.LSP> Alli hay un ejemplo de como realizar mltiples llamadas a (entmake) para crear encabezados de bloques, las entidades, cerrar el bloque y finalmente (entmake) la insercin. Para bloques annimos hay que tener la precaucin de que solo (setq bn (entmake '((0 . "ENDBLK")))) devuelve el nombre del bloque para (entmake (list '(0 . "INSERT") '(70 . 1) (cons 2 bn) ... )) [23] Polilneas Desde la R14 LWPOLILNEAS almacenan los vrtices en una entidad con mltiples grupos de cdigo 10! De modo que ASSOC no funcionar. [23.1] Cmo acceder a los vrtices de una polilnea? Un vrtice de una polilnea es una subentidad de una polilnea ( al igual que un atributo es una subentidad de una insercin de un bloque o que una definicin de atributo de un bloque). Por lo tanto la misma funcin que en [22.1]-[22.3] puede ser empleada. ;;; return only some assoc values in the list (for LWPOLYLINE) (defun group-only (grp lst) (mapcar 'cdr (remove-if-not

'(lambda (pair) (= grp (car pair))) lst ) ) ) ;;; return the vertex list of a polyline or of any other element (defun GETPTS (ele / pts) (setq ele (entity ele)) ;force type ENAME (cond ((istypep ele "POLYLINE") (while (istypep (setq ele (entnext ele)) "VERTEX") ;; omit fit and spline points (conservative style) (if (not (or (flagsetp 1 ele) (flagsetp 8 ele))) ;bugfix! (setq pts (cons (trans (getpt ele) ele 0) pts))) (reverse pts) ) ) ;; Special case: you have to map it, assoc finds only the first. ;; Fix a LWPOLYLINE bug in R14: internally stored as 2d point, ;; (entget) returns fantasy z-values. ((istypep ele "LWPOLYLINE") (mapcar '(lambda (pt) (trans (list (car pt) (cadr pt) 0.0) ele 0)) (group-only 10 (entget ele)) ) ) ;; insert here possible other types, such as ((istypep ele '("TEXT" "CIRCLE")) (list (getpt ele)) ) ;; more like this (serge's style). LWPOLYLINE code above. (T (apply 'append (mapcar '(lambda (n / p) (if (setq p (getval n ele)) (list p) ) ) '(10 11 12 13) ) ) ) ;; or like this (conservative style) ;;(T (foreach n '(10 11 12 13) ;; (if (setq p (getval n ele)) (setq pts (cons p pts)))) ;; pts ;;) ) )

Sugerencias de Vladimir Nesteroswky para una diferente estructura de vrtices: Ver [22.1] (defun vertices-and-bulges ( pline-ename ) (mapcar 'cdr (remove-if-not '(lambda (ele) (bitsetp 9 x)) (get '(70 10 42) (cdr (edlgetent pline-ename)) ; = list of (10 42) pairs of the pline ;;;which can also be written as: (defun flag9p (ele) (flagsetp 9 ele) ) ) ;true if fit or spline point (mapcar '(lambda (ele) (remove-if-not 'flag9p (cdr (edlgetent pline-entname)) ) ) Ver tambin [23.5] para una estructura de vrtices distinta (segmentos) de polilneas. [23.2] Cmo unir mltiples lneas en polilneas? [Fijo] Simplemente tratar de unir cada elemento con todos los seleccionados, pero con la precaucin de que si una entidad ya est unida no se podr obtener su lista, porque est borrada. ;;; This sample converts all selected elements to polylines and ;;; tries to join as much as possible. (defun C:JOINPOLY (/ ele ss) (foreach ele (sslist (setq ss (ssget))) ;better process lists (if (entget ele) ;not already joined (cond ;(then it would be nil) ((istypep ele '("ARC" "LINE")) ;; but you should check Z of lines and UCS here too (command "_PEDIT" ele "_y" "_j" ss "" ""); convert and JOIN ) ((and (istypep ele '("POLYLINE" "LWPOLYLINE")) ;fixed (not (flagsetp 1 ele)) ;not closed (< (rem (getflag ele) 128) 8) ) ;ignore meshes and such (command "_PEDIT" ele "_j" ss "" "") ;ucs check omitted for brevity ) ) ) ) ) [23.3] Cambiar el grosor de mltiples polilneas Con la ayuda de las funciones de utilidad del apartado anterior, aqui hay un sencillo ejemplo: (defun C:POLYWID (/ wid ele) (initget 5) (setq wid (getdist "New Polyline Width: ")) ;not negative

(foreach ele (sslist (ssget '((0 . "*POLYLINE")))) ;only PLINES (command "_PEDIT" ele "_W" wid "") ) ) [23.4] Crear una polilnea o spline: con (ENTMAKE) o (COMMAND) Puedes crear un archivo de guin con un programa en LISP y ejecutarlo. Parece ser el modo ms sencillo, pero puedes suceder errores de I/O cuando se lea/escriba el script. Si tu software es comercial, debe manipular dichos errores. El segundo mtodo es crear la lista de la entidad y utilizar ENTMAKE. Ventaja: Rpido, en WCS, independiente de los modos de referencia actuales. Ver xarch.tugraz.ac.at/autocad/stdlib/ENTMAKE.LSP <http://xarch.tugraz.ac.at/autocad/stdlib/ENTMAKE.LSP> La tercera solucin est basada en command y mapcar. Funciona con polilneas, splines o lneas. Desventaja: UCS, modos de referencia. ;;; Draws a POLYLINE entity from a list of points (same with SPLINE, ;;; or LINE), on the actual UCS, with actual OSNAP settings (defun DRAW-PLINE (pts) (command "_PLINE") (mapcar 'command pts) (command "") ) (defun DRAW-SPLINE (pts) (command "_SPLINE") (mapcar 'command pts) ; the pts must be the fitpoints then (command "" "" "") ) [23.5] Cmo calcular la longitud de polilneas? Hay dos mtodos: 1. El obvio, usando el comando AREA el cual es bastante "ruidoso" (muestra los resultados), pero funciona incluso con splines. ;;; add up the LENGTH of all selected objects, NOISY, you can do the ;;; same with AREAs: simply change the last line to (getvar "AREA") (defun C:LEN-OF () (command "_AREA" "_A" "_E") ;add up objects (works in R12+R13) (ssmap 'command (ssget)) ;renamed, pass all elements to AutoCAD (command "" "") ;two returns (getvar "PERIMETER") ;this is the length ) 2. Haciendo algunos clculos, pero solo para entidades simples. Aqui es mejor definir algunas funciones de utilidad de nuevo. Esto tambin es una introduccin para el siguiente captulo [24], algo de trigonometra para segmentos curvos. ;;; calculates length of pline, quiet (defun POLY-LENGTH (poly / seg) (apply '+ ; the sum of all single segment lengths (mapcar '(lambda (seg) ;length of segment (if (zerop (car seg)) (distance (cadr seg) (caddr seg)) ;line segment or (abs (arclen seg seg)) ;curved: see below at [24] )

) (pline-segs poly) ) ) ) ;;; returns all group codes of the complex element ;;; (vertices, attributes) as list, similar to (edlgetent) (defun CPLX-LIST (grp ele / lst) (if (= 1 (getval 66 ele)) (progn (setq ele (entnext (entity ele))) (while (and ele (not (istypep ele "SEQEND"))) (setq lst (cons (getval grp ele) lst) ele (entnext ele) ) ) (reverse lst) ) ) ) ;;; PLINE-SEGS - Creates a segment list for the polyline pname ;;; as a list of '(bulge p1 p2). A straight line has bulge 0.0 ;;; Compute pts in ECS of pname. Accepts LWPOLYLINE's (defun PLINE-SEGS (pname / pts segs) (setq segs (mapcar 'list (if (istypep pname "LWPOLYLINE") (group-only 42 (entget pname)) (cplx-list 42 pname) ) (setq pts (getpts pname)) (rot1 pts) ) ) ; ->[20.1] (if (flagsetp 1 pname) segs ;closed (butlast segs) ) ) ;open: without the last segment, ->[20.1] ;;; Example: (a bit optimized for brevity :) ;;; add up all the lengths of all polylines, QUIET ;;; To accept also other entities, add those to pline-segs (defun C:POLYLEN () (apply '+ (ssmap 'poly-length (ssget '((0 . "*POLYLINE"))) ) ) ) ; renamed Para la suma de reas usa el ruidoso comando AREA o implementa la frmula de Heron para reas de

polgonos (solo para polgonos cerrados simples). [23.6] Cmo invertir el sentido de una polilnea? Sergei Komarov present REVPOLY.LSP el cual tambin presta atencin al rectificado de curvas y a los grosores xarch.tu-graz.ac.at/autocad/news/lisp_progs/revpoly.lsp <http://xarch.tugraz.ac.at/autocad/news/lisp_progs/revpoly.lsp> Una corta versin del stdlib es esta: ;;; ignoring any width information (defun POLY-REVERSE (segs) (reverse (mapcar '(lambda (seg) (std-make-seg (std-seg-p2 seg) (std-seg-p1 seg) (- (std-seg-bulge-num seg)) ) ) segs ) ) ) (defun C:POLYREV (/ ele) (std-require "ENTMAKE") (if (setq ele (car (entsel "\nRevert Poly: "))) (std-entmake-pline (entget ele '("*")) ; keep EED information (poly-reverse (std-pline-segs ele)) ) ) ) [23.7] Cmo obtener el centro de una polilnea? [nuevo] El centroide de los slidos tiene que extraerse con MASSPROP. Puedes dejarle escribir el resultado en un archivo y luego analizarlo. El centroide de polilneas es distinto del significado de vector. El significado geomtrico de algunos puntos es simple: (setq n (float (length pts))) (list (/ (apply '+ (mapcar 'car pts) ) n ) (/ (apply '+ (mapcar 'cadr pts) ) n ) ) El verdadero centroide es ms dificil. La versin del stdlib est en xarch.tugraz.ac.at/autocad/stdlib/STDPOINT.LSP <http://xarch.tu-graz.ac.at/autocad/stdlib/STDPOINT.LSP> STD-CENTROID-2D. En el stdlib.arx o en <http://www.manusoft.com/Software/Freebies/> (bajo

freebies) hay tambin una funcin massprop de lisp para slidos. Entonces puedes hacer: (command "_REGION" ele) ... (massprop entlast) ... (command "_UNDO" 1) Para VLA existe tambin una propiedad massprop para objetos ACIS. [24] Geometra de Circulo/Arco: BULGE, algo de trigonometra [fijo] Qu es el BULGE en una polilnea? El bulge es la tangente de uno hacia delante del ngulo incluido de un segmento de curva. Un bulge 0.0 equivale a un segmento recto. Junto con el punto inicial y final es suficiente informacin para rpidamente calcular todos cualquier otra informacin de un segmento curvo. Un bulge negativo es una rotacin en direccin de las agujas del reloj ("matemticamente negativo" ). arclength = radius * angle bulge = +/- tan (ang/4) (CCW:+, CW -) angle = 4 * atan (bulge) bulge = +/- (2 * altitude) / chord (CCW:+, CW -) Vea tambin el libro "Maximizing AutoLISP" [2] (Nota: El volumen II del libro para la versin R10/11 contiene una frmula para el bulge incorrecta.) (Error solucionado, frmula erronea! Gracias a Sergei Komarov) ;;; converts a bulged segment (bulge pt1 pt2) of a polyline ;;; to a circle (ctr rad). The start- and endpoints are known ;;; therefore the angles too: (angle ctr pt1)(angle ctr pt2) ;;; returns nil on a straight segment! (defun SEG2CIR (seg / bulge p1 p2 cot x y rad dummy) (if (zerop (car seg)) nil (setq bulge (car seg) p1 (cadr seg) p2 (caddr seg) cot (* 0.5 (- (/ 1.0 bf) bf)) x (/ ((+ (car p1) (car p2)) (* (- (cadr p2) (cadr p1)) cot) ) 2.0 ) y (/ (+ (+ (cadr p1) (cadr p2)) (* (- (car p2) (car p1)) cot) ) 2.0 ) rad (distance (list (car p1) (cadr p1))

(list x y) ) dummy (list (list x y) rad) ; return this, I hate progn's ) ) ) ;;; inverse conversion: ;;; calculates segment (bulge p1 p2) of arc ;;; with given circle (ctr rad), start-angle, end-angle (defun ARC2SEG (cir ang1 ang2 / p1 p2) (setq p1 (polar (car cir) ang1 (cadr cir)) p2 (polar (car cir) ang2 (cadr cir)) ) (list (arc2bul p1 p2 cir) p1 p2) ) ;;; calculates bulge of arc given the arc points and the ;;; circle (ctr rad) [fixed by Serge Pashkov] (defun ARC2BUL (p1 p2 cir / ang) (setq ang (- (angle (car cir) p2) (angle (car cir) p1))) (if (minusp ang) (setq ang (+ (* 2.0 pi) ang)) ) (tan (/ ang 4.0)) ) ;;; returns angle of arc (bulge) (defun BUL2ANG (seg / ctr) ((angle (setq ctr (car (seg2cir seg))) (cadr seg) ) (angle ctr (caddr seg)) ) ) ;;; calculates angle of arc given the chord distance and radius (defun ARC2ANG (chord rad) (* 2.0 (atan (/ chord 2.0 (sqrt ((expt rad 2) (expt (/ chord 2.0) 2) ) ) ) ) ) ) ;;; length of arc = radius*angle,

;;; Note: +/-, you'll need (abs (arclen seg)) for the distance (defun ARCLEN (seg) (* (cadr (seg2cir seg)) ; radius 4.0 (atan (car seg)) ) ) ; angle = 4*atan(bulge) (setq *INFINITY* 1.7e308) ; largest double (defun TAN (z / cosz) ; [fixed] (if (zerop (setq cosz (cos z))) *INFINITY* (/ (sin z) cosz) ) ) (defun DTR (ang) (* pi (/ ang 180.0)) ) ; degree to radian (defun RTD (ang) (/ (* ang 180.0) pi) ) ; radian to degree [25] DCL: listboxes con tabuladores o fuentes monotext Bajo Windows es difcil mostrar textos debido a los tipo de letra no-monoespaciados. Compruebalo con los atributos de tabulacin en la baldosa list_box, tal como: tabs = "0 20 40"; (set_tile "listbox" "Layer:\t0\twhite") o prueba lo siguiente para utilizar caracteres monoespaciados, el atributo "fixed_width_font": : list_box { label = "Drawing"; key = "dwglist"; width = 50; fixed_width_font = true; // <- monotext }. Tambin echa un vistazo a la rutina detab en xarch.tugraz.ac.at/autocad/news/detab.lsp <http://xarch.tu-graz.ac.at/autocad/news/detab.lsp> o STD-DETAB en xarch.tu-graz.ac.at/autocad/stdlib/STDSTR.LSP <http://xarch.tugraz.ac.at/autocad/stdlib/STDSTR.LSP> para convertir tabulaciones en espacios. [26] EED Extended Entity Data: Seleccionar, obtener y almacenar [26.1] Seleccionar objetos sobre sus EED con (ssget "X") ;;; defines your appname header and delimiter (4 char regapp name ;;; according AAIG, the Autodesk Application Interoperation Guidelines) (setq appname "HUBU-") ;;; defines * for all sub types (setq allappnames (strcat appname "*")) ;;; eg: HUBU-LIST1, HUBU-LIST2 ;;; here is how to get the eed list from one element (defun GETEED-LST (ele) (cdadr (assoc -3 (entget ele (list allappnames)))) ) ;;; this gets all elements of appnames typ (wildcards allowed) (defun SSGET-APP (typ) (ssget "X" (list (list -3 (list typ)))) ;;; this gets only your elements (defun SSGET-HUBU (typ) (ssget "X" (list (list -3 (list (strcat appname typ))))) (ssget-hubu "*") ; will get all your elements [26.2] Conseguir EED desde un objeto Compruebe cualquier XDATA con: (entget (car (entsel)) '("*"))

Estas funciones devuelven todos los XDATA emparejando el nmbre de registro de la aplicacin o emparejando todos los valores de los cdigos XDATA. ;;; get all XDATA lists from an element ;;; i.e with XDATA: ;;; (-3 ("HUBU-1" (1000 ."ASSHATCH")(1002 ."{") ;;; (1070 . 1)(1002 ."}"))) ;;; =>(("HUBU-1" (1000 ."ASSHATCH")(1002 ."{")(1070 . 1)(1002 ."}"))) (defun GETXDATA (e apnlst) (cdr (assoc -3 (entget e apnlst))) ) ;;; all lists without the regapp name ;;; => ((1000 ."ASSHATCH")(1002 ."{")(1070 . 1)(1002 ."}")) (defun GETXDATA-ALL (e apnlst) (apply 'append (mapcar 'cdr (getxdata e apnlst))) ) El nombre de registro de la aplicacin est desnudo aqui, porque nicamente es utilizado para acceder rpidamente a ssget. Las diferentes aplicaciones estn divididas por diferentes grupos (1000 . nombre) como utiliza Autodesk. Para almacenar XDATA en un elemento ver XDATA.LSP o XED.LSP pensando que estos ejemplos son un poco incmodos. Para trucos avanzados de EED, especialmente convirtiendo el estilo de resbuf ADS "(" ")" a listas de Lisp y al revs vea xarch.tu-graz.ac.at/autocad/news/eed_retrieval.txt <http://xarch.tugraz.ac.at/autocad/news/eed_retrieval.txt> [27] Cmo interrumpir un comando en Lisp? Tambin: "Cmo presionar Pausa en AutoLISP?" (COMMAND) sin parmetros funciona como si se presionase Ctrl+C en DOS o ESC en Windows. Pero no imita a ESC en un letrero de dialogo. Y no funciona con archivos de guin. (command nil) es igual a (command). (command) interrumpe solo las funciones de comando, por ejemplo si utilizas el comando "DIM" en AutoLISP, debes interrumpirlo con (COMMAND) despus del dimensionado. Pero no funciona, si intentas interrumpir un bucle en lisp. Existen otras funciones (exit) o (quit), ambas hacen lo mismo, las cuales inmediatamente interrumpen un programa de Lisp. Por ejemplo: (while T ; do a never ending loop (princ "\nEnter a=") (setq a (getint)) (if (zerop a)(exit)) ; Breaks Lisp and returns to the command mode. ) En este ejemplo (COMMAND) no funciona. (EXIT) funciona exactamente como Ctrl+C. Muestra "error: quit / exit abort" sale de todas las funciones anidadas. Para proporcionar una interrupcin silenciosa, debes incluir este mensaje de error en una funcin de tratamiento de errores, por ejemplo: (setq *olderr* *error* *error* my-error) (defun MY-ERROR (s) (if (not (member s ; msgs of the english version: '("Function cancelled" "console break" "quit / exit abort") ) ) (princ (strcat "\nError: " s))

) (setq *error* *olderr*) ) Para archivos de guin utilice esta utilidad para definir (cancel) en lisp, simplemente (defun SCRIPT-CANCEL () (command) (command "_resume") ) y en un archivo de guin: ... [comandos del archivo de guin] (script-cancel) [ms comandos del archivo de guin] ... [27.1] Cmo hacer un nmero ilimitado de mensajes para el usuario? [nuevo] Para permitir a los usuarios finalizar cualquier comando seleccionado sin tener que escribir cdigo para cada posible opcin, repita (command PAUSE) hasta que el comando halla finalizado. (command "_ARC") (while (= 1 (logand (getvar "CMDACTIVE") 1)) (command PAUSE) ) [28] Cmo descifrar la geometra interna de ACIS con Lisp? Todas las entidades ACIS (3DSOLID) han sido documentadas por Spatial ("Descripcin del formato SAT"). Sin embargo la representacin interna obtenida por (ENTGET) est todavs encriptada, pero la encriptacin parece que fue descubierta. (XOR 95) Ejemplos y cdigo en xarch.tu-graz.ac.at/autocad/stdlib/samples/ACIS-REGION.LSP <http://xarch.tugraz.ac.at/autocad/stdlib/samples/ACIS-REGION.LSP> [nuevo] [A] Notas del autor Si crees que hay algunas cuestiones que deberan tratarse en este FAQ, o si quieres mejorar una respuesta, por favor enva un mensaje de correo electrnico a Reini Urban <<mailto:rurban@x-ray.at? subject=FAQ:>> pero no esperes una respuesta. Este FAQ de AutoLISP FAQ est registrado (c) 1996,97,98,99 por Reini Urban. Los ejemplos de cdigo estn, si no es de otra forma constatados (c) 1991-97 por Reini Urban, y deberian ser de uso libre, copiados, modificados y distribuidos, pero no vendidos. Las funciones bsicas estn, si no es de otra manera constatables, (c) 1991-97 por Reini Urban y pueden utilizarse libremente, copiarlas, modificarlas y distribuirlas. Este FAQ puede redistribuirse libremente en su totalidad sin modificaciones con tal de que este aviso de propiedad no sea quitado. No puede venderse ni incorporarlo en documentos comerciales (por ejemplo, publicarlo para la venta sobre CD-ROM, discos flexibles, libros, revistas, u otros medios de impresin) sin el permiso por escrito del poseedor de sus derechos de propiedad. El permiso se otorga expresamente para este documento para hacerlo disponible para el traslado de archivos desde instalaciones que ofrecen el traslado de archivos annimo sin restriccin en Internet y especialmente para ser incluidoen el FAQ oficial de AutoCAD. Si este FAQ se reproduce en medios fuera de lnea (por ejemplo, CD-ROM, u otros medio.), una copia complementaria debera enviarse a Reini Urban, X-RAY, Nibelungeng. 3, 8010 Graz, Austria. Este artculo, los contenidos y los ejemplos de cdigo, se provee COMO EST sin cualquier tipo de garanta expresa o implcita. [A.1] Localizaciones del FAQ Localizacin de la versin HTML: xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html <http://xarch.tugraz.ac.at/autocad/news/faq/autolisp.html> Anotado: AcadWiki version: [nuevo] xarch.tu-graz.ac.at/acadwiki/AutoLispFaq <http://xarch.tugraz.ac.at/acadwiki/AutoLispFaq> Las las versiones ASCII publicadas (y siempre las ltimas versiones) estn en: xarch.tugraz.ac.at/autocad/news/faq/autolisp.1 <http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.1> y

xarch.tu-graz.ac.at/autocad/news/faq/autolisp.2 <http://xarch.tugraz.ac.at/autocad/news/faq/autolisp.2> La versin Winhelp (comprimida con faq-code.lsp) est en: <ftp://xarch.tugraz.ac.at/pub/autocad/news/faq/autolisp.zip> El archivo FAQ de usenet est en <www.faqs.org/faqs/CAD/autolisp-faq/> o en <ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/cad/autocad/%20> El cdigo LISP de este FAQ est en: <ftp://xarch.tu-graz.ac.at/pub/autocad/news/faq/FAQCODE.LSP> Una traduccin al Francs del FAQ fue realizada por Roger Rosec <www.newz.net/acadplus/page5101.htm%20> Una traduccin al Japons del FAQ fue realizada por MASAMI Chikahiro <www.page.sannet.ne.jp/chestnutsburr/autolisp-j.html%20> Una traduccin al Ruso por Igor Orellana <www.cad.dp.ua/stats/alfaq_ru.htm> [fijo] Una traduccin al Alemn por Reini Urban <xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html.de> Una traduccin al castellano por Eduardo Magdalena <http://www.peletash.com/mecanicad> FAQs de AutoDesk pertinentes AutoCAD Techsupport <http://www.autodesk.com/support/autocad/>, [modificado] Search AutoCAD+FAQ <http://search.autodesk.com/query.html?qt=autocad+faq> y Support Assistant 2000 <http://www.autodesk.com/support/autocad/asa2000.htm> [fijo] Grupos de noticias de AutoDesk [modificado] <news://discussion.autodesk.com/autodesk.autocad.customization>, en Google <http://groups.google.com/groups?oi=djq&as_ugroup=autodesk.autocad.customization> [nuevo] o el nuevo WebX interface <http://discussion.autodesk.com/> en el servidor de grupos de discusin de Autodesk. [B] Agradecimientos Este FAQ est basado en el gran esfuerzo de la comunidad comp.cad.autocad, en particular: Tom Berger, Adi Buturovic, Christoph Candido, Mike Clark, Miles Constable, Cara Denko, T.J. DiTullio, Chris Ehly, Jeff Foster, Rusty Gesner, William Kiernan, Paul Kohut, Sergei M. Komarov, Joseph M. Liston, Lu, Masami Chikahiro Georg Mischler, Desi Moreno, Vladimir Nesterovsky, Roger Rosec, Serge Pashkov, Dennis Shinn, Tony Tanzillo, Eugene Tenenbaum, Reinaldo Togores, Reini Urban, Serge Volkov, Morten Warankov, Owen Wengerd, Alan Williams, Doug Wilson, Ian A. White, David Whynot, Darren Young, Xiang Zhu y muchos otros.

[C] Cambios Recientes


18.Junio 2001 fijado deja.com a groups.google.com 23. Abril 2001 Fijados varios enlaces v2.28 4.Abril 2001 cambiado rurban@sbox por rurban@x-ray.at (difunto en el prximo ao), Todas las partes del FAQ estn ahora en el acadwiki. v2.27 23.Septiembre 2000 aadido [23.7] "Cmo obtener el centro de una polilnea?" 15.Septiembre 2000 cambiado rebosamiento de pila [14] para reflejar mejor VL/VLIDE, A2000 nuevo libro [2] 1.Septiembre 2000 vl-sort adevertencia con entidades duplicadas [8] 18.Agosto 2000 cmabiado Codemagic [6.1] de Freeware a Shareware, gracias a Nir Sullam. 1.Agosto 2000 cambiadas las localizaciones del FAQ de Autodesk por una direccin de bsqueda v2.266.Junio 2000 aadido el bug LDATA [7], fijado DEFUN-Q [11], eliminados la mayoria de las notas coloreadas [nuevo/modificado] v2.25 17.Mayo 2000 aadido [27.1], aadido C:POLYREV [23.6], versiones de texinfo 25.Abril 2000 aadido Point A [1.1], acortado el ejemplo DDE en [21.2] 24.Abilr 2000 Vladimir fijo www.deja.com a deja.com/usenet [1.1] v2.24 20.Abril 2000 renombrado cadsyst.com a caddepot.com [1], aadido cadplugins.com [1], aadido rapidlisp [6.2], (aadido emacs)

30.Marzo 2000 renombrado adesknews.autodesk.com a discussion.autodesk.com 9.Marzo 2000 aadido el editor CodeMagic en [6.1], gracias a Nir Sullam 29.Febrero 2000 Masami Chikahiro fij los rangos numricos [7]: -32766 => -32768 23.Febrero 2000 Phil Kenewell actualiz LispLink 2000 [6.1]. 17.Febrero 2000 aadido la url de la lista de bugs de dotsoft [7]. Mike Tuersley fij [11] para archivos MNL. v2.23 14.Febrero 2000 Chris Ehly fij todos los enlaces rotos. v2.22 13.Enero 2000 Adiciones a la precisin numrica. Los enlaces a los documentos tcnicos de AutoDesk estn rotos de nuevo . compilado S::STARTUP v2.216.Diciembre 99 Enlace al FAQ de Autodesk, eliminados email y urls de la gente, menores dificultades. 7.Octubre 99 redactando en [0.1], traduccin al Aleman, enlace en [28] v2.2 13.Julio 99 aadidos temas [0.1] Qu ha cambiado con AutoCAD 2000? , [0.2] No podremos crear ARX nunca ms?, [5.4] Mejoras: Common Lisp y Scheme. Adicciones en [6.2] Analizadores, empaquetadores y detectores de parntesis [5.3] informacin de VLISP R15, [4] Seguridad FAS, [21.4], [20.4]: renombrado SSAPPLY a SSMAP 13.Abril 99 fijados todos los enlaces [1] v2.1 3.Enero 99 fijados y aadidos algunos enlaces: [22.4], [A.1], [B], [27], [1], [2], [20], [22.1] 21.Diciembre 98 encontrada una traduccin al Ruso, Los enlaces a Bob Jones y Masami Chikahiro's estn rotos 12.Julio 98 cambiada la frecuencia de publicacin a mensual. Algunas dificultades menores en lo que concierne a la disponibilidad actual de Visual Lisp y otros cosmticos. cadsyst url 6.Junio 98 cambiado el email de Eugene 13.Mayo 98 aadido letrero de dilogo de impresin de R14 [21.2] 11.Mayo 98 errores eliminados por Serge Pashkov <xrs@aha.ru> en [24] arc2bul, [20.1] remove-if-not (pero correcto en faq-code.lsp), [21.7] documento de maptrans0-1, [24] tan, [21.2] DDECMD y alguna beta de vlisp fijado en faq-code.lsp v2.0 7.Mayo 98 gran cantidad de cambios basados en Visual Lisp: [0],[4],[5],[6.1],[7] [17] nuevo, [2] nuevos libros, [21.2] ActiveX sample, [A.1] R14 mejor FAQ oficial 27.Febrero 98 [0] Visual Lisp disponible. 24.Febrero 98 [6.1] lspedit.exe, [0] noticias de Visual Lisp y [7] entmake vrtices v1.12 12.Febrero 98 Eugene Tenenbaum <et119@columbia.edu> me enva una lista enorme de correcciones, la mayoria para mejorar el lenguaje Ingls. De momento solo actualizado hasta [11]. 15.Enero 98 [7] HATCH aadido al problema entget, [0] ms especfico ahora, [22.4] url cambiada [A.1] Traduccin al Japones 12.Enero.98 [2] El manual de lisp de la R13 est en el manual de personalizacin no solo en el CD. perdn 8.Enero.98 Nueva direccin del Web de Vladimir Nesterowsky's 24.Noviembre.97 fijados algunos fallos tipogrficos v1.11 15.Noviembre.97 cambiado el encabezado. Direccin del FAQ de AutoCAD de Autodesk. ver [A.1] el editor LispLink. ver [6.1] Rumores: [0] 23.Octubre.97 Roger Rosec proporciona una traduccin al Francs del FAQ entero. ver [A.1] 13.Septiembre 97 Alan Williams detecta un estpido error en DATESTAMP en [22.2] pero en FAQCODE.LSP estaba bien. 28.Agosto 97 aadido el bug de (entget) LWPLOYLINE a [7], cambiado my email a rurban@xarch.tugraz.ac.at para estar preparado para el rea de post-estudio. :) v1.10 22.Julio 97 algunos LWPOLYLINE fijados, lanzado el depurador de Lisp R14 Vital LISP 3.0, Convert 3.3 actualizado [4.4], fijada la frecuencia de posteo en bisemanal: todos los segundos Lunes, 11.30 MET 2.Julio 97 fijada URL en [10],

30.June 97 fijado (istypep) en [20.4], cambiado el ttulo de [16], ligeros cambios en (getpts) en [23.1] v1.9 26.Junio 97 [5.2] confirmada la fecha de la edicin de Vill3, aadido un ejemplo de DDE de Xiang Zhu a [21.2], proporcionado detab.lsp [25] 17.Junio 97 Lista de bugs en [20.4]: corto (getval), [12] Autocargando ARX R14, [23.5] (pline-segs) es ahora guardado en la versin 14 pero an no compatible, nuevo [23.6] revpoly.lsp, [A.1], [5.2] Vill 3 tendr soporte para los reactores. 9.Junio 97 nuevo truco symbol-string por Christoph Candido [20.3] 21.Mayo 97 algunas correcciones sin importancia. v1.8 15.Mayo 97 aadido [0] El futuro de AutoLISP? cambiado VERTECES a VERTICES, fijado el email de af.buturovic@berwanger.com, aadido SSAPPLY: [20.4], [23.5], comenzado para R14 y superiores algo de cdigo para LWPOLYLINE [23], sin terminar todava, (pline-segs) est desaparecido 9.Mayo 97 [2.1] Winhelps R14, [5.2]: nueva url basis, Vill Lite [6.1] aadido [16]: Lisp sobre mltiples DWGs aadidos algunos breves comentarios a [6.1] (ntemacs), [14], [21.8] 21.Abril 97 aadido [28] descripcin de ACIS v1.7 9.Abril 97 aadido [21.8] C:XYZ, aadido [15] (command "ROTATE3D")no funciona! Por qu? los nmeros de captulos de la versin HTML se equiparan con los de la versin publicada, aadido [27]: (command) como ctrl-c, Sergei Komarov mejora [27], Adi Buturovic mejora [27] para archivos de guin. v1.6 13.Febrero 97 movida la introduccin al principio del todo para los curiosos. otro lisp para plotear lisp [21.2], un depurador de lisp [3.1], [A.1]: El espejo de uunet gd.tuwien es ms rpido que los oficiales, fijada la direccin del FAQ de cadence, aplicado parcialmente el formato de recopilacin, html pronto se crear automticamente, erronea (antigua) numeracin de captulos de la versin v1.5, [7] 64 en la bandera 70 en tablas de smbolos, v1.5 5.Febrero 97 aadidos ejemplos de get y edlgetent por Vladimir, eliminado el cdigo de ordenacin, modificado el ttulo de [11] y aadidas funciones sobre cadenas de texto, error solucionado en getpts [23.1], Las funciones bsicas deberian ser libres [A], aadido DATESTAMP a [22.2], aadida una "s" al ttulo de [A], aadido [20] DCL, [21] EED, [21.1-21.7] ejemplos, Serguei Komarov encontr un error en seg2cir,arclen,arc2bul [24], aadido arc2ang y (corregido) arclen, errores eliminados en sslist, getval, todos los predicados ahora con el prefijo "p", preparado un FAQCODE.LSP, Convert supercedes Decrypt [4.4], aadido archivos de guin y (command) a [23.4], AREA a [23.5], v1.4 24.Enero 97 noticias importantes con Decrypt [4.4], movido [11] "errores" a [7] "problemas", aadido [11] "Cmo hago (sym, list)", aadido el encabezado "aprobado" para news.answers, aadido [22]-[24]: algunos ejemplos en materia de subentidades y bulge, Serge encontr un error/caracteristica en acad_strlsort [7], aadido exactitud de nmeros y limitacin de a [7], aadido cdigo de ruptura y ejemplos a [3.3], aadida una breve guia de descripcin de estilo de lisp [2.2], en lugar de [6.4] v1.3 17.Enero 97 aadido [16] rebosamiento de pila (gracias Serge), [4.7] Lisp2C, actualizado [8] ordenacin ms rpida (ejemplos, pruebas), recibida la aprobacin de news.anwsers v1.2 11.Enero 97 aadido Phoaks a los archivos de noticias fijados (roto) en [3.3] (gracias Tony), aadido un ejemplo de ordenacin a [8], mejorado (my-princ) en [15] modificada la frecuencia de posteo de semanal a bisemanal v1.1 4.Enero 97 errores de R13, cdigo de S::STARTUP por Owen Wengerd, pginas web en lugar de emails donde es apropiado, (la gente recibe bastante propaganda por correo estos das) ms enlaces, y algunos errores corregidos v1.0 22.Diciembre 96 Primera versin, publicada el 28.Diciembre 96 como una base para su discusin

Vous aimerez peut-être aussi