明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1672|回复: 4

[函数] 怎样去除坐标表内相同的坐标?

[复制链接]
发表于 2011-6-9 00:11:33 | 显示全部楼层 |阅读模式
如题:有一坐标表ptn=((1235 255 140) (1258 230 150) (1258 230 150) (1263 262 160)),如何去掉一个(1258 230 150)坐标,结果为ptn=((1235 255 140) (1258 230 150) (1263 262 160)).请各位大侠赐教.
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-6-9 00:52:57 | 显示全部楼层
;;清理表中的重复项
(defun purge_lst (lst / n m lst1 tmplist)
  (setq tmplist '()
tmplist (cons (car lst) tmplist)
lsttmp (cutnum_lst lst 0)
  )
  (setq n (length lsttmp)
m 0
  )
  (while (/= m n)
    (setq id   '()
   lst1 (nth m lsttmp)
    )
    (foreach na tmplist
      (if (= (eq_point na lst1) nil)
(setq id (cons 0 id))
(setq id (cons 1 id))
      )
    )
    (if (= (member '1 id) nil)
      (setq tmplist (cons lst1 tmplist))
    )
    (setq m (1+ m))
  )
  (setq tmplist (reverse tmplist))
)
;;去除表中指定索引处的表项
(defun cutnum_lst (oldlst num / k templst)
  (setq k 0
templst '()
  )
  (foreach n oldlst
    (if (/= k num)
      (setq templst (cons n templst)
     k     (1+ k)
      )
    )
    (setq k (1+ k))
  )
  (setq newlst (reverse templst))
)
;;判断两点是否等
(defun eq_point (pt1 pt2)
  (if (and (equal (car pt1) (car pt2) 1e-5)
    (equal (cadr pt1) (cadr pt2) 1e-5)
      )
    t
    nil
  )
)

例子:
命令: (setq a (purge_lst  '((1235 255 140) (1258 230 150) (1258 230 150) (1263
262 160))))
((1235 255 140) (1258 230 150) (1263 262 160))
发表于 2011-6-9 01:12:26 | 显示全部楼层
本帖最后由 if 于 2011-6-9 01:13 编辑

(defun test (lst / it lst2)
(while (setq lst2 (cons (setq it (car lst)) lst2)
           lst  (vl-remove-if '(lambda (x) (equal it x 1e-6)) lst)
))
(reverse lst2)
)
------------------------------------------
(test '((1235 255 140) (1258 230 150) (1258 230 150)(1263 262 160)))
-------->
((1235 255 140) (1258 230 150) (1263 262 160))

点评

不错,简洁明了,是我想得太复杂了,看来我这个半瓶子醋还要多多学习啊。  发表于 2011-6-9 09:26
 楼主| 发表于 2011-6-9 09:22:36 | 显示全部楼层
      因才薄学浅,无法领会楼上俩位大侠的函数,现已自行解决,特别致谢俩位大侠的帮助!表内项需经排序后才能清理表中重复项.
;;清理表中的重复项
      (setq ptn  '((1235 255 140) (1258 230 150) (1258 230 150)(1263 262 160)))
      (setq n 1 ptnk '())
      (setq p1 (nth 0 ptn))
      (setq ptnk (append ptnk (list p1)))
      (repeat (- (length ptn) 1)
              (setq p2 (nth n ptn))
              (if (/= (distance p1 p2) 0.0) (setq ptnk (append ptnk (list p2))))
              (setq n (+ n 1))
              (setq p1 p2)
      )
      (setq ptn ptnk)
发表于 2011-6-9 09:29:53 | 显示全部楼层
感谢分享 < 谢谢咯! >
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-26 08:56 , Processed in 0.177960 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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