zkqh-canvas-select-one 2.32.4 → 2.32.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-select.min.js","sources":["../src/shape/Shape.ts","../src/index.ts","../src/tools.ts","../src/shape/Rect.ts","../src/shape/Polygon.ts","../src/shape/Dot.ts","../src/EventBus.ts","../src/shape/Line.ts","../src/shape/Circle.ts","../src/shape/Grid.ts","../src/shape/Brush.ts","../src/shape/Eraser.ts","../src/shape/Ellipse.ts","../src/shape/Text.ts"],"sourcesContent":["import { createUuid } from \"../tools\"\n\ninterface ShapeProp {\n type: number\n [key: string]: any\n}\nexport default class Shape {\n /** 标签 */\n public label: string = ''\n /** 是否隐藏标签 */\n public hideLabel: boolean | undefined\n /** 坐标 */\n public coor: any[] = []\n /** 边线颜色 */\n public strokeStyle: string | undefined\n /** 填充颜色 */\n public fillStyle: string | undefined\n /** 边线宽度 */\n public lineWidth: number | undefined\n /** 标签填充颜色 */\n public labelFillStyle: string | undefined\n /** 标签文字颜色 */\n public textFillStyle: string | undefined\n /** 标签文字字体 */\n public labelFont: string | undefined\n /** 标注类型 */\n public type: number | undefined\n /** 当前是否处于活动状态 */\n public active: boolean = false\n /** 当前是否处于创建状态 */\n public creating: boolean = false\n /** 当前是否处于拖拽状态 */\n public dragging: boolean = false\n /** 索引 */\n public index: number\n /** 唯一标识 */\n public uuid: string = createUuid()\n /** 向上展示label */\n public labelUp: boolean | undefined\n /** 隐藏标注 */\n public hide: boolean | undefined\n constructor(item: ShapeProp, index: number) {\n this.index = index\n Object.assign(this, item)\n }\n}\n","import Rect from \"./shape/Rect\";\nimport Polygon from \"./shape/Polygon\";\nimport Dot from \"./shape/Dot\";\nimport EventBus from \"./EventBus\";\nimport Line from \"./shape/Line\";\nimport Circle from \"./shape/Circle\";\nimport Grid from \"./shape/Grid\";\nimport pkg from \"../package.json\";\nimport Brush from \"./shape/Brush\";\nimport Eraser from \"./shape/Eraser\";\nimport Ellipse from \"./shape/Ellipse\";\nimport Text from \"./shape/Text\";\n\nexport type Point = [number, number];\nexport type AllShape =\n | Rect\n | Polygon\n | Dot\n | Line\n | Circle\n | Grid\n | Brush\n | Eraser\n | Ellipse\n | Text;\nenum Shape {\n None,\n Rect,\n Polygon,\n Dot,\n Line,\n Circle,\n Grid,\n Brush,\n Eraser,\n Ellipse,\n Text,\n}\nexport default class CanvasSelect extends EventBus {\n /** 当前版本 */\n version = pkg.version;\n /** 只读模式,画布不允许任何交互 */\n lock: boolean = false;\n /** 只读模式,仅支持查看 */\n readonly: boolean = false;\n /** 最小矩形宽度 */\n MIN_WIDTH = 10;\n /** 最小矩形高度 */\n MIN_HEIGHT = 10;\n /** 最小圆形半径 */\n MIN_RADIUS = 5;\n /** 多边形最大点数 */\n MAX_POLYGON_POINTS = 6;\n /** 边线颜色 */\n strokeStyle = \"#0f0\";\n /** 填充颜色 */\n fillStyle = \"rgba(0, 0, 255, 0.1)\";\n /** 边线宽度 */\n lineWidth = 1;\n /** 当前选中的标注边线颜色 */\n activeStrokeStyle = \"#f00\";\n /** 当前选中的标注填充颜色 */\n activeFillStyle = \"rgba(0, 0, 255, 0.1)\";\n /** 控制点边线颜色 */\n ctrlStrokeStyle = \"#000\";\n /** 控制点填充颜色 */\n ctrlFillStyle = \"#fff\";\n /** 控制点半径 */\n ctrlRadius = 3;\n /** 是否隐藏标签 */\n hideLabel = false;\n /** 标签背景填充颜色 */\n labelFillStyle = \"#fff\";\n /** 标签字体 */\n labelFont = \"10px sans-serif\";\n /** 标签文字颜色 */\n textFillStyle = \"#000\";\n /** 标签字符最大长度,超出使用省略号 */\n labelMaxLen = 10;\n /** 画布宽度 */\n WIDTH = 0;\n maxPolygonPoint = 6; // 最大多边形点数\n /** 画布高度 */\n HEIGHT = 0;\n /** XY十字坐标 */\n crossX = new Line({}, 0, {});\n crossY = new Line({}, 1, {});\n crossStroke = \"#ff0\";\n /** 开启十字辅助 */\n showCross = false;\n /** 开启矩形旋转控制点 */\n showRotation = false;\n\n canvas: HTMLCanvasElement | undefined;\n\n ctx: CanvasRenderingContext2D | null | undefined;\n /** 所有标注数据 */\n dataset: AllShape[] = [];\n\n offScreen: HTMLCanvasElement | undefined;\n\n offScreenCtx: CanvasRenderingContext2D | null | undefined;\n\n // 放大镜相关配置 Start\n magnifierCanvas: HTMLCanvasElement | undefined;\n magnifierCtx: CanvasRenderingContext2D | undefined;\n // 默认展示放大镜\n isMagnifierVisible: boolean = false;\n // 放大镜位置,默认跟随鼠标\n magnifierPosition: Point | \"auto\" = \"auto\";\n // 放大镜相关配置 End\n\n /** 记录锚点距离 */\n remmber: number[][] = [];\n /** 记录鼠标位置 */\n mouse: Point = [0, 0];\n /** 记录背景图鼠标位移 */\n remmberOrigin: number[] = [0, 0];\n /** 0 不创建,1 矩形,2 多边形,3 点,4 折线,5 圆,6 网格 */\n createType: Shape = Shape.None; //\n /** 控制点索引 */\n ctrlIndex = -1;\n /** 背景图片 */\n image: HTMLImageElement = new Image();\n /** 图片原始宽度 */\n IMAGE_ORIGIN_WIDTH: number = 0;\n /** 图片缩放宽度 */\n IMAGE_WIDTH = 0;\n /** 图片原始高度 */\n IMAGE_ORIGIN_HEIGHT = 0;\n /** 图片缩放高度 */\n IMAGE_HEIGHT = 0;\n /** 原点x */\n originX = 0;\n /** 原点y */\n originY = 0;\n /** 缩放步长 */\n scaleStep = 0;\n /** 滚动缩放 */\n scrollZoom = true;\n\n private timer: any = null;\n /** 最小touch双击时间 */\n dblTouch = 300;\n /** 记录touch双击开始时间 */\n dblTouchStore = 0; //\n /** 这个选项可以帮助浏览器进行内部优化 */\n alpha = true;\n /** 专注模式 */\n focusMode = false;\n /** 触控缩放时记录上一次两点距离 */\n scaleTouchStore = 0;\n /** 当前是否为双指触控 */\n isTouch2 = false;\n isMobile = navigator.userAgent.includes(\"Mobile\");\n /** 向上展示label */\n labelUp = false;\n private isCtrlKey = false;\n /** 自定义ctrl快捷键 KeyboardEvent.code */\n ctrlCode = \"ControlLeft\";\n /** 网格右键菜单 */\n gridMenuEnable = true;\n /** 网格选中背景填充颜色 */\n gridSelectedFillStyle = \"rgba(255, 255, 0, 0.6)\";\n /** 画笔大小 */\n brushSize = 20;\n /** 画笔颜色 */\n brushStokeStyle = \"#f00\";\n /** 橡皮擦大小 */\n eraserSize = 20;\n /** 标注坐标 (以背景图片左上角为原点) */\n position: number[] = [0, 0];\n /**\n * @param el Valid CSS selector string, or DOM\n * @param src image src\n */\n constructor(el: HTMLCanvasElement | string, src?: string | HTMLImageElement) {\n super();\n this.handleLoad = this.handleLoad.bind(this);\n this.handleContextmenu = this.handleContextmenu.bind(this);\n this.handleMousewheel = this.handleMousewheel.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleDblclick = this.handleDblclick.bind(this);\n this.handleKeyup = this.handleKeyup.bind(this);\n this.handleKeydown = this.handleKeydown.bind(this);\n const container = typeof el === \"string\" ? document.querySelector(el) : el;\n if (container instanceof HTMLCanvasElement) {\n this.canvas = container;\n this.offScreen = document.createElement(\"canvas\");\n this.initSetting();\n this.initEvents();\n src && this.setImage(src);\n } else {\n console.warn(\"HTMLCanvasElement is required!\");\n }\n this.crossX.strokeStyle = this.crossStroke;\n this.crossY.strokeStyle = this.crossStroke;\n }\n\n /** 当前当前选中的标注 */\n get activeShape() {\n return this.dataset.find((x) => x.active) || ({} as any);\n }\n\n /** 当前缩放比例 */\n get scale() {\n if (this.IMAGE_ORIGIN_WIDTH && this.IMAGE_WIDTH) {\n return this.IMAGE_WIDTH / this.IMAGE_ORIGIN_WIDTH;\n }\n return 1;\n }\n\n /** 图片最小边尺寸 */\n get imageMin() {\n return Math.min(this.IMAGE_WIDTH, this.IMAGE_HEIGHT);\n }\n\n /** 图片原始最大边尺寸 */\n get imageOriginMax() {\n return Math.max(this.IMAGE_ORIGIN_WIDTH, this.IMAGE_ORIGIN_HEIGHT);\n }\n\n /** 创建放大镜容器 */\n createMagnifierCanvas() {\n if (this.isMagnifierVisible) {\n this.magnifierCanvas =\n this.magnifierCanvas || document.createElement(\"canvas\");\n this.magnifierCtx =\n this.magnifierCanvas &&\n (this.magnifierCanvas.getContext(\"2d\", {\n willReadFrequently: true,\n }) as CanvasRenderingContext2D);\n this.magnifierCanvas.style.position = \"fixed\";\n this.magnifierCanvas.style.pointerEvents = \"none\";\n this.magnifierCanvas.style.zIndex = \"1000\";\n this.magnifierCanvas.style.border = \"1px solid black\";\n this.magnifierCanvas.style.borderRadius = \"50%\";\n this.magnifierCanvas.style.width = \"100px\";\n this.magnifierCanvas.style.height = \"100px\";\n document.body.appendChild(this.magnifierCanvas);\n }\n }\n\n /** 创建放大镜 */\n createMagnifier(x: number, y: number) {\n if (!this.magnifierCanvas) {\n this.createMagnifierCanvas();\n } else {\n this.updateMagnifier(x, y);\n }\n }\n /** 更新放大镜 */\n updateMagnifier(x: number, y: number) {\n if (this.canvas && this.magnifierCanvas && this.magnifierCtx) {\n const magnifierSize = 100;\n const dpr = window.devicePixelRatio || 1;\n this.magnifierCanvas.width = magnifierSize;\n this.magnifierCanvas.height = magnifierSize;\n this.magnifierCtx.clearRect(0, 0, magnifierSize, magnifierSize);\n\n // 放大镜位置\n if (this.magnifierPosition && this.magnifierPosition.length === 2) {\n const [mx, my] = this.magnifierPosition;\n this.magnifierCanvas.style.left = `${mx}px`;\n this.magnifierCanvas.style.top = `${my}px`;\n } else {\n this.magnifierCanvas.style.left = `${x + 10}px`;\n this.magnifierCanvas.style.top = `${y + 10}px`;\n }\n\n const originImageData = this.getImageDataFromCanvas(this.canvas, [\n x * dpr - magnifierSize / 2,\n y * dpr - magnifierSize / 2,\n magnifierSize,\n magnifierSize,\n ]);\n // 新的像素信息对象\n const areaImageData = this.magnifierCanvas\n .getContext(\"2d\", { willReadFrequently: true })\n ?.createImageData(\n this.magnifierCanvas.width,\n this.magnifierCanvas.height\n );\n\n if (areaImageData && originImageData) {\n let count = 0;\n for (let j = 0; j < magnifierSize; j += 1) {\n for (let i = 0; i < magnifierSize; i += 1) {\n for (let k = j; k < j + 1; k++) {\n for (let m = i; m < i + 1; m++) {\n const index = (k * magnifierSize + m) * 4;\n areaImageData.data[index] = originImageData.data[count];\n areaImageData.data[index + 1] = originImageData.data[count + 1];\n areaImageData.data[index + 2] = originImageData.data[count + 2];\n areaImageData.data[index + 3] = originImageData.data[count + 3];\n }\n }\n count += 4;\n }\n }\n this.magnifierCanvas\n .getContext(\"2d\", { willReadFrequently: true })\n ?.putImageData(areaImageData, 0, 0);\n\n // 十字线 有需要可以加\n // this.magnifierCtx.strokeStyle = 'rgba(255, 0, 0, 0.7)';\n // this.magnifierCtx.lineWidth = 1;\n // this.magnifierCtx.beginPath();\n // this.magnifierCtx.moveTo(magnifierSize / 2, 0);\n // this.magnifierCtx.lineTo(magnifierSize / 2, magnifierSize);\n // this.magnifierCtx.moveTo(0, magnifierSize / 2);\n // this.magnifierCtx.lineTo(magnifierSize, magnifierSize / 2);\n // this.magnifierCtx.stroke();\n\n // // 绘制放大镜边框\n this.magnifierCtx.strokeStyle = \"rgba(0, 0, 0, 0.5)\";\n this.magnifierCtx.lineWidth = 2;\n this.magnifierCtx.strokeRect(0, 0, magnifierSize, magnifierSize);\n }\n }\n }\n\n /** 销毁放大镜 */\n private destroyMagnifier() {\n if (this.magnifierCanvas) {\n this.magnifierCanvas.remove();\n this.magnifierCanvas = undefined;\n this.magnifierCtx = undefined;\n }\n }\n\n /* 提取像素信息 */\n getImageDataFromCanvas(\n canvas: HTMLCanvasElement,\n [x, y, width, height]: [number, number, number, number]\n ) {\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n return context?.getImageData(x, y, width, height);\n }\n\n /** 合成事件 */\n public mergeEvent(e: TouchEvent | MouseEvent) {\n let mouseX = 0;\n let mouseY = 0;\n let mouseCX = 0;\n let mouseCY = 0;\n if (this.isMobile && (e as TouchEvent).touches) {\n const { clientX, clientY } = (e as TouchEvent).touches[0];\n const target = e.target as HTMLCanvasElement;\n const { left, top } = target.getBoundingClientRect();\n mouseX = Math.round(clientX - left);\n mouseY = Math.round(clientY - top);\n if ((e as TouchEvent).touches?.length === 2) {\n const { clientX: clientX1 = 0, clientY: clientY1 = 0 } =\n (e as TouchEvent).touches[1] || {};\n mouseCX = Math.round(\n Math.abs((clientX1 - clientX) / 2 + clientX) - left\n );\n mouseCY = Math.round(\n Math.abs((clientY1 - clientY) / 2 + clientY) - top\n );\n } else if ((e as TouchEvent).touches?.length === 1) {\n mouseCX = Math.round(clientX - left);\n mouseCY = Math.round(clientY - top);\n }\n } else {\n mouseX = (e as MouseEvent).offsetX;\n mouseY = (e as MouseEvent).offsetY;\n }\n return { ...e, mouseX, mouseY, mouseCX, mouseCY };\n }\n\n private handleLoad() {\n this.emit(\"load\", this.image.src);\n this.IMAGE_ORIGIN_WIDTH = this.IMAGE_WIDTH = this.image.width;\n this.IMAGE_ORIGIN_HEIGHT = this.IMAGE_HEIGHT = this.image.height;\n this.fitZoom();\n }\n\n private handleContextmenu(e: MouseEvent) {\n e.preventDefault();\n if (this.lock) return;\n }\n\n private handleMousewheel(e: WheelEvent) {\n e.preventDefault();\n e.stopPropagation();\n if (this.lock || !this.scrollZoom) return;\n const { mouseX, mouseY } = this.mergeEvent(e);\n this.mouse = [mouseX, mouseY];\n this.setScale(e.deltaY < 0, true);\n }\n\n private handleMouseDown(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n const { mouseX, mouseY, mouseCX, mouseCY } = this.mergeEvent(e);\n const offsetX = Math.round(mouseX / this.scale);\n const offsetY = Math.round(mouseY / this.scale);\n this.mouse =\n this.isMobile && (e as TouchEvent).touches?.length === 2\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n this.remmberOrigin = [mouseX - this.originX, mouseY - this.originY];\n if (\n (!this.isMobile && (e as MouseEvent).buttons === 1) ||\n (this.isMobile && (e as TouchEvent).touches?.length === 1)\n ) {\n // 鼠标左键\n const ctrls = this.activeShape.ctrlsData || [];\n this.ctrlIndex = ctrls.findIndex((coor: Point) =>\n this.isPointInCircle(this.mouse, coor, this.ctrlRadius)\n );\n if (this.ctrlIndex > -1 && !this.readonly) {\n // 点击到控制点\n const [x0, y0] = ctrls[this.ctrlIndex];\n if (\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length > 2 &&\n this.ctrlIndex === 0\n ) {\n this.handleDblclick(e);\n }\n this.remmber = [[offsetX - x0, offsetY - y0]];\n } else if (this.isInBackground(e)) {\n const nx = Math.round(offsetX - this.originX / this.scale);\n const ny = Math.round(offsetY - this.originY / this.scale);\n if (this.activeShape.creating && !this.readonly) {\n // 创建中\n if ([Shape.Polygon, Shape.Line].includes(this.activeShape.type)) {\n const [x, y] =\n this.activeShape.coor[this.activeShape.coor.length - 1];\n if (x !== offsetX && y !== offsetY) {\n this.activeShape.coor.push([nx, ny]);\n\n // 对于多边形,检查是否达到最大点数\n if (\n this.activeShape.type === Shape.Polygon &&\n this.MAX_POLYGON_POINTS &&\n this.activeShape.coor.length >= this.MAX_POLYGON_POINTS\n ) {\n console.log(\"@13131\");\n // 达到最大点数,自动完成绘制\n this.handleDblclick(e);\n }\n\n // 对于折线,检查是否达到2个点\n if (\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length >= 2\n ) {\n // 达到2个点,自动完成绘制\n this.handleDblclick(e);\n }\n }\n }\n } else if (\n this.createType !== Shape.None &&\n !this.readonly &&\n !this.isCtrlKey\n ) {\n // 开始创建\n let newShape;\n const curPoint: Point = [nx, ny];\n switch (this.createType) {\n case Shape.Rect:\n newShape = new Rect(\n { coor: [curPoint, curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Polygon:\n newShape = new Polygon(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Dot:\n newShape = new Dot({ coor: curPoint }, this.dataset.length, this);\n this.emit(\"add\", newShape);\n break;\n case Shape.Line:\n newShape = new Line(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Circle:\n newShape = new Circle(\n { coor: curPoint },\n this.dataset.length,\n this\n );\n console.log(newShape);\n newShape.creating = true;\n break;\n case Shape.Grid:\n newShape = new Grid(\n { coor: [curPoint, curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Brush:\n newShape = new Brush(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Eraser:\n newShape = new Eraser(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Text:\n newShape = new Text(\n { coor: [curPoint, curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n default:\n break;\n }\n if (newShape) {\n this.dataset.forEach((sp) => {\n sp.active = false;\n });\n newShape.active = true;\n this.dataset.push(newShape);\n }\n } else {\n // 是否点击到形状\n const [hitShapeIndex, hitShape] = this.hitOnShape(this.mouse);\n if (hitShapeIndex > -1 && hitShape) {\n hitShape.dragging = true;\n this.dataset.forEach(\n (item, i) => (item.active = i === hitShapeIndex)\n );\n this.dataset.splice(hitShapeIndex, 1);\n this.dataset.push(hitShape);\n if (!this.readonly) {\n this.remmber = [];\n if ([Shape.Dot, Shape.Circle].includes(hitShape.type)) {\n const [x, y] = hitShape.coor;\n this.remmber = [[offsetX - x, offsetY - y]];\n } else {\n hitShape.coor.forEach((pt: any) => {\n this.remmber.push([offsetX - pt[0], offsetY - pt[1]]);\n });\n }\n }\n this.emit(\"select\", hitShape);\n } else {\n this.activeShape.active = false;\n this.dataset.sort((a, b) => a.index - b.index);\n this.emit(\"select\", null);\n }\n }\n this.update();\n }\n } else if (\n (!this.isMobile && (e as MouseEvent).buttons === 2) ||\n (this.isMobile &&\n (e as TouchEvent).touches?.length === 3 &&\n !this.readonly)\n ) {\n // 鼠标右键\n if ([Shape.Grid].includes(this.activeShape.type) && this.gridMenuEnable) {\n const rowCol = prompt(\n \"x 行 y 列 x,y\",\n [this.activeShape.row, this.activeShape.col].join(\",\")\n );\n if (typeof rowCol === \"string\") {\n const [row, col] = rowCol.split(\",\");\n if (/^[1-9]\\d*$/.test(row) && /^[1-9]\\d*$/.test(col)) {\n this.activeShape.row = Number(row);\n this.activeShape.col = Number(col);\n this.update();\n }\n }\n }\n this.emit(\"contextmenu\", e);\n }\n }\n\n private handleMouseMove(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n const { mouseX, mouseY, mouseCX, mouseCY } = this.mergeEvent(e);\n const offsetX = Math.round(mouseX / this.scale);\n const offsetY = Math.round(mouseY / this.scale);\n if (!this.isCtrlKey && this.isInBackground(e)) {\n this.crossX.coor = [\n [offsetX - this.originX / this.scale, 0],\n [offsetX - this.originX / this.scale, this.image.height],\n ];\n this.crossY.coor = [\n [0, offsetY - this.originY / this.scale],\n [this.image.width, offsetY - this.originY / this.scale],\n ];\n } else {\n this.crossX.coor = [];\n this.crossY.coor = [];\n }\n this.mouse =\n this.isMobile && (e as TouchEvent).touches?.length === 2\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n const nx = Math.round(offsetX - this.originX / this.scale);\n const ny = Math.round(offsetY - this.originY / this.scale);\n this.position = [nx, ny];\n if (\n ((!this.isMobile && (e as MouseEvent).buttons === 1) ||\n (this.isMobile && (e as TouchEvent).touches?.length === 1)) &&\n this.activeShape.type\n ) {\n if (\n this.ctrlIndex > -1 &&\n this.remmber.length &&\n (this.isInBackground(e) || this.activeShape.type === Shape.Circle)\n ) {\n const [[x, y]] = this.remmber;\n // resize矩形或旋转\n if ([Shape.Rect, Shape.Grid].includes(this.activeShape.type)) {\n // 处理旋转控制点(索引8)\n if (this.ctrlIndex === 8) {\n const [centerX, centerY] = this.activeShape.center;\n const mouseX = offsetX - x;\n const mouseY = offsetY - y;\n const dx = mouseX - centerX;\n const dy = mouseY - centerY;\n this.activeShape.rotation = Math.atan2(dy, dx) + Math.PI / 2;\n } else {\n // 处理resize控制点\n const [[x0, y0], [x1, y1]] = this.activeShape.coor;\n let coor: Point[] = [];\n switch (this.ctrlIndex) {\n case 0:\n coor = [\n [offsetX - x, offsetY - y],\n [x1, y1],\n ];\n break;\n case 1:\n coor = [\n [x0, offsetY - y],\n [x1, y1],\n ];\n break;\n case 2:\n coor = [\n [x0, offsetY - y],\n [offsetX - x, y1],\n ];\n break;\n case 3:\n coor = [\n [x0, y0],\n [offsetX - x, y1],\n ];\n break;\n case 4:\n coor = [\n [x0, y0],\n [offsetX - x, offsetY - y],\n ];\n break;\n case 5:\n coor = [\n [x0, y0],\n [x1, offsetY - y],\n ];\n break;\n case 6:\n coor = [\n [offsetX - x, y0],\n [x1, offsetY - y],\n ];\n break;\n case 7:\n coor = [\n [offsetX - x, y0],\n [x1, y1],\n ];\n break;\n default:\n break;\n }\n let [[a0, b0], [a1, b1]] = coor;\n if (\n a0 < 0 ||\n a1 < 0 ||\n b0 < 0 ||\n b1 < 0 ||\n a1 > this.IMAGE_ORIGIN_WIDTH ||\n b1 > this.IMAGE_ORIGIN_HEIGHT\n ) {\n // 偶然触发 超出边界处理\n a0 < 0 && (a0 = 0);\n a1 < 0 && (a1 = 0);\n b0 < 0 && (b0 = 0);\n b1 < 0 && (b1 = 0);\n if (a1 > this.IMAGE_ORIGIN_WIDTH) {\n a1 = this.IMAGE_ORIGIN_WIDTH;\n }\n if (b1 > this.IMAGE_ORIGIN_HEIGHT) {\n b1 = this.IMAGE_ORIGIN_HEIGHT;\n }\n }\n\n if (a1 - a0 >= this.MIN_WIDTH && b1 - b0 >= this.MIN_HEIGHT) {\n this.activeShape.coor = [\n [a0, b0],\n [a1, b1],\n ];\n } else {\n this.emit(\n \"warn\",\n `Width cannot be less than ${this.MIN_WIDTH},Height cannot be less than${this.MIN_HEIGHT}。`\n );\n }\n }\n } else if (\n [Shape.Polygon, Shape.Line].includes(this.activeShape.type)\n ) {\n const newPoint = [nx, ny];\n this.activeShape.coor.splice(this.ctrlIndex, 1, newPoint);\n } else if (this.activeShape.type === Shape.Circle) {\n const nx = Math.round(offsetX - this.originX / this.scale);\n const newRadius = nx - this.activeShape.coor[0];\n if (newRadius >= this.MIN_RADIUS) this.activeShape.radius = newRadius;\n }\n if (this.isMagnifierVisible) {\n const [ux, uy] = this.isMobile\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n this.createMagnifier(ux, uy);\n }\n } else if (this.activeShape.dragging && !this.readonly) {\n // 拖拽\n // 拖拽点的时候,也需要触发放大镜\n if (this.isMagnifierVisible && this.activeShape.type === 3) {\n const [ux, uy] = this.isMobile\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n this.createMagnifier(ux, uy);\n }\n let coor = [];\n let noLimit = true;\n const w = this.IMAGE_ORIGIN_WIDTH || this.WIDTH;\n const h = this.IMAGE_ORIGIN_HEIGHT || this.HEIGHT;\n if ([Shape.Dot, Shape.Circle].includes(this.activeShape.type)) {\n const [t1, t2] = this.remmber[0];\n const x = offsetX - t1;\n const y = offsetY - t2;\n if (x < 0 || x > w || y < 0 || y > h) noLimit = false;\n coor = [x, y];\n } else {\n for (let i = 0; i < this.activeShape.coor.length; i++) {\n const tar = this.remmber[i];\n const x = offsetX - tar[0];\n const y = offsetY - tar[1];\n if (x < 0 || x > w || y < 0 || y > h) noLimit = false;\n coor.push([x, y]);\n }\n }\n if (noLimit) this.activeShape.coor = coor;\n } else if (this.activeShape.creating && this.isInBackground(e)) {\n // const x = Math.round(offsetX - this.originX / this.scale);\n // const y = Math.round(offsetY - this.originY / this.scale);\n // 创建矩形\n if ([Shape.Rect, Shape.Grid].includes(this.activeShape.type)) {\n this.activeShape.coor.splice(1, 1, [nx, ny]);\n } else if (this.activeShape.type === Shape.Circle) {\n const [x0, y0] = this.activeShape.coor;\n const r = Math.sqrt((x0 - nx) ** 2 + (y0 - ny) ** 2);\n this.activeShape.radius = r;\n } else if (\n [Shape.Brush, Shape.Eraser].includes(this.activeShape.type)\n ) {\n this.activeShape.coor.push([nx, ny]);\n }\n }\n this.update();\n } else if (\n [Shape.Polygon, Shape.Line].includes(this.activeShape.type) &&\n this.activeShape.creating\n ) {\n // 多边形添加点\n this.update();\n } else if (\n (!this.isMobile &&\n (e as MouseEvent).buttons === 2 &&\n (e as MouseEvent).which === 3) ||\n (this.isMobile &&\n (e as TouchEvent).touches?.length === 1 &&\n !this.isTouch2)\n ) {\n // 拖动背景\n this.originX = Math.round(mouseX - this.remmberOrigin[0]);\n this.originY = Math.round(mouseY - this.remmberOrigin[1]);\n this.update();\n } else if (this.isMobile && (e as TouchEvent).touches?.length === 2) {\n this.isTouch2 = true;\n const touch0 = (e as TouchEvent).touches[0];\n const touch1 = (e as TouchEvent).touches[1];\n const cur = this.scaleTouchStore;\n this.scaleTouchStore = Math.abs(\n (touch1.clientX - touch0.clientX) * (touch1.clientY - touch0.clientY)\n );\n this.setScale(this.scaleTouchStore > cur, true);\n } else {\n if (!this.isCtrlKey) {\n this.update();\n }\n }\n }\n\n private handleMouseUp(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n // 鼠标抬起则卸载放大器\n this.destroyMagnifier();\n if (this.isMobile) {\n if ((e as TouchEvent).touches?.length === 0) {\n this.isTouch2 = false;\n }\n if (Date.now() - this.dblTouchStore < this.dblTouch) {\n this.handleDblclick(e);\n return;\n }\n this.dblTouchStore = Date.now();\n }\n this.remmber = [];\n if (this.activeShape.type !== Shape.None && !this.isCtrlKey) {\n this.activeShape.dragging = false;\n if (this.activeShape.creating) {\n if ([Shape.Rect, Shape.Grid].includes(this.activeShape.type)) {\n const [[x0, y0], [x1, y1]] = this.activeShape.coor;\n if (\n Math.abs(x0 - x1) < this.MIN_WIDTH ||\n Math.abs(y0 - y1) < this.MIN_HEIGHT\n ) {\n this.dataset.pop();\n this.emit(\n \"warn\",\n `Width cannot be less than ${this.MIN_WIDTH},Height cannot be less than ${this.MIN_HEIGHT}`\n );\n } else {\n this.activeShape.coor = [\n [Math.min(x0, x1), Math.min(y0, y1)],\n [Math.max(x0, x1), Math.max(y0, y1)],\n ];\n this.activeShape.creating = false;\n this.emit(\"add\", this.activeShape);\n }\n } else if (this.activeShape.type === Shape.Circle) {\n if (this.activeShape.radius < this.MIN_RADIUS) {\n this.dataset.pop();\n this.emit(\"warn\", `Radius cannot be less than ${this.MIN_WIDTH}`);\n } else {\n this.activeShape.creating = false;\n this.emit(\"add\", this.activeShape);\n }\n } else if (\n [Shape.Brush, Shape.Eraser].includes(this.activeShape.type)\n ) {\n this.activeShape.creating = false;\n this.emit(\"add\", this.activeShape);\n }\n this.update();\n }\n }\n }\n\n private handleDblclick(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n if ([Shape.Polygon, Shape.Line].includes(this.activeShape.type)) {\n const canPolygon =\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length > 2;\n const canLine =\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length > 1;\n // 对于多边形,如果达到最大点数也允许完成\n const canPolygonByMaxPoints =\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length >= this.MAX_POLYGON_POINTS;\n // 对于折线,如果达到2个点也允许完成\n const canLineByTwoPoints =\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length >= 2;\n if (\n canPolygon ||\n canLine ||\n canPolygonByMaxPoints ||\n canLineByTwoPoints\n ) {\n this.emit(\"add\", this.activeShape);\n this.activeShape.creating = false;\n this.update();\n }\n } else if ([Shape.Grid].includes(this.activeShape.type)) {\n // 双击切换网格分区选中状态\n if (this.activeShape.active) {\n this.activeShape.gridRects.forEach(\n (rect: { coor: Point[]; index: number }) => {\n if (this.isPointInRect(this.mouse, rect.coor)) {\n const thisIndex = this.activeShape.selected.findIndex(\n (x: number) => rect.index === x\n );\n if (thisIndex > -1) {\n this.activeShape.selected.splice(thisIndex, 1);\n } else {\n this.activeShape.selected.push(rect.index);\n }\n }\n }\n );\n this.update();\n }\n }\n }\n private handleKeydown(e: KeyboardEvent) {\n if (e.code === this.ctrlCode) {\n this.isCtrlKey = true;\n }\n }\n\n private handleKeyup(e: KeyboardEvent) {\n if (e.code === this.ctrlCode) {\n this.isCtrlKey = false;\n }\n if (this.lock || document.activeElement !== document.body || this.readonly)\n return;\n if (this.activeShape.type) {\n if (\n [Shape.Polygon, Shape.Line].includes(this.activeShape.type) &&\n e.key === \"Escape\"\n ) {\n // 对于多边形,如果已经达到最大点数,不应该再删除点\n const isPolygonAtMaxPoints =\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length >= this.MAX_POLYGON_POINTS;\n // 对于折线,如果已经达到2个点,不应该再删除点\n const isLineAtTwoPoints =\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length >= 2;\n\n if (\n this.activeShape.coor.length > 1 &&\n this.activeShape.creating &&\n !isPolygonAtMaxPoints &&\n !isLineAtTwoPoints\n ) {\n this.activeShape.coor.pop();\n } else {\n this.deleteByIndex(this.activeShape.index);\n }\n this.update();\n } else if (e.key === \"Backspace\") {\n this.deleteByIndex(this.activeShape.index);\n }\n }\n }\n\n /** 初始化配置 */\n initSetting() {\n if (!this.canvas || !this.offScreen) return;\n const dpr = window.devicePixelRatio || 1;\n // 处理图片跨域问题\n this.image.crossOrigin = \"anonymous\";\n this.canvas.style.userSelect = \"none\";\n this.ctx = this.ctx || this.canvas.getContext(\"2d\", { alpha: this.alpha });\n this.WIDTH = this.canvas.clientWidth;\n this.HEIGHT = Math.round(this.canvas.clientHeight);\n this.canvas.width = this.WIDTH * dpr;\n this.canvas.height = this.HEIGHT * dpr;\n this.canvas.style.width = this.WIDTH + \"px\";\n this.canvas.style.height = this.HEIGHT + \"px\";\n this.offScreen.width = this.WIDTH;\n this.offScreen.height = this.HEIGHT;\n this.offScreenCtx =\n this.offScreenCtx ||\n this.offScreen.getContext(\"2d\", { willReadFrequently: true });\n this.ctx?.scale(dpr, dpr);\n }\n\n /** 初始化事件 */\n initEvents() {\n if (!this.canvas) return;\n this.image.addEventListener(\"load\", this.handleLoad);\n this.canvas.addEventListener(\"touchstart\", this.handleMouseDown);\n this.canvas.addEventListener(\"touchmove\", this.handleMouseMove);\n this.canvas.addEventListener(\"touchend\", this.handleMouseUp);\n this.canvas.addEventListener(\"contextmenu\", this.handleContextmenu);\n // @ts-ignore\n this.canvas.addEventListener(\"mousewheel\", this.handleMousewheel);\n this.canvas.addEventListener(\"wheel\", this.handleMousewheel);\n this.canvas.addEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.addEventListener(\"mousemove\", this.handleMouseMove);\n this.canvas.addEventListener(\"mouseup\", this.handleMouseUp);\n this.canvas.addEventListener(\"dblclick\", this.handleDblclick);\n document.body.addEventListener(\"keydown\", this.handleKeydown, true);\n document.body.addEventListener(\"keyup\", this.handleKeyup, true);\n }\n\n /**\n * 添加/切换图片\n * @param source 图片链接或图片对象\n */\n setImage(source: string | HTMLImageElement) {\n if (typeof source === \"string\") {\n this.image.src = source;\n } else {\n this.image = source;\n this.image.crossOrigin = \"anonymous\";\n if (this.image.complete) {\n this.handleLoad();\n } else {\n this.image.addEventListener(\"load\", this.handleLoad);\n }\n }\n }\n\n /**\n * 设置数据\n * @param data Array\n */\n setData(data: AllShape[]) {\n setTimeout(() => {\n const initdata: AllShape[] = [];\n data.forEach((item: any, index) => {\n if (Object.prototype.toString.call(item).includes(\"Object\")) {\n let shape: any;\n switch (item.type) {\n case Shape.Rect:\n shape = new Rect(item, index, this);\n break;\n case Shape.Polygon:\n shape = new Polygon(item, index, this);\n break;\n case Shape.Dot:\n shape = new Dot(item, index, this);\n break;\n case Shape.Line:\n shape = new Line(item, index, this);\n break;\n case Shape.Circle:\n shape = new Circle(item, index, this);\n break;\n case Shape.Grid:\n shape = new Grid(item, index, this);\n break;\n case Shape.Brush:\n shape = new Brush(item, index, this);\n break;\n case Shape.Eraser:\n shape = new Eraser(item, index, this);\n break;\n case Shape.Ellipse:\n shape = new Ellipse(item, index, this);\n break;\n case Shape.Text:\n console.log(\"SA加载\", item)\n shape = new Text(item, index, this);\n break;\n default:\n console.warn(\"Invalid shape\", item);\n break;\n }\n [\n Shape.Rect,\n Shape.Polygon,\n Shape.Dot,\n Shape.Line,\n Shape.Circle,\n Shape.Grid,\n Shape.Brush,\n Shape.Eraser,\n Shape.Ellipse,\n Shape.Text,\n ].includes(item.type) &&\n shape &&\n initdata.push(shape);\n } else {\n console.warn(\"Shape must be an enumerable Object.\", item);\n }\n });\n this.dataset = initdata;\n this.update();\n });\n }\n\n /**\n * 判断是否在标注实例上\n * @param mousePoint 点击位置\n * @returns\n */\n hitOnShape(mousePoint: Point): [number, AllShape] {\n let hitShapeIndex = -1;\n let hitShape: any;\n for (let i = this.dataset.length - 1; i > -1; i--) {\n const shape = this.dataset[i];\n if (shape.hide) continue;\n if (\n (shape.type === Shape.Dot &&\n this.isPointInCircle(\n mousePoint,\n shape.coor as Point,\n this.ctrlRadius\n )) ||\n (shape.type === Shape.Circle &&\n this.isPointInCircle(\n mousePoint,\n shape.coor as Point,\n (shape as Circle).radius * this.scale\n )) ||\n (shape.type === Shape.Rect &&\n this.isPointInRect(mousePoint, (shape as Rect).coor)) ||\n (shape.type === Shape.Polygon &&\n this.isPointInPolygon(mousePoint, (shape as Polygon).coor)) ||\n (shape.type === Shape.Line &&\n this.isPointInLine(mousePoint, (shape as Line).coor)) ||\n (shape.type === Shape.Grid &&\n this.isPointInRect(mousePoint, (shape as Grid).coor)) ||\n (shape.type === Shape.Text &&\n this.isPointInRect(mousePoint, (shape as Text).coor))\n ) {\n if (this.focusMode && !shape.active) continue;\n hitShapeIndex = i;\n hitShape = shape;\n break;\n }\n }\n return [hitShapeIndex, hitShape];\n }\n\n /**\n * 判断鼠标是否在背景图内部\n * @param e MouseEvent\n * @returns 布尔值\n */\n isInBackground(e: MouseEvent | TouchEvent): boolean {\n const { mouseX, mouseY } = this.mergeEvent(e);\n return (\n mouseX >= this.originX &&\n mouseY >= this.originY &&\n mouseX <= this.originX + this.IMAGE_ORIGIN_WIDTH * this.scale &&\n mouseY <= this.originY + this.IMAGE_ORIGIN_HEIGHT * this.scale\n );\n }\n\n /**\n * 判断是否在矩形内\n * @param point 坐标\n * @param coor 区域坐标\n * @returns 布尔值\n */\n isPointInRect(point: Point, coor: Point[]): boolean {\n const [x, y] = point;\n const [[x0, y0], [x1, y1]] = coor.map((a) => a.map((b) => b * this.scale));\n return (\n x0 + this.originX <= x &&\n x <= x1 + this.originX &&\n y0 + this.originY <= y &&\n y <= y1 + this.originY\n );\n }\n\n /**\n * 判断是否在多边形内\n * @param point 坐标\n * @param coor 区域坐标\n * @returns 布尔值\n */\n isPointInPolygon(point: Point, coor: Point[]): boolean {\n if (!this.offScreenCtx) return false;\n this.offScreenCtx.save();\n this.offScreenCtx.clearRect(0, 0, this.WIDTH, this.HEIGHT);\n this.offScreenCtx.translate(this.originX, this.originY);\n this.offScreenCtx.beginPath();\n coor.forEach((pt, i) => {\n const [x, y] = pt.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.offScreenCtx?.moveTo(x, y);\n } else {\n this.offScreenCtx?.lineTo(x, y);\n }\n });\n this.offScreenCtx.closePath();\n this.offScreenCtx.fill();\n const areaData = this.offScreenCtx.getImageData(\n 0,\n 0,\n this.WIDTH,\n this.HEIGHT\n );\n const index = (point[1] - 1) * this.WIDTH * 4 + point[0] * 4;\n this.offScreenCtx.restore();\n return areaData.data[index + 3] !== 0;\n }\n\n /**\n * 判断是否在圆内\n * @param point 坐标\n * @param center 圆心\n * @param r 半径\n * @param needScale 是否为圆形点击检测\n * @returns 布尔值\n */\n isPointInCircle(point: Point, center: Point, r: number): boolean {\n const [x, y] = point;\n const [x0, y0] = center.map((a) => a * this.scale);\n const distance = Math.sqrt(\n (x0 + this.originX - x) ** 2 + (y0 + this.originY - y) ** 2\n );\n return distance <= r;\n }\n\n /**\n * 判断是否在折线内\n * @param point 坐标\n * @param coor 区域坐标\n * @returns 布尔值\n */\n isPointInLine(point: Point, coor: Point[]): boolean {\n if (!this.offScreenCtx) return false;\n this.offScreenCtx.save();\n this.offScreenCtx.clearRect(0, 0, this.WIDTH, this.HEIGHT);\n this.offScreenCtx.translate(this.originX, this.originY);\n this.offScreenCtx.lineWidth = this.lineWidth > 5 ? this.lineWidth : 5;\n this.offScreenCtx.beginPath();\n coor.forEach((pt, i) => {\n const [x, y] = pt.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.offScreenCtx?.moveTo(x, y);\n } else {\n this.offScreenCtx?.lineTo(x, y);\n }\n });\n this.offScreenCtx.stroke();\n const areaData = this.offScreenCtx.getImageData(\n 0,\n 0,\n this.WIDTH,\n this.HEIGHT\n );\n const index = (point[1] - 1) * this.WIDTH * 4 + point[0] * 4;\n this.offScreenCtx.restore();\n return areaData.data[index + 3] !== 0;\n }\n\n /**\n * 绘制矩形\n * @param shape 标注实例\n * @returns\n */\n drawRect(shape: Rect, sub?: Record<string, any>) {\n if (!this.ctx || shape.coor.length !== 2) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n creating,\n coor,\n lineWidth,\n rotation,\n } = shape;\n const [[x0, y0], [x1, y1]] = coor.map((a: Point) =>\n a.map((b) => Math.round(b * this.scale))\n );\n const centerX = (x0 + x1) / 2;\n const centerY = (y0 + y1) / 2;\n const w = x1 - x0;\n const h = y1 - y0;\n\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n if (sub?.isSelected) {\n this.ctx.fillStyle = sub?.selectedFillStyle || fillStyle;\n } else {\n this.ctx.fillStyle =\n active || creating ? this.activeFillStyle : fillStyle;\n }\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n\n // 应用旋转\n this.ctx.translate(centerX, centerY);\n this.ctx.rotate(rotation);\n this.ctx.translate(-centerX, -centerY);\n\n if (!creating) this.ctx.fillRect(x0, y0, w, h);\n this.ctx.strokeRect(x0, y0, w, h);\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制多边形\n * @param shape 标注实例\n */\n drawPolygon(shape: Polygon) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n creating,\n coor,\n lineWidth,\n } = shape;\n this.ctx.save();\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n\n // 如果正在创建且达到了最大点数,则自动闭合\n const shouldClose = creating && coor.length >= this.MAX_POLYGON_POINTS;\n\n if (creating && !shouldClose) {\n const [x, y] = this.mouse || [];\n this.ctx.lineTo(x - this.originX, y - this.originY);\n } else if (coor.length > 2 || shouldClose) {\n this.ctx.closePath();\n }\n this.ctx.fill();\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制点\n * @param shape 标注实例\n */\n drawDot(shape: Dot) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n creating,\n fillStyle = \"\",\n active,\n coor,\n lineWidth,\n } = shape;\n const [x, y] = coor.map((a) => a * this.scale);\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle = active ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n this.ctx.arc(x, y, this.ctrlRadius, 0, 2 * Math.PI, true);\n this.ctx.fill();\n this.ctx.arc(x, y, this.ctrlRadius, 0, 2 * Math.PI, true);\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(coor as Point, shape);\n }\n\n /**\n * 绘制圆\n * @param shape 标注实例\n */\n drawCirle(shape: Circle) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n coor,\n creating,\n radius,\n ctrlsData,\n lineWidth,\n } = shape;\n const [x, y] = coor.map((a) => a * this.scale);\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n this.ctx.arc(x, y, radius * this.scale, 0, 2 * Math.PI, true);\n this.ctx.fill();\n this.ctx.arc(x, y, radius * this.scale, 0, 2 * Math.PI, true);\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(ctrlsData[0] as Point, shape);\n }\n\n /**\n * 绘制椭圆\n * @param shape 标注实例\n */\n drawEllipse(shape: Ellipse) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n coor,\n creating,\n radiusX,\n radiusY,\n rotation,\n lineWidth,\n } = shape;\n const [x, y] = coor.map((a) => a * this.scale);\n const scaledRadiusX = radiusX * this.scale;\n const scaledRadiusY = radiusY * this.scale;\n\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n\n this.ctx.beginPath();\n // 使用 ellipse 方法绘制椭圆\n this.ctx.ellipse(\n x,\n y,\n scaledRadiusX,\n scaledRadiusY,\n rotation,\n 0,\n 2 * Math.PI,\n true\n );\n this.ctx.fill();\n this.ctx.ellipse(\n x,\n y,\n scaledRadiusX,\n scaledRadiusY,\n rotation,\n 0,\n 2 * Math.PI,\n true\n );\n this.ctx.stroke();\n\n this.ctx.restore();\n this.drawLabel(shape.ctrlsData[0] as Point, shape);\n }\n\n /**\n * 绘制文本\n * @param shape 标注实例\n */\n drawText(shape: Text) {\n if (!this.ctx || shape.coor.length !== 2) return;\n\n const {\n text = \"\",\n fontSize = 14,\n fontFamily = \"sans-serif\",\n textColor = \"#000000\",\n backgroundColor = \"transparent\",\n borderColor = \"transparent\",\n borderWidth = 0,\n borderRadius = 0,\n padding = 4,\n active,\n creating,\n coor,\n lineWidth,\n } = shape;\n\n const [[x0, y0], [x1, y1]] = coor.map((a: Point) =>\n a.map((b) => Math.round(b * this.scale))\n );\n\n const x = Math.min(x0, x1);\n const y = Math.min(y0, y1);\n const width = Math.abs(x1 - x0);\n const height = Math.abs(y1 - y0);\n\n this.ctx.save();\n\n // 设置样式\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n\n // 绘制背景\n if (backgroundColor && backgroundColor !== \"transparent\") {\n this.ctx.fillStyle = backgroundColor;\n if (borderRadius > 0) {\n this.drawRoundedRect(x, y, width, height, borderRadius);\n this.ctx.fill();\n } else {\n this.ctx.fillRect(x, y, width, height);\n }\n }\n\n // 绘制边框\n if (borderWidth > 0 && borderColor && borderColor !== \"transparent\") {\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (borderRadius > 0) {\n this.drawRoundedRect(x, y, width, height, borderRadius);\n this.ctx.stroke();\n } else {\n this.ctx.strokeRect(x, y, width, height);\n }\n }\n\n // 绘制文本\n if (text) {\n this.ctx.font = `${fontSize * this.scale}px ${fontFamily}`;\n this.ctx.fillStyle = textColor;\n this.ctx.textAlign = \"left\";\n this.ctx.textBaseline = \"top\";\n\n // 计算文本位置(考虑padding)\n const textX = x + padding * this.scale;\n const textY = y + padding * this.scale;\n const maxWidth = width - 2 * padding * this.scale;\n\n // 如果文本超出了宽度,需要截断\n this.ctx.fillText(text, textX, textY, maxWidth);\n }\n\n this.ctx.restore();\n\n // 绘制标签\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制圆角矩形\n * @param x x坐标\n * @param y y坐标\n * @param width 宽度\n * @param height 高度\n * @param radius 圆角半径\n */\n drawRoundedRect(\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number\n ) {\n if (!this.ctx) return;\n\n this.ctx.beginPath();\n this.ctx.moveTo(x + radius, y);\n this.ctx.lineTo(x + width - radius, y);\n this.ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n this.ctx.lineTo(x + width, y + height - radius);\n this.ctx.quadraticCurveTo(\n x + width,\n y + height,\n x + width - radius,\n y + height\n );\n this.ctx.lineTo(x + radius, y + height);\n this.ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n this.ctx.lineTo(x, y + radius);\n this.ctx.quadraticCurveTo(x, y, x + radius, y);\n this.ctx.closePath();\n }\n\n /**\n * 绘制折线\n * @param shape 标注实例\n */\n drawLine(shape: Line) {\n if (!this.ctx) return;\n const { strokeStyle = \"\", active, creating, coor, lineWidth } = shape;\n this.ctx.save();\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n\n // 如果正在创建且达到了2个点,则自动结束\n const shouldEnd = creating && coor.length >= 2;\n\n if (creating && !shouldEnd) {\n const [x, y] = this.mouse || [];\n this.ctx.lineTo(x - this.originX, y - this.originY);\n } else if (coor.length > 1) {\n // 折线达到2个点后自动结束绘制\n }\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制网格\n * @param shape 标注实例\n * @returns\n */\n drawGrid(shape: Grid) {\n if (!this.ctx) return;\n if (shape.coor.length !== 2) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n creating,\n coor,\n lineWidth,\n } = shape;\n const [[x0, y0], [x1, y1]] = coor.map((a: Point) =>\n a.map((b) => Math.round(b * this.scale))\n );\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n shape.gridRects.forEach((rect: Rect, m) => {\n this.drawRect(rect, {\n selectedFillStyle:\n shape.selectedFillStyle || this.gridSelectedFillStyle,\n isSelected: shape.selected?.includes(m),\n });\n });\n const w = x1 - x0;\n const h = y1 - y0;\n if (!creating) this.ctx.fillRect(x0, y0, w, h);\n this.ctx.strokeRect(x0, y0, w, h);\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n /**\n * 绘制画笔路径\n * @param shape 形状\n */\n drawBrushPath(shape: Brush) {\n if (!this.ctx) return;\n const { coor, brushSize = 1, brushStokeStyle = \"\" } = shape;\n this.ctx.save();\n this.ctx.globalCompositeOperation = \"source-over\"; // 正常绘制模式\n this.ctx.lineCap = \"round\";\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = Math.round(brushSize * this.scale);\n this.ctx.strokeStyle = brushStokeStyle;\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n this.ctx.stroke();\n this.ctx.restore();\n }\n /**\n * 绘制橡皮擦路径\n * @param coor 折线坐标\n * @param shape 形状\n */\n drawEraserPath(shape: Eraser) {\n if (!this.ctx) return;\n const { coor, eraserSize = 1 } = shape;\n this.ctx.save();\n this.ctx.globalCompositeOperation = \"destination-out\";\n this.ctx.lineCap = \"round\";\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = Math.round(eraserSize * this.scale);\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n this.ctx.stroke();\n this.ctx.restore();\n }\n /** 清除画布 */\n clearBrush() {\n const newDateset = this.dataset.filter(\n (el) => ![Shape.Brush, Shape.Eraser].includes(el.type)\n );\n this.setData(newDateset);\n }\n\n /**\n * 绘制控制点\n * @param point 坐标\n */\n drawCtrl(point: Point, color?: string) {\n if (!this.ctx) return;\n const [x, y] = point.map((a) => a * this.scale);\n this.ctx.save();\n this.ctx.beginPath();\n this.ctx.fillStyle = color || this.ctrlFillStyle;\n this.ctx.strokeStyle = this.ctrlStrokeStyle;\n this.ctx.arc(x, y, this.ctrlRadius, 0, 2 * Math.PI, true);\n this.ctx.fill();\n this.ctx.arc(x, y, this.ctrlRadius, 0, 2 * Math.PI, true);\n this.ctx.stroke();\n this.ctx.restore();\n }\n\n /**\n * 绘制控制点列表\n * @param shape 标注实例\n */\n drawCtrlList(shape: Rect | Polygon | Line | Circle | Ellipse | Text) {\n shape.ctrlsData.forEach((point, i) => {\n if (shape.type === Shape.Circle) {\n if (i === 1) this.drawCtrl(point);\n } else if (shape.type === Shape.Ellipse) {\n // 对于椭圆,绘制所有控制点\n this.drawCtrl(point);\n } else {\n this.drawCtrl(\n point,\n shape.type === Shape.Rect && i === 8 ? \"yellow\" : undefined\n );\n }\n });\n }\n\n /**\n * 绘制label\n * @param point 位置\n * @param label 文本\n */\n drawLabel(point: Point, shape: AllShape) {\n const {\n label = \"\",\n labelFillStyle = \"\",\n labelFont = \"\",\n textFillStyle = \"\",\n hideLabel,\n labelUp,\n lineWidth,\n } = shape;\n const isHideLabel =\n typeof hideLabel === \"boolean\" ? hideLabel : this.hideLabel;\n const isLabelUp = typeof labelUp === \"boolean\" ? labelUp : this.labelUp;\n const currLineWidth = lineWidth || this.lineWidth;\n\n if (this.ctx && label.length && !isHideLabel) {\n this.ctx.font = labelFont || this.labelFont;\n const textPaddingLeft = 4;\n const textPaddingTop = 4;\n const newText =\n label.length < this.labelMaxLen + 1\n ? label\n : `${label.slice(0, this.labelMaxLen)}...`;\n const text = this.ctx.measureText(newText);\n const font = parseInt(this.ctx.font) - 4;\n const labelWidth = text.width + textPaddingLeft * 2;\n const labelHeight = font + textPaddingTop * 2;\n\n let [x, y] = point.map((a) => a * this.scale);\n\n // 对于矩形,如果存在旋转角度,需要调整label位置\n if (shape.type === Shape.Rect && (shape as Rect).rotation !== 0) {\n const rect = shape as Rect;\n const [[x0, y0], [x1, y1]] = rect.coor;\n const centerX = ((x0 + x1) / 2) * this.scale;\n const centerY = ((y0 + y1) / 2) * this.scale;\n\n // 将左上角点转换为相对于中心点的坐标\n const dx = x - centerX;\n const dy = y - centerY;\n\n // 应用旋转\n const rotatedX =\n dx * Math.cos(rect.rotation) - dy * Math.sin(rect.rotation);\n const rotatedY =\n dx * Math.sin(rect.rotation) + dy * Math.cos(rect.rotation);\n\n // 转换回绝对坐标\n x = rotatedX + centerX;\n y = rotatedY + centerY;\n }\n\n const toleft =\n this.IMAGE_ORIGIN_WIDTH - point[0] < labelWidth / this.scale;\n const toTop =\n this.IMAGE_ORIGIN_HEIGHT - point[1] < labelHeight / this.scale;\n const toTop2 = point[1] > labelHeight / this.scale;\n const isup = isLabelUp ? toTop2 : toTop;\n this.ctx.save();\n this.ctx.fillStyle = labelFillStyle || this.labelFillStyle;\n this.ctx.fillRect(\n toleft\n ? x - text.width - textPaddingLeft - currLineWidth / 2\n : x + currLineWidth / 2,\n isup ? y - labelHeight - currLineWidth / 2 : y + currLineWidth / 2,\n labelWidth,\n labelHeight\n );\n this.ctx.fillStyle = textFillStyle || this.textFillStyle;\n this.ctx.fillText(\n newText,\n toleft ? x - text.width : x + textPaddingLeft + currLineWidth / 2,\n isup\n ? y - labelHeight + font + textPaddingTop\n : y + font + textPaddingTop + currLineWidth / 2,\n 180\n );\n this.ctx.restore();\n }\n }\n\n /**\n * 更新画布\n */\n update() {\n window.cancelAnimationFrame(this.timer);\n this.timer = window.requestAnimationFrame(() => {\n if (!this.ctx) return;\n this.ctx.save();\n this.ctx.clearRect(0, 0, this.WIDTH, this.HEIGHT);\n this.ctx.translate(this.originX, this.originY);\n\n const renderList = this.focusMode\n ? this.activeShape.type\n ? [this.activeShape]\n : []\n : this.dataset;\n const BrushAndErasers = renderList.filter(\n (item) => item.type === Shape.Brush || item.type === Shape.Eraser\n );\n for (let i = 0; i < BrushAndErasers.length; i++) {\n const shape = BrushAndErasers[i];\n if (shape.hide) continue;\n switch (shape.type) {\n case Shape.Brush:\n shape.brushSize = shape.brushSize ?? this.brushSize;\n shape.brushStokeStyle =\n shape.brushStokeStyle ?? this.brushStokeStyle;\n this.drawBrushPath(shape as Brush);\n break;\n case Shape.Eraser:\n shape.eraserSize = shape.eraserSize ?? this.eraserSize;\n this.drawEraserPath(shape as Eraser);\n break;\n default:\n break;\n }\n }\n const NormalShapes = renderList.filter(\n (item) => item.type !== Shape.Brush && item.type !== Shape.Eraser\n );\n for (let i = 0; i < NormalShapes.length; i++) {\n const shape = NormalShapes[i];\n if (shape.hide) continue;\n switch (shape.type) {\n case Shape.Rect:\n this.drawRect(shape as Rect);\n break;\n case Shape.Polygon:\n this.drawPolygon(shape as Polygon);\n break;\n case Shape.Dot:\n this.drawDot(shape as Dot);\n break;\n case Shape.Line:\n this.drawLine(shape as Line);\n break;\n case Shape.Circle:\n this.drawCirle(shape as Circle);\n break;\n case Shape.Ellipse:\n this.drawEllipse(shape as Ellipse);\n break;\n case Shape.Grid:\n this.drawGrid(shape as Grid);\n break;\n case Shape.Text:\n this.drawText(shape as Text);\n break;\n default:\n break;\n }\n }\n if (!this.isCtrlKey && this.showCross) {\n this.drawLine(this.crossX);\n this.drawLine(this.crossY);\n }\n if (\n [\n Shape.Rect,\n Shape.Polygon,\n Shape.Line,\n Shape.Circle,\n Shape.Grid,\n Shape.Ellipse,\n Shape.Text,\n ].includes(this.activeShape.type) &&\n !this.activeShape.hide\n ) {\n this.drawCtrlList(this.activeShape);\n }\n this.ctx.globalCompositeOperation = \"destination-over\";\n if (this.IMAGE_WIDTH && this.IMAGE_HEIGHT) {\n this.ctx.drawImage(\n this.image,\n 0,\n 0,\n this.IMAGE_WIDTH,\n this.IMAGE_HEIGHT\n );\n }\n this.ctx.globalCompositeOperation = \"source-over\";\n this.ctx.restore();\n this.emit(\"updated\", this.dataset);\n });\n }\n\n /**\n * 通过索引删除指定形状\n * @param index number\n */\n deleteByIndex(index: number) {\n const num = this.dataset.findIndex((x) => x.index === index);\n if (num > -1) {\n this.emit(\"delete\", this.dataset[num]);\n this.dataset.splice(num, 1);\n this.dataset.forEach((item, i) => {\n item.index = i;\n });\n this.update();\n }\n }\n\n /**\n * 通过uuid删除指定形状\n * @param index string\n */\n deleteByUuid(uuid: string) {\n const target = this.dataset.find((x) => x.uuid === uuid);\n if (target) {\n this.emit(\"delete\", target);\n this.dataset = this.dataset.filter((x) => x.uuid !== uuid);\n this.update();\n }\n }\n\n /**\n * 计算缩放步长\n */\n calcStep(flag = \"\") {\n if (this.IMAGE_WIDTH < this.WIDTH && this.IMAGE_HEIGHT < this.HEIGHT) {\n if (flag === \"\" || flag === \"b\") {\n this.setScale(true, false, true);\n this.calcStep(\"b\");\n }\n }\n if (this.IMAGE_WIDTH > this.WIDTH || this.IMAGE_HEIGHT > this.HEIGHT) {\n if (flag === \"\" || flag === \"s\") {\n this.setScale(false, false, true);\n this.calcStep(\"s\");\n }\n }\n }\n\n /**\n * 缩放\n * @param type true放大5%,false缩小5%\n * @param center 缩放中心 center|mouse\n * @param pure 不绘制\n */\n setScale(type: boolean, byMouse = false, pure = false) {\n if (this.lock) return;\n if (\n (!type && this.imageMin < 20) ||\n (type && this.IMAGE_WIDTH > this.imageOriginMax * 100)\n )\n return;\n if (type) {\n this.scaleStep++;\n } else {\n this.scaleStep--;\n }\n let realToLeft = 0;\n let realToRight = 0;\n const [x, y] = this.mouse || [];\n if (byMouse) {\n realToLeft = (x - this.originX) / this.scale;\n realToRight = (y - this.originY) / this.scale;\n }\n const abs = Math.abs(this.scaleStep);\n const width = this.IMAGE_WIDTH;\n\n this.IMAGE_WIDTH = Math.round(\n this.IMAGE_ORIGIN_WIDTH * (this.scaleStep >= 0 ? 1.05 : 0.95) ** abs\n );\n this.IMAGE_HEIGHT = Math.round(\n this.IMAGE_ORIGIN_HEIGHT * (this.scaleStep >= 0 ? 1.05 : 0.95) ** abs\n );\n if (byMouse) {\n this.originX = x - realToLeft * this.scale;\n this.originY = y - realToRight * this.scale;\n } else {\n const scale = this.IMAGE_WIDTH / width;\n this.originX = this.WIDTH / 2 - (this.WIDTH / 2 - this.originX) * scale;\n this.originY = this.HEIGHT / 2 - (this.HEIGHT / 2 - this.originY) * scale;\n }\n if (!pure) {\n this.update();\n }\n }\n\n /**\n * 适配背景图\n */\n fitZoom() {\n this.calcStep();\n if (this.IMAGE_HEIGHT / this.IMAGE_WIDTH >= this.HEIGHT / this.WIDTH) {\n this.IMAGE_WIDTH =\n this.IMAGE_ORIGIN_WIDTH / (this.IMAGE_ORIGIN_HEIGHT / this.HEIGHT);\n this.IMAGE_HEIGHT = this.HEIGHT;\n } else {\n this.IMAGE_WIDTH = this.WIDTH;\n this.IMAGE_HEIGHT =\n this.IMAGE_ORIGIN_HEIGHT / (this.IMAGE_ORIGIN_WIDTH / this.WIDTH);\n }\n this.originX = (this.WIDTH - this.IMAGE_WIDTH) / 2;\n this.originY = (this.HEIGHT - this.IMAGE_HEIGHT) / 2;\n this.update();\n }\n\n /**\n * 设置专注模式\n * @param type {boolean}\n */\n setFocusMode(type: boolean) {\n this.focusMode = type;\n this.update();\n }\n\n /**\n * 销毁\n */\n destroy() {\n if (!this.canvas) return;\n this.image.removeEventListener(\"load\", this.handleLoad);\n this.canvas.removeEventListener(\"contextmenu\", this.handleContextmenu);\n // @ts-ignore\n this.canvas.removeEventListener(\"mousewheel\", this.handleMousewheel);\n this.canvas.removeEventListener(\"wheel\", this.handleMousewheel);\n this.canvas.removeEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.removeEventListener(\"touchend\", this.handleMouseDown);\n this.canvas.removeEventListener(\"mousemove\", this.handleMouseMove);\n this.canvas.removeEventListener(\"touchmove\", this.handleMouseMove);\n this.canvas.removeEventListener(\"mouseup\", this.handleMouseUp);\n this.canvas.removeEventListener(\"touchend\", this.handleMouseUp);\n this.canvas.removeEventListener(\"dblclick\", this.handleDblclick);\n document.body.removeEventListener(\"keydown\", this.handleKeydown, true);\n document.body.removeEventListener(\"keyup\", this.handleKeyup, true);\n this.canvas.width = this.WIDTH;\n this.canvas.height = this.HEIGHT;\n this.canvas.style.width = \"\";\n this.canvas.style.height = \"\";\n this.canvas.style.userSelect = \"\";\n }\n\n /**\n * 重新设置画布大小\n */\n resize() {\n if (!this.canvas) return;\n this.canvas.removeAttribute(\"width\");\n this.canvas.removeAttribute(\"height\");\n this.canvas.style.width = \"\";\n this.canvas.style.height = \"\";\n this.initSetting();\n this.update();\n }\n}\n","export function createUuid(): string {\n const s: any[] = [];\n const hexDigits = \"0123456789abcdef\";\n for (let i = 0; i < 36; i++) {\n const m = Math.floor(Math.random() * 0x10);\n s[i] = hexDigits.slice(m, m + 1);\n }\n s[14] = \"4\";\n const n = (s[19] & 0x3) | 0x8;\n s[19] = hexDigits.slice(n, n + 1);\n s[8] = s[13] = s[18] = s[23] = \"-\";\n const uuid = s.join(\"\");\n return uuid;\n}\n","import Shape from './Shape';\n\nexport default class Rect extends Shape {\n public type = 1\n /** 旋转角度(弧度) */\n public rotation: number = 0\n /** 是否显示旋转控制点 */\n public showRotation: boolean | undefined\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.lineWidth = item.lineWidth ?? base.lineWidth\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n this.showRotation = item.showRotation ?? base.showRotation\n }\n get ctrlsData() {\n const [[x0, y0], [x1, y1]] = this.coor;\n const centerX = (x0 + x1) / 2;\n const centerY = (y0 + y1) / 2;\n const width = x1 - x0;\n const height = y1 - y0;\n\n // 基础控制点(8个边角和中点控制点)\n const baseCtrls = [\n [x0, y0],\n [x0 + width / 2, y0],\n [x1, y0],\n [x1, y0 + height / 2],\n [x1, y1],\n [x0 + width / 2, y1],\n [x0, y1],\n [x0, y0 + height / 2]\n ];\n\n // 如果需要显示旋转控制点,则添加到控制点数组中\n if (this.showRotation) {\n baseCtrls.push([centerX, y0 - 20, 'green']);\n }\n\n // 如果矩形没有旋转,直接返回控制点\n if (this.rotation === 0) {\n return baseCtrls;\n }\n\n // 应用旋转变换到所有控制点\n return baseCtrls.map(([x, y]) => {\n // 将点转换为相对于中心点的坐标\n const dx = x - centerX;\n const dy = y - centerY;\n\n // 应用旋转\n const rotatedX = dx * Math.cos(this.rotation) - dy * Math.sin(this.rotation);\n const rotatedY = dx * Math.sin(this.rotation) + dy * Math.cos(this.rotation);\n\n // 转换回绝对坐标\n return [rotatedX + centerX, rotatedY + centerY];\n });\n }\n\n /** 获取矩形的中心点 */\n get center(): [number, number] {\n const [[x0, y0], [x1, y1]] = this.coor;\n return [(x0 + x1) / 2, (y0 + y1) / 2];\n }\n}\n","import Shape from './Shape';\n\nexport default class Polygon extends Shape {\n public type = 2\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n get ctrlsData() {\n return this.coor.length > 2 ? this.coor : [];\n }\n}\n","import Shape from './Shape';\n\nexport default class Dot extends Shape {\n public type = 3\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n}\n","export default class EventBus {\n private _eventTree: Record<string, any> = {}\n /**\n * 注册事件\n * @param eventName 事件名称\n * @param cb 回调方法\n */\n on(eventName: string, cb: Function) {\n const fns = this._eventTree[eventName];\n if (Array.isArray(fns)) {\n fns.push(cb);\n } else {\n this._eventTree[eventName] = [cb];\n }\n }\n\n /**\n * 触发事件\n * @param eventName 事件名称\n * @param payload 传递参数\n */\n emit(eventName: string, ...payload: any) {\n const fns = this._eventTree[eventName];\n if (Array.isArray(fns)) {\n fns.forEach((fn) => fn(...payload));\n }\n }\n\n /**\n * 注销事件\n * @param eventName 事件名称\n * @param cb 传递参数\n */\n off(eventName: string, cb: Function) {\n const fns = this._eventTree[eventName];\n const index = fns.find((fn: Function) => fn === cb);\n if (Array.isArray(fns) && index) {\n fns.splice(index, 1);\n }\n }\n}\n","import Shape from './Shape';\n\nexport default class Line extends Shape {\n public type = 4\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n get ctrlsData() {\n return this.coor.length > 1 ? this.coor : [];\n }\n}\n","import Shape from './Shape';\n\nexport default class Circle extends Shape {\n public type = 5\n public radius = 0\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.radius = item.radius || this.radius\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n get ctrlsData() {\n const [x, y] = this.coor\n return [\n [x, y - this.radius],\n [x + this.radius, y],\n [x, y + this.radius],\n [x - this.radius, y]\n ]\n }\n}\n","import Shape from './Shape';\nimport Rect from './Rect'\n\nexport default class Grid extends Shape {\n public type = 6\n public row = 1\n public col = 1\n public selected: number[] = []\n public selectedFillStyle: string | undefined\n\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.row = item.row > 0 ? item.row : this.row\n this.col = item.col > 0 ? item.col : this.col\n this.selected = Array.isArray(item.selected) ? item.selected : []\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n\n get ctrlsData() {\n const [[x0, y0], [x1, y1]] = this.coor;\n return [\n [x0, y0],\n [x0 + (x1 - x0) / 2, y0],\n [x1, y0],\n [x1, y0 + (y1 - y0) / 2],\n [x1, y1],\n [x0 + (x1 - x0) / 2, y1],\n [x0, y1],\n [x0, y0 + (y1 - y0) / 2],\n ];\n }\n\n get gridRects() {\n const [[x0, y0], [x1, y1]] = this.coor;\n const { row, col, strokeStyle, fillStyle, active, creating, lineWidth } = this;\n const w = (x1 - x0) / this.col;\n const h = (y1 - y0) / this.row;\n const list: Rect[] = []\n for (let i = 0; i < row; i++) {\n for (let j = 0; j < col; j++) {\n const startPoint = [x0 + j * w, y0 + i * h];\n const index = i * col + j;\n const shape = new Rect({\n coor: [startPoint, [startPoint[0] + w, startPoint[1] + h]],\n strokeStyle, fillStyle, active, creating, lineWidth\n }, index, {});\n list.push(shape)\n }\n }\n return list;\n }\n}\n","import Shape from './Shape';\nimport { Point } from '../index';\n\nexport default class Brush extends Shape {\n public type = 7;\n public coor: Point[] = [];\n public brushSize: number | undefined;\n public brushStokeStyle: string | undefined;\n\n constructor(data: any, index: number, base: any) {\n super(data, index);\n this.brushSize = data.brushSize ?? base.brushSize\n this.brushStokeStyle = data.brushStokeStyle ?? base.brushStokeStyle\n this.coor = data.coor\n }\n}\n","import Shape from './Shape';\nimport { Point } from '../index';\n\nexport default class Eraser extends Shape {\n public type = 8;\n public coor: Point[] = [];\n public eraserSize: number | undefined;\n\n constructor(data: any, index: number, base: any) {\n super(data, index);\n this.eraserSize = data.eraserSize ?? base.eraserSize;\n this.coor = data.coor;\n }\n}\n","import Shape from \"./Shape\";\r\n\r\nexport default class Ellipse extends Shape {\r\n public type = 9; // 椭圆类型\r\n public radiusX = 0; // 水平半径\r\n public radiusY = 0; // 垂直半径\r\n public rotation = 0; // 旋转角度(弧度)\r\n\r\n constructor(item: any, index: number, base: any) {\r\n super(item, index);\r\n this.radiusX = item.radiusX || this.radiusX;\r\n this.radiusY = item.radiusY || this.radiusY;\r\n this.rotation = item.rotation || this.rotation;\r\n this.fillStyle = item.fillStyle ?? base.fillStyle;\r\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle;\r\n this.lineWidth = item.lineWidth ?? base.lineWidth;\r\n }\r\n\r\n get ctrlsData() {\r\n const [x, y] = this.coor;\r\n // 返回椭圆的控制点:上、右、下、左四个点\r\n return [\r\n [x, y - this.radiusY], // 上方控制点\r\n [x + this.radiusX, y], // 右方控制点\r\n [x, y + this.radiusY], // 下方控制点\r\n [x - this.radiusX, y], // 左方控制点\r\n ];\r\n }\r\n\r\n // 获取椭圆的边界框\r\n get boundingBox() {\r\n const [x, y] = this.coor;\r\n return [\r\n [x - this.radiusX, y - this.radiusY], // 左上角\r\n [x + this.radiusX, y + this.radiusY], // 右下角\r\n ];\r\n }\r\n\r\n // 检查点是否在椭圆内\r\n isPointInEllipse(pointX: number, pointY: number) {\r\n const [cx, cy] = this.coor;\r\n // 考虑旋转的点是否在椭圆内的检测\r\n if (this.rotation !== 0) {\r\n // 将点绕椭圆中心反向旋转\r\n const cos = Math.cos(-this.rotation);\r\n const sin = Math.sin(-this.rotation);\r\n const dx = pointX - cx;\r\n const dy = pointY - cy;\r\n const rotatedX = dx * cos - dy * sin;\r\n const rotatedY = dx * sin + dy * cos;\r\n\r\n // 在未旋转的椭圆中检查点\r\n return (\r\n (rotatedX * rotatedX) / (this.radiusX * this.radiusX) +\r\n (rotatedY * rotatedY) / (this.radiusY * this.radiusY) <=\r\n 1\r\n );\r\n } else {\r\n // 无旋转情况下的简单检查\r\n const dx = (pointX - cx) / this.radiusX;\r\n const dy = (pointY - cy) / this.radiusY;\r\n return dx * dx + dy * dy <= 1;\r\n }\r\n }\r\n}\r\n","import Shape from './Shape';\r\n\r\nexport default class Text extends Shape {\r\n public type = 10;\r\n \r\n /** 文本内容 */\r\n public text: string = '';\r\n \r\n /** 字体大小 */\r\n public fontSize: number = 14;\r\n \r\n /** 字体族 */\r\n public fontFamily: string = 'sans-serif';\r\n \r\n /** 文本颜色 */\r\n public textColor: string = '#000000';\r\n \r\n /** 背景颜色 */\r\n public backgroundColor: string = 'transparent';\r\n \r\n /** 边框颜色 */\r\n public borderColor: string = 'transparent';\r\n \r\n /** 边框宽度 */\r\n public borderWidth: number = 0;\r\n \r\n /** 圆角半径 */\r\n public borderRadius: number = 0;\r\n \r\n /** 内边距 */\r\n public padding: number = 4;\r\n \r\n /** 文本对齐方式 */\r\n public textAlign: CanvasTextAlign = 'left';\r\n \r\n /** 文本基线 */\r\n public textBaseline: CanvasTextBaseline = 'top';\r\n \r\n constructor(item: any, index: number, base: any) {\r\n super(item, index);\r\n \r\n // 设置文本相关属性\r\n this.text = item.text ?? '';\r\n this.fontSize = item.fontSize ?? base.fontSize ?? this.fontSize;\r\n this.fontFamily = item.fontFamily ?? base.fontFamily ?? this.fontFamily;\r\n this.textColor = item.textColor ?? base.textColor ?? base.strokeStyle ?? this.textColor;\r\n this.backgroundColor = item.backgroundColor ?? base.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = item.borderColor ?? base.borderColor ?? this.borderColor;\r\n this.borderWidth = item.borderWidth ?? base.borderWidth ?? this.borderWidth;\r\n this.borderRadius = item.borderRadius ?? base.borderRadius ?? this.borderRadius;\r\n this.padding = item.padding ?? base.padding ?? this.padding;\r\n this.textAlign = item.textAlign ?? base.textAlign ?? this.textAlign;\r\n this.textBaseline = item.textBaseline ?? base.textBaseline ?? this.textBaseline;\r\n \r\n // 兼容旧属性\r\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle;\r\n this.fillStyle = item.fillStyle ?? base.fillStyle;\r\n }\r\n \r\n /**\r\n * 获取控制点数据\r\n */\r\n get ctrlsData() {\r\n // 文本框的控制点通常在四个角和四条边的中点\r\n if (this.coor.length < 2) return [];\r\n \r\n const [[x0, y0], [x1, y1]] = this.coor;\r\n const centerX = (x0 + x1) / 2;\r\n const centerY = (y0 + y1) / 2;\r\n \r\n return [\r\n [x0, y0], // 左上角\r\n [centerX, y0], // 上边中点\r\n [x1, y0], // 右上角\r\n [x1, centerY], // 右边中点\r\n [x1, y1], // 右下角\r\n [centerX, y1], // 下边中点\r\n [x0, y1], // 左下角\r\n [x0, centerY] // 左边中点\r\n ];\r\n }\r\n \r\n /**\r\n * 获取文本框的宽度\r\n */\r\n get width(): number {\r\n if (this.coor.length < 2) return 0;\r\n const [[x0], [x1]] = this.coor;\r\n return Math.abs(x1 - x0);\r\n }\r\n \r\n /**\r\n * 获取文本框的高度\r\n */\r\n get height(): number {\r\n if (this.coor.length < 2) return 0;\r\n const [[, y0], [, y1]] = this.coor;\r\n return Math.abs(y1 - y0);\r\n }\r\n \r\n /**\r\n * 获取文本框的中心点\r\n */\r\n get center(): [number, number] {\r\n if (this.coor.length < 2) return [0, 0];\r\n const [[x0, y0], [x1, y1]] = this.coor;\r\n return [(x0 + x1) / 2, (y0 + y1) / 2];\r\n }\r\n}\r\n"],"names":["Shape","item","index","this","label","coor","active","creating","dragging","uuid","s","hexDigits","i","m","Math","floor","random","slice","n","join","createUuid","Object","assign","Rect","_super","base","_this","call","type","rotation","lineWidth","_a","fillStyle","_b","strokeStyle","_c","showRotation","_d","__extends","defineProperty","prototype","get","__read","x0","y0","x1","y1","centerX","centerY","width","height","baseCtrls","push","map","x","y","dx","dy","rotatedX","cos","sin","rotatedY","Polygon","length","Dot","EventBus","_eventTree","on","eventName","cb","fns","Array","isArray","emit","payload","_i","arguments","forEach","fn","apply","__spreadArray","off","find","splice","Line","Circle","radius","Grid","row","col","selected","w","h","list","j","startPoint","shape","Brush","data","brushSize","brushStokeStyle","Eraser","eraserSize","Ellipse","radiusX","radiusY","isPointInEllipse","pointX","pointY","cx","cy","Text","text","fontSize","fontFamily","textColor","backgroundColor","borderColor","borderWidth","borderRadius","padding","textAlign","textBaseline","_e","_h","_f","_k","_j","_m","_l","_p","_o","_r","_q","_t","_s","_v","_u","_x","_w","_y","_z","abs","CanvasSelect","el","src","version","pkg","lock","readonly","MIN_WIDTH","MIN_HEIGHT","MIN_RADIUS","MAX_POLYGON_POINTS","activeStrokeStyle","activeFillStyle","ctrlStrokeStyle","ctrlFillStyle","ctrlRadius","hideLabel","labelFillStyle","labelFont","textFillStyle","labelMaxLen","WIDTH","maxPolygonPoint","HEIGHT","crossX","crossY","crossStroke","showCross","dataset","isMagnifierVisible","magnifierPosition","remmber","mouse","remmberOrigin","createType","None","ctrlIndex","image","Image","IMAGE_ORIGIN_WIDTH","IMAGE_WIDTH","IMAGE_ORIGIN_HEIGHT","IMAGE_HEIGHT","originX","originY","scaleStep","scrollZoom","timer","dblTouch","dblTouchStore","alpha","focusMode","scaleTouchStore","isTouch2","isMobile","navigator","userAgent","includes","labelUp","isCtrlKey","ctrlCode","gridMenuEnable","gridSelectedFillStyle","position","handleLoad","bind","handleContextmenu","handleMousewheel","handleMouseDown","handleMouseMove","handleMouseUp","handleDblclick","handleKeyup","handleKeydown","container","document","querySelector","HTMLCanvasElement","canvas","offScreen","createElement","initSetting","initEvents","setImage","console","warn","min","max","createMagnifierCanvas","magnifierCanvas","magnifierCtx","getContext","willReadFrequently","style","pointerEvents","zIndex","border","body","appendChild","createMagnifier","updateMagnifier","magnifierSize","dpr","window","devicePixelRatio","clearRect","mx","my","left","concat","top","originImageData","getImageDataFromCanvas","areaImageData","createImageData","count","k","putImageData","strokeRect","destroyMagnifier","remove","undefined","context","getImageData","mergeEvent","e","mouseX","mouseY","mouseCX","mouseCY","touches","clientX","clientY","target","getBoundingClientRect","top_1","round","clientX1","_g","clientY1","offsetX","offsetY","__assign","fitZoom","preventDefault","stopPropagation","setScale","deltaY","scale","buttons","ctrls","activeShape","ctrlsData","findIndex","isPointInCircle","isInBackground","nx","ny","log","hitOnShape","hitShapeIndex_1","hitShape","pt","sort","a","b","newShape","curPoint","sp","update","rowCol","prompt","split","test","Number","center","atan2","PI","a0","b0","a1","b1","newPoint","newRadius","ux","uy","noLimit","t1","tar","r","sqrt","pow","which","touch0","touch1","cur","Date","now","pop","canPolygon","canLine","canPolygonByMaxPoints","canLineByTwoPoints","gridRects","rect","isPointInRect","thisIndex","code","activeElement","key","isPolygonAtMaxPoints","isLineAtTwoPoints","deleteByIndex","crossOrigin","userSelect","ctx","clientWidth","clientHeight","offScreenCtx","addEventListener","source","complete","setData","setTimeout","initdata","toString","mousePoint","hitShapeIndex","hide","isPointInPolygon","isPointInLine","point","save","translate","beginPath","moveTo","lineTo","closePath","fill","areaData","restore","stroke","drawRect","sub","isSelected","selectedFillStyle","rotate","fillRect","drawLabel","drawPolygon","lineJoin","shouldClose","drawDot","arc","drawCirle","drawEllipse","scaledRadiusX","scaledRadiusY","ellipse","drawText","drawRoundedRect","font","textX","textY","maxWidth","fillText","quadraticCurveTo","drawLine","shouldEnd","drawGrid","drawBrushPath","globalCompositeOperation","lineCap","drawEraserPath","clearBrush","newDateset","filter","drawCtrl","color","drawCtrlList","isHideLabel","isLabelUp","currLineWidth","newText","measureText","parseInt","labelWidth","textPaddingLeft","labelHeight","textPaddingTop","toleft","toTop","toTop2","isup","cancelAnimationFrame","requestAnimationFrame","renderList","BrushAndErasers","NormalShapes","drawImage","num","deleteByUuid","calcStep","flag","byMouse","pure","imageMin","imageOriginMax","realToLeft","realToRight","setFocusMode","destroy","removeEventListener","resize","removeAttribute"],"mappings":"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"}
1
+ {"version":3,"file":"canvas-select.min.js","sources":["../src/shape/Shape.ts","../src/index.ts","../src/tools.ts","../src/shape/Rect.ts","../src/shape/Polygon.ts","../src/shape/Dot.ts","../src/EventBus.ts","../src/shape/Line.ts","../src/shape/Circle.ts","../src/shape/Grid.ts","../src/shape/Brush.ts","../src/shape/Eraser.ts","../src/shape/Ellipse.ts","../src/shape/Text.ts"],"sourcesContent":["import { createUuid } from \"../tools\"\n\ninterface ShapeProp {\n type: number\n [key: string]: any\n}\nexport default class Shape {\n /** 标签 */\n public label: string = ''\n /** 是否隐藏标签 */\n public hideLabel: boolean | undefined\n /** 坐标 */\n public coor: any[] = []\n /** 边线颜色 */\n public strokeStyle: string | undefined\n /** 填充颜色 */\n public fillStyle: string | undefined\n /** 边线宽度 */\n public lineWidth: number | undefined\n /** 标签填充颜色 */\n public labelFillStyle: string | undefined\n /** 标签文字颜色 */\n public textFillStyle: string | undefined\n /** 标签文字字体 */\n public labelFont: string | undefined\n /** 标注类型 */\n public type: number | undefined\n /** 当前是否处于活动状态 */\n public active: boolean = false\n /** 当前是否处于创建状态 */\n public creating: boolean = false\n /** 当前是否处于拖拽状态 */\n public dragging: boolean = false\n /** 索引 */\n public index: number\n /** 唯一标识 */\n public uuid: string = createUuid()\n /** 向上展示label */\n public labelUp: boolean | undefined\n /** 隐藏标注 */\n public hide: boolean | undefined\n constructor(item: ShapeProp, index: number) {\n this.index = index\n Object.assign(this, item)\n }\n}\n","import Rect from \"./shape/Rect\";\nimport Polygon from \"./shape/Polygon\";\nimport Dot from \"./shape/Dot\";\nimport EventBus from \"./EventBus\";\nimport Line from \"./shape/Line\";\nimport Circle from \"./shape/Circle\";\nimport Grid from \"./shape/Grid\";\nimport pkg from \"../package.json\";\nimport Brush from \"./shape/Brush\";\nimport Eraser from \"./shape/Eraser\";\nimport Ellipse from \"./shape/Ellipse\";\nimport Text from \"./shape/Text\";\n\nexport type Point = [number, number];\nexport type AllShape =\n | Rect\n | Polygon\n | Dot\n | Line\n | Circle\n | Grid\n | Brush\n | Eraser\n | Ellipse\n | Text;\nenum Shape {\n None,\n Rect,\n Polygon,\n Dot,\n Line,\n Circle,\n Grid,\n Brush,\n Eraser,\n Ellipse,\n Text,\n}\nexport default class CanvasSelect extends EventBus {\n /** 当前版本 */\n version = pkg.version;\n /** 只读模式,画布不允许任何交互 */\n lock: boolean = false;\n /** 只读模式,仅支持查看 */\n readonly: boolean = false;\n /** 最小矩形宽度 */\n MIN_WIDTH = 10;\n /** 最小矩形高度 */\n MIN_HEIGHT = 10;\n /** 最小圆形半径 */\n MIN_RADIUS = 5;\n /** 多边形最大点数 */\n MAX_POLYGON_POINTS = 6;\n /** 边线颜色 */\n strokeStyle = \"#0f0\";\n /** 填充颜色 */\n fillStyle = \"rgba(0, 0, 255, 0.1)\";\n /** 边线宽度 */\n lineWidth = 1;\n /** 当前选中的标注边线颜色 */\n activeStrokeStyle = \"#f00\";\n /** 当前选中的标注填充颜色 */\n activeFillStyle = \"rgba(0, 0, 255, 0.1)\";\n /** 控制点边线颜色 */\n ctrlStrokeStyle = \"#000\";\n /** 控制点填充颜色 */\n ctrlFillStyle = \"#fff\";\n /** 控制点半径 */\n ctrlRadius = 13;\n /** 是否隐藏标签 */\n hideLabel = false;\n /** 标签背景填充颜色 */\n labelFillStyle = \"#fff\";\n /** 标签字体 */\n labelFont = \"10px sans-serif\";\n /** 标签文字颜色 */\n textFillStyle = \"#000\";\n /** 标签字符最大长度,超出使用省略号 */\n labelMaxLen = 10;\n /** 画布宽度 */\n WIDTH = 0;\n maxPolygonPoint = 6; // 最大多边形点数\n /** 画布高度 */\n HEIGHT = 0;\n /** XY十字坐标 */\n crossX = new Line({}, 0, {});\n crossY = new Line({}, 1, {});\n crossStroke = \"#ff0\";\n /** 开启十字辅助 */\n showCross = false;\n /** 开启矩形旋转控制点 */\n showRotation = false;\n\n canvas: HTMLCanvasElement | undefined;\n\n ctx: CanvasRenderingContext2D | null | undefined;\n /** 所有标注数据 */\n dataset: AllShape[] = [];\n\n offScreen: HTMLCanvasElement | undefined;\n\n offScreenCtx: CanvasRenderingContext2D | null | undefined;\n\n // 放大镜相关配置 Start\n magnifierCanvas: HTMLCanvasElement | undefined;\n magnifierCtx: CanvasRenderingContext2D | undefined;\n // 默认展示放大镜\n isMagnifierVisible: boolean = false;\n // 放大镜位置,默认跟随鼠标\n magnifierPosition: Point | \"auto\" = \"auto\";\n // 放大镜相关配置 End\n\n /** 记录锚点距离 */\n remmber: number[][] = [];\n /** 记录鼠标位置 */\n mouse: Point = [0, 0];\n /** 记录背景图鼠标位移 */\n remmberOrigin: number[] = [0, 0];\n /** 0 不创建,1 矩形,2 多边形,3 点,4 折线,5 圆,6 网格 */\n createType: Shape = Shape.None; //\n /** 控制点索引 */\n ctrlIndex = -1;\n /** 背景图片 */\n image: HTMLImageElement = new Image();\n /** 图片原始宽度 */\n IMAGE_ORIGIN_WIDTH: number = 0;\n /** 图片缩放宽度 */\n IMAGE_WIDTH = 0;\n /** 图片原始高度 */\n IMAGE_ORIGIN_HEIGHT = 0;\n /** 图片缩放高度 */\n IMAGE_HEIGHT = 0;\n /** 原点x */\n originX = 0;\n /** 原点y */\n originY = 0;\n /** 缩放步长 */\n scaleStep = 0;\n /** 滚动缩放 */\n scrollZoom = true;\n\n private timer: any = null;\n /** 最小touch双击时间 */\n dblTouch = 300;\n /** 记录touch双击开始时间 */\n dblTouchStore = 0; //\n /** 这个选项可以帮助浏览器进行内部优化 */\n alpha = true;\n /** 专注模式 */\n focusMode = false;\n /** 触控缩放时记录上一次两点距离 */\n scaleTouchStore = 0;\n /** 当前是否为双指触控 */\n isTouch2 = false;\n isMobile = navigator.userAgent.includes(\"Mobile\");\n /** 向上展示label */\n labelUp = false;\n private isCtrlKey = false;\n /** 自定义ctrl快捷键 KeyboardEvent.code */\n ctrlCode = \"ControlLeft\";\n /** 网格右键菜单 */\n gridMenuEnable = true;\n /** 网格选中背景填充颜色 */\n gridSelectedFillStyle = \"rgba(255, 255, 0, 0.6)\";\n /** 画笔大小 */\n brushSize = 20;\n /** 画笔颜色 */\n brushStokeStyle = \"#f00\";\n /** 橡皮擦大小 */\n eraserSize = 20;\n /** 标注坐标 (以背景图片左上角为原点) */\n position: number[] = [0, 0];\n /**\n * @param el Valid CSS selector string, or DOM\n * @param src image src\n */\n constructor(el: HTMLCanvasElement | string, src?: string | HTMLImageElement) {\n super();\n this.handleLoad = this.handleLoad.bind(this);\n this.handleContextmenu = this.handleContextmenu.bind(this);\n this.handleMousewheel = this.handleMousewheel.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleDblclick = this.handleDblclick.bind(this);\n this.handleKeyup = this.handleKeyup.bind(this);\n this.handleKeydown = this.handleKeydown.bind(this);\n const container = typeof el === \"string\" ? document.querySelector(el) : el;\n if (container instanceof HTMLCanvasElement) {\n this.canvas = container;\n this.offScreen = document.createElement(\"canvas\");\n this.initSetting();\n this.initEvents();\n src && this.setImage(src);\n } else {\n console.warn(\"HTMLCanvasElement is required!\");\n }\n this.crossX.strokeStyle = this.crossStroke;\n this.crossY.strokeStyle = this.crossStroke;\n }\n\n /** 当前当前选中的标注 */\n get activeShape() {\n return this.dataset.find((x) => x.active) || ({} as any);\n }\n\n /** 当前缩放比例 */\n get scale() {\n if (this.IMAGE_ORIGIN_WIDTH && this.IMAGE_WIDTH) {\n return this.IMAGE_WIDTH / this.IMAGE_ORIGIN_WIDTH;\n }\n return 1;\n }\n\n /** 图片最小边尺寸 */\n get imageMin() {\n return Math.min(this.IMAGE_WIDTH, this.IMAGE_HEIGHT);\n }\n\n /** 图片原始最大边尺寸 */\n get imageOriginMax() {\n return Math.max(this.IMAGE_ORIGIN_WIDTH, this.IMAGE_ORIGIN_HEIGHT);\n }\n\n /** 创建放大镜容器 */\n createMagnifierCanvas() {\n if (this.isMagnifierVisible) {\n this.magnifierCanvas =\n this.magnifierCanvas || document.createElement(\"canvas\");\n this.magnifierCtx =\n this.magnifierCanvas &&\n (this.magnifierCanvas.getContext(\"2d\", {\n willReadFrequently: true,\n }) as CanvasRenderingContext2D);\n this.magnifierCanvas.style.position = \"fixed\";\n this.magnifierCanvas.style.pointerEvents = \"none\";\n this.magnifierCanvas.style.zIndex = \"1000\";\n this.magnifierCanvas.style.border = \"1px solid black\";\n this.magnifierCanvas.style.borderRadius = \"50%\";\n this.magnifierCanvas.style.width = \"100px\";\n this.magnifierCanvas.style.height = \"100px\";\n document.body.appendChild(this.magnifierCanvas);\n }\n }\n\n /** 创建放大镜 */\n createMagnifier(x: number, y: number) {\n if (!this.magnifierCanvas) {\n this.createMagnifierCanvas();\n } else {\n this.updateMagnifier(x, y);\n }\n }\n /** 更新放大镜 */\n updateMagnifier(x: number, y: number) {\n if (this.canvas && this.magnifierCanvas && this.magnifierCtx) {\n const magnifierSize = 100;\n const dpr = window.devicePixelRatio || 1;\n this.magnifierCanvas.width = magnifierSize;\n this.magnifierCanvas.height = magnifierSize;\n this.magnifierCtx.clearRect(0, 0, magnifierSize, magnifierSize);\n\n // 放大镜位置\n if (this.magnifierPosition && this.magnifierPosition.length === 2) {\n const [mx, my] = this.magnifierPosition;\n this.magnifierCanvas.style.left = `${mx}px`;\n this.magnifierCanvas.style.top = `${my}px`;\n } else {\n this.magnifierCanvas.style.left = `${x + 10}px`;\n this.magnifierCanvas.style.top = `${y + 10}px`;\n }\n\n const originImageData = this.getImageDataFromCanvas(this.canvas, [\n x * dpr - magnifierSize / 2,\n y * dpr - magnifierSize / 2,\n magnifierSize,\n magnifierSize,\n ]);\n // 新的像素信息对象\n const areaImageData = this.magnifierCanvas\n .getContext(\"2d\", { willReadFrequently: true })\n ?.createImageData(\n this.magnifierCanvas.width,\n this.magnifierCanvas.height\n );\n\n if (areaImageData && originImageData) {\n let count = 0;\n for (let j = 0; j < magnifierSize; j += 1) {\n for (let i = 0; i < magnifierSize; i += 1) {\n for (let k = j; k < j + 1; k++) {\n for (let m = i; m < i + 1; m++) {\n const index = (k * magnifierSize + m) * 4;\n areaImageData.data[index] = originImageData.data[count];\n areaImageData.data[index + 1] = originImageData.data[count + 1];\n areaImageData.data[index + 2] = originImageData.data[count + 2];\n areaImageData.data[index + 3] = originImageData.data[count + 3];\n }\n }\n count += 4;\n }\n }\n this.magnifierCanvas\n .getContext(\"2d\", { willReadFrequently: true })\n ?.putImageData(areaImageData, 0, 0);\n\n // 十字线 有需要可以加\n // this.magnifierCtx.strokeStyle = 'rgba(255, 0, 0, 0.7)';\n // this.magnifierCtx.lineWidth = 1;\n // this.magnifierCtx.beginPath();\n // this.magnifierCtx.moveTo(magnifierSize / 2, 0);\n // this.magnifierCtx.lineTo(magnifierSize / 2, magnifierSize);\n // this.magnifierCtx.moveTo(0, magnifierSize / 2);\n // this.magnifierCtx.lineTo(magnifierSize, magnifierSize / 2);\n // this.magnifierCtx.stroke();\n\n // // 绘制放大镜边框\n this.magnifierCtx.strokeStyle = \"rgba(0, 0, 0, 0.5)\";\n this.magnifierCtx.lineWidth = 2;\n this.magnifierCtx.strokeRect(0, 0, magnifierSize, magnifierSize);\n }\n }\n }\n\n /** 销毁放大镜 */\n private destroyMagnifier() {\n if (this.magnifierCanvas) {\n this.magnifierCanvas.remove();\n this.magnifierCanvas = undefined;\n this.magnifierCtx = undefined;\n }\n }\n\n /* 提取像素信息 */\n getImageDataFromCanvas(\n canvas: HTMLCanvasElement,\n [x, y, width, height]: [number, number, number, number]\n ) {\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n return context?.getImageData(x, y, width, height);\n }\n\n /** 合成事件 */\n public mergeEvent(e: TouchEvent | MouseEvent) {\n let mouseX = 0;\n let mouseY = 0;\n let mouseCX = 0;\n let mouseCY = 0;\n if (this.isMobile && (e as TouchEvent).touches) {\n const { clientX, clientY } = (e as TouchEvent).touches[0];\n const target = e.target as HTMLCanvasElement;\n const { left, top } = target.getBoundingClientRect();\n mouseX = Math.round(clientX - left);\n mouseY = Math.round(clientY - top);\n if ((e as TouchEvent).touches?.length === 2) {\n const { clientX: clientX1 = 0, clientY: clientY1 = 0 } =\n (e as TouchEvent).touches[1] || {};\n mouseCX = Math.round(\n Math.abs((clientX1 - clientX) / 2 + clientX) - left\n );\n mouseCY = Math.round(\n Math.abs((clientY1 - clientY) / 2 + clientY) - top\n );\n } else if ((e as TouchEvent).touches?.length === 1) {\n mouseCX = Math.round(clientX - left);\n mouseCY = Math.round(clientY - top);\n }\n } else {\n mouseX = (e as MouseEvent).offsetX;\n mouseY = (e as MouseEvent).offsetY;\n }\n return { ...e, mouseX, mouseY, mouseCX, mouseCY };\n }\n\n private handleLoad() {\n this.emit(\"load\", this.image.src);\n this.IMAGE_ORIGIN_WIDTH = this.IMAGE_WIDTH = this.image.width;\n this.IMAGE_ORIGIN_HEIGHT = this.IMAGE_HEIGHT = this.image.height;\n this.fitZoom();\n }\n\n private handleContextmenu(e: MouseEvent) {\n e.preventDefault();\n if (this.lock) return;\n }\n\n private handleMousewheel(e: WheelEvent) {\n e.preventDefault();\n e.stopPropagation();\n if (this.lock || !this.scrollZoom) return;\n const { mouseX, mouseY } = this.mergeEvent(e);\n this.mouse = [mouseX, mouseY];\n this.setScale(e.deltaY < 0, true);\n }\n\n private handleMouseDown(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n const { mouseX, mouseY, mouseCX, mouseCY } = this.mergeEvent(e);\n const offsetX = Math.round(mouseX / this.scale);\n const offsetY = Math.round(mouseY / this.scale);\n this.mouse =\n this.isMobile && (e as TouchEvent).touches?.length === 2\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n this.remmberOrigin = [mouseX - this.originX, mouseY - this.originY];\n if (\n (!this.isMobile && (e as MouseEvent).buttons === 1) ||\n (this.isMobile && (e as TouchEvent).touches?.length === 1)\n ) {\n // 鼠标左键\n const ctrls = this.activeShape.ctrlsData || [];\n this.ctrlIndex = ctrls.findIndex((coor: Point) =>\n this.isPointInCircle(this.mouse, coor, this.ctrlRadius)\n );\n if (this.ctrlIndex > -1 && !this.readonly) {\n // 点击到控制点\n const [x0, y0] = ctrls[this.ctrlIndex];\n if (\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length > 2 &&\n this.ctrlIndex === 0\n ) {\n this.handleDblclick(e);\n }\n this.remmber = [[offsetX - x0, offsetY - y0]];\n } else if (this.isInBackground(e)) {\n const nx = Math.round(offsetX - this.originX / this.scale);\n const ny = Math.round(offsetY - this.originY / this.scale);\n if (this.activeShape.creating && !this.readonly) {\n // 创建中\n if ([Shape.Polygon, Shape.Line].includes(this.activeShape.type)) {\n const [x, y] =\n this.activeShape.coor[this.activeShape.coor.length - 1];\n if (x !== offsetX && y !== offsetY) {\n this.activeShape.coor.push([nx, ny]);\n\n // 对于多边形,检查是否达到最大点数\n if (\n this.activeShape.type === Shape.Polygon &&\n this.MAX_POLYGON_POINTS &&\n this.activeShape.coor.length >= this.MAX_POLYGON_POINTS\n ) {\n // 达到最大点数,自动完成绘制\n this.handleDblclick(e);\n }\n\n // 对于折线,检查是否达到2个点\n if (\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length >= 2\n ) {\n // 达到2个点,自动完成绘制\n this.handleDblclick(e);\n }\n }\n }\n } else if (\n this.createType !== Shape.None &&\n !this.readonly &&\n !this.isCtrlKey\n ) {\n // 开始创建\n let newShape;\n const curPoint: Point = [nx, ny];\n switch (this.createType) {\n case Shape.Rect:\n newShape = new Rect(\n { coor: [curPoint, curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Polygon:\n newShape = new Polygon(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Dot:\n newShape = new Dot({ coor: curPoint }, this.dataset.length, this);\n this.emit(\"add\", newShape);\n break;\n case Shape.Line:\n newShape = new Line(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Circle:\n newShape = new Circle(\n { coor: curPoint },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Grid:\n newShape = new Grid(\n { coor: [curPoint, curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Brush:\n newShape = new Brush(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Eraser:\n newShape = new Eraser(\n { coor: [curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n case Shape.Text:\n newShape = new Text(\n { coor: [curPoint, curPoint] },\n this.dataset.length,\n this\n );\n newShape.creating = true;\n break;\n default:\n break;\n }\n if (newShape) {\n this.dataset.forEach((sp) => {\n sp.active = false;\n });\n newShape.active = true;\n this.dataset.push(newShape);\n }\n } else {\n // 是否点击到形状\n const [hitShapeIndex, hitShape] = this.hitOnShape(this.mouse);\n if (hitShapeIndex > -1 && hitShape) {\n hitShape.dragging = true;\n this.dataset.forEach(\n (item, i) => (item.active = i === hitShapeIndex)\n );\n this.dataset.splice(hitShapeIndex, 1);\n this.dataset.push(hitShape);\n if (!this.readonly) {\n this.remmber = [];\n if ([Shape.Dot, Shape.Circle].includes(hitShape.type)) {\n const [x, y] = hitShape.coor;\n this.remmber = [[offsetX - x, offsetY - y]];\n } else {\n hitShape.coor.forEach((pt: any) => {\n this.remmber.push([offsetX - pt[0], offsetY - pt[1]]);\n });\n }\n }\n this.emit(\"select\", hitShape);\n } else {\n this.activeShape.active = false;\n this.dataset.sort((a, b) => a.index - b.index);\n this.emit(\"select\", null);\n }\n }\n this.update();\n }\n } else if (\n (!this.isMobile && (e as MouseEvent).buttons === 2) ||\n (this.isMobile &&\n (e as TouchEvent).touches?.length === 3 &&\n !this.readonly)\n ) {\n // 鼠标右键\n if ([Shape.Grid].includes(this.activeShape.type) && this.gridMenuEnable) {\n const rowCol = prompt(\n \"x 行 y 列 x,y\",\n [this.activeShape.row, this.activeShape.col].join(\",\")\n );\n if (typeof rowCol === \"string\") {\n const [row, col] = rowCol.split(\",\");\n if (/^[1-9]\\d*$/.test(row) && /^[1-9]\\d*$/.test(col)) {\n this.activeShape.row = Number(row);\n this.activeShape.col = Number(col);\n this.update();\n }\n }\n }\n this.emit(\"contextmenu\", e);\n }\n }\n\n private handleMouseMove(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n const { mouseX, mouseY, mouseCX, mouseCY } = this.mergeEvent(e);\n const offsetX = Math.round(mouseX / this.scale);\n const offsetY = Math.round(mouseY / this.scale);\n if (!this.isCtrlKey && this.isInBackground(e)) {\n this.crossX.coor = [\n [offsetX - this.originX / this.scale, 0],\n [offsetX - this.originX / this.scale, this.image.height],\n ];\n this.crossY.coor = [\n [0, offsetY - this.originY / this.scale],\n [this.image.width, offsetY - this.originY / this.scale],\n ];\n } else {\n this.crossX.coor = [];\n this.crossY.coor = [];\n }\n this.mouse =\n this.isMobile && (e as TouchEvent).touches?.length === 2\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n const nx = Math.round(offsetX - this.originX / this.scale);\n const ny = Math.round(offsetY - this.originY / this.scale);\n this.position = [nx, ny];\n if (\n ((!this.isMobile && (e as MouseEvent).buttons === 1) ||\n (this.isMobile && (e as TouchEvent).touches?.length === 1)) &&\n this.activeShape.type\n ) {\n if (\n this.ctrlIndex > -1 &&\n this.remmber.length &&\n (this.isInBackground(e) || this.activeShape.type === Shape.Circle)\n ) {\n const [[x, y]] = this.remmber;\n // resize矩形或旋转\n if ([Shape.Rect, Shape.Grid].includes(this.activeShape.type)) {\n // 处理旋转控制点(索引8)\n if (this.ctrlIndex === 8) {\n const [centerX, centerY] = this.activeShape.center;\n const mouseX = offsetX - x;\n const mouseY = offsetY - y;\n const dx = mouseX - centerX;\n const dy = mouseY - centerY;\n this.activeShape.rotation = Math.atan2(dy, dx) + Math.PI / 2;\n } else {\n // 处理resize控制点\n const [[x0, y0], [x1, y1]] = this.activeShape.coor;\n let coor: Point[] = [];\n switch (this.ctrlIndex) {\n case 0:\n coor = [\n [offsetX - x, offsetY - y],\n [x1, y1],\n ];\n break;\n case 1:\n coor = [\n [x0, offsetY - y],\n [x1, y1],\n ];\n break;\n case 2:\n coor = [\n [x0, offsetY - y],\n [offsetX - x, y1],\n ];\n break;\n case 3:\n coor = [\n [x0, y0],\n [offsetX - x, y1],\n ];\n break;\n case 4:\n coor = [\n [x0, y0],\n [offsetX - x, offsetY - y],\n ];\n break;\n case 5:\n coor = [\n [x0, y0],\n [x1, offsetY - y],\n ];\n break;\n case 6:\n coor = [\n [offsetX - x, y0],\n [x1, offsetY - y],\n ];\n break;\n case 7:\n coor = [\n [offsetX - x, y0],\n [x1, y1],\n ];\n break;\n default:\n break;\n }\n let [[a0, b0], [a1, b1]] = coor;\n if (\n a0 < 0 ||\n a1 < 0 ||\n b0 < 0 ||\n b1 < 0 ||\n a1 > this.IMAGE_ORIGIN_WIDTH ||\n b1 > this.IMAGE_ORIGIN_HEIGHT\n ) {\n // 偶然触发 超出边界处理\n a0 < 0 && (a0 = 0);\n a1 < 0 && (a1 = 0);\n b0 < 0 && (b0 = 0);\n b1 < 0 && (b1 = 0);\n if (a1 > this.IMAGE_ORIGIN_WIDTH) {\n a1 = this.IMAGE_ORIGIN_WIDTH;\n }\n if (b1 > this.IMAGE_ORIGIN_HEIGHT) {\n b1 = this.IMAGE_ORIGIN_HEIGHT;\n }\n }\n\n if (a1 - a0 >= this.MIN_WIDTH && b1 - b0 >= this.MIN_HEIGHT) {\n this.activeShape.coor = [\n [a0, b0],\n [a1, b1],\n ];\n } else {\n this.emit(\n \"warn\",\n `Width cannot be less than ${this.MIN_WIDTH},Height cannot be less than${this.MIN_HEIGHT}。`\n );\n }\n }\n } else if (\n [Shape.Polygon, Shape.Line].includes(this.activeShape.type)\n ) {\n const newPoint = [nx, ny];\n this.activeShape.coor.splice(this.ctrlIndex, 1, newPoint);\n } else if (this.activeShape.type === Shape.Circle) {\n const nx = Math.round(offsetX - this.originX / this.scale);\n const newRadius = nx - this.activeShape.coor[0];\n if (newRadius >= this.MIN_RADIUS) this.activeShape.radius = newRadius;\n }\n if (this.isMagnifierVisible) {\n const [ux, uy] = this.isMobile\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n this.createMagnifier(ux, uy);\n }\n } else if (this.activeShape.dragging && !this.readonly) {\n // 拖拽\n // 拖拽点的时候,也需要触发放大镜\n if (this.isMagnifierVisible && this.activeShape.type === 3) {\n const [ux, uy] = this.isMobile\n ? [mouseCX, mouseCY]\n : [mouseX, mouseY];\n this.createMagnifier(ux, uy);\n }\n let coor = [];\n let noLimit = true;\n const w = this.IMAGE_ORIGIN_WIDTH || this.WIDTH;\n const h = this.IMAGE_ORIGIN_HEIGHT || this.HEIGHT;\n if ([Shape.Dot, Shape.Circle].includes(this.activeShape.type)) {\n const [t1, t2] = this.remmber[0];\n const x = offsetX - t1;\n const y = offsetY - t2;\n if (x < 0 || x > w || y < 0 || y > h) noLimit = false;\n coor = [x, y];\n } else {\n for (let i = 0; i < this.activeShape.coor.length; i++) {\n const tar = this.remmber[i];\n const x = offsetX - tar[0];\n const y = offsetY - tar[1];\n if (x < 0 || x > w || y < 0 || y > h) noLimit = false;\n coor.push([x, y]);\n }\n }\n if (noLimit) this.activeShape.coor = coor;\n } else if (this.activeShape.creating && this.isInBackground(e)) {\n // const x = Math.round(offsetX - this.originX / this.scale);\n // const y = Math.round(offsetY - this.originY / this.scale);\n // 创建矩形\n if ([Shape.Rect, Shape.Grid].includes(this.activeShape.type)) {\n this.activeShape.coor.splice(1, 1, [nx, ny]);\n } else if (this.activeShape.type === Shape.Circle) {\n const [x0, y0] = this.activeShape.coor;\n const r = Math.sqrt((x0 - nx) ** 2 + (y0 - ny) ** 2);\n this.activeShape.radius = r;\n } else if (\n [Shape.Brush, Shape.Eraser].includes(this.activeShape.type)\n ) {\n this.activeShape.coor.push([nx, ny]);\n }\n }\n this.update();\n } else if (\n [Shape.Polygon, Shape.Line].includes(this.activeShape.type) &&\n this.activeShape.creating\n ) {\n // 多边形添加点\n this.update();\n } else if (\n (!this.isMobile &&\n (e as MouseEvent).buttons === 2 &&\n (e as MouseEvent).which === 3) ||\n (this.isMobile &&\n (e as TouchEvent).touches?.length === 1 &&\n !this.isTouch2)\n ) {\n // 拖动背景\n this.originX = Math.round(mouseX - this.remmberOrigin[0]);\n this.originY = Math.round(mouseY - this.remmberOrigin[1]);\n this.update();\n } else if (this.isMobile && (e as TouchEvent).touches?.length === 2) {\n this.isTouch2 = true;\n const touch0 = (e as TouchEvent).touches[0];\n const touch1 = (e as TouchEvent).touches[1];\n const cur = this.scaleTouchStore;\n this.scaleTouchStore = Math.abs(\n (touch1.clientX - touch0.clientX) * (touch1.clientY - touch0.clientY)\n );\n this.setScale(this.scaleTouchStore > cur, true);\n } else {\n if (!this.isCtrlKey) {\n this.update();\n }\n }\n }\n\n private handleMouseUp(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n // 鼠标抬起则卸载放大器\n this.destroyMagnifier();\n if (this.isMobile) {\n if ((e as TouchEvent).touches?.length === 0) {\n this.isTouch2 = false;\n }\n if (Date.now() - this.dblTouchStore < this.dblTouch) {\n this.handleDblclick(e);\n return;\n }\n this.dblTouchStore = Date.now();\n }\n this.remmber = [];\n if (this.activeShape.type !== Shape.None && !this.isCtrlKey) {\n this.activeShape.dragging = false;\n if (this.activeShape.creating) {\n if ([Shape.Rect, Shape.Grid].includes(this.activeShape.type)) {\n const [[x0, y0], [x1, y1]] = this.activeShape.coor;\n if (\n Math.abs(x0 - x1) < this.MIN_WIDTH ||\n Math.abs(y0 - y1) < this.MIN_HEIGHT\n ) {\n this.dataset.pop();\n this.emit(\n \"warn\",\n `Width cannot be less than ${this.MIN_WIDTH},Height cannot be less than ${this.MIN_HEIGHT}`\n );\n } else {\n this.activeShape.coor = [\n [Math.min(x0, x1), Math.min(y0, y1)],\n [Math.max(x0, x1), Math.max(y0, y1)],\n ];\n this.activeShape.creating = false;\n this.emit(\"add\", this.activeShape);\n }\n } else if (this.activeShape.type === Shape.Circle) {\n if (this.activeShape.radius < this.MIN_RADIUS) {\n this.dataset.pop();\n this.emit(\"warn\", `Radius cannot be less than ${this.MIN_WIDTH}`);\n } else {\n this.activeShape.creating = false;\n this.emit(\"add\", this.activeShape);\n }\n } else if (\n [Shape.Brush, Shape.Eraser].includes(this.activeShape.type)\n ) {\n this.activeShape.creating = false;\n this.emit(\"add\", this.activeShape);\n }\n this.update();\n }\n }\n }\n\n private handleDblclick(e: MouseEvent | TouchEvent) {\n e.stopPropagation();\n if (this.lock) return;\n if ([Shape.Polygon, Shape.Line].includes(this.activeShape.type)) {\n const canPolygon =\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length > 2;\n const canLine =\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length > 1;\n // 对于多边形,如果达到最大点数也允许完成\n const canPolygonByMaxPoints =\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length >= this.MAX_POLYGON_POINTS;\n // 对于折线,如果达到2个点也允许完成\n const canLineByTwoPoints =\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length >= 2;\n if (\n canPolygon ||\n canLine ||\n canPolygonByMaxPoints ||\n canLineByTwoPoints\n ) {\n this.emit(\"add\", this.activeShape);\n this.activeShape.creating = false;\n this.update();\n }\n } else if ([Shape.Grid].includes(this.activeShape.type)) {\n // 双击切换网格分区选中状态\n if (this.activeShape.active) {\n this.activeShape.gridRects.forEach(\n (rect: { coor: Point[]; index: number }) => {\n if (this.isPointInRect(this.mouse, rect.coor)) {\n const thisIndex = this.activeShape.selected.findIndex(\n (x: number) => rect.index === x\n );\n if (thisIndex > -1) {\n this.activeShape.selected.splice(thisIndex, 1);\n } else {\n this.activeShape.selected.push(rect.index);\n }\n }\n }\n );\n this.update();\n }\n }\n }\n private handleKeydown(e: KeyboardEvent) {\n if (e.code === this.ctrlCode) {\n this.isCtrlKey = true;\n }\n }\n\n private handleKeyup(e: KeyboardEvent) {\n if (e.code === this.ctrlCode) {\n this.isCtrlKey = false;\n }\n if (this.lock || document.activeElement !== document.body || this.readonly)\n return;\n if (this.activeShape.type) {\n if (\n [Shape.Polygon, Shape.Line].includes(this.activeShape.type) &&\n e.key === \"Escape\"\n ) {\n // 对于多边形,如果已经达到最大点数,不应该再删除点\n const isPolygonAtMaxPoints =\n this.activeShape.type === Shape.Polygon &&\n this.activeShape.coor.length >= this.MAX_POLYGON_POINTS;\n // 对于折线,如果已经达到2个点,不应该再删除点\n const isLineAtTwoPoints =\n this.activeShape.type === Shape.Line &&\n this.activeShape.coor.length >= 2;\n\n if (\n this.activeShape.coor.length > 1 &&\n this.activeShape.creating &&\n !isPolygonAtMaxPoints &&\n !isLineAtTwoPoints\n ) {\n this.activeShape.coor.pop();\n } else {\n this.deleteByIndex(this.activeShape.index);\n }\n this.update();\n } else if (e.key === \"Backspace\") {\n this.deleteByIndex(this.activeShape.index);\n }\n }\n }\n\n /** 初始化配置 */\n initSetting() {\n if (!this.canvas || !this.offScreen) return;\n const dpr = window.devicePixelRatio || 1;\n // 处理图片跨域问题\n this.image.crossOrigin = \"anonymous\";\n this.canvas.style.userSelect = \"none\";\n this.ctx = this.ctx || this.canvas.getContext(\"2d\", { alpha: this.alpha });\n this.WIDTH = this.canvas.clientWidth;\n this.HEIGHT = Math.round(this.canvas.clientHeight);\n this.canvas.width = this.WIDTH * dpr;\n this.canvas.height = this.HEIGHT * dpr;\n this.canvas.style.width = this.WIDTH + \"px\";\n this.canvas.style.height = this.HEIGHT + \"px\";\n this.offScreen.width = this.WIDTH;\n this.offScreen.height = this.HEIGHT;\n this.offScreenCtx =\n this.offScreenCtx ||\n this.offScreen.getContext(\"2d\", { willReadFrequently: true });\n this.ctx?.scale(dpr, dpr);\n }\n\n /** 初始化事件 */\n initEvents() {\n if (!this.canvas) return;\n this.image.addEventListener(\"load\", this.handleLoad);\n this.canvas.addEventListener(\"touchstart\", this.handleMouseDown);\n this.canvas.addEventListener(\"touchmove\", this.handleMouseMove);\n this.canvas.addEventListener(\"touchend\", this.handleMouseUp);\n this.canvas.addEventListener(\"contextmenu\", this.handleContextmenu);\n // @ts-ignore\n this.canvas.addEventListener(\"mousewheel\", this.handleMousewheel);\n this.canvas.addEventListener(\"wheel\", this.handleMousewheel);\n this.canvas.addEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.addEventListener(\"mousemove\", this.handleMouseMove);\n this.canvas.addEventListener(\"mouseup\", this.handleMouseUp);\n this.canvas.addEventListener(\"dblclick\", this.handleDblclick);\n document.body.addEventListener(\"keydown\", this.handleKeydown, true);\n document.body.addEventListener(\"keyup\", this.handleKeyup, true);\n }\n\n /**\n * 添加/切换图片\n * @param source 图片链接或图片对象\n */\n setImage(source: string | HTMLImageElement) {\n if (typeof source === \"string\") {\n this.image.src = source;\n } else {\n this.image = source;\n this.image.crossOrigin = \"anonymous\";\n if (this.image.complete) {\n this.handleLoad();\n } else {\n this.image.addEventListener(\"load\", this.handleLoad);\n }\n }\n }\n\n /**\n * 设置数据\n * @param data Array\n */\n setData(data: AllShape[]) {\n setTimeout(() => {\n const initdata: AllShape[] = [];\n data.forEach((item: any, index) => {\n if (Object.prototype.toString.call(item).includes(\"Object\")) {\n let shape: any;\n switch (item.type) {\n case Shape.Rect:\n shape = new Rect(item, index, this);\n break;\n case Shape.Polygon:\n shape = new Polygon(item, index, this);\n break;\n case Shape.Dot:\n shape = new Dot(item, index, this);\n break;\n case Shape.Line:\n shape = new Line(item, index, this);\n break;\n case Shape.Circle:\n shape = new Circle(item, index, this);\n break;\n case Shape.Grid:\n shape = new Grid(item, index, this);\n break;\n case Shape.Brush:\n shape = new Brush(item, index, this);\n break;\n case Shape.Eraser:\n shape = new Eraser(item, index, this);\n break;\n case Shape.Ellipse:\n shape = new Ellipse(item, index, this);\n break;\n case Shape.Text:\n shape = new Text(item, index, this);\n break;\n default:\n console.warn(\"Invalid shape\", item);\n break;\n }\n [\n Shape.Rect,\n Shape.Polygon,\n Shape.Dot,\n Shape.Line,\n Shape.Circle,\n Shape.Grid,\n Shape.Brush,\n Shape.Eraser,\n Shape.Ellipse,\n Shape.Text,\n ].includes(item.type) &&\n shape &&\n initdata.push(shape);\n } else {\n console.warn(\"Shape must be an enumerable Object.\", item);\n }\n });\n this.dataset = initdata;\n this.update();\n });\n }\n\n /**\n * 判断是否在标注实例上\n * @param mousePoint 点击位置\n * @returns\n */\n hitOnShape(mousePoint: Point): [number, AllShape] {\n let hitShapeIndex = -1;\n let hitShape: any;\n console.log(\"hitOnShape\", this.ctrlRadius)\n for (let i = this.dataset.length - 1; i > -1; i--) {\n const shape = this.dataset[i];\n if (shape.hide) continue;\n if (\n (shape.type === Shape.Dot &&\n this.isPointInCircle(\n mousePoint,\n shape.coor as Point,\n this.ctrlRadius\n )) ||\n (shape.type === Shape.Circle &&\n this.isPointInCircle(\n mousePoint,\n shape.coor as Point,\n (shape as Circle).radius * this.scale\n )) ||\n (shape.type === Shape.Rect &&\n this.isPointInRect(mousePoint, (shape as Rect).coor)) ||\n (shape.type === Shape.Polygon &&\n this.isPointInPolygon(mousePoint, (shape as Polygon).coor)) ||\n (shape.type === Shape.Line &&\n this.isPointInLine(mousePoint, (shape as Line).coor)) ||\n (shape.type === Shape.Grid &&\n this.isPointInRect(mousePoint, (shape as Grid).coor)) ||\n (shape.type === Shape.Text &&\n this.isPointInRect(mousePoint, (shape as Text).coor))\n ) {\n if (this.focusMode && !shape.active) continue;\n hitShapeIndex = i;\n hitShape = shape;\n break;\n }\n }\n return [hitShapeIndex, hitShape];\n }\n\n /**\n * 判断鼠标是否在背景图内部\n * @param e MouseEvent\n * @returns 布尔值\n */\n isInBackground(e: MouseEvent | TouchEvent): boolean {\n const { mouseX, mouseY } = this.mergeEvent(e);\n return (\n mouseX >= this.originX &&\n mouseY >= this.originY &&\n mouseX <= this.originX + this.IMAGE_ORIGIN_WIDTH * this.scale &&\n mouseY <= this.originY + this.IMAGE_ORIGIN_HEIGHT * this.scale\n );\n }\n\n /**\n * 判断是否在矩形内\n * @param point 坐标\n * @param coor 区域坐标\n * @returns 布尔值\n */\n isPointInRect(point: Point, coor: Point[]): boolean {\n const [x, y] = point;\n const [[x0, y0], [x1, y1]] = coor.map((a) => a.map((b) => b * this.scale));\n return (\n x0 + this.originX <= x &&\n x <= x1 + this.originX &&\n y0 + this.originY <= y &&\n y <= y1 + this.originY\n );\n }\n\n /**\n * 判断是否在多边形内\n * @param point 坐标\n * @param coor 区域坐标\n * @returns 布尔值\n */\n isPointInPolygon(point: Point, coor: Point[]): boolean {\n if (!this.offScreenCtx) return false;\n this.offScreenCtx.save();\n this.offScreenCtx.clearRect(0, 0, this.WIDTH, this.HEIGHT);\n this.offScreenCtx.translate(this.originX, this.originY);\n this.offScreenCtx.beginPath();\n coor.forEach((pt, i) => {\n const [x, y] = pt.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.offScreenCtx?.moveTo(x, y);\n } else {\n this.offScreenCtx?.lineTo(x, y);\n }\n });\n this.offScreenCtx.closePath();\n this.offScreenCtx.fill();\n const areaData = this.offScreenCtx.getImageData(\n 0,\n 0,\n this.WIDTH,\n this.HEIGHT\n );\n const index = (point[1] - 1) * this.WIDTH * 4 + point[0] * 4;\n this.offScreenCtx.restore();\n return areaData.data[index + 3] !== 0;\n }\n\n /**\n * 判断是否在圆内\n * @param point 坐标\n * @param center 圆心\n * @param r 半径\n * @param needScale 是否为圆形点击检测\n * @returns 布尔值\n */\n isPointInCircle(point: Point, center: Point, r: number): boolean {\n const [x, y] = point;\n const [x0, y0] = center.map((a) => a * this.scale);\n const distance = Math.sqrt(\n (x0 + this.originX - x) ** 2 + (y0 + this.originY - y) ** 2\n );\n return distance <= r;\n }\n\n /**\n * 判断是否在折线内\n * @param point 坐标\n * @param coor 区域坐标\n * @returns 布尔值\n */\n isPointInLine(point: Point, coor: Point[]): boolean {\n if (!this.offScreenCtx) return false;\n this.offScreenCtx.save();\n this.offScreenCtx.clearRect(0, 0, this.WIDTH, this.HEIGHT);\n this.offScreenCtx.translate(this.originX, this.originY);\n this.offScreenCtx.lineWidth = this.lineWidth > 5 ? this.lineWidth : 5;\n this.offScreenCtx.beginPath();\n coor.forEach((pt, i) => {\n const [x, y] = pt.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.offScreenCtx?.moveTo(x, y);\n } else {\n this.offScreenCtx?.lineTo(x, y);\n }\n });\n this.offScreenCtx.stroke();\n const areaData = this.offScreenCtx.getImageData(\n 0,\n 0,\n this.WIDTH,\n this.HEIGHT\n );\n const index = (point[1] - 1) * this.WIDTH * 4 + point[0] * 4;\n this.offScreenCtx.restore();\n return areaData.data[index + 3] !== 0;\n }\n\n /**\n * 绘制矩形\n * @param shape 标注实例\n * @returns\n */\n drawRect(shape: Rect, sub?: Record<string, any>) {\n if (!this.ctx || shape.coor.length !== 2) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n creating,\n coor,\n lineWidth,\n rotation,\n } = shape;\n const [[x0, y0], [x1, y1]] = coor.map((a: Point) =>\n a.map((b) => Math.round(b * this.scale))\n );\n const centerX = (x0 + x1) / 2;\n const centerY = (y0 + y1) / 2;\n const w = x1 - x0;\n const h = y1 - y0;\n\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n if (sub?.isSelected) {\n this.ctx.fillStyle = sub?.selectedFillStyle || fillStyle;\n } else {\n this.ctx.fillStyle =\n active || creating ? this.activeFillStyle : fillStyle;\n }\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n\n // 应用旋转\n this.ctx.translate(centerX, centerY);\n this.ctx.rotate(rotation);\n this.ctx.translate(-centerX, -centerY);\n\n if (!creating) this.ctx.fillRect(x0, y0, w, h);\n this.ctx.strokeRect(x0, y0, w, h);\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制多边形\n * @param shape 标注实例\n */\n drawPolygon(shape: Polygon) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n creating,\n coor,\n lineWidth,\n } = shape;\n this.ctx.save();\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n\n // 如果正在创建且达到了最大点数,则自动闭合\n const shouldClose = creating && coor.length >= this.MAX_POLYGON_POINTS;\n\n if (creating && !shouldClose) {\n const [x, y] = this.mouse || [];\n this.ctx.lineTo(x - this.originX, y - this.originY);\n } else if (coor.length > 2 || shouldClose) {\n this.ctx.closePath();\n }\n this.ctx.fill();\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制点\n * @param shape 标注实例\n */\n drawDot(shape: Dot) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n creating,\n fillStyle = \"\",\n active,\n coor,\n lineWidth,\n } = shape;\n const [x, y] = coor.map((a) => a * this.scale);\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle = active ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n this.ctx.arc(x, y, this.ctrlRadius, 0, 2 * Math.PI, true);\n this.ctx.fill();\n this.ctx.arc(x, y, this.ctrlRadius, 0, 2 * Math.PI, true);\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(coor as Point, shape);\n }\n\n /**\n * 绘制圆\n * @param shape 标注实例\n */\n drawCirle(shape: Circle) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n coor,\n creating,\n radius,\n ctrlsData,\n lineWidth,\n } = shape;\n const [x, y] = coor.map((a) => a * this.scale);\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n this.ctx.arc(x, y, radius * this.scale, 0, 2 * Math.PI, true);\n this.ctx.fill();\n this.ctx.arc(x, y, radius * this.scale, 0, 2 * Math.PI, true);\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(ctrlsData[0] as Point, shape);\n }\n\n /**\n * 绘制椭圆\n * @param shape 标注实例\n */\n drawEllipse(shape: Ellipse) {\n if (!this.ctx) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n coor,\n creating,\n radiusX,\n radiusY,\n rotation,\n lineWidth,\n } = shape;\n const [x, y] = coor.map((a) => a * this.scale);\n const scaledRadiusX = radiusX * this.scale;\n const scaledRadiusY = radiusY * this.scale;\n\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n\n this.ctx.beginPath();\n // 使用 ellipse 方法绘制椭圆\n this.ctx.ellipse(\n x,\n y,\n scaledRadiusX,\n scaledRadiusY,\n rotation,\n 0,\n 2 * Math.PI,\n true\n );\n this.ctx.fill();\n this.ctx.ellipse(\n x,\n y,\n scaledRadiusX,\n scaledRadiusY,\n rotation,\n 0,\n 2 * Math.PI,\n true\n );\n this.ctx.stroke();\n\n this.ctx.restore();\n this.drawLabel(shape.ctrlsData[0] as Point, shape);\n }\n\n /**\n * 绘制文本\n * @param shape 标注实例\n */\n drawText(shape: Text) {\n if (!this.ctx || shape.coor.length !== 2) return;\n\n const {\n text = \"\",\n fontSize = 14,\n fontFamily = \"sans-serif\",\n textColor = \"#000000\",\n backgroundColor = \"transparent\",\n borderColor = \"transparent\",\n borderWidth = 0,\n borderRadius = 0,\n padding = 4,\n active,\n creating,\n coor,\n lineWidth,\n } = shape;\n\n const [[x0, y0], [x1, y1]] = coor.map((a: Point) =>\n a.map((b) => Math.round(b * this.scale))\n );\n\n const x = Math.min(x0, x1);\n const y = Math.min(y0, y1);\n const width = Math.abs(x1 - x0);\n const height = Math.abs(y1 - y0);\n\n this.ctx.save();\n\n // 设置样式\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n\n // 绘制背景\n if (backgroundColor && backgroundColor !== \"transparent\") {\n this.ctx.fillStyle = backgroundColor;\n if (borderRadius > 0) {\n this.drawRoundedRect(x, y, width, height, borderRadius);\n this.ctx.fill();\n } else {\n this.ctx.fillRect(x, y, width, height);\n }\n }\n\n // 绘制边框\n if (borderWidth > 0 && borderColor && borderColor !== \"transparent\") {\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (borderRadius > 0) {\n this.drawRoundedRect(x, y, width, height, borderRadius);\n this.ctx.stroke();\n } else {\n this.ctx.strokeRect(x, y, width, height);\n }\n }\n\n // 绘制文本\n if (text) {\n this.ctx.font = `${fontSize * this.scale}px ${fontFamily}`;\n this.ctx.fillStyle = textColor;\n this.ctx.textAlign = \"left\";\n this.ctx.textBaseline = \"top\";\n\n // 计算文本位置(考虑padding)\n const textX = x + padding * this.scale;\n const textY = y + padding * this.scale;\n const maxWidth = width - 2 * padding * this.scale;\n\n // 如果文本超出了宽度,需要截断\n this.ctx.fillText(text, textX, textY, maxWidth);\n }\n\n this.ctx.restore();\n\n // 绘制标签\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制圆角矩形\n * @param x x坐标\n * @param y y坐标\n * @param width 宽度\n * @param height 高度\n * @param radius 圆角半径\n */\n drawRoundedRect(\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number\n ) {\n if (!this.ctx) return;\n\n this.ctx.beginPath();\n this.ctx.moveTo(x + radius, y);\n this.ctx.lineTo(x + width - radius, y);\n this.ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n this.ctx.lineTo(x + width, y + height - radius);\n this.ctx.quadraticCurveTo(\n x + width,\n y + height,\n x + width - radius,\n y + height\n );\n this.ctx.lineTo(x + radius, y + height);\n this.ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n this.ctx.lineTo(x, y + radius);\n this.ctx.quadraticCurveTo(x, y, x + radius, y);\n this.ctx.closePath();\n }\n\n /**\n * 绘制折线\n * @param shape 标注实例\n */\n drawLine(shape: Line) {\n if (!this.ctx) return;\n const { strokeStyle = \"\", active, creating, coor, lineWidth } = shape;\n this.ctx.save();\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n\n // 如果正在创建且达到了2个点,则自动结束\n const shouldEnd = creating && coor.length >= 2;\n\n if (creating && !shouldEnd) {\n const [x, y] = this.mouse || [];\n this.ctx.lineTo(x - this.originX, y - this.originY);\n } else if (coor.length > 1) {\n // 折线达到2个点后自动结束绘制\n }\n this.ctx.stroke();\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n\n /**\n * 绘制网格\n * @param shape 标注实例\n * @returns\n */\n drawGrid(shape: Grid) {\n if (!this.ctx) return;\n if (shape.coor.length !== 2) return;\n const {\n strokeStyle = \"\",\n fillStyle = \"\",\n active,\n creating,\n coor,\n lineWidth,\n } = shape;\n const [[x0, y0], [x1, y1]] = coor.map((a: Point) =>\n a.map((b) => Math.round(b * this.scale))\n );\n this.ctx.save();\n this.ctx.lineWidth = lineWidth || this.lineWidth;\n this.ctx.fillStyle = active || creating ? this.activeFillStyle : fillStyle;\n this.ctx.strokeStyle =\n active || creating ? this.activeStrokeStyle : strokeStyle;\n shape.gridRects.forEach((rect: Rect, m) => {\n this.drawRect(rect, {\n selectedFillStyle:\n shape.selectedFillStyle || this.gridSelectedFillStyle,\n isSelected: shape.selected?.includes(m),\n });\n });\n const w = x1 - x0;\n const h = y1 - y0;\n if (!creating) this.ctx.fillRect(x0, y0, w, h);\n this.ctx.strokeRect(x0, y0, w, h);\n this.ctx.restore();\n this.drawLabel(coor[0], shape);\n }\n /**\n * 绘制画笔路径\n * @param shape 形状\n */\n drawBrushPath(shape: Brush) {\n if (!this.ctx) return;\n const { coor, brushSize = 1, brushStokeStyle = \"\" } = shape;\n this.ctx.save();\n this.ctx.globalCompositeOperation = \"source-over\"; // 正常绘制模式\n this.ctx.lineCap = \"round\";\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = Math.round(brushSize * this.scale);\n this.ctx.strokeStyle = brushStokeStyle;\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n this.ctx.stroke();\n this.ctx.restore();\n }\n /**\n * 绘制橡皮擦路径\n * @param coor 折线坐标\n * @param shape 形状\n */\n drawEraserPath(shape: Eraser) {\n if (!this.ctx) return;\n const { coor, eraserSize = 1 } = shape;\n this.ctx.save();\n this.ctx.globalCompositeOperation = \"destination-out\";\n this.ctx.lineCap = \"round\";\n this.ctx.lineJoin = \"round\";\n this.ctx.lineWidth = Math.round(eraserSize * this.scale);\n this.ctx.beginPath();\n coor.forEach((el: Point, i) => {\n const [x, y] = el.map((a) => Math.round(a * this.scale));\n if (i === 0) {\n this.ctx?.moveTo(x, y);\n } else {\n this.ctx?.lineTo(x, y);\n }\n });\n this.ctx.stroke();\n this.ctx.restore();\n }\n /** 清除画布 */\n clearBrush() {\n const newDateset = this.dataset.filter(\n (el) => ![Shape.Brush, Shape.Eraser].includes(el.type)\n );\n this.setData(newDateset);\n }\n\n /**\n * 绘制控制点\n * @param point 坐标\n */\n drawCtrl(point: Point, color?: string) {\n if (!this.ctx) return;\n const [x, y] = point.map((a) => a * this.scale);\n this.ctx.save();\n this.ctx.beginPath();\n this.ctx.fillStyle = color || this.ctrlFillStyle;\n this.ctx.strokeStyle = this.ctrlStrokeStyle;\n this.ctx.arc(x, y, 6, 0, 2 * Math.PI, true);\n this.ctx.fill();\n this.ctx.arc(x, y, 6, 0, 2 * Math.PI, true);\n this.ctx.stroke();\n this.ctx.restore();\n }\n\n /**\n * 绘制控制点列表\n * @param shape 标注实例\n */\n drawCtrlList(shape: Rect | Polygon | Line | Circle | Ellipse | Text) {\n shape.ctrlsData.forEach((point, i) => {\n if (shape.type === Shape.Circle) {\n if (i === 1) this.drawCtrl(point);\n } else if (shape.type === Shape.Ellipse) {\n // 对于椭圆,绘制所有控制点\n this.drawCtrl(point);\n } else {\n this.drawCtrl(\n point,\n shape.type === Shape.Rect && i === 8 ? \"yellow\" : undefined\n );\n }\n });\n }\n\n /**\n * 绘制label\n * @param point 位置\n * @param label 文本\n */\n drawLabel(point: Point, shape: AllShape) {\n const {\n label = \"\",\n labelFillStyle = \"\",\n labelFont = \"\",\n textFillStyle = \"\",\n hideLabel,\n labelUp,\n lineWidth,\n } = shape;\n const isHideLabel =\n typeof hideLabel === \"boolean\" ? hideLabel : this.hideLabel;\n const isLabelUp = typeof labelUp === \"boolean\" ? labelUp : this.labelUp;\n const currLineWidth = lineWidth || this.lineWidth;\n\n if (this.ctx && label.length && !isHideLabel) {\n this.ctx.font = labelFont || this.labelFont;\n const textPaddingLeft = 4;\n const textPaddingTop = 4;\n const newText =\n label.length < this.labelMaxLen + 1\n ? label\n : `${label.slice(0, this.labelMaxLen)}...`;\n const text = this.ctx.measureText(newText);\n const font = parseInt(this.ctx.font) - 4;\n const labelWidth = text.width + textPaddingLeft * 2;\n const labelHeight = font + textPaddingTop * 2;\n\n let [x, y] = point.map((a) => a * this.scale);\n\n // 对于矩形,如果存在旋转角度,需要调整label位置\n if (shape.type === Shape.Rect && (shape as Rect).rotation !== 0) {\n const rect = shape as Rect;\n const [[x0, y0], [x1, y1]] = rect.coor;\n const centerX = ((x0 + x1) / 2) * this.scale;\n const centerY = ((y0 + y1) / 2) * this.scale;\n\n // 将左上角点转换为相对于中心点的坐标\n const dx = x - centerX;\n const dy = y - centerY;\n\n // 应用旋转\n const rotatedX =\n dx * Math.cos(rect.rotation) - dy * Math.sin(rect.rotation);\n const rotatedY =\n dx * Math.sin(rect.rotation) + dy * Math.cos(rect.rotation);\n\n // 转换回绝对坐标\n x = rotatedX + centerX;\n y = rotatedY + centerY;\n }\n\n const toleft =\n this.IMAGE_ORIGIN_WIDTH - point[0] < labelWidth / this.scale;\n const toTop =\n this.IMAGE_ORIGIN_HEIGHT - point[1] < labelHeight / this.scale;\n const toTop2 = point[1] > labelHeight / this.scale;\n const isup = isLabelUp ? toTop2 : toTop;\n this.ctx.save();\n this.ctx.fillStyle = labelFillStyle || this.labelFillStyle;\n this.ctx.fillRect(\n toleft\n ? x - text.width - textPaddingLeft - currLineWidth / 2\n : x + currLineWidth / 2,\n isup ? y - labelHeight - currLineWidth / 2 : y + currLineWidth / 2,\n labelWidth,\n labelHeight\n );\n this.ctx.fillStyle = textFillStyle || this.textFillStyle;\n this.ctx.fillText(\n newText,\n toleft ? x - text.width : x + textPaddingLeft + currLineWidth / 2,\n isup\n ? y - labelHeight + font + textPaddingTop\n : y + font + textPaddingTop + currLineWidth / 2,\n 180\n );\n this.ctx.restore();\n }\n }\n\n /**\n * 更新画布\n */\n update() {\n window.cancelAnimationFrame(this.timer);\n this.timer = window.requestAnimationFrame(() => {\n if (!this.ctx) return;\n this.ctx.save();\n this.ctx.clearRect(0, 0, this.WIDTH, this.HEIGHT);\n this.ctx.translate(this.originX, this.originY);\n\n const renderList = this.focusMode\n ? this.activeShape.type\n ? [this.activeShape]\n : []\n : this.dataset;\n const BrushAndErasers = renderList.filter(\n (item) => item.type === Shape.Brush || item.type === Shape.Eraser\n );\n for (let i = 0; i < BrushAndErasers.length; i++) {\n const shape = BrushAndErasers[i];\n if (shape.hide) continue;\n switch (shape.type) {\n case Shape.Brush:\n shape.brushSize = shape.brushSize ?? this.brushSize;\n shape.brushStokeStyle =\n shape.brushStokeStyle ?? this.brushStokeStyle;\n this.drawBrushPath(shape as Brush);\n break;\n case Shape.Eraser:\n shape.eraserSize = shape.eraserSize ?? this.eraserSize;\n this.drawEraserPath(shape as Eraser);\n break;\n default:\n break;\n }\n }\n const NormalShapes = renderList.filter(\n (item) => item.type !== Shape.Brush && item.type !== Shape.Eraser\n );\n for (let i = 0; i < NormalShapes.length; i++) {\n const shape = NormalShapes[i];\n if (shape.hide) continue;\n switch (shape.type) {\n case Shape.Rect:\n this.drawRect(shape as Rect);\n break;\n case Shape.Polygon:\n this.drawPolygon(shape as Polygon);\n break;\n case Shape.Dot:\n this.drawDot(shape as Dot);\n break;\n case Shape.Line:\n this.drawLine(shape as Line);\n break;\n case Shape.Circle:\n this.drawCirle(shape as Circle);\n break;\n case Shape.Ellipse:\n this.drawEllipse(shape as Ellipse);\n break;\n case Shape.Grid:\n this.drawGrid(shape as Grid);\n break;\n case Shape.Text:\n this.drawText(shape as Text);\n break;\n default:\n break;\n }\n }\n if (!this.isCtrlKey && this.showCross) {\n this.drawLine(this.crossX);\n this.drawLine(this.crossY);\n }\n if (\n [\n Shape.Rect,\n Shape.Polygon,\n Shape.Line,\n Shape.Circle,\n Shape.Grid,\n Shape.Ellipse,\n Shape.Text,\n ].includes(this.activeShape.type) &&\n !this.activeShape.hide\n ) {\n this.drawCtrlList(this.activeShape);\n }\n this.ctx.globalCompositeOperation = \"destination-over\";\n if (this.IMAGE_WIDTH && this.IMAGE_HEIGHT) {\n this.ctx.drawImage(\n this.image,\n 0,\n 0,\n this.IMAGE_WIDTH,\n this.IMAGE_HEIGHT\n );\n }\n this.ctx.globalCompositeOperation = \"source-over\";\n this.ctx.restore();\n this.emit(\"updated\", this.dataset);\n });\n }\n\n /**\n * 通过索引删除指定形状\n * @param index number\n */\n deleteByIndex(index: number) {\n const num = this.dataset.findIndex((x) => x.index === index);\n if (num > -1) {\n this.emit(\"delete\", this.dataset[num]);\n this.dataset.splice(num, 1);\n this.dataset.forEach((item, i) => {\n item.index = i;\n });\n this.update();\n }\n }\n\n /**\n * 通过uuid删除指定形状\n * @param index string\n */\n deleteByUuid(uuid: string) {\n const target = this.dataset.find((x) => x.uuid === uuid);\n if (target) {\n this.emit(\"delete\", target);\n this.dataset = this.dataset.filter((x) => x.uuid !== uuid);\n this.update();\n }\n }\n\n /**\n * 计算缩放步长\n */\n calcStep(flag = \"\") {\n if (this.IMAGE_WIDTH < this.WIDTH && this.IMAGE_HEIGHT < this.HEIGHT) {\n if (flag === \"\" || flag === \"b\") {\n this.setScale(true, false, true);\n this.calcStep(\"b\");\n }\n }\n if (this.IMAGE_WIDTH > this.WIDTH || this.IMAGE_HEIGHT > this.HEIGHT) {\n if (flag === \"\" || flag === \"s\") {\n this.setScale(false, false, true);\n this.calcStep(\"s\");\n }\n }\n }\n\n /**\n * 缩放\n * @param type true放大5%,false缩小5%\n * @param center 缩放中心 center|mouse\n * @param pure 不绘制\n */\n setScale(type: boolean, byMouse = false, pure = false) {\n if (this.lock) return;\n if (\n (!type && this.imageMin < 20) ||\n (type && this.IMAGE_WIDTH > this.imageOriginMax * 100)\n )\n return;\n if (type) {\n this.scaleStep++;\n } else {\n this.scaleStep--;\n }\n let realToLeft = 0;\n let realToRight = 0;\n const [x, y] = this.mouse || [];\n if (byMouse) {\n realToLeft = (x - this.originX) / this.scale;\n realToRight = (y - this.originY) / this.scale;\n }\n const abs = Math.abs(this.scaleStep);\n const width = this.IMAGE_WIDTH;\n\n this.IMAGE_WIDTH = Math.round(\n this.IMAGE_ORIGIN_WIDTH * (this.scaleStep >= 0 ? 1.05 : 0.95) ** abs\n );\n this.IMAGE_HEIGHT = Math.round(\n this.IMAGE_ORIGIN_HEIGHT * (this.scaleStep >= 0 ? 1.05 : 0.95) ** abs\n );\n if (byMouse) {\n this.originX = x - realToLeft * this.scale;\n this.originY = y - realToRight * this.scale;\n } else {\n const scale = this.IMAGE_WIDTH / width;\n this.originX = this.WIDTH / 2 - (this.WIDTH / 2 - this.originX) * scale;\n this.originY = this.HEIGHT / 2 - (this.HEIGHT / 2 - this.originY) * scale;\n }\n if (!pure) {\n this.update();\n }\n }\n\n /**\n * 适配背景图\n */\n fitZoom() {\n this.calcStep();\n if (this.IMAGE_HEIGHT / this.IMAGE_WIDTH >= this.HEIGHT / this.WIDTH) {\n this.IMAGE_WIDTH =\n this.IMAGE_ORIGIN_WIDTH / (this.IMAGE_ORIGIN_HEIGHT / this.HEIGHT);\n this.IMAGE_HEIGHT = this.HEIGHT;\n } else {\n this.IMAGE_WIDTH = this.WIDTH;\n this.IMAGE_HEIGHT =\n this.IMAGE_ORIGIN_HEIGHT / (this.IMAGE_ORIGIN_WIDTH / this.WIDTH);\n }\n this.originX = (this.WIDTH - this.IMAGE_WIDTH) / 2;\n this.originY = (this.HEIGHT - this.IMAGE_HEIGHT) / 2;\n this.update();\n }\n\n /**\n * 设置专注模式\n * @param type {boolean}\n */\n setFocusMode(type: boolean) {\n this.focusMode = type;\n this.update();\n }\n\n /**\n * 销毁\n */\n destroy() {\n if (!this.canvas) return;\n this.image.removeEventListener(\"load\", this.handleLoad);\n this.canvas.removeEventListener(\"contextmenu\", this.handleContextmenu);\n // @ts-ignore\n this.canvas.removeEventListener(\"mousewheel\", this.handleMousewheel);\n this.canvas.removeEventListener(\"wheel\", this.handleMousewheel);\n this.canvas.removeEventListener(\"mousedown\", this.handleMouseDown);\n this.canvas.removeEventListener(\"touchend\", this.handleMouseDown);\n this.canvas.removeEventListener(\"mousemove\", this.handleMouseMove);\n this.canvas.removeEventListener(\"touchmove\", this.handleMouseMove);\n this.canvas.removeEventListener(\"mouseup\", this.handleMouseUp);\n this.canvas.removeEventListener(\"touchend\", this.handleMouseUp);\n this.canvas.removeEventListener(\"dblclick\", this.handleDblclick);\n document.body.removeEventListener(\"keydown\", this.handleKeydown, true);\n document.body.removeEventListener(\"keyup\", this.handleKeyup, true);\n this.canvas.width = this.WIDTH;\n this.canvas.height = this.HEIGHT;\n this.canvas.style.width = \"\";\n this.canvas.style.height = \"\";\n this.canvas.style.userSelect = \"\";\n }\n\n /**\n * 重新设置画布大小\n */\n resize() {\n if (!this.canvas) return;\n this.canvas.removeAttribute(\"width\");\n this.canvas.removeAttribute(\"height\");\n this.canvas.style.width = \"\";\n this.canvas.style.height = \"\";\n this.initSetting();\n this.update();\n }\n}\n","export function createUuid(): string {\n const s: any[] = [];\n const hexDigits = \"0123456789abcdef\";\n for (let i = 0; i < 36; i++) {\n const m = Math.floor(Math.random() * 0x10);\n s[i] = hexDigits.slice(m, m + 1);\n }\n s[14] = \"4\";\n const n = (s[19] & 0x3) | 0x8;\n s[19] = hexDigits.slice(n, n + 1);\n s[8] = s[13] = s[18] = s[23] = \"-\";\n const uuid = s.join(\"\");\n return uuid;\n}\n","import Shape from './Shape';\n\nexport default class Rect extends Shape {\n public type = 1\n /** 旋转角度(弧度) */\n public rotation: number = 0\n /** 是否显示旋转控制点 */\n public showRotation: boolean | undefined\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.lineWidth = item.lineWidth ?? base.lineWidth\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n this.showRotation = item.showRotation ?? base.showRotation\n }\n get ctrlsData() {\n const [[x0, y0], [x1, y1]] = this.coor;\n const centerX = (x0 + x1) / 2;\n const centerY = (y0 + y1) / 2;\n const width = x1 - x0;\n const height = y1 - y0;\n\n // 基础控制点(8个边角和中点控制点)\n const baseCtrls = [\n [x0, y0],\n [x0 + width / 2, y0],\n [x1, y0],\n [x1, y0 + height / 2],\n [x1, y1],\n [x0 + width / 2, y1],\n [x0, y1],\n [x0, y0 + height / 2]\n ];\n\n // 如果需要显示旋转控制点,则添加到控制点数组中\n if (this.showRotation) {\n baseCtrls.push([centerX, y0 - 20, 'green']);\n }\n\n // 如果矩形没有旋转,直接返回控制点\n if (this.rotation === 0) {\n return baseCtrls;\n }\n\n // 应用旋转变换到所有控制点\n return baseCtrls.map(([x, y]) => {\n // 将点转换为相对于中心点的坐标\n const dx = x - centerX;\n const dy = y - centerY;\n\n // 应用旋转\n const rotatedX = dx * Math.cos(this.rotation) - dy * Math.sin(this.rotation);\n const rotatedY = dx * Math.sin(this.rotation) + dy * Math.cos(this.rotation);\n\n // 转换回绝对坐标\n return [rotatedX + centerX, rotatedY + centerY];\n });\n }\n\n /** 获取矩形的中心点 */\n get center(): [number, number] {\n const [[x0, y0], [x1, y1]] = this.coor;\n return [(x0 + x1) / 2, (y0 + y1) / 2];\n }\n}\n","import Shape from './Shape';\n\nexport default class Polygon extends Shape {\n public type = 2\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n get ctrlsData() {\n return this.coor.length > 2 ? this.coor : [];\n }\n}\n","import Shape from './Shape';\n\nexport default class Dot extends Shape {\n public type = 3\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n}\n","export default class EventBus {\n private _eventTree: Record<string, any> = {}\n /**\n * 注册事件\n * @param eventName 事件名称\n * @param cb 回调方法\n */\n on(eventName: string, cb: Function) {\n const fns = this._eventTree[eventName];\n if (Array.isArray(fns)) {\n fns.push(cb);\n } else {\n this._eventTree[eventName] = [cb];\n }\n }\n\n /**\n * 触发事件\n * @param eventName 事件名称\n * @param payload 传递参数\n */\n emit(eventName: string, ...payload: any) {\n const fns = this._eventTree[eventName];\n if (Array.isArray(fns)) {\n fns.forEach((fn) => fn(...payload));\n }\n }\n\n /**\n * 注销事件\n * @param eventName 事件名称\n * @param cb 传递参数\n */\n off(eventName: string, cb: Function) {\n const fns = this._eventTree[eventName];\n const index = fns.find((fn: Function) => fn === cb);\n if (Array.isArray(fns) && index) {\n fns.splice(index, 1);\n }\n }\n}\n","import Shape from './Shape';\n\nexport default class Line extends Shape {\n public type = 4\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n get ctrlsData() {\n return this.coor.length > 1 ? this.coor : [];\n }\n}\n","import Shape from './Shape';\n\nexport default class Circle extends Shape {\n public type = 5\n public radius = 0\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.radius = item.radius || this.radius\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n get ctrlsData() {\n const [x, y] = this.coor\n return [\n [x, y - this.radius],\n [x + this.radius, y],\n [x, y + this.radius],\n [x - this.radius, y]\n ]\n }\n}\n","import Shape from './Shape';\nimport Rect from './Rect'\n\nexport default class Grid extends Shape {\n public type = 6\n public row = 1\n public col = 1\n public selected: number[] = []\n public selectedFillStyle: string | undefined\n\n constructor(item: any, index: number, base: any) {\n super(item, index)\n this.row = item.row > 0 ? item.row : this.row\n this.col = item.col > 0 ? item.col : this.col\n this.selected = Array.isArray(item.selected) ? item.selected : []\n this.fillStyle = item.fillStyle ?? base.fillStyle\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle\n }\n\n get ctrlsData() {\n const [[x0, y0], [x1, y1]] = this.coor;\n return [\n [x0, y0],\n [x0 + (x1 - x0) / 2, y0],\n [x1, y0],\n [x1, y0 + (y1 - y0) / 2],\n [x1, y1],\n [x0 + (x1 - x0) / 2, y1],\n [x0, y1],\n [x0, y0 + (y1 - y0) / 2],\n ];\n }\n\n get gridRects() {\n const [[x0, y0], [x1, y1]] = this.coor;\n const { row, col, strokeStyle, fillStyle, active, creating, lineWidth } = this;\n const w = (x1 - x0) / this.col;\n const h = (y1 - y0) / this.row;\n const list: Rect[] = []\n for (let i = 0; i < row; i++) {\n for (let j = 0; j < col; j++) {\n const startPoint = [x0 + j * w, y0 + i * h];\n const index = i * col + j;\n const shape = new Rect({\n coor: [startPoint, [startPoint[0] + w, startPoint[1] + h]],\n strokeStyle, fillStyle, active, creating, lineWidth\n }, index, {});\n list.push(shape)\n }\n }\n return list;\n }\n}\n","import Shape from './Shape';\nimport { Point } from '../index';\n\nexport default class Brush extends Shape {\n public type = 7;\n public coor: Point[] = [];\n public brushSize: number | undefined;\n public brushStokeStyle: string | undefined;\n\n constructor(data: any, index: number, base: any) {\n super(data, index);\n this.brushSize = data.brushSize ?? base.brushSize\n this.brushStokeStyle = data.brushStokeStyle ?? base.brushStokeStyle\n this.coor = data.coor\n }\n}\n","import Shape from './Shape';\nimport { Point } from '../index';\n\nexport default class Eraser extends Shape {\n public type = 8;\n public coor: Point[] = [];\n public eraserSize: number | undefined;\n\n constructor(data: any, index: number, base: any) {\n super(data, index);\n this.eraserSize = data.eraserSize ?? base.eraserSize;\n this.coor = data.coor;\n }\n}\n","import Shape from \"./Shape\";\r\n\r\nexport default class Ellipse extends Shape {\r\n public type = 9; // 椭圆类型\r\n public radiusX = 0; // 水平半径\r\n public radiusY = 0; // 垂直半径\r\n public rotation = 0; // 旋转角度(弧度)\r\n\r\n constructor(item: any, index: number, base: any) {\r\n super(item, index);\r\n this.radiusX = item.radiusX || this.radiusX;\r\n this.radiusY = item.radiusY || this.radiusY;\r\n this.rotation = item.rotation || this.rotation;\r\n this.fillStyle = item.fillStyle ?? base.fillStyle;\r\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle;\r\n this.lineWidth = item.lineWidth ?? base.lineWidth;\r\n }\r\n\r\n get ctrlsData() {\r\n const [x, y] = this.coor;\r\n // 返回椭圆的控制点:上、右、下、左四个点\r\n return [\r\n [x, y - this.radiusY], // 上方控制点\r\n [x + this.radiusX, y], // 右方控制点\r\n [x, y + this.radiusY], // 下方控制点\r\n [x - this.radiusX, y], // 左方控制点\r\n ];\r\n }\r\n\r\n // 获取椭圆的边界框\r\n get boundingBox() {\r\n const [x, y] = this.coor;\r\n return [\r\n [x - this.radiusX, y - this.radiusY], // 左上角\r\n [x + this.radiusX, y + this.radiusY], // 右下角\r\n ];\r\n }\r\n\r\n // 检查点是否在椭圆内\r\n isPointInEllipse(pointX: number, pointY: number) {\r\n const [cx, cy] = this.coor;\r\n // 考虑旋转的点是否在椭圆内的检测\r\n if (this.rotation !== 0) {\r\n // 将点绕椭圆中心反向旋转\r\n const cos = Math.cos(-this.rotation);\r\n const sin = Math.sin(-this.rotation);\r\n const dx = pointX - cx;\r\n const dy = pointY - cy;\r\n const rotatedX = dx * cos - dy * sin;\r\n const rotatedY = dx * sin + dy * cos;\r\n\r\n // 在未旋转的椭圆中检查点\r\n return (\r\n (rotatedX * rotatedX) / (this.radiusX * this.radiusX) +\r\n (rotatedY * rotatedY) / (this.radiusY * this.radiusY) <=\r\n 1\r\n );\r\n } else {\r\n // 无旋转情况下的简单检查\r\n const dx = (pointX - cx) / this.radiusX;\r\n const dy = (pointY - cy) / this.radiusY;\r\n return dx * dx + dy * dy <= 1;\r\n }\r\n }\r\n}\r\n","import Shape from './Shape';\r\n\r\nexport default class Text extends Shape {\r\n public type = 10;\r\n \r\n /** 文本内容 */\r\n public text: string = '';\r\n \r\n /** 字体大小 */\r\n public fontSize: number = 14;\r\n \r\n /** 字体族 */\r\n public fontFamily: string = 'sans-serif';\r\n \r\n /** 文本颜色 */\r\n public textColor: string = '#000000';\r\n \r\n /** 背景颜色 */\r\n public backgroundColor: string = 'transparent';\r\n \r\n /** 边框颜色 */\r\n public borderColor: string = 'transparent';\r\n \r\n /** 边框宽度 */\r\n public borderWidth: number = 0;\r\n \r\n /** 圆角半径 */\r\n public borderRadius: number = 0;\r\n \r\n /** 内边距 */\r\n public padding: number = 4;\r\n \r\n /** 文本对齐方式 */\r\n public textAlign: CanvasTextAlign = 'left';\r\n \r\n /** 文本基线 */\r\n public textBaseline: CanvasTextBaseline = 'top';\r\n \r\n constructor(item: any, index: number, base: any) {\r\n super(item, index);\r\n \r\n // 设置文本相关属性\r\n this.text = item.text ?? '';\r\n this.fontSize = item.fontSize ?? base.fontSize ?? this.fontSize;\r\n this.fontFamily = item.fontFamily ?? base.fontFamily ?? this.fontFamily;\r\n this.textColor = item.textColor ?? base.textColor ?? base.strokeStyle ?? this.textColor;\r\n this.backgroundColor = item.backgroundColor ?? base.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = item.borderColor ?? base.borderColor ?? this.borderColor;\r\n this.borderWidth = item.borderWidth ?? base.borderWidth ?? this.borderWidth;\r\n this.borderRadius = item.borderRadius ?? base.borderRadius ?? this.borderRadius;\r\n this.padding = item.padding ?? base.padding ?? this.padding;\r\n this.textAlign = item.textAlign ?? base.textAlign ?? this.textAlign;\r\n this.textBaseline = item.textBaseline ?? base.textBaseline ?? this.textBaseline;\r\n \r\n // 兼容旧属性\r\n this.strokeStyle = item.strokeStyle ?? base.strokeStyle;\r\n this.fillStyle = item.fillStyle ?? base.fillStyle;\r\n }\r\n \r\n /**\r\n * 获取控制点数据\r\n */\r\n get ctrlsData() {\r\n // 文本框的控制点通常在四个角和四条边的中点\r\n if (this.coor.length < 2) return [];\r\n \r\n const [[x0, y0], [x1, y1]] = this.coor;\r\n const centerX = (x0 + x1) / 2;\r\n const centerY = (y0 + y1) / 2;\r\n \r\n return [\r\n [x0, y0], // 左上角\r\n [centerX, y0], // 上边中点\r\n [x1, y0], // 右上角\r\n [x1, centerY], // 右边中点\r\n [x1, y1], // 右下角\r\n [centerX, y1], // 下边中点\r\n [x0, y1], // 左下角\r\n [x0, centerY] // 左边中点\r\n ];\r\n }\r\n \r\n /**\r\n * 获取文本框的宽度\r\n */\r\n get width(): number {\r\n if (this.coor.length < 2) return 0;\r\n const [[x0], [x1]] = this.coor;\r\n return Math.abs(x1 - x0);\r\n }\r\n \r\n /**\r\n * 获取文本框的高度\r\n */\r\n get height(): number {\r\n if (this.coor.length < 2) return 0;\r\n const [[, y0], [, y1]] = this.coor;\r\n return Math.abs(y1 - y0);\r\n }\r\n \r\n /**\r\n * 获取文本框的中心点\r\n */\r\n get center(): [number, number] {\r\n if (this.coor.length < 2) return [0, 0];\r\n const [[x0, y0], [x1, y1]] = this.coor;\r\n return [(x0 + x1) / 2, (y0 + y1) / 2];\r\n }\r\n}\r\n"],"names":["Shape","item","index","this","label","coor","active","creating","dragging","uuid","s","hexDigits","i","m","Math","floor","random","slice","n","join","createUuid","Object","assign","Rect","_super","base","_this","call","type","rotation","lineWidth","_a","fillStyle","_b","strokeStyle","_c","showRotation","_d","__extends","defineProperty","prototype","get","__read","x0","y0","x1","y1","centerX","centerY","width","height","baseCtrls","push","map","x","y","dx","dy","rotatedX","cos","sin","rotatedY","Polygon","length","Dot","EventBus","_eventTree","on","eventName","cb","fns","Array","isArray","emit","payload","_i","arguments","forEach","fn","apply","__spreadArray","off","find","splice","Line","Circle","radius","Grid","row","col","selected","w","h","list","j","startPoint","shape","Brush","data","brushSize","brushStokeStyle","Eraser","eraserSize","Ellipse","radiusX","radiusY","isPointInEllipse","pointX","pointY","cx","cy","Text","text","fontSize","fontFamily","textColor","backgroundColor","borderColor","borderWidth","borderRadius","padding","textAlign","textBaseline","_e","_h","_f","_k","_j","_m","_l","_p","_o","_r","_q","_t","_s","_v","_u","_x","_w","_y","_z","abs","CanvasSelect","el","src","version","pkg","lock","readonly","MIN_WIDTH","MIN_HEIGHT","MIN_RADIUS","MAX_POLYGON_POINTS","activeStrokeStyle","activeFillStyle","ctrlStrokeStyle","ctrlFillStyle","ctrlRadius","hideLabel","labelFillStyle","labelFont","textFillStyle","labelMaxLen","WIDTH","maxPolygonPoint","HEIGHT","crossX","crossY","crossStroke","showCross","dataset","isMagnifierVisible","magnifierPosition","remmber","mouse","remmberOrigin","createType","None","ctrlIndex","image","Image","IMAGE_ORIGIN_WIDTH","IMAGE_WIDTH","IMAGE_ORIGIN_HEIGHT","IMAGE_HEIGHT","originX","originY","scaleStep","scrollZoom","timer","dblTouch","dblTouchStore","alpha","focusMode","scaleTouchStore","isTouch2","isMobile","navigator","userAgent","includes","labelUp","isCtrlKey","ctrlCode","gridMenuEnable","gridSelectedFillStyle","position","handleLoad","bind","handleContextmenu","handleMousewheel","handleMouseDown","handleMouseMove","handleMouseUp","handleDblclick","handleKeyup","handleKeydown","container","document","querySelector","HTMLCanvasElement","canvas","offScreen","createElement","initSetting","initEvents","setImage","console","warn","min","max","createMagnifierCanvas","magnifierCanvas","magnifierCtx","getContext","willReadFrequently","style","pointerEvents","zIndex","border","body","appendChild","createMagnifier","updateMagnifier","magnifierSize","dpr","window","devicePixelRatio","clearRect","mx","my","left","concat","top","originImageData","getImageDataFromCanvas","areaImageData","createImageData","count","k","putImageData","strokeRect","destroyMagnifier","remove","undefined","context","getImageData","mergeEvent","e","mouseX","mouseY","mouseCX","mouseCY","touches","clientX","clientY","target","getBoundingClientRect","top_1","round","clientX1","_g","clientY1","offsetX","offsetY","__assign","fitZoom","preventDefault","stopPropagation","setScale","deltaY","scale","buttons","ctrls","activeShape","ctrlsData","findIndex","isPointInCircle","isInBackground","nx","ny","hitOnShape","hitShapeIndex_1","hitShape","pt","sort","a","b","newShape","curPoint","sp","update","rowCol","prompt","split","test","Number","center","atan2","PI","a0","b0","a1","b1","newPoint","newRadius","ux","uy","noLimit","t1","tar","r","sqrt","pow","which","touch0","touch1","cur","Date","now","pop","canPolygon","canLine","canPolygonByMaxPoints","canLineByTwoPoints","gridRects","rect","isPointInRect","thisIndex","code","activeElement","key","isPolygonAtMaxPoints","isLineAtTwoPoints","deleteByIndex","crossOrigin","userSelect","ctx","clientWidth","clientHeight","offScreenCtx","addEventListener","source","complete","setData","setTimeout","initdata","toString","mousePoint","hitShapeIndex","log","hide","isPointInPolygon","isPointInLine","point","save","translate","beginPath","moveTo","lineTo","closePath","fill","areaData","restore","stroke","drawRect","sub","isSelected","selectedFillStyle","rotate","fillRect","drawLabel","drawPolygon","lineJoin","shouldClose","drawDot","arc","drawCirle","drawEllipse","scaledRadiusX","scaledRadiusY","ellipse","drawText","drawRoundedRect","font","textX","textY","maxWidth","fillText","quadraticCurveTo","drawLine","shouldEnd","drawGrid","drawBrushPath","globalCompositeOperation","lineCap","drawEraserPath","clearBrush","newDateset","filter","drawCtrl","color","drawCtrlList","isHideLabel","isLabelUp","currLineWidth","newText","measureText","parseInt","labelWidth","textPaddingLeft","labelHeight","textPaddingTop","toleft","toTop","toTop2","isup","cancelAnimationFrame","requestAnimationFrame","renderList","BrushAndErasers","NormalShapes","drawImage","num","deleteByUuid","calcStep","flag","byMouse","pure","imageMin","imageOriginMax","realToLeft","realToRight","setFocusMode","destroy","removeEventListener","resize","removeAttribute"],"mappings":"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"}