读取DWG文件将全部实体变为一个块

将DWG文件中所有DBObject组成一个块, 如果DWG文件中有属性参照, 则属性变为块属性.
我刚开始学习不久.Net AutoCAD的二次开发, 所以记录在这里我自己写的或者参照的一个些方法

/// <summary>
/// 将DWG文件所有DBObject组成一个块, 如果DWG文件中有属性, 则属性变为块属性
/// </summary>
/// <param name="insertPoint">插入点</param>
/// <param name="scale">插入比例</param>
/// <param name="blockName">块表记录名</param>
/// <param name="filePash">DWG文件路径</param>
/// <returns>块参照</returns>
public BlockReference InsertBlockReference(Point3d insertPoint, double scale, string blockName, string filePash)
{BlockReference blockReference = null;Document curDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; //获取当前文档using (DocumentLock docLock = curDoc.LockDocument()) //锁定文档{using (Transaction trans = curDoc.TransactionManager.StartTransaction()) //事务{try{BlockTable curBlockTb = trans.GetObject(curDoc.Database.BlockTableId, OpenMode.ForRead) as BlockTable; //当前文档块表ObjectId blockObjId = new ObjectId(); //用于块表记录的编号if (curBlockTb.Has(blockName) && !curBlockTb[blockName].IsErased) //块表中存在该块表记录, 并且没有被删除blockObjId = curBlockTb[blockName];else{if (!System.IO.File.Exists(filePash)) //不存在该文件{trans.Abort(); //事务终止return blockReference;}Database sourceDB = new Database(false, true);sourceDB.ReadDwgFile(filePash, FileShare.Read, true, null); //后台读取DWG文件信息; 参数: 文件名, 打开方式, 是否允许转换版本, 密码blockObjId = curDoc.Database.Insert(blockName, sourceDB, false); //将一个数据库插入到当前数据库的一个块中; 参数: 新创建的块表记录名, 资源数据库, 资源数据库是否保存原样sourceDB.CloseInput(true); //是否关闭ReadDwgFile()方法之后打开的文件sourceDB.Dispose();}if (blockObjId != null){string layoutName = LayoutManager.Current.CurrentLayout; //获得当前布局空间BlockTableRecord block = trans.GetObject(blockObjId, OpenMode.ForWrite) as BlockTableRecord; //根据块表记录编号获取的块表记录, 用于取得它的属性定义block.Explodable = true; //块参照是否能被炸开blockReference = new BlockReference(insertPoint, blockObjId); //新建块参照BlockTableRecord layout = null; if (layoutName.Equals("Model"))layout = trans.GetObject(curBlockTb[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //根据当前布局空间获取的表块记录, 用于将块插入布局空间中elselayout = trans.GetObject(curBlockTb[BlockTableRecord.PaperSpace], OpenMode.ForWrite) as BlockTableRecord;layout.AppendEntity(blockReference); //在当前空间中追加此块参照trans.AddNewlyCreatedDBObject(blockReference, true); if (!block.HasAttributeDefinitions) //如果该块表记录中不包含任何属性定义goto No_AttributeDefinitions; //直接去往No_AttributeDefinitionsAttributeDefinition attriDef = null;AttributeReference attriRefe = null;Matrix3d mtr = Matrix3d.Displacement(block.Origin.GetVectorTo(insertPoint)); //Displacement 取代foreach (ObjectId entityObjId in block) //遍历块表记录中的实体编号{attriDef = trans.GetObject(entityObjId, OpenMode.ForRead) as AttributeDefinition; //打开实体通过实体编号if (attriDef == null) //若还是为nullcontinue;attriRefe = new AttributeReference(); //每次循环new一次新的对象, 确保上次属性不会残留attriRefe.SetPropertiesFrom(attriDef); //SetPropertiesFrom 设置属性来自attriRefe.SetAttributeFromBlock(attriDef, mtr); //通过块设置属性 参数: 属性定义, 变形矩阵attriRefe.TextString = ""; //设置属性值为""blockReference.AttributeCollection.AppendAttribute(attriRefe); //块参照中添加此属性参照trans.AddNewlyCreatedDBObject(attriRefe, true);attriRefe = null;}}No_AttributeDefinitions:blockReference.TransformBy(Matrix3d.Scaling(scale, insertPoint)); //缩放块; 修改块比例trans.Commit(); //提交事务}catch (System.Exception ex){if (blockReference != null){blockReference = null;}return blockReference;}}}return blockReference;
}

C# AutoCAD二次开发: 读取DWG文件将全部实体变为一个块。相关推荐

  1. AutoCAD .Net 使用 Database.ReadDwgFile 读取dwg文件而不显示文档窗口

    我们常常会碰到需要读取外部的 dwg 文件,而又不想在 AutoCAD 的文档窗口中显示. AutoCAD .Net API 提供了 Database.ReadDwgFile 来实现. 我们首先需要构 ...

  2. AUTOCAD二次开发工具

    ARX(AutoCAD Runtime eXtension 实时运行扩展)作为继AutoLISP.ADS后的第三代开发工具,采用全新的面向对象编程技术. 1985年6月推出的AutoCAD2.17版本 ...

  3. eps高程点和高程注记不符_利用AutoCAD二次开发实现地形图高程点与等高线错误自动查找...

    原标题:利用AutoCAD二次开发实现地形图高程点与等高线错误自动查找 水土保持之点滴,关注后可查阅所有文章 来源:<测绘通报>2017年第5期 作者:刘洪.黄军胜 摘要:论述了数字地形图 ...

  4. 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    龙源期刊网 http://www.qikan.com.cn 基于 AutoLisp 的 AutoCAD 二次开发自动 生成系统图 作者:郎建山 金江 来源:<科技视界> 2013 年第 2 ...

  5. 读取.dwg文件“曲线救国”之读取.dxf

    简述 尝试并对比了很多种网上给的教程,总结下来读取.dwg文件很难,即使成功了,所消耗的时间成本也不值得.网上有相关的软件工具,可以直接将.dwg文件转换为.dxf文件,个(po)别(jie)的软件可 ...

  6. php dwg格式,无需AutoCAD,用C#生成DWG文件

    是一个类库:Teigha.NET for .DWG 利用它就可以在无需安装AutoCAD软件的情况下,生成.读取DWG文件,适合那些导入导出的场合. Teigha曾用名OpenDWG .DWGdire ...

  7. 用C语言编程函数求圆台体积,第六篇 AutoCAD二次开发技术.pdf

    第六章 ObjectARX 开发技术 1. AutoCAD二次开发概述 7. MFC对话框 2. ObjectARX简介 8. 搜索图形数据库及获取实体 3. 常用实体类和几何类 数据 4. 创建实体 ...

  8. AutoCAD二次开发三种添加插件按钮的方法

    在上一篇关于AutoCAD的文章中,我将很多关于CAD的博客相关资源进行了说明,这一篇文章我将介绍如何在AutoCAD中的ribbon中添加相应的按钮.就是下面这种按钮: PS:在开发中我们最好使用中 ...

  9. CAD自控lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    基于 AutoLisp 的 AutoCAD 二次开发自动生成系统图 [摘 要]本文主要阐述了应用 autolisp 语言二次开发 autocad 自动生成系统图的实现方案. [关键词] autocad ...

最新文章

  1. Process Monitor中文手册
  2. oracle和mysql文件怎么打开_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明-sql文件怎么打开...
  3. Jackson 注解 -- 忽略字段
  4. Python入门笔记之闭包
  5. SpringMVC第一个例子
  6. c++面试常考的知识点汇总
  7. 谁才是2019最火爆的编程语言,看这篇就够了
  8. vue怎么把api 挂载到全局_nvue实现全局挂载
  9. 【java】在jsp的js和css里面使用EL表达式取值|style里面用$取值
  10. 宁夏职称评计算机,宁夏专业技术人员服务平台职称评审系统:http://124.224.239.164(2)...
  11. as 从java_从Java调用AS400 RPG
  12. 【js】js传递对象
  13. 基于Java毕业设计幼儿园后勤管理系统源码+系统+mysql+lw文档+部署软件
  14. 前端html项目总结,前端实习项目总结一
  15. [影评]《太阳照样升起》
  16. mhw跳过结尾_怪物猎人世界怎么跳过剧情
  17. 解密中概股的“杀手”:做空者
  18. 考研数学一无穷级数总结
  19. Leetcode打卡四:将给定的单链表L: L 0→L 1→…→L n-1→L n, 重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→… 要求使用原地算法,并且不改变节点的
  20. 什么是grep -v grep??

热门文章

  1. 三星i8268android4.4,三星I8268(移动版)
  2. [已解决]解决小米云下载JPG格式微博照片格式无法打开问题
  3. deepstream源码
  4. 思科防火墙多端口映射多端口
  5. 视频编解码之数字视频介绍
  6. 飞行器系统行业研究及十四五规划分析报告
  7. 生命的超级能量(宇宙真相)
  8. 1.1.1和1.1.2支持漫游运营商LOGO更换
  9. NXP迅为i.MX8Mmini开发板Linix固件编译上
  10. 王炸!一个开源微信小程序+商城后台管理系统