明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1658|回复: 5

[源码] 检查重复的同名注记,自己写的,新手,有改进空间

[复制链接]
发表于 2013-10-28 15:07:00 | 显示全部楼层 |阅读模式
检查图上的注记是否有重名的(比如:宗地编号、控制点名称等),只在同一个图层、字体、字高等都一样的注记之间查找,不同类型的同名注记不算重复。
(defun c:jc()
  (setvar "cmdecho" 0)
  (setq os (getvar "OSMODE"))
  (setq lay (getvar "clayer"))
  (setq txtlx (entget (car (entsel "\n====选择一个文字作为类型样本:"))))
  (setq layer (cdr (assoc 8 txtlx)))
  (setq color (cdr (assoc 62 txtlx)))
  (setq style (cdr (assoc 7 txtlx)))
  (setq txtsiz (cdr (assoc 40 txtlx)))
  (setq txtbl (cdr (assoc 41 txtlx)))
  (princ "\n")
  (princ "\n====请选择需要检查的文字:")
  (if (= color nil)
    (setq ss (ssget (list '(0 . "TEXT") (cons 8 layer) (cons 7  style) (cons 40 txtsiz) (cons 41 txtbl))))
    (setq ss (ssget (list '(0 . "TEXT") (cons 8 layer) (cons 62 color) (cons 7  style) (cons 40 txtsiz) (cons 41 txtbl))))
  )
  (princ "\n")
  (setq i 0)
  (setq m 0)
  (repeat (setq cd (sslength ss))
    (setq ss1 (ssname ss i))
    (setq ss1data (entget ss1))
    (setq pt1 (cdr (assoc 10 ss1data)))
    (setq txt1 (cdr (assoc 1 ss1data)))
    (setq n (1+ i))
    (while (< n cd)
      (setq ssn (ssname ss n))
      (setq ssdata (entget ssn))
      (setq ptn (cdr (assoc 10 ssdata)))
      (setq txtn (cdr (assoc 1 ssdata)))
      (if (= txt1 txtn)
        (progn
          (setq m (1+ m))         
          (command "color" m)
          (command "layer" "m" "cfjc" "" "" "" "")
          (command"_circLe" pt1 "2")
          (command"_circLe" ptn "2")
        )
      )
      (setq n (1+ n))
    )
    (setq n 0)
    (setq i (1+ i))
  )
  (command "cecolor" "bylayer")
  (command "layer" "s" lay "")
  (setvar "OSMODE" os)
  (if (= m 0)
    (alert
    "\n   恭喜你,检查合格
     \n   未发现相同的注记")
    (alert
     (strcat "\n本次检查共发现 " (rtos m 2 0) " 对相同注记"))
  )
  (prin1)
)
(princ "\n====蓝图测绘,精心制作; 键入 jc 运行本插件====")   

点评

感谢楼主,有这样的需求,可不可将相同文字变色,每次相同颜色+1,这样要方便些!  发表于 2014-9-17 18:04
(setq color (cdr (assoc 62 txtlx)))这一句可能会引起出错,当所选实体颜色随层时(assoc 62 txtlx)为nil,所以会导致(cdr (assoc 62 txtlx))出错,这个应该修正一下  发表于 2013-10-30 11:07
发表于 2013-10-30 11:37:43 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-10-30 11:38 编辑

  (setq txtlx (entget (car (entsel "\n====选择一个文字作为类型样本:"))))
   (setq layer (cdr (assoc 8 txtlx)))
   (setq color (cdr (assoc 62 txtlx)))
   (setq style (cdr (assoc 7 txtlx)))
   (setq txtsiz (cdr (assoc 40 txtlx)))
   (setq txtbl (cdr (assoc 41 txtlx)))
上边除了绿色标出的一句都可能会出错
(setq txtlx (entget (car (entsel "\n====选择一个文字作为类型样本:"))))
会在不小心没选中任何图元直接按了右键时它是要出错的
可以处理一下(while(null  (setq txtlx(car(entsel "\n====选择一个文字作为类型样本:")))))
这是解决了不会允许空输入,但后边还可能出错,因这前边虽然提示了“选择文字”,但实际操作起来是不是就不会选到别的呢?显然这是无法保证的。当所选对象不是TEXT或者MTEXT的时候,(setq style (cdr (assoc 7 txtlx)))一定出错,因为这是个非文字图元不会有的一个组码,后边40,41也一般会因些出错
所以,为了防止出错中断,必须先检查它是不是TEXT或者MTEXT
 楼主| 发表于 2013-10-30 21:01:25 | 显示全部楼层
受益匪浅,你说的这些看书是学不到的,都是经验啊,谢谢
发表于 2014-9-10 19:55:59 | 显示全部楼层
收藏备用!感谢!
发表于 2014-11-9 23:33:28 | 显示全部楼层
收录了,,好东西,,,,,,,,
发表于 2024-3-2 14:59:12 | 显示全部楼层
收藏备用!感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-25 05:30 , Processed in 0.180440 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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