Files
wordcloud/docs/CANVAS_STUDIO.md
T
broccoliandClaude Sonnet 5 1d17b5e20d Rework layout engine around exact-glyph collision, add tests and docs sync
Replace the old bbox/heuristic placement (scale search rounds, large-font
capping, stratified sampling, fill-retry ladders) with an area-model font
sizing pass feeding a C++ exact-glyph collision engine (centroid-biased
spiral + random probing, HD clearance refinement, density/hole
optimization). Simplify the frontend advanced-params panel and JobParams
type to match the surviving config surface, add a layout-constraints test
suite and a repeatable benchmark tool, and bring docs/*.md back in sync
with current code (plus new TESTING.md and DEPLOYMENT.md).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-26 18:32:25 +08:00

4.6 KiB
Raw Blame History

画布与贴纸功能

本文档描述当前前端代码中已实现的画布设计功能。事实来源是 frontend/src/pages/CanvasStudio.tsxfrontend/src/App.tsxfrontend/src/components/ExportPanel.tsxfrontend/src/lib/stickerLibrary.tsfrontend/src/lib/canvasDocument.tsfrontend/src/types.ts

页面关系

TemplateHome(首页)
    ├── CanvasStudio(画布设计页)─ 添加词云 ─→ TestWorkbench(词云生成页)
    ├── TestWorkbench(词云生成页)─ 返回画布 ─→ CanvasStudio
    └── HelpPage(帮助页)
  • 应用默认进入首页,展示模板列表
  • 画布页顶部的"添加词云"会切换到词云生成页
  • 词云生成页顶部的"返回画布"会回到画布设计页
  • 词云生成页导出面板保留下载 SVG/位图功能,并新增"作为贴纸导入贴纸库"

贴纸库

贴纸库是前端本地能力,不依赖后端接口:

  • 存储位置:localStoragewordcloud-sticker-library
  • 数据类型:StickerAsset,当前支持 svgimage 两类,已实现入口主要使用 svg
  • 用户导入 SVG:画布页左侧"贴纸"面板读取 .svg 文件文本,写入贴纸库,并立即插入画布
  • 词云作为贴纸:导出面板按当前 SVG 导出参数请求 /api/jobs/{job_id}/custom.svg,读取返回的 SVG 文本后写入贴纸库
  • 贴纸删除只删除本地贴纸库记录,不会删除已经导出的总图文件

画布模型

画布文档保存在 localStoragewordcloud-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
  • 背景输出为一个覆盖全画布的 <rect>(透明背景时 fill="none"
  • 贴纸输出为 <image>SVG 贴纸会以内联 data:image/svg+xml 的形式嵌入
  • 文字输出为 <text>
  • 基础形状输出为原生 SVG 的 <rect><ellipse><line>
  • 元素的位移和旋转写入 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 总图导出
  • 线距分析结果显示在元素属性面板中,辅助激光加工参数设定