1. 从Demo到工程AICAD落地的真实鸿沟做过AICAD方向的人都有一个共同感受演示视频里模型跑得飞快图纸识别准确率标称95%以上可一旦接入真实产线面对客户发来的一个压缩包里塞着几十张DWG、DXF、PDF混排的图纸整个流程立刻崩盘。这不是个别现象而是这个领域当前最真实的写照。我自己从2021年开始接触AI辅助CAD处理这个方向做过图纸要素提取、图层自动分类、尺寸标注识别、DXF批量转换等几个项目踩过的坑比写过的代码还多。今天这篇文章不聊虚的就围绕AICAD落地这件事把为什么Demo满天飞、工程却走不通这个问题拆开揉碎讲清楚。涉及的核心技术点包括DXF/DWG格式解析、FreeCAD二次开发、AI模型在CAD场景的适配以及从图纸读取到结构化输出的完整链路。这篇文章适合三类人看一是正在做AICAD方向但卡在工程化阶段的开发者二是想了解CAD图纸自动化处理可行性的工程师三是手里有大量图纸处理需求、想评估AI方案能不能落地的技术负责人。我会尽量用大白话把技术细节讲透同时给出可以直接参考的实操方案和避坑经验。先说一个基本判断AICAD的Demo和工程之间隔的不是算法精度而是数据工程、格式兼容、场景约束这三座大山。算法层面的事情反而是最容易解决的因为开源模型和商业API已经足够多。真正难的是你怎么让一个在干净数据集上跑通的模型去面对现实中那些图层混乱、线型自定义、块引用嵌套、编码不统一的CAD文件。2. 为什么Demo看起来很美理想化假设的陷阱2.1 Demo的典型套路与隐藏假设大部分AICAD的Demo本质上是在一个被精心裁剪过的数据集上做推理。比如拿几十张标准建筑平面图图层命名规范、线型统一、没有外部引用、没有自定义字体然后跑一个目标检测或者语义分割模型把墙体、门窗、标注框出来效果看起来很好。但这里面隐藏了几个致命假设第一假设图纸格式是统一的DXF而且版本一致第二假设图层结构是规范的没有嵌套块引用第三假设图纸内容是完整的没有缺失外部参照第四假设图纸比例和坐标系是标准的。这四个假设在真实工程场景里几乎没有一个能完全满足。我见过一个典型的Demo用YOLO做CAD图纸中的符号识别在自建数据集上mAP到了0.92。结果拿去跑一个实际项目客户发来的图纸是DWG 2004格式里面大量使用了自定义块和属性块还有多层嵌套的外部引用。模型直接懵了因为转成DXF之后块引用被展开成了一堆散线原本的符号结构完全丢失。2.2 数据预处理的隐形工作量Demo里通常一笔带过数据预处理好像DXF文件读进来就是干净的坐标和实体列表。实际上DXF/DWG的解析本身就是一个大坑。DWG是二进制格式Autodesk一直没有公开完整规范开源方案主要靠ODAOpen Design Alliance的Teigha库或者LibreDWG但兼容性参差不齐。DXF虽然是文本格式但不同版本、不同软件导出的DXF在实体类型、组码结构、扩展数据上差异巨大。举个例子同样是标注实体AutoCAD导出的DXF里可能是DIMENSION中望CAD导出的可能带一堆扩展组码而某些国产软件导出的DXF干脆把标注炸开成了线和文字。你的AI模型如果是在AutoCAD标准DXF上训练的遇到后面两种情况输入分布直接偏移精度断崖式下跌。所以我在实际项目里的经验是数据预处理的代码量往往是模型推理代码量的5到10倍。你需要写大量的格式兼容逻辑、异常处理、实体归一化才能把不同来源的图纸统一成模型能吃的格式。这部分工作Demo里不会展示但工程里绕不过去。2.3 评测指标的误导性Demo常用的评测指标是准确率、召回率、mAP这些。但在CAD场景里这些指标和实际可用性之间有很大差距。比如你做一个图层分类模型准确率90%听起来不错。但实际使用中用户关心的是你把哪些线分错了如果分错的是无关紧要的辅助线用户可能无所谓如果分错的是承重墙和普通隔墙那就是安全事故级别的错误。我在一个项目里定过一个更贴近实际的指标关键实体漏检率。因为对于图纸处理来说漏掉一个关键尺寸标注比多识别几个无关紧要的符号要严重得多。Demo通常追求整体指标好看工程则要保证关键路径不出错。这个思路的转变是落地过程中必须完成的。3. 工程走不通的核心卡点格式、数据与场景3.1 DXF/DWG格式的深水区先说DXF。很多人觉得DXF是文本格式解析应该很简单。确实基础的实体读取不难Python里用ezdxf库几行代码就能把LINE、CIRCLE、TEXT读出来。但真实图纸里的大量信息藏在**块引用INSERT、属性ATTRIB、扩展数据XDATA、代理实体ACAD_PROXY_ENTITY**里。这些才是图纸语义的核心载体也是解析最容易出问题的地方。块引用尤其麻烦。一张图纸里可能定义了几十个块每个块又有嵌套引用。你读到一个INSERT实体需要递归展开它的块定义还要处理缩放、旋转、镜像变换。如果块定义里还有属性属性值可能覆盖了块内默认值。这一套逻辑写下来没有几百行代码搞不定。而且不同CAD软件对块的处理还有差异FreeCAD读DWG块引用和AutoCAD读出来的结构可能就不一样。DWG更不用说了。二进制格式版本众多从R14到2018内部结构变化很大。开源方案里LibreDWG覆盖度有限ODA的SDK虽然强大但是商业授权。很多团队的做法是先用ODA或者商业转换工具把DWG转成DXF再走DXF解析流程。但转换过程本身就可能丢信息比如自定义对象、动态块、约束信息转完就没了。实操建议如果你的项目必须处理DWG优先考虑用ODA的转换工具做前置处理同时保留原始DWG作为兜底。不要指望纯开源方案能完美解析所有DWG版本这个坑我替你们踩过了。3.2 图纸数据的脏乱差现实真实图纸的数据质量用“脏乱差”来形容一点不夸张。我整理过常见的几类问题问题类型具体表现对AI流程的影响图层混乱所有实体在一个图层或图层命名无规律基于图层的特征工程失效线型自定义使用自定义线型文件缺失时显示为实线线型识别模型输入异常字体缺失使用了非标准SHX字体文字显示为问号文字识别完全失效外部参照图纸依赖外部DWG文件单独打开缺失内容图纸内容不完整坐标偏移图纸基点远离原点坐标值极大数值计算精度问题比例混乱不同图元使用不同比例标注比例与实际不符尺寸提取错误这些问题在Demo数据集里基本不会出现但在工程里是常态。你不可能要求客户把图纸整理干净再给你处理只能自己写容错逻辑。比如字体缺失的问题我的做法是维护一个常见SHX字体映射表遇到缺失字体时用近似字体替换同时记录替换日志供人工复核。3.3 场景约束与精度要求的矛盾CAD图纸处理的下游场景对精度的要求往往比Demo高一个数量级。比如工程量计算尺寸提取错一个小数点可能就是几十万的偏差。再比如图纸审查漏掉一个消防通道标注可能涉及合规问题。但AI模型的输出天然带有不确定性。你没法保证100%准确只能通过后处理规则、人工复核、置信度阈值来兜底。这就带来一个工程上的矛盾AI负责提效但最终决策还得靠人。很多Demo宣传的“全自动”在工程里实际上是“AI预处理人工确认”的半自动流程。我在一个图纸要素提取项目里最终交付的方案是AI模型先跑一遍输出带置信度的结构化结果然后在一个Web界面里高亮显示低置信度的部分让审核人员重点检查。这样整体效率提升了大概3倍但完全没有人工环节是不现实的。承认这个现实反而让方案更容易落地。4. 实操路径从图纸读取到结构化输出的完整链路4.1 环境准备与工具选型先说一下我常用的工具链这套组合在多个项目里验证过比较稳DXF解析Python ezdxf覆盖大部分DXF版本API友好社区活跃DWG处理ODA File Converter做DWG到DXF的批量转换或者用LibreDWG做轻量解析CAD二次开发FreeCAD的Python API适合做几何运算和格式转换AI模型根据任务选检测用YOLOv8分割用Segment Anything文字识别用PaddleOCR几何处理OpenCASCADE通过PythonOCC绑定处理复杂几何运算安装这块ezdxf直接pip install ezdxf就行。FreeCAD建议用conda装因为依赖比较多。OpenCASCADE的Python绑定稍微麻烦点可以用conda-forge的pythonocc-core。# 基础环境 pip install ezdxf paddleocr ultralytics conda install -c conda-forge freecad pythonocc-core注意FreeCAD的Python版本要和你的主环境一致否则import会出问题。我建议单独建一个conda环境给FreeCAD用通过子进程调用避免版本冲突。4.2 DXF读取与实体归一化读取DXF的核心是把各种实体统一成标准化的数据结构。下面是我常用的一个归一化函数框架import ezdxf from ezdxf.math import Vec3 def normalize_entity(entity): 将DXF实体归一化为统一结构 result { type: entity.dxftype(), layer: entity.dxf.layer, handle: entity.dxf.handle, geometry: None, text: None, attributes: {} } etype entity.dxftype() if etype LINE: result[geometry] { start: tuple(entity.dxf.start), end: tuple(entity.dxf.end) } elif etype LWPOLYLINE: points [(p[0], p[1]) for p in entity.get_points()] result[geometry] {points: points, closed: entity.closed} elif etype in (TEXT, MTEXT): result[text] entity.dxf.text if etype TEXT else entity.text result[geometry] {insert: tuple(entity.dxf.insert)} elif etype INSERT: # 块引用需要递归展开 result[geometry] { name: entity.dxf.name, insert: tuple(entity.dxf.insert), rotation: entity.dxf.rotation, scale: (entity.dxf.xscale, entity.dxf.yscale) } # 处理属性 for attrib in entity.attribs: result[attributes][attrib.dxf.tag] attrib.dxf.text return result这个函数只是框架实际项目里还要处理SPLINE、ARC、ELLIPSE、HATCH等更多实体类型以及扩展数据。重点是把所有实体转成统一的字典结构后续的AI处理和规则引擎都基于这个结构操作避免直接依赖ezdxf的对象。4.3 块引用展开与坐标变换块引用是DXF解析里最复杂的部分。一个INSERT实体引用了块定义块定义里可能还有INSERT形成嵌套。展开的时候要做坐标变换把块内坐标转换到世界坐标系。def expand_insert(entity, doc, parent_transformNone): 递归展开块引用返回世界坐标系下的实体列表 block_name entity.dxf.name block doc.blocks.get(block_name) # 构建变换矩阵 insert_point Vec3(entity.dxf.insert) rotation entity.dxf.rotation scale Vec3(entity.dxf.xscale, entity.dxf.yscale, entity.dxf.zscale) transform build_transform(insert_point, rotation, scale) if parent_transform: transform parent_transform transform expanded [] for sub_entity in block: if sub_entity.dxftype() INSERT: # 递归展开嵌套块 expanded.extend(expand_insert(sub_entity, doc, transform)) else: # 应用变换到几何坐标 transformed apply_transform(sub_entity, transform) expanded.append(transformed) return expanded这段代码的关键是变换矩阵的构建和累积。实际项目中我遇到过块引用嵌套五六层的情况递归深度要设够同时要注意循环引用的检测否则会无限递归。4.4 AI模型接入与后处理模型接入这块我的经验是不要把模型输出直接当最终结果一定要加后处理层。后处理包括几个部分第一是几何校验。比如模型识别出一个矩形区域是房间后处理要检查这个区域的边界是否闭合、面积是否在合理范围、是否和相邻区域重叠。第二是规则过滤。比如尺寸标注识别后处理要检查标注值是否符合工程常识比如梁高不可能是负数房间宽度不可能小于某个阈值。第三是置信度分级。把模型输出按置信度分成高、中、低三档高档直接采用中档进入人工复核队列低档直接丢弃或重新推理。def post_process(detections, rules): 后处理几何校验 规则过滤 置信度分级 results {high: [], medium: [], low: []} for det in detections: # 几何校验 if not geometry_check(det): continue # 规则过滤 if not rule_filter(det, rules): continue # 置信度分级 conf det[confidence] if conf 0.9: results[high].append(det) elif conf 0.7: results[medium].append(det) else: results[low].append(det) return results这套后处理逻辑是我从多个项目里总结出来的能显著降低误报率。Demo里通常没有这一层所以看起来精度很高但实际用起来一堆问题。5. 常见问题与排查技巧实录5.1 格式兼容性问题速查问题现象可能原因排查方法解决方案ezdxf读取报错DXF版本不兼容检查$ACADVER变量用ODA转换到R2010版本块引用展开后坐标错乱变换矩阵计算错误对比AutoCAD中块的位置检查旋转和缩放的顺序文字识别乱码字体编码问题查看DXF中文字实体的组码统一转UTF-8处理SHX字体实体丢失代理实体未处理检查ACAD_PROXY_ENTITY用ODA转换或跳过坐标值过大图纸基点偏移查看$INSBASE变量做坐标平移归一化5.2 模型精度下降的排查思路模型在Demo上表现好在真实数据上精度下降排查顺序建议这样先看输入分布。把真实数据转成和训练数据一样的格式可视化对比。我遇到过一次训练数据是DXF R2010真实数据是R2000实体类型一样但组码结构不同导致解析出来的坐标有偏差。再看预处理一致性。训练时的预处理和推理时的预处理必须完全一致包括归一化参数、坐标变换、实体过滤规则。这个很容易出错建议把预处理代码封装成独立模块训练和推理共用。最后看场景差异。如果输入分布和预处理都没问题那就是场景本身有差异。比如训练数据是建筑图真实数据是机械图符号体系完全不同。这种情况只能补充训练数据或者针对新场景做微调。5.3 性能优化的实操技巧CAD图纸处理的计算量不小尤其是大图纸。我总结几个优化点空间索引用R-tree或者网格索引加速实体查询避免全量遍历批量处理DXF解析和模型推理都支持批处理尽量攒批缓存机制块定义、字体映射、图层信息这些可以缓存避免重复解析并行化多张图纸可以并行处理用multiprocessing或者任务队列from multiprocessing import Pool def process_drawing(filepath): 单张图纸处理流程 doc ezdxf.readfile(filepath) entities [normalize_entity(e) for e in doc.modelspace()] # ... 后续处理 return result # 批量并行处理 with Pool(processes8) as pool: results pool.map(process_drawing, drawing_files)注意ezdxf的对象不是线程安全的多线程处理同一张图纸会出问题。多进程是更稳妥的选择每个进程独立读取文件。5.4 几个容易忽略的细节第一个是单位问题。DXF里$INSUNITS变量定义了图纸单位但很多图纸这个值是0无单位。你需要根据图纸内容和上下文推断单位否则尺寸提取会错。第二个是图层可见性。有些实体在关闭或冻结的图层上ezdxf默认会读出来但实际这些实体在图纸上是不可见的。处理前要检查图层状态过滤掉不可见实体。第三个是颜色和线宽。这些属性在AI模型里可以作为特征输入但要注意不同CAD软件的颜色索引可能不同。ACI颜色索引是标准的但真彩色RGB和配色系统Color Book需要额外处理。第四个是标注关联性。DIMENSION实体可能关联到其他实体移动被标注对象时标注会更新。如果你炸开了标注这个关联就丢了。处理标注时要保留关联信息或者至少记录关联关系。6. 落地路径的务实建议6.1 从单点突破而非全流程自动化我见过太多项目一上来就想做全流程自动化从图纸读取到工程量计算到出报表结果每个环节都不够扎实整体不可用。更务实的做法是选一个单点做深做透比如只做图纸要素提取或者只做尺寸标注识别把这个点做到95%以上的可用性再考虑扩展。单点突破的好处是你可以集中精力处理这个环节的所有边界情况积累足够的测试用例把鲁棒性做上去。等这个点稳定了再往上下游延伸风险可控得多。6.2 人机协同的流程设计前面提过全自动在工程里不现实。那怎么设计人机协同的流程我的经验是AI做粗筛人做精判。具体来说AI负责把图纸里的所有候选要素提取出来按置信度排序高置信度的直接通过低置信度的标记出来。人工只需要检查低置信度的部分工作量大幅降低。同时人工的复核结果可以反馈给模型做持续优化。这个流程的关键是置信度阈值的设定。阈值太高人工复核量大阈值太低错误率高。我一般会先跑一批数据统计不同阈值下的准确率和复核量找一个平衡点。通常高置信度阈值设在0.9左右低置信度阈值设在0.6左右中间的部分进复核。6.3 数据闭环与持续迭代AICAD项目要持续变好必须建立数据闭环。每次人工复核的结果都要记录下来定期整理成训练数据对模型做微调。这个闭环跑起来之后模型会越来越适应你的业务场景精度逐步提升。数据闭环的建设建议从项目第一天就开始。不要等模型上线了再考虑那时候数据散落在各处整理成本很高。我的做法是在系统里内置反馈入口复核人员一键标记对错数据自动入库。6.4 技术选型的取舍原则最后说一下技术选型。AICAD这个方向技术栈选择很多但有几个原则可以参考格式解析优先用成熟库不要自己造轮子。ezdxf、LibreDWG、ODA这些经过大量项目验证比你自己写的解析器靠谱。AI模型优先用预训练微调不要从零训练。除非你的场景非常特殊否则预训练模型微调的效果和成本都更优。几何运算优先用OpenCASCADE它的几何算法库非常完善比你自己实现稳健得多。工程框架优先用Python生态丰富和AI工具链衔接顺畅。性能瓶颈部分可以用C扩展。这套选型原则是我在多个项目里试错总结出来的。早期我也试过自己写DXF解析器结果花了两个月兼容性还不如ezdxf。后来就学乖了能用现成的就用现成的把精力放在业务逻辑和场景适配上。7. 一些踩坑后的个人体会做AICAD落地这几年最大的体会是这个领域的难点不在AI而在CAD。AI模型本身的发展已经足够快开源模型和工具越来越强但CAD数据的复杂性、格式的碎片化、场景的多样性才是真正消耗精力的地方。我见过很多团队AI算法能力很强但对CAD数据理解不够做出来的东西在Demo里很漂亮一到真实场景就各种问题。反过来一些对CAD业务理解深的团队即使AI技术一般也能做出可用的产品。所以如果你要做这个方向建议先花时间把CAD数据本身研究透把DXF/DWG的格式细节、实体类型、常见问题都摸清楚再考虑AI怎么介入。另一个体会是不要追求一步到位。AICAD的落地是一个渐进过程从辅助人工到半自动到高度自动每一步都需要验证和迭代。想着一上来就全自动大概率会失败。把目标定得务实一点先解决一个具体的小问题拿到正反馈再逐步扩展。最后分享一个实用技巧建立自己的测试图纸库。收集各种来源、各种版本、各种质量的CAD图纸作为回归测试集。每次代码改动都跑一遍测试集确保没有引入新的兼容性问题。这个习惯帮我避免了很多次线上事故。图纸库不需要很大几十张有代表性的就够但覆盖面要广建筑、机械、电气各来一些不同CAD软件导出的各来一些不同版本的各来一些。有了这个库你的开发效率会高很多。
企业数字化 ERP 产品动态
相关推荐
MySQL到达梦数据库迁移后的SQL优化实践 1. MySQL迁移到达梦数据库后的SQL优化实践最近在项目中完成了从MySQL到达梦数据库的迁移工作,迁移完成后发现部分SQL语句执行效率明显下降。经过两周的优化调整,现将关键优化点整理如下,供有类似需求的同行参考。2. 数据库差异分析与优化方向… · 2026/11/3 21:40:46
Jev决策输出范式:从Token生成到Agent执行决策的范式转移 1. 从 Token 到决策:Jev 到底在做什么第一次看到“Jev”这个名字,是在一个 Agent 开发群里。有人丢了一张截图,说某个模型在 Codex 里跑任务时,输出不是一段文字,而是一个结构化的动作指令——直接告诉执行器“下一步打… · 2026/11/3 21:40:46
Paperclip:面向 AI Agent 的轻量级 React 服务端运行时 1. 项目概述:Paperclip 不是回形针,而是一个面向 AI Agent 开发的轻量级 Node.js 运行时框架你搜“paperclip”,第一反应可能是办公桌抽屉里那枚银色小金属件——但在这个技术语境下,它压根不是物理物件,而是最近半年在… · 2026/11/3 21:39:45
33ms概率校准引擎:破解LLM高置信度幻觉,提升RAG问答可靠性 开这个机会聊聊很多朋友踩过的坑:LLM 给出的置信度明明很高,一上线做真实推理就翻车,而且翻车得特别“自信”。我自己在搭知识库问答、做RAG检索排序的时候,被这种“高置信度幻觉”坑过不止一次。后来发现,需要的不只是… · 2026/11/3 23:24:50
Groovy List<Map>多字段分组:复合Key、静默故障与工具封装 Groovy 里对List<Map>按多个属性分组,看起来就是把groupBy的闭包从{ it.warehouse }改成{ [it.warehouse, it.channel] }这么简单,三行代码就能跑出结果。但我经手过的几个报表类脚本里,真正花时间的从来不是写这三行,而是分… · 2026/11/3 23:24:50
AI生产力实战周记:内容流水线、开发测试链路与Agent工具评测 作为一个常年把AI当成生产力工具、几乎每天都要换着花样折腾的人,我最近发现一个很有趣的现象:AI工具迭代的速度已经快到“不写下来就会忘”。这周我一口气干了好几件事——用AI做了一套内容生产流水线、把手上一个数据项目的开发测试链路给拉通了、顺手… · 2026/11/3 23:24:50
显存优化后GPU利用率反而下降?从Warp调度到PCIe的排查指南 这是 LLM Training Lab 系列的第 10 期。前几篇我们一边做显存治理,一边记录数据:把 7B 参数模型从 18GB 压到 8GB 以内,混合精度、激活重计算、优化器 offload 全都用上,数字确实好看。但真正让我紧张的,是从显存优化… · 2026/11/3 23:24:50
锡铋焊料低温焊接的可靠性风险:脆性、蠕变与铋污染 前段时间一位做小批量工控板的开发者拿着一块返修了三次的板子来找我,说这批板子出厂测试全过,客户装进设备跑了两个多月,显示屏排线的焊点开始陆续出问题。拆下来一看,焊点表面发灰、发暗,没有正常焊点那种亮泽的弧形… · 2026/11/3 23:24:50
makefsdata与fsdata.c:嵌入式Web静态资源转C数组 1. 先搞清楚 makefsdata 在整条链路里干什么1.1 从"网页到底放哪"这个争论说起做嵌入式 Web 服务的人几乎都遇到过同一个问题:设备上跑了一个 HTTP 服务器,能返回"Hello World",但真正要把一个带样式、带图标、带几张小图… · 2026/11/3 23:23:50
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46