明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 柴月二号

[提问] 请教前辈两线交点问题

[复制链接]
发表于 2019-10-18 12:23:28 | 显示全部楼层
前面的线其实不用画出来在删除,函数直接可以计算交点
发表于 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)

是的,这样也不错
发表于 2019-10-18 12:36:07 来自手机 | 显示全部楼层
柴月二号 发表于 2019-10-18 12:29
是的,这样也不错

我想他的意思是最后只存在两条线,前面的点可能是他画图需要捕捉到的点。
发表于 2019-10-18 16:44:53 | 显示全部楼层
柴月二号 发表于 2019-10-18 12:17
上面两个command句子去掉就不会是四条线了,这里有点多余,主要功能是代替外观交点。如果能拾取两个闭合 ...

代码难是一次的,使用效果可能更重要一些吧.
发表于 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,剩下的不用变.
如果需要框选多个直线就很麻烦了,因为你需要对对象排序,获取正确的对应关系.如果是两组平行线,建议用栏选来解决,能降低不小的难度..
发表于 2019-10-20 15:40:16 | 显示全部楼层
本帖最后由 lisperado 于 2019-10-20 16:05 编辑

为避免画四条线,干嘛不用瞬态?

注意:inters函数只合适2D平面,如果四个点3D不同高度将无法得到交叉点?所以修改以下lisp所画的交点都只限于平面: (x y 0.0)
  1. (defun c:tt (/ pt1 pt2 pt3 pt4 pt5 xy)

  2.   (defun xy (p)(mapcar '* '(1. 1.) p))
  3.   (and (setq pt1 (getpoint "\nFirst line\n1st point.. "))
  4.        (setq pt2 (getpoint "\n2nd point" pt1))
  5.        (not (grdraw pt1 pt2 2 1))
  6.        (setq pt3 (getpoint "\nSecond line\n1st point"))
  7.        (setq pt4 (getpoint "\n2nd point" pt3))
  8.        (not (grdraw pt3 pt4 2 1))

  9. ;;;       (setq pt5 (inters pt1 pt2 pt3 pt4 nil))

  10.        (setq pt5 (apply 'inters (reverse (cons nil (mapcar 'xy (list pt4 pt3 pt2 pt1))))))

  11.        (foreach x (list pt1 pt3)
  12.          (entmakex
  13.            (cons '(0 . "LINE") (mapcar '(lambda (a b) (cons a (xy (trans b 1 0)) )) '(10 11) (list x pt5)))
  14.            )
  15.          )
  16.        )
  17.   (redraw)
  18.   (princ)
  19.   )







 楼主| 发表于 2019-10-21 22:50:56 来自手机 | 显示全部楼层
我这是抛了个砖,谢谢大家
发表于 2019-10-27 13:29:31 | 显示全部楼层
lisperado 发表于 2019-10-20 15:40
为避免画四条线,干嘛不用瞬态?

注意:inters函数只合适2D平面,如果四个点3D不同高度将无法得到 ...

请问瞬态是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-28 20:58 , Processed in 0.171886 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表