gisshow 发表于 2024-1-25 11:17:43

删除点表中重复的点遇到的问题

本帖最后由 gisshow 于 2024-1-25 11:20 编辑

;;删除表中重复元素------------------------------------------------------------------------------
(defun delsame1( biao )
(if biao
    (cons (car biao) (delsame1 (vl-remove (car biao) (cdr biao))));
);结束if
);结束defun
上面的代码来自论坛
命令: !no_lst
((378.845 90.5753 0.0) (378.845 90.5753 0.0))

命令: (delsame1 no_lst)
((378.845 90.5753 0.0) (378.845 90.5753 0.0))

命令: (= (car no_lst) (cadr no_lst))
nil

命令: (car no_lst)
(378.845 90.5753 0.0)

命令: (cadr no_lst)
(378.845 90.5753 0.0)

两个点似乎是相等的 但是无法消去重复的 是不是有精度问题 怎么解决 谢过了

tomonkey239 发表于 2024-1-25 11:44:49

本帖最后由 tomonkey239 于 2024-1-25 11:55 编辑

最近刚好在研究这个点,表问题。借楼主的平台求教一个问题;
就是想实现功能是圆弧双线的变单线:同一个圆心的,怎么把他归为一类,或者一个表里面。用consappend ,这个函数不知道怎么实(setq yx (cons yx-ls1 yx))),这个出来的怎么不是所有圆心的一个表呢?
(defun c:tt()
      (setq
                s1 (ssget    '((0 . "ARC") ) )
                s-sum (sslength s1)
                n 0
                s2 '( )
      )
      (if s1
                (progn
                        (repeat s-sum
                              (setq
                                        s-data (entget(ssname s1 n))
                                        yx-ls1(list (cdr(assoc 10 s-data)) )
                                  n (1+ n)
                        yx (cons yx-ls1 yx)
                              )
                              (print n)
                              (print yx )
                        )
                )
      )
      (princ)
)


gisshow 发表于 2024-1-25 12:55:40

本帖最后由 gisshow 于 2024-1-25 12:59 编辑

tomonkey239 发表于 2024-1-25 11:44
最近刚好在研究这个点,表问题。借楼主的平台求教一个问题;
就是想实现功能是圆弧双线的变单线:同一个圆 ...
;;获取选择圆弧的圆心表
(defun c:tt()
(setq yx_lst nil);表置空
(setq ss(ssget));选择集
(setq n(sslength ss));选择集长度
(setq i 0);计数归零
(repeat n;对选择集中每个元素
    (setq en(ssname ss i));获取图元名
    (setq el(entget en));获取数据表
    (setq e(cdr(assoc 0 el)));获取图元类型
    (if (= e "ARC");如果图元类型为圆弧
      (progn
      (setq no10 (cdr (assoc 10 el)));获取圆心点
      (setq yx_lst(cons no10 yx_lst));添加到点表
      );结束progn
    );结束if
   (setq i (+ i 1));计数+1
);结束repeat
);结束defun

llsheng_73 发表于 2024-1-25 16:42:21

高效查找表中重复元素及去重复
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=108581&fromuid=202795
(出处: 明经CAD社区)

(defun delsame(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))

(defun delsames(l1 rcz / a l l2);;带容差去重(重复过的不出现),有时处理坐标点需要考虑容差
(while(setq a(car l1)l2(vl-remove-if'(lambda (x)(equal a x rcz))(cdr l1)))
    (if(=(1+(length l2))(length l1))(setq l(cons a l)))
    (setq l1 l2))
(if(=(1+(length l2))(length l1))(setq l(cons a l)))
(reverse l))

gisshow 发表于 2024-1-25 12:39:46

查到的版主在另一个帖子的回复
vl-remove只能删除具有 = 概念的子项,而不能删除 equal 概念的子项
http://bbs.mjtd.com/forum.php?mo ... highlight=vl-remove

找到了一个退而求其次的解决方法降低点表的精度

vitalgg 发表于 2024-1-25 13:52:22

本帖最后由 vitalgg 于 2024-1-25 13:57 编辑








无需复制粘贴,在 您的 lsp 代码前加上一行代码,即可使用 上面提到的函数。
(progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))

tomonkey239 发表于 2024-1-25 13:55:12

感谢感谢,如果要把相同的圆心的圆弧找出来,要怎么找。找出来就好办,重新画个圆弧,然后删掉原来的圆弧,达到圆弧双线变单线的效果。

tomonkey239 发表于 2024-1-25 13:58:33

gisshow 发表于 2024-1-25 12:55


感谢感谢

gisshow 发表于 2024-1-25 14:05:57

tomonkey239 发表于 2024-1-25 13:55
感谢感谢,如果要把相同的圆心的圆弧找出来,要怎么找。找出来就好办,重新画个圆弧,然后删掉原来的 ...

不知道你的具体要求是什么
如果所有同心圆都有两个半径 且两个半径相同
则删除所有同心圆 然后对每个圆心点 使用entmake创建圆 就得到单线圆了

vitalgg 发表于 2024-1-25 14:21:05

本帖最后由 vitalgg 于 2024-1-25 14:23 编辑

tomonkey239 发表于 2024-1-25 13:55
感谢感谢,如果要把相同的圆心的圆弧找出来,要怎么找。找出来就好办,重新画个圆弧,然后删掉原来的 ...
是重复的圆弧吧。
需要同圆心 dxf10,同半径dxf40,同起点角dxf50,同终点角dxf51
这四项都相近一个限值,即可认为是重复的弧。

CAD命令 overkill 也可以

THZL 发表于 2024-1-25 14:39:01

感谢分享:handshake
页: [1] 2
查看完整版本: 删除点表中重复的点遇到的问题