CAD DWG/DXF文件C++解析库libdxfrw
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!