Files
wordcloud/docs/CANVAS_STUDIO.md
T
lai_hong 7a506114a2
Build, Push and Deploy / build (push) Failing after 6m44s
Build, Push and Deploy / deploy (push) Skipped
feat(export): add server-side AI export
2026-09-13 13:01:34 +08:00

111 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 画布与贴纸功能
本文档描述当前前端代码中已实现的画布设计功能。事实来源是 `frontend/src/pages/CanvasStudio.tsx``frontend/src/App.tsx``frontend/src/components/ExportPanel.tsx``frontend/src/lib/stickerLibrary.ts``frontend/src/lib/canvasDocument.ts``frontend/src/types.ts`
## 页面关系
```
TemplateHome(首页)
├── CanvasStudio(画布设计页)─ 添加词云 ─→ TestWorkbench(词云生成页)
├── TestWorkbench(词云生成页)─ 返回画布 ─→ CanvasStudio
└── HelpPage(帮助页)
```
- 应用默认进入首页,展示模板列表
- 画布页顶部的"添加词云"会切换到词云生成页
- 词云生成页顶部的"返回画布"会回到画布设计页
- 词云生成页导出面板保留下载 SVG/位图功能,并新增"作为贴纸导入贴纸库"
## 贴纸库
贴纸库是前端本地能力,不依赖后端接口:
- 存储位置:`localStorage``wordcloud-sticker-library`
- 数据类型:`StickerAsset`,当前支持 `svg``image` 两类,已实现入口主要使用 `svg`
- 用户导入 SVG:画布页左侧"贴纸"面板读取 `.svg` 文件文本,写入贴纸库,并立即插入画布
- 词云作为贴纸:导出面板按当前 SVG 导出参数请求 `/api/jobs/{job_id}/custom.svg`,读取返回的 SVG 文本后写入贴纸库
- 贴纸删除只删除本地贴纸库记录,不会删除已经导出的总图文件
## 画布模型
画布文档保存在 `localStorage``wordcloud-canvas-document`
当前模型字段:
- `width`:画布宽度,默认 `1600`
- `height`:画布高度,默认 `1000`
- `background`:画布背景色,默认 `#ffffff`,支持透明 `#00000000`
- `elements`:画布元素数组
- `layers`:图层数组(可选,支持可见性、锁定、文件夹分组)
- `layerFolders`:图层文件夹数组(可选)
当前元素类型:
- `sticker`:引用贴纸库中的 SVG 或图片(`assetId`
- `text`:普通文字(内容、颜色、字号、字体、字重、位置、尺寸、旋转、透明度)
- `rect`:矩形(填充、描边、描边宽度、位置、尺寸、旋转、透明度)
- `ellipse`:椭圆(同上)
- `line`:线条(描边、描边宽度、位置、尺寸、旋转、透明度)
## 编辑行为
- 点击贴纸库中的贴纸会把该贴纸插入画布中央区域
- 画布元素支持:
- **拖拽移动**:鼠标/触摸拖拽
- **大小调整**:选中后通过右下角手柄调整
- **精确编辑**:右侧面板可修改位置、尺寸、旋转、透明度、元素特有属性
- **层级调整**:上移、下移
- **删除**:删除元素
- 右侧面板支持修改画布宽高、背景色
- 支持导出总图 SVG、AI(受支持元素)、清空画布
- **图层管理**:支持图层可见性、锁定、文件夹分组
- **吸附对齐**:元素拖拽时自动吸附到附近元素边缘
- **缩放**:编辑视图可缩放(不影响导出尺寸)
## SVG 导出
"导出总图 SVG"由前端序列化当前画布模型完成:
- 导出文件名:`canvas-design.svg`
- 背景输出为一个覆盖全画布的 `<rect>`(透明背景时 fill="none"
- 贴纸输出为 `<image>`SVG 贴纸会以内联 `data:image/svg+xml` 的形式嵌入
- 文字输出为 `<text>`
- 基础形状输出为原生 SVG 的 `<rect>``<ellipse>``<line>`
- 元素的位移和旋转写入 SVG `transform`,透明度写入 `opacity`
## AI 导出
"导出总图 AI"先按同一画布模型生成 SVG,再提交到后端 `/api/exports/ai`,由 Docker Compose 内部的 `ai-converter` 转换为 Illustrator 5 兼容 `.ai` 文件。
- 支持路径、矩形、椭圆、圆、线条、纯色填充/描边和仿射变换。
- 图片贴纸、普通文字、透明度、SVG pattern/clipPath 等不保证保真的特性会明确失败,不会静默生成错误文件。
- 词云本体由后端输出为路径,适合作为 AI 导出主场景。
## ZIP 导出
支持导出含以下内容的 ZIP 包:
- `canvas.svg`:总图 SVG
- `sticker_{id}.svg`:画布中所有独立 SVG 贴纸
- `manifest.json`:元素元数据清单
## 同底图换名单(Replace Session
画布页支持"替换词云名单"功能:
1. 用户右键点击画布上的词云贴纸,选择"同底图换名单"
2. 生成一个 `WordcloudReplaceSession`,包含:
- `mask`:原词云的底图遮罩(SVG/Image)
- `target`:目标元素信息(含宽度、高度、原遮罩元素 ID)
3. 会话传递到词云生成页
4. 词云生成页锁定底图,只替换名单内容,生成后自动按原尺寸贴回画布
## 当前边界
- 贴纸库和画布文档只保存在当前浏览器 `localStorage`,不会跨浏览器或跨设备同步
- 当前没有服务端素材库、项目文件格式或协作编辑接口(Projects 接口存在但服务层级较浅)
- SVG 导入按用户信任文件处理;编辑器预览使用图片方式加载,不在页面中直接执行 SVG 内容
- 当前缩放只影响编辑视图,不改变导出尺寸
- 画布页总图支持 SVG 和受支持元素的 AI;没有实现 PNG/JPG 总图导出
- 线距分析结果显示在元素属性面板中,辅助激光加工参数设定