I think this is something that Civil3D covers - BigAl knows these things better than me though.
This is a very quick and dirty LISP:
Noting that your lines are 1000x longer than the reference texts, I have a multiplier (hit enter to just accept the 1000, you can change the code to suit)
Select the reference polyline - I am assuming always a horizontal reference line as your example
Select the point that the height texts refer to (is it the centre of the '+', in the drawing there is a point drawn at the correct height next to each text) and then the associated text.
Repeat along the points
Exit badly with the escape key. I am going to get abuse for cutting corners there...
Slight difference to your example that my lines are drawn from the closest point on the polyline that you selected
(defun c:test ( / Multiplier ReferencePoly ReferenceY EndLoop MyPoint MyHeight MyHt ClosestPoint)
(defun MkLn ( pt1 pt2 Layer / Ln ) ;; Add in layer etc details
(setq Ln (entmakex (list
'(0 . "LINE") '(100 . "AcDbEntity") '(410 . "Model") '(62 . 0) '(100 . "AcDbLine")
(cons 8 Layer)
(cons 6 "CONTINUOUS")
(cons 62 256)
(cons 10 pt1)
(cons 11 pt2)
'(210 0.0 0.0 1.0)
))) ; end list, entmakex, setq
)
(setq Multiplier (getreal "Enter Height Multiplier (1000)"))
(if (or (= Multiplier nil)(= Multiplier "")(= Multiplier 0))
(setq Multiplier 1000)
)
(setq ReferencePoly (car (entsel "Select Reference Polyline")))
(setq ReferenceY (cdr (assoc 10 (entget ReferencePoly))))
(setq EndLoop "No")
(while (= EndLoop "No")
(setq MyPoint (getpoint "Select Point"))
(setq MyHeight (car (entsel "Select Height text")))
(setq MyHt (cdr (assoc 1 (entget MyHeight))))
(setq ClosestPoint (vlax-curve-getclosestpointto ReferencePoly MyPoint))
(MkLn ClosestPoint (mapcar '* '(1 1 0) (mapcar '+ (list 0 (* Multiplier (atof MyHt)) 0) ClosestPoint)) "0")
)
)