这是Alan JT很久以前做的,非常接近您想要的,它通过拖动实时工作,但您应该能够硬编码半径。此外,在pline中,弧被称为凸出。请看lee mac pline info lisp。
- (defun c:DyF (/ *error* _pnt AT:GetSel vl ov ent plst elst gr sp)
- ;; Dynamic Fillet
-
- (vl-load-com)
- (defun *error* (msg)
- (redraw)
- (and vl (mapcar (function setvar) vl ov))
- (and elst (mapcar (function redraw) elst
- (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
- (princ (strcat "\nError: " msg))
- )
- )
- (defun _pnt (p) (trans (list (car p) (cadr p)) 0 1))
- (defun AT:GetSel (meth msg fnc / ent)
- ;; meth - selection method (entsel, nentsel, nentselp)
- ;; msg - message to display (nil for default)
- ;; fnc - optional function to apply to selected object
- ;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
-
- (setvar 'ERRNO 0)
- (while
- (progn (setq ent (meth (cond (msg)
- ("\nSelect object: ")
- )
- )
- )
- (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
- ((eq (type (car ent)) 'ENAME)
- (if (and fnc (not (fnc ent)))
- (princ "\nInvalid object!")
- )
- )
- )
- )
- )
- ent
- )
- (if (setq ent
- (car
- (AT:GetSel
- entsel
- "\nSelect arc: "
- (lambda (x)
- (if (eq "ARC" (cdr (assoc 0 (entget (car x)))))
- (vl-every (function (lambda (p / ss)
- (if (setq ss (ssget "_C" p p '((0 . "LINE"))))
- (setq elst (cons (ssname ss 0) elst))
- )
- )
- )
- (setq plst (list (_pnt (vlax-curve-getStartPoint (car x)))
- (_pnt (vlax-curve-getEndPoint (car x)))
- )
- )
- )
- )
- )
- )
- )
- )
- (progn
- (setq ov (mapcar (function getvar) (setq vl '("CMDECHO" "FILLETRAD"))))
- (while
- (progn
- (setq gr (grread T 15 0))
- (cond
- ((eq 5 (car gr))
- (redraw)
- (grdraw (setq sp (trans (vlax-curve-getStartPoint ent) 0 1)) (cadr gr) 1 -1)
- (princ
- (strcat "\rFillet radius: "
- (rtos (setvar 'FILLETRAD (distance sp (cadr gr))))
- " "
- )
- )
- (if (vl-cmdf "_.fillet" (list (car elst) (car plst)) (list (cadr elst) (cadr plst)))
- (progn (entdel ent) (setq ent (entlast)))
- T
- )
- )
- )
- )
- )
- )
- )
- (*error* nil)
- (princ)
- )
|