明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 173|回复: 3

[源码] 批量删除多余布局

[复制链接]
发表于 昨天 16:24 | 显示全部楼层 |阅读模式
这个代码使用的是 AutoCAD ActiveX Automation 方法,下面分享给大家,本想用效率高点的ObjectDBX 方法无奈没能成功,贴子在这里希望高手帮忙解决
http://bbs.mjtd.com/forum.php?mo ... tDBX%2B%C9%BE%B3%FD

  1. (defun BatchProcessLayouts (directory includeSubDirs / doc doclst dwg layouts layoutname files)
  2.   ;; 获取目录下的所有图纸文件,包括子目录
  3.   (defun GetAllDWGFiles (Dir Subs / _GetSubFolders)
  4.     (defun _GetSubFolders (folder)
  5.       (apply 'append
  6.              (mapcar
  7.                (function
  8.                  (lambda (f)
  9.                    (cons (strcat folder "\" f) (_GetSubFolders (strcat folder "\" f)))) )
  10.                (vl-remove "." (vl-remove ".." (vl-directory-files folder nil -1)))) )
  11.     )
  12.     (apply 'append
  13.            (mapcar
  14.              (function
  15.                (lambda (filepath)
  16.                  (mapcar
  17.                    (function (lambda (filename) (strcat filepath "\" filename)))
  18.                    (vl-directory-files filepath "*.dwg" 1)) ) )
  19.              (cons Dir (if Subs (_GetSubFolders Dir)))) )
  20.   )

  21.   ;; 删除符合条件的Layout
  22.   (defun DeleteMatchingLayouts (layouts)
  23.     (vlax-for lout layouts
  24.       (setq layoutname (vla-get-name lout))
  25.       ;; 匹配条件并删除符合的Layout
  26.       (if (or (wcmatch layoutname "A4横")
  27.               (wcmatch layoutname "A4竖")
  28.               (wcmatch layoutname "A3横")
  29.               (wcmatch layoutname "A3坚"))
  30.         (progn
  31.           (princ (strcat "\nDeleting layout: " layoutname))
  32.           (vla-delete lout)
  33.         )
  34.       )
  35.     )
  36.   )

  37.   ;; 遍历打开的文件或者指定目录下的文件
  38.   (setq files (if directory (GetAllDWGFiles directory includeSubDirs) nil))

  39.   ;; 如果有文件列表,则打开并遍历这些文件
  40.   (if files
  41.     (foreach dwgfile files
  42.       ;; 打开图纸文件
  43.       (setq doc (vla-open (vla-get-Documents (vlax-get-acad-object)) dwgfile))
  44.       (if doc
  45.         (progn
  46.           (princ (strcat "\nProcessing file: " dwgfile))
  47.           ;; 获取该图纸的Layouts集合
  48.           (setq layouts (vla-get-Layouts doc))
  49.           ;; 删除符合条件的Layouts
  50.           (DeleteMatchingLayouts layouts)
  51.           ;; 保存并关闭图纸
  52.           (vla-save doc)
  53.           (vla-close doc)
  54.         )
  55.       )
  56.     )
  57.     ;; 否则,处理所有已打开的图纸
  58.     (vlax-for doc (vla-get-Documents (vlax-get-acad-object))
  59.       (princ (strcat "\nProcessing open document: " (vla-get-fullname doc)))
  60.       ;; 获取该图纸的Layouts集合
  61.       (setq layouts (vla-get-Layouts doc))
  62.       ;; 删除符合条件的Layouts
  63.       (DeleteMatchingLayouts layouts)
  64.       ;; 保存打开的图纸
  65.       (vla-save doc)
  66.     )
  67.   )
  68.   (princ "\nBatch operation completed.")
  69. )

  70. (defun c:BatchDeleteLayouts (/ directory includeSubDirs)
  71.   ;; 提示用户选择是否使用当前目录或包含子目录
  72.   (setq directory (getstring "\nEnter directory path (or leave blank for current drawings): "))
  73.   (if (/= directory "")
  74.     (setq includeSubDirs (getint "\nInclude subdirectories? (1 for Yes, 0 for No): "))
  75.   )
  76.   ;; 调用批量处理函数
  77.   (BatchProcessLayouts directory (= includeSubDirs 1))
  78. )


本帖子中包含更多资源

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

x
发表于 昨天 16:47 | 显示全部楼层
这个怎么用,两个布局没有删除
 楼主| 发表于 昨天 16:59 | 显示全部楼层
交流学习 发表于 2024-10-21 16:47
这个怎么用,两个布局没有删除

      ;; 匹配条件并删除符合的Layout
      (if (or (wcmatch layoutname "A4横")
              (wcmatch layoutname "A4竖")
              (wcmatch layoutname "A3横")
              (wcmatch layoutname "A3坚"))

修改此处要删除的布局名称
发表于 3 小时前 | 显示全部楼层
批量删除布局,要把布局名称写上去,但每张图纸布局名称
不同
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-22 18:29 , Processed in 0.169747 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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