检查曲线相切、圆弧相切。
1、圆弧相切是圆弧圆心距是否与半径差(内切)或半径和(外切)相等。默认两圆弧端点重合。2、曲线相切是求曲线端点的切线向量,然后判断两端点的单位向量积是否为1或-1。适用于直线和曲线,可检测两端点是否重合。 本帖最后由 llsheng_73 于 2025-4-24 18:20 编辑
好象都有点问题,第一个是强行要求两个圆弧端点重合,不然不进行行判断
院长只计算圆心距与半径和(差)比较,没有管它们实际有无切点
无聊用院长的代码加上判断两ARC有无交点作为是否进一步计算的依据
(defun c:ACA(/ e1 e2 s1 s2 r1 r2 dd)
(vl-load-com)
(if (and (setq e1 (car (entsel "\n选择第一条弧<退出>: ")))
(vl-position'(0 . "ARC")(setq s1(entget e1)))
(setq e2 (car (entsel "\n选择第二条弧<退出>: ")))
(vl-position'(0 . "ARC")(setq s2(entget e2)))
(not(equal e1 e2))
(>(vlax-safearray-get-u-bound(vlax-variant-value(vlax-invoke-method(vlax-ename->vla-object e1)'IntersectWith(vlax-ename->vla-object e2)0))1)0)
(setq r1(cdr(assoc 40 s1))
r2(cdr(assoc 40 s2))
dd(distance(cdr(assoc 10 s1))(cdr(assoc 10 s2))))
(vl-some'(lambda(x)(equal dd(eval x)1e-6))'((+ r1 r2)(abs(- r1 r2)))))
(alert "两弧相切")
(alert "两弧不相切"))
)
谢谢分享:handshake 支持源码。
(defun c:ACA ()
(defun DXF (code e) (cdr (assoc code (entget e))))
(if (and (setq s1 (car (entsel "\n选择第一条弧<退出>: ")))
(setq s2 (car (entsel "\n选择第二条弧<退出>: ")))
(equal (DXF 0 s1) "ARC")
(equal (DXF 0 s2) "ARC")
(not (equal s1 s2))
)
(progn
(setq r1(DXF 40 s1)
r2(DXF 40 s2)
c1(DXF 10 s1)
c2(DXF 10 s2)
sum (+ r1 r2)
dr(abs (- r1 r2))
dd(distance c1 c2)
)
(if (or (equal dd sum 1e-6) (equal dd dr 1e-6))
(alert "两弧相切")
(alert "两弧不相切")
)
)
)
(princ)
)
支持源码。 llsheng_73 发表于 2025-4-24 17:32
好象都有点问题,第一个是强行要求两个圆弧端点重合,不然不进行行判断
院长只计算圆心距与半径和(差)比较 ...
;; 交点法就简单多了
(defun c:tt ()
(defun DXF (code e) (cdr (assoc code (entget e))))
(if (and (setq s1 (car (entsel "\n选择第一条弧<退出>: ")))
(setq s2 (car (entsel "\n选择第二条弧<退出>: ")))
(equal (DXF 0 s1) "ARC")
(equal (DXF 0 s2) "ARC")
(not (equal s1 s2))
(= (length (xyp-Inters s1 s2 0)) 1);只有一个交点
(= (length (xyp-Inters s1 s2 3)) 1);两弧延伸后也只有一个交点
)
(alert "两弧相切")
(alert "两弧不相切")
)
(princ)
)
页:
[1]