Try this. It writes out to a csv file X, Y and Z of point, chainage and offset. The csv is sorted by distance from origin.
(defun rh:gbbc (obj / ll ur lst c_pt)
(if (and obj (= (type obj) 'ENAME)) (setq obj (vlax-ename->vla-object obj)))
(cond (obj
(vlax-invoke-method obj 'getboundingbox 'll 'ur)
(setq lst (mapcar 'vlax-safearray->list (list ll ur))
c_pt (mapcar '(lambda (x y) (/ (+ x y) 2.0)) (car lst) (cadr lst))
);end_setq
)
);end_cond
c_pt
);end_defun
(defun rh:get_file ( title fname ext flg )
(if (not ext) (setq ftype "*" ext ".*") (setq ftype (vl-string-left-trim "." ext)))
(cond ( (not flg) (setq fname (getfiled title (strcat (getvar 'dwgprefix) fname ext) ftype 1)))
(flg (setq fname (getfiled title (strcat (getvar 'dwgprefix) fname ext) ftype 12)))
);end_cond
);end_defun
(vl-load-com)
(defun c:doff (/ l_ent ss fname fp cnt ent m_pt c_pt p_lst)
(setq l_ent (car (entsel "\nSelect Reference Line : ")))
(prompt "\nSelect Objects : ")
(setq ss (ssget '((0 . "POINT"))))
(cond (ss
(setq fname (rh:get_file "Enter CSV File Name for Output" (vl-filename-base (getvar 'dwgname)) ".csv" nil))
(setq fp (open fname "w"))
(write-line "Pt X,Pt Y,Pt Z,Chainage,Offset" fp)
(repeat (setq cnt (sslength ss))
(setq ent (ssname ss (setq cnt (1- cnt)))
m_pt (rh:gbbc (vlax-ename->vla-object ent))
c_pt (vlax-curve-getclosestpointto l_ent m_pt)
p_lst (cons (list (vlax-curve-getdistatpoint l_ent c_pt) (distance m_pt c_pt) m_pt) p_lst)
);end_setq
);end_repeat
(setq p_lst (vl-sort p_lst '(lambda (x y) (< (car x) (car y)))))
(foreach p p_lst
(write-line (strcat (rtos (car (caddr p)) 2 3) "," (rtos (cadr (caddr p)) 2 3) "," (rtos (caddr (caddr p)) 2 3) ","
(rtos (car p) 2 3) ","
(rtos (cadr p) 2 3)
);end_strcat
fp
);end_write-line
);end_foreach
)
(t (princ "\nNOTHING Selected!"))
);end_cond
(close fp)
(princ)
);end_defun
I am not one of the robots you're looking for