Maybe this can help you, it only works for lines and plines
(vl-load-com)
;;; Move objects to elevation (Z coordinate) defined by a point
;;; The objects can be LINE,LWPOLYLINE,MTEXT,TEXT,CIRCLE,ARC
;;; By Isaac A. Feb 2021
(defun c:ptelev (/ chm l list1 list2 n newele oldele p pt11 *osnap x x1 y y1)
(setvar "cmdecho" 0)
(vl-cmdf "_.undo" "_begin")
(setq *osnap (getvar "osmode"))
(setvar "osmode" 8)
(setq pt11 (getpoint "\nSelect the reference point: ")
newele (caddr pt11)
newele (cons 38 newele)
)
(princ "\nSelect the elements to change elevation")
(setq p (ssget (list (cons 0 "LINE,LWPOLYLINE,MTEXT,TEXT,CIRCLE,ARC"))))
(setq chm 0
l 0
n (sslength p))
(while (< l n)
(if (= "LWPOLYLINE" (cdr (assoc 0 (setq e (entget (ssname p l))))))
(progn
(setq oldele (assoc 38 e)
)
(entmod (subst newele oldele e))
(setq chm (1+ chm))
)
)
(if (or (= "LINE" (cdr (assoc 0 (setq e (entget (ssname p l)))))) (= "TEXT" (cdr (assoc 0 (setq e (entget (ssname p l))))))
(= "CIRCLE" (cdr (assoc 0 (setq e (entget (ssname p l)))))) (= "ARC" (cdr (assoc 0 (setq e (entget (ssname p l))))))
(= "MTEXT" (cdr (assoc 0 (setq e (entget (ssname p l))))))
)
(progn
(setq list1 (assoc 10 e)
x (cadr list1)
y (caddr list1)
list2 (list x y (caddr pt11))
list2 (cons 10 list2)
)
(entmod (subst list2 list1 e))
(setq chm (1+ chm))
)
)
(if (= "LINE" (cdr (assoc 0 (setq e (entget (ssname p l))))))
(progn
(setq list3 (assoc 11 e)
x1 (cadr list3)
y1 (caddr list3)
list4 (list x1 y1 (caddr pt11))
list4 (cons 11 list4)
)
(entmod (subst list4 list3 e))
)
)
(setq l (1+ l))
)
(princ (strcat (rtos chm 2 0) " Objects modified."))
(setvar "osmode" *osnap)
(vl-cmdf "_.undo" "_end")
(princ)
)