22 mar. 2008

Cambiar un determinado tipo de bloque por otro dando los nombres:


;| Hacer un comando para cambiar un tipo de bloque
por otro........
------------------------------------------------------|;
(defun c:cambia_bloq ( /
cmdant
osmant
nombre_ant
sel
cont
nombre_post
bloque
data
)
;| Guardo valores de variables
y las establezco en 0: |;
(setq cmdant (getvar 'cmdecho))
(setvar "cmdecho" 0)
(setq osmant (getvar 'osmode))
(setvar "osmode" 0)
;| Pide el nombre del bloque a
cambiar, es el nombre asignado por el usuario,
luego hace una seleccion por nombre,
de todos los bloques
en todas las capas ....
Y pide el nombre del nuevo bloque: |;
(setq nombre_ant (getstring "\nDar nombre de bloque a cambiar: ")
sel (ssget "_X" (list (cons 0 "INSERT")(cons 2 nombre_ant)))
cont 0
nombre_post (getstring "\nDar nombre de bloque nuevo: ")
)
;| En un buclé "repeat" que se repite tantas
veces como bloques hayamos seleccionado,
extrae nombre de entidad-autocad de cada uno,
con ello extrae la lista-data de cada bloque,
modifica el nombre en esa lista-data,
con la nueva lista-data modifica el objeto con "entmod"
y luego recrea la imagen del bloque con "entupd": |;
(repeat
(sslength sel)
(setq bloque (ssname sel cont))
(setq data (entget bloque))
(setq data (subst (cons 2 nombre_post) (assoc 2 data) data))
(entmod data)
(entupd bloque)
(setq cont (+ cont 1))
);repeat
;| Vuelve atrás valores de variables: |;
(setvar "cmdecho" cmdant)
(setvar "osmode" osmant)
(princ)
)
;fin defun

2 comentarios:

El AnArQuI dijo...

eres grande

Jairo Adolfo dijo...

Tus rutinas son excelentes, te felicito. Yo manejo un blog sobre autocad y no tengo nada de información sobre lisp, cuando la incluya te tomaré en cuenta como recomendado.