免费

爆炸图海报

按审定的零件清单,用脚本画出专利图风格的爆炸视图海报,带引线标注、零件表和留给核实规格的空白栏

安装

把“爆炸图海报”技能安装到 ~/.claude/skills/exploded-plate。
下载下面每个文件,保存到这个文件夹:
https://skilllift.pages.dev/packs/exploded-plate/SKILL.zh.md → SKILL.md
https://skilllift.pages.dev/packs/exploded-plate/references/style.md → references/style.md
https://skilllift.pages.dev/packs/exploded-plate/assets/engine.mjs → assets/engine.mjs
https://skilllift.pages.dev/packs/exploded-plate/assets/spec.template.json → assets/spec.template.json
https://skilllift.pages.dev/packs/exploded-plate/scripts/render.mjs → scripts/render.mjs
https://skilllift.pages.dev/packs/exploded-plate/scripts/check.mjs → scripts/check.mjs
https://skilllift.pages.dev/packs/exploded-plate/scripts/parts-from-text.mjs → scripts/parts-from-text.mjs
https://skilllift.pages.dev/packs/exploded-plate/scripts/record.mjs → scripts/record.mjs
然后读一遍 SKILL.md,告诉我它是做什么的,并提醒我开一个新会话。

解压到 ~/.claude/skills

同一个技能,不同的需求

左边是预览。右边由另一个 Agent 按不同需求制作,它只有安装好的技能,没看过预览。

预览
预览
新需求,由另一个 Agent 制作
新需求,由另一个 Agent 制作

这是按虚构需求做的一次测试。系统字体不同时,字形可能略有差异。

按审定的零件清单,用脚本画出产品或物品的爆炸视图海报,全程不用图像模型。零件沿同一根斜向轴线分开,采用真等轴测投影并铺满画面,旁边附一张小的装配图,配引线、零件编号、零件表、整体尺寸和留给未核实规格的具名空白栏,风格是维多利亚时代专利图与双色印刷技术挂图的结合。输出 2400x3200 的 PNG、同一幅图的 1600x1600 和 2400x1350 版本,以及可编辑的 SVG。当有人要爆炸图、零件图、拆解海报或“结构示意图”时使用。拒绝第三方标志和容易被认出的商业外观。

交付前必须通过

  • 在 check.mjs 的安装位置运行它,对最终输出(不是草稿)以 0 退出
  • --approved 和 --facts 用的是用户自己的清单
  • 我自己判断过这个物品是否涉及真实品牌或可辨认的商业外观;脚本通过不代表没问题
  • 尺寸和具名空白栏在三个尺寸上都有,装配图看起来像这个物品
  • 海报、方图、宽图都看过全尺寸和 25% 大小
  • 每个零件都像它本身,否则就是中性方块
  • 没有核实数字的栏位保持空白,印出来的规格都有来源
  • 虚构物品在每个尺寸上都有标注
  • 没有第三方名称、标志或商业外观
  • 已把推断项和假设列给用户
阅读完整 SKILL.md
---
name: exploded-plate
description: 按审定的零件清单,用脚本画出产品或物品的爆炸视图海报,全程不用图像模型。零件沿同一根斜向轴线分开,采用真等轴测投影并铺满画面,旁边附一张小的装配图,配引线、零件编号、零件表、整体尺寸和留给未核实规格的具名空白栏,风格是维多利亚时代专利图与双色印刷技术挂图的结合。输出 2400x3200 的 PNG、同一幅图的 1600x1600 和 2400x1350 版本,以及可编辑的 SVG。当有人要爆炸图、零件图、拆解海报或“结构示意图”时使用。拒绝第三方标志和容易被认出的商业外观。
version: 1.1.0
---

# 爆炸图海报

画面风格全部写在 `assets/engine.mjs` 里。你只用数据描述物品,不要改引擎。复制 `assets/spec.template.json`,填好,渲染,检查,再亲眼看结果。

具体的颜色、字体和版式见 `references/style.md`。

## 先判断要不要拒绝

本技能不画第三方标志、品牌名称,也不画一眼能认出是别家产品的外形。遇到这类要求,直接说明:“我不能画这个品牌的产品或商业外观。我可以画一个没有品牌的虚构物品,如果你拥有权利,也可以画你自己的产品。”

**这个判断必须由你自己来做,每次都要做。** `render.mjs` 和 `check.mjs` 都会拦下一份简短的哈希名单上的名称和商标符号,但这份名单只是最后一道防线。任何名单都不可能完整,也认不出有辨识度的外形。脚本通过,绝不等于品牌问题没有了。只要是你知道的真实品牌或一眼能认出的产品,不管在不在名单上,都要拒绝。如果名单拦下的词在这里明显是别的意思,比如苹果去核器里的水果,就把这个词写进 `notBrands`。

## 需要向用户要的信息

一次问完,放在同一条消息里。

1. 零件清单,从物品的一端排到另一端。每个零件要有名称、形状、比例和材质。
2. 标题。
3. 这个物品是虚构的、用户自己的,还是已获授权的。
4. 用户认可的数字和说法,要逐字照抄:尺寸、参数、容量等。
5. 哪些规格要留成具名空白栏,比如亮度或续航。
6. 可选:语言(`en` 或 `zh`)、纸色(`cream` 或 `blue`)、图页编号。

## 字段

所有上限都按一个汉字算两个拉丁字符。超限时引擎会拒绝并说明原因。

| 字段 | 含义 | 上限 | 信息不足时 |
|---|---|---|---|
| `title` | 图上的物品名称 | 22 个汉字或 44 个拉丁字符 | 用用户给的名称;没有就写 `爆炸视图` |
| `subtitle` | 标题下的一行字。只印在海报上,不能带数字,否则渲染脚本会拒绝 | 34 个汉字或 70 个拉丁字符 | 不写 |
| `approvedFacts` | 用户认可的所有数字和说法,逐字照抄。图上出现的数字或说法不在其中,`check.mjs` 就不通过 | 列表 | 留空。用户没给的事实绝不添加 |
| `dimensions` | 物品整体尺寸,`[{"label":"宽","value":"80 mm"}]`。三个尺寸都会印 | 名称 11 个汉字或 22 个拉丁字符,数值 8 个汉字或 16 个拉丁字符 | 用户没给就不写。每个数值都必须在 `approvedFacts` 里 |
| `rails` | 整机规格的具名空白栏,`[{"label":"亮度"}]`。三个尺寸都会印,并留一条空白线。只有数值在 `approvedFacts` 里时才加 `value` | 同上;与 `dimensions` 合计最多 8 项 | 用户提到却没给数字的规格,各留一栏。不要自己加别的 |
| `originality` | `fictional`、`own` 或 `licensed` | 三选一 | 虚构的填 `fictional`;其他情况要问。没人回答时按虚构物品画,并告诉用户 |
| `notice` | 标题旁的说明 | 30 个汉字或 60 个拉丁字符 | 不写。虚构图会在每个尺寸上印默认说明 |
| `sheet` | 图页编号 | 16 个字符(一个汉字算两个) | 不写,中文图会印 `第一页,共一页` |
| `approved` | 用户审定的清单,名称逐字一致 | 2 到 20 个零件 | 照审定的清单原样抄,小写和括号提示都保留。匹配时忽略大小写和末尾括号,印出来时首字母大写 |
| `parts[].label` | 零件名称,与 `approved` 相同 | 30 个汉字或 60 个拉丁字符 | 用用户的原话,不要润色。`提手(橡胶)` 这样的括号是提示,用来定材质或形状,不会印出来 |
| `parts[].short` | 标注用的短名称 | 18 个汉字或 36 个拉丁字符;名称更长时必填 | 只删字,不加字 |
| `parts[].material` | 用户说的材质 | 15 个汉字或 30 个拉丁字符 | 不写,表里印 `未说明`。画出来的质感不算声明 |
| `parts[].qty` | 数量。必须在名称或 `approvedFacts` 里出现 | 数字 | 用户给了才写。如果名称已经说了,比如 `四个橡胶脚垫`,就不写,用 `array` 画出四个 |
| `parts[].spec` | 只属于这个零件的一条已核实规格,必须在 `approvedFacts` 里 | 20 个汉字或 40 个拉丁字符 | 不写,留空白栏 |
| `parts[].specSource` | 规格的来源,不会印出来 | 填了 `spec` 就必填 | 没有来源,就没有规格 |
| `parts[].scale` | 放大零件在图上的尺寸,零件自身比例不变 | 0.25 到 4 | 不写。远小于中位尺寸的零件会自动放大,最多 2.5 倍 |
| `parts[].shapes` | 图元 | 至少一个 | 选一个与零件名称相符的图元,或用方块 |
| `parts[].internal` | 零件在装配后藏在里面时设为 `true`,它不会出现在装配图里,也不增加高度 | true 或 false | 明显在内部的零件才设,比如电池,并列为假设 |
| `parts[].assembled` | `{"at":[x,y,z]}`:零件在装配图里的位置,用于简单堆叠不对的情况,比如台灯灯臂 | 坐标 | 不写,零件按清单顺序堆叠 |
| `notBrands` | 名单拦下、但在这里明显是别的意思的词 | 列表 | 不写 |

## 图元

形状写在 `parts[].shapes` 里,从远到近、从下到上排列。零件自身的 z 轴就是爆炸轴,零件底部 z 为 0。单位自定,前后一致即可。

每个形状都可以带 `finish`(`metal` 拉丝金属、`glass` 玻璃、`plastic` 哑光塑料、`rubber` 橡胶、`ceramic` 陶瓷、`wood` 木材)、`at` `[x,y,z]`、用来倾斜的 `axis` `[x,y,z]`,以及绕轴重复的 `array` `{"n","radius","start"}`。哑光塑料还可以加 `"tint":"spot"`,`cylinder` 还可以加 `"ribs": n`。

| 类型 | 参数 |
|---|---|
| `cylinder` 圆柱 | `r`、`h`、`bevel` |
| `disc` 圆盘 | `r`、`h`、`bevel` |
| `cone` 圆锥 | `r`、`h`、`rTop` |
| `dome` 穹顶 | `r`、`h` |
| `tube` 管 | `r`、`h`、`wall`(顶部开口) |
| `shell` 壳 | `r`,或 `rBottom` 和 `rTop`,或 `profile` `[[r,z],...]`;`h`、`wall`、`smooth`(开口容器) |
| `lathe` 回转体 | `profile` `[[r,z],...]`,由下到上,`smooth` 让曲线顺滑穿过各点(任何车削外形) |
| `torus` 圆环 | `R` 环半径,`r` 管半径。用于密封圈。用来提的东西请用 `loop` |
| `loop` 提环 | `w`、`h`、`r` 管半径、`closed`、`feetFinish`:直立并朝向观看者的提环或把手,不会变成侧面朝前。默认开口,带两个金属套;`closed` 用于闭合把手 |
| `base` 底座 | `r`、`h`、`well` 凹座半径、`depth`、`pins`、`indicator`、`cable`、`cableLength`:带脚槽、肩部和凹座的底座。触点、指示灯和线缆默认没有,零件确实有才加 |
| `spring` 弹簧 | `r`、`wire`、`h`、`turns`。`wire` 约为 `r` 的十分之一,且小于 `h / turns / 3`。两端收口压平 |
| `screw` 螺钉 | `r`、`h`、`headR`、`headH`、`pitch`、`head`(`pan`、`flat`、`hex`)、`drive`(`cross`、`slot`) |
| `box` 方盒 | `w`、`d`、`h`、`bevel`、`taper` |
| `roundedBox` 圆角盒 | `w`、`d`、`h`、`corner`、`bevel`、`taper` |
| `plate` 板 | `w`、`d`、`h`、`corner`、`holes` `[{"x","y","r"}]` |
| `block` 示意方块 | `w`、`d`、`h`:带标注的中性方块 |

图元可以组合。比如盖子可以是一个 `disc`,加一个放在 `[0,0,h]` 的 `dome`,再加一个小 `cylinder` 当旋钮。可以参考 `example/brewer/spec.json` 和 `example/lamp/spec.json`。

**轴向。** 零件自身的 z 轴就是爆炸轴。观看方向是 `[1,1,1]`,所以 `axis` 为 `[1,1,1]` 的圆环正对观看者,`axis` 为 `[1,-1,0]` 的圆环则是侧面朝前,看上去是一条黑块。`check.mjs` 会拦下接近侧面朝前的圆环。

**细节和新增零件的界线。** 为了让零件更好认,可以加不带标注、也不构成任何说法的细节,比如安装孔或接缝。凡是有独立身份或功能的东西,比如单独的螺丝或开关,都算零件,需要用户认可。交付时列出你加的细节。

**质感和材质。** `material` 是用户说的材质,会印在表里。`finish` 只决定怎么画。材质没说时,选这个零件最可能的外观,不写 `material`,表里就印 `未说明`,并列出你的选择。

**玻璃上的环。** 把环或把手写在它所在的玻璃形状之前,这样才是透过玻璃看到它。

**如果零件确实无法用图元组成,就用一个 `block`,写上零件名称,并保持真实的整体比例。** 零件表会标明这是示意方块。不要画一个“差不多”的形状。图元能画的零件,也不要用方块省事。

## 步骤

1. 拿到审定的清单。如果是一段杂乱的文字,运行 `node scripts/parts-from-text.mjs parts.txt spec.json --title "..."`。所有猜测都会标上 `_guess`。逐条读过并改正,再删掉 `_read_me` 和所有 `_guess`;未经审阅的草稿,渲染脚本会拒绝。如果可以,请用户确认顺序和形状。
2. 把 `assets/spec.template.json` 复制成 `spec.json` 并删掉 `$slots`,或者直接用上一步的草稿。填好 `approved` 和 `parts`。
3. 先出草稿:`node scripts/render.mjs spec.json out --draft`,三个尺寸通常只要几秒。
4. 检查草稿:`node scripts/check.mjs out --draft`。按报告修改,改的是 spec。
5. 用看图工具打开 `out/poster.png`、`out/square.png` 和 `out/wide.png`。每个零件看起来像它本身吗?不像就换图元,或者改用方块。
6. 正式渲染:`node scripts/render.mjs spec.json out`,通常不到 30 秒。一次只渲染一张,不要同时跑多个。
7. 运行 `node scripts/check.mjs out --approved approved.txt --facts facts.txt`。`approved.txt` 是用户审定的零件名称,`facts.txt` 是用户认可的数字和说法,都是一行一个。目标是渲染脚本写入的文件夹,里面是全尺寸文件。必须以 0 退出。如果你另存了同名的缩小版,加 `--poster-png 全尺寸文件.png`;`poster-full.png` 会被自动找到。
8. 三个尺寸都要看全尺寸,再看 25% 大小。海报上的图也要放大细看。检查脚本判断不了零件像不像它本身,只能靠眼睛。遮住标注再看一遍。
9. 看看装配图。它像这个物品吗?不像就设置 `internal` 或 `assembled`。

可选动图:`node scripts/record.mjs spec.json hover.mp4 --poster poster.png`,约两分钟。

手动改过 SVG 后,运行 `node scripts/render.mjs spec.json out --raster-only`,然后重新检查。手动挪动标注会通不过检查,所以请改 spec。

## 交付物

- `poster.png` 2400x3200 和 `poster.svg`,可编辑:文字可改,图层有名称,每个零件自成一组
- 每张图都带图二:用同样的图元、按真实相对比例画的小装配图
- `square.png` 1600x1600 和 `square.svg`
- `wide.png` 2400x1350 和 `wide.svg`
- `spec.json`,源文件

方图和宽图不是硬裁切,因为硬裁切会把零件切成两半。它们用同样的零件和质感重新构图。海报和方图的轴线是斜的,宽图的轴线是水平的。`dimensions` 和 `rails` 三个尺寸都会印。`subtitle` 和零件表只印在海报上,所以数字不能只放在这两处。如果用户就要字面意义上的裁切,从 `poster.png` 上裁,并告诉用户会丢掉哪些零件。

## 缺信息时怎么办

- **信息太少。** 复述用户给的事实。不要编造零件、材质或数字。把你推断出来的每一项都列给用户,包括你选的形状和比例。
- **没人能回答。** 继续做,猜测的零件画得朴素一些,不写 `material` 和 `spec`,并在交付时列出你的假设。
- **有未经认可的数字。** 不要印在图上,给它留一个具名空白栏。不要为了过检查把它写进 `approvedFacts`。
- **没有比例。** 根据零件名称选一个普通的比例,列为假设。图上已注明不按比例。
- **零件数量不同。** 引擎支持 2 到 20 个零件。超过 20 个,就拆成几张图,用 `sheet` 编号。
- **真实链接。** 图上不放链接,需要的话写在消息里。
- **画面太挤。** 检查报告零件太小,就设置该零件的 `scale`;报告拥挤,就用 `short` 短名称。
- **语言混杂。** 每张图只用一种语言。第二种语言另写一份 spec。

## 交付前检查

- [ ] 在 `check.mjs` 的安装位置运行它,对最终输出(不是草稿)以 0 退出
- [ ] `--approved` 和 `--facts` 用的是用户自己的清单
- [ ] 我自己判断过这个物品是否涉及真实品牌或可辨认的商业外观;脚本通过不代表没问题
- [ ] 尺寸和具名空白栏在三个尺寸上都有,装配图看起来像这个物品
- [ ] 海报、方图、宽图都看过全尺寸和 25% 大小
- [ ] 每个零件都像它本身,否则就是中性方块
- [ ] 没有核实数字的栏位保持空白,印出来的规格都有来源
- [ ] 虚构物品在每个尺寸上都有标注
- [ ] 没有第三方名称、标志或商业外观
- [ ] 已把推断项和假设列给用户

## 不适用的情况

- 照片或渲染风格的产品图
- 带公差、剖面或尺寸的精确工程图:这是说明性图纸,并注明不按比例
- 图元无法描述的有机题材,比如动物或人体
- 任何关于别家公司产品的图

## 运行要求

- Node.js 22 或更高版本。`check.mjs` 和 `parts-from-text.mjs` 不需要其他依赖。
- `render.mjs` 和 `record.mjs` 需要 Playwright:`npm install playwright`,然后 `npx playwright install chromium`。如果装在别处,把 `NODE_PATH` 设为那个 `node_modules` 文件夹。
- 只有 `record.mjs` 需要 ffmpeg。如果它不在 PATH 里,设置 `FFMPEG=/path/to/ffmpeg`。
- 不需要图像模型,也不联网。渲染时只开一个浏览器,用完就关。迭代时用 `--draft`,一次只渲染一张;只按进程号结束自己启动的进程。

用在这些流程里

相似技能