Wow, what a brain teaser that was.. (or is)
But I think I got the LISP version working.
Keith, yours works but if I use crossing line as the distance reference
Your routine will pick it up as the line choice. Just an observation.
Don, I could not get the patches to work, maybe I inserted them wrong.
Didn't spend mush time trying to figure it out.
I'm not going to tell how nuch time I spent.
(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)