简述

尝试并对比了很多种网上给的教程,总结下来读取.dwg文件很难,即使成功了,所消耗的时间成本也不值得。网上有相关的软件工具,可以直接将.dwg文件转换为.dxf文件,个(po)别(jie)的软件可以批量转换,而且即使不是AutoCAD软件所绘制的.dwg文件用转换软件转换为.dxf文件也可以用这种方式读取,但是不是AutoCAD绘制的图,用AutoCAD打开后另存为.dxf文件,用这种方式读取不了。

一,Visio studio 创建项目

当前简单控制台显示数据,创建C#的控制台应用。(随便创的,简单点就好)

二,下载netDXF到项目文件里

方法一:但目前VS内可下载的版本最高2.2.0,不是最新版本

方法二:

网址:https://github.com/haplokuon/netDxf

下载文件并编译,生成

引用到VS工程项目里

(VS用2019,netDxf版本太高,VS2017有很多.NET 的库的版本不支持,VS2019安装好后如果也不支持,则更新报错的那个库,再新建文件)

    图片中的VS版本我在调试的时候更新过,所以图片仅供参考。

建议使用方法二,方法一对初学者不怎么友好,我没找到参考的文档。方法二对VS运行的版本有很高的要求,要VS2019,而且关于.NET的部分最好也是最新的版本,因为方法二的netDXF版本太高了。

三,调用情况

方法一的详细信息如果觉得自己觉悟很高的话,可以试试

调用Dxfdocument类,可以读取dxf内图纸里的数据(下方的字典是新版的,在上面的网址里.doc文件夹里)

调用blocks类只获取文件里关于块的定义数据,不获取在图纸中的块的数据

AutoCAD:

图形坐标信息的读取问题:目前以读取数据坐标信息为切入点

块的坐标,定义块类数据时定义基点后,坐标信息显示的是基点的横纵坐标

圆的坐标信息是该圆圆心的横纵坐标

六边形的坐标信息是不同的顶点的横纵坐标,可调节,但是名字为“多段线”

直线的坐标信息是由起点和端点分别显示的

多线段的坐标显示方式同多边形的坐标显示方式相同

图:显示块的数据

图:显示圆的数据

图:显示多边形数据

图:显示直线数据

图:显示多行文字信息

四,打开文件

private static string dxfFileFullPath;
dxfFileFullPath = "D:\\CAD\\cad_workspace\\eg1_1.dxf"; //文件路径
DxfVersion dxfVersion = DxfDocument.CheckDxfFileVersion(dxfFileFullPath);
if (dxfVersion < DxfVersion.AutoCad2000){Console.WriteLine("文件版本低于AutoCAD2000,无法打开!!!");return;}//判断文件版本,低于2000年版本的dxf不可打开
DxfDocument dxfDocument = DxfDocument.Load(dxfFileFullPath);    //打开dxf文件

对应字典内容

五,读取数据内容

读取文件中的块定义

public void Read_Block(DxfDocument dxf_Document){BlockRecords blocks = dxf_Document.Blocks;       //读取文件中块的定义信息int num_blocks = 1;     //统计定义的块的个数foreach (Block item in blocks)      //遍历文件中的块的信息{Console.WriteLine("\n读取第" + num_blocks + "个块的定义信息");Console.WriteLine("\t对象属性:" + item.CodeName.ToString());Console.WriteLine("\t块名称:" + item.Name.ToString());num_blocks++;}}

字典内容:

读取圆的数据内容

        public void Read_Circle(DxfDocument dxf_Document){//用于循环访问圆的集合的枚举数IEnumerable<Circle> circles = (IEnumerable<Circle>)dxf_Document.Entities.Circles.GetEnumerator();int num_circles = 1;    //统计文件中所绘制的圆的个数foreach (netDxf.Entities.Circle item in circles){Console.WriteLine("\n读取第" + num_circles + "个圆的数据信息");Console.WriteLine("\t圆心的X坐标:" + item.Center.X.ToString());Console.WriteLine("\t圆心的Y坐标:" + item.Center.Y.ToString());Console.WriteLine("\t圆的半径:" + item.Radius.ToString());num_circles++;}}

读取直线的数据内容

public void Read_Line(DxfDocument dxf_Document){//用于循环访问线条的集合的枚举数IEnumerable<Line> lines = (IEnumerable<Line>)dxf_Document.Entities.Lines.GetEnumerator();int num_lines = 1;    //统计文件中所绘制的直线的个数foreach (netDxf.Entities.Line item in lines){Console.WriteLine("\n读取第" + num_lines + "条线段的数据信息");Console.WriteLine("\t起始点的X坐标:" + item.StartPoint.X.ToString() + "\t起始点的Y坐标:" + item.StartPoint.Y.ToString());Console.WriteLine("\t终止点的X坐标:" + item.EndPoint.X.ToString() + "\t终止点的Y坐标:" + item.EndPoint.Y.ToString());Console.WriteLine("\t线段所在图层:" + item.Layer.ToString());Console.WriteLine("\t线段的类型:" + item.Linetype.ToString());Console.WriteLine("\t线段的颜色:" + item.Color.R.ToString() + "," + item.Color.G.ToString() + "," + item.Color.B.ToString());Console.WriteLine("\t线段的粗细:" + item.Thickness.ToString());num_lines++;}}

读取多折线的数据内容

 public void Read_LwPolyline(DxfDocument dxf_Document){//用于循环访问多折线的集合的枚举数IEnumerable<LwPolyline> lwPolylines = (IEnumerable<LwPolyline>)dxf_Document.Entities.LwPolylines.GetEnumerator();int num_lwPolyline = 1;    //统计文件中所绘制的多折线的个数foreach (netDxf.Entities.LwPolyline item in lwPolylines){Console.WriteLine("\n读取第" + num_lwPolyline + "条多折线的数据信息");List<LwPolylineVertex> vertexes = item.Vertexes;     //该条折线所有点坐标的列表foreach (LwPolylineVertex i in vertexes){Console.WriteLine("\t该多折线的顶点坐标为(x,y):" + i.Position.X + "," + i.Position.Y);}Console.WriteLine("\t折段所在图层:" + item.Layer.ToString());Console.WriteLine("\t折段的类型:" + item.Linetype.ToString());Console.WriteLine("\t折段的颜色:" + item.Color.R.ToString() + "," + item.Color.G.ToString() + "," + item.Color.B.ToString());Console.WriteLine("\t折段的粗细:" + item.Thickness.ToString());num_lwPolyline++;}}

读取文字的数据内容

 public void Read_Text(DxfDocument dxf_Document){//用于循环访问文字的集合的枚举数IEnumerable<Text> texts = (IEnumerable<Text>)dxf_Document.Entities.Texts.GetEnumerator();int num_texts = 1;    //统计文件中文字的个数foreach (netDxf.Entities.Text item in texts){Console.WriteLine("\n读取第" + num_texts + "段文字的数据信息");Console.WriteLine("\t文字的坐标(x,y):" + item.Position.X.ToString() + "\t" + item.Position.Y.ToString());Console.WriteLine("\t文字所在图层:" + item.Layer.ToString());Console.WriteLine("\t文字的类型:" + item.Linetype.ToString());Console.WriteLine("\t文字的颜色:" + item.Color.R.ToString() + "," + item.Color.G.ToString() + "," + item.Color.B.ToString());Console.WriteLine("\t文字的高度:" + item.Height.ToString());Console.WriteLine("\t文字的宽度:" + item.Width.ToString());Console.WriteLine("\t文字的内容:" + item.Value.ToString());num_texts++;}}

读取多行文字的数据内容

 public void Read_MText(DxfDocument dxf_Document){//用于循环访问多行文本的集合的枚举数IEnumerable<MText> mTexts = (IEnumerable<MText>)dxf_Document.Entities.MTexts.GetEnumerator();int num_texts = 1;    //统计文件中多行文字的个数foreach (MText item in mTexts){Console.WriteLine("\n读取第" + num_texts + "段多行文字的数据信息");Console.WriteLine("\t多行文字的坐标(x,y):" + item.Position.X.ToString() + "\t" + item.Position.Y.ToString());Console.WriteLine("\t多行文字所在图层:" + item.Layer.ToString());Console.WriteLine("\t多行文字的类型:" + item.Linetype.ToString());Console.WriteLine("\t多行文字的颜色:" + item.Color.R.ToString() + "," + item.Color.G.ToString() + "," + item.Color.B.ToString());Console.WriteLine("\t多行文字的高度:" + item.Height.ToString());Console.WriteLine("\t多行文字的类型:" + item.Style.ToString());Console.WriteLine("\t多行文字的内容:" + item.Value.ToString());num_texts++;}}

读取块参照的数据内容

private static string dxfFileFullPath;private static string[] need_Name= { "kk" };//筛选所需要的块参照的信息public int choice(string all_string, string need_name){int choice_end = all_string.IndexOf(need_name);return choice_end;}

我实现的目的是筛选出自己想要的块参照,所以有了上面一步的内容

//读取块参照的数据信息public void Read_Insert(DxfDocument dxf_Document){//用于循环访问块参照的集合的枚举数IEnumerable<Insert> inserts = (IEnumerable<Insert>)dxf_Document.Entities.Inserts.GetEnumerator();int num_inserts = 1;for (int str_need_Name = 0;  str_need_Name < need_Name.Length; str_need_Name++)//循环需要的被筛选的字符串{foreach (Insert item in inserts){if (choice(item.Block.Name, need_Name[str_need_Name]) > 0)    //筛选所需要的块参照{Console.WriteLine("\n读取第" + num_inserts + "个块的数据信息");Console.WriteLine("\t该块参照的名称:" + item.Block.Name.ToString());Console.WriteLine("\t该块参照的坐标(x,y):" + item.Position.X.ToString() + "\t" + item.Position.Y.ToString());if (item.Attributes.Count != 0)        //块参照内的属性不为空{int count = item.Attributes.Count;      //块参照的属性个数for (int i = 0; i < count; i++){if (item.Attributes[i] != null)     //块参照内属性值不为空{Console.WriteLine("\t该块参照的属性值:" + item.Attributes[i].Tag.ToString() + "\t" + item.Attributes[i].Value.ToString());}}}elseConsole.WriteLine("\t该块参照内属性值为空!!!");num_inserts++;}}}}

读取.dwg文件“曲线救国”之读取.dxf相关推荐

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

    读取DWG文件将全部实体变为一个块 将DWG文件中所有DBObject组成一个块, 如果DWG文件中有属性参照, 则属性变为块属性. 我刚开始学习不久.Net AutoCAD的二次开发, 所以记录在这 ...

  2. 读取DWG文件中的文本信息(CAD2004)

    还是那句话,工作需要,不然是不会研究这个的.也许有的人会遇到跟我一样的问题,有兴趣看看,可以节约点时间.运行时要引用CAD2004的COM,这种读取文本的方式并不好,需要机器上装有AUTOCAD200 ...

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

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

  4. php循环读取excel每个单元格,php使用PHPexcel类读取excel文件(循环读取每个单元格的数据)...

    error_reporting(E_ALL); date_default_timezone_set('Asia/ShangHai'); include_once('Classes/PHPExcel/I ...

  5. Linux C语言磁盘U盘容量读取、目录列表读取、文件夹大小读取

    Linux C语言磁盘U盘容量读取.目录列表读取.文件夹大小读取C语言源代码 #include <stdio.h> #include <sys/statfs.h> #inclu ...

  6. php 远程读取excel,PHP远程读取excel文件,如何读取?

    PHP远程读取excel文件,如何读取?PHP远程读取excel文件,怎么读取?? PHPExcel能远程读取excel文件吗?即读取其他服务器上的文件! 或者有没有其他好的方法能实现? 求方法... ...

  7. cad图纸解析java_Java中的AutoCAD库可读取.dwg文件?

    小编典典 感谢所有回答过的人,我已经测试了您的所有命题,以下是截至2015年的发现: 当前没有免费且可靠的解决方案来读取和操作.dwg和.dxf文件.这尤其适用于最新版本的AutoCAD,例如:Aut ...

  8. C#读取DWG文件方法

    <span style="font-size:18px;">(一)直接读取文件结构</span> </pre><pre name=&quo ...

  9. [Qt5] QT+VS读取dwg文件

    原文地址[https://blog.csdn.net/u013725001/article/details/43272161] 本文略作删改,让新手更好理解一些 1.下载MxDraw控件 注:可到ww ...

最新文章

  1. 我们是在搞学术,还是被学术搞?
  2. 导致大量kworker的原因_头上白发越长越多,原因有哪些?
  3. 用iframe设置代理解决ajax跨域请求问题
  4. HTML form 标签的 action 属性
  5. python删除中文停用词_python词云 wordcloud+jieba生成中文词云图
  6. API 版本控制的几种方式
  7. 关于谷歌浏览器 点击元素便签出现外边框的情况解决办法
  8. Shell编程-控制结构 | 基础篇
  9. 同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?
  10. 多线程编程-条件变量
  11. 在这个520特别的日子里,分享几个用的上的Python代码
  12. 基于Java-EE和websocket的无人机网页监控系统(网页地面站-源码)
  13. 武汉大学计算机学院徐霜,物联网工程专业建设与实践教学研究_余琍
  14. 复习一下forearch
  15. 四大免费magento支付接口扩展
  16. 计算机类sci期刊影响因子排名,【科研】全球最新SCI期刊影响因子排名:第一名187.040!...
  17. 在单点登录中,如果cookie被禁用了怎么办?
  18. 扫码登录的原理和实现
  19. Head First HTML与CSS、XHTML (中文版).(Elisabeth Freeman) PDF扫描版​
  20. RGB-IR CFA Optimizations

热门文章

  1. python根据表格数据生成折线图_python生成折线图
  2. 如何看待阿里云推出的免费虚拟主机?
  3. Java的三大版本和JDK,JRE,JVM的概念
  4. css中a标签中去掉下划线注意事项
  5. 解决word文档网格设置每行36字符数但显示32个字
  6. js实现 throttle 和 debounce
  7. Android高德地图的定位
  8. oracle创建序列号
  9. 唐山初中计算机考试知识点,唐山:2017小升初英语必考的十个知识点(推荐)...
  10. 航天二院计算机硕士待遇怎么样,航天二院706所