明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1125|回复: 5

[源码] 快速遍历统计目录下面所有dwg的图层名字

[复制链接]
发表于 2024-8-28 23:08:44 | 显示全部楼层 |阅读模式

客户让我写一个统计图层名字的程序,写完了,感觉没啥用,分享出来,同时也是给自己做一个笔记
  1. (DEFUN C:TCTJ (/
  2.          $lie-chu-mu-lu-xia-suo-you-wen-jian$
  3.          delsame          dwgs
  4.          file          get-text-style-all-dbx
  5.          merge-str-by-bar        setcliptext
  6.          tcs          zx-getfolder
  7.         )
  8.   (defun get-text-style-all-dbx  (dwg    /     *error*
  9.          _getattributes     app      dbx
  10.          dir    doc     dwl      err
  11.          rtn    vrs     dwg-n    open-zt
  12.          MACRO    pt
  13.         )
  14.           ;使用dbx读取外部dwg里面的所有属性块的属性
  15.     (defun *error* (msg)
  16.       (if (and (= 'vla-object (type dbx))
  17.          (not (vlax-object-released-p dbx))
  18.     )
  19.   (vlax-release-object dbx)
  20.       )
  21.       (vl-catch-all-apply (function (lambda () (c:var nil nil))))
  22.           ;强制将变量还原
  23.       (princ)
  24.     )
  25.     (defun get-text-style (doc / n ns obj)
  26.       (SETQ MACRO "█")
  27.       (sETVAR "modemacro" MACRO)
  28.       (setq ns nil)
  29.       (vlax-for  obj (vla-get-LAYERs doc)
  30.   (setq n (vla-get-name obj))
  31.   (setq ns (cons n ns))
  32.       )
  33.       ns
  34.     )
  35.     (if  (and dwg (findfile dwg))
  36.       (cond
  37.   ((progn
  38.      (setq dbx
  39.       (vl-catch-all-apply
  40.         'vla-getinterfaceobject
  41.         (list (setq app (vlax-get-acad-object))
  42.         (if (< (setq vrs (atoi (getvar 'acadver))) 16)
  43.           "objectdbx.axdbdocument"
  44.           (strcat "objectdbx.axdbdocument." (itoa vrs))
  45.         )
  46.         )
  47.       )
  48.      )
  49.      (or (null dbx) (vl-catch-all-error-p dbx))
  50.    )
  51.    (prompt "调用dbx组件失败,请重装完整版cad")
  52.   )
  53.   (t
  54.    (vlax-for doc (vla-get-documents app)
  55.      (setq
  56.        dwl
  57.         (cons (cons (strcase (vla-get-fullname doc)) doc) dwl)
  58.      )
  59.    )
  60.    (and (vl-file-copy
  61.     dwg
  62.     (setq dwg-n (vl-filename-mktemp "1.dwg"))
  63.         )        ;复制一个dwg再打开
  64.         (setq dwg dwg-n)
  65.         (setq
  66.     open-zt  (vl-catch-all-error-p
  67.         (vl-catch-all-apply 'vla-open (list dbx dwg))
  68.       )
  69.         )
  70.         (not (vl-catch-all-error-p open-zt))
  71.    )
  72.    (if
  73.      (and  (not (vl-catch-all-error-p open-zt))
  74.     (setq doc dbx)
  75.      )
  76.       (progn
  77.         (setq rtn
  78.          (if (vl-catch-all-error-p
  79.          (setq err
  80.           (vl-catch-all-apply
  81.             (FUNCTION (LAMBDA () (get-text-style doc)))
  82.           )
  83.          )
  84.        )
  85.            (progn (print)
  86.             (princ dwg)
  87.             (princ "   ")
  88.             (princ (vl-catch-all-error-message err))
  89.            )
  90.            err
  91.          )
  92.         )
  93.       )
  94.       (princ (strcat "dwg打开失败了: "
  95.          (vl-filename-base dwg)
  96.          ".dwg"
  97.        )
  98.       )
  99.    )
  100.    (if (= 'vla-object (type dbx))
  101.      (vlax-release-object dbx)
  102.    )
  103.    (vl-catch-all-apply
  104.      (FUNCTION (LAMBDA () (vl-file-delete dwg-n)))
  105.           ;删除复制的文件
  106.    )
  107.    rtn
  108.   )
  109.       )
  110.     )
  111.     (sETVAR "modemacro" "中线CAD")
  112.     rtn
  113.   )
  114.   (defun $lie-chu-mu-lu-xia-suo-you-wen-jian$
  115.    (lst / a f fs fs-all kzm n ns ns-1 wj wjs)
  116.           ;列出目录下所有文件,含子级目录,所有目录下的文件
  117.           ;示例$lie-chu-mu-lu-xia-suo-you-wen-jian$(list(cons "目录" "C:\\uploads")(cons "扩展名" "*.dwg")))
  118.     (or  (and lst
  119.        (= (type lst) 'list)
  120.        (setq kzm (cdr (assoc "扩展名" lst)))
  121.        (> (strlen kzm) 0)
  122.        (wcmatch kzm "[,`*.*,]")
  123.   )
  124.   (setq kzm "*.*")
  125.     )
  126.     (or  (and lst
  127.        (= (type lst) 'list)
  128.        (setq f (cdr (assoc "目录" lst)))
  129.   )
  130.   (and lst (= (type lst) 'str) (setq f lst))
  131.     )
  132.     (and
  133.       f
  134.       kzm
  135.       (findfile f)
  136.       (progn
  137.   (while (and f (wcmatch f "*`\\*"))
  138.     (setq f (vl-string-subst "/" "\\" f))
  139.   )
  140.   (setq fs-all nil)
  141.   (setq fs-all (cons f fs-all))
  142.   (setq fs (vl-directory-files f "*.*" -1))
  143.   (setq fs (vl-remove ".." fs))
  144.   (setq fs (vl-remove "." fs))
  145.   (setq fs (mapcar (function (lambda (a) (strcat f "/" a))) fs))
  146.   (setq fs-all (APPEND fs-all fs))
  147.   (while (AND fs (setq f (last fs)) (< (length fs-all) 10000))
  148.     (setq ns nil)
  149.     (setq ns (vl-directory-files f "*.*" -1))
  150.     (setq ns (vl-remove ".." ns))
  151.     (setq ns (vl-remove "." ns))
  152.     (while (setq a (car ns))
  153.       (setq n (strcat f "/" a))
  154.       (setq fs (cons n fs))
  155.       (setq fs-all (cons n fs-all))
  156.       (setq ns (cdr ns))
  157.     )
  158.     (setq fs (reverse (cdr (reverse fs))))
  159.   )
  160.   (and fs-all
  161.        (progn
  162.          (setq wjs nil)
  163.          (while (setq a (car fs-all))
  164.      (setq wj nil)
  165.      (setq wj (vl-directory-files a kzm 1))
  166.      (setq wj (vl-remove ".." wj))
  167.      (setq wj (vl-remove "." wj))
  168.      (setq
  169.        wj
  170.         (mapcar (function (lambda (b) (strcat a "/" b))) wj)
  171.      )
  172.      (setq wjs (cons wj wjs))
  173.      (setq fs-all (cdr fs-all))
  174.          )
  175.          (setq wjs (vl-remove nil wjs))
  176.        )
  177.   )
  178.       )
  179.     )
  180.     wjs
  181.   )
  182.   (defun setClipText (str / html result)
  183.           ;往剪切板上丢数据
  184.     (if  (and str (= 'STR (type str)))
  185.       (progn
  186.   (setq html   (vlax-create-object "htmlfile")
  187.         result (vlax-invoke
  188.            (vlax-get (vlax-get html 'ParentWindow)
  189.          'ClipBoardData
  190.            )
  191.            'setData
  192.            "Text"
  193.            str
  194.          )
  195.   )
  196.   (vlax-release-object html)
  197.   str
  198.       )
  199.     )          ;end if
  200.   )
  201.   (defun zx-getfolder (msg dir bit / err fld pth shl slf hwd)
  202.           ;浏览目录,获取目录,指定目录,目录路径
  203.           ; Displays a dialog prompting the user to select a folder.
  204.           ; msg - [str] 提示信息
  205.           ; dir - [str] 限定用户文件夹路径,可以是nil
  206.           ; bit - [int] 对话框类型参数,如1 2 4 8 16....
  207.           ; Returns: [str] Selected folder filepath, else nil.
  208.     (OR bit (SETQ bit 1))
  209.     (setq app (vlax-get-acad-object))
  210.     (setq shl (vl-catch-all-apply
  211.     'vla-getinterfaceobject
  212.     (list app "shell.application")
  213.         )
  214.     )
  215.     (setq hwd (vl-catch-all-apply 'vla-get-hwnd (list app)))
  216.     (if  (vl-catch-all-error-p hwd)
  217.       (setq hwd 0)
  218.     )
  219.     (setq fld (vl-catch-all-apply
  220.     'vlax-invoke-method
  221.     (list
  222.       shl 'browseforfolder hwd msg bit dir)
  223.         )
  224.     )
  225.     (setq slf (vl-catch-all-apply 'vlax-get-property (list fld 'self)))
  226.     (setq pth (vl-catch-all-apply 'vlax-get-property (list slf 'path)))
  227.     (setq pth (vl-catch-all-apply
  228.     'vl-string-translate
  229.     (list "/" "\\" pth)
  230.         )
  231.     )
  232.     (setq
  233.       pth (vl-catch-all-apply 'vl-string-right-trim (list "\\" pth))
  234.     )
  235.     (vl-catch-all-apply 'vlax-release-object (list slf))
  236.     (vl-catch-all-apply 'vlax-release-object (list fld))
  237.     (vl-catch-all-apply 'vlax-release-object (list shl))
  238.     (if  (vl-catch-all-error-p pth)
  239.       (progn (PRINT (vl-catch-all-error-message pth)) nil)
  240.       pth
  241.     )
  242.   )
  243.   (defun merge-str-by-bar (strlst bar / str len bars str-last)
  244.           ;拼接子串,列表转子串
  245.     (if  (and strlst
  246.        bar
  247.        (= (type strlst) 'list)
  248.        (setq strlst (vl-remove nil strlst))
  249.        (= (type (CAR strlst)) 'STR)
  250.        (= (type bar) 'str)
  251.   )
  252.       (progn
  253.   (setq str-last (last strlst))
  254.   (setq str-bar
  255.          (mapcar
  256.      (function (lambda (a)
  257.            (or (and a (= (type a) 'str)) (setq a ""))
  258.            (strcat a bar)
  259.          )
  260.      )
  261.      (reverse (cdr (reverse strlst)))
  262.          )
  263.   )
  264.   (setq str (apply 'strcat str-bar))
  265.   (setq str (strcat str str-last))
  266.       )
  267.     )
  268.     str
  269.   )
  270.   (defun delsame (lst / s-car new)
  271.           ;删除表中重复项,删除重复
  272.     (setq lst (vl-remove nil lst))
  273.     (while (setq s-car (car lst))
  274.       (if (vl-position s-car new)
  275.   ()
  276.   (setq new (cons s-car new))
  277.       )
  278.       (setq lst (cdr lst))
  279.     )
  280.     (setq new (reverse new))
  281.     new
  282.   )
  283.   (setq file (zx-getfolder "请选择目录开始统计图层" nil 256))
  284.   (setq  dwgs ($lie-chu-mu-lu-xia-suo-you-wen-jian$
  285.          (list
  286.      (cons
  287.        "目录"
  288.        file
  289.      )
  290.      (cons "扩展名" "*.dwg")
  291.          )
  292.        )
  293.   )
  294.   (SETQ dwgs (APPLY 'APPEND dwgs))
  295.   (SETQ  TCS (MAPCAR (FUNCTION (LAMBDA (A)
  296.         (get-text-style-all-dbx A)
  297.             )
  298.         )
  299.         DWGS
  300.       )
  301.   )
  302.   (SETQ TCS (APPLY 'APPEND TCS))
  303.   (SETQ TCS (delsame TCS))
  304.   (setClipText (merge-str-by-bar tcs "\n"))
  305.   (alert "已经放到剪切板了,您可以粘贴到其它软件了")
  306. )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-8-29 00:22:33 | 显示全部楼层
谢谢大佬的分享!
很棒的资料
发表于 2024-8-29 08:54:08 | 显示全部楼层
大佬能不能写一个这种程序?

http://bbs.mjtd.com/thread-191012-1-1.html
发表于 2024-8-29 09:39:00 | 显示全部楼层
图层名称汇出,主要用来检视制图者的设计分类,也可能会用到,收藏!
发表于 2024-8-29 16:43:10 | 显示全部楼层
感谢大佬的分享,精品
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-23 05:57 , Processed in 0.147440 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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