明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 352|回复: 4

[经验] 删除重复实体(SLdesign V3.0集成)

[复制链接]
发表于 昨天 10:39 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2025-4-24 10:53 编辑

关于删除重复实体,本坛不少代码,哪么,在使用过程中,不断完善代码,
由于是集成的,难以全部源码展示,运行需挂SLdesign;但原理是最主要的思想,展示以便讨论,
  1. ;Modify By SLdesign V3.0 (三领设计 V3.0)
  2. ;By 尘缘一生  QQ:15290049  2025,10,24
  3. ;;图元合并删除,合并----【开始】------c:duprem
  4. (defun c:tt (/ ss)
  5.   (if (setq ss (ssget '((0 . "LINE,*P*LINE,TEXT,MTEXT,TCH_TEXT,TCH_MTEXT,CIRCLE,INSERT"))))
  6.     (ssduppe ss)
  7.   )
  8. )
  9. ;;(删除选择集中重叠的线,多段线,圆,块,文字)----(一级)----
  10. (defun ssduppe (ss / name lis lw ly cl lt tp sline slinex scircle sinsert stxt n ss1 ss2 ss3)
  11.   (_undo1)
  12.   (setq sline (ssadd) slinex (ssadd) scircle (ssadd) sinsert (ssadd) stxt (ssadd) ss1 (ssadd) ss2 (ssadd) ss3 (ssadd) n -1)
  13.   (while (setq name (ssname ss (setq n (1+ n))))
  14.     (setq tp (dxf1 name 0))
  15.     (cond
  16.       ((= tp "LINE")
  17.         (ssadd name sline)
  18.       )
  19.       ((= tp "CIRCLE")
  20.         (ssadd name scircle)
  21.       )
  22.       ((= tp "INSERT")
  23.         (ssadd name sinsert)
  24.       )
  25.       ((member tp '("TEXT" "MTEXT" "TCH_TEXT" "TCH_MTEXT"))
  26.         (ssadd name stxt)
  27.       )
  28.       ((member tp '("LWPOLYLINE" "POLYLINE"))
  29.         (if (> (vlax-curve-getdistatparam name (vlax-curve-getendparam name)) 0.01)
  30.           (progn
  31.             (setq lis (get-pl-pt name) ly (dxf1 name 8) cl (sl-getcolor name) lw (linwind name) lt (sl-linetype name))
  32.             (if (sl:pts-onLine lis) ;共线
  33.               (progn
  34.                 (setq lis (sl:furthestapart lis))
  35.                 (if (> lw 0)
  36.                   (slch:lwpolyline (list (car lis) (cadr lis)) nil lw ly cl nil)
  37.                   (fy_lineformat (makeline (car lis) (cadr lis)) ly lt nil cl)
  38.                 )
  39.                 (sl:chnam-lintp (entlast) lt)
  40.                 (ssadd (entlast) slinex)
  41.                 (ssadd name ss1);->去删除
  42.               )
  43.               (if (= tp "LWPOLYLINE")
  44.                 (ssadd name ss2)
  45.                 (progn
  46.                   (if (sl:isClosed name) ;闭合
  47.                     (slch:lwpolyline lis t lw ly cl 1.0)
  48.                     (slch:lwpolyline lis nil lw ly cl 1.0)
  49.                   )
  50.                   (sl:chnam-lintp (entlast) lt)
  51.                   (ssadd (entlast) ss2)
  52.                   (ssadd name ss1);->去删除
  53.                 )
  54.               )
  55.             )
  56.           )
  57.           (ssadd name ss1);->去删除
  58.         )
  59.       )
  60.     )
  61.   )
  62.   ;先处理直线集
  63.   (setq n -1)
  64.   (if (> (sslength sline) 0)
  65.     (while (setq name (ssname sline (setq n (1+ n))))
  66.       (if (<= (vlax-curve-getdistatparam name (vlax-curve-getendparam name)) 0.01)
  67.         (ssadd name ss1) ;->去删除
  68.         (ssadd name ss3) ;->去处理完全重合
  69.       )
  70.     )
  71.   )
  72.   ;删除ss1
  73.   (setq n -1)
  74.   (if (> (sslength ss1) 0)
  75.     (while (setq name (ssname ss1 (setq n (1+ n)))) (entdel name))
  76.   )
  77.   (if (> (sslength ss3) 1) (setq ss3 (undupll ss3))) ;去除完全重合的LINE
  78.   ;处理后ss3加入slinex ->
  79.   (setq n -1)
  80.   (if (> (sslength ss3) 0)
  81.     (while (setq name (ssname ss3 (setq n (1+ n)))) (ssadd name slinex))
  82.   )
  83.   ;分类处理
  84.   (if (> (sslength scircle) 1) (undup-cir scircle)) ;圆
  85.   (if (> (sslength stxt) 1) (deladtxt stxt)) ;文字
  86.   (if (> (sslength sinsert) 1) (congfukuai sinsert)) ;块
  87.   (if (> (sslength slinex) 0) (undupplx slinex)) ;线类
  88.   (if (> (sslength ss2) 1) (duplwpoly ss2)) ;删除完全重复的LWPOLYLINE
  89.   (_undo2)
  90. )
  91. ;完全重线line消除----(一级)--------
  92. ;返回处理后剩余选择集
  93. (defun undupll (s / lst n pt10 pt11 lst_new enam a nm)
  94.   (setq lst '() n 0 nm 0)
  95.   (repeat (sslength s)
  96.     (setq enam (ssname s n) pt10 (dxf1 enam 10) pt11 (dxf1 enam 11))
  97.     (setq lst (cons (list enam pt10 pt11) lst))
  98.     (setq n (1+ n))
  99.   )
  100.   (while lst
  101.     (setq a  (car lst) lst (cdr lst))
  102.     (setq lst_new '())
  103.     (foreach n lst
  104.       (if  (or (equal (cdr a) (cdr n) 0.01) (equal (cdr a) (reverse (cdr n)) 0.01))
  105.         (progn
  106.           (ssdel (car n) s)
  107.           (entdel (car n)) ;_删除实体
  108.           (setq nm (1+ nm))
  109.         )
  110.         (setq lst_new (cons n lst_new))
  111.       )
  112.     )
  113.     (setq lst lst_new)
  114.   )
  115.   (if (> nm 0)
  116.     (prompt
  117.       (strcat
  118.         (slmsg "删除" "" "Delete")
  119.         (itoa nm)
  120.         (slmsg "个完全重合LINE" "ЧLINE" "Num Completely overlapping LINE")
  121.       )
  122.     )
  123.   )
  124.   s
  125. )
  126. ;删除完全重合的LWPOLYLINE----(一级)--------
  127. (defun duplwpoly (ss / s n j m lstx lsty lstx1 lsty1 nam ent ent1 lst lis1)
  128.   (setq s (ssadd))
  129.   (setq n 0)  ;初始化变量,设置i为1的原因是方便j取值
  130.   (repeat (1- (sslength ss))  ;外循环开始,循环次数为多段线个数减1
  131.     (setq ent (entget (ssname ss n)))  ;得到DXF
  132.     (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent)))  ;提取点表
  133.     (setq lstx (mapcar 'car (vl-sort lst '(lambda (a b) (< (car a) (car b))))))  ;按照X坐标从小到大排序并提取X坐标组成表
  134.     (setq lsty (mapcar 'cadr (vl-sort lst '(lambda (a b) (< (cadr a) (cadr b))))))  ;按照Y坐标从小到大排序并提取Y坐标组成表
  135.     (setq n (1+ n))
  136.     (setq j n)  ;j的值为n
  137.     (repeat (- (sslength ss) n)  ;内循坏开始,循坏次数为多段线个数减去i
  138.       (setq nam (ssname ss j))
  139.       (setq ent1 (entget nam))   ;得到DXF
  140.       (setq lis1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent1))) ;提取点表
  141.       (setq lstx1 (mapcar 'car (vl-sort lis1 '(lambda (a b) (< (car a) (car b)))))) ;同样按照X坐标从小到大排序并提取X坐标组成表
  142.       (setq lsty1 (mapcar 'cadr (vl-sort lis1 '(lambda (a b) (< (cadr a) (cadr b)))))) ;同样按照Y坐标从小到大排序并提取Y坐标组成表
  143.       (if (and (equal lstx lstx1 1e-5) (equal lsty lsty1 1e-5)) ;对比两个X和两个Y的表看是否一致,一致就删除
  144.         (ssadd nam s)
  145.       )
  146.       (setq j (1+ j))
  147.     )
  148.   )
  149.   (if (> (setq m (sslength s)) 0)
  150.     (progn
  151.       (setq n -1)
  152.       (while (setq nam (ssname s (setq n (1+ n)))) (entdel nam))
  153.       (prompt
  154.         (strcat
  155.           (slmsg "删除" "" "Delete")
  156.           (itoa m)
  157.           (slmsg "个完全重合LWPOLYLINE" "ЧLWPOLYLINE" "Num Completely overlapping LWPOLYLINE")
  158.         )
  159.       )
  160.     )
  161.   )
  162. )
  163. ;;合并重叠,近邻共线或平行的(line,lwpolyline,polyline)-----(一级)--------
  164. ;;ss 直段共线的 *LINE 选择集
  165. (defun undupplx (ss / lisn1 lisn2 lst lis1 lis2 nm len0 n s ss1 nam enam1 enam2 spt1 ept1 spt2 ept2 d1 d2 d3 d4 ly cl lt lt1 lt2 lw a a1 a2)
  166.   ;;判断点a是否在 a1至a2两点连线上
  167.   (defun slon_ent (a a1 a2)
  168.     (equal (+ (distance a1 a) (distance a a2)) (distance a1 a2) 0.0001)
  169.   )
  170.   ;;--------------------
  171.   (setq nm 0 len0 (sslength ss) lisn1 (ss-enlst ss))
  172.   (while (setq enam1 (car lisn1))
  173.     (setq lis1 (getpt (ssadd enam1)))
  174.     (setq lis1 (sl:furthestapart lis1) spt1 (car lis1) ept1 (last lis1))
  175.     (if (setq s (ssget "CP"
  176.                   (list
  177.                     (polar spt1 (angle ept1 spt1) 4.5)
  178.                     (polar ept1 (- (angle spt1 ept1) pi4) 4.5)
  179.                     (polar ept1 (+ (angle spt1 ept1) pi4) 4.5)
  180.                   )
  181.                   '((0 . "LINE,LWPOLYLINE,POLYLINE"))
  182.                 )
  183.         )
  184.       (progn
  185.         (if (ssmemb enam1 s) (ssdel enam1 s)) ;;次选择集先删除主线enam1
  186.         (if (> (sslength s) 0) ;确保s存在实体
  187.           (progn
  188.             (setq ss1 (ssadd))
  189.             (repeat (setq n (sslength s))
  190.               (setq nam (ssname s (setq n (1- n))))
  191.               (if (ssmemb nam ss)
  192.                 (ssadd nam ss1)
  193.               )
  194.             ) ;以上确保次集ss1属于ss集内的,确保共线集
  195.             (if (> (sslength ss1) 0) ;如果ss1还存在实体
  196.               (progn
  197.                 (setq lisn2 (ss-enlst ss1))
  198.                 (while (setq enam2 (car lisn2)) ;while 2 ,注ename2 也是lisn1的实体且是共线的
  199.                   (setq lis2 (getpt (ssadd enam2)))
  200.                   (setq lis2 (sl:furthestapart lis2) spt2 (car lis2) ept2 (last lis2) d1 (distance spt1 spt2)
  201.                     d2 (distance spt1 ept2) d3 (distance ept1 spt2) d4 (distance ept1 ept2)
  202.                   )
  203.                   (if (or
  204.                         (and (slon_ent spt2 spt1 ept1) (slon_ent ept2 spt1 ept1)) ;;次线落在主线上
  205.                         (and (slon_ent spt1 spt2 ept2) (slon_ent ept1 spt2 ept2)) ;;主线落在次线上
  206.                         (and
  207.                           (sl:pts-onLine (list spt1 ept1 spt2 ept2)) ;两线共线
  208.                           (or
  209.                             (slon_ent spt2 spt1 ept1) ;次线起点落在主线时
  210.                             (slon_ent ept2 spt1 ept1) ;次线终点落在主线时
  211.                             (< (min d1 d2 d3 d4) 0.03) ;离开的两线,但两线之间最短距离小于0.03!
  212.                           )
  213.                         )
  214.                         (and ;平行但离得很近的线也合并为一
  215.                           (equal (angle-sharp (angle spt1 ept1)) (angle-sharp (angle spt2 ept2)) 0.01);角度判断的平行方法二
  216.                           (< (min d1 d2 d3 d4) 0.01) ;两线之间最短距离小于0.01!
  217.                         )
  218.                       )
  219.                     (progn
  220.                       (setq lst (sl:furthestapart (list spt1 ept1 spt2 ept2)))
  221.                       (setq spt1 (car lst) ept1 (last lst)) ;下次扩展延伸->go
  222.                       (setq ly (dxf1 enam1 8) cl (sl-getcolor enam1) lw (linwind enam1) lt1 (sl-linetype enam1) lt2 (sl-linetype enam2))
  223.                       (if (= lt1 "CONTINUOUS")
  224.                         (if (= lt2 "CONTINUOUS")
  225.                           (setq lt lt1)
  226.                           (setq lt lt2)
  227.                         )
  228.                         (setq lt lt1)
  229.                       )
  230.                       (setq lisn1 (remove_ite_list lisn1 enam1))
  231.                       (setq lisn1 (remove_ite_list lisn1 enam2))
  232.                       (setq lisn2 (remove_ite_list lisn2 enam2))
  233.                       (entdel enam1)
  234.                       (entdel enam2)
  235.                       (setq nm (1+ nm))
  236.                       (if (> lw 0)
  237.                         (slch:lwpolyline (list spt1 ept1) nil lw ly cl nil)
  238.                         (fy_lineformat (makeline spt1 ept1) ly lt nil cl)
  239.                       )
  240.                       (sl:chnam-lintp (entlast) lt)
  241.                       (setq enam1 (entlast))
  242.                       (setq lisn1 (append lisn1 (list enam1))) ;合并后实体加入 lisn1 继续处理
  243.                     )
  244.                     (progn
  245.                       (setq lisn2 (cdr lisn2))
  246.                       (setq lisn1 (remove_ite_list lisn1 enam2))
  247.                     )
  248.                   )
  249.                 );end while 2
  250.               )
  251.             );if (> (sslength ss1) 0)ss1还存在实体
  252.           )
  253.         )
  254.       )
  255.     ) ;if "CP"
  256.     (setq lisn1 (cdr lisn1))
  257.   );end while
  258.   (prompt
  259.     (strcat
  260.       (slmsg " 处理" " 矪瞶" " Delete Merge")
  261.       (itoa len0)
  262.       (slmsg "个 <*LINE>" " <*LINE>" "Num <*LINE>")
  263.       (slmsg "消去" "" "Delete")
  264.       (itoa nm)
  265.       (slmsg "个" "" "Num")
  266.     )
  267.   )
  268.   (princ)
  269. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 收起 理由
zhoupeng220 + 1 很给力!
tranque + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 昨天 12:23 | 显示全部楼层
感谢大佬分享
回复 支持 反对

使用道具 举报

发表于 昨天 19:13 | 显示全部楼层
多谢尘缘总分享
回复 支持 反对

使用道具 举报

发表于 昨天 19:48 | 显示全部楼层
过得有点快
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
尘佬穿越回来的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-25 10:37 , Processed in 0.193732 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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