(求助)如何把特殊表中重复删除保留一个
本帖最后由 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)))
(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) (defun DelSame (lst / tmp lst1)
"端点重合消除"
(foreach a lst
(if (and (not (member (car a) tmp1))(not (member (cadr a) tmp2)))
(setq tmp1 (cons (car a) tmp1)
tmp2 (cons (cadr a) tmp2)
lst1 (cons a lst1)
)
)
)
(reverse lst1)
) 使用delsame函数,平时看不上别人发的帖子,不愿意收集 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
)
用这个函数不行啊,没有变法
hn10183051 发表于 2024-6-17 14:28
;;;删除列表中的相同元素(保留一个)并返回新表
(defun LstDelSame (lst / x nl)
(foreach x lst
请参考http://bbs.mjtd.com/forum.php?mod=viewthread&tid=108795&highlight=%B4%F8%C8%DD%B2%EE (defun ptdelsame(l1 rcz / l2)
(while l1
(setq l2 (cons(car l1) l2)
l1 (vl-remove-if'(lambda (x)(equal(car l1) x rcz))(cdr l1)))
)
(reverse l2)
)
不是我写的,在论坛上面找的,和黄大师的写法不一样,用法相同。 本帖最后由 hn10183051 于 2024-6-17 15:12 编辑
自贡黄明儒 发表于 2024-6-17 14:32
请参考http://bbs.mjtd.com/forum.php?mod=viewthread&tid=108795&highlight=%B4%F8%C8%DD%B2%EE
试用了还是一样没有变法,容差我也设置的1 他这个不是delsame,是用第二个点做标记遍历判断并删除重复的
(foreach abc PointList
(or (vl-position (cadr abc) Check)
(setq Check (cons (cadr abc) Check)
rtn (cons abc rtn)
)
)
)
(reverse rtn)
kozmosovia 发表于 2024-6-17 15:48
他这个不是delsame,是用第二个点做标记遍历判断并删除重复的
对,但是你这个函数用不了! 把每一项转为字符串就好了,构成一个新的辅助列表。用辅助列表判断是否重复。这个也是我在计算大坐标值遇到了同样的问题,有些坐标看着一样,但是不能去重。 大神,大师帮帮忙
页:
[1]
2