明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2454|回复: 8

[讨论] 自动复制递增图号程序

[复制链接]
发表于 2018-5-1 19:25 | 显示全部楼层 |阅读模式
附件是我在网上下载的一个自动递增图号的程序。现我想修改图号的由1,2,3变为001,002,003要怎么改程序呢,请教!
附程序用法,1,加载程序,
                     2,新建定义属性名称为tag
                     3,将新建的定义属性选中生成为块。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2018-5-2 21:32 | 显示全部楼层
;; modify by edata 2018-5-2
;; 修改自动递增三位数前置0对齐;
;; 修改图块名为 "图框"
;; 修改图块属性名称为 "图号"


  1. ;;-----------------=={ AutoLabel Attributes }==---------------;;
  2. ;;                                                            ;;
  3. ;;  Automatically labels a specific attribute in a set of     ;;
  4. ;;  blocks, renumbering if blocks are added, copied or        ;;
  5. ;;  erased.                                                   ;;
  6. ;;------------------------------------------------------------;;
  7. ;;  Author: Lee Mac, Copyright ?2011 - www.lee-mac.com       ;;
  8. ;;------------------------------------------------------------;;
  9. ;;  Version 1.0    -    14-09-2011                            ;;
  10. ;;------------------------------------------------------------;;

  11. ;;------------------------------------------------------------;;
  12. ;;                         Settings                           ;;
  13. ;;------------------------------------------------------------;;

  14. ;; [Note: Block names and Attribute Tags are *not* case-sensitive]
  15. ;; modify by edata 2018-5-2
  16. ;; 修改自动递增三位数前置0对齐;
  17. ;; 修改图块名为 "图框"
  18. ;; 修改图块属性名称为 "图号"

  19. (setq *blockname* "图框"  ;; 修改需要自动递增的图块名称,如: "图框" ;;Name of Block to be Updated
  20.       *blocktag*  "图号"    ;; 修改需要自动递增的图块属性名称,如: "图号" ;;Attribute Tag to be Updated
  21. )

  22. ;;------------------------------------------------------------;;
  23. ;;                      Main Program                          ;;
  24. ;;------------------------------------------------------------;;

  25. (defun ObjectReactorCallback:RenumberBlocks ( object reactor params )
  26.     (setq *reactor* reactor)
  27.     (vlr-command-reactor "temp" '((:vlr-commandended . CommandReactorCallback:RenumberBlocks)))
  28.     (vlr-remove  reactor)
  29.     (princ)
  30. )

  31. ;;------------------------------------------------------------;;

  32. (defun CommandReactorCallback:RenumberBlocks ( reactor params / e f i l n s )
  33.     (if reactor (vlr-remove reactor))
  34.     (if
  35.         (and
  36.             (not *undoflag*)
  37.             (setq s (ssget "_X" *filter*))
  38.         )
  39.         (progn
  40.             (setq n 0)
  41.             (repeat (setq i (sslength s))
  42.                 (if (eq *blockname*
  43.                         (AutoLabel:EffectiveName
  44.                             (setq o (vlax-ename->vla-object (setq e (ssname s (setq i (1- i))))))
  45.                         )
  46.                     )
  47.                     (progn
  48.                         (setq e (entnext e)
  49.                               l (entget  e)
  50.                               f nil
  51.                         )
  52.                         (while (and (not f) (eq "ATTRIB" (cdr (assoc 0 l))))
  53.                             (if (eq *blocktag*  (strcase (cdr (assoc 2 l))))
  54.             (progn
  55.         ;;添加前置零三位数对齐001,002,003...
  56.                                 (setq f (entmod (subst (cons 1 (cond ((< (1+ n) 10)(strcat "00" (itoa (setq n (1+ n)))))
  57.                      ((< (1+ n) 100)(strcat "0" (itoa (setq n (1+ n)))))
  58.                      (t (itoa (setq n (1+ n)))))) (assoc 1 l) l)))
  59.         )
  60.                             )
  61.                             (setq e (entnext e)
  62.                                   l (entget  e)
  63.                             )
  64.                         )
  65.                         (if (and *reactor* (not (member o (vlr-owners *reactor*))))
  66.                             (vlr-owner-add *reactor* o)
  67.                         )
  68.                     )
  69.                 )
  70.             )
  71.         )
  72.     )
  73.     (if *reactor*
  74.         (progn (vlr-add *reactor*) (setq *reactor* nil))
  75.     )
  76.     (princ)
  77. )

  78. ;;------------------------------------------------------------;;

  79. (defun CommandReactorCallback:UndoCheck ( reactor params )
  80.     (setq *undoflag* (wcmatch (strcase (car params)) "*U,*UNDO"))
  81.     (princ)
  82. )

  83. ;;------------------------------------------------------------;;

  84. (defun CommandReactorCallback:BlockInserted ( reactor params / e l )
  85.     (if
  86.         (and
  87.             (not *undoflag*)
  88.             (wcmatch (strcase (car params)) "*I,*INSERT,*EXECUTETOOL")
  89.             (setq e (entlast))
  90.             (setq l (entget e))
  91.             (eq "INSERT" (cdr (assoc 0 l)))
  92.             (= 1 (cdr (assoc 66 l)))
  93.             (eq *blockname* (AutoLabel:EffectiveName (vlax-ename->vla-object e)))
  94.         )
  95.         (AutoLabel:GetNewNumber e)
  96.     )
  97.     (princ)
  98. )

  99. ;;------------------------------------------------------------;;

  100. (defun AutoLabel:GetNewNumber ( ent / e f i l n r s )
  101.     (if (setq s (ssget "_X" *filter*))
  102.         (progn
  103.             (setq n 0)
  104.             (repeat (setq i (sslength s))
  105.                 (if (eq *blockname*
  106.                         (AutoLabel:Effectivename
  107.                             (vlax-ename->vla-object (ssname s (setq i (1+ i))))
  108.                         )
  109.                     )
  110.                     (setq n (1+ n))
  111.                 )
  112.             )
  113.             (setq e (entnext ent)
  114.                   l (entget e)
  115.             )
  116.             (while (and (not f) (eq "ATTRIB" (cdr (assoc 0 l))))
  117.                 (if (eq *blocktag*  (strcase (cdr (assoc 2 l))))
  118.       (progn
  119.                     (setq f (entmod (subst (cons 1 (cond ((< n 10)(strcat "00" (itoa n)))
  120.                      ((< n 100)(strcat "0" (itoa n)))
  121.                      (t (itoa n)))) (assoc 1 l) l)))
  122.         )
  123.                 )
  124.                 (setq e (entnext e)
  125.                       l (entget  e)
  126.                 )
  127.             )
  128.             (if
  129.                 (setq r
  130.                     (vl-some
  131.                         (function
  132.                             (lambda ( r ) (if (eq *reacdata* (vlr-data r)) r))
  133.                         )
  134.                         (cdar (vlr-reactors :vlr-object-reactor))
  135.                     )
  136.                 )
  137.                 (vlr-owner-add r (vlax-ename->vla-object ent))
  138.             )                           
  139.         )
  140.     )
  141.     (princ)
  142. )

  143. ;;------------------------------------------------------------;;

  144. (defun AutoLabel:EffectiveName ( obj )
  145.     (strcase
  146.         (if (vlax-property-available-p obj 'effectivename)
  147.             (vla-get-effectivename obj)
  148.             (vla-get-name obj)
  149.         )
  150.     )
  151. )

  152. ;;------------------------------------------------------------;;
  153. ;;                   Loading Expressions                      ;;
  154. ;;------------------------------------------------------------;;

  155. (vl-load-com)

  156. (
  157.     (lambda ( / i s l o )
  158.         (setq
  159.             *blocktag*  (strcase *blocktag*)
  160.             *blockname* (strcase *blockname*)
  161.             *reacdata*  "AutoBlockLabel"
  162.             *reactor*   nil
  163.             *undoflag*  nil
  164.         )
  165.         (foreach r1 (vlr-reactors)
  166.             (foreach r2 (cdr r1)
  167.                 (if (eq *reacdata* (vlr-data r2)) (vlr-remove r2))
  168.             )
  169.         )
  170.         (if
  171.             (setq s
  172.                 (ssget "_X"
  173.                     (setq *filter*
  174.                         (list
  175.                            '(0 . "INSERT")
  176.                            '(66 . 1)
  177.                             (cons 2 (strcat "`*U*," *blockname*))
  178.                             (cons 410 (getvar 'CTAB))
  179.                         )
  180.                     )
  181.                 )
  182.             )
  183.             (progn
  184.                 (repeat (setq i (sslength s))
  185.                     (if (eq *blockname*
  186.                             (AutoLabel:EffectiveName
  187.                                 (setq o (vlax-ename->vla-object (ssname s (setq i (1- i)))))
  188.                             )
  189.                         )
  190.                         (setq l (cons o l))
  191.                     )
  192.                 )
  193.                 (CommandReactorCallback:RenumberBlocks nil nil)
  194.                 (vlr-object-reactor l *reacdata*
  195.                     (list
  196.                         (cons :vlr-erased   'ObjectReactorCallback:RenumberBlocks)
  197.                         (cons :vlr-copied   'ObjectReactorCallback:RenumberBlocks)
  198.                         (cons :vlr-unerased 'ObjectReactorCallback:RenumberBlocks)
  199.                     )
  200.                 )
  201.                 (vlr-command-reactor *reacdata*
  202.                     (list
  203.                         (cons :vlr-commandwillstart 'CommandReactorCallback:UndoCheck)
  204.                         (cons :vlr-commandended     'CommandReactorCallback:BlockInserted)
  205.                     )
  206.                 )
  207.             )
  208.         )
  209.     )
  210. )

  211. (princ)

  212. ;;------------------------------------------------------------;;
  213. ;;                         End of File                        ;;
  214. ;;------------------------------------------------------------;;

发表于 2020-5-6 21:39 | 显示全部楼层
谢谢大神指导,学到了~
发表于 2020-6-3 17:17 | 显示全部楼层
edata 发表于 2018-5-2 21:32
;; modify by edata 2018-5-2
;; 修改自动递增三位数前置0对齐;
;; 修改图块名为 "图框"

什么命令执行呢

点评

这个是自动的,不是手动的,需要你制作一个图框的属性块,块名为 “图框" ,属性有 "图号",然后复制这个图框,就会自动序号递增。  发表于 2020-6-4 16:49
发表于 2021-12-9 11:16 | 显示全部楼层
本帖最后由 陈伟 于 2021-12-9 11:24 编辑
edata 发表于 2018-5-2 21:32
;; modify by edata 2018-5-2
;; 修改自动递增三位数前置0对齐;
;; 修改图块名为 "图框"

想改成要前缀的,数值保留两位   如“建施-01”  “建施-02”,  求帮修改一下如果能每复制一次或删除图框一次,能对图框的图号重新排一次就好了(从上至下,或者从左至右排序),这样出图的时候就不用重新对图号排序了


发表于 2021-12-15 22:24 | 显示全部楼层
edata 发表于 2018-5-2 21:32
;; modify by edata 2018-5-2
;; 修改自动递增三位数前置0对齐;
;; 修改图块名为 "图框"

如果一张图里面有多种图框样式,例如块名为:A3图框,A4图框,加长图框,用户图框,如何让程序支持多个块名?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-2 07:33 , Processed in 0.166330 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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