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