
- ;;;判断圆弧或圆是否与线段相切
- (defun if_tan (s1 s2 / pt_cen pta ptb Radius ptangle ptn jptx dist)
- (setq pt_cen (cdr (assoc 10 (entget s1)))
- Radius (cdr (assoc 40 (entget s1)))
- pta (cdr (assoc 10 (entget s2)))
- ptb (cdr (assoc 11 (entget s2)))
- ptangle (angle pta ptb)
- ptn (polar pt_cen (+ (* 0.5 pi) ptangle) 0.01)
- jptx (inters pt_cen ptn pta ptb nil)
- dist (distance pt_cen jptx)
- )
- (if (equal dist radius 1e-5);容差1e-5认为相等
- T
- nil
- )
- )
- (defun c:iftan (/ ss ss_arc ss_line n m n1 m1 n2 m2 ss1)
- (prompt "\n选择需要判断的线段、圆、圆弧")
- (setq ss (ssget))
- (setq ss_arc (ssadd))
- (setq ss_line (ssadd))
- (setq ss_c_l (ssadd))
- (setq n (sslength ss))
- (setq m 0)
- (while (/= m n)
- (setq ss1 (ssname ss m))
- (if (= (cdr (assoc 0 (entget ss1))) "LINE")
- (ssadd ss1 ss_line)
- )
- (if (or (= (cdr (assoc 0 (entget ss1))) "ARC")
- (= (cdr (assoc 0 (entget ss1))) "CIRCLE")
- )
- (ssadd ss1 ss_arc)
- )
- (setq m (1+ m))
- )
- (setq n1 (sslength ss_arc))
- (setq n2 (sslength ss_line))
- (setq m1 0)
- (while (/= m1 n1)
- (setq ss1_arc (ssname ss_arc m1))
- (setq m2 0)
- (while (/= m2 n2)
- (setq ss1_line (ssname ss_line m2))
- (if (if_tan ss1_arc ss1_line)
- (progn
- (redraw ss1_arc 3)
- (redraw ss1_line 3)
- )
- )
- (setq m2 (1+ m2))
- )
- (setq m1 (1+ m1))
- )
- )
|