Command: _circle Specify center point for circle or [3P/2P/Ttr (tan tan
radius)]: _3p Specify first point on circle: _tan to
Specify second point on circle: _tan to
Specify third point on circle:
(defun make-arc (cpt pt pt2)
(setq lst (list '(0 . "ARC")
'(100 . "AcDbEntity")
'(100 . "AcDbCircle")
(cons 10 cpt)
(cons 40 (distance pt cpt))
'(210 0.0 0.0 1.0)
'(100 . "AcDbArc")
(cons 50 (angle cpt pt2))
(cons 51 (angle cpt pt))
)
)
(entmake lst)
)
(defun C:TANARC (/ cp1 cp2 cpt e1 e2 idist ip n o obj1 obj2
p1 p2 p3 p4 pt pt2)
(setq e1 (entsel "\nPick first line: ")
e2 (entsel "\nPick second line: ")
pt (getpoint "\nPick start point on line: ")
)
(cond
((and e1 e2 pt)
(setq obj1 (vlax-ename->vla-object (car e1))
obj2 (vlax-ename->vla-object (car e2))
)
(mapcar (function (lambda (n o) (set n (vlax-curve-getstartpoint o))))
'(p1 p3) (list obj1 obj2)
)
(mapcar (function (lambda (n o) (set n (vlax-curve-getendpoint o))))
'(p2 p4) (list obj1 obj2)
)
(cond ((setq ip (inters p1 p2 p3 p4 nil))
(setq idist (distance ip pt)
cp1 (polar pt (+ (angle p1 p2) (/ pi 2.0)) idist)
pt2 (polar ip (angle p3 p4) (distance ip pt))
cp2 (polar pt2 (+ (angle p3 p4) (/ pi 2.0)) idist)
cpt (inters pt cp1 pt2 cp2 nil)
)
(make-arc cpt pt pt2)
)
)
)
)
)
(defun C:TANARC2 (/ ang ang1 ang2 bang cpt dst dst2 e1 e2
flag fuzz ipt p1 p2 p3 p4 pt pt1 pt2 rad)
(prompt "Pick 2 Lines, Arc Start Point First..")
(setq e1 (entsel "\nPick first line: ")
e2 (entsel "\nPick second line: ")
pt (getpoint "\nPick start point on line: ")
flag nil
fuzz 1e-12
)
(and (and e1 e2 pt)
(setq p1 (cdr (assoc 10 (entget (car e1)))))
(setq p2 (cdr (assoc 11 (entget (car e1)))))
(setq p3 (cdr (assoc 10 (entget (car e2)))))
(setq p4 (cdr (assoc 11 (entget (car e2)))))
(setq ipt (inters p1 p2 p3 p4 nil))
(setq ang1 (angle ipt pt))
(setq ang2 (if (< (distance ipt p3) (distance ipt p4))
(angle ipt p4)
(angle ipt p3)
)
)
(setq ang (* (+ ang1 ang2) 0.5))
(setq dst (distance ipt pt))
(setq bang (abs (- ang ang1)))
(setq dst2 (/ dst (cos bang)))
(setq cpt (polar ipt ang dst2))
(setq rad (distance cpt pt))
(setq pt1 (polar cpt (+ ang pi) rad))
(setq pt2 (polar ipt ang2 dst))
(setq flag T)
)
(if flag
(command "_.arc" pt pt1 pt2)
(Alert "User Error")
)
)
(setq center (inters pt1 pt2 pt3 pt4))
(setq ang2 (angle ipt (cadr e2)))
(setq ang (if (> (setq ang (* (+ ang1 ang2) 0.5)) pi)
(- ang pi)
ang
)
)
(setq ang1 (if (equal (angle ipt pt) (angle p1 p2) 0.01)
(angle p1 p2)
(angle p2 p1)
)
)
(setq ang2 (if (equal (angle ipt (car e2)) (angle p3 p4) 0.01)
(angle p3 p4)
(angle p4 p3)
)
)
(setq ang (if (> (setq ang (* (+ ang1 ang2) 0.5)) pi)
(- ang pi)
ang
)
)
(setq ang (if (or (and (< 0 ang1 (* pi 0.5))
(< (* pi 1.5) ang2 (* pi 2.0))
)
(and (< (* pi 1.5) ang1 (* pi 2.0))
(< 0 ang2 (* pi 0.5))
)
)
(- (* (+ ang1 ang2) 0.5) pi)
(* (+ ang1 ang2) 0.5)
)
)
(defun c:tanarc2 (/ ang ang1 ang2 bang cpt dst dst2 e1
e2 flag ipt p1 p2 p3 p4 pt pt1
pt2 ipt ptc 90deg 180deg 270deg 360deg
)
;; compute the delta angle between a1 & a
(defun @delta (a1 a2)
(cond
((> a1 (+ a2 pi)) (- (+ a2 pi pi) a1))
((> a2 (+ a1 pi)) (abs(- a2 a1 pi pi)))
((- a2 a1))
)
)
;; find the line angle closest to angle to picked point for the line selection
(defun angequal (ang12 pkpt)
(or (equal ang12 pkpt 0.1)
(and (< pkpt (+ ang12 90deg))
(> pkpt (- ang12 90deg))
)
(and (> (+ ang12 90deg) 360deg)
(> pkpt (- ang12 90deg))
(< pkpt (- (* pi 2.5) ang12))
)
)
)
;; determine the first angle in a ccw direction
(defun startang ()
(cond
((equal (+ ang1 ang) ang2 0.1) ang1)
((equal (+ ang2 ang) ang1 0.1) ang2)
((< (+ ang1 ang) ang2) ang2)
(t ang1)
)
)
(prompt "Pick 2 Lines, Arc Start Point First..")
(setvar "osmode" 176)
(setq e1 (entsel "\nPick first line: ")
e2 (entsel "\nPick second line: ")
pt (getpoint "\nPick start point on line: ")
flag nil
90deg (* pi 0.5)
180deg pi
270deg (* pi 1.5)
360deg (* pi 2)
)
(setvar "osmode" 0)
(and (and e1 e2 pt)
(setq p1 (cdr (assoc 10 (entget (car e1)))))
(setq p2 (cdr (assoc 11 (entget (car e1)))))
(setq p3 (cdr (assoc 10 (entget (car e2)))))
(setq p4 (cdr (assoc 11 (entget (car e2)))))
(setq ipt (inters p1 p2 p3 p4 nil))
(if (angequal (angle p1 p2) (angle ipt (cadr e1)))
(setq ang1 (angle p1 p2))
(setq ang1 (angle p2 p1))
)
(if (angequal (angle p3 p4) (angle ipt (cadr e2)))
(setq ang2 (angle p3 p4))
(setq ang2 (angle p4 p3))
)
(setq dst (distance ipt pt))
(setq pt1 (polar ipt ang1 dst))
(setq pt2 (polar ipt ang2 dst))
(setq ang (@delta ang1 ang2))
(setq bang (/ ang 2))
(setq dst2 (/ dst (cos bang)))
(setq sang (startang))
(setq cpt (polar ipt (+ bang sang) dst2))
(setq ptc (polar cpt (+ pi (+ bang sang)) (distance cpt pt1)))
(setq flag t)
)
(if flag
(command "_.arc" pt1 ptc pt2)
(alert "User Error")
)
(princ)
)
(princ)
1. Locate the 2nd point at the same distance from the vertex by using Circle, Radius
Quote1. Locate the 2nd point at the same distance from the vertex by using Circle, Radius
The problem was that I didn't *know* the radius...just a start or end point and the two tangents.
(defun c:tanarc2 (/ ang ang1 ang2 bang cpt dst dst2 e1
e2 flag ipt p1 p2 p3 p4 pt pt1
pt2 ipt ptc 90deg 180deg 270deg 360deg
)
;; find the line angle closest to angle to picked point for the line selection
(defun angequal (ang12 pkpt)
(or (equal ang12 pkpt 0.1)
(and (< pkpt (+ ang12 90deg))
(> pkpt (- ang12 90deg))
)
(and (> (+ ang12 90deg) 360deg)
(> pkpt (- ang12 90deg))
(< pkpt (- (* pi 2.5) ang12))
)
)
)
(prompt "Pick 2 Lines, Arc Start Point First..")
(setvar "osmode" 176)
(setq e1 (entsel "\nPick first line: ")
e2 (entsel "\nPick second line: ")
pt (getpoint "\nPick start point on line: ")
flag nil
90deg (* pi 0.5)
180deg pi
270deg (* pi 1.5)
360deg (* pi 2)
)
(setvar "osmode" 0)
(and (and e1 e2 pt)
(setq p1 (cdr (assoc 10 (entget (car e1)))))
(setq p2 (cdr (assoc 11 (entget (car e1)))))
(setq p3 (cdr (assoc 10 (entget (car e2)))))
(setq p4 (cdr (assoc 11 (entget (car e2)))))
(setq ipt (inters p1 p2 p3 p4 nil))
(if (angequal (angle p1 p2) (angle ipt (cadr e1)))
(setq ang1 (angle p1 p2))
(setq ang1 (angle p2 p1))
)
(if (angequal (angle p3 p4) (angle ipt (cadr e2)))
(setq ang2 (angle p3 p4))
(setq ang2 (angle p4 p3))
)
(setq dst (distance ipt pt))
(setq pt1 (polar ipt ang1 dst))
(setq pt2 (polar ipt ang2 dst))
(setq flag t)
)
(if flag
(command "_.arc" pt1 "en" pt2 "d" ipt)
(alert "User Error")
)
(princ)
)
(princ)