乐筑天下

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

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

[复制链接]

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 00:34:36 | 显示全部楼层
为什么要写?
 
 
它具有相同的效果:
 
  1. (T   (progn (princ "\r/") (princ " ") (princ (itoa J)) (princ "/") (setq SPIN (princ (itoa N))   )
  2.        )
  3. )

 
 
或者你想做:
 
  1. (setq SPIN (strcat "\r/  " (itoa J) "/" (itoa N)) )
  2. (princ SPIN)
  3.          
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:36:00 | 显示全部楼层
对它更优雅!
最后一个版本是:
 
  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 and Costinbos77 04-11-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 (strcat "\r/  " (itoa J) "/" (itoa N)) )
  56.               (princ SPIN)           
  57.          )
  58.    )
  59.      )
  60.    )
  61. )
  62. (if (setq trap old)
  63.    (prompt (strcat "\nNumber of elements before clearing- "
  64.            (itoa (sslength old))
  65.        )
  66.    )
  67.    (prompt (strcat "\nNumber of elements before clearing- 0"))
  68. )
  69. (if (setq trap (ssget "_X"))
  70.    (prompt (strcat "\nNumber of elements after clearing- "
  71.            (itoa (sslength (ssget "_X")))
  72.        )
  73.    )
  74.    (prompt (strcat "\nNumber of elements after clearing- 0"))
  75.   )   
  76. (if (setq trap (ssget "_X"))  
  77.    (prompt (strcat "\nNumber of elements cleared- "
  78.          (itoa (- (sslength old) (sslength (ssget "_X"))))
  79.            )
  80.    )
  81.    (prompt (strcat "\nNumber of elements cleared- 0"))
  82. )
  83.    (princ)
  84. );end file
  85. (prompt "\nLoaded new command CLEAR. ")
  86. (princ)
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 00:40:59 | 显示全部楼层
你的方法是其他语言的典型​​(VBA等)。
 
不是更优雅,所以是正常的。
 
  1. (princ (strcat "\r/  " (itoa J) "/" (itoa N)) )

 
如果不需要旋转变量。
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:42:12 | 显示全部楼层
 
谢谢
最新版本:
  1. ; clear.lsp: Delete duplicate entities, tested on polylines, circles,
  2. ; mtexts texts, lines, splines, arcs, ellipses, ellipse arcs.
  3. ;
  4. ; Core routine by Lee Mac 04-08-2013
  5. ; Output results refined by Luigi Calderone and Costinbos77 04-11-2013
  6. ;
  7. (defun c:clear (/ old a b ent enx i lst s)
  8. (setq    xmin (car (getvar "EXTMIN"))
  9.    xmax (car (getvar "EXTMAX"))
  10.    ymin (car (cdr (getvar "EXTMIN")))
  11.    ymax (car (cdr (getvar "EXTMAX")))
  12.    old  (ssget "_X")
  13.    N    10
  14.    J    0
  15. )
  16. (command "zoom" "e")
  17. (prompt "\n")
  18. (while (< J N)
  19.    (setq lst nil
  20.      s   nil
  21.      pt1 (list xmin (+ ymin (/ (* (- ymax ymin) J) N)))
  22.      pt2 (list xmax (+ ymin (/ (* (- ymax ymin) (+ J 1)) N)))
  23.      J   (+ J 1)
  24.    )
  25.    (if    (setq s (ssget "_C" pt2 pt1))
  26.      (repeat (setq i (sslength s))
  27.    (foreach dx (entget (setq ent (ssname s (setq i (1- i)))))
  28.      (setq    a (car dx)
  29.        b (cdr dx)
  30.      )
  31.      (cond
  32.        ((or (= 'ename (type b)) (= a 5)))
  33.        ((listp b)
  34.         (setq
  35.           enx (cons
  36.             (cons
  37.               a
  38.               (mapcar (function (lambda (x) (rtos x 2 )) b)
  39.             )
  40.             enx
  41.           )
  42.         )
  43.        )
  44.        ((numberp b)
  45.         (setq enx (cons (cons a (rtos b 2 ) enx))
  46.        )
  47.        ((setq enx (cons dx enx)))
  48.      )
  49.    )
  50.    (if (member enx lst)
  51.      (entdel ent)
  52.      (setq lst (cons enx lst))
  53.    )
  54.    (setq enx nil)
  55.    (princ "\r\")
  56.    (princ (strcat "\r/  " (itoa J) "/" (itoa N)) )
  57.      )
  58.    )
  59. )
  60. (if (setq trap old)
  61.    (prompt (strcat "\nNumber of elements before clearing- "
  62.            (itoa (sslength old))
  63.        )
  64.    )
  65.    (prompt (strcat "\nNumber of elements before clearing- 0"))
  66. )
  67. (if (setq trap (ssget "_X"))
  68.    (prompt (strcat "\nNumber of elements after clearing- "
  69.            (itoa (sslength (ssget "_X")))
  70.        )
  71.    )
  72.    (prompt (strcat "\nNumber of elements after clearing- 0"))
  73.   )   
  74. (if (setq trap (ssget "_X"))  
  75.    (prompt (strcat "\nNumber of elements cleared- "
  76.          (itoa (- (sslength old) (sslength (ssget "_X"))))
  77.            )
  78.    )
  79.    (prompt (strcat "\nNumber of elements cleared- 0"))
  80. )
  81.    (princ)
  82. );end file
  83. (prompt "\nLoaded new command CLEAR. ")
  84. (princ)
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:45:08 | 显示全部楼层
哦,不!
有点不对劲!
例程并没有在第一步清除所有重复项
问题不在核心例程中,而是在选择代码中。。。
有什么提示吗?
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 00:49:08 | 显示全部楼层
我写的程序,删除所有重复的?
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:53:14 | 显示全部楼层
可能是的,但它太慢了,速度是我唯一需要的,因为我有另一个例程可以工作,但我必须将其应用于大文件。
经过测试,似乎问题出在李的日常生活中。它工作得更快,但需要两到三次尝试。
我在附带的测试文件中测试了它。
谢谢
杜普雷姆。图纸
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 00:56:17 | 显示全部楼层
吉,我想我解决了。
 
的想法​​10个扇区中的除数将我带到了另一个分区,在实体类型之后。
 
对于n个项目,需要进行nx(n-1)/2比较。因此,对于7个项目(4个圆和3条线),需要7x6/2=21个对象比较。
但如果对实体组进行比较:
4x3/2+3x2/2=6+3=9个对象的比较,因此提高了处理速度。
 
  1. (defun C:CLEARsA () ; 21 . 04 . 2013 .
  2. (setq psj (getpoint "\n   Delineates  Processed  Area !\n   Select  the  Bottom - Left  Corner  :  <  Pick  >  :  ")  texte ""
  3.       pds (getcorner psj "\n   Select  the Top - Right  Corner  :  <  Pick  >  :  ")  slsel 0  sk 0) ;_ end of setq
  4. (foreach el '("ARC" "CIRCLE" "ELLIPSE" "INSERT" "LINE" "POLYLINE" "REGION" "SPLINE"
  5.                    "TABLE" "MTEXT" "TEXT")
  6. (princ (strcat "\n   Object  TYPE  to  Checked  :  " el "  ;"))
  7. (if (setq k 0  sel (ssget "_W" psj pds (list (cons 0 el)) ) ) ;_ end of setq
  8.   (progn
  9.    (setq lsel (sslength sel)  slsel (+ lsel slsel)  i 0) ;_ end of setq
  10.    (princ (strcat "\n   Selected  Items  :  " (itoa lsel) "  ;"))
  11.    (while (< i lsel)
  12.     (princ (strcat "\n   Compare  Object  :  " (itoa i) "  ;"))
  13.     (setq lobi (entget (ssname sel i))  lobii (member (assoc 100 lobi) lobi)  j (1+ i) ) ;_ end of setq
  14.     (while (< j lsel)
  15.      (setq nmoj (ssname sel j)  lobj (entget nmoj)  lobjj (member (assoc 100 lobj) lobj) ) ;_ end of setq
  16.      (if (equal lobii lobjj 0.000001)
  17.       (progn[color=red] (command "zoom" "o" nmoj "")[/color]
  18.        (setq sel (ssdel nmoj sel)  k (1+ k) ) ;_ end of setq
  19.        (princ (strcat "\n   Delete  Object  Namber  :  " (itoa j) "  from  " (itoa lsel) "  =  " (itoa k) "  ;"))
  20.        (setq lsel (1- lsel) ) ;_ end of setq
  21.        (entdel nmoj) ;(alert (strcat "S-a  Sters  Obiectul  :  " (itoa k) "  ;" ))
  22.       ) ;_ end of prog then
  23.       (setq j (1+ j)) ;_ end of setq
  24.      ) ;_ end of if
  25.     ) ;_ end of wh j
  26.     (setq i (1+ i)) ;_ end of setq
  27.    ) ;_ end of wh i
  28.   ) ;_ end of prog then
  29.   (setq lsel 0) ;_ end of setq
  30. ) ;_ end of if sel
  31. (setq texte (strcat texte "\n   Type  :  " el "  =  " (itoa lsel) "  :   Deleted  :  " (itoa k) "  ;" )  sk (+ k sk)) ;_ end of setq
  32. ) ;_ end of f
  33. (setq texte (strcat "\n\n   Selected  Items  :  " (itoa slsel) "  ;" texte "\n   Deleted  Objects  :  " (itoa sk) "  .")) ;_ end of
  34. (princ texte) (textscr) (princ)
  35. ) ;_ end of defun

 
这很好,可以为大型图形划分扇区,否则扇区将很小,如果对象大于一个扇区,则一个对象位于多个扇区中,并增加处理时间。
 
 
可能需要添加和其他类型的实体。
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 00:57:31 | 显示全部楼层
我在星期五的邮件中在附件中尝试了你的例行程序,这并不过分:需要几个步骤来删除所有重复项,与Lee例行程序相比,它仍然没有那么快。
 
回复

使用道具 举报

2

主题

20

帖子

18

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 01:01:38 | 显示全部楼层
李,Costinbos77,
我发现这两个例程并没有彻底清除区域。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 21:27 , Processed in 0.875987 second(s), 70 queries .

© 2020-2025 乐筑天下

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