CXBLKRENBloques y atributosVersión 1.0.0Probado en AutoCAD
Renombrar bloques en lote
Renombra muchas definiciones de bloque a la vez: buscar y reemplazar en el nombre, añadir prefijo o sufijo, limitado a los nombres que coincidan con un comodín.
Cómo se usa
- Escribe CXBLKREN. Se listan los nombres de bloques del dibujo.
- Introduce un comodín para los bloques a renombrar, por ejemplo OLD_*.
- Indica el texto a buscar y su reemplazo, y el prefijo o sufijo.
Conviene saber
- Los nombres ya ocupados o no permitidos se omiten y se cuentan en el informe.
Cargarlo en AutoCAD
- Guarda el archivo donde quieras.
- Escribe APPLOAD, elige el archivo y pulsa Cargar.
- Escribe el nombre del comando: CXBLKREN.
Para tenerlo en cada inicio, agrégalo al Contenido de inicio en el mismo cuadro de diálogo, o carga una carpeta entera de una vez con el cargador opcional. Sobre el cargador opcional
Probado en AutoCAD (versión completa). Otros programas que ejecutan AutoLISP pueden funcionar, pero no se han probado.
El código
Texto sin más, nada oculto. Cópialo en un archivo llamado cxblkren.lsp o descárgalo.
;;; ============================================================================
;;; CXBLKREN - Rename blocks in bulk
;;; Version 1.0.0
;;; CADXChange LISP tools - https://cadxchange.net/resources/lisp/cxblkren
;;; Tested in: AutoCAD (full version). Other programs that run AutoLISP may work but are not tested.
;;; Copyright (c) CADXChange. Free for personal and commercial use; do not resell or
;;; republish it as a collection. Terms: https://cadxchange.net/legal/lisp-terms
;;; ============================================================================
;; Rename block definitions whose name matches PATTERN (wildcards, any case). The new name is
;; PREFIX + the old name with FIND replaced by REPL (FIND "" changes nothing) + SUFFIX.
;; A name that already exists, or that holds a character a block name cannot have, is skipped.
;; Returns ((old . new) ...) for the renamed blocks and the number of skipped ones: (renamed skipped).
(defun cx:blkren-run (pattern find repl prefix suffix / done skipped new bad)
(setq skipped 0)
(foreach name (cx:block-names)
(if (wcmatch (strcase name) (strcase pattern))
(progn
(setq new (strcat prefix (if (/= find "") (cx:replace-ci name find repl) name) suffix)
bad nil)
(foreach ch '("<" ">" "/" "\\" "\"" ":" ";" "?" "*" "|" "," "=" "`")
(if (cx:find new ch 1) (setq bad T)))
(cond
((= new name) nil)
((or bad (= new "") (and (tblsearch "BLOCK" new) (/= (strcase new) (strcase name))))
(setq skipped (1+ skipped)))
(T
(command "_.-RENAME" "_Block" name new)
(setq done (cons (cons name new) done)))))))
(list (reverse done) skipped))
(defun c:CXBLKREN ( / *error* cx:sv pattern find repl prefix suffix r)
(setq *error* cx:err)
(princ (strcat "\nBlocks in this drawing: " (cx:join (cx:block-names) ", ")))
(setq pattern (cx:ask-str "Rename the blocks named (wildcards allowed)" "*")
find (cx:ask-str "Find in the name (- for nothing)" "")
repl (if (/= find "") (cx:ask-str "Replace with (- for nothing)" "") "")
prefix (cx:ask-str "Add in front (- for nothing)" "")
suffix (cx:ask-str "Add at the end (- for nothing)" ""))
(cx:start '(("CMDECHO" . 0)))
(setq r (cx:blkren-run pattern find repl prefix suffix))
(foreach p (car r) (princ (strcat "\n" (car p) " -> " (cdr p))))
(princ (strcat "\n" (itoa (length (car r))) " block(s) renamed"
(if (> (cadr r) 0) (strcat ", " (itoa (cadr r)) " skipped (name taken or not allowed)") "") "."))
(cx:end)
(princ))
;;; ---- Shared helpers (used by the command above; identical in every CADXChange tool) ----
;; 1-based position of SUB in STR at or after START, or nil.
(defun cx:find (str sub start / n i r)
(setq n (strlen sub) i start r nil)
(if (> n 0)
(while (and (not r) (<= i (1+ (- (strlen str) n))))
(if (= (substr str i n) sub) (setq r i))
(setq i (1+ i))))
r)
(defun cx:dxf (code ed)
(cdr (assoc code ed)))
;; The names of the block definitions that can be inserted (no anonymous or xref blocks).
(defun cx:block-names (/ r out)
(setq r (tblnext "BLOCK" T))
(while r
(if (and (/= (substr (cx:dxf 2 r) 1 1) "*") (not (cx:find (cx:dxf 2 r) "|" 1)))
(setq out (cons (cx:dxf 2 r) out)))
(setq r (tblnext "BLOCK")))
(reverse out))
;;; Helpers that draw small things: labels and markers. See helpers.lsp for the format.
;; Replace every OLD in STR by NEW, ignoring case.
(defun cx:replace-ci (str old new / n out pos up uo)
(setq n (strlen old) out "" pos 1 up (strcase str) uo (strcase old))
(if (= n 0)
str
(progn
(while (<= pos (1+ (- (strlen str) n)))
(if (= (substr up pos n) uo)
(setq out (strcat out new) pos (+ pos n))
(setq out (strcat out (substr str pos 1)) pos (1+ pos))))
(strcat out (substr str pos)))))
;; Close the undo step and put the system variables back.
(defun cx:end ()
(foreach v cx:sv (setvar (car v) (cdr v)))
(command "_.UNDO" "_End")
(setq cx:sv nil)
(princ))
;; Error handler: restores everything, stays quiet on Esc.
(defun cx:err (msg)
(if (> (getvar "CMDACTIVE") 0) (command))
(cx:end)
(if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")))
(princ (strcat "\nError: " msg)))
(princ))
(defun cx:join (lst delim / out)
(setq out "")
(foreach s lst
(setq out (if (= out "") s (strcat out delim s))))
(if lst out ""))
;; Ask for a string (spaces allowed) with a default; "-" means an empty string.
(defun cx:ask-str (msg def / v)
(setq v (getstring T (strcat "\n" msg " <" def ">: ")))
(cond ((= v "") def) ((= v "-") "") (T v)))
;; Save the system variables in VARS ((name . value) ...), set them, and open one undo step.
;; The caller declares cx:sv as a local so the saved values live exactly as long as the command.
(defun cx:start (vars)
(setq cx:sv (mapcar (function (lambda (v) (cons (car v) (getvar (car v))))) vars))
(command "_.UNDO" "_Begin")
(foreach v vars (setvar (car v) (cdr v)))
(princ))
(princ "\nCXBLKREN loaded. Type CXBLKREN to start.")
(princ)
Historial de versiones
Versión 1.0.0 · 27 de octubre de 2026
Primera versión.
¿Lo necesitas en muchos dibujos?
BlockCopy hace este tipo de trabajo con toda una carpeta de dibujos en una sola pasada.
BlockCopyMás comandos: Bloques y atributos
CXATTFILLRellenar un atributo en muchos bloquesCXATTNUMNumerar en secuencia un atributo de bloqueCXATTCOPYCopiar los valores de atributos de un bloque a otrosCXATTVISMostrar u ocultar los atributos de bloquesCXBLKCOUNTContar bloques por nombreCXBLKREPLReemplazar bloques por otro bloqueCXBLKXPDescomponer bloques conservando el texto de los atributosCXBLKSELSeleccionar bloques por nombre o por valor de atributoCXBLKATInsertar un bloque en muchos puntos a la vez