llsheng_73 发表于 2022-7-18 17:11:00

自定义清理

;|(Mpurge DOC'((groups t)(Layouts)(SelectionSets )(blocks)(layers)(textstyles)(dimstyles)(Linetypes)(Viewports)(Views)(UserCoordinateSystems)))
清理Doc文档下的空组、删除布局、空选择集、清理未引用块、字体样式、标注样式、线型、视口、视图、ucs;
lst表每一项第一个为文档下的各种集合,出现第二项且非nilt时,清理该集合下的空对象,无第二项或第二项非真时,尽可能删除集合下所有对象;
DOC为当前CAD对象下的任一文档对象或dbx对象,doc为nil或非文档对象时,被自动设置为当前文档|;
(defun Mpurge(DOC LST / l n)
(or(not(VL-CATCH-ALL-ERROR-P(VL-CATCH-ALL-APPLY'vlax-get-property(List doc 'Database))))
   (setq DOC(vlax-get-property(vlax-get-acad-object)'ActiveDocument)))
(vl-every(function(lambda(x / a b)
                      (or(VL-CATCH-ALL-ERROR-P(setq a(VL-CATCH-ALL-APPLY 'vlax-get-property(list doc(car x)))))
                         (progn(setq n(1+(vlax-get-property a'count)))
                           (while(<(setq l(vlax-get-property a'count))n)
                           (setq n l)
                           (vlax-for y a
                               (and(if(cdr x)(<(vlax-get-property y'count)1)t)
                                 (VL-CATCH-ALL-APPLY 'vlax-invoke-method(list y 'delete))))))
                         t)))LST))
测试时,我换2台电脑用2006清理嵌套块出错,但其它版本CAD下测试正常,不知道究竟是电脑问题还是CAD2006的问题

tigcat 发表于 2022-7-18 22:13:00

;经过实测,楼主大大函数非常好用,感觉加一句"repeat"效果好一点
(setq LST '((layers)(groups t)(blocks)(blocks t)(textstyles)(dimstyles)) ;增加标注样式
(defun Mpurge (LST)
(repeat 3   ;一次好像清不干净,来3次
(vl-every
    '(lambda (x / a b)
       (or
         (VL-CATCH-ALL-ERROR-P
         (setq a (VL-CATCH-ALL-APPLY
                     'vlax-get-property
                     (list (vlax-get-property      ;若用于dbx,修改此处
                           (vlax-get-acad-object)
                           'ActiveDocument
                           )
                           (car x)
                     )
                   )
         )
         )
         (if (cdr x)
         (vlax-for y a
             (and
               (< (vlax-get-property y 'count) 1)
               (VL-CATCH-ALL-APPLY 'vlax-invoke-method (list y 'delete))
             )
         )
         (vlax-for y a
             (VL-CATCH-ALL-APPLY 'vlax-invoke-method (list y 'delete))
         )
         )
         t
       )
   )
    lst
)
);end repeat
)

llsheng_73 发表于 2022-7-19 08:07:00


repeat实际上是没必要的,但为什么会一次搞不干净,其实是相互牵扯,比如一个图层没有任何东西,但有一个未被参照的图块里边用到了该图层,那么在这个图块被清理前,这个图层是清理不掉的,另外文字样式也一样,就算图中没有任何文字或属性,但同样的一个块里边用到了这个文字样式,它同样也只能在块被清理之后才能被清理掉
这样一来,由于一次性清理没太考究顺序问题,所以就会理清不干净,需要repeat几次后它就干净了,实际上,注意一下顺序就可以一次清理干净

tigcat 发表于 2022-7-19 09:05:00


谢谢楼主耐心回复,这个程序最大的好处就是可以用来dbx,实现不开图批量清理。非常方便。这些天刚好在搜这个,搜遍全网,用lisp实现的就只看到1.2个,1个是楼主的,另外0.2个是MP的,他提供了伪源码。谢谢楼主大侠的经典源码!

tigcat 发表于 2022-7-18 17:58:00

我怀疑这个清理功能可以用于dbx

llsheng_73 发表于 2022-7-18 19:33:00


(vlax-get-property(vlax-get-acad-object)'ActiveDocument)
这部分换成DBX对象就可以了

tigcat 发表于 2022-7-18 21:40:00


谢谢大佬,多日的疑惑或许马上就要解开,我先试验,这可是连沼泽MP都没具体回答的一个难题.

magicheno 发表于 2022-7-18 22:12:00

感谢大佬分享

伪书虫86 发表于 2022-7-18 23:04:00

收藏备用
页: [1]
查看完整版本: 自定义清理