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 })`,不要手工一个个挪。