{"version":3,"file":"CanvasDrawer.mjs","sources":["../../../../../packages/sdk/utils/CanvasDrawer.ts"],"sourcesContent":["export class CanvasDrawer {\n  private ctx: CanvasRenderingContext2D\n  // 绘制和编辑图形的示例代码\n  private isDrawing = false\n  private shape = { points: [] as any }\n  constructor(private canvas: HTMLCanvasElement) {\n    const context = canvas.getContext('2d')\n    if (!context) {\n      throw new Error('无法获取 Canvas 2D 上下文')\n    }\n    this.ctx = context\n\n    this.addListener(canvas)\n  }\n\n  private addListener(canvas: HTMLCanvasElement) {\n    canvas.addEventListener('mousemove', (e) => {\n      if (!this.isDrawing) return\n\n      const rect = canvas.getBoundingClientRect()\n      const x = e.clientX - rect.left\n      const y = e.clientY - rect.top\n\n      // 更新图形的大小\n      this.shape?.points?.push([x, y])\n\n      // 清除画布并重新绘制图形\n      this.ctx.clearRect(0, 0, canvas.width, canvas.height)\n      drawShape(this.shape)\n    })\n\n    canvas.addEventListener('mouseup', () => {\n      this.isDrawing = false\n      // 完成绘制，可以在这里添加保存图形的逻辑\n    })\n\n    const drawShape = (shape: {\n      points: any\n      type?: any\n      x?: any\n      y?: any\n    }) => {\n      this.ctx.beginPath()\n      if (shape.type === 'rectangle') {\n        this.ctx.rect(\n          shape.x,\n          shape.y,\n          shape.points[1][0] - shape.x,\n          shape.points[1][1] - shape.y\n        )\n      }\n      this.ctx.stroke()\n    }\n  }\n\n  // 绘制线条\n  public drawLine(x1: number, y1: number, x2: number, y2: number): void {\n    this.ctx.beginPath()\n    this.ctx.moveTo(x1, y1)\n    this.ctx.lineTo(x2, y2)\n    this.ctx.stroke()\n  }\n\n  // 绘制矩形\n  public drawRect(\n    x: number,\n    y: number,\n    width: number,\n    height: number,\n    color = 'black'\n  ): void {\n    this.ctx.beginPath()\n    this.ctx.rect(x, y, width, height)\n    this.ctx.fillStyle = color\n    this.ctx.fill()\n    this.ctx.stroke()\n  }\n\n  // 绘制圆形\n  public drawCircle(\n    x: number,\n    y: number,\n    radius: number,\n    color = 'black'\n  ): void {\n    this.ctx.beginPath()\n    this.ctx.arc(x, y, radius, 0, 2 * Math.PI)\n    this.ctx.fillStyle = color\n    this.ctx.fill()\n    this.ctx.stroke() // 绘制边\n  }\n  // 绘制椭圆\n  public drawEllipse(\n    x: number,\n    y: number,\n    radius: number,\n    color = 'black'\n  ): void {\n    this.ctx.beginPath()\n    this.ctx.ellipse(100, 100, 50, 30, 0, Math.PI * 2, 0, true) // x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise\n    this.ctx.fillStyle = color\n    this.ctx.fill() // 填充椭圆\n    this.ctx.stroke() // 绘制边\n  }\n\n  // 清除画布\n  public clearCanvas(): void {\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n  }\n\n  // 设置颜色和线条宽度等属性\n  public setProperties(color: string, lineWidth: number): void {\n    this.ctx.strokeStyle = color\n    this.ctx.lineWidth = lineWidth\n  }\n\n  // 在画布上绘制文本\n  public drawText(\n    text: string,\n    x: number,\n    y: number,\n    color = 'black',\n    fontSize = 16\n  ): void {\n    this.ctx.font = `${fontSize}px sans-serif`\n    this.ctx.fillStyle = color\n    this.ctx.fillText(text, x, y)\n  }\n\n  // 绘制图片\n  public drawImage(\n    image: CanvasImageSource,\n    x: number,\n    y: number,\n    width = 50,\n    height = 50\n  ): void {\n    this.ctx.drawImage(image, x, y, width, height)\n  }\n\n  // 绘制点\n  public drawPoint(x: number, y: number, size: number, color = 'black'): void {\n    this.ctx.beginPath()\n    this.ctx.arc(x, y, size, 0, 2 * Math.PI)\n    this.ctx.fillStyle = color\n    this.ctx.fill()\n    this.ctx.stroke()\n  }\n\n  // 绘制扇形\n  public drawSector(\n    x: number,\n    y: number,\n    radius: number,\n    startAngle: number,\n    endAngle: number,\n    color = 'black'\n  ): void {\n    this.ctx.beginPath()\n    this.ctx.moveTo(x, y)\n    // 将角度转换为弧度\n    startAngle = (startAngle * Math.PI) / 180\n    endAngle = (endAngle * Math.PI) / 180\n    this.ctx.arc(x, y, radius, startAngle, endAngle)\n    this.ctx.closePath()\n    this.ctx.fillStyle = color\n    this.ctx.fill()\n    this.ctx.stroke()\n  }\n\n  // 绘制圆角矩形\n  public drawRoundedRect(\n    x: number,\n    y: number,\n    width: number,\n    height: number,\n    radius: number,\n    color = 'black'\n  ): void {\n    // 确保圆角半径不超过矩形半边长的一半\n    const maxRadius = Math.min(width, height) / 2\n    radius = Math.min(radius, maxRadius)\n\n    this.ctx.beginPath()\n    this.ctx.moveTo(x + radius, y)\n    this.ctx.arcTo(x + width, y, x + width, y + height, radius)\n    this.ctx.arcTo(x + width, y + height, x, y + height, radius)\n    this.ctx.arcTo(x, y + height, x, y, radius)\n    this.ctx.arcTo(x, y, x + width, y, radius)\n    this.ctx.closePath()\n    this.ctx.fillStyle = color\n    this.ctx.fill()\n    this.ctx.stroke()\n  }\n\n  // 绘制三角形\n  public drawTriangle(\n    x1: number,\n    y1: number,\n    x2: number,\n    y2: number,\n    x3: number,\n    y3: number,\n    color = 'black'\n  ): void {\n    this.ctx.beginPath()\n    this.ctx.moveTo(x1, y1)\n    this.ctx.lineTo(x2, y2)\n    this.ctx.lineTo(x3, y3)\n    this.ctx.closePath()\n    this.ctx.fillStyle = color\n    this.ctx.fill()\n    this.ctx.stroke()\n  }\n\n  // 绘制多边形\n  public drawPolygon(\n    points: Array<{ x: number; y: number }>,\n    color = 'black'\n  ): void {\n    this.ctx.beginPath()\n    this.ctx.moveTo(points[0].x, points[0].y)\n    for (let i = 1; i < points.length; i++) {\n      this.ctx.lineTo(points[i].x, points[i].y)\n    }\n    this.ctx.closePath()\n    this.ctx.fillStyle = color\n    this.ctx.fill()\n    this.ctx.stroke()\n  }\n\n  // 绘制指示标牌\n  public drawSign(\n    x: number,\n    y: number,\n    text: string,\n    textColor: string,\n    bgColor: string,\n    size: number,\n    icon?: string\n  ): void {\n    const ctx = this.ctx\n    if (!ctx) return\n\n    // 设置文本样式\n    ctx.font = `${size}px sans-serif`\n    ctx.textAlign = 'center'\n    ctx.textBaseline = 'middle'\n\n    // 绘制背景矩形\n    ctx.fillStyle = bgColor\n    ctx.fillRect(x - size * 2, y - size, size * 4, size * 2)\n\n    // 绘制文本\n    ctx.fillStyle = textColor\n    ctx.fillText(text, x, y)\n\n    // 如果提供了图标路径，则绘制图标\n    if (icon) {\n      const image = new Image()\n      image.src = icon\n      image.onload = () => {\n        ctx.drawImage(image, x - size, y - size, size * 2, size * 2)\n      }\n    }\n  }\n\n  // 绘制带有自动判定方向的指向线的指示标牌，宽高自适应文本内容，并添加内边距\n  public drawSignWithArrow(\n    x: number,\n    y: number,\n    text: string,\n    textColor: string,\n    bgColor: string,\n    fontSize: number,\n    icon?: string,\n    arrowDirection: 'up' | 'down' | 'left' | 'right' = 'up'\n  ): void {\n    const ctx = this.ctx\n    if (!ctx) return\n\n    // 测量文本宽度\n    ctx.font = `${fontSize}px sans-serif`\n    const textWidth = ctx.measureText(text).width\n\n    // 设置内边距\n    const padding = 5 // 例如，内边距为字体大小的一半\n\n    // 根据文本宽度和内边距计算标牌的宽高\n    const signWidth = textWidth + padding * 2\n    const signHeight = fontSize + padding * 2\n\n    // 根据标牌位置和尺寸自动判定指向线方向\n    // const isVertical = Math.abs(x - this.canvas.width / 2) < Math.abs(y - this.canvas.height / 2)\n    arrowDirection = this.autoDetectArrowDirection(x, y, fontSize)\n\n    // 绘制背景矩形（标牌）\n    ctx.fillStyle = bgColor\n    ctx.fillRect(x - signWidth / 2, y - signHeight / 2, signWidth, signHeight)\n\n    // 绘制文本\n    ctx.fillStyle = textColor\n    ctx.textAlign = 'center'\n    ctx.textBaseline = 'middle'\n    ctx.fillText(text, x, y)\n\n    // 如果提供了图标路径，则绘制图标\n    if (icon) {\n      const image = new Image()\n      image.src = icon\n      image.onload = () => {\n        // 根据需要调整图标的位置和大小\n        const iconWidth = signWidth * 0.75 // 假设图标宽度为标牌宽度的 75%\n        const iconHeight = signHeight * 0.75 // 假设图标高度为标牌高度的 75%\n        ctx.drawImage(\n          image,\n          x - iconWidth / 2,\n          y - iconHeight / 2,\n          iconWidth,\n          iconHeight\n        )\n      }\n    }\n\n    // 绘制指向线和箭头头\n    this.drawArrow(ctx, x, y, arrowDirection, signWidth, signHeight, fontSize)\n  }\n\n  // 绘制带有自动判定方向的指向线的指示标牌，宽高自适应文本内容，并添加内边距\n  public drawSignWithArrow2(\n    sourcePointX: number,\n    sourcePointY: number,\n    text: string,\n    fontSize: number,\n    textColor: string,\n    bgColor: string,\n    position:\n      | 'leftTop'\n      | 'top'\n      | 'rightTop'\n      | 'rightBottom'\n      | 'bottom'\n      | 'leftBottom' = 'leftBottom',\n    icon?: string\n  ): void {\n    const ctx = this.ctx\n    if (!ctx) return\n\n    this.drawPoint(sourcePointX, sourcePointY, 3, 'red')\n\n    ctx.font = `${fontSize}px sans-serif`\n    const textWidth = ctx.measureText(text).width\n    const padding = 5\n    const signWidth = textWidth + padding * 2\n    const signHeight = fontSize + padding * 2\n\n    let x = 0,\n      y = 0,\n      lineX = 0,\n      lineY = 0\n\n    // 根据位置确定标牌的坐标\n    const paddingX2 = padding * 2\n    switch (position) {\n      case 'leftTop':\n        x = sourcePointX - signWidth - paddingX2\n        y = sourcePointY - signHeight - paddingX2\n        lineX = x + signWidth / 1.2\n        lineY = y + signHeight\n        break\n      case 'top':\n        x = sourcePointX - signWidth / 2\n        y = sourcePointY - signHeight - paddingX2\n        lineX = x + signWidth / 2\n        lineY = y + signHeight\n        break\n      case 'rightTop':\n        x = sourcePointX + paddingX2\n        y = sourcePointY - signHeight - paddingX2\n        lineX = x + signWidth / 4\n        lineY = y + signHeight\n        break\n      case 'rightBottom':\n        x = sourcePointX + paddingX2\n        y = sourcePointY + paddingX2\n        lineX = x + signWidth / 4\n        lineY = y\n        break\n      case 'bottom':\n        x = sourcePointX - signWidth / 2\n        y = sourcePointY + paddingX2\n        lineX = x + signWidth / 2\n        lineY = y\n        break\n      case 'leftBottom':\n        x = sourcePointX - signWidth - paddingX2\n        y = sourcePointY + paddingX2\n        lineX = x + signWidth / 1.2\n        lineY = y\n        break\n      default:\n        x = sourcePointX - signWidth / 2\n        y = sourcePointY - signHeight - paddingX2\n        lineX = x + signWidth / 1.2\n        lineY = y + signHeight\n        break\n    }\n\n    // 绘制背景矩形（标牌）\n    ctx.fillStyle = bgColor\n    ctx.fillRect(x, y, signWidth, signHeight)\n\n    // 绘制文本\n    ctx.fillStyle = textColor\n    ctx.textAlign = 'center'\n    ctx.textBaseline = 'middle'\n    ctx.fillText(text, x + signWidth / 2, y + signHeight / 2)\n\n    // 如果提供了图标路径，则绘制图标\n    if (icon) {\n      const image = new Image()\n      image.src = icon\n      image.onload = () => {\n        const iconWidth = signWidth * 0.75\n        const iconHeight = signHeight * 0.75\n        ctx.drawImage(\n          image,\n          x + (signWidth - iconWidth) / 2,\n          y + (signHeight - iconHeight) / 2,\n          iconWidth,\n          iconHeight\n        )\n      }\n    }\n\n    // 绘制指向线和箭头头\n    this.drawPointerToSign(\n      sourcePointX,\n      sourcePointY,\n      lineX,\n      lineY,\n      signWidth,\n      signHeight\n    )\n  }\n\n  // 绘制箭头的方法\n  private drawArrow(\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    direction: 'up' | 'down' | 'left' | 'right',\n    signWidth: number,\n    signHeight: number,\n    fontSize: number\n  ): void {\n    ctx.strokeStyle = 'black' // 设置线条颜色\n    ctx.lineWidth = 2 // 设置线条宽度\n    ctx.beginPath()\n    const arrowLength = fontSize * 1.5 // 箭头长度为字体大小的 1.5 倍\n    const arrowWidth = fontSize * 0.5 // 箭头宽度为字体大小的 0.5 倍\n\n    let startX: number, startY: number, endX: number, endY: number\n\n    // 计算标牌中心点坐标\n    const centerX = x - signWidth / 2\n    const centerY = y - signHeight / 2\n\n    switch (direction) {\n      case 'up':\n        startX = centerX\n        startY = centerY - signHeight / 2 - arrowLength // 指向标牌的上边缘\n        endX = startX - arrowWidth / 2\n        endY = startY\n        break\n      case 'down':\n        startX = centerX\n        startY = centerY + signHeight / 2 + arrowLength // 指向标牌的下边缘\n        endX = startX - arrowWidth / 2\n        endY = startY\n        break\n      case 'left':\n        startX = centerX - signWidth / 2 - arrowLength // 指向标牌的左边缘\n        startY = centerY\n        endX = startX\n        endY = startY - arrowWidth / 2\n        break\n      case 'right':\n        startX = centerX + signWidth / 2 + arrowLength // 指向标牌的右边缘\n        startY = centerY\n        endX = startX\n        endY = startY - arrowWidth / 2\n        break\n    }\n\n    ctx.moveTo(startX, startY)\n    ctx.lineTo(centerX, centerY) // 指向标牌的中心\n    ctx.lineTo(endX, endY)\n    ctx.stroke()\n\n    // 绘制箭头头\n    this.drawArrowHead(ctx, endX, endY, direction, arrowWidth)\n  }\n\n  // 绘制箭头头的方法\n  private drawArrowHead(\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    direction: 'up' | 'down' | 'left' | 'right',\n    arrowWidth: number\n  ): void {\n    ctx.beginPath()\n    const arrowLength = arrowWidth * 1.5\n\n    switch (direction) {\n      case 'up':\n        ctx.moveTo(x, y)\n        ctx.lineTo(x - arrowLength / 2, y + arrowWidth / 2)\n        ctx.lineTo(x + arrowLength / 2, y + arrowWidth / 2)\n        break\n      case 'down':\n        ctx.moveTo(x, y)\n        ctx.lineTo(x - arrowLength / 2, y - arrowWidth / 2)\n        ctx.lineTo(x + arrowLength / 2, y - arrowWidth / 2)\n        break\n      case 'left':\n        ctx.moveTo(x, y)\n        ctx.lineTo(x + arrowWidth / 2, y - arrowLength / 2)\n        ctx.lineTo(x + arrowWidth / 2, y + arrowLength / 2)\n        break\n      case 'right':\n        ctx.moveTo(x, y)\n        ctx.lineTo(x - arrowWidth / 2, y - arrowLength / 2)\n        ctx.lineTo(x - arrowWidth / 2, y + arrowLength / 2)\n        break\n    }\n\n    ctx.closePath()\n    ctx.fill()\n  }\n\n  // 自动判定指向线方向的方法\n  private autoDetectArrowDirection(\n    x: number,\n    y: number,\n    size: number\n  ): 'up' | 'down' | 'left' | 'right' {\n    const canvasWidth = this.canvas.width\n    const canvasHeight = this.canvas.height\n\n    if (y - size < size) {\n      // 标牌在 Canvas 顶部\n      return 'down'\n    } else if (x + size > canvasWidth) {\n      // 标牌在 Canvas 右侧\n      return 'left'\n    } else if (x - size < 0) {\n      // 标牌在 Canvas 左侧\n      return 'right'\n    } else if (y + size > canvasHeight) {\n      // 标牌在 Canvas 底部\n      return 'up'\n    } else {\n      // 默认方向，或者当标牌位置不是在边缘时\n      return 'up'\n    }\n  }\n\n  // 绘制指向标牌的指向线\n  public drawPointerToSign(\n    srcX: number,\n    srcY: number,\n    signX: number,\n    signY: number,\n    signWidth: number,\n    signHeight: number,\n    color = 'black',\n    pointerLength = 10\n  ): void {\n    const ctx = this.ctx\n    if (!ctx) return\n\n    // 绘制指向线\n    ctx.strokeStyle = color\n    ctx.lineWidth = 1\n    ctx.beginPath()\n    ctx.moveTo(srcX, srcY)\n    ctx.lineTo(signX, signY)\n    ctx.stroke()\n\n    // 确定标牌的中心点\n    const signCenterX = signX + signWidth / 2\n    const signCenterY = signY + signHeight / 2\n\n    // 计算指向线与标牌中心点的斜率\n    const dx = signCenterX - srcX\n    const dy = signCenterY - srcY\n\n    // 计算单位向量\n    const mag = Math.sqrt(dx * dx + dy * dy)\n    const unitX = dx / mag\n    const unitY = dy / mag\n\n    // 绘制箭头头\n    this.drawPointerArrowHead(\n      ctx,\n      signCenterX,\n      signCenterY,\n      unitX,\n      unitY,\n      pointerLength,\n      color\n    )\n  }\n\n  // 绘制箭头头的方法\n  private drawPointerArrowHead(\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    dx: number,\n    dy: number,\n    length: number,\n    color: string\n  ): void {\n    ctx.fillStyle = color\n    ctx.beginPath()\n    ctx.moveTo(x, y)\n    ctx.lineTo(x + dx * length, y + dy * length)\n    ctx.lineTo(x - length * dx, y - length * dy)\n    ctx.lineTo(x + length * dx, y + length * dy)\n    ctx.lineTo(x, y)\n    ctx.closePath()\n    ctx.fill()\n  }\n\n  // 标牌数据，用于存储和检索标牌信息\n  private signs: {\n    id: string\n    x: number\n    y: number\n    text: string\n    textColor: string\n    bgColor: string\n    size: number\n    icon?: string\n  }[] = []\n\n  // 添加标牌到 signs 数组中，用于后续编辑操作\n  public addSign(sign: {\n    id: string\n    x: number\n    y: number\n    text: string\n    textColor: string\n    bgColor: string\n    size: number\n    icon?: string\n  }): void {\n    this.signs.push(sign)\n  }\n\n  // 移动标牌\n  public moveSign(id: string, offsetX: number, offsetY: number): void {\n    const sign = this.signs.find((sign) => sign.id === id)\n    if (sign) {\n      sign.x += offsetX\n      sign.y += offsetY\n      this.redrawSign(sign)\n    }\n  }\n\n  // 缩放标牌\n  public scaleSign(id: string, scale: number): void {\n    const sign = this.signs.find((sign) => sign.id === id)\n    if (sign) {\n      sign.size *= scale\n      this.redrawSign(sign)\n    }\n  }\n\n  // 旋转标牌\n  public rotateSign(id: string, angle: number): void {\n    // 旋转标牌的实现较为复杂，需要考虑旋转中心点和Canvas的变换属性\n    // 此处仅为示意，具体实现需要更多的数学计算\n    const sign = this.signs.find((sign) => sign.id === id)\n    if (sign) {\n      // 此处应添加旋转标牌的逻辑\n      console.log(angle)\n    }\n  }\n\n  // 删除标牌\n  public deleteSign(id: string): void {\n    this.signs = this.signs.filter((sign) => sign.id !== id)\n    this.clearCanvas()\n    this.redrawAllSigns()\n  }\n\n  // 编辑标牌文本\n  public editSignText(id: string, newText: string): void {\n    const sign = this.signs.find((sign) => sign.id === id)\n    if (sign) {\n      sign.text = newText\n      this.redrawSign(sign)\n    }\n  }\n\n  // 更改标牌样式\n  public changeSignStyle(id: string, textColor: string, bgColor: string): void {\n    const sign = this.signs.find((sign) => sign.id === id)\n    if (sign) {\n      sign.textColor = textColor\n      sign.bgColor = bgColor\n      this.redrawSign(sign)\n    }\n  }\n\n  // 重新绘制单个标牌\n  private redrawSign(sign: {\n    id: string\n    x: number\n    y: number\n    text: string\n    textColor: string\n    bgColor: string\n    size: number\n    icon?: string\n  }): void {\n    this.ctx.clearRect(\n      sign.x - sign.size * 2,\n      sign.y - sign.size,\n      sign.size * 4,\n      sign.size * 2\n    )\n    this.drawSign(\n      sign.x,\n      sign.y,\n      sign.text,\n      sign.textColor,\n      sign.bgColor,\n      sign.size,\n      sign.icon\n    )\n  }\n\n  // 重新绘制所有标牌\n  private redrawAllSigns(): void {\n    this.signs.forEach((sign) => {\n      this.redrawSign(sign)\n    })\n  }\n}\n"],"names":["CanvasDrawer","constructor","t","this","canvas","isDrawing","shape","points","signs","e","getContext","Error","ctx","addListener","addEventListener","i","m","h","n","getBoundingClientRect","r","clientX","left","s","clientY","top","push","clearRect","width","height","beginPath","type","rect","x","y","stroke","drawLine","moveTo","lineTo","drawRect","fillStyle","fill","drawCircle","arc","Math","PI","drawEllipse","ellipse","clearCanvas","setProperties","strokeStyle","lineWidth","drawText","font","fillText","drawImage","drawPoint","drawSector","closePath","drawRoundedRect","min","arcTo","drawTriangle","drawPolygon","length","drawSign","textAlign","textBaseline","fillRect","l","Image","src","onload","drawSignWithArrow","o","measureText","u","c","autoDetectArrowDirection","a","b","d","drawArrow","drawSignWithArrow2","v","f","p","w","drawPointerToSign","g","drawArrowHead","sqrt","drawPointerArrowHead","addSign","moveSign","find","id","redrawSign","scaleSign","size","rotateSign","deleteSign","filter","redrawAllSigns","editSignText","text","changeSignStyle","textColor","bgColor","icon","forEach"],"mappings":"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"}