;Fillet by example (ARKANCE - www.cadforum.cz)

(defun C:FBE ( / ent obj pick param idx p1 p2 bulge rad)
 (vl-load-com)
 (if (setq e (nentsel "\nPick an existing fillet: "))(progn
  (setq ent (car e))
  (setq pick (cadr e))
  (setq obj (vlax-ename->vla-object ent))

  (setq rad (vl-catch-all-apply 'getpropertyvalue (list ent "Radius"))) ; has property? (ARC)
  
  (if (vl-catch-all-error-p rad)(progn ; otherwise POLY
   (setq rad 0.0  idx 0) ; preset

   ;; Parameter at picked point
   (setq param (vl-catch-all-apply 'vlax-curve-getParamAtPoint (list obj (osnap pick "_NEA"))))
   (if (not (vl-catch-all-error-p param)) (setq idx (fix param)))

   ;; Get bulge of that segment
   (setq bulge (vl-catch-all-apply 'vla-getBulge (list obj idx)))

   (if (or (vl-catch-all-error-p param)
            (vl-catch-all-error-p bulge)
            (equal bulge 0.0 1e-12)) ; err?
    (progn
      (princ "\nThis segment is straight, no radius.")
      (vlr-beep-reaction)
    )
    (progn
      ;; Endpoints of the segment
      (setq p1 (vlax-curve-getPointAtParam obj idx))
      (setq p2 (vlax-curve-getPointAtParam obj (+ idx 1)))
      ;; Compute radius
      (setq rad
        (/
          (distance p1 p2)
          (* 2 (sin (/ (* 4 (atan bulge)) 2.0)))
        )
      )
    )
   )
  )) ; if rad
 )) ; if sel
  
 (princ (strcat "\nApply the radius " (rtos (abs rad) 2 6) " - "))
 (setvar "FILLETRAD" (abs rad))
 (initcommandversion 2)
 (vl-cmdf "_FILLET")
 (princ)
)

(princ "\nFBE (fillet by example) loaded.")
(princ)

