(defun c:addtags (/ _gettags TAGSCL TAGHGT DATATAGS adoc blocks ss ename AcDbBlkRef bname AcDbBlkTblRec hgt ypos tag AcDbAttdef ctr0 ctr1)
(setq _gettags (lambda () (mapcar (function (lambda (AcDbAttrib) (strcase (vla-get-tagString AcDbAttrib)))) (vlax-invoke AcDbBlkRef 'getAttributes))))
; here start c:addtags
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark adoc)
(setvar "cmdecho" 0)
(setq blocks (vla-get-blocks adoc))
(setq TAGSCL 1)
(setq TAGHGT 0.25)
(setq DATATAGS '("" "" "" "" "" "" "" "" ""))
(setq ctr0 0)
(if (setq ss (ssget '((0 . "insert"))))
(foreach ename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(setq AcDbBlkRef (vlax-ename->vla-object ename))
(setq bname (vla-get-effectivename AcDbBlkRef))
(setq taglst (_gettags))
(if (tblsearch "block" bname)
(progn
(setq AcDbBlkTblRec (vla-item blocks bname))
(setq hgt (* TAGHGT TAGSCL))
(setq ypos (- (* hgt (length DATATAGS)) hgt))
(setq ctr1 0)
(foreach tag (reverse DATATAGS)
(if (null (member (strcat tag) taglst))
(progn
(setq ypos (+ ypos hgt))
(setq AcDbAttdef (vla-addAttribute AcDbBlkTblRec hgt acAttributeModeLockPosition+acAttributeModeInvisible (strcase tag t)
(vlax-3d-point (list 0.0 ypos 0.0)) tag (strcase tag t)))
(vla-put-layer AcDbAttdef "0")
(vlax-release-object AcDbAttdef)
(setq ctr1 (1+ ctr1))
); progn
); if
); foreach
(vlax-release-object AcDbBlkTblRec)
(if (> ctr1 0)
(command "._attsync" "_name" bname)
)
); progn
); if
(vlax-release-object AcDbBlkRef)
(setq ctr0 (+ ctr0 ctr1))
); foreach
); if
(vlax-release-object blocks)
(prompt (strcat "\n" (itoa ctr0) " attribute(s) added."))
(setvar "cmdecho" 1)
(vla-endundomark adoc)
(vlax-release-object adoc)
(princ)
); c:addtags
Here is attached the code adapted to the length of the list.
A big thanks to Moshe-A !