明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 334|回复: 13

[提问] (求助)如何把特殊表中重复删除保留一个

[复制链接]
发表于 2024-6-17 12:32 | 显示全部楼层 |阅读模式
本帖最后由 hn10183051 于 2024-6-17 19:05 编辑

求助各位路过的有空的知道如何解决的大神,可以帮小弟实现以下功能
  • (((32861.0 -4641.19 0.0) (33205.1 -4701.19 0.0))
  •   ((33205.1 -4641.19 0.0) (33385.1 -4701.19 0.0))
  •   ((32861.0 -4701.19 0.0) (33205.1 -4761.19 0.0))
  •   ((33205.1 -4701.19 0.0) (33385.1 -4881.19 0.0))
  •   ((32861.0 -4761.19 0.0) (33205.1 -4881.19 0.0))
  •   ((33205.1 -4761.19 0.0) (33385.1 -4881.19 0.0)))

           变成
  • (((32861.0 -4641.19 0.0) (33205.1 -4701.19 0.0))
  •   ((33205.1 -4641.19 0.0) (33385.1 -4701.19 0.0))
  •   ((32861.0 -4701.19 0.0) (33205.1 -4761.19 0.0))
  •   ((33205.1 -4701.19 0.0) (33385.1 -4881.19 0.0))
  •   ((32861.0 -4761.19 0.0) (33205.1 -4881.19 0.0)))

红色位置是相同,查找到相同后把后面整个表
一条删除。
相同表位置可能在子表第1个,或者第2个表,查找相同比较是子表与子表相同表位置。
(((766493.0 342807.0 0.0) (766870.0 342667.0 0.0))   
((766870.0 342807.0 0.0) (767326.0 342526.0 0.0))   
((766493.0 342667.0 0.0) (766870.0 342386.0 0.0))
((766870.0 342667.0 0.0) (767326.0 342526.0 0.0))    ;此条重复
((766493.0 342526.0 0.0) (766870.0 342386.0 0.0))    ;此条重复
((766870.0 342526.0 0.0) (767326.0 342386.0 0.0)))
               变成
(((766493.0 342807.0 0.0) (766870.0 342667.0 0.0))
((766870.0 342807.0 0.0) (767326.0 342526.0 0.0))
((766493.0 342667.0 0.0) (766870.0 342386.0 0.0))
((766870.0 342526.0 0.0) (767326.0 342386.0 0.0)))



"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-6-17 20:04 | 显示全部楼层
(foreach abc PointList
  (setq px (cadr abc))
  (or (equal
        (car
          (vl-sort (mapcar (function (lambda (x) (distance x px))) Check)
                   '<
          )
        )
        0.
        0.001
      )
      (setq Check (cons px Check)
            rtn          (cons abc rtn)
      )
  )
)
(reverse rtn)
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-19 07:35 | 显示全部楼层
  1. (defun DelSame (lst / tmp lst1)
  2.   "端点重合消除"
  3.   (foreach a lst
  4.     (if (and (not (member (car a) tmp1))(not (member (cadr a) tmp2)))
  5.       (setq tmp1 (cons (car a) tmp1)
  6.             tmp2 (cons (cadr a) tmp2)
  7.             lst1 (cons a lst1)
  8.       )
  9.     )
  10.   )
  11.   (reverse lst1)
  12. )
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-17 13:06 | 显示全部楼层
使用delsame函数,平时看不上别人发的帖子,不愿意收集
 楼主| 发表于 2024-6-17 14:28 | 显示全部楼层
dcl1214 发表于 2024-6-17 13:06
使用delsame函数,平时看不上别人发的帖子,不愿意收集

;;;删除列表中的相同元素(保留一个)并返回新表
(defun LstDelSame (lst / x nl)
  (foreach x lst
    (if (not (member x nl))
      (setq nl (cons x nl))
    )
  )
  (setq nl (reverse nl))
  nl
)

用这个函数不行啊,没有变法
发表于 2024-6-17 14:32 | 显示全部楼层
hn10183051 发表于 2024-6-17 14:28
;;;删除列表中的相同元素(保留一个)并返回新表
(defun LstDelSame (lst / x nl)
  (foreach x lst

请参考http://bbs.mjtd.com/forum.php?mo ... =%B4%F8%C8%DD%B2%EE
发表于 2024-6-17 14:59 | 显示全部楼层
  1. (defun ptdelsame(l1 rcz / l2)
  2.   (while l1
  3.     (setq l2 (cons(car l1) l2)
  4.                         l1 (vl-remove-if'(lambda (x)(equal(car l1) x rcz))(cdr l1)))
  5.         )
  6.   (reverse l2)
  7. )


不是我写的,在论坛上面找的,和黄大师的写法不一样,用法相同。
 楼主| 发表于 2024-6-17 15:01 | 显示全部楼层
本帖最后由 hn10183051 于 2024-6-17 15:12 编辑

试用了还是一样没有变法,容差我也设置的1
发表于 2024-6-17 15:48 | 显示全部楼层
他这个不是delsame,是用第二个点做标记遍历判断并删除重复的


(foreach abc PointList
  (or (vl-position (cadr abc) Check)
      (setq Check (cons (cadr abc) Check)
            rtn          (cons abc rtn)
      )
  )
)
(reverse rtn)
 楼主| 发表于 2024-6-17 15:56 | 显示全部楼层
kozmosovia 发表于 2024-6-17 15:48
他这个不是delsame,是用第二个点做标记遍历判断并删除重复的

对,但是你这个函数用不了!
发表于 2024-6-17 16:05 | 显示全部楼层
把每一项转为字符串就好了,构成一个新的辅助列表。用辅助列表判断是否重复。这个也是我在计算大坐标值遇到了同样的问题,有些坐标看着一样,但是不能去重。
 楼主| 发表于 2024-6-17 19:06 | 显示全部楼层
大神,大师帮帮忙
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-26 18:25 , Processed in 0.191335 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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