;Create 3D points from elevation label texts
;(C)2026, V.Michl, www.cadforum.cz - cads.cz
;
(vl-load-com)

(defun C:TXT2ZC ( / ss ln i EG Z s1 pt pt1 off1 off2 off3 vec1)
(prompt "\nSelect texts describing point elevations <by layer>: ")
(setq ss (ssget '((-4 . "<OR")(0 . "TEXT")(0 . "MTEXT")(0 . "ATTDEF")(-4 . "OR>"))))
(if (not ss)(progn
 (setq ln (getstring T "\nText layer name: "))
 (setq ss (ssget "_X" (list (cons 8 ln)(cons -4  "<OR")(cons 0 "TEXT")(cons 0 "MTEXT")(cons 0 "ATTDEF")(cons -4 "OR>"))))
))
(if ss
 (progn
   (setvar "OSMODE" (boole 7 (getvar "OSMODE") 16384))
   (setvar "CMDECHO" 0)
   (prompt "\nCreating layer 'ElevatedPoints'...")
   (command "_-LAYER" "_Make" "ElevatedPoints" "")
   (setq off1 (getpoint "\nCorrection offset vector X,Y - from point <none>: "))
   (if off1 (setq off2 (getpoint off1 " to point: ")))
   (setq off3 (getdist "\nCorrection Z-offset (add to elevations) <0>: "))
   (if (not off3) (setq off3 0))
   (if (and off1 off2)  (setq vec1 (list (- (car off2)(car off1)) (- (cadr off2)(cadr off1)) off3))
						(setq vec1 (list 0 0 off3))
   )
   (print vec1)
   (setq i 0)
   (repeat (sslength ss)
     (setq EG (entget (ssname ss i)))
     (setq pt1 (cdr (assoc 10 EG)))
     (setq pt (assoc 11 EG))
     (if pt (setq pt (cdr pt)))
     (if (and (eq (car pt) 0.0)(eq (cadr pt) 0.0)) (setq pt nil)) ; added 10/11
     (setq Z (cdr (assoc 1 EG)))
	(setq Z (vl-string-trim " ()" Z)) ; ..ailing spaces
	(while (wcmatch Z "*  *"); still more than one space together anywhere?
      (setq Z (vl-string-subst " " "  " Z))
	)
	(setq Z (vl-string-subst "." " " Z)) ; last space -> "."
	(setq Z (vl-string-subst "." "," Z)) ; new old where, added 5/14
;(PRINT Z)
     (setq EG (subst (cons 10 (list (car pt1)(cadr pt1) (atof Z))) (assoc 10 EG) EG))
     (if pt (setq EG (subst (cons 11 (list (car pt)(cadr pt) (atof Z))) (assoc 11 EG) EG))
	        (setq pt pt1); else
	)
     (entmod EG)
;    (entupd EG)
     (setq pt (list (+ (car pt)(car vec1)) (+ (cadr pt)(cadr vec1)) (+ (atof Z)(caddr vec1)))); correction
     (command "._POINT" (trans pt 0 1))
     (setq i (1+ i))
   );repeat
   (if (zerop (getvar "PDMODE")) (setvar "PDMODE" 3))
   (command "_REGENALL")
   (setvar "CMDECHO" 1)
   (setvar "OSMODE" (boole 2 (getvar "OSMODE") 16384))
   (princ (strcat "\nCreated " (itoa i) " new 3D points from the specified texts on layer 'ElevatedPoints'"))
 ));progn if
(princ)
)

(princ "\nTxt2ZC - convert elevation labels to 3D points. (C)2026, V. Michl")
(prin1)
