max-model: 创意 -> 已验证、可打印的零件
需求:用户输入 /max-model 后的任何内容(或他们描述的东西)。
FORGE = 本技能的目录(例如 ~/.claude/skills/max-model);以下每个路径都是相对路径。一个 CLI:$FORGE/bin/forge <cmd>(列表见底部)。
环境(见 README):CAD 虚拟环境 $FORGE/.venv-cad(包含 build123d、trimesh、manifold3d、usd-core、opencv、sdf;可覆盖 FORGE_CAD_PY),可选的 AI 虚拟环境 $FORGE/.venv-ai(包含 torch、diffusers、CLIP;可覆盖 FORGE_AI_PY)用于 text3d 和 looks。
打印机:knowledge/printer.json(热床、喷嘴、层厚;示例见 knowledge/printers/)。切片由用户选择的切片器完成:forge 最终提供验证过的 STL 和打印前评估报告(是否支持)。一个可选的 slicer_cmd 钩子能让 forge 报告打印时间和耗材克数。
2026-10-17 基准测试结果 (knowledge/benchmark-2026-10-17.md): 完全规格化的零件与真实 STEP 文件对比,体素 IoU 达到 0.96;但对于细节需要猜测的部分,IoU 在 0.41-0.82 之间;一体打印的运动机制在首次构建时通过了运动扫描,且没有融合间隙(作者尚未用实际打印验证);标志性/有机物体的“外观”是手工建模的薄弱环节(一个手工建模的头盔最终看起来像个蛋)。为此,以下流程用于弥补这个弱点:参考图传递 + 外观评分、本地文本转3D 生成有机模型、基于雕刻的柔性化、搜索并修改标志性道具。
不可违反的规则
- 数据优先,图片其次。 任何关于几何形状的断言都必须来自工具的明确输出(如 verify/selftest/preflight/grade JSON 文件)或你本次迭代中读取的渲染图。切勿凭记忆描述 STL 外观。
- 对于定制零件,先有规范,再建模:首先创建
spec.md和spec.json,其中包含量化的成功标准。 - 每次迭代只做一项修改,保留每个
iter_NN/目录,每个阶段最多 6 次迭代,然后重新规划。 - 所有运动部件必须附带通过的自我测试(扫描范围无碰撞 + 防卡死控制 + 测量间隙)。没有例外;这是本技能在机械结构方面强大的原因。
- 每个打印件在切片前都必须执行
forge preflight,并根据其评估结果决定是否使用支撑。 NO-GO = 先修复几何体/朝向。对于一体打印/多体零件,还需使用forge export <stl>并将 3MF 文件交给用户,而非 STL:否则切片器的自动支撑会填充间隙并焊接零件(CYCLO-11 的第一次打印因此失败),且 STL 无法携带“支撑关闭”的信息。 - 环境: Blender、OpenSCAD 和 GPU torch(text3d、looks)在某些隐藏了 GPU 的 Agent 沙箱中可能会崩溃(Blender 退出码 139)。如果某步骤出现段错误,请在沙箱外运行。纯 Python 代码(build123d、manifold3d、trimesh)可在任何环境中运行。
- 简要报告里程碑(所选路线、首次渲染、准备打印的状态及其时间/耗材/评估结果、阻塞项):每项一行,说明用户需要决策的内容。在通道支持发送文件时,附上关键图片(sheet.png、poster.png)和 AR 文件。
- 未经用户明确许可,切勿开始打印或花费金钱。下载的模型:请尊重其许可证(CC BY-NC = 不可销售)。
会话启动(30 秒)
ls $FORGE/knowledge/; cat $FORGE/knowledge/{fit-log.md,lessons.md,printer.json}; $FORGE/bin/forge fit show
$FORGE/bin/forge doctor # 红色警告 -> 建模前修复或报告问题
如果 forge fit show 显示 pip_gap 仍为 [R](研究默认值,未针对本打印机测量):简要提及一次,Fit Card(forge mech build fitcard,约需 1 小时,~16 g)可校准每个运动部件的间隙,并提供打印建议。
阶段 0 — 路线(选择流程,而非工具)
使用第一个匹配的规则。用一行向用户说明选择的路线。
| 用户需求 | 路线 | 工具 |
|---|---|---|
| 修改一个下载的模型:添加文字/名字、钥匙链环、磁铁、加厚壁、按头围缩放、使底部平坦、镜像 | REMIX(先下载,再升级) | `forge remix text |
| 根据用户提供的尺寸制作一个实用物品:盒子(滑盖/按压盖)、名字钥匙链、标牌、手机支架、某个物体的夹持器、浮雕灯箱 | MAKE(生成器;间隙从 fit.json 读取;盒子会进行运动检查) | `forge make box |
| 一次打印多个/一个完整项目(销售用) | PLATE(优化热床布局,显示单个成本) | `forge plate <stl...> --fill |
| 一个著名的现有物品(电影头盔、道具、流行玩具、流行设备的外壳) | FIND(自行搜索模型网站如 Printables/Thingiverse),然后 REMIX(缩放、分割、磁铁、适配) | 网页搜索,forge split,forge preflight --orient |
| 一个原创的可穿戴头盔(“没人做过的头盔”) | TEXT3D --helmet:颈部切割,按指定头围缩放(默认 160x190 + 填充),3 mm 外壳,面罩 + 4 个磁铁安装座,接缝向下的切片 | forge text3d "<风格> helmet" --helmet |
| 一些能动的东西(指尖陀螺、铰链、齿轮、陀螺仪、蝴蝶刀、穿绳器、按动器) | MECHKIT(如果某个模块适用),否则使用 Mech API 建模 | forge mech list/build,lib/mechkit/core.py |
| 一只 软体 动物 | 设计一个 SDF 身体(lib/sculpt.py)或获取一个雕刻(模型站/text3d) -> FLEXIFY | forge flexify,forge sculpt |
| 一个模型 / 吉祥物 / 生物 / 雕像 | TEXT3D(本地,免费,约 3.5 分钟)或搜索;同时提供两种选择 | forge text3d "<想法>" [--base NAME] |
| 一个定制的功能性零件(用于用户物品的支架、夹持器、适配器、外壳) | MODEL(以下阶段 1-6) | build123d 途径,forge run,forge parts-find |
| 整理抽屉 / 为某个物体制作插件 | GRIDFINITY(+ PHOTOFIT 用于精确槽位) | forge gridfinity,forge photofit |
| 模型超出热床尺寸 | SPLIT(带定位销和接缝标记) | forge split |
| “这个能打印吗 / 为什么失败了” | PREFLIGHT(+ 热力图) | forge preflight,forge heat |
| 展示 / 销售模型 | SHOWCASE + AR | forge showcase,forge ar |
关于路线选择的坦诚质量说明(作者于 2026-10-17 测量):text3d 人物识别度良好(蝾螈、龙、幽灵吉祥物、鲨鱼),但 60 mm 尺寸时细节较模糊,且需要支撑;通过浮雕从文本生成软体模型显得笨拙(细腿会融合)-> 软体模型优先选择 SDF 设计的身体或人工雕刻;手工建模的有机形状看起来仍然像团块 -> 切勿手工建模头盔/角色,请使用 FIND+REMIX 或 TEXT3D。
阶段 1 — 需求简报(定制零件):带数字的规格说明
- 用户已告知的关于目标物体的所有信息(设备型号、测量值、照片)。 1b. 对于任何有名字的物品,进行参考图分析:搜索 6-9 张参考图片/真实物品的高评分设计,查看它们;在 spec.md 中添加“## 形态”部分(比例、2-3 个标志性特征、变体版本)。跳过此步骤曾导致台钳蝴蝶刀变成扁平的棍子,螺旋指尖陀螺变成错误的玩具。
- 尺寸:查阅资料,切勿回忆(基准测试:回忆的滑轮 IoU 仅为 0.41)。使用
forge parts-find "<零件>" [--download]+forge step2stl;通过网络获取数据手册;通过网络搜索参考图片。在 spec.md 中注明来源。对于用户拥有且无法查阅资料的物品:PHOTOFIT(forge photofit mat-> 以 100% 比例打印校准垫 -> 拍照 -> 提取轮廓,精度约 0.3 mm)比询问卡尺数字效果更好。 - 只询问用户无法找到的信息:一条消息,最多 4 个问题,每个问题提供一个默认值。
- 创建
out/<name>/spec.md+spec.json(模板在 templates/)。对配合界面的估计值需标记为estimate。 - 发布“规格就绪:<一行描述> -- 确认开始构建?”。如果风险低且指定了默认值,用户沉默则继续。
阶段 2 — 路径 + 计划
| 路径 | 用途 |
|---|---|
| b123d(默认) | 功能性/有尺寸要求/配合关键的零件、外壳、MechKit 模块 |
| scad | 简单零件或一个 BOSL2 基元(如螺纹) |
sdf(lib/sculpt.py) | 自行设计的有机体:平滑合并、平坦底座、始终水密(壁虎配方) |
mesh(lib/meshkit.py、manifold3d) | 编辑下载的模型/AI 生成的网格、大型布尔运算、柔性化、分割(OCC 在 10 万三角面的雕刻模型上会卡顿) |
| bpy | 渲染、体素重网格、文字密集型艺术 |
在零件文件顶部以注释形式制定计划:功能作为函数列出,参数块使用毫米单位,间隙从 fit.get("pip_gap"/"slide_gap"/...) 获取(切勿硬编码 0.3),原点位于 Z=0 底部的中心位置,打印方向已内置优化(最大平面朝下、悬垂 <= 45°、桥接 < 18 mm、壁厚 >= 2.0 mm),构建顺序,断言列表。
阶段 3 — 小步骤构建
每次迭代:一个修改 -> forge run part.py --lane <lane> --spec spec.json --name <name> -> 读取 verify.json/REPORT.md(检查体积/包围盒的变化是否与预期一致?无变化 = 布尔运算被忽略)-> 读取 sheet.png 一次 -> 进行评估 -> 下一个修改。
- 运动部件 = Mech API (
lib/mechkit/core.py):Mech(name, parts, fixed, [Motion(name, drive, [Move...], control=[...])])->selftest()扫描所有姿态,沿其整个路径运行防卡死控制,并精确测量间隙。通过构造避免碰撞优于事后检查:以枢轴为中心的圆弧/球面可保持间隙恒定(陀螺仪、软体关节);将每个运动部件的扫掠体积保持在平面的一侧(蝴蝶刀枢轴)。齿轮:lib/gears.py。测量而非声明:forge mech ratio <name> [--motion M --driven PART --driver PART]摆好机构姿势,释放输出端并二分查找无接触区间 -> 测量传动比 + 背隙(ratio.json,若与声明传动比不符则退出码为 3)。摆线针轮减速器:forge mech build cyclo11(lib/cycloid.py精确齿形 + 根切检查)。工作室渲染:forge showcase <dir> --style studio --still hero|cutaway|exploded、--ghost、--annotate。 - 在循环中进行打印前检查:对于任何有悬垂的结构,执行
forge preflight out/<name>/<name>.stl。 - 命名物体:外观评分:在机械结构验证通过后,运行
forge looks out/<name>/<name>.stl --target "<物品>"(基于清晰渲染图的 CLIP 评分;已验证:它能正确区分 human > v2 > v1 版本的蝴蝶刀)。评分 < 30% = 需要迭代设计“形态”(比例、标志性特征),而非机械结构。用它来比较 v1 和 v2,而不是凭猜测。 - 硬性规则:切勿仅凭单个视图判断;重叠切割 0.05 mm(共面会产生零厚度薄皮,导致“焊接”定位针:测得的间隙为 0.0 而非 0.3 mm);同一故障发生两次 -> 打印子零件编号并重新诊断;最多 6 次迭代,然后重新规划或切换到 FIND 路线。
当 verify 通过所有规格键、selftest 通过(运动件)、preflight 为 GO 或 GO+SUPPORTS、视觉检查清单全部通过时,构建完成。
阶段 4 — 配合校准
- 首先校准: 一体打印间隙来自
fit.json。在 pip_gap 被标记为 [V](已验证)之前,每个一体打印设计都带有 preflight 的“注意”项。Fit Card 在一次打印中测量 pip_gap(旋转体 0.15-0.40 mm)和 pip_vgap(铰链 0.25-0.45 mm):完成后,询问“用力拧紧后能自由旋转的最小数字是多少?” ->forge fit set pip_gap <n> --from "fitcard <日期>"(以及 pip_vgap)。所有 MechKit/flexify/gridfinity 构建都会自动读取这些值。 - 配合零件 / 围绕用户物品的零件:装配姿态检查
bin/verify --assembly a.stl b.stl --clearance <fit> --move-b=x,y,z;使用 photofit 或 parts-find 创建代表用户物品的虚拟模型。 - 仅在 Fit Card 未覆盖的接口类型(螺纹、卡扣、压配)或估计尺寸时使用试模块:最长 10 分钟,3 个变体,带凸起的标签。
阶段 5 — 打印准备 + 移交
forge preflight <stl> [--slice]-> 评估结果 + 支撑策略建议。有机/倾斜零件:forge preflight <stl> --orient(尝试不同倾斜角度;一个头盔曾需要约 20 度角)。forge heat <stl>生成红/黄色的支撑热力图以供用户参考。- 支撑与否由 preflight 决定:GO -> 关闭支撑;GO+SUPPORTS -> 开启/自动支撑;NO-GO -> 先修复(刀锋接触、融合间隙、不适合 ->
forge split)。"SUPPORTS: OFF (required)" = 自动支撑陷阱(一个平坦的底面,与水平面夹角小于 30 度,并且位于另一个不同物体的上方 2 mm 范围内;support_angle/support_trap_gap在打印机配置文件中):必须保持支撑关闭,否则会焊接间隙。 2b. 在将一体打印/多体文件交给用户之前,始终执行:forge preflight <stl>然后forge export <stl>(自动遵循评估结果;文件名以_SUPPORTS-OFF.3mf/_SUPPORTS-ON.3mf结尾)。将 3MF 文件交给用户并说明:打开此文件,确认“支撑”复选框状态与文件名一致,不要更改其他任何设置。如果 preflight 报告 NO-GO 是因为模型需要支撑,但添加支撑又会焊接间隙,则在导出前修复几何体(将平坦底面倒角至 45 度,重新定向)。 - 在您选择的切片器中,使用步骤 2 的支撑策略和您的常用配置,切片导出的 3MF(对于简单的单主体零件则是 STL);forge 仅通过 3MF 文件设置支撑复选框。(可选:设置
knowledge/printer.json中的slicer_cmd,以便preflight --slice/plate --slice报告时间和耗材克数。) - 向用户展示:sheet 或 showcase 海报 + 时间/耗材(如果配置了钩子)+ 评估结果 + 一行制作说明。当尺寸/适配成为问题时,提供
forge ar <stl>(USDZ:在 iPhone/Vision Pro 上以真实尺寸预览;GLB 用于 Quest)。 - 未经用户许可,切勿开始打印:“热床清空了吗?开始打印 <名称>,预计 <时间>,<耗材克数> 克。”
- 报告“<名称> 可打印就绪:<时间>,<耗材克数> 克,<评估结果>。”准备销售?
forge showcase <dir>会生成 mp4/gif + listing.md(成本、建议价格、许可证提醒)。
阶段 6 — 反馈 + 学习
- 打印后一行反馈:“哪里不合适?(适配 / 外观 / 强度 / 打印质量 / 没有)”。读取用户可能提供的任何照片。
- 间隙 ->
forge fit set ...(并在 fit-log.md 中添加一行)。其他数值 -> 写入 fit-log.md / print-tolerances.md,标记为 [V]。 - 在
knowledge/lessons.md中添加 1-3 行(日期 · 项目 · 教训 · 阶段)。新技术 -> 创建knowledge/<主题>.md(最多 40 行,包含可运行的代码片段)。 - 保留
part.py和规格文件,使其可重新运行。提供一个相关的其他想法(商店脑),但不要开始执行。 - 任何技能/工具变更 -> 运行
tests/run_suite.sh(已知答案验证),对于能力声称,运行基准测试(forge grade、forge looks)——证明有所改进。
工具箱 (forge <cmd>)
以 th
…
[为翻译而截断]