找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 383|回复: 4

[每日一码] 由打开DWG复制实体到一个新图兼谈某些特殊图形处理

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-7-22 10:41:52 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 st788796 于 2017-7-22 10:44 编辑

有些拿来的图形由于代理图形的存在,会出现 ctrl+c 和 wblock 无法执行,还有一些“加密”图形,把基本对象都修改成了自定义形式,无法编辑、复制等等(仅限于没有到丧心病狂地步),这时候可以采取一个特殊方法实现“复制”实体。
现在的Autocad是支持多文档的,而且可以用 ActiveX 实现相互访问,

  1. (setq docs (vla-get-documents (vlax-get-acad-object)))

通过 docs 的 item 方法就可以访问其它打开 dwg,假定先打开一个“有问题”的 dwg 文档(以下简称为源文档),然后新建一个空文档(以下简称当前文档),切换到当前文档,用下面的代码访问源文档

  1. (setq doc (vla-item docs 0))

当前文档就是

  1. (setq curdoc (vla-get-activedocument (vlax-get-acad-object)))

从源文档的模型空间复制所有 line ,只考虑几何特征

  1. (setq cms (vla-get-modelspace curdoc))
  2. (vlax-for obj (vla-get-modelspace doc)
  3.    (if (eq (vla-get-objectname obj) "AcDbLine")
  4.       (vla-addline cms (vla-get-startpoint obj) (vla-get-endpoint obj))
  5.    )
  6. )

对于“加密”dwg,只要它提供了 ActiveX 方法,而且是继承自 AcDbLine,就可以用上述方法,只是objectname可能是另外名称

同理,想要保持 Layer Linetype 可以先行遍历源文档 layers 和 linetypes 复制到当前文档,复制的实质就是重写 vla-add 及 vla-addxxx 方法,这些方法仅用了实体的基本特征!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-7-22 11:27:26 | 显示全部楼层
本帖最后由 st788796 于 2017-7-22 12:06 编辑

下面两个是复制线形和图层doc 源文档
obj 当前文档对应的集合

  1. (defun copyltype (doc / lst)
  2.     (vlax-for lt (vla-get-linetypes doc)
  3.       (setq lst        (vl-remove-if
  4.                   '(lambda (x) (member (car x) '(-1 330 5)))
  5.                   (entget (vlax-vla-object->ename lt))
  6.                 )
  7.       )
  8.       (entmakex lst)
  9.     )
  10.   )
  11.   (defun copylayers (doc obj / clyr)
  12.     (vlax-for lyr (vla-get-layers doc)
  13.       (if (not (tblsearch "layer" (vla-get-name lyr)))
  14.         (progn
  15.           (setq clyr (vla-add obj (vla-get-name lyr)))
  16.           (vla-put-color clyr (vla-get-color lyr))
  17.           (if (tblsearch "ltype" (vla-get-linetype lyr))
  18.             (vla-put-linetype clyr (vla-get-linetype lyr))
  19.           )
  20.         )
  21.       )
  22.     )
  23.   )

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

使用道具 举报

已领礼包: 3904个

财富等级: 富可敌国

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

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 769个

财富等级: 财运亨通

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 17:48 , Processed in 0.225833 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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