start4444
发表于 2019-10-18 12:23:28
前面的线其实不用画出来在删除,函数直接可以计算交点
WWYYBB1015
发表于 2019-10-18 12:27:07
(setq pt1 (getpoint)
pt2 (getpoint)
pt3 (getpoint)
pt4 (getpoint)
pt5 (inters pt1 pt2 pt3 pt4))
;;只创建点,不显示点
(entmake
(list '(0 . "line")
(cons 10 pt1)
(cons 11 pt5)))
(entmake
(list '(0 . "line")
(cons 10 pt3)
(cons 11 pt5)))
柴月二号
发表于 2019-10-18 12:27:39
start4444 发表于 2019-10-18 12:23
前面的线其实不用画出来在删除,函数直接可以计算交点
是的,不用画线,删掉那两句画线的句子即可
柴月二号
发表于 2019-10-18 12:29:23
WWYYBB1015 发表于 2019-10-18 12:27
(setq pt1 (getpoint)
pt2 (getpoint)
pt3 (getpoint)
是的,这样也不错
WWYYBB1015
发表于 2019-10-18 12:36:07
柴月二号 发表于 2019-10-18 12:29
是的,这样也不错
我想他的意思是最后只存在两条线,前面的点可能是他画图需要捕捉到的点。
wyl219
发表于 2019-10-18 16:44:53
柴月二号 发表于 2019-10-18 12:17
上面两个command句子去掉就不会是四条线了,这里有点多余,主要功能是代替外观交点。如果能拾取两个闭合 ...
代码难是一次的,使用效果可能更重要一些吧.
wyl219
发表于 2019-10-18 16:59:28
本帖最后由 wyl219 于 2019-10-18 17:12 编辑
(defun c:tt ()
(setq p1 (getpoint "\n请指定第一点:"))
(setq p2 (getpoint p1"\n请指定第二点:"))
(setq l1
(entmakex (list
(cons 0 "line")
(cons 10 p1)
(cons 11 p2))));生成辅助线
(setq p3 (getpoint "\n请指定第三点:"))
(setq p4 (getpoint p3"\n请指定第四点:"))
(setq l2 (entmakex (list
(cons 0 "line")
(cons 10 p3)
(cons 11 p4))));生成辅助线
(setq tp (inters p1 p2 p3 p4 nil))
(entdel l1)
(entdel l2);删除两个辅助线
(entmake
(list
(cons 0 "line")
(cons 10 (if (< (distance p1 tp) (distance p2 tp) )
p2
p1
));判断真正的起点
(cons 11 tp))
)
(entmake
(list
(cons 0 "line")
(cons 10 (if (< (distance p3 tp) (distance p4 tp) )
p4
p3
))
(cons 11 tp))
)
)
直接用上面获取的p1到p4生成后面的线,当四个点的选择顺序并不是从远离交点的顶点开始时,会出错,需要判断最远点.现在的代码如果两个线的交点在其中一条线上,那么就可能出现不符合意图的情况,这里是按照保留较长部分的,如果有需要,可以增加一个判断并提示用户选择.
如果是需要框两条直线并倒角,难度并不大,用(ssget '((0 . "line")))获取选择集,并判断选择集是否只有两个对象,之后用组码10和组码11(pline没有组码11,会麻烦些)代替上面的getpoint获取p1到p4,剩下的不用变.
如果需要框选多个直线就很麻烦了,因为你需要对对象排序,获取正确的对应关系.如果是两组平行线,建议用栏选来解决,能降低不小的难度..
lisperado
发表于 2019-10-20 15:40:16
本帖最后由 lisperado 于 2019-10-20 16:05 编辑
为避免画四条线,干嘛不用瞬态?
注意:inters函数只合适2D平面,如果四个点3D不同高度将无法得到交叉点?所以修改以下lisp所画的交点都只限于平面: (x y 0.0)
(defun c:tt (/ pt1 pt2 pt3 pt4 pt5 xy)
(defun xy (p)(mapcar '* '(1. 1.) p))
(and (setq pt1 (getpoint "\nFirst line\n1st point.. "))
(setq pt2 (getpoint "\n2nd point" pt1))
(not (grdraw pt1 pt2 2 1))
(setq pt3 (getpoint "\nSecond line\n1st point"))
(setq pt4 (getpoint "\n2nd point" pt3))
(not (grdraw pt3 pt4 2 1))
;;; (setq pt5 (inters pt1 pt2 pt3 pt4 nil))
(setq pt5 (apply 'inters (reverse (cons nil (mapcar 'xy (list pt4 pt3 pt2 pt1))))))
(foreach x (list pt1 pt3)
(entmakex
(cons '(0 . "LINE") (mapcar '(lambda (a b) (cons a (xy (trans b 1 0)) )) '(10 11) (list x pt5)))
)
)
)
(redraw)
(princ)
)
柴月二号
发表于 2019-10-21 22:50:56
我这是抛了个砖,谢谢大家
wyl219
发表于 2019-10-27 13:29:31
lisperado 发表于 2019-10-20 15:40
为避免画四条线,干嘛不用瞬态?
注意:inters函数只合适2D平面,如果四个点3D不同高度将无法得到 ...
请问瞬态是什么?