canvas-layout

Exact captured content · path assets/canvas-layout/SKILL.md · sha256 3d3840ba04faf33d… · revision d24020d47e7b74a200069256defae8eb3c397ec1

Download the exact captured file

---
name: canvas-layout
description: 画布节点布局纪律:一类型一列、竖向排列、绝不重叠、批量建点后一键重排。在建任何节点之前加载本技能;节点一多,布局就是可操作性本身。
---

# 画布布局纪律(一类型一列 · 绝不重叠)

节点一多,画布就难操作(画布不能无限缩小)。**布局不是审美问题,是可操作性问题**——
200 个节点如果类型交叉、互相重叠,就只能一块一块挪,无法整体把握。
本技能是「建节点」之前的硬约束,与 `canvas-studio`(操作流程)、`canvas-craft`(创作方法论)配合使用。

## 一、铁律

1. **一类型一列**:同类型节点永远排在**同一竖列**里、从上往下顺次排列。
   列的固定顺序(从左到右):
   **剧本 → 场景文本 → 分镜表 → 图片节点(角色/场景/道具参考图)→ 视频节点 → 成片**。
   绝不把同类型节点横向散开,也绝不与其他类型混列。
   > **图片/视频是合并节点**:不再区分「生成」与「资产」两种节点——**有图/有视频就是资产,
   > 空节点在画布上点开生成面板填写提示词后生成**。所以「图片节点」这一列同时承载
   > 已生成的参考图与待生成的空节点;新建节点一律用 `image` / `video` 类型(旧名自动映射)。
2. **连线不改列**:连线只表达数据流(剧本→分镜、分镜→视频、资产→参考图)。
   分镜表不会因为连了"某场文本"就移动到那一列旁边——它永远待在「分镜表」列里。
3. **绝不重叠**:任意两个节点框不得相交,最小间距 24px。
   插件已内建自动挤开(节点变高、被拖动、被拉大时,相交的节点会被自动推到其下方)。
   **批量/自动建点不要手动挪别人的节点**;用户要求"精准放到某处 / 对齐 / 分列"时,用下方「精确摆放」两个工具(明确意图允许重叠)。
4. **建点顺序就是叙事顺序**:同类型节点按 场次/序号 顺序创建,
   后建的自动追加在列尾,列的竖向顺序天然等于叙事顺序。
   **不要回填到列中间**(会造成列内乱序,后续只能靠 `canvas_relayout` 修正)。
5. **命名带序**:同类节点名字里带序号(`第1集-场1文本` / `第1集-场1分镜表` / `角色-林晚 设定图`),
   便于在长列里定位。
6. **类型多时子列**:资产图较多(角色/场景/道具混在一列会很长)时,可按
   「角色图列 / 场景图列 / 道具图列」再分列——但每个子列内部仍遵守竖向排列。
7. **操作按钮在节点末尾左下角**:凡是**作用于已生成结果**的按钮(铺开到场景 / 存为资产 /
   复制全部 / 铺开到画布 / 重新生成 / 下载 / 扩写…),一律排在节点内容的**最后**、左对齐——
   用户读完结果顺手就能操作。**绝不把这类按钮夹在输入区与结果区之间**(剧本节点曾把
   「铺开到场景 / 存为资产」放在生成按钮下方、正文之前,用户要找很久)。
   输入类操作(上传、选模型、清空)不受此限,留在输入区。

## 一·五、精确摆放(0.20.0)

自动排版的列纪律只解决"批量建点不打架"。**用户或对话要求"把某个节点放到某处 / 对齐 / 按坐标调"时,必须用精确工具**:

- `canvas_layout_get`:先读全图几何(每个节点的 `nodeId/name/type/x/y/w/h/pinned` + 画布包围盒)。**不许靠猜坐标**。
- `canvas_layout_node`:一次批量摆放 `{ nodes: [{ nodeId, x, y, w?, h?, pinned? }] }`。
  - `x/y` 任意有限数值(可为负);**允许重叠**——精确摆放是明确意图,不做碰撞拒绝;
  - `w/h` 只有 `image` / `video` 媒体节点可改(w≥160、h≥120);
  - `pinned: true` 钉住:`canvas_relayout` 重排时**跳过它**(保留你摆好的位置)。
- 何时用哪个:
  | 需求 | 工具 |
  |---|---|
  | "把这三张参考图竖排在 x=100、间距 480" / "把视频列对齐到 x=2600" | `canvas_layout_get` + `canvas_layout_node` |
  | "整块太乱了,大体理一下" | `canvas_relayout`(粗排兜底,尊重 pinned) |

精摆完把关键节点 `pinned:true`,后续任何 `canvas_relayout` 都不会冲掉你的布局。

## 二、标准建点节奏(保持列干净的写法)

```
1) 剧本节点          (1 个,列 1)
2) 场景文本 × N      按场次顺序建(列 2,竖向 = 场1…场N)
3) 分镜表 × N        按场次顺序建(列 3;用 connectFrom 连到对应场景文本,但列归属不变)
4) 图片节点 × M       角色 → 场景 → 道具 顺序建(列 4;有图=资产,空节点点开面板生成)
5) 视频节点 × N      按场次顺序建(列 5;生成与结果同一个节点)
6) 成片节点          (列 6,通常 1 个)
```

- 每建完一批同类节点,列尾自然延伸,**不要中途跳去建另一类型的节点再回来**。
- 需要给已建节点补连线时,用 `canvas_connect` ——**连线不会移动节点**,放心连。

## 三、布局乱了怎么办(不要手工挪)

- **一键重排**:`canvas_relayout({ projectId })` —— 按行重排:
  横向数据流决定列(文本→分镜表→视频),竖向关系(承接 `prev` / 首帧 `frame`)留在同列,
  同行 = 一个横向连通组(「场N文本 ↔ 场N分镜表」对齐),行高取最高节点、行间保留间距、绝不重叠。
- 重排是**幂等**的:可以反复调用,不会破坏连线与内容。
- 批量创建(一次建 5 个以上节点)之后,**紧接着调用一次 `canvas_relayout`**,
  把新节点规整到列里,再继续后续步骤。

## 四、自检(每次建完一批节点后)

- [ ] 同类型节点是否全在同一竖列?竖向顺序是否等于叙事顺序?
- [ ] 有没有任意两个节点框相交(含 24px 间距)?
- [ ] 有没有类型交叉(例如某个分镜表跑到资产图列里)?
- [ ] 列数是否等于当前用到的类型数(而非更多)?

任何一项不满足 → 直接 `canvas_relayout({ projectId })`,不要手工一个个挪。