An another version, my tool!
(defun draw_pt (pt col / rap)
(setq rap (/ (getvar "viewsize") 50))
(foreach n
(mapcar
'(lambda (x)
(list
((eval (car x)) (car pt) rap)
((eval (cadr x)) (cadr pt) rap)
(caddr pt)
)
)
'((+ +) (+ -) (- +) (- -))
)
(grdraw pt n col)
)
)
(defun c:partial_length_on_curv ( / js ent vlaobj pt_brk pt_brk2 abs_curv1 abs_curv2 lg_curv)
(vl-load-com)
(princ "\nSelect a curvilinear object on which you want to perform a measurement.")
(while
(not
(setq js
(ssget "_+.:E:S"
(list
(cons -4 "<OR")
(cons -4 "<AND")
(cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE")
(cons -4 "<NOT")
(cons -4 "&") (cons 70 112)
(cons -4 "NOT>")
(cons -4 "AND>")
(cons 0 "SPLINE")
(cons -4 "OR>")
)
)
)
)
)
(redraw (setq ent (ssname js 0)) 3)
(setq
vlaobj (vlax-ename->vla-object ent)
)
(while (setq pt_brk (getpoint "\nChoice of the point of origin of the measurement: "))
(setq pt_brk (vlax-curve-getClosestPointTo vlaobj (trans pt_brk 1 0)))
(cond
(pt_brk
(draw_pt (trans pt_brk 0 1) 3)
(initget 9)
(setq pt_brk2 (getpoint "\nChoice of end point of measurement: "))
(setq pt_brk2 (vlax-curve-getClosestPointTo vlaobj (trans pt_brk2 1 0)))
(if pt_brk2
(progn
(setq
absc_curv1 (vlax-curve-getDistAtPoint vlaobj pt_brk)
absc_curv2 (vlax-curve-getDistAtPoint vlaobj pt_brk2)
lg_curv (- (max absc_curv1 absc_curv2) (min absc_curv1 absc_curv2))
)
(princ (strcat "\nCurvilinear length = " (rtos lg_curv 2 8)))
(redraw)
)
)
)
)
)
(redraw ent 4)
(prin1)
)