{"version":3,"file":"PathElement.cjs","sources":["../../../src/elements/PathElement.js"],"sourcesContent":["import { BaseElement } from './BaseElement.js';\nimport { DEFAULT_ELEMENT_CONFIG } from '../types/constants.js';\nimport { deepMerge } from '../utils/helpers.js';\nimport { ElementType } from '../types/enums.js';\nimport { toPixels } from '../utils/unit-converter.js';\nimport paper from '@chnak/paper';\n\n/**\n * 路径元素 - 支持自定义路径、贝塞尔曲线等\n */\nexport class PathElement extends BaseElement {\n  constructor(config = {}) {\n    super(config);\n    this.type = ElementType.PATH;\n    // 重新合并配置\n    this.config = deepMerge({}, DEFAULT_ELEMENT_CONFIG, config);\n    \n    // 路径点数组，支持多种格式：\n    // 1. [{x: 100, y: 100}, {x: 200, y: 200}, ...]\n    // 2. [100, 100, 200, 200, ...] (x, y 交替)\n    // 3. [[100, 100], [200, 200], ...]\n    this.points = config.points || [];\n    \n    // 是否闭合路径\n    this.closed = config.closed !== undefined ? config.closed : false;\n    \n    // 是否平滑路径\n    this.smooth = config.smooth !== undefined ? config.smooth : false;\n    \n    // 是否使用贝塞尔曲线（如果为 true，points 需要包含控制点）\n    this.bezier = config.bezier !== undefined ? config.bezier : false;\n    \n    // 填充和描边\n    this.fillColor = config.fillColor || config.bgcolor || null;\n    this.strokeColor = config.strokeColor || config.borderColor || '#000000';\n    this.strokeWidth = config.strokeWidth || config.borderWidth || 1;\n    \n    // 路径样式\n    this.strokeCap = config.strokeCap || 'round';\n    this.strokeJoin = config.strokeJoin || 'round';\n    this.dashArray = config.dashArray || null;\n    this.dashOffset = config.dashOffset || 0;\n  }\n\n  /**\n   * 设置路径点\n   * @param {Array} points - 路径点数组\n   */\n  setPoints(points) {\n    this.points = points;\n  }\n\n  /**\n   * 添加路径点\n   * @param {number|Object} x - X坐标或点对象\n   * @param {number} y - Y坐标（如果第一个参数是数字）\n   */\n  addPoint(x, y) {\n    if (typeof x === 'object' && x !== null) {\n      this.points.push(x);\n    } else {\n      this.points.push({ x, y });\n    }\n  }\n\n  /**\n   * 设置是否闭合路径\n   */\n  setClosed(closed) {\n    this.closed = closed;\n  }\n\n  /**\n   * 设置是否平滑路径\n   */\n  setSmooth(smooth) {\n    this.smooth = smooth;\n  }\n\n  /**\n   * 规范化路径点数组\n   * 将各种格式转换为统一的 {x, y} 格式\n   */\n  _normalizePoints(points) {\n    if (!points || points.length === 0) {\n      return [];\n    }\n\n    const normalized = [];\n    \n    // 如果是数字数组 [x, y, x, y, ...]\n    if (typeof points[0] === 'number') {\n      for (let i = 0; i < points.length; i += 2) {\n        if (i + 1 < points.length) {\n          normalized.push({ x: points[i], y: points[i + 1] });\n        }\n      }\n    }\n    // 如果是二维数组 [[x, y], [x, y], ...]\n    else if (Array.isArray(points[0])) {\n      for (const point of points) {\n        if (Array.isArray(point) && point.length >= 2) {\n          normalized.push({ x: point[0], y: point[1] });\n        }\n      }\n    }\n    // 如果已经是对象数组 [{x, y}, {x, y}, ...]\n    else if (typeof points[0] === 'object') {\n      for (const point of points) {\n        if (point && typeof point.x === 'number' && typeof point.y === 'number') {\n          normalized.push({ x: point.x, y: point.y });\n        }\n      }\n    }\n\n    return normalized;\n  }\n\n  /**\n   * 渲染路径元素（使用 Paper.js）\n   * @param {paper.Layer} layer - Paper.js 图层\n   * @param {number} time - 当前时间（秒）\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   */\n  render(layer, time, paperInstance = null) {\n    if (!this.visible) return null;\n\n    // 获取 Paper.js 实例\n    const { paper: p, project } = this.getPaperInstance(paperInstance);\n\n    const viewSize = project && project.view && project.view.viewSize \n      ? project.view.viewSize \n      : { width: 1920, height: 1080 };\n    const context = { width: viewSize.width, height: viewSize.height };\n    const state = this.getStateAtTime(time, context);\n\n    // 规范化路径点\n    const normalizedPoints = this._normalizePoints(this.points);\n    \n    if (normalizedPoints.length === 0) {\n      return null;\n    }\n\n    // 使用 BaseElement 的通用方法转换位置\n    // state.x 和 state.y 已经在 getStateAtTime 中转换了单位\n    const { x, y } = this.convertPosition(state.x, state.y, context);\n\n    // 处理 anchor\n    const anchor = state.anchor || [0, 0];\n    \n    // 创建路径\n    let path;\n    \n    if (this.bezier && normalizedPoints.length >= 4) {\n      // 贝塞尔曲线路径\n      path = new p.Path();\n      \n      // 第一个点作为起点\n      const firstPoint = normalizedPoints[0];\n      path.moveTo(new p.Point(\n        x + firstPoint.x - (this.width || 0) * anchor[0],\n        y + firstPoint.y - (this.height || 0) * anchor[1]\n      ));\n      \n      // 每三个点为一组：控制点1、控制点2、终点\n      for (let i = 1; i < normalizedPoints.length; i += 3) {\n        if (i + 2 < normalizedPoints.length) {\n          const cp1 = normalizedPoints[i];\n          const cp2 = normalizedPoints[i + 1];\n          const end = normalizedPoints[i + 2];\n          \n          path.cubicCurveTo(\n            new p.Point(\n              x + cp1.x - (this.width || 0) * anchor[0],\n              y + cp1.y - (this.height || 0) * anchor[1]\n            ),\n            new p.Point(\n              x + cp2.x - (this.width || 0) * anchor[0],\n              y + cp2.y - (this.height || 0) * anchor[1]\n            ),\n            new p.Point(\n              x + end.x - (this.width || 0) * anchor[0],\n              y + end.y - (this.height || 0) * anchor[1]\n            )\n          );\n        }\n      }\n    } else {\n      // 普通路径\n      path = new p.Path();\n      \n      for (let i = 0; i < normalizedPoints.length; i++) {\n        const point = normalizedPoints[i];\n        const paperPoint = new p.Point(\n          x + point.x - (this.width || 0) * anchor[0],\n          y + point.y - (this.height || 0) * anchor[1]\n        );\n        \n        if (i === 0) {\n          path.moveTo(paperPoint);\n        } else {\n          path.lineTo(paperPoint);\n        }\n      }\n    }\n\n    // 是否闭合路径\n    if (this.closed) {\n      path.closePath();\n    }\n\n    // 是否平滑路径\n    if (this.smooth && path.segments.length > 2) {\n      path.smooth();\n    }\n\n    // 设置填充\n    if (this.fillColor) {\n      path.fillColor = this.fillColor;\n    } else {\n      path.fillColor = null;\n    }\n\n    // 设置描边\n    if (this.strokeColor && this.strokeWidth > 0) {\n      path.strokeColor = this.strokeColor;\n      path.strokeWidth = this.strokeWidth;\n      path.strokeCap = this.strokeCap;\n      path.strokeJoin = this.strokeJoin;\n      \n      if (this.dashArray) {\n        path.dashArray = this.dashArray;\n        path.dashOffset = this.dashOffset;\n      }\n    }\n\n    // 添加到 layer\n    layer.addChild(path);\n    \n    // 保存 Paper.js 项目引用（用于 onFrame 回调）\n    this._paperItem = path;\n    \n    // 调用 onRender 回调，传递 Paper.js 项目引用和 paperInstance\n    this._callOnRender(time, path, paperInstance);\n    \n    return path;\n  }\n}\n\n"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_ELEMENT_CONFIG"],"mappings":";;;;;;;;AAOA;AACA;AACA;AACO,MAAM,WAAW,SAASA,gCAAW,CAAC;AAC7C,EAAE,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;AAC3B,IAAI,KAAK,CAAC,MAAM,CAAC;AACjB,IAAI,IAAI,CAAC,IAAI,GAAGC,uBAAW,CAAC,IAAI;AAChC;AACA,IAAI,IAAI,CAAC,MAAM,GAAGC,uBAAS,CAAC,EAAE,EAAEC,sCAAsB,EAAE,MAAM,CAAC;AAC/D;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE;AACrC;AACA;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;AACrE;AACA;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;AACrE;AACA;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;AACrE;AACA;AACA,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI;AAC/D,IAAI,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,SAAS;AAC5E,IAAI,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC;AACpE;AACA;AACA,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,OAAO;AAChD,IAAI,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,OAAO;AAClD,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI;AAC7C,IAAI,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC;AAC5C,EAAE;;AAEF;AACA;AACA;AACA;AACA,EAAE,SAAS,CAAC,MAAM,EAAE;AACpB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE;AACjB,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE;AAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAChC,IAAI;AACJ,EAAE;;AAEF;AACA;AACA;AACA,EAAE,SAAS,CAAC,MAAM,EAAE;AACpB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB,EAAE;;AAEF;AACA;AACA;AACA,EAAE,SAAS,CAAC,MAAM,EAAE;AACpB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB,EAAE;;AAEF;AACA;AACA;AACA;AACA,EAAE,gBAAgB,CAAC,MAAM,EAAE;AAC3B,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACxC,MAAM,OAAO,EAAE;AACf,IAAI;;AAEJ,IAAI,MAAM,UAAU,GAAG,EAAE;AACzB;AACA;AACA,IAAI,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACvC,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AACjD,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AACnC,UAAU,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AAC7D,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AACvC,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAClC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;AACvD,UAAU,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA,SAAS,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AAC5C,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAClC,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ,EAAE;AACjF,UAAU,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AACrD,QAAQ;AACR,MAAM;AACN,IAAI;;AAEJ,IAAI,OAAO,UAAU;AACrB,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE;AAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI;;AAElC;AACA,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;;AAEtE,IAAI,MAAM,QAAQ,GAAG,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ;AACrE,QAAQ,OAAO,CAAC,IAAI,CAAC,QAAQ;AAC7B,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AACrC,IAAI,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;AACtE,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;;AAEpD;AACA,IAAI,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/D;AACA,IAAI,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;AACvC,MAAM,OAAO,IAAI;AACjB,IAAI;;AAEJ;AACA;AACA,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;;AAEpE;AACA,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACzC;AACA;AACA,IAAI,IAAI,IAAI;AACZ;AACA,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,EAAE;AACrD;AACA,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE;AACzB;AACA;AACA,MAAM,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC;AAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;AAC7B,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACxD,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AACxD,OAAO,CAAC;AACR;AACA;AACA,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AAC3D,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE;AAC7C,UAAU,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC;AACzC,UAAU,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC;AAC7C,UAAU,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC;AAC7C;AACA,UAAU,IAAI,CAAC,YAAY;AAC3B,YAAY,IAAI,CAAC,CAAC,KAAK;AACvB,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACvD,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AACvD,aAAa;AACb,YAAY,IAAI,CAAC,CAAC,KAAK;AACvB,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACvD,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AACvD,aAAa;AACb,YAAY,IAAI,CAAC,CAAC,KAAK;AACvB,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACvD,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AACvD;AACA,WAAW;AACX,QAAQ;AACR,MAAM;AACN,IAAI,CAAC,MAAM;AACX;AACA,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE;AACzB;AACA,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxD,QAAQ,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC;AACzC,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,KAAK;AACtC,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACrD,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AACrD,SAAS;AACT;AACA,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE;AACrB,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AACjC,QAAQ,CAAC,MAAM;AACf,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AACjC,QAAQ;AACR,MAAM;AACN,IAAI;;AAEJ;AACA,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AACrB,MAAM,IAAI,CAAC,SAAS,EAAE;AACtB,IAAI;;AAEJ;AACA,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACjD,MAAM,IAAI,CAAC,MAAM,EAAE;AACnB,IAAI;;AAEJ;AACA,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AACrC,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI;AAC3B,IAAI;;AAEJ;AACA,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;AAClD,MAAM,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;AACzC,MAAM,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;AACzC,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AACrC,MAAM,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AACvC;AACA,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;AACvC,QAAQ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AACzC,MAAM;AACN,IAAI;;AAEJ;AACA,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AACxB;AACA;AACA,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI;AAC1B;AACA;AACA,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC;AACjD;AACA,IAAI,OAAO,IAAI;AACf,EAAE;AACF;;;;"}