It’s very do-able. In fact, each block instance of a given block definition can sport different attributes - as a block instance (with attribs) is akin to a linked list. I wrote about this many many years ago. I’ll post the link and / or code later (currently in transit, posting from my phone).
(defun _genericize-dxf-data ( dxf-data )
(vl-remove-if
(function
(lambda (p)
(or
(minusp (car p))
(member (car p) '(0 330 360 5 100 66))
)
)
)
dxf-data
)
)
(defun _entmake-from-entity-and-map ( entity map )
( (lambda ( entity-data )
(entmake
(mapcar
(function
(lambda ( p / p! )
(if (setq p! (assoc (car p) entity-data))
p!
p
)
)
)
map
)
)
)
(_genericize-dxf-data (entget entity))
)
)
(defun _entmake-insert-from-insert ( insert )
(_entmake-from-entity-and-map
insert
'(
(0 . "INSERT")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbBlockReference")
(66 . 1)
(2 . "UNNAMED")
(10 -12.611 33.6579 0.0)
(41 . 1.0)
(42 . 1.0)
(43 . 1.0)
(50 . 0.0)
(70 . 0)
(71 . 0)
(44 . 0.0)
(45 . 0.0)
(210 0.0 0.0 1.0)
)
)
)
(defun _entmake-attrib-from-attdef ( attdef )
(_entmake-from-entity-and-map
attdef
'( (0 . "ATTRIB")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbText")
(10 -12.0677 32.7299 0.0)
(40 . 0.381851)
(1 . "VAL-1")
(50 . 0.0)
(41 . 1.0)
(51 . 0.0)
(7 . "Standard")
(71 . 0)
(72 . 0)
(11 0.0 0.0 0.0)
(210 0.0 0.0 1.0)
(100 . "AcDbAttribute")
(280 . 0)
(2 . "ATT-1")
(70 . 0)
(73 . 0)
(74 . 0)
(280 . 0)
)
)
)
(defun _entmake-seqend-from-insert ( insert )
(_entmake-from-entity-and-map
insert
'( (0 . "SEQEND")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
)
)
)
(defun _add-attribs-to-insert ( insert ss-attdefs / i e lst object attribs )
(and
(progn (vl-load-com) t)
(eq 'pickset (type ss-attdefs))
(< 0 (setq i (sslength ss-attdefs)))
(setq object (vlax-ename->vla-object insert))
(_entmake-insert-from-insert insert)
(cond
((eq :vlax-false (vla-get-hasattributes object)))
((vl-every
(function (lambda (a) (_entmake-attrib-from-attdef a)))
(mapcar 'vlax-vla-object->ename (vlax-invoke object 'getattributes))
))
)
(progn
(repeat i (setq lst (cons (ssname ss-attdefs (setq i (1- i))) lst)))
(vl-every '_entmake-attrib-from-attdef lst)
)
(_entmake-seqend-from-insert insert)
(progn
(vla-put-lock
(vla-item
(vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
(cdr (assoc 8 (entget insert)))
)
:vlax-false
)
(entdel insert)
(repeat (setq i (sslength ss-attdefs))
(vl-catch-all-apply 'entdel (list (ssname ss-attdefs (setq i (1- i)))))
)
T
)
)
)
(defun c:add-attribs-to-insert ( / insert ss ss-attdefs )
(princ
(if
(and
(setq insert (car (entsel "\nSelect existing insert: ")))
(eq "INSERT" (cdr (assoc 0 (entget insert))))
(setq ss-attdefs (ssget '((0 . "attdef"))))
(_add-attribs-to-insert insert ss-attdefs)
)
"\nDone."
"\nFailed."
)
)
(princ)
)
I've changed my codes a little...
Thanks for input MP...
Regards, M.R.
I've changed my codes a little...
Thanks for input MP...
Regards, M.R.
It's preferable not to change the posted code associated with a question after the question is resolved.
The changes make it virtually impossible for someone following later to understand the issues.
Regards,
Command: (vlax-ldata-put (vlax-ename->vla-object (car (entsel))) "key" (list 1 2 3))
Select object: (1 2 3)
Command: (vlax-ldata-get (vlax-ename->vla-object (car (entsel))) "key")
Select object: (1 2 3)
Command: (vlax-ldata-put (vlax-ename->vla-object (car (entsel))) "key1" "bla1")
Select object: "bla1"
Command: (vlax-ldata-put (car (entsel)) "key2" "bla2")
Select object: "bla2"
Command: (vlax-ldata-list (car (entsel)))
Select object: (("key2" . "bla2") ("key1" . "bla1"))
Apart from Ldata there can be other data stored in the extension dictionary.
But what you are trying to do, replacing the inserts without breaking anything, is quite difficult. Applications may have stored references to the inserts in data connected to other entities or in the main dictionary.
Command: (setq h (cdr (assoc 5 (entget (car (entsel))))))
Select object: "20D"
Command: ATT
ATTDEF
Specify start point:
Command: ADDATT-STATBLK
Pick attribute definition on unlocked layer...
Pick static block reference on unlocked layer you want to add attribute that was previously picked...Deleting block "x".
1 block deleted.
Command: (setq enx (entget (car (entsel))))
Select object: ((-1 . <Entity name: 1a6208675d0>) (0 . "INSERT") (330 . <Entity name: 1a62085d1f0>) (5 . "215") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "x") (10 23.55 15.8904 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Command: (setq enx (vl-remove-if '(lambda ( x ) (vl-position (car x) '(-1 330))) enx))
((0 . "INSERT") (5 . "215") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "x") (10 23.55 15.8904 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Command: (setq enx (subst (cons 5 h) (assoc 5 enx) enx))
((0 . "INSERT") (5 . "20D") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "x") (10 23.55 15.8904 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Command: (entmod enx)
nil
Command: (entget (car (entsel)))
Select object: ((-1 . <Entity name: 1a6208675d0>) (0 . "INSERT") (330 . <Entity name: 1a62085d1f0>) (5 . "215") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "x") (10 23.55 15.8904 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
So my question : how can I get "key" string if there is LDATA attached... I guess I destroyed handles, so I want to put back as much as possible to newly created blocks... Any help, MP, Lee, CAB, ROY, RON or anyone (I surely missed someone)???