SolidCraft 参数化 CAD 内幕:改 24mm 到 32mm 背后的三层链路
发布时间:2026/11/4 1:36:38 锦皓数字建站

SolidCraft 参数化 CAD 内幕改 24mm 到 32mm 背后的三层链路【免费下载链接】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 改成 32整机箱模型随即整体重建——这是 SolidCraft一个用纯 Rust 写成的参数化 CAD桌面端、浏览器与 MCP 自动化共用同一套代码。下文顺着源码拆解这次改动背后的三层链路约束求解、参数驱动、增量重建。全局图景一次改动经过的三层链路官方演示的收尾动作很固定在 Parameters 面板把机箱高度从 24 mm 改成 32 mm拉伸、立柱、通风槽全部跟着更新。这个动作不是重画一遍模型它按固定顺序穿过三层参数层被改的数字先经过表达式求值单位感知、可引用其他参数得到新的参数值几何层草图约束求解器以新的尺寸值为目标把整套约束解算一遍重新算出每个点的坐标重建层特征时间线做增量评估从第一个受影响的特征起逐一走过几何内核负责实体运算的底层引擎生成新几何。代码上每一层都有明确归属crates/doc/src/params.rs与expr.rs管参数和表达式crates/sketch/src/solver.rs管约束求解crates/doc/src/eval.rs管时间线评估。下面逐层看。参数层从数字到模型参数 dN在 SolidCraft 里一个尺寸值或特征输入拉伸距离、圆角半径并不是以纯数字形式存进文件的。crates/doc/src/params.rs 的模块注释说清了这一点Parameters: user parameters, model parameters of sketch dimensions, and feature inputs (extrude distance, fillet radius…) which also appear as model parametersdNwithout being stored twice: the feature keeps its expression and the parameter name refers to it.解读特征保留的是表达式参数值只存一份特征按名字引用它。特征不存数字存表达式参数才是数值的唯一真源。所有草图尺寸和特征输入都会按遍历顺序拿到d1、d2这样的模型参数名任意表达式都能按名字引用任意参数。用户参数与模型参数的差别只在命名这一步模型参数自动分配用户参数是你自己起的名字。在输入框里敲height 12就会创建或重命名一个参数此后的表达式都引用它docs/book/src/guide/parameters.md。表达式系统有三条纪律都写进了文档与注释单位感知。crates/doc/src/expr.rs 给出的例子是2 * width 5 mm、angle / 2指南明确长度填到角度位置或反过来is an error, not a silent conversion——直接报错不悄悄换算。循环依赖报路径。Cycles are reported with their path (a → b → a)——报圈不只是一个存在循环而是把路径列出来。重命名是全局操作。renaming a parameter updates every expression, dimension and feature input that uses it, and a parameter in use cant be deleted——重命名自动更新所有引用使用中的参数禁止删除。依赖图本身不用维护它由表达式引用自动推出params.rs 注释the dependency graph and cycles come from the expression references。给拉伸距离写height / 2时联动关系就已经落在文件里了。几何层约束求解器如何把关系算成坐标参数层只产出数字数字要变成坐标靠草图约束求解器。约束全集在 crates/sketch/src/model.rs 的ConstraintKind枚举里分两类几何关系Coincident、PointOnCurve、Horizontal/Vertical、Parallel、Perpendicular、Tangent、Equal、Concentric、Midpoint、Symmetric、Fix和驱动尺寸Distance、Length、Radius、Angle等。值得注意尺寸本身就是一种约束——它比几何关系多带一个value字段。无值的是关系有值的才是驱动。求解策略在 crates/sketch/src/solver.rs 的模块注释里Unknowns are the coordinates of every non-fixed point and the radius of every circle. Each constraint contributes residuals (zero when satisfied, in millimetres so that all rows have a comparable scale). The system is split into connected components and each is solved with a damped Gauss–Newton (Levenberg–Marquardt) iteration on a dense Jacobian built from local central differences.拆成三步读未知量是每个未固定点的 x/y 坐标、每个圆的半径每条约束贡献一个以毫米计的残差即当前还不满足多少系统按连通分量拆分互不触及的约束互不相干分开解每个分量内做阻尼 Gauss–Newton 迭代——Gauss–Newton 是逐步线性化解非线性方程组的经典方法阻尼指控制步长防止发散Levenberg–Marquardt 就是它的标准实现Jacobian残差对每个未知量的偏导矩阵用中心差分数值构造。自由度分析是同一个 Jacobian 的直接副产品Afterwards the rank of the Jacobian gives the remaining degrees of freedom and which points are fully determined.即Jacobian 的秩直接给出剩余自由度——几何还能自由移动的方向数。SolveReport里对应dof0 即完全约束、未满足约束failing、以及逐点/逐曲线的point_determined/curve_determined。UI 表现见 docs/book/src/guide/sketching.mdUnder-constrained geometry is blue and fully constrained geometry turns dark… A constraint or dimension that would over-constrain the sketch is refused rather than applied.欠约束的几何显示为蓝色、仍可拖动dof 归零后变深色会造成过约束的新约束会被拒绝而不是强行套用。还有一处工程取舍并非所有未知量都进迭代器。求解器注释写道那些能从常数一步步逐个钉出来的未知量——比如两条已知轨迹loci已确定的几何元素集合的交点——are eliminated exactly, without the dense matricescrates/sketch/src/decompose.rs的注释引用 Owen 1991 与 Fudos–Hoffmann 1997 的构造分解把这类点先精确消去剩下的才交给 LM 迭代。能算出精确解的就不走稠密矩阵这是求解器既快又稳的来源。重建层特征时间线的增量评估草图只是第一步。拉伸、旋转、扫掠、圆角、抽壳、阵列、镜像等全部特征挂在一条时间线上。crates/doc/src/lib.rs 顶部一句话定了评估规则Evaluation is incremental: a feature is recomputed only when it, a parameter it uses, or an earlier feature changed.eval.rs 的主评估函数注释更直白Re-evaluate the document, reusing results up to the first changed feature——找到第一个变化的特征它之前的结果原样复用从它开始往后重走。50 步的历史里改第 3 步的尺寸前 2 步不参与重算。重走要可靠靠一套持久化命名兜底。docs/book/src/dev/naming.md 先讲原因如果圆角存的是边的下标上游一改、面多了一个圆角就会挪到别的边上。SolidCraft stores names, and finds them again every time the timeline evaluates.——名字不是几何猜测内核对每次运算报告每个面/边的来历名字沿历史传递crates/doc/src/lineage.rs合成crates/doc/src/name_lookup.rs查找引用确实找不到了特征会明说而不是默默选错对象。时间线本身也完全可交互每个特征可编辑、抑制、重命名、重排docs/book/src/guide/features.mdEach one can be edited, suppressed, renamed, reordered底部还有逐步回滚的历史回放条。下面示例设计的浏览器面板列出了 Sketches 与 Features 层级底栏即时间线源码速查哪个文件对应哪一节文件职责对应章节crates/doc/src/params.rsdN 模型参数、用户参数、依赖与循环检测参数层crates/doc/src/expr.rs单位感知表达式求值参数层crates/sketch/src/model.rsConstraintKind几何关系与驱动尺寸几何层crates/sketch/src/solver.rsLM 迭代求解器、Jacobian 秩与 dof 报告几何层crates/sketch/src/decompose.rsOwen/Fudos–Hoffmann 解析分解与精确消元几何层crates/doc/src/lib.rs文档模型与增量评估规则重建层crates/doc/src/eval.rs时间线评估、结果复用重建层crates/doc/src/name_lookup.rs持久命名查找与降级重建层动手验证两条 JSON 命令检查并驱动一个特征时间线还有一整套命令接口最小复现路径是timeline.inspect与timeline.edit见 docs/book/src/guide/features.md。前者查一个特征的定义与输入参数后者写入新值{command: timeline.inspect, params: {feature: Slab}} → {type: extrude, definition: {extent: {distance: 10, direction: positive}, …}, inputs: [{label: Distance, param: d1, expression: 10, unit: mm}]} {command: timeline.edit, params: {feature: Slab, set: {extent: {distance: 12}}}}inputs字段是两层机制的交汇点它把特征输入映射到参数名和当前表达式d1→10。timeline.edit合并新字段后触发重建响应里报告哪些特征被recomputed、哪些被restored复用。演示 GIF 结尾的高度 24 → 32 mm走的正是同一条通路。收尾参数化模型为什么天然可脚本化回头看这套机制改 24 为 32、全模型重建之所以能被脚本驱动是因为模型不是一份几何结果而是一段可重放的描述——参数表、约束系统、特征序列全部可序列化。同一套命令既可供 UI 使用也可以经 JSON 控制通道docs/book/src/dev/control-protocol.md和 MCP 服务器crates/mcp/暴露给 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),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。