明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1428|回复: 7

[提问] 批量清理文件夹下dwg(分解指定图层下块,并清理保存)

[复制链接]
发表于 2024-3-4 11:08:49 | 显示全部楼层 |阅读模式


;; 定义函数 clean-dwg-files,用于批量清理指定路径文件夹下所有dwg文件
(defun clean-dwg-files (folder-path layer-name)
  (setq files (directory (strcat folder-path "\\*.dwg"))) ; 获取文件夹下所有dwg文件
  (foreach file files
    (setq doc (vla-get-activedocument (vlax-get-acad-object)))
    (vla-open doc file) ; 打开dwg文件
    (setq drawing (vla-get-activedocument (vlax-get-acad-object)))
    (vla-zoomextents drawing) ; 调整视图
    (setq layers (vla-get-layers drawing))
    (setq layer (vla-item layers layer-name)) ; 获取指定图层
    (vla-put-visible layer :vlax-true) ; 设置图层可见
    (setq blocks (vla-get-blocks drawing))
    (setq block-references (vlax-invoke blocks 'getall)) ; 获取所有块参照
    (foreach block-reference block-references
      (vla-put-lockaspect block-reference :vlax-true) ; 锁定块比例
      (vla-explode block-reference) ; 分解块参照
    )
    (vla-purgeall drawing) ; 清理(去除)未使用的块定义
    (vla-saveas drawing file) ; 保存文件
    (vla-close drawing) ; 关闭文件
  )
)


目前的思路是:对指定文件夹下的所有dwg文件进行批量清理操作,并对名为"0-随心所欲"的图层执行块参照的分解、清理和保存操作。图纸是自己画的,指定的图层“0-随心所欲”是自己备用数据的动态块,外发的图纸都进行批量的分解、清理操作。但是运行不起来,哪位大佬能看下是哪里出错了,感激不尽

另外,想着是不是可以通过把动态块转化为普通块的方法来实现,刚接触lips不是很了解

 楼主| 发表于 2024-3-4 11:58:27 | 显示全部楼层
;;动态块改为普通快 By Gu_xl 2013.11.13
(defun c:tt (/ lst name blkdef blkref cnt)
  (if (ssget (list '(0 . "INSERT") (cons 410 (getvar 'CTAB))))
    (progn
      (setq cnt 0)
      (vlax-for        obj
                    (vla-get-activeselectionset
                      (vla-get-activedocument (vlax-get-acad-object))
                    )
        (if (and
              (vlax-property-available-p obj 'isdynamicblock)
              (eq :vlax-true (vla-get-isdynamicblock obj))
            )
          (progn
            (setq lst nil
                  cnt (1+ cnt)
            )
            (vlax-for a        (vla-item (vla-get-blocks
                                    (vla-get-activedocument
                                      (vlax-get-acad-object)
                                    )
                                  )
                                  (vla-get-name obj)
                        )
              (setq lst (cons a lst))
            )
            (setq blkdef
                   (vla-add
                     (vla-get-blocks
                       (vla-get-activedocument (vlax-get-acad-object))
                     )
                     (vlax-3d-point '(0 0 0))
                     "*U"
                   )
            )
            (vla-CopyObjects
              (vla-get-activedocument (vlax-get-acad-object))
              (vlax-make-variant
                (vlax-safearray-fill
                  (vlax-make-safearray
                    vlax-vbobject
                    (cons 0 (1- (length lst)))
                  )
                  lst
                )
              )
              blkdef
            )
            (setq name (vla-get-name blkdef))
            (setq blkref
                   (vla-InsertBlock
                     (vlax-get-property
                       (vla-get-activedocument (vlax-get-acad-object))
                       (if (= 1 (getvar 'CVPORT))
                         'PaperSpace
                         'ModelSpace
                       )
                     )
                     (vla-get-InsertionPoint obj)
                     Name
                     (vla-get-XScaleFactor obj)
                     (vla-get-YScaleFactor obj)
                     (vla-get-ZScaleFactor obj)
                     (vla-get-Rotation obj)
                   )
            )
            (vla-put-layer blkref (vla-get-layer obj))
            (vla-delete obj)
          )
        )
      )
      (princ (strcat "\n***共修改 " (itoa cnt) " 个动态块***"))
    )
  )
  (dictremove (namedobjdict) "ACAD_DGNLINESTYLECOMP")
  (dictremove (namedobjdict) "TCH_DBCONFIG")
  (command "-purge" "a" "*" "n" "audit" "y")
  (princ "图纸减肥啦")
  (princ)
)

感谢论坛的大佬Gu_xl 分享的源码,自己加上清理CAD命令,已经实现了CAD中:
1、框选范围动态块;
2、动态块转普通块;
3、并清理CAD图纸

以上需求已经满足需求了,但是想着更加自动化点,哪位大神能否优化一下命令,能否实现以下功能:
1、批量指定文件夹下的所有dwg文件
2、不用选择范围,直接全图遍历所有块对象,但凡是动态块的直接转为普通块,并清理图纸+保存图纸
刚接触lisp,还太会代码,再次感谢大佬技术支持,谢谢
发表于 2024-3-4 15:40:00 | 显示全部楼层
学到了,大佬多分享
发表于 2024-3-4 16:39:29 | 显示全部楼层
感谢分享源码,测试了一下,非常好用
要是再实现“2、不用选择范围,直接全图遍历所有块对象,但凡是动态块的直接转为普通块,并清理图纸+保存图纸”就更爽了
发表于 2024-3-4 17:01:07 来自手机 | 显示全部楼层
好源码,期待高手优化整合
 楼主| 发表于 2024-3-4 19:23:47 | 显示全部楼层
在补充一个测试发现的问题,就是当动态块里还有动态块的时候(嵌套块的情况),内部的嵌套的动态块不会被转换,如果有大佬能出手的话,也希望能够一并解决这个问题,谢谢
发表于 2024-3-9 10:31:02 来自手机 | 显示全部楼层
能否加入自动修复
 楼主| 发表于 2024-3-10 22:37:11 | 显示全部楼层
jh3030912 发表于 2024-3-9 10:31
能否加入自动修复

自动修复的意义感觉不大了,如果图纸真的出现问题,基本就是大问题了,建议直接追溯历史文件吧。我一般备份文件都是50个,3分钟自动保存一次,后悔药永远不嫌少的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 23:00 , Processed in 0.163539 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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