;; DIST (gile)
;; Retourne sur la ligne de commande la distance entre 2 points ou celle
;; de l'objet sélectionné (plus la distance du segment pour les polylignes).

(defun c:dist (/ p1 p2 ent obj tot par)
  (vl-load-com)
  (if (setq p1
	     (getpoint
	       "\nSpécifiez le premier point ou < Sélectionnez un objet >: "
	     )
      )
    (progn
      (while
	(not (setq p2 (getpoint p1 "Spécifiez le deuxième point: "))
	)
      )
      (princ (strcat
	       "\nDistance : "
	       (rtos (distance p1 p2))
	     )
      )
    )
    (if	(and (setq ent (entsel))
	     (not (vl-catch-all-error-p
		    (setq p2
			   (vl-catch-all-apply
			     'vlax-curve-getEndParam
			     (list (setq obj (vlax-ename->vla-object (car ent))))
			   )
		    )
		  )
	     )
	)
      (progn
	(setq tot (vlax-curve-getDistAtParam obj p2))
	(if (wcmatch (vla-get-ObjectName obj) "*Polyline")
	  (progn
	    (if	(= (vla-get-ObjectName obj) "AcDb2dPolyline")
	      (setq p1 (vlax-curve-getClosestPointToProjection
			 obj
			 (trans (cadr ent) 1 0)
			 (trans '(0 0 1) 2 0 T)
		       )
	      )
	      (setq p1 (trans (osnap (cadr ent) "_nea") 1 0))
	    )
	    (setq par (vlax-curve-getParamAtPoint obj p1))
	    (princ
	      (strcat
		"\nDistance totale : "
		(rtos tot)
		" Segment sélectionné : "
		(rtos
		  (- (vlax-curve-getDistAtParam obj (1+ (fix par)))
		     (vlax-curve-getDistAtParam obj (fix par))
		  )
		)
	      )
	    )
	  )
	  (princ (strcat "\nDistance : " (rtos tot)))
	)
      )
      (princ "\nEntité non valide.")
    )
  )
  (princ)
)