You could say pick a block a dcl will pop up with current attribute values change then pick other block it will populate based on those values. The idea behind my Multi getvals.lsp is exactly that pass a list of values in this case attributes and populate a dcl. There are a couple of rules like if block1 has a different number of attributes compared block 2 may not work unless coded to do so. For ease of coding attributes would be retrieved in attribute order not by how they look in dwg. Tested on block with 20 attributes.
Try this pick a block attributes should display, it is set to 20 characters if more in your attributes change the 20 & 19 to bigger numbers.
I have not done more other than to show how it could be done, need some of your blocks to test properly if you want to go down this path.
You will need to save Multi getvals.lsp into a support path location its a library routine can be used in any code examples are in code. Else paste at start of code below.
Code:
; Multi getvals Library routine for multiple value dcl
; By alanH
(if (not AH:getvalsm)(load "Multi Getvals.lsp"))
(vl-load-com)
(defun c:2atts ( / x y obj att attlst lst)
(setq obj (vlax-ename->vla-object (car (entsel "Pick obj"))))
(if (= :vlax-true (vlax-get-property obj 'HasAttributes))
(foreach att (vlax-invoke obj 'getattributes)
(setq attlst (cons (vla-get-textstring att) attlst))
)
(alert "block has no attributes nothing will happen")
)
(if (/= attlst nil)
(progn
(setq lst (list "Enter Values") y 0)
(repeat (setq x (length attlst))
(setq lst (cons (strcat "Attrib" (rtos (setq y (+ y 1)) 2 0)) lst))
(setq lst (cons 20 lst))
(setq lst (cons 19 lst))
(setq lst (cons (nth (setq x (- x 1)) attlst) lst))
)
(setq lst (reverse lst))
(setq ans (AH:getvalsm lst))
)
)
(princ)
)