乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 81|回复: 19

[编程交流] 清除lisp例程增强

[复制链接]

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:00:23 | 显示全部楼层 |阅读模式
你好
我正在使用附加的例程删除重复的实体。它运行良好且快速:30000个实体需要7分钟。但对于100000个实体来说,它只持续了70分钟:胡子:。
我可以节省45分钟使用交叉窗口输入实体在3个步骤。不幸的是,常规没有这种可能性。
有人可以修改它来添加交叉选择吗?
谢谢
清楚的lsp
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 00:04:36 | 显示全部楼层
尝试此优化:
  1. (defun c:clear ( / a b ent enx lst )
  2.    (setq ent (entnext))
  3.    (while ent
  4.        (foreach dxf (entget ent)
  5.            (setq a (car dxf)
  6.                  b (cdr dxf)
  7.            )
  8.            (cond
  9.                (   (or (= 'ename (type b)) (= a 5)))
  10.                (   (listp b)
  11.                    (setq enx (cons (cons a (mapcar (function (lambda ( x ) (rtos x 2 )) b)) enx))
  12.                )
  13.                (   (numberp b)
  14.                    (setq enx (cons (cons a (rtos b 2 ) enx))
  15.                )
  16.                (   (setq enx (cons dxf enx)))
  17.            )
  18.        )
  19.        (if (member enx lst)
  20.            (entdel ent)
  21.            (setq lst (cons enx lst))
  22.        )
  23.        (setq ent (entnext ent)
  24.              enx nil
  25.        )
  26.    )
  27.    (princ)
  28. )
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:09:29 | 显示全部楼层
李,
谢谢你的代码。
我星期一试试。
祝你一切顺利。
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:12:45 | 显示全部楼层
李,
它可以工作:thumbsup:但我想有可能选择带有交叉窗口的实体。
你能帮我做这个吗?
谢谢
路易吉
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 00:15:12 | 显示全部楼层
试试这个修改Luigi,
  1. (defun c:clear ( / a b ent enx i lst s )
  2.    (if (setq s (ssget "_:L"))
  3.        (repeat (setq i (sslength s))
  4.            (foreach dx (entget (setq ent (ssname s (setq i (1- i)))))
  5.                (setq a (car dx)
  6.                      b (cdr dx)
  7.                )
  8.                (cond
  9.                    (   (or (= 'ename (type b)) (= a 5)))
  10.                    (   (listp b)
  11.                        (setq enx (cons (cons a (mapcar (function (lambda ( x ) (rtos x 2 )) b)) enx))
  12.                    )
  13.                    (   (numberp b)
  14.                        (setq enx (cons (cons a (rtos b 2 ) enx))
  15.                    )
  16.                    (   (setq enx (cons dx enx)))
  17.                )
  18.            )
  19.            (if (member enx lst)
  20.                (entdel ent)
  21.                (setq lst (cons enx lst))
  22.            )
  23.            (setq enx nil)
  24.        )
  25.    )
  26.    (princ)
  27. )
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:16:37 | 显示全部楼层
李,
好的,它起作用了。
我画了一幅10万个小实体的画:汗水:。如果我试图同时清除它们,例程需要45分钟,如果我选择10000个带有交叉窗口的窗口,例程只需要30秒。
因此,如果我把工作分成十步,我需要30x10=300秒=5分钟,而不是45分钟,速度会增加很多:泵送:。有没有可能自动完成?我在考虑选择步骤的数量(如10),它会从上到下开始交叉选择循环。在循环的每个步骤中,只有选定的实体必须由例程清除。
我希望你明白我的要求。
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:22:24 | 显示全部楼层
李,
不在乎我昨天写的,这是我的错,因为我测试例程时使用了错误的测试文件。
我修改了您的代码,使用ssget“\u C”函数将作业分为多个步骤。
现在,对于大文件,该例程速度更快。
我还添加了一些代码以获得更好的输出。
任何其他提示都会得到。
非常感谢您的时间和好运。
路易吉
 
  1. ; clear.lsp: Delete duplicate entities, tested only on polylines and circles.
  2. ; Core routine by Lee Mac 04-08-2013
  3. ; Output results by Luigi Calderone 04-10-2013
  4. ;
  5. (defun c:clear (/ old a b ent enx i lst s)
  6. (setq    xmin (car (getvar "EXTMIN"))
  7.    xmax (car (getvar "EXTMAX"))
  8.    ymin (car (cdr (getvar "EXTMIN")))
  9.    ymax (car (cdr (getvar "EXTMAX")))
  10.    old  (ssget "_X")
  11.    N    10
  12.    J    0
  13. )
  14. (command "zoom" "e")
  15. (prompt "\n")
  16. (while (< J N)
  17.    (setq lst nil
  18.      s   nil
  19.      pt1 (list xmin (+ ymin (/ (* (- ymax ymin) J) N)))
  20.      pt2 (list xmax (+ ymin (/ (* (- ymax ymin) (+ J 1)) N)))
  21.      J   (+ J 1)
  22.    )
  23.    (if    (setq s (ssget "_C" pt2 pt1))
  24.      (repeat (setq i (sslength s))
  25.    (foreach dx (entget (setq ent (ssname s (setq i (1- i)))))
  26.      (setq    a (car dx)
  27.        b (cdr dx)
  28.      )
  29.      (cond
  30.        ((or (= 'ename (type b)) (= a 5)))
  31.        ((listp b)
  32.         (setq
  33.           enx (cons
  34.             (cons
  35.               a
  36.               (mapcar (function (lambda (x) (rtos x 2 )) b)
  37.             )
  38.             enx
  39.           )
  40.         )
  41.        )
  42.        ((numberp b)
  43.         (setq enx (cons (cons a (rtos b 2 ) enx))
  44.        )
  45.        ((setq enx (cons dx enx)))
  46.      )
  47.    )
  48.    (if (member enx lst)
  49.      (entdel ent)
  50.      (setq lst (cons enx lst))
  51.    )
  52.    (setq enx nil)
  53.    (cond (SPIN (setq SPIN NIL) (princ "\r\"))
  54.          (t
  55.           (setq SPIN (princ "\r/")
  56.             SPIN (princ " ")
  57.             SPIN (princ (itoa J))
  58.             SPIN (princ "/")
  59.             SPIN (princ (itoa N))
  60.           )
  61.          )
  62.    )
  63.      )
  64.    )
  65. )
  66. (if (setq trap old)
  67.    (prompt (strcat "\nNumber of elements before clearing- "
  68.            (itoa (sslength old))
  69.        )
  70.    )
  71.    (prompt (strcat "\nNumber of elements before clearing- 0"))
  72. )
  73. (if (setq trap (ssget "_X"))
  74.    (prompt (strcat "\nNumber of elements after clearing- "
  75.            (itoa (sslength (ssget "_X")))
  76.        )
  77.    )
  78.    (prompt (strcat "\nNumber of elements after clearing- 0"))
  79.   )   
  80. (if (setq trap (ssget "_X"))  
  81.    (prompt (strcat "\nNumber of elements cleared- "
  82.          (itoa (- (sslength old) (sslength (ssget "_X"))))
  83.            )
  84.    )
  85.    (prompt (strcat "\nNumber of elements cleared- 0"))
  86. )
  87.    (princ)
  88. );end file
  89. (prompt "\nLoaded new command CLEAR. ")
  90. (princ)
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
289
发表于 2022-7-6 00:22:49 | 显示全部楼层
删除重复项的问题很有趣。
 
未测试具有属性的块。
 
下一个版本是否适用?
 
  1. (defun C:CLEARs () ; 11 . 04 . 2013 .
  2. (princ "\n   Selects objects to Checked  : ")
  3. (if (setq sel (ssget) ) ;_ end of setq
  4. (progn
  5.   (setq lsel (sslength sel)  lseli lsel  i 0  k 0) ;_ end of setq
  6.   (princ (strcat "\n   Selected Items  :  " (itoa lsel) "  ;"))
  7.   (while (< i lsel)
  8.    (princ (strcat "\n   Compare Object  :  " (itoa i) "  ;"))
  9.    (setq lobi (entget (ssname sel i))  lobii (member (assoc 410 lobi) lobi)  j (1+ i) ) ;_ end
  10.    (while (< j lsel)
  11.     (setq nmoj (ssname sel j)  lobj (entget nmoj)  lobjj (member (assoc 410 lobj) lobj) ) ;_ end
  12.     (if (equal lobii lobjj 0.000001)
  13.      (progn
  14.       (setq sel (ssdel nmoj sel)  k (1+ k) ) ;_ end of setq
  15.       (princ (strcat "\n   Delete Object Namber  :  " (itoa j) "  from  " (itoa lsel) "  =  " (itoa k) "  ;"))
  16.       (setq lsel (1- lsel) ) ;_ end of setq
  17.       (entdel nmoj)
  18.      ) ;_ end of prog then
  19.      (setq j (1+ j)) ;_ end of setq
  20.     ) ;_ end of if
  21.    ) ;_ end of wh j
  22.    (setq i (1+ i)) ;_ end of setq
  23.   ) ;_ end of wh i
  24. )) ;_ end of if sel
  25. (setq texte (strcat "\n\n   Selected Items  :  " (itoa lseli) "  ;"
  26.                         "\n   Delete Objects  :  " (itoa k) "  ;" )) ;_ end of setq
  27. (princ texte) (princ)
  28. ) ;_ end of defun
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:28:12 | 显示全部楼层
谢谢你的例行公事。
我检查了一下,但比两天前发布的要慢一点。
祝你一切顺利
路易吉
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
289
发表于 2022-7-6 00:31:51 | 显示全部楼层
取消每个while循环中带有princ的所有帖子。
 
  1. ; (princ (strcat "\n   Compare Object  :  " (itoa i) "  ;"))
  2. . . .
  3. ; (princ (strcat "\n   Delete Object  :  " (itoa j) "  from  " (itoa i) "  =  " (itoa k) "  ;"))

 
可以在进行测试的位置附着dwg?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 21:33 , Processed in 0.454914 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表