☰
SolidCraft 参数化建模:改一个尺寸看模型重建,一次讲透约束、参数与增量重建
2026/11/4 1:12:30 网站建设 项目流程

SolidCraft 参数化建模:改一个尺寸看模型重建,一次讲透约束、参数与增量重建

【免费下载链接】solidcraftSolidCraft: an open-source parametric 3D CAD application built in pure Rust. Desktop, web, and automation through MCP.项目地址: https://gitcode.com/gh_mirrors/so/solidcraft

你有没有过这样的经历:在参数面板里把机箱高度从 24 mm 改成 32 mm,点击确认的瞬间,整条特征链自动重算,圆角、抽壳、孔位全都跟着新高度排好——你全程只动了一个数字。SolidCraft 是这样一个用纯 Rust 写的开源参数化 3D CAD,桌面、浏览器、CLI 与 MCP 自动化共享同一套命令和内核。本文直接翻开它的源码,回答一个问题:"改一个尺寸,模型为什么能瞬间正确重建"。

项目速览:Rust 写出的开源参数化 CAD

SolidCraft 的技术栈很"硬":几何内核、约束求解器、渲染管线全部用 Rust 实现,桌面端(egui)、Web 端(WASM)、headless CLI 和 MCP 服务器跑的是同一批命令。README 里那句卖点最直白:

"Change a dimension and watch your model rebuild."

下面这张官方演示动图,展示了从空设计开始建模一个树莓派 4 机箱的完整参数化流程,文末会用它串讲各机制如何协同:

草图怎么"锁住":约束求解与自由度

你随手画一条线、一个圆,它们是可以任意拖动的。要让草图表达设计意图,必须先把元素之间的关系写下来——这就是约束。

SolidCraft 把所有约束收敛到一个枚举里,ConstraintKind,位于 crates/sketch/src/model.rs:

  • 几何关系:Coincident、PointOnCurve、Horizontal、Parallel、Tangent、Equal、Concentric、Symmetric、Fix等;
  • 驱动尺寸:Distance、Length、Radius、Angle等。

约束不是标签,必须被"求解"成坐标。求解器是项目自研的,crates/sketch/src/solver.rs 的模块注释写明了策略:

Unknowns are the coordinates of every non-fixed point and the radius of every circle. Each constraint contributes residuals… solved with a damped Gauss–Newton (Levenberg–Marquardt) iteration on a dense Jacobian.

翻译成三层:未知量是每个未固定点的 x/y 坐标加每个圆的半径;每条约束贡献一个"以毫米计"的残差,目标是把所有残差压到零;系统先拆成连通分量,再逐块做阻尼 Gauss–Newton 迭代。解完之后 Jacobian 的秩直接给出剩余自由度:欠约束的几何是蓝色、还能拖;dof == 0时变深色,位置被钉死;再加一条已满足的约束,求解器直接拒绝而不是硬塞进去。另外,能精确求出的量(如两条已知几何的交点)会先走解析消元,不进矩阵迭代——这是它"又能稳又能快"的取舍。

对你来说,这意味着:草图怎么拖都不会"散架",过约束会被当场拦下,自由度数字实时告诉你还差几条约束。

把每个数字变成参数:dN 与单位感知表达式

约束管住了形状关系,可几何本身的大小呢?在 SolidCraft 里,尺寸不是测量结果,而是驱动几何的参数——这一点贯彻得很彻底。

crates/doc/src/params.rs 的注释一句话点破:

Every parameter can be referenced by name from any expression; the dependency graph and cycles come from the expression references.

也就是说:草图里标注的长度、拉伸距离、圆角半径,底层都登记为d1、d2这样的模型参数;你自己建的用户参数还可以带单位、表达式和注释。而依赖图不需要手动维护——它完全由表达式引用自动推导。

这套参数系统的规矩很严格(见 docs/book/src/guide/parameters.md):

  1. 表达式单位感知:2 * width + 5 mm、1 in + 3 mm都能算;长度传到角度位置直接报错,绝不悄悄换算;
  2. 循环依赖会被报告出路径(a → b → a),而不是死循环;
  3. 重命名参数时,所有引用它的表达式、尺寸、特征输入自动跟着更新;正在被使用的参数禁止删除。

好处只有一句话:一处修改,处处联动,且全程可预测。把高度写成参数height,拉伸距离写height / 2,之后你只改一个值。

时间线为什么重建得快:增量评估与持久化命名

参数解决了"一个特征内部的联动",真正让零件"活"起来的,是把所有特征挂在一条时间线上的机制。

crates/doc/src/lib.rs 顶部把文档模型定义得很清楚:

Evaluation is incremental: a feature is recomputed only when it, a parameter it uses, or an earlier feature changed.

对应的评估函数在 crates/doc/src/eval.rs:

Re-evaluate the document, reusing results up to the first changed feature.

即:只复用第一个变化特征之前的结果。50 步历史的模型,改第 3 步的输入时,后面没受影响的步骤不会重算。配合两个工程细节:

  1. 每个特征都能被编辑、抑制、重命名、重排、回滚、删除——历史本身是一等公民;
  2. 持久化命名(persistent naming)让特征按名字引用面和边:上游编辑把几何挪了位置,下游特征仍能找到正确的那一面;找不到时特征给出警告,而不是静默选错。

让时间线可脚本化:inspect 与 edit 两条命令

时间线不只是 UI 里的列表,它对外暴露了完整的命令接口。在 docs/book/src/guide/features.md 里可以看到这对命令:

  • timeline.inspect:读回特征的字段与当前值,inputs把每个输入和参数一一对应(d1→ 距离 10 mm);
  • timeline.edit:把修改合并进特征定义,驱动一次完整重建。

同一套命令在桌面、浏览器、headless CLI 和 MCP 服务器里通用——参数化设计因此天然可脚本化,这也是它敢把建模能力直接开放给 AI 代理的原因。

实战串讲:改一个高度,整条特征链重建

把上面的机制放进官方演示(就是开头那张动图),操作顺序与机制一一对应:

  1. 画草图:底座、立柱、通风槽的轮廓先出来,用相切、对称、重合等约束把形状"钉"住——此时草图欠约束,几何是蓝色;
  2. 上参数:按主板 58 × 49 mm 的安装孔矩形定立柱间距,标注槽宽、槽深;每个数值都落成参数面板里的dN;
  3. 铺特征:extrude 底座 → fillet 圆角 → shell 抽壳 → 按孔位 pattern 出 M2.5 立柱 → 挖端口与通风槽。每加一步,时间线增长一个节点,只重算新增部分;
  4. 改参数:把高度参数从 24 mm 改成 32 mm——所有引用它的拉伸、立柱、槽位依次重建,下游特征按持久化名字重新找到自己的面,全程无手工操作。
操作机制你看到的结果
画线、加约束约束求解 + 自由度分析蓝色可拖 → 深色锁死
标注尺寸dN模型参数 + 表达式依赖图一处改动,处处联动
加特征时间线增量评估只重算受影响部分
改一个数字参数 → 增量重建 → 持久化命名全模型自动重建

收束

回到开头那个"改一个数字":它背后是约束求解、参数依赖图、增量重建三级机制的接力。正因如此,SolidCraft 的模型不只是"能被软件读的几何",而是"能被程序执行的设计"——solidcraft-cli mcp起一个 MCP 服务器,AI 代理就能直接发命令建模、测量、改参数。参数化模型的可描述、可重放,是它在自动化与 AI 驱动时代依然成立的底层原因。

【免费下载链接】solidcraftSolidCraft: an open-source parametric 3D CAD application built in pure Rust. Desktop, web, and automation through MCP.项目地址: https://gitcode.com/gh_mirrors/so/solidcraft

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询