weimeng555 发表于 2024-3-4 11:08:49

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



;; 定义函数 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不是很了解

weimeng555 发表于 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,还太会代码,再次感谢大佬技术支持,谢谢:handshake:handshake:handshake

伊江痕 发表于 2024-3-4 15:40:00

学到了,大佬多分享

szhorse 发表于 2024-3-4 16:39:29

感谢分享源码,测试了一下,非常好用
要是再实现“2、不用选择范围,直接全图遍历所有块对象,但凡是动态块的直接转为普通块,并清理图纸+保存图纸”就更爽了

paulpipi 发表于 2024-3-4 17:01:07

好源码,期待高手优化整合

weimeng555 发表于 2024-3-4 19:23:47

在补充一个测试发现的问题,就是当动态块里还有动态块的时候(嵌套块的情况),内部的嵌套的动态块不会被转换,如果有大佬能出手的话,也希望能够一并解决这个问题,谢谢{:1_1:}

jh3030912 发表于 2024-3-9 10:31:02

能否加入自动修复

weimeng555 发表于 2024-3-10 22:37:11

jh3030912 发表于 2024-3-9 10:31
能否加入自动修复

自动修复的意义感觉不大了,如果图纸真的出现问题,基本就是大问题了,建议直接追溯历史文件吧。我一般备份文件都是50个,3分钟自动保存一次,后悔药永远不嫌少的
页: [1]
查看完整版本: 批量清理文件夹下dwg(分解指定图层下块,并清理保存)