明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3640|回复: 18

[讨论] 两共线直线连成一条

[复制链接]
发表于 2020-9-15 09:18:09 | 显示全部楼层 |阅读模式
20明经币
如题,许多直线共线,但端点不一定重合,原两线最外端端点连成一直线并删除原来的直线,至少类似的能框选(比如都是水平的或垂直的)

附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

试试(向量公式来自高飞鸟版主)
发表于 2020-9-15 09:18:10 | 显示全部楼层
试试(向量公式来自高飞鸟版主)
  1. (defun c:zxhb (/   MAT:v-v   MAT:vxv   get_dxf   at_line
  2.          make_linebylst     get_online         ss
  3.          a   lst     n       lst1      en
  4.          jg
  5.         )
  6.   (defun MAT:v-v (v1 v2)
  7.     (mapcar '- v1 v2)
  8.   )
  9.   (defun MAT:vxv (u v)
  10.     (list
  11.       (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  12.       (- (* (car v) (caddr u)) (* (car u) (caddr v)))
  13.       (- (* (car u) (cadr v)) (* (car v) (cadr u)))
  14.     )
  15.   )
  16.   (defun get_dxf (en n /) (cdr (assoc n (entget en))))
  17.   (defun at_line (en1 pt /)
  18.     (equal '(0 0 0)
  19.      (MAT:vxv (MAT:v-v (get_dxf en 10) pt)
  20.         (MAT:v-v (get_dxf en 11) pt)
  21.      )
  22.      1e-6
  23.     )
  24.   )
  25.   (defun make_linebylst  (lst / lst1 a b x1 x2 y1 y2)
  26.     (setq
  27.       lst1
  28.        (vl-sort
  29.    (apply
  30.      'append
  31.      (mapcar '(lambda (x) (list (get_dxf x 10) (get_dxf x 11)))
  32.        lst
  33.      )
  34.    )
  35.    '(lambda (a b)
  36.       (setq x1 (car a)
  37.       x2 (car b)
  38.       y1 (cadr a)
  39.       y2 (cadr b)
  40.       )
  41.       (if  (equal x1 x2 1e-6)
  42.         (> y1 y2)
  43.         (< x1 x2)
  44.       )
  45.     )
  46.        )
  47.     )
  48.     (entmakex (list '(0 . "line")
  49.         (cons 8 (get_dxf (car lst) 8))
  50.         (cons 10 (car lst1))
  51.         (cons 11 (last lst1))
  52.         )
  53.     )
  54.   )
  55.   (defun get_online (en lst / en1 lst1 lst2 out)
  56.     (setq lst1 (list en)
  57.     lst2 nil
  58.     )
  59.     (repeat (length lst)
  60.       (setq en1  (car lst)
  61.       lst  (cdr lst)
  62.       )
  63.       (if (and
  64.       (at_line en (get_dxf en1 10))
  65.       (at_line en (get_dxf en1 11))
  66.     )
  67.   (setq lst1 (cons en1 lst1))
  68.   (setq lst2 (cons en1 lst2))
  69.       )
  70.     )
  71.     (setq en1 (make_linebylst lst1))
  72.     (mapcar 'entdel lst1)
  73.     (list en1 lst2)
  74.   )
  75.   (setq ss (ssget '((0 . "line"))))
  76.   (setq a (sslength ss))
  77.   (setq lst nil)
  78.   (repeat (setq n a)
  79.     (setq lst (cons (ssname ss (setq n (1- n))) lst))
  80.   )
  81.   (while lst
  82.     (setq en  (car lst)
  83.     lst (cdr lst)
  84.     )
  85.     (setq jg   (get_online en lst)
  86.     lst  (cadr jg)
  87.     lst1 (cons (car jg) lst1)
  88.     )
  89.   )
  90.   (princ (strcat "\n共"
  91.      (rtos a 2 0)
  92.      "条直线合并为"
  93.      (rtos (length lst1) 2 0)
  94.      "条直线"
  95.    )
  96.   )
  97.   (princ)
  98. )




评分

参与人数 1明经币 +1 收起 理由
zhangcan0515 + 1 谢谢老师提供好的学习资料

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2020-9-15 09:56:31 | 显示全部楼层
自己顶一下
回复

使用道具 举报

发表于 2020-9-15 10:32:33 | 显示全部楼层
overkill试试
回复

使用道具 举报

发表于 2020-9-15 10:56:17 | 显示全部楼层
三点是否共线
;;;参数:三个点表  注意不能为相同的点                          ;;;
;;;返回值:共线T , 不共线nil                  ;;;
;;;by wan1314
;;;=========================================================;;;
(defun yy-3ptinline (p1 p2 p3 / v1 v2)
    (setq v1 (mapcar '- p1 p2) v2 (mapcar '- p1 p3))
    (if (equal (car v1) 0.0 1e-5)
        (equal (car v1) (car v2) 1e-5)
        (equal (abs(/ (cadr v1) (car v1))) (abs(/ (cadr v2) (car v2))) 1e-5)
    )
)


函数:xpts-lensort
功能:求点集中最远,最近点表
函数代码:
(defun xpts-lensort (ptlst / pt d maxd mind maxl minl)
  (setq minl (list (car ptlst)(cadr ptlst)) maxd 0 mind (apply 'distance minl))
  (while (setq pt (car ptlst) ptlst (cdr ptlst))
    (foreach n ptlst
      (setq d (distance n pt))
      (cond ((< maxd d)(setq maxd d maxl (list n pt)))
     ((> mind d)(setq mind d minl (list n pt)))
      )
    )
  )(list maxl minl)
)
语法:
(xpts-lensort ptlst)
参数:
ptlst 点表
返回值:
(最远两点 最近两点)
回复

使用道具 举报

 楼主| 发表于 2020-9-15 12:45:53 | 显示全部楼层

谢谢关注。试过,不行
回复

使用道具 举报

 楼主| 发表于 2020-9-15 12:48:42 | 显示全部楼层
wzg356 发表于 2020-9-15 10:56
三点是否共线
;;;参数:三个点表  注意不能为相同的点                          ;;;
;;;返回值:共线T ,  ...

谢谢帮忙,可惜自己不会改。在论坛纯粹看得多
回复

使用道具 举报

发表于 2020-9-15 13:41:07 | 显示全部楼层
本帖最后由 start4444 于 2020-9-15 13:46 编辑

对于你的例图是没问题的,如果是存在多条共线的情况有可能出现bug

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2020-9-16 08:01:21 | 显示全部楼层
start4444 发表于 2020-9-15 13:41
对于你的例图是没问题的,如果是存在多条共线的情况有可能出现bug

谢谢帮忙。提示 no function definition: VLAX-CURVE-GETCLOSESTPOINTTO,能完善下吗
回复

使用道具 举报

 楼主| 发表于 2020-9-16 08:02:12 | 显示全部楼层
x_s_s_1 发表于 2020-9-15 09:18
试试(向量公式来自高飞鸟版主)

谢谢帮忙,正是我需要的结果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 11:48 , Processed in 0.175681 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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