See if you can understand the logic behind this modified version of the FLAT.lsp routine and apply it in your code.
Basically the idea is that an object like LINE or 3dPOLY with different elevation points can be flattened to 0 by first moving to z of 1e99 and then back down again to -1e99. Finally I just added an option to then move the flattened object now to a desired elevation:
; Flat command is an alternative to Express Tools Flatten
; modified from:
; https://www.cadtutor.net/forum/topic/2007-flatten-alternatives/
; Lisp to flatten All to 0:
; (command"_.move""_all""""0,0,0""0,0,1e99""_.move""_p""""0,0,0""0,0,-1e99")
; Menu Macro to flatten All to 0:
; C^C_move;_all;;0,0,0;0,0,1e99;_move;_p;;0,0,0;0,0,-1e99;
; Flat offers option to enter elevation value to flatten selected objects
(defun c:flat (/ cmdecho elev menuecho selected total-nabor)
(if(not(car (atoms-family 1 '("vl-load-com"))))(vl-load-com))
; setup environment
(setq cmdecho (getvar"cmdecho"))
(setq menuecho (getvar"menuecho"))
(setvar"menuecho"0)
(setvar"cmdecho"0)
(if(not *elev*)(setq *elev* 0.0)) ; set default global elevation to 0
(setq elev (getreal(strcat"\nEnter Elevation To Flatten Objects To: <" (rtos *elev* 2 (getvar"luprec"))">: ")))
(if(not elev)(setq elev *elev*)(setq *elev* elev))
(princ(strcat"\nSelect Objects To Move To Elevation [" (rtos *elev* 2 (getvar"luprec")) "]:"))(princ)
(if
; (setq total-nabor (ssget "x" '((410 . "model"))))
(setq total-nabor (ssget"_:L")) ; only select objects on unlocked layers
(progn
(setq selected (sslength total-nabor)) ; get total number of selected objects
(setq total-nabor (mapcar 'vlax-ename->vla-object (mapcar 'cadr (ssnamex total-nabor))))
; first flatten selected objects to 1e99 -1e99 which = 0 elevation and then to given elev
(foreach i (list 1e99 -1e99 *elev*) ;
(mapcar(function(lambda (x) (vla-move x (vlax-3d-point (list 0 0 0)) (vlax-3d-point (list 0 0 i))))) total-nabor)
) ; foreach
(princ(strcat"\nSuccessfully Flattened [" (itoa selected) "] Selected Objects to Elevation: [" (rtos *elev* 2 (getvar"luprec")) "]."))
) ; progn
(princ"\nNo Objects Selected.")
) ; if objects selected
; return environment
(setvar"menuecho"menuecho)
(setvar"cmdecho"cmdecho)
(princ)
) ; defun