libdxfrw终极指南:从零到一读写DXF/DWG文件的完整实战教程
libdxfrw终极指南从零到一读写DXF/DWG文件的完整实战教程【免费下载链接】libdxfrwC library to read and write DXF/DWG files项目地址: https://gitcode.com/gh_mirrors/li/libdxfrw接手一个老项目时你面对的可能是上百个格式不一的CAD图纸有DXF文本格式、DXF二进制格式还有各种版本的DWG文件。没有现成的读取方案手工转换效率极低而商业SDK又贵得离谱。libdxfrw 正是为解决这个问题而生的开源C库——它同时支持DXF读写和DWG读取让你用纯C代码轻松驾驭CAD文件。本文将带你从安装、跑通Demo到完成一个批量提取图纸信息的实战项目全程可复制。先给 libdxfrw 做个体检一句话定位 三个数字 一张速查表libdxfrw 是一个用 C 编写的开源库专注于 DXF 文件的读取与写入ASCII 与二进制两种格式并支持从 AutoCAD R14 到 2015 版本 DWG 文件的读取。三个数字亮点2 种 DXF 格式支持 ASCII 文本 DXF 与二进制 DXF 的读写覆盖绝大多数CAD交换场景10 个 AutoCAD 版本从 R10AC1006一路覆盖到 2018AC1032的格式标识GPL v2 开源许可完全免费可自由修改与分发适合学习和内部集成适用人群速查表人群典型场景推荐度新手入门者学习DXF格式原理、写第一个解析程序⭐⭐⭐⭐⭐中级开发者在业务系统中集成CAD文件读写⭐⭐⭐⭐⭐技术决策者评估自研 vs 商业SDK的可行性⭐⭐⭐⭐工具开发爱好者做格式转换、批量处理脚本⭐⭐⭐⭐⭐ 类比一下DRW_Interface就像酒店的前台接待员——图书馆解析完文件后通过它把每一位客人实体逐一带到你面前你要做的只是决定如何接待。三步搞定环境搭建CMake、Autotools、Visual Studio 任你选libdxfrw 的构建系统非常齐全官方同时维护 CMake、Autotools、Visual Studio 和 MinGW 方案。这里给出最常用的三种。方案一CMake推荐全平台通用# 克隆仓库若尚未下载 git clone https://gitcode.com/gh_mirrors/li/libdxfrw cd libdxfrw # 创建构建目录 mkdir build cd build # 配置构建Release 模式可显著提升解析性能 cmake .. -DCMAKE_BUILD_TYPERelease # 编译并安装 cmake --build . --config Release sudo cmake --build . --config Release --target install安装完成后头文件位于/usr/local/include/静态库为/usr/local/lib/libdxfrw.a。注意 Linux 下需要libiconv依赖Ubuntu 可用sudo apt-get install build-essential cmake libiconv-hook-dev预装。方案二Autotools 传统工具链Linux/macOS# 从 git 仓库构建时需要先生成 configure autoreconf -vfi # 标准三步走 ./configure make sudo make install方案三Visual StudioWindowsWindows 用户直接打开vs2013/libdxfrw.sln解决方案选择 Debug 或 Release 配置后生成即可。项目也提供了makefile.mingw供 MinGW 用户使用还附带 Docker 镜像docker/Dockerfile.ubuntu等便于在容器中构建。构建方式对比表方式平台复杂度适用场景CMake全平台低新项目首选跨平台 CIAutotoolsLinux/macOS中服务器环境、发行版打包Visual StudioWindows低Windows 桌面开发MinGWWindows中免装 VS 的轻量构建5 分钟跑通首个 Demo读取 DXF 并打印所有线段和圆这段代码做什么打开一个 DXF 文件解析出其中所有线段LINE和圆CIRCLE实体并把几何信息打印到控制台。它是粘贴即用的完整程序。#include libdxfrw.h #include cstdio // 自定义接口继承 DRW_Interface只需关注你关心的实体 class MyReader : public DRW_Interface { public: // 所有纯虚函数都要实现不关心的给空实现即可 void addHeader(const DRW_Header* d) override {} void addLType(const DRW_LType d) override {} void addLayer(const DRW_Layer d) override {} void addDimStyle(const DRW_Dimstyle d) override {} void addVport(const DRW_Vport d) override {} void addTextStyle(const DRW_Textstyle d) override {} void addAppId(const DRW_AppId d) override {} void addBlock(const DRW_Block d) override {} void setBlock(const int h) override {} void endBlock() override {} void addPoint(const DRW_Point d) override {} void addRay(const DRW_Ray d) override {} void addXline(const DRW_Xline d) override {} void addArc(const DRW_Arc d) override {} void addEllipse(const DRW_Ellipse d) override {} void addLWPolyline(const DRW_LWPolyline d) override {} void addPolyline(const DRW_Polyline d) override {} void addSpline(const DRW_Spline* d) override {} void addKnot(const DRW_Entity d) override {} void addInsert(const DRW_Insert d) override {} void addTrace(const DRW_Trace d) override {} void add3dFace(const DRW_3Dface d) override {} void addSolid(const DRW_Solid d) override {} void addMText(const DRW_MText d) override {} void addText(const DRW_Text d) override {} void addDimAlign(const DRW_DimAligned* d) override {} void addDimLinear(const DRW_DimLinear* d) override {} void addDimRadial(const DRW_DimRadial* d) override {} void addDimDiametric(const DRW_DimDiametric* d) override {} void addDimAngular(const DRW_DimAngular* d) override {} void addDimAngular3P(const DRW_DimAngular3p* d) override {} void addDimOrdinate(const DRW_DimOrdinate* d) override {} void addLeader(const DRW_Leader* d) override {} void addHatch(const DRW_Hatch* d) override {} void addViewport(const DRW_Viewport d) override {} void addImage(const DRW_Image* d) override {} void linkImage(const DRW_ImageDef* d) override {} void addComment(const char* c) override {} void writeHeader(DRW_Header d) override {} void writeBlocks() override {} void writeBlockRecords() override {} void writeEntities() override {} void writeLTypes() override {} void writeLayers() override {} void writeTextstyles() override {} void writeVports() override {} void writeDimstyles() override {} void writeAppId() override {} // 关键回调解析到线段时被自动调用 void addLine(const DRW_Line data) override { printf(线段: (%.2f,%.2f,%.2f) - (%.2f,%.2f,%.2f)\n, data.basePoint.x, data.basePoint.y, data.basePoint.z, data.secPoint.x, data.secPoint.y, data.secPoint.z); } // 关键回调解析到圆时被自动调用 void addCircle(const DRW_Circle data) override { printf(圆: 圆心(%.2f,%.2f) 半径%.2f\n, data.basePoint.x, data.basePoint.y, data.radious); } }; int main(int argc, char* argv[]) { if (argc 2) { printf(用法: %s file.dxf\n, argv[0]); return 1; } dxfRW dxf(argv[1]); // 1. 构造 dxfRW传入文件路径 MyReader reader; // 2. 准备接口实例 bool ok dxf.read(reader, false); // 3. 执行解析第二个参数表示是否做 2D 拉伸转换 printf(ok ? 解析成功\n : 解析失败\n); return ok ? 0 : 1; }逐行解读关键 APIdxfRW dxf(argv[1])dxfRW是库的总入口类构造函数只做文件路径绑定真正的解析发生在read()里。dxf.read(reader, false)第一个参数传入你实现的接口库每解析出一个实体就回调一次对应方法第二个参数ext若为true库会应用拉伸extrusion数据把实体转换为 2D 坐标一般纯 2D 图纸传false即可。data.basePoint与data.secPoint线段实体的起点和终点类型是DRW_Coord内部含x/y/z三个double。注意圆的半径字段拼写是radious历史遗留命名写代码时别按英语直觉拼成 radius。常见错误写法 vs 正确写法// ❌ 错误漏掉 read() 直接析构什么都没解析 dxfRW dxf(a.dxf); // dxf.read(reader, false); // 这行不能省 // ✅ 正确先 read 再判断返回值 dxfRW dxf(a.dxf); if (!dxf.read(reader, false)) { /* 处理失败 */ }运行效果编译后执行./demo test_output.dxf控制台会逐行打印类似线段: (0.00,0.00,0.00) - (100.00,100.00,0.00)的输出。 编译时记得链接库g demo.cpp -o demo -ldxfrw -liconv。测试目录tests/下的test_basic.cpp提供了读写验证的完整参考。核心能力逐个击破从会读到会写再到懂编码能力一写出你自己的 DXF 文件能力是什么不止能读libdxfrw 还能生成规范的 DXF 文件支持 ASCII 与二进制两种输出。代码演示——生成一个包含直线、圆和文本的 DXF#include libdxfrw.h class MyWriter : public DRW_Interface { public: dxfRW* dw nullptr; // 持有写对象 // ... 与 Demo 相同的一堆空实现省略 ... void writeEntities() override { DRW_Line line; line.basePoint {0, 0, 0}; line.secPoint {100, 100, 0}; dw-writeLine(line); // 写入一条线段 DRW_Circle c; c.basePoint {50, 50, 0}; c.radious 25; dw-writeCircle(c); // 写入一个圆 DRW_Text t; t.basePoint {10, 10, 0}; t.text hello libdxfrw; dw-writeText(t); // 写入一行文本 } // ... 其余 write* 方法空实现 ... }; int main() { dxfRW dxf(output.dxf); MyWriter w; w.dw dxf; // 版本用 AC1015(2000) 兼容性最好binfalse 输出 ASCII 格式 bool ok dxf.write(w, DRW::AC1015, false); return ok ? 0 : 1; }运行效果生成output.dxf可用 LibreCAD 或 AutoCAD 直接打开。注意事项写入版本文号建议从DRW::AC10152000起步兼容旧版软件只有当你明确目标客户端时才用更高版本。write()的第三个参数传true会输出二进制 DXF体积更小但可读性差除非有体积要求否则默认 ASCII。能力二直接解析 DWG 二进制图纸能力是什么DWG 是 AutoCAD 的私有二进制格式libdxfrw 通过版本分派的 reader 实现读取dwgreader15R14、dwgreader182004、dwgreader212007、dwgreader242010、dwgreader272013/2015内部还有更底层的dwgbuffer负责位级解包。代码演示——DWG 的读取方式和 DXF 几乎一模一样#include libdwgr.h // MyReader 复用上面 Demo 的接口类 int main() { MyReader reader; dwgR dwg(drawing.dwg); // 换用 dwgR 入口类 bool ok dwg.read(reader, false); return ok ? 0 : 1; }运行效果与 DXF 相同addLine/addCircle等回调照常触发你的业务代码完全不用感知文件格式差异。注意事项DWG 目前只支持读取不支持写入需要生成 DWG 时请转换方案先写成 DXF 再用其他工具转换。遇到超高版本2018文件库会返回失败可先用 AutoCAD 官方工具降版本再解析。能力三中文不乱码的字符编码处理能力是什么CAD 文件里的文本可能使用多种代码页直接读取会出现乱码。libdxfrw 内置drw_textcodec与四张代码页表drw_cptable932/936/949/950对应日文、简体中文、韩文、繁体中文。代码演示#include drw_textcodec.h DRW_Textcodec codec; codec.setVersion(DRW::AC1015); // 按目标文件版本设置 codec.setCodePage(ANSI_936); // 简体中文 GB2312对应 cp936 表 std::string raw ¥ÃÎı¾; // 模拟读取到的原始字节 std::string utf8 codec.toUtf8(raw); // 转换为 UTF-8 printf(解码结果: %s\n, utf8.c_str());运行效果乱码字节被正确还原为可读中文。注意事项编码问题通常只在读入非 UTF-8 文件时出现如果你生成的文件主要面向现代 CAD 软件写入时保持 UTF-8 即可绕开大部分麻烦。能力四用内置工具 dwg2dxf 快速转换格式能力是什么仓库自带的dwg2dxf程序就是一个现成的转换器dwg2text则专门抽取文本两者都可作为你集成功能的参考实现其核心dx_iface.cpp展示了DRW_Interface的完整接线方式。在dwg2dxf/目录下编译运行就能把 DWG 转成 DXF或把 DXF 在 ASCII/二进制之间互转。运行效果一条命令完成格式迁移这正是批量处理类任务的绝佳起点。实战批量提取一批图纸的关键信息20 分钟上手把前面的能力组合起来做一件真实业务中高频出现的事扫描一个目录下所有 DXF/DWG 文件统计每个文件的实体构成与文本内容。这段代码的骨架同样适用于批量转格式批量校验图纸等任务。#include libdxfrw.h #include libdwgr.h #include filesystem #include fstream class StatsReader : public DRW_Interface { public: int lines 0, circles 0, texts 0, layers 0; std::vectorstd::string textContents; // ... 空实现省略同前文 MyReader... void addLine(const DRW_Line d) override { lines; } void addCircle(const DRW_Circle d) override { circles; } void addLayer(const DRW_Layer d) override { layers; } void addText(const DRW_Text d) override { texts; textContents.push_back(d.text); } void addMText(const DRW_MText d) override { texts; textContents.push_back(d.text); } }; void scanOneFile(const std::string path, std::ofstream out) { StatsReader r; std::string ext path.substr(path.find_last_of(.) 1); bool ok false; if (ext dxf || ext DXF) { dxfRW f(path.c_str()); ok f.read(r, false); } else if (ext dwg || ext DWG) { dwgR f(path.c_str()); ok f.read(r, false); } if (!ok) { out path | 解析失败\n; return; } out path | 图层: r.layers 线段: r.lines 圆: r.circles 文本: r.texts \n; for (auto t : r.textContents) out 文本内容: t \n; } int main(int argc, char* argv[]) { std::string dir (argc 1) ? argv[1] : .; std::ofstream out(report.txt); // 遍历目录逐个文件处理 for (auto entry : std::filesystem::directory_iterator(dir)) { auto ext entry.path().extension().string(); if (ext .dxf || ext .DWG || ext .dwg) { scanOneFile(entry.path().string(), out); } } std::cout 扫描完成结果见 report.txt std::endl; }最终效果一条命令扫完整个图纸目录得到一张结构化清单——每个文件的图层数、线段数、圆数、文本内容一目了然。这段逻辑稍加改造把统计换成dxf.write就变成了批量格式转换器把输出换成 JSON就能对接数据库做图纸资产盘点。正是读写分离、接口统一的设计让这套代码能同时驾驭 DXF 和 DWG。新手最容易踩的 5 个坑坑一编译报未定义的引用链接失败现象链接时大量undefined reference错误。原因漏链接-ldxfrw或没装libiconv。方案Linux 编译加-ldxfrw -liconv确认头文件在src/下编译器用-I指向src/目录。坑二DRW_Interface无法实例化现象编译器提示纯虚函数未实现。原因DRW_Interface有几十个纯虚函数漏掉任何一个都无法创建对象。方案全部实现不关心的给空函数体。参考tests/test_interface.h那里有现成的完整实现模板。坑三读 DWG 永远返回 false现象DWG 文件解析直接失败而 DXF 正常。原因文件版本超出支持范围2015 之后的版本或文件已损坏。方案先用高版本 AutoCAD 另存为 2007/2010 格式再读同时检查dxfRW只用于 DXFDWG 必须用dwgR。坑四中文全部变成乱码现象读出的文本是乱码写出的文本在 CAD 里显示异常。原因未正确处理代码页库以默认编码解析了 GBK/Shift-JIS 字节。方案读取后统一用DRW_Textcodec::toUtf8()转换写入时优先保持 UTF-8确需旧编码再用setCodePage(ANSI_936)。坑五radious拼错 / 字段名记混现象圆的半径值永远是 0 或编译报错。原因库的历史字段名是radious不是标准的radius。方案写代码前先翻src/drw_entities.h确认字段名别凭直觉。性能与稳定性调优让大图纸解析不再卡顿内存层面解析超大 DXF 时实体逐个回调本身就避免了全量驻留你要做的是不在回调里做重活——只收集必要字段把真正计算放到主流程若需暂存海量实体优先用对象池或std::vector预分配避免频繁小对象分配。// 推荐回调里只做轻量收集 void addLine(const DRW_Line d) override { if (minX d.basePoint.x) minX d.basePoint.x; // 只算包围盒 }I/O 层面批量处理成百上千文件时打开/关闭文件的系统调用开销不可忽略。上面实战案例的做法是对的——所有统计结果先落内存最后一次性写入report.txt而不是每解析一个文件就开一次文件流。并发层面多个图纸文件之间天然相互独立完全可以用std::async或线程池并行解析每个线程持有独立的dxfRW/dwgR实例即可库本身对文件内容无共享状态线程安全边界很清晰。// 伪代码4 线程并行处理 std::vectorstd::futurevoid tasks; for (auto f : files) { tasks.push_back(std::async(std::launch::async, scanOneFile, f, std::ref(out))); } for (auto t : tasks) t.get();稳定性层面dxfRW内置调试开关setDebug(DRW::DEBUG)解析失败时可打开详细日志定位卡点配合DRW::error枚举如BAD_READ_ENTITIES判断具体失败阶段能显著缩短排查时间。看懂内部架构再谈如何扩展libdxfrw 采用清晰的模块化分层设计理解这张地图后你就知道该去哪里扩展┌─────────────────────────────────────────────┐ │ 应用层你的程序实现 DRW_Interface │ ├─────────────────────────────────────────────┤ │ 入口层dxfRW / dwgR读写总控调 reader │ ├─────────────────────────────────────────────┤ │ 解析层dxfReader/dxfWriter dwgreader15~32 │ ├─────────────────────────────────────────────┤ │ 数据层drw_entities / drw_objects / drw_header│ ├─────────────────────────────────────────────┤ │ 工具层dwgbuffer(位缓冲) drw_textcodec(编码) │ └─────────────────────────────────────────────┘接口层DRW_Interface是所有数据流出的唯一通道也是你与库交互的边界。读写层dxfReader逐行读 DXF 组码group codedwgreader*系列按版本各司其职dwgbuffer处理 DWG 的位压缩编码。数据层DRW_Line、DRW_Circle等实体类承载几何数据DRW_Layer等表对象承载样式信息。工具层drw_textcodec做代码页转换drw_dbg提供调试输出。如何扩展自定义能力最常见的是扩展业务处理——继承DRW_Interface在回调里塞自己的逻辑解析、统计、转存都行这是成本最低的扩展点。若你想支持新实体类型则需要同时改动数据层新增实体类与解析层新增 process/write 方法工程量大建议优先用现有实体组合来表达。参考dwg2dxf/和tests/目录它们是理解接口约定的最佳范例。结语你已掌握的技能清单读到这里你已经完成了一次从零到一的 libdxfrw 实战之旅请收下这份技能清单✅ 用 CMake、Autotools、Visual Studio 三种方式完成 libdxfrw 环境搭建与编译✅ 实现DRW_Interface并成功解析 DXF 文件提取线段与圆✅ 调用dxfRW::write生成自己的 DXF 文件ASCII 与二进制✅ 用dwgR读取 DWG 图纸掌握版本与只读限制✅ 通过DRW_Textcodec处理 CP936/CP932 等代码页解决中文乱码✅ 组合读写能力完成批量扫描图纸目录的真实业务场景✅ 识别并规避 5 个高频坑掌握内存、I/O、并发三方面的调优手段下一步去哪里继续tests/目录有 13 个测试文件覆盖实体、块、表格、多段线等场景是绝佳的进阶阅读材料dwg2dxf/、dwg2text/两个示例程序展示了生产级用法SPECIFICATIONS.md记录了格式细节。技术学习最怕的是看会了现在就去 clone 一份源码把你的第一个 Demo 跑起来吧——动手之后CAD 文件的读写门槛其实比想象中低得多。【免费下载链接】libdxfrwC library to read and write DXF/DWG files项目地址: https://gitcode.com/gh_mirrors/li/libdxfrw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

免费PowerBI主题模板:30+组件JSON配置,3分钟快速美化报表

免费PowerBI主题模板:30+组件JSON配置,3分钟快速美化报表

免费PowerBI主题模板:30组件JSON配置,3分钟快速美化报表 【免费下载链接】PowerBI-ThemeTemplates Snippets for assembling Power BI Themes 项目地址: https://gitcode.com/gh_mirrors/po/PowerBI-ThemeTemplates 还在为 Power BI 报表的样式反…

2026/10/11 16:39:34 阅读更多 →
不用续期也不用破解:ohook 三步实现 Microsoft 365 永久激活,订阅版功能免费全开

不用续期也不用破解:ohook 三步实现 Microsoft 365 永久激活,订阅版功能免费全开

不用续期也不用破解:ohook 三步实现 Microsoft 365 永久激活,订阅版功能免费全开 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: http…

2026/10/12 11:04:46 阅读更多 →
MySQL实战进阶:从索引优化到事务锁机制的性能调优指南

MySQL实战进阶:从索引优化到事务锁机制的性能调优指南

1. 从“会用”到“用好”:MySQL实战经验谈 提到MySQL,估计没几个搞开发的会觉得陌生。这玩意儿就像程序员工具箱里的螺丝刀,基础、常用,但真要用得顺手、用得高效,里面的门道可不少。很多人觉得,不就是个数…

2026/10/12 13:01:19 阅读更多 →

最新新闻

Flink Scala API生产实践:时间语义、状态管理与反压调优

Flink Scala API生产实践:时间语义、状态管理与反压调优

1. 项目概述:这不是“学Flink”,而是用Scala API把实时数据流真正跑起来“Flink-ScalaApi常规”——看到这个标题,别急着点开文档或翻API手册。它不是一句空泛的技术标签,而是一套在真实生产环境中被反复验证、打磨、踩坑后沉淀下…

2026/10/13 12:05:53 阅读更多 →
网格交易如何用ATR动态调整网格大小?Python实现与实战避坑

网格交易如何用ATR动态调整网格大小?Python实现与实战避坑

简介:这是一份讲解自动调整网格交易策略中网格大小方法的原创文档,面向希望改进传统网格策略的量化投资者,以及使用Python进行股票分析的开发学习者。文档针对固定网格导致过早满仓或空仓的痛点,给出魔灯的两类自适应方案&#xf…

2026/10/13 12:05:53 阅读更多 →
多波束水深测量数据处理:从原始数据到合格成果的关键步骤

多波束水深测量数据处理:从原始数据到合格成果的关键步骤

简介:这是一份面向海洋测绘、航道测量等领域的专业文献,系统论述多波束水深测量数据处理方法。内容从多波束测深系统组成切入,详细定义测量船坐标系、多波束探头坐标系、姿态传感器坐标系、电罗经坐标系、水平坐标系及测量坐标系,…

2026/10/13 12:05:53 阅读更多 →
artcraft:基于Canvas的参数驱动视觉创作工具集

artcraft:基于Canvas的参数驱动视觉创作工具集

1. 从“artcraft”这个名字说起:它到底想解决什么问题 第一次看到“artcraft”这个项目标题,我的直觉是:这大概率是一个把“艺术创作”和“工程实现”缝合在一起的东西。art 是艺术,craft 是手艺、工艺,合在一起就是“…

2026/10/13 12:05:53 阅读更多 →
k邻近算法实战指南:从数据清洗到在线更新的七道关卡

k邻近算法实战指南:从数据清洗到在线更新的七道关卡

1. 这不是“调个包”那么简单:k邻近算法在真实项目里到底怎么用你打开sklearn文档,看到from sklearn.neighbors import KNeighborsClassifier,敲下几行代码跑通了鸢尾花数据集——恭喜,你完成了k邻近算法的“Hello World”。但如果…

2026/10/13 12:05:53 阅读更多 →
环形链表 II:快慢指针找入环点的数学推导与代码实现

环形链表 II:快慢指针找入环点的数学推导与代码实现

要搞懂这道“环形链表Ⅱ”,光会判断有没有环远远不够。很多人在 LeetCode-141 里用快慢指针跑得飞起,一遇到 142 要找入环点就直接懵住。LeetCode-142 真正考的不是“会不会用双指针”,而是“能不能讲清楚快指针和慢指针相遇之后,…

2026/10/13 12:04:52 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →