Here’s a great LISP that should be incorporated with AutoCAD. After drawing an arc, we should be able to easily draw a line that is tangent from the arc. Well… until then here;s how…
(Written by Alan JT found @ the swamp.org)
~enjoy
(defun c:TLA (/ *error* ent arc) ;; draw Tangent Line from selected Arc's endpoint ;; Required subroutines: AT:GetSel ;; Alan J. Thompson, 12.14.10 (vl-load-com) (defun *error* (msg) (and (eq 4 (length ent)) arc (entdel (car arc))) (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,"))) (princ (strcat "\nError: " msg)) ) ) (if (setq ent (AT:GetSel nentselp "\nSelect arc from which to draw tangent line: " (lambda (x) (eq "ARC" (cdr (assoc 0 (entget (car x)))))) ) ) (progn (if (eq 4 (length ent)) (vla-transformby (vlax-ename->vla-object (car (setq arc (list (entmakex (entget (car ent))) (cadr ent))))) (vlax-tmatrix (caddr ent)) ) (setq arc ent) ) ((lambda (points _dist _angle _angtos / ang pnt) (if (< (_dist (cadr arc) (car points)) (_dist (cadr arc) (cadr points))) (setq ang (_angtos (+ (/ pi 2.) (_angle (cdr (assoc 50 (entget (car arc))))))) pnt (car points) ) (setq ang (_angtos (+ (/ pi 2.) (_angle (cdr (assoc 51 (entget (car arc))))))) pnt (cadr points) ) ) (vl-cmdf "_.line" "_non" pnt (strcat "<" ang) PAUSE) ) (mapcar (function (lambda (p) (trans p 0 1))) (list (vlax-curve-getStartPoint (car arc)) (vlax-curve-getEndPoint (car arc))) ) (lambda (a b) (distance (list (car a) (cadr a)) (list (car b) (cadr b)))) (lambda (a) (if (zerop (getvar 'WORLDUCS)) (- a (angle '(0. 0. 0.) (trans (getvar 'UCSXDIR) 0 (trans '(0. 0. 1.) 1 0 T) T))) a ) ) (lambda (a) (angtos a (getvar 'aunits) 16)) ) ) ) (*error* nil) (princ) ) (defun AT:GetSel (meth msg fnc / ent good) ;; 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"))) ;; Alan J. Thompson, 05.25.10 (setvar 'errno 0) (while (not good) (setq ent (meth (cond (msg) ("\nSelect object: ") ) ) ) (cond ((vl-consp ent) (setq good (cond ((or (not fnc) (fnc ent)) ent) ((prompt "\nInvalid object!")) ) ) ) ((eq (type ent) 'STR) (setq good ent)) ((setq good (eq 52 (getvar 'errno))) nil) ((eq 7 (getvar 'errno)) (setq good (prompt "\nMissed, try again."))) ) ) )