@glodon-aiot/dataset-annotation 3.14.0-alpha.31 → 3.14.0-alpha.33

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,57 +1,58 @@
1
- import { useCallback as ue, useRef as fe, useEffect as he } from "react";
2
- import { fabric as b } from "fabric";
3
- import { CROSSHAIR_LINE_COLOR as me, CROSSHAIR_LINE_DASH_ARRAY as ge, CROSSHAIR_LINE_WIDTH as ke, TEMP_RECT_FILL_COLOR as be, RECT_STROKE_COLOR as G, TEMP_RECT_STROKE_DASH_ARRAY as pe, TRANSPARENT_FILL as Ee, REGION_NAME_PREFIX as xe, BASE_STROKE_WIDTH as K } from "../../constants.mjs";
4
- const Te = ({
1
+ import { useCallback as Ae, useRef as ne, useEffect as se } from "react";
2
+ import { fabric as T } from "fabric";
3
+ import { CROSSHAIR_LINE_COLOR as Ye, CROSSHAIR_LINE_DASH_ARRAY as Ce, CROSSHAIR_LINE_WIDTH as Xe, TEMP_RECT_FILL_COLOR as Se, RECT_STROKE_COLOR as ie, TEMP_RECT_STROKE_DASH_ARRAY as je, TRANSPARENT_FILL as Be, REGION_NAME_PREFIX as Ue, BASE_STROKE_WIDTH as le } from "../../constants.mjs";
4
+ const Ge = ({
5
5
  canvas: e,
6
- drawingMode: C,
7
- draggable: q,
8
- setDrawingMode: J,
9
- canvasToImageCoords: Q,
10
- labelDefinitions: X,
11
- onChange: a,
12
- cropRegionImage: V,
13
- updateRegionShapeAndImage: P,
14
- performOCRIfNeeded: v,
15
- createDeleteControl: ee,
16
- createOCRControl: te,
17
- updateRegionNameText: oe,
18
- onRegionChange: U,
19
- onRegionSelect: M,
20
- rectMapRef: h,
21
- textLayersMapRef: re,
22
- setupBoundaryCheck: ie
6
+ drawingMode: y,
7
+ draggable: ce,
8
+ setDrawingMode: de,
9
+ canvasToImageCoords: ue,
10
+ labelDefinitions: J,
11
+ onChange: I,
12
+ cropRegionImage: fe,
13
+ updateRegionShapeAndImage: D,
14
+ performOCRIfNeeded: he,
15
+ createDeleteControl: me,
16
+ createOCRControl: ge,
17
+ updateRegionNameText: be,
18
+ onRegionChange: Q,
19
+ onRegionSelect: P,
20
+ rectMapRef: x,
21
+ textLayersMapRef: ke,
22
+ regionNameTextMapRef: v,
23
+ setupBoundaryCheck: pe
23
24
  }) => {
24
- const D = ue(() => {
25
- const R = /* @__PURE__ */ new Set();
26
- return re.current.forEach((T) => {
27
- T.forEach((W) => {
28
- R.add(W);
25
+ const V = Ae(() => {
26
+ const L = /* @__PURE__ */ new Set();
27
+ return ke.current.forEach((w) => {
28
+ w.forEach((z) => {
29
+ L.add(z);
29
30
  });
30
- }), R;
31
- }, [re]), l = fe({
31
+ }), L;
32
+ }, [ke]), i = ne({
32
33
  horizontal: null,
33
34
  vertical: null
34
- }), Le = fe({
35
+ }), N = ne(null), Oe = ne({
35
36
  dleft: -1,
36
37
  dtop: -1,
37
38
  dw: 0,
38
39
  dh: 0,
39
40
  rect: null
40
- }), Z = ue(() => {
41
+ }), G = Ae(() => {
41
42
  e && (e.skipTargetFind = !1);
42
43
  }, [e]);
43
- return he(() => {
44
- if (!e || !C || q) {
45
- if (Z(), e && !C) {
46
- l.current.horizontal && e.getObjects().includes(l.current.horizontal) && e.remove(l.current.horizontal), l.current.vertical && e.getObjects().includes(l.current.vertical) && e.remove(l.current.vertical), l.current = {
44
+ return se(() => {
45
+ if (!e || !y || ce) {
46
+ if (G(), e && !y) {
47
+ i.current.horizontal && e.getObjects().includes(i.current.horizontal) && e.remove(i.current.horizontal), i.current.vertical && e.getObjects().includes(i.current.vertical) && e.remove(i.current.vertical), i.current = {
47
48
  horizontal: null,
48
49
  vertical: null
49
50
  };
50
51
  const o = e.getActiveObject();
51
52
  e.selection = !1, e.skipTargetFind = !1;
52
- const r = D();
53
- e.getObjects().forEach((i) => {
54
- i instanceof b.Rect && r.has(i) ? i.set({
53
+ const s = V(), r = new Set(v.current.values());
54
+ e.getObjects().forEach((n) => {
55
+ n instanceof T.Rect && s.has(n) ? n.set({
55
56
  evented: !0,
56
57
  selectable: !1,
57
58
  lockMovementX: !0,
@@ -59,131 +60,198 @@ const Te = ({
59
60
  lockScalingX: !0,
60
61
  lockScalingY: !0,
61
62
  lockRotation: !0
62
- }) : (i.set("evented", !0), i.set("selectable", !0), i instanceof b.Rect && i.set("hasControls", !0));
63
- }), o && e.getObjects().includes(o) && (e.setActiveObject(o), e.renderAll()), e.defaultCursor = "default", e.setCursor("default");
63
+ }) : r.has(n) ? n.set({
64
+ evented: !1,
65
+ selectable: !1,
66
+ lockMovementX: !0,
67
+ lockMovementY: !0,
68
+ lockScalingX: !1,
69
+ // 允许缩放,用于抵消画布缩放
70
+ lockScalingY: !1,
71
+ // 允许缩放,用于抵消画布缩放
72
+ lockRotation: !0,
73
+ hasControls: !1,
74
+ hasBorders: !1
75
+ }) : (n.set("evented", !0), n.set("selectable", !0), n instanceof T.Rect && n.set("hasControls", !0));
76
+ }), o && e.getObjects().includes(o) && (e.setActiveObject(o), e.renderAll()), e.defaultCursor = "default";
64
77
  }
65
78
  return;
66
79
  }
67
- Z(), e.selection = !1, e.skipTargetFind = !0, e.getActiveObject() && (e.discardActiveObject(), e.renderAll()), e.getObjects().forEach((o) => {
68
- o.set("evented", !1), o.set("selectable", !1), o instanceof b.Rect && o.hasControls && o.set("hasControls", !1);
69
- }), e.defaultCursor = "crosshair", e.setCursor("crosshair"), l.current.horizontal && e.getObjects().includes(l.current.horizontal) && e.remove(l.current.horizontal), l.current.vertical && e.getObjects().includes(l.current.vertical) && e.remove(l.current.vertical), l.current = {
80
+ G(), e.selection = !1, e.skipTargetFind = !0, e.getActiveObject() && (e.discardActiveObject(), e.renderAll());
81
+ const w = new Set(v.current.values());
82
+ e.getObjects().forEach((o) => {
83
+ w.has(o) ? o.set({
84
+ evented: !1,
85
+ selectable: !1,
86
+ lockMovementX: !0,
87
+ lockMovementY: !0,
88
+ lockScalingX: !1,
89
+ // 允许缩放,用于抵消画布缩放
90
+ lockScalingY: !1,
91
+ // 允许缩放,用于抵消画布缩放
92
+ lockRotation: !0,
93
+ hasControls: !1,
94
+ hasBorders: !1
95
+ }) : (o.set("evented", !1), o.set("selectable", !1), o instanceof T.Rect && o.hasControls && o.set("hasControls", !1));
96
+ }), e.defaultCursor = "crosshair", e.setCursor("crosshair"), i.current.horizontal && e.getObjects().includes(i.current.horizontal) && e.remove(i.current.horizontal), i.current.vertical && e.getObjects().includes(i.current.vertical) && e.remove(i.current.vertical), i.current = {
70
97
  horizontal: null,
71
98
  vertical: null
72
99
  };
73
- const T = e.getWidth(), W = e.getHeight(), m = e.getZoom(), L = T / m, A = W / m, O = Math.max(L, A) * 3, F = ke / m, S = new b.Line([-O, 0, O, 0], {
74
- stroke: me,
75
- strokeWidth: F,
76
- strokeDashArray: ge,
100
+ const z = e.getWidth(), S = e.getHeight(), E = e.getZoom(), j = z / E, $ = S / E, _ = Math.max(j, $) * 3, K = Xe / E, F = new T.Line([-_, 0, _, 0], {
101
+ stroke: Ye,
102
+ strokeWidth: K,
103
+ strokeDashArray: Ce,
77
104
  selectable: !1,
78
105
  evented: !1,
79
106
  excludeFromExport: !0,
80
107
  // 导出时不包含此线
81
108
  strokeUniform: !0,
82
109
  // 设置为 true,使线宽随缩放调整以保持视觉一致
83
- visible: !1
84
- // 初始状态隐藏,只有鼠标进入画布时才显示
85
- }), _ = new b.Line([0, -O, 0, O], {
86
- stroke: me,
87
- strokeWidth: F,
88
- strokeDashArray: ge,
110
+ visible: !0
111
+ // 画框模式下常显辅助线
112
+ }), Z = new T.Line([0, -_, 0, _], {
113
+ stroke: Ye,
114
+ strokeWidth: K,
115
+ strokeDashArray: Ce,
89
116
  selectable: !1,
90
117
  evented: !1,
91
118
  excludeFromExport: !0,
92
119
  // 导出时不包含此线
93
120
  strokeUniform: !0,
94
121
  // 设置为 true,使线宽随缩放调整以保持视觉一致
95
- visible: !1
96
- // 初始状态隐藏,只有鼠标进入画布时才显示
122
+ visible: !0
123
+ // 画框模式下常显辅助线
97
124
  });
98
- l.current = {
99
- horizontal: S,
100
- vertical: _
101
- }, e.add(S), e.add(_), S.sendToBack(), _.sendToBack();
102
- const z = (o, r) => {
103
- const i = l.current.horizontal, d = l.current.vertical;
104
- if (!i || !d)
125
+ i.current = {
126
+ horizontal: F,
127
+ vertical: Z
128
+ }, e.add(F), e.add(Z), F.sendToBack(), Z.sendToBack();
129
+ const R = (o, s) => {
130
+ const r = i.current.horizontal, n = i.current.vertical;
131
+ if (!r || !n)
105
132
  return;
106
- const u = e.getZoom(), g = e.getWidth(), c = e.getHeight(), k = g / u, p = c / u, f = Math.max(k, p) * 3;
107
- i.set({
108
- x1: o - f,
109
- y1: r,
110
- x2: o + f,
111
- y2: r,
133
+ const u = e.getZoom(), b = e.getWidth(), l = e.getHeight(), h = b / u, f = l / u, m = e.viewportTransform || [1, 0, 0, 1, 0, 0];
134
+ m[4] / u, m[5] / u;
135
+ const k = e.backgroundImage;
136
+ let g = h, p = f;
137
+ if (k) {
138
+ const a = k.getElement();
139
+ if (a != null && a.width && (a != null && a.height)) {
140
+ const re = k, Fe = re.scaleX || 1, Ze = re.scaleY || 1;
141
+ g = a.width * Fe, p = a.height * Ze;
142
+ }
143
+ }
144
+ const A = Math.max(h, f, g, p) * 10, M = m[3] || u, Y = m[5] || 0, d = 0, C = l, X = (d - Y) / M, H = (C - Y) / M;
145
+ let W = s;
146
+ s < X ? W = X : s > H && (W = H);
147
+ const q = m[0] || u, oe = m[4] || 0, We = 0, ye = b, Re = (We - oe) / q, Te = (ye - oe) / q;
148
+ let U = o;
149
+ isNaN(o) || !isFinite(o) ? U = (b / 2 - oe) / q : o < Re ? U = Re : o > Te && (U = Te);
150
+ const ze = -A, _e = h + A, He = -A, Ie = f + A;
151
+ r.set({
152
+ x1: ze,
153
+ y1: W,
154
+ x2: _e,
155
+ y2: W,
112
156
  visible: !0
113
157
  // 显示辅助线
114
- }), d.set({
115
- x1: o,
116
- y1: r - f,
117
- x2: o,
118
- y2: r + f,
158
+ }), r.setCoords(), n.set({
159
+ x1: U,
160
+ y1: He,
161
+ x2: U,
162
+ y2: Ie,
119
163
  visible: !0
120
164
  // 显示辅助线
121
- }), i.sendToBack(), d.sendToBack(), e.renderAll();
122
- }, E = () => {
123
- const o = l.current.horizontal, r = l.current.vertical;
124
- !o || !r || (o.set({
125
- visible: !1
126
- }), r.set({
127
- visible: !1
128
- }), e.renderAll());
129
- }, t = Le.current, H = (o) => {
165
+ }), n.setCoords(), r.sendToBack(), n.sendToBack(), e.renderAll();
166
+ const O = Oe.current, Pe = O.rect && e.getObjects().includes(O.rect);
167
+ if (O.rect && !e.getObjects().includes(O.rect) && O.dleft !== -1 && O.dtop !== -1 && O.dw > 0 && O.dh > 0 && e.add(O.rect), Pe && O.rect) {
168
+ const a = Math.min(e.getObjects().indexOf(r), e.getObjects().indexOf(n));
169
+ e.getObjects().indexOf(O.rect) <= a && e.moveTo(O.rect, a + 1);
170
+ }
171
+ e.renderAll();
172
+ };
173
+ if (N.current) {
174
+ const s = e.getElement().getBoundingClientRect(), {
175
+ clientX: r,
176
+ clientY: n
177
+ } = N.current;
178
+ if (r >= s.left && r <= s.right && n >= s.top && n <= s.bottom) {
179
+ const b = new MouseEvent("mousemove", {
180
+ bubbles: !0,
181
+ cancelable: !0,
182
+ clientX: r,
183
+ clientY: n
184
+ }), l = e.getPointer(b);
185
+ R(l.x, l.y);
186
+ }
187
+ }
188
+ const t = Oe.current, B = (o) => {
130
189
  if (e.skipTargetFind && (t.dleft === -1 || t.dtop === -1)) {
131
- const r = e.getPointer(o.e);
132
- t.dleft = r.x, t.dtop = r.y;
190
+ const s = e.getPointer(o.e);
191
+ t.dleft = s.x, t.dtop = s.y;
133
192
  }
134
- }, Ae = (o) => {
135
- const r = e.getPointer(o.e);
136
- z(r.x, r.y);
137
- }, B = (o) => {
138
- if (Ae(o), t.dleft === -1 || t.dtop === -1)
139
- return;
140
- const r = e.getPointer(o.e);
141
- let i = r.x, d = r.y;
142
- if (t.dw = Math.abs(i - t.dleft), t.dh = Math.abs(d - t.dtop), t.dw === 0 || t.dh === 0)
143
- return;
144
- let u = t.dtop > d ? d : t.dtop, g = t.dleft > i ? i : t.dleft, c = t.dw, k = t.dh;
145
- t.rect && e.remove(t.rect);
146
- const p = e.getZoom(), f = K / p;
147
- t.rect = new b.Rect({
148
- left: g,
149
- top: u,
150
- width: c,
151
- height: k,
152
- fill: be,
153
- stroke: G,
154
- strokeWidth: f,
155
- strokeUniform: !0,
156
- // 边框宽度不受缩放影响
157
- strokeDashArray: pe,
158
- selectable: !1,
159
- evented: !1,
160
- objectCaching: !1,
161
- // 禁用缓存,避免缩放时边框变虚
162
- statefullCache: !1,
163
- noScaleCache: !1
164
- }), e.add(t.rect), e.renderAll();
165
- }, I = (o) => {
193
+ }, Me = (o) => {
194
+ const s = e.getPointer(o.e);
195
+ R(s.x, s.y);
196
+ }, ee = (o) => {
197
+ const s = e.getPointer(o.e);
198
+ if (t.dleft !== -1 && t.dtop !== -1) {
199
+ let r = s.x, n = s.y;
200
+ if (t.dw = Math.abs(r - t.dleft), t.dh = Math.abs(n - t.dtop), t.dw > 0 && t.dh > 0) {
201
+ let u = t.dtop > n ? n : t.dtop, b = t.dleft > r ? r : t.dleft, l = t.dw, h = t.dh;
202
+ if (!t.rect || t.rect.left !== b || t.rect.top !== u || t.rect.width !== l || t.rect.height !== h || !e.getObjects().includes(t.rect)) {
203
+ t.rect && e.getObjects().includes(t.rect) && e.remove(t.rect);
204
+ const g = e.getZoom(), p = le / g;
205
+ t.rect = new T.Rect({
206
+ left: b,
207
+ top: u,
208
+ width: l,
209
+ height: h,
210
+ fill: Se,
211
+ stroke: ie,
212
+ strokeWidth: p,
213
+ strokeUniform: !0,
214
+ // 边框宽度不受缩放影响
215
+ strokeDashArray: je,
216
+ selectable: !1,
217
+ evented: !1,
218
+ objectCaching: !1,
219
+ // 禁用缓存,避免缩放时边框变虚
220
+ statefullCache: !1,
221
+ noScaleCache: !1
222
+ }), e.add(t.rect);
223
+ }
224
+ const m = i.current.horizontal, k = i.current.vertical;
225
+ if (t.rect && m && k && e.getObjects().includes(m) && e.getObjects().includes(k) && e.getObjects().includes(t.rect)) {
226
+ const g = Math.min(e.getObjects().indexOf(m), e.getObjects().indexOf(k));
227
+ e.getObjects().indexOf(t.rect) <= g && e.moveTo(t.rect, g + 1);
228
+ }
229
+ } else
230
+ t.rect && e.getObjects().includes(t.rect) && (e.remove(t.rect), t.rect = null);
231
+ }
232
+ Me(o);
233
+ }, te = (o) => {
166
234
  if (t.dleft === -1 || t.dtop === -1) {
167
235
  t.dtop = -1, t.dleft = -1;
168
236
  return;
169
237
  }
170
- const r = e.getPointer(o.e);
171
- let i = r.x, d = r.y;
172
- if (t.dw = Math.abs(i - t.dleft), t.dh = Math.abs(d - t.dtop), t.dw === 0 || t.dh === 0) {
238
+ const s = e.getPointer(o.e);
239
+ let r = s.x, n = s.y;
240
+ if (t.dw = Math.abs(r - t.dleft), t.dh = Math.abs(n - t.dtop), t.dw === 0 || t.dh === 0) {
173
241
  t.rect && (e.remove(t.rect), e.renderAll()), t.dtop = -1, t.dleft = -1;
174
242
  return;
175
243
  }
176
- let u = t.dtop > d ? d : t.dtop, g = t.dleft > i ? i : t.dleft, c = t.dw, k = t.dh;
244
+ let u = t.dtop > n ? n : t.dtop, b = t.dleft > r ? r : t.dleft, l = t.dw, h = t.dh;
177
245
  t.rect && (e.remove(t.rect), t.rect = null);
178
- const p = Q(g, u), f = c, N = k, x = e.getZoom(), w = K / x, n = new b.Rect({
179
- left: g,
246
+ const f = ue(b, u), m = l, k = h, g = e.getZoom(), p = le / g, c = new T.Rect({
247
+ left: b,
180
248
  top: u,
181
- width: c,
182
- height: k,
183
- fill: Ee,
249
+ width: l,
250
+ height: h,
251
+ fill: Be,
184
252
  // 无填充色
185
- stroke: G,
186
- strokeWidth: w,
253
+ stroke: ie,
254
+ strokeWidth: p,
187
255
  strokeUniform: !0,
188
256
  // 边框宽度不受缩放影响
189
257
  selectable: !0,
@@ -203,131 +271,146 @@ const Te = ({
203
271
  hasControls: !0
204
272
  // 启用控件
205
273
  });
206
- e.add(n), n.controls.deleteControl = ee(), n.controls.ocrControl = te(), n.set("hasControls", !1);
207
- const $ = h.current.size, Y = {};
208
- X == null || X.forEach((s) => {
209
- Y[s.id] = "";
274
+ e.add(c), c.controls.deleteControl = me(), c.controls.ocrControl = ge(), c.set("hasControls", !1);
275
+ const A = x.current.size, M = {};
276
+ J == null || J.forEach((d) => {
277
+ M[d.id] = "";
210
278
  });
211
- const j = {
279
+ const Y = {
212
280
  id: `region-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
213
- name: `${xe}${$ + 1}`,
281
+ name: `${Ue}${A + 1}`,
214
282
  // 设置名称:区域+(索引+1)
215
283
  shape: {
216
284
  name: "rect",
217
- x: Math.max(0, p.x),
218
- y: Math.max(0, p.y),
219
- width: f,
220
- height: N
285
+ x: Math.max(0, f.x),
286
+ y: Math.max(0, f.y),
287
+ width: m,
288
+ height: k
221
289
  },
222
- content: Y
290
+ content: M
223
291
  };
224
- if (h.current.set(n, j), oe(n, j), P(n), U) {
225
- const s = h.current.get(n);
226
- s && U(s, "create");
292
+ if (x.current.set(c, Y), be(c, Y), D(c), Q) {
293
+ const d = x.current.get(c);
294
+ d && Q(d, "create");
227
295
  }
228
- V(j).then((s) => {
229
- if (s) {
230
- const y = h.current.get(n);
231
- if (y) {
232
- if (y.image = s, delete y.textLayouts, a) {
233
- const Oe = Array.from(h.current.values());
234
- a(Oe);
296
+ fe(Y).then((d) => {
297
+ if (d) {
298
+ const C = x.current.get(c);
299
+ if (C) {
300
+ if (C.image = d, delete C.textLayouts, I) {
301
+ const X = Array.from(x.current.values());
302
+ I(X);
235
303
  }
236
- v(y, "create");
304
+ he(C, "create");
237
305
  }
238
306
  }
239
- }).catch((s) => {
240
- console.error("Failed to crop region image:", s);
241
- }), e.setActiveObject(n), e.renderAll(), setTimeout(() => {
242
- if (M) {
243
- const s = h.current.get(n);
244
- s && M(s);
307
+ }).catch((d) => {
308
+ console.error("Failed to crop region image:", d);
309
+ }), e.setActiveObject(c), e.renderAll(), setTimeout(() => {
310
+ if (P) {
311
+ const d = x.current.get(c);
312
+ d && P(d);
245
313
  }
246
314
  setTimeout(() => {
247
- if (e && n && e.getObjects().includes(n) && (e.setActiveObject(n), e.renderAll(), M)) {
248
- const s = h.current.get(n);
249
- s && M(s);
315
+ if (e && c && e.getObjects().includes(c) && (e.setActiveObject(c), e.renderAll(), P)) {
316
+ const d = x.current.get(c);
317
+ d && P(d);
250
318
  }
251
319
  }, 0);
252
- }, 0), ie(n), n.on("modified", () => {
253
- P(n);
254
- }), n.on("moved", () => {
255
- P(n);
320
+ }, 0), pe(c), c.on("modified", () => {
321
+ D(c);
322
+ }), c.on("moved", () => {
323
+ D(c);
256
324
  }), setTimeout(() => {
257
- if (a) {
258
- const s = Array.from(h.current.values());
259
- a(s);
325
+ if (I) {
326
+ const d = Array.from(x.current.values());
327
+ I(d);
260
328
  }
261
- }, 0), t.dtop = -1, t.dleft = -1, e.selection = !1, J(!1);
262
- }, le = (o) => {
263
- const i = e.getElement().getBoundingClientRect(), d = o.clientX, u = o.clientY, g = d >= i.left && d <= i.right && u >= i.top && u <= i.bottom;
264
- if (g) {
265
- const c = e.getPointer(o);
266
- z(c.x, c.y);
267
- } else
268
- E();
269
- if (!(t.dleft === -1 || t.dtop === -1))
270
- if (g) {
271
- const c = e.getPointer(o);
272
- B({
329
+ }, 0), t.dtop = -1, t.dleft = -1, e.selection = !1, de(!1);
330
+ }, ae = (o) => {
331
+ N.current = {
332
+ clientX: o.clientX,
333
+ clientY: o.clientY
334
+ };
335
+ const r = e.getElement().getBoundingClientRect(), n = o.clientX, u = o.clientY, b = n >= r.left && n <= r.right && u >= r.top && u <= r.bottom;
336
+ if (t.dleft !== -1 && t.dtop !== -1)
337
+ if (b) {
338
+ const l = e.getPointer(o);
339
+ ee({
273
340
  e: o,
274
- pointer: c
341
+ pointer: l
275
342
  });
276
343
  } else {
277
- const c = e.getZoom(), k = e.viewportTransform ? e.viewportTransform[4] / c : 0, p = e.viewportTransform ? e.viewportTransform[5] / c : 0, f = e.getWidth() / c, N = e.getHeight() / c;
278
- let x = (d - i.left) / c - k, w = (u - i.top) / c - p;
279
- if (x = Math.max(0, Math.min(x, f)), w = Math.max(0, Math.min(w, N)), t.dw = Math.abs(x - t.dleft), t.dh = Math.abs(w - t.dtop), t.dw === 0 || t.dh === 0)
344
+ const l = e.getZoom(), h = e.viewportTransform ? e.viewportTransform[4] / l : 0, f = e.viewportTransform ? e.viewportTransform[5] / l : 0, m = e.getWidth() / l, k = e.getHeight() / l;
345
+ let g = (n - r.left) / l - h, p = (u - r.top) / l - f;
346
+ if (g = Math.max(0, Math.min(g, m)), p = Math.max(0, Math.min(p, k)), t.dw = Math.abs(g - t.dleft), t.dh = Math.abs(p - t.dtop), t.dw === 0 || t.dh === 0)
280
347
  return;
281
- let n = t.dtop > w ? w : t.dtop, $ = t.dleft > x ? x : t.dleft, Y = t.dw, j = t.dh;
348
+ let c = t.dtop > p ? p : t.dtop, A = t.dleft > g ? g : t.dleft, M = t.dw, Y = t.dh;
282
349
  t.rect && e.remove(t.rect);
283
- const s = e.getZoom(), y = K / s;
284
- t.rect = new b.Rect({
285
- left: $,
286
- top: n,
287
- width: Y,
288
- height: j,
289
- fill: be,
290
- stroke: G,
291
- strokeWidth: y,
350
+ const d = e.getZoom(), C = le / d;
351
+ t.rect = new T.Rect({
352
+ left: A,
353
+ top: c,
354
+ width: M,
355
+ height: Y,
356
+ fill: Se,
357
+ stroke: ie,
358
+ strokeWidth: C,
292
359
  strokeUniform: !0,
293
- strokeDashArray: pe,
360
+ strokeDashArray: je,
294
361
  selectable: !1,
295
362
  evented: !1,
296
363
  objectCaching: !1,
297
364
  statefullCache: !1,
298
365
  noScaleCache: !1
299
- }), e.add(t.rect), e.renderAll();
366
+ }), e.add(t.rect);
367
+ const X = i.current.horizontal, H = i.current.vertical;
368
+ if (X && H && e.getObjects().includes(X) && e.getObjects().includes(H)) {
369
+ const W = Math.min(e.getObjects().indexOf(X), e.getObjects().indexOf(H));
370
+ e.getObjects().indexOf(t.rect) < W && e.moveTo(t.rect, W + 1);
371
+ }
372
+ e.renderAll();
300
373
  }
301
- }, ne = () => {
302
- E();
303
- }, se = (o) => {
304
- const r = e.getPointer(o.e);
305
- z(r.x, r.y);
306
- }, ce = (o) => {
307
- if (!C)
374
+ if (t.dleft === -1 || t.dtop === -1) {
375
+ let l, h;
376
+ if (b) {
377
+ const f = e.getPointer(o);
378
+ l = f.x, h = f.y;
379
+ } else {
380
+ const f = e.getZoom(), m = e.viewportTransform ? e.viewportTransform[4] / f : 0, k = e.viewportTransform ? e.viewportTransform[5] / f : 0;
381
+ l = (n - r.left) / f - m, h = (u - r.top) / f - k;
382
+ }
383
+ R(l, h);
384
+ }
385
+ }, xe = () => {
386
+ }, Le = (o) => {
387
+ const s = e.getPointer(o.e);
388
+ R(s.x, s.y);
389
+ }, we = (o) => {
390
+ if (!y)
308
391
  return;
309
392
  e.skipTargetFind = !0, e.getActiveObject() && (e.discardActiveObject(), e.renderAll()), t.dtop = -1, t.dleft = -1, t.dw = 0, t.dh = 0;
310
- const i = e.getPointer(o.e);
311
- t.dleft = i.x, t.dtop = i.y;
393
+ const r = e.getPointer(o.e);
394
+ t.dleft = r.x, t.dtop = r.y;
312
395
  };
313
- e.on("mouse:down:before", ce), e.on("mouse:down", H), e.on("mouse:move", B), e.on("mouse:up", I), e.on("mouse:out", ne), e.on("mouse:over", se), document.addEventListener("mousemove", le);
314
- const de = (o) => {
396
+ e.on("mouse:down:before", we), e.on("mouse:down", B), e.on("mouse:move", ee), e.on("mouse:up", te), e.on("mouse:out", xe), e.on("mouse:over", Le), document.addEventListener("mousemove", ae);
397
+ const Ee = (o) => {
315
398
  if (t.dleft === -1 || t.dtop === -1)
316
399
  return;
317
- const r = e.getPointer(o);
318
- I({
400
+ const s = e.getPointer(o);
401
+ te({
319
402
  e: o,
320
- pointer: r
403
+ pointer: s
321
404
  });
322
405
  };
323
- return document.addEventListener("mouseup", de), () => {
324
- e.off("mouse:down:before", ce), e.off("mouse:down", H), e.off("mouse:move", B), e.off("mouse:up", I), e.off("mouse:out", ne), e.off("mouse:over", se), document.removeEventListener("mousemove", le), document.removeEventListener("mouseup", de), t.rect && (e.remove(t.rect), e.renderAll()), l.current.horizontal && e.getObjects().includes(l.current.horizontal) && e.remove(l.current.horizontal), l.current.vertical && e.getObjects().includes(l.current.vertical) && e.remove(l.current.vertical), l.current = {
406
+ return document.addEventListener("mouseup", Ee), () => {
407
+ e.off("mouse:down:before", we), e.off("mouse:down", B), e.off("mouse:move", ee), e.off("mouse:up", te), e.off("mouse:out", xe), e.off("mouse:over", Le), document.removeEventListener("mousemove", ae), document.removeEventListener("mouseup", Ee), t.rect && (e.remove(t.rect), e.renderAll()), i.current.horizontal && e.getObjects().includes(i.current.horizontal) && e.remove(i.current.horizontal), i.current.vertical && e.getObjects().includes(i.current.vertical) && e.remove(i.current.vertical), i.current = {
325
408
  horizontal: null,
326
409
  vertical: null
327
- }, e.skipTargetFind = !1;
328
- const o = D();
410
+ }, e.skipTargetFind = !1, e.defaultCursor = "default";
411
+ const o = V(), s = new Set(v.current.values());
329
412
  e.getObjects().forEach((r) => {
330
- r instanceof b.Rect && o.has(r) ? r.set({
413
+ r instanceof T.Rect && o.has(r) ? r.set({
331
414
  evented: !0,
332
415
  selectable: !1,
333
416
  lockMovementX: !0,
@@ -335,43 +418,67 @@ const Te = ({
335
418
  lockScalingX: !0,
336
419
  lockScalingY: !0,
337
420
  lockRotation: !0
421
+ }) : s.has(r) ? r.set({
422
+ evented: !1,
423
+ selectable: !1,
424
+ lockMovementX: !0,
425
+ lockMovementY: !0,
426
+ lockScalingX: !1,
427
+ // 允许缩放,用于抵消画布缩放
428
+ lockScalingY: !1,
429
+ // 允许缩放,用于抵消画布缩放
430
+ lockRotation: !0,
431
+ hasControls: !1,
432
+ hasBorders: !1
338
433
  }) : (r.set("evented", !0), r.set("selectable", !0));
339
434
  });
340
435
  };
341
- }, [e, C, q, Z, Q, a, V, P, v, ee, te, oe, U, M, J, h, D, ie]), he(() => {
342
- if (!e || !C)
436
+ }, [e, y, ce, G, ue, I, fe, D, he, me, ge, be, Q, P, de, x, V, v, pe]), se(() => {
437
+ if (!e)
438
+ return;
439
+ const L = (w) => {
440
+ N.current = {
441
+ clientX: w.clientX,
442
+ clientY: w.clientY
443
+ };
444
+ };
445
+ return document.addEventListener("mousemove", L), () => {
446
+ document.removeEventListener("mousemove", L);
447
+ };
448
+ }, [e]), se(() => {
449
+ if (!e || !y)
343
450
  return;
344
- let R = e.getZoom();
345
- const T = () => {
346
- const m = l.current.horizontal, L = l.current.vertical;
347
- if (!m || !L)
451
+ let L = e.getZoom();
452
+ const w = () => {
453
+ const S = i.current.horizontal, E = i.current.vertical;
454
+ if (!S || !E)
348
455
  return;
349
- const A = e.getZoom();
350
- if (Math.abs(A - R) < 1e-3)
456
+ const j = e.getZoom();
457
+ if (Math.abs(j - L) < 1e-3)
351
458
  return;
352
- R = A;
353
- const O = ke / A, F = e.getWidth(), S = e.getHeight(), _ = F / A, z = S / A, E = Math.max(_, z) * 3, t = (m.x1 + m.x2) / 2;
354
- m.y1, L.x1;
355
- const H = (L.y1 + L.y2) / 2;
356
- m.set({
357
- strokeWidth: O,
358
- x1: t - E,
359
- x2: t + E
360
- }), L.set({
361
- strokeWidth: O,
362
- y1: H - E,
363
- y2: H + E
459
+ L = j;
460
+ const $ = Xe / j, _ = e.getWidth(), K = e.getHeight(), F = _ / j, Z = K / j, R = Math.max(F, Z) * 3, t = (S.x1 + S.x2) / 2;
461
+ S.y1, E.x1;
462
+ const B = (E.y1 + E.y2) / 2;
463
+ S.set({
464
+ strokeWidth: $,
465
+ x1: t - R,
466
+ x2: t + R
467
+ }), E.set({
468
+ strokeWidth: $,
469
+ y1: B - R,
470
+ y2: B + R
364
471
  }), e.renderAll();
365
- }, W = () => {
366
- T();
472
+ }, z = () => {
473
+ w();
367
474
  };
368
- return e.on("after:render", W), T(), () => {
369
- e.off("after:render", W);
475
+ return e.on("after:render", z), w(), () => {
476
+ e.off("after:render", z);
370
477
  };
371
- }, [e, C]), {
372
- stopDraw: Z
478
+ }, [e, y]), {
479
+ stopDraw: G
373
480
  };
374
481
  };
375
482
  export {
376
- Te as useDrawingMode
483
+ Ge as useDrawingMode
377
484
  };