明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1653|回复: 10

[提问] 重叠块删除程序优化

[复制链接]
发表于 2020-5-30 09:40:21 | 显示全部楼层 |阅读模式
本帖最后由 andyzha 于 2020-6-3 09:13 编辑

在论坛里找到了一个删除叠加在一起重复块的lisp,检测很完善,但是移除重复块的时候会报错,cad版本是2020,求助大神修复完善一下。源码是yjr111大神作品,只是搬运,期待完善。

  1. ;;;OO,删除重复块,注意:镜像块或不同比例相同块有中心重合同样会被认为重叠;;;;;;;;;
  2. ;;;为防止误删,建议先移动出去查看后再确认删除;;;;;;;;;;;;;;;;;;;;
  3. (defun c:oo (/ mydoc fuzz ss n ess css e1 s1 pt lst_p lst_e
  4.          t0 ksl key lstt l ep_lst move2p
  5.          movep ep_lst1 ep_lst2)
  6.   (defun *error* (msg)
  7.     (if  (wcmatch (strcase msg t) "*break,*cancel*,*exit*,*取消*")
  8.       (princ "\n程序已经被取消!")
  9.       (princ (strcat "\n" msg))
  10.     )
  11.     (if  (and css (> (sslength css)) 0)
  12.       (command "_.erase" css "")
  13.     )
  14.     (vla-EndUndoMark
  15.       (vla-get-ActiveDocument (vlax-get-acad-object))
  16.     )
  17.     (princ)
  18.   )
  19.   (setq mydoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  20.   (vla-StartUndoMark mydoc)
  21.   (setvar "CMDECHO" 0)
  22.   (setq oldosmode (getvar 'osmode)
  23.   oldorthomode(getvar 'orthomode)
  24.   )
  25.   (setvar 'osmode 0)
  26.   (setvar 'orthomode 0)
  27.   (setvar 'cecolor "1")
  28.   (prompt "\n选择需要检查的范围:")
  29.   (setq fuzz (getreal "\n请输入重叠间距,注意图纸比例!<30.0>"))
  30.   (if (not fuzz)
  31.     (setq fuzz 30.0);;;重叠点可调间距,请自行决定
  32.   )
  33.   (if (setq ss (ssget '((0 . "INSERT"))))
  34.     (progn
  35.       (setq n  0
  36.       ess  (ssadd)
  37.       css  (ssadd)
  38.       )
  39.       (setq t0 (vtime));;;;计时开始
  40.       (while (< n (sslength ss))
  41.   (setq e1  (ssname ss n)
  42.         s1  (entget e1)
  43.         p10 (cdr (assoc 10 s1))
  44.   )
  45.   (setq pt (getbound e1));;;最好不要用插入点
  46.   (if (null pt)
  47.     (princ"\n无法获取该块包围框!")
  48.     )
  49.   (if (= n 0)
  50.     (progn
  51.       (if  pt
  52.         (setq lst_p (cons pt lst_p))
  53.         (setq lst_p (cons p10 lst_p))
  54.       )
  55.       (setq lst_e (cons e1 lst_e))
  56.     )
  57.     (progn
  58.       (vl-member-if
  59.         (function
  60.     (lambda  (x)
  61.       (if
  62.         (and
  63.           (equal pt x fuzz)
  64.           (=
  65.       (cdr (assoc 2 s1))
  66.       (cdr (assoc
  67.              2
  68.              (entget (nth (vl-position x lst_p) lst_e))
  69.            )
  70.       )
  71.           )
  72.         )
  73.          (setq lstt (cons t lstt))
  74.       )
  75.     )
  76.         )
  77.         lst_p
  78.       );;;关键
  79.       (if  (member t lstt)
  80.         (progn
  81.     (setq ess (ssadd e1 ess))
  82.     (if (and pt (> l 0));;;点块为L=0
  83.       (progn
  84.       (setq ep_lst(append ep_lst (list(list pt  e1))))
  85.       (command "_.circle" pt (* 0.55 l));;;画标记圆
  86.       )
  87.       (progn
  88.       (cond((> l 0)
  89.             (setq ep_lst(append ep_lst (list(list p10  e1))))
  90.             (command "_.circle" p10 (* 0.55 l));;;画标记圆
  91.            )
  92.            ((= l 0)
  93.       (alert"\n你好运气,发现点块!")
  94.       (setq ep_lst(append ep_lst (list(list p10  e1))))
  95.             (command "_.circle" p10 10));;;画标记圆
  96.            )
  97.       )
  98.     )
  99.     (setq css (ssadd (entlast) css))
  100.     (setq lstt nil
  101.           l     nil
  102.     )
  103.         )
  104.         (progn
  105.     (if pt
  106.       (setq lst_p (cons pt lst_p))
  107.       (setq lst_p (cons p10 lst_p))
  108.     )
  109.     (setq lst_e (cons e1 lst_e))
  110.         )
  111.       )
  112.     )
  113.   )
  114.   (grtext  -2
  115.     (strcat  "程序正在运行...查找已经完成"
  116.       (rtos (* (/ n (float (sslength ss))) 100) 2 2)
  117.       "%"
  118.     )
  119.   )
  120.   (setq n (1+ n))
  121.       )
  122.       (princ (strcat "\n查找操作共耗时"
  123.          (rtos (- (vtime) t0) 2 2)
  124.          "秒。*****"
  125.        )
  126.       )
  127.       (if (and ess (> (setq ksl (sslength ess)) 0))
  128.   (progn
  129.     (princ (strcat "\n真遗憾,找到" (itoa ksl) "个重叠块!"))
  130.     (sssetfirst ess ess)
  131.     (sssetfirst css css)
  132.     (initget 128 "Move Delete")
  133.     (setq  key (getkword
  134.           "\n请选择:[直接删除(Delete)/移动出去查看(Move)]"
  135.         )
  136.     )
  137.     (if (not key)
  138.       (setq key "Delete")
  139.     )
  140.     (command "_.erase" css "")
  141.     (if (= key "Move")
  142.       (progn
  143.         (setq move2p(getpoint"\n移动至..."))
  144.          (cond
  145.        ((or(< (cadr move2p)(car(vl-sort (mapcar 'cadar ep_lst)'<)))
  146.            (> (cadr move2p)(car(vl-sort (mapcar 'cadar ep_lst)'>)))
  147.            )
  148.               (setq ep_lst2(vl-sort ep_lst (function(lambda(x y)(< (caar x)(caar y))))))
  149.         );;;最上或最下
  150.        ((or(< (car move2p)(car(vl-sort (mapcar 'caar ep_lst)'<)))
  151.             (> (car move2p)(car(vl-sort (mapcar 'caar ep_lst)'>)))
  152.            );;;最左或最右
  153.               (setq ep_lst1(vl-sort ep_lst (function(lambda(x y)(< (cadar x)(cadar y))))))
  154.         )
  155.          )
  156.         (setq n 0)
  157.         (repeat (sslength ess)
  158.      (command "move" (if ep_lst1 (cadr(nth n  ep_lst1))(cadr(nth n  ep_lst2))) ""
  159.         (if ep_lst1(car(nth n  ep_lst1))(car(nth n  ep_lst2)))
  160.           (if ep_lst2
  161.        (setq movep(list (+(car move2p)(* n 1500)) (cadr move2p)))
  162.        (setq movep(list (car move2p) (+(cadr move2p)(* n 1500))))
  163.         )
  164.       )
  165.     (command "line" (if ep_lst1(car(nth n  ep_lst1))(car(nth n  ep_lst2))) movep "")
  166.     (setq n (1+ n))
  167.          )
  168.        )
  169.       (progn
  170.       (command "_.erase" ess "");;;直接删除
  171.       (princ (strcat "\n共删除" (itoa ksl) "个重叠块"))
  172.       )
  173.     )
  174.   )
  175.   (princ (strcat "\n恭喜你,未找到重叠块!"))
  176.       )
  177.     )
  178.   )
  179.   (setvar 'osmode oldosmode)
  180.   (setvar 'orthomode oldorthomode)
  181.   (vla-EndUndoMark mydoc)
  182.   (setvar "CMDECHO" 1)
  183.   (princ)
  184. )
  185. ;;;1、计算耗时
  186. (defun vtime ()
  187.   (* 86400 (getvar "tdusrtimer"))
  188. )
  189. ;;;2、求得所选物体的外包框对角线中点
  190. (defun getbound  (e / p1 p2)
  191.   (setq vla_e (vlax-ename->vla-object e))
  192.   (if (not (vl-catch-all-error-p
  193.        (vl-catch-all-apply
  194.          'vla-getboundingbox
  195.          (list vla_e 'p1 'p2)
  196.        )
  197.      )
  198.       )
  199.     (progn
  200.       (setq p1 (vlax-safearray->list p1)
  201.       p2 (vlax-safearray->list p2)
  202.       )
  203.       (setq l (distance p1 p2))
  204.       (setq p3 (polar p1 (angle p1 p2) (/ l 2)))
  205.     )
  206.   )
  207. )
  208. (princ "\n删除重叠块 by yjr111 2012-4-4 命令:deldumpk")


发表于 2020-5-30 12:04:55 | 显示全部楼层
我的思路
1.获取所有块
2.按块名分类
3.判断每个分类里的图块插入点是否有重复的
4.把重复的删除
发表于 2020-5-30 12:17:39 | 显示全部楼层
顶一个哈哈哈
 楼主| 发表于 2020-5-30 12:19:33 | 显示全部楼层
taoyi0727 发表于 2020-5-30 12:04
我的思路
1.获取所有块
2.按块名分类

这个对属性块和动态块就不友好了,很容易误判,特别是拉伸的动态块。
发表于 2020-5-30 14:01:44 | 显示全部楼层
andyzha 发表于 2020-5-30 12:19
这个对属性块和动态块就不友好了,很容易误判,特别是拉伸的动态块。

动态块,你拉伸后也不叫重叠了噻
至于属性块就只有单独处理了
 楼主| 发表于 2020-5-31 18:09:56 | 显示全部楼层
taoyi0727 发表于 2020-5-30 14:01
动态块,你拉伸后也不叫重叠了噻
至于属性块就只有单独处理了

目前能解决问题的就是现在这个程序,大神能修复一下吗?
 楼主| 发表于 2020-6-1 20:13:53 | 显示全部楼层
希望大神能关注解决一下。
 楼主| 发表于 2020-6-3 09:14:22 | 显示全部楼层
最近大神比较少出没啊,期待优化。
发表于 2020-6-8 10:59:17 | 显示全部楼层
搞个图来测试一下
发表于 2020-6-11 16:53:22 | 显示全部楼层
希望大神能关注解决一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 15:22 , Processed in 0.204321 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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