明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8604|回复: 29

删除重叠文字源码

  [复制链接]
发表于 2012-6-1 01:05:33 | 显示全部楼层 |阅读模式
本帖最后由 linshiyin2 于 2012-6-1 11:30 编辑

写了个重叠文字删除程序,但是运行有点慢,高手来改一下,实验过600个多行文字大概要20s。
  1. ;重叠的文字删除单行和多行
  2. ;判断方式为第一点,字高和文字内容相同
  3. (defun C:deladtxt (/ dxf1 dxf10 dxf101 dxf11 dxf40 dxf401 en en_data en1 k
  4.          lis m n ss
  5.       )
  6.   (setq ss (ssget "x" '((-4 . "<OR") (0 . "TEXT")
  7.        (0 . "MTEXT")
  8.        (-4 . "OR>")
  9.       )
  10.      )
  11.   )
  12.   (setq n (- (sslength ss) 1)
  13.   m 0
  14.   k 0
  15.   )
  16.   (setq lis (ssadd))
  17.   (repeat n
  18.     (setq en (ssname ss 0))
  19.     (setq en_data (entget en))
  20.     (setq dxf10 (cdr (assoc 10 en_data))
  21.     dxf40 (cdr (assoc 40 en_data))
  22.     dxf1 (cdr (assoc 1 en_data))
  23.     )
  24.     (setq ss (ssdel en ss))
  25.     (setq k (sslength ss))
  26.     (repeat k
  27.       (setq en1 (ssname ss m))
  28.       (setq en_data (entget en1))
  29.       (setq dxf101 (cdr (assoc 10 en_data))
  30.       dxf401 (cdr (assoc 40 en_data))
  31.       dxf11 (cdr (assoc 1 en_data))
  32.       )
  33.       (if (and
  34.       (equal dxf10 dxf101)
  35.       (equal dxf40 dxf401)
  36.       (equal dxf1 dxf11)
  37.     )
  38.   (progn
  39.     (setq lis (ssadd en1 lis))
  40.   )
  41.       )
  42.       (setq m (+ m 1))
  43.     )
  44.     (setq m 0)
  45.   )
  46.   (setq m (sslength lis))
  47.   (if (> m 0)
  48.     (repeat m
  49.       (setq en (ssname lis 0))
  50.       (entdel en)
  51.       (setq lis (ssdel en lis))
  52.     )
  53.   )
  54.   (princ (strcat "删除文字个数:" (itoa m)))
  55.   (princ)
  56. )




3楼加入了计算耗时。
发表于 2019-11-3 09:47:00 | 显示全部楼层
本帖最后由 lisperado 于 2019-11-3 09:51 编辑

如果把 if 句里的member换成vl-position也许更快?

member vs vl-position的思维:
举例:
(setq lst '(1 2 3 4 5 6 7 8 9 0)); 这里表(list)只以10个数字来示范,表示我们会有更长的表

(member 3 lst)
;(3 4 5 6 7 8 9 0 . . . . . . .) ;返回值=表!如果while/repeat/foreach里循环很长的表会很吃力吧?

(vl-position 3 lst)
;2 ;返回值=一个数值,理论上循环中内存不会再把表再重复显示所以应该更省时把?
发表于 2022-5-19 09:11:26 | 显示全部楼层
香远益清 发表于 2020-12-1 14:31
高版本CAD的OVERKILL命令搞定,不需要这些插件。

OV只能删除重叠线段,不能删除重叠文字吧
发表于 2020-12-1 14:31:29 | 显示全部楼层
高版本CAD的OVERKILL命令搞定,不需要这些插件。
 楼主| 发表于 2012-6-1 01:12:28 | 显示全部楼层
数量增加,基本上运算次数为2次方增加,高手来改进一下
 楼主| 发表于 2012-6-1 11:29:58 | 显示全部楼层
  1. (defun C:deladtxt (/ dxf1 dxf10 dxf101 dxf11 dxf40 dxf401 en en_data en1 k
  2.                      lis m n ss
  3.                   )
  4.   (setq ss (ssget "x" '((-4 . "<OR") (0 . "TEXT")
  5.                    (0 . "MTEXT")
  6.                    (-4 . "OR>")
  7.                   )
  8.            )
  9.   )
  10.   (setq n (- (sslength ss) 1)
  11.         m 0
  12.         k 0
  13.         t0 (* 86400 (getvar "tdusrtimer"))
  14.   )
  15.   (setq lis (ssadd))
  16.   (repeat n
  17.     (setq en (ssname ss 0))
  18.     (setq en_data (entget en))
  19.     (setq dxf10 (cdr (assoc 10 en_data))
  20.           dxf40 (cdr (assoc 40 en_data))
  21.           dxf1 (cdr (assoc 1 en_data))
  22.     )
  23.     (setq ss (ssdel en ss))
  24.     (setq k (sslength ss))
  25.     (repeat k
  26.       (setq en1 (ssname ss m))
  27.       (setq en_data (entget en1))
  28.       (setq dxf101 (cdr (assoc 10 en_data))
  29.             dxf401 (cdr (assoc 40 en_data))
  30.             dxf11 (cdr (assoc 1 en_data))
  31.       )
  32.       (if (and
  33.             (equal dxf10 dxf101)
  34.             (equal dxf40 dxf401)
  35.             (equal dxf1 dxf11)
  36.           )
  37.         (progn
  38.           (setq lis (ssadd en1 lis))
  39.         )
  40.       )
  41.       (setq m (+ m 1))
  42.     )
  43.     (setq m 0)
  44.   )
  45.   (setq m (sslength lis))
  46.   (if (> m 0)
  47.     (repeat m
  48.       (setq en (ssname lis 0))
  49.       (entdel en)
  50.       (setq lis (ssdel en lis))
  51.     )
  52.   )
  53.   (setq t1 (* 86400 (getvar "tdusrtimer")))
  54.   (princ (strcat "耗时:" (rtos (- t1 t0) 2 3) "   删除文字个数:"
  55.                  (itoa m)
  56.          ))
  57.   (princ)
  58. )
自己顶顶

点评

'((-4 . "<OR") (0 . "TEXT")(0 . "MTEXT") (-4 . "OR>")) 可写成'((0 . "TEXT,MTEXT"))  发表于 2012-6-1 13:27
发表于 2012-6-1 12:43:39 | 显示全部楼层
试下看:
游客,本帖隐藏的内容需要发帖数高于 5 才可浏览,你当前发帖数只有 0
发表于 2012-6-1 12:45:09 | 显示全部楼层
 楼主| 发表于 2012-6-1 12:51:49 | 显示全部楼层
ZZXXQQ 发表于 2012-6-1 12:43
试下看:
[/post]

可以,我也用while搞过,但是用的是(while (< n (sslength ss))),呵呵差一点哈哈
 楼主| 发表于 2012-6-1 12:55:41 | 显示全部楼层
ZZXXQQ 发表于 2012-6-1 12:43
试下看:
[/post]

有一点不明白,循环里套欠循环不爽,如果有2000多个文字,但是都没有重叠,基本上还是要运算2次方的次数,时间长,有其他的好办法吗?或者,为了加速,用什么函数比较快
 楼主| 发表于 2012-6-1 13:04:08 | 显示全部楼层
本帖最后由 linshiyin2 于 2012-6-1 13:06 编辑
  1. (defun C:deladtxt (/ dxf1 dxf10 dxf101 dxf11 dxf40 dxf401 en en_data en1 k
  2.        lis m n s ss t0 t1
  3.     )
  4.   (setq ss (ssget "x" '((0 . "*TEXT"))))
  5.   (setq n (1- (sslength ss))
  6. s 0
  7. t0 (* 86400 (getvar "tdusrtimer"))
  8.   )
  9.   (princ (strcat "\n图元个数:" (itoa n) "\n"))
  10.   (setq lis (ssadd))
  11.   (while (> n 1)
  12.     (setq en (ssname ss 0))
  13.     (setq en_data (entget en))
  14.     (setq dxf10 (cdr (assoc 10 en_data))
  15.    dxf40 (cdr (assoc 40 en_data))
  16.    dxf1 (cdr (assoc 1 en_data))
  17.     )
  18.     (setq ss (ssdel en ss))
  19.     (setq k (sslength ss))
  20.     (setq m 0)
  21.     (while (> k m)
  22.       (setq en1 (ssname ss m))
  23.       (setq en_data (entget en1))
  24.       (setq dxf101 (cdr (assoc 10 en_data))
  25.      dxf401 (cdr (assoc 40 en_data))
  26.      dxf11 (cdr (assoc 1 en_data))
  27.       )
  28.       (if (and
  29.      (equal dxf10 dxf101)
  30.      (equal dxf40 dxf401)
  31.      (= dxf1 dxf11)
  32.    )
  33. (progn
  34.    (setq ss (ssdel en1 ss)
  35.   k (1- k)
  36.   s (1+ s)
  37.    )
  38.    (setq lis (ssadd en1 lis))
  39. )
  40. (setq m (1+ m))
  41.       )
  42.     )
  43.     (setq n (1- (sslength ss)))
  44.   )
  45.   (setq m (sslength lis))
  46.   (if (> m 0)
  47.     (repeat m
  48.       (setq en (ssname lis 0))
  49.       (entdel en)
  50.       (setq lis (ssdel en lis))
  51.     )
  52.   )
  53.   (setq t1 (* 86400 (getvar "tdusrtimer")))
  54.   (princ (strcat "耗时:" (rtos (- t1 t0) 2 3) " 删除文字个数:"
  55.    (itoa s)
  56.   )
  57.   )
  58.   (princ)
  59. )

点评

在内循环中已经将重复串删了,你后面又删一遍!又恢复了删除的串,等于没删。  发表于 2012-6-1 19:28
 楼主| 发表于 2012-6-1 13:21:26 | 显示全部楼层
  1. (defun C:DUPREM (/ F1 SLE SA CA TA LA LB ENTA EA TYPA A1 A2 A3 A4 SC LTEST
  2.                    TES
  3.                 )
  4.   (setq F1 NIL
  5.         F1 0
  6.   )
  7.   (or
  8.     :GCHOICE
  9.     (setq :GCHOICE "Set")
  10.   )
  11.   (initget "Set Limits All")
  12.   (setq SLE (getkword (strcat "\n选择集类型 [Set/Limits/All] <" :GCHOICE
  13.                               ">: "
  14.                       )
  15.             )
  16.   )
  17.   (if (not SLE)
  18.     (setq SLE :GCHOICE)
  19.     (setq :GCHOICE SLE)
  20.   )
  21.   (cond
  22.     ((= SLE "Set")
  23.       (setq SA (ssget))
  24.     )
  25.     ((= SLE "Limits")
  26.       (setq SA (ssget "c" (getvar "extmin") (getvar "extmax")))
  27.     )
  28.     ((= SLE "All")
  29.       (setq SA (ssget "X"))
  30.     )
  31.   )
  32.   (if (and
  33.         SA
  34.         (= (type SA) 'PICKSET)
  35.         (not (zerop (sslength SA)))
  36.       )
  37.     (progn
  38.       (setq CA 0
  39.             TA (sslength SA)
  40.             LA NIL
  41.             LB NIL
  42.       )
  43.       (while (< CA TA)
  44.         (setq ENTA (ssname SA CA)
  45.               EA (cdr (entget ENTA))
  46.               TYPA (cdr (assoc 0 EA))
  47.         )
  48.         (setq A1 (assoc 5 EA))
  49.         (setq A2 (cons 5 ""))
  50.         (setq EA (subst
  51.                    A2
  52.                    A1
  53.                    EA
  54.                  )
  55.         )
  56.         (if (wcmatch (getvar "ACADVER") "*15*")
  57.           (progn
  58.             (setq A3 (assoc 330 EA))
  59.             (setq A4 (cons 330 ""))
  60.             (setq EA (subst
  61.                        A4
  62.                        A3
  63.                        EA
  64.                      )
  65.             )
  66.           )
  67.         )
  68.         (setq LA (cons ENTA LA)
  69.               LB (cons EA LB)
  70.               CA (+ CA 1)
  71.         )
  72.       )
  73.       (setq SC NIL
  74.             SC (ssadd)
  75.             LTEST LB
  76.       )
  77.       (setq CA 0)
  78.       (setq TES (car LTEST)
  79.             LTEST (cdr LTEST)
  80.             TA NIL
  81.             TA (length LTEST)
  82.       )
  83.       (while (/= TA 0)
  84.         (if (member TES LTEST)
  85.           (progn
  86.             (setq SC (ssadd (nth CA LA) SC))
  87.             (setq F1 (+ F1 1))
  88.           )
  89.         )
  90.         (setq CA (+ CA 1))
  91.         (setq TES (car LTEST)
  92.               LTEST (cdr LTEST)
  93.               TA (length LTEST)
  94.         )
  95.       )
  96.       (command "erase" SC "")
  97.       (redraw)
  98.       (prompt "\n")
  99.       (prin1 F1)
  100.       (prompt " 个物体被删除.")
  101.     )
  102.   )
  103.   (princ)
  104. )
Gu_xl 的源码,厉害,研究一下

点评

功能很强大,学习一下。  发表于 2012-8-7 13:05
发表于 2012-6-1 21:16:51 | 显示全部楼层
很好,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 15:33 , Processed in 0.213925 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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