luo-image-annotator 0.0.7 → 0.0.8

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,59 +1,59 @@
1
1
  var Jt = Object.defineProperty;
2
2
  var jt = (m, t, i) => t in m ? Jt(m, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : m[t] = i;
3
- var A = (m, t, i) => jt(m, typeof t != "symbol" ? t + "" : t, i);
4
- import { defineComponent as Q, ref as k, watchEffect as Xt, openBlock as y, createElementBlock as b, normalizeClass as E, computed as U, onMounted as Yt, watch as j, createElementVNode as g, toDisplayString as $, Fragment as L, renderList as R, normalizeStyle as O, createCommentVNode as z, createVNode as P, createTextVNode as X, withDirectives as it, vModelText as ot, createBlock as vt, nextTick as qt } from "vue";
3
+ var I = (m, t, i) => jt(m, typeof t != "symbol" ? t + "" : t, i);
4
+ import { defineComponent as G, ref as k, watchEffect as Xt, openBlock as y, createElementBlock as x, normalizeClass as V, computed as O, onMounted as Yt, watch as J, createElementVNode as g, toDisplayString as $, Fragment as L, renderList as F, normalizeStyle as N, createCommentVNode as z, createVNode as H, createTextVNode as j, withDirectives as it, vModelText as ot, createBlock as mt, nextTick as qt } from "vue";
5
5
  const at = (m, t) => Math.sqrt(Math.pow(m.x - t.x, 2) + Math.pow(m.y - t.y, 2)), Gt = (m, t) => {
6
6
  let i = !1;
7
- for (let n = 0, r = t.length - 1; n < t.length; r = n++) {
8
- const o = t[n].x, c = t[n].y, a = t[r].x, d = t[r].y;
9
- c > m.y != d > m.y && m.x < (a - o) * (m.y - c) / (d - c) + o && (i = !i);
7
+ for (let e = 0, l = t.length - 1; e < t.length; l = e++) {
8
+ const r = t[e].x, c = t[e].y, o = t[l].x, h = t[l].y;
9
+ c > m.y != h > m.y && m.x < (o - r) * (m.y - c) / (h - c) + r && (i = !i);
10
10
  }
11
11
  return i;
12
- }, mt = (m, t, i) => {
13
- const n = i * (Math.PI / 180), r = Math.cos(n), o = Math.sin(n), c = m.x - t.x, a = m.y - t.y;
12
+ }, ft = (m, t, i) => {
13
+ const e = i * (Math.PI / 180), l = Math.cos(e), r = Math.sin(e), c = m.x - t.x, o = m.y - t.y;
14
14
  return {
15
- x: t.x + (c * r - a * o),
16
- y: t.y + (c * o + a * r)
15
+ x: t.x + (c * l - o * r),
16
+ y: t.y + (c * r + o * l)
17
17
  };
18
18
  };
19
19
  class Kt {
20
20
  constructor(t) {
21
- A(this, "canvas");
22
- A(this, "ctx");
23
- A(this, "img");
24
- A(this, "annotations", []);
21
+ I(this, "canvas");
22
+ I(this, "ctx");
23
+ I(this, "img");
24
+ I(this, "annotations", []);
25
25
  // 状态
26
- A(this, "currentTool", null);
27
- A(this, "interactionMode", "none");
28
- A(this, "activeAnnotation", null);
29
- A(this, "hoverAnnotation", null);
30
- A(this, "isDrawing", !1);
31
- A(this, "isDragging", !1);
32
- A(this, "isPanning", !1);
26
+ I(this, "currentTool", null);
27
+ I(this, "interactionMode", "none");
28
+ I(this, "activeAnnotation", null);
29
+ I(this, "hoverAnnotation", null);
30
+ I(this, "isDrawing", !1);
31
+ I(this, "isDragging", !1);
32
+ I(this, "isPanning", !1);
33
33
  // 平移模式
34
- A(this, "panStartPoint", null);
34
+ I(this, "panStartPoint", null);
35
35
  // 平移起点
36
- A(this, "dragStartPoint", null);
37
- A(this, "dragStartAnnotation", null);
36
+ I(this, "dragStartPoint", null);
37
+ I(this, "dragStartAnnotation", null);
38
38
  // 快照用于撤销/diff
39
- A(this, "lastMouseMovePoint", null);
39
+ I(this, "lastMouseMovePoint", null);
40
40
  // 用于绘制辅助线
41
- A(this, "isHoveringStartPoint", !1);
41
+ I(this, "isHoveringStartPoint", !1);
42
42
  // 多边形闭合吸附状态
43
43
  // 设置
44
- A(this, "currentLabelColor", "#FF4081");
44
+ I(this, "currentLabelColor", "#FF4081");
45
45
  // 当前选中标签颜色
46
- A(this, "visibleLabels", /* @__PURE__ */ new Set());
46
+ I(this, "visibleLabels", /* @__PURE__ */ new Set());
47
47
  // 可见标签集合 (如果为空则全部可见,或者由外部控制渲染列表)
48
48
  // 交互
49
- A(this, "selectedHandleIndex", -1);
49
+ I(this, "selectedHandleIndex", -1);
50
50
  // -1: 主体, >=0: 顶点索引, -2: 旋转手柄
51
- A(this, "hoverHandleIndex", -1);
51
+ I(this, "hoverHandleIndex", -1);
52
52
  // 视口
53
- A(this, "scale", 1);
54
- A(this, "offset", { x: 0, y: 0 });
55
- A(this, "listeners", {});
56
- A(this, "imageUrl", "");
53
+ I(this, "scale", 1);
54
+ I(this, "offset", { x: 0, y: 0 });
55
+ I(this, "listeners", {});
56
+ I(this, "imageUrl", "");
57
57
  this.canvas = t;
58
58
  const i = t.getContext("2d");
59
59
  if (!i) throw new Error("Could not get 2d context");
@@ -66,7 +66,7 @@ class Kt {
66
66
  this.listeners[t] || (this.listeners[t] = []), this.listeners[t].push(i);
67
67
  }
68
68
  emit(t, i) {
69
- this.listeners[t] && this.listeners[t].forEach((n) => n(i));
69
+ this.listeners[t] && this.listeners[t].forEach((e) => e(i));
70
70
  }
71
71
  loadImage(t) {
72
72
  this.imageUrl = t, this.img.src = t, this.activeAnnotation = null, this.isDrawing = !1;
@@ -87,10 +87,10 @@ class Kt {
87
87
  this.visibleLabels = new Set(t), this.render();
88
88
  }
89
89
  zoom(t) {
90
- const n = t > 0 ? this.scale * 1.1 : this.scale / 1.1;
91
- if (n < 0.1 || n > 10) return;
92
- const r = this.canvas.width / 2, o = this.canvas.height / 2, c = this.toImageCoords(r, o);
93
- this.scale = n, this.offset.x = r - c.x * this.scale, this.offset.y = o - c.y * this.scale, this.render();
90
+ const e = t > 0 ? this.scale * 1.1 : this.scale / 1.1;
91
+ if (e < 0.1 || e > 10) return;
92
+ const l = this.canvas.width / 2, r = this.canvas.height / 2, c = this.toImageCoords(l, r);
93
+ this.scale = e, this.offset.x = l - c.x * this.scale, this.offset.y = r - c.y * this.scale, this.render();
94
94
  }
95
95
  resize() {
96
96
  this.fitImageToCanvas(), this.render();
@@ -112,8 +112,8 @@ class Kt {
112
112
  const t = this.canvas.parentElement;
113
113
  if (t) {
114
114
  if (this.canvas.width = t.clientWidth, this.canvas.height = t.clientHeight, this.img.width === 0) return;
115
- const i = this.canvas.width / this.img.width, n = this.canvas.height / this.img.height;
116
- this.scale = Math.min(i, n), this.offset.x = (this.canvas.width - this.img.width * this.scale) / 2, this.offset.y = (this.canvas.height - this.img.height * this.scale) / 2;
115
+ const i = this.canvas.width / this.img.width, e = this.canvas.height / this.img.height;
116
+ this.scale = Math.min(i, e), this.offset.x = (this.canvas.width - this.img.width * this.scale) / 2, this.offset.y = (this.canvas.height - this.img.height * this.scale) / 2;
117
117
  }
118
118
  }
119
119
  // --- 事件处理 ---
@@ -124,39 +124,39 @@ class Kt {
124
124
  this.interactionMode === "select" && (t.key === "Delete" || t.key === "Backspace") && this.activeAnnotation && this.deleteAnnotation(this.activeAnnotation.id);
125
125
  }
126
126
  deleteAnnotation(t) {
127
- const i = this.annotations.findIndex((n) => n.id === t);
127
+ const i = this.annotations.findIndex((e) => e.id === t);
128
128
  if (i > -1) {
129
- const n = this.annotations[i];
129
+ const e = this.annotations[i];
130
130
  this.annotations.splice(i, 1), this.activeAnnotation = null, this.emit("annotationChange", {
131
131
  action: "delete",
132
- changedItem: n,
132
+ changedItem: e,
133
133
  imageUrl: this.imageUrl
134
134
  }), this.render();
135
135
  }
136
136
  }
137
137
  handleMouseDown(t) {
138
- const i = this.canvas.getBoundingClientRect(), n = t.clientX - i.left, r = t.clientY - i.top, o = this.toImageCoords(n, r);
138
+ const i = this.canvas.getBoundingClientRect(), e = t.clientX - i.left, l = t.clientY - i.top, r = this.toImageCoords(e, l);
139
139
  if (this.canvas.style.cursor === "grab" || this.canvas.style.cursor === "grabbing") {
140
- this.isPanning = !0, this.panStartPoint = { x: n, y: r }, this.canvas.style.cursor = "grabbing";
140
+ this.isPanning = !0, this.panStartPoint = { x: e, y: l }, this.canvas.style.cursor = "grabbing";
141
141
  return;
142
142
  }
143
143
  if (this.interactionMode === "select" && this.activeAnnotation) {
144
- const d = this.getHitHandle(n, r, this.activeAnnotation);
145
- if (d !== -100) {
146
- this.isDragging = !0, this.dragStartPoint = o, this.selectedHandleIndex = d, this.dragStartAnnotation = JSON.parse(JSON.stringify(this.activeAnnotation));
144
+ const h = this.getHitHandle(e, l, this.activeAnnotation);
145
+ if (h !== -100) {
146
+ this.isDragging = !0, this.dragStartPoint = r, this.selectedHandleIndex = h, this.dragStartAnnotation = JSON.parse(JSON.stringify(this.activeAnnotation));
147
147
  return;
148
148
  }
149
149
  }
150
- const c = this.interactionMode === "select" ? this.getHitCategory(n, r) : null;
150
+ const c = this.interactionMode === "select" ? this.getHitCategory(e, l) : null;
151
151
  if (c) {
152
152
  this.activeAnnotation = c, this.isDragging = !1, this.selectedHandleIndex = -1, this.emit("annotationChange", { action: "select", changedItem: c, imageUrl: this.imageUrl }), this.render();
153
153
  return;
154
154
  }
155
- const a = this.getHitAnnotation(o);
155
+ const o = this.getHitAnnotation(r);
156
156
  if (this.interactionMode === "select") {
157
- if (a) {
158
- if (!(this.visibleLabels.size > 0 && !this.visibleLabels.has(a.label))) {
159
- this.activeAnnotation = a, this.isDragging = !0, this.dragStartPoint = o, this.selectedHandleIndex = -1, this.dragStartAnnotation = JSON.parse(JSON.stringify(a)), this.emit("annotationChange", { action: "select", changedItem: a, imageUrl: this.imageUrl }), this.render();
157
+ if (o) {
158
+ if (!(this.visibleLabels.size > 0 && !this.visibleLabels.has(o.label))) {
159
+ this.activeAnnotation = o, this.isDragging = !0, this.dragStartPoint = r, this.selectedHandleIndex = -1, this.dragStartAnnotation = JSON.parse(JSON.stringify(o)), this.emit("annotationChange", { action: "select", changedItem: o, imageUrl: this.imageUrl }), this.render();
160
160
  return;
161
161
  }
162
162
  } else
@@ -165,43 +165,43 @@ class Kt {
165
165
  }
166
166
  if (this.interactionMode === "draw") {
167
167
  if (this.isDrawing && this.currentTool === "polygon" && this.activeAnnotation) {
168
- const d = this.activeAnnotation.coordinates;
169
- if (d.points.length > 2 && at(o, d.points[0]) < 20 / this.scale) {
168
+ const h = this.activeAnnotation.coordinates;
169
+ if (h.points.length > 2 && at(r, h.points[0]) < 20 / this.scale) {
170
170
  this.finishDrawing();
171
171
  return;
172
172
  }
173
- this.startDrawing(o);
173
+ this.startDrawing(r);
174
174
  return;
175
175
  }
176
176
  if (this.currentTool) {
177
177
  if (this.currentTool === "polygon" && !this.isDrawing) {
178
- this.startDrawing(o);
178
+ this.startDrawing(r);
179
179
  return;
180
180
  }
181
- this.startDrawing(o);
181
+ this.startDrawing(r);
182
182
  }
183
183
  return;
184
184
  }
185
185
  this.activeAnnotation = null, this.render();
186
186
  }
187
187
  handleMouseMove(t) {
188
- const i = this.canvas.getBoundingClientRect(), n = t.clientX - i.left, r = t.clientY - i.top, o = this.toImageCoords(n, r);
188
+ const i = this.canvas.getBoundingClientRect(), e = t.clientX - i.left, l = t.clientY - i.top, r = this.toImageCoords(e, l);
189
189
  if (this.isPanning && this.panStartPoint) {
190
- const c = n - this.panStartPoint.x, a = r - this.panStartPoint.y;
191
- this.offset.x += c, this.offset.y += a, this.panStartPoint = { x: n, y: r }, this.render();
190
+ const c = e - this.panStartPoint.x, o = l - this.panStartPoint.y;
191
+ this.offset.x += c, this.offset.y += o, this.panStartPoint = { x: e, y: l }, this.render();
192
192
  return;
193
193
  }
194
- if (this.lastMouseMovePoint = o, this.isDrawing) {
194
+ if (this.lastMouseMovePoint = r, this.isDrawing) {
195
195
  if (this.currentTool === "polygon" && this.activeAnnotation) {
196
196
  const c = this.activeAnnotation.coordinates;
197
197
  if (c.points.length > 2) {
198
- const a = c.points[0], d = at(o, a);
199
- this.isHoveringStartPoint = d < 20 / this.scale;
198
+ const o = c.points[0], h = at(r, o);
199
+ this.isHoveringStartPoint = h < 20 / this.scale;
200
200
  } else
201
201
  this.isHoveringStartPoint = !1;
202
202
  }
203
- this.updateDrawing(o);
204
- } else this.isDragging && this.activeAnnotation && this.dragStartPoint ? this.updateDragging(o) : this.checkHover(n, r, o);
203
+ this.updateDrawing(r);
204
+ } else this.isDragging && this.activeAnnotation && this.dragStartPoint ? this.updateDragging(r) : this.checkHover(e, l, r);
205
205
  this.render();
206
206
  }
207
207
  handleMouseUp(t) {
@@ -226,8 +226,8 @@ class Kt {
226
226
  // 辅助函数:将 hex 转换为 rgba
227
227
  hexToRgba(t, i) {
228
228
  if (!t.startsWith("#")) return t;
229
- const n = parseInt(t.slice(1, 3), 16), r = parseInt(t.slice(3, 5), 16), o = parseInt(t.slice(5, 7), 16);
230
- return `rgba(${n}, ${r}, ${o}, ${i})`;
229
+ const e = parseInt(t.slice(1, 3), 16), l = parseInt(t.slice(3, 5), 16), r = parseInt(t.slice(5, 7), 16);
230
+ return `rgba(${e}, ${l}, ${r}, ${i})`;
231
231
  }
232
232
  startDrawing(t) {
233
233
  if (!this.currentTool) return;
@@ -242,14 +242,14 @@ class Kt {
242
242
  style: { strokeColor: this.currentLabelColor }
243
243
  };
244
244
  else if (this.currentTool === "point") {
245
- const n = {
245
+ const e = {
246
246
  id: i,
247
247
  type: "point",
248
248
  label: "",
249
249
  coordinates: { points: [t] },
250
250
  style: { strokeColor: this.currentLabelColor }
251
251
  };
252
- this.annotations.push(n), this.emit("annotationChange", { action: "add", changedItem: n, imageUrl: this.imageUrl }), this.activeAnnotation = n;
252
+ this.annotations.push(e), this.emit("annotationChange", { action: "add", changedItem: e, imageUrl: this.imageUrl }), this.activeAnnotation = e;
253
253
  } else if (this.currentTool === "polygon")
254
254
  this.activeAnnotation && this.activeAnnotation.type === "polygon" && this.isDrawing ? this.activeAnnotation.coordinates.points.push(t) : (this.isDrawing = !0, this.activeAnnotation = {
255
255
  id: i,
@@ -259,7 +259,7 @@ class Kt {
259
259
  style: { strokeColor: this.currentLabelColor }
260
260
  });
261
261
  else if (this.currentTool === "category") {
262
- const n = {
262
+ const e = {
263
263
  id: i,
264
264
  type: "category",
265
265
  label: "",
@@ -268,7 +268,7 @@ class Kt {
268
268
  // 或位置?
269
269
  style: { strokeColor: this.currentLabelColor }
270
270
  };
271
- this.annotations.push(n), this.emit("annotationChange", { action: "add", changedItem: n, imageUrl: this.imageUrl }), this.activeAnnotation = n;
271
+ this.annotations.push(e), this.emit("annotationChange", { action: "add", changedItem: e, imageUrl: this.imageUrl }), this.activeAnnotation = e;
272
272
  } else this.currentTool === "rotatedRect" && (this.isDrawing = !0, this.dragStartPoint = t, this.activeAnnotation = {
273
273
  id: i,
274
274
  type: "rotatedRect",
@@ -283,8 +283,8 @@ class Kt {
283
283
  const i = this.activeAnnotation.coordinates;
284
284
  i.x2 = t.x, i.y2 = t.y;
285
285
  } else if (this.activeAnnotation.type === "rotatedRect" && this.dragStartPoint) {
286
- const i = this.activeAnnotation.coordinates, n = Math.abs(t.x - this.dragStartPoint.x), r = Math.abs(t.y - this.dragStartPoint.y);
287
- i.width = n * 2, i.height = r * 2;
286
+ const i = this.activeAnnotation.coordinates, e = Math.abs(t.x - this.dragStartPoint.x), l = Math.abs(t.y - this.dragStartPoint.y);
287
+ i.width = e * 2, i.height = l * 2;
288
288
  } else this.activeAnnotation.type;
289
289
  }
290
290
  finishDrawing() {
@@ -295,8 +295,8 @@ class Kt {
295
295
  this.activeAnnotation = null, this.isDrawing = !1;
296
296
  return;
297
297
  }
298
- const i = Math.min(t.x1, t.x2), n = Math.max(t.x1, t.x2), r = Math.min(t.y1, t.y2), o = Math.max(t.y1, t.y2);
299
- t.x1 = i, t.x2 = n, t.y1 = r, t.y2 = o, this.annotations.push(this.activeAnnotation), this.emit("annotationChange", { action: "add", changedItem: this.activeAnnotation, imageUrl: this.imageUrl });
298
+ const i = Math.min(t.x1, t.x2), e = Math.max(t.x1, t.x2), l = Math.min(t.y1, t.y2), r = Math.max(t.y1, t.y2);
299
+ t.x1 = i, t.x2 = e, t.y1 = l, t.y2 = r, this.annotations.push(this.activeAnnotation), this.emit("annotationChange", { action: "add", changedItem: this.activeAnnotation, imageUrl: this.imageUrl });
300
300
  } else if (this.activeAnnotation.type === "polygon") {
301
301
  if (this.activeAnnotation.coordinates.points.length < 3) {
302
302
  this.activeAnnotation = null, this.isDrawing = !1;
@@ -317,75 +317,75 @@ class Kt {
317
317
  }
318
318
  updateDragging(t) {
319
319
  if (!this.activeAnnotation || !this.dragStartPoint || !this.dragStartAnnotation) return;
320
- const i = t.x - this.dragStartPoint.x, n = t.y - this.dragStartPoint.y;
321
- this.selectedHandleIndex === -1 ? this.moveAnnotation(this.activeAnnotation, this.dragStartAnnotation, i, n) : this.resizeAnnotation(this.activeAnnotation, this.dragStartAnnotation, this.selectedHandleIndex, t);
320
+ const i = t.x - this.dragStartPoint.x, e = t.y - this.dragStartPoint.y;
321
+ this.selectedHandleIndex === -1 ? this.moveAnnotation(this.activeAnnotation, this.dragStartAnnotation, i, e) : this.resizeAnnotation(this.activeAnnotation, this.dragStartAnnotation, this.selectedHandleIndex, t);
322
322
  }
323
- moveAnnotation(t, i, n, r) {
323
+ moveAnnotation(t, i, e, l) {
324
324
  if (t.type === "rectangle") {
325
- const o = i.coordinates, c = t.coordinates;
326
- c.x1 = o.x1 + n, c.x2 = o.x2 + n, c.y1 = o.y1 + r, c.y2 = o.y2 + r;
325
+ const r = i.coordinates, c = t.coordinates;
326
+ c.x1 = r.x1 + e, c.x2 = r.x2 + e, c.y1 = r.y1 + l, c.y2 = r.y2 + l;
327
327
  } else if (t.type === "point") {
328
- const o = i.coordinates, c = t.coordinates;
329
- c.points = o.points.map((a) => ({ x: a.x + n, y: a.y + r }));
328
+ const r = i.coordinates, c = t.coordinates;
329
+ c.points = r.points.map((o) => ({ x: o.x + e, y: o.y + l }));
330
330
  } else if (t.type === "rotatedRect") {
331
- const o = i.coordinates, c = t.coordinates;
332
- c.x = o.x + n, c.y = o.y + r;
331
+ const r = i.coordinates, c = t.coordinates;
332
+ c.x = r.x + e, c.y = r.y + l;
333
333
  } else if (t.type === "polygon") {
334
- const o = i.coordinates, c = t.coordinates;
335
- c.points = o.points.map((a) => ({ x: a.x + n, y: a.y + r }));
334
+ const r = i.coordinates, c = t.coordinates;
335
+ c.points = r.points.map((o) => ({ x: o.x + e, y: o.y + l }));
336
336
  }
337
337
  }
338
- resizeAnnotation(t, i, n, r) {
338
+ resizeAnnotation(t, i, e, l) {
339
339
  if (t.type === "rectangle") {
340
- const o = t.coordinates;
341
- n === 0 && (o.x1 = r.x, o.y1 = r.y), n === 1 && (o.x2 = r.x, o.y1 = r.y), n === 2 && (o.x2 = r.x, o.y2 = r.y), n === 3 && (o.x1 = r.x, o.y2 = r.y);
340
+ const r = t.coordinates;
341
+ e === 0 && (r.x1 = l.x, r.y1 = l.y), e === 1 && (r.x2 = l.x, r.y1 = l.y), e === 2 && (r.x2 = l.x, r.y2 = l.y), e === 3 && (r.x1 = l.x, r.y2 = l.y);
342
342
  } else if (t.type === "polygon") {
343
- const o = t.coordinates;
344
- n >= 0 && n < o.points.length && (o.points[n] = r);
343
+ const r = t.coordinates;
344
+ e >= 0 && e < r.points.length && (r.points[e] = l);
345
345
  } else if (t.type === "point") {
346
- const o = t.coordinates;
347
- n >= 0 && n < o.points.length && (o.points[n] = r);
346
+ const r = t.coordinates;
347
+ e >= 0 && e < r.points.length && (r.points[e] = l);
348
348
  } else if (t.type === "rotatedRect") {
349
- const o = t.coordinates;
350
- if (n === -2) {
351
- const c = o.x, a = o.y, d = r.x - c, p = r.y - a;
352
- let w = Math.atan2(p, d) * 180 / Math.PI;
353
- w += 90, o.angle = w;
349
+ const r = t.coordinates;
350
+ if (e === -2) {
351
+ const c = r.x, o = r.y, h = l.x - c, p = l.y - o;
352
+ let C = Math.atan2(p, h) * 180 / Math.PI;
353
+ C += 90, r.angle = C;
354
354
  } else {
355
- const c = o.angle * Math.PI / 180, a = Math.cos(-c), d = Math.sin(-c), p = r.x - o.x, w = r.y - o.y, u = p * a - w * d, f = p * d + w * a;
356
- (n === 0 || n === 3) && (o.width / 2, o.width = Math.abs(u) * 2), (n === 1 || n === 2) && (o.width = Math.abs(u) * 2), (n === 0 || n === 1) && (o.height = Math.abs(f) * 2), (n === 2 || n === 3) && (o.height = Math.abs(f) * 2);
355
+ const c = r.angle * Math.PI / 180, o = Math.cos(-c), h = Math.sin(-c), p = l.x - r.x, C = l.y - r.y, u = p * o - C * h, f = p * h + C * o;
356
+ (e === 0 || e === 3) && (r.width / 2, r.width = Math.abs(u) * 2), (e === 1 || e === 2) && (r.width = Math.abs(u) * 2), (e === 0 || e === 1) && (r.height = Math.abs(f) * 2), (e === 2 || e === 3) && (r.height = Math.abs(f) * 2);
357
357
  }
358
358
  }
359
359
  }
360
360
  // --- 命中测试和渲染辅助函数 ---
361
361
  getHitAnnotation(t) {
362
362
  for (let i = this.annotations.length - 1; i >= 0; i--) {
363
- const n = this.annotations[i];
364
- if (this.isPointInAnnotation(t, n))
365
- return n;
363
+ const e = this.annotations[i];
364
+ if (this.isPointInAnnotation(t, e))
365
+ return e;
366
366
  }
367
367
  return null;
368
368
  }
369
369
  isPointInAnnotation(t, i) {
370
370
  if (i.type === "rectangle") {
371
- const n = i.coordinates;
372
- return t.x >= n.x1 && t.x <= n.x2 && t.y >= n.y1 && t.y <= n.y2;
371
+ const e = i.coordinates;
372
+ return t.x >= e.x1 && t.x <= e.x2 && t.y >= e.y1 && t.y <= e.y2;
373
373
  } else if (i.type === "polygon") {
374
- const n = i.coordinates;
375
- return Gt(t, n.points);
374
+ const e = i.coordinates;
375
+ return Gt(t, e.points);
376
376
  } else if (i.type === "rotatedRect") {
377
- const n = i.coordinates, r = mt(t, { x: n.x, y: n.y }, -n.angle), o = n.width / 2, c = n.height / 2;
378
- return r.x >= n.x - o && r.x <= n.x + o && r.y >= n.y - c && r.y <= n.y + c;
377
+ const e = i.coordinates, l = ft(t, { x: e.x, y: e.y }, -e.angle), r = e.width / 2, c = e.height / 2;
378
+ return l.x >= e.x - r && l.x <= e.x + r && l.y >= e.y - c && l.y <= e.y + c;
379
379
  } else if (i.type === "point")
380
- return i.coordinates.points.some((r) => at(t, r) < 10 / this.scale);
380
+ return i.coordinates.points.some((l) => at(t, l) < 10 / this.scale);
381
381
  return !1;
382
382
  }
383
- getHitHandle(t, i, n) {
384
- const r = this.getAnnotationHandles(n), o = 6;
385
- for (let c = 0; c < r.length; c++) {
386
- const a = r[c], d = this.toScreenCoords(a.x, a.y);
387
- if (Math.abs(t - d.x) < o && Math.abs(i - d.y) < o)
388
- return n.type === "rotatedRect" && c === 4 ? -2 : c;
383
+ getHitHandle(t, i, e) {
384
+ const l = this.getAnnotationHandles(e), r = 6;
385
+ for (let c = 0; c < l.length; c++) {
386
+ const o = l[c], h = this.toScreenCoords(o.x, o.y);
387
+ if (Math.abs(t - h.x) < r && Math.abs(i - h.y) < r)
388
+ return e.type === "rotatedRect" && c === 4 ? -2 : c;
389
389
  }
390
390
  return -100;
391
391
  }
@@ -408,24 +408,24 @@ class Kt {
408
408
  if (t.type === "point")
409
409
  return t.coordinates.points;
410
410
  if (t.type === "rotatedRect") {
411
- const i = t.coordinates, n = { x: i.x, y: i.y }, r = i.width / 2, o = i.height / 2, c = { x: i.x - r, y: i.y - o }, a = { x: i.x + r, y: i.y - o }, d = { x: i.x + r, y: i.y + o }, p = { x: i.x - r, y: i.y + o }, w = { x: i.x, y: i.y - o - 20 / this.scale };
412
- return [c, a, d, p, w].map((u) => mt(u, n, i.angle));
411
+ const i = t.coordinates, e = { x: i.x, y: i.y }, l = i.width / 2, r = i.height / 2, c = { x: i.x - l, y: i.y - r }, o = { x: i.x + l, y: i.y - r }, h = { x: i.x + l, y: i.y + r }, p = { x: i.x - l, y: i.y + r }, C = { x: i.x, y: i.y - r - 20 / this.scale };
412
+ return [c, o, h, p, C].map((u) => ft(u, e, i.angle));
413
413
  }
414
414
  }
415
415
  return [];
416
416
  }
417
- checkHover(t, i, n) {
418
- const r = this.getHitCategory(t, i);
419
- if (r) {
420
- this.canvas.style.cursor = "pointer", this.hoverAnnotation = r;
417
+ checkHover(t, i, e) {
418
+ const l = this.getHitCategory(t, i);
419
+ if (l) {
420
+ this.canvas.style.cursor = "pointer", this.hoverAnnotation = l;
421
421
  return;
422
422
  }
423
423
  if (this.activeAnnotation && this.getHitHandle(t, i, this.activeAnnotation) !== -100) {
424
424
  this.canvas.style.cursor = "pointer";
425
425
  return;
426
426
  }
427
- const o = this.getHitAnnotation(n);
428
- o ? (this.canvas.style.cursor = "move", this.hoverAnnotation = o) : (this.canvas.style.cursor = "default", this.hoverAnnotation = null);
427
+ const r = this.getHitAnnotation(e);
428
+ r ? (this.canvas.style.cursor = "move", this.hoverAnnotation = r) : (this.canvas.style.cursor = "default", this.hoverAnnotation = null);
429
429
  }
430
430
  render() {
431
431
  this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height), this.img.complete && this.img.width > 0 && this.ctx.drawImage(this.img, this.offset.x, this.offset.y, this.img.width * this.scale, this.img.height * this.scale), this.annotations.forEach((t) => {
@@ -433,42 +433,42 @@ class Kt {
433
433
  }), this.activeAnnotation && this.drawItem(this.activeAnnotation, !0), this.renderCategories();
434
434
  }
435
435
  renderCategories() {
436
- const t = this.annotations.filter((d) => d.type === "category");
436
+ const t = this.annotations.filter((h) => h.type === "category");
437
437
  if (t.length === 0) return;
438
438
  this.ctx.save(), this.ctx.font = "14px sans-serif", this.ctx.textBaseline = "top";
439
439
  let i = 10;
440
- const n = 10, r = 8, o = 4, c = 24, a = 8;
441
- t.forEach((d) => {
442
- const p = d.label || "Unlabeled", w = this.ctx.measureText(p).width + r * 2, u = this.activeAnnotation === d, f = this.hoverAnnotation === d;
443
- this.ctx.fillStyle = u ? "#E3F2FD" : f ? "#F5F5F5" : "rgba(255, 255, 255, 0.9)", this.ctx.strokeStyle = u ? "#2196F3" : "#666", this.ctx.lineWidth = u ? 2 : 1, this.ctx.beginPath(), this.ctx.rect(i, n, w, c), this.ctx.fill(), this.ctx.stroke(), this.ctx.fillStyle = u ? "#1976D2" : "#333", this.ctx.fillText(p, i + r, n + o), i += w + a;
440
+ const e = 10, l = 8, r = 4, c = 24, o = 8;
441
+ t.forEach((h) => {
442
+ const p = h.label || "Unlabeled", C = this.ctx.measureText(p).width + l * 2, u = this.activeAnnotation === h, f = this.hoverAnnotation === h;
443
+ this.ctx.fillStyle = u ? "#E3F2FD" : f ? "#F5F5F5" : "rgba(255, 255, 255, 0.9)", this.ctx.strokeStyle = u ? "#2196F3" : "#666", this.ctx.lineWidth = u ? 2 : 1, this.ctx.beginPath(), this.ctx.rect(i, e, C, c), this.ctx.fill(), this.ctx.stroke(), this.ctx.fillStyle = u ? "#1976D2" : "#333", this.ctx.fillText(p, i + l, e + r), i += C + o;
444
444
  }), this.ctx.restore();
445
445
  }
446
446
  getHitCategory(t, i) {
447
- const n = this.annotations.filter((w) => w.type === "category");
448
- if (n.length === 0) return null;
447
+ const e = this.annotations.filter((C) => C.type === "category");
448
+ if (e.length === 0) return null;
449
449
  this.ctx.save(), this.ctx.font = "14px sans-serif";
450
- let r = 10;
451
- const o = 10, c = 8, a = 24, d = 8;
450
+ let l = 10;
451
+ const r = 10, c = 8, o = 24, h = 8;
452
452
  let p = null;
453
- for (const w of n) {
454
- const u = w.label || "Unlabeled", f = this.ctx.measureText(u).width + c * 2;
455
- if (t >= r && t <= r + f && i >= o && i <= o + a) {
456
- p = w;
453
+ for (const C of e) {
454
+ const u = C.label || "Unlabeled", f = this.ctx.measureText(u).width + c * 2;
455
+ if (t >= l && t <= l + f && i >= r && i <= r + o) {
456
+ p = C;
457
457
  break;
458
458
  }
459
- r += f + d;
459
+ l += f + h;
460
460
  }
461
461
  return this.ctx.restore(), p;
462
462
  }
463
463
  drawItem(t, i) {
464
- var o;
464
+ var r;
465
465
  if (this.visibleLabels.size > 0 && !this.visibleLabels.has(t.label) && !i)
466
466
  return;
467
467
  this.ctx.save();
468
- const n = ((o = t.style) == null ? void 0 : o.strokeColor) || "#FF4081", r = i ? "#00E5FF" : n;
469
- if (this.ctx.strokeStyle = r, this.ctx.lineWidth = 2, i ? this.ctx.fillStyle = "rgba(0, 229, 255, 0.2)" : this.ctx.fillStyle = this.hexToRgba(n, 0.2), t.type === "rectangle") {
470
- const c = t.coordinates, a = this.toScreenCoords(c.x1, c.y1), d = this.toScreenCoords(c.x2, c.y2), p = Math.min(a.x, d.x), w = Math.min(a.y, d.y), u = Math.abs(a.x - d.x), f = Math.abs(a.y - d.y);
471
- this.ctx.strokeRect(p, w, u, f), this.ctx.fillStyle = i ? "rgba(0, 229, 255, 0.2)" : "rgba(255, 64, 129, 0.2)", this.ctx.fillRect(p, w, u, f), i && this.drawHandles(this.getAnnotationHandles(t));
468
+ const e = ((r = t.style) == null ? void 0 : r.strokeColor) || "#FF4081", l = i ? "#00E5FF" : e;
469
+ if (this.ctx.strokeStyle = l, this.ctx.lineWidth = 2, i ? this.ctx.fillStyle = "rgba(0, 229, 255, 0.2)" : this.ctx.fillStyle = this.hexToRgba(e, 0.2), t.type === "rectangle") {
470
+ const c = t.coordinates, o = this.toScreenCoords(c.x1, c.y1), h = this.toScreenCoords(c.x2, c.y2), p = Math.min(o.x, h.x), C = Math.min(o.y, h.y), u = Math.abs(o.x - h.x), f = Math.abs(o.y - h.y);
471
+ this.ctx.strokeRect(p, C, u, f), this.ctx.fillStyle = i ? "rgba(0, 229, 255, 0.2)" : "rgba(255, 64, 129, 0.2)", this.ctx.fillRect(p, C, u, f), i && this.drawHandles(this.getAnnotationHandles(t));
472
472
  } else if (t.type === "polygon") {
473
473
  const c = t.coordinates;
474
474
  if (c.points.length === 0) {
@@ -476,40 +476,40 @@ class Kt {
476
476
  return;
477
477
  }
478
478
  this.ctx.beginPath();
479
- const a = this.toScreenCoords(c.points[0].x, c.points[0].y);
480
- this.ctx.moveTo(a.x, a.y);
481
- for (let d = 1; d < c.points.length; d++) {
482
- const p = this.toScreenCoords(c.points[d].x, c.points[d].y);
479
+ const o = this.toScreenCoords(c.points[0].x, c.points[0].y);
480
+ this.ctx.moveTo(o.x, o.y);
481
+ for (let h = 1; h < c.points.length; h++) {
482
+ const p = this.toScreenCoords(c.points[h].x, c.points[h].y);
483
483
  this.ctx.lineTo(p.x, p.y);
484
484
  }
485
485
  if (!this.isDrawing || t !== this.activeAnnotation)
486
486
  this.ctx.closePath();
487
487
  else if (this.lastMouseMovePoint) {
488
- let d = this.lastMouseMovePoint;
488
+ let h = this.lastMouseMovePoint;
489
489
  if (this.isHoveringStartPoint && c.points.length > 0) {
490
- d = c.points[0];
491
- const w = this.toScreenCoords(c.points[0].x, c.points[0].y);
492
- this.ctx.save(), this.ctx.beginPath(), this.ctx.arc(w.x, w.y, 10, 0, Math.PI * 2), this.ctx.fillStyle = "rgba(255, 215, 0, 0.6)", this.ctx.strokeStyle = "#FFFFFF", this.ctx.lineWidth = 2, this.ctx.fill(), this.ctx.stroke(), this.ctx.restore();
490
+ h = c.points[0];
491
+ const C = this.toScreenCoords(c.points[0].x, c.points[0].y);
492
+ this.ctx.save(), this.ctx.beginPath(), this.ctx.arc(C.x, C.y, 10, 0, Math.PI * 2), this.ctx.fillStyle = "rgba(255, 215, 0, 0.6)", this.ctx.strokeStyle = "#FFFFFF", this.ctx.lineWidth = 2, this.ctx.fill(), this.ctx.stroke(), this.ctx.restore();
493
493
  }
494
- const p = this.toScreenCoords(d.x, d.y);
494
+ const p = this.toScreenCoords(h.x, h.y);
495
495
  this.ctx.lineTo(p.x, p.y);
496
496
  }
497
497
  this.ctx.stroke(), this.ctx.fillStyle = i ? "rgba(0, 229, 255, 0.2)" : "rgba(255, 64, 129, 0.2)", this.ctx.fill(), i && this.drawHandles(this.getAnnotationHandles(t));
498
498
  } else if (t.type === "rotatedRect") {
499
499
  const c = t.coordinates;
500
500
  this.ctx.translate(this.toScreenCoords(c.x, c.y).x, this.toScreenCoords(c.x, c.y).y), this.ctx.rotate(c.angle * Math.PI / 180);
501
- const a = c.width * this.scale, d = c.height * this.scale;
502
- this.ctx.strokeRect(-a / 2, -d / 2, a, d), this.ctx.fillStyle = i ? "rgba(0, 229, 255, 0.2)" : "rgba(255, 64, 129, 0.2)", this.ctx.fillRect(-a / 2, -d / 2, a, d), this.ctx.rotate(-c.angle * Math.PI / 180), this.ctx.translate(-this.toScreenCoords(c.x, c.y).x, -this.toScreenCoords(c.x, c.y).y), i && this.drawHandles(this.getAnnotationHandles(t));
503
- } else t.type === "point" && t.coordinates.points.forEach((a) => {
504
- const d = this.toScreenCoords(a.x, a.y);
505
- this.ctx.beginPath(), this.ctx.arc(d.x, d.y, 5, 0, Math.PI * 2), this.ctx.fillStyle = i ? "#00E5FF" : n, this.ctx.fill(), this.ctx.stroke();
501
+ const o = c.width * this.scale, h = c.height * this.scale;
502
+ this.ctx.strokeRect(-o / 2, -h / 2, o, h), this.ctx.fillStyle = i ? "rgba(0, 229, 255, 0.2)" : "rgba(255, 64, 129, 0.2)", this.ctx.fillRect(-o / 2, -h / 2, o, h), this.ctx.rotate(-c.angle * Math.PI / 180), this.ctx.translate(-this.toScreenCoords(c.x, c.y).x, -this.toScreenCoords(c.x, c.y).y), i && this.drawHandles(this.getAnnotationHandles(t));
503
+ } else t.type === "point" && t.coordinates.points.forEach((o) => {
504
+ const h = this.toScreenCoords(o.x, o.y);
505
+ this.ctx.beginPath(), this.ctx.arc(h.x, h.y, 5, 0, Math.PI * 2), this.ctx.fillStyle = i ? "#00E5FF" : e, this.ctx.fill(), this.ctx.stroke();
506
506
  });
507
507
  this.ctx.restore();
508
508
  }
509
509
  drawHandles(t) {
510
510
  this.ctx.fillStyle = "#FFFFFF", this.ctx.strokeStyle = "#000000", this.ctx.lineWidth = 1, t.forEach((i) => {
511
- const n = this.toScreenCoords(i.x, i.y);
512
- this.ctx.fillRect(n.x - 4, n.y - 4, 8, 8), this.ctx.strokeRect(n.x - 4, n.y - 4, 8, 8);
511
+ const e = this.toScreenCoords(i.x, i.y);
512
+ this.ctx.fillRect(e.x - 4, e.y - 4, 8, 8), this.ctx.strokeRect(e.x - 4, e.y - 4, 8, 8);
513
513
  });
514
514
  }
515
515
  }
@@ -545,31 +545,31 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
545
545
  <path d="M637.12 693.376l182.208 182.208a32 32 0 1 1-45.248 45.248L591.872 738.624a352 352 0 1 1 45.248-45.248z m-45.248-45.248A288 288 0 1 0 183.872 240.128a288 288 0 0 0 408 408zM416 448h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64h96v-96a32 32 0 0 1 64 0v96z" fill="currentColor"/>\r
546
546
  </svg>`, ue = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1em" height="1em">\r
547
547
  <path d="M637.12 693.376l182.208 182.208a32 32 0 1 1-45.248 45.248L591.872 738.624a352 352 0 1 1 45.248-45.248z m-45.248-45.248A288 288 0 1 0 183.872 240.128a288 288 0 0 0 408 408zM256 448h320a32 32 0 1 1 0 64H256a32 32 0 1 1 0-64z" fill="currentColor"/>\r
548
- </svg>`, ve = ["innerHTML"], me = /* @__PURE__ */ Q({
548
+ </svg>`, ve = ["innerHTML"], me = /* @__PURE__ */ G({
549
549
  __name: "SvgIcon",
550
550
  props: {
551
551
  name: {},
552
552
  size: {}
553
553
  },
554
554
  setup(m) {
555
- const t = m, i = k(""), n = /* @__PURE__ */ Object.assign({ "../assets/svg/aim.svg": Zt, "../assets/svg/back.svg": Qt, "../assets/svg/connection.svg": te, "../assets/svg/crop.svg": ee, "../assets/svg/delete.svg": ne, "../assets/svg/download.svg": se, "../assets/svg/edit.svg": ie, "../assets/svg/hide.svg": oe, "../assets/svg/pointer.svg": ae, "../assets/svg/price-tag.svg": le, "../assets/svg/rank.svg": re, "../assets/svg/refresh-right.svg": ce, "../assets/svg/right.svg": he, "../assets/svg/view.svg": de, "../assets/svg/zoom-in.svg": ge, "../assets/svg/zoom-out.svg": ue });
555
+ const t = m, i = k(""), e = /* @__PURE__ */ Object.assign({ "../assets/svg/aim.svg": Zt, "../assets/svg/back.svg": Qt, "../assets/svg/connection.svg": te, "../assets/svg/crop.svg": ee, "../assets/svg/delete.svg": ne, "../assets/svg/download.svg": se, "../assets/svg/edit.svg": ie, "../assets/svg/hide.svg": oe, "../assets/svg/pointer.svg": ae, "../assets/svg/price-tag.svg": le, "../assets/svg/rank.svg": re, "../assets/svg/refresh-right.svg": ce, "../assets/svg/right.svg": he, "../assets/svg/view.svg": de, "../assets/svg/zoom-in.svg": ge, "../assets/svg/zoom-out.svg": ue });
556
556
  return Xt(() => {
557
- const r = `../assets/svg/${t.name}.svg`, o = n[r];
558
- o ? i.value = o : (console.warn(`Icon ${t.name} not found at path ${r}`), i.value = "");
559
- }), (r, o) => (y(), b("i", {
560
- class: E(["svg-icon", [m.size ? `size-${m.size}` : ""]]),
557
+ const l = `../assets/svg/${t.name}.svg`, r = e[l];
558
+ r ? i.value = r : (console.warn(`Icon ${t.name} not found at path ${l}`), i.value = "");
559
+ }), (l, r) => (y(), x("i", {
560
+ class: V(["svg-icon", [m.size ? `size-${m.size}` : ""]]),
561
561
  innerHTML: i.value
562
562
  }, null, 10, ve));
563
563
  }
564
- }), tt = (m, t) => {
564
+ }), K = (m, t) => {
565
565
  const i = m.__vccOpts || m;
566
- for (const [n, r] of t)
567
- i[n] = r;
566
+ for (const [e, l] of t)
567
+ i[e] = l;
568
568
  return i;
569
- }, T = /* @__PURE__ */ tt(me, [["__scopeId", "data-v-3928607b"]]), fe = {
569
+ }, P = /* @__PURE__ */ K(me, [["__scopeId", "data-v-3928607b"]]), fe = {
570
570
  key: 0,
571
571
  class: "image-list-sidebar"
572
- }, ye = { class: "image-list-title" }, pe = { class: "image-list-scroll" }, be = ["onClick"], xe = { class: "image-list-stage" }, we = ["src", "alt"], Ce = {
572
+ }, ye = { class: "image-list-title" }, pe = { class: "image-list-scroll" }, xe = ["onClick"], be = { class: "image-list-stage" }, we = ["src", "alt"], Ce = {
573
573
  key: 0,
574
574
  class: "thumb-overlay-layer"
575
575
  }, _e = {
@@ -589,13 +589,13 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
589
589
  }, Le = {
590
590
  key: 1,
591
591
  class: "batch-nav"
592
- }, De = ["disabled"], Re = ["disabled"], Be = {
592
+ }, Be = ["disabled"], De = ["disabled"], Re = {
593
593
  key: 2,
594
594
  class: "right-sidebar"
595
595
  }, Ue = { class: "label-list" }, Fe = { class: "label-row" }, Ee = ["onUpdate:modelValue", "onChange"], Oe = ["title"], Ve = ["onClick"], Ne = { class: "action-icon more-actions" }, We = ["onClick"], Je = {
596
596
  key: 3,
597
597
  class: "modal-overlay"
598
- }, je = { class: "modal-content" }, Xe = { class: "form-group" }, Ye = { class: "form-group" }, qe = { class: "color-input-wrapper" }, Ge = /* @__PURE__ */ Q({
598
+ }, je = { class: "modal-content" }, Xe = { class: "form-group" }, Ye = { class: "form-group" }, qe = { class: "color-input-wrapper" }, Ge = /* @__PURE__ */ G({
599
599
  __name: "ImageAnnotator",
600
600
  props: {
601
601
  annotationTypes: { default: () => ["rectangle", "polygon", "point", "rotatedRect"] },
@@ -613,401 +613,401 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
613
613
  },
614
614
  emits: ["annotationChange", "batchChange", "labelChange", "ready", "error", "tool:change", "viewport:change", "annotation:add", "annotation:update", "annotation:delete", "annotation:select", "prediction:loaded", "prediction:apply", "prediction:reject"],
615
615
  setup(m, { expose: t, emit: i }) {
616
- const n = m, r = i, o = k(null), c = k(null), a = k(null), d = k(null), p = k(0), w = k(""), u = k([]), f = k(""), _ = k(!1), M = k({ name: "", color: "#FF0000" }), B = k("none"), D = k([]), F = k({}), et = U(() => d.value === "select" && !!w.value), Y = (e) => {
617
- if (!e || F.value[e]) return;
616
+ const e = m, l = i, r = k(null), c = k(null), o = k(null), h = k(null), p = k(0), C = k(""), u = k([]), f = k(""), A = k(!1), T = k({ name: "", color: "#FF0000" }), B = k("none"), D = k([]), E = k({}), lt = O(() => h.value === "select" && !!C.value), Z = (n) => {
617
+ if (!n || E.value[n]) return;
618
618
  const s = new Image();
619
619
  s.onload = () => {
620
- const l = s.naturalWidth || 1, h = s.naturalHeight || 1;
621
- F.value = {
622
- ...F.value,
623
- [e]: { width: l, height: h }
620
+ const a = s.naturalWidth || 1, d = s.naturalHeight || 1;
621
+ E.value = {
622
+ ...E.value,
623
+ [n]: { width: a, height: d }
624
624
  };
625
- }, s.src = e;
626
- }, q = () => {
627
- n.batchImages.forEach((e) => {
628
- Y(e.imageUrl);
625
+ }, s.src = n;
626
+ }, X = () => {
627
+ e.batchImages.forEach((n) => {
628
+ Z(n.imageUrl);
629
629
  });
630
- }, x = () => {
631
- var l, h, v, C;
632
- const e = n.batchImages[p.value], s = (e == null ? void 0 : e.imageUrl) || ((l = n.image) == null ? void 0 : l.url);
630
+ }, R = () => {
631
+ var a, d, v, _;
632
+ const n = e.batchImages[p.value], s = (n == null ? void 0 : n.imageUrl) || ((a = e.image) == null ? void 0 : a.url);
633
633
  return {
634
634
  eventId: `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,
635
635
  timestamp: Date.now(),
636
- requestId: n.requestId,
637
- taskId: (h = n.session) == null ? void 0 : h.taskId,
638
- imageId: ((v = n.image) == null ? void 0 : v.id) || s,
639
- operator: (C = n.session) == null ? void 0 : C.userId
636
+ requestId: e.requestId,
637
+ taskId: (d = e.session) == null ? void 0 : d.taskId,
638
+ imageId: ((v = e.image) == null ? void 0 : v.id) || s,
639
+ operator: (_ = e.session) == null ? void 0 : _.userId
640
640
  };
641
- }, I = (e) => {
642
- var h;
643
- const s = e == null ? void 0 : e.action;
641
+ }, Q = (n) => {
642
+ var d;
643
+ const s = n == null ? void 0 : n.action;
644
644
  if (!s) return;
645
- const l = {
646
- meta: x(),
645
+ const a = {
646
+ meta: R(),
647
647
  action: s,
648
- current: e == null ? void 0 : e.changedItem,
649
- source: (h = e == null ? void 0 : e.changedItem) != null && h.predictionId ? "prediction" : "manual"
648
+ current: n == null ? void 0 : n.changedItem,
649
+ source: (d = n == null ? void 0 : n.changedItem) != null && d.predictionId ? "prediction" : "manual"
650
650
  };
651
- s === "add" && r("annotation:add", l), s === "update" && r("annotation:update", l), s === "delete" && r("annotation:delete", l), s === "select" && r("annotation:select", l);
652
- }, H = U(() => n.annotationTypes.filter((e) => e !== "category")), V = (e) => ({
651
+ s === "add" && l("annotation:add", a), s === "update" && l("annotation:update", a), s === "delete" && l("annotation:delete", a), s === "select" && l("annotation:select", a);
652
+ }, tt = O(() => e.annotationTypes.filter((n) => n !== "category")), et = (n) => ({
653
653
  rectangle: "crop",
654
654
  polygon: "connection",
655
655
  point: "aim",
656
656
  rotatedRect: "refresh-right",
657
657
  category: "price-tag"
658
- })[e] || e, lt = (e) => ({
658
+ })[n] || n, b = (n) => ({
659
659
  rectangle: "矩形框",
660
660
  polygon: "多边形",
661
661
  point: "关键点",
662
662
  rotatedRect: "旋转矩形",
663
663
  category: "分类标签"
664
- })[e] || e;
664
+ })[n] || n;
665
665
  Yt(() => {
666
- if (q(), o.value) {
667
- a.value = new Kt(o.value), a.value.on("annotationChange", (s) => {
668
- var l, h;
666
+ if (X(), r.value) {
667
+ o.value = new Kt(r.value), o.value.on("annotationChange", (s) => {
668
+ var a, d;
669
669
  if (s.action === "add" && s.changedItem) {
670
- const v = u.value.find((C) => C.id === f.value);
670
+ const v = u.value.find((_) => _.id === f.value);
671
671
  v && (s.changedItem.label = v.name, s.changedItem.labelId = v.id);
672
672
  }
673
- s.action === "select" ? w.value = ((l = s.changedItem) == null ? void 0 : l.id) || "" : s.action === "delete" && ((h = s.changedItem) == null ? void 0 : h.id) === w.value && (w.value = ""), r("annotationChange", s), I(s);
674
- }), N(), G();
675
- const e = new ResizeObserver(() => {
673
+ s.action === "select" ? C.value = ((a = s.changedItem) == null ? void 0 : a.id) || "" : s.action === "delete" && ((d = s.changedItem) == null ? void 0 : d.id) === C.value && (C.value = ""), l("annotationChange", s), Q(s);
674
+ }), S(), w();
675
+ const n = new ResizeObserver(() => {
676
676
  var s;
677
- (s = a.value) == null || s.resize();
677
+ (s = o.value) == null || s.resize();
678
678
  });
679
- c.value && e.observe(c.value), n.defaultActiveType && W(n.defaultActiveType), r("ready", { meta: x() });
679
+ c.value && n.observe(c.value), e.defaultActiveType && U(e.defaultActiveType), l("ready", { meta: R() });
680
680
  }
681
681
  });
682
- const G = () => {
683
- if (!a.value) return;
684
- const e = u.value.find((l) => l.id === f.value);
685
- e && a.value.setLabelStyle(e.color);
686
- const s = u.value.filter((l) => l.visible).map((l) => l.name);
687
- a.value.setVisibleLabels(s);
688
- }, N = () => {
689
- var e;
690
- if (a.value)
691
- if (w.value = "", n.batchImages.length > 0) {
692
- const s = n.batchImages[p.value];
693
- a.value.loadImage(s.imageUrl), s.annotations ? a.value.setAnnotations(s.annotations) : a.value.setAnnotations([]);
694
- } else (e = n.image) != null && e.url && a.value.loadImage(n.image.url);
695
- }, W = (e) => {
696
- var s, l;
697
- if (d.value = e, w.value = "", e !== "pan" && e !== "select" && u.value.length === 0) {
682
+ const w = () => {
683
+ if (!o.value) return;
684
+ const n = u.value.find((a) => a.id === f.value);
685
+ n && o.value.setLabelStyle(n.color);
686
+ const s = u.value.filter((a) => a.visible).map((a) => a.name);
687
+ o.value.setVisibleLabels(s);
688
+ }, S = () => {
689
+ var n;
690
+ if (o.value)
691
+ if (C.value = "", e.batchImages.length > 0) {
692
+ const s = e.batchImages[p.value];
693
+ o.value.loadImage(s.imageUrl), s.annotations ? o.value.setAnnotations(s.annotations) : o.value.setAnnotations([]);
694
+ } else (n = e.image) != null && n.url && o.value.loadImage(e.image.url);
695
+ }, U = (n) => {
696
+ var s, a;
697
+ if (h.value = n, C.value = "", n !== "pan" && n !== "select" && u.value.length === 0) {
698
698
  alert("请先创建标签!");
699
699
  return;
700
700
  }
701
- e === "pan" || e === "select" ? (s = a.value) == null || s.setTool(e) : (l = a.value) == null || l.setTool(e), r("tool:change", { meta: x(), tool: e });
702
- }, ft = () => {
703
- var e;
704
- (e = a.value) != null && e.activeAnnotation && a.value.deleteAnnotation(a.value.activeAnnotation.id);
701
+ n === "pan" || n === "select" ? (s = o.value) == null || s.setTool(n) : (a = o.value) == null || a.setTool(n), l("tool:change", { meta: R(), tool: n });
705
702
  }, rt = () => {
706
- a.value && r("viewport:change", {
707
- meta: x(),
708
- scale: a.value.scale,
709
- offset: { ...a.value.offset }
703
+ var n;
704
+ (n = o.value) != null && n.activeAnnotation && o.value.deleteAnnotation(o.value.activeAnnotation.id);
705
+ }, ct = () => {
706
+ o.value && l("viewport:change", {
707
+ meta: R(),
708
+ scale: o.value.scale,
709
+ offset: { ...o.value.offset }
710
710
  });
711
711
  }, yt = () => {
712
- var e;
713
- (e = a.value) == null || e.zoom(1), rt();
712
+ var n;
713
+ (n = o.value) == null || n.zoom(1), ct();
714
714
  }, pt = () => {
715
- var e;
716
- (e = a.value) == null || e.zoom(-1), rt();
717
- }, bt = () => {
718
- M.value = { name: "", color: "#2196F3" }, _.value = !0;
719
- }, ct = () => {
720
- _.value = !1;
715
+ var n;
716
+ (n = o.value) == null || n.zoom(-1), ct();
721
717
  }, xt = () => {
722
- if (!M.value.name.trim()) {
718
+ T.value = { name: "", color: "#2196F3" }, A.value = !0;
719
+ }, ht = () => {
720
+ A.value = !1;
721
+ }, bt = () => {
722
+ if (!T.value.name.trim()) {
723
723
  alert("请输入标签名称");
724
724
  return;
725
725
  }
726
726
  const s = {
727
727
  id: Date.now().toString(),
728
- name: M.value.name,
729
- color: M.value.color,
728
+ name: T.value.name,
729
+ color: T.value.color,
730
730
  visible: !0
731
731
  };
732
- u.value.push(s), r("labelChange", u.value), u.value.length === 1 && J(s), ct();
733
- }, J = (e) => {
732
+ u.value.push(s), l("labelChange", u.value), u.value.length === 1 && W(s), ht();
733
+ }, W = (n) => {
734
734
  var s;
735
- f.value = e.id, (s = a.value) == null || s.setLabelStyle(e.color);
736
- }, wt = (e, s) => {
737
- if (!e.startsWith("#")) return e;
738
- let l = 0, h = 0, v = 0;
739
- return e.length === 4 ? (l = parseInt(e[1] + e[1], 16), h = parseInt(e[2] + e[2], 16), v = parseInt(e[3] + e[3], 16)) : e.length === 7 && (l = parseInt(e.slice(1, 3), 16), h = parseInt(e.slice(3, 5), 16), v = parseInt(e.slice(5, 7), 16)), `rgba(${l}, ${h}, ${v}, ${s})`;
740
- }, Ct = (e) => {
735
+ f.value = n.id, (s = o.value) == null || s.setLabelStyle(n.color);
736
+ }, wt = (n, s) => {
737
+ if (!n.startsWith("#")) return n;
738
+ let a = 0, d = 0, v = 0;
739
+ return n.length === 4 ? (a = parseInt(n[1] + n[1], 16), d = parseInt(n[2] + n[2], 16), v = parseInt(n[3] + n[3], 16)) : n.length === 7 && (a = parseInt(n.slice(1, 3), 16), d = parseInt(n.slice(3, 5), 16), v = parseInt(n.slice(5, 7), 16)), `rgba(${a}, ${d}, ${v}, ${s})`;
740
+ }, Ct = (n) => {
741
741
  var s;
742
- if (e.id === f.value && ((s = a.value) == null || s.setLabelStyle(e.color)), a.value) {
743
- const l = a.value.getAnnotations();
744
- let h = !1;
745
- l.forEach((v) => {
746
- v.label === e.name && (v.style || (v.style = {}), v.style.strokeColor = e.color, v.style.fillColor = wt(e.color, 0.2), h = !0);
747
- }), h && a.value.render();
742
+ if (n.id === f.value && ((s = o.value) == null || s.setLabelStyle(n.color)), o.value) {
743
+ const a = o.value.getAnnotations();
744
+ let d = !1;
745
+ a.forEach((v) => {
746
+ v.label === n.name && (v.style || (v.style = {}), v.style.strokeColor = n.color, v.style.fillColor = wt(n.color, 0.2), d = !0);
747
+ }), d && o.value.render();
748
748
  }
749
- r("labelChange", u.value);
750
- }, _t = (e) => {
751
- e.visible = !e.visible, G();
752
- }, At = (e) => {
753
- const s = u.value.findIndex((l) => l.id === e);
754
- s > -1 && (u.value.splice(s, 1), r("labelChange", u.value), f.value === e && (f.value = u.value.length > 0 ? u.value[0].id : "", f.value && J(u.value[0])), G());
749
+ l("labelChange", u.value);
750
+ }, _t = (n) => {
751
+ n.visible = !n.visible, w();
752
+ }, At = (n) => {
753
+ const s = u.value.findIndex((a) => a.id === n);
754
+ s > -1 && (u.value.splice(s, 1), l("labelChange", u.value), f.value === n && (f.value = u.value.length > 0 ? u.value[0].id : "", f.value && W(u.value[0])), w());
755
755
  };
756
- j(() => n.labels, (e) => {
757
- const s = JSON.parse(JSON.stringify(e || []));
756
+ J(() => e.labels, (n) => {
757
+ const s = JSON.parse(JSON.stringify(n || []));
758
758
  if (u.value = s, u.value.length > 0)
759
- if (!f.value || !u.value.find((l) => l.id === f.value))
760
- J(u.value[0]);
759
+ if (!f.value || !u.value.find((a) => a.id === f.value))
760
+ W(u.value[0]);
761
761
  else {
762
- const l = u.value.find((h) => h.id === f.value);
763
- l && J(l);
762
+ const a = u.value.find((d) => d.id === f.value);
763
+ a && W(a);
764
764
  }
765
765
  else
766
766
  f.value = "";
767
- G();
767
+ w();
768
768
  }, { immediate: !0, deep: !0 });
769
769
  const It = () => {
770
- p.value > 0 && (nt(), p.value--, N(), st());
770
+ p.value > 0 && (nt(), p.value--, S(), st());
771
771
  }, kt = () => {
772
- p.value < n.batchImages.length - 1 && (nt(), p.value++, N(), st());
772
+ p.value < e.batchImages.length - 1 && (nt(), p.value++, S(), st());
773
773
  }, nt = () => {
774
- if (a.value) {
775
- const e = a.value.getAnnotations();
776
- n.batchImages[p.value].annotations = e;
774
+ if (o.value) {
775
+ const n = o.value.getAnnotations();
776
+ e.batchImages[p.value].annotations = n;
777
777
  }
778
778
  }, st = () => {
779
- const e = n.batchImages[p.value];
780
- r("batchChange", {
779
+ const n = e.batchImages[p.value];
780
+ l("batchChange", {
781
781
  currentIndex: p.value,
782
- total: n.batchImages.length,
783
- currentImageUrl: e.imageUrl,
784
- currentAnnotations: e.annotations || []
782
+ total: e.batchImages.length,
783
+ currentImageUrl: n.imageUrl,
784
+ currentAnnotations: n.annotations || []
785
785
  });
786
- }, ht = (e = []) => {
786
+ }, dt = (n = []) => {
787
787
  var v;
788
- if (!a.value) return;
789
- if (D.value = JSON.parse(JSON.stringify(e)), D.value.length === 0) {
788
+ if (!o.value) return;
789
+ if (D.value = JSON.parse(JSON.stringify(n)), D.value.length === 0) {
790
790
  B.value = "none";
791
791
  return;
792
792
  }
793
793
  B.value = "loaded";
794
- const l = (a.value.getAnnotations() || []).filter((C) => !C.predictionId), h = D.value.map((C) => {
795
- const S = JSON.parse(JSON.stringify(C.annotation));
796
- return S.id = S.id || `pred-${C.id}`, S.predictionId = C.id, S.modelRunId = C.modelRunId || S.modelRunId, S.confidence = C.confidence ?? S.confidence, S.reviewStatus = S.reviewStatus || "draft", S;
794
+ const a = (o.value.getAnnotations() || []).filter((_) => !_.predictionId), d = D.value.map((_) => {
795
+ const M = JSON.parse(JSON.stringify(_.annotation));
796
+ return M.id = M.id || `pred-${_.id}`, M.predictionId = _.id, M.modelRunId = _.modelRunId || M.modelRunId, M.confidence = _.confidence ?? M.confidence, M.reviewStatus = M.reviewStatus || "draft", M;
797
797
  });
798
- a.value.setAnnotations([...l, ...h]), r("prediction:loaded", {
799
- meta: x(),
798
+ o.value.setAnnotations([...a, ...d]), l("prediction:loaded", {
799
+ meta: R(),
800
800
  modelRunId: (v = D.value[0]) == null ? void 0 : v.modelRunId,
801
801
  candidates: D.value
802
802
  });
803
- }, St = (e, s) => {
803
+ }, St = (n, s) => {
804
804
  var v;
805
- if (!a.value) return [];
805
+ if (!o.value) return [];
806
806
  B.value = "applying";
807
- const h = (a.value.getAnnotations() || []).filter((C) => C.predictionId && e.includes(C.predictionId));
808
- return h.forEach((C) => {
809
- C.reviewStatus = "accepted";
810
- }), B.value = "applied", r("prediction:apply", {
811
- meta: x(),
812
- modelRunId: (v = h[0]) == null ? void 0 : v.modelRunId,
813
- candidateIds: e,
807
+ const d = (o.value.getAnnotations() || []).filter((_) => _.predictionId && n.includes(_.predictionId));
808
+ return d.forEach((_) => {
809
+ _.reviewStatus = "accepted";
810
+ }), B.value = "applied", l("prediction:apply", {
811
+ meta: R(),
812
+ modelRunId: (v = d[0]) == null ? void 0 : v.modelRunId,
813
+ candidateIds: n,
814
814
  threshold: s,
815
- acceptedAnnotations: h
816
- }), a.value.render(), h;
817
- }, Mt = (e, s) => {
815
+ acceptedAnnotations: d
816
+ }), o.value.render(), d;
817
+ }, Mt = (n, s) => {
818
818
  var v;
819
- if (!a.value) return;
820
- const l = a.value.getAnnotations() || [], h = l.filter((C) => !(C.predictionId && e.includes(C.predictionId)));
821
- a.value.setAnnotations(h), r("prediction:reject", {
822
- meta: x(),
823
- modelRunId: (v = l.find((C) => C.predictionId && e.includes(C.predictionId))) == null ? void 0 : v.modelRunId,
824
- candidateIds: e,
819
+ if (!o.value) return;
820
+ const a = o.value.getAnnotations() || [], d = a.filter((_) => !(_.predictionId && n.includes(_.predictionId)));
821
+ o.value.setAnnotations(d), l("prediction:reject", {
822
+ meta: R(),
823
+ modelRunId: (v = a.find((_) => _.predictionId && n.includes(_.predictionId))) == null ? void 0 : v.modelRunId,
824
+ candidateIds: n,
825
825
  reason: s
826
826
  });
827
- }, zt = (e, s = []) => {
828
- a.value && (a.value.loadImage(e.url), a.value.setAnnotations(s));
829
- }, $t = (e) => {
827
+ }, zt = (n, s = []) => {
828
+ o.value && (o.value.loadImage(n.url), o.value.setAnnotations(s));
829
+ }, $t = (n) => {
830
830
  var s;
831
- (s = a.value) == null || s.setAnnotations(e);
832
- }, dt = () => {
833
- var e;
834
- return ((e = a.value) == null ? void 0 : e.getAnnotations()) || [];
835
- }, Tt = (e = "json") => {
836
- var l, h;
837
- const s = dt();
831
+ (s = o.value) == null || s.setAnnotations(n);
832
+ }, gt = () => {
833
+ var n;
834
+ return ((n = o.value) == null ? void 0 : n.getAnnotations()) || [];
835
+ }, Tt = (n = "json") => {
836
+ var a, d;
837
+ const s = gt();
838
838
  return {
839
- format: e,
840
- image: ((l = n.batchImages[p.value]) == null ? void 0 : l.imageUrl) || ((h = n.image) == null ? void 0 : h.url) || "",
839
+ format: n,
840
+ image: ((a = e.batchImages[p.value]) == null ? void 0 : a.imageUrl) || ((d = e.image) == null ? void 0 : d.url) || "",
841
841
  annotations: s
842
842
  };
843
- }, gt = (e) => {
844
- e >= 0 && e < n.batchImages.length && (nt(), p.value = e, N(), st());
845
- }, Pt = (e) => {
843
+ }, ut = (n) => {
844
+ n >= 0 && n < e.batchImages.length && (nt(), p.value = n, S(), st());
845
+ }, Pt = (n) => {
846
846
  var s;
847
- return e === p.value && a.value ? a.value.getAnnotations() || [] : ((s = n.batchImages[e]) == null ? void 0 : s.annotations) || [];
848
- }, Ht = (e) => e.type === "rectangle", Lt = (e) => e.type === "polygon", Dt = (e) => e.type === "point", Rt = (e) => e.type === "rotatedRect", K = (e) => {
849
- var l, h;
850
- const s = (l = u.value.find((v) => v.name === e.label)) == null ? void 0 : l.color;
851
- return ((h = e.style) == null ? void 0 : h.strokeColor) || s || "#409eff";
852
- }, ut = (e) => {
853
- const s = e.coordinates;
847
+ return n === p.value && o.value ? o.value.getAnnotations() || [] : ((s = e.batchImages[n]) == null ? void 0 : s.annotations) || [];
848
+ }, Ht = (n) => n.type === "rectangle", Lt = (n) => n.type === "polygon", Bt = (n) => n.type === "point", Dt = (n) => n.type === "rotatedRect", Y = (n) => {
849
+ var a, d;
850
+ const s = (a = u.value.find((v) => v.name === n.label)) == null ? void 0 : a.color;
851
+ return ((d = n.style) == null ? void 0 : d.strokeColor) || s || "#409eff";
852
+ }, vt = (n) => {
853
+ const s = n.coordinates;
854
854
  return (s == null ? void 0 : s.points) || [];
855
- }, Z = (e) => {
856
- const s = n.batchImages[e];
855
+ }, q = (n) => {
856
+ const s = e.batchImages[n];
857
857
  if (s != null && s.width && (s != null && s.height))
858
858
  return { width: s.width, height: s.height };
859
- const l = s != null && s.imageUrl ? F.value[s.imageUrl] : void 0;
860
- return l || (s != null && s.imageUrl && Y(s.imageUrl), { width: 1, height: 1 });
861
- }, Bt = (e) => {
862
- const s = n.batchImages[e];
863
- return s != null && s.width && (s != null && s.height) ? !0 : s != null && s.imageUrl ? !!F.value[s.imageUrl] : !1;
864
- }, Ut = (e, s) => {
865
- const l = s.coordinates, h = Z(e), v = K(s), C = Math.min(l.x1, l.x2), S = Math.min(l.y1, l.y2), Nt = Math.max(l.x1, l.x2), Wt = Math.max(l.y1, l.y2);
859
+ const a = s != null && s.imageUrl ? E.value[s.imageUrl] : void 0;
860
+ return a || (s != null && s.imageUrl && Z(s.imageUrl), { width: 1, height: 1 });
861
+ }, Rt = (n) => {
862
+ const s = e.batchImages[n];
863
+ return s != null && s.width && (s != null && s.height) ? !0 : s != null && s.imageUrl ? !!E.value[s.imageUrl] : !1;
864
+ }, Ut = (n, s) => {
865
+ const a = s.coordinates, d = q(n), v = Y(s), _ = Math.min(a.x1, a.x2), M = Math.min(a.y1, a.y2), Nt = Math.max(a.x1, a.x2), Wt = Math.max(a.y1, a.y2);
866
866
  return {
867
- left: `${C / h.width * 100}%`,
868
- top: `${S / h.height * 100}%`,
869
- width: `${(Nt - C) / h.width * 100}%`,
870
- height: `${(Wt - S) / h.height * 100}%`,
867
+ left: `${_ / d.width * 100}%`,
868
+ top: `${M / d.height * 100}%`,
869
+ width: `${(Nt - _) / d.width * 100}%`,
870
+ height: `${(Wt - M) / d.height * 100}%`,
871
871
  borderColor: v,
872
872
  backgroundColor: `${v}22`
873
873
  };
874
- }, Ft = (e, s) => {
875
- const l = Z(e);
876
- return ut(s).map((h) => `${h.x / l.width * 100},${h.y / l.height * 100}`).join(" ");
877
- }, Et = (e) => {
878
- const s = K(e);
874
+ }, Ft = (n, s) => {
875
+ const a = q(n);
876
+ return vt(s).map((d) => `${d.x / a.width * 100},${d.y / a.height * 100}`).join(" ");
877
+ }, Et = (n) => {
878
+ const s = Y(n);
879
879
  return {
880
880
  fill: `${s}33`,
881
881
  stroke: s,
882
882
  strokeWidth: "1.4"
883
883
  };
884
- }, Ot = (e, s, l) => {
885
- const h = Z(e), v = K(l);
884
+ }, Ot = (n, s, a) => {
885
+ const d = q(n), v = Y(a);
886
886
  return {
887
- left: `${s.x / h.width * 100}%`,
888
- top: `${s.y / h.height * 100}%`,
887
+ left: `${s.x / d.width * 100}%`,
888
+ top: `${s.y / d.height * 100}%`,
889
889
  backgroundColor: v
890
890
  };
891
- }, Vt = (e, s) => {
892
- const l = s.coordinates, h = Z(e), v = K(s), C = Math.abs(l.width), S = Math.abs(l.height);
891
+ }, Vt = (n, s) => {
892
+ const a = s.coordinates, d = q(n), v = Y(s), _ = Math.abs(a.width), M = Math.abs(a.height);
893
893
  return {
894
- left: `${(l.x - C / 2) / h.width * 100}%`,
895
- top: `${(l.y - S / 2) / h.height * 100}%`,
896
- width: `${C / h.width * 100}%`,
897
- height: `${S / h.height * 100}%`,
898
- transform: `rotate(${l.angle || 0}deg)`,
894
+ left: `${(a.x - _ / 2) / d.width * 100}%`,
895
+ top: `${(a.y - M / 2) / d.height * 100}%`,
896
+ width: `${_ / d.width * 100}%`,
897
+ height: `${M / d.height * 100}%`,
898
+ transform: `rotate(${a.angle || 0}deg)`,
899
899
  borderColor: v,
900
900
  backgroundColor: `${v}22`
901
901
  };
902
902
  };
903
903
  return t({
904
- jumpTo: gt,
904
+ jumpTo: ut,
905
905
  setImage: zt,
906
906
  setAnnotations: $t,
907
- getAnnotations: dt,
908
- selectTool: W,
909
- loadPredictionCandidates: ht,
907
+ getAnnotations: gt,
908
+ selectTool: U,
909
+ loadPredictionCandidates: dt,
910
910
  applyPredictions: St,
911
911
  rejectPredictions: Mt,
912
912
  exportAnnotations: Tt,
913
913
  getAllAnnotations: () => {
914
- var e, s;
915
- return n.batchImages.length > 0 ? n.batchImages : [{
916
- imageUrl: ((e = n.image) == null ? void 0 : e.url) || "",
917
- annotations: ((s = a.value) == null ? void 0 : s.getAnnotations()) || []
914
+ var n, s;
915
+ return e.batchImages.length > 0 ? e.batchImages : [{
916
+ imageUrl: ((n = e.image) == null ? void 0 : n.url) || "",
917
+ annotations: ((s = o.value) == null ? void 0 : s.getAnnotations()) || []
918
918
  }];
919
919
  },
920
920
  getCurrentAnnotation: () => {
921
- var e, s, l;
921
+ var n, s, a;
922
922
  return {
923
- imageUrl: ((e = n.batchImages[p.value]) == null ? void 0 : e.imageUrl) || ((s = n.image) == null ? void 0 : s.url) || "",
924
- annotations: ((l = a.value) == null ? void 0 : l.getAnnotations()) || []
923
+ imageUrl: ((n = e.batchImages[p.value]) == null ? void 0 : n.imageUrl) || ((s = e.image) == null ? void 0 : s.url) || "",
924
+ annotations: ((a = o.value) == null ? void 0 : a.getAnnotations()) || []
925
925
  };
926
926
  }
927
- }), j(() => {
928
- var e;
929
- return (e = n.image) == null ? void 0 : e.url;
927
+ }), J(() => {
928
+ var n;
929
+ return (n = e.image) == null ? void 0 : n.url;
930
930
  }, () => {
931
- var e;
932
- n.batchImages.length === 0 && ((e = n.image) != null && e.url) && N();
933
- }), j(() => n.predictionCandidates, (e) => {
934
- e && ht(e);
935
- }, { immediate: !0, deep: !0 }), j(
936
- () => n.batchImages.map((e) => `${e.imageUrl}:${e.width || ""}x${e.height || ""}`),
931
+ var n;
932
+ e.batchImages.length === 0 && ((n = e.image) != null && n.url) && S();
933
+ }), J(() => e.predictionCandidates, (n) => {
934
+ n && dt(n);
935
+ }, { immediate: !0, deep: !0 }), J(
936
+ () => e.batchImages.map((n) => `${n.imageUrl}:${n.width || ""}x${n.height || ""}`),
937
937
  () => {
938
- q();
938
+ X();
939
939
  },
940
940
  { immediate: !0 }
941
- ), (e, s) => (y(), b("div", {
942
- class: E(["annotation-container", m.theme])
941
+ ), (n, s) => (y(), x("div", {
942
+ class: V(["annotation-container", m.theme])
943
943
  }, [
944
- m.batchImages && m.batchImages.length > 0 ? (y(), b("div", fe, [
944
+ m.batchImages && m.batchImages.length > 0 ? (y(), x("div", fe, [
945
945
  g("div", ye, "批量图片(" + $(m.batchImages.length) + ")", 1),
946
946
  g("div", pe, [
947
- (y(!0), b(L, null, R(m.batchImages, (l, h) => (y(), b("button", {
948
- key: `${l.imageUrl}-${h}`,
949
- class: E(["image-list-item", { active: h === p.value }]),
950
- onClick: (v) => gt(h)
947
+ (y(!0), x(L, null, F(m.batchImages, (a, d) => (y(), x("button", {
948
+ key: `${a.imageUrl}-${d}`,
949
+ class: V(["image-list-item", { active: d === p.value }]),
950
+ onClick: (v) => ut(d)
951
951
  }, [
952
- g("div", xe, [
952
+ g("div", be, [
953
953
  g("img", {
954
- src: l.imageUrl,
955
- alt: `第${h + 1}张`,
954
+ src: a.imageUrl,
955
+ alt: `第${d + 1}张`,
956
956
  class: "image-list-thumb"
957
957
  }, null, 8, we),
958
- Bt(h) ? (y(), b("div", Ce, [
959
- (y(!0), b(L, null, R(Pt(h), (v) => (y(), b(L, {
958
+ Rt(d) ? (y(), x("div", Ce, [
959
+ (y(!0), x(L, null, F(Pt(d), (v) => (y(), x(L, {
960
960
  key: v.id
961
961
  }, [
962
- Ht(v) ? (y(), b("div", {
962
+ Ht(v) ? (y(), x("div", {
963
963
  key: 0,
964
964
  class: "thumb-overlay-rect",
965
- style: O(Ut(h, v))
966
- }, null, 4)) : Lt(v) ? (y(), b("svg", _e, [
965
+ style: N(Ut(d, v))
966
+ }, null, 4)) : Lt(v) ? (y(), x("svg", _e, [
967
967
  g("polygon", {
968
- points: Ft(h, v),
969
- style: O(Et(v))
968
+ points: Ft(d, v),
969
+ style: N(Et(v))
970
970
  }, null, 12, Ae)
971
- ])) : Dt(v) ? (y(!0), b(L, { key: 2 }, R(ut(v), (C, S) => (y(), b("div", {
972
- key: `${v.id}-${S}`,
971
+ ])) : Bt(v) ? (y(!0), x(L, { key: 2 }, F(vt(v), (_, M) => (y(), x("div", {
972
+ key: `${v.id}-${M}`,
973
973
  class: "thumb-overlay-point",
974
- style: O(Ot(h, C, v))
975
- }, null, 4))), 128)) : Rt(v) ? (y(), b("div", {
974
+ style: N(Ot(d, _, v))
975
+ }, null, 4))), 128)) : Dt(v) ? (y(), x("div", {
976
976
  key: 3,
977
977
  class: "thumb-overlay-rotated",
978
- style: O(Vt(h, v))
978
+ style: N(Vt(d, v))
979
979
  }, null, 4)) : z("", !0)
980
980
  ], 64))), 128))
981
981
  ])) : z("", !0)
982
982
  ]),
983
- g("span", Ie, "第 " + $(h + 1) + " 张", 1)
984
- ], 10, be))), 128))
983
+ g("span", Ie, "第 " + $(d + 1) + " 张", 1)
984
+ ], 10, xe))), 128))
985
985
  ])
986
986
  ])) : z("", !0),
987
- m.readOnly ? z("", !0) : (y(), b("div", ke, [
987
+ m.readOnly ? z("", !0) : (y(), x("div", ke, [
988
988
  g("div", {
989
- class: E(["tool-btn", { active: d.value === "pan" }]),
990
- onClick: s[0] || (s[0] = (l) => W("pan")),
989
+ class: V(["tool-btn", { active: h.value === "pan" }]),
990
+ onClick: s[0] || (s[0] = (a) => U("pan")),
991
991
  title: "拖动"
992
992
  }, [
993
- P(T, { name: "rank" })
993
+ H(P, { name: "rank" })
994
994
  ], 2),
995
995
  g("div", {
996
- class: E(["tool-btn", { active: d.value === "select" }]),
997
- onClick: s[1] || (s[1] = (l) => W("select")),
996
+ class: V(["tool-btn", { active: h.value === "select" }]),
997
+ onClick: s[1] || (s[1] = (a) => U("select")),
998
998
  title: "选择"
999
999
  }, [
1000
- P(T, { name: "pointer" })
1000
+ H(P, { name: "pointer" })
1001
1001
  ], 2),
1002
1002
  s[4] || (s[4] = g("div", { class: "divider" }, null, -1)),
1003
- (y(!0), b(L, null, R(H.value, (l) => (y(), b("div", {
1004
- key: l,
1005
- class: E(["tool-btn", { active: d.value === l }]),
1006
- onClick: (h) => W(l),
1007
- title: lt(l)
1003
+ (y(!0), x(L, null, F(tt.value, (a) => (y(), x("div", {
1004
+ key: a,
1005
+ class: V(["tool-btn", { active: h.value === a }]),
1006
+ onClick: (d) => U(a),
1007
+ title: b(a)
1008
1008
  }, [
1009
- P(T, {
1010
- name: V(l)
1009
+ H(P, {
1010
+ name: et(a)
1011
1011
  }, null, 8, ["name"])
1012
1012
  ], 10, Se))), 128)),
1013
1013
  s[5] || (s[5] = g("div", { class: "divider" }, null, -1)),
@@ -1016,37 +1016,37 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1016
1016
  onClick: yt,
1017
1017
  title: "放大"
1018
1018
  }, [
1019
- P(T, { name: "zoom-in" })
1019
+ H(P, { name: "zoom-in" })
1020
1020
  ]),
1021
1021
  g("div", {
1022
1022
  class: "tool-btn",
1023
1023
  onClick: pt,
1024
1024
  title: "缩小"
1025
1025
  }, [
1026
- P(T, { name: "zoom-out" })
1026
+ H(P, { name: "zoom-out" })
1027
1027
  ]),
1028
1028
  s[6] || (s[6] = g("div", { class: "divider" }, null, -1)),
1029
- et.value ? (y(), b("div", {
1029
+ lt.value ? (y(), x("div", {
1030
1030
  key: 0,
1031
1031
  class: "tool-btn",
1032
- onClick: ft,
1032
+ onClick: rt,
1033
1033
  title: "删除选中"
1034
1034
  }, [
1035
- P(T, { name: "delete" })
1035
+ H(P, { name: "delete" })
1036
1036
  ])) : z("", !0)
1037
1037
  ])),
1038
1038
  g("div", Me, [
1039
- m.readOnly ? z("", !0) : (y(), b("div", ze, [
1039
+ m.readOnly ? z("", !0) : (y(), x("div", ze, [
1040
1040
  g("div", $e, [
1041
1041
  s[7] || (s[7] = g("span", { class: "label-text" }, "当前标签:", -1)),
1042
1042
  g("div", Te, [
1043
- (y(!0), b(L, null, R(u.value, (l) => (y(), b("div", {
1044
- key: l.id,
1045
- class: E(["tag-chip", { active: f.value === l.id }]),
1046
- style: O({ backgroundColor: l.color, borderColor: l.color }),
1047
- onClick: (h) => J(l)
1048
- }, $(l.name), 15, Pe))), 128)),
1049
- u.value.length === 0 ? (y(), b("div", He, "请在右侧创建标签")) : z("", !0)
1043
+ (y(!0), x(L, null, F(u.value, (a) => (y(), x("div", {
1044
+ key: a.id,
1045
+ class: V(["tag-chip", { active: f.value === a.id }]),
1046
+ style: N({ backgroundColor: a.color, borderColor: a.color }),
1047
+ onClick: (d) => W(a)
1048
+ }, $(a.name), 15, Pe))), 128)),
1049
+ u.value.length === 0 ? (y(), x("div", He, "请在右侧创建标签")) : z("", !0)
1050
1050
  ])
1051
1051
  ])
1052
1052
  ])),
@@ -1057,66 +1057,66 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1057
1057
  }, [
1058
1058
  g("canvas", {
1059
1059
  ref_key: "canvasRef",
1060
- ref: o
1060
+ ref: r
1061
1061
  }, null, 512)
1062
1062
  ], 512),
1063
- m.batchImages && m.batchImages.length > 0 ? (y(), b("div", Le, [
1063
+ m.batchImages && m.batchImages.length > 0 ? (y(), x("div", Le, [
1064
1064
  g("button", {
1065
1065
  onClick: It,
1066
1066
  disabled: p.value <= 0
1067
1067
  }, [
1068
- P(T, { name: "back" }),
1069
- s[8] || (s[8] = X(" 上一张 ", -1))
1070
- ], 8, De),
1068
+ H(P, { name: "back" }),
1069
+ s[8] || (s[8] = j(" 上一张 ", -1))
1070
+ ], 8, Be),
1071
1071
  g("span", null, $(p.value + 1) + " / " + $(m.batchImages.length), 1),
1072
1072
  g("button", {
1073
1073
  onClick: kt,
1074
1074
  disabled: p.value >= m.batchImages.length - 1
1075
1075
  }, [
1076
- s[9] || (s[9] = X(" 下一张 ", -1)),
1077
- P(T, { name: "right" })
1078
- ], 8, Re)
1076
+ s[9] || (s[9] = j(" 下一张 ", -1)),
1077
+ H(P, { name: "right" })
1078
+ ], 8, De)
1079
1079
  ])) : z("", !0)
1080
1080
  ]),
1081
- m.readOnly ? z("", !0) : (y(), b("div", Be, [
1081
+ m.readOnly ? z("", !0) : (y(), x("div", Re, [
1082
1082
  g("div", { class: "sidebar-header" }, [
1083
1083
  s[10] || (s[10] = g("h3", null, "标签管理", -1)),
1084
1084
  g("button", {
1085
1085
  class: "add-btn",
1086
- onClick: bt
1086
+ onClick: xt
1087
1087
  }, "添加标签")
1088
1088
  ]),
1089
1089
  g("div", Ue, [
1090
- (y(!0), b(L, null, R(u.value, (l) => (y(), b("div", {
1091
- key: l.id,
1090
+ (y(!0), x(L, null, F(u.value, (a) => (y(), x("div", {
1091
+ key: a.id,
1092
1092
  class: "label-item"
1093
1093
  }, [
1094
1094
  g("div", Fe, [
1095
1095
  g("label", {
1096
1096
  class: "color-wrapper",
1097
- style: O({ backgroundColor: l.color })
1097
+ style: N({ backgroundColor: a.color })
1098
1098
  }, [
1099
1099
  it(g("input", {
1100
1100
  type: "color",
1101
- "onUpdate:modelValue": (h) => l.color = h,
1102
- onChange: (h) => Ct(l),
1101
+ "onUpdate:modelValue": (d) => a.color = d,
1102
+ onChange: (d) => Ct(a),
1103
1103
  style: { visibility: "hidden", width: "0", height: "0" }
1104
1104
  }, null, 40, Ee), [
1105
- [ot, l.color]
1105
+ [ot, a.color]
1106
1106
  ])
1107
1107
  ], 4),
1108
1108
  g("span", {
1109
1109
  class: "label-name",
1110
- title: l.name
1111
- }, $(l.name), 9, Oe),
1110
+ title: a.name
1111
+ }, $(a.name), 9, Oe),
1112
1112
  g("span", {
1113
1113
  class: "action-icon eye",
1114
- onClick: (h) => _t(l)
1114
+ onClick: (d) => _t(a)
1115
1115
  }, [
1116
- l.visible ? (y(), vt(T, {
1116
+ a.visible ? (y(), mt(P, {
1117
1117
  key: 0,
1118
1118
  name: "view"
1119
- })) : (y(), vt(T, {
1119
+ })) : (y(), mt(P, {
1120
1120
  key: 1,
1121
1121
  name: "hide"
1122
1122
  }))
@@ -1125,27 +1125,27 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1125
1125
  s[11] || (s[11] = g("span", { class: "dots" }, "•••", -1)),
1126
1126
  g("span", {
1127
1127
  class: "delete-btn",
1128
- onClick: (h) => At(l.id),
1128
+ onClick: (d) => At(a.id),
1129
1129
  title: "删除"
1130
1130
  }, [
1131
- P(T, { name: "delete" })
1131
+ H(P, { name: "delete" })
1132
1132
  ], 8, We)
1133
1133
  ])
1134
1134
  ])
1135
1135
  ]))), 128))
1136
1136
  ])
1137
1137
  ])),
1138
- _.value ? (y(), b("div", Je, [
1138
+ A.value ? (y(), x("div", Je, [
1139
1139
  g("div", je, [
1140
1140
  s[14] || (s[14] = g("h3", null, "新增标签", -1)),
1141
1141
  g("div", Xe, [
1142
1142
  s[12] || (s[12] = g("label", null, "名称", -1)),
1143
1143
  it(g("input", {
1144
- "onUpdate:modelValue": s[2] || (s[2] = (l) => M.value.name = l),
1144
+ "onUpdate:modelValue": s[2] || (s[2] = (a) => T.value.name = a),
1145
1145
  placeholder: "请输入标签名称",
1146
1146
  class: "modal-input"
1147
1147
  }, null, 512), [
1148
- [ot, M.value.name]
1148
+ [ot, T.value.name]
1149
1149
  ])
1150
1150
  ]),
1151
1151
  g("div", Ye, [
@@ -1153,21 +1153,21 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1153
1153
  g("div", qe, [
1154
1154
  it(g("input", {
1155
1155
  type: "color",
1156
- "onUpdate:modelValue": s[3] || (s[3] = (l) => M.value.color = l),
1156
+ "onUpdate:modelValue": s[3] || (s[3] = (a) => T.value.color = a),
1157
1157
  class: "modal-color-picker"
1158
1158
  }, null, 512), [
1159
- [ot, M.value.color]
1159
+ [ot, T.value.color]
1160
1160
  ]),
1161
- g("span", null, $(M.value.color), 1)
1161
+ g("span", null, $(T.value.color), 1)
1162
1162
  ])
1163
1163
  ]),
1164
1164
  g("div", { class: "modal-actions" }, [
1165
1165
  g("button", {
1166
- onClick: ct,
1166
+ onClick: ht,
1167
1167
  class: "cancel-btn"
1168
1168
  }, "取消"),
1169
1169
  g("button", {
1170
- onClick: xt,
1170
+ onClick: bt,
1171
1171
  class: "confirm-btn"
1172
1172
  }, "确认")
1173
1173
  ])
@@ -1175,13 +1175,13 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1175
1175
  ])) : z("", !0)
1176
1176
  ], 2));
1177
1177
  }
1178
- }), Ke = /* @__PURE__ */ tt(Ge, [["__scopeId", "data-v-22c2957b"]]), Ze = {
1178
+ }), Ke = /* @__PURE__ */ K(Ge, [["__scopeId", "data-v-22c2957b"]]), Ze = {
1179
1179
  class: "thumbnail-wrapper",
1180
1180
  ref: "wrapper"
1181
1181
  }, Qe = ["src", "alt"], tn = ["viewBox"], en = ["x", "y", "width", "height", "stroke"], nn = ["points", "stroke"], sn = ["x", "y", "fill"], on = {
1182
1182
  key: 1,
1183
1183
  class: "loading-placeholder"
1184
- }, an = /* @__PURE__ */ Q({
1184
+ }, an = /* @__PURE__ */ G({
1185
1185
  __name: "AnnotationThumbnail",
1186
1186
  props: {
1187
1187
  src: {},
@@ -1190,22 +1190,22 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1190
1190
  labels: {}
1191
1191
  },
1192
1192
  setup(m) {
1193
- const t = m, i = k(null), n = k(!1), r = k(0), o = k(0), c = () => {
1194
- i.value && (r.value = i.value.naturalWidth, o.value = i.value.naturalHeight, n.value = !0);
1195
- }, a = (u) => {
1193
+ const t = m, i = k(null), e = k(!1), l = k(0), r = k(0), c = () => {
1194
+ i.value && (l.value = i.value.naturalWidth, r.value = i.value.naturalHeight, e.value = !0);
1195
+ }, o = (u) => {
1196
1196
  var f;
1197
1197
  if ((f = u.style) != null && f.strokeColor) return u.style.strokeColor;
1198
1198
  if (t.labels) {
1199
- const _ = t.labels.find((M) => M.name === u.label);
1200
- if (_) return _.color;
1199
+ const A = t.labels.find((T) => T.name === u.label);
1200
+ if (A) return A.color;
1201
1201
  }
1202
1202
  return "#FF0000";
1203
- }, d = (u) => {
1204
- const f = u.coordinates, _ = Math.min(f.x1, f.x2), M = Math.min(f.y1, f.y2), B = Math.abs(f.x1 - f.x2), D = Math.abs(f.y1 - f.y2);
1205
- return { x: _, y: M, width: B, height: D };
1206
- }, p = (u) => u.coordinates.points.map((_) => `${_.x},${_.y}`).join(" "), w = (u) => {
1203
+ }, h = (u) => {
1204
+ const f = u.coordinates, A = Math.min(f.x1, f.x2), T = Math.min(f.y1, f.y2), B = Math.abs(f.x1 - f.x2), D = Math.abs(f.y1 - f.y2);
1205
+ return { x: A, y: T, width: B, height: D };
1206
+ }, p = (u) => u.coordinates.points.map((A) => `${A.x},${A.y}`).join(" "), C = (u) => {
1207
1207
  if (u.type === "rectangle") {
1208
- const f = d(u);
1208
+ const f = h(u);
1209
1209
  return { x: f.x, y: f.y - 5 };
1210
1210
  } else if (u.type === "polygon") {
1211
1211
  const f = u.coordinates.points;
@@ -1213,7 +1213,7 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1213
1213
  }
1214
1214
  return { x: 0, y: 0 };
1215
1215
  };
1216
- return (u, f) => (y(), b("div", Ze, [
1216
+ return (u, f) => (y(), x("div", Ze, [
1217
1217
  g("img", {
1218
1218
  ref_key: "img",
1219
1219
  ref: i,
@@ -1222,55 +1222,55 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1222
1222
  onLoad: c,
1223
1223
  alt: m.alt
1224
1224
  }, null, 40, Qe),
1225
- n.value ? (y(), b("svg", {
1225
+ e.value ? (y(), x("svg", {
1226
1226
  key: 0,
1227
1227
  class: "annotation-overlay",
1228
- viewBox: `0 0 ${r.value} ${o.value}`,
1228
+ viewBox: `0 0 ${l.value} ${r.value}`,
1229
1229
  preserveAspectRatio: "none"
1230
1230
  }, [
1231
- (y(!0), b(L, null, R(m.annotations, (_) => (y(), b(L, {
1232
- key: _.id
1231
+ (y(!0), x(L, null, F(m.annotations, (A) => (y(), x(L, {
1232
+ key: A.id
1233
1233
  }, [
1234
- _.type === "rectangle" ? (y(), b("rect", {
1234
+ A.type === "rectangle" ? (y(), x("rect", {
1235
1235
  key: 0,
1236
- x: d(_).x,
1237
- y: d(_).y,
1238
- width: d(_).width,
1239
- height: d(_).height,
1240
- stroke: a(_),
1236
+ x: h(A).x,
1237
+ y: h(A).y,
1238
+ width: h(A).width,
1239
+ height: h(A).height,
1240
+ stroke: o(A),
1241
1241
  "stroke-width": "2",
1242
1242
  fill: "transparent"
1243
1243
  }, null, 8, en)) : z("", !0),
1244
- _.type === "polygon" ? (y(), b("polygon", {
1244
+ A.type === "polygon" ? (y(), x("polygon", {
1245
1245
  key: 1,
1246
- points: p(_),
1247
- stroke: a(_),
1246
+ points: p(A),
1247
+ stroke: o(A),
1248
1248
  "stroke-width": "2",
1249
1249
  fill: "transparent"
1250
1250
  }, null, 8, nn)) : z("", !0),
1251
- _.label ? (y(), b("text", {
1251
+ A.label ? (y(), x("text", {
1252
1252
  key: 2,
1253
- x: w(_).x,
1254
- y: w(_).y,
1255
- fill: a(_),
1253
+ x: C(A).x,
1254
+ y: C(A).y,
1255
+ fill: o(A),
1256
1256
  "font-size": "14",
1257
1257
  "font-weight": "bold",
1258
1258
  class: "anno-label"
1259
- }, $(_.label), 9, sn)) : z("", !0)
1259
+ }, $(A.label), 9, sn)) : z("", !0)
1260
1260
  ], 64))), 128))
1261
- ], 8, tn)) : (y(), b("div", on, "Loading..."))
1261
+ ], 8, tn)) : (y(), x("div", on, "Loading..."))
1262
1262
  ], 512));
1263
1263
  }
1264
- }), ln = /* @__PURE__ */ tt(an, [["__scopeId", "data-v-78bcbe0c"]]), rn = { class: "batch-annotator" }, cn = {
1264
+ }), ln = /* @__PURE__ */ K(an, [["__scopeId", "data-v-78bcbe0c"]]), rn = { class: "batch-annotator" }, cn = {
1265
1265
  key: 0,
1266
1266
  class: "gallery-view"
1267
1267
  }, hn = { class: "gallery-header" }, dn = { class: "label-summary" }, gn = { class: "gallery-grid" }, un = ["onClick"], vn = { class: "thumbnail-wrapper" }, mn = { class: "img-meta" }, fn = { class: "img-index" }, yn = { class: "anno-count" }, pn = {
1268
1268
  key: 0,
1269
1269
  class: "bottom-bar"
1270
- }, bn = {
1270
+ }, xn = {
1271
1271
  key: 1,
1272
1272
  class: "editor-view"
1273
- }, xn = { class: "editor-header" }, wn = { class: "header-left" }, Cn = { class: "editor-title" }, _n = { class: "editor-content" }, An = /* @__PURE__ */ Q({
1273
+ }, bn = { class: "editor-header" }, wn = { class: "header-left" }, Cn = { class: "editor-title" }, _n = { class: "editor-content" }, An = /* @__PURE__ */ G({
1274
1274
  __name: "BatchAnnotator",
1275
1275
  props: {
1276
1276
  images: {},
@@ -1279,128 +1279,142 @@ const Zt = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" widt
1279
1279
  clickToEnterEditor: { type: Boolean }
1280
1280
  },
1281
1281
  emits: ["export", "update:images", "imageClick"],
1282
- setup(m, { emit: t }) {
1283
- const i = m, n = t, r = k("gallery"), o = k([]), c = k(0), a = k(null), d = U(() => {
1284
- var x, I;
1285
- return ((I = (x = i.actionBar) == null ? void 0 : x.annotateButton) == null ? void 0 : I.show) === !0;
1286
- }), p = U(() => {
1287
- var x, I;
1288
- return ((I = (x = i.actionBar) == null ? void 0 : x.exportButton) == null ? void 0 : I.show) === !0;
1289
- }), w = U(() => d.value || p.value), u = U(() => {
1290
- var x, I;
1291
- return ((I = (x = i.actionBar) == null ? void 0 : x.annotateButton) == null ? void 0 : I.text) || "手动标注";
1292
- }), f = U(() => {
1293
- var x, I;
1294
- return ((I = (x = i.actionBar) == null ? void 0 : x.exportButton) == null ? void 0 : I.text) || "导出";
1295
- }), _ = U(() => i.clickToEnterEditor !== !1);
1296
- j(() => i.images, (x) => {
1297
- o.value = JSON.parse(JSON.stringify(x));
1282
+ setup(m, { expose: t, emit: i }) {
1283
+ const e = m, l = i, r = k("gallery"), c = k([]), o = k(0), h = k(null), p = O(() => {
1284
+ var b, w;
1285
+ return ((w = (b = e.actionBar) == null ? void 0 : b.annotateButton) == null ? void 0 : w.show) === !0;
1286
+ }), C = O(() => {
1287
+ var b, w;
1288
+ return ((w = (b = e.actionBar) == null ? void 0 : b.exportButton) == null ? void 0 : w.show) === !0;
1289
+ }), u = O(() => p.value || C.value), f = O(() => {
1290
+ var b, w;
1291
+ return ((w = (b = e.actionBar) == null ? void 0 : b.annotateButton) == null ? void 0 : w.text) || "手动标注";
1292
+ }), A = O(() => {
1293
+ var b, w;
1294
+ return ((w = (b = e.actionBar) == null ? void 0 : b.exportButton) == null ? void 0 : w.text) || "导出";
1295
+ }), T = O(() => e.clickToEnterEditor !== !1);
1296
+ J(() => e.images, (b) => {
1297
+ c.value = JSON.parse(JSON.stringify(b));
1298
1298
  }, { immediate: !0, deep: !0 });
1299
- const M = (x) => {
1300
- c.value = x, r.value = "editor", qt(() => {
1301
- a.value && a.value.jumpTo && a.value.jumpTo(x);
1299
+ const B = (b) => {
1300
+ o.value = b, r.value = "editor", qt(() => {
1301
+ h.value && h.value.jumpTo && h.value.jumpTo(b);
1302
1302
  });
1303
- }, B = (x, I) => {
1304
- if (_.value) {
1305
- M(x);
1303
+ }, D = (b, w) => {
1304
+ if (T.value) {
1305
+ B(b);
1306
1306
  return;
1307
1307
  }
1308
- n("imageClick", { index: x, image: I });
1309
- }, D = () => {
1310
- if (a.value && a.value.getCurrentAnnotation) {
1311
- const x = a.value.getCurrentAnnotation();
1312
- o.value[c.value] && (o.value[c.value].annotations = x.annotations);
1308
+ l("imageClick", { index: b, imageId: w.id, image: w });
1309
+ }, E = (b) => c.value.findIndex((w) => w.id === b);
1310
+ t({
1311
+ openImageById: (b) => {
1312
+ const w = E(b);
1313
+ return w < 0 ? !1 : (B(w), !0);
1314
+ },
1315
+ triggerImageClickById: (b) => {
1316
+ const w = E(b);
1317
+ if (w < 0)
1318
+ return !1;
1319
+ const S = c.value[w];
1320
+ return S ? (l("imageClick", { index: w, imageId: S.id, image: S }), !0) : !1;
1321
+ }
1322
+ });
1323
+ const X = () => {
1324
+ if (h.value && h.value.getCurrentAnnotation) {
1325
+ const b = h.value.getCurrentAnnotation();
1326
+ c.value[o.value] && (c.value[o.value].annotations = b.annotations);
1313
1327
  }
1314
1328
  r.value = "gallery";
1315
- }, F = () => {
1316
- n("export", o.value);
1317
- }, et = (x) => {
1318
- c.value = x.currentIndex, o.value[x.currentIndex] && (o.value[x.currentIndex].annotations = x.currentAnnotations);
1319
- }, Y = (x) => {
1320
- if (a.value && a.value.getCurrentAnnotation) {
1321
- const I = a.value.getCurrentAnnotation();
1322
- o.value[c.value] && (o.value[c.value].annotations = I.annotations, n("update:images", o.value));
1329
+ }, R = () => {
1330
+ l("export", c.value);
1331
+ }, Q = (b) => {
1332
+ o.value = b.currentIndex, c.value[b.currentIndex] && (c.value[b.currentIndex].annotations = b.currentAnnotations);
1333
+ }, tt = (b) => {
1334
+ if (h.value && h.value.getCurrentAnnotation) {
1335
+ const w = h.value.getCurrentAnnotation();
1336
+ c.value[o.value] && (c.value[o.value].annotations = w.annotations, l("update:images", c.value));
1323
1337
  }
1324
- }, q = (x) => {
1338
+ }, et = (b) => {
1325
1339
  };
1326
- return (x, I) => (y(), b("div", rn, [
1327
- r.value === "gallery" ? (y(), b("div", cn, [
1340
+ return (b, w) => (y(), x("div", rn, [
1341
+ r.value === "gallery" ? (y(), x("div", cn, [
1328
1342
  g("div", hn, [
1329
- g("h3", null, "批量查看与标注 (" + $(o.value.length) + " 张)", 1),
1343
+ g("h3", null, "批量查看与标注 (" + $(c.value.length) + " 张)", 1),
1330
1344
  g("div", dn, [
1331
- (y(!0), b(L, null, R(m.labels, (H) => (y(), b("span", {
1332
- key: H.id,
1345
+ (y(!0), x(L, null, F(m.labels, (S) => (y(), x("span", {
1346
+ key: S.id,
1333
1347
  class: "label-badge",
1334
- style: O({ backgroundColor: H.color })
1335
- }, $(H.name), 5))), 128))
1348
+ style: N({ backgroundColor: S.color })
1349
+ }, $(S.name), 5))), 128))
1336
1350
  ])
1337
1351
  ]),
1338
1352
  g("div", gn, [
1339
- (y(!0), b(L, null, R(o.value, (H, V) => (y(), b("div", {
1340
- key: V,
1353
+ (y(!0), x(L, null, F(c.value, (S, U) => (y(), x("div", {
1354
+ key: U,
1341
1355
  class: "gallery-item",
1342
- onClick: (lt) => B(V, H)
1356
+ onClick: (rt) => D(U, S)
1343
1357
  }, [
1344
1358
  g("div", vn, [
1345
- P(ln, {
1346
- src: H.imageUrl,
1347
- annotations: H.annotations || [],
1359
+ H(ln, {
1360
+ src: S.imageUrl,
1361
+ annotations: S.annotations || [],
1348
1362
  labels: m.labels
1349
1363
  }, null, 8, ["src", "annotations", "labels"])
1350
1364
  ]),
1351
1365
  g("div", mn, [
1352
- g("span", fn, "#" + $(V + 1), 1),
1353
- g("span", yn, $((H.annotations || []).length) + " 标注", 1)
1366
+ g("span", fn, "#" + $(U + 1), 1),
1367
+ g("span", yn, $((S.annotations || []).length) + " 标注", 1)
1354
1368
  ])
1355
1369
  ], 8, un))), 128))
1356
1370
  ]),
1357
- w.value ? (y(), b("div", pn, [
1358
- d.value ? (y(), b("button", {
1371
+ u.value ? (y(), x("div", pn, [
1372
+ p.value ? (y(), x("button", {
1359
1373
  key: 0,
1360
1374
  class: "action-btn primary",
1361
- onClick: I[0] || (I[0] = (H) => M(0))
1375
+ onClick: w[0] || (w[0] = (S) => B(0))
1362
1376
  }, [
1363
- P(T, { name: "edit" }),
1364
- X(" " + $(u.value), 1)
1377
+ H(P, { name: "edit" }),
1378
+ j(" " + $(f.value), 1)
1365
1379
  ])) : z("", !0),
1366
- p.value ? (y(), b("button", {
1380
+ C.value ? (y(), x("button", {
1367
1381
  key: 1,
1368
1382
  class: "action-btn success",
1369
- onClick: F
1383
+ onClick: R
1370
1384
  }, [
1371
- P(T, { name: "download" }),
1372
- X(" " + $(f.value), 1)
1385
+ H(P, { name: "download" }),
1386
+ j(" " + $(A.value), 1)
1373
1387
  ])) : z("", !0)
1374
1388
  ])) : z("", !0)
1375
- ])) : (y(), b("div", bn, [
1376
- g("div", xn, [
1389
+ ])) : (y(), x("div", xn, [
1390
+ g("div", bn, [
1377
1391
  g("div", wn, [
1378
1392
  g("button", {
1379
1393
  class: "back-btn",
1380
- onClick: D
1394
+ onClick: X
1381
1395
  }, [
1382
- P(T, { name: "back" }),
1383
- I[1] || (I[1] = X(" 返回列表 ", -1))
1396
+ H(P, { name: "back" }),
1397
+ w[1] || (w[1] = j(" 返回列表 ", -1))
1384
1398
  ]),
1385
- g("span", Cn, "正在标注: " + $(c.value + 1) + " / " + $(o.value.length), 1)
1399
+ g("span", Cn, "正在标注: " + $(o.value + 1) + " / " + $(c.value.length), 1)
1386
1400
  ])
1387
1401
  ]),
1388
1402
  g("div", _n, [
1389
- P(Ke, {
1403
+ H(Ke, {
1390
1404
  ref_key: "annotatorRef",
1391
- ref: a,
1392
- batchImages: o.value,
1405
+ ref: h,
1406
+ batchImages: c.value,
1393
1407
  labels: m.labels,
1394
1408
  annotationTypes: ["rectangle", "polygon", "point", "rotatedRect"],
1395
- onBatchChange: et,
1396
- onAnnotationChange: Y,
1397
- onLabelChange: q
1409
+ onBatchChange: Q,
1410
+ onAnnotationChange: tt,
1411
+ onLabelChange: et
1398
1412
  }, null, 8, ["batchImages", "labels"])
1399
1413
  ])
1400
1414
  ]))
1401
1415
  ]));
1402
1416
  }
1403
- }), Sn = /* @__PURE__ */ tt(An, [["__scopeId", "data-v-bbb647e1"]]);
1417
+ }), Sn = /* @__PURE__ */ K(An, [["__scopeId", "data-v-419d7955"]]);
1404
1418
  export {
1405
1419
  Sn as BatchAnnotator,
1406
1420
  Ke as ImageAnnotator,