Discussion:
[Lisp] Cambiar una trozo de cadena string... Ahora creo que se lee mejor...
(demasiado antiguo para responder)
3rayas
2004-01-04 00:30:08 UTC
Permalink
Hola amigos, Feliz año a todos. ;)

Estoy intentando hacer una cosita que creo que puede ser fácil, pero
no doy con ello.

Tengo varios textos de esta forma 2Ø8, 4Ø25, 1Ø16, etc, como veis son
despieces de armaduras de vigas sobre todo.

El caso es que quiero que en un botón que se llame [Ø10] al
seleccionar todos los textos anteriores ( o los que se necesiten)
todos ellos pasen a ser loqueseaØ10. Estoy intentándolo de esta forma:

(vl-string-subst "Ø10" "Ø*" (ssget))

pero claro, no va, me da un error:
error: tipo de argumento erróneo: (or stringp symbolp): <Selection
set: f2>

Y creo que debe de ser por culpa del "Ø*". ¿que os parece"



--------------------------------
Hemorragias de saludos y abrazos
;-)

¡Crucifixión YA!!!!
SpeedCAD
2004-01-04 05:02:03 UTC
Permalink
Hola...

Hice una rutina para lo que necesitas:

(defun c:@10 (/ sel-textos n entidad
lst-txt texto txt-inicio txt-a-reemplazar
nuevo-txt txt-completo
)
(prompt "\nSeleccione textos:")
(setq sel-textos (ssget (list '(0 . "TEXT"))))
(if sel-textos
(progn
(setq n 0)
(repeat (sslength sel-textos)
(setq entidad (ssname sel-textos n))
(setq lst-txt (entget entidad))
(setq texto (cdr (assoc 1 lst-txt)))
;; Verifica si los textos seleccionados tienen el caracter @
(if (= (vl-string-search "@" texto) 1)
(progn
(setq txt-inicio
(substr texto
1
(vl-string-position (ascii "@") texto)
)
)
(setq txt-a-reemplazar
(substr texto
(+ (vl-string-position
(ascii "@")
texto
)
1
)
)
)
(setq nuevo-txt (vl-string-subst
"@10"
txt-a-reemplazar
txt-a-reemplazar
)
)
(setq txt-completo (strcat txt-inicio nuevo-txt))
(setq lst-txt (subst (cons 1 txt-completo)
(assoc 1 lst-txt)
lst-txt
)
)
(entmod lst-txt)
(entupd entidad)
) ;_progn
) ;_if
(setq n (1+ n))
) ;_repeat
) ;_progn
) ;_if
(prin1)
) ;_defun

La rutina se puede simplificar, pero deje la funciona vl-string-subst por
si en algun momento deseas modificar la rutina o hacer otra cosa en la que
te pueda servir, por ejemplo, la variable nuevo-txt la puedes omitir y
poner (setq txt-completo (strcat txt-inicio "@10")) ya que lo importante
es sacar el texto que viene antes del @, si este fuera el caso tambien no
tendria que estar la variable txt-a-remmplazar. Si quieres sacas esas
lineas en la rutina ;). Tambien puedes cambiar el nombre del comando :D.
Si deseas que esto funcione desde un icono, guarda la rutina dentro de las
carpetas de AutoCAD y en la macro del icono colocas, (load
"nombrerutina.lsp")(c:@10) y de esa forma cada vez que piches el icono se
cargará la rutina y el comando. Claro que lo mejor seria cargar la rutina
mediante (autoload "nombrerutina.lsp" '("comando")), pero para hacer esto
deberas editar el archivo acad2000doc.lsp y al final escribir:

(autoload "nombrerutina.lsp" '("@10")) y en la macro del icono solo poner
(c:@10).

Espero que te sirva...

Un saludo de SpeedCAD... :)
CHILE
FORO: http://www.hispacad.com/foro
Post by 3rayas
Hola amigos, Feliz año a todos. ;)
Estoy intentando hacer una cosita que creo que puede ser fácil, pero
no doy con ello.
Tengo varios textos de esta forma 2Ø8, 4Ø25, 1Ø16, etc, como veis son
despieces de armaduras de vigas sobre todo.
El caso es que quiero que en un botón que se llame [Ø10] al
seleccionar todos los textos anteriores ( o los que se necesiten)
(vl-string-subst "Ø10" "Ø*" (ssget))
error: tipo de argumento erróneo: (or stringp symbolp): <Selection
set: f2>
Y creo que debe de ser por culpa del "Ø*". ¿que os parece"
--------------------------------
Hemorragias de saludos y abrazos
;-)
¡Crucifixión YA!!!!
--------------------------------------------------

Mensaje enviado desde http://grupos.buscadoc.org

--------------------------------------------------
SpeedCAD
2004-01-04 05:13:33 UTC
Permalink
Hola...

Hay una correccion en la rutina que te deje anteriormente. En la linea
siguiente:

(if (= (vl-string-search "@" texto) 1), debes cambiarla por la siguiente:

(if (vl-string-search "@" texto), esto es lo correcto debido a que si el
resultado es distinto de nil se hará la secuencia, con lo anterior solo lo
hacia si el valor era 1. En este caso lo hace con el valor que sea o no
ser que sea nil.

Espero que no sea tarde la coreccion... :(

Te dejo la rutina de nuevo:

(defun c:@10 (/ sel-textos n entidad
lst-txt texto txt-inicio txt-a-reemplazar
nuevo-txt txt-completo
)
(prompt "\nSeleccione textos:")
(setq sel-textos (ssget (list '(0 . "TEXT"))))
(if sel-textos
(progn
(setq n 0)
(repeat (sslength sel-textos)
(setq entidad (ssname sel-textos n))
(setq lst-txt (entget entidad))
(setq texto (cdr (assoc 1 lst-txt)))
;; Verifica si los textos seleccionados tienen el caracter @
(if (vl-string-search "@" texto)
(progn
(setq txt-inicio
(substr texto
1
(vl-string-position (ascii "@") texto)
)
)
(setq txt-a-reemplazar
(substr texto
(+ (vl-string-position
(ascii "@")
texto
)
1
)
)
)
(setq nuevo-txt (vl-string-subst
"@10"
txt-a-reemplazar
txt-a-reemplazar
)
)
(setq txt-completo (strcat txt-inicio nuevo-txt))
(setq lst-txt (subst (cons 1 txt-completo)
(assoc 1 lst-txt)
lst-txt
)
)
(entmod lst-txt)
(entupd entidad)
) ;_progn
) ;_if
(setq n (1+ n))
) ;_repeat
) ;_progn
) ;_if
(prin1)
) ;_defun

Espero que te sirva...

Un saludo de SpeedCAD... :D
CHILE
http://www.hispacad.com/foro




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

Mensaje enviado desde http://grupos.buscadoc.org

--------------------------------------------------
SpeedCAD
2004-01-04 05:36:07 UTC
Permalink
Hola...

Simplifique la rutina, te dejo el codigo:

(defun c:@10 (/ sel-textos n entidad
lst-txt texto txt-inicio txt-a-reemplazar
nuevo-txt txt-completo
)
(prompt "\nSeleccione textos:")
(setq sel-textos (ssget (list '(0 . "MTEXT,TEXT"))))
(if sel-textos
(progn
(setq n 0)
(repeat (sslength sel-textos)
(setq entidad (vlax-ename->vla-object (ssname sel-textos n))
texto (vlax-get-property entidad "textstring"))
;; Verifica si los textos seleccionados tienen el caracter @
(if (vl-string-search "@" texto)
(progn
(setq txt-inicio
(substr texto
1
(vl-string-position (ascii "@") texto)
)
)
(setq txt-completo (strcat txt-inicio "@10"))
(vlax-put-property entidad "textstring" txt-completo)
) ;_progn
) ;_if
(setq n (1+ n))
) ;_repeat
) ;_progn
) ;_if
(prin1)
) ;_defun

Un saludo de SpeedCAD... :)
CHILE
Foro: http://www.hispacad.com/foro




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

Mensaje enviado desde http://grupos.buscadoc.org

--------------------------------------------------
3rayas
2004-01-04 14:26:14 UTC
Permalink
On Sun, 4 Jan 2004 06:36:07 +0100, ***@hotmail.com ( SpeedCAD )
wrote:

Bueno esto ya es una gozada (8-D''', muchisimas gracias en realidad lo
que quería era el "motor" o la idea para hacer esta rutina, y esto es
una pasada. Esto me lo guardo para estudiarlo detenidamente, ya que en
realidad lo que quiero es hacer unos botónes [Ø6] [Ø8] [Ø10]....[Ø25]
e incluso otros que sean [1Ø] [2Ø] [3Ø]...
Además tengo algunos objetos que no son Texto, que en realidad son
cotas alineadas de este estilo 2Ø16 (<>), con lo que extraer el texto
de la cota me llevará algún problemilla, pero todo se andará.

Muchisimas gracias y Feliz año nuevo y Veranito ;)
Post by SpeedCAD
Hola...
lst-txt texto txt-inicio txt-a-reemplazar
nuevo-txt txt-completo
)
(prompt "\nSeleccione textos:")
(setq sel-textos (ssget (list '(0 . "MTEXT,TEXT"))))
(if sel-textos
(progn
(setq n 0)
(repeat (sslength sel-textos)
(setq entidad (vlax-ename->vla-object (ssname sel-textos n))
texto (vlax-get-property entidad "textstring"))
(progn
(setq txt-inicio
(substr texto
1
)
)
(vlax-put-property entidad "textstring" txt-completo)
) ;_progn
) ;_if
(setq n (1+ n))
) ;_repeat
) ;_progn
) ;_if
(prin1)
) ;_defun
Un saludo de SpeedCAD... :)
CHILE
Foro: http://www.hispacad.com/foro
--------------------------------------------------
Mensaje enviado desde http://grupos.buscadoc.org
--------------------------------------------------
--------------------------------
Hemorragias de saludos y abrazos
;-)

¡Crucifixión YA!!!!
SpeedCAD
2004-01-04 15:20:27 UTC
Permalink
Hola...

Ok, pero si tienes algun problema con las cotas me avisas y te paso otro
ejemplo, aunque la forma de extraer el texto es la misma, solo haz pruebas
y estoy seguro que te resultará ;).

FELIZ AÑO NUEVO 2004 ;)

Un saludo de SpeedCAD... :)
CHILE
FORO: http://www.hispacad.com/foro




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

Mensaje enviado desde http://grupos.buscadoc.org

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

Loading...