明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 431|回复: 8

[提问] 这个用ObjectDBX进行图纸打开批处理删除布局要怎么改才能正常运行呢?

[复制链接]
发表于 2024-10-21 10:38:50 | 显示全部楼层 |阅读模式
  1. (defun BatchProcessLayouts (directory includeSubDirs / doc dbx 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.   ;; 获取所有符合条件的图纸文件
  22.   (setq files (if directory (GetAllDWGFiles directory includeSubDirs) nil))
  23.   
  24.   ;; 初始化ObjectDBX对象
  25.   (defun OpenObjectDBXDocument (filename / dbxdoc acadapp)
  26.     (setq acadapp (vlax-get-acad-object))
  27.     (setq dbxdoc (vla-getinterfaceobject acadapp "ObjectDBX.AxDbDocument"))
  28.     (vla-open dbxdoc filename)
  29.     dbxdoc
  30.   )
  31.   
  32.   ;; 批量处理文件
  33.   (if files
  34.     (foreach dwgfile files
  35.       ;; 打开图纸文件使用ObjectDBX
  36.       (setq dbx (OpenObjectDBXDocument dwgfile))
  37.       (if dbx
  38.         (progn
  39.           (princ (strcat "\nProcessing file: " dwgfile))
  40.           ;; 获取该图纸的Layouts集合
  41.           (setq layouts (vla-get-Layouts dbx))
  42.           ;; 遍历Layouts
  43.           (vlax-for lout layouts
  44.             (setq layoutname (vla-get-name lout))
  45.             ;; 匹配条件并删除符合的Layout
  46.             (if (or (wcmatch layoutname "A4横")
  47.                     (wcmatch layoutname "A4竖")
  48.                     (wcmatch layoutname "A3横")
  49.                     (wcmatch layoutname "A3坚"))
  50.               (progn
  51.                 (princ (strcat "\nDeleting layout: " layoutname))
  52.                 (vla-delete lout)
  53.               )
  54.             )
  55.           )
  56.           ;; 保存图纸(不需要显示)
  57.           (vla-save dbx)
  58.           ;; 释放ObjectDBX对象
  59.           (vlax-release-object dbx)
  60.         )
  61.       )
  62.     )
  63.   )
  64.   (princ "\nBatch operation completed.")
  65. )

  66. (defun c:BatchDeleteLayouts (/ directory includeSubDirs)
  67.   ;; 提示用户选择是否使用当前目录或包含子目录
  68.   (setq directory (getstring "\nEnter directory path (or leave blank for current drawings): "))
  69.   (if (/= directory "")
  70.     (setq includeSubDirs (getint "\nInclude subdirectories? (1 for Yes, 0 for No): "))
  71.   )
  72.   ;; 调用批量处理函数
  73.   (BatchProcessLayouts directory (= includeSubDirs 1))
  74. )
运行后出现如下错误:

Include subdirectories? (1 for Yes, 0 for No): 1
;错误:Automation 错误。加载应用程序时出现问题

本帖子中包含更多资源

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

x
发表于 2024-10-21 11:14:27 | 显示全部楼层
dbx需要带版本号才能获取
(setq        key "ObjectDBX.AxDbDocument"
        val (atoi (getvar "acadver"))
  )
  (vla-GetInterfaceObject
    (vlax-get-acad-object)
    (if        (< val 16)
      key
      (strcat key "." (itoa val))
    )
  )
 楼主| 发表于 2024-10-21 11:35:48 | 显示全部楼层
kozmosovia 发表于 2024-10-21 11:14
dbx需要带版本号才能获取
(setq        key "ObjectDBX.AxDbDocument"
        val (atoi (getvar "acadver"))

谢谢大佬的指点,现在代码改为如下
  1. (defun BatchProcessLayouts (directory includeSubDirs / dbdoc 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.   ;; 打开ObjectDBX文档的方法
  22.   (defun OpenObjectDBXDocument (filename / dbdoc acadapp key val)
  23.     (setq acadapp (vlax-get-acad-object))
  24.     (setq key "ObjectDBX.AxDbDocument"
  25.           val (atoi (getvar "ACADVER")))  ;; 获取AutoCAD版本
  26.     ;; 根据版本号获取ObjectDBX对象
  27.     (setq dbdoc
  28.           (vla-GetInterfaceObject
  29.             acadapp
  30.             (if (< val 16)
  31.               key
  32.               (strcat key "." (itoa val))
  33.             )
  34.           )
  35.     )
  36.     (vla-open dbdoc filename)
  37.     dbdoc
  38.   )

  39.   ;; 获取符合条件的图纸文件
  40.   (setq files (if directory (GetAllDWGFiles directory includeSubDirs) nil))

  41.   ;; 批量处理图纸文件
  42.   (if files
  43.     (foreach dwgfile files
  44.       (setq dbdoc (OpenObjectDBXDocument dwgfile))  ;; 使用ObjectDBX打开图纸
  45.       (if dbdoc
  46.         (progn
  47.           (princ (strcat "\nProcessing file: " dwgfile))
  48.           ;; 获取Layouts集合
  49.           (vlax-for lout (vla-get-Layouts dbdoc)
  50.             (setq layoutname (vla-get-name lout))
  51.             ;; 如果匹配Layout名称,删除该Layout
  52.             (if (or (wcmatch layoutname "A4横")
  53.                     (wcmatch layoutname "A4竖")
  54.                     (wcmatch layoutname "A3横")
  55.                     (wcmatch layoutname "A3坚"))
  56.               (progn
  57.                 (princ (strcat "\nDeleting layout: " layoutname))
  58.                 (vla-delete lout)
  59.               )
  60.             )
  61.           )
  62.           ;; 保存更改
  63.           (vla-save dbdoc)
  64.           ;; 释放对象
  65.           (vlax-release-object dbdoc)
  66.         )
  67.       )
  68.     )
  69.   )
  70.   (princ "\nBatch operation completed.")
  71. )

  72. (defun c:BatchDeleteLayouts (/ directory includeSubDirs)
  73.   ;; 提示用户选择目录或处理当前打开的图纸
  74.   (setq directory (getstring "\nEnter directory path (or leave blank for current drawings): "))
  75.   (if (/= directory "")
  76.     (setq includeSubDirs (getint "\nInclude subdirectories? (1 for Yes, 0 for No): "))
  77.   )
  78.   ;; 执行批量处理
  79.   (BatchProcessLayouts directory (= includeSubDirs 1))
  80. )


然后又现新的错误了!!请大佬再指点下谢谢

Processing file: C:\Users\hh\Desktop\板状天线\B-13-880-960M(加拿大GLs 单极化120度)\B-13-880-960M-00(装配图)02004.dwg
Deleting layout:A3坚;错误:Automation 错误。 不存在可删除的布局
命令:
发表于 2024-10-21 12:14:44 | 显示全部楼层
是“A3坚”,还是“A3竖”
 楼主| 发表于 2024-10-21 13:50:26 | 显示全部楼层
dingtiedt 发表于 2024-10-21 12:14
是“A3坚”,还是“A3竖”

是A3坚,图子原本就是这样写的
发表于 2024-10-21 14:07:03 | 显示全部楼层
(vla-delete lout)
改成
(vl-catch-all-apply 'vla-erase (list lout))
跳过错误继续执行
 楼主| 发表于 2024-10-21 14:47:55 | 显示全部楼层
kozmosovia 发表于 2024-10-21 14:07
(vla-delete lout)
改成
(vl-catch-all-apply 'vla-erase (list lout))

命令: BATCHDELETELAYOUTS
Enter directory path (or leave blank for current drawings): C:\Users\hh\Desktop\板状天线
Include subdirectories? (1 for Yes, 0 for No): 1
Processing file: C:\Users\hh\Desktop\板状天线\B-13-880-960M(加拿大GLS 单极化120度)\B-13-880-960M-00(装配图)02004.dwg
Deleting layout: A3坚
Deleting layout: A4横
Deleting layout: A4竖; 错误: Automation 错误。未提供说明。
命令:

还是错误了
发表于 2024-10-23 13:15:29 | 显示全部楼层
可以调整为布局内无视口就将其删除
发表于 2024-10-23 13:59:50 | 显示全部楼层
hsx778899 发表于 2024-10-21 14:47
命令: BATCHDELETELAYOUTS
Enter directory path (or leave blank for current drawings): C:%users\hh\ ...

有可能要删除的是当前layout,推荐将当前设为Model后再删除布局
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 20:13 , Processed in 0.205610 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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