Visual Lisp函数之线段相交
CAD修图时经常遇到这种情况:需要把两条线段延长到交点,或者把两条相交的线段都修剪一下,剪去较短的那一部分。
下面这个函数可以提供这个功能。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lisp函数
(defun c:inter (/ l1 l2 p1 p2 p3 p4 p5 osmode)
;;选择两条直线,两直线
;;如果没有相交,分别延长至交点
;;如果已经相交,将两条线段在交点较短一侧截去
(setvar "cmdecho" 0)
(setq osmode (getvar "osmode"))
(while
(/= (cdr
(assoc 0
(entget (setq l1 (car (entsel "\n请选择第一条直线:")))
)
)
)
"LINE"
)
(print "选择的不是直线!")
)
(while
(/= (cdr
(assoc 0
(entget (setq l2 (car (entsel "\n请选择第二条直线:")))
)
)
)
"LINE"
)
(print "选择的不是直线!")
)
(setq l1 (entget l1) ;将变量l1赋予直线1的图元表
l2 (entget l2) ;将变量l2赋予直线2的图元表
p1 (cdr (assoc 10 l1))
p2 (cdr (assoc 11 l1))
p3 (cdr (assoc 10 l2))
p4 (cdr (assoc 11 l2))
p5 (inters p1 p2 p3 p4 nil) ;p5是交点
)
(if (< (distance p1 p5)
(distance p2 p5) ;判断哪个端点距离交点近
)
(setq l1 (subst (cons 10 p5) (assoc 10 l1) l1))
(setq l1 (subst (cons 11 p5) (assoc 11 l1) l1))
)
(entmod l1)
(if (< (distance p3 p5)
(distance p4 p5)
)
(setq l2 (subst (cons 10 p5) (assoc 10 l2) l2))
(setq l2 (subst (cons 11 p5) (assoc 11 l2) l2))
)
(entmod l2)
(setvar "osmode" osmode)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
下面这个函数可以提供这个功能。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lisp函数
(defun c:inter (/ l1 l2 p1 p2 p3 p4 p5 osmode)
;;选择两条直线,两直线
;;如果没有相交,分别延长至交点
;;如果已经相交,将两条线段在交点较短一侧截去
(setvar "cmdecho" 0)
(setq osmode (getvar "osmode"))
(while
(/= (cdr
(assoc 0
(entget (setq l1 (car (entsel "\n请选择第一条直线:")))
)
)
)
"LINE"
)
(print "选择的不是直线!")
)
(while
(/= (cdr
(assoc 0
(entget (setq l2 (car (entsel "\n请选择第二条直线:")))
)
)
)
"LINE"
)
(print "选择的不是直线!")
)
(setq l1 (entget l1) ;将变量l1赋予直线1的图元表
l2 (entget l2) ;将变量l2赋予直线2的图元表
p1 (cdr (assoc 10 l1))
p2 (cdr (assoc 11 l1))
p3 (cdr (assoc 10 l2))
p4 (cdr (assoc 11 l2))
p5 (inters p1 p2 p3 p4 nil) ;p5是交点
)
(if (< (distance p1 p5)
(distance p2 p5) ;判断哪个端点距离交点近
)
(setq l1 (subst (cons 10 p5) (assoc 10 l1) l1))
(setq l1 (subst (cons 11 p5) (assoc 11 l1) l1))
)
(entmod l1)
(if (< (distance p3 p5)
(distance p4 p5)
)
(setq l2 (subst (cons 10 p5) (assoc 10 l2) l2))
(setq l2 (subst (cons 11 p5) (assoc 11 l2) l2))
)
(entmod l2)
(setvar "osmode" osmode)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
还没人赞这篇日记