@jnrs/lingshu-smart 3.1.0 → 3.1.1

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,67 +1,67 @@
1
- import { defineStore as Ne } from "pinia";
2
- import { ref as ce, computed as _, watch as ie } from "vue";
3
- import { v as Qi, w as Di, x as et, y as Ti, e as x, a as L, b as D, M as he, g as $, o as G, j as _e, i as ki, z as oe, u as Ri, k as Li, q as _i, m as P, B as Ui, A as H, C as j, F as De, S as Oi, G as ii, s as mt, t as Te, D as de } from "./index-C6Liz-8o.js";
4
- import { Box as I, Star as Ki, Text as Mi, PointerEvent as ke, DragEvent as yt, Rect as Ni, Ellipse as we, Flow as fe, Path as ge, Group as si, App as Gi, LeaferEvent as Pi, EditorEvent as Et, EditorMoveEvent as Bt, EditorRotateEvent as St, EditorScaleEvent as bt } from "leafer";
5
- import { Ruler as Vi } from "leafer-x-ruler";
6
- import { DotMatrix as qi } from "leafer-x-dot-matrix";
7
- import { ElMessage as He } from "element-plus";
8
- import { createI18n as Wi } from "vue-i18n";
9
- import { en as Hi, zhCn as Yi } from "./locales/index.js";
10
- var Xi = "[object Symbol]";
11
- function Ji(r) {
12
- return typeof r == "symbol" || Qi(r) && Di(r) == Xi;
13
- }
14
- var ji = /\s/;
1
+ import { defineStore as Me } from "pinia";
2
+ import { ref as ce, computed as _, watch as se } from "vue";
3
+ import { v as Ti, w as Ri, x as $e, y as ki, e as v, a as L, b as D, M as he, g as $, z as te, o as G, j as ti, i as Li, u as _i, k as Ui, q as Oi, m as P, B as Ki, A as H, C as j, F as De, S as Mi, G as ii, s as Ct, t as Te, D as de } from "./index-C6Liz-8o.js";
4
+ import { Box as I, Star as Ni, Text as Gi, PointerEvent as Re, DragEvent as mt, Rect as Pi, Ellipse as we, Flow as fe, Path as ge, Group as si, App as Vi, LeaferEvent as qi, EditorEvent as yt, EditorMoveEvent as Et, EditorRotateEvent as Bt, EditorScaleEvent as St } from "leafer";
5
+ import { Ruler as Wi } from "leafer-x-ruler";
6
+ import { DotMatrix as Hi } from "leafer-x-dot-matrix";
7
+ import { ElMessage as We } from "element-plus";
8
+ import { createI18n as Yi } from "vue-i18n";
9
+ import { en as Xi, zhCn as Ji } from "./locales/index.js";
10
+ var ji = "[object Symbol]";
15
11
  function zi(r) {
16
- for (var e = r.length; e-- && ji.test(r.charAt(e)); )
12
+ return typeof r == "symbol" || Ti(r) && Ri(r) == ji;
13
+ }
14
+ var Zi = /\s/;
15
+ function $i(r) {
16
+ for (var e = r.length; e-- && Zi.test(r.charAt(e)); )
17
17
  ;
18
18
  return e;
19
19
  }
20
- var Zi = /^\s+/;
21
- function $i(r) {
22
- return r && r.slice(0, zi(r) + 1).replace(Zi, "");
20
+ var es = /^\s+/;
21
+ function ts(r) {
22
+ return r && r.slice(0, $i(r) + 1).replace(es, "");
23
23
  }
24
- var vt = NaN, es = /^[-+]0x[0-9a-f]+$/i, ts = /^0b[01]+$/i, is = /^0o[0-7]+$/i, ss = parseInt;
24
+ var bt = NaN, is = /^[-+]0x[0-9a-f]+$/i, ss = /^0b[01]+$/i, os = /^0o[0-7]+$/i, rs = parseInt;
25
25
  function xt(r) {
26
26
  if (typeof r == "number")
27
27
  return r;
28
- if (Ji(r))
29
- return vt;
30
- if (et(r)) {
28
+ if (zi(r))
29
+ return bt;
30
+ if ($e(r)) {
31
31
  var e = typeof r.valueOf == "function" ? r.valueOf() : r;
32
- r = et(e) ? e + "" : e;
32
+ r = $e(e) ? e + "" : e;
33
33
  }
34
34
  if (typeof r != "string")
35
35
  return r === 0 ? r : +r;
36
- r = $i(r);
37
- var t = ts.test(r);
38
- return t || is.test(r) ? ss(r.slice(2), t ? 2 : 8) : es.test(r) ? vt : +r;
36
+ r = ts(r);
37
+ var t = ss.test(r);
38
+ return t || os.test(r) ? rs(r.slice(2), t ? 2 : 8) : is.test(r) ? bt : +r;
39
39
  }
40
- var Ye = function() {
41
- return Ti.Date.now();
42
- }, os = "Expected a function", rs = Math.max, ns = Math.min;
40
+ var He = function() {
41
+ return ki.Date.now();
42
+ }, ns = "Expected a function", as = Math.max, ls = Math.min;
43
43
  function Se(r, e, t) {
44
- var i, s, o, n, a, A, l = 0, c = !1, h = !1, d = !0;
44
+ var i, s, o, n, a, l, A = 0, c = !1, h = !1, d = !0;
45
45
  if (typeof r != "function")
46
- throw new TypeError(os);
47
- e = xt(e) || 0, et(t) && (c = !!t.leading, h = "maxWait" in t, o = h ? rs(xt(t.maxWait) || 0, e) : o, d = "trailing" in t ? !!t.trailing : d);
46
+ throw new TypeError(ns);
47
+ e = xt(e) || 0, $e(t) && (c = !!t.leading, h = "maxWait" in t, o = h ? as(xt(t.maxWait) || 0, e) : o, d = "trailing" in t ? !!t.trailing : d);
48
48
  function C(B) {
49
49
  var T = i, Q = s;
50
- return i = s = void 0, l = B, n = r.apply(Q, T), n;
50
+ return i = s = void 0, A = B, n = r.apply(Q, T), n;
51
51
  }
52
52
  function p(B) {
53
- return l = B, a = setTimeout(b, e), c ? C(B) : n;
53
+ return A = B, a = setTimeout(b, e), c ? C(B) : n;
54
54
  }
55
55
  function f(B) {
56
- var T = B - A, Q = B - l, v = e - T;
57
- return h ? ns(v, o - Q) : v;
56
+ var T = B - l, Q = B - A, x = e - T;
57
+ return h ? ls(x, o - Q) : x;
58
58
  }
59
59
  function u(B) {
60
- var T = B - A, Q = B - l;
61
- return A === void 0 || T >= e || T < 0 || h && Q >= o;
60
+ var T = B - l, Q = B - A;
61
+ return l === void 0 || T >= e || T < 0 || h && Q >= o;
62
62
  }
63
63
  function b() {
64
- var B = Ye();
64
+ var B = He();
65
65
  if (u(B))
66
66
  return g(B);
67
67
  a = setTimeout(b, f(B));
@@ -70,24 +70,24 @@ function Se(r, e, t) {
70
70
  return a = void 0, d && i ? C(B) : (i = s = void 0, n);
71
71
  }
72
72
  function m() {
73
- a !== void 0 && clearTimeout(a), l = 0, i = A = s = a = void 0;
73
+ a !== void 0 && clearTimeout(a), A = 0, i = l = s = a = void 0;
74
74
  }
75
75
  function y() {
76
- return a === void 0 ? n : g(Ye());
76
+ return a === void 0 ? n : g(He());
77
77
  }
78
78
  function E() {
79
- var B = Ye(), T = u(B);
80
- if (i = arguments, s = this, A = B, T) {
79
+ var B = He(), T = u(B);
80
+ if (i = arguments, s = this, l = B, T) {
81
81
  if (a === void 0)
82
- return p(A);
82
+ return p(l);
83
83
  if (h)
84
- return clearTimeout(a), a = setTimeout(b, e), C(A);
84
+ return clearTimeout(a), a = setTimeout(b, e), C(l);
85
85
  }
86
86
  return a === void 0 && (a = setTimeout(b, e)), n;
87
87
  }
88
88
  return E.cancel = m, E.flush = y, E;
89
89
  }
90
- function as(r) {
90
+ function As(r) {
91
91
  if (!r || typeof r != "object") return !1;
92
92
  if (typeof r.width != "number" || typeof r.height != "number")
93
93
  return console.error("isIScene: width must be a number"), !1;
@@ -103,29 +103,29 @@ function oi(r) {
103
103
  return !r || typeof r != "object" ? !1 : typeof r.id != "string" ? (console.error("isILayer: id must be a string"), !1) : typeof r.className != "string" ? (console.error("isILayer: className must be a string"), !1) : !(r.children && (!Array.isArray(r.children) || !r.children.every((e) => oi(e))) || r.fill && typeof r.fill != "object" || r.selected !== void 0 && typeof r.selected != "boolean");
104
104
  }
105
105
  function ri(r) {
106
- return !r || typeof r != "object" ? !1 : typeof r.id != "string" ? (console.error("isICase: id must be a string"), !1) : typeof r.title != "string" ? (console.error("isICase: title must be a string"), !1) : typeof r.isActive != "boolean" ? (console.error("isICase: isActive must be a boolean"), !1) : !(!Array.isArray(r.layers) || !r.layers.every((e) => oi(e)) || !as(r.scene));
106
+ return !r || typeof r != "object" ? !1 : typeof r.id != "string" ? (console.error("isICase: id must be a string"), !1) : typeof r.title != "string" ? (console.error("isICase: title must be a string"), !1) : typeof r.isActive != "boolean" ? (console.error("isICase: isActive must be a boolean"), !1) : !(!Array.isArray(r.layers) || !r.layers.every((e) => oi(e)) || !As(r.scene));
107
107
  }
108
- function As(r) {
108
+ function cs(r) {
109
109
  return Array.isArray(r) ? r.every((e) => ri(e)) : (console.error("isICaseArray: data must be an array"), !1);
110
110
  }
111
- const ls = 1704038400000n, st = 5n, cs = 5n, Ge = 12n, hs = (1n << st) - 1n, gs = (1n << Ge) - 1n, us = Ge, ds = Ge + st, fs = Ge + st + cs, ps = BigInt(Math.floor(Math.random() * (Number(hs) + 1))), ws = 0n;
111
+ const hs = 1704038400000n, it = 5n, gs = 5n, Ne = 12n, us = (1n << it) - 1n, ds = (1n << Ne) - 1n, fs = Ne, ps = Ne + it, ws = Ne + it + gs, Cs = BigInt(Math.floor(Math.random() * (Number(us) + 1))), ms = 0n;
112
112
  let Ce = -1n, me = 0n;
113
- function Cs() {
113
+ function ys() {
114
114
  let r = BigInt(Date.now());
115
115
  if (r < Ce && (r = Ce), r === Ce) {
116
- if (me = me + 1n & gs, me === 0n) {
116
+ if (me = me + 1n & ds, me === 0n) {
117
117
  for (; BigInt(Date.now()) <= Ce; )
118
118
  ;
119
119
  r = BigInt(Date.now());
120
120
  }
121
121
  } else
122
122
  me = 0n;
123
- return Ce = r, r - ls << fs | ws << ds | ps << us | me;
123
+ return Ce = r, r - hs << ws | ms << ps | Cs << fs | me;
124
124
  }
125
- function ot() {
126
- return Cs().toString();
125
+ function st() {
126
+ return ys().toString();
127
127
  }
128
- const ms = {
128
+ const Es = {
129
129
  id: "",
130
130
  title: "",
131
131
  isActive: !1,
@@ -144,7 +144,7 @@ const ms = {
144
144
  },
145
145
  texture: ""
146
146
  }
147
- }, ys = {
147
+ }, Bs = {
148
148
  rawData: {
149
149
  id: ""
150
150
  },
@@ -195,7 +195,7 @@ const ms = {
195
195
  // 编辑状态
196
196
  editable: !0,
197
197
  selected: !1
198
- }, rt = [
198
+ }, ot = [
199
199
  {
200
200
  title: "机床",
201
201
  tag: L.MACHINE,
@@ -222,7 +222,7 @@ const ms = {
222
222
  {
223
223
  name: "1",
224
224
  index: 1,
225
- resourceType: x.WORKPIECE,
225
+ resourceType: v.WORKPIECE,
226
226
  width: 50,
227
227
  height: 50,
228
228
  x: 0,
@@ -261,7 +261,7 @@ const ms = {
261
261
  {
262
262
  name: "1",
263
263
  index: 1,
264
- resourceType: x.WORKPIECE,
264
+ resourceType: v.WORKPIECE,
265
265
  width: 50,
266
266
  height: 50,
267
267
  x: 0,
@@ -301,7 +301,7 @@ const ms = {
301
301
  {
302
302
  name: "1",
303
303
  index: 1,
304
- resourceType: x.WORKPIECE,
304
+ resourceType: v.WORKPIECE,
305
305
  width: 50,
306
306
  height: 50,
307
307
  x: 0,
@@ -349,7 +349,7 @@ const ms = {
349
349
  {
350
350
  name: "1",
351
351
  index: 1,
352
- resourceType: x.WORKPIECE,
352
+ resourceType: v.WORKPIECE,
353
353
  width: 42,
354
354
  height: 42,
355
355
  x: 0,
@@ -361,7 +361,7 @@ const ms = {
361
361
  {
362
362
  name: "2",
363
363
  index: 2,
364
- resourceType: x.WORKPIECE,
364
+ resourceType: v.WORKPIECE,
365
365
  width: 42,
366
366
  height: 42,
367
367
  x: 0,
@@ -373,7 +373,7 @@ const ms = {
373
373
  {
374
374
  name: "3",
375
375
  index: 3,
376
- resourceType: x.WORKPIECE,
376
+ resourceType: v.WORKPIECE,
377
377
  width: 42,
378
378
  height: 42,
379
379
  x: 0,
@@ -385,7 +385,7 @@ const ms = {
385
385
  {
386
386
  name: "4",
387
387
  index: 4,
388
- resourceType: x.WORKPIECE,
388
+ resourceType: v.WORKPIECE,
389
389
  width: 42,
390
390
  height: 42,
391
391
  x: 0,
@@ -425,7 +425,7 @@ const ms = {
425
425
  {
426
426
  name: "1",
427
427
  index: 1,
428
- resourceType: x.WORKPIECE,
428
+ resourceType: v.WORKPIECE,
429
429
  width: 42,
430
430
  height: 42,
431
431
  x: 0,
@@ -438,7 +438,7 @@ const ms = {
438
438
  {
439
439
  name: "2",
440
440
  index: 2,
441
- resourceType: x.WORKPIECE,
441
+ resourceType: v.WORKPIECE,
442
442
  width: 42,
443
443
  height: 42,
444
444
  x: 0,
@@ -451,7 +451,7 @@ const ms = {
451
451
  {
452
452
  name: "3",
453
453
  index: 3,
454
- resourceType: x.WORKPIECE,
454
+ resourceType: v.WORKPIECE,
455
455
  width: 42,
456
456
  height: 42,
457
457
  x: 0,
@@ -464,7 +464,7 @@ const ms = {
464
464
  {
465
465
  name: "4",
466
466
  index: 4,
467
- resourceType: x.WORKPIECE,
467
+ resourceType: v.WORKPIECE,
468
468
  width: 42,
469
469
  height: 42,
470
470
  x: 0,
@@ -493,7 +493,7 @@ const ms = {
493
493
  tags: [L.TRANSPORT],
494
494
  width: 90,
495
495
  height: 76,
496
- currentFixture: x.WORKPIECE,
496
+ currentFixture: v.WORKPIECE,
497
497
  linkRailId: "",
498
498
  linkTrailerId: ""
499
499
  },
@@ -505,7 +505,7 @@ const ms = {
505
505
  tags: [L.TRANSPORT],
506
506
  width: 90,
507
507
  height: 76,
508
- currentFixture: x.WORKPIECE,
508
+ currentFixture: v.WORKPIECE,
509
509
  linkRailId: "",
510
510
  linkTrailerId: ""
511
511
  },
@@ -574,7 +574,7 @@ const ms = {
574
574
  {
575
575
  name: "1",
576
576
  index: 1,
577
- resourceType: x.WORKPIECE,
577
+ resourceType: v.WORKPIECE,
578
578
  width: 50,
579
579
  height: 50,
580
580
  x: 0,
@@ -586,7 +586,7 @@ const ms = {
586
586
  {
587
587
  name: "2",
588
588
  index: 2,
589
- resourceType: x.WORKPIECE,
589
+ resourceType: v.WORKPIECE,
590
590
  width: 50,
591
591
  height: 50,
592
592
  x: 0,
@@ -619,22 +619,22 @@ const ms = {
619
619
  }
620
620
  ]
621
621
  }
622
- ], tt = {};
623
- for (const r of rt)
622
+ ], et = {};
623
+ for (const r of ot)
624
624
  for (const e of r.children)
625
- tt[e.className] || (tt[e.className] = { width: e.width, height: e.height });
626
- function vo(r) {
627
- return r ? tt[r] : void 0;
625
+ et[e.className] || (et[e.className] = { width: e.width, height: e.height });
626
+ function Qo(r) {
627
+ return r ? et[r] : void 0;
628
628
  }
629
- const Es = /^(#[0-9a-f]{3,8}|rgba?\(|hsla?\([a-z][-a-z0-9]*)$/i;
630
- function Bs(r) {
629
+ const Ss = /^(#[0-9a-f]{3,8}|rgba?\(|hsla?\([a-z][-a-z0-9]*)$/i;
630
+ function bs(r) {
631
631
  if (!r) return !1;
632
632
  const e = r.toLowerCase();
633
- return e === "none" || e === "transparent" ? !1 : Es.test(r) ? !0 : /^[a-z][a-z-]{2,}$/i.test(r);
633
+ return e === "none" || e === "transparent" ? !1 : Ss.test(r) ? !0 : /^[a-z][a-z-]{2,}$/i.test(r);
634
634
  }
635
- const nt = "public/lingshu-smart/wsProxyConfig.json";
636
- function Ss(r) {
637
- let e = (r || nt).replace(/^\/+|\/+$/g, "");
635
+ const rt = "public/lingshu-smart/wsProxyConfig.json";
636
+ function xs(r) {
637
+ let e = (r || rt).replace(/^\/+|\/+$/g, "");
638
638
  return e = e.replace(/^public\/+/i, ""), /\.json$/i.test(e) || (e += ".json"), `/${e}?t=${Date.now()}`;
639
639
  }
640
640
  function Ie(r, e) {
@@ -660,7 +660,7 @@ function N(r, e, t = "warn") {
660
660
  i.push(`${s}=${typeof o == "string" ? o : JSON.stringify(o)}`);
661
661
  t === "info" ? G.info(i.join(", ")) : G.warn(i.join(", "));
662
662
  }
663
- function It(r, e) {
663
+ function vt(r, e) {
664
664
  if (e === "boolean") {
665
665
  if (typeof r == "boolean") return r;
666
666
  if (typeof r == "number") return r !== 0;
@@ -696,7 +696,7 @@ function ai(r, e, t, i, s) {
696
696
  const n = String(o);
697
697
  n in e.valueMap && (o = e.valueMap[n]);
698
698
  }
699
- if ((o === null || o === "") && e.defaultValue !== void 0 && (o = e.defaultValue), e.transform === "percentToPixel" && typeof o == "number" && (o = _e(o, t ?? null, e.transformPrecision ?? 2, e.transformType ?? "width")), e.transform === "runtimeToPixel" && typeof o == "number" && (o = ki(o, t ?? null, e.transformPrecision ?? 2, e.transformType ?? "width")), e.transform === "dictLabel" || e.transform === "dictColor") {
699
+ if ((o === null || o === "") && e.defaultValue !== void 0 && (o = e.defaultValue), e.transform === "percentToPixel" && typeof o == "number" && (o = ti(o, t ?? null, e.transformPrecision ?? 2, e.transformType ?? "width")), e.transform === "runtimeToPixel" && typeof o == "number" && (o = Li(o, t ?? null, e.transformPrecision ?? 2, e.transformType ?? "width")), e.transform === "dictLabel" || e.transform === "dictColor") {
700
700
  const n = e.transform === "dictLabel" ? "label" : "color", a = e.dictName || "";
701
701
  if (typeof o != "string" && typeof o != "number") {
702
702
  G.warn("WsProxy: 字典%s「%s」输入非标量值, 不产出该字段", n, a);
@@ -706,79 +706,79 @@ function ai(r, e, t, i, s) {
706
706
  G.info("WsProxy: 字典%s「%s」未配置 dictFn, 不产出该字段", n, a);
707
707
  return;
708
708
  }
709
- let A;
709
+ let l;
710
710
  try {
711
- A = i(a, o, n);
712
- } catch (l) {
711
+ l = i(a, o, n);
712
+ } catch (A) {
713
713
  G.error(
714
714
  "WsProxy: 字典%s「%s」调用 dictFn 异常, 不产出该字段: %s",
715
715
  n,
716
716
  a,
717
- l instanceof Error ? l.message : String(l)
717
+ A instanceof Error ? A.message : String(A)
718
718
  );
719
719
  return;
720
720
  }
721
- if (A == null || String(A).trim() === "") {
721
+ if (l == null || String(l).trim() === "") {
722
722
  G.info("WsProxy: 字典%s「%s」对值 %o 返回空, 不产出该字段", n, a, o);
723
723
  return;
724
724
  }
725
725
  if (n === "color") {
726
- const l = String(A);
727
- if (!Bs(l)) {
728
- G.info("WsProxy: 字典Color「%s」对值 %o 产出 %o 非合法CSS颜色, 不产出该字段", a, o, l);
726
+ const A = String(l);
727
+ if (!bs(A)) {
728
+ G.info("WsProxy: 字典Color「%s」对值 %o 产出 %o 非合法CSS颜色, 不产出该字段", a, o, A);
729
729
  return;
730
730
  }
731
- } else if (typeof A != "string") {
732
- G.info("WsProxy: 字典Label「%s」对值 %o 产出非字符串 %o, 不产出该字段", a, o, A);
731
+ } else if (typeof l != "string") {
732
+ G.info("WsProxy: 字典Label「%s」对值 %o 产出非字符串 %o, 不产出该字段", a, o, l);
733
733
  return;
734
734
  }
735
- o = A;
735
+ o = l;
736
736
  }
737
737
  if (e.transform === "dictColorMap") {
738
738
  const n = e.dictName || "";
739
739
  if (o && typeof o == "object" && !Array.isArray(o)) {
740
- const a = o, A = {};
741
- for (const l of Object.keys(a)) {
742
- const c = a[l], h = typeof c == "string" || typeof c == "number" ? c : void 0;
740
+ const a = o, l = {};
741
+ for (const A of Object.keys(a)) {
742
+ const c = a[A], h = typeof c == "string" || typeof c == "number" ? c : void 0;
743
743
  if (i)
744
744
  try {
745
- A[l] = i(n, h, "color");
745
+ l[A] = i(n, h, "color");
746
746
  } catch (d) {
747
747
  G.error(
748
748
  "WsProxy: 字典批量转换「%s」键 %s 调用 dictFn 异常, 保留源值: %s",
749
749
  n,
750
- l,
750
+ A,
751
751
  d instanceof Error ? d.message : String(d)
752
- ), A[l] = String(c);
752
+ ), l[A] = String(c);
753
753
  }
754
754
  else
755
- A[l] = String(c);
755
+ l[A] = String(c);
756
756
  }
757
- o = A;
757
+ o = l;
758
758
  }
759
759
  }
760
760
  if (e.transform === "objDict" && o && typeof o == "object" && !Array.isArray(o)) {
761
761
  const n = o, a = {};
762
- for (const A of Object.keys(n)) {
763
- const l = n[A];
764
- let c = l;
765
- const h = String(l);
762
+ for (const l of Object.keys(n)) {
763
+ const A = n[l];
764
+ let c = A;
765
+ const h = String(A);
766
766
  if (e.valueMap && h in e.valueMap)
767
767
  c = e.valueMap[h];
768
768
  else if (i && e.dictName) {
769
- const d = typeof l == "string" || typeof l == "number" ? l : void 0;
769
+ const d = typeof A == "string" || typeof A == "number" ? A : void 0;
770
770
  try {
771
771
  c = i(e.dictName, d, "color");
772
772
  } catch (C) {
773
773
  G.error(
774
774
  "WsProxy: 对象映射「%s」键 %s 调用 dictFn 异常, 保留源值: %s",
775
775
  e.dictName,
776
- A,
776
+ l,
777
777
  C instanceof Error ? C.message : String(C)
778
- ), c = l;
778
+ ), c = A;
779
779
  }
780
780
  }
781
- a[A] = It(c, e.transformTargetType);
781
+ a[l] = vt(c, e.transformTargetType);
782
782
  }
783
783
  o = a;
784
784
  }
@@ -793,22 +793,22 @@ function ai(r, e, t, i, s) {
793
793
  if (e.transform === "condition" && e.conditions && e.conditions.length > 0) {
794
794
  let n = !1;
795
795
  for (const a of e.conditions) {
796
- let A = o;
797
- if (!(a.source && a.source !== e.source && (A = Ie(r, a.source), A === void 0)) && vs(A, a)) {
796
+ let l = o;
797
+ if (!(a.source && a.source !== e.source && (l = Ie(r, a.source), l === void 0)) && Is(l, a)) {
798
798
  if (a.transform === "dictLabel" || a.transform === "dictColor") {
799
- const l = a.transform === "dictLabel" ? "label" : "color";
800
- i ? o = i(a.dictName || "", o, l) : G.warn("WsProxy: condition.dictFn 未配置,字典 %s 回退为原值", l);
801
- } else a.transform === "operation" ? o = Ft(a.operateFn || "negate", a.expression, o) : o = a.value;
799
+ const A = a.transform === "dictLabel" ? "label" : "color";
800
+ i ? o = i(a.dictName || "", o, A) : G.warn("WsProxy: condition.dictFn 未配置,字典 %s 回退为原值", A);
801
+ } else a.transform === "operation" ? o = It(a.operateFn || "negate", a.expression, o) : o = a.value;
802
802
  n = !0;
803
803
  break;
804
804
  }
805
805
  }
806
806
  !n && e.defaultValue !== void 0 && (o = e.defaultValue);
807
807
  }
808
- return e.transform === "operation" && (o = Ft(e.operateFn || "negate", e.expression, o)), e.transformTargetType && (o = It(o, e.transformTargetType)), o;
808
+ return e.transform === "operation" && (o = It(e.operateFn || "negate", e.expression, o)), e.transformTargetType && (o = vt(o, e.transformTargetType)), o;
809
809
  }
810
810
  }
811
- function Ft(r, e, t) {
811
+ function It(r, e, t) {
812
812
  if (r === "negate") {
813
813
  if (typeof t == "number") return -t;
814
814
  if (t != null && t !== "") {
@@ -817,16 +817,16 @@ function Ft(r, e, t) {
817
817
  }
818
818
  return t;
819
819
  }
820
- return r === "not" ? !Qt(t) : r === "toBoolean" ? Qt(t) : r === "concat" && e ? bs(t, e) : t;
820
+ return r === "not" ? !Ft(t) : r === "toBoolean" ? Ft(t) : r === "concat" && e ? vs(t, e) : t;
821
821
  }
822
- function Qt(r) {
822
+ function Ft(r) {
823
823
  if (typeof r == "boolean") return r;
824
824
  if (typeof r == "number") return r !== 0;
825
825
  if (r == null) return !1;
826
826
  const e = String(r).trim().toLowerCase();
827
827
  return !(e === "false" || e === "0" || e === "null" || e === "undefined" || e === "");
828
828
  }
829
- function bs(r, e) {
829
+ function vs(r, e) {
830
830
  const t = r == null ? "" : String(r), i = e.replace(/\{value\}/g, t), s = i.replace(/\s+/g, "");
831
831
  if (s !== "" && /^[\d+\-*/().]+$/.test(s))
832
832
  try {
@@ -837,7 +837,7 @@ function bs(r, e) {
837
837
  }
838
838
  return i;
839
839
  }
840
- function vs(r, e) {
840
+ function Is(r, e) {
841
841
  const { operator: t, operand: i } = e, s = Number(r), o = Number(i);
842
842
  switch (t) {
843
843
  case "eq":
@@ -860,64 +860,64 @@ function vs(r, e) {
860
860
  return !1;
861
861
  }
862
862
  }
863
- function at(r, e) {
863
+ function nt(r, e) {
864
864
  return {
865
- id: ot(),
865
+ id: st(),
866
866
  type: r,
867
867
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
868
868
  ...e?.caseId ? { case_id: e.caseId } : {}
869
869
  };
870
870
  }
871
- function te(r, e, t, i, s, o) {
871
+ function ie(r, e, t, i, s, o) {
872
872
  for (const n of t) {
873
873
  if (n.enabled === !1) continue;
874
874
  let a;
875
875
  try {
876
876
  a = ai(e, n, i, s, o);
877
- } catch (A) {
877
+ } catch (l) {
878
878
  G.error(
879
879
  "WsProxy: 字段「%s」解析异常, 已跳过该字段: %s",
880
880
  n.target,
881
- A instanceof Error ? A.message : String(A)
881
+ l instanceof Error ? l.message : String(l)
882
882
  );
883
883
  continue;
884
884
  }
885
885
  a !== void 0 && ni(r, n.target, a);
886
886
  }
887
887
  }
888
- function xs(r, e, t, i, s, o) {
888
+ function Fs(r, e, t, i, s, o) {
889
889
  const a = {
890
890
  device_type: e.deviceType?.trim() || he[e.className] || e.className
891
891
  };
892
- return te(a, r, e.mappings, i, s, o), a.device_id === void 0 || a.device_id === null || a.device_id === "" ? null : {
893
- envelope: at($.DeviceCommand, t),
892
+ return ie(a, r, e.mappings, i, s, o), a.device_id === void 0 || a.device_id === null || a.device_id === "" ? null : {
893
+ envelope: nt($.DeviceCommand, t),
894
894
  payload: a
895
895
  };
896
896
  }
897
- function Is(r, e, t, i, s, o, n, a) {
898
- const A = t.resourceFields, l = t.resourceMappings?.add?.length ? t.resourceMappings.add : Fe, c = t.resourceMappings?.batch_add?.length ? t.resourceMappings.batch_add : Fe, h = t.resourceMappings?.transfer?.length ? t.resourceMappings.transfer : lt, d = t.resourceMappings?.remove?.length ? t.resourceMappings.remove : At, C = [], p = (f) => {
899
- C.push({ envelope: at($.ResourceCommand, s), payload: f });
897
+ function Qs(r, e, t, i, s, o, n, a) {
898
+ const l = t.resourceFields, A = t.resourceMappings?.add?.length ? t.resourceMappings.add : Fe, c = t.resourceMappings?.batch_add?.length ? t.resourceMappings.batch_add : Fe, h = t.resourceMappings?.transfer?.length ? t.resourceMappings.transfer : lt, d = t.resourceMappings?.remove?.length ? t.resourceMappings.remove : at, C = [], p = (f) => {
899
+ C.push({ envelope: nt($.ResourceCommand, s), payload: f });
900
900
  };
901
- if (A?.operationField) {
902
- const f = String(Ie(r, A.operationField) ?? "").trim().toLowerCase();
901
+ if (l?.operationField) {
902
+ const f = String(Ie(r, l.operationField) ?? "").trim().toLowerCase();
903
903
  switch (f) {
904
904
  case "add": {
905
905
  if (Array.isArray(e))
906
- return N("资源 add 源 payload 为数组,无法按对象映射,跳过", { operationField: A.operationField }), [];
906
+ return N("资源 add 源 payload 为数组,无法按对象映射,跳过", { operationField: l.operationField }), [];
907
907
  const u = { operation: "add" };
908
- te(u, e, l, o, n, a);
908
+ ie(u, e, A, o, n, a);
909
909
  const b = u.to || {};
910
910
  return u.resource_id && b.device_id ? p(u) : N("资源 add 消息缺少 resource_id / to.device_id,跳过", { payload: e }), C;
911
911
  }
912
912
  case "batch_add": {
913
- const u = A.batchAddItems || i, b = Ie(r, u);
913
+ const u = l.batchAddItems || i, b = Ie(r, u);
914
914
  if (!Array.isArray(b))
915
915
  return N("batch_add 资源项数组为空或非数组,跳过", { itemsPath: u, rawValue: b }), [];
916
916
  const g = [];
917
917
  for (const m of b) {
918
918
  if (!m || typeof m != "object" || Array.isArray(m)) continue;
919
919
  const y = {};
920
- te(y, m, c, o, n, a);
920
+ ie(y, m, c, o, n, a);
921
921
  const E = y.to || {};
922
922
  y.resource_id && E.device_id ? g.push(y) : G.warn("WsProxy: batch_add 项缺少 resource_id / to.device_id,已跳过: %o", m);
923
923
  }
@@ -925,46 +925,46 @@ function Is(r, e, t, i, s, o, n, a) {
925
925
  }
926
926
  case "transfer": {
927
927
  if (Array.isArray(e))
928
- return N("资源 transfer 源 payload 为数组,无法按对象映射,跳过", { operationField: A.operationField }), [];
928
+ return N("资源 transfer 源 payload 为数组,无法按对象映射,跳过", { operationField: l.operationField }), [];
929
929
  const u = { operation: "transfer" };
930
- te(u, e, h, o, n, a);
930
+ ie(u, e, h, o, n, a);
931
931
  const b = u.to || {};
932
932
  return u.resource_id && b.device_id ? p(u) : N("资源 transfer 消息缺少 resource_id / to.device_id,跳过", { payload: e }), C;
933
933
  }
934
934
  case "remove": {
935
935
  if (Array.isArray(e))
936
- return N("资源 remove 源 payload 为数组,无法按对象映射,跳过", { operationField: A.operationField }), [];
936
+ return N("资源 remove 源 payload 为数组,无法按对象映射,跳过", { operationField: l.operationField }), [];
937
937
  const u = { operation: "remove" };
938
- return te(u, e, d, o, n, a), u.resource_id && p(u), C;
938
+ return ie(u, e, d, o, n, a), u.resource_id && p(u), C;
939
939
  }
940
940
  case "batch_remove": {
941
- const u = t.resourceMappings?.batch_remove?.length ? t.resourceMappings.batch_remove : ct;
941
+ const u = t.resourceMappings?.batch_remove?.length ? t.resourceMappings.batch_remove : At;
942
942
  if (Array.isArray(e))
943
- return e.length === 0 ? (N("batch_remove 源 payload 数组为空,跳过", { operationField: A.operationField }), []) : (p({ operation: "batch_remove", resource_ids: e.map((g) => String(g)) }), C);
943
+ return e.length === 0 ? (N("batch_remove 源 payload 数组为空,跳过", { operationField: l.operationField }), []) : (p({ operation: "batch_remove", resource_ids: e.map((g) => String(g)) }), C);
944
944
  const b = { operation: "batch_remove" };
945
- return te(b, e, u, o, n, a), Array.isArray(b.resource_ids) && b.resource_ids.length > 0 ? p(b) : N("batch_remove 消息缺少 resource_ids 数组,跳过", { payload: e }), C;
945
+ return ie(b, e, u, o, n, a), Array.isArray(b.resource_ids) && b.resource_ids.length > 0 ? p(b) : N("batch_remove 消息缺少 resource_ids 数组,跳过", { payload: e }), C;
946
946
  }
947
947
  default:
948
948
  return N(
949
949
  `源 operation=${f || "(空)"} 无对应映射组,跳过`,
950
- { operationField: A.operationField },
950
+ { operationField: l.operationField },
951
951
  "info"
952
952
  ), [];
953
953
  }
954
954
  }
955
955
  if (!Array.isArray(e)) {
956
956
  const f = { operation: "add" };
957
- te(f, e, l, o, n, a);
957
+ ie(f, e, A, o, n, a);
958
958
  const u = f.to || {};
959
959
  f.resource_id && u.device_id ? p(f) : N("资源 add 消息缺少 resource_id / to.device_id,跳过", { payload: e });
960
960
  }
961
961
  if (!Array.isArray(e)) {
962
962
  const f = { operation: "remove" };
963
- te(f, e, d, o, n, a), f.resource_id && p(f);
963
+ ie(f, e, d, o, n, a), f.resource_id && p(f);
964
964
  }
965
965
  return C;
966
966
  }
967
- function Fs(r, e, t, i, s) {
967
+ function Ds(r, e, t, i, s) {
968
968
  const o = String(r.envelope?.type ?? "");
969
969
  if (o !== $.ResourceCommand) return;
970
970
  const n = e.find(
@@ -973,23 +973,23 @@ function Fs(r, e, t, i, s) {
973
973
  if (!n) return;
974
974
  const a = r.payload;
975
975
  if (!a || typeof a != "object") return;
976
- const A = (d) => {
976
+ const l = (d) => {
977
977
  const C = n.resourceMappings;
978
978
  switch (d) {
979
979
  case "add":
980
980
  return C?.add?.length ? C.add : Fe;
981
981
  case "batch_add":
982
- return C?.batch_add?.length ? C.batch_add : Ai;
982
+ return C?.batch_add?.length ? C.batch_add : li;
983
983
  case "transfer":
984
984
  return C?.transfer?.length ? C.transfer : lt;
985
985
  case "remove":
986
- return C?.remove?.length ? C.remove : At;
986
+ return C?.remove?.length ? C.remove : at;
987
987
  case "batch_remove":
988
- return C?.batch_remove?.length ? C.batch_remove : ct;
988
+ return C?.batch_remove?.length ? C.batch_remove : At;
989
989
  default:
990
990
  return [];
991
991
  }
992
- }, l = (d, C) => {
992
+ }, A = (d, C) => {
993
993
  const p = [];
994
994
  for (const f of C)
995
995
  if (f.enabled !== !1)
@@ -1008,51 +1008,51 @@ function Fs(r, e, t, i, s) {
1008
1008
  if (c === "batch_add") {
1009
1009
  if (!Array.isArray(a.resources)) return;
1010
1010
  for (const d of a.resources)
1011
- d && typeof d == "object" && !Array.isArray(d) && l(d, A("batch_add"));
1011
+ d && typeof d == "object" && !Array.isArray(d) && A(d, l("batch_add"));
1012
1012
  return;
1013
1013
  }
1014
- const h = A(c);
1015
- h.length > 0 && l(a, h);
1014
+ const h = l(c);
1015
+ h.length > 0 && A(a, h);
1016
1016
  }
1017
- function Qs(r, e, t, i, s) {
1017
+ function Ts(r, e, t, i, s) {
1018
1018
  const o = String(r.envelope?.type ?? "");
1019
1019
  if (o !== $.DeviceCommand) return;
1020
1020
  const n = r.payload;
1021
1021
  if (!n || typeof n != "object") return;
1022
1022
  const a = String(n.device_type ?? "");
1023
1023
  if (!a) return;
1024
- const A = e.find((l) => {
1025
- if (!l.enabled || l.operate !== "single" || l.sourceType != null && String(l.sourceType) !== o) return !1;
1026
- const c = l.deviceType?.trim() || he[l.className] || l.className;
1024
+ const l = e.find((A) => {
1025
+ if (!A.enabled || A.operate !== "single" || A.sourceType != null && String(A.sourceType) !== o) return !1;
1026
+ const c = A.deviceType?.trim() || he[A.className] || A.className;
1027
1027
  return String(c) === a;
1028
1028
  });
1029
- A && te(n, n, A.mappings, t, i, s);
1029
+ l && ie(n, n, l.mappings, t, i, s);
1030
1030
  }
1031
- function xo(r, e, t, i, s = "data", o = "type", n, a) {
1032
- const A = r;
1033
- if (A && typeof A == "object" && A.envelope && typeof A.envelope == "object" && "payload" in A) {
1034
- const p = r, f = Ds(p, e);
1035
- return f ? { messages: [], runtimeStatus: Dt(p.payload, f, i, n, a) } : (Fs(p, e, i, n, a), Qs(p, e, i, n, a), { messages: [p], runtimeStatus: null });
1036
- }
1037
- const l = Ie(A, o);
1038
- if (l == null || l === "")
1039
- return N("源消息中未提取到 sourceType", { sourceTypeField: o, payload: A }, "info"), { messages: [], runtimeStatus: null };
1040
- const c = e.find((p) => p.enabled && p.sourceType != null && String(p.sourceType) === String(l));
1031
+ function Do(r, e, t, i, s = "data", o = "type", n, a) {
1032
+ const l = r;
1033
+ if (l && typeof l == "object" && l.envelope && typeof l.envelope == "object" && "payload" in l) {
1034
+ const p = te(r), f = Rs(p, e);
1035
+ return f ? { messages: [], runtimeStatus: Qt(p.payload, f, i, n, a) } : (Ds(p, e, i, n, a), Ts(p, e, i, n, a), { messages: [p], runtimeStatus: null });
1036
+ }
1037
+ const A = Ie(l, o);
1038
+ if (A == null || A === "")
1039
+ return N("源消息中未提取到 sourceType", { sourceTypeField: o, payload: l }, "info"), { messages: [], runtimeStatus: null };
1040
+ const c = e.find((p) => p.enabled && p.sourceType != null && String(p.sourceType) === String(A));
1041
1041
  if (!c) {
1042
1042
  const p = e.filter((f) => f.enabled && f.sourceType != null).map((f) => f.sourceType);
1043
- return N(`sourceType=${String(l)} 在 rules 中无对应规则`, { availableSourceTypes: p }, "info"), { messages: [], runtimeStatus: null };
1043
+ return N(`sourceType=${String(A)} 在 rules 中无对应规则`, { availableSourceTypes: p }, "info"), { messages: [], runtimeStatus: null };
1044
1044
  }
1045
- const h = A[s] ?? A.payload ?? {};
1045
+ const h = l[s] ?? l.payload ?? {};
1046
1046
  if (c.operate === "statusPush")
1047
1047
  return {
1048
1048
  messages: [],
1049
- runtimeStatus: Dt(h, c, i, n, a)
1049
+ runtimeStatus: Qt(h, c, i, n, a)
1050
1050
  };
1051
1051
  if (c.operate === "resetAll")
1052
1052
  return {
1053
1053
  messages: [
1054
1054
  {
1055
- envelope: at($.SceneReset, t),
1055
+ envelope: nt($.SceneReset, t),
1056
1056
  payload: {}
1057
1057
  }
1058
1058
  ],
@@ -1060,8 +1060,8 @@ function xo(r, e, t, i, s = "data", o = "type", n, a) {
1060
1060
  };
1061
1061
  if (c.operate === "resource")
1062
1062
  return {
1063
- messages: Is(
1064
- A,
1063
+ messages: Qs(
1064
+ l,
1065
1065
  h,
1066
1066
  c,
1067
1067
  s,
@@ -1074,22 +1074,22 @@ function xo(r, e, t, i, s = "data", o = "type", n, a) {
1074
1074
  };
1075
1075
  if (Array.isArray(h))
1076
1076
  return N(`payload(${s}) 为数组(非标准数据),已通过 @raw 事件透出由父组件处理`, void 0, "info"), { messages: [], runtimeStatus: null };
1077
- const d = h, C = xs(d, c, t, i, n, a);
1077
+ const d = h, C = Fs(d, c, t, i, n, a);
1078
1078
  return C ? { messages: [C], runtimeStatus: null } : (N("buildSocketMessage 返回 null(payload 缺少 device_id 字段)", {
1079
- sourceType: String(l),
1079
+ sourceType: String(A),
1080
1080
  payload: d
1081
1081
  }), { messages: [], runtimeStatus: null });
1082
1082
  }
1083
- function Ds(r, e) {
1083
+ function Rs(r, e) {
1084
1084
  const t = String(r.envelope?.type ?? "");
1085
1085
  if (t)
1086
1086
  return e.find(
1087
1087
  (i) => i.enabled && i.operate === "statusPush" && i.sourceType != null && String(i.sourceType) === t
1088
1088
  );
1089
1089
  }
1090
- function Dt(r, e, t, i, s) {
1090
+ function Qt(r, e, t, i, s) {
1091
1091
  const o = r && typeof r == "object" ? r : {}, n = {};
1092
- return te(n, o, e.mappings, t, i, s), n;
1092
+ return ie(n, o, e.mappings, t, i, s), n;
1093
1093
  }
1094
1094
  const Fe = [
1095
1095
  { target: "resource_id", source: "resource_id" },
@@ -1101,7 +1101,7 @@ const Fe = [
1101
1101
  { target: "to.device_id", source: "to.device_id" },
1102
1102
  { target: "to.device_layer", source: "to.device_layer" },
1103
1103
  { target: "to.device_station", source: "to.device_station" }
1104
- ], At = [
1104
+ ], at = [
1105
1105
  { target: "resource_id", source: "resource_id" },
1106
1106
  { target: "resource_type", source: "resource_type" }
1107
1107
  ], lt = [
@@ -1118,40 +1118,40 @@ const Fe = [
1118
1118
  { target: "to.device_id", source: "to.device_id" },
1119
1119
  { target: "to.device_layer", source: "to.device_layer" },
1120
1120
  { target: "to.device_station", source: "to.device_station" }
1121
- ], Ai = Fe.map((r) => ({ ...r })), ct = [
1121
+ ], li = Fe.map((r) => ({ ...r })), At = [
1122
1122
  { target: "resource_ids", source: "resource_ids" },
1123
1123
  { target: "resource_type", source: "resource_type" }
1124
1124
  ];
1125
- function Ts() {
1125
+ function ks() {
1126
1126
  const r = {};
1127
- for (const e of rt)
1127
+ for (const e of ot)
1128
1128
  for (const t of e.children)
1129
1129
  !t.className || !t.equipmentName || r[t.className] || (r[t.className] = t.equipmentName);
1130
1130
  return r;
1131
1131
  }
1132
- const li = Ts(), se = [
1132
+ const Ai = ks(), oe = [
1133
1133
  { target: "light.color", source: "light.color" },
1134
1134
  { target: "light.rotating", source: "light.rotating", transformTargetType: "boolean" },
1135
1135
  { target: "light.blinking", source: "light.blinking", transformTargetType: "boolean" }
1136
- ], Xe = [
1136
+ ], Ye = [
1137
1137
  { target: "light.color", source: "light.color" },
1138
1138
  { target: "light.blinking", source: "light.blinking", transformTargetType: "boolean" }
1139
- ], Re = [
1139
+ ], ke = [
1140
1140
  { target: "progress.percent", source: "progress.percent", defaultValue: 0 },
1141
1141
  { target: "progress.text", source: "progress.text" }
1142
1142
  ], Le = [
1143
1143
  { target: "passage.in", source: "passage.in", defaultValue: !1, transformTargetType: "boolean" },
1144
1144
  { target: "passage.out", source: "passage.out", defaultValue: !1, transformTargetType: "boolean" }
1145
- ], Tt = [
1145
+ ], Dt = [
1146
1146
  { target: "is_working", source: "is_working", defaultValue: !1, transformTargetType: "boolean" }
1147
- ], ks = [{ target: "station_rotation", source: "station_rotation" }], X = [{ target: "device_state", source: "device_state" }], ye = { target: "position.x", source: "position.x" }, Je = { target: "position.y", source: "position.y" };
1147
+ ], Ls = [{ target: "station_rotation", source: "station_rotation" }], X = [{ target: "device_state", source: "device_state" }], ye = { target: "position.x", source: "position.x" }, Xe = { target: "position.y", source: "position.y" };
1148
1148
  function ci(r, e) {
1149
1149
  return {
1150
1150
  // 信封类型 = device_command(标准信封源 envelope.type);设备类型 = socket 协议 device_type(snake_case),与规则 className(内部模型)解耦
1151
1151
  sourceType: $.DeviceCommand,
1152
1152
  deviceType: he[r] || r,
1153
1153
  className: r,
1154
- equipmentName: li[r],
1154
+ equipmentName: Ai[r],
1155
1155
  enabled: !0,
1156
1156
  operate: "single",
1157
1157
  // device_id 为协议必存字段(见文档 6.0),始终保留并置于首位
@@ -1161,16 +1161,16 @@ function ci(r, e) {
1161
1161
  const hi = {
1162
1162
  // 机床:light / progress / passage / station_rotation / is_working / device_state
1163
1163
  MachineTool: [
1164
- ...se,
1165
- ...Re,
1164
+ ...oe,
1165
+ ...ke,
1166
1166
  ...Le,
1167
- ...ks,
1168
- ...Tt,
1167
+ ...Ls,
1168
+ ...Dt,
1169
1169
  ...X
1170
1170
  ],
1171
1171
  // 接驳站:light / layer_visible / layer_light_colors / layer_light_blinking(源字段与协议一致)/ device_state
1172
1172
  ShuttleStation: [
1173
- ...Xe,
1173
+ ...Ye,
1174
1174
  { target: "layer_visible", source: "layer_visible", defaultValue: {} },
1175
1175
  { target: "layer_light_colors", source: "layer_light_colors", defaultValue: {} },
1176
1176
  { target: "layer_light_blinking", source: "layer_light_blinking", defaultValue: {} },
@@ -1178,54 +1178,54 @@ const hi = {
1178
1178
  ],
1179
1179
  // 单关节机器人:light / position / current_fixture / device_state
1180
1180
  SingleJointRobot: [
1181
- ...se,
1181
+ ...oe,
1182
1182
  ye,
1183
- Je,
1183
+ Xe,
1184
1184
  { target: "position.j1", source: "position.j1" },
1185
1185
  { target: "current_fixture", source: "current_fixture" },
1186
1186
  ...X
1187
1187
  ],
1188
1188
  // 双关节机器人:light / position / current_fixture / device_state
1189
1189
  DoubleJointRobot: [
1190
- ...se,
1190
+ ...oe,
1191
1191
  ye,
1192
- Je,
1192
+ Xe,
1193
1193
  { target: "position.j1", source: "position.j1" },
1194
1194
  { target: "position.j2", source: "position.j2" },
1195
1195
  { target: "current_fixture", source: "current_fixture" },
1196
1196
  ...X
1197
1197
  ],
1198
1198
  // 资源库:light / position(工位槽资源操作走 Resource 规则)/ device_state
1199
- ResourceStore: [...se, ye, ...X],
1199
+ ResourceStore: [...oe, ye, ...X],
1200
1200
  // 托盘:light / position(工位槽资源操作走 Resource 规则)/ device_state
1201
- Pallet: [...se, ye, Je, ...X],
1201
+ Pallet: [...oe, ye, Xe, ...X],
1202
1202
  // 料道:light / layer_visible / device_state
1203
1203
  MaterialTrack: [
1204
- ...Xe,
1204
+ ...Ye,
1205
1205
  { target: "layer_visible", source: "layer_visible", defaultValue: {} },
1206
1206
  ...X
1207
1207
  ],
1208
1208
  // 装载站:light / progress / passage / device_state
1209
- LoadingStation: [...se, ...Re, ...Le, ...X],
1209
+ LoadingStation: [...oe, ...ke, ...Le, ...X],
1210
1210
  // 打标机:light / progress / passage / marking_sites / device_state
1211
1211
  MarkingMachine: [
1212
- ...se,
1213
- ...Re,
1212
+ ...oe,
1213
+ ...ke,
1214
1214
  ...Le,
1215
1215
  { target: "marking_sites", source: "marking_sites" },
1216
1216
  ...X
1217
1217
  ],
1218
1218
  // 清洗机:light / progress / passage / is_working / device_state
1219
1219
  CleaningMachine: [
1220
- ...se,
1221
- ...Re,
1220
+ ...oe,
1221
+ ...ke,
1222
1222
  ...Le,
1223
- ...Tt,
1223
+ ...Dt,
1224
1224
  ...X
1225
1225
  ],
1226
1226
  // RGV:light / position(含 x / j1 / fork_xy / fork_z)/ device_state
1227
1227
  Rgv: [
1228
- ...se,
1228
+ ...oe,
1229
1229
  ye,
1230
1230
  { target: "position.j1", source: "position.j1" },
1231
1231
  { target: "position.fork_xy", source: "position.fork_xy" },
@@ -1234,13 +1234,13 @@ const hi = {
1234
1234
  ],
1235
1235
  // 轨道(Rail)已移除 socket 驱动:拖链定位由画布内部联动(设备移动逐帧跟随)承担
1236
1236
  // 资源操作窗口:light(工位槽资源操作走 Resource 规则)/ device_state
1237
- ResourceOperationWindow: [...Xe, ...X]
1237
+ ResourceOperationWindow: [...Ye, ...X]
1238
1238
  };
1239
- function Rs() {
1239
+ function _s() {
1240
1240
  return {
1241
1241
  className: "Resource",
1242
1242
  // Resource 为虚拟资源操作规则(非画布预设组件),EQUIPMENTS_MENU 中无对应条目,显示名取固定值
1243
- equipmentName: li.Resource ?? "资源",
1243
+ equipmentName: Ai.Resource ?? "资源",
1244
1244
  enabled: !0,
1245
1245
  operate: "resource",
1246
1246
  mappings: [],
@@ -1249,10 +1249,10 @@ function Rs() {
1249
1249
  // 资源操作字段映射:target 为协议 payload 路径,源字段名取自业务 Resource 消息的标准 payload 字段
1250
1250
  resourceMappings: {
1251
1251
  add: Fe.map((r) => ({ ...r })),
1252
- batch_add: Ai.map((r) => ({ ...r })),
1252
+ batch_add: li.map((r) => ({ ...r })),
1253
1253
  transfer: lt.map((r) => ({ ...r })),
1254
- remove: At.map((r) => ({ ...r })),
1255
- batch_remove: ct.map((r) => ({ ...r }))
1254
+ remove: at.map((r) => ({ ...r })),
1255
+ batch_remove: At.map((r) => ({ ...r }))
1256
1256
  },
1257
1257
  // Resource 专属源字段配置默认值:operationField 按源 operation 分发(标准信封消息固定读 payload.operation,不受此项影响);
1258
1258
  // batch_add 资源项数组源路径默认指向 payload(data)下的 resources 字段
@@ -1262,7 +1262,7 @@ function Rs() {
1262
1262
  }
1263
1263
  };
1264
1264
  }
1265
- function Ls() {
1265
+ function Us() {
1266
1266
  return {
1267
1267
  className: "ResetAll",
1268
1268
  sourceType: "scene_reset",
@@ -1282,18 +1282,18 @@ function gi() {
1282
1282
  mappings: []
1283
1283
  };
1284
1284
  }
1285
- function Io(r) {
1285
+ function To(r) {
1286
1286
  const e = hi[r];
1287
1287
  return e ? ci(r, e) : null;
1288
1288
  }
1289
- function Fo(r, e) {
1289
+ function Ro(r, e) {
1290
1290
  const t = Array.from(new Set(e)), i = [];
1291
1291
  for (const s of t) {
1292
1292
  const o = hi[s];
1293
1293
  o && i.push(ci(s, o));
1294
1294
  }
1295
- return i.push(Rs(), gi(), Ls()), {
1296
- fileUrl: nt,
1295
+ return i.push(_s(), gi(), Us()), {
1296
+ fileUrl: rt,
1297
1297
  version: "1",
1298
1298
  dataSource: "builtin",
1299
1299
  wsUrl: "",
@@ -1309,7 +1309,7 @@ function Fo(r, e) {
1309
1309
  rules: i
1310
1310
  };
1311
1311
  }
1312
- const _s = {
1312
+ const Os = {
1313
1313
  // 设备操作:内部 operating → device_command payload
1314
1314
  id: "device_id",
1315
1315
  // 资源操作:内部 operating(className 为目标设备路由字段)→ resource_command payload
@@ -1322,7 +1322,7 @@ const _s = {
1322
1322
  "resource.device_layer": "to.device_layer"
1323
1323
  };
1324
1324
  function Ee(r) {
1325
- const e = _s[r.target];
1325
+ const e = Os[r.target];
1326
1326
  return e ? { ...r, target: e } : r;
1327
1327
  }
1328
1328
  function ui(r) {
@@ -1344,10 +1344,10 @@ function di(r) {
1344
1344
  batchAddItems: t.resourceFields?.batchAddItems ?? "data.resources"
1345
1345
  }), e.some((i) => i.operate === "statusPush") || e.push(gi()), e;
1346
1346
  }
1347
- function Qo(r) {
1347
+ function ko(r) {
1348
1348
  return { ...r, rules: di(r.rules.map(ui)) };
1349
1349
  }
1350
- function ht(r) {
1350
+ function ct(r) {
1351
1351
  const e = r;
1352
1352
  if (!e || typeof e != "object" || !e.fileUrl && !e.name || !Array.isArray(e.rules)) return null;
1353
1353
  const t = String(e.fileUrl || `public/${String(e.name).replace(/^\/+|\/+$/g, "")}.json`), { name: i, rules: s, ...o } = e, n = di(s.map(ui));
@@ -1357,18 +1357,18 @@ function fi(r) {
1357
1357
  if (!Array.isArray(r)) return null;
1358
1358
  const e = [];
1359
1359
  for (const t of r) {
1360
- const i = ht(t);
1360
+ const i = ct(t);
1361
1361
  if (!i) return null;
1362
1362
  e.push({ ...i, caseId: t.caseId || "" });
1363
1363
  }
1364
1364
  return e;
1365
1365
  }
1366
- function Us(r) {
1366
+ function Ks(r) {
1367
1367
  const e = r, t = {
1368
1368
  // 方案绑定信息(仅当存在时输出)置于最前
1369
1369
  ...e.caseId ? { caseId: e.caseId } : {},
1370
1370
  ...e.caseName ? { caseName: e.caseName } : {},
1371
- fileUrl: r.fileUrl || nt,
1371
+ fileUrl: r.fileUrl || rt,
1372
1372
  version: r.version,
1373
1373
  dataSource: r.dataSource,
1374
1374
  wsUrl: r.wsUrl,
@@ -1384,9 +1384,9 @@ function Us(r) {
1384
1384
  };
1385
1385
  return JSON.stringify(t, null, 2);
1386
1386
  }
1387
- function Do(r) {
1387
+ function Lo(r) {
1388
1388
  return JSON.stringify(
1389
- r.map((e) => JSON.parse(Us(e))),
1389
+ r.map((e) => JSON.parse(Ks(e))),
1390
1390
  null,
1391
1391
  2
1392
1392
  );
@@ -1394,17 +1394,17 @@ function Do(r) {
1394
1394
  function pi(r) {
1395
1395
  const e = fi(r);
1396
1396
  if (e) return e;
1397
- const t = ht(r);
1397
+ const t = ct(r);
1398
1398
  return t ? [{ ...t, caseId: "" }] : [];
1399
1399
  }
1400
- function To() {
1400
+ function _o() {
1401
1401
  const r = /* @__PURE__ */ new Date(), e = (t) => String(t).padStart(2, "0");
1402
1402
  return `wsProxyConfig_${r.getFullYear()}_${e(r.getMonth() + 1)}_${e(r.getDate())}_${e(r.getHours())}_${e(
1403
1403
  r.getMinutes()
1404
1404
  )}_${e(r.getSeconds())}`;
1405
1405
  }
1406
- async function ko(r, e) {
1407
- const t = Ss(r);
1406
+ async function Uo(r, e) {
1407
+ const t = xs(r);
1408
1408
  try {
1409
1409
  const i = await fetch(t);
1410
1410
  if (!i.ok)
@@ -1416,17 +1416,17 @@ async function ko(r, e) {
1416
1416
  const n = fi(s);
1417
1417
  if (!n)
1418
1418
  return { status: "invalid", reason: "数据结构异常" };
1419
- const a = e ? n.find((A) => A.caseId === e) : void 0;
1419
+ const a = e ? n.find((l) => l.caseId === e) : void 0;
1420
1420
  return e && !a ? { status: "invalid", reason: `未匹配到 id:${e}` } : { status: "ok", config: a || n[0], configs: n };
1421
1421
  }
1422
- const o = ht(s);
1422
+ const o = ct(s);
1423
1423
  return o ? { status: "ok", config: o, configs: [o] } : { status: "invalid", reason: "数据结构异常" };
1424
1424
  } catch {
1425
1425
  return { status: "unknown", reason: "请求异常,未能正常读取文件" };
1426
1426
  }
1427
1427
  }
1428
- const kt = P("DataStore"), je = {
1429
- logLevel: Li(),
1428
+ const Tt = P("DataStore"), Je = {
1429
+ logLevel: Ui(),
1430
1430
  shadowsEnabled: !0,
1431
1431
  animationsEnabled: !0,
1432
1432
  fpsMode: "auto",
@@ -1436,16 +1436,16 @@ const kt = P("DataStore"), je = {
1436
1436
  wsProxyManualModified: !1,
1437
1437
  wsProxyActiveCaseId: "",
1438
1438
  perfStatsCollapsed: !1
1439
- }, gt = "@jnrs/lingshu-smart/ws-proxy-config", Rt = "@jnrs/lingshu-smart/debug", Lt = "@jnrs/lingshu-smart/script-steps", _t = "@jnrs/lingshu-smart/data";
1439
+ }, ht = "@jnrs/lingshu-smart/ws-proxy-config", Rt = "@jnrs/lingshu-smart/debug", kt = "@jnrs/lingshu-smart/script-steps", Lt = "@jnrs/lingshu-smart/data";
1440
1440
  function wi() {
1441
1441
  try {
1442
- const r = localStorage.getItem(gt);
1442
+ const r = localStorage.getItem(ht);
1443
1443
  return r ? pi(JSON.parse(r)) : [];
1444
1444
  } catch {
1445
1445
  return [];
1446
1446
  }
1447
1447
  }
1448
- function Os() {
1448
+ function Ms() {
1449
1449
  try {
1450
1450
  if (localStorage.getItem("@jnrs/lingshu-smart")) return;
1451
1451
  const r = {
@@ -1453,7 +1453,7 @@ function Os() {
1453
1453
  wsProxyConfig: [],
1454
1454
  globalSetting: {},
1455
1455
  scriptRunner: []
1456
- }, e = localStorage.getItem(_t);
1456
+ }, e = localStorage.getItem(Lt);
1457
1457
  if (e)
1458
1458
  try {
1459
1459
  const s = JSON.parse(e);
@@ -1467,56 +1467,56 @@ function Os() {
1467
1467
  r.globalSetting = JSON.parse(t);
1468
1468
  } catch {
1469
1469
  }
1470
- const i = localStorage.getItem(Lt);
1470
+ const i = localStorage.getItem(kt);
1471
1471
  if (i)
1472
1472
  try {
1473
1473
  const s = JSON.parse(i);
1474
1474
  Array.isArray(s) && (r.scriptRunner = s);
1475
1475
  } catch {
1476
1476
  }
1477
- localStorage.setItem("@jnrs/lingshu-smart", JSON.stringify(r)), localStorage.removeItem(_t), localStorage.removeItem(Rt), localStorage.removeItem(Lt), localStorage.removeItem(gt);
1477
+ localStorage.setItem("@jnrs/lingshu-smart", JSON.stringify(r)), localStorage.removeItem(Lt), localStorage.removeItem(Rt), localStorage.removeItem(kt), localStorage.removeItem(ht);
1478
1478
  } catch {
1479
1479
  }
1480
1480
  }
1481
- Os();
1482
- const Ue = (r) => {
1481
+ Ms();
1482
+ const _e = (r) => {
1483
1483
  if (Array.isArray(r)) {
1484
- r.forEach((e) => Ue(e));
1484
+ r.forEach((e) => _e(e));
1485
1485
  return;
1486
1486
  }
1487
1487
  if (r && typeof r == "object") {
1488
1488
  const e = r;
1489
1489
  typeof e.uuid == "string" && (e.id === void 0 && (e.id = e.uuid), delete e.uuid), Object.values(e).forEach((t) => {
1490
- t && typeof t == "object" && Ue(t);
1490
+ t && typeof t == "object" && _e(t);
1491
1491
  });
1492
1492
  }
1493
- }, ut = Ne(
1493
+ }, gt = Me(
1494
1494
  "@jnrs/lingshu-smart/data",
1495
1495
  () => {
1496
- const r = oe(rt), e = ce([]), t = ce(!1), i = ce([]), s = (g) => {
1497
- i.value = oe(g);
1496
+ const r = te(ot), e = ce([]), t = ce(!1), i = ce([]), s = (g) => {
1497
+ i.value = te(g);
1498
1498
  }, o = ce([]), n = (g) => o.value.find((m) => m.caseId === g), a = (g, m) => {
1499
1499
  const y = o.value.find((B) => B.caseId === g);
1500
1500
  if (y)
1501
1501
  return m && y.caseName !== m && (y.caseName = m), y;
1502
1502
  const E = { caseId: g, caseName: m, steps: [], looping: !1 };
1503
1503
  return o.value.push(E), E;
1504
- }, A = (g, m) => {
1505
- a(g).steps = m;
1506
1504
  }, l = (g, m) => {
1505
+ a(g).steps = m;
1506
+ }, A = (g, m) => {
1507
1507
  a(g).looping = m;
1508
1508
  }, c = (g) => {
1509
- o.value = oe(g);
1510
- }, h = ce(oe(je)), d = (g) => {
1509
+ o.value = te(g);
1510
+ }, h = ce(te(Je)), d = (g) => {
1511
1511
  if (!g) {
1512
1512
  e.value = [];
1513
1513
  return;
1514
1514
  }
1515
- if (Ue(g), As(g))
1515
+ if (_e(g), cs(g))
1516
1516
  e.value = g;
1517
1517
  else {
1518
1518
  const m = "运行 updateCases 函数时参数校验失败:发现非法的 ICase, ILayer 或 IScene 结构";
1519
- throw kt.error(m, g), new Error(m);
1519
+ throw Tt.error(m, g), new Error(m);
1520
1520
  }
1521
1521
  }, C = (g) => {
1522
1522
  e.value.find((y) => y.id === g) && e.value.forEach((y) => {
@@ -1535,17 +1535,17 @@ const Ue = (r) => {
1535
1535
  updateCases: d,
1536
1536
  selectCase: C,
1537
1537
  addCase: (g) => {
1538
- const m = ot();
1538
+ const m = st();
1539
1539
  let y;
1540
1540
  if (g)
1541
1541
  if (ri(g))
1542
- y = oe(g), y.id = m, y.isActive = !1;
1542
+ y = te(g), y.id = m, y.isActive = !1;
1543
1543
  else {
1544
1544
  const E = "运行 addCase 函数时参数校验失败:发现非法的 ICase, ILayer 或 IScene 结构";
1545
- throw kt.error(E, g), new Error(E);
1545
+ throw Tt.error(E, g), new Error(E);
1546
1546
  }
1547
1547
  else
1548
- y = oe(ms), y.id = m, y.title = `方案${m.slice(0, 8)}`;
1548
+ y = te(Es), y.id = m, y.title = `方案${m.slice(0, 8)}`;
1549
1549
  return e.value.push(y), C(m), y;
1550
1550
  },
1551
1551
  removeCase: (g) => {
@@ -1556,13 +1556,13 @@ const Ue = (r) => {
1556
1556
  e.value = [];
1557
1557
  },
1558
1558
  resetAll: () => {
1559
- e.value = [], i.value = [], h.value = oe(je), o.value = [];
1559
+ e.value = [], i.value = [], h.value = te(Je), o.value = [];
1560
1560
  },
1561
1561
  setWsProxyConfig: s,
1562
1562
  getScriptCase: n,
1563
1563
  ensureScriptCase: a,
1564
- setScriptSteps: A,
1565
- setScriptLooping: l,
1564
+ setScriptSteps: l,
1565
+ setScriptLooping: A,
1566
1566
  setScriptsConfig: c
1567
1567
  };
1568
1568
  },
@@ -1578,7 +1578,7 @@ const Ue = (r) => {
1578
1578
  serialize: (r) => {
1579
1579
  const e = r;
1580
1580
  return JSON.stringify({
1581
- cases: _i(e.cases ?? []),
1581
+ cases: Oi(e.cases ?? []),
1582
1582
  wsProxyConfig: e.wsProxyConfig ?? [],
1583
1583
  globalSetting: e.globalSetting ?? {},
1584
1584
  scriptsConfig: e.scriptsConfig ?? []
@@ -1586,7 +1586,7 @@ const Ue = (r) => {
1586
1586
  },
1587
1587
  deserialize: (r) => {
1588
1588
  const e = JSON.parse(r);
1589
- if (Array.isArray(e?.cases) && (e.cases = Ri(e.cases), e.cases.forEach((t) => Ue(t))), Array.isArray(e?.wsProxyConfig) ? e.wsProxyConfig = pi(e.wsProxyConfig) : (e.wsProxyConfig = wi(), e.wsProxyConfig.length > 0 && localStorage.removeItem(gt)), (!e.globalSetting || typeof e.globalSetting != "object") && (e.globalSetting = {}), e.globalSetting = { ...je, ...e.globalSetting }, e.scriptsConfig = Array.isArray(e.scriptsConfig) ? e.scriptsConfig.filter((t) => t && typeof t == "object" && typeof t.caseId == "string").map((t) => ({
1589
+ if (Array.isArray(e?.cases) && (e.cases = _i(e.cases), e.cases.forEach((t) => _e(t))), Array.isArray(e?.wsProxyConfig) ? e.wsProxyConfig = pi(e.wsProxyConfig) : (e.wsProxyConfig = wi(), e.wsProxyConfig.length > 0 && localStorage.removeItem(ht)), (!e.globalSetting || typeof e.globalSetting != "object") && (e.globalSetting = {}), e.globalSetting = { ...Je, ...e.globalSetting }, e.scriptsConfig = Array.isArray(e.scriptsConfig) ? e.scriptsConfig.filter((t) => t && typeof t == "object" && typeof t.caseId == "string").map((t) => ({
1590
1590
  caseId: t.caseId,
1591
1591
  caseName: typeof t.caseName == "string" ? t.caseName : void 0,
1592
1592
  steps: Array.isArray(t.steps) ? t.steps : [],
@@ -1606,7 +1606,7 @@ const Ue = (r) => {
1606
1606
  }
1607
1607
  }
1608
1608
  );
1609
- function Ks(r) {
1609
+ function Ns(r) {
1610
1610
  return r ? {
1611
1611
  green: "绿色",
1612
1612
  red: "红色",
@@ -1615,35 +1615,35 @@ function Ks(r) {
1615
1615
  "#DFC285": "黄色"
1616
1616
  }[r] ?? r : "未设置";
1617
1617
  }
1618
- function Ms(r) {
1618
+ function Gs(r) {
1619
1619
  const e = [];
1620
- return r.color !== void 0 && e.push(`运行灯:${Ks(r.color)}`), r.rotating && e.push("旋转"), r.blinking && e.push("闪烁"), e.length > 0 ? e.join("/") : "灯:保持";
1620
+ return r.color !== void 0 && e.push(`运行灯:${Ns(r.color)}`), r.rotating && e.push("旋转"), r.blinking && e.push("闪烁"), e.length > 0 ? e.join("/") : "灯:保持";
1621
1621
  }
1622
- function Ns(r) {
1622
+ function Ps(r) {
1623
1623
  const e = [];
1624
1624
  return typeof r.percent == "number" && e.push(`进度条:${Math.round(r.percent * 100)}%`), r.text && e.push(r.text), e.length > 0 ? e.join(", ") : "进度条:保持";
1625
1625
  }
1626
- function Gs(r) {
1626
+ function Vs(r) {
1627
1627
  const e = [];
1628
1628
  return r.in && e.push("上料"), r.out && e.push("下料"), `上下料:${e.length > 0 ? e.join("/") : "无"}`;
1629
1629
  }
1630
- function Ps(r) {
1630
+ function qs(r) {
1631
1631
  const e = r.name || r.resource_type;
1632
1632
  return `resource:工位${r.device_station}(${r.handle_type})[${r.resource_type}-${e}] raw_data_id: ${(r.raw_data.removeId || r.raw_data.addId) ?? "null"}`;
1633
1633
  }
1634
- function Vs(r) {
1634
+ function Ws(r) {
1635
1635
  return `夹具:${{
1636
- [x.WORKPIECE]: "工件",
1637
- [x.TOOL]: "刀具",
1638
- [x.AUXILIARY]: "辅料",
1636
+ [v.WORKPIECE]: "工件",
1637
+ [v.TOOL]: "刀具",
1638
+ [v.AUXILIARY]: "辅料",
1639
1639
  none: "空"
1640
1640
  }[r] ?? r}`;
1641
1641
  }
1642
- function qs(r) {
1642
+ function Hs(r) {
1643
1643
  const e = r, t = [];
1644
- e.light && t.push(Ms(e.light)), e.progress && t.push(Ns(e.progress)), e.passage && t.push(Gs(e.passage)), e.resource && t.push(Ps(e.resource));
1644
+ e.light && t.push(Gs(e.light)), e.progress && t.push(Ps(e.progress)), e.passage && t.push(Vs(e.passage)), e.resource && t.push(qs(e.resource));
1645
1645
  const i = e.position;
1646
- if (i && (typeof i.x == "number" && t.push(`X:${i.x.toFixed(2)}px`), typeof i.y == "number" && t.push(`Y:${i.y.toFixed(2)}px`), typeof i.j1 == "number" && t.push(`关节1:${i.j1.toFixed(1)}°`), typeof i.j2 == "number" && t.push(`关节2:${i.j2.toFixed(1)}°`), typeof i.fork_xy == "number" && t.push(`货叉X:${i.fork_xy}`), typeof i.fork_z == "number" && t.push(`货叉Z:${i.fork_z}`)), e.current_fixture && t.push(Vs(e.current_fixture)), e.marking_sites && typeof e.marking_sites == "object") {
1646
+ if (i && (typeof i.x == "number" && t.push(`X:${i.x.toFixed(2)}px`), typeof i.y == "number" && t.push(`Y:${i.y.toFixed(2)}px`), typeof i.j1 == "number" && t.push(`关节1:${i.j1.toFixed(1)}°`), typeof i.j2 == "number" && t.push(`关节2:${i.j2.toFixed(1)}°`), typeof i.fork_xy == "number" && t.push(`货叉X:${i.fork_xy}`), typeof i.fork_z == "number" && t.push(`货叉Z:${i.fork_z}`)), e.current_fixture && t.push(Ws(e.current_fixture)), e.marking_sites && typeof e.marking_sites == "object") {
1647
1647
  const s = Object.keys(e.marking_sites).filter((o) => e.marking_sites[o] === !0);
1648
1648
  s.length > 0 && t.push(`打标工位:${s.join(",")}`);
1649
1649
  }
@@ -1672,7 +1672,7 @@ function q(r = {}) {
1672
1672
  stroke: i,
1673
1673
  strokeWidth: t,
1674
1674
  around: "center"
1675
- }), o = Math.min(e.width, e.height), n = e.width / 2, a = e.height / 2, A = new Ki({
1675
+ }), o = Math.min(e.width, e.height), n = e.width / 2, a = e.height / 2, l = new Ni({
1676
1676
  x: n,
1677
1677
  y: a,
1678
1678
  width: o,
@@ -1684,18 +1684,18 @@ function q(r = {}) {
1684
1684
  fill: i,
1685
1685
  around: "center"
1686
1686
  });
1687
- return s.add(A), s;
1687
+ return s.add(l), s;
1688
1688
  }
1689
- const dt = 14, Ws = 18, it = 4;
1690
- function Ci(r, e = dt) {
1689
+ const ut = 14, Ys = 18, tt = 4;
1690
+ function Ci(r, e = ut) {
1691
1691
  const t = /[\u2E80-\u9FFF\uF900-\uFAFF\uFF00-\uFFEF\u3000-\u303F]/g, i = (r.match(t) || []).length, s = r.length - i;
1692
1692
  return Math.max(20, Math.ceil((i + s * 0.5 + 2) * e));
1693
1693
  }
1694
- function Hs(r, e) {
1694
+ function Xs(r, e) {
1695
1695
  const [t, i, s] = r.children;
1696
1696
  if (!t) return;
1697
- const o = Number(t.fontSize) || dt, n = Ci(e, o);
1698
- t.set({ text: e, width: n }), r.set({ width: n }), i?.set({ x: it }), s?.set({ x: n - it });
1697
+ const o = Number(t.fontSize) || ut, n = Ci(e, o);
1698
+ t.set({ text: e, width: n }), r.set({ width: n }), i?.set({ x: tt }), s?.set({ x: n - tt });
1699
1699
  }
1700
1700
  function z(r) {
1701
1701
  const e = {
@@ -1703,15 +1703,14 @@ function z(r) {
1703
1703
  y: 0,
1704
1704
  width: void 0,
1705
1705
  // 显式区分是否传入
1706
- height: Ws,
1706
+ height: Ys,
1707
1707
  cornerRadius: 2,
1708
1708
  fill: "#f2f2f2",
1709
1709
  textColor: "#d15f2c",
1710
- fontSize: dt,
1710
+ fontSize: ut,
1711
1711
  stroke: "rgba(0,0,0,0.2)",
1712
1712
  strokeWidth: 1,
1713
1713
  screwHole: !0,
1714
- zIndex: -1,
1715
1714
  ...r
1716
1715
  }, t = e.width ?? Ci(e.title, e.fontSize), i = {
1717
1716
  text: e.title,
@@ -1728,7 +1727,7 @@ function z(r) {
1728
1727
  overflow: "hide"
1729
1728
  };
1730
1729
  e.width !== void 0 ? i.fontSize = Math.min(e.fontSize, 12) : i.fontSize = e.fontSize;
1731
- const s = new Mi(i), o = new I({
1730
+ const s = new Gi(i), o = new I({
1732
1731
  hittable: !1,
1733
1732
  className: "name-plate",
1734
1733
  x: e.x,
@@ -1745,23 +1744,49 @@ function z(r) {
1745
1744
  children: [s]
1746
1745
  });
1747
1746
  if (e.screwHole) {
1748
- const n = e.height / 2, a = it, A = q({
1747
+ const n = e.height / 2, a = tt, l = q({
1749
1748
  x: a,
1750
1749
  y: n,
1751
1750
  width: a,
1752
1751
  height: a
1753
- }), l = q({
1752
+ }), A = q({
1754
1753
  x: t - a,
1755
1754
  y: n,
1756
1755
  width: a,
1757
1756
  height: a
1758
1757
  });
1759
- o.add([A, l]);
1758
+ o.add([l, A]);
1760
1759
  }
1761
1760
  return o;
1762
1761
  }
1763
- const Ut = 300;
1764
- class Y extends Ui {
1762
+ function mi(r) {
1763
+ const e = (Number(r.rotation) || 0) * Math.PI / 180;
1764
+ return {
1765
+ cx: Number(r.x) || 0,
1766
+ cy: Number(r.y) || 0,
1767
+ cos: Math.cos(e),
1768
+ sin: Math.sin(e),
1769
+ scale: Number(r.scale) || 1,
1770
+ length: Number(r.width) || 0,
1771
+ thickness: Number(r.height) || 0
1772
+ };
1773
+ }
1774
+ function Js(r, e) {
1775
+ return e <= 1 ? e * r.length : e / r.scale;
1776
+ }
1777
+ function yi(r, e, t) {
1778
+ const i = e - r.cx, s = t - r.cy, o = (i * r.cos + s * r.sin) / r.scale, n = (-i * r.sin + s * r.cos) / r.scale;
1779
+ return { along: o + r.length / 2, lateral: n + r.thickness / 2 };
1780
+ }
1781
+ function js(r, e, t) {
1782
+ const i = (e - r.length / 2) * r.scale, s = (t - r.thickness / 2) * r.scale;
1783
+ return {
1784
+ x: r.cx + i * r.cos - s * r.sin,
1785
+ y: r.cy + i * r.sin + s * r.cos
1786
+ };
1787
+ }
1788
+ const _t = 300;
1789
+ class Y extends Ki {
1765
1790
  eventHandler = null;
1766
1791
  /**
1767
1792
  * 画布控制器引用(AppController.addModel 时注入,早于 init)
@@ -1775,9 +1800,40 @@ class Y extends Ui {
1775
1800
  get moveDuration() {
1776
1801
  return 0.25;
1777
1802
  }
1803
+ /**
1804
+ * 沿 x 位移(搬运设备通用)
1805
+ * - 未绑定轨道(linkRailId):按场景绝对坐标位移(原行为,x 为像素)
1806
+ * - 已绑定轨道:按「沿轨距离」定位——rawX ≤ 1 为沿轨道长度的比例(0 = 轨道起点端、1 = 终点端),
1807
+ * rawX > 1 为自轨道起点端算起的沿轨像素距离(代理已配置「像素转换」的情形);
1808
+ * 横向沿用编辑期设计的「相对轨道偏移」(不消费协议 y),朝向 = 编辑期 rotation + 轨道 rotation
1809
+ * @param x 场景绝对 x(像素,由协议比例按场景宽度换算;> 1 的代理像素值原样透传)
1810
+ * @param rawX 协议 position.x 原始值(画布内部字段,绑定轨道时使用)
1811
+ */
1812
+ moveX(e, t) {
1813
+ if (!Number.isFinite(e)) return;
1814
+ const i = this.boundRailConfig;
1815
+ if (i && t !== void 0) {
1816
+ this.moveXAlongRail(i, t);
1817
+ return;
1818
+ }
1819
+ this.ui.x !== e && (this.ui.x = e);
1820
+ }
1821
+ /** 绑定轨道(linkRailId,或轨道侧 linkEquipIdArray 反查)的轨道配置;未绑定或轨道未加载时返回 null */
1822
+ get boundRailConfig() {
1823
+ return this.appController ? this.appController.getBoundRailConfig(this.config.id) : null;
1824
+ }
1825
+ /** 沿轨定位:协议值 → 沿轨局部距离 → 场景坐标;越出轨道长度收敛到 [0, 轨道长度] */
1826
+ moveXAlongRail(e, t) {
1827
+ const i = mi(e), s = Js(i, t), o = Math.min(Math.max(s, 0), i.length);
1828
+ o !== s && this.logger.warn("沿轨位移超出轨道长度已收敛: %s → %s", s, o);
1829
+ const n = yi(i, Number(this.config.x) || 0, Number(this.config.y) || 0), a = js(i, o, n.lateral);
1830
+ this.ui.x !== a.x && (this.ui.x = a.x), this.ui.y !== a.y && (this.ui.y = a.y);
1831
+ const l = (Number(this.config.rotation) || 0) + (Number(e.rotation) || 0);
1832
+ this.ui.rotation !== l && (this.ui.rotation = l);
1833
+ }
1778
1834
  // 处理设备操作
1779
1835
  handleOperation = (e) => {
1780
- this.logger.operating(qs(e)), this.writeOperatingData(e);
1836
+ this.logger.operating(Hs(e)), this.writeOperatingData(e);
1781
1837
  const t = e.nameplate;
1782
1838
  t !== void 0 && this.setNameplate(t), this.operating(e);
1783
1839
  };
@@ -1789,7 +1845,7 @@ class Y extends Ui {
1789
1845
  */
1790
1846
  setNameplate(e) {
1791
1847
  if (!this.ui) return;
1792
- this.ui.find(".name-plate").forEach((i) => Hs(i, e));
1848
+ this.ui.find(".name-plate").forEach((i) => Xs(i, e));
1793
1849
  }
1794
1850
  /**
1795
1851
  * 将最近一次 operating 接收到的原始数据写入模型 config 及整棵 UI 树的 data 属性,
@@ -1810,7 +1866,7 @@ class Y extends Ui {
1810
1866
  // 点击事件回调
1811
1867
  tapCallback = Se((e) => {
1812
1868
  this.shouldHandleInteraction(e, this.config.clickable) && this.emitTap(e.target.data);
1813
- }, Ut);
1869
+ }, _t);
1814
1870
  /**
1815
1871
  * 点击回调分发(子类可覆盖以改写 layer / data,如扩展工位绑定模式下托盘点击需替换为宿主设备)
1816
1872
  * 默认:layer 为模型自身 config,data 为实际命中元素的 data 属性
@@ -1821,14 +1877,14 @@ class Y extends Ui {
1821
1877
  // 右键点击事件回调
1822
1878
  menuTapCallback = Se((e) => {
1823
1879
  this.shouldHandleInteraction(e, this.config.menuClickable) && this.eventHandler?.onMenuTap?.(this.config, e.target.data);
1824
- }, Ut);
1880
+ }, _t);
1825
1881
  // 拖拽事件回调
1826
1882
  dragCallback = (e) => {
1827
1883
  this.shouldHandleInteraction(e, this.config.draggable) && this.eventHandler?.onDragEnd?.(this.config, e.target.data);
1828
1884
  };
1829
1885
  // 注册事件(事件委托模式)
1830
1886
  setEventHandler(e) {
1831
- this.config.hittable && (this.eventHandler = e, Object.hasOwn(e, "onTap") && this.ui.on(ke.TAP, this.tapCallback), Object.hasOwn(e, "onMenuTap") && this.ui.on(ke.MENU_TAP, this.menuTapCallback), Object.hasOwn(e, "onDragEnd") && this.ui.on(yt.END, this.dragCallback));
1887
+ this.config.hittable && (this.eventHandler = e, Object.hasOwn(e, "onTap") && this.ui.on(Re.TAP, this.tapCallback), Object.hasOwn(e, "onMenuTap") && this.ui.on(Re.MENU_TAP, this.menuTapCallback), Object.hasOwn(e, "onDragEnd") && this.ui.on(mt.END, this.dragCallback));
1832
1888
  }
1833
1889
  /**
1834
1890
  * 判断模型是否包含指定工位号
@@ -1889,7 +1945,7 @@ class Y extends Ui {
1889
1945
  }
1890
1946
  // 销毁 UI 和事件绑定
1891
1947
  destroyUI() {
1892
- this.initialized && (this.ui.off(ke.TAP, this.tapCallback), this.ui.off(ke.MENU_TAP, this.menuTapCallback), this.ui.off(yt.END, this.dragCallback), super.destroyUI());
1948
+ this.initialized && (this.ui.off(Re.TAP, this.tapCallback), this.ui.off(Re.MENU_TAP, this.menuTapCallback), this.ui.off(mt.END, this.dragCallback), super.destroyUI());
1893
1949
  }
1894
1950
  /**
1895
1951
  * 复位:销毁当前 UI 并按初始配置重建(编辑器设置值优先,未设置的字段取模型类默认值)
@@ -1900,16 +1956,16 @@ class Y extends Ui {
1900
1956
  this.initialized && (this.destroyUI(), this.init());
1901
1957
  }
1902
1958
  }
1903
- const mi = "data:image/png;base64,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", yi = "data:image/png;base64,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", Ei = "data:image/png;base64,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", Bi = "data:image/png;base64,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", Si = "data:image/png;base64,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", bi = "data:image/png;base64,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", Ys = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAACQlJREFUeF7t1EENA0EQBLEc6QWxpBMI+bpPNQhaY6meT0d/4N77pQf+GXfOeZb3v317OLhwAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqf9wOLVAE9fkGIrwAAAABJRU5ErkJggg==", Xs = {
1904
- LightGrid: mi,
1905
- DarkGrid: yi,
1906
- MatrixGrid: Ei,
1907
- LightDot: Bi,
1908
- DarkDot: Si,
1909
- WoodFloor: bi,
1910
- VerticalBar: Ys
1959
+ const Ei = "data:image/png;base64,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", Bi = "data:image/png;base64,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", Si = "data:image/png;base64,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", bi = "data:image/png;base64,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", xi = "data:image/png;base64,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", vi = "data:image/png;base64,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", zs = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAACQlJREFUeF7t1EENA0EQBLEc6QWxpBMI+bpPNQhaY6meT0d/4N77pQf+GXfOeZb3v317OLhwAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqfVwBwwAKAA43PKwA4YAHAgcbnFQAcsADgQOPzCgAOWABwoPF5BQAHLAA40Pi8AoADFgAcaHxeAcABCwAOND6vAOCABQAHGp9XAHDAAoADjc8rADhgAcCBxucVABywAOBA4/MKAA5YAHCg8XkFAAcsADjQ+LwCgAMWABxofF4BwAELAA40Pq8A4IAFAAcan1cAcMACgAONzysAOGABwIHG5xUAHLAA4EDj8woADlgAcKDxeQUABywAOND4vAKAAxYAHGh8XgHAAQsADjQ+rwDggAUABxqf9wOLVAE9fkGIrwAAAABJRU5ErkJggg==", Zs = {
1960
+ LightGrid: Ei,
1961
+ DarkGrid: Bi,
1962
+ MatrixGrid: Si,
1963
+ LightDot: bi,
1964
+ DarkDot: xi,
1965
+ WoodFloor: vi,
1966
+ VerticalBar: zs
1911
1967
  };
1912
- function Ae(r = {}) {
1968
+ function le(r = {}) {
1913
1969
  const {
1914
1970
  className: e = "Texture",
1915
1971
  width: t = 0,
@@ -1918,26 +1974,26 @@ function Ae(r = {}) {
1918
1974
  opacity: o = 1,
1919
1975
  scale: n = 0.02,
1920
1976
  rotation: a = 0,
1921
- cornerRadius: A = 0,
1922
- fill: l
1977
+ cornerRadius: l = 0,
1978
+ fill: A
1923
1979
  } = r;
1924
1980
  return new I({
1925
1981
  hittable: !1,
1926
1982
  className: e,
1927
1983
  width: t,
1928
1984
  height: i,
1929
- fill: l,
1930
- cornerRadius: A,
1985
+ fill: A,
1986
+ cornerRadius: l,
1931
1987
  overflow: "hide",
1932
1988
  children: [
1933
- new Ni({
1989
+ new Pi({
1934
1990
  className: "Texture-Image",
1935
1991
  width: t,
1936
1992
  height: i,
1937
1993
  opacity: o,
1938
1994
  fill: {
1939
1995
  type: "image",
1940
- url: Xs[s],
1996
+ url: Zs[s],
1941
1997
  mode: "repeat",
1942
1998
  scale: n,
1943
1999
  rotation: a
@@ -1946,7 +2002,7 @@ function Ae(r = {}) {
1946
2002
  ]
1947
2003
  });
1948
2004
  }
1949
- class ft extends Y {
2005
+ class dt extends Y {
1950
2006
  static DEFAULT_HEIGHT = 60;
1951
2007
  chains = /* @__PURE__ */ new Map();
1952
2008
  createUi() {
@@ -1954,12 +2010,12 @@ class ft extends Y {
1954
2010
  id: e,
1955
2011
  className: t,
1956
2012
  width: i,
1957
- height: s = ft.DEFAULT_HEIGHT,
2013
+ height: s = dt.DEFAULT_HEIGHT,
1958
2014
  x: o,
1959
2015
  y: n,
1960
2016
  offsetX: a,
1961
- offsetY: A,
1962
- zIndex: l,
2017
+ offsetY: l,
2018
+ zIndex: A,
1963
2019
  rotation: c,
1964
2020
  scale: h,
1965
2021
  visible: d,
@@ -1972,10 +2028,10 @@ class ft extends Y {
1972
2028
  x: o,
1973
2029
  y: n,
1974
2030
  offsetX: a,
1975
- offsetY: A,
2031
+ offsetY: l,
1976
2032
  width: i,
1977
2033
  height: s,
1978
- zIndex: l,
2034
+ zIndex: A,
1979
2035
  rotation: c,
1980
2036
  scale: h,
1981
2037
  visible: d,
@@ -2006,8 +2062,10 @@ class ft extends Y {
2006
2062
  operating(e) {
2007
2063
  }
2008
2064
  /**
2009
- * 逐帧跟随(AppController 托盘/拖链联动调用):
2065
+ * 逐帧跟随(AppController 拖链联动调用):
2010
2066
  * 以设备实时位置直接驱动拖链,保证拖链与设备移动时相对静止
2067
+ * @param botId 设备业务 id
2068
+ * @param along 设备在「轨道局部坐标系」下的沿轨距离(0 = 轨道起点端,未缩放局部单位)
2011
2069
  */
2012
2070
  followChain(e, t) {
2013
2071
  this.moveChain(e, t);
@@ -2035,7 +2093,7 @@ class ft extends Y {
2035
2093
  overflow: "hide",
2036
2094
  fill: "#555",
2037
2095
  children: [
2038
- Ae({
2096
+ le({
2039
2097
  width: s,
2040
2098
  height: i * 0.5,
2041
2099
  effect: "VerticalBar",
@@ -2045,29 +2103,30 @@ class ft extends Y {
2045
2103
  });
2046
2104
  }
2047
2105
  // 移动拖链(直接定位,暂移除动画,排查联动同步)
2106
+ // along 为轨道局部沿轨距离(未缩放局部单位,0 = 轨道起点端),与轨道是否位于画布原点 / 是否旋转无关
2048
2107
  moveChain(e, t) {
2049
2108
  if (!Number.isFinite(t)) return;
2050
2109
  const i = this.chains.get(e);
2051
2110
  if (!i) return;
2052
- const { chainDirection: s = "left" } = this.config, o = this.config.width, n = this.config.scale || 1, a = Math.min(Math.max(t / n, 0), o);
2111
+ const { chainDirection: s = "left" } = this.config, o = this.config.width, n = Math.min(Math.max(t, 0), o);
2053
2112
  if (s === "left") {
2054
- if (i.x === 0 && i.width === a) return;
2055
- i.x = 0, i.width = a;
2113
+ if (i.x === 0 && i.width === n) return;
2114
+ i.x = 0, i.width = n;
2056
2115
  } else if (s === "right") {
2057
- const A = Math.max(o - a, 0);
2058
- if (i.x === a && i.width === A) return;
2059
- i.x = a, i.width = A;
2116
+ const a = Math.max(o - n, 0);
2117
+ if (i.x === n && i.width === a) return;
2118
+ i.x = n, i.width = a;
2060
2119
  }
2061
2120
  }
2062
2121
  }
2063
- let vi = !0;
2064
- function Js(r) {
2065
- vi = r;
2122
+ let Ii = !0;
2123
+ function $s(r) {
2124
+ Ii = r;
2066
2125
  }
2067
2126
  function ue() {
2068
- return vi;
2127
+ return Ii;
2069
2128
  }
2070
- class Pe extends De {
2129
+ class Ge extends De {
2071
2130
  // 缓存上次操作值,避免重复 set 触发不必要的重绘
2072
2131
  lastColor;
2073
2132
  lastBlinking;
@@ -2088,7 +2147,7 @@ class Pe extends De {
2088
2147
  super({ ...t, ...e });
2089
2148
  }
2090
2149
  createUi() {
2091
- const { x: e, y: t, width: i, height: s, color: o, strokeColor: n, strokeWidth: a, showShadow: A, inFlow: l } = this.config, c = new I({
2150
+ const { x: e, y: t, width: i, height: s, color: o, strokeColor: n, strokeWidth: a, showShadow: l, inFlow: A } = this.config, c = new I({
2092
2151
  hittable: !1,
2093
2152
  className: "Light",
2094
2153
  x: e,
@@ -2099,8 +2158,8 @@ class Pe extends De {
2099
2158
  stroke: n,
2100
2159
  strokeWidth: a,
2101
2160
  around: "center",
2102
- inFlow: l,
2103
- shadow: A ? {
2161
+ inFlow: A,
2162
+ shadow: l ? {
2104
2163
  spread: 1,
2105
2164
  blur: 2,
2106
2165
  color: "rgba(0,0,0,0.4)"
@@ -2129,8 +2188,8 @@ class Pe extends De {
2129
2188
  }
2130
2189
  // 操作:灯颜色变化 & 灯旋转 & 灯闪烁(字段缺失即跳过:未传 color 沿用当前颜色;旋转与闪烁可同时生效)
2131
2190
  operating(e) {
2132
- const t = e.blinking === !0, i = e.rotating === !0, s = e.color, n = s !== void 0 && this.lastColor !== s, a = this.lastBlinking !== t, A = this.lastRotating !== i, l = Object.hasOwn(e, "rotating") && i, c = Object.hasOwn(e, "blinking") && t, h = a || A || (c || l) && n;
2133
- if (n && (this.lastColor = s), a && (this.lastBlinking = t), A && (this.lastRotating = i), n && (this.config.isRingShape || this.ui.findOne(".mid")?.set({
2191
+ const t = e.blinking === !0, i = e.rotating === !0, s = e.color, n = s !== void 0 && this.lastColor !== s, a = this.lastBlinking !== t, l = this.lastRotating !== i, A = Object.hasOwn(e, "rotating") && i, c = Object.hasOwn(e, "blinking") && t, h = a || l || (c || A) && n;
2192
+ if (n && (this.lastColor = s), a && (this.lastBlinking = t), l && (this.lastRotating = i), n && (this.config.isRingShape || this.ui.findOne(".mid")?.set({
2134
2193
  fill: {
2135
2194
  color: s
2136
2195
  }
@@ -2138,7 +2197,7 @@ class Pe extends De {
2138
2197
  fill: s
2139
2198
  })), h) {
2140
2199
  const d = ue(), C = this.ui.findOne(".rotateLight"), p = s ?? this.lastColor ?? this.config.color ?? "#424242";
2141
- if (d && l) {
2200
+ if (d && A) {
2142
2201
  const f = c ? [
2143
2202
  { rotation: 0, opacity: 1 },
2144
2203
  { rotation: 180, opacity: 0.25 },
@@ -2202,7 +2261,7 @@ class J extends De {
2202
2261
  super({ ...t, ...e });
2203
2262
  }
2204
2263
  createUi() {
2205
- const { x: e, y: t, rotation: i, width: s, height: o, color: n, strokeColor: a, strokeWidth: A, cornerRadius: l, showShadow: c, inFlow: h } = this.config;
2264
+ const { x: e, y: t, rotation: i, width: s, height: o, color: n, strokeColor: a, strokeWidth: l, cornerRadius: A, showShadow: c, inFlow: h } = this.config;
2206
2265
  return new I({
2207
2266
  hittable: !1,
2208
2267
  className: "RectLight",
@@ -2212,8 +2271,8 @@ class J extends De {
2212
2271
  width: s,
2213
2272
  height: o,
2214
2273
  stroke: a,
2215
- cornerRadius: l,
2216
- strokeWidth: A,
2274
+ cornerRadius: A,
2275
+ strokeWidth: l,
2217
2276
  around: "center",
2218
2277
  fill: n,
2219
2278
  inFlow: h,
@@ -2226,24 +2285,24 @@ class J extends De {
2226
2285
  }
2227
2286
  // 操作:灯颜色变化 & 灯闪烁(矩形灯不支持旋转;字段缺失即跳过,未传 color 沿用当前颜色)
2228
2287
  operating(e) {
2229
- const t = e.blinking === !0, i = e.color, o = i !== void 0 && this.lastColor !== i, n = this.lastBlinking !== t, a = Object.hasOwn(e, "blinking") && t, A = this.ui.findOne(".RectLight"), l = i ?? this.lastColor ?? this.config.color ?? "#424242";
2288
+ const t = e.blinking === !0, i = e.color, o = i !== void 0 && this.lastColor !== i, n = this.lastBlinking !== t, a = Object.hasOwn(e, "blinking") && t, l = this.ui.findOne(".RectLight"), A = i ?? this.lastColor ?? this.config.color ?? "#424242";
2230
2289
  if (o && (this.lastColor = i), n && (this.lastBlinking = t), a && ue()) {
2231
2290
  if (o || n) {
2232
2291
  const c = this.config.color;
2233
- A?.set({
2292
+ l?.set({
2234
2293
  animation: {
2235
- keyframes: [{ fill: l }, { fill: c }, { fill: l }],
2294
+ keyframes: [{ fill: A }, { fill: c }, { fill: A }],
2236
2295
  duration: 0.5,
2237
2296
  loop: !0
2238
2297
  }
2239
2298
  });
2240
2299
  }
2241
- A?.set({ fill: l });
2300
+ l?.set({ fill: A });
2242
2301
  } else
2243
- A?.set({ animation: void 0 }), A?.set({ fill: l });
2302
+ l?.set({ animation: void 0 }), l?.set({ fill: A });
2244
2303
  }
2245
2304
  }
2246
- class Ve extends De {
2305
+ class Pe extends De {
2247
2306
  constructor(e) {
2248
2307
  const t = {
2249
2308
  x: 0,
@@ -2259,7 +2318,7 @@ class Ve extends De {
2259
2318
  super({ ...t, ...e });
2260
2319
  }
2261
2320
  createUi() {
2262
- const { x: e, y: t, width: i, height: s, fill: o, progress: n, textContent: a, textShow: A, textPosition: l } = this.config;
2321
+ const { x: e, y: t, width: i, height: s, fill: o, progress: n, textContent: a, textShow: l, textPosition: A } = this.config;
2263
2322
  return new I({
2264
2323
  hittable: !1,
2265
2324
  className: "Progress",
@@ -2289,13 +2348,13 @@ class Ve extends De {
2289
2348
  }
2290
2349
  },
2291
2350
  {
2292
- visible: A,
2351
+ visible: l,
2293
2352
  className: "textContent-text",
2294
2353
  tag: "Text",
2295
2354
  width: i,
2296
2355
  height: s,
2297
2356
  text: a,
2298
- textAlign: l,
2357
+ textAlign: A,
2299
2358
  verticalAlign: "middle",
2300
2359
  fontSize: 14,
2301
2360
  fontWeight: "black",
@@ -2314,7 +2373,7 @@ class Ve extends De {
2314
2373
  }
2315
2374
  }
2316
2375
  }
2317
- class qe extends De {
2376
+ class Ve extends De {
2318
2377
  constructor(e) {
2319
2378
  const t = {
2320
2379
  x: 0,
@@ -2394,7 +2453,7 @@ class qe extends De {
2394
2453
  }
2395
2454
  }
2396
2455
  const Be = P("StationSlotGroup");
2397
- function js(r) {
2456
+ function eo(r) {
2398
2457
  return r === void 0 ? void 0 : r.trim() || void 0;
2399
2458
  }
2400
2459
  class Z extends De {
@@ -2412,19 +2471,19 @@ class Z extends De {
2412
2471
  // - 交叉方向尺寸:始终按实际换行后的行/列数收缩贴合内容,避免固定超大高度在盒子底部留下空白
2413
2472
  // (否则外层 Flow 堆叠各工位组层时,空隙并不来自外层 gap,而是来自每层盒子内部的固定空底)
2414
2473
  get autoSize() {
2415
- const { flowOptions: e, stationSlots: t } = this.config, i = e.width, s = e.height, o = e.flow, n = e.flowWrap, a = e.oneDirectionMaxQuantity, A = e.gap ?? 0;
2474
+ const { flowOptions: e, stationSlots: t } = this.config, i = e.width, s = e.height, o = e.flow, n = e.flowWrap, a = e.oneDirectionMaxQuantity, l = e.gap ?? 0;
2416
2475
  if (t.length === 0)
2417
2476
  return { width: i, height: s };
2418
- const l = Math.max(...t.map((h) => h.width ?? 0)), c = Math.max(...t.map((h) => h.height ?? 0));
2477
+ const A = Math.max(...t.map((h) => h.width ?? 0)), c = Math.max(...t.map((h) => h.height ?? 0));
2419
2478
  if (n === !1)
2420
2479
  return { width: i, height: s };
2421
2480
  if (o === "x" || o === "x-reverse") {
2422
- const h = l * a + A * (a - 1), d = i > 0 ? i : h, C = i > 0 ? Math.max(1, Math.floor((i + A) / (l + A))) : Math.max(1, a), p = Math.ceil(t.length / C), f = c * p + A * (p - 1);
2481
+ const h = A * a + l * (a - 1), d = i > 0 ? i : h, C = i > 0 ? Math.max(1, Math.floor((i + l) / (A + l))) : Math.max(1, a), p = Math.ceil(t.length / C), f = c * p + l * (p - 1);
2423
2482
  return { width: d, height: f };
2424
2483
  }
2425
2484
  if (o === "y" || o === "y-reverse") {
2426
- const h = c * a + A * (a - 1), d = s > 0 ? s : h, C = s > 0 ? Math.max(1, Math.floor((s + A) / (c + A))) : Math.max(1, a), p = Math.ceil(t.length / C);
2427
- return { width: l * p + A * (p - 1), height: d };
2485
+ const h = c * a + l * (a - 1), d = s > 0 ? s : h, C = s > 0 ? Math.max(1, Math.floor((s + l) / (c + l))) : Math.max(1, a), p = Math.ceil(t.length / C);
2486
+ return { width: A * p + l * (p - 1), height: d };
2428
2487
  }
2429
2488
  return { width: i, height: s };
2430
2489
  }
@@ -2438,8 +2497,8 @@ class Z extends De {
2438
2497
  stationSlots: o,
2439
2498
  flowOptions: n,
2440
2499
  hittable: a = !0,
2441
- visible: A = !0,
2442
- origin: l = "center",
2500
+ visible: l = !0,
2501
+ origin: A = "center",
2443
2502
  around: c = "center",
2444
2503
  hideBounds: h = !0
2445
2504
  } = this.config, d = [];
@@ -2449,7 +2508,7 @@ class Z extends De {
2449
2508
  Be.warn("StationSlot 缺少有效的 index 字段:", f);
2450
2509
  continue;
2451
2510
  }
2452
- const u = new Oi({
2511
+ const u = new Mi({
2453
2512
  ...f,
2454
2513
  parentRotation: this.parentRotation,
2455
2514
  sourceSlot: this.sourceSlots[p]
@@ -2461,14 +2520,14 @@ class Z extends De {
2461
2520
  flowAlign: "center",
2462
2521
  className: "StationSlotGroup",
2463
2522
  hittable: a,
2464
- visible: A,
2523
+ visible: l,
2465
2524
  x: e,
2466
2525
  y: t,
2467
2526
  rotation: i,
2468
2527
  zIndex: s,
2469
2528
  width: this.autoSize.width,
2470
2529
  height: this.autoSize.height,
2471
- origin: l,
2530
+ origin: A,
2472
2531
  around: c,
2473
2532
  // hideBounds 为 false 时显示 1px 工业黄边框,方便查看容器轮廓
2474
2533
  stroke: h === !1 ? "#FFD700" : void 0,
@@ -2519,7 +2578,7 @@ class Z extends De {
2519
2578
  Be.warn(`修改工位颜色失败:未找到 index=${e} 的工位槽`);
2520
2579
  return;
2521
2580
  }
2522
- i.setSiteWorkingColor(js(t));
2581
+ i.setSiteWorkingColor(eo(t));
2523
2582
  }
2524
2583
  /**
2525
2584
  * 判断本组是否包含指定工位序号
@@ -2573,8 +2632,8 @@ class Z extends De {
2573
2632
  return { x: s.x ?? 0, y: s.y ?? 0 };
2574
2633
  }
2575
2634
  }
2576
- function pt(r) {
2577
- const { x: e, y: t, width: i, height: s, cornerRadius: o = 10, origin: n = "center", around: a = "center" } = r, A = new I({
2635
+ function ft(r) {
2636
+ const { x: e, y: t, width: i, height: s, cornerRadius: o = 10, origin: n = "center", around: a = "center" } = r, l = new I({
2578
2637
  x: e,
2579
2638
  y: t,
2580
2639
  width: i,
@@ -2600,8 +2659,8 @@ function pt(r) {
2600
2659
  stroke: "rgba(255, 255, 255, 0.3)",
2601
2660
  strokeWidth: 1
2602
2661
  });
2603
- return A.add(
2604
- Ae({
2662
+ return l.add(
2663
+ le({
2605
2664
  width: i,
2606
2665
  height: s,
2607
2666
  cornerRadius: o,
@@ -2610,7 +2669,7 @@ function pt(r) {
2610
2669
  scale: 0.015,
2611
2670
  rotation: 45
2612
2671
  })
2613
- ), A;
2672
+ ), l;
2614
2673
  }
2615
2674
  function re(r) {
2616
2675
  if (r.stationSlotGroups !== void 0)
@@ -2621,9 +2680,9 @@ function re(r) {
2621
2680
  return i ? t(i) : (t(s), t(o)), { layers: e, migrated: e.length > 0 };
2622
2681
  }
2623
2682
  function Qe(r) {
2624
- return r?.stationSlots?.some((e) => e.resourceType === x.TOOL) ?? !1;
2683
+ return r?.stationSlots?.some((e) => e.resourceType === v.TOOL) ?? !1;
2625
2684
  }
2626
- class Oe extends Y {
2685
+ class Ue extends Y {
2627
2686
  static STATION_OFFSET = 16;
2628
2687
  light = null;
2629
2688
  progress = null;
@@ -2648,8 +2707,8 @@ class Oe extends Y {
2648
2707
  progressEnabled: n,
2649
2708
  stationContainerDirection: a,
2650
2709
  // 位置与变换
2651
- width: A,
2652
- height: l,
2710
+ width: l,
2711
+ height: A,
2653
2712
  x: c,
2654
2713
  y: h,
2655
2714
  offsetX: d,
@@ -2662,26 +2721,26 @@ class Oe extends Y {
2662
2721
  editable: g,
2663
2722
  draggable: m
2664
2723
  } = this.config, y = re(this.config).layers[0]?.stationSlotGroup;
2665
- this.stationContainerBaseRotation = a === "vertical" ? 90 : 0, o !== !1 && (this.light = new Pe({
2724
+ this.stationContainerBaseRotation = a === "vertical" ? 90 : 0, o !== !1 && (this.light = new Ge({
2666
2725
  x: this.width_05,
2667
2726
  y: 30,
2668
2727
  width: this.width_02,
2669
2728
  height: this.width_02,
2670
2729
  showShadow: !0
2671
- }).init()), this.entrance = new qe({
2730
+ }).init()), this.entrance = new Ve({
2672
2731
  x: this.width_05,
2673
2732
  y: -2,
2674
- width: A,
2733
+ width: l,
2675
2734
  height: this.width_02,
2676
2735
  isIn: !1,
2677
2736
  isOut: !1
2678
- }).init(), n !== !1 && (this.progress = new Ve({
2737
+ }).init(), n !== !1 && (this.progress = new Pe({
2679
2738
  x: this.width_05,
2680
- y: l - 74,
2739
+ y: A - 74,
2681
2740
  width: this.width_08,
2682
2741
  height: 20,
2683
2742
  progress: 0
2684
- }).init()), this.glass = pt({
2743
+ }).init()), this.glass = ft({
2685
2744
  around: "top-left",
2686
2745
  width: this.width_05,
2687
2746
  height: 66,
@@ -2689,7 +2748,7 @@ class Oe extends Y {
2689
2748
  }), this.stationContainer = new I({
2690
2749
  className: "StationContainer",
2691
2750
  x: this.width_05,
2692
- y: this.height_05 - Oe.STATION_OFFSET,
2751
+ y: this.height_05 - Ue.STATION_OFFSET,
2693
2752
  width: this.width_05,
2694
2753
  height: 66,
2695
2754
  around: "center",
@@ -2704,8 +2763,8 @@ class Oe extends Y {
2704
2763
  id: e,
2705
2764
  className: t,
2706
2765
  zIndex: p,
2707
- width: A,
2708
- height: l,
2766
+ width: l,
2767
+ height: A,
2709
2768
  x: c,
2710
2769
  y: h,
2711
2770
  offsetX: d,
@@ -2720,8 +2779,8 @@ class Oe extends Y {
2720
2779
  new I({
2721
2780
  hittable: !1,
2722
2781
  x: 0,
2723
- y: l - 60,
2724
- width: A,
2782
+ y: A - 60,
2783
+ width: l,
2725
2784
  height: 60,
2726
2785
  zIndex: 0,
2727
2786
  fill: "#232323",
@@ -2737,7 +2796,7 @@ class Oe extends Y {
2737
2796
  {
2738
2797
  ...y,
2739
2798
  x: this.width_05,
2740
- y: this.height_05 - Oe.STATION_OFFSET,
2799
+ y: this.height_05 - Ue.STATION_OFFSET,
2741
2800
  rotation: this.stationContainerBaseRotation,
2742
2801
  hittable: this.config.hittable
2743
2802
  },
@@ -2746,7 +2805,7 @@ class Oe extends Y {
2746
2805
  z({
2747
2806
  title: i || "",
2748
2807
  x: this.width_05,
2749
- y: l - 30,
2808
+ y: A - 30,
2750
2809
  height: 20
2751
2810
  })
2752
2811
  ), E;
@@ -2797,7 +2856,7 @@ class Oe extends Y {
2797
2856
  return this.stationSlotGroup ? [this.stationSlotGroup] : [];
2798
2857
  }
2799
2858
  }
2800
- class Ke extends Y {
2859
+ class Oe extends Y {
2801
2860
  static PROGRESS_Y_OFFSET = 45;
2802
2861
  static NAME_PLATE_Y_OFFSET = 20;
2803
2862
  light = null;
@@ -2813,8 +2872,8 @@ class Ke extends Y {
2813
2872
  lightEnabled: o,
2814
2873
  progressEnabled: n,
2815
2874
  width: a,
2816
- height: A,
2817
- x: l,
2875
+ height: l,
2876
+ x: A,
2818
2877
  y: c,
2819
2878
  offsetX: h,
2820
2879
  offsetY: d,
@@ -2825,23 +2884,23 @@ class Ke extends Y {
2825
2884
  editable: b,
2826
2885
  draggable: g
2827
2886
  } = this.config, m = re(this.config).layers[0]?.stationSlotGroup, y = [4, 4, this.width_05, this.width_05];
2828
- this.entrance = new qe({
2887
+ this.entrance = new Ve({
2829
2888
  x: this.width_05,
2830
2889
  y: -2,
2831
2890
  width: a,
2832
2891
  height: this.width_02,
2833
2892
  isIn: !1,
2834
2893
  isOut: !1
2835
- }).init(), o !== !1 && (this.light = new Pe({
2894
+ }).init(), o !== !1 && (this.light = new Ge({
2836
2895
  x: this.width_05,
2837
2896
  y: 24,
2838
2897
  width: this.width_02,
2839
2898
  height: this.width_02,
2840
2899
  strokeWidth: 6,
2841
2900
  strokeColor: "#D5DAE3"
2842
- }).init()), n !== !1 && (this.progress = new Ve({
2901
+ }).init()), n !== !1 && (this.progress = new Pe({
2843
2902
  x: this.width_05,
2844
- y: A - Ke.PROGRESS_Y_OFFSET,
2903
+ y: l - Oe.PROGRESS_Y_OFFSET,
2845
2904
  width: this.width_05,
2846
2905
  height: 20,
2847
2906
  progress: 0
@@ -2854,7 +2913,7 @@ class Ke extends Y {
2854
2913
  height: this.width_05,
2855
2914
  around: "center",
2856
2915
  children: [
2857
- pt({
2916
+ ft({
2858
2917
  around: "top-left",
2859
2918
  width: this.width_05,
2860
2919
  height: this.width_05,
@@ -2865,12 +2924,12 @@ class Ke extends Y {
2865
2924
  data: this.config,
2866
2925
  id: e,
2867
2926
  className: t,
2868
- x: l,
2927
+ x: A,
2869
2928
  y: c,
2870
2929
  offsetX: h,
2871
2930
  offsetY: d,
2872
2931
  width: a,
2873
- height: A,
2932
+ height: l,
2874
2933
  zIndex: C,
2875
2934
  rotation: p,
2876
2935
  scale: f,
@@ -2893,7 +2952,7 @@ class Ke extends Y {
2893
2952
  new I({
2894
2953
  hittable: !1,
2895
2954
  width: a,
2896
- height: A,
2955
+ height: l,
2897
2956
  fill: {
2898
2957
  type: "linear",
2899
2958
  from: "left",
@@ -2938,7 +2997,7 @@ class Ke extends Y {
2938
2997
  z({
2939
2998
  title: i || "",
2940
2999
  x: this.width_05,
2941
- y: A - Ke.NAME_PLATE_Y_OFFSET,
3000
+ y: l - Oe.NAME_PLATE_Y_OFFSET,
2942
3001
  stroke: "rgba(0,0,0,0.05)"
2943
3002
  })
2944
3003
  ), H(B, this.config), j(B), B;
@@ -2954,8 +3013,8 @@ class Ke extends Y {
2954
3013
  return this.stationSlotGroup ? [this.stationSlotGroup] : [];
2955
3014
  }
2956
3015
  }
2957
- const ze = P("ShuttleStation");
2958
- class k extends Y {
3016
+ const je = P("ShuttleStation");
3017
+ class R extends Y {
2959
3018
  static WALL_THICKNESS = 14;
2960
3019
  static BASE_HEIGHT = 40;
2961
3020
  static LIGHT_Y_OFFSET = 6;
@@ -2973,12 +3032,12 @@ class k extends Y {
2973
3032
  // 构建 U 型路径(外边界 + 内部镂空,使用非零环绕规则)
2974
3033
  // 主体下方为直角(已移除底部圆角)
2975
3034
  buildUPath(e, t) {
2976
- const i = k.WALL_THICKNESS, s = k.BASE_HEIGHT, o = ["M 0 0", `L ${e} 0`, `L ${e} ${t}`, `L 0 ${t}`, "Z"], n = [`M ${i} 0`, `L ${i} ${t - s}`, `L ${e - i} ${t - s}`, `L ${e - i} 0`, "Z"];
3035
+ const i = R.WALL_THICKNESS, s = R.BASE_HEIGHT, o = ["M 0 0", `L ${e} 0`, `L ${e} ${t}`, `L 0 ${t}`, "Z"], n = [`M ${i} 0`, `L ${i} ${t - s}`, `L ${e - i} ${t - s}`, `L ${e - i} 0`, "Z"];
2977
3036
  return [...o, ...n].join(" ");
2978
3037
  }
2979
3038
  // 构建 U 型轮廓线路径(主体下方为直角,无圆角)
2980
3039
  buildOutlinePath(e, t) {
2981
- const i = k.WALL_THICKNESS, s = k.BASE_HEIGHT;
3040
+ const i = R.WALL_THICKNESS, s = R.BASE_HEIGHT;
2982
3041
  return [
2983
3042
  `M 0 ${t}`,
2984
3043
  `L ${e} ${t}`,
@@ -2992,9 +3051,9 @@ class k extends Y {
2992
3051
  ].join(" ");
2993
3052
  }
2994
3053
  buildLayers(e, t, i) {
2995
- const s = k.WALL_THICKNESS, o = k.BASE_HEIGHT, n = s, A = t - o - n, l = k.LAYER_GAP, c = (A - l * (i.length - 1)) / i.length, h = [];
3054
+ const s = R.WALL_THICKNESS, o = R.BASE_HEIGHT, n = s, l = t - o - n, A = R.LAYER_GAP, c = (l - A * (i.length - 1)) / i.length, h = [];
2996
3055
  return i.forEach((d, C) => {
2997
- const p = n + C * (c + l), f = new I({
3056
+ const p = n + C * (c + A), f = new I({
2998
3057
  // 层容器可命中自身(不可设 hitSelf: false):overflow hidden 的裁剪 Box 在 Leafer pick 时
2999
3058
  // 要求自身先命中(__clipAfterFill),hitSelf: false 会导致整棵子树(工位槽)无法被命中测试。
3000
3059
  // 挂载模型 config 使点击层内空白区时 data 与点击主体一致(均为接驳站信息)
@@ -3009,7 +3068,7 @@ class k extends Y {
3009
3068
  strokeWidth: 1,
3010
3069
  overflow: "hidden",
3011
3070
  children: [
3012
- Ae({
3071
+ le({
3013
3072
  className: "LayerTexture",
3014
3073
  width: e - s * 2,
3015
3074
  height: c,
@@ -3046,7 +3105,7 @@ class k extends Y {
3046
3105
  }), h;
3047
3106
  }
3048
3107
  buildBaseAndWheels(e, t) {
3049
- const i = e + k.BASE_EXTEND * 2, s = new I({
3108
+ const i = e + R.BASE_EXTEND * 2, s = new I({
3050
3109
  editable: !1,
3051
3110
  // 底座是主体的组成部分,禁止被 editor 单独选中
3052
3111
  hittable: !1,
@@ -3054,35 +3113,35 @@ class k extends Y {
3054
3113
  x: -4,
3055
3114
  y: t,
3056
3115
  width: i,
3057
- height: k.BASE_THICKNESS,
3116
+ height: R.BASE_THICKNESS,
3058
3117
  fill: "#E57122",
3059
3118
  cornerRadius: [0, 0, 4, 4],
3060
3119
  stroke: "#C8CCD4",
3061
3120
  strokeWidth: 0.5
3062
- }), o = t + k.BASE_THICKNESS - k.WHEEL_SIZE * k.WHEEL_COVER_RATIO, n = -4 + k.WHEEL_INSET, a = e + k.BASE_EXTEND - k.WHEEL_INSET, A = new we({
3121
+ }), o = t + R.BASE_THICKNESS - R.WHEEL_SIZE * R.WHEEL_COVER_RATIO, n = -4 + R.WHEEL_INSET, a = e + R.BASE_EXTEND - R.WHEEL_INSET, l = new we({
3063
3122
  editable: !1,
3064
3123
  hittable: !1,
3065
3124
  className: "WheelLeft",
3066
- x: n - k.WHEEL_SIZE / 2,
3125
+ x: n - R.WHEEL_SIZE / 2,
3067
3126
  y: o,
3068
- width: k.WHEEL_SIZE,
3069
- height: k.WHEEL_SIZE,
3127
+ width: R.WHEEL_SIZE,
3128
+ height: R.WHEEL_SIZE,
3070
3129
  fill: "#111",
3071
3130
  stroke: "#999",
3072
3131
  strokeWidth: 1
3073
- }), l = new we({
3132
+ }), A = new we({
3074
3133
  editable: !1,
3075
3134
  hittable: !1,
3076
3135
  className: "WheelRight",
3077
- x: a - k.WHEEL_SIZE / 2,
3136
+ x: a - R.WHEEL_SIZE / 2,
3078
3137
  y: o,
3079
- width: k.WHEEL_SIZE,
3080
- height: k.WHEEL_SIZE,
3138
+ width: R.WHEEL_SIZE,
3139
+ height: R.WHEEL_SIZE,
3081
3140
  fill: "#111",
3082
3141
  stroke: "#999",
3083
3142
  strokeWidth: 1
3084
3143
  });
3085
- return [A, l, s];
3144
+ return [l, A, s];
3086
3145
  }
3087
3146
  createUi() {
3088
3147
  this.layerLights.clear(), this.layerGroups.clear(), this.lastLayerLightColor = {};
@@ -3094,8 +3153,8 @@ class k extends Y {
3094
3153
  height: o,
3095
3154
  x: n,
3096
3155
  y: a,
3097
- offsetX: A,
3098
- offsetY: l,
3156
+ offsetX: l,
3157
+ offsetY: A,
3099
3158
  zIndex: c,
3100
3159
  rotation: h,
3101
3160
  scale: d,
@@ -3123,13 +3182,13 @@ class k extends Y {
3123
3182
  strokeWidth: 0.5
3124
3183
  }), B = [y, E];
3125
3184
  if (g && g.length > 0) {
3126
- const v = this.buildLayers(s, m, g);
3127
- B.push(...v);
3185
+ const x = this.buildLayers(s, m, g);
3186
+ B.push(...x);
3128
3187
  }
3129
3188
  u !== !1 && (this.light = new J({
3130
3189
  x: s / 2,
3131
- y: m - k.LIGHT_Y_OFFSET,
3132
- width: (s - k.WALL_THICKNESS * 2) / 2,
3190
+ y: m - R.LIGHT_Y_OFFSET,
3191
+ width: (s - R.WALL_THICKNESS * 2) / 2,
3133
3192
  height: 6,
3134
3193
  color: "#666",
3135
3194
  strokeColor: "#333",
@@ -3139,7 +3198,7 @@ class k extends Y {
3139
3198
  z({
3140
3199
  title: i || "",
3141
3200
  x: s / 2,
3142
- y: m - k.NAME_PLATE_Y_OFFSET
3201
+ y: m - R.NAME_PLATE_Y_OFFSET
3143
3202
  })
3144
3203
  );
3145
3204
  const T = this.buildBaseAndWheels(s, m);
@@ -3150,10 +3209,10 @@ class k extends Y {
3150
3209
  className: t,
3151
3210
  x: n,
3152
3211
  y: a,
3153
- offsetX: A,
3154
- offsetY: l,
3212
+ offsetX: l,
3213
+ offsetY: A,
3155
3214
  width: s,
3156
- height: m + k.BASE_THICKNESS + k.WHEEL_SIZE / 3,
3215
+ height: m + R.BASE_THICKNESS + R.WHEEL_SIZE / 3,
3157
3216
  zIndex: c,
3158
3217
  rotation: h,
3159
3218
  scale: d,
@@ -3184,13 +3243,13 @@ class k extends Y {
3184
3243
  i.operating(e);
3185
3244
  return;
3186
3245
  }
3187
- ze.warn(`接驳站资源操作失败:未找到 index=${e.device_layer} 的层`);
3246
+ je.warn(`接驳站资源操作失败:未找到 index=${e.device_layer} 的层`);
3188
3247
  return;
3189
3248
  }
3190
3249
  const t = [];
3191
3250
  for (const i of this.layerGroups.values())
3192
3251
  i.hasStationIndex(e.device_station) && t.push(i);
3193
- t.length === 1 ? t[0].operating(e) : t.length === 0 ? ze.warn(`接驳站资源操作失败:未找到包含 device_station=${e.device_station} 工位的层`) : ze.warn(
3252
+ t.length === 1 ? t[0].operating(e) : t.length === 0 ? je.warn(`接驳站资源操作失败:未找到包含 device_station=${e.device_station} 工位的层`) : je.warn(
3194
3253
  `接驳站资源操作失败:工位 device_station=${e.device_station} 在 ${t.length} 个层中存在,请明确指定 device_layer`
3195
3254
  );
3196
3255
  }
@@ -3233,7 +3292,7 @@ class k extends Y {
3233
3292
  return (this.layerGroups.get(t ?? 1) ?? [...this.layerGroups.values()][0])?.getStationSlotPoint(e);
3234
3293
  }
3235
3294
  }
3236
- const Ze = P("MaterialTrack");
3295
+ const ze = P("MaterialTrack");
3237
3296
  class V extends Y {
3238
3297
  static WALL_THICKNESS = 14;
3239
3298
  static BASE_HEIGHT = 40;
@@ -3267,9 +3326,9 @@ class V extends Y {
3267
3326
  ].join(" ");
3268
3327
  }
3269
3328
  buildLayers(e, t, i) {
3270
- const s = V.WALL_THICKNESS, o = V.BASE_HEIGHT, n = s, A = t - o - n, l = V.LAYER_GAP, c = (A - l * (i.length - 1)) / i.length, h = [];
3329
+ const s = V.WALL_THICKNESS, o = V.BASE_HEIGHT, n = s, l = t - o - n, A = V.LAYER_GAP, c = (l - A * (i.length - 1)) / i.length, h = [];
3271
3330
  return i.forEach((d, C) => {
3272
- const p = n + C * (c + l), f = new I({
3331
+ const p = n + C * (c + A), f = new I({
3273
3332
  // 层容器可命中自身(不可设 hitSelf: false):overflow hidden 裁剪 Box 在 pick 时要求自身先命中(__clipAfterFill),
3274
3333
  // hitSelf: false 会导致整棵子树(工位槽)无法被命中测试。挂载模型 config 保证点击层内空白区时 data 仍为料道信息
3275
3334
  className: "MaterialTrackLayer",
@@ -3283,7 +3342,7 @@ class V extends Y {
3283
3342
  strokeWidth: 1,
3284
3343
  overflow: "hidden",
3285
3344
  children: [
3286
- Ae({
3345
+ le({
3287
3346
  className: "LayerTexture",
3288
3347
  width: e - s * 2,
3289
3348
  height: c,
@@ -3315,8 +3374,8 @@ class V extends Y {
3315
3374
  height: o,
3316
3375
  x: n,
3317
3376
  y: a,
3318
- offsetX: A,
3319
- offsetY: l,
3377
+ offsetX: l,
3378
+ offsetY: A,
3320
3379
  zIndex: c,
3321
3380
  rotation: h,
3322
3381
  scale: d,
@@ -3369,8 +3428,8 @@ class V extends Y {
3369
3428
  className: t,
3370
3429
  x: n,
3371
3430
  y: a,
3372
- offsetX: A,
3373
- offsetY: l,
3431
+ offsetX: l,
3432
+ offsetY: A,
3374
3433
  width: s,
3375
3434
  height: o,
3376
3435
  zIndex: c,
@@ -3403,13 +3462,13 @@ class V extends Y {
3403
3462
  i.operating(e);
3404
3463
  return;
3405
3464
  }
3406
- Ze.warn(`料道资源操作失败:未找到 index=${e.device_layer} 的层`);
3465
+ ze.warn(`料道资源操作失败:未找到 index=${e.device_layer} 的层`);
3407
3466
  return;
3408
3467
  }
3409
3468
  const t = [];
3410
3469
  for (const i of this.layerGroups.values())
3411
3470
  i.hasStationIndex(e.device_station) && t.push(i);
3412
- t.length === 1 ? t[0].operating(e) : t.length === 0 ? Ze.warn(`料道资源操作失败:未找到包含 device_station=${e.device_station} 工位的层`) : Ze.warn(`料道资源操作失败:工位 device_station=${e.device_station} 在 ${t.length} 个层中存在,请明确指定 device_layer`);
3471
+ t.length === 1 ? t[0].operating(e) : t.length === 0 ? ze.warn(`料道资源操作失败:未找到包含 device_station=${e.device_station} 工位的层`) : ze.warn(`料道资源操作失败:工位 device_station=${e.device_station} 在 ${t.length} 个层中存在,请明确指定 device_layer`);
3413
3472
  }
3414
3473
  /** 收集全部层工位槽组(供全局资源移除 / 工位查询遍历) */
3415
3474
  collectStationSlotGroups() {
@@ -3428,7 +3487,7 @@ class V extends Y {
3428
3487
  return (this.layerGroups.get(t ?? 1) ?? [...this.layerGroups.values()][0])?.getStationSlotPoint(e);
3429
3488
  }
3430
3489
  }
3431
- class wt extends Y {
3490
+ class pt extends Y {
3432
3491
  light = null;
3433
3492
  progress = null;
3434
3493
  entrance = null;
@@ -3446,8 +3505,8 @@ class wt extends Y {
3446
3505
  lightEnabled: o,
3447
3506
  progressEnabled: n,
3448
3507
  width: a,
3449
- height: A,
3450
- x: l,
3508
+ height: l,
3509
+ x: A,
3451
3510
  y: c,
3452
3511
  offsetX: h,
3453
3512
  offsetY: d,
@@ -3458,22 +3517,22 @@ class wt extends Y {
3458
3517
  editable: b,
3459
3518
  draggable: g
3460
3519
  } = this.config, m = re(this.config).layers[0]?.stationSlotGroup;
3461
- this.entrance = new qe({
3520
+ this.entrance = new Ve({
3462
3521
  x: this.width_05,
3463
3522
  y: -2,
3464
3523
  width: a,
3465
3524
  height: this.width_02,
3466
3525
  isIn: !1,
3467
3526
  isOut: !1
3468
- }).init(), o !== !1 && (this.light = new Pe({
3527
+ }).init(), o !== !1 && (this.light = new Ge({
3469
3528
  x: this.width_05,
3470
3529
  y: 30,
3471
3530
  width: this.width_02,
3472
3531
  height: this.width_02,
3473
3532
  showShadow: !0
3474
- }).init()), n !== !1 && (this.progress = new Ve({
3533
+ }).init()), n !== !1 && (this.progress = new Pe({
3475
3534
  x: this.width_05,
3476
- y: A - 40,
3535
+ y: l - 40,
3477
3536
  width: this.width_08,
3478
3537
  height: 20,
3479
3538
  progress: 0
@@ -3495,12 +3554,12 @@ class wt extends Y {
3495
3554
  data: this.config,
3496
3555
  id: e,
3497
3556
  className: t,
3498
- x: l,
3557
+ x: A,
3499
3558
  y: c,
3500
3559
  offsetX: h,
3501
3560
  offsetY: d,
3502
3561
  width: a,
3503
- height: A,
3562
+ height: l,
3504
3563
  zIndex: C,
3505
3564
  rotation: p,
3506
3565
  scale: f,
@@ -3525,7 +3584,7 @@ class wt extends Y {
3525
3584
  z({
3526
3585
  title: i || "",
3527
3586
  x: this.width_05,
3528
- y: A - 14,
3587
+ y: l - 14,
3529
3588
  stroke: "rgba(0,0,0,0.05)"
3530
3589
  })
3531
3590
  ), H(E, this.config), j(E), E;
@@ -3576,7 +3635,7 @@ class wt extends Y {
3576
3635
  static TELEGRAPH_RHYTHM = [120, 70, 240, 90, 150, 60, 300, 110, 80, 200, 100, 70];
3577
3636
  /** 播放某激光工位的电报节奏闪动(每轮亮→灭后按节奏数组不定长间隔继续) */
3578
3637
  playTelegraph(e, t) {
3579
- const i = wt.TELEGRAPH_RHYTHM, s = (t - 1) * 3 % i.length;
3638
+ const i = pt.TELEGRAPH_RHYTHM, s = (t - 1) * 3 % i.length;
3580
3639
  let o = s, n = !0;
3581
3640
  const a = () => {
3582
3641
  n = !n, e.set({ opacity: n ? 1 : 0.1 }), this.laserTimers[t] = window.setTimeout(a, i[o % i.length]), o++;
@@ -3594,13 +3653,13 @@ class wt extends Y {
3594
3653
  }), this.laserTimers = {}, super.destroyUI();
3595
3654
  }
3596
3655
  }
3597
- class zs {
3656
+ class to {
3598
3657
  _ui;
3599
3658
  period;
3600
3659
  constructor(e) {
3601
3660
  const { x: t = 0, y: i = 0, period: s, height: o, color: n = "rgba(58, 180, 255, 0.5)", opacity: a = 1 } = e;
3602
3661
  this.period = s;
3603
- const A = new I({
3662
+ const l = new I({
3604
3663
  x: t,
3605
3664
  y: i,
3606
3665
  width: s * 2,
@@ -3610,7 +3669,7 @@ class zs {
3610
3669
  className: "WaveFlow",
3611
3670
  children: [this.buildWave(s, 0, o, n), this.buildWave(s, s, o, n)]
3612
3671
  });
3613
- this._ui = A;
3672
+ this._ui = l;
3614
3673
  }
3615
3674
  /** 构建单个波段的闭合 Path(表面正弦起伏 + 填充到底部) */
3616
3675
  buildWave(e, t, i, s) {
@@ -3636,7 +3695,7 @@ class zs {
3636
3695
  });
3637
3696
  }
3638
3697
  }
3639
- class Zs extends Y {
3698
+ class io extends Y {
3640
3699
  light = null;
3641
3700
  progress = null;
3642
3701
  entrance = null;
@@ -3651,8 +3710,8 @@ class Zs extends Y {
3651
3710
  lightEnabled: o,
3652
3711
  progressEnabled: n,
3653
3712
  width: a,
3654
- height: A,
3655
- x: l,
3713
+ height: l,
3714
+ x: A,
3656
3715
  y: c,
3657
3716
  offsetX: h,
3658
3717
  offsetY: d,
@@ -3672,7 +3731,7 @@ class Zs extends Y {
3672
3731
  around: "center",
3673
3732
  overflow: "hide",
3674
3733
  children: [
3675
- pt({
3734
+ ft({
3676
3735
  around: "top-left",
3677
3736
  width: this.width_08,
3678
3737
  height: 66,
@@ -3681,14 +3740,14 @@ class Zs extends Y {
3681
3740
  this.createWave(this.width_08, 66)
3682
3741
  ]
3683
3742
  });
3684
- this.entrance = new qe({
3743
+ this.entrance = new Ve({
3685
3744
  x: this.width_05,
3686
3745
  y: -2,
3687
3746
  width: a,
3688
3747
  height: this.width_02,
3689
3748
  isIn: !1,
3690
3749
  isOut: !1
3691
- }).init(), o !== !1 && (this.light = new Pe({
3750
+ }).init(), o !== !1 && (this.light = new Ge({
3692
3751
  x: this.width_05,
3693
3752
  y: 30,
3694
3753
  width: this.width_02,
@@ -3696,9 +3755,9 @@ class Zs extends Y {
3696
3755
  showShadow: !0,
3697
3756
  strokeWidth: 6,
3698
3757
  strokeColor: "#D7DCEC"
3699
- }).init()), n !== !1 && (this.progress = new Ve({
3758
+ }).init()), n !== !1 && (this.progress = new Pe({
3700
3759
  x: this.width_05,
3701
- y: A - 50,
3760
+ y: l - 50,
3702
3761
  width: this.width_08,
3703
3762
  height: 20,
3704
3763
  progress: 0
@@ -3707,12 +3766,12 @@ class Zs extends Y {
3707
3766
  data: this.config,
3708
3767
  id: e,
3709
3768
  className: t,
3710
- x: l,
3769
+ x: A,
3711
3770
  y: c,
3712
3771
  offsetX: h,
3713
3772
  offsetY: d,
3714
3773
  width: a,
3715
- height: A,
3774
+ height: l,
3716
3775
  zIndex: C,
3717
3776
  rotation: p,
3718
3777
  scale: f,
@@ -3735,7 +3794,7 @@ class Zs extends Y {
3735
3794
  new I({
3736
3795
  hittable: !1,
3737
3796
  width: a,
3738
- height: A,
3797
+ height: l,
3739
3798
  fill: {
3740
3799
  type: "linear",
3741
3800
  stops: ["#ABB9DA", "#f2f2f2"]
@@ -3761,7 +3820,7 @@ class Zs extends Y {
3761
3820
  z({
3762
3821
  title: i || "",
3763
3822
  x: this.width_05,
3764
- y: A - 14,
3823
+ y: l - 14,
3765
3824
  stroke: "rgba(0,0,0,0.05)"
3766
3825
  })
3767
3826
  ), H(E, this.config), j(E), E;
@@ -3769,7 +3828,7 @@ class Zs extends Y {
3769
3828
  /** 创建工位容器内的波浪流动效果(渲染在工位槽位层级之下,默认隐藏,受 operating 的 isWorking 控制) */
3770
3829
  createWave(e, t) {
3771
3830
  const i = t * 0.45;
3772
- return this.wave = new zs({
3831
+ return this.wave = new to({
3773
3832
  period: e,
3774
3833
  height: i,
3775
3834
  y: t - i
@@ -3782,7 +3841,7 @@ class Zs extends Y {
3782
3841
  return this.stationSlotGroup ? [this.stationSlotGroup] : [];
3783
3842
  }
3784
3843
  }
3785
- const Ot = P("SingleJointRobot"), Kt = [15, 0, 0, 15], Mt = 4, Nt = 0.66, Gt = 0.5, Pt = 12.5, Vt = 7;
3844
+ const Ut = P("SingleJointRobot"), Ot = [15, 0, 0, 15], Kt = 4, Mt = 0.66, Nt = 0.5, Gt = 12.5, Pt = 7;
3786
3845
  class be extends Y {
3787
3846
  static DEFAULT_WIDTH = 90;
3788
3847
  static DEFAULT_HEIGHT = 76;
@@ -3813,8 +3872,8 @@ class be extends Y {
3813
3872
  offsetX: o,
3814
3873
  offsetY: n,
3815
3874
  x: a,
3816
- y: A,
3817
- zIndex: l,
3875
+ y: l,
3876
+ zIndex: A,
3818
3877
  rotation: c,
3819
3878
  scale: h,
3820
3879
  visible: d,
@@ -3824,10 +3883,10 @@ class be extends Y {
3824
3883
  nameplate: u,
3825
3884
  nameplateEnabled: b,
3826
3885
  currentFixture: g
3827
- } = this.config, { layers: m } = re(this.config), y = m.map((v) => {
3828
- const w = v.stationSlotGroup;
3886
+ } = this.config, { layers: m } = re(this.config), y = m.map((x) => {
3887
+ const w = x.stationSlotGroup;
3829
3888
  return w ? {
3830
- layerIndex: v.index,
3889
+ layerIndex: x.index,
3831
3890
  instance: new Z(
3832
3891
  {
3833
3892
  ...w,
@@ -3839,8 +3898,8 @@ class be extends Y {
3839
3898
  this.config.rotation
3840
3899
  ).init()
3841
3900
  } : null;
3842
- }).filter((v) => v !== null);
3843
- this.slotGroups = y.map((v) => v.instance), this.slotLayerIndexes = y.map((v) => v.layerIndex), this.applyFixtureBindingVisibility(g);
3901
+ }).filter((x) => x !== null);
3902
+ this.slotGroups = y.map((x) => x.instance), this.slotLayerIndexes = y.map((x) => x.layerIndex), this.applyFixtureBindingVisibility(g);
3844
3903
  const E = new si({
3845
3904
  hitSelf: !1,
3846
3905
  className: "smallArm",
@@ -3909,14 +3968,14 @@ class be extends Y {
3909
3968
  hitSelf: !1,
3910
3969
  id: "fixturePallet",
3911
3970
  tag: "Box",
3912
- visible: g === x.WORKPIECE || g === x.AUXILIARY ? !0 : 0,
3913
- scaleX: g === x.AUXILIARY ? Nt : 1,
3914
- scaleY: g === x.AUXILIARY ? Gt : 1,
3915
- y: g === x.AUXILIARY ? Pt : 0,
3971
+ visible: g === v.WORKPIECE || g === v.AUXILIARY ? !0 : 0,
3972
+ scaleX: g === v.AUXILIARY ? Mt : 1,
3973
+ scaleY: g === v.AUXILIARY ? Nt : 1,
3974
+ y: g === v.AUXILIARY ? Gt : 0,
3916
3975
  width: 66,
3917
3976
  height: 50,
3918
- cornerRadius: g === x.AUXILIARY ? 0 : Kt,
3919
- strokeWidth: g === x.AUXILIARY ? Vt : Mt,
3977
+ cornerRadius: g === v.AUXILIARY ? 0 : Ot,
3978
+ strokeWidth: g === v.AUXILIARY ? Pt : Kt,
3920
3979
  stroke: {
3921
3980
  type: "linear",
3922
3981
  from: "left",
@@ -3934,7 +3993,7 @@ class be extends Y {
3934
3993
  hitSelf: !1,
3935
3994
  id: "fixtureTool",
3936
3995
  tag: "Box",
3937
- visible: g === x.TOOL ? !0 : 0,
3996
+ visible: g === v.TOOL ? !0 : 0,
3938
3997
  width: 30,
3939
3998
  height: 12,
3940
3999
  y: 19,
@@ -3976,7 +4035,7 @@ class be extends Y {
3976
4035
  id: "slotLayers",
3977
4036
  tag: "Box",
3978
4037
  visible: g !== "none",
3979
- children: this.slotGroups.map((v) => v.ui)
4038
+ children: this.slotGroups.map((x) => x.ui)
3980
4039
  }
3981
4040
  ]
3982
4041
  }
@@ -4074,13 +4133,13 @@ class be extends Y {
4074
4133
  offsetX: o,
4075
4134
  offsetY: n,
4076
4135
  x: a,
4077
- y: A,
4136
+ y: l,
4078
4137
  width: i,
4079
4138
  height: s,
4080
4139
  around: "center",
4081
4140
  fill: "#FF9933",
4082
4141
  cornerRadius: 10,
4083
- zIndex: l,
4142
+ zIndex: A,
4084
4143
  rotation: c,
4085
4144
  scale: h,
4086
4145
  visible: d,
@@ -4109,11 +4168,11 @@ class be extends Y {
4109
4168
  ), H(Q, this.config), j(Q), Q;
4110
4169
  }
4111
4170
  operating(e) {
4112
- if (e.light && this.light1 && this.light2 && (this.light1.operating(e.light), this.light2.operating(e.light)), e.position?.x !== void 0 && this.moveX(e.position.x), e.position?.j1 !== void 0 && this.handleRotate(e.position.j1), e.current_fixture !== void 0 && this.switchFork(e.current_fixture), e.resource) {
4171
+ if (e.light && this.light1 && this.light2 && (this.light1.operating(e.light), this.light2.operating(e.light)), e.position?.x !== void 0 && this.moveX(e.position.x, e.position.rawX), e.position?.j1 !== void 0 && this.handleRotate(e.position.j1), e.current_fixture !== void 0 && this.switchFork(e.current_fixture), e.resource) {
4113
4172
  this.handleLoadResource(e.resource.handle_type);
4114
4173
  const t = this.findGroupForResource(e.resource);
4115
4174
  if (!t) {
4116
- Ot.warn("SingleJointRobot 未找到可处理资源的工位组:", e.resource);
4175
+ Ut.warn("SingleJointRobot 未找到可处理资源的工位组:", e.resource);
4117
4176
  return;
4118
4177
  }
4119
4178
  t.operating(e.resource);
@@ -4157,34 +4216,31 @@ class be extends Y {
4157
4216
  const o = Math.abs(e / 9);
4158
4217
  s && s.offsetX !== o && (s.offsetX = o);
4159
4218
  }
4160
- moveX(e) {
4161
- Number.isFinite(e) && this.ui.x !== e && (this.ui.x = e);
4162
- }
4163
4219
  // 切换夹具(current_fixture: 'workpiece' | 'tool' | 'auxiliary' | 'none'):夹具为纯 UI 装饰,仅切换装饰与工位层容器显隐
4164
4220
  switchFork(e) {
4165
4221
  if (e === "none") {
4166
4222
  this.setPalletFixture({ visible: 0 }), this.ui.findOne("#fixtureTool")?.set({ visible: 0 }), this.ui.findOne("#slotLayers")?.set({ visible: 0 });
4167
4223
  return;
4168
4224
  }
4169
- if (!Object.values(x).includes(e)) {
4170
- Ot.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4225
+ if (!Object.values(v).includes(e)) {
4226
+ Ut.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4171
4227
  return;
4172
4228
  }
4173
4229
  this.config.currentFixture = e, this.setPalletFixture({
4174
- visible: e !== x.TOOL ? !0 : 0,
4175
- auxiliary: e === x.AUXILIARY
4176
- }), this.ui.findOne("#fixtureTool")?.set({ visible: e === x.TOOL ? !0 : 0 }), this.ui.findOne("#slotLayers")?.set({ visible: !0 }), this.applyFixtureBindingVisibility(e);
4230
+ visible: e !== v.TOOL ? !0 : 0,
4231
+ auxiliary: e === v.AUXILIARY
4232
+ }), this.ui.findOne("#fixtureTool")?.set({ visible: e === v.TOOL ? !0 : 0 }), this.ui.findOne("#slotLayers")?.set({ visible: !0 }), this.applyFixtureBindingVisibility(e);
4177
4233
  }
4178
4234
  /** 设置托盘夹具状态:辅料夹具沿用工件夹具造型,压扁 + 直角 + 描边补偿,并补偿 y 使垂直中心对齐手抓关节 */
4179
4235
  setPalletFixture(e) {
4180
4236
  const t = e.auxiliary ?? !1;
4181
4237
  this.ui.findOne("#fixturePallet")?.set({
4182
4238
  visible: e.visible,
4183
- scaleX: t ? Nt : 1,
4184
- scaleY: t ? Gt : 1,
4185
- y: t ? Pt : 0,
4186
- cornerRadius: t ? 0 : Kt,
4187
- strokeWidth: t ? Vt : Mt
4239
+ scaleX: t ? Mt : 1,
4240
+ scaleY: t ? Nt : 1,
4241
+ y: t ? Gt : 0,
4242
+ cornerRadius: t ? 0 : Ot,
4243
+ strokeWidth: t ? Pt : Kt
4188
4244
  });
4189
4245
  }
4190
4246
  // 上下料动画
@@ -4245,14 +4301,14 @@ class be extends Y {
4245
4301
  // }, 1000)
4246
4302
  // }
4247
4303
  }
4248
- const qt = P("DoubleJointRobot"), Wt = [15, 0, 0, 15], Ht = 4, Yt = 0.66, Xt = 0.5, Jt = 12.5, jt = 7;
4249
- class ve extends Y {
4304
+ const Vt = P("DoubleJointRobot"), qt = [15, 0, 0, 15], Wt = 4, Ht = 0.66, Yt = 0.5, Xt = 12.5, Jt = 7;
4305
+ class xe extends Y {
4250
4306
  static DEFAULT_WIDTH = 90;
4251
4307
  static DEFAULT_HEIGHT = 76;
4252
4308
  static DEFAULT_LIGHT_COLOR = "#424242";
4253
4309
  light1 = null;
4254
4310
  light2 = null;
4255
- defaultLightColor = ve.DEFAULT_LIGHT_COLOR;
4311
+ defaultLightColor = xe.DEFAULT_LIGHT_COLOR;
4256
4312
  /** 全部工位层工位组(一层=一组),挂载于唯一容器 #slotLayers,与夹具无关 */
4257
4313
  slotGroups = [];
4258
4314
  /** 与 slotGroups 平行的层 index(1-based),用于夹具绑定层的显隐与资源层索引映射 */
@@ -4271,13 +4327,13 @@ class ve extends Y {
4271
4327
  const {
4272
4328
  id: e,
4273
4329
  className: t,
4274
- width: i = ve.DEFAULT_WIDTH,
4275
- height: s = ve.DEFAULT_HEIGHT,
4330
+ width: i = xe.DEFAULT_WIDTH,
4331
+ height: s = xe.DEFAULT_HEIGHT,
4276
4332
  offsetX: o,
4277
4333
  offsetY: n,
4278
4334
  x: a,
4279
- y: A,
4280
- zIndex: l,
4335
+ y: l,
4336
+ zIndex: A,
4281
4337
  rotation: c,
4282
4338
  scale: h,
4283
4339
  visible: d,
@@ -4287,10 +4343,10 @@ class ve extends Y {
4287
4343
  nameplate: u,
4288
4344
  nameplateEnabled: b,
4289
4345
  currentFixture: g
4290
- } = this.config, { layers: m } = re(this.config), y = m.map((v) => {
4291
- const w = v.stationSlotGroup;
4346
+ } = this.config, { layers: m } = re(this.config), y = m.map((x) => {
4347
+ const w = x.stationSlotGroup;
4292
4348
  return w ? {
4293
- layerIndex: v.index,
4349
+ layerIndex: x.index,
4294
4350
  instance: new Z(
4295
4351
  {
4296
4352
  ...w,
@@ -4302,8 +4358,8 @@ class ve extends Y {
4302
4358
  this.config.rotation
4303
4359
  ).init()
4304
4360
  } : null;
4305
- }).filter((v) => v !== null);
4306
- this.slotGroups = y.map((v) => v.instance), this.slotLayerIndexes = y.map((v) => v.layerIndex), this.applyFixtureBindingVisibility(g);
4361
+ }).filter((x) => x !== null);
4362
+ this.slotGroups = y.map((x) => x.instance), this.slotLayerIndexes = y.map((x) => x.layerIndex), this.applyFixtureBindingVisibility(g);
4307
4363
  const E = new si({
4308
4364
  hitSelf: !1,
4309
4365
  className: "smallArm",
@@ -4374,14 +4430,14 @@ class ve extends Y {
4374
4430
  hitSelf: !1,
4375
4431
  id: "fixturePallet",
4376
4432
  tag: "Box",
4377
- visible: g === x.WORKPIECE || g === x.AUXILIARY ? !0 : 0,
4378
- scaleX: g === x.AUXILIARY ? Yt : 1,
4379
- scaleY: g === x.AUXILIARY ? Xt : 1,
4380
- y: g === x.AUXILIARY ? Jt : 0,
4433
+ visible: g === v.WORKPIECE || g === v.AUXILIARY ? !0 : 0,
4434
+ scaleX: g === v.AUXILIARY ? Ht : 1,
4435
+ scaleY: g === v.AUXILIARY ? Yt : 1,
4436
+ y: g === v.AUXILIARY ? Xt : 0,
4381
4437
  width: 66,
4382
4438
  height: 50,
4383
- cornerRadius: g === x.AUXILIARY ? 0 : Wt,
4384
- strokeWidth: g === x.AUXILIARY ? jt : Ht,
4439
+ cornerRadius: g === v.AUXILIARY ? 0 : qt,
4440
+ strokeWidth: g === v.AUXILIARY ? Jt : Wt,
4385
4441
  stroke: {
4386
4442
  type: "linear",
4387
4443
  from: "left",
@@ -4399,7 +4455,7 @@ class ve extends Y {
4399
4455
  hitSelf: !1,
4400
4456
  id: "fixtureTool",
4401
4457
  tag: "Box",
4402
- visible: g === x.TOOL ? !0 : 0,
4458
+ visible: g === v.TOOL ? !0 : 0,
4403
4459
  width: 30,
4404
4460
  height: 12,
4405
4461
  y: 19,
@@ -4441,7 +4497,7 @@ class ve extends Y {
4441
4497
  id: "slotLayers",
4442
4498
  tag: "Box",
4443
4499
  visible: g !== "none",
4444
- children: this.slotGroups.map((v) => v.ui)
4500
+ children: this.slotGroups.map((x) => x.ui)
4445
4501
  }
4446
4502
  ]
4447
4503
  }
@@ -4545,13 +4601,13 @@ class ve extends Y {
4545
4601
  offsetX: o,
4546
4602
  offsetY: n,
4547
4603
  x: a,
4548
- y: A,
4604
+ y: l,
4549
4605
  width: i,
4550
4606
  height: s,
4551
4607
  around: "center",
4552
4608
  fill: "#FF9933",
4553
4609
  cornerRadius: 10,
4554
- zIndex: l,
4610
+ zIndex: A,
4555
4611
  rotation: c,
4556
4612
  scale: h,
4557
4613
  visible: d,
@@ -4580,11 +4636,11 @@ class ve extends Y {
4580
4636
  ), H(Q, this.config), j(Q), Q;
4581
4637
  }
4582
4638
  operating(e) {
4583
- if (e.light && this.light1 && this.light2 && (this.light1.operating(e.light), this.light2.operating(e.light)), e.position?.x !== void 0 && this.moveX(e.position.x), e.position?.j1 !== void 0 && this.handleRotateR1(e.position.j1), e.position?.j2 !== void 0 && this.handleRotateR2(e.position.j2), e.current_fixture !== void 0 && this.switchFork(e.current_fixture), e.resource) {
4639
+ if (e.light && this.light1 && this.light2 && (this.light1.operating(e.light), this.light2.operating(e.light)), e.position?.x !== void 0 && this.moveX(e.position.x, e.position.rawX), e.position?.j1 !== void 0 && this.handleRotateR1(e.position.j1), e.position?.j2 !== void 0 && this.handleRotateR2(e.position.j2), e.current_fixture !== void 0 && this.switchFork(e.current_fixture), e.resource) {
4584
4640
  this.handleLoadResource(e.resource.handle_type);
4585
4641
  const t = this.findGroupForResource(e.resource);
4586
4642
  if (!t) {
4587
- qt.warn("DoubleJointRobot 未找到可处理资源的工位组:", e.resource);
4643
+ Vt.warn("DoubleJointRobot 未找到可处理资源的工位组:", e.resource);
4588
4644
  return;
4589
4645
  }
4590
4646
  t.operating(e.resource);
@@ -4630,34 +4686,31 @@ class ve extends Y {
4630
4686
  const t = this.ui.findOne(".smallArm");
4631
4687
  t && t.rotation !== e && (t.rotation = e);
4632
4688
  }
4633
- moveX(e) {
4634
- Number.isFinite(e) && this.ui.x !== e && (this.ui.x = e);
4635
- }
4636
4689
  // 切换夹具(current_fixture: 'workpiece' | 'tool' | 'auxiliary' | 'none'):夹具为纯 UI 装饰,仅切换装饰与工位层容器显隐
4637
4690
  switchFork(e) {
4638
4691
  if (e === "none") {
4639
4692
  this.setPalletFixture({ visible: 0 }), this.ui.findOne("#fixtureTool")?.set({ visible: 0 }), this.ui.findOne("#slotLayers")?.set({ visible: 0 });
4640
4693
  return;
4641
4694
  }
4642
- if (!Object.values(x).includes(e)) {
4643
- qt.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4695
+ if (!Object.values(v).includes(e)) {
4696
+ Vt.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4644
4697
  return;
4645
4698
  }
4646
4699
  this.config.currentFixture = e, this.setPalletFixture({
4647
- visible: e !== x.TOOL ? !0 : 0,
4648
- auxiliary: e === x.AUXILIARY
4649
- }), this.ui.findOne("#fixtureTool")?.set({ visible: e === x.TOOL ? !0 : 0 }), this.ui.findOne("#slotLayers")?.set({ visible: !0 }), this.applyFixtureBindingVisibility(e);
4700
+ visible: e !== v.TOOL ? !0 : 0,
4701
+ auxiliary: e === v.AUXILIARY
4702
+ }), this.ui.findOne("#fixtureTool")?.set({ visible: e === v.TOOL ? !0 : 0 }), this.ui.findOne("#slotLayers")?.set({ visible: !0 }), this.applyFixtureBindingVisibility(e);
4650
4703
  }
4651
4704
  /** 设置托盘夹具状态:辅料夹具沿用工件夹具造型,压扁 + 直角 + 描边补偿,并补偿 y 使垂直中心对齐手抓关节 */
4652
4705
  setPalletFixture(e) {
4653
4706
  const t = e.auxiliary ?? !1;
4654
4707
  this.ui.findOne("#fixturePallet")?.set({
4655
4708
  visible: e.visible,
4656
- scaleX: t ? Yt : 1,
4657
- scaleY: t ? Xt : 1,
4658
- y: t ? Jt : 0,
4659
- cornerRadius: t ? 0 : Wt,
4660
- strokeWidth: t ? jt : Ht
4709
+ scaleX: t ? Ht : 1,
4710
+ scaleY: t ? Yt : 1,
4711
+ y: t ? Xt : 0,
4712
+ cornerRadius: t ? 0 : qt,
4713
+ strokeWidth: t ? Jt : Wt
4661
4714
  });
4662
4715
  }
4663
4716
  // 上下料动画
@@ -4719,27 +4772,27 @@ class ve extends Y {
4719
4772
  // }, 1000)
4720
4773
  // }
4721
4774
  }
4722
- const $e = P("Rgv");
4723
- class xe extends Y {
4775
+ const Ze = P("Rgv");
4776
+ class ve extends Y {
4724
4777
  static DEFAULT_WIDTH = 90;
4725
4778
  static DEFAULT_HEIGHT = 120;
4726
4779
  static DEFAULT_LIGHT_COLOR = "#424242";
4727
4780
  light1 = null;
4728
4781
  light2 = null;
4729
- defaultLightColor = xe.DEFAULT_LIGHT_COLOR;
4782
+ defaultLightColor = ve.DEFAULT_LIGHT_COLOR;
4730
4783
  /** 全部工位层工位组(一层=一组),挂载于唯一容器 #slotLayers,不区分托盘/刀具工位组 */
4731
4784
  slotGroups = [];
4732
4785
  createUi() {
4733
4786
  const {
4734
4787
  id: e,
4735
4788
  className: t,
4736
- width: i = xe.DEFAULT_WIDTH,
4737
- height: s = xe.DEFAULT_HEIGHT,
4789
+ width: i = ve.DEFAULT_WIDTH,
4790
+ height: s = ve.DEFAULT_HEIGHT,
4738
4791
  offsetX: o,
4739
4792
  offsetY: n,
4740
4793
  x: a,
4741
- y: A,
4742
- zIndex: l,
4794
+ y: l,
4795
+ zIndex: A,
4743
4796
  rotation: c,
4744
4797
  scale: h,
4745
4798
  visible: d,
@@ -4749,8 +4802,8 @@ class xe extends Y {
4749
4802
  nameplate: u,
4750
4803
  nameplateEnabled: b
4751
4804
  } = this.config, g = s * 0.6, m = s * 0.7, y = i - 40, { layers: E } = re(this.config);
4752
- this.slotGroups = E.map((v) => {
4753
- const w = v.stationSlotGroup;
4805
+ this.slotGroups = E.map((x) => {
4806
+ const w = x.stationSlotGroup;
4754
4807
  return w ? new Z(
4755
4808
  {
4756
4809
  ...w,
@@ -4762,7 +4815,7 @@ class xe extends Y {
4762
4815
  },
4763
4816
  this.config.rotation
4764
4817
  ).init() : null;
4765
- }).filter((v) => v !== null), f !== !1 && (this.light1 = new J({
4818
+ }).filter((x) => x !== null), f !== !1 && (this.light1 = new J({
4766
4819
  width: g * 0.5,
4767
4820
  height: 4,
4768
4821
  x: 11.5,
@@ -4857,7 +4910,7 @@ class xe extends Y {
4857
4910
  }
4858
4911
  ],
4859
4912
  children: [
4860
- Ae({
4913
+ le({
4861
4914
  className: "ResourceStoreTexture",
4862
4915
  width: y,
4863
4916
  height: this.height_05,
@@ -4873,7 +4926,7 @@ class xe extends Y {
4873
4926
  hitSelf: !1,
4874
4927
  id: "slotLayers",
4875
4928
  tag: "Box",
4876
- children: this.slotGroups.map((v) => v.ui)
4929
+ children: this.slotGroups.map((x) => x.ui)
4877
4930
  }
4878
4931
  ]
4879
4932
  }
@@ -4930,13 +4983,13 @@ class xe extends Y {
4930
4983
  offsetX: o,
4931
4984
  offsetY: n,
4932
4985
  x: a,
4933
- y: A,
4986
+ y: l,
4934
4987
  width: i,
4935
4988
  height: s,
4936
4989
  flowAlign: "center",
4937
4990
  around: "center",
4938
4991
  fill: "rgba(0,0,0,0)",
4939
- zIndex: l,
4992
+ zIndex: A,
4940
4993
  rotation: c,
4941
4994
  scale: h,
4942
4995
  visible: d,
@@ -5088,10 +5141,10 @@ class xe extends Y {
5088
5141
  ), Q;
5089
5142
  }
5090
5143
  operating(e) {
5091
- if (e.light && this.light1 && this.light2 && (this.light1.operating(e.light), this.light2.operating(e.light)), e.position?.x !== void 0 && this.moveX(e.position.x), e.position?.j1 !== void 0 && this.handleRotate(e.position.j1), e.position?.fork_xy !== void 0 && this.handleForkMove(e.position.fork_xy), e.position?.fork_z !== void 0 && this.handleForkMoveUpDown(e.position.fork_z), e.resource) {
5144
+ if (e.light && this.light1 && this.light2 && (this.light1.operating(e.light), this.light2.operating(e.light)), e.position?.x !== void 0 && this.moveX(e.position.x, e.position.rawX), e.position?.j1 !== void 0 && this.handleRotate(e.position.j1), e.position?.fork_xy !== void 0 && this.handleForkMove(e.position.fork_xy), e.position?.fork_z !== void 0 && this.handleForkMoveUpDown(e.position.fork_z), e.resource) {
5092
5145
  const t = this.findGroupForResource(e.resource);
5093
5146
  if (!t) {
5094
- $e.warn("Rgv 未找到可处理资源的工位组:", e.resource);
5147
+ Ze.warn("Rgv 未找到可处理资源的工位组:", e.resource);
5095
5148
  return;
5096
5149
  }
5097
5150
  t.operating(e.resource);
@@ -5117,17 +5170,13 @@ class xe extends Y {
5117
5170
  const t = this.ui.findOne("#rgv_main");
5118
5171
  t && t.rotation !== e && (t.rotation = e);
5119
5172
  }
5120
- // RGV 整体移动
5121
- moveX(e) {
5122
- Number.isFinite(e) && this.ui.x !== e && (this.ui.x = e);
5123
- }
5124
5173
  /**
5125
5174
  * forks 前后移动(直接赋值,高频移动不走动画)
5126
5175
  * @param percent 移动比例,[-1,1]
5127
5176
  */
5128
5177
  handleForkMove(e) {
5129
5178
  if (!Number.isFinite(e)) {
5130
- $e.warn("Rgv handleForkMove failed: percent is not finite");
5179
+ Ze.warn("Rgv handleForkMove failed: percent is not finite");
5131
5180
  return;
5132
5181
  }
5133
5182
  this.ui.findOne("#rgv_fork")?.set({ y: e * this.height_05 }), this.ui.findOne("#rgv_fork_pallet")?.set({ offsetY: e * this.height_02 });
@@ -5138,7 +5187,7 @@ class xe extends Y {
5138
5187
  */
5139
5188
  handleForkMoveUpDown(e) {
5140
5189
  if (!Number.isFinite(e)) {
5141
- $e.warn("Rgv handleForkMoveUpDown failed: percent is not finite");
5190
+ Ze.warn("Rgv handleForkMoveUpDown failed: percent is not finite");
5142
5191
  return;
5143
5192
  }
5144
5193
  this.ui.findOne("#rgv_fork_pallet")?.set({
@@ -5185,8 +5234,8 @@ class xe extends Y {
5185
5234
  // }, 1000)
5186
5235
  // }
5187
5236
  }
5188
- const $s = P("ResourceStore");
5189
- class Me extends Y {
5237
+ const so = P("ResourceStore");
5238
+ class Ke extends Y {
5190
5239
  static CORNER_RADIUS = [20, 20, 4, 4];
5191
5240
  light = null;
5192
5241
  /** 按层顺序保存的工位组实例(下标对应层序) */
@@ -5200,8 +5249,8 @@ class Me extends Y {
5200
5249
  lightEnabled: o,
5201
5250
  flowOptions: n,
5202
5251
  hideBounds: a,
5203
- width: A,
5204
- height: l,
5252
+ width: l,
5253
+ height: A,
5205
5254
  offsetX: c,
5206
5255
  offsetY: h,
5207
5256
  x: d,
@@ -5224,7 +5273,7 @@ class Me extends Y {
5224
5273
  strokeWidth: a === !1 ? 1 : 0
5225
5274
  }), T = () => {
5226
5275
  const w = B.width ?? 0, F = B.height ?? 0;
5227
- w <= 0 || F <= 0 || (B.x = (A - w) / 2, B.y = (l - F) / 2);
5276
+ w <= 0 || F <= 0 || (B.x = (l - w) / 2, B.y = (A - F) / 2);
5228
5277
  };
5229
5278
  T(), B.on("resize", T);
5230
5279
  const { layers: Q } = re(this.config);
@@ -5245,7 +5294,7 @@ class Me extends Y {
5245
5294
  y: 14,
5246
5295
  color: "#2D313B"
5247
5296
  }).init());
5248
- const v = new I({
5297
+ const x = new I({
5249
5298
  data: this.config,
5250
5299
  id: e,
5251
5300
  className: t,
@@ -5253,8 +5302,8 @@ class Me extends Y {
5253
5302
  offsetY: h,
5254
5303
  x: d,
5255
5304
  y: C,
5256
- width: A,
5257
- height: l,
5305
+ width: l,
5306
+ height: A,
5258
5307
  zIndex: p,
5259
5308
  rotation: f,
5260
5309
  scale: u,
@@ -5263,7 +5312,7 @@ class Me extends Y {
5263
5312
  draggable: m,
5264
5313
  origin: "center",
5265
5314
  around: "center",
5266
- cornerRadius: Me.CORNER_RADIUS,
5315
+ cornerRadius: Ke.CORNER_RADIUS,
5267
5316
  fill: {
5268
5317
  type: "linear",
5269
5318
  from: "left",
@@ -5277,27 +5326,27 @@ class Me extends Y {
5277
5326
  },
5278
5327
  overflow: "hide",
5279
5328
  children: [
5280
- Ae({
5329
+ le({
5281
5330
  className: "ResourceStoreTexture",
5282
- width: A,
5283
- height: l,
5331
+ width: l,
5332
+ height: A,
5284
5333
  effect: "MatrixGrid",
5285
5334
  scale: 0.015,
5286
5335
  opacity: 0.2,
5287
- cornerRadius: Me.CORNER_RADIUS
5336
+ cornerRadius: Ke.CORNER_RADIUS
5288
5337
  }),
5289
5338
  ...this.light ? [this.light.ui] : [],
5290
5339
  B
5291
5340
  ]
5292
5341
  });
5293
- return s !== !1 && v.add(
5342
+ return s !== !1 && x.add(
5294
5343
  z({
5295
5344
  title: i || "",
5296
5345
  x: this.width_05,
5297
- y: l - 10,
5346
+ y: A - 10,
5298
5347
  height: 20
5299
5348
  })
5300
- ), H(v, this.config), j(v), v;
5349
+ ), H(x, this.config), j(x), x;
5301
5350
  }
5302
5351
  /**
5303
5352
  * 判断本资源库是否包含指定工位号
@@ -5314,17 +5363,14 @@ class Me extends Y {
5314
5363
  (s) => s.config.stationSlots?.some((o) => o.index === e.device_station)
5315
5364
  );
5316
5365
  if (t) return t;
5317
- const i = e.resource_type === x.TOOL ? 1 : 0;
5366
+ const i = e.resource_type === v.TOOL ? 1 : 0;
5318
5367
  return this.stationSlotGroups[i];
5319
5368
  }
5320
- moveX(e) {
5321
- Number.isFinite(e) && this.ui.x !== e && (this.ui.x = e);
5322
- }
5323
5369
  // 操作
5324
5370
  operating(e) {
5325
- if (e.position?.x !== void 0 && this.moveX(e.position.x), e.light && this.light && this.light.operating(e.light), e.resource) {
5371
+ if (e.position?.x !== void 0 && this.moveX(e.position.x, e.position.rawX), e.light && this.light && this.light.operating(e.light), e.resource) {
5326
5372
  const t = this.findGroupForResource(e.resource);
5327
- t ? t.operating(e.resource) : $s.warn(
5373
+ t ? t.operating(e.resource) : so.warn(
5328
5374
  `ResourceStore 没有匹配到承载资源(device_station=${e.resource.device_station})的工位组,无法操作`
5329
5375
  );
5330
5376
  }
@@ -5333,7 +5379,7 @@ class Me extends Y {
5333
5379
  return this.stationSlotGroups;
5334
5380
  }
5335
5381
  }
5336
- const zt = P("Pallet");
5382
+ const jt = P("Pallet");
5337
5383
  class pe extends Y {
5338
5384
  static CORNER_RADIUS = 0;
5339
5385
  static LAYER_PADDING = 0;
@@ -5349,9 +5395,9 @@ class pe extends Y {
5349
5395
  }
5350
5396
  // 构建多层工位组容器(参考 ShuttleStation.buildLayers:纵向均分内腔,工位组水平垂直居中)
5351
5397
  buildLayers(e, t, i) {
5352
- const s = pe.LAYER_PADDING, o = pe.LAYER_GAP, n = s, l = (t - s - n - o * (i.length - 1)) / i.length, c = [];
5398
+ const s = pe.LAYER_PADDING, o = pe.LAYER_GAP, n = s, A = (t - s - n - o * (i.length - 1)) / i.length, c = [];
5353
5399
  return i.forEach((h, d) => {
5354
- const C = n + d * (l + o), p = new I({
5400
+ const C = n + d * (A + o), p = new I({
5355
5401
  // 层容器可命中自身(不可设 hitSelf: false):overflow hidden 的裁剪 Box 在 Leafer pick 时
5356
5402
  // 要求自身先命中(__clipAfterFill),hitSelf: false 会导致整棵子树(工位槽)无法被命中测试。
5357
5403
  // 挂载模型 config 使点击层内空白区时 data 与点击主体一致(均为托盘信息)
@@ -5360,7 +5406,7 @@ class pe extends Y {
5360
5406
  x: s,
5361
5407
  y: C,
5362
5408
  width: e - s * 2,
5363
- height: l,
5409
+ height: A,
5364
5410
  fill: "transparent",
5365
5411
  // stroke: 'rgba(255, 255, 255, 0.5)',
5366
5412
  // strokeWidth: 0,
@@ -5371,7 +5417,7 @@ class pe extends Y {
5371
5417
  around: "center",
5372
5418
  origin: "center",
5373
5419
  x: (e - s * 2) / 2,
5374
- y: l / 2,
5420
+ y: A / 2,
5375
5421
  hittable: this.config.hittable,
5376
5422
  // 工位(BaseAbs 构造函数会对 config 整体 cloneDeep,无需此处浅拷贝)
5377
5423
  stationSlots: h.stationSlotGroup.stationSlots || []
@@ -5391,8 +5437,8 @@ class pe extends Y {
5391
5437
  lightEnabled: o,
5392
5438
  backgroundColor: n = "#29a6ff",
5393
5439
  width: a,
5394
- height: A,
5395
- offsetX: l,
5440
+ height: l,
5441
+ offsetX: A,
5396
5442
  offsetY: c,
5397
5443
  x: h,
5398
5444
  y: d,
@@ -5404,17 +5450,17 @@ class pe extends Y {
5404
5450
  draggable: g
5405
5451
  } = this.config, m = [
5406
5452
  // 主体背景纹理(参考 ShuttleStation.layerContainer),格子纹皮肤
5407
- Ae({
5453
+ le({
5408
5454
  className: "PalletTexture",
5409
5455
  width: a,
5410
- height: A,
5456
+ height: l,
5411
5457
  effect: "MatrixGrid",
5412
5458
  scale: 0.05,
5413
5459
  opacity: 0.3,
5414
5460
  cornerRadius: pe.CORNER_RADIUS
5415
5461
  })
5416
5462
  ], y = this.resolveLayers();
5417
- y.length > 0 && m.push(...this.buildLayers(a, A, y)), o !== !1 && (this.light = new J({
5463
+ y.length > 0 && m.push(...this.buildLayers(a, l, y)), o !== !1 && (this.light = new J({
5418
5464
  width: Math.min(40, a * 0.5),
5419
5465
  height: 6,
5420
5466
  x: this.width_05,
@@ -5425,12 +5471,12 @@ class pe extends Y {
5425
5471
  data: this.config,
5426
5472
  id: e,
5427
5473
  className: t,
5428
- offsetX: l,
5474
+ offsetX: A,
5429
5475
  offsetY: c,
5430
5476
  x: h,
5431
5477
  y: d,
5432
5478
  width: a,
5433
- height: A,
5479
+ height: l,
5434
5480
  zIndex: C,
5435
5481
  rotation: p,
5436
5482
  scale: f,
@@ -5448,20 +5494,17 @@ class pe extends Y {
5448
5494
  z({
5449
5495
  title: i || "",
5450
5496
  x: this.width_05,
5451
- y: A - 14,
5497
+ y: l - 14,
5452
5498
  height: 20
5453
5499
  })
5454
5500
  ), H(E, this.config), j(E), E;
5455
5501
  }
5456
- moveX(e) {
5457
- Number.isFinite(e) && this.ui.x !== e && (this.ui.x = e);
5458
- }
5459
5502
  moveY(e) {
5460
5503
  Number.isFinite(e) && this.ui.y !== e && (this.ui.y = e);
5461
5504
  }
5462
5505
  // 操作
5463
5506
  operating(e) {
5464
- e.position?.x !== void 0 && this.moveX(e.position.x), e.position?.y !== void 0 && this.moveY(e.position.y), e.light && this.light && this.light.operating(e.light), e.resource && this.handleResourceOperating(e.resource);
5507
+ e.position?.x !== void 0 && this.moveX(e.position.x, e.position.rawX), e.position?.y !== void 0 && this.moveY(e.position.y), e.light && this.light && this.light.operating(e.light), e.resource && this.handleResourceOperating(e.resource);
5465
5508
  }
5466
5509
  /** 资源增删:data.resource 提供 device_layer(>0) 时定位到该层;缺省时默认识别为第一层 */
5467
5510
  handleResourceOperating(e) {
@@ -5471,7 +5514,7 @@ class pe extends Y {
5471
5514
  i.operating(e);
5472
5515
  return;
5473
5516
  }
5474
- zt.warn(`通用托盘资源操作失败:未找到 index=${e.device_layer} 的层`);
5517
+ jt.warn(`通用托盘资源操作失败:未找到 index=${e.device_layer} 的层`);
5475
5518
  return;
5476
5519
  }
5477
5520
  const t = this.layerGroups.get(1);
@@ -5479,7 +5522,7 @@ class pe extends Y {
5479
5522
  t.operating(e);
5480
5523
  return;
5481
5524
  }
5482
- zt.warn("通用托盘资源操作失败:未配置第一层工位组");
5525
+ jt.warn("通用托盘资源操作失败:未配置第一层工位组");
5483
5526
  }
5484
5527
  /**
5485
5528
  * 判断本托盘是否包含指定工位号
@@ -5527,7 +5570,7 @@ class pe extends Y {
5527
5570
  super.emitTap(e);
5528
5571
  }
5529
5572
  }
5530
- const eo = P("ResourceOperationWindow");
5573
+ const oo = P("ResourceOperationWindow");
5531
5574
  class ee extends Y {
5532
5575
  static DEFAULT_RING_THICKNESS = 10;
5533
5576
  static LIGHT_Y_OFFSET = 6;
@@ -5562,8 +5605,8 @@ class ee extends Y {
5562
5605
  height: o,
5563
5606
  x: n,
5564
5607
  y: a,
5565
- offsetX: A,
5566
- offsetY: l,
5608
+ offsetX: l,
5609
+ offsetY: A,
5567
5610
  zIndex: c,
5568
5611
  rotation: h,
5569
5612
  scale: d,
@@ -5606,7 +5649,7 @@ class ee extends Y {
5606
5649
  strokeWidth: 1,
5607
5650
  overflow: "hidden",
5608
5651
  children: [
5609
- Ae({
5652
+ le({
5610
5653
  className: "CavityTexture",
5611
5654
  width: s - E * 2,
5612
5655
  height: o - E * 2,
@@ -5615,7 +5658,7 @@ class ee extends Y {
5615
5658
  scale: 0.015
5616
5659
  })
5617
5660
  ]
5618
- }), v = [B, T, Q];
5661
+ }), x = [B, T, Q];
5619
5662
  y && (this.stationSlotGroup = new Z(
5620
5663
  {
5621
5664
  ...y,
@@ -5635,7 +5678,7 @@ class ee extends Y {
5635
5678
  strokeColor: "#333",
5636
5679
  strokeWidth: 0.5,
5637
5680
  cornerRadius: ee.LIGHT_CORNER_RADIUS
5638
- }).init(), v.push(this.light.ui)), b !== !1 && v.push(
5681
+ }).init(), x.push(this.light.ui)), b !== !1 && x.push(
5639
5682
  z({
5640
5683
  title: i || "",
5641
5684
  x: s / 2,
@@ -5648,8 +5691,8 @@ class ee extends Y {
5648
5691
  className: t,
5649
5692
  x: n,
5650
5693
  y: a,
5651
- offsetX: A,
5652
- offsetY: l,
5694
+ offsetX: l,
5695
+ offsetY: A,
5653
5696
  width: s,
5654
5697
  height: o,
5655
5698
  zIndex: c,
@@ -5661,7 +5704,7 @@ class ee extends Y {
5661
5704
  origin: "center",
5662
5705
  around: "center",
5663
5706
  fill: "rgba(0,0,0,0)",
5664
- children: v
5707
+ children: x
5665
5708
  });
5666
5709
  return H(w, this.config), w;
5667
5710
  }
@@ -5669,7 +5712,7 @@ class ee extends Y {
5669
5712
  operating(e) {
5670
5713
  if (e.light && this.light && this.light.operating(e.light), e.resource) {
5671
5714
  if (!this.stationSlotGroup) {
5672
- eo.warn("资源操作窗口未配置 stationSlotGroup,无法操作托盘资源");
5715
+ oo.warn("资源操作窗口未配置 stationSlotGroup,无法操作托盘资源");
5673
5716
  return;
5674
5717
  }
5675
5718
  this.stationSlotGroup.operating(e.resource);
@@ -5685,45 +5728,45 @@ class ee extends Y {
5685
5728
  return this.stationSlotGroup ? [this.stationSlotGroup] : [];
5686
5729
  }
5687
5730
  }
5688
- const to = {
5689
- [D.MACHINE_TOOL]: Oe,
5690
- [D.LOADING_STATION]: Ke,
5691
- [D.SHUTTLE_STATION]: k,
5731
+ const ro = {
5732
+ [D.MACHINE_TOOL]: Ue,
5733
+ [D.LOADING_STATION]: Oe,
5734
+ [D.SHUTTLE_STATION]: R,
5692
5735
  [D.MATERIAL_TRACK]: V,
5693
- [D.MARKING_MACHINE]: wt,
5694
- [D.CLEANING_MACHINE]: Zs,
5736
+ [D.MARKING_MACHINE]: pt,
5737
+ [D.CLEANING_MACHINE]: io,
5695
5738
  [D.SINGLE_JOINT_ROBOT]: be,
5696
- [D.DOUBLE_JOINT_ROBOT]: ve,
5697
- [D.RGV]: xe,
5698
- [D.RAIL]: ft,
5699
- [D.RESOURCE_STORE]: Me,
5739
+ [D.DOUBLE_JOINT_ROBOT]: xe,
5740
+ [D.RGV]: ve,
5741
+ [D.RAIL]: dt,
5742
+ [D.RESOURCE_STORE]: Ke,
5700
5743
  [D.PALLET]: pe,
5701
5744
  [D.RESOURCE_OPERATION_WINDOW]: ee
5702
5745
  };
5703
- function io(r) {
5704
- const e = to[r.className];
5746
+ function no(r) {
5747
+ const e = ro[r.className];
5705
5748
  if (!e)
5706
5749
  throw new Error(`Unsupported model className: ${r.className}`);
5707
5750
  return new e(r);
5708
5751
  }
5709
- const U = P("AppController"), so = {
5710
- LightGrid: mi,
5711
- DarkGrid: yi,
5712
- MatrixGrid: Ei,
5713
- LightDot: Bi,
5714
- DarkDot: Si,
5715
- WoodFloor: bi
5716
- }, Zt = {
5752
+ const U = P("AppController"), ao = {
5753
+ LightGrid: Ei,
5754
+ DarkGrid: Bi,
5755
+ MatrixGrid: Si,
5756
+ LightDot: bi,
5757
+ DarkDot: xi,
5758
+ WoodFloor: vi
5759
+ }, zt = {
5717
5760
  width: window.innerWidth,
5718
5761
  height: window.innerHeight,
5719
5762
  fill: void 0,
5720
5763
  zoomType: "fit"
5721
- }, $t = {
5764
+ }, Zt = {
5722
5765
  critical: "#E83B30",
5723
5766
  warning: "#E6A23C",
5724
5767
  info: "#409EFF"
5725
5768
  };
5726
- class xi {
5769
+ class Fi {
5727
5770
  app;
5728
5771
  treeBoxUI = null;
5729
5772
  // 主容器
@@ -5765,9 +5808,9 @@ class xi {
5765
5808
  hideSceneFill: o = !1,
5766
5809
  autoStart: n = !0,
5767
5810
  appEditable: a = !1,
5768
- actions: A = {}
5811
+ actions: l = {}
5769
5812
  } = e;
5770
- this.hideSceneFill = o, this.appEditable = a, this.actions = i ? A : {}, this.app = new Gi({
5813
+ this.hideSceneFill = o, this.appEditable = a, this.actions = i ? l : {}, this.app = new Vi({
5771
5814
  view: t || window,
5772
5815
  start: n,
5773
5816
  ground: {},
@@ -5779,15 +5822,15 @@ class xi {
5779
5822
  preventDefault: !0,
5780
5823
  preventDefaultMenu: !0
5781
5824
  }
5782
- }), this.app.on(Pi.READY, () => {
5825
+ }), this.app.on(qi.READY, () => {
5783
5826
  U.log("Leafer 引擎 READY");
5784
5827
  });
5785
- const l = new I({
5786
- ...Zt,
5828
+ const A = new I({
5829
+ ...zt,
5787
5830
  id: "treeBoxUI",
5788
5831
  stroke: a ? { type: "solid", color: "rgb(242, 195, 79)" } : null
5789
5832
  });
5790
- this.treeBoxUI = l, this.app.tree.add(l), this.modelsMap = /* @__PURE__ */ new Map(), this.businessMap = /* @__PURE__ */ new Map(), this.palletLinks = /* @__PURE__ */ new Map(), this.pendingPalletLinks = /* @__PURE__ */ new Map(), this.syncingPallets = !1, this.setZoom();
5833
+ this.treeBoxUI = A, this.app.tree.add(A), this.modelsMap = /* @__PURE__ */ new Map(), this.businessMap = /* @__PURE__ */ new Map(), this.palletLinks = /* @__PURE__ */ new Map(), this.pendingPalletLinks = /* @__PURE__ */ new Map(), this.syncingPallets = !1, this.setZoom();
5791
5834
  }
5792
5835
  // 启动/重启引擎
5793
5836
  start() {
@@ -5810,28 +5853,28 @@ class xi {
5810
5853
  // 修改 tree 配置,不传参数则重置为默认配置
5811
5854
  setTree(e) {
5812
5855
  if (e) {
5813
- const t = e.texture ? so[e.texture] : void 0, i = e.fillVisible !== !1, s = e.textureOpacity ?? 1, o = e.textureSize, n = (a) => {
5814
- let A;
5815
- const l = a ? { type: "image", url: a, mode: "repeat", opacity: s } : void 0;
5816
- l && i ? A = [e.fill, l] : l ? A = l : i ? A = e.fill : A = void 0, this.treeBoxUI?.set({
5856
+ const t = e.texture ? ao[e.texture] : void 0, i = e.fillVisible !== !1, s = e.textureOpacity ?? 1, o = e.textureSize, n = (a) => {
5857
+ let l;
5858
+ const A = a ? { type: "image", url: a, mode: "repeat", opacity: s } : void 0;
5859
+ A && i ? l = [e.fill, A] : A ? l = A : i ? l = e.fill : l = void 0, this.treeBoxUI?.set({
5817
5860
  width: e.width,
5818
5861
  height: e.height,
5819
- fill: this.hideSceneFill ? "" : A
5862
+ fill: this.hideSceneFill ? "" : l
5820
5863
  });
5821
5864
  };
5822
5865
  if (t && o && o > 0) {
5823
5866
  const a = new Image();
5824
5867
  a.onload = () => {
5825
- const A = document.createElement("canvas");
5826
- A.width = o, A.height = o;
5827
- const l = A.getContext("2d");
5828
- l ? (l.drawImage(a, 0, 0, o, o), n(A.toDataURL())) : n(t);
5868
+ const l = document.createElement("canvas");
5869
+ l.width = o, l.height = o;
5870
+ const A = l.getContext("2d");
5871
+ A ? (A.drawImage(a, 0, 0, o, o), n(l.toDataURL())) : n(t);
5829
5872
  }, a.onerror = () => n(t), a.src = t;
5830
5873
  } else
5831
5874
  n(t);
5832
5875
  this.setZoom(e.zoomType);
5833
5876
  } else
5834
- U.log("setTree 重置为默认配置"), this.setTree(Zt), this.setZoom();
5877
+ U.log("setTree 重置为默认配置"), this.setTree(zt), this.setZoom();
5835
5878
  }
5836
5879
  // tree 层查找元素,返回数组
5837
5880
  findAll(e) {
@@ -5930,7 +5973,7 @@ class xi {
5930
5973
  }
5931
5974
  // 根据类型和配置添加模型
5932
5975
  addModel(e) {
5933
- const t = io(e);
5976
+ const t = no(e);
5934
5977
  t.appController = this, this.actions && t.init().setEventHandler({
5935
5978
  onTap: (o, n) => {
5936
5979
  this.actions.onTap?.(o, n);
@@ -5990,8 +6033,8 @@ class xi {
5990
6033
  let o;
5991
6034
  return i.length === 1 || typeof s != "number" ? o = i : o = i.filter((n) => n.containsStationIndex(s)), o.length === 0 ? (U.warn("模型操作失败: 未匹配到工位号 %s, key=%s", s, t), !1) : (o.forEach((n) => {
5992
6035
  if (n.handleOperation(e), !this.syncingPallets) {
5993
- const a = e.position, A = a?.x, l = a?.y;
5994
- (typeof A == "number" || typeof l == "number") && this.startLinkedFollow(n.config.id, e);
6036
+ const a = e.position, l = a?.x, A = a?.y;
6037
+ (typeof l == "number" || typeof A == "number") && this.startLinkedFollow(n.config.id, e);
5995
6038
  }
5996
6039
  }), !0);
5997
6040
  }
@@ -6013,13 +6056,17 @@ class xi {
6013
6056
  this.followingSet.delete(e), this.followDeadlines.delete(e);
6014
6057
  return;
6015
6058
  }
6016
- const A = n.ui?.x ?? n.config.x, l = n.ui?.y ?? n.config.y;
6059
+ const l = n.ui?.x ?? n.config.x, A = n.ui?.y ?? n.config.y;
6017
6060
  this.palletLinks.forEach((c, h) => {
6018
6061
  if (c.equipId !== e) return;
6019
6062
  const d = this.modelsMap.get(h);
6020
- d?.ui && (d.ui.x = A + c.offsetX, d.ui.y = l + c.offsetY);
6063
+ d?.ui && (d.ui.x = l + c.offsetX, d.ui.y = A + c.offsetY);
6021
6064
  }), s && this.modelsMap.forEach((c) => {
6022
- c.config.className !== D.RAIL || !c.config.linkEquipIdArray?.includes(s) || c.followChain(s, A);
6065
+ if (c.config.className !== D.RAIL) return;
6066
+ const h = c.config;
6067
+ if (!h.linkEquipIdArray?.includes(s)) return;
6068
+ const { along: d } = yi(mi(h), l, A);
6069
+ c.followChain(s, d);
6023
6070
  }), performance.now() >= a ? (this.followingSet.delete(e), this.followDeadlines.delete(e)) : this.followRafId = requestAnimationFrame(o);
6024
6071
  };
6025
6072
  this.followRafId = requestAnimationFrame(o);
@@ -6050,6 +6097,23 @@ class xi {
6050
6097
  hasDevice(e, t) {
6051
6098
  return (this.businessMap.get(`${e}_${t}`) || []).length > 0;
6052
6099
  }
6100
+ /**
6101
+ * 解析设备绑定的轨道配置:优先设备自身 linkRailId,其次按轨道侧 linkEquipIdArray 反查
6102
+ * (两侧由编辑器「绑定」面板双向同步维护,历史数据可能只保留一侧)
6103
+ */
6104
+ getBoundRailConfig(e) {
6105
+ const t = this.modelsMap.get(e)?.config?.linkRailId;
6106
+ if (t) {
6107
+ const s = this.modelsMap.get(t);
6108
+ if (s) return s.config;
6109
+ }
6110
+ let i = null;
6111
+ return this.modelsMap.forEach((s) => {
6112
+ if (i || s.config.className !== D.RAIL) return;
6113
+ const o = s.config;
6114
+ o.linkEquipIdArray?.includes(e) && (i = o);
6115
+ }), i;
6116
+ }
6053
6117
  /** 判断设备是否存在指定序号的工位(任一工位组;多层设备按 layer 定位层) */
6054
6118
  hasStation(e, t, i, s) {
6055
6119
  const o = this.findStationModel(e, t, i);
@@ -6159,18 +6223,18 @@ class xi {
6159
6223
  return;
6160
6224
  }
6161
6225
  if (n) {
6162
- n.set({ stroke: $t[s] });
6226
+ n.set({ stroke: Zt[s] });
6163
6227
  return;
6164
6228
  }
6165
- const A = Math.max(a.config.width || 100, a.config.height || 100) * 1.05, l = new we({
6229
+ const l = Math.max(a.config.width || 100, a.config.height || 100) * 1.05, A = new we({
6166
6230
  className: "AlarmHighlight",
6167
6231
  x: a.ui.x,
6168
6232
  y: a.ui.y,
6169
- width: A,
6170
- height: A,
6233
+ width: l,
6234
+ height: l,
6171
6235
  around: "center",
6172
6236
  origin: "center",
6173
- stroke: $t[s],
6237
+ stroke: Zt[s],
6174
6238
  strokeWidth: 3,
6175
6239
  dashPattern: [10, 8],
6176
6240
  hittable: !1,
@@ -6181,7 +6245,7 @@ class xi {
6181
6245
  loop: !0
6182
6246
  }
6183
6247
  });
6184
- this.alarmHighlights.set(o, l), this.treeBoxUI?.add(l), U.operating("告警高亮: key=%s, level=%s", o, s);
6248
+ this.alarmHighlights.set(o, A), this.treeBoxUI?.add(A), U.operating("告警高亮: key=%s, level=%s", o, s);
6185
6249
  }
6186
6250
  /** 移除全部告警高亮(scene_reset 场景复位时调用) */
6187
6251
  clearAlarmHighlights() {
@@ -6224,7 +6288,7 @@ class xi {
6224
6288
  }
6225
6289
  // 切换全局动画开关(标志位方式,仅影响循环动画,保留一次性动画和静态状态)
6226
6290
  toggleAnimations(e) {
6227
- this.animationsEnabled = e !== void 0 ? e : !this.animationsEnabled, Js(this.animationsEnabled), !this.animationsEnabled && this.treeBoxUI && this.clearAllAnimations(this.treeBoxUI), U.log("toggleAnimations, enabled=%s", this.animationsEnabled);
6291
+ this.animationsEnabled = e !== void 0 ? e : !this.animationsEnabled, $s(this.animationsEnabled), !this.animationsEnabled && this.treeBoxUI && this.clearAllAnimations(this.treeBoxUI), U.log("toggleAnimations, enabled=%s", this.animationsEnabled);
6228
6292
  }
6229
6293
  // 递归清除所有元素的 animation 属性
6230
6294
  clearAllAnimations(e = this.treeBoxUI) {
@@ -6240,8 +6304,8 @@ class xi {
6240
6304
  this.app.tree.config.maxFPS = t, U.log("setFps, mode=%s", e);
6241
6305
  }
6242
6306
  }
6243
- const ne = P("EditorController"), oo = 0.1, ro = 10, ei = "ruler-dark", no = 20, ao = "#000", Ao = 1, lo = 20;
6244
- class Ct {
6307
+ const ne = P("EditorController"), lo = 0.1, Ao = 10, $t = "ruler-dark", co = 20, ho = "#000", go = 1, uo = 20;
6308
+ class wt {
6245
6309
  container;
6246
6310
  editor;
6247
6311
  onSelected;
@@ -6251,7 +6315,7 @@ class Ct {
6251
6315
  onDragStart;
6252
6316
  onDragEnd;
6253
6317
  constructor(e) {
6254
- const { container: t, zoomMin: i = oo, zoomMax: s = ro } = e;
6318
+ const { container: t, zoomMin: i = lo, zoomMax: s = Ao } = e;
6255
6319
  if (i >= s)
6256
6320
  throw new Error("zoomMin must be less than zoomMax");
6257
6321
  const o = t.app;
@@ -6261,7 +6325,7 @@ class Ct {
6261
6325
  max: s
6262
6326
  };
6263
6327
  try {
6264
- co(o), ho(o);
6328
+ fo(o), po(o);
6265
6329
  } catch (a) {
6266
6330
  ne.error("Failed to initialize plugins:", a);
6267
6331
  }
@@ -6303,14 +6367,14 @@ class Ct {
6303
6367
  }
6304
6368
  // 设置监听事件
6305
6369
  addEvent() {
6306
- this.editor.on(Et.SELECT, (e) => {
6370
+ this.editor.on(yt.SELECT, (e) => {
6307
6371
  try {
6308
6372
  const t = e.editor.list.map((i) => i.id).filter((i) => typeof i == "string");
6309
6373
  this.onSelected?.(t);
6310
6374
  } catch (t) {
6311
6375
  ne.error("Error in SELECT event handler:", t);
6312
6376
  }
6313
- }), this.editor.on(Bt.MOVE, (e) => {
6377
+ }), this.editor.on(Et.MOVE, (e) => {
6314
6378
  try {
6315
6379
  const { x: t, y: i } = e.target;
6316
6380
  if (typeof t != "number" || typeof i != "number") return;
@@ -6320,7 +6384,7 @@ class Ct {
6320
6384
  } catch (t) {
6321
6385
  ne.error("Error in MOVE event handler:", t);
6322
6386
  }
6323
- }), this.editor.on(St.ROTATE, (e) => {
6387
+ }), this.editor.on(Bt.ROTATE, (e) => {
6324
6388
  try {
6325
6389
  this.markDragging();
6326
6390
  const { rotation: t } = e.target;
@@ -6328,13 +6392,13 @@ class Ct {
6328
6392
  } catch (t) {
6329
6393
  ne.error("Error in ROTATE event handler:", t);
6330
6394
  }
6331
- }), this.editor.on(bt.SCALE, (e) => {
6395
+ }), this.editor.on(St.SCALE, (e) => {
6332
6396
  try {
6333
6397
  this.markDragging();
6334
6398
  const t = e.target, { width: i, height: s, scale: o } = t;
6335
6399
  if (typeof i != "number" || typeof s != "number") return;
6336
- const n = typeof o == "number" ? o : o?.x ?? 1, a = typeof o == "number" ? o : o?.y ?? 1, A = i * n, l = s * a;
6337
- this.onScale?.(A, l);
6400
+ const n = typeof o == "number" ? o : o?.x ?? 1, a = typeof o == "number" ? o : o?.y ?? 1, l = i * n, A = s * a;
6401
+ this.onScale?.(l, A);
6338
6402
  } catch (t) {
6339
6403
  ne.error("Error in SCALE event handler:", t);
6340
6404
  }
@@ -6348,43 +6412,43 @@ class Ct {
6348
6412
  markDragging() {
6349
6413
  this.dragEndTimer && (clearTimeout(this.dragEndTimer), this.dragEndTimer = null), this.dragging || (this.dragging = !0, this.onDragStart?.()), this.dragEndTimer = setTimeout(() => {
6350
6414
  this.dragging = !1, this.dragEndTimer = null, this.onDragEnd?.();
6351
- }, Ct.DRAG_END_SILENCE);
6415
+ }, wt.DRAG_END_SILENCE);
6352
6416
  }
6353
6417
  // 销毁事件
6354
6418
  destroy() {
6355
- ne.log("销毁, 移除所有事件监听"), this.dragEndTimer && (clearTimeout(this.dragEndTimer), this.dragEndTimer = null), this.dragging = !1, this.editor.off(Et.SELECT), this.editor.off(St.ROTATE), this.editor.off(bt.SCALE), this.editor.off(Bt.MOVE);
6419
+ ne.log("销毁, 移除所有事件监听"), this.dragEndTimer && (clearTimeout(this.dragEndTimer), this.dragEndTimer = null), this.dragging = !1, this.editor.off(yt.SELECT), this.editor.off(Bt.ROTATE), this.editor.off(St.SCALE), this.editor.off(Et.MOVE);
6356
6420
  }
6357
6421
  }
6358
- function co(r) {
6359
- const e = new Vi(r, {
6422
+ function fo(r) {
6423
+ const e = new Wi(r, {
6360
6424
  enabled: !0,
6361
- ruleSize: no,
6425
+ ruleSize: co,
6362
6426
  unit: "px"
6363
6427
  });
6364
- e.addTheme(ei, {
6428
+ e.addTheme($t, {
6365
6429
  backgroundColor: "#333",
6366
6430
  textColor: "#ccc",
6367
6431
  borderColor: "#888",
6368
6432
  highlightColor: "rgba(125,111,239,.8)"
6369
- }), e.changeTheme(ei);
6433
+ }), e.changeTheme($t);
6370
6434
  }
6371
- function ho(r) {
6372
- new qi(r, {
6373
- dotColor: ao,
6374
- dotSize: Ao,
6375
- targetDotMatrixPixel: lo
6435
+ function po(r) {
6436
+ new Hi(r, {
6437
+ dotColor: ho,
6438
+ dotSize: go,
6439
+ targetDotMatrixPixel: uo
6376
6440
  }).enableDotMatrix(!0);
6377
6441
  }
6378
- const ti = Wi({
6442
+ const ei = Yi({
6379
6443
  legacy: !1,
6380
6444
  // legacy 为 false 则启用 Composition API 模式
6381
6445
  globalInjection: !0,
6382
6446
  // 允许在模板中使用 $t
6383
6447
  locale: "zhCn",
6384
6448
  fallbackLocale: "en",
6385
- messages: { zhCn: Yi, en: Hi }
6386
- }), Ii = Ne("@jnrs/lingshu-smart/debug", () => {
6387
- const r = ut(), e = () => r.globalSetting, t = ce(!1), i = _({
6449
+ messages: { zhCn: Ji, en: Xi }
6450
+ }), Qi = Me("@jnrs/lingshu-smart/debug", () => {
6451
+ const r = gt(), e = () => r.globalSetting, t = ce(!1), i = _({
6388
6452
  get: () => e().logLevel,
6389
6453
  set: (S) => {
6390
6454
  e().logLevel = S;
@@ -6409,12 +6473,12 @@ const ti = Wi({
6409
6473
  set: (S) => {
6410
6474
  e().interactionsDisabled = S;
6411
6475
  }
6412
- }), A = _({
6476
+ }), l = _({
6413
6477
  get: () => e().locale,
6414
6478
  set: (S) => {
6415
6479
  e().locale = S;
6416
6480
  }
6417
- }), l = _({
6481
+ }), A = _({
6418
6482
  get: () => e().theme,
6419
6483
  set: (S) => {
6420
6484
  e().theme = S;
@@ -6458,7 +6522,7 @@ const ti = Wi({
6458
6522
  e().interactionsDisabled = S;
6459
6523
  }, Q = (S) => {
6460
6524
  e().locale = S;
6461
- }, v = (S) => {
6525
+ }, x = (S) => {
6462
6526
  e().theme = S;
6463
6527
  }, w = () => {
6464
6528
  e().theme = e().theme === "dark" ? "light" : "dark";
@@ -6466,25 +6530,25 @@ const ti = Wi({
6466
6530
  r.setScriptSteps(p.value, S);
6467
6531
  }, O = (S) => {
6468
6532
  e().wsProxyActiveCaseId = S;
6469
- }, R = (S) => {
6533
+ }, k = (S) => {
6470
6534
  e().wsProxyManualModified = S;
6471
- }, We = () => {
6535
+ }, qe = () => {
6472
6536
  t.value = !0;
6473
- }, Fi = () => {
6537
+ }, Di = () => {
6474
6538
  t.value = !1;
6475
6539
  };
6476
- return mt(r.globalSetting.logLevel), ti.global.locale.value = r.globalSetting.locale, ie(i, (S) => {
6477
- mt(S);
6478
- }), ie(A, (S) => {
6479
- ti.global.locale.value = S;
6540
+ return Ct(r.globalSetting.logLevel), ei.global.locale.value = r.globalSetting.locale, se(i, (S) => {
6541
+ Ct(S);
6542
+ }), se(l, (S) => {
6543
+ ei.global.locale.value = S;
6480
6544
  }), {
6481
6545
  logLevel: i,
6482
6546
  shadowsEnabled: s,
6483
6547
  animationsEnabled: o,
6484
6548
  fpsMode: n,
6485
6549
  interactionsDisabled: a,
6486
- locale: A,
6487
- theme: l,
6550
+ locale: l,
6551
+ theme: A,
6488
6552
  debugPanelVisible: t,
6489
6553
  scriptSteps: b,
6490
6554
  setScriptSteps: F,
@@ -6495,7 +6559,7 @@ const ti = Wi({
6495
6559
  activeCaseId: C,
6496
6560
  setWsProxyActiveCaseId: O,
6497
6561
  wsProxyManualModified: c,
6498
- setWsProxyManualModified: R,
6562
+ setWsProxyManualModified: k,
6499
6563
  perfStatsCollapsed: h,
6500
6564
  setPerfStatsCollapsed: d,
6501
6565
  setLogLevel: m,
@@ -6504,20 +6568,20 @@ const ti = Wi({
6504
6568
  setFpsMode: B,
6505
6569
  setInteractionsDisabled: T,
6506
6570
  setLocale: Q,
6507
- setTheme: v,
6571
+ setTheme: x,
6508
6572
  toggleTheme: w,
6509
- showDebugPanel: We,
6510
- hideDebugPanel: Fi
6573
+ showDebugPanel: qe,
6574
+ hideDebugPanel: Di
6511
6575
  };
6512
- }), K = P("EditorStore"), Ro = Ne("@jnrs/lingshu-smart/editor", () => {
6513
- const r = ut(), e = Ii();
6576
+ }), K = P("EditorStore"), Oo = Me("@jnrs/lingshu-smart/editor", () => {
6577
+ const r = gt(), e = Qi();
6514
6578
  let t = null, i = null, s = !1, o = null, n = null, a = null;
6515
- const A = _(() => r.cases?.find((w) => w.isActive) || null), l = _(() => A.value ? A.value.scene : null), c = _(() => A.value ? A.value.layers : []), h = _(() => A.value && c.value.find((w) => w.selected) || null), d = (w) => {
6579
+ const l = _(() => r.cases?.find((w) => w.isActive) || null), A = _(() => l.value ? l.value.scene : null), c = _(() => l.value ? l.value.layers : []), h = _(() => l.value && c.value.find((w) => w.selected) || null), d = (w) => {
6516
6580
  if (t) {
6517
6581
  K.warn("Container already initialized");
6518
6582
  return;
6519
6583
  }
6520
- t = new xi(w), K.log("AppController Initialized"), w.appEditable && y(), u(), e.shadowsEnabled || t.toggleShadows(!1), e.animationsEnabled || t.toggleAnimations(!1), e.fpsMode !== "auto" && t.setFps(e.fpsMode);
6584
+ t = new Fi(w), K.log("AppController Initialized"), w.appEditable && y(), u(), e.shadowsEnabled || t.toggleShadows(!1), e.animationsEnabled || t.toggleAnimations(!1), e.fpsMode !== "auto" && t.setFps(e.fpsMode);
6521
6585
  }, C = (w) => {
6522
6586
  t && t.toggleShadows(w);
6523
6587
  }, p = (w) => {
@@ -6525,13 +6589,13 @@ const ti = Wi({
6525
6589
  }, f = (w) => {
6526
6590
  t && t.setFps(w);
6527
6591
  };
6528
- ie(
6592
+ se(
6529
6593
  () => e.shadowsEnabled,
6530
6594
  (w) => C(w)
6531
- ), ie(
6595
+ ), se(
6532
6596
  () => e.animationsEnabled,
6533
6597
  (w) => p(w)
6534
- ), ie(
6598
+ ), se(
6535
6599
  () => e.fpsMode,
6536
6600
  (w) => f(w)
6537
6601
  );
@@ -6540,13 +6604,13 @@ const ti = Wi({
6540
6604
  K.warn("updateScene failed: AppController not initialized");
6541
6605
  return;
6542
6606
  }
6543
- l.value && (K.log("updateScene..."), t.setTree(l.value)), b();
6607
+ A.value && (K.log("updateScene..."), t.setTree(A.value)), b();
6544
6608
  }, 300), b = Se(() => {
6545
6609
  if (!t) {
6546
6610
  K.warn("renderLayers failed: AppController not initialized");
6547
6611
  return;
6548
6612
  }
6549
- if (t.clearAll(), A.value) {
6613
+ if (t.clearAll(), l.value) {
6550
6614
  const w = h.value?.id;
6551
6615
  for (const F of c.value)
6552
6616
  t.addModel(F), i && F.id === w && i.selectEquipment(`#${w}`);
@@ -6566,7 +6630,7 @@ const ti = Wi({
6566
6630
  K.error("Cannot init Editor: AppController missing");
6567
6631
  return;
6568
6632
  }
6569
- i = new Ct({
6633
+ i = new wt({
6570
6634
  container: t,
6571
6635
  onSelected: (w) => {
6572
6636
  const F = w[0];
@@ -6587,8 +6651,8 @@ const ti = Wi({
6587
6651
  a = null;
6588
6652
  const O = n;
6589
6653
  if (n = null, !O) return;
6590
- const R = h.value;
6591
- R && R.width && R.height && (R.x = O.x, R.y = O.y, R.percentX = Te(O.x, l.value?.width, 3, !0), R.percentY = Te(O.y, l.value?.height, 3, !0));
6654
+ const k = h.value;
6655
+ k && k.width && k.height && (k.x = O.x, k.y = O.y, k.percentX = Te(O.x, A.value?.width, 3, !0), k.percentY = Te(O.y, A.value?.height, 3, !0));
6592
6656
  }));
6593
6657
  },
6594
6658
  onDragStart: () => {
@@ -6605,8 +6669,8 @@ const ti = Wi({
6605
6669
  const F = t.findOne(`#${w.id}`);
6606
6670
  if (F)
6607
6671
  if (F.className === "ShuttleStation") {
6608
- const { width: O, height: R, ...We } = w;
6609
- F.set(We);
6672
+ const { width: O, height: k, ...qe } = w;
6673
+ F.set(qe);
6610
6674
  } else
6611
6675
  F.set(w);
6612
6676
  }, B = Se((w) => {
@@ -6616,45 +6680,45 @@ const ti = Wi({
6616
6680
  }
6617
6681
  i && (K.log("rerenderLayer..."), i.rerenderModel(w));
6618
6682
  }, 500), T = (w) => {
6619
- if (!A.value) {
6683
+ if (!l.value) {
6620
6684
  K.warn("addLayer failed: currentCase not initialized");
6621
6685
  return;
6622
6686
  }
6623
- const F = w.id || ot(), O = c.value.length + 1, R = {
6624
- ...oe(ys),
6687
+ const F = w.id || st(), O = c.value.length + 1, k = {
6688
+ ...te(Bs),
6625
6689
  // 使用cloneDeep防止展开运算符的浅拷贝无法处理嵌套对象,导致污染初始值
6626
- ...oe(w),
6690
+ ...te(w),
6627
6691
  id: F,
6628
6692
  zIndex: O,
6629
6693
  rawData: {
6630
6694
  id: F
6631
6695
  }
6632
6696
  };
6633
- if (A.value.layers.push(R), !t) {
6697
+ if (l.value.layers.push(k), !t) {
6634
6698
  K.warn("addLayer failed: appController not initialized");
6635
6699
  return;
6636
6700
  }
6637
- t.addModel(R);
6701
+ t.addModel(k);
6638
6702
  }, Q = (w, F, O) => {
6639
6703
  if (!t) {
6640
6704
  K.warn("addLayerAtPosition failed: appController not initialized");
6641
6705
  return;
6642
6706
  }
6643
- const R = t.worldToLocalPoint(F, O);
6644
- R && (w.x = R.x, w.y = R.y, w.percentX = Te(R.x, l.value?.width, 3, !0), w.percentY = Te(R.y, l.value?.height, 3, !0)), T(w);
6645
- }, v = (w) => {
6707
+ const k = t.worldToLocalPoint(F, O);
6708
+ k && (w.x = k.x, w.y = k.y, w.percentX = Te(k.x, A.value?.width, 3, !0), w.percentY = Te(k.y, A.value?.height, 3, !0)), T(w);
6709
+ }, x = (w) => {
6646
6710
  if (i) {
6647
6711
  const F = h.value?.id === w;
6648
6712
  i.selectEquipment(F ? void 0 : `#${w}`);
6649
6713
  }
6650
6714
  };
6651
- return ie(
6652
- l,
6715
+ return se(
6716
+ A,
6653
6717
  () => {
6654
6718
  t && u();
6655
6719
  },
6656
6720
  { deep: !0 }
6657
- ), ie(
6721
+ ), se(
6658
6722
  h,
6659
6723
  (w) => {
6660
6724
  w && (s || E(w), B(w));
@@ -6662,8 +6726,8 @@ const ti = Wi({
6662
6726
  { deep: !0 }
6663
6727
  ), {
6664
6728
  // Getters
6665
- currentCase: A,
6666
- scene: l,
6729
+ currentCase: l,
6730
+ scene: A,
6667
6731
  layers: c,
6668
6732
  currentLayer: h,
6669
6733
  // Actions
@@ -6676,12 +6740,12 @@ const ti = Wi({
6676
6740
  // 当前图层
6677
6741
  addLayer: T,
6678
6742
  addLayerAtPosition: Q,
6679
- selectLayer: v,
6743
+ selectLayer: x,
6680
6744
  updateLayer: E,
6681
6745
  renderLayers: b
6682
6746
  };
6683
- }), M = P("SocketDispatcher"), go = 2e3, le = (r) => r?.resource_color;
6684
- class uo {
6747
+ }), M = P("SocketDispatcher"), wo = 2e3, Ae = (r) => r?.resource_color;
6748
+ class Co {
6685
6749
  entities = /* @__PURE__ */ new Map();
6686
6750
  get(e) {
6687
6751
  return this.entities.get(e);
@@ -6716,12 +6780,12 @@ class uo {
6716
6780
  i.location?.device_id === e && this.entities.delete(t);
6717
6781
  }
6718
6782
  }
6719
- class fo {
6783
+ class mo {
6720
6784
  appController;
6721
6785
  getScene;
6722
6786
  onAck;
6723
6787
  onRaw;
6724
- pool = new uo();
6788
+ pool = new Co();
6725
6789
  /** envelope.id 去重缓存(重复 ID 丢弃,warn 日志) */
6726
6790
  seenIds = /* @__PURE__ */ new Set();
6727
6791
  seenQueue = [];
@@ -6755,7 +6819,7 @@ class fo {
6755
6819
  M.warn("重复的 envelope.id=%s,丢弃", i.id);
6756
6820
  return;
6757
6821
  }
6758
- if (this.seenIds.add(i.id), this.seenQueue.push(i.id), this.seenQueue.length > go) {
6822
+ if (this.seenIds.add(i.id), this.seenQueue.push(i.id), this.seenQueue.length > wo) {
6759
6823
  const o = this.seenQueue.shift();
6760
6824
  o !== void 0 && this.seenIds.delete(o);
6761
6825
  }
@@ -6815,8 +6879,8 @@ class fo {
6815
6879
  /** 协议 position(比例值)→ 内部 operating position(位移像素 / 角度原值);仅保留显式传入的字段 */
6816
6880
  toPixelPosition(e) {
6817
6881
  if (!e || typeof e != "object") return;
6818
- const t = this.getScene(), i = {};
6819
- return e.x !== void 0 && (i.x = _e(e.x, t, 2, "width")), e.y !== void 0 && (i.y = _e(e.y, t, 2, "height")), e.z !== void 0 && (i.z = _e(e.z, t, 2, "height")), e.j1 !== void 0 && (i.j1 = e.j1), e.j2 !== void 0 && (i.j2 = e.j2), e.fork_xy !== void 0 && (i.fork_xy = e.fork_xy), e.fork_z !== void 0 && (i.fork_z = e.fork_z), Object.keys(i).length > 0 ? i : void 0;
6882
+ const t = this.getScene(), i = {}, s = (o, n) => o > 1 ? o : ti(o, t, 2, n);
6883
+ return e.x !== void 0 && (i.x = s(e.x, "width"), i.rawX = e.x), e.y !== void 0 && (i.y = s(e.y, "height")), e.z !== void 0 && (i.z = s(e.z, "height")), e.j1 !== void 0 && (i.j1 = e.j1), e.j2 !== void 0 && (i.j2 = e.j2), e.fork_xy !== void 0 && (i.fork_xy = e.fork_xy), e.fork_z !== void 0 && (i.fork_z = e.fork_z), Object.keys(i).length > 0 ? i : void 0;
6820
6884
  }
6821
6885
  /* ========== device_init(全量覆盖语义,见文档第七章) ========== */
6822
6886
  handleDeviceInit(e, t) {
@@ -6838,26 +6902,26 @@ class fo {
6838
6902
  i++;
6839
6903
  const a = this.buildDeviceOperating(s);
6840
6904
  if (a && this.appController.operating(a), this.pool.removeByDevice(s.device_id), Array.isArray(s.resources))
6841
- for (const A of s.resources) {
6842
- const l = {
6905
+ for (const l of s.resources) {
6906
+ const A = {
6843
6907
  device_type: s.device_type,
6844
6908
  device_id: s.device_id,
6845
- device_layer: A.device_layer,
6846
- device_station: A.device_station
6847
- }, c = this.resolvePlacement(l, A.resource_type);
6909
+ device_layer: l.device_layer,
6910
+ device_station: l.device_station
6911
+ }, c = this.resolvePlacement(A, l.resource_type);
6848
6912
  if (c.code !== 0) {
6849
- M.warn("device_init 资源 %s 放置失败(code=%d): %s", A.resource_id, c.code, c.message);
6913
+ M.warn("device_init 资源 %s 放置失败(code=%d): %s", l.resource_id, c.code, c.message);
6850
6914
  continue;
6851
6915
  }
6852
- const h = this.toResolvedLocation(l, c);
6916
+ const h = this.toResolvedLocation(A, c);
6853
6917
  this.pool.add({
6854
- resource_id: A.resource_id,
6855
- resource_type: A.resource_type,
6856
- resource_name: A.resource_name,
6857
- resource_state: A.resource_state,
6858
- resource_color: le(A),
6918
+ resource_id: l.resource_id,
6919
+ resource_type: l.resource_type,
6920
+ resource_name: l.resource_name,
6921
+ resource_state: l.resource_state,
6922
+ resource_color: Ae(l),
6859
6923
  to: h
6860
- }), this.placeResource("add", h, A.resource_id, A.resource_type, A.resource_name, le(A));
6924
+ }), this.placeResource("add", h, l.resource_id, l.resource_type, l.resource_name, Ae(l));
6861
6925
  }
6862
6926
  }
6863
6927
  this.ack(e, 0, `device_init: ${i}/${t.devices.length} 台设备已初始化`);
@@ -6881,7 +6945,7 @@ class fo {
6881
6945
  resource_type: t.resource_type,
6882
6946
  resource_name: t.resource_name,
6883
6947
  resource_state: t.resource_state,
6884
- resource_color: le(t),
6948
+ resource_color: Ae(t),
6885
6949
  to: s
6886
6950
  }), this.placeResource(
6887
6951
  "add",
@@ -6889,7 +6953,7 @@ class fo {
6889
6953
  t.resource_id,
6890
6954
  t.resource_type,
6891
6955
  t.resource_name,
6892
- le(t)
6956
+ Ae(t)
6893
6957
  ), this.ack(e, 0);
6894
6958
  break;
6895
6959
  }
@@ -6903,7 +6967,7 @@ class fo {
6903
6967
  continue;
6904
6968
  }
6905
6969
  const a = this.toResolvedLocation(o.to, n);
6906
- this.pool.add({ ...o, resource_color: le(o), to: a }), this.placeResource("add", a, o.resource_id, o.resource_type, o.resource_name, le(o)), s++;
6970
+ this.pool.add({ ...o, resource_color: Ae(o), to: a }), this.placeResource("add", a, o.resource_id, o.resource_type, o.resource_name, Ae(o)), s++;
6907
6971
  }
6908
6972
  this.ack(e, s > 0 ? 0 : 404, `batch_add: ${s}/${i.length} 项成功`);
6909
6973
  break;
@@ -6919,15 +6983,15 @@ class fo {
6919
6983
  this.ack(e, o.code, o.message);
6920
6984
  return;
6921
6985
  }
6922
- const n = this.toResolvedLocation(t.to, o), a = i?.resource_name ?? t.resource_name, A = i?.resource_color ?? le(t);
6986
+ const n = this.toResolvedLocation(t.to, o), a = i?.resource_name ?? t.resource_name, l = i?.resource_color ?? Ae(t);
6923
6987
  i ? this.pool.updateLocation(t.resource_id, n) : this.pool.add({
6924
6988
  resource_id: t.resource_id,
6925
6989
  resource_type: t.resource_type,
6926
6990
  resource_name: a,
6927
6991
  resource_state: t.resource_state,
6928
- resource_color: A,
6992
+ resource_color: l,
6929
6993
  to: n
6930
- }), this.placeResource("remove", s, t.resource_id, t.resource_type, a, A), this.placeResource("add", n, t.resource_id, t.resource_type, a, A), this.ack(e, 0);
6994
+ }), this.placeResource("remove", s, t.resource_id, t.resource_type, a, l), this.placeResource("add", n, t.resource_id, t.resource_type, a, l), this.ack(e, 0);
6931
6995
  break;
6932
6996
  }
6933
6997
  case "remove": {
@@ -6950,30 +7014,30 @@ class fo {
6950
7014
  case "batch_remove": {
6951
7015
  const i = Array.isArray(t.resource_ids) ? t.resource_ids : [], s = t.resource_type, o = [], n = /* @__PURE__ */ new Map();
6952
7016
  let a = 0;
6953
- for (const l of i) {
6954
- const c = this.pool.get(l);
7017
+ for (const A of i) {
7018
+ const c = this.pool.get(A);
6955
7019
  if (s && c && c.resource_type !== s) {
6956
- n.set(l, c.resource_type);
7020
+ n.set(A, c.resource_type);
6957
7021
  continue;
6958
7022
  }
6959
- o.push(l);
6960
- const h = this.pool.remove(l);
7023
+ o.push(A);
7024
+ const h = this.pool.remove(A);
6961
7025
  h?.location && (this.placeResource(
6962
7026
  "remove",
6963
7027
  h.location,
6964
- l,
7028
+ A,
6965
7029
  s ?? h.resource_type,
6966
7030
  h.resource_name,
6967
7031
  h.resource_color
6968
7032
  ), a++);
6969
7033
  }
6970
7034
  if (n.size > 0) {
6971
- const l = [...n.entries()].map(([c, h]) => `${c}[${h}]`).join(", ");
7035
+ const A = [...n.entries()].map(([c, h]) => `${c}[${h}]`).join(", ");
6972
7036
  M.warn(
6973
7037
  "SocketDispatcher: batch_remove resource_type 过滤 type=%o → 跳过 %d 项: %s",
6974
7038
  s,
6975
7039
  n.size,
6976
- l
7040
+ A
6977
7041
  );
6978
7042
  }
6979
7043
  M.info(
@@ -6988,8 +7052,8 @@ class fo {
6988
7052
  resourceIds: o,
6989
7053
  raw_data: {}
6990
7054
  });
6991
- const A = n.size > 0 ? `,跳过 ${n.size} 项类型不匹配 (${[...n.keys()].join(",")})` : "";
6992
- this.ack(e, 0, `batch_remove: ${a}/${i.length} 项成功${A}`);
7055
+ const l = n.size > 0 ? `,跳过 ${n.size} 项类型不匹配 (${[...n.keys()].join(",")})` : "";
7056
+ this.ack(e, 0, `batch_remove: ${a}/${i.length} 项成功${l}`);
6993
7057
  break;
6994
7058
  }
6995
7059
  default:
@@ -7137,15 +7201,15 @@ class fo {
7137
7201
  });
7138
7202
  }
7139
7203
  }
7140
- const ae = P("AppStore"), Lo = Ne("@jnrs/lingshu-smart/app", () => {
7141
- const r = ut(), e = Ii(), t = ce(null);
7204
+ const ae = P("AppStore"), Ko = Me("@jnrs/lingshu-smart/app", () => {
7205
+ const r = gt(), e = Qi(), t = ce(null);
7142
7206
  let i = null, s = null, o = {};
7143
7207
  const n = (u, b) => {
7144
7208
  if (i) {
7145
7209
  ae.warn("Container already initialized");
7146
7210
  return;
7147
7211
  }
7148
- i = new xi(u), ae.log("AppController Initialized"), s = new fo({
7212
+ i = new Fi(u), ae.log("AppController Initialized"), s = new mo({
7149
7213
  appController: i,
7150
7214
  getScene: () => t.value?.scene ?? null,
7151
7215
  onAck: (m) => o.onAck?.(m),
@@ -7161,20 +7225,20 @@ const ae = P("AppStore"), Lo = Ne("@jnrs/lingshu-smart/app", () => {
7161
7225
  e.shadowsEnabled || i.toggleShadows(!1), e.animationsEnabled || i.toggleAnimations(!1), e.fpsMode !== "auto" && i.setFps(e.fpsMode);
7162
7226
  }, a = (u) => {
7163
7227
  i && i.toggleShadows(u);
7164
- }, A = (u) => {
7165
- i && i.toggleAnimations(u);
7166
7228
  }, l = (u) => {
7229
+ i && i.toggleAnimations(u);
7230
+ }, A = (u) => {
7167
7231
  i && i.setFps(u);
7168
7232
  };
7169
- ie(
7233
+ se(
7170
7234
  () => e.shadowsEnabled,
7171
7235
  (u) => a(u)
7172
- ), ie(
7236
+ ), se(
7173
7237
  () => e.animationsEnabled,
7174
- (u) => A(u)
7175
- ), ie(
7176
- () => e.fpsMode,
7177
7238
  (u) => l(u)
7239
+ ), se(
7240
+ () => e.fpsMode,
7241
+ (u) => A(u)
7178
7242
  );
7179
7243
  const c = () => {
7180
7244
  if (!i) {
@@ -7208,11 +7272,11 @@ const ae = P("AppStore"), Lo = Ne("@jnrs/lingshu-smart/app", () => {
7208
7272
  s.dispatch(u);
7209
7273
  }, f = () => {
7210
7274
  if (!i) {
7211
- ae.warn("resetModels failed: AppController not initialized"), He.warning("画布未初始化,无法复位");
7275
+ ae.warn("resetModels failed: AppController not initialized"), We.warning("画布未初始化,无法复位");
7212
7276
  return;
7213
7277
  }
7214
7278
  const u = i.resetAllModels();
7215
- s?.reset(), u > 0 ? He.success(`一键复位画布完成:已复位 ${u} 个模型`) : He.warning("当前画布没有可复位的模型");
7279
+ s?.reset(), u > 0 ? We.success(`一键复位画布完成:已复位 ${u} 个模型`) : We.warning("当前画布没有可复位的模型");
7216
7280
  };
7217
7281
  return {
7218
7282
  currentCase: t,
@@ -7226,36 +7290,36 @@ const ae = P("AppStore"), Lo = Ne("@jnrs/lingshu-smart/app", () => {
7226
7290
  };
7227
7291
  });
7228
7292
  export {
7229
- xo as A,
7230
- Qo as B,
7231
- yi as D,
7232
- mi as L,
7233
- Ei as M,
7234
- bi as W,
7235
- Ro as a,
7236
- Lo as b,
7237
- Ii as c,
7293
+ Do as A,
7294
+ ko as B,
7295
+ Bi as D,
7296
+ Ei as L,
7297
+ Si as M,
7298
+ vi as W,
7299
+ Oo as a,
7300
+ Ko as b,
7301
+ Qi as c,
7238
7302
  Se as d,
7239
- Bi as e,
7240
- Si as f,
7241
- vo as g,
7242
- nt as h,
7243
- ti as i,
7244
- Ss as j,
7245
- ht as k,
7303
+ bi as e,
7304
+ xi as f,
7305
+ Qo as g,
7306
+ rt as h,
7307
+ ei as i,
7308
+ xs as j,
7309
+ ct as k,
7246
7310
  Fe as l,
7247
- Ai as m,
7311
+ li as m,
7248
7312
  lt as n,
7249
- At as o,
7250
- ct as p,
7251
- Us as q,
7313
+ at as o,
7314
+ At as p,
7315
+ Ks as q,
7252
7316
  re as r,
7253
- ot as s,
7254
- To as t,
7255
- ut as u,
7317
+ st as s,
7318
+ _o as t,
7319
+ gt as u,
7256
7320
  fi as v,
7257
- Do as w,
7258
- ko as x,
7259
- Fo as y,
7260
- Io as z
7321
+ Lo as w,
7322
+ Uo as x,
7323
+ Ro as y,
7324
+ To as z
7261
7325
  };