CADXChange

Alle LISP-Befehle

CXBLKRENBlöcke und AttributeVersion 1.0.0In AutoCAD getestet

Blöcke gesammelt umbenennen

Benennt viele Blockdefinitionen auf einmal um: Suchen und Ersetzen im Namen, Präfix oder Suffix hinzufügen, eingegrenzt durch einen Platzhalter.

So verwenden Sie ihn

  1. CXBLKREN eingeben. Die Blocknamen der Zeichnung werden aufgelistet.
  2. Einen Platzhalter für die umzubenennenden Blöcke eingeben, etwa OLD_*.
  3. Suchtext, Ersatztext sowie Präfix und Suffix eingeben.

Gut zu wissen

  • Bereits vergebene oder unzulässige Namen werden übersprungen und im Bericht gezählt.

In AutoCAD laden

  1. Speichern Sie die Datei an einem beliebigen Ort.
  2. Geben Sie APPLOAD ein, wählen Sie die Datei und klicken Sie auf Laden.
  3. Geben Sie den Befehl ein: CXBLKREN.

Damit er bei jedem Start bereitsteht, fügen Sie ihn im selben Dialog zum Startup-Set hinzu, oder laden Sie mit dem optionalen Loader einen ganzen Ordner auf einmal. Der optionale Loader

In AutoCAD (Vollversion) getestet. Andere Programme, die AutoLISP ausführen, funktionieren vielleicht, wurden aber nicht getestet.

Der Code

Reiner Text, nichts ist versteckt. Kopieren Sie ihn in eine Datei namens cxblkren.lsp oder laden Sie ihn herunter.

;;; ============================================================================
;;; 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)

Versionsverlauf

Version 1.0.0 · 27. Oktober 2026

Erste Veröffentlichung.

Für viele Zeichnungen auf einmal?

BlockCopy erledigt diese Art von Aufgabe für einen ganzen Ordner voller Zeichnungen in einem Durchlauf.

BlockCopy

Weitere Befehle: Blöcke und Attribute