I built this little test to check to see if your concept works. It did.
Yes it is possible to change xdata inside the beginsave event.
I really wish the indenting in the forums could be fixed!
Peter Jamtgaard
Code:
(defun evtBeginSaveXdata (CALL CALLBACK / strLogin)
(setq strLogin (variant-value
(vla-getvariable
(vla-get-activedocument
(vlax-get-acad-object)) "loginname")))
(setxdata (vla-item
(vla-get-layouts
(vla-get-activedocument
(vlax-get-acad-object)
)
)
"Model"
)
(list (list "LOGIN" strLogin))
)
)
; The setxadatalist function will add a list of sublists to an object as xdata.
; The first item in each sublist is a unique string application name
; Syntax (setxdata vla-object (list (list "test" 1 2 "a" )(list "app2" "hello" "world")))
(defun SetXData (objSelection lstOfSubLists / DataItem lstData
intDataType lstOfSublistsDXFCodes lstOfSublistsValues
safDXFCodes safDataValues)
(if debug (princ "\nSetXdata: "))
(foreach lstData lstOfSublists
(setq lstOfSublistsDXFCodes (cons 1001 lstOfSublistsDXFCodes)
lstOfSublistsValues (cons (car lstData) lstOfSublistsValues))
(RegApp (car lstData))
(foreach DataItem (cdr lstData)
(cond ; Determine the data type and corrusponding DXF Code
((= (type DataItem) 'INT) (setq intDataType 1070)) ; Integer Data Type
((= (type DataItem) 'REAL)(setq intDataType 1040)) ; Real Data Type
((= (type DataItem) 'STR)
(if (or (= DataItem "{")(= DataItem "}")) ; String Data Type
(setq intDataType 1002)
(setq intDataType 1000)
)
)
)
(setq lstOfSublistsDXFCodes (cons intDataType lstOfSublistsDXFCodes)
lstOfSublistsValues (cons DataItem lstOfSublistsValues))))
(setq safDXFCodes (listToSafearray vlax-vbinteger
(reverse lstOfSublistsDXFCodes))
safDataValues (listToSafeArray vlax-vbvariant
(reverse lstOfSublistsValues)))
(vla-setXData objSelection safDXFCodes safDataValues))
(setq rxnBeginSaveXdata (vlr-editor-reactor nil '((:vlr-beginsave . evtBeginSaveXdata))))
m