免安装的浏览器 CAD 五分钟上手: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
SolidCraft 是一个纯 Rust 编写的开源参数化 3D CAD:桌面应用、浏览器 WASM 端和给 AI 代理用的 MCP 服务器共享同一套内核与同一套命令体系,不存在功能阉割。下文免安装跑一遍浏览器版,并拆解"改一个参数,整个模型重建"的机制。
先读懂分层:一个内核如何装进三种入口
动手之前先看 architecture.md 里的分层表:workspace 按层切分,crate 只能依赖更低的层,cargo xtask layers会强制校验。自底向上是geom(向量、平面、网格)→sketch/kernel/render(约束求解器、B-rep 内核边界、光栅化)→doc(参数、表达式、特征时间线及其增量求值)→io(设计文件与 STEP/3MF 等导入导出)→engine(会话与命令注册表,"用户能做的一切都是一条命令")→ui-egui/mcp(可替换的前端和 MCP 服务),最上面才是solidcraft与solidcraft-cli两个应用壳。
浏览器版的位置一句话:它不是重写版,而是桌面前端编译成 wasm 后换了个宿主。main.rs 的文件头注释写得直白——通过 eframe 的 web runner 运行与桌面版相同的solidcraft_ui_egui::SolveApp,WebGPU 可用则用 WebGPU,否则回退 WebGL2;本地构建命令是trunk build --release(building.md)。入口本身就一页 HTML:一个全屏<canvas>加一行加载提示,其余全在 wasm 里完成。首次访问后应用本身可离线运行,浏览器会留一份副本(getting-started)。
分层带来的直接后果:工具栏点击、JSON 脚本、solidcraft-cli、控制通道、MCP 工具,走的是同一份命令注册表,全量清单见 features.md。浏览器里每一次点击,本质上都是往这套 WASM CAD 内核里发一条命令。
实操一遍:把 thickness 从 8 mm 改成 12 mm,看时间线怎么重建
打开网页入口,URL 上带?sample,内置示例 Sample Plate 直接加载。它的构建脚本就在 sample.rs,共 24 条命令,主干是这样:
{"commands": [ {"command": "parameters.change", "params": {"name": "width", "expression": "80 mm"}}, {"command": "parameters.change", "params": {"name": "thickness", "expression": "8 mm"}}, {"command": "sketch.create", "params": {"plane": "XY", "name": "Base"}}, {"command": "sketch.rectangle.two_point", "params": {"p0": [0, 0], "p1": [80, 50]}}, {"command": "sketch.constraint.coincident", "params": {"a": "p1", "b": "origin"}}, {"command": "sketch.dimension", "params": {"entities": ["l1"], "value": "width"}}, {"command": "sketch.finish", "params": {}}, {"command": "solid.extrude", "params": {"distance": "thickness", "body_name": "Plate"}}, {"command": "solid.fillet", "params": {"edges": [[0,0,4],[80,0,4],[80,50,4],[0,50,4]], "radius": "6 mm"}} ]}省略的部分是两枚 Ø8 通孔、顶面 Ø24 凸台和 Ø12 底孔;它们的平面偏移量与拉伸距离全部引用thickness。注意sketch.dimension的 value 写的是width而不是80——尺寸值直接绑定用户参数,这就是参数化建模的最小闭环。
实操线四步:
- 加载内置示例:
?sample相当于把上面脚本一次性跑完,命名 "Sample Plate"。 - 改一个参数:打开 Change Parameters(即
parameters.change命令),把thickness的表达式改成12 mm回车。 - 观察增量重建:板厚、凸台平面、底孔平面全部跟随新值。规则写在 parameters.md——时间线从第一个引用该参数的特征起重建,而不是推倒全部;引擎在 eval.rs 里用
last_recomputed记录每次求值实际重算了几个特征。sample.rs 里的测试断言了这件事:改成 12 mm 后模型无一处报错,零件顶面精确落在 26 mm(板厚 12 + 凸台 14),底孔依然打穿。 - 手动追加一条特征再回滚:选中顶面执行
solid.fillet,时间线多一格;然后移动回滚标记timeline.rollback(features.md 里的 Move Timeline Marker),零件退回回滚点之前的状态,不必连按 Ctrl+Z。
仓库自带的演示动图记录了另一轮完整迭代:树莓派 4 外壳的参数化草图、圆角、抽壳、阵列支架,最后把高度从 24 mm 改成 32 mm,整个模型当场重建,6 倍速播放。
两个机制细节值得记住:表达式是单位感知的(README 的卖点清单原话 "unit-aware expressions"),2 * width + 5 mm这类写法合法;约束求解是自研的,草图里的尺寸由求解器驱动,参数改动的传播靠时间线而非全局刷新。
对一笔差异账:浏览器版到底舍掉了什么
"同一套代码"不等于零差异。差异的来源是浏览器沙箱,源码把每一项都交代得明白:
| 维度 | 桌面版 | 浏览器版 |
|---|---|---|
| 渲染管线 | wgpu 原生后端,MSAA 默认 4×,24 位深度 + 8 位模板(main.rs 的MSAA/STENCIL_BITS常量) | eframe web runner,32 位浮点深度,模板缓冲为 0,注释直言 "eframe's web painter has no stencil buffer"(main.rs) |
| 文件存储 | 系统对话框直接读写磁盘 | 虚拟/opfs/路径后接 OPFS(浏览器按源隔离的私有存储);未保存工作每 30 秒自动备份,离开页面时弹beforeunload确认;页面非 HTTPS/localhost 时降级 localStorage,容量"几 MB 顶天"(files.rs) |
| 空间鼠标 | HID 直读六轴,Windows/macOS/Linux 三套驱动(space_mouse.rs) | 走浏览器 Gamepad API,Chrome/Edge 可用,Firefox 不枚举设备(getting-started) |
| 外部自动化 | --control PORT控制端口,solidcraft-cli mcp --connect桥接驱动态 app(mcp.md) | 无控制端口,改由页内window.solidcraft.execute(...)驱动,命令 id 与撤销历史和桌面控制通道一致(browser-api.md) |
| 崩溃恢复 | 恢复文件写本地用户数据目录(recovery.rs) | 恢复文件存 OPFS,重开页面弹 "Recover unsaved work?" 询问 |
| CJK 字体 | 本地内置 | 界面切到中日韩语言才按需拉取字体文件,拉取失败本次会话回退英文,避免拖慢首屏(main.rs 的tick_font) |
收窄的原因其实只有一条:浏览器只通过沙箱化 API 暴露 GPU、文件与设备,读不到的要么降级要么去掉。但有一个反向收益:设计数据默认不出浏览器——保存的零件只存在于这个浏览器源头的 OPFS 里,换浏览器、换设备就互相不可见。对在意数据落点的场景,这种隔离反而是加分项;代价是设计想带回家,必须点下载把文件取出来。
按场景选入口:哪些活给浏览器,哪些活装桌面版
- 快速验证想法、给学生做网页 3D 建模演示、单纯好奇内核怎么跑 → 浏览器版。免下载建模,要求只有 WebGPU 或 WebGL2,
?sample直接给一个带参数、带时间线的零件;约束、尺寸、表达式、增量重建这些参数化 CAD 的核心一环不少。 - 要本地文件管线、空间鼠标 HID、崩溃日志、
--control自动化 → 桌面版。README 的 Download 一节有各平台安装包,源码构建只需 stable Rust。 - 无头建模、批量出图 → CLI 与 MCP。
solidcraft-cli run examples/bracket.json --out bracket.step一条命令把 JSON 脚本变成 STEP;solidcraft-cli mcp不开窗口独立跑一个设计会话,AI 代理通过 MCP 工具直接建模、测量、导出(mcp.md)。"无界面建模"这条线在 CLI 侧比浏览器版更完整。
一个可执行的下一步:在浏览器里把零件改到位后,打开文件面板点 "Download open design" 把.sc文件存到电脑,随后用桌面版打开继续编辑,或丢给solidcraft-cli批处理。两个入口共享同一设计格式、同一套命令——在网页里画到一半的零件,随时可以带走。
【免费下载链接】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),仅供参考