找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 243|回复: 1

另类Purge

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-17 20:34:05 | 显示全部楼层 |阅读模式
另类Purge

  1. 偶尔遇到一种特别大的DWG,上百兆了,打开后看着也没有多少Entity,用Purge显示没有可清的东西,经过分析Dwg中附加的信息太多,可能包括Xdat、Dict、Xrecord等等,如果一个个处理可能要逐一分析,太麻烦,下面用简单的步骤和简单的几个语句实现另类“Purge”
  2. 1 打开Dwg,这里太大的DWG可能在32bit系统和CAD会很慢,为了最简单处理,确保CAD仅有这一个文档打开
  3. 2 文件-〉新建一个文档,用默认设置
  4. 3 打开Vlisp编辑器
  5. 4 把下面几句粘贴进去,加载,慢慢等待,Ok
  6. 5 保存图形,前后对比看看能瘦身多少
  7. 说明:
  8. a:字体样式复制是必须的,否则可能无法显示部分字体
  9. b:  图块复制也是必须的,否则Insert无法生成
  10. c:图层复制非必须,复制仅是为了保持原汁原味,否则可能都是一种白色
  11. 声明:本语句处理有风险,后果自负!
  12. [pcode=lisp,true]
  13. (setq *acad* (vlax-get-acad-object)
  14.       doc    (vla-item (vla-get-documents *acad*) 0)
  15. )
  16. ;;复制另外图形图层
  17. (vlax-for lay (vla-get-layers doc)
  18.   (entmake (entget (vlax-vla-object->ename lay)))
  19. )
  20. ;;复制另外图形字体
  21. (vlax-for sty (vla-get-textstyles doc)
  22.   (entmake (entget (vlax-vla-object->ename sty)))
  23. )
  24. ;;构造另外图块定义
  25. (vlax-for obj (vla-get-blocks doc)
  26.   (if (not (wcmatch (strcase (vla-get-name obj)) "*SPACE*"))
  27.     (setq bl (cons obj bl))
  28.   )
  29. )
  30. ;;拷贝另外图块定义
  31. (vla-CopyObjects
  32.   doc
  33.   (vlax-safearray-fill
  34.     (vlax-make-safearray
  35.       vlax-vbObject
  36.       (cons 0 (1- (length bl)))
  37.     )
  38.     bl
  39.   )
  40.   (vla-get-blocks (vla-get-activedocument *acad*))
  41. )
  42. ;;复制另外图形实体
  43. (vlax-for obj (vla-get-modelspace doc)
  44.   ;;如果保留扩展数据用下面这句
  45.   ;;(entmake (entget (vlax-vla-object->ename obj) '("*")))
  46.   ;;不保留扩展数据
  47.   (entmake (entget (vlax-vla-object->ename obj)))
  48. )
  49. ;;回收变量
  50. (vlax-release-object *acad*)
  51. (vlax-release-object doc)
  52. (setq bl nil
  53.       *acad* nil
  54.       doc nil
  55. )[/pcode]
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-2-17 20:34:53 | 显示全部楼层
  1. 使用Wblock可以干净的提取出图形实体,缺点是没有对象的图层、字体、图块丢失了!
  2. 另外楼主的复制最好都采用CopyObjects方法,修改如下:
  3. [pcode=lisp,true](setq *acad* (vlax-get-acad-object)
  4.       doc    (vla-item (vla-get-documents *acad*) 0)
  5. )
  6. (defun itemsall (coll / l)
  7.   (vlax-for a coll (setq l (cons a l)))
  8.   (reverse l)
  9.   )
  10. ;;复制图层、
  11. (vlax-invoke doc  'CopyObjects (itemsall (vla-get-layers doc)) (vla-get-layers (vla-get-ActiveDocument *acad*)))
  12. ;;复制另外图形字体
  13. (vlax-invoke doc  'CopyObjects (itemsall (vla-get-textstyles doc)) (vla-get-textstyles (vla-get-ActiveDocument *acad*)))
  14. (setq l nil)
  15. ;;复制块定义
  16. (vlax-invoke
  17.   Doc
  18.   'CopyObjects
  19.   (vlax-for blk (vla-get-blocks Doc)
  20.     (if (/= :vlax-true (vla-get-islayout blk))
  21.       (setq l (cons blk l))
  22.       l
  23.       )
  24.     )
  25.   (vla-get-blocks (vla-get-ActiveDocument *acad*))
  26. )
  27. ;;复制线型
  28. (vlax-invoke doc  'CopyObjects (itemsall (vla-get-Linetypes doc)) (vla-get-Linetypes (vla-get-ActiveDocument *acad*)))
  29. ;;复制实体
  30. (vlax-invoke doc  'CopyObjects (itemsall (vla-get-ModelSpace doc)) (vla-get-ModelSpace (vla-get-ActiveDocument *acad*)))
  31. [/pcode]
  32. 还可以采用ObjectDBX方法,根本无需打开源文件,直接复制实体、图层、块等等!
  33. [pcode=lisp,true]
  34. (setq *acad* (vlax-get-acad-object)
  35.       DBXDoc (vla-GetInterfaceObject
  36.                *acad*
  37.                (if (< (setq acVer (atoi (getvar "ACADVER"))) 16)
  38.                  "ObjectDBX.AxDbDocument"
  39.                  (strcat "ObjectDBX.AxDbDocument." (itoa acVer))
  40.                  )
  41.                )
  42.       )
  43. (defun itemsall (coll / l)
  44.   (vlax-for a coll (setq l (cons a l)))
  45.   (reverse l)
  46.   )
  47. (vla-open DBXDoc (getfiled "" "" "dwg" 4))
  48. ;;复制图层、
  49. (vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-layers DBXDoc)) (vla-get-layers (vla-get-ActiveDocument *acad*)))
  50. ;;复制另外图形字体
  51. (vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-textstyles DBXDoc)) (vla-get-textstyles (vla-get-ActiveDocument *acad*)))
  52. (setq l nil)
  53. ;;复制块定义
  54. (vlax-invoke
  55.   DBXDoc
  56.   'CopyObjects
  57.   (vlax-for blk (vla-get-blocks DBXDoc)
  58.     (if (/= :vlax-true (vla-get-islayout blk))
  59.       (setq l (cons blk l))
  60.       l
  61.       )
  62.     )
  63.   (vla-get-blocks (vla-get-ActiveDocument *acad*))
  64. )
  65. ;;复制线型
  66. (vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-Linetypes DBXDoc)) (vla-get-Linetypes (vla-get-ActiveDocument *acad*)))
  67. ;;复制实体
  68. (vlax-invoke DBXDoc  'CopyObjects (itemsall (vla-get-ModelSpace DBXDoc)) (vla-get-ModelSpace (vla-get-ActiveDocument *acad*)))[/pcode]
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 02:27 , Processed in 0.148691 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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