# 画布与贴纸功能 本文档描述当前前端代码中已实现的画布设计功能。事实来源是 `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、清空画布 - **图层管理**:支持图层可见性、锁定、文件夹分组 - **吸附对齐**:元素拖拽时自动吸附到附近元素边缘 - **缩放**:编辑视图可缩放(不影响导出尺寸) ## SVG 导出 "导出总图 SVG"由前端序列化当前画布模型完成: - 导出文件名:`canvas-design.svg` - 背景输出为一个覆盖全画布的 ``(透明背景时 fill="none") - 贴纸输出为 ``,SVG 贴纸会以内联 `data:image/svg+xml` 的形式嵌入 - 文字输出为 `` - 基础形状输出为原生 SVG 的 ``、``、`` - 元素的位移和旋转写入 SVG `transform`,透明度写入 `opacity` ## 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;没有在画布页实现 PNG/JPG 总图导出 - 线距分析结果显示在元素属性面板中,辅助激光加工参数设定