找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 9412|回复: 27

[他山之石] 另类Purge

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-4-25 23:41:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
偶尔遇到一种特别大的DWG,上百兆了,打开后看着也没有多少Entity,用Purge显示没有可清的东西,经过分析Dwg中附加的信息太多,可能包括Xdat、Dict、Xrecord等等,如果一个个处理可能要逐一分析,太麻烦,下面用简单的步骤和简单的几个语句实现另类“Purge”
1 打开Dwg,这里太大的DWG可能在32bit系统和CAD会很慢,为了最简单处理,确保CAD仅有这一个文档打开
2 文件-〉新建一个文档,用默认设置
3 打开Vlisp编辑器
4 把下面几句粘贴进去,加载,慢慢等待,Ok
5 保存图形,前后对比看看能瘦身多少
说明:
a:字体样式复制是必须的,否则可能无法显示部分字体
b:  图块复制也是必须的,否则Insert无法生成
c:图层复制非必须,复制仅是为了保持原汁原味,否则可能都是一种白色

声明:本语句处理有风险,后果自负!

[pcode=lisp,true]
(setq *acad* (vlax-get-acad-object)
      doc    (vla-item (vla-get-documents *acad*) 0)
)
;;复制另外图形图层
(vlax-for lay (vla-get-layers doc)
  (entmake (entget (vlax-vla-object->ename lay)))
)
;;复制另外图形字体
(vlax-for sty (vla-get-textstyles doc)
  (entmake (entget (vlax-vla-object->ename sty)))
)
;;构造另外图块定义
(vlax-for obj (vla-get-blocks doc)
  (if (not (wcmatch (strcase (vla-get-name obj)) "*SPACE*"))
    (setq bl (cons obj bl))
  )
)
;;拷贝另外图块定义
(vla-CopyObjects
  doc
  (vlax-safearray-fill
    (vlax-make-safearray
      vlax-vbObject
      (cons 0 (1- (length bl)))
    )
    bl
  )
  (vla-get-blocks (vla-get-activedocument *acad*))
)
;;复制另外图形实体
(vlax-for obj (vla-get-modelspace doc)
  ;;如果保留扩展数据用下面这句
  ;;(entmake (entget (vlax-vla-object->ename obj) '("*")))
  ;;不保留扩展数据
  (entmake (entget (vlax-vla-object->ename obj)))
)
;;回收变量
(vlax-release-object *acad*)
(vlax-release-object doc)
(setq bl nil
      *acad* nil
      doc nil
)[/pcode]

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-4-26 09:31:44 | 显示全部楼层
本帖最后由 牢固 于 2013-4-26 18:30 编辑

使用Wblock可以干净的提取出图形实体,缺点是没有对象的图层、字体、图块丢失了!
另外楼主的复制最好都采用CopyObjects方法,修改如下:
[pcode=lisp,true](setq *acad* (vlax-get-acad-object)
      doc    (vla-item (vla-get-documents *acad*) 0)
)
(defun itemsall (coll / l)
  (vlax-for a coll (setq l (cons a l)))
  (reverse l)
  )
;;复制图层、
(vlax-invoke doc  'CopyObjects (itemsall (vla-get-layers doc)) (vla-get-layers (vla-get-ActiveDocument *acad*)))
;;复制另外图形字体
(vlax-invoke doc  'CopyObjects (itemsall (vla-get-textstyles doc)) (vla-get-textstyles (vla-get-ActiveDocument *acad*)))
(setq l nil)
;;复制块定义
(vlax-invoke
  Doc
  'CopyObjects
  (vlax-for blk (vla-get-blocks Doc)
    (if (/= :vlax-true (vla-get-islayout blk))
      (setq l (cons blk l))
      l
      )
    )
  (vla-get-blocks (vla-get-ActiveDocument *acad*))
)
;;复制线型
(vlax-invoke doc  'CopyObjects (itemsall (vla-get-Linetypes doc)) (vla-get-Linetypes (vla-get-ActiveDocument *acad*)))
;;复制实体
(vlax-invoke doc  'CopyObjects (itemsall (vla-get-ModelSpace doc)) (vla-get-ModelSpace (vla-get-ActiveDocument *acad*)))
[/pcode]
还可以采用ObjectDBX方法,根本无需打开源文件,直接复制实体、图层、块等等!
[pcode=lisp,true]
(setq *acad* (vlax-get-acad-object)
      DBXDoc (vla-GetInterfaceObject
               *acad*
               (if (< (setq acVer (atoi (getvar "ACADVER"))) 16)
                 "ObjectDBX.AxDbDocument"
                 (strcat "ObjectDBX.AxDbDocument." (itoa acVer))
                 )
               )

      )
(defun itemsall (coll / l)
  (vlax-for a coll (setq l (cons a l)))
  (reverse l)
  )
(vla-open DBXDoc (getfiled "" "" "dwg" 4))
;;复制图层、
(vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-layers DBXDoc)) (vla-get-layers (vla-get-ActiveDocument *acad*)))
;;复制另外图形字体
(vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-textstyles DBXDoc)) (vla-get-textstyles (vla-get-ActiveDocument *acad*)))
(setq l nil)
;;复制块定义
(vlax-invoke
  DBXDoc
  'CopyObjects
  (vlax-for blk (vla-get-blocks DBXDoc)
    (if (/= :vlax-true (vla-get-islayout blk))
      (setq l (cons blk l))
      l
      )
    )
  (vla-get-blocks (vla-get-ActiveDocument *acad*))
)

;;复制线型
(vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-Linetypes DBXDoc)) (vla-get-Linetypes (vla-get-ActiveDocument *acad*)))
;;复制实体
(vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-ModelSpace DBXDoc)) (vla-get-ModelSpace (vla-get-ActiveDocument *acad*)))[/pcode]

点评

试了试第二种方案,没有能成功。不知道方法不对还是哪里出问题了。  发表于 2013-4-26 13:17

评分

参与人数 1D豆 +5 收起 理由
XDSoft + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

发表于 2013-4-25 23:50:00 | 显示全部楼层
楼主好人 感谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-4-26 00:06:39 | 显示全部楼层
上面的三个顺序应该是:图层-〉字体-〉图块-〉实体

点评

图块不能直接Entmake,因为里面有子实体,用 CopyObject  发表于 2013-4-26 00:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-4-26 13:55:41 | 显示全部楼层

*acad* 和函数itemsall 没写在代码里,自己就不会补上后再试么?

点评

加了*acad* 和函数itemsall!  发表于 2013-4-26 14:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 188个

财富等级: 日进斗金

发表于 2013-4-26 16:19:45 | 显示全部楼层
牢固 发表于 2013-4-26 13:55
*acad* 和函数itemsall 没写在代码里,自己就不会补上后再试么?

换了另一张图可以了。但是新的文档比原来的文档体积还要大。没有起到“Purge”的作用!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-4-26 18:28:50 | 显示全部楼层
SmartStar 发表于 2013-4-26 16:19
换了另一张图可以了。但是新的文档比原来的文档体积还要大。没有起到“Purge”的作用!

问题出在复制块定义!楼上代码已改好!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2013-4-26 18:41:47 来自手机 | 显示全部楼层
有时候遇到无法复制到其他图的dwg,也可以参照这个方法来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-19 23:02:05 | 显示全部楼层
eachy 发表于 2013-4-26 18:41
有时候遇到无法复制到其他图的dwg,也可以参照这个方法

对哦!记得几年前遇到一个总图!无法使用复制粘贴命令ctrl+v。在其他图纸中命令都没问题!请问何解?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-20 00:53:39 | 显示全部楼层
wowan1314 发表于 2013-5-19 21:02
对哦!记得几年前遇到一个总图!无法使用复制粘贴命令ctrl+v。在其他图纸中命令都没问题!请问何解?

一般的理解是块名重复,尤其是父子同名;二班的理解是图纸有问题,某张图,可能没几根线条,但^c^v失灵了,这种情况也碰到过.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-20 08:32:26 | 显示全部楼层
cy956 发表于 2013-5-20 00:53
一般的理解是块名重复,尤其是父子同名;二班的理解是图纸有问题,某张图,可能没几根线条,但^c^v失灵了 ...

受教了!请问如何破?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-20 09:38:41 | 显示全部楼层
谢谢,楼主
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2013-6-16 22:39:43 | 显示全部楼层
不错的源码!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-18 18:19:44 | 显示全部楼层
学习学习源码,感谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-22 10:02:44 | 显示全部楼层
好的idea~~~~~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-26 00:37 , Processed in 0.450023 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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