cutrail—— 一个用 Rust 写的材料去除仿真核心,正在悄悄补齐 CAM 开源工具链里最关键的那块拼图。
先说一个老难题
做数控加工的人都知道:上机之前必须验证刀路。
一段 NC 程序写错了,轻则过切报废工件,重则撞机伤设备。所以在真实切削之前,先用软件把"刀具怎么吃材料"模拟一遍,是制造业几十年的基本操作。
但仿真这件事,技术门槛极高。核心难点在于:
- 布尔运算要稳—— 刀具扫掠体和工件毛坯做"求差",每一次都是一次三角网格布尔运算;真实刀路里大量共面、共边的情况,稍不留神就失败;
- 多轴要扛得住—— 五轴加工中刀具姿态连续变化,扫掠体包络面构造涉及复杂的曲面求交,极易算崩;
- 要快—— 一个真实刀路动辄几十万段,仿真必须能在"分钟级"跑完,否则只是个玩具。
市面上成熟的仿真能力大多锁在商用 CAM 里,开源侧一直缺一个干净、可嵌入、能当库用的仿真内核。
cutrail 想补的就是这个位。
它是什么
https://crates.io/crates/cutrail(Apache-2.0 许可)是一个用纯 Rust编写的材料去除仿真核心,当前版本0.1.1。一句话概括:
毛坯存成三角网格,用鲁棒的网格布尔运算,把刀具扫掠过的体积逐段"减"掉。
它支持3 轴和 5 轴铣削,可读写 STEP、STL、OBJ、glTF、3MF,能拿加工结果和设计模型做比对校验,还能编译成WebAssembly跑在浏览器里。
项目地址:
- GitHub:https://github.com/botrail/cutrail
- crates.io:https://crates.io/crates/cutrail
- 文档:https://docs.rs/cutrail
四个真正值得关注的点
1️⃣ 布尔运算"不崩":靠的是 Manifold
仿真的命门是布尔运算。cutrail 把毛坯交给manifold-rust(Manifold 3D 几何库的纯 Rust 移植)来持有和管理。
manifold-rust 有两套引擎:一套追求与 C++ 参考实现逐位一致的精确布尔,另一套基于精确有理数运算的鲁棒引擎,专门吃真实产线里那些"破网格"——自相交、重复面片、非流形连接、内部空洞、内外翻转的通通能处理。
cutrail 直接受益于此,所以真实刀路必然产生的共面/共边情况,从不会让一次切削失败。这对工程软件来说是刚需,不是加分项。
2️⃣ 五轴支持:姿态可以"段内旋转"
不只是 3 轴。cutrail 允许刀具轴线指向任意方向,而且在一个运动段内部,轴线本身还可以旋转——这正是五轴联动加工的数学特征。
扫掠体用凸包构造,并按弦高公差做细分,保证精度可控。支持平底、球头、圆角(牛鼻)立铣刀,以及直线、圆弧、螺旋三种运动。
// 五轴运动:只需给定段两端刀位(刀尖 + 刀轴方向)letseg=MotionSegment::linear(Pose::tilted_about_y([2.0,5.0,7.0],-25.0),Pose::tilted_about_y([8.0,5.0,7.0],25.0),);3️⃣ 十万段也不掉速:分块更新
这是性能上最聪明的设计。毛坯被分块(tiled),每一刀只更新与扫掠体相交的块。
官方给出的数据是:10 万段之后,每段耗时仍是几毫秒量级。代价是可控的,规模是可预期的——这才是能用在产线上的算法。
4️⃣ I/O 齐全 + 能当"裁判"
- 读:盒子、圆柱、STL 网格、STEP 文件做毛坯;
- 写:STL / OBJ / glTF / 3MF,三轴平底刀结果还能导出解析 B-rep(平面+圆柱)的 STEP,并用 FreeCAD、OpenCASCADE 校验过是合法实体;
- 校验:和设计模型比体积、查过切/残留区域、检测刀柄/刀座碰撞、统计每段去除量和毛坯边界变化。
最后这一点很有价值:它让 cutrail 不只是"看个动画",而是能当质检员——输出一份可量化的加工误差报告,这是数字孪生和 MES 工步流转真正吃得上的数据。
一段能跑的示例代码
# Cargo.toml cutrail = "0.1"usecutrail::{Engine,EngineOptions,ManifoldKernel,MotionSegment,Pose,StockShape,Tool};fnmain()->cutrail::Result<()>{// 60×40×20 mm 的方块毛坯,按 10 mm 分块letstock=StockShape::Box{min:[0.0,0.0,0.0],max:[60.0,40.0,20.0],};letoptions=EngineOptions::default().with_tile_size(10.0);letmutengine=Engine::new(ManifoldKernel,&[stock],options)?;// 一把 6 mm 平底立铣刀,开槽 + 钻孔lettool=Tool::flat_end_mill(6.0,20.0);letslot=MotionSegment::linear(Pose::vertical([10.0,10.0,15.0]),Pose::vertical([50.0,10.0,15.0]),);letplunge=MotionSegment::linear(Pose::vertical([30.0,30.0,20.0]),Pose::vertical([30.0,30.0,12.0]),);forsegin[slot,plunge]{letreport=engine.cut(&tool,&seg)?;println!("{:?}: 去除 {:.2} mm³,耗时 {:?}",report.outcome,report.removed_volume,report.elapsed);}// 导出结果engine.write_mesh_file("machined.glb")?;engine.write_step(std::fs::File::create("machined.step")?,"machined",)?;Ok(())}接口设计得很克制:Engine就是状态、切削、校验、历史的一站式入口;cut失败返回带类型的错误且不动状态,可以放心地一路?。
它和同类比,特别在哪
| 维度 | 常见做法 | cutrail |
|---|---|---|
| 几何内核 | 自研体素 / Dexel / 离散面片 | 纯 Rust + Manifold 鲁棒布尔 |
| 输出 | 多停在 STL(离散化) | 三轴可出解析 STEP B-rep |
| 五轴 | 很多只做 3 轴 | 段内刀轴旋转,真五轴 |
| 性能 | 全量更新 | 分块增量,十万段仍毫秒级 |
| 部署 | 桌面端为主 | WASM 可跑浏览器/Node |
有意思的是,开源 CAM 领域已经出现一批 Rust 项目:G-code 仿真器 https://crates.io/crates/gsim-rs、vcad 的 SDF 八叉树毛坯仿真 https://lib.rs/crates/vcad-kernel-stocksim、纯 Rust 的 STEP 读写 https://lib.rs/crates/monstertruck-io……一个纯 Rust 的 CAM 工具链正在成型,而 cutrail 填的正是其中最硬核的"材料去除 + 校验"这一环。
适合谁用
- CAM / 数控软件的开发者—— 想要一个可嵌入、可定制、不用绑死商用内核的仿真引擎;
- 数字孪生 / 产线数字化团队—— 需要工序模型连续演化、可量化过切残留数据;
- Rust + CAD 几何生态的贡献者—— 项目依赖都是纯 Rust 生态(manifold-rust、truck),无 FFI 负担,是好上手的研究对象;
- 学术方向—— 材料去除算法、碰撞检测、加工精度检验这些老课题,正需要可复现的开源实现。
一点现实提醒
0.1.1 意味着它仍是早期版本。文档里列出的功能已经相当完整,但生产环境使用建议先在自有刀路上做充分回归;同时,纯 Rust 几何生态本身也在快速演进,下游依赖(manifold-rust、truck)的 API 仍可能变动。
不过反过来想:早期也正是参与进来的最好时机——Star、提 Issue、开 PR,都有机会真正影响一个基础库的走向。
相关链接
- 🔗 GitHub:https://github.com/botrail/cutrail
- 📦 crates.io:https://crates.io/crates/cutrail
- 📘 文档:https://docs.rs/cutrail
- 🧱 几何内核:https://crates.io/crates/manifold-rust
- 📐 CAD I/O:https://docs.rs/truck-stepio
如果你也在做 CAM、几何内核或数控仿真相关的工作,欢迎在评论区聊聊——开源这条路,同行的人多了才好走。
几点说明:全文基于 cutrail 在 crates.io 的官方描述及公开的领域资料撰写;文中的性能数据(十万段、毫秒级)为项目官方给出的表述,未经本人实测复现;示例中Cargo.toml写法与 API 调用均取自官方文档,实际使用时请以最新版 docs.rs 为准。