Here is the revised version , Command ExpCL
(defun make_blk_measure ( / )
;; Define a text style and block for measurement
(if (not (tblsearch "STYLE" "$BLK_MEAS"))
(entmake '((0 . "STYLE") (5 . "40") (100 . "AcDbSymbolTableRecord")
(100 . "AcDbTextStyleTableRecord") (2 . "$BLK_MEAS") (70 . 0)
(40 . 0.0) (41 . 1.0) (50 . 0.0) (71 . 0) (42 . 0.1) (3 . "ARIAL.TTF") (4 . ""))))
(if (not (tblsearch "BLOCK" "BLK_MEASURE_CURVE"))
(progn
(entmake '((0 . "BLOCK") (8 . "0") (2 . "BLK_MEASURE_CURVE") (70 . 2)
(4 . "") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (10 0.0 0.0 0.0)))
(entmake (append '((0 . "LINE") (100 . "AcDbEntity") (67 . 0) (410 . "Model")
(8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbLine"))
(list (list 10 0.0 (/ (- (getvar "TEXTSIZE")) 100.0) 0.0))
(list (list 11 0.0 (/ (getvar "TEXTSIZE") 100.0) 0.0))
'((210 0.0 0.0 1.0))))
(entmake '((0 . "ATTDEF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbText")
(10 0.05 0.1 0.0) (40 . 1.0) (1 . "0.0") (50 . 1.570796326794896)
(41 . 1.0) (51 . 0.0) (7 . "$BLK_MEAS") (71 . 0) (72 . 0)
(11 0.0 0.1 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition")
(3 . "measure") (2 . "VALUE_MEASURE") (70 . 0) (73 . 2) (74 . 2)))
(entmake '((0 . "ENDBLK") (8 . "0") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2))))))
(defun l-coor2l-pt (lst flag / )
(if lst
(cons (list (car lst) (cadr lst) (if flag
(+ (if (vlax-property-available-p ename 'Elevation)
(vlax-get ename 'Elevation)
0.0)
(caddr lst))
(if (vlax-property-available-p ename 'Elevation)
(vlax-get ename 'Elevation)
0.0)))
(l-coor2l-pt (if flag (cdddr lst) (cddr lst)) flag))))
(defun c:ExpCL ( / js poly obj_vlax pt_start total_dist partial_dist
ori_dist increment_dist lst_pt chainage_interval
start_chainage csvFile f_open chainage_str ename)
;; Ask the user to select a polyline (centerline)
(princ "\nSelect the road centerline polyline: ")
(setq poly (car (entsel)))
(if (not poly) (progn (princ "\nNo polyline selected.") (exit)))
;; Get the selected polyline as an object
(setq obj_vlax (vlax-ename->vla-object poly))
;; Get start point and total distance of the polyline
(setq pt_start (vlax-curve-getStartPoint obj_vlax)
total_dist (vlax-curve-getDistAtParam obj_vlax (vlax-curve-getEndParam obj_vlax)))
;; Get the interval and starting chainage
(setq chainage_interval (getreal "\nEnter interval distance for coordinates (e.g. 10): "))
(setq start_chainage (getreal "\nEnter starting chainage (e.g., 50000 for KM 50+000): "))
;; Prompt user for output file (CSV format)
(setq csvFile (getfiled "Select location to save CSV file" "coordinates.csv" "csv" 1))
(setq f_open (open csvFile "w"))
(if (null f_open) (progn (princ "\nFailed to open file.") (exit)))
;; Write the CSV header
(write-line "Chainage,Northing,Easting,Elevation" f_open)
;; Loop through points at the specified interval
(setq increment_dist 0.0)
(setq lst_pt (list pt_start)) ;; Start with the start point
(while (< increment_dist total_dist)
(setq pt (vlax-curve-getPointAtDist obj_vlax increment_dist))
;; Only add the point if it's not the start point
(if (not (equal pt pt_start))
(setq lst_pt (cons pt lst_pt)))
(setq increment_dist (+ increment_dist chainage_interval)))
;; Add the start point explicitly
(setq lst_pt (cons pt_start lst_pt))
;; Loop through the points and write to CSV
(setq lst_pt (reverse lst_pt))
(foreach pt lst_pt
(setq chainage_str (rtos (+ start_chainage (/ (vlax-curve-getDistAtPoint obj_vlax pt) 1.0)) 2 3))
(write-line
(strcat chainage_str "," (rtos (car pt) 2 3) "," (rtos (cadr pt) 2 3) ","
(if (vlax-property-available-p obj_vlax 'Elevation)
(rtos (vlax-get obj_vlax 'Elevation) 2 3)
"0.0"))
f_open))
;; Close the file
(close f_open)
(princ "\nCoordinates exported successfully.")
(prin1))