@jnrs/lingshu-smart 3.0.0 → 3.1.0

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,60 +1,60 @@
1
1
  import { defineStore as Ne } from "pinia";
2
2
  import { ref as ce, computed as _, watch as ie } from "vue";
3
- import { v as xi, w as Ii, x as et, y as Fi, e as x, a as L, b as D, M as he, g as $, o as G, j as _e, i as Qi, z as oe, u as Di, k as Ti, q as ki, m as V, B as Ri, A as H, C as j, F as De, S as Li, G as ei, s as wt, t as Te, D as de } from "./index-C6Liz-8o.js";
4
- import { PointerEvent as ke, DragEvent as Ct, Box as I, Rect as _i, Ellipse as we, Flow as fe, Star as Ui, Text as Oi, Path as ge, Group as ti, App as Ki, LeaferEvent as Mi, EditorEvent as mt, EditorMoveEvent as yt, EditorRotateEvent as Et, EditorScaleEvent as Bt } from "leafer";
5
- import { Ruler as Ni } from "leafer-x-ruler";
6
- import { DotMatrix as Gi } from "leafer-x-dot-matrix";
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
7
  import { ElMessage as He } from "element-plus";
8
- import { createI18n as Vi } from "vue-i18n";
9
- import { en as Pi, zhCn as qi } from "./locales/index.js";
10
- var Wi = "[object Symbol]";
11
- function Hi(r) {
12
- return typeof r == "symbol" || xi(r) && Ii(r) == Wi;
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
13
  }
14
- var Yi = /\s/;
15
- function Xi(r) {
16
- for (var e = r.length; e-- && Yi.test(r.charAt(e)); )
14
+ var ji = /\s/;
15
+ function zi(r) {
16
+ for (var e = r.length; e-- && ji.test(r.charAt(e)); )
17
17
  ;
18
18
  return e;
19
19
  }
20
- var Ji = /^\s+/;
21
- function ji(r) {
22
- return r && r.slice(0, Xi(r) + 1).replace(Ji, "");
20
+ var Zi = /^\s+/;
21
+ function $i(r) {
22
+ return r && r.slice(0, zi(r) + 1).replace(Zi, "");
23
23
  }
24
- var St = NaN, zi = /^[-+]0x[0-9a-f]+$/i, Zi = /^0b[01]+$/i, $i = /^0o[0-7]+$/i, es = parseInt;
25
- function bt(r) {
24
+ var vt = NaN, es = /^[-+]0x[0-9a-f]+$/i, ts = /^0b[01]+$/i, is = /^0o[0-7]+$/i, ss = parseInt;
25
+ function xt(r) {
26
26
  if (typeof r == "number")
27
27
  return r;
28
- if (Hi(r))
29
- return St;
28
+ if (Ji(r))
29
+ return vt;
30
30
  if (et(r)) {
31
31
  var e = typeof r.valueOf == "function" ? r.valueOf() : r;
32
32
  r = et(e) ? e + "" : e;
33
33
  }
34
34
  if (typeof r != "string")
35
35
  return r === 0 ? r : +r;
36
- r = ji(r);
37
- var t = Zi.test(r);
38
- return t || $i.test(r) ? es(r.slice(2), t ? 2 : 8) : zi.test(r) ? St : +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;
39
39
  }
40
40
  var Ye = function() {
41
- return Fi.Date.now();
42
- }, ts = "Expected a function", is = Math.max, ss = Math.min;
41
+ return Ti.Date.now();
42
+ }, os = "Expected a function", rs = Math.max, ns = Math.min;
43
43
  function Se(r, e, t) {
44
44
  var i, s, o, n, a, A, l = 0, c = !1, h = !1, d = !0;
45
45
  if (typeof r != "function")
46
- throw new TypeError(ts);
47
- e = bt(e) || 0, et(t) && (c = !!t.leading, h = "maxWait" in t, o = h ? is(bt(t.maxWait) || 0, e) : o, d = "trailing" in t ? !!t.trailing : d);
48
- function w(B) {
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);
48
+ function C(B) {
49
49
  var T = i, Q = s;
50
50
  return i = s = void 0, l = B, n = r.apply(Q, T), n;
51
51
  }
52
52
  function p(B) {
53
- return l = B, a = setTimeout(b, e), c ? w(B) : n;
53
+ return l = B, a = setTimeout(b, e), c ? C(B) : n;
54
54
  }
55
55
  function f(B) {
56
56
  var T = B - A, Q = B - l, v = e - T;
57
- return h ? ss(v, o - Q) : v;
57
+ return h ? ns(v, o - Q) : v;
58
58
  }
59
59
  function u(B) {
60
60
  var T = B - A, Q = B - l;
@@ -67,7 +67,7 @@ function Se(r, e, t) {
67
67
  a = setTimeout(b, f(B));
68
68
  }
69
69
  function g(B) {
70
- return a = void 0, d && i ? w(B) : (i = s = void 0, n);
70
+ return a = void 0, d && i ? C(B) : (i = s = void 0, n);
71
71
  }
72
72
  function m() {
73
73
  a !== void 0 && clearTimeout(a), l = 0, i = A = s = a = void 0;
@@ -81,13 +81,13 @@ function Se(r, e, t) {
81
81
  if (a === void 0)
82
82
  return p(A);
83
83
  if (h)
84
- return clearTimeout(a), a = setTimeout(b, e), w(A);
84
+ return clearTimeout(a), a = setTimeout(b, e), C(A);
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 os(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;
@@ -99,33 +99,33 @@ function os(r) {
99
99
  }
100
100
  return r.stroke && typeof r.stroke != "object" ? (console.error("isIScene: stroke must be an object"), !1) : !0;
101
101
  }
102
- function ii(r) {
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) => ii(e))) || r.fill && typeof r.fill != "object" || r.selected !== void 0 && typeof r.selected != "boolean");
102
+ function oi(r) {
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
- function si(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) => ii(e)) || !os(r.scene));
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));
107
107
  }
108
- function rs(r) {
109
- return Array.isArray(r) ? r.every((e) => si(e)) : (console.error("isICaseArray: data must be an array"), !1);
108
+ function As(r) {
109
+ return Array.isArray(r) ? r.every((e) => ri(e)) : (console.error("isICaseArray: data must be an array"), !1);
110
110
  }
111
- const ns = 1704038400000n, it = 5n, as = 5n, Ge = 12n, As = (1n << it) - 1n, ls = (1n << Ge) - 1n, cs = Ge, hs = Ge + it, gs = Ge + it + as, us = BigInt(Math.floor(Math.random() * (Number(As) + 1))), ds = 0n;
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;
112
112
  let Ce = -1n, me = 0n;
113
- function fs() {
113
+ function Cs() {
114
114
  let r = BigInt(Date.now());
115
115
  if (r < Ce && (r = Ce), r === Ce) {
116
- if (me = me + 1n & ls, me === 0n) {
116
+ if (me = me + 1n & gs, 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 - ns << gs | ds << hs | us << cs | me;
123
+ return Ce = r, r - ls << fs | ws << ds | ps << us | me;
124
124
  }
125
- function st() {
126
- return fs().toString();
125
+ function ot() {
126
+ return Cs().toString();
127
127
  }
128
- const ps = {
128
+ const ms = {
129
129
  id: "",
130
130
  title: "",
131
131
  isActive: !1,
@@ -144,7 +144,7 @@ const ps = {
144
144
  },
145
145
  texture: ""
146
146
  }
147
- }, ws = {
147
+ }, ys = {
148
148
  rawData: {
149
149
  id: ""
150
150
  },
@@ -195,7 +195,7 @@ const ps = {
195
195
  // 编辑状态
196
196
  editable: !0,
197
197
  selected: !1
198
- }, ot = [
198
+ }, rt = [
199
199
  {
200
200
  title: "机床",
201
201
  tag: L.MACHINE,
@@ -620,21 +620,21 @@ const ps = {
620
620
  ]
621
621
  }
622
622
  ], tt = {};
623
- for (const r of ot)
623
+ for (const r of rt)
624
624
  for (const e of r.children)
625
625
  tt[e.className] || (tt[e.className] = { width: e.width, height: e.height });
626
- function yo(r) {
626
+ function vo(r) {
627
627
  return r ? tt[r] : void 0;
628
628
  }
629
- const Cs = /^(#[0-9a-f]{3,8}|rgba?\(|hsla?\([a-z][-a-z0-9]*)$/i;
630
- function ms(r) {
629
+ const Es = /^(#[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 : Cs.test(r) ? !0 : /^[a-z][a-z-]{2,}$/i.test(r);
633
+ return e === "none" || e === "transparent" ? !1 : Es.test(r) ? !0 : /^[a-z][a-z-]{2,}$/i.test(r);
634
634
  }
635
- const rt = "public/lingshu-smart/wsProxyConfig.json";
636
- function ys(r) {
637
- let e = (r || rt).replace(/^\/+|\/+$/g, "");
635
+ const nt = "public/lingshu-smart/wsProxyConfig.json";
636
+ function Ss(r) {
637
+ let e = (r || nt).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) {
@@ -644,7 +644,7 @@ function Ie(r, e) {
644
644
  return t[i];
645
645
  }, r);
646
646
  }
647
- function oi(r, e, t) {
647
+ function ni(r, e, t) {
648
648
  const i = e.split(".");
649
649
  let s = r;
650
650
  for (let o = 0; o < i.length - 1; o++) {
@@ -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 vt(r, e) {
663
+ function It(r, e) {
664
664
  if (e === "boolean") {
665
665
  if (typeof r == "boolean") return r;
666
666
  if (typeof r == "number") return r !== 0;
@@ -680,7 +680,7 @@ function vt(r, e) {
680
680
  }
681
681
  return r;
682
682
  }
683
- function ri(r, e, t, i, s) {
683
+ function ai(r, e, t, i, s) {
684
684
  if (e.constant !== void 0) {
685
685
  if (typeof e.constant == "string") {
686
686
  const n = e.constant.trim();
@@ -696,7 +696,7 @@ function ri(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 = Qi(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 = _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") {
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);
@@ -724,7 +724,7 @@ function ri(r, e, t, i, s) {
724
724
  }
725
725
  if (n === "color") {
726
726
  const l = String(A);
727
- if (!ms(l)) {
727
+ if (!Bs(l)) {
728
728
  G.info("WsProxy: 字典Color「%s」对值 %o 产出 %o 非合法CSS颜色, 不产出该字段", a, o, l);
729
729
  return;
730
730
  }
@@ -769,16 +769,16 @@ function ri(r, e, t, i, s) {
769
769
  const d = typeof l == "string" || typeof l == "number" ? l : void 0;
770
770
  try {
771
771
  c = i(e.dictName, d, "color");
772
- } catch (w) {
772
+ } catch (C) {
773
773
  G.error(
774
774
  "WsProxy: 对象映射「%s」键 %s 调用 dictFn 异常, 保留源值: %s",
775
775
  e.dictName,
776
776
  A,
777
- w instanceof Error ? w.message : String(w)
777
+ C instanceof Error ? C.message : String(C)
778
778
  ), c = l;
779
779
  }
780
780
  }
781
- a[A] = vt(c, e.transformTargetType);
781
+ a[A] = It(c, e.transformTargetType);
782
782
  }
783
783
  o = a;
784
784
  }
@@ -794,21 +794,21 @@ function ri(r, e, t, i, s) {
794
794
  let n = !1;
795
795
  for (const a of e.conditions) {
796
796
  let A = o;
797
- if (!(a.source && a.source !== e.source && (A = Ie(r, a.source), A === void 0)) && Bs(A, a)) {
797
+ if (!(a.source && a.source !== e.source && (A = Ie(r, a.source), A === void 0)) && vs(A, a)) {
798
798
  if (a.transform === "dictLabel" || a.transform === "dictColor") {
799
799
  const l = a.transform === "dictLabel" ? "label" : "color";
800
800
  i ? o = i(a.dictName || "", o, l) : G.warn("WsProxy: condition.dictFn 未配置,字典 %s 回退为原值", l);
801
- } else a.transform === "operation" ? o = xt(a.operateFn || "negate", a.expression, o) : o = a.value;
801
+ } else a.transform === "operation" ? o = Ft(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 = xt(e.operateFn || "negate", e.expression, o)), e.transformTargetType && (o = vt(o, e.transformTargetType)), o;
808
+ return e.transform === "operation" && (o = Ft(e.operateFn || "negate", e.expression, o)), e.transformTargetType && (o = It(o, e.transformTargetType)), o;
809
809
  }
810
810
  }
811
- function xt(r, e, t) {
811
+ function Ft(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 xt(r, e, t) {
817
817
  }
818
818
  return t;
819
819
  }
820
- return r === "not" ? !It(t) : r === "toBoolean" ? It(t) : r === "concat" && e ? Es(t, e) : t;
820
+ return r === "not" ? !Qt(t) : r === "toBoolean" ? Qt(t) : r === "concat" && e ? bs(t, e) : t;
821
821
  }
822
- function It(r) {
822
+ function Qt(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 Es(r, e) {
829
+ function bs(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 Es(r, e) {
837
837
  }
838
838
  return i;
839
839
  }
840
- function Bs(r, e) {
840
+ function vs(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,9 +860,9 @@ function Bs(r, e) {
860
860
  return !1;
861
861
  }
862
862
  }
863
- function nt(r, e) {
863
+ function at(r, e) {
864
864
  return {
865
- id: st(),
865
+ id: ot(),
866
866
  type: r,
867
867
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
868
868
  ...e?.caseId ? { case_id: e.caseId } : {}
@@ -873,7 +873,7 @@ function te(r, e, t, i, s, o) {
873
873
  if (n.enabled === !1) continue;
874
874
  let a;
875
875
  try {
876
- a = ri(e, n, i, s, o);
876
+ a = ai(e, n, i, s, o);
877
877
  } catch (A) {
878
878
  G.error(
879
879
  "WsProxy: 字段「%s」解析异常, 已跳过该字段: %s",
@@ -882,21 +882,21 @@ function te(r, e, t, i, s, o) {
882
882
  );
883
883
  continue;
884
884
  }
885
- a !== void 0 && oi(r, n.target, a);
885
+ a !== void 0 && ni(r, n.target, a);
886
886
  }
887
887
  }
888
- function Ss(r, e, t, i, s, o) {
888
+ function xs(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
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: nt($.DeviceCommand, t),
893
+ envelope: at($.DeviceCommand, t),
894
894
  payload: a
895
895
  };
896
896
  }
897
- function bs(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 : At, d = t.resourceMappings?.remove?.length ? t.resourceMappings.remove : at, w = [], p = (f) => {
899
- w.push({ envelope: nt($.ResourceCommand, s), payload: f });
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 });
900
900
  };
901
901
  if (A?.operationField) {
902
902
  const f = String(Ie(r, A.operationField) ?? "").trim().toLowerCase();
@@ -907,7 +907,7 @@ function bs(r, e, t, i, s, o, n, a) {
907
907
  const u = { operation: "add" };
908
908
  te(u, e, l, o, n, a);
909
909
  const b = u.to || {};
910
- return u.resource_id && b.device_id ? p(u) : N("资源 add 消息缺少 resource_id / to.device_id,跳过", { payload: e }), w;
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
913
  const u = A.batchAddItems || i, b = Ie(r, u);
@@ -921,7 +921,7 @@ function bs(r, e, t, i, s, 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
  }
924
- return g.length === 0 ? (N("batch_add 无有效资源项,跳过", { itemsPath: u, total: b.length }), []) : (p({ operation: "batch_add", resources: g }), w);
924
+ return g.length === 0 ? (N("batch_add 无有效资源项,跳过", { itemsPath: u, total: b.length }), []) : (p({ operation: "batch_add", resources: g }), C);
925
925
  }
926
926
  case "transfer": {
927
927
  if (Array.isArray(e))
@@ -929,20 +929,20 @@ function bs(r, e, t, i, s, o, n, a) {
929
929
  const u = { operation: "transfer" };
930
930
  te(u, e, h, o, n, a);
931
931
  const b = u.to || {};
932
- return u.resource_id && b.device_id ? p(u) : N("资源 transfer 消息缺少 resource_id / to.device_id,跳过", { payload: e }), w;
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
936
  return N("资源 remove 源 payload 为数组,无法按对象映射,跳过", { operationField: A.operationField }), [];
937
937
  const u = { operation: "remove" };
938
- return te(u, e, d, o, n, a), u.resource_id && p(u), w;
938
+ return te(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 : lt;
941
+ const u = t.resourceMappings?.batch_remove?.length ? t.resourceMappings.batch_remove : ct;
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)) }), w);
943
+ return e.length === 0 ? (N("batch_remove 源 payload 数组为空,跳过", { operationField: A.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 }), w;
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;
946
946
  }
947
947
  default:
948
948
  return N(
@@ -962,9 +962,9 @@ function bs(r, e, t, i, s, o, n, a) {
962
962
  const f = { operation: "remove" };
963
963
  te(f, e, d, o, n, a), f.resource_id && p(f);
964
964
  }
965
- return w;
965
+ return C;
966
966
  }
967
- function vs(r, e, t, i, s) {
967
+ function Fs(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(
@@ -974,27 +974,27 @@ function vs(r, e, t, i, s) {
974
974
  const a = r.payload;
975
975
  if (!a || typeof a != "object") return;
976
976
  const A = (d) => {
977
- const w = n.resourceMappings;
977
+ const C = n.resourceMappings;
978
978
  switch (d) {
979
979
  case "add":
980
- return w?.add?.length ? w.add : Fe;
980
+ return C?.add?.length ? C.add : Fe;
981
981
  case "batch_add":
982
- return w?.batch_add?.length ? w.batch_add : ni;
982
+ return C?.batch_add?.length ? C.batch_add : Ai;
983
983
  case "transfer":
984
- return w?.transfer?.length ? w.transfer : At;
984
+ return C?.transfer?.length ? C.transfer : lt;
985
985
  case "remove":
986
- return w?.remove?.length ? w.remove : at;
986
+ return C?.remove?.length ? C.remove : At;
987
987
  case "batch_remove":
988
- return w?.batch_remove?.length ? w.batch_remove : lt;
988
+ return C?.batch_remove?.length ? C.batch_remove : ct;
989
989
  default:
990
990
  return [];
991
991
  }
992
- }, l = (d, w) => {
992
+ }, l = (d, C) => {
993
993
  const p = [];
994
- for (const f of w)
994
+ for (const f of C)
995
995
  if (f.enabled !== !1)
996
996
  try {
997
- const u = ri(d, f, t, i, s);
997
+ const u = ai(d, f, t, i, s);
998
998
  u !== void 0 && p.push([f.target, u]);
999
999
  } catch (u) {
1000
1000
  G.error(
@@ -1003,7 +1003,7 @@ function vs(r, e, t, i, s) {
1003
1003
  u instanceof Error ? u.message : String(u)
1004
1004
  );
1005
1005
  }
1006
- for (const [f, u] of p) oi(d, f, u);
1006
+ for (const [f, u] of p) ni(d, f, u);
1007
1007
  }, c = String(a.operation ?? "");
1008
1008
  if (c === "batch_add") {
1009
1009
  if (!Array.isArray(a.resources)) return;
@@ -1014,7 +1014,7 @@ function vs(r, e, t, i, s) {
1014
1014
  const h = A(c);
1015
1015
  h.length > 0 && l(a, h);
1016
1016
  }
1017
- function xs(r, e, t, i, s) {
1017
+ function Qs(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;
@@ -1028,11 +1028,11 @@ function xs(r, e, t, i, s) {
1028
1028
  });
1029
1029
  A && te(n, n, A.mappings, t, i, s);
1030
1030
  }
1031
- function Eo(r, e, t, i, s = "data", o = "type", n, a) {
1031
+ function xo(r, e, t, i, s = "data", o = "type", n, a) {
1032
1032
  const A = r;
1033
1033
  if (A && typeof A == "object" && A.envelope && typeof A.envelope == "object" && "payload" in A) {
1034
- const p = r, f = Is(p, e);
1035
- return f ? { messages: [], runtimeStatus: Ft(p.payload, f, i, n, a) } : (vs(p, e, i, n, a), xs(p, e, i, n, a), { messages: [p], runtimeStatus: null });
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
1036
  }
1037
1037
  const l = Ie(A, o);
1038
1038
  if (l == null || l === "")
@@ -1046,13 +1046,13 @@ function Eo(r, e, t, i, s = "data", o = "type", n, a) {
1046
1046
  if (c.operate === "statusPush")
1047
1047
  return {
1048
1048
  messages: [],
1049
- runtimeStatus: Ft(h, c, i, n, a)
1049
+ runtimeStatus: Dt(h, c, i, n, a)
1050
1050
  };
1051
1051
  if (c.operate === "resetAll")
1052
1052
  return {
1053
1053
  messages: [
1054
1054
  {
1055
- envelope: nt($.SceneReset, t),
1055
+ envelope: at($.SceneReset, t),
1056
1056
  payload: {}
1057
1057
  }
1058
1058
  ],
@@ -1060,7 +1060,7 @@ function Eo(r, e, t, i, s = "data", o = "type", n, a) {
1060
1060
  };
1061
1061
  if (c.operate === "resource")
1062
1062
  return {
1063
- messages: bs(
1063
+ messages: Is(
1064
1064
  A,
1065
1065
  h,
1066
1066
  c,
@@ -1074,20 +1074,20 @@ function Eo(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, w = Ss(d, c, t, i, n, a);
1078
- return w ? { messages: [w], runtimeStatus: null } : (N("buildSocketMessage 返回 null(payload 缺少 device_id 字段)", {
1077
+ const d = h, C = xs(d, c, t, i, n, a);
1078
+ return C ? { messages: [C], runtimeStatus: null } : (N("buildSocketMessage 返回 null(payload 缺少 device_id 字段)", {
1079
1079
  sourceType: String(l),
1080
1080
  payload: d
1081
1081
  }), { messages: [], runtimeStatus: null });
1082
1082
  }
1083
- function Is(r, e) {
1083
+ function Ds(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 Ft(r, e, t, i, s) {
1090
+ function Dt(r, e, t, i, s) {
1091
1091
  const o = r && typeof r == "object" ? r : {}, n = {};
1092
1092
  return te(n, o, e.mappings, t, i, s), n;
1093
1093
  }
@@ -1101,10 +1101,10 @@ 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
- ], At = [
1107
+ ], lt = [
1108
1108
  { target: "resource_id", source: "resource_id" },
1109
1109
  { target: "resource_type", source: "resource_type" },
1110
1110
  { target: "resource_name", source: "resource_name" },
@@ -1118,18 +1118,18 @@ 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
- ], ni = Fe.map((r) => ({ ...r })), lt = [
1121
+ ], Ai = Fe.map((r) => ({ ...r })), ct = [
1122
1122
  { target: "resource_ids", source: "resource_ids" },
1123
1123
  { target: "resource_type", source: "resource_type" }
1124
1124
  ];
1125
- function Fs() {
1125
+ function Ts() {
1126
1126
  const r = {};
1127
- for (const e of ot)
1127
+ for (const e of rt)
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 ai = Fs(), se = [
1132
+ const li = Ts(), se = [
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" }
@@ -1142,30 +1142,30 @@ const ai = Fs(), se = [
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
- ], Qt = [
1145
+ ], Tt = [
1146
1146
  { target: "is_working", source: "is_working", defaultValue: !1, transformTargetType: "boolean" }
1147
- ], Qs = [{ 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" };
1148
- function Ai(r, e) {
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" };
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: ai[r],
1154
+ equipmentName: li[r],
1155
1155
  enabled: !0,
1156
1156
  operate: "single",
1157
1157
  // device_id 为协议必存字段(见文档 6.0),始终保留并置于首位
1158
1158
  mappings: [{ target: "device_id", source: "device_id", defaultValue: "" }, ...e]
1159
1159
  };
1160
1160
  }
1161
- const li = {
1161
+ const hi = {
1162
1162
  // 机床:light / progress / passage / station_rotation / is_working / device_state
1163
1163
  MachineTool: [
1164
1164
  ...se,
1165
1165
  ...Re,
1166
1166
  ...Le,
1167
- ...Qs,
1168
- ...Qt,
1167
+ ...ks,
1168
+ ...Tt,
1169
1169
  ...X
1170
1170
  ],
1171
1171
  // 接驳站:light / layer_visible / layer_light_colors / layer_light_blinking(源字段与协议一致)/ device_state
@@ -1220,7 +1220,7 @@ const li = {
1220
1220
  ...se,
1221
1221
  ...Re,
1222
1222
  ...Le,
1223
- ...Qt,
1223
+ ...Tt,
1224
1224
  ...X
1225
1225
  ],
1226
1226
  // RGV:light / position(含 x / j1 / fork_xy / fork_z)/ device_state
@@ -1236,11 +1236,11 @@ const li = {
1236
1236
  // 资源操作窗口:light(工位槽资源操作走 Resource 规则)/ device_state
1237
1237
  ResourceOperationWindow: [...Xe, ...X]
1238
1238
  };
1239
- function Ds() {
1239
+ function Rs() {
1240
1240
  return {
1241
1241
  className: "Resource",
1242
1242
  // Resource 为虚拟资源操作规则(非画布预设组件),EQUIPMENTS_MENU 中无对应条目,显示名取固定值
1243
- equipmentName: ai.Resource ?? "资源",
1243
+ equipmentName: li.Resource ?? "资源",
1244
1244
  enabled: !0,
1245
1245
  operate: "resource",
1246
1246
  mappings: [],
@@ -1249,10 +1249,10 @@ function Ds() {
1249
1249
  // 资源操作字段映射:target 为协议 payload 路径,源字段名取自业务 Resource 消息的标准 payload 字段
1250
1250
  resourceMappings: {
1251
1251
  add: Fe.map((r) => ({ ...r })),
1252
- batch_add: ni.map((r) => ({ ...r })),
1253
- transfer: At.map((r) => ({ ...r })),
1254
- remove: at.map((r) => ({ ...r })),
1255
- batch_remove: lt.map((r) => ({ ...r }))
1252
+ batch_add: Ai.map((r) => ({ ...r })),
1253
+ transfer: lt.map((r) => ({ ...r })),
1254
+ remove: At.map((r) => ({ ...r })),
1255
+ batch_remove: ct.map((r) => ({ ...r }))
1256
1256
  },
1257
1257
  // Resource 专属源字段配置默认值:operationField 按源 operation 分发(标准信封消息固定读 payload.operation,不受此项影响);
1258
1258
  // batch_add 资源项数组源路径默认指向 payload(data)下的 resources 字段
@@ -1262,7 +1262,7 @@ function Ds() {
1262
1262
  }
1263
1263
  };
1264
1264
  }
1265
- function Ts() {
1265
+ function Ls() {
1266
1266
  return {
1267
1267
  className: "ResetAll",
1268
1268
  sourceType: "scene_reset",
@@ -1271,7 +1271,7 @@ function Ts() {
1271
1271
  mappings: []
1272
1272
  };
1273
1273
  }
1274
- function ci() {
1274
+ function gi() {
1275
1275
  return {
1276
1276
  className: "RuntimeStatus",
1277
1277
  // RuntimeStatus 为虚拟规则(非画布预设组件),EQUIPMENTS_MENU 中无对应条目,显示名取固定值
@@ -1282,18 +1282,18 @@ function ci() {
1282
1282
  mappings: []
1283
1283
  };
1284
1284
  }
1285
- function Bo(r) {
1286
- const e = li[r];
1287
- return e ? Ai(r, e) : null;
1285
+ function Io(r) {
1286
+ const e = hi[r];
1287
+ return e ? ci(r, e) : null;
1288
1288
  }
1289
- function So(r, e) {
1289
+ function Fo(r, e) {
1290
1290
  const t = Array.from(new Set(e)), i = [];
1291
1291
  for (const s of t) {
1292
- const o = li[s];
1293
- o && i.push(Ai(s, o));
1292
+ const o = hi[s];
1293
+ o && i.push(ci(s, o));
1294
1294
  }
1295
- return i.push(Ds(), ci(), Ts()), {
1296
- fileUrl: rt,
1295
+ return i.push(Rs(), gi(), Ls()), {
1296
+ fileUrl: nt,
1297
1297
  version: "1",
1298
1298
  dataSource: "builtin",
1299
1299
  wsUrl: "",
@@ -1309,7 +1309,7 @@ function So(r, e) {
1309
1309
  rules: i
1310
1310
  };
1311
1311
  }
1312
- const ks = {
1312
+ const _s = {
1313
1313
  // 设备操作:内部 operating → device_command payload
1314
1314
  id: "device_id",
1315
1315
  // 资源操作:内部 operating(className 为目标设备路由字段)→ resource_command payload
@@ -1322,10 +1322,10 @@ const ks = {
1322
1322
  "resource.device_layer": "to.device_layer"
1323
1323
  };
1324
1324
  function Ee(r) {
1325
- const e = ks[r.target];
1325
+ const e = _s[r.target];
1326
1326
  return e ? { ...r, target: e } : r;
1327
1327
  }
1328
- function hi(r) {
1328
+ function ui(r) {
1329
1329
  const e = {
1330
1330
  ...r,
1331
1331
  mappings: r.mappings?.map(Ee) || []
@@ -1337,38 +1337,38 @@ function hi(r) {
1337
1337
  remove: r.resourceMappings.remove?.map(Ee)
1338
1338
  }), e;
1339
1339
  }
1340
- function gi(r) {
1340
+ function di(r) {
1341
1341
  const e = r.filter((i) => i.operate !== "global"), t = e.find((i) => i.className === "Resource" && i.operate === "resource");
1342
1342
  return t && (t.sourceType || (t.sourceType = $.ResourceCommand), t.resourceFields = {
1343
1343
  operationField: t.resourceFields?.operationField ?? "data.operation",
1344
1344
  batchAddItems: t.resourceFields?.batchAddItems ?? "data.resources"
1345
- }), e.some((i) => i.operate === "statusPush") || e.push(ci()), e;
1345
+ }), e.some((i) => i.operate === "statusPush") || e.push(gi()), e;
1346
1346
  }
1347
- function bo(r) {
1348
- return { ...r, rules: gi(r.rules.map(hi)) };
1347
+ function Qo(r) {
1348
+ return { ...r, rules: di(r.rules.map(ui)) };
1349
1349
  }
1350
- function ct(r) {
1350
+ function ht(r) {
1351
1351
  const e = r;
1352
1352
  if (!e || typeof e != "object" || !e.fileUrl && !e.name || !Array.isArray(e.rules)) return null;
1353
- const t = String(e.fileUrl || `public/${String(e.name).replace(/^\/+|\/+$/g, "")}.json`), { name: i, rules: s, ...o } = e, n = gi(s.map(hi));
1353
+ const t = String(e.fileUrl || `public/${String(e.name).replace(/^\/+|\/+$/g, "")}.json`), { name: i, rules: s, ...o } = e, n = di(s.map(ui));
1354
1354
  return { ...o, rules: n, fileUrl: t };
1355
1355
  }
1356
- function ui(r) {
1356
+ 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 = ct(t);
1360
+ const i = ht(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 Rs(r) {
1366
+ function Us(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 || rt,
1371
+ fileUrl: r.fileUrl || nt,
1372
1372
  version: r.version,
1373
1373
  dataSource: r.dataSource,
1374
1374
  wsUrl: r.wsUrl,
@@ -1384,27 +1384,27 @@ function Rs(r) {
1384
1384
  };
1385
1385
  return JSON.stringify(t, null, 2);
1386
1386
  }
1387
- function vo(r) {
1387
+ function Do(r) {
1388
1388
  return JSON.stringify(
1389
- r.map((e) => JSON.parse(Rs(e))),
1389
+ r.map((e) => JSON.parse(Us(e))),
1390
1390
  null,
1391
1391
  2
1392
1392
  );
1393
1393
  }
1394
- function di(r) {
1395
- const e = ui(r);
1394
+ function pi(r) {
1395
+ const e = fi(r);
1396
1396
  if (e) return e;
1397
- const t = ct(r);
1397
+ const t = ht(r);
1398
1398
  return t ? [{ ...t, caseId: "" }] : [];
1399
1399
  }
1400
- function xo() {
1400
+ function To() {
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 Io(r, e) {
1407
- const t = ys(r);
1406
+ async function ko(r, e) {
1407
+ const t = Ss(r);
1408
1408
  try {
1409
1409
  const i = await fetch(t);
1410
1410
  if (!i.ok)
@@ -1413,20 +1413,20 @@ async function Io(r, e) {
1413
1413
  if (Array.isArray(s)) {
1414
1414
  if (s.length === 0)
1415
1415
  return { status: "invalid", reason: "配置数组为空" };
1416
- const n = ui(s);
1416
+ const n = fi(s);
1417
1417
  if (!n)
1418
1418
  return { status: "invalid", reason: "数据结构异常" };
1419
1419
  const a = e ? n.find((A) => A.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 = ct(s);
1422
+ const o = ht(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 Dt = V("DataStore"), je = {
1429
- logLevel: Ti(),
1428
+ const kt = P("DataStore"), je = {
1429
+ logLevel: Li(),
1430
1430
  shadowsEnabled: !0,
1431
1431
  animationsEnabled: !0,
1432
1432
  fpsMode: "auto",
@@ -1436,16 +1436,16 @@ const Dt = V("DataStore"), je = {
1436
1436
  wsProxyManualModified: !1,
1437
1437
  wsProxyActiveCaseId: "",
1438
1438
  perfStatsCollapsed: !1
1439
- }, ht = "@jnrs/lingshu-smart/ws-proxy-config", Tt = "@jnrs/lingshu-smart/debug", kt = "@jnrs/lingshu-smart/script-steps", Rt = "@jnrs/lingshu-smart/data";
1440
- function fi() {
1439
+ }, gt = "@jnrs/lingshu-smart/ws-proxy-config", Rt = "@jnrs/lingshu-smart/debug", Lt = "@jnrs/lingshu-smart/script-steps", _t = "@jnrs/lingshu-smart/data";
1440
+ function wi() {
1441
1441
  try {
1442
- const r = localStorage.getItem(ht);
1443
- return r ? di(JSON.parse(r)) : [];
1442
+ const r = localStorage.getItem(gt);
1443
+ return r ? pi(JSON.parse(r)) : [];
1444
1444
  } catch {
1445
1445
  return [];
1446
1446
  }
1447
1447
  }
1448
- function Ls() {
1448
+ function Os() {
1449
1449
  try {
1450
1450
  if (localStorage.getItem("@jnrs/lingshu-smart")) return;
1451
1451
  const r = {
@@ -1453,32 +1453,32 @@ function Ls() {
1453
1453
  wsProxyConfig: [],
1454
1454
  globalSetting: {},
1455
1455
  scriptRunner: []
1456
- }, e = localStorage.getItem(Rt);
1456
+ }, e = localStorage.getItem(_t);
1457
1457
  if (e)
1458
1458
  try {
1459
1459
  const s = JSON.parse(e);
1460
1460
  Array.isArray(s.cases) && (r.cases = s.cases), Array.isArray(s.wsProxyConfig) && (r.wsProxyConfig = s.wsProxyConfig);
1461
1461
  } catch {
1462
1462
  }
1463
- r.wsProxyConfig.length === 0 && (r.wsProxyConfig = fi());
1464
- const t = localStorage.getItem(Tt);
1463
+ r.wsProxyConfig.length === 0 && (r.wsProxyConfig = wi());
1464
+ const t = localStorage.getItem(Rt);
1465
1465
  if (t)
1466
1466
  try {
1467
1467
  r.globalSetting = JSON.parse(t);
1468
1468
  } catch {
1469
1469
  }
1470
- const i = localStorage.getItem(kt);
1470
+ const i = localStorage.getItem(Lt);
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(Rt), localStorage.removeItem(Tt), localStorage.removeItem(kt), localStorage.removeItem(ht);
1477
+ localStorage.setItem("@jnrs/lingshu-smart", JSON.stringify(r)), localStorage.removeItem(_t), localStorage.removeItem(Rt), localStorage.removeItem(Lt), localStorage.removeItem(gt);
1478
1478
  } catch {
1479
1479
  }
1480
1480
  }
1481
- Ls();
1481
+ Os();
1482
1482
  const Ue = (r) => {
1483
1483
  if (Array.isArray(r)) {
1484
1484
  r.forEach((e) => Ue(e));
@@ -1490,10 +1490,10 @@ const Ue = (r) => {
1490
1490
  t && typeof t == "object" && Ue(t);
1491
1491
  });
1492
1492
  }
1493
- }, gt = Ne(
1493
+ }, ut = Ne(
1494
1494
  "@jnrs/lingshu-smart/data",
1495
1495
  () => {
1496
- const r = oe(ot), e = ce([]), t = ce(!1), i = ce([]), s = (g) => {
1496
+ const r = oe(rt), e = ce([]), t = ce(!1), i = ce([]), s = (g) => {
1497
1497
  i.value = oe(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);
@@ -1512,13 +1512,13 @@ const Ue = (r) => {
1512
1512
  e.value = [];
1513
1513
  return;
1514
1514
  }
1515
- if (Ue(g), rs(g))
1515
+ if (Ue(g), As(g))
1516
1516
  e.value = g;
1517
1517
  else {
1518
1518
  const m = "运行 updateCases 函数时参数校验失败:发现非法的 ICase, ILayer 或 IScene 结构";
1519
- throw Dt.error(m, g), new Error(m);
1519
+ throw kt.error(m, g), new Error(m);
1520
1520
  }
1521
- }, w = (g) => {
1521
+ }, C = (g) => {
1522
1522
  e.value.find((y) => y.id === g) && e.value.forEach((y) => {
1523
1523
  y.isActive = y.id === g;
1524
1524
  });
@@ -1533,20 +1533,20 @@ const Ue = (r) => {
1533
1533
  scriptsConfig: o,
1534
1534
  // actions
1535
1535
  updateCases: d,
1536
- selectCase: w,
1536
+ selectCase: C,
1537
1537
  addCase: (g) => {
1538
- const m = st();
1538
+ const m = ot();
1539
1539
  let y;
1540
1540
  if (g)
1541
- if (si(g))
1541
+ if (ri(g))
1542
1542
  y = oe(g), y.id = m, y.isActive = !1;
1543
1543
  else {
1544
1544
  const E = "运行 addCase 函数时参数校验失败:发现非法的 ICase, ILayer 或 IScene 结构";
1545
- throw Dt.error(E, g), new Error(E);
1545
+ throw kt.error(E, g), new Error(E);
1546
1546
  }
1547
1547
  else
1548
- y = oe(ps), y.id = m, y.title = `方案${m.slice(0, 8)}`;
1549
- return e.value.push(y), w(m), y;
1548
+ y = oe(ms), y.id = m, y.title = `方案${m.slice(0, 8)}`;
1549
+ return e.value.push(y), C(m), y;
1550
1550
  },
1551
1551
  removeCase: (g) => {
1552
1552
  const m = e.value.findIndex((y) => y.id === g);
@@ -1578,7 +1578,7 @@ const Ue = (r) => {
1578
1578
  serialize: (r) => {
1579
1579
  const e = r;
1580
1580
  return JSON.stringify({
1581
- cases: ki(e.cases ?? []),
1581
+ cases: _i(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 = Di(e.cases), e.cases.forEach((t) => Ue(t))), Array.isArray(e?.wsProxyConfig) ? e.wsProxyConfig = di(e.wsProxyConfig) : (e.wsProxyConfig = fi(), 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) => ({
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) => ({
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 _s(r) {
1609
+ function Ks(r) {
1610
1610
  return r ? {
1611
1611
  green: "绿色",
1612
1612
  red: "红色",
@@ -1615,23 +1615,23 @@ function _s(r) {
1615
1615
  "#DFC285": "黄色"
1616
1616
  }[r] ?? r : "未设置";
1617
1617
  }
1618
- function Us(r) {
1618
+ function Ms(r) {
1619
1619
  const e = [];
1620
- return r.color !== void 0 && e.push(`运行灯:${_s(r.color)}`), r.rotating && e.push("旋转"), r.blinking && e.push("闪烁"), e.length > 0 ? e.join("/") : "灯:保持";
1620
+ return r.color !== void 0 && e.push(`运行灯:${Ks(r.color)}`), r.rotating && e.push("旋转"), r.blinking && e.push("闪烁"), e.length > 0 ? e.join("/") : "灯:保持";
1621
1621
  }
1622
- function Os(r) {
1622
+ function Ns(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 Ks(r) {
1626
+ function Gs(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 Ms(r) {
1630
+ function Ps(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 Ns(r) {
1634
+ function Vs(r) {
1635
1635
  return `夹具:${{
1636
1636
  [x.WORKPIECE]: "工件",
1637
1637
  [x.TOOL]: "刀具",
@@ -1639,18 +1639,129 @@ function Ns(r) {
1639
1639
  none: "空"
1640
1640
  }[r] ?? r}`;
1641
1641
  }
1642
- function Gs(r) {
1642
+ function qs(r) {
1643
1643
  const e = r, t = [];
1644
- e.light && t.push(Us(e.light)), e.progress && t.push(Os(e.progress)), e.passage && t.push(Ks(e.passage)), e.resource && t.push(Ms(e.resource));
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));
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(Ns(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(Vs(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
  }
1650
1650
  return t.length > 0 ? t.join(", ") : "无操作数据";
1651
1651
  }
1652
- const Lt = 300;
1653
- class Y extends Ri {
1652
+ function q(r = {}) {
1653
+ const e = {
1654
+ x: 0,
1655
+ y: 0,
1656
+ width: 5,
1657
+ height: 5,
1658
+ fill: "",
1659
+ styleType: "light",
1660
+ ...r
1661
+ };
1662
+ r.fill === void 0 && (e.fill = e.styleType === "dark" ? "#777" : "#ccc");
1663
+ const t = 0.15, i = e.styleType === "dark" ? "#333" : "#888", s = new I({
1664
+ hittable: !1,
1665
+ className: "screw-hole",
1666
+ x: e.x,
1667
+ y: e.y,
1668
+ width: e.width,
1669
+ height: e.height,
1670
+ fill: e.fill,
1671
+ cornerRadius: e.width / 2,
1672
+ stroke: i,
1673
+ strokeWidth: t,
1674
+ around: "center"
1675
+ }), o = Math.min(e.width, e.height), n = e.width / 2, a = e.height / 2, A = new Ki({
1676
+ x: n,
1677
+ y: a,
1678
+ width: o,
1679
+ height: o,
1680
+ innerRadius: 0.25,
1681
+ corners: 5,
1682
+ cornerRadius: 2,
1683
+ rotation: 30,
1684
+ fill: i,
1685
+ around: "center"
1686
+ });
1687
+ return s.add(A), s;
1688
+ }
1689
+ const dt = 14, Ws = 18, it = 4;
1690
+ function Ci(r, e = dt) {
1691
+ const t = /[\u2E80-\u9FFF\uF900-\uFAFF\uFF00-\uFFEF\u3000-\u303F]/g, i = (r.match(t) || []).length, s = r.length - i;
1692
+ return Math.max(20, Math.ceil((i + s * 0.5 + 2) * e));
1693
+ }
1694
+ function Hs(r, e) {
1695
+ const [t, i, s] = r.children;
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 });
1699
+ }
1700
+ function z(r) {
1701
+ const e = {
1702
+ x: 0,
1703
+ y: 0,
1704
+ width: void 0,
1705
+ // 显式区分是否传入
1706
+ height: Ws,
1707
+ cornerRadius: 2,
1708
+ fill: "#f2f2f2",
1709
+ textColor: "#d15f2c",
1710
+ fontSize: dt,
1711
+ stroke: "rgba(0,0,0,0.2)",
1712
+ strokeWidth: 1,
1713
+ screwHole: !0,
1714
+ zIndex: -1,
1715
+ ...r
1716
+ }, t = e.width ?? Ci(e.title, e.fontSize), i = {
1717
+ text: e.title,
1718
+ textAlign: "center",
1719
+ verticalAlign: "middle",
1720
+ fill: e.textColor,
1721
+ fontWeight: "black",
1722
+ width: t,
1723
+ height: e.height,
1724
+ lineHeight: e.height,
1725
+ // 行距为 0
1726
+ wordWrap: !!e.width,
1727
+ // 仅当指定了 width 时才允许换行
1728
+ overflow: "hide"
1729
+ };
1730
+ e.width !== void 0 ? i.fontSize = Math.min(e.fontSize, 12) : i.fontSize = e.fontSize;
1731
+ const s = new Mi(i), o = new I({
1732
+ hittable: !1,
1733
+ className: "name-plate",
1734
+ x: e.x,
1735
+ y: e.y,
1736
+ width: t,
1737
+ height: e.height,
1738
+ fill: e.fill,
1739
+ overflow: "hide",
1740
+ around: "center",
1741
+ stroke: e.stroke,
1742
+ strokeWidth: e.strokeWidth,
1743
+ cornerRadius: e.cornerRadius,
1744
+ zIndex: e.zIndex,
1745
+ children: [s]
1746
+ });
1747
+ if (e.screwHole) {
1748
+ const n = e.height / 2, a = it, A = q({
1749
+ x: a,
1750
+ y: n,
1751
+ width: a,
1752
+ height: a
1753
+ }), l = q({
1754
+ x: t - a,
1755
+ y: n,
1756
+ width: a,
1757
+ height: a
1758
+ });
1759
+ o.add([A, l]);
1760
+ }
1761
+ return o;
1762
+ }
1763
+ const Ut = 300;
1764
+ class Y extends Ui {
1654
1765
  eventHandler = null;
1655
1766
  /**
1656
1767
  * 画布控制器引用(AppController.addModel 时注入,早于 init)
@@ -1666,8 +1777,20 @@ class Y extends Ri {
1666
1777
  }
1667
1778
  // 处理设备操作
1668
1779
  handleOperation = (e) => {
1669
- this.logger.operating(Gs(e)), this.writeOperatingData(e), this.operating(e);
1780
+ this.logger.operating(qs(e)), this.writeOperatingData(e);
1781
+ const t = e.nameplate;
1782
+ t !== void 0 && this.setNameplate(t), this.operating(e);
1670
1783
  };
1784
+ /**
1785
+ * 更新设备铭牌文本(铭牌宽度、文字宽度与两端螺钉孔位置同步重算)
1786
+ * 仅作用于画布 UI,不写入 config:复位(resetUI)后铭牌回到配置里的初始文本,
1787
+ * 动态文本(如「名称(资源数/工位数)」)需由使用方在 scene_reset 后重新下发
1788
+ * @param title 铭牌文本
1789
+ */
1790
+ setNameplate(e) {
1791
+ if (!this.ui) return;
1792
+ this.ui.find(".name-plate").forEach((i) => Hs(i, e));
1793
+ }
1671
1794
  /**
1672
1795
  * 将最近一次 operating 接收到的原始数据写入模型 config 及整棵 UI 树的 data 属性,
1673
1796
  * 使点击回调(onTap/onMenuTap/onDragEnd)中的 layer 与 data 都能读取到各自 operatingData。
@@ -1687,7 +1810,7 @@ class Y extends Ri {
1687
1810
  // 点击事件回调
1688
1811
  tapCallback = Se((e) => {
1689
1812
  this.shouldHandleInteraction(e, this.config.clickable) && this.emitTap(e.target.data);
1690
- }, Lt);
1813
+ }, Ut);
1691
1814
  /**
1692
1815
  * 点击回调分发(子类可覆盖以改写 layer / data,如扩展工位绑定模式下托盘点击需替换为宿主设备)
1693
1816
  * 默认:layer 为模型自身 config,data 为实际命中元素的 data 属性
@@ -1698,14 +1821,14 @@ class Y extends Ri {
1698
1821
  // 右键点击事件回调
1699
1822
  menuTapCallback = Se((e) => {
1700
1823
  this.shouldHandleInteraction(e, this.config.menuClickable) && this.eventHandler?.onMenuTap?.(this.config, e.target.data);
1701
- }, Lt);
1824
+ }, Ut);
1702
1825
  // 拖拽事件回调
1703
1826
  dragCallback = (e) => {
1704
1827
  this.shouldHandleInteraction(e, this.config.draggable) && this.eventHandler?.onDragEnd?.(this.config, e.target.data);
1705
1828
  };
1706
1829
  // 注册事件(事件委托模式)
1707
1830
  setEventHandler(e) {
1708
- 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(Ct.END, this.dragCallback));
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));
1709
1832
  }
1710
1833
  /**
1711
1834
  * 判断模型是否包含指定工位号
@@ -1766,7 +1889,7 @@ class Y extends Ri {
1766
1889
  }
1767
1890
  // 销毁 UI 和事件绑定
1768
1891
  destroyUI() {
1769
- this.initialized && (this.ui.off(ke.TAP, this.tapCallback), this.ui.off(ke.MENU_TAP, this.menuTapCallback), this.ui.off(Ct.END, this.dragCallback), super.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());
1770
1893
  }
1771
1894
  /**
1772
1895
  * 复位:销毁当前 UI 并按初始配置重建(编辑器设置值优先,未设置的字段取模型类默认值)
@@ -1777,14 +1900,14 @@ class Y extends Ri {
1777
1900
  this.initialized && (this.destroyUI(), this.init());
1778
1901
  }
1779
1902
  }
1780
- const pi = "data:image/png;base64,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", wi = "data:image/png;base64,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", Ci = "data:image/png;base64,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", 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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", Vs = "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==", Ps = {
1781
- LightGrid: pi,
1782
- DarkGrid: wi,
1783
- MatrixGrid: Ci,
1784
- LightDot: mi,
1785
- DarkDot: yi,
1786
- WoodFloor: Ei,
1787
- VerticalBar: Vs
1903
+ const mi = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAACMxJREFUeF7t2cGB2DAMxEBu/0XLZeDhSQNMIBwJX/bee/fjP9tW/vPxx7/0bwQkYCqgBVziPwuAgK2A+Lf8FYACKA30CVbSPwVAwFhABZA+gE8AArYC4t/y9wngE6A0UIGV9H0CHAFjARVA+gA+AQjYCoh/y98ngE+A0kAFVtL3CeAToPUP/5q/AlAApYMKoKSvAFyg1j/8a/4KQAGUDiqAkr4CcIFa//Cv+SsABVA6qABK+grABWr9w7/mrwAUQOmgAijpKwAXqPUP/5q/AlAApYMKoKSvAFyg1j/8a/4KQAGUDiqAkr4CcIFa//Cv+SsABVA6qABK+grABWr9w7/mrwAUQOmgAijpKwAXqPUP/5q/AlAApYMKoKSvAFyg1j/8a/4KQAGUDiqAkr4CcIFa//Cv+SsABVA6qABK+grABWr9w7/mrwAUQOmgAijpKwAXqPUP/5q/AlAApYMKoKSvAFyg1j/8a/4KQAGUDiqAkr4CcIFa//Cv+SsABVA6qABK+grABWr9w7/mrwAUQOmgAijpKwAXqPUP/5q/AlAApYMKoKSvAFyg1j/8a/4KQAGUDiqAkr4CcIFa//Cv+SsABVA6qABK+grABWr9w7/mrwAUQOmgAijpKwAXqPUP/5q/AlAApYMKoKSvAFyg1j/8a/4KQAGUDiqAkr4CcIFa//Cv+SsABVA6qABK+grABWr9w7/mrwAUQOmgAijpKwAXqPUP/5q/AlAApYMKoKSvAFyg1j/8a/4KQAGUDiqAkr4CcIFa//Cv+SsABVA6qABK+ndrx5uOAAIlAQugpG82AjEBCyB+AOMRKAlYACV9sxGICVgA8QMYj0BJwAIo6ZuNQEzAAogfwHgESgIWQEnfbARiAhZA/ADGI1ASsABK+mYjEBOwAOIHMB6BkoAFUNI3G4GYgAUQP4DxCJQELICSvtkIxAQsgPgBjEegJGABlPTNRiAmYAHED2A8AiUBC6CkbzYCMQELIH4A4xEoCVgAJX2zEYgJWADxAxiPQEnAAijpm41ATMACiB/AeARKAhZASd9sBGICFkD8AMYjUBKwAEr6ZiMQE7AA4gcwHoGSgAVQ0jcbgZiABRA/gPEIlAQsgJK+2QjEBCyA+AGMR6AkYAGU9M1GICaw996L/w7p+G3pEsQf//IHwAKwAEr/zgJO8Z8FYAGkBloAKX4LgICxgBZw+gAKgICtgPi3/P0Syi+hSgMVWEn/fAIQMBZQAaQP4BOAgK2A+Lf8fQL4BCgNVGAlfZ8A/h+69Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+YfzzceAQRCAgtnG40AAjEBCyB+AOMRKAlYACV9sxGICVgA8QMYj0BJwAIo6ZuNQEzAAogfwHgESgIWQEnfbARiAhZA/ADGI1ASsABK+mYjEBOwAOIHMB6BkoAFUNI3G4GYgAUQP4DxCJQELICSvtkIxAQsgPgBjEegJGABlPTNRiAmYAHED2A8AiUBC6CkbzYCMQELIH4A4xEoCVgAJX2zEYgJWADxAxiPQEnAAijpm41ATMACiB/AeARKAhZASd9sBGICFkD8AMYjUBKwAEr6ZiMQE7AA4gcwHoGSgAVQ0jcbgZiABRA/gPEIlAQsgJK+2QjEBCyA+AGMR6AkYAGU9M1GICaw996L/w7p+G3pEsQf//IHwAKwAEr/zgJO8Z8FYAGkBloAKX4LgICxgBZw+gAKgICtgPi3/P0Syi+hSgMVWEn/fAIQMBZQAaQP4BOAgK2A+Lf8fQL4BCgNVGAlfZ8A/h+69Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3Dv+avABRA6aACKOkrABeo9Q//mr8CUAClgwqgpK8AXKDWP/xr/gpAAZQOKoCSvgJwgVr/8K/5KwAFUDqoAEr6CsAFav3DP+b/AWFi/nlo8iwEAAAAAElFTkSuQmCC", yi = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAACJFJREFUeF7t1kEVQkEMxdCpn/pXUj8fGVlwMVDIhHcyu/u9P/7c3ZQ/H3/8S/+GgAQsBTTAJf33DIACSA00ACl+A0DAVkD8W/4KQAGkBhqAFL8CIGArIP4tfwWgAFIDDUCKXwEQsBUQ/5a/AlAAqYEGIMWvAAjYCoh/y18BKIDUQAOQ4lcABGwFxL/lrwAUQGqgAUjxKwACtgLi3/JXAAogNdAApPgVAAFbAfFv+SsABZAaaABS/AqAgK2A+Lf8FYACSA00ACl+BUDAVkD8W/4KQAGkBhqAFL8CIGArIP4tfwWgAFIDDUCKXwEQsBUQ/5a/AlAAqYEGIMWvAAjYCoh/y18BKIDUQAOQ4lcABGwFxL/lrwAUQGqgAUjxKwACtgLi3/JXAAogNdAApPgVAAFbAfFv+SsABZAaaABS/AqAgK2A+Lf8FYACSA00ACl+BUDAVkD8W/4KQAGkBhqAFL8CIGArIP4tfwWgAFIDDUCKXwEQsBUQ/5a/AlAAqYEGIMWvAAjYCoh/y18BKIDUQAOQ4lcABGwFxL/lrwAUQGqgAUjxKwACtgLi3/JXAAogNdAApPgVAAFbAfFv+SsABZAaaABS/AqAgK2A+Lf8FYACSA00ACl+BUDAVkD8W/4KQAGkBhqAFL8CIGArIP4tfwWgAFIDDUCKXwEQsBUQ/5a/AlAAqYEGIMWvAAjYCoh/y18BKIDUQAOQ4lcABGwFxL/lrwAUQGqgAUjxKwACtgLi3/JXAAogNdAApPgVAAFbAfFv+U973nUEECgJGICSvtsIxAQMQPwAziNQEjAAJX23EYgJGID4AZxHoCRgAEr6biMQEzAA8QM4j0BJwACU9N1GICZgAOIHcB6BkoABKOm7jUBMwADED+A8AiUBA1DSdxuBmIABiB/AeQRKAgagpO82AjEBAxA/gPMIlAQMQEnfbQRiAgYgfgDnESgJGICSvtsIxAQMQPwAziNQEjAAJX23EYgJGID4AZxHoCRgAEr6biMQEzAA8QM4j0BJwACU9N1GICZgAOIHcB6BkoABKOm7jUBMwADED+A8AiUBA1DSdxuBmIABiB/AeQRKAgagpO82AjEBAxA/gPMIlAQMQEnfbQRiArO7X/wd0vN3l44g/viXfwADYABK/54BTvE/A2AAUgMNQIrfABCwFRD/lr8CUACpgQYgxa8ACNgKiH/LXwEogNRAA5DiVwAEbAXEv+WvABRAaqABSPErAAK2AuLf8lcACiA10ACk+BUAAVsB8W/5KwAFkBpoAFL8CoCArYD4t/wVgAJIDTQAKX4FQMBWQPxb/gpAAaQGGoAUvwIgYCsg/i1/BaAAUgMNQIpfARCwFRD/lr8CUACpgQYgxa8ACNgKiH/LXwEogNRAA5DiVwAEbAXEv+WvABRAaqABSPErAAK2AuLf8lcACiA10ACk+BUAAVsB8W/5KwAFkBpoAFL8CoCArYD4t/wVgAJIDTQAKX4FQMBWQPxb/gpAAaQGGoAUvwIgYCsg/i1/BaAAUgMNQIpfARCwFRD/lr8CUACpgQYgxa8ACNgKiH/LXwEogNRAA5DiVwAEbAXEv+WvABRAaqABSPErAAK2AuLf8lcACiA10ACk+BUAAVsB8W/5KwAFkBpoAFL8CoCArYD4t/wVgAJIDTQAKX4FQMBWQPxb/gpAAaQGGoAUvwIgYCsg/i1/BaAAUgMNQIpfARCwFRD/lr8CUACpgQYgxa8ACNgKiH/LXwEogNRAA5DiVwAEbAXEv+WvABRAaqABSPErAAK2AuLf8lcACiA10ACk+BUAAVsB8W/5KwAFkBpoAFL8CoCArYD4t/wVgAJIDTQAKX4FQMBWQPxb/tOedx0BBEoCBqCk7zYCMQEDED+A8wiUBAxASd9tBGICBiB+AOcRKAkYgJK+2wjEBAxA/ADOI1ASMAAlfbcRiAkYgPgBnEegJGAASvpuIxATMADxAziPQEnAAJT03UYgJmAA4gdwHoGSgAEo6buNQEzAAMQP4DwCJQEDUNJ3G4GYgAGIH8B5BEoCBqCk7zYCMQEDED+A8wiUBAxASd9tBGICBiB+AOcRKAkYgJK+2wjEBAxA/ADOI1ASMAAlfbcRiAkYgPgBnEegJGAASvpuIxATMADxAziPQEnAAJT03UYgJmAA4gdwHoGSgAEo6buNQEzAAMQP4DwCJQEDUNJ3G4GYwOzuF3+H9PzdpSOIP/7lH8AAGIDSv2eAU/zPABiA1EADkOI3AARsBcS/5a8AFEBqoAFI8SsAArYC4t/yVwAKIDXQAKT4FQABWwHxb/krAAWQGmgAUvwKgICtgPi3/BWAAkgNNAApfgVAwFZA/Fv+CkABpAYagBS/AiBgKyD+LX8FoABSAw1Ail8BELAVEP+WvwJQAKmBBiDFrwAI2AqIf8tfASiA1EADkOJXAARsBcS/5a8AFEBqoAFI8SsAArYC4t/yVwAKIDXQAKT4FQABWwHxb/krAAWQGmgAUvwKgICtgPi3/BWAAkgNNAApfgVAwFZA/Fv+CkABpAYagBS/AiBgKyD+LX8FoABSAw1Ail8BELAVEP+WvwJQAKmBBiDFrwAI2AqIf8tfASiA1EADkOJXAARsBcS/5a8AFEBqoAFI8SsAArYC4t/yVwAKIDXQAKT4FQABWwHxb/krAAWQGmgAUvwKgICtgPi3/BWAAkgNNAApfgVAwFZA/Fv+CkABpAYagBS/AiBgKyD+LX8FoABSAw1Ail8BELAVEP+WvwJQAKmBBiDFrwAI2AqIf8tfASiA1EADkOJXAARsBcS/5a8AFEBqoAFI8SsAArYC4t/yVwAKIDXQAKT4FQABWwHxb/krAAWQGmgAUvwKgICtgPi3/BWAAkgNNAApfgVAwFZA/Fv+CkABpAYagBS/AiBgKyD+LX8FoABSAw1Ail8BELAVEP+W/w86LyOquAC9QwAAAABJRU5ErkJggg==", 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
1788
1911
  };
1789
1912
  function Ae(r = {}) {
1790
1913
  const {
@@ -1807,14 +1930,14 @@ function Ae(r = {}) {
1807
1930
  cornerRadius: A,
1808
1931
  overflow: "hide",
1809
1932
  children: [
1810
- new _i({
1933
+ new Ni({
1811
1934
  className: "Texture-Image",
1812
1935
  width: t,
1813
1936
  height: i,
1814
1937
  opacity: o,
1815
1938
  fill: {
1816
1939
  type: "image",
1817
- url: Ps[s],
1940
+ url: Xs[s],
1818
1941
  mode: "repeat",
1819
1942
  scale: n,
1820
1943
  rotation: a
@@ -1823,7 +1946,7 @@ function Ae(r = {}) {
1823
1946
  ]
1824
1947
  });
1825
1948
  }
1826
- class ut extends Y {
1949
+ class ft extends Y {
1827
1950
  static DEFAULT_HEIGHT = 60;
1828
1951
  chains = /* @__PURE__ */ new Map();
1829
1952
  createUi() {
@@ -1831,7 +1954,7 @@ class ut extends Y {
1831
1954
  id: e,
1832
1955
  className: t,
1833
1956
  width: i,
1834
- height: s = ut.DEFAULT_HEIGHT,
1957
+ height: s = ft.DEFAULT_HEIGHT,
1835
1958
  x: o,
1836
1959
  y: n,
1837
1960
  offsetX: a,
@@ -1840,7 +1963,7 @@ class ut extends Y {
1840
1963
  rotation: c,
1841
1964
  scale: h,
1842
1965
  visible: d,
1843
- editable: w,
1966
+ editable: C,
1844
1967
  draggable: p
1845
1968
  } = this.config, f = new I({
1846
1969
  id: e,
@@ -1856,7 +1979,7 @@ class ut extends Y {
1856
1979
  rotation: c,
1857
1980
  scale: h,
1858
1981
  visible: d,
1859
- editable: w,
1982
+ editable: C,
1860
1983
  draggable: p,
1861
1984
  around: "center",
1862
1985
  overflow: "hidden",
@@ -1937,14 +2060,14 @@ class ut extends Y {
1937
2060
  }
1938
2061
  }
1939
2062
  }
1940
- let Bi = !0;
1941
- function qs(r) {
1942
- Bi = r;
2063
+ let vi = !0;
2064
+ function Js(r) {
2065
+ vi = r;
1943
2066
  }
1944
2067
  function ue() {
1945
- return Bi;
2068
+ return vi;
1946
2069
  }
1947
- class Ve extends De {
2070
+ class Pe extends De {
1948
2071
  // 缓存上次操作值,避免重复 set 触发不必要的重绘
1949
2072
  lastColor;
1950
2073
  lastBlinking;
@@ -2014,21 +2137,21 @@ class Ve extends De {
2014
2137
  }), this.ui.findOne(".rotateLight")?.set({
2015
2138
  fill: s
2016
2139
  })), h) {
2017
- const d = ue(), w = this.ui.findOne(".rotateLight"), p = s ?? this.lastColor ?? this.config.color ?? "#424242";
2140
+ const d = ue(), C = this.ui.findOne(".rotateLight"), p = s ?? this.lastColor ?? this.config.color ?? "#424242";
2018
2141
  if (d && l) {
2019
2142
  const f = c ? [
2020
2143
  { rotation: 0, opacity: 1 },
2021
2144
  { rotation: 180, opacity: 0.25 },
2022
2145
  { rotation: 360, opacity: 1 }
2023
2146
  ] : [{ rotation: 0 }, { rotation: 360 }];
2024
- w?.set({
2147
+ C?.set({
2025
2148
  animation: {
2026
2149
  keyframes: f,
2027
2150
  duration: c ? 0.5 : 0.3,
2028
2151
  easing: "linear",
2029
2152
  loop: !0
2030
2153
  }
2031
- }), w?.set({
2154
+ }), C?.set({
2032
2155
  fill: {
2033
2156
  type: "linear",
2034
2157
  stops: [
@@ -2040,19 +2163,19 @@ class Ve extends De {
2040
2163
  });
2041
2164
  } else if (d && c) {
2042
2165
  const f = this.config.color;
2043
- w?.set({
2166
+ C?.set({
2044
2167
  animation: {
2045
2168
  keyframes: [{ fill: p }, { fill: f }, { fill: p }],
2046
2169
  duration: 0.5,
2047
2170
  loop: !0
2048
2171
  }
2049
- }), w?.set({
2172
+ }), C?.set({
2050
2173
  fill: p
2051
2174
  });
2052
2175
  } else
2053
- w?.set({
2176
+ C?.set({
2054
2177
  animation: void 0
2055
- }), w?.set({
2178
+ }), C?.set({
2056
2179
  fill: p
2057
2180
  });
2058
2181
  }
@@ -2120,7 +2243,7 @@ class J extends De {
2120
2243
  A?.set({ animation: void 0 }), A?.set({ fill: l });
2121
2244
  }
2122
2245
  }
2123
- class Pe extends De {
2246
+ class Ve extends De {
2124
2247
  constructor(e) {
2125
2248
  const t = {
2126
2249
  x: 0,
@@ -2270,11 +2393,11 @@ class qe extends De {
2270
2393
  });
2271
2394
  }
2272
2395
  }
2273
- const Be = V("StationSlotGroup");
2274
- function Ws(r) {
2396
+ const Be = P("StationSlotGroup");
2397
+ function js(r) {
2275
2398
  return r === void 0 ? void 0 : r.trim() || void 0;
2276
2399
  }
2277
- class z extends De {
2400
+ class Z extends De {
2278
2401
  parentRotation;
2279
2402
  stationSlotInstances;
2280
2403
  // 存储 StationSlot 实例的 Map,key 为 IStationSlotConfig.index
@@ -2296,11 +2419,11 @@ class z extends De {
2296
2419
  if (n === !1)
2297
2420
  return { width: i, height: s };
2298
2421
  if (o === "x" || o === "x-reverse") {
2299
- const h = l * a + A * (a - 1), d = i > 0 ? i : h, w = i > 0 ? Math.max(1, Math.floor((i + A) / (l + A))) : Math.max(1, a), p = Math.ceil(t.length / w), f = c * p + A * (p - 1);
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);
2300
2423
  return { width: d, height: f };
2301
2424
  }
2302
2425
  if (o === "y" || o === "y-reverse") {
2303
- const h = c * a + A * (a - 1), d = s > 0 ? s : h, w = s > 0 ? Math.max(1, Math.floor((s + A) / (c + A))) : Math.max(1, a), p = Math.ceil(t.length / w);
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);
2304
2427
  return { width: l * p + A * (p - 1), height: d };
2305
2428
  }
2306
2429
  return { width: i, height: s };
@@ -2326,7 +2449,7 @@ class z extends De {
2326
2449
  Be.warn("StationSlot 缺少有效的 index 字段:", f);
2327
2450
  continue;
2328
2451
  }
2329
- const u = new Li({
2452
+ const u = new Oi({
2330
2453
  ...f,
2331
2454
  parentRotation: this.parentRotation,
2332
2455
  sourceSlot: this.sourceSlots[p]
@@ -2396,7 +2519,7 @@ class z extends De {
2396
2519
  Be.warn(`修改工位颜色失败:未找到 index=${e} 的工位槽`);
2397
2520
  return;
2398
2521
  }
2399
- i.setSiteWorkingColor(Ws(t));
2522
+ i.setSiteWorkingColor(js(t));
2400
2523
  }
2401
2524
  /**
2402
2525
  * 判断本组是否包含指定工位序号
@@ -2450,7 +2573,7 @@ class z extends De {
2450
2573
  return { x: s.x ?? 0, y: s.y ?? 0 };
2451
2574
  }
2452
2575
  }
2453
- function dt(r) {
2576
+ function pt(r) {
2454
2577
  const { x: e, y: t, width: i, height: s, cornerRadius: o = 10, origin: n = "center", around: a = "center" } = r, A = new I({
2455
2578
  x: e,
2456
2579
  y: t,
@@ -2489,106 +2612,6 @@ function dt(r) {
2489
2612
  })
2490
2613
  ), A;
2491
2614
  }
2492
- function q(r = {}) {
2493
- const e = {
2494
- x: 0,
2495
- y: 0,
2496
- width: 5,
2497
- height: 5,
2498
- fill: "",
2499
- styleType: "light",
2500
- ...r
2501
- };
2502
- r.fill === void 0 && (e.fill = e.styleType === "dark" ? "#777" : "#ccc");
2503
- const t = 0.15, i = e.styleType === "dark" ? "#333" : "#888", s = new I({
2504
- hittable: !1,
2505
- className: "screw-hole",
2506
- x: e.x,
2507
- y: e.y,
2508
- width: e.width,
2509
- height: e.height,
2510
- fill: e.fill,
2511
- cornerRadius: e.width / 2,
2512
- stroke: i,
2513
- strokeWidth: t,
2514
- around: "center"
2515
- }), o = Math.min(e.width, e.height), n = e.width / 2, a = e.height / 2, A = new Ui({
2516
- x: n,
2517
- y: a,
2518
- width: o,
2519
- height: o,
2520
- innerRadius: 0.25,
2521
- corners: 5,
2522
- cornerRadius: 2,
2523
- rotation: 30,
2524
- fill: i,
2525
- around: "center"
2526
- });
2527
- return s.add(A), s;
2528
- }
2529
- function Z(r) {
2530
- const e = {
2531
- x: 0,
2532
- y: 0,
2533
- width: void 0,
2534
- // 显式区分是否传入
2535
- height: 18,
2536
- cornerRadius: 2,
2537
- fill: "#f2f2f2",
2538
- textColor: "#d15f2c",
2539
- fontSize: 14,
2540
- stroke: "rgba(0,0,0,0.2)",
2541
- strokeWidth: 1,
2542
- screwHole: !0,
2543
- zIndex: "",
2544
- ...r
2545
- }, t = /[\u2E80-\u9FFF\uF900-\uFAFF\uFF00-\uFFEF\u3000-\u303F]/g, i = (e.title.match(t) || []).length, s = e.title.length - i, o = Math.max(20, Math.ceil((i + s * 0.5 + 2) * e.fontSize)), n = e.width ?? o, a = {
2546
- text: e.title,
2547
- textAlign: "center",
2548
- verticalAlign: "middle",
2549
- fill: e.textColor,
2550
- fontWeight: "black",
2551
- width: n,
2552
- height: e.height,
2553
- lineHeight: e.height,
2554
- // 行距为 0
2555
- wordWrap: !!e.width,
2556
- // 仅当指定了 width 时才允许换行
2557
- overflow: "hide"
2558
- };
2559
- e.width !== void 0 ? a.fontSize = Math.min(e.fontSize, 12) : a.fontSize = e.fontSize;
2560
- const A = new Oi(a), l = new I({
2561
- hittable: !1,
2562
- className: "name-plate",
2563
- x: e.x,
2564
- y: e.y,
2565
- width: n,
2566
- height: e.height,
2567
- fill: e.fill,
2568
- overflow: "hide",
2569
- around: "center",
2570
- stroke: e.stroke,
2571
- strokeWidth: e.strokeWidth,
2572
- cornerRadius: e.cornerRadius,
2573
- zIndex: e.zIndex,
2574
- children: [A]
2575
- });
2576
- if (e.screwHole) {
2577
- const c = e.height / 2, h = 4, d = q({
2578
- x: h,
2579
- y: c,
2580
- width: h,
2581
- height: h
2582
- }), w = q({
2583
- x: n - h,
2584
- y: c,
2585
- width: h,
2586
- height: h
2587
- });
2588
- l.add([d, w]);
2589
- }
2590
- return l;
2591
- }
2592
2615
  function re(r) {
2593
2616
  if (r.stationSlotGroups !== void 0)
2594
2617
  return { layers: r.stationSlotGroups, migrated: !1 };
@@ -2630,7 +2653,7 @@ class Oe extends Y {
2630
2653
  x: c,
2631
2654
  y: h,
2632
2655
  offsetX: d,
2633
- offsetY: w,
2656
+ offsetY: C,
2634
2657
  zIndex: p,
2635
2658
  rotation: f,
2636
2659
  scale: u,
@@ -2639,7 +2662,7 @@ class Oe extends Y {
2639
2662
  editable: g,
2640
2663
  draggable: m
2641
2664
  } = this.config, y = re(this.config).layers[0]?.stationSlotGroup;
2642
- this.stationContainerBaseRotation = a === "vertical" ? 90 : 0, o !== !1 && (this.light = new Ve({
2665
+ this.stationContainerBaseRotation = a === "vertical" ? 90 : 0, o !== !1 && (this.light = new Pe({
2643
2666
  x: this.width_05,
2644
2667
  y: 30,
2645
2668
  width: this.width_02,
@@ -2652,13 +2675,13 @@ class Oe extends Y {
2652
2675
  height: this.width_02,
2653
2676
  isIn: !1,
2654
2677
  isOut: !1
2655
- }).init(), n !== !1 && (this.progress = new Pe({
2678
+ }).init(), n !== !1 && (this.progress = new Ve({
2656
2679
  x: this.width_05,
2657
2680
  y: l - 74,
2658
2681
  width: this.width_08,
2659
2682
  height: 20,
2660
2683
  progress: 0
2661
- }).init()), this.glass = dt({
2684
+ }).init()), this.glass = pt({
2662
2685
  around: "top-left",
2663
2686
  width: this.width_05,
2664
2687
  height: 66,
@@ -2686,7 +2709,7 @@ class Oe extends Y {
2686
2709
  x: c,
2687
2710
  y: h,
2688
2711
  offsetX: d,
2689
- offsetY: w,
2712
+ offsetY: C,
2690
2713
  rotation: f,
2691
2714
  scale: u,
2692
2715
  cornerRadius: 8,
@@ -2710,7 +2733,7 @@ class Oe extends Y {
2710
2733
  this.stationContainer
2711
2734
  ]
2712
2735
  });
2713
- return y && (this.stationSlotGroup = new z(
2736
+ return y && (this.stationSlotGroup = new Z(
2714
2737
  {
2715
2738
  ...y,
2716
2739
  x: this.width_05,
@@ -2720,7 +2743,7 @@ class Oe extends Y {
2720
2743
  },
2721
2744
  this.config.rotation
2722
2745
  ).init(), E.add(this.stationSlotGroup.ui)), H(E, this.config), j(E), s !== !1 && E.add(
2723
- Z({
2746
+ z({
2724
2747
  title: i || "",
2725
2748
  x: this.width_05,
2726
2749
  y: l - 30,
@@ -2795,7 +2818,7 @@ class Ke extends Y {
2795
2818
  y: c,
2796
2819
  offsetX: h,
2797
2820
  offsetY: d,
2798
- zIndex: w,
2821
+ zIndex: C,
2799
2822
  rotation: p,
2800
2823
  scale: f,
2801
2824
  visible: u,
@@ -2809,14 +2832,14 @@ class Ke extends Y {
2809
2832
  height: this.width_02,
2810
2833
  isIn: !1,
2811
2834
  isOut: !1
2812
- }).init(), o !== !1 && (this.light = new Ve({
2835
+ }).init(), o !== !1 && (this.light = new Pe({
2813
2836
  x: this.width_05,
2814
2837
  y: 24,
2815
2838
  width: this.width_02,
2816
2839
  height: this.width_02,
2817
2840
  strokeWidth: 6,
2818
2841
  strokeColor: "#D5DAE3"
2819
- }).init()), n !== !1 && (this.progress = new Pe({
2842
+ }).init()), n !== !1 && (this.progress = new Ve({
2820
2843
  x: this.width_05,
2821
2844
  y: A - Ke.PROGRESS_Y_OFFSET,
2822
2845
  width: this.width_05,
@@ -2831,7 +2854,7 @@ class Ke extends Y {
2831
2854
  height: this.width_05,
2832
2855
  around: "center",
2833
2856
  children: [
2834
- dt({
2857
+ pt({
2835
2858
  around: "top-left",
2836
2859
  width: this.width_05,
2837
2860
  height: this.width_05,
@@ -2848,7 +2871,7 @@ class Ke extends Y {
2848
2871
  offsetY: d,
2849
2872
  width: a,
2850
2873
  height: A,
2851
- zIndex: w,
2874
+ zIndex: C,
2852
2875
  rotation: p,
2853
2876
  scale: f,
2854
2877
  visible: u,
@@ -2903,7 +2926,7 @@ class Ke extends Y {
2903
2926
  ...this.progress ? [this.progress.ui] : []
2904
2927
  ]
2905
2928
  });
2906
- return m && (this.stationSlotGroup = new z(
2929
+ return m && (this.stationSlotGroup = new Z(
2907
2930
  {
2908
2931
  ...m,
2909
2932
  x: this.width_05,
@@ -2912,7 +2935,7 @@ class Ke extends Y {
2912
2935
  },
2913
2936
  this.config.rotation
2914
2937
  ).init(), B.add(this.stationSlotGroup.ui)), s !== !1 && B.add(
2915
- Z({
2938
+ z({
2916
2939
  title: i || "",
2917
2940
  x: this.width_05,
2918
2941
  y: A - Ke.NAME_PLATE_Y_OFFSET,
@@ -2931,7 +2954,7 @@ class Ke extends Y {
2931
2954
  return this.stationSlotGroup ? [this.stationSlotGroup] : [];
2932
2955
  }
2933
2956
  }
2934
- const ze = V("ShuttleStation");
2957
+ const ze = P("ShuttleStation");
2935
2958
  class k extends Y {
2936
2959
  static WALL_THICKNESS = 14;
2937
2960
  static BASE_HEIGHT = 40;
@@ -2970,8 +2993,8 @@ class k extends Y {
2970
2993
  }
2971
2994
  buildLayers(e, t, i) {
2972
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 = [];
2973
- return i.forEach((d, w) => {
2974
- const p = n + w * (c + l), f = new I({
2996
+ return i.forEach((d, C) => {
2997
+ const p = n + C * (c + l), f = new I({
2975
2998
  // 层容器可命中自身(不可设 hitSelf: false):overflow hidden 的裁剪 Box 在 Leafer pick 时
2976
2999
  // 要求自身先命中(__clipAfterFill),hitSelf: false 会导致整棵子树(工位槽)无法被命中测试。
2977
3000
  // 挂载模型 config 使点击层内空白区时 data 与点击主体一致(均为接驳站信息)
@@ -2995,7 +3018,7 @@ class k extends Y {
2995
3018
  scale: 0.015
2996
3019
  })
2997
3020
  ]
2998
- }), u = new z(
3021
+ }), u = new Z(
2999
3022
  {
3000
3023
  ...d.stationSlotGroup,
3001
3024
  around: "center",
@@ -3076,7 +3099,7 @@ class k extends Y {
3076
3099
  zIndex: c,
3077
3100
  rotation: h,
3078
3101
  scale: d,
3079
- visible: w,
3102
+ visible: C,
3080
3103
  editable: p,
3081
3104
  draggable: f,
3082
3105
  lightEnabled: u,
@@ -3113,7 +3136,7 @@ class k extends Y {
3113
3136
  strokeWidth: 0.5,
3114
3137
  cornerRadius: 3
3115
3138
  }).init(), B.push(this.light.ui)), b !== !1 && B.push(
3116
- Z({
3139
+ z({
3117
3140
  title: i || "",
3118
3141
  x: s / 2,
3119
3142
  y: m - k.NAME_PLATE_Y_OFFSET
@@ -3134,7 +3157,7 @@ class k extends Y {
3134
3157
  zIndex: c,
3135
3158
  rotation: h,
3136
3159
  scale: d,
3137
- visible: w,
3160
+ visible: C,
3138
3161
  editable: p,
3139
3162
  draggable: f,
3140
3163
  origin: "center",
@@ -3210,8 +3233,8 @@ class k extends Y {
3210
3233
  return (this.layerGroups.get(t ?? 1) ?? [...this.layerGroups.values()][0])?.getStationSlotPoint(e);
3211
3234
  }
3212
3235
  }
3213
- const Ze = V("MaterialTrack");
3214
- class P extends Y {
3236
+ const Ze = P("MaterialTrack");
3237
+ class V extends Y {
3215
3238
  static WALL_THICKNESS = 14;
3216
3239
  static BASE_HEIGHT = 40;
3217
3240
  static LIGHT_Y_OFFSET = 6;
@@ -3225,12 +3248,12 @@ class P extends Y {
3225
3248
  layerGroups = /* @__PURE__ */ new Map();
3226
3249
  // 构建 U 型路径(外边界 + 内部镂空,使用偶奇环绕规则)
3227
3250
  buildUPath(e, t) {
3228
- const i = P.WALL_THICKNESS, s = P.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"];
3251
+ const i = V.WALL_THICKNESS, s = V.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"];
3229
3252
  return [...o, ...n].join(" ");
3230
3253
  }
3231
3254
  // 构建 U 型轮廓线路径
3232
3255
  buildOutlinePath(e, t) {
3233
- const i = P.WALL_THICKNESS, s = P.BASE_HEIGHT;
3256
+ const i = V.WALL_THICKNESS, s = V.BASE_HEIGHT;
3234
3257
  return [
3235
3258
  `M 0 ${t}`,
3236
3259
  `L ${e} ${t}`,
@@ -3244,9 +3267,9 @@ class P extends Y {
3244
3267
  ].join(" ");
3245
3268
  }
3246
3269
  buildLayers(e, t, i) {
3247
- const s = P.WALL_THICKNESS, o = P.BASE_HEIGHT, n = s, A = t - o - n, l = P.LAYER_GAP, c = (A - l * (i.length - 1)) / i.length, h = [];
3248
- return i.forEach((d, w) => {
3249
- const p = n + w * (c + l), f = new 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 = [];
3271
+ return i.forEach((d, C) => {
3272
+ const p = n + C * (c + l), f = new I({
3250
3273
  // 层容器可命中自身(不可设 hitSelf: false):overflow hidden 裁剪 Box 在 pick 时要求自身先命中(__clipAfterFill),
3251
3274
  // hitSelf: false 会导致整棵子树(工位槽)无法被命中测试。挂载模型 config 保证点击层内空白区时 data 仍为料道信息
3252
3275
  className: "MaterialTrackLayer",
@@ -3255,7 +3278,7 @@ class P extends Y {
3255
3278
  y: p,
3256
3279
  width: e - s * 2,
3257
3280
  height: c,
3258
- fill: P.CAVITY_FILL,
3281
+ fill: V.CAVITY_FILL,
3259
3282
  stroke: "rgba(255, 255, 255, 0.5)",
3260
3283
  strokeWidth: 1,
3261
3284
  overflow: "hidden",
@@ -3269,7 +3292,7 @@ class P extends Y {
3269
3292
  scale: 0.015
3270
3293
  })
3271
3294
  ]
3272
- }), u = new z(
3295
+ }), u = new Z(
3273
3296
  {
3274
3297
  ...d.stationSlotGroup,
3275
3298
  around: "center",
@@ -3297,7 +3320,7 @@ class P extends Y {
3297
3320
  zIndex: c,
3298
3321
  rotation: h,
3299
3322
  scale: d,
3300
- visible: w,
3323
+ visible: C,
3301
3324
  editable: p,
3302
3325
  draggable: f,
3303
3326
  lightEnabled: u,
@@ -3309,7 +3332,7 @@ class P extends Y {
3309
3332
  hittable: !1,
3310
3333
  path: this.buildUPath(s, o),
3311
3334
  windingRule: "evenodd",
3312
- fill: P.BODY_FILL
3335
+ fill: V.BODY_FILL
3313
3336
  });
3314
3337
  j(m);
3315
3338
  const y = new ge({
@@ -3326,18 +3349,18 @@ class P extends Y {
3326
3349
  }
3327
3350
  u !== !1 && (this.light = new J({
3328
3351
  x: s / 2,
3329
- y: o - P.LIGHT_Y_OFFSET,
3330
- width: (s - P.WALL_THICKNESS * 2) / 2,
3352
+ y: o - V.LIGHT_Y_OFFSET,
3353
+ width: (s - V.WALL_THICKNESS * 2) / 2,
3331
3354
  height: 6,
3332
3355
  color: "#666",
3333
3356
  strokeColor: "#333",
3334
3357
  strokeWidth: 0.5,
3335
3358
  cornerRadius: 3
3336
3359
  }).init(), E.push(this.light.ui)), b !== !1 && E.push(
3337
- Z({
3360
+ z({
3338
3361
  title: i || "",
3339
3362
  x: s / 2,
3340
- y: o - P.NAME_PLATE_Y_OFFSET
3363
+ y: o - V.NAME_PLATE_Y_OFFSET
3341
3364
  })
3342
3365
  );
3343
3366
  const B = new I({
@@ -3353,7 +3376,7 @@ class P extends Y {
3353
3376
  zIndex: c,
3354
3377
  rotation: h,
3355
3378
  scale: d,
3356
- visible: w,
3379
+ visible: C,
3357
3380
  editable: p,
3358
3381
  draggable: f,
3359
3382
  origin: "center",
@@ -3405,7 +3428,7 @@ class P extends Y {
3405
3428
  return (this.layerGroups.get(t ?? 1) ?? [...this.layerGroups.values()][0])?.getStationSlotPoint(e);
3406
3429
  }
3407
3430
  }
3408
- class ft extends Y {
3431
+ class wt extends Y {
3409
3432
  light = null;
3410
3433
  progress = null;
3411
3434
  entrance = null;
@@ -3428,7 +3451,7 @@ class ft extends Y {
3428
3451
  y: c,
3429
3452
  offsetX: h,
3430
3453
  offsetY: d,
3431
- zIndex: w,
3454
+ zIndex: C,
3432
3455
  rotation: p,
3433
3456
  scale: f,
3434
3457
  visible: u,
@@ -3442,13 +3465,13 @@ class ft extends Y {
3442
3465
  height: this.width_02,
3443
3466
  isIn: !1,
3444
3467
  isOut: !1
3445
- }).init(), o !== !1 && (this.light = new Ve({
3468
+ }).init(), o !== !1 && (this.light = new Pe({
3446
3469
  x: this.width_05,
3447
3470
  y: 30,
3448
3471
  width: this.width_02,
3449
3472
  height: this.width_02,
3450
3473
  showShadow: !0
3451
- }).init()), n !== !1 && (this.progress = new Pe({
3474
+ }).init()), n !== !1 && (this.progress = new Ve({
3452
3475
  x: this.width_05,
3453
3476
  y: A - 40,
3454
3477
  width: this.width_08,
@@ -3478,7 +3501,7 @@ class ft extends Y {
3478
3501
  offsetY: d,
3479
3502
  width: a,
3480
3503
  height: A,
3481
- zIndex: w,
3504
+ zIndex: C,
3482
3505
  rotation: p,
3483
3506
  scale: f,
3484
3507
  visible: u,
@@ -3490,7 +3513,7 @@ class ft extends Y {
3490
3513
  fill: "#ECEEF0",
3491
3514
  children: [y, this.entrance.ui, ...this.light ? [this.light.ui] : [], ...this.progress ? [this.progress.ui] : []]
3492
3515
  });
3493
- return m && (this.stationSlotGroup = new z(
3516
+ return m && (this.stationSlotGroup = new Z(
3494
3517
  {
3495
3518
  ...m,
3496
3519
  x: this.width_05,
@@ -3499,7 +3522,7 @@ class ft extends Y {
3499
3522
  },
3500
3523
  this.config.rotation
3501
3524
  ).init(), E.add(this.stationSlotGroup.ui)), s !== !1 && E.add(
3502
- Z({
3525
+ z({
3503
3526
  title: i || "",
3504
3527
  x: this.width_05,
3505
3528
  y: A - 14,
@@ -3553,7 +3576,7 @@ class ft extends Y {
3553
3576
  static TELEGRAPH_RHYTHM = [120, 70, 240, 90, 150, 60, 300, 110, 80, 200, 100, 70];
3554
3577
  /** 播放某激光工位的电报节奏闪动(每轮亮→灭后按节奏数组不定长间隔继续) */
3555
3578
  playTelegraph(e, t) {
3556
- const i = ft.TELEGRAPH_RHYTHM, s = (t - 1) * 3 % i.length;
3579
+ const i = wt.TELEGRAPH_RHYTHM, s = (t - 1) * 3 % i.length;
3557
3580
  let o = s, n = !0;
3558
3581
  const a = () => {
3559
3582
  n = !n, e.set({ opacity: n ? 1 : 0.1 }), this.laserTimers[t] = window.setTimeout(a, i[o % i.length]), o++;
@@ -3571,7 +3594,7 @@ class ft extends Y {
3571
3594
  }), this.laserTimers = {}, super.destroyUI();
3572
3595
  }
3573
3596
  }
3574
- class Hs {
3597
+ class zs {
3575
3598
  _ui;
3576
3599
  period;
3577
3600
  constructor(e) {
@@ -3613,7 +3636,7 @@ class Hs {
3613
3636
  });
3614
3637
  }
3615
3638
  }
3616
- class Ys extends Y {
3639
+ class Zs extends Y {
3617
3640
  light = null;
3618
3641
  progress = null;
3619
3642
  entrance = null;
@@ -3633,7 +3656,7 @@ class Ys extends Y {
3633
3656
  y: c,
3634
3657
  offsetX: h,
3635
3658
  offsetY: d,
3636
- zIndex: w,
3659
+ zIndex: C,
3637
3660
  rotation: p,
3638
3661
  scale: f,
3639
3662
  visible: u,
@@ -3649,7 +3672,7 @@ class Ys extends Y {
3649
3672
  around: "center",
3650
3673
  overflow: "hide",
3651
3674
  children: [
3652
- dt({
3675
+ pt({
3653
3676
  around: "top-left",
3654
3677
  width: this.width_08,
3655
3678
  height: 66,
@@ -3665,7 +3688,7 @@ class Ys extends Y {
3665
3688
  height: this.width_02,
3666
3689
  isIn: !1,
3667
3690
  isOut: !1
3668
- }).init(), o !== !1 && (this.light = new Ve({
3691
+ }).init(), o !== !1 && (this.light = new Pe({
3669
3692
  x: this.width_05,
3670
3693
  y: 30,
3671
3694
  width: this.width_02,
@@ -3673,7 +3696,7 @@ class Ys extends Y {
3673
3696
  showShadow: !0,
3674
3697
  strokeWidth: 6,
3675
3698
  strokeColor: "#D7DCEC"
3676
- }).init()), n !== !1 && (this.progress = new Pe({
3699
+ }).init()), n !== !1 && (this.progress = new Ve({
3677
3700
  x: this.width_05,
3678
3701
  y: A - 50,
3679
3702
  width: this.width_08,
@@ -3690,7 +3713,7 @@ class Ys extends Y {
3690
3713
  offsetY: d,
3691
3714
  width: a,
3692
3715
  height: A,
3693
- zIndex: w,
3716
+ zIndex: C,
3694
3717
  rotation: p,
3695
3718
  scale: f,
3696
3719
  visible: u,
@@ -3726,7 +3749,7 @@ class Ys extends Y {
3726
3749
  ...this.progress ? [this.progress.ui] : []
3727
3750
  ]
3728
3751
  });
3729
- return m && (this.stationSlotGroup = new z(
3752
+ return m && (this.stationSlotGroup = new Z(
3730
3753
  {
3731
3754
  ...m,
3732
3755
  x: this.width_05,
@@ -3735,7 +3758,7 @@ class Ys extends Y {
3735
3758
  },
3736
3759
  this.config.rotation
3737
3760
  ).init(), E.add(this.stationSlotGroup.ui)), s !== !1 && E.add(
3738
- Z({
3761
+ z({
3739
3762
  title: i || "",
3740
3763
  x: this.width_05,
3741
3764
  y: A - 14,
@@ -3746,7 +3769,7 @@ class Ys extends Y {
3746
3769
  /** 创建工位容器内的波浪流动效果(渲染在工位槽位层级之下,默认隐藏,受 operating 的 isWorking 控制) */
3747
3770
  createWave(e, t) {
3748
3771
  const i = t * 0.45;
3749
- return this.wave = new Hs({
3772
+ return this.wave = new zs({
3750
3773
  period: e,
3751
3774
  height: i,
3752
3775
  y: t - i
@@ -3759,7 +3782,7 @@ class Ys extends Y {
3759
3782
  return this.stationSlotGroup ? [this.stationSlotGroup] : [];
3760
3783
  }
3761
3784
  }
3762
- const _t = V("SingleJointRobot"), Ut = [15, 0, 0, 15], Ot = 4, Kt = 0.66, Mt = 0.5, Nt = 12.5, Gt = 7;
3785
+ const Ot = P("SingleJointRobot"), Kt = [15, 0, 0, 15], Mt = 4, Nt = 0.66, Gt = 0.5, Pt = 12.5, Vt = 7;
3763
3786
  class be extends Y {
3764
3787
  static DEFAULT_WIDTH = 90;
3765
3788
  static DEFAULT_HEIGHT = 76;
@@ -3777,6 +3800,10 @@ class be extends Y {
3777
3800
  set currentFixture(e) {
3778
3801
  this.switchFork(e);
3779
3802
  }
3803
+ /** 移动动画时长:与 moveX 默认 0.5s 一致,供托盘跟随等联动同步 */
3804
+ get moveDuration() {
3805
+ return 0.5;
3806
+ }
3780
3807
  createUi() {
3781
3808
  const {
3782
3809
  id: e,
@@ -3791,22 +3818,22 @@ class be extends Y {
3791
3818
  rotation: c,
3792
3819
  scale: h,
3793
3820
  visible: d,
3794
- editable: w,
3821
+ editable: C,
3795
3822
  draggable: p,
3796
3823
  lightEnabled: f,
3797
3824
  nameplate: u,
3798
3825
  nameplateEnabled: b,
3799
3826
  currentFixture: g
3800
3827
  } = this.config, { layers: m } = re(this.config), y = m.map((v) => {
3801
- const C = v.stationSlotGroup;
3802
- return C ? {
3828
+ const w = v.stationSlotGroup;
3829
+ return w ? {
3803
3830
  layerIndex: v.index,
3804
- instance: new z(
3831
+ instance: new Z(
3805
3832
  {
3806
- ...C,
3833
+ ...w,
3807
3834
  // 兼容旧数据:无 x/y 时按组内槽位类型给默认定位(tool 组居刀具杆端,其余居托盘中部),仅影响摆放
3808
- x: C.x ?? (Qe(C) ? 45 : 40),
3809
- y: C.y ?? (Qe(C) ? 24.5 : 25),
3835
+ x: w.x ?? (Qe(w) ? 44 : 40),
3836
+ y: w.y ?? (Qe(w) ? 24.5 : 25),
3810
3837
  hittable: this.config.hittable
3811
3838
  },
3812
3839
  this.config.rotation
@@ -3814,18 +3841,27 @@ class be extends Y {
3814
3841
  } : null;
3815
3842
  }).filter((v) => v !== null);
3816
3843
  this.slotGroups = y.map((v) => v.instance), this.slotLayerIndexes = y.map((v) => v.layerIndex), this.applyFixtureBindingVisibility(g);
3817
- const E = new ti({
3844
+ const E = new si({
3818
3845
  hitSelf: !1,
3819
3846
  className: "smallArm",
3820
- x: 35,
3821
- y: 30,
3847
+ x: 27,
3848
+ y: 22,
3822
3849
  zIndex: 1,
3823
- around: {
3824
- type: "percent",
3825
- x: 0.1,
3826
- y: 0.5
3850
+ origin: {
3851
+ x: 8,
3852
+ y: 25
3827
3853
  },
3828
3854
  children: [
3855
+ // 固定 boxBounds,避免切换夹具 visible 后旋转中心偏移
3856
+ {
3857
+ hittable: !1,
3858
+ tag: "Box",
3859
+ x: 0,
3860
+ y: -17,
3861
+ width: 124,
3862
+ height: 75,
3863
+ fill: "rgba(0,0,0,0)"
3864
+ },
3829
3865
  {
3830
3866
  hittable: !1,
3831
3867
  tag: "Box",
@@ -3858,13 +3894,14 @@ class be extends Y {
3858
3894
  fill: "#424242",
3859
3895
  cornerRadius: [0, 16, 16, 0]
3860
3896
  },
3861
- // 夹具容器
3862
3897
  {
3863
3898
  hitSelf: !1,
3864
3899
  className: "fork",
3865
3900
  tag: "Box",
3866
3901
  x: 30,
3867
3902
  y: -17,
3903
+ width: 66,
3904
+ height: 50,
3868
3905
  zIndex: -1,
3869
3906
  children: [
3870
3907
  // 托盘夹具(工件 / 辅料共用造型:辅料压扁为直角小托盘,描边补偿缩放衰减)——纯装饰,工位层挂载于 #slotLayers
@@ -3873,21 +3910,21 @@ class be extends Y {
3873
3910
  id: "fixturePallet",
3874
3911
  tag: "Box",
3875
3912
  visible: g === x.WORKPIECE || g === x.AUXILIARY ? !0 : 0,
3876
- scaleX: g === x.AUXILIARY ? Kt : 1,
3877
- scaleY: g === x.AUXILIARY ? Mt : 1,
3878
- y: g === x.AUXILIARY ? Nt : 0,
3913
+ scaleX: g === x.AUXILIARY ? Nt : 1,
3914
+ scaleY: g === x.AUXILIARY ? Gt : 1,
3915
+ y: g === x.AUXILIARY ? Pt : 0,
3879
3916
  width: 66,
3880
3917
  height: 50,
3881
- cornerRadius: g === x.AUXILIARY ? 0 : Ut,
3882
- strokeWidth: g === x.AUXILIARY ? Gt : Ot,
3918
+ cornerRadius: g === x.AUXILIARY ? 0 : Kt,
3919
+ strokeWidth: g === x.AUXILIARY ? Vt : Mt,
3883
3920
  stroke: {
3884
3921
  type: "linear",
3885
3922
  from: "left",
3886
3923
  to: "right",
3887
3924
  stops: [
3888
3925
  { offset: 0, color: "#424242" },
3889
- { offset: 0.9, color: "#000" },
3890
- { offset: 0.9, color: "rgba(255, 0, 0, 0)" },
3926
+ { offset: 0.85, color: "#000" },
3927
+ { offset: 0.85, color: "rgba(255, 0, 0, 0)" },
3891
3928
  { offset: 1, color: "rgba(255, 0, 0, 0)" }
3892
3929
  ]
3893
3930
  }
@@ -3998,14 +4035,14 @@ class be extends Y {
3998
4035
  width: 50,
3999
4036
  height: 50,
4000
4037
  around: "center",
4001
- x: i / 2 - 10,
4002
- y: s / 2 - 8,
4038
+ x: 35,
4039
+ y: 30,
4003
4040
  fill: "#ee6600",
4004
4041
  cornerRadius: 50,
4005
4042
  strokeWidth: 1,
4006
4043
  stroke: "rgba(255,255,255,0.65)",
4007
4044
  children: [
4008
- ei({
4045
+ ii({
4009
4046
  width: 50,
4010
4047
  height: 50,
4011
4048
  cornerRadius: 50,
@@ -4047,7 +4084,7 @@ class be extends Y {
4047
4084
  rotation: c,
4048
4085
  scale: h,
4049
4086
  visible: d,
4050
- editable: w,
4087
+ editable: C,
4051
4088
  draggable: p
4052
4089
  });
4053
4090
  return f !== !1 && (this.light1 = new J({
@@ -4063,7 +4100,7 @@ class be extends Y {
4063
4100
  y: s - 4,
4064
4101
  color: this.defaultLightColor
4065
4102
  }).init()), Q.add([...this.light1 ? [this.light1.ui] : [], ...this.light2 ? [this.light2.ui] : [], T]), b !== !1 && Q.add(
4066
- Z({
4103
+ z({
4067
4104
  title: u || "",
4068
4105
  x: this.width_05,
4069
4106
  y: s + 10,
@@ -4076,7 +4113,7 @@ class be extends Y {
4076
4113
  this.handleLoadResource(e.resource.handle_type);
4077
4114
  const t = this.findGroupForResource(e.resource);
4078
4115
  if (!t) {
4079
- _t.warn("SingleJointRobot 未找到可处理资源的工位组:", e.resource);
4116
+ Ot.warn("SingleJointRobot 未找到可处理资源的工位组:", e.resource);
4080
4117
  return;
4081
4118
  }
4082
4119
  t.operating(e.resource);
@@ -4112,6 +4149,7 @@ class be extends Y {
4112
4149
  collectStationSlotGroups() {
4113
4150
  return this.slotGroups;
4114
4151
  }
4152
+ // 单关节:仅 j1,驱动小摆臂绕二级基座图形中心旋转;大摆臂反向同步、二级基座随角度微移
4115
4153
  handleRotate(e) {
4116
4154
  if (!Number.isFinite(e)) return;
4117
4155
  const t = this.ui.findOne(".bigArm"), i = this.ui.findOne(".smallArm"), s = this.ui.findOne(".secondBase");
@@ -4129,7 +4167,7 @@ class be extends Y {
4129
4167
  return;
4130
4168
  }
4131
4169
  if (!Object.values(x).includes(e)) {
4132
- _t.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4170
+ Ot.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4133
4171
  return;
4134
4172
  }
4135
4173
  this.config.currentFixture = e, this.setPalletFixture({
@@ -4142,11 +4180,11 @@ class be extends Y {
4142
4180
  const t = e.auxiliary ?? !1;
4143
4181
  this.ui.findOne("#fixturePallet")?.set({
4144
4182
  visible: e.visible,
4145
- scaleX: t ? Kt : 1,
4146
- scaleY: t ? Mt : 1,
4147
- y: t ? Nt : 0,
4148
- cornerRadius: t ? 0 : Ut,
4149
- strokeWidth: t ? Gt : Ot
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
4150
4188
  });
4151
4189
  }
4152
4190
  // 上下料动画
@@ -4207,7 +4245,7 @@ class be extends Y {
4207
4245
  // }, 1000)
4208
4246
  // }
4209
4247
  }
4210
- const Vt = V("DoubleJointRobot"), Pt = [15, 0, 0, 15], qt = 4, Wt = 0.66, Ht = 0.5, Yt = 12.5, Xt = 7;
4248
+ const qt = P("DoubleJointRobot"), Wt = [15, 0, 0, 15], Ht = 4, Yt = 0.66, Xt = 0.5, Jt = 12.5, jt = 7;
4211
4249
  class ve extends Y {
4212
4250
  static DEFAULT_WIDTH = 90;
4213
4251
  static DEFAULT_HEIGHT = 76;
@@ -4243,22 +4281,22 @@ class ve extends Y {
4243
4281
  rotation: c,
4244
4282
  scale: h,
4245
4283
  visible: d,
4246
- editable: w,
4284
+ editable: C,
4247
4285
  draggable: p,
4248
4286
  lightEnabled: f,
4249
4287
  nameplate: u,
4250
4288
  nameplateEnabled: b,
4251
4289
  currentFixture: g
4252
4290
  } = this.config, { layers: m } = re(this.config), y = m.map((v) => {
4253
- const C = v.stationSlotGroup;
4254
- return C ? {
4291
+ const w = v.stationSlotGroup;
4292
+ return w ? {
4255
4293
  layerIndex: v.index,
4256
- instance: new z(
4294
+ instance: new Z(
4257
4295
  {
4258
- ...C,
4296
+ ...w,
4259
4297
  // 兼容旧数据:无 x/y 时按组内槽位类型给默认定位(tool 组居刀具杆端,其余居托盘中部),仅影响摆放
4260
- x: C.x ?? (Qe(C) ? 44 : 40),
4261
- y: C.y ?? (Qe(C) ? 24.5 : 25),
4298
+ x: w.x ?? (Qe(w) ? 44 : 40),
4299
+ y: w.y ?? (Qe(w) ? 24.5 : 25),
4262
4300
  hittable: this.config.hittable
4263
4301
  },
4264
4302
  this.config.rotation
@@ -4266,7 +4304,7 @@ class ve extends Y {
4266
4304
  } : null;
4267
4305
  }).filter((v) => v !== null);
4268
4306
  this.slotGroups = y.map((v) => v.instance), this.slotLayerIndexes = y.map((v) => v.layerIndex), this.applyFixtureBindingVisibility(g);
4269
- const E = new ti({
4307
+ const E = new si({
4270
4308
  hitSelf: !1,
4271
4309
  className: "smallArm",
4272
4310
  x: 32,
@@ -4337,13 +4375,13 @@ class ve extends Y {
4337
4375
  id: "fixturePallet",
4338
4376
  tag: "Box",
4339
4377
  visible: g === x.WORKPIECE || g === x.AUXILIARY ? !0 : 0,
4340
- scaleX: g === x.AUXILIARY ? Wt : 1,
4341
- scaleY: g === x.AUXILIARY ? Ht : 1,
4342
- y: g === x.AUXILIARY ? Yt : 0,
4378
+ scaleX: g === x.AUXILIARY ? Yt : 1,
4379
+ scaleY: g === x.AUXILIARY ? Xt : 1,
4380
+ y: g === x.AUXILIARY ? Jt : 0,
4343
4381
  width: 66,
4344
4382
  height: 50,
4345
- cornerRadius: g === x.AUXILIARY ? 0 : Pt,
4346
- strokeWidth: g === x.AUXILIARY ? Xt : qt,
4383
+ cornerRadius: g === x.AUXILIARY ? 0 : Wt,
4384
+ strokeWidth: g === x.AUXILIARY ? jt : Ht,
4347
4385
  stroke: {
4348
4386
  type: "linear",
4349
4387
  from: "left",
@@ -4475,7 +4513,7 @@ class ve extends Y {
4475
4513
  strokeWidth: 1,
4476
4514
  stroke: "rgba(255,255,255,0.65)",
4477
4515
  children: [
4478
- ei({
4516
+ ii({
4479
4517
  width: 50,
4480
4518
  height: 50,
4481
4519
  cornerRadius: 50,
@@ -4517,7 +4555,7 @@ class ve extends Y {
4517
4555
  rotation: c,
4518
4556
  scale: h,
4519
4557
  visible: d,
4520
- editable: w,
4558
+ editable: C,
4521
4559
  draggable: p
4522
4560
  });
4523
4561
  return f !== !1 && (this.light1 = new J({
@@ -4533,7 +4571,7 @@ class ve extends Y {
4533
4571
  y: s - 4,
4534
4572
  color: this.defaultLightColor
4535
4573
  }).init()), Q.add([...this.light1 ? [this.light1.ui] : [], ...this.light2 ? [this.light2.ui] : [], T]), b !== !1 && Q.add(
4536
- Z({
4574
+ z({
4537
4575
  title: u || "",
4538
4576
  x: this.width_05,
4539
4577
  y: s + 10,
@@ -4546,7 +4584,7 @@ class ve extends Y {
4546
4584
  this.handleLoadResource(e.resource.handle_type);
4547
4585
  const t = this.findGroupForResource(e.resource);
4548
4586
  if (!t) {
4549
- Vt.warn("DoubleJointRobot 未找到可处理资源的工位组:", e.resource);
4587
+ qt.warn("DoubleJointRobot 未找到可处理资源的工位组:", e.resource);
4550
4588
  return;
4551
4589
  }
4552
4590
  t.operating(e.resource);
@@ -4602,7 +4640,7 @@ class ve extends Y {
4602
4640
  return;
4603
4641
  }
4604
4642
  if (!Object.values(x).includes(e)) {
4605
- Vt.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4643
+ qt.warn(`错误的夹具类型 EnumResourceType: ${e}`);
4606
4644
  return;
4607
4645
  }
4608
4646
  this.config.currentFixture = e, this.setPalletFixture({
@@ -4615,11 +4653,11 @@ class ve extends Y {
4615
4653
  const t = e.auxiliary ?? !1;
4616
4654
  this.ui.findOne("#fixturePallet")?.set({
4617
4655
  visible: e.visible,
4618
- scaleX: t ? Wt : 1,
4619
- scaleY: t ? Ht : 1,
4620
- y: t ? Yt : 0,
4621
- cornerRadius: t ? 0 : Pt,
4622
- strokeWidth: t ? Xt : qt
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
4623
4661
  });
4624
4662
  }
4625
4663
  // 上下料动画
@@ -4681,7 +4719,7 @@ class ve extends Y {
4681
4719
  // }, 1000)
4682
4720
  // }
4683
4721
  }
4684
- const $e = V("Rgv");
4722
+ const $e = P("Rgv");
4685
4723
  class xe extends Y {
4686
4724
  static DEFAULT_WIDTH = 90;
4687
4725
  static DEFAULT_HEIGHT = 120;
@@ -4705,22 +4743,22 @@ class xe extends Y {
4705
4743
  rotation: c,
4706
4744
  scale: h,
4707
4745
  visible: d,
4708
- editable: w,
4746
+ editable: C,
4709
4747
  draggable: p,
4710
4748
  lightEnabled: f,
4711
4749
  nameplate: u,
4712
4750
  nameplateEnabled: b
4713
4751
  } = this.config, g = s * 0.6, m = s * 0.7, y = i - 40, { layers: E } = re(this.config);
4714
4752
  this.slotGroups = E.map((v) => {
4715
- const C = v.stationSlotGroup;
4716
- return C ? new z(
4753
+ const w = v.stationSlotGroup;
4754
+ return w ? new Z(
4717
4755
  {
4718
- ...C,
4756
+ ...w,
4719
4757
  // 兼容旧数据:无 x/y 时默认居储位面板中部,仅影响摆放
4720
- x: C.x ?? y * 0.94 * 0.5,
4721
- y: C.y ?? this.height_05 * 0.5,
4758
+ x: w.x ?? y * 0.94 * 0.5,
4759
+ y: w.y ?? this.height_05 * 0.5,
4722
4760
  hittable: this.config.hittable,
4723
- ...Qe(C) ? {} : { zIndex: 10 }
4761
+ ...Qe(w) ? {} : { zIndex: 10 }
4724
4762
  },
4725
4763
  this.config.rotation
4726
4764
  ).init() : null;
@@ -4902,7 +4940,7 @@ class xe extends Y {
4902
4940
  rotation: c,
4903
4941
  scale: h,
4904
4942
  visible: d,
4905
- editable: w,
4943
+ editable: C,
4906
4944
  draggable: p,
4907
4945
  children: [
4908
4946
  {
@@ -5041,7 +5079,7 @@ class xe extends Y {
5041
5079
  ]
5042
5080
  });
5043
5081
  return H(Q, this.config), b !== !1 && Q.add(
5044
- Z({
5082
+ z({
5045
5083
  title: u || "",
5046
5084
  x: this.width_05,
5047
5085
  y: s + 10,
@@ -5147,7 +5185,7 @@ class xe extends Y {
5147
5185
  // }, 1000)
5148
5186
  // }
5149
5187
  }
5150
- const Xs = V("ResourceStore");
5188
+ const $s = P("ResourceStore");
5151
5189
  class Me extends Y {
5152
5190
  static CORNER_RADIUS = [20, 20, 4, 4];
5153
5191
  light = null;
@@ -5167,7 +5205,7 @@ class Me extends Y {
5167
5205
  offsetX: c,
5168
5206
  offsetY: h,
5169
5207
  x: d,
5170
- y: w,
5208
+ y: C,
5171
5209
  zIndex: p,
5172
5210
  rotation: f,
5173
5211
  scale: u,
@@ -5185,15 +5223,15 @@ class Me extends Y {
5185
5223
  stroke: a === !1 ? "#FFD700" : void 0,
5186
5224
  strokeWidth: a === !1 ? 1 : 0
5187
5225
  }), T = () => {
5188
- const C = B.width ?? 0, F = B.height ?? 0;
5189
- C <= 0 || F <= 0 || (B.x = (A - C) / 2, B.y = (l - F) / 2);
5226
+ const w = B.width ?? 0, F = B.height ?? 0;
5227
+ w <= 0 || F <= 0 || (B.x = (A - w) / 2, B.y = (l - F) / 2);
5190
5228
  };
5191
5229
  T(), B.on("resize", T);
5192
5230
  const { layers: Q } = re(this.config);
5193
- this.stationSlotGroups = Q.map((C) => {
5194
- const F = new z(
5231
+ this.stationSlotGroups = Q.map((w) => {
5232
+ const F = new Z(
5195
5233
  {
5196
- ...C.stationSlotGroup,
5234
+ ...w.stationSlotGroup,
5197
5235
  around: "top-left",
5198
5236
  hittable: this.config.hittable
5199
5237
  },
@@ -5214,7 +5252,7 @@ class Me extends Y {
5214
5252
  offsetX: c,
5215
5253
  offsetY: h,
5216
5254
  x: d,
5217
- y: w,
5255
+ y: C,
5218
5256
  width: A,
5219
5257
  height: l,
5220
5258
  zIndex: p,
@@ -5253,7 +5291,7 @@ class Me extends Y {
5253
5291
  ]
5254
5292
  });
5255
5293
  return s !== !1 && v.add(
5256
- Z({
5294
+ z({
5257
5295
  title: i || "",
5258
5296
  x: this.width_05,
5259
5297
  y: l - 10,
@@ -5286,7 +5324,7 @@ class Me extends Y {
5286
5324
  operating(e) {
5287
5325
  if (e.position?.x !== void 0 && this.moveX(e.position.x), e.light && this.light && this.light.operating(e.light), e.resource) {
5288
5326
  const t = this.findGroupForResource(e.resource);
5289
- t ? t.operating(e.resource) : Xs.warn(
5327
+ t ? t.operating(e.resource) : $s.warn(
5290
5328
  `ResourceStore 没有匹配到承载资源(device_station=${e.resource.device_station})的工位组,无法操作`
5291
5329
  );
5292
5330
  }
@@ -5295,7 +5333,7 @@ class Me extends Y {
5295
5333
  return this.stationSlotGroups;
5296
5334
  }
5297
5335
  }
5298
- const Jt = V("Pallet");
5336
+ const zt = P("Pallet");
5299
5337
  class pe extends Y {
5300
5338
  static CORNER_RADIUS = 0;
5301
5339
  static LAYER_PADDING = 0;
@@ -5313,21 +5351,21 @@ class pe extends Y {
5313
5351
  buildLayers(e, t, i) {
5314
5352
  const s = pe.LAYER_PADDING, o = pe.LAYER_GAP, n = s, l = (t - s - n - o * (i.length - 1)) / i.length, c = [];
5315
5353
  return i.forEach((h, d) => {
5316
- const w = n + d * (l + o), p = new I({
5354
+ const C = n + d * (l + o), p = new I({
5317
5355
  // 层容器可命中自身(不可设 hitSelf: false):overflow hidden 的裁剪 Box 在 Leafer pick 时
5318
5356
  // 要求自身先命中(__clipAfterFill),hitSelf: false 会导致整棵子树(工位槽)无法被命中测试。
5319
5357
  // 挂载模型 config 使点击层内空白区时 data 与点击主体一致(均为托盘信息)
5320
5358
  className: "PalletLayer",
5321
5359
  data: this.config,
5322
5360
  x: s,
5323
- y: w,
5361
+ y: C,
5324
5362
  width: e - s * 2,
5325
5363
  height: l,
5326
5364
  fill: "transparent",
5327
5365
  // stroke: 'rgba(255, 255, 255, 0.5)',
5328
5366
  // strokeWidth: 0,
5329
5367
  overflow: "hidden"
5330
- }), f = new z(
5368
+ }), f = new Z(
5331
5369
  {
5332
5370
  ...h.stationSlotGroup,
5333
5371
  around: "center",
@@ -5358,7 +5396,7 @@ class pe extends Y {
5358
5396
  offsetY: c,
5359
5397
  x: h,
5360
5398
  y: d,
5361
- zIndex: w,
5399
+ zIndex: C,
5362
5400
  rotation: p,
5363
5401
  scale: f,
5364
5402
  visible: u,
@@ -5393,7 +5431,7 @@ class pe extends Y {
5393
5431
  y: d,
5394
5432
  width: a,
5395
5433
  height: A,
5396
- zIndex: w,
5434
+ zIndex: C,
5397
5435
  rotation: p,
5398
5436
  scale: f,
5399
5437
  visible: u,
@@ -5407,7 +5445,7 @@ class pe extends Y {
5407
5445
  children: m
5408
5446
  });
5409
5447
  return s !== !1 && E.add(
5410
- Z({
5448
+ z({
5411
5449
  title: i || "",
5412
5450
  x: this.width_05,
5413
5451
  y: A - 14,
@@ -5433,7 +5471,7 @@ class pe extends Y {
5433
5471
  i.operating(e);
5434
5472
  return;
5435
5473
  }
5436
- Jt.warn(`通用托盘资源操作失败:未找到 index=${e.device_layer} 的层`);
5474
+ zt.warn(`通用托盘资源操作失败:未找到 index=${e.device_layer} 的层`);
5437
5475
  return;
5438
5476
  }
5439
5477
  const t = this.layerGroups.get(1);
@@ -5441,7 +5479,7 @@ class pe extends Y {
5441
5479
  t.operating(e);
5442
5480
  return;
5443
5481
  }
5444
- Jt.warn("通用托盘资源操作失败:未配置第一层工位组");
5482
+ zt.warn("通用托盘资源操作失败:未配置第一层工位组");
5445
5483
  }
5446
5484
  /**
5447
5485
  * 判断本托盘是否包含指定工位号
@@ -5489,7 +5527,7 @@ class pe extends Y {
5489
5527
  super.emitTap(e);
5490
5528
  }
5491
5529
  }
5492
- const Js = V("ResourceOperationWindow");
5530
+ const eo = P("ResourceOperationWindow");
5493
5531
  class ee extends Y {
5494
5532
  static DEFAULT_RING_THICKNESS = 10;
5495
5533
  static LIGHT_Y_OFFSET = 6;
@@ -5529,7 +5567,7 @@ class ee extends Y {
5529
5567
  zIndex: c,
5530
5568
  rotation: h,
5531
5569
  scale: d,
5532
- visible: w,
5570
+ visible: C,
5533
5571
  editable: p,
5534
5572
  draggable: f,
5535
5573
  lightEnabled: u,
@@ -5578,7 +5616,7 @@ class ee extends Y {
5578
5616
  })
5579
5617
  ]
5580
5618
  }), v = [B, T, Q];
5581
- y && (this.stationSlotGroup = new z(
5619
+ y && (this.stationSlotGroup = new Z(
5582
5620
  {
5583
5621
  ...y,
5584
5622
  around: "center",
@@ -5598,13 +5636,13 @@ class ee extends Y {
5598
5636
  strokeWidth: 0.5,
5599
5637
  cornerRadius: ee.LIGHT_CORNER_RADIUS
5600
5638
  }).init(), v.push(this.light.ui)), b !== !1 && v.push(
5601
- Z({
5639
+ z({
5602
5640
  title: i || "",
5603
5641
  x: s / 2,
5604
5642
  y: o - ee.NAME_PLATE_Y_OFFSET
5605
5643
  })
5606
5644
  );
5607
- const C = new I({
5645
+ const w = new I({
5608
5646
  data: this.config,
5609
5647
  id: e,
5610
5648
  className: t,
@@ -5617,7 +5655,7 @@ class ee extends Y {
5617
5655
  zIndex: c,
5618
5656
  rotation: h,
5619
5657
  scale: d,
5620
- visible: w,
5658
+ visible: C,
5621
5659
  editable: p,
5622
5660
  draggable: f,
5623
5661
  origin: "center",
@@ -5625,13 +5663,13 @@ class ee extends Y {
5625
5663
  fill: "rgba(0,0,0,0)",
5626
5664
  children: v
5627
5665
  });
5628
- return H(C, this.config), C;
5666
+ return H(w, this.config), w;
5629
5667
  }
5630
5668
  // Operating
5631
5669
  operating(e) {
5632
5670
  if (e.light && this.light && this.light.operating(e.light), e.resource) {
5633
5671
  if (!this.stationSlotGroup) {
5634
- Js.warn("资源操作窗口未配置 stationSlotGroup,无法操作托盘资源");
5672
+ eo.warn("资源操作窗口未配置 stationSlotGroup,无法操作托盘资源");
5635
5673
  return;
5636
5674
  }
5637
5675
  this.stationSlotGroup.operating(e.resource);
@@ -5647,45 +5685,45 @@ class ee extends Y {
5647
5685
  return this.stationSlotGroup ? [this.stationSlotGroup] : [];
5648
5686
  }
5649
5687
  }
5650
- const js = {
5688
+ const to = {
5651
5689
  [D.MACHINE_TOOL]: Oe,
5652
5690
  [D.LOADING_STATION]: Ke,
5653
5691
  [D.SHUTTLE_STATION]: k,
5654
- [D.MATERIAL_TRACK]: P,
5655
- [D.MARKING_MACHINE]: ft,
5656
- [D.CLEANING_MACHINE]: Ys,
5692
+ [D.MATERIAL_TRACK]: V,
5693
+ [D.MARKING_MACHINE]: wt,
5694
+ [D.CLEANING_MACHINE]: Zs,
5657
5695
  [D.SINGLE_JOINT_ROBOT]: be,
5658
5696
  [D.DOUBLE_JOINT_ROBOT]: ve,
5659
5697
  [D.RGV]: xe,
5660
- [D.RAIL]: ut,
5698
+ [D.RAIL]: ft,
5661
5699
  [D.RESOURCE_STORE]: Me,
5662
5700
  [D.PALLET]: pe,
5663
5701
  [D.RESOURCE_OPERATION_WINDOW]: ee
5664
5702
  };
5665
- function zs(r) {
5666
- const e = js[r.className];
5703
+ function io(r) {
5704
+ const e = to[r.className];
5667
5705
  if (!e)
5668
5706
  throw new Error(`Unsupported model className: ${r.className}`);
5669
5707
  return new e(r);
5670
5708
  }
5671
- const U = V("AppController"), Zs = {
5672
- LightGrid: pi,
5673
- DarkGrid: wi,
5674
- MatrixGrid: Ci,
5675
- LightDot: mi,
5676
- DarkDot: yi,
5677
- WoodFloor: Ei
5678
- }, jt = {
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 = {
5679
5717
  width: window.innerWidth,
5680
5718
  height: window.innerHeight,
5681
5719
  fill: void 0,
5682
5720
  zoomType: "fit"
5683
- }, zt = {
5721
+ }, $t = {
5684
5722
  critical: "#E83B30",
5685
5723
  warning: "#E6A23C",
5686
5724
  info: "#409EFF"
5687
5725
  };
5688
- class Si {
5726
+ class xi {
5689
5727
  app;
5690
5728
  treeBoxUI = null;
5691
5729
  // 主容器
@@ -5729,7 +5767,7 @@ class Si {
5729
5767
  appEditable: a = !1,
5730
5768
  actions: A = {}
5731
5769
  } = e;
5732
- this.hideSceneFill = o, this.appEditable = a, this.actions = i ? A : {}, this.app = new Ki({
5770
+ this.hideSceneFill = o, this.appEditable = a, this.actions = i ? A : {}, this.app = new Gi({
5733
5771
  view: t || window,
5734
5772
  start: n,
5735
5773
  ground: {},
@@ -5741,11 +5779,11 @@ class Si {
5741
5779
  preventDefault: !0,
5742
5780
  preventDefaultMenu: !0
5743
5781
  }
5744
- }), this.app.on(Mi.READY, () => {
5782
+ }), this.app.on(Pi.READY, () => {
5745
5783
  U.log("Leafer 引擎 READY");
5746
5784
  });
5747
5785
  const l = new I({
5748
- ...jt,
5786
+ ...Zt,
5749
5787
  id: "treeBoxUI",
5750
5788
  stroke: a ? { type: "solid", color: "rgb(242, 195, 79)" } : null
5751
5789
  });
@@ -5772,7 +5810,7 @@ class Si {
5772
5810
  // 修改 tree 配置,不传参数则重置为默认配置
5773
5811
  setTree(e) {
5774
5812
  if (e) {
5775
- const t = e.texture ? Zs[e.texture] : void 0, i = e.fillVisible !== !1, s = e.textureOpacity ?? 1, o = e.textureSize, n = (a) => {
5813
+ const t = e.texture ? so[e.texture] : void 0, i = e.fillVisible !== !1, s = e.textureOpacity ?? 1, o = e.textureSize, n = (a) => {
5776
5814
  let A;
5777
5815
  const l = a ? { type: "image", url: a, mode: "repeat", opacity: s } : void 0;
5778
5816
  l && i ? A = [e.fill, l] : l ? A = l : i ? A = e.fill : A = void 0, this.treeBoxUI?.set({
@@ -5793,7 +5831,7 @@ class Si {
5793
5831
  n(t);
5794
5832
  this.setZoom(e.zoomType);
5795
5833
  } else
5796
- U.log("setTree 重置为默认配置"), this.setTree(jt), this.setZoom();
5834
+ U.log("setTree 重置为默认配置"), this.setTree(Zt), this.setZoom();
5797
5835
  }
5798
5836
  // tree 层查找元素,返回数组
5799
5837
  findAll(e) {
@@ -5892,7 +5930,7 @@ class Si {
5892
5930
  }
5893
5931
  // 根据类型和配置添加模型
5894
5932
  addModel(e) {
5895
- const t = zs(e);
5933
+ const t = io(e);
5896
5934
  t.appController = this, this.actions && t.init().setEventHandler({
5897
5935
  onTap: (o, n) => {
5898
5936
  this.actions.onTap?.(o, n);
@@ -6121,7 +6159,7 @@ class Si {
6121
6159
  return;
6122
6160
  }
6123
6161
  if (n) {
6124
- n.set({ stroke: zt[s] });
6162
+ n.set({ stroke: $t[s] });
6125
6163
  return;
6126
6164
  }
6127
6165
  const A = Math.max(a.config.width || 100, a.config.height || 100) * 1.05, l = new we({
@@ -6132,7 +6170,7 @@ class Si {
6132
6170
  height: A,
6133
6171
  around: "center",
6134
6172
  origin: "center",
6135
- stroke: zt[s],
6173
+ stroke: $t[s],
6136
6174
  strokeWidth: 3,
6137
6175
  dashPattern: [10, 8],
6138
6176
  hittable: !1,
@@ -6186,7 +6224,7 @@ class Si {
6186
6224
  }
6187
6225
  // 切换全局动画开关(标志位方式,仅影响循环动画,保留一次性动画和静态状态)
6188
6226
  toggleAnimations(e) {
6189
- this.animationsEnabled = e !== void 0 ? e : !this.animationsEnabled, qs(this.animationsEnabled), !this.animationsEnabled && this.treeBoxUI && this.clearAllAnimations(this.treeBoxUI), U.log("toggleAnimations, enabled=%s", this.animationsEnabled);
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);
6190
6228
  }
6191
6229
  // 递归清除所有元素的 animation 属性
6192
6230
  clearAllAnimations(e = this.treeBoxUI) {
@@ -6202,8 +6240,8 @@ class Si {
6202
6240
  this.app.tree.config.maxFPS = t, U.log("setFps, mode=%s", e);
6203
6241
  }
6204
6242
  }
6205
- const ne = V("EditorController"), $s = 0.1, eo = 10, Zt = "ruler-dark", to = 20, io = "#000", so = 1, oo = 20;
6206
- class pt {
6243
+ const ne = P("EditorController"), oo = 0.1, ro = 10, ei = "ruler-dark", no = 20, ao = "#000", Ao = 1, lo = 20;
6244
+ class Ct {
6207
6245
  container;
6208
6246
  editor;
6209
6247
  onSelected;
@@ -6213,7 +6251,7 @@ class pt {
6213
6251
  onDragStart;
6214
6252
  onDragEnd;
6215
6253
  constructor(e) {
6216
- const { container: t, zoomMin: i = $s, zoomMax: s = eo } = e;
6254
+ const { container: t, zoomMin: i = oo, zoomMax: s = ro } = e;
6217
6255
  if (i >= s)
6218
6256
  throw new Error("zoomMin must be less than zoomMax");
6219
6257
  const o = t.app;
@@ -6223,7 +6261,7 @@ class pt {
6223
6261
  max: s
6224
6262
  };
6225
6263
  try {
6226
- ro(o), no(o);
6264
+ co(o), ho(o);
6227
6265
  } catch (a) {
6228
6266
  ne.error("Failed to initialize plugins:", a);
6229
6267
  }
@@ -6265,14 +6303,14 @@ class pt {
6265
6303
  }
6266
6304
  // 设置监听事件
6267
6305
  addEvent() {
6268
- this.editor.on(mt.SELECT, (e) => {
6306
+ this.editor.on(Et.SELECT, (e) => {
6269
6307
  try {
6270
6308
  const t = e.editor.list.map((i) => i.id).filter((i) => typeof i == "string");
6271
6309
  this.onSelected?.(t);
6272
6310
  } catch (t) {
6273
6311
  ne.error("Error in SELECT event handler:", t);
6274
6312
  }
6275
- }), this.editor.on(yt.MOVE, (e) => {
6313
+ }), this.editor.on(Bt.MOVE, (e) => {
6276
6314
  try {
6277
6315
  const { x: t, y: i } = e.target;
6278
6316
  if (typeof t != "number" || typeof i != "number") return;
@@ -6282,7 +6320,7 @@ class pt {
6282
6320
  } catch (t) {
6283
6321
  ne.error("Error in MOVE event handler:", t);
6284
6322
  }
6285
- }), this.editor.on(Et.ROTATE, (e) => {
6323
+ }), this.editor.on(St.ROTATE, (e) => {
6286
6324
  try {
6287
6325
  this.markDragging();
6288
6326
  const { rotation: t } = e.target;
@@ -6290,7 +6328,7 @@ class pt {
6290
6328
  } catch (t) {
6291
6329
  ne.error("Error in ROTATE event handler:", t);
6292
6330
  }
6293
- }), this.editor.on(Bt.SCALE, (e) => {
6331
+ }), this.editor.on(bt.SCALE, (e) => {
6294
6332
  try {
6295
6333
  this.markDragging();
6296
6334
  const t = e.target, { width: i, height: s, scale: o } = t;
@@ -6310,43 +6348,43 @@ class pt {
6310
6348
  markDragging() {
6311
6349
  this.dragEndTimer && (clearTimeout(this.dragEndTimer), this.dragEndTimer = null), this.dragging || (this.dragging = !0, this.onDragStart?.()), this.dragEndTimer = setTimeout(() => {
6312
6350
  this.dragging = !1, this.dragEndTimer = null, this.onDragEnd?.();
6313
- }, pt.DRAG_END_SILENCE);
6351
+ }, Ct.DRAG_END_SILENCE);
6314
6352
  }
6315
6353
  // 销毁事件
6316
6354
  destroy() {
6317
- ne.log("销毁, 移除所有事件监听"), this.dragEndTimer && (clearTimeout(this.dragEndTimer), this.dragEndTimer = null), this.dragging = !1, this.editor.off(mt.SELECT), this.editor.off(Et.ROTATE), this.editor.off(Bt.SCALE), this.editor.off(yt.MOVE);
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);
6318
6356
  }
6319
6357
  }
6320
- function ro(r) {
6321
- const e = new Ni(r, {
6358
+ function co(r) {
6359
+ const e = new Vi(r, {
6322
6360
  enabled: !0,
6323
- ruleSize: to,
6361
+ ruleSize: no,
6324
6362
  unit: "px"
6325
6363
  });
6326
- e.addTheme(Zt, {
6364
+ e.addTheme(ei, {
6327
6365
  backgroundColor: "#333",
6328
6366
  textColor: "#ccc",
6329
6367
  borderColor: "#888",
6330
6368
  highlightColor: "rgba(125,111,239,.8)"
6331
- }), e.changeTheme(Zt);
6369
+ }), e.changeTheme(ei);
6332
6370
  }
6333
- function no(r) {
6334
- new Gi(r, {
6335
- dotColor: io,
6336
- dotSize: so,
6337
- targetDotMatrixPixel: oo
6371
+ function ho(r) {
6372
+ new qi(r, {
6373
+ dotColor: ao,
6374
+ dotSize: Ao,
6375
+ targetDotMatrixPixel: lo
6338
6376
  }).enableDotMatrix(!0);
6339
6377
  }
6340
- const $t = Vi({
6378
+ const ti = Wi({
6341
6379
  legacy: !1,
6342
6380
  // legacy 为 false 则启用 Composition API 模式
6343
6381
  globalInjection: !0,
6344
6382
  // 允许在模板中使用 $t
6345
6383
  locale: "zhCn",
6346
6384
  fallbackLocale: "en",
6347
- messages: { zhCn: qi, en: Pi }
6348
- }), bi = Ne("@jnrs/lingshu-smart/debug", () => {
6349
- const r = gt(), e = () => r.globalSetting, t = ce(!1), i = _({
6385
+ messages: { zhCn: Yi, en: Hi }
6386
+ }), Ii = Ne("@jnrs/lingshu-smart/debug", () => {
6387
+ const r = ut(), e = () => r.globalSetting, t = ce(!1), i = _({
6350
6388
  get: () => e().logLevel,
6351
6389
  set: (S) => {
6352
6390
  e().logLevel = S;
@@ -6393,7 +6431,7 @@ const $t = Vi({
6393
6431
  }
6394
6432
  }), d = (S) => {
6395
6433
  e().perfStatsCollapsed = S;
6396
- }, w = _({
6434
+ }, C = _({
6397
6435
  get: () => e().wsProxyActiveCaseId ?? "",
6398
6436
  set: (S) => {
6399
6437
  e().wsProxyActiveCaseId = S;
@@ -6422,7 +6460,7 @@ const $t = Vi({
6422
6460
  e().locale = S;
6423
6461
  }, v = (S) => {
6424
6462
  e().theme = S;
6425
- }, C = () => {
6463
+ }, w = () => {
6426
6464
  e().theme = e().theme === "dark" ? "light" : "dark";
6427
6465
  }, F = (S) => {
6428
6466
  r.setScriptSteps(p.value, S);
@@ -6432,13 +6470,13 @@ const $t = Vi({
6432
6470
  e().wsProxyManualModified = S;
6433
6471
  }, We = () => {
6434
6472
  t.value = !0;
6435
- }, vi = () => {
6473
+ }, Fi = () => {
6436
6474
  t.value = !1;
6437
6475
  };
6438
- return wt(r.globalSetting.logLevel), $t.global.locale.value = r.globalSetting.locale, ie(i, (S) => {
6439
- wt(S);
6476
+ return mt(r.globalSetting.logLevel), ti.global.locale.value = r.globalSetting.locale, ie(i, (S) => {
6477
+ mt(S);
6440
6478
  }), ie(A, (S) => {
6441
- $t.global.locale.value = S;
6479
+ ti.global.locale.value = S;
6442
6480
  }), {
6443
6481
  logLevel: i,
6444
6482
  shadowsEnabled: s,
@@ -6454,7 +6492,7 @@ const $t = Vi({
6454
6492
  scriptCaseId: p,
6455
6493
  scriptCaseName: f,
6456
6494
  ensureScriptCase: u,
6457
- activeCaseId: w,
6495
+ activeCaseId: C,
6458
6496
  setWsProxyActiveCaseId: O,
6459
6497
  wsProxyManualModified: c,
6460
6498
  setWsProxyManualModified: R,
@@ -6467,35 +6505,35 @@ const $t = Vi({
6467
6505
  setInteractionsDisabled: T,
6468
6506
  setLocale: Q,
6469
6507
  setTheme: v,
6470
- toggleTheme: C,
6508
+ toggleTheme: w,
6471
6509
  showDebugPanel: We,
6472
- hideDebugPanel: vi
6510
+ hideDebugPanel: Fi
6473
6511
  };
6474
- }), K = V("EditorStore"), Fo = Ne("@jnrs/lingshu-smart/editor", () => {
6475
- const r = gt(), e = bi();
6512
+ }), K = P("EditorStore"), Ro = Ne("@jnrs/lingshu-smart/editor", () => {
6513
+ const r = ut(), e = Ii();
6476
6514
  let t = null, i = null, s = !1, o = null, n = null, a = null;
6477
- const A = _(() => r.cases?.find((C) => C.isActive) || null), l = _(() => A.value ? A.value.scene : null), c = _(() => A.value ? A.value.layers : []), h = _(() => A.value && c.value.find((C) => C.selected) || null), d = (C) => {
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) => {
6478
6516
  if (t) {
6479
6517
  K.warn("Container already initialized");
6480
6518
  return;
6481
6519
  }
6482
- t = new Si(C), K.log("AppController Initialized"), C.appEditable && y(), u(), e.shadowsEnabled || t.toggleShadows(!1), e.animationsEnabled || t.toggleAnimations(!1), e.fpsMode !== "auto" && t.setFps(e.fpsMode);
6483
- }, w = (C) => {
6484
- t && t.toggleShadows(C);
6485
- }, p = (C) => {
6486
- t && t.toggleAnimations(C);
6487
- }, f = (C) => {
6488
- t && t.setFps(C);
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);
6521
+ }, C = (w) => {
6522
+ t && t.toggleShadows(w);
6523
+ }, p = (w) => {
6524
+ t && t.toggleAnimations(w);
6525
+ }, f = (w) => {
6526
+ t && t.setFps(w);
6489
6527
  };
6490
6528
  ie(
6491
6529
  () => e.shadowsEnabled,
6492
- (C) => w(C)
6530
+ (w) => C(w)
6493
6531
  ), ie(
6494
6532
  () => e.animationsEnabled,
6495
- (C) => p(C)
6533
+ (w) => p(w)
6496
6534
  ), ie(
6497
6535
  () => e.fpsMode,
6498
- (C) => f(C)
6536
+ (w) => f(w)
6499
6537
  );
6500
6538
  const u = Se(() => {
6501
6539
  if (!t) {
@@ -6509,9 +6547,9 @@ const $t = Vi({
6509
6547
  return;
6510
6548
  }
6511
6549
  if (t.clearAll(), A.value) {
6512
- const C = h.value?.id;
6550
+ const w = h.value?.id;
6513
6551
  for (const F of c.value)
6514
- t.addModel(F), i && F.id === C && i.selectEquipment(`#${C}`);
6552
+ t.addModel(F), i && F.id === w && i.selectEquipment(`#${w}`);
6515
6553
  } else
6516
6554
  t.setTree(void 0);
6517
6555
  K.log("renderLayers...");
@@ -6528,24 +6566,24 @@ const $t = Vi({
6528
6566
  K.error("Cannot init Editor: AppController missing");
6529
6567
  return;
6530
6568
  }
6531
- i = new pt({
6569
+ i = new Ct({
6532
6570
  container: t,
6533
- onSelected: (C) => {
6534
- const F = C[0];
6571
+ onSelected: (w) => {
6572
+ const F = w[0];
6535
6573
  c.value.forEach((O) => {
6536
6574
  O.id === F ? O.selected = !0 : O.selected = !1;
6537
6575
  });
6538
6576
  },
6539
- onRotate: (C) => {
6577
+ onRotate: (w) => {
6540
6578
  const F = h.value;
6541
- F && (F.rotation = C);
6579
+ F && (F.rotation = w);
6542
6580
  },
6543
- onScale: (C) => {
6581
+ onScale: (w) => {
6544
6582
  const F = h.value;
6545
- F && F.width && F.height && (F.scale = Number((C / F.width).toFixed(2)));
6583
+ F && F.width && F.height && (F.scale = Number((w / F.width).toFixed(2)));
6546
6584
  },
6547
- onMove: (C, F) => {
6548
- n = { x: C, y: F }, a === null && (a = requestAnimationFrame(() => {
6585
+ onMove: (w, F) => {
6586
+ n = { x: w, y: F }, a === null && (a = requestAnimationFrame(() => {
6549
6587
  a = null;
6550
6588
  const O = n;
6551
6589
  if (n = null, !O) return;
@@ -6558,34 +6596,34 @@ const $t = Vi({
6558
6596
  },
6559
6597
  onDragEnd: () => {
6560
6598
  s = !1;
6561
- const C = h.value;
6562
- C ? (E(C), B(C)) : o && B(o), o = null;
6599
+ const w = h.value;
6600
+ w ? (E(w), B(w)) : o && B(o), o = null;
6563
6601
  }
6564
6602
  }), K.log("EditorController Initialized");
6565
- }, E = (C) => {
6603
+ }, E = (w) => {
6566
6604
  if (!t) return;
6567
- const F = t.findOne(`#${C.id}`);
6605
+ const F = t.findOne(`#${w.id}`);
6568
6606
  if (F)
6569
6607
  if (F.className === "ShuttleStation") {
6570
- const { width: O, height: R, ...We } = C;
6608
+ const { width: O, height: R, ...We } = w;
6571
6609
  F.set(We);
6572
6610
  } else
6573
- F.set(C);
6574
- }, B = Se((C) => {
6611
+ F.set(w);
6612
+ }, B = Se((w) => {
6575
6613
  if (s) {
6576
- o = C;
6614
+ o = w;
6577
6615
  return;
6578
6616
  }
6579
- i && (K.log("rerenderLayer..."), i.rerenderModel(C));
6580
- }, 500), T = (C) => {
6617
+ i && (K.log("rerenderLayer..."), i.rerenderModel(w));
6618
+ }, 500), T = (w) => {
6581
6619
  if (!A.value) {
6582
6620
  K.warn("addLayer failed: currentCase not initialized");
6583
6621
  return;
6584
6622
  }
6585
- const F = C.id || st(), O = c.value.length + 1, R = {
6586
- ...oe(ws),
6623
+ const F = w.id || ot(), O = c.value.length + 1, R = {
6624
+ ...oe(ys),
6587
6625
  // 使用cloneDeep防止展开运算符的浅拷贝无法处理嵌套对象,导致污染初始值
6588
- ...oe(C),
6626
+ ...oe(w),
6589
6627
  id: F,
6590
6628
  zIndex: O,
6591
6629
  rawData: {
@@ -6597,17 +6635,17 @@ const $t = Vi({
6597
6635
  return;
6598
6636
  }
6599
6637
  t.addModel(R);
6600
- }, Q = (C, F, O) => {
6638
+ }, Q = (w, F, O) => {
6601
6639
  if (!t) {
6602
6640
  K.warn("addLayerAtPosition failed: appController not initialized");
6603
6641
  return;
6604
6642
  }
6605
6643
  const R = t.worldToLocalPoint(F, O);
6606
- R && (C.x = R.x, C.y = R.y, C.percentX = Te(R.x, l.value?.width, 3, !0), C.percentY = Te(R.y, l.value?.height, 3, !0)), T(C);
6607
- }, v = (C) => {
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) => {
6608
6646
  if (i) {
6609
- const F = h.value?.id === C;
6610
- i.selectEquipment(F ? void 0 : `#${C}`);
6647
+ const F = h.value?.id === w;
6648
+ i.selectEquipment(F ? void 0 : `#${w}`);
6611
6649
  }
6612
6650
  };
6613
6651
  return ie(
@@ -6618,8 +6656,8 @@ const $t = Vi({
6618
6656
  { deep: !0 }
6619
6657
  ), ie(
6620
6658
  h,
6621
- (C) => {
6622
- C && (s || E(C), B(C));
6659
+ (w) => {
6660
+ w && (s || E(w), B(w));
6623
6661
  },
6624
6662
  { deep: !0 }
6625
6663
  ), {
@@ -6642,8 +6680,8 @@ const $t = Vi({
6642
6680
  updateLayer: E,
6643
6681
  renderLayers: b
6644
6682
  };
6645
- }), M = V("SocketDispatcher"), ao = 2e3, le = (r) => r?.resource_color;
6646
- class Ao {
6683
+ }), M = P("SocketDispatcher"), go = 2e3, le = (r) => r?.resource_color;
6684
+ class uo {
6647
6685
  entities = /* @__PURE__ */ new Map();
6648
6686
  get(e) {
6649
6687
  return this.entities.get(e);
@@ -6678,12 +6716,12 @@ class Ao {
6678
6716
  i.location?.device_id === e && this.entities.delete(t);
6679
6717
  }
6680
6718
  }
6681
- class lo {
6719
+ class fo {
6682
6720
  appController;
6683
6721
  getScene;
6684
6722
  onAck;
6685
6723
  onRaw;
6686
- pool = new Ao();
6724
+ pool = new uo();
6687
6725
  /** envelope.id 去重缓存(重复 ID 丢弃,warn 日志) */
6688
6726
  seenIds = /* @__PURE__ */ new Set();
6689
6727
  seenQueue = [];
@@ -6717,7 +6755,7 @@ class lo {
6717
6755
  M.warn("重复的 envelope.id=%s,丢弃", i.id);
6718
6756
  return;
6719
6757
  }
6720
- if (this.seenIds.add(i.id), this.seenQueue.push(i.id), this.seenQueue.length > ao) {
6758
+ if (this.seenIds.add(i.id), this.seenQueue.push(i.id), this.seenQueue.length > go) {
6721
6759
  const o = this.seenQueue.shift();
6722
6760
  o !== void 0 && this.seenIds.delete(o);
6723
6761
  }
@@ -6770,7 +6808,7 @@ class lo {
6770
6808
  id: e.device_id,
6771
6809
  raw_data: e.raw_data || {}
6772
6810
  };
6773
- e.device_station !== void 0 && (i.device_station = e.device_station), e.device_state !== void 0 && (i.device_state = e.device_state), e.light !== void 0 && (i.light = e.light), e.progress !== void 0 && (i.progress = e.progress), e.passage !== void 0 && (i.passage = e.passage);
6811
+ e.device_station !== void 0 && (i.device_station = e.device_station), e.device_state !== void 0 && (i.device_state = e.device_state), e.nameplate !== void 0 && (i.nameplate = e.nameplate), e.light !== void 0 && (i.light = e.light), e.progress !== void 0 && (i.progress = e.progress), e.passage !== void 0 && (i.passage = e.passage);
6774
6812
  const s = this.toPixelPosition(e.position);
6775
6813
  return s && (i.position = s), e.station_rotation !== void 0 && (i.station_rotation = e.station_rotation), e.is_working !== void 0 && (i.is_working = e.is_working), e.layer_light_colors !== void 0 && (i.layer_light_colors = e.layer_light_colors), e.layer_light_blinking !== void 0 && (i.layer_light_blinking = e.layer_light_blinking), e.layer_visible !== void 0 && (i.layer_visible = e.layer_visible), e.marking_sites !== void 0 && (i.marking_sites = e.marking_sites), e.current_fixture !== void 0 && (i.current_fixture = e.current_fixture), i;
6776
6814
  }
@@ -7099,15 +7137,15 @@ class lo {
7099
7137
  });
7100
7138
  }
7101
7139
  }
7102
- const ae = V("AppStore"), Qo = Ne("@jnrs/lingshu-smart/app", () => {
7103
- const r = gt(), e = bi(), t = ce(null);
7140
+ const ae = P("AppStore"), Lo = Ne("@jnrs/lingshu-smart/app", () => {
7141
+ const r = ut(), e = Ii(), t = ce(null);
7104
7142
  let i = null, s = null, o = {};
7105
7143
  const n = (u, b) => {
7106
7144
  if (i) {
7107
7145
  ae.warn("Container already initialized");
7108
7146
  return;
7109
7147
  }
7110
- i = new Si(u), ae.log("AppController Initialized"), s = new lo({
7148
+ i = new xi(u), ae.log("AppController Initialized"), s = new fo({
7111
7149
  appController: i,
7112
7150
  getScene: () => t.value?.scene ?? null,
7113
7151
  onAck: (m) => o.onAck?.(m),
@@ -7160,7 +7198,7 @@ const ae = V("AppStore"), Qo = Ne("@jnrs/lingshu-smart/app", () => {
7160
7198
  return;
7161
7199
  }
7162
7200
  i.operating(u);
7163
- }, w = (u) => {
7201
+ }, C = (u) => {
7164
7202
  o = u;
7165
7203
  }, p = (u) => {
7166
7204
  if (!s) {
@@ -7183,41 +7221,41 @@ const ae = V("AppStore"), Qo = Ne("@jnrs/lingshu-smart/app", () => {
7183
7221
  destroyContainer: h,
7184
7222
  operating: d,
7185
7223
  feedSocketMessage: p,
7186
- setSocketHandlers: w,
7224
+ setSocketHandlers: C,
7187
7225
  resetModels: f
7188
7226
  };
7189
7227
  });
7190
7228
  export {
7191
- Eo as A,
7192
- bo as B,
7193
- wi as D,
7194
- pi as L,
7195
- Ci as M,
7196
- Ei as W,
7197
- Fo as a,
7198
- Qo as b,
7199
- bi as c,
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,
7200
7238
  Se as d,
7201
- mi as e,
7202
- yi as f,
7203
- yo as g,
7204
- rt as h,
7205
- $t as i,
7206
- ys as j,
7207
- ct as k,
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,
7208
7246
  Fe as l,
7209
- ni as m,
7210
- At as n,
7211
- at as o,
7212
- lt as p,
7213
- Rs as q,
7247
+ Ai as m,
7248
+ lt as n,
7249
+ At as o,
7250
+ ct as p,
7251
+ Us as q,
7214
7252
  re as r,
7215
- st as s,
7216
- xo as t,
7217
- gt as u,
7218
- ui as v,
7219
- vo as w,
7220
- Io as x,
7221
- So as y,
7222
- Bo as z
7253
+ ot as s,
7254
+ To as t,
7255
+ ut as u,
7256
+ fi as v,
7257
+ Do as w,
7258
+ ko as x,
7259
+ Fo as y,
7260
+ Io as z
7223
7261
  };