Como puedo cambiar todos los textos, a la vez, a otro tamaño?
Gracias
saludos
escurza @ arrakis.es
tienes 2 posibilidades:
1.- si todos los textos estan con el mismo estilo de texto y ademas ese estilo tiene definida la altura como 0.2 ( en tu ejemplo) : entonces con la orden style<>estilo , redefines el estilo y ya está.
2.- si no se da el 1er caso : pues usas al programa ke viene con el bonus de la 14. ke te permite editar muchos textos a la vez. OJO xk hay alguna opciones ke no pirulan por un defecto en la traduccion.
Si no tienes activo este menu adiccional lamado "bonus" fisga un poco por el directorio BONUS de tu autocad14 y seguro ke lo pillas facilmente.
salud y suerte.
luis_carlos <es...@no.es> escribió en el mensaje de noticias 9ekm6t48t98fqg614...@4ax.com...
Prueba a ejecutar un comando denominado "CHTEXT".
Saludos cordiales.
--
***************************************************************
NoName es propiedad de NoName.Corporations®
Este mensaje ha sido escrito bajo una gran presión.
(Unos 1500mBar Atmosféricos).
"El umbral del templo de la sabiduría es el
conocimiento de nuestra propia ignorancia"
Charles H.Spurgeon
"¿Le has pedido a un coche que te perdone la vida?
Yo sí, y tuve suerte." NoName (por poco).
>luis_carlos <es...@no.es> escribió
><9ekm6t48t98fqg614...@4ax.com>:
>
>>Tengo un dibujo en autocad 14, con varios textos con tamaño de letra,
>>por ejemplo 0.2
>>
>>Como puedo cambiar todos los textos, a la vez, a otro tamaño?
>>
>>Gracias
>>
>Prueba a ejecutar un comando denominado "CHTEXT".
>Saludos cordiales.
Gracias por contestar pero no funciona
saludos
escurza @ arrakis.es
>hola:
>
>tienes 2 posibilidades:
>
>1.- si todos los textos estan con el mismo estilo de texto y ademas ese estilo tiene definida la altura como 0.2 ( en tu ejemplo) : entonces con la orden style<>estilo , redefines el estilo y ya está.
Lo redefino, puedp llegar a cambiar el tipo de letra pero no cambio la
altura. Si quiero cambiar la altura tengo que seleccionar una a una y
cambiarla con modificar/propiedades
¿Hago algo mal?
>
>2.- si no se da el 1er caso : pues usas al programa ke viene con el bonus de la 14. ke te permite editar muchos textos a la vez. OJO xk hay alguna opciones ke no pirulan por un defecto en la traduccion.
Debo tener un acad14 muy malo, ya que no tiene ese directorio
Hola Luis Carlos:
La orden adecuada para esto es Extended Change Properties que sale en el
menu de Bonus Standard Tollboar. Aqui podras cambiar la altura y el estilo
incluso de varios textos a la vez, ademas del color y la capa.
Si no sabes como poner el menu bonus, no dudes en llamarme.
Un saludo: Miguel Caballero
busca el archivo CHTEXT.lsp
si lo encuentras carga mediante el siguiente comando
(load "chtext.lsp")
asegurate que por lo menos de que este en el directorio correcto.
(support u otro)
saludos cordiales.
Seleccionas el texto que quieres y coges un área con todos los textos que
quieres igualar.
"luis_carlos" <es...@no.es> escribió en el mensaje
news:9ekm6t48t98fqg614...@4ax.com...
Yo usaria lo de la brocha de igualar propiedades ke FEDE ha apuntado por ahi abajo:
<Usa el comando Igualar Propiedades.
<Seleccionas el texto que quieres y coges un área con todos los textos que
<quieres igualar.
Pero ojo ! tambien te iguala la capa, el estilo, la inclinacion......y todo ...vamos!
Asi ke igual tienes ke repetir la operacion unas cuantas veces: 1 por cada grupo de textos con diferentes propiedades ke tengas ( no ze zi m'ezpliko? )
salud y suerte!
luis_carlos <es...@no.es> escribió en el mensaje de noticias 9ekm6t48t98fqg614...@4ax.com...
>
>La orden adecuada para esto es Extended Change Properties que sale en el
>menu de Bonus Standard Tollboar. Aqui podras cambiar la altura y el estilo
>incluso de varios textos a la vez, ademas del color y la capa.
>Si no sabes como poner el menu bonus, no dudes en llamarme.
>Un saludo: Miguel Caballero
>
żes un menu?
żde los que acaban en mns?
No se donde estan
Gracias por tomarte las molestias
saludos
escurza @ arrakis.es
>Vistos tos los poblemas ke tienes:
>- no directorio bonus!
>- no menu bonus cargao!
>- seguramente tampoco el progranita chgtext.lsp.
>- los texto generados en un estilo ke al redefinir el estilo no cambian de altura.....
>pues ...no se ke decirte. Lo mejor , quiza...., es ke te pegues un tiro!....NOOOO !! ke es broma.
>
>Yo usaria lo de la brocha de igualar propiedades ke FEDE ha apuntado por ahi abajo:
>
><Usa el comando Igualar Propiedades.
>
NO ME FUNCIONA
Os podeis descojonar, pero me da este error cuando pulso en
modificar/igualar propiedades
Comando: _matchprop Comando "MATCHPROP" desconocido. Pulse F1 para
obtener ayuda.
Nada, seguire cambiando uno por uno con el comando
modificar/propiedades
Muchas gracias por las molestias que os tomais
saludos
escurza @ arrakis.es
"luis_carlos" <es...@no.es> escribió en el mensaje
news:egl67tknbsuunfhnk...@4ax.com...
> Nada, seguire cambiando uno por uno con el comando
> modificar/propiedades
>
> Muchas gracias por las molestias que os tomais
Por lo menos eres perseverante y respondes a los
mensajes (no como alguno que llega pidiendo la
luna y luego no responde a los mensajes)
Eres un buen novato, así que te voy a ayudar :)
Copia el texto siguiente desde donde empiezan los
";" hasta el final del mensaje en el notepad y
guardalo como PROTEXT.LSP en
"C:\Archivos de programa\acad2000\support" (o como
se llame en tu ordenador) luego carga el fichero
desde AutoCAD con appload.
Escribe si tienes dudas.
Un saludo
;;;===========================================================================;
;;;
;;; PROTEXT.LSP
;;;
;;; Eduardo Muñoz, Diciembre 2000
;;;
;;;===========================================================================;
;;;
;;; La rutina permite modificar varios textos a la vez, cambiando a
;;; mayúsculas o minúsculas, subrrayado, angulo, estilo o altura.
;;;
;;;===========================================================================;
;;;===========================================================================;
;;;
;;; Funcion Principal
;;;
(defun c:PT () (c:protext))
(defun c:Protext (/ ssText error0 sOption)
(setvar "cmdecho" 0)
(if (setq ssText (ssget '((0 . "TEXT,MTEXT"))))
(progn
(setq error0 *error*)
(setq *error* err-protext)
(command "._undo" "_begin")
(initget "MAyusculas MInusculas Estilo Altura Subrayado Quitarsub aNgulo")
(setq sOption
(getkword
"Seleccione propiedad a cambiar
\nSubrayado/Quitar subrayado/MAyusculas/MInusculas/Estilo/aNgulo/<Altura>: "
)
)
(cond
((= sOption "MAyusculas") (camb-may-min ssText nil))
((= sOption "MInusculas") (camb-may-min ssText T))
((= sOption "Estilo") (camb-estilo ssText))
((= sOption "Subrayado") (subrayado ssText))
((= sOption "Quitarsub") (quitar-subrayado ssText))
((= sOption "aNgulo") (camb-angulo ssText))
((= sOption "Altura") (camb-altura ssText))
((= sOption nil) (camb-altura ssText))
)
(command "._undo" "_end")
)
(prompt "Ningun texto encontrado.")
)
(setq *error* error0)
(princ)
)
;;;===========================================================================;
;;;
;;; La función cambia todos los textos del ssTextunto de selección, a
;;; mayúsculas o minúsculas según la variable dependiente "min" sea "nil" o T.
;;; Para ello establece una repetitiva y sustituye la lista en la Base de
;;; Datos con el contenido del texto.
;;;
(defun camb-may-min (ssText minusculas / iIdx lText)
(setq iIdx 0)
(repeat (sslength ssText)
(setq lText (entget (ssname ssText n)))
(entmod
(subst
(cons 1 (strcase (cdr (assoc 1 lText)) minusculas))
(assoc 1 lText)
lText
)
)
(setq iIdx (1+ iIdx))
)
)
;;;===========================================================================;
;;;
;;; La función cambia el estilo de los textos del ssTextunto de selección.
;;; Para ello solicita el nuevo estilo. Examina las tablas de símbolos para
;;; ver si existe, y en caso afirmativo modifica en la Base de Datos la lista
;;; con el estilo.
;;;
(defun camb-estilo (ssText / n lent estact nest)
(setq estact (cdr (assoc 7 (entget (ssname ssText 0)))))
(if (= "" (setq nest (getstring (strcat "Nuevo estilo <" estact ">: "))))
(setq nest estact)
)
(while (not (tblsearch "style" nest))
(prompt "\nEstilo no encontrado.")
(if (= "" (setq nest (getstring (strcat "\nNuevo estilo <" estact ">: "))))
(setq nest estact)
)
)
(setq n 0)
(repeat (sslength ssText)
(setq lent (entget (ssname ssText n)))
(setq lent (subst (cons 7 nest) (assoc 7 lent) lent))
(entmod lent)
(setq n (+ 1 n))
)
)
;;;===========================================================================;
;;;
;;; La función cambia la altura de los textos del ssTextunto de selección.
;;; Para ello solicita la nueva altura ofreciendo por defecto la actual, y
;;; actualiza la Base de Datos reemplazando la altura.
;;;
(defun camb-altura (ssText / altact sMensaje nalt n lent)
(setq altact (cdr (assoc 40 (entget (ssname ssText 0)))))
(initget 6)
(setq sMensaje (strcat "Nueva altura <" (rtos altact 2 2) ">: "))
(if (not (setq nalt (getreal sMensaje)))
(setq nalt altact)
)
(setq n 0)
(repeat (sslength ssText)
(setq lent (entget (ssname ssText n)))
(setq lent (subst (cons 40 nalt) (assoc 40 lent) lent))
(entmod lent)
(setq n (+ 1 n))
)
)
;;;===========================================================================;
;;;
;;; La función cambia todos los textos del ssTextunto de selección, de forma
;;; que queden como subarayados. Para ello añade "%%u" a la cadena de texto
;;; de la entidad, y la actualiza en la base de datos con el contenido del
;;; texto.
;;;
(defun subrayado (ssText / n lent text)
(setq n 0)
(repeat (sslength ssText)
(setq lent (entget (ssname ssText n)))
(if (not (equal (strcase (substr (cdr (assoc 1 lent)) 1 3) T) "%%u"))
(progn (setq text (strcat "%%u" (cdr (assoc 1 lent))))
(entmod (subst (cons 1 text) (assoc 1 lent) lent))
)
)
(setq n (1+ n))
)
)
;;;===========================================================================;
;;; ;
;;; La función cambia todos los textos del conjunto de selección, de forma ;
;;; que se elimina el subarayado. Para ello quita "%%u" a la cadena de texto ;
;;; de la entidad, y la actualiza en la base de datos con el contenido del ;
;;; texto. ;
;;; ;
(defun quitar-subrayado (ssText / n lent text)
(setq n 0)
(repeat (sslength ssText)
(setq lent (entget (ssname ssText n)))
(if (equal (strcase (substr (cdr (assoc 1 lent)) 1 3) T) "%%u")
(progn (setq text (substr (cdr (assoc 1 lent)) 4))
(entmod (subst (cons 1 text) (assoc 1 lent) lent))
)
)
(setq n (+ 1 n))
)
)
(defun camb-angulo (ssText / rAngulo n lText)
(setq rAngulo (getangle "\nAngulo del texto: "))
(setq n 0)
(repeat (sslength ssText)
(setq lText (entget (ssname ssText n)))
(entmod
(subst
(cons 50 rAngulo)
(assoc 50 lText)
lText
)
)
(setq n (1+ n))
)
)
;;;===========================================================================;
;;;
;;; Función de control de errores.
;;;
(defun err-protext (mens)
(command "._undo" "_end")
(setq *error* error0)
(princ (strcat "\nError: " mens " "))
(princ)
)
(prompt "\nNueva orden PROTEXT definida.")
(princ)
>carga la libreria
>escribe appload
>y luego buscas mach.arx, la cargas. y andando
>.
>
¿Que libreria y donde esta y como la cargo?
Un pesado y torpe que os pide perdon
saludos
escurza @ arrakis.es
(defun camb-may-min (ssText minusculas / iIdx lText)
(setq iIdx 0)
(repeat (sslength ssText)
(setq lText (entget (ssname ssText n)))
(entmod
(subst
(cons 1 (strcase (cdr (assoc 1 lText)) minusculas))
(assoc 1 lText)
lText
)
)
(setq iIdx (1+ iIdx))
)
)
Si me permites, creo que hay un pequeño error en tu programa.
Dónde vas a buscar dentro del conjunto ssText mediante el comando ssname,has
colocado un contador (más que contador es un posicionador) pero que usa una
variable denominada n que no ha sido declarada ni se le ha asignado ningún
valor. He probado a substituirlo por la variable iIdx que es la que va
incrementando gradualmente y funciona. El texto del programa que hay arriba
es el original, abajo coloco el corregido. Si queréis probarlos simplemente
desde y sustituirlo en uno por el otro.
Espero vuestras respuestas. Gracias igualmente por el programa porque le
piensa sacar mucho uso. Saludos cordiales.
;;;========================================================================
===; ;;;
;;; La función cambia todos los textos del ssTextunto de selección, a
;;; mayúsculas o minúsculas según la variable dependiente "min" sea "nil"
o T. ;;; Para ello establece una repetitiva y sustituye la lista en la
Base de ;;; Datos con el contenido del texto.
;;;
(defun camb-may-min (ssText minusculas / iIdx lText)
(setq iIdx 0)
(repeat (sslength ssText)
(setq lText (entget (ssname ssText iIdx)))
(entmod
(subst
(cons 1 (strcase (cdr (assoc 1 lText)) minusculas))
(assoc 1 lText)
lText
)
)
(setq iIdx (1+ iIdx))
)
)
--
***************************************************************
NoName es propiedad de NoName.Corporations®
Este mensaje ha sido escrito bajo una gran presión.
(Unos 1500mBar Atmosféricos).
"El umbral del templo de la sabiduría es el
conocimiento de nuestra propia ignorancia"
Charles H.Spurgeon
"¿Le has pedido a un coche que te perdone la vida?
Yo sí, y tuve suerte." NoName (por poco).
***************************************************************
>Copia el texto siguiente desde donde empiezan los
>";" hasta el final del mensaje en el notepad y
>guardalo como PROTEXT.LSP en
>"C:\Archivos de programa\acad2000\support" (o como
>se llame en tu ordenador) luego carga el fichero
>desde AutoCAD con appload.
>
¡ ¡ ¡ G R A C I A S ! ! !
FUNCIONA
Y ademas he aprendido a cargar los archvos .lsp, de los que tanto oia
hablar y de los que (como en aquella pelicula de Woody Allen (¿?) no
me atrevia a preguntar
Merece la pena enchufarse a las news para poder aprender cosas
Gracias otra vez.
PD
He de hacer una confesion: no soy novato: tengo autocad desde hace ¿7
años? (desde el 12) Lo que pasa es que lo que se, lo voy aprendiendo
"a huevo" y gracias a los que escribis por aqui.
saludos
escurza @ arrakis.es
Tan wena komo el novato!
Yo tambien me la kopio!
Ke bien escrita , ke nombres de variables tan ways y ke facil de seguir!
Sin animo de critikar, (¡¿ igual me kolumpio, ke no la he probado en toavia ?!), solo veo un problemilla: el angulo hay ke meterlo en radianes , no ?. Se lo metes a la entidad sin modificar el valor tekelado, y en las entidades solo se guardan en radianes, no ?
salud y suerte.
Eduardo Muñoz <e...@jet.es> escribió en el mensaje de noticias uofwqr...@jet.es...
> Si me permites, creo que hay un pequeño error en tu programa.
> Dónde vas a buscar dentro del conjunto ssText mediante el comando ssname,has
> colocado un contador (más que contador es un posicionador) pero que usa una
> variable denominada n que no ha sido declarada ni se le ha asignado ningún
> valor. He probado a substituirlo por la variable iIdx que es la que va
> incrementando gradualmente y funciona.
Noname apunta aki una kosa, a mi parecer, interesantisima.
Uno se puede pensar : este tio ( Eduardo ) no ha probado la rutina esa donde el contador/posicionador no esta iniciado =/= inicializado. Si la hubiese probado le habria kaskao!!
El caso es ke seguro ke lo ha hecho ( probarla ) y le funciono ( seguro ),¿ de donde viene pues el problema ?. A mi me ha pasado multitud de veces! .
LA SECUENCIA DEL PROBLEMA ES (MAS O MENOS):
- Arranco ACAD
- cargo un lsp
- lo ejecuto
- falla
- corrijo
- ya funciona!
- salgo de autocad
- me tomo una trankilina
- me voy a mimir
- vuelvo a entrar a autocad
- cargo el mismo lsp
- lo ejecuto
- vuelve a fallar!!!!! HORROR !!!!
( kerido lector : Si no tienes konocimientos avanzados de autolisp es mejor ke no sigas leyendo.De nada )
¿ de donde viene el fallo ?
Si por un despiste, esa variable no iniciada , ha tenido un valor asignado durante la correccion o en una anterior llamada a una sub. ese valor keda en lista de variables ( atom-family ) ke guarda autolisp!!!" y así , el programa siempre encuentra un valor y nunca un nil. Al dia siguiente ( despues de la trankilina y el mimir ) arrancas de nuevo , pero ese valor ya no está en memoria !!!. Ergo : vuelve a kaskar!!!
No ze zi me ezplico !!!???
Zi no me he ezplikado claramente : lo ziento, no zé hacerlo mejor!
Zi me he ezplikado claramente : ¿ alguno conoce un metodo para limpiar todas las variables del atom-family , kuidando de no eliminar las ke le hacen falta a autocad o a los programas Lsp integrados ? . Seria un especie de "purge<>limpia" de las variables. Asi, uno estaria seguro de ke al correr un programa lsp , no va a haber ya en memoria variables asignadas.
Hay un solucion magica: salir y volver a entrar, pero es lenta y para depuracion de prog, largos es una pesadez!!
La aparente solucion de hacer todas las variables locales dentro de las defun, al modo : ( defun mifun / va1 var2 var3 ...varx ) , muchas veces no es posible. Por temas de depuracion, de intercambio de multiples datos, de alteracion de variables generales a usar por otros prog, etc.
No podeis imaginar la cantidad de trankilinas ke me tenido ke tomar a causa de este traidor "almacen de variables escondias" ke es el atoms-family !!!
Yo pensé ke era un problema mio, por mi falta de tecnica de programacion, y mi formacion exclusivamente "amateur", pero veo ke a los "grandes gurus" ( lease "Eduardo" ) tambien les pasa.
salud y suerte
P.D.: me temo ke ha planteado un tema demasiado farragoso para estas nuis ?! Si no hay respuestas , lo entendere !.
NoName <NoN...@NoAddress.No> escribió en el mensaje de noticias Xns9039623...@194.179.3.124...
> Sin animo de critikar, (¡¿ igual me kolumpio, ke no la he probado en toavia ?!), solo veo un > > > > > problemilla: el angulo hay ke meterlo en radianes , no ?. Se lo metes a la entidad sin modificar el > > valor tekelado, y en las entidades solo se guardan en radianes, no ?
PERDON!!!
ME DESDIGO!!!
SI KE PIRULA ASI! KE TIENES UN GETANGLE! YO SIMPRE USO UN GETREAL Y LUEGO TRADUZCO EL VALOR A RADIANES. ASI KE CUANDO VEO UN TEMA DE ANGULOS , MI SUBCONSCIENTE ( DOPADO POR LAS TRANKILINAS ) BUSCA SIEMPRE UNA SUBRUTINA DE CONVERSION A RADIANES!
PERDON, OTRA VEZ!! ( TENIA KA HABERLA PROBADO ANTES DE EMITIR UN JUICIO TAN TEMERARIO !!)
EN LO DEMAS ME REAFIRMO : COJONUDA !! ( CON LA PEKEÑA MODIFICACION DE NONAME, PARA EL CONTADOR N --> IIDX , EN LA SUB DE KAMBIO MAYUSCULAS-MINUSKULAS)
salud y suerte.
>holas:
>
>Noname apunta aki una kosa, a mi parecer, interesantisima.
>Uno se puede pensar : este tio ( Eduardo ) no ha probado la rutina esa
>donde el contador/posicionador no esta iniciado =/= inicializado. Si la
>hubiese probado le habria kaskao!!
>
>El caso es ke seguro ke lo ha hecho ( probarla ) y le funciono ( seguro
>),¿ de donde viene pues el problema ?. A mi me ha pasado multitud de
>veces! .
>
>LA SECUENCIA DEL PROBLEMA ES (MAS O MENOS):
>- Arranco ACAD
>- cargo un lsp
>- lo ejecuto
>- falla
>- corrijo
>- ya funciona!
>- salgo de autocad
>- me tomo una trankilina
>- me voy a mimir
>- vuelvo a entrar a autocad
>- cargo el mismo lsp
>- lo ejecuto
>- vuelve a fallar!!!!! HORROR !!!!
>
>( kerido lector : Si no tienes konocimientos avanzados de autolisp es
>mejor ke no sigas leyendo.De nada )
>... ... ...
>y mi formacion exclusivamente "amateur", pero veo ke a los "grandes gurus"
>( lease "Eduardo" ) tambien les pasa.
>
>salud y suerte
>
>P.D.: me temo ke ha planteado un tema demasiado farragoso para estas nuis
>?! Si no hay respuestas , lo entendere !.
>
Tranquilo, no es pesado para algunos estamos metidos bastante en este tema.
Creo que estás refiriendo al tipo de memoria nodal,es un tipo de memoria
asignada por Autocad para el almacenamiento de variables. Existen dos formas
de recuperar la memoria, o lo que es lo mismo, recuperar variables usadas.
Existe un comando que fuerza a la recuperación de memoria inutilizada: (gc).
Sin embargo, Autocad, lo suele hacer automáticamente. Lo que ahora mismo no
sé es si las variables declaradas deben estar vacías, porque si contienen
algún valor lo mismo no hace ni caso. Existe otra manera de recuperar memoria
nodal y al mismo tiempo recuperar variables o asignar a las variables un
valor nulo (ya sé que los sabeis), y es asignar a cada variable un valor nil.
Pero en cualquier caso yo sólo se que cuando haces un programa debes usar
sólo las variables definidas en la cabecera del programa, cualquier
asignación de valor a una variable no declarada Autocad asumirá como una
variable de uso público, es decir, una variable que después puede ser usada
por otro programa, y permanecerá mientras la sesión de Autocad esté abierta.
Con todo esto permanezco abierto a cualquier comentario u observación acerca
de memorias nodales, liberalización y asignación de variables además de otros
temas relacionados con autolisp.
Saludos cordiales.
> Si me permites, creo que hay un pequeño error en tu programa.
> Dónde vas a buscar dentro del conjunto ssText mediante el comando ssname,has
> colocado un contador (más que contador es un posicionador) pero que usa una
> variable denominada n que no ha sido declarada ni se le ha asignado ningún
> valor. He probado a substituirlo por la variable iIdx que es la que va
> incrementando gradualmente y funciona.
Es una metedura de pata por mi parte. Como
normalmente solo uso el cambio de altura no lo
había notado.
Como he metido la pata?
Facil. Me gusta mirar y remirar mis programas,
repasarlos y corregirlos. No me gusta tener
demasiados programas de autolisp, pero en cambio
procuro mantenerlos en buena forma :)
Cambio nombres de variables para que sea mas
claro, verifico las entradas de usuario, hago que
sean mas generales, etc. El problema es que de vez
en cuando se me escapa alguna variables :(
--
Eduardo Muñoz
> Zi me he ezplikado claramente : ¿ alguno conoce
> un metodo para limpiar todas las variables del
> atom-family , kuidando de no eliminar las ke le
> hacen falta a autocad o a los programas Lsp
> integrados ? . Seria un especie de
> "purge<>limpia" de las variables. Asi, uno
> estaria seguro de ke al correr un programa lsp ,
> no va a haber ya en memoria variables asignadas.
De todo hay en el keli del Señor :)
Modo de uso:
Inicias tu sesión de AutoCAD y guardas el estado
de las variables (con 'ngl guardar').
Ejecutas tus programas.
Cuando quieras "volver al principio" haces
'ngl limpiar' y listos :)
Espero que sea esto lo que buscas porque a la hora
que es y con la semana que llevo, la neurona no
está para muchas alegrías :)
;;;===========================================================================;
;;;
;;; NGL.LSP
;;;
;;; Eduardo Muñoz, Enero 2001
;;;
;;;===========================================================================;
;;;
;;; Basado en una idea de Jon Flemming
;;;
;;; Este programa busca variables globales creadas por otros
;;; programas.
;;;
;;; Guardar: Guarda una lista de las variables definidas en el momento
;;; actual.
;;;
;;; Limpiar: Asigna a las variables creadas desde que se ejecutó la
;;; opción guardar el valor 'nil'.
;;;
;;; Mostrar: Muestra las variables creadas desde que se ejecutó por
;;; ultima vez la opción guardar.
;;;
;;;===========================================================================;
(defun c:NGL (/ sAns)
(initget "Guardar Limpiar Mostrar")
(setq sAns (getkword "\nLista de variables Guardar/Limpiar/<Mostrar>: "))
(cond
((eq sAns "Guardar")
(setq *GlobalsList* (atoms-family 0))
)
((eq sAns "Limpiar")
(if *GlobalsList*
(foreach GlobalSymbol (atoms-family 0)
(if (not (member GlobalSymbol *GlobalsList*))
(set GlobalSymbol nil)
)
)
(princ "\nNo hay un estado guardado.")
)
)
((member sAns '("Mostrar" nil))
(if *GlobalsList*
(foreach GlobalSymbol (atoms-family 0)
(if (not (member GlobalSymbol *GlobalsList*))
(print GlobalSymbol)
)
)
(princ "\nNo hay un estado guardado.")
)
)
)
(princ)
)
(setq *GlobalsList* t)
(princ)
--
Eduardo Muñoz
Es practicamente perfecta para lo que yo quiero.
salud y suerte
Eduardo Muñoz <e...@jet.es> escribió en el mensaje de noticias uitms6...@jet.es...
Igual me engancho un poco tarde al tema, pero me parece muy interesante:
No me he enterado muy bien del tema de inicio (creo que era una funcion de
Eduardo que hacía cosas raras) pero en las respuestas veo cosas que me suenan a
largas noches de insomnio ;)
> >LA SECUENCIA DEL PROBLEMA ES (MAS O MENOS):
> >- Arranco ACAD
> >- cargo un lsp
> >- lo ejecuto
> >- falla
> >- corrijo
> >- ya funciona!
> >- salgo de autocad
> >- me tomo una trankilina
> >- me voy a mimir
> >- vuelvo a entrar a autocad
> >- cargo el mismo lsp
> >- lo ejecuto
> >- vuelve a fallar!!!!! HORROR !!!!
> >
> >( kerido lector : Si no tienes konocimientos avanzados de autolisp es
> >mejor ke no sigas leyendo.De nada )
Seguro que nos ha pasado a todos !!!
Creo que el problema son las variables globales que te vas dejando por el camino.
En tus funciones utilizas variables a las que se te olvida dar un valor inicial
correcto, te casca el programa y, probando probando o ejecutando una función que
utiliza una variable que se llama igual, le das el valor mágico que hace que
funcione.
Está claro que, al salir del dibujo, la variable desaparece y, al volver a
ejecutar la función, esta KASKA (perdón, casca).
AutoCAD define, por defecto, todas las variables que utilizas en tus funciones
como globales. Esto es, cualquier función puede leer y modificar su valor en
cualquier momento.
Esto te puede llevar a la locura, total o parcial, si utilizas varias funciones
que se llaman entre si y que utilizan variables que tienen el mismo nombre pero
datos distintos.
Si las pruebas por separado funcionan de maravilla, pero si la mezclas, kaskan
kosa mala.
Y no te digo nada si utilizas una variable CONTA para controlar contadores en
todas tus funciones. Frenesí total!!!
La solución consiste en definirte TODAS las variables que utilices en tus
funciones como locales. Excepto, claro está, las que realmente quieras que sean
globales.
¿Cómo se hace? En la definición de la función pones a continuación de los
parámetros una barra de dividir rodeada de espacios y, a continuación, todas las
variables que quieras definir como local.
Ejemplo:
1.----- TODAS LAS VARIABLES GLOBALES ------
(defun UNO () ; es un poco inutil, pero como ejemplo vale
(setq CONTA 0) ; Inicializo el contador canasha
(while (< CONTA 5)
(print CONTA) ; Escribo el número de línea
(dos " HOLA ") ; Esta función escribe " HOLA " varias veces
(setq CONTA (1+ CONTA)) ; Incrementamos el contador que ya se ha vuelto
loco.
)
(princ) ; Elegancia y limpieza al salir.
)
(defun DOS (CADENA)
(setq CONTA 100) ; Inicializamos otra vez el contador, esto es, la cag....
(while (< CONTA 103)
(princ CADENA) ; Escribimos " HOLA "
(setq CONTA (1+ CONTA))
)
)
Puesto que la variable CONTA es global, al terminar la función dos, esa variable
tiene el valor 103.
Al volver a la función uno, puesto que CONTA = 103, salimos del bucle. Aqui es
facil de ver, pero ...
Lo solucionamos con las variables locales:
1.----- VARIABLES LOCALES ------
(defun UNO (/ CONTA) ; puesto que no hay parámetros, lo primer que pongo es la
barra /
(setq CONTA 0) ; Inicializo el contador ahora no tan canasha
(while (< CONTA 5)
(print CONTA) ; Escribo el número de línea
(dos " HOLA ") ; Esta función escribe " HOLA " varias veces
(setq CONTA (1+ CONTA)) ; Incrementamos el contador.
)
(princ)
)
(defun DOS (CADENA / CONTA)
(setq CONTA 100) ; Inicializamos otra vez el contador. Aqui no afecta a la
variable definida en uno
(while (< CONTA 103)
(princ CADENA) ; Escribimos " HOLA "
(setq CONTA (1+ CONTA))
)
)
... y creo que funciona (no lo he probado, pero se supone).
Es mas, al terminar la función uno, la variable CONTA se queda con el valor nil
(si no estaba definida anteriormente).
El único cuidado que hay que tener es que las variables definidas como locales en
una función, se comportan como globales en todas las funciones llamadas desde esa
función. Esto es, si en la función dos no hubiesemos declarado la variable CONTA
como local, la cosa funcionaría igual de mal.
Por eso he recomendado antes: definirte TODAS las variables que utilices en tus
funciones como locales.
Eso puede ser un coniazo, pero yo utilizo una herramienta maravillosa para ello:
el programa ALLY.
Entre muchas utilidades, te saca un listado con las variables utilizadas por cada
función.
Con un poco de paciencia, las seleccionas, les pones la barrita delante y las
pegas en su sitio. De esta manera dejas tus funciones bien "depuraditas".
El problema del ALLY es que es un programa un tanto viejo que funciona en MS-DOS
y es un poco dificil de configurar. Pero merece la pena.
En cuanto a lo que decía NoName:
> Creo que estás refiriendo al tipo de memoria nodal,es un tipo de memoria
> asignada por Autocad para el almacenamiento de variables. Existen dos formas
> de recuperar la memoria, o lo que es lo mismo, recuperar variables usadas.
> Existe un comando que fuerza a la recuperación de memoria inutilizada: (gc).
No esto muy seguro, pero creo que lo de la memoria modal y lo de la función (gc)
se utilizaba en versiones anteriores a la versión 12 de AutoCAD, cuando solo
disponías de 64kB para memoria y pila y tenías que jugar con el LISPSTACK y el
LISPHEAP desde DOS.
Si mal no leí hace ya un tiempo, la función (gc) ha dejado de ser necesaria,
aunque se mantiene por compatibilidad. AutoCAD se encarga de ir optimizando la
memoria de forma automática. El problema es que los que hacen los manuales de
autoLISP se han olvidado de borrarla ;)
En todo caso, la memoria se optimiza solo cuando las variables son nil. Si tiene
algún valor distinto al nil se mantienen mientras tengas abierto el dibujo n el
que las has definido.
Perdonad si me he extendido demasiado y si me he ido de la olla. Os puedo
asegurar que la extensión del mensaje es directamente proporcional a las noches
de insomnio provocadas por problemas con variables locales y globales.
Un saludo a todos
Pedro Ubieto.