CAD DWG/DXF文件C++解析库libdxfrw

2020/02/18 16:44
阅读数 1.4K

libdxfrw是一个免费的C ++库,可以读写ascii和二进制格式的DXF文件。
也可以读取从R14到最后一个V2015的DWG文件。
它是根据GNU通用公共许可版本2(或您选择的任何更高版本)的条款许可的。
如果您正在寻找有关该项目的一般信息,请访问网站:http://sourceforge.net/projects/libdxfrw
github地址:https://github.com/codelibs/libdxfrw
libdxfrw是由libreCAD的一位开发者创建,libreCAD使用了该库来解析CAD文件。
libreCAD官网:https://librecad.org/
在github上下载最新源码,解压

编译libdxfrw
通用脚本(unix)

autoreconf -vfi (optional)
./configure
make
make install (as root)

Windows VC++编译

  • 使用VS2013打开vs2013 \ libdxfrw.sln
  • 构建解决方案还有一个依赖于libdxfrw的dwg到dxf转换器,可以以相同的方式构建。
  • 使用VS2013打开dwg2dxf \ vs2013 \ dwg2dxf.sln
  • 构建解决方案

我采用VS2017版本,直接打开libdxfrw-master/vs2013/libdxfrw.sln,如下图所示:


源文件存放在src目录下,比之前dxflib的源文件多了很多!
直接构建build,我这里有个编译错误:

参数类型不匹配,无法将“char **”转换为“const char **”
解决办法:非const转const,强转一下即可!

再次编译通过,在libdxfrw-master\vs2013\Debug或Release生成静态库文件libdxfrw.lib。

如何使用libdxfrw:https://forum.librecad.org/How-to-use-libdxfrw-td5713395.html
此外,压缩包里还包含两个examples:
1、dwg2text:从dwg/dxf文件中提取文本(read)

 1 /******************************************************************************
 2 **  dwg2text - Program to extract text from dwg/dxf                          **
 3 **                                                                           **
 4 **  Copyright (C) 2015 José F. Soriano, rallazz@gmail.com                    **
 5 **                                                                           **
 6 **  This library is free software, licensed under the terms of the GNU       **
 7 **  General Public License as published by the Free Software Foundation,     **
 8 **  either version 2 of the License, or (at your option) any later version.  **
 9 **  You should have received a copy of the GNU General Public License        **
10 **  along with this program.  If not, see <http://www.gnu.org/licenses/>.    **
11 ******************************************************************************/
12 
13 #include <iostream>
14 #include <fstream>
15 #include <sys/stat.h>
16 
17 #include "dx_iface.h"
18 #include "dx_data.h"
19 
20 void usage(){
21     std::cout << "Usage: " << std::endl;
22     std::cout << "   dwg2text <input>" << std::endl << std::endl;
23     std::cout << "   input      dwg or dxf file to extract text" << std::endl;
24 }
25 
26 bool extractText(std::string inName){
27     bool badState = false;
28     //verify if input file exist
29     std::ifstream ifs;
30     ifs.open (inName.c_str(), std::ifstream::in);
31     badState = ifs.fail();
32     ifs.close();
33     if (badState) {
34         std::cout << "Error can't open " << inName << std::endl;
35         return false;
36     }
37 
38     dx_data fData;  // 存储cad数据的容器类对象
39     dx_iface *input = new dx_iface();
40     badState = input->printText( inName, &fData ); // 读取cad文件并填充到cad数据容器类对象中,再找出text实体打印出来
41     if (!badState) {
42         std::cout << "Error reading file " << inName << std::endl;
43         return false;
44     }
45     delete input;
46 
47     return badState;
48 }
49 
50 int main(int argc, char *argv[]) {
51     bool badState = false;
52     std::string outName;
53     if (argc != 2) {
54         usage();
55         return 1;
56     }
57 
58     std::string fileName = argv[1];
59 
60     if (badState) {
61         std::cout << "Bad options." << std::endl;
62         usage();
63         return 1;
64     }
65 
66     bool ok = extractText(fileName);
67     if (ok)
68         return 0;
69     else
70         return 1;
71 }

2、dwg2dxf:将dwg转换为dxf(read/write)

 1 bool convertFile(std::string inName, std::string outName, DRW::Version ver, bool binary, bool overwrite){
 2     bool badState = false;
 3     //verify if input file exist
 4     std::ifstream ifs;
 5     ifs.open (inName.c_str(), std::ifstream::in);
 6     badState = ifs.fail();
 7     ifs.close();
 8     if (badState) {
 9         std::cout << "Error can't open " << inName << std::endl;
10         return false;
11     }
12     //verify if output file exist
13     std::ifstream ofs;
14     ofs.open (outName.c_str(), std::ifstream::in);
15     badState = ofs.fail();
16     ofs.close();
17     if (!badState) {
18         if (!overwrite){
19             std::cout << "File " << outName << " already exist, overwrite Y/N ?" << std::endl;
20             int c = getchar();
21             if (c == 'Y' || c=='y')
22                 ;
23             else {
24                 std::cout << "Cancelled.";
25                 return false;
26             }
27         }
28     }
29     //All ok proceed whit conversion
30     //class to store file read:
31     dx_data fData;
32     //First read a dwg or dxf file
33     dx_iface *input = new dx_iface();
34     badState = input->fileImport( inName, &fData );
35     if (!badState) {
36         std::cout << "Error reading file " << inName << std::endl;
37         return false;
38     }
39 
40     //And write a dxf file
41     dx_iface *output = new dx_iface();
42     badState = output->fileExport(outName, ver, binary, &fData);
43     delete input;
44     delete output;
45 
46     return badState;
47 }

在编译example工程的时候,出现了链接错误:

参考 https://blog.csdn.net/qq_38940896/article/details/88181435
在编译lindxfrw.lib的时候需要链接一下libiconv.lib,该lib文件在libdxfrw-master\vs2013\packages目录下找到,分为dynamic和satic,我这里分别取名:libiconv_dynamic.lib和libiconv_static.lib,然后重新设置libdxfrw的工程配置:我这里以win32 Debug配置为例

构建成功后,重新在example工程中链接libdxfrw.lib,如果不出意外,此时就可以构建成功了。
运行的时候需要把libdxfrw-master\vs2013\packages中的libiconv.dll拷贝过去。
Good Luck!

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部