尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

打开老图纸只差这一步:libdxfrw帮你搞定DXF/DWG文件读写

打开老图纸只差这一步:libdxfrw帮你搞定DXF/DWG文件读写 打开老图纸只差这一步libdxfrw帮你搞定DXF/DWG文件读写【免费下载链接】libdxfrwC library to read and write DXF/DWG files项目地址: https://gitcode.com/gh_mirrors/li/libdxfrw下午三点甲方甩过来一份十多年前的DWG图纸说抓紧看明天就要报价。你双击文件绘图软件直接报错版本太老打不开。那一刻你意识到靠现成软件永远受制于人不如自己写个工具把DXF/DWG文件读写这件事彻底握在手里。本文将带你用开源C库libdxfrw从零搭起一条读DWG、写DXF的完整流水线看完你就能在自己的项目里落地一个能处理CAD图纸的最小工具。一张打不开的DWG把我推向了libdxfrw老图纸打不开第一反应是找转换器。但你很快会发现市面上的转换工具要么收费、要么命令行难用、要么一次只能转一个文件。更麻烦的是你的真实需求往往不是打开看一眼而是把图纸里的坐标和标注批量提取出来喂给后面的程序。这时候你只剩两条路自己解析文件格式或者找一个现成的C库。DWG是私有二进制格式结构复杂得像层层包装的压缩饼干——外面有版本头、中间有压缩段实体数据还分普通、代理、内嵌多种存储方式光解包就要写几千行。DXF虽然是有规律的纯文本但一个实体动辄几十个组码group code标注、样条、填充的规则各有各的怪癖自己啃一遍也够呛。libdxfrw 的价值就在这它把这块最难啃的骨头替你啃完了。为什么劝你别自己造DXF解析器你可以先试试自己写个最小DXF读取器按行读遇到组码 0 判断实体类型遇到 10/20/30 读坐标……三天后你会得到一版能读直线和圆的代码然后被多段线、圆弧、椭圆的几十种组码组合磨到怀疑人生。这就是为什么专业的事要交给专业的库。libdxfrw 是一个专职处理 CAD 文件的 C 库干两件事读支持 DXF 的 ASCII 与二进制两种格式也支持从 R14 到 2013 各代的 DWG 文件读取写可以把实体写回 DXFASCII 或二进制指定输出到 R12、2000、2004、2007、2010 等多个版本。它采用 GPL v2 协议免费开源商业项目接入前记得评估一下协议传染性。库本身是纯 C 写的依赖很少Linux、macOS、Windows 都能编译源码里同时准备了 CMakeLists.txt、autotools 脚本和 Visual Studio 工程几乎不存在环境劝退的问题。把libdxfrw装进你的C项目只需三步第一步拿到源码git clone https://gitcode.com/gh_mirrors/li/libdxfrw cd libdxfrw第二步用 CMake 编译安装这是全平台通用的方式mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease cmake --build . --target install装好后你会得到 libdxfrw 的静态/动态库以及libdxfrw.h、drw_interface.h等头文件。第三步在你自己的工程里引入target_link_libraries(your_app dxfrw)新手常踩的坑编译后链接报找不到符号。多半是没把 include 目录和库目录指对或者混用了不同编译器产生的库。用 CMake 的find_package或直接-I、-L指定路径即可。三步走完库就算进你的项目了。接下来的问题只有一个怎么用它读写文件读文件给DXF/DWG抄家一句回调一个实体libdxfrw 的读取模型值得你先花一分钟理解它自己不替你存任何数据而是采用回调机制——解析到一个实体就调用一次你实现的方法。这像请了个抄家员每翻出一件东西就喊你一嗓子来了一条LINE你要不要、往哪放完全自己说了算。第一步写一个听喊话的接口类你只需要继承DRW_Interface实现你关心的回调其余纯虚函数补空实现即可编译要求全部实现但都可以是空函数体#include libdxfrw.h #include iostream // 继承接口只关心直线和圆 class MyCollector : public DRW_Interface { public: // 解析到一条直线打印两端坐标 virtual void addLine(const DRW_Line data) override { std::cout LINE ( data.basePoint.x , data.basePoint.y ) - ( data.secPoint.x , data.secPoint.y )\n; } // 解析到一个圆打印圆心和半径 virtual void addCircle(const DRW_Circle data) override { std::cout CIRCLE center( data.basePoint.x , data.basePoint.y ) r data.radious \n; } // 其余 addHeader/addLayer/addText... 等约三十个虚函数在此写空实现 };第二步一行代码启动解析int main() { MyCollector c; dxfRW dxf(old.dxf); // 打开 DXF 文件 dxf.read(c, false); // 解析false 不做 2D 投影保留原始坐标 return 0; }如果是 DWG 文件把dxfRW换成dwgR即可接口一模一样dwgR dwg(old.dwg); dwg.read(c, false);你会在终端里看到一条条实体被抄出来的记录。想统计图纸里有多少条线、多少个圆在回调里加个计数器一分钟的事。一个容易踩的坑第二个参数别乱传read(c, ext)里的ext决定是否对实体应用拉伸方向extrusion做 2D 投影。传false时你拿到的是原始三维坐标传true时库会把非水平面上的圆、弧按所在平面投影成 2D。画在斜面、立面图上的圆用错参数会导致圆心和半径漂移调试时特别迷惑。另一个高频坑读完发现文本全是乱码。DWG/DXF 里的中文通常按 CP936简体中文、CP950繁体等代码页存储libdxfrw 内部会通过编码转换模块src/intern/drw_textcodec.cpp把它们统一转成 UTF-8 再回调给你。如果你看到乱码先检查自己终端/程序的编码是不是 UTF-8再去确认文件头里声明的$DWGCODEPAGE。别在外部再手动做一次 GBK 转码那反而会把已经转好的字符弄坏。写文件程序自动画一张新图纸读取是抄家写入就是装修——你摆好实体让库帮你排版成标准 DXF。原理同样靠回调库在写文件时会调用你接口里的writeEntities()你在里面通过dxfWriter指针逐个输出实体。// 写入接口库会依次回调这几个方法 class MyDrawer : public DRW_Interface { public: virtual void writeHeader(DRW_Header) override {} // 用默认表头即可 virtual void writeBlocks() override {} // 本次不写块 virtual void writeBlockRecords() override {} virtual void writeEntities() override { // 在这里产出一张图纸 DRW_Line line; line.basePoint {0, 0, 0}; // 起点 line.secPoint {100, 80, 0}; // 终点 dxfWriter-writeLine(line); // 写入这条直线 DRW_Text t; t.basePoint {10, 90, 0}; t.height 5; t.text hello libdxfrw; // 图中文字 dxfWriter-writeText(t); } // 其余 addXxx 回调同样写空实现 }; int main() { dxfRW dxf(out.dxf); MyDrawer d; dxf.write(d, DRW::AC1015, false); // AC1015AutoCAD 2000 版false输出 ASCII return 0; }编译运行后用任意支持 DXF 的软件打开out.dxf你会看到一条斜线加一行文字。把版本枚举换成AC1009R12就是老版本图纸把false改成true就输出二进制 DXF——老旧系统兼容性问题就这么化解了。三个真实场景看图、取数、转换掌握了读写你会发现它几乎能搭起整个 CAD 周边生态。轻量级 CAD 查看器。回调里把addLine、addCircle、addText转成屏幕坐标就能在 Qt 或任何绘图框架里画出图纸预览。不要底层库不要授权费一个可离线看图的轻客户端就成型了。工程数据提取。在addMText、addDimLinear这些回调里过滤图层名和内容就能把图纸中的标注、材料说明、孔位坐标批量导成表格直接喂给后面的分析程序——很多制造自动化系统的图纸转数据环节就是这么做的。格式转换工具。项目仓库里还自带dwg2dxf命令行工具一条命令就能把 DWG 转成指定版本的 DXF支持-b输出二进制、批量模式一次处理整个目录你完全可以拿它当现成的批处理脚本或者读它的源码学习接口的完整用法。现在轮到你来动手了回到开头那张打不开的老图纸。有了 libdxfrw你可以先写十几行代码把它的实体全部抄出来看看结构再决定是转成新版本 DXF还是直接提取数据入库——主动权终于回到了你手里。建议按这个顺序动手先跑通上面的读文件示例用自己手头的一张 DXF 验证然后换成 DWG 试试最后把写入示例跑起来生成一张带中文标注的新图顺便确认下终端编码避免乱码。源码里的 tests/ 目录还准备了十几个现成的测试用例从基础读写到多版本兼容都有是你验证自己理解的最好参照。纸上谈兵到此为止clone 一份源码编译、跑通、改造成你自己的工具。下一张打不开的图纸就不会再让你加班了。【免费下载链接】libdxfrwC library to read and write DXF/DWG files项目地址: https://gitcode.com/gh_mirrors/li/libdxfrw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表