明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1517|回复: 4

[源码] 带容差删除重复多段线,写得不好,总感觉太臃肿,请各位看官指点

[复制链接]
发表于 2015-6-16 22:54 | 显示全部楼层 |阅读模式
  1. (defun c:tt()
  2.   (setq ss (ssget '((0 . "lwpolyline"))));选择多段线
  3.   (setq i 1 lst nil);初始化变量,设置i为1的原因是方便j取值
  4.   (repeat (- (sslength ss) 1);外循环开始,循环次数为多段线个数减1
  5.     (setq en (entget (ssname ss (- i 1))));得到DXF
  6.     (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) en)));提取点表
  7.     (setq lst_ys_x (mapcar 'car (vl-sort lst '(lambda (e1 e2) (< (car e1) (car e2))))));按照X坐标从小到大排序并提取X坐标组成表
  8.     (setq lst_ys_y (mapcar 'cadr (vl-sort lst '(lambda (e1 e2) (< (cadr e1) (cadr e2))))));按照Y坐标从小到大排序并提取Y坐标组成表
  9.     (setq j 0);初始化j为0
  10.     (setq j (+ j i));j的值为i+j
  11.     (repeat (- (sslength ss) i);内循坏开始,循坏次数为多段线个数减去i
  12.       (setq en_1 (entget (ssname ss j)));得到DXF
  13.       (setq lst_1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) en_1)));提取点表
  14.       (setq lst_ys_x_1 (mapcar 'car (vl-sort lst_1 '(lambda (e1 e2) (< (car e1) (car e2))))));同样按照X坐标从小到大排序并提取X坐标组成表
  15.       (setq lst_ys_y_1 (mapcar 'cadr (vl-sort lst_1 '(lambda (e1 e2) (< (cadr e1) (cadr e2))))));同样按照Y坐标从小到大排序并提取Y坐标组成表
  16.       (if (and (equal lst_ys_x lst_ys_x_1 1e-5) (equal lst_ys_y lst_ys_y_1 1e-5));对比两个X和两个Y的表看是否一致,一致就删除
  17.         (vl-catch-all-apply 'vla-delete (list (vlax-ename->vla-object (ssname ss j))));因为已经删除的线会重复删除,所以加错误处理
  18.       )
  19.       (setq j (1+ j))
  20.     );内循环结束
  21.     (setq i (1+ i))
  22.   );外循坏结束
  23.   (princ)
  24. )
发表于 2015-6-17 08:35 | 显示全部楼层
  1. (defun c:tt()
  2.   (setq ss (ssget '((0 . "LWPOLYLINE"))));选择多段线
  3.   (setq ress (ssadd))
  4.   (setq i 0);初始化变量,设置i为1的原因是方便j取值
  5.   (repeat (1- (sslength ss));外循环开始,循环次数为多段线个数减1
  6.     (setq ent (entget (ssname ss i)));得到DXF
  7.     (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent)));提取点表
  8.     (setq lstx (mapcar 'car (vl-sort lst '(lambda (a b) (< (car a) (car b))))));按照X坐标从小到大排序并提取X坐标组成表
  9.     (setq lsty (mapcar 'cadr (vl-sort lst '(lambda (a b) (< (cadr a) (cadr b))))));按照Y坐标从小到大排序并提取Y坐标组成表
  10.     (setq i (1+ i))
  11.     (setq j i);j的值为i
  12.     (repeat (- (sslength ss) i);内循坏开始,循坏次数为多段线个数减去i
  13.       (setq en (ssname ss j))
  14.       (setq ent1 (entget en);得到DXF
  15.       (setq lst1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent1)));提取点表
  16.       (setq lsx1 (mapcar 'car (vl-sort lst1 '(lambda (a b) (< (car a) (car b))))));同样按照X坐标从小到大排序并提取X坐标组成表
  17.       (setq lsty1 (mapcar 'cadr (vl-sort lst1 '(lambda (a b) (< (cadr a) (cadr b))))));同样按照Y坐标从小到大排序并提取Y坐标组成表
  18.       (if (and (equal lstx lstx1 1e-5) (equal lsty lsty1 1e-5));对比两个X和两个Y的表看是否一致,一致就删除
  19.         (ssadd en ress)
  20. ;        (vl-catch-all-apply 'vla-delete (list (vlax-ename->vla-object en)));因为已经删除的线会重复删除,所以加错误处理
  21.       )
  22.       (setq j (1+ j))
  23.     );内循环结束
  24.   );外循坏结束
  25.   (if (> (sslength ress) 0) (command "_.ERASE" ress ""))
  26.   (princ)
  27. )
 楼主| 发表于 2015-6-17 22:50 | 显示全部楼层
ZZXXQQ 发表于 2015-6-17 08:35

谢谢Z版  好思路
刚才调试了一下,发现少了个括号,还有就是判断那里变量名少写了个“t”
非常感谢Z版
这个是改后的:
  1. (defun c:tt()
  2.   (setq ss (ssget '((0 . "LWPOLYLINE"))));选择多段线
  3.   (setq ress (ssadd))
  4.   (setq i 0);初始化变量,设置i为1的原因是方便j取值
  5.   (repeat (1- (sslength ss));外循环开始,循环次数为多段线个数减1
  6.     (setq ent (entget (ssname ss i)));得到DXF
  7.     (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent)));提取点表
  8.     (setq lstx (mapcar 'car (vl-sort lst '(lambda (a b) (< (car a) (car b))))));按照X坐标从小到大排序并提取X坐标组成表
  9.     (setq lsty (mapcar 'cadr (vl-sort lst '(lambda (a b) (< (cadr a) (cadr b))))));按照Y坐标从小到大排序并提取Y坐标组成表
  10.     (setq i (1+ i))
  11.     (setq j i);j的值为i
  12.     (repeat (- (sslength ss) i);内循坏开始,循坏次数为多段线个数减去i
  13.       (setq en (ssname ss j))
  14.       (setq ent1 (entget en));得到DXF
  15.       (setq lst1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent1)));提取点表
  16.       (setq lstx1 (mapcar 'car (vl-sort lst1 '(lambda (a b) (< (car a) (car b))))));同样按照X坐标从小到大排序并提取X坐标组成表
  17.       (setq lsty1 (mapcar 'cadr (vl-sort lst1 '(lambda (a b) (< (cadr a) (cadr b))))));同样按照Y坐标从小到大排序并提取Y坐标组成表
  18.       (if (and (equal lstx lstx1 1e-5) (equal lsty lsty1 1e-5));对比两个X和两个Y的表看是否一致,一致就删除
  19.         (ssadd en ress)
  20. ;        (vl-catch-all-apply 'vla-delete (list (vlax-ename->vla-object en)));因为已经删除的线会重复删除,所以加错误处理
  21.       )
  22.       (setq j (1+ j))
  23.     );内循环结束
  24.   );外循坏结束
  25.   (if (> (sslength ress) 0) (command "_.ERASE" ress ""))
  26.   (princ)
  27. )
发表于 2015-6-23 20:18 | 显示全部楼层
已经测试了,非常不错,以前只有删除直线、弧线、圆的程序,还没有多段线的程序。

我有两个建议:
1、增加删除重叠   但不等长的多段线
2、增加设置两个多段线距离非常小的情况下也能删除的功能(这个间距可以由自己设定)

那就完美了
发表于 2023-11-10 10:17 | 显示全部楼层
yjc532 发表于 2015-6-23 20:18
已经测试了,非常不错,以前只有删除直线、弧线、圆的程序,还没有多段线的程序。

我有两个建议:

只能删pl,直线l不行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 21:42 , Processed in 0.207768 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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