重慶崽兒 发表于 2015-6-16 22:54:26

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

(defun c:tt()
(setq ss (ssget '((0 . "lwpolyline"))));选择多段线
(setq i 1 lst nil);初始化变量,设置i为1的原因是方便j取值
(repeat (- (sslength ss) 1);外循环开始,循环次数为多段线个数减1
    (setq en (entget (ssname ss (- i 1))));得到DXF
    (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) en)));提取点表
    (setq lst_ys_x (mapcar 'car (vl-sort lst '(lambda (e1 e2) (< (car e1) (car e2))))));按照X坐标从小到大排序并提取X坐标组成表
    (setq lst_ys_y (mapcar 'cadr (vl-sort lst '(lambda (e1 e2) (< (cadr e1) (cadr e2))))));按照Y坐标从小到大排序并提取Y坐标组成表
    (setq j 0);初始化j为0
    (setq j (+ j i));j的值为i+j
    (repeat (- (sslength ss) i);内循坏开始,循坏次数为多段线个数减去i
      (setq en_1 (entget (ssname ss j)));得到DXF
      (setq lst_1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) en_1)));提取点表
      (setq lst_ys_x_1 (mapcar 'car (vl-sort lst_1 '(lambda (e1 e2) (< (car e1) (car e2))))));同样按照X坐标从小到大排序并提取X坐标组成表
      (setq lst_ys_y_1 (mapcar 'cadr (vl-sort lst_1 '(lambda (e1 e2) (< (cadr e1) (cadr e2))))));同样按照Y坐标从小到大排序并提取Y坐标组成表
      (if (and (equal lst_ys_x lst_ys_x_1 1e-5) (equal lst_ys_y lst_ys_y_1 1e-5));对比两个X和两个Y的表看是否一致,一致就删除
      (vl-catch-all-apply 'vla-delete (list (vlax-ename->vla-object (ssname ss j))));因为已经删除的线会重复删除,所以加错误处理
      )
      (setq j (1+ j))
    );内循环结束
    (setq i (1+ i))
);外循坏结束
(princ)
)

ZZXXQQ 发表于 2015-6-17 08:35:25

(defun c:tt()
(setq ss (ssget '((0 . "LWPOLYLINE"))));选择多段线
(setq ress (ssadd))
(setq i 0);初始化变量,设置i为1的原因是方便j取值
(repeat (1- (sslength ss));外循环开始,循环次数为多段线个数减1
    (setq ent (entget (ssname ss i)));得到DXF
    (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent)));提取点表
    (setq lstx (mapcar 'car (vl-sort lst '(lambda (a b) (< (car a) (car b))))));按照X坐标从小到大排序并提取X坐标组成表
    (setq lsty (mapcar 'cadr (vl-sort lst '(lambda (a b) (< (cadr a) (cadr b))))));按照Y坐标从小到大排序并提取Y坐标组成表
    (setq i (1+ i))
    (setq j i);j的值为i
    (repeat (- (sslength ss) i);内循坏开始,循坏次数为多段线个数减去i
      (setq en (ssname ss j))
      (setq ent1 (entget en);得到DXF
      (setq lst1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent1)));提取点表
      (setq lsx1 (mapcar 'car (vl-sort lst1 '(lambda (a b) (< (car a) (car b))))));同样按照X坐标从小到大排序并提取X坐标组成表
      (setq lsty1 (mapcar 'cadr (vl-sort lst1 '(lambda (a b) (< (cadr a) (cadr b))))));同样按照Y坐标从小到大排序并提取Y坐标组成表
      (if (and (equal lstx lstx1 1e-5) (equal lsty lsty1 1e-5));对比两个X和两个Y的表看是否一致,一致就删除
      (ssadd en ress)
;      (vl-catch-all-apply 'vla-delete (list (vlax-ename->vla-object en)));因为已经删除的线会重复删除,所以加错误处理
      )
      (setq j (1+ j))
    );内循环结束
);外循坏结束
(if (> (sslength ress) 0) (command "_.ERASE" ress ""))
(princ)
)

重慶崽兒 发表于 2015-6-17 22:50:41

ZZXXQQ 发表于 2015-6-17 08:35 static/image/common/back.gif


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

yjc532 发表于 2015-6-23 20:18:42

已经测试了,非常不错,以前只有删除直线、弧线、圆的程序,还没有多段线的程序。

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

那就完美了

ferious 发表于 2023-11-10 10:17:20

yjc532 发表于 2015-6-23 20:18
已经测试了,非常不错,以前只有删除直线、弧线、圆的程序,还没有多段线的程序。

我有两个建议:


只能删pl,直线l不行
页: [1]
查看完整版本: 带容差删除重复多段线,写得不好,总感觉太臃肿,请各位看官指点