This one does the job only if third point is osnap independent - uses (grread T)...
Code:
(defun c:ci-2cirtan+pt ( / osm StopLoop ci1 ci2 cci1 cci2 ptl sslines ptt lin1 lin2 inters1 inters2 int1d1 int1d2 int2d1 int2d2 pt11 pt12 pt21 pt22 )
(setq osm (getvar 'osmode))
(setvar 'osmode 0)
(setq ci1 (car (entsel "\nPick first circle")))
(setq ci2 (car (entsel "\nPick second circle")))
(setq cci1 (cdr (assoc 10 (entget ci1))))
(setq cci2 (cdr (assoc 10 (entget ci2))))
(prompt "\nRight click for third circle point")
(setq ptl (cons cci1 ptl))
(setq ptl (cons cci1 ptl))
(setq ptl (cons cci2 ptl))
(setq sslines (ssadd))
(while (and (eq (car (grread T (+ 1 4 8) 0)) 5) (not StopLoop))
(foreach pt ptl
(if (vl-catch-all-error-p (vl-catch-all-apply 'grdraw (list (cadr (grread T (+ 1 4 8) 0)) pt 256)))
(progn
(setq ptt (cadr (grread T (+ 1 4 8) 0)))
(foreach pt ptl
(entmakex
(list
(cons 0 "LINE")
(cons 10 pt)
(cons 11 ptt)
(cons 62 256)
)
)
(ssadd (entlast) sslines)
)
(ssdel (entlast) sslines)
(entdel (entlast))
(setq StopLoop T)
))
)
(redraw)
)
(setq lin2 (ssname sslines 0))
(setq lin1 (ssname sslines 1))
;;-----------------=={ Get Intersections }==------------------;;
;; ;;
;; Returns a list of all points of intersection between ;;
;; two objects ;;
;;------------------------------------------------------------;;
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;;
;;------------------------------------------------------------;;
;; Arguments: ;;
;; obj1, obj2 - VLA-Objects ;;
;;------------------------------------------------------------;;
;; Returns: List of intersection points, or nil ;;
;;------------------------------------------------------------;;
(defun LM:GetIntersections ( obj1 obj2 )
(LM:GroupByNum (vlax-invoke obj1 'IntersectWith obj2 acExtendBoth) 3)
)
;;-----------------=={ Group by Number }==--------------------;;
;; ;;
;; Groups a list into a list of lists, each of length 'n' ;;
;;------------------------------------------------------------;;
;; Author: Lee Mac, Copyright © 2010 - www.lee-mac.com ;;
;;------------------------------------------------------------;;
;; Arguments: ;;
;; l - List to process ;;
;; n - Number of elements by which to group the list ;;
;;------------------------------------------------------------;;
;; Returns: List of lists, each of length 'n' ;;
;;------------------------------------------------------------;;
(defun LM:GroupByNum ( l n / r)
(if l
(cons
(reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r))
(LM:GroupByNum l n)
)
)
)
---------------------------------------------------------------
(defun interss ( e1 e2 / inter ) (vl-load-com)
(if
(and e1 e2)
(setq inter (LM:GetIntersections (vlax-ename->vla-object e1) (vlax-ename->vla-object e2)))
)
inter
)
---------------------------------------------------------------
(setq inters1 (interss ci1 lin1))
(setq inters2 (interss ci2 lin2))
(setq int1d1 (distance (car inters1) ptt))
(setq int1d2 (distance (cadr inters1) ptt))
(setq int2d1 (distance (car inters2) ptt))
(setq int2d2 (distance (cadr inters2) ptt))
(if (< int1d1 int1d2) (progn (setq pt11 (car inters1)) (setq pt12 (cadr inters1)) ) (progn (setq pt12 (car inters1)) (setq pt11 (cadr inters1)) ) )
(if (< int2d1 int2d2) (progn (setq pt21 (car inters2)) (setq pt22 (cadr inters2)) ) (progn (setq pt22 (car inters2)) (setq pt21 (cadr inters2)) ) )
(vl-cmdf "_.erase" sslines "")
(vl-cmdf "_.circle" "3p" "_tan" pt11 "_tan" pt21 "_non" ptt)
(vl-cmdf "_.circle" "3p" "_tan" pt11 "_tan" pt22 "_non" ptt)
(vl-cmdf "_.circle" "3p" "_tan" pt12 "_tan" pt22 "_non" ptt)
(vl-cmdf "_.circle" "3p" "_tan" pt12 "_tan" pt21 "_non" ptt)
(setvar 'osmode osm)
(princ)
)
M.R.