Er zijn verschillende manieren die ik gebruik afhankelijk van welke soort block ik wens up te daten,
Zowiezo beheer ik al mijn blocks in een aparte folder telkens als dwg op zich. (dit ter info)
1e - als het een 'simpele' block is (enkel getekende elementen en attributes) dan volstaat een redefine, dit kan via een lispje waar je een lusje schrijft rond onderstaande code om alle blocks die je wilt laten aanpassen te behandelen
(command "-INSERT" (strcat bloknaam "=" fullfile) nil)
(command-s "ATTSYNC" "N" bloknaam)
LET OP: als je attributen wijzigt of toevoegt dan zal dit ongewenste resultaten leveren en kan deze manier niet meer voldoende zijn.
2e - als het een 'complexere' block is (met dynamic en attrib en wat nog niet allemaal

) dan maak ik daar een
een ander soort lispje rond waarin ik alle parameters van de block uit de dwg haal :
* alle attrib's,
* alle dynamic properties
* alle block properties (positie,hoek, ...)
deze oude block verwijderen en een nieuwe block vanuit de lisp laten intekenen waarbij ik dan alle bijgehouden variabelen gebruik om deze geupdate block exact terug te plaatsen.
Hier heb je alle vrijheid om binnen het ontwerp van je block echt alles te veranderen. als je bvb een extra attribute toegevoegd hebt kan je bij het vervangen in je lisp de 'te verwijderen block' tonen aan de gebruiker en daar de vraag stellen wat de nieuwe attribute moet zijn.
Je moet hierbij wel code maken voor elke block specifiek.
Een extra optie is om de oude block te moven naar ergens ver weg, en eventueel te veranderen van laag, dan ben je deze niet onmiddellijk kwijt voor als het toch fout loopt.
Ook plaats ik de nieuwe blocks meestal in een layer nieuw met een opvallend kleurtje, zodat je makkelijk kan zien wat er overal vervangen is geweest.
Eens alles klaar kan je dit dan aanpassen naar de juiste layer en de gemovede blocks in een actie verwijderen.
Deze manier werkt goed, maar is natuurlijk een beetje codeerwerk, en je moet dus zelf uitmaken of het rendabel genoeg (hoeveel keer heb je dit nodig en voor hoeveel blocks) is om daar je tijd in te steken of niet.
3e - Een andere mogelijkheid is dat je
* uw slechte blocks verplaatst naar een lege locatie,
* daar met een vaste offset uw nieuwe blocks naast plaatst,
* via een copypastecopypaste lispje de attrib value's overbrengt
* deze nieuwe blocks terugplaatst
deze manier vereist geen codeerwerk en levert je vlugger resultaat, maar duurt langer bij grotere aantallen
Hier het copy - paste - cpoy - paste stukje code (een van mijn meest gebruikte stukjes code)
; this program let's u copy txt sequentially
; read txt write txt read write, read write....
;
(defun c:xFT (/ cntr ent atortxt modtxt txtormtxt dimortxt seldimt strdimedit el mt selatt )
(setvar "cmdecho" 0)
(setq cntr 0)
(while (< cntr 10)
(setq ent (nentselp "Select source Text: " ))
(if ent
(progn ;1
(setq atortxt (cdr(assoc 1 (entget (car ent )))))
(setq modtxt (nentselp "\n Select Text to modify: "))
(if modtxt
(progn ;2
(setq txtormtxt (cdr(assoc 0 (entget (car modtxt )))))
(cond
((or (= txtormtxt "TEXT")(= txtormtxt "MTEXT"))
(progn ;3
(setq dimormtxt (cdr(assoc 42 (entget (car modtxt )))))
(if (/= dimormtxt nil)
(progn ;4
(setq seldimt (cdr (assoc -1 (entget (car modtxt )))))
(setq strdimedit (substr atortxt 5 (strlen atortxt)))
(command "dimedit" "n" strdimedit seldimt "")
) ;progn4
(progn ;5
(setq el (entget (car modtxt )))
(setq mt (subst (cons 1 atortxt) (assoc 1 EL) EL))
(entmod mt)
) ;progn5
) ;if
) ;progn3
) ;cond or
((= txtormtxt "ATTRIB")
(progn ;6
(setq selatt (cdr (assoc -1 (entget (car modtxt )))))
(command "-attedit" "" "" "" "" selatt "v" "r" atortxt "")
) ;progn6
) ;cond or
(T (princ "\n Invalid Selection... "))
) ;cond
) ;progn2
) ;if
) ;progn1
) ;if
);while
(princ)
) ;defun