C/C++ 图像处理(15)------DXF文件の读取、绘图与显示

来源:互联网 发布:java n的阶乘 编辑:程序博客网 时间:2024/05/20 09:24

关于DXF文件的读取自几年前做项目的时候就用到了,不过当时是另外一个朋友负责的就没在意,直至最近的项目又要用到方才自己动手去弄。
因为几年前项目的代码还在,因此看了下发现之前朋友是用dxflib开源库实现的,因此也用了同样的库。
上网一查发现资料相当少,因为事很多比较忙,不大想去慢慢看说明文档,遇到一些疑问便在网上一个实现了功能的博客中问,哪知博主直接回复如下:
这里写图片描述
实在让人无语,只得让实验室的同学去研究下格式文档告知我思路。同学直接看了下说明文档也就实现了,还没用到开源库,实在没有什么难的。
因此乘着终于闲了下来写出本篇博客,一则让有需要的人可以参考参考,二则鄙视下自以为是的这个博主,看了其写的东西实在是没有什么了不起的,不知哪来的底气!
OK,说了些离题的东西,下面进入主题。因为用到了dxflib开源库,自然需要去下载该库,地址如下(亦可从本文最后给出的工程中获得):http://www.qcad.org/en/dxflib-downloads
解压出dxflib库的压缩包,里面有几个东西,其中src文件夹中的东西是最重要的,而examples则给出了两个使用的例子。因为项目只需要读取DXF文件而不需要去写,则并没有去研究写的那一部分,后面涉及到则会加上。
DXF的文件架构大体如下图所示:
这里写图片描述
上图是本人经过阅读文档和查阅其他资料后画出来的,不算详尽,但就读DXF文件而言差不多了。
由该图可见,DXF的线,圆等实体要么在block中,要么在entities中,这两者的区别在于block只有在后面被insert之后才真正的加入到图像中,否则只是一个单独的东西,可以不加理会。而entities则需要绘制出来。
另外一个是block块相对于世界坐标系有一个缩放和平移关系,也就是说block内部的线,圆等对象的坐标需要进行换算才能与世界坐标系相对应。
另外有几点需要注意的:
1.在VS2015平台下,类似于sprintf、fopen等这样的函数会被认为是不安全的,解决方法有多种,最好是将这些函数改成sprintf_s、fopen_s等VS2015编译器所认同的形式。
2.多线段实体闭合与否需要检测,如果检测为闭合则最后需要绘制出终点到起点的线。
3.画圆弧的时候需要通过其起点角度和终点角度的比较判断其是顺时针还是逆时针。
4.由于本人希望将文件转换成图像,因此需要知道实体的边界,故做了边界探测。如果是希望做出AutoCAD的那种效果,则得到所有对象坐标后,实时映射到指定区域即可。
5.本人有一些实体还没实现,例如文字实体这些,后面有时间会补上,君亦可自行补充,比较简单。
至于具体的细节太繁琐就不说了,直接上工程链接:
https://git.oschina.net/weixinhum/ReadDXF/tree/master/
若有需要请任意下载,亦可用VS直接克隆过去,本人已经内置了OpenCV,直接编译即可。如有问题请告知与我。
最后上一张解析出来的图像:
这里写图片描述

1 0