删除点表中重复的点遇到的问题
本帖最后由 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: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: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 高效查找表中重复元素及去重复
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)) 查到的版主在另一个帖子的回复
vl-remove只能删除具有 = 概念的子项,而不能删除 equal 概念的子项
http://bbs.mjtd.com/forum.php?mo ... highlight=vl-remove
找到了一个退而求其次的解决方法降低点表的精度
本帖最后由 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))))
感谢感谢,如果要把相同的圆心的圆弧找出来,要怎么找。找出来就好办,重新画个圆弧,然后删掉原来的圆弧,达到圆弧双线变单线的效果。 gisshow 发表于 2024-1-25 12:55
感谢感谢 tomonkey239 发表于 2024-1-25 13:55
感谢感谢,如果要把相同的圆心的圆弧找出来,要怎么找。找出来就好办,重新画个圆弧,然后删掉原来的 ...
不知道你的具体要求是什么
如果所有同心圆都有两个半径 且两个半径相同
则删除所有同心圆 然后对每个圆心点 使用entmake创建圆 就得到单线圆了 本帖最后由 vitalgg 于 2024-1-25 14:23 编辑
tomonkey239 发表于 2024-1-25 13:55
感谢感谢,如果要把相同的圆心的圆弧找出来,要怎么找。找出来就好办,重新画个圆弧,然后删掉原来的 ...
是重复的圆弧吧。
需要同圆心 dxf10,同半径dxf40,同起点角dxf50,同终点角dxf51
这四项都相近一个限值,即可认为是重复的弧。
CAD命令 overkill 也可以
感谢分享:handshake
页:
[1]
2