明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 280|回复: 5

删除超短,合并重叠,近邻平行的(lwpolyline,polyline)

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-11-16 06:39 编辑

有些问题,很重要,却没有完美解决办法,所以,对于真正设计者来说呢,总是个心病!甚至十年,几十年的都在记挂着,
总观众多的二开,甚至xyz ,画的图,也全是垃圾满篇,实体压落,这可能大家觉得没事,就该这样子,那是你对自己要求不高,或你根本就不知道,一套干净,标准的图纸是什么样的(实际上现实就不存在万分之一,哪之一就是我画的图),巧了的是我画图32年,对垃圾图纸是难以接收的,所以吗.....
不多说了,三领哪,对这个问题一直在留心,也一直在探讨,下面发布下最近研究点东西,友情提示:请不要说代码不能运行,哪当然不能,不全吗!
函数很明确,你难道不会自己替代?你的内裤呢?
  1. ;;列表中相距最远的两点表--(一级)------
  2. ;;(pmin pmax)
  3. (defun sl:furthestapart (lst)
  4.   (car (sl-ptsmaxdist lst))
  5. )
  6. ;点集中最远,最近两点表之表----(一级)-----
  7. ;返回:(最远两点 最近两点) ((p1 p2) (p3 p4))
  8. (defun sl-ptsmaxdist (ptlst / pt n d plst maxd mind maxl minl)
  9.   (if (or (= (length ptlst) 1)
  10.         (and (= (length ptlst) 2) (= (distance (car ptlst) (cadr ptlst)) 0))
  11.       )
  12.     (setq maxl (list (car ptlst) (car ptlst)) minl maxl)
  13.     (progn
  14.       (setq minl (list (car ptlst) (cadr ptlst)) maxd 0 mind (apply 'distance minl))
  15.       (while (setq pt (car ptlst) ptlst (cdr ptlst))
  16.         (setq plst ptlst)
  17.         (while plst
  18.           (setq n (car plst) d (distance n pt))
  19.           (cond
  20.             ((< maxd d) (setq maxd d maxl (list n pt)))
  21.             ((> mind d) (setq mind d minl (list n pt)))
  22.           )
  23.           (setq plst (cdr plst))
  24.         )
  25.       )
  26.     )
  27.   )
  28.   (list maxl minl)
  29. )

  30. ;;删除超短,合并重叠,近邻平行的多段线(lwpolyline,polyline)之整理------(一级)--------
  31. ;;Modfy by SLdesign 尘缘一生  QQ:15290049
  32. (defun unduppl1 (s / j ent ent1 lst lis1 lis2 lstx lsty lstx1 lsty1 nm len0 n ss ss1 nam enam1 enam2 spt1 ept1 spt2 ept2 d1 d2 d3 d4 m ly cl lt lw sw)
  33.   ;;判断a是否在 a1至a2两点连线上
  34.   (defun slon_ent (a a1 a2)
  35.     (equal (+ (distance a1 a) (distance a a2)) (distance a1 a2) 0.0001)
  36.   )
  37.   ;;--------------------
  38.   (setq nm 0 len0 (sslength s))
  39.   ;;删除长度小于 0.01的多段线
  40.   (repeat (setq n (sslength s))
  41.     (setq nam (ssname s (setq n (1- n))))
  42.     (if (<= (vlax-curve-getdistatparam nam (vlax-curve-getendparam nam)) 0.01)
  43.       (progn
  44.         (ssdel nam s)
  45.         (entdel nam)
  46.         (setq nm (1+ nm))
  47.       )
  48.     )
  49.   )
  50.   ;删除完全重合------
  51.   ;三领SLdesign 提示:此段程序可占时间
  52.   (setq ss1 (ssadd))
  53.   (setq n 0)  ;初始化变量,设置i为1的原因是方便j取值
  54.   (repeat (1- (sslength s))  ;外循环开始,循环次数为多段线个数减1
  55.     (setq ent (entget (ssname s n)))  ;得到DXF
  56.     (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent)))  ;提取点表
  57.     (setq lstx (mapcar 'car (vl-sort lst '(lambda (a b) (< (car a) (car b))))))  ;按照X坐标从小到大排序并提取X坐标组成表
  58.     (setq lsty (mapcar 'cadr (vl-sort lst '(lambda (a b) (< (cadr a) (cadr b))))))  ;按照Y坐标从小到大排序并提取Y坐标组成表
  59.     (setq n (1+ n))
  60.     (setq j n)     ;j的值为n
  61.     (repeat (- (sslength s) n)  ;内循坏开始,循坏次数为多段线个数减去i
  62.       (setq nam (ssname s j))
  63.       (setq ent1 (entget nam))   ;得到DXF
  64.       (setq lis1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent1))) ;提取点表
  65.       (setq lstx1 (mapcar 'car (vl-sort lis1 '(lambda (a b) (< (car a) (car b)))))) ;同样按照X坐标从小到大排序并提取X坐标组成表
  66.       (setq lsty1 (mapcar 'cadr (vl-sort lis1 '(lambda (a b) (< (cadr a) (cadr b)))))) ;同样按照Y坐标从小到大排序并提取Y坐标组成表
  67.       (if (and (equal lstx lstx1 1e-5) (equal lsty lsty1 1e-5)) ;对比两个X和两个Y的表看是否一致,一致就删除
  68.         (progn (ssadd nam ss1) (setq nm (1+ nm)))
  69.       )
  70.       (setq j (1+ j))
  71.     )
  72.   )
  73.   (setq s (ssdiff s ss1) n -1)
  74.   (while (setq nam (ssname ss1 (setq n (1+ n))))
  75.     (entdel nam)
  76.   )
  77.   ;;去除带凸度,不共线的----
  78.   (setq ss (ssadd) n -1)
  79.   (while (setq nam (ssname s (setq n (1+ n))))
  80.     (if (and (not (checkarc nam)) (sl:pts-onLine (get-pl-pt nam)))
  81.       (ssadd nam ss)
  82.     )
  83.   )
  84.   ;合并连接重复,紧邻共线的 LWPOLYLINE,POLYLINE-----
  85.   (setq n -1)
  86.   (while (setq enam1 (ssname ss (setq n (1+ n))))
  87.     (setq lis1 (get-pl-pt enam1))
  88.     (setq lis1 (sl:furthestapart lis1) spt1 (car lis1) ept1 (last lis1))
  89.     (if (setq s (ssget "CP"
  90.                   (list
  91.                     (polar spt1 (angle ept1 spt1) 4.5)
  92.                     (polar ept1 (- (angle spt1 ept1) pi4) 4.5)
  93.                     (polar ept1 (+ (angle spt1 ept1) pi4) 4.5)
  94.                   )
  95.                   '((0 . "LWPOLYLINE,POLYLINE"))
  96.                 )
  97.         )
  98.       (progn
  99.         (if (ssmemb enam1 s) (ssdel enam1 s)) ;;次选择集先删除主线
  100.         (if (> (sslength s) 0) ;确保ss存在实体
  101.           (progn
  102.             (setq ss1 (ssadd))
  103.             (repeat (setq j (sslength s))
  104.               (setq nam (ssname s (setq j (1- j))))
  105.               (if (ssmemb nam ss) ;如果在主选择集内处理,所以确ss1里,只有不带凸度,共线的直段线
  106.                 (ssadd nam ss1)
  107.               )
  108.             ) ;以上确保次集 ss1 正确
  109.             (setq m -1)
  110.             (if (> (sslength ss1) 0) ;如果ss1还存在实体
  111.               (while (setq enam2 (ssname ss1 (setq m (1+ m)))) ;while 2
  112.                 (setq lis2 (get-pl-pt enam2))
  113.                 (setq lis2 (sl:furthestapart lis2) spt2 (car lis2) ept2 (last lis2) d1 (distance spt1 spt2)
  114.                   d2 (distance spt1 ept2) d3 (distance ept1 spt2) d4 (distance ept1 ept2) sw nil
  115.                 )
  116.                 (cond
  117.                   ((and (slon_ent spt2 spt1 ept1) (slon_ent ept2 spt1 ept1))  ;;次线落在主线上
  118.                     (entdel enam2)
  119.                     (setq nm (1+ nm))
  120.                   )
  121.                   ((and (slon_ent spt1 spt2 ept2) (slon_ent ept1 spt2 ept2)) ;;主线落在次线上
  122.                     (entdel enam1)
  123.                     (setq enam1 enam2 spt1 spt2 ept1 ept2);次线转主线
  124.                     (setq nm (1+ nm))
  125.                   )
  126.                 )
  127.                 (if (sl:pts-onLine (list spt1 ept1 spt2 ept2)) ;两线共线
  128.                   (cond
  129.                     ((slon_ent spt2 spt1 ept1) ;次线起点落在主线时
  130.                       (setq sw t) ;也就是给个开关罢了
  131.                     )
  132.                     ((slon_ent ept2 spt1 ept1) ;次线终点落在主线时
  133.                       (setq sw t)
  134.                     )
  135.                     ((< (min d1 d2 d3 d4) 0.03) ;离开的两线,但两线之间最短距离小于0.03!
  136.                       (setq sw t)
  137.                     )
  138.                   )
  139.                   ;不共线的平行但离得很近的线也合并为一
  140.                   (if (and    ;(not (sl-Curveinters enam1 enam2 3)) ;无有交点,平行方法一
  141.                         (equal (angle-sharp (angle spt1 ept1)) (angle-sharp (angle spt2 ept2)) 0.01);角度判断的平行方法二
  142.                         (< (min d1 d2 d3 d4) 0.01) ;两线之间最短距离小于0.01!
  143.                       )
  144.                     (setq sw t)
  145.                   )
  146.                 )
  147.                 (if sw
  148.                   (progn
  149.                     (setq lst (sl:furthestapart (list spt1 ept1 spt2 ept2)))
  150.                     (setq spt1 (car lst) ept1 (last lst)) ;下次扩展延伸->go
  151.                     (setq ly (dxf1 enam2 8) cl (sl-getcolor enam2) lw (linwind enam2) lt (sl-linetype enam2))
  152.                     (entdel enam1)
  153.                     (entdel enam2)
  154.                     (slch:lwpolyline (list spt1 ept1) nil lw ly cl nil)
  155.                     (sl:chnam-lintp (entlast) lt)
  156.                     (setq enam1 (entlast))
  157.                     (setq nm (1+ nm))
  158.                   )
  159.                 )
  160.               );end while 2
  161.             );if
  162.           )
  163.         )
  164.       )
  165.     ) ;if
  166.   );end while
  167.   (prompt (strcat " 处理" (itoa len0) "个*POLYLINE  消去" (itoa nm) "个"))
  168.   (princ)
  169. )
  170. ;;测试---------
  171. (defun c:tt (/ ss)
  172.   (if (setq ss (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
  173.     (unduppl1 ss)
  174.   )
  175. )

SLdesign 三领设计 V3.0  永久测试下载地址:

通过百度网盘分享的文件:三领设计
链接:https://pan.baidu.com/s/1c-bZXuiCUXsCQyghmhaB3Q
提取码:7t06




垃圾问题之其他:
1:重叠的圆
2:重叠的文字
3:重叠的块
4:超短的线类
........
本坛广有程式存在-->可淘之




本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 前天 22:37 | 显示全部楼层
指望程序来处理各种画图不规范?有这精神还是看点书学习对各位更有帮助。
回复 支持 1 反对 0

使用道具 举报

发表于 3 天前 | 显示全部楼层
很好→很棒!很好~很棒!!很好……很棒!!!
回复 支持 反对

使用道具 举报

发表于 前天 15:40 | 显示全部楼层
赞赞赞。越智能,要判定的情况就越多,代码也就越多,总有不在判定中的情况。。
回复 支持 反对

使用道具 举报

发表于 前天 16:33 | 显示全部楼层
很实用,高效
回复 支持 反对

使用道具 举报

发表于 前天 22:55 来自手机 | 显示全部楼层
谢谢分享,谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 04:30 , Processed in 0.161498 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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