明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2011|回复: 7

LEEMAC大神的动态块统计,求改进

[复制链接]
发表于 2021-10-23 11:21:25 | 显示全部楼层 |阅读模式
本帖最后由 k1nger 于 2021-10-23 11:23 编辑
  1. ;;--------------------=={ Dynamic Block Counter }==---------------------;;
  2. ;;                                                                      ;;
  3. ;;  This program enables the user to count all or a selection of        ;;
  4. ;;  standard blocks, dynamic blocks & xrefs in the current layout of a  ;;
  5. ;;  drawing.                                                            ;;
  6. ;;                                                                      ;;
  7. ;;  For every dynamic block with a Visibility Parameter, the program    ;;
  8. ;;  will also output the number of blocks using each Visibility State.  ;;
  9. ;;                                                                      ;;
  10. ;;  The results are printed to the command-line and may also be         ;;
  11. ;;  written to a Text or CSV file automatically created in the working  ;;
  12. ;;  directory with the same filename as the active drawing.             ;;
  13. ;;                                                                      ;;
  14. ;;----------------------------------------------------------------------;;
  15. ;;  Author:  Lee Mac, Copyright ?2013  -              ;;
  16. ;;----------------------------------------------------------------------;;
  17. ;;  Version 1.1    -    2013-11-27                                      ;;
  18. ;;----------------------------------------------------------------------;;

  19. (defun c:dbcount ( / *error* all bln del des idx lst obj ofn out sel vis vsl )

  20.     (defun *error* ( msg )
  21.         (if (= 'file (type des)) (close des))
  22.         (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  23.             (princ (strcat "\nError: " msg))
  24.         )
  25.         (princ)
  26.     )
  27.    
  28.     (cond
  29.         (   (null
  30.                 (setq all
  31.                     (ssget "_X"
  32.                         (list
  33.                            '(0 . "INSERT")
  34.                             (if (= 1 (getvar 'cvport))
  35.                                 (cons 410 (getvar 'ctab))
  36.                                '(410 . "Model")
  37.                             )
  38.                         )
  39.                     )
  40.                 )
  41.             )
  42.             (princ "\nNo blocks found in the current layout.")
  43.         )
  44.         (   (progn
  45.                 (setvar 'nomutt 1)
  46.                 (princ "\nSelect blocks to count <all>: ")
  47.                 (setq sel
  48.                     (cond
  49.                         (   (null (setq sel (vl-catch-all-apply 'ssget '(((0 . "INSERT"))))))
  50.                             all
  51.                         )
  52.                         (   (null (vl-catch-all-error-p sel))
  53.                             sel
  54.                         )
  55.                     )
  56.                 )
  57.                 (setvar 'nomutt 0)
  58.                 sel
  59.             )
  60.             (repeat (setq idx (sslength sel))
  61.                 (setq lst
  62.                     (LM:nassoc++
  63.                         (cons (setq bln (LM:blockname (setq obj (vlax-ename->vla-object (ssname sel (setq idx (1- idx)))))))
  64.                             (if
  65.                                 (and
  66.                                     (setq vis
  67.                                         (cdr
  68.                                             (cond
  69.                                                 (   (assoc bln vsl))
  70.                                                 (   (car (setq vsl (cons (cons bln (LM:getvisibilityparametername obj)) vsl))))
  71.                                             )
  72.                                         )
  73.                                     )
  74.                                     (setq vis
  75.                                         (vl-some
  76.                                            '(lambda ( x )
  77.                                                 (if (= vis (vla-get-propertyname x))
  78.                                                     (vlax-get x 'value)
  79.                                                 )
  80.                                             )
  81.                                             (vlax-invoke obj 'getdynamicblockproperties)
  82.                                         )
  83.                                     )
  84.                                 )
  85.                                 (list vis)
  86.                             )
  87.                         )
  88.                         lst
  89.                     )
  90.                 )
  91.             )
  92.             (princ (LM:padbetween "\n" "" "=" 46))
  93.             (princ (LM:padbetween "\n Block" "Count" "." 46))
  94.             (princ (LM:padbetween "\n" "" "=" 46))
  95.             (foreach blk (setq lst (vl-sort lst '(lambda ( a b ) (< (car a) (car b)))))
  96.                 (cond
  97.                     (   (listp (cadr blk))
  98.                         (princ (LM:padbetween (strcat "\n " (car blk)) (itoa (apply '+ (mapcar 'cadr (cdr blk)))) "." 46))
  99.                         (foreach vis (cdr blk)
  100.                             (princ (LM:padbetween (strcat "\n    " (car vis)) (itoa (cadr vis)) "." 46))
  101.                         )
  102.                     )
  103.                     (   (princ (LM:padbetween (strcat "\n " (car blk)) (itoa (cadr blk)) "." 46))   )
  104.                 )
  105.                 (princ (LM:padbetween "\n" "" "-" 46))
  106.             )
  107.             (princ (LM:padbetween "\r" "" "=" 46))
  108.             (textpage)

  109.             (initget "TXT CSV")
  110.             (if
  111.                 (and
  112.                     (setq out (getkword "\nOutput results to [TXT/CSV] <exit>: "))
  113.                     (setq ofn (LM:uniquefilename (strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname))) (strcat "." (strcase out t))))
  114.                 )
  115.                 (if (setq des (open ofn "w"))
  116.                     (progn
  117.                         (setq del (if (= "TXT" out) "\t" ","))
  118.                         (write-line (strcat "Block" del del "Count") des)
  119.                         (foreach blk lst
  120.                             (cond
  121.                                 (   (listp (cadr blk))
  122.                                     (write-line (strcat (car blk) del del (itoa (apply '+ (mapcar 'cadr (cdr blk))))) des)
  123.                                     (foreach vis (cdr blk)
  124.                                         (write-line (strcat del (car vis) del (itoa (cadr vis))) des)
  125.                                     )
  126.                                 )
  127.                                 (   (write-line (strcat (car blk) del del (itoa (cadr blk))) des))
  128.                             )
  129.                         )
  130.                         (setq des (close des))
  131.                         (startapp "explorer" ofn)
  132.                     )
  133.                     (princ (strcat "\nUnable to open "" ofn "" for writing."))
  134.                 )
  135.             )
  136.             (graphscr)
  137.         )
  138.     )
  139.     (princ)
  140. )

  141. ;; Unique Filename  -  Lee Mac
  142. ;; Returns a filename suffixed for uniqueness

  143. (defun LM:uniquefilename ( pth ext / fnm tmp )
  144.     (if (findfile (setq fnm (strcat pth ext)))
  145.         (progn
  146.             (setq tmp 1)
  147.             (while (findfile (setq fnm (strcat pth "(" (itoa (setq tmp (1+ tmp))) ")" ext))))
  148.         )
  149.     )
  150.     fnm
  151. )

  152. ;; Block Name  -  Lee Mac
  153. ;; Returns the true (effective) name of a supplied block reference
  154.                         
  155. (defun LM:blockname ( obj )
  156.     (if (vlax-property-available-p obj 'effectivename)
  157.         (defun LM:blockname ( obj ) (vla-get-effectivename obj))
  158.         (defun LM:blockname ( obj ) (vla-get-name obj))
  159.     )
  160.     (LM:blockname obj)
  161. )

  162. ;; Nested Assoc++  -  Lee Mac
  163. ;; Increments the value of a key in an association list with possible
  164. ;; nested structure, or adds the set of keys to the list if not present.
  165. ;; key - [lst] List of keys
  166. ;; lst - [lst] Association list or nil
  167. ;; Returns: [lst] Association list with key incremented or added

  168. (defun LM:nassoc++ ( key lst / itm )
  169.     (if key
  170.         (if (setq itm (assoc (car key) lst))
  171.             (subst (cons (car key) (LM:nassoc++ (cdr key) (cdr itm))) itm lst)
  172.             (cons  (cons (car key) (LM:nassoc++ (cdr key) nil)) lst)
  173.         )
  174.         (if lst (list (1+ (car lst))) '(1))
  175.     )
  176. )

  177. ;; Pad Between Strings  -  Lee Mac
  178. ;; Returns a string of a minimum specified length which is the concatenation
  179. ;; of two supplied strings padded to a desired length using a supplied character.
  180. ;; s1,s2 - [str] Strings to be concatenated
  181. ;; ch    - [str] Single character for padding
  182. ;; ln    - [int] Minimum length of returned string
  183. ;; Returns: [str] Concatenation of s1,s2 padded to a minimum length

  184. (defun LM:padbetween ( s1 s2 ch ln )
  185.     (
  186.         (lambda ( a b c )
  187.             (repeat (- ln (length b) (length c)) (setq c (cons a c)))
  188.             (vl-list->string (append b c))
  189.         )
  190.         (ascii ch)
  191.         (vl-string->list s1)
  192.         (vl-string->list s2)
  193.     )
  194. )

  195. ;; Get Visibility Parameter Name  -  Lee Mac
  196. ;; Returns the name of the Visibility Parameter of a Dynamic Block (if present)
  197. ;; blk - [vla] VLA Dynamic Block Reference object
  198. ;; Returns: [str] Name of Visibility Parameter, else nil

  199. (defun LM:getvisibilityparametername ( blk / vis )  
  200.     (if
  201.         (and
  202.             (vlax-property-available-p blk 'effectivename)
  203.             (setq blk
  204.                 (vla-item
  205.                     (vla-get-blocks (vla-get-document blk))
  206.                     (vla-get-effectivename blk)
  207.                 )
  208.             )
  209.            ;(= :vlax-true (vla-get-isdynamicblock blk)) to account for NUS dynamic blocks
  210.             (= :vlax-true (vla-get-hasextensiondictionary blk))
  211.             (setq vis
  212.                 (vl-some
  213.                    '(lambda ( pair )
  214.                         (if
  215.                             (and
  216.                                 (= 360 (car pair))
  217.                                 (= "BLOCKVISIBILITYPARAMETER" (cdr (assoc 0 (entget (cdr pair)))))
  218.                             )
  219.                             (cdr pair)
  220.                         )
  221.                     )
  222.                     (dictsearch
  223.                         (vlax-vla-object->ename (vla-getextensiondictionary blk))
  224.                         "ACAD_ENHANCEDBLOCK"
  225.                     )
  226.                 )
  227.             )
  228.         )
  229.         (cdr (assoc 301 (entget vis)))
  230.     )
  231. )

  232. ;;----------------------------------------------------------------------;;

  233. (vl-load-com)
  234. (princ
  235.     (strcat
  236.         "\n:: DBCount.lsp | Version 1.1 | \\U+00A9 Lee Mac "
  237.         (menucmd "m=$(edtime,0,yyyy)")
  238.         ""
  239.         "\n:: Type "DBCount" to Invoke ::"
  240.     )
  241. )
  242. (princ)

  243. ;;----------------------------------------------------------------------;;
  244. ;;                             End of File                              ;;
  245. ;;----------------------------------------------------------------------;;

这个源码对动态拉伸版是只能统计总数。不能分开统计动态拉伸块,求改进!

本帖子中包含更多资源

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

x
 楼主| 发表于 2021-11-9 12:54:08 | 显示全部楼层
怎么连个顶贴的都没有,自己顶一下
发表于 2021-11-9 15:42:32 | 显示全部楼层
试了一下,应该是可以统计的

本帖子中包含更多资源

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

x
 楼主| 发表于 2021-11-11 13:06:35 | 显示全部楼层
ssyfeng 发表于 2021-11-9 15:42
试了一下,应该是可以统计的

网片统计的只有一个整数,没有具体的
 楼主| 发表于 2021-12-4 17:12:59 | 显示全部楼层
看起来LM的LISP一般人都驾驭不了啊,那么久也没有大神给改一下
发表于 2022-5-12 18:15:59 | 显示全部楼层
要是有大神能改进就好了
发表于 2022-8-23 00:05:55 | 显示全部楼层
lee mac大神的没得问题,一张图都给你统计了。无法更改。自己用了命令在输入ALL就可以了。不输入ALL就是当前选中的统计状态。
 楼主| 发表于 2022-8-31 17:19:00 | 显示全部楼层
消失的天空 发表于 2022-8-23 00:05
lee mac大神的没得问题,一张图都给你统计了。无法更改。自己用了命令在输入ALL就可以了。不输入ALL就是当 ...

你没发现我那图里面统计出来的网片只是有个总数么,单个型号的没有分出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 08:19 , Processed in 0.160053 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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