Autolisp Es
Autolisp Es
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 <[email protected]> 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 [email protected] <mailto:[email protected]?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
<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>
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.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.
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.
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.
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.
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]
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>
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>
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?
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.
((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.
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*
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>
(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:[email protected]? 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.
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 <[email protected]> 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 <[email protected]> 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 [email protected] 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 [email protected], 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