STL 变回可编辑 CAD:mesh2cad 的拟合、容差与验收
一句话结论:从 Printables / Thingiverse 下载一个支架 STL,想把其中一个孔放大 2 mm,你会发现没有"孔"可改——STL 只是一堆三角面,CAD 把它读成成千上万个碎面。2026 年 10 月开源的 mesh2cad 专门解决这类简单机械件:它从三角面里找出平面、圆柱、球、圆锥,生成真正的 B-rep STEP;对简单的板类零件,还能输出一份每个尺寸都是命名变量的 CadQuery 脚本——把 hole_1_d = 6.0 改成 8.0,重跑脚本就得到新的 STEP。它还提供一个诚实的失败模式:拟合不出来就什么都不写,并告诉你原因。
披露:本文编译自 mesh2cad 作者 Emir Mrkaljević 的发布文(dev.to,2026-10-16)。作者是工具维护者,基准数据与限制均来自其公开 README 与自测;文中所有数字以其仓库记录为准,建议按自己的零件复测。
一、问题:STL 里没有"孔"
下载的支架、法兰、外壳,通常只有 STL。CAD 打开它,得到的是:
- 平面被切成很多狭长三角面;
- 圆孔变成一圈多边形;
- 圆柱面是几十条窄带;
- 没有特征树、没有草图、没有可编辑的孔径参数。
于是"把孔放大 2 mm"这件事,在传统流程里只有三条路:
| 路线 | 代价 | 风险 |
|---|---|---|
| 重新建模 | 几十分钟到几小时 | 尺寸靠卡尺量,容易引入新误差 |
| 扫描反求(专业软件) | 软件与学习成本高 | 对碎面/噪声敏感,仍需人工清理 |
| 直接用网格编辑 | 快 | 孔不再是圆、装配面不再平,CAM/打印出问题 |
mesh2cad 走的是第四条:把三角面重新拟合回解析曲面,再缝合成实体。
二、它到底做什么
输入 STL / OBJ / PLY,输出:
- B-rep STEP:可以进任意 CAD/CAM;
- 参数化 CadQuery 脚本(仅简单板类件):每个尺寸是命名变量,改完重跑即生成新 STEP;
- 一份报告:双边 Hausdorff、RMS 偏差、体积误差,以及本次用的是精确 B-rep 还是回退的 faceted solid。
命令行:
pip install mesh2cad
mesh2cad convert part.stl -o part.step --tol 0.1 --report report.md
--tol 0.1 是拟合容差(毫米)。孔径的"取整"也受它约束:
数值只有在取整后仍能落在--tol内时才会被取整,5.997才会变成6.0。
生成的参数段长这样:
# --- parameters ---
base_x = 40.0 # base length (X)
base_y = 30.0 # base width (Y)
base_t = 6.0 # base thickness (Z)
hole_1_d = 6.0 # diameter
hole_1_csk_d = 12.0 # countersink diameter
hole_1_csk_angle = 90.0 # countersink angle
把 hole_1_d 改成 8.0,python bracket.py,得到新 STEP。在脚本写出来之前,mesh2cad 会先运行它,并把结果与输入网格比对;如果零件不符合支持的形状,或脚本结果偏离网格,它什么都不写,并告诉你为什么。 作者的原话是:"我宁愿拒绝,也不愿给你一份看起来对、其实不对的脚本。"
三、五步原理
| 步骤 | 做什么 | 关键点 |
|---|---|---|
| 1. 清理网格 | 用 trimesh 清理,并保留一份 Taubin 平滑副本只用于法线 | 噪声不毁掉法线估计 |
| 2. 区域生长 | 把三角面生长成平面区域;剩余条带再尝试圆柱、球、圆锥 | 每个拟合做稳健非线性精修 |
| 3. 构建精确 B-rep | 通过 OCP 调 OpenCascade:三平面交得平面多边形、平面-圆柱/球交得圆、圆锥台;缝合为实体并校验 | 这是"可编辑"的来源 |
| 4. 诚实回退 | 精确缝合失败时,输出有效 faceted solid,顶点吸附到拟合曲面上,并在报告中说明 | 不假装成功 |
| 5. 报告保真度 | 双边 Hausdorff、RMS 偏差、体积误差、所用方法 | 让"像不像"变成数字 |
四、噪声下的基准:0.2 mm 是什么水平
真实扫描与导出的网格都有噪声,所以作者用已知真值的 CadQuery 零件做基准:先离散化,再叠加高斯顶点噪声,每个用例跑 3 个随机种子,取最差的一次。
| 零件 | 噪声 σ | 精确 B-rep | Hausdorff | 体积误差 |
|---|---|---|---|---|
| 带孔板 | 0.2 mm | 3/3 | 0.078 mm | 0.18% |
| 带筋板 | 0.2 mm | 3/3 | 0.108 mm | 0.12% |
| 球顶 | 0.2 mm | 3/3 | 0.241 mm | 0.25% |
| 带倒角凸台 | 0.2 mm | 3/3 | 0.511 mm | 0.49% |
| 沉头板 | 0.05 mm | 3/3 | 0.055 mm | 0.07% |
| 沉头板 | 0.2 mm | 1/3 | 0.590 mm | 0.54% |
两个值得记住的细节:
- 窄圆锥最难。 0.2 mm 噪声下,2 mm 倒角或沉头会碎成一圈平面条带,圆锥拟合器根本看不到圆锥。0.4.2 版把这些条带重新聚成一个圆锥,并锁定到相邻孔/凸台的轴线上——带倒角凸台现在在 0.2 mm 噪声、3 个种子上都精确。
- 90° 沉头在 0.2 mm 噪声下只有 1/3 种子精确。 另外两个种子得到的是有效的 faceted solid,不是解析曲面。这不是"失败",而是报告会告诉你的降级——能不能接受,取决于你要拿它做什么。
五、四条限制(作者自己列的)
- 只支持平面、圆柱、球、圆锥。 没有圆角,没有自由曲面——有机模型和大多数手办不在范围内。
- 圆柱必须在垂直于其轴线的平面上结束(通孔、凸台、销)。
- CadQuery 脚本路径只覆盖 Z 向上的盒/板 + 凸台、竖直孔、竖直凸台。 其它形状只给 STEP。
- 沉头在 0.2 mm 噪声下不保证解析精确(见上表)。
这四条决定了它适合什么:支架、法兰、垫块、简单外壳、带孔板件这类"工程件";不适合人物、雕塑、有机曲面。
六、从 AI 助手里调用:MCP
mesh2cad 同时是一个 MCP 服务器,Claude Desktop、Cursor 或任意 MCP 客户端可以调用 convert、analyze、report、to_cadquery:
{ "mcpServers": { "mesh2cad": { "command": "mesh2cad", "args": ["mcp"] } } }
安装:pip install "mesh2cad[mcp]"。
这意味着一个常见工作流可以变成:Agent 拿到 STL → 调 analyze 看拟合可行性 → 调 convert 出 STEP → 调 report 读偏差 → 你只做验收。但要注意:这仍然是几何转换,不是"AI 帮你改设计";改参数、判断装配是否合理,仍然要人。
七、收到 STEP 之后:验收清单
转换工具最容易骗人的地方,是"文件能打开"被当成"转换正确"。建议按下面顺序验收:
| 检查 | 怎么做 | 通过标准 |
|---|---|---|
| 单位与尺寸 | 在 CAD 里量最大外形、孔距、板厚 | 与原始 STL 一致(注意 mm/inch) |
| 实体有效性 | 检查是否为有效实体(无自由边、无自交) | B-rep 校验通过 |
| 孔是否为真圆 | 量孔径、看圆柱面 | 不是多边形近似 |
| 关键装配面 | 检查平面度与法向 | 与设计意图一致 |
| 偏差报告 | 读 report.md 的 Hausdorff / RMS / 体积误差 |
在你零件的公差内 |
| 降级标记 | 报告里写的是精确 B-rep 还是 faceted | 关键件不接受降级 |
| 下游可用性 | 导出 STEP 进 CAM / 切片 / 装配 | 无修复警告 |
在浏览器里快速看一眼:把生成的 STEP 或原始 STL 丢进 CAD 查看器 检查外形与孔位;如果是打印件,再用 3D 查看器 看网格是否有翻面、非流形边。浏览器查看不能替代 CAD 校验,但能在三十秒内发现"孔变成六边形""单位错十倍"这类明显问题。
八、和另外两条路线怎么选
| 场景 | 建议 |
|---|---|
| 简单工程件,只改几个尺寸 | mesh2cad(参数化脚本路线) |
| 复杂曲面/有机形状 | 重新建模或专业反求软件 |
| 只是想打印、不改设计 | 直接切片,不要转换 |
| 要进 CAM、要改装配尺寸 | 必须拿到有效 B-rep,并做上面的验收 |
一句话:mesh2cad 把"重画一遍"变成"改几个变量",代价是它只认四类解析曲面,并且会在做不到时明确拒绝。
Sources
- Emir Mrkaljević, Turning an STL back into editable CAD: fitting planes, cylinders and cones to noisy meshes in Python, dev.to, 2026-10-16:https://dev.to/emirmrkaljevic/turning-an-stl-back-into-editable-cad-fitting-planes-cylinders-and-cones-to-noisy-meshes-in-python-2eia
- 仓库与完整基准:https://github.com/emirmrkaljevic/mesh2cad
同主题阅读
本文属于「CAD / 制造」专题。BimAnt 编译整理,转载请注明出处。转换结果与公差是否可接受,需按你的零件与下游工序自行验收。