@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.
- package/AGENTS.md +7 -6
- package/dist/components/index.js +443 -435
- package/dist/components/preview/index.vue.d.ts +312 -0
- package/dist/{fullscreen-BA3oea8O.js → fullscreen-cF8Z5e2Z.js} +6 -6
- package/dist/index.js +16 -16
- package/dist/lingshu-smart/cases.json +2844 -2798
- package/dist/lingshu-smart/mockSocket.json +31 -2
- package/dist/playground/ViewPageDemo.vue.d.ts +624 -0
- package/dist/stores/index.js +1 -1
- package/dist/stores/useAppStore.d.ts +936 -0
- package/dist/stores/useDataStore.d.ts +936 -0
- package/dist/types/guards.d.ts +1 -1
- package/dist/types/models/operating.types.d.ts +5 -0
- package/dist/types/socket.types.d.ts +7 -0
- package/dist/ui/abstract/ModelAbs.d.ts +7 -0
- package/dist/ui/models/SingleJointRobot.d.ts +3 -1
- package/dist/ui/shapes/NamePlate.d.ts +14 -0
- package/dist/{useAppStore-DASwAOBy.js → useAppStore-DWFfsey0.js} +673 -635
- package/package.json +2 -2
- /package/dist/components/editor/OptionCard/Equipment/models/{SingleJointRobot.vue.d.ts → JointRobot.vue.d.ts} +0 -0
|
@@ -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
|
|
4
|
-
import {
|
|
5
|
-
import { Ruler as
|
|
6
|
-
import { DotMatrix as
|
|
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
|
|
9
|
-
import { en as
|
|
10
|
-
var
|
|
11
|
-
function
|
|
12
|
-
return typeof r == "symbol" ||
|
|
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
|
|
15
|
-
function
|
|
16
|
-
for (var e = r.length; 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
|
|
21
|
-
function
|
|
22
|
-
return r && r.slice(0,
|
|
20
|
+
var Zi = /^\s+/;
|
|
21
|
+
function $i(r) {
|
|
22
|
+
return r && r.slice(0, zi(r) + 1).replace(Zi, "");
|
|
23
23
|
}
|
|
24
|
-
var
|
|
25
|
-
function
|
|
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 (
|
|
29
|
-
return
|
|
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 =
|
|
37
|
-
var t =
|
|
38
|
-
return t ||
|
|
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
|
|
42
|
-
},
|
|
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(
|
|
47
|
-
e =
|
|
48
|
-
function
|
|
46
|
+
throw new TypeError(os);
|
|
47
|
+
e = xt(e) || 0, et(t) && (c = !!t.leading, h = "maxWait" in t, o = h ? rs(xt(t.maxWait) || 0, e) : o, d = "trailing" in t ? !!t.trailing : d);
|
|
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 ?
|
|
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 ?
|
|
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 ?
|
|
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),
|
|
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
|
|
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
|
|
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) =>
|
|
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
|
|
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) =>
|
|
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
|
|
109
|
-
return Array.isArray(r) ? r.every((e) =>
|
|
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
|
|
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
|
|
113
|
+
function Cs() {
|
|
114
114
|
let r = BigInt(Date.now());
|
|
115
115
|
if (r < Ce && (r = Ce), r === Ce) {
|
|
116
|
-
if (me = me + 1n &
|
|
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 -
|
|
123
|
+
return Ce = r, r - ls << fs | ws << ds | ps << us | me;
|
|
124
124
|
}
|
|
125
|
-
function
|
|
126
|
-
return
|
|
125
|
+
function ot() {
|
|
126
|
+
return Cs().toString();
|
|
127
127
|
}
|
|
128
|
-
const
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
|
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
|
|
626
|
+
function vo(r) {
|
|
627
627
|
return r ? tt[r] : void 0;
|
|
628
628
|
}
|
|
629
|
-
const
|
|
630
|
-
function
|
|
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 :
|
|
633
|
+
return e === "none" || e === "transparent" ? !1 : Es.test(r) ? !0 : /^[a-z][a-z-]{2,}$/i.test(r);
|
|
634
634
|
}
|
|
635
|
-
const
|
|
636
|
-
function
|
|
637
|
-
let e = (r ||
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 (!
|
|
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 (
|
|
772
|
+
} catch (C) {
|
|
773
773
|
G.error(
|
|
774
774
|
"WsProxy: 对象映射「%s」键 %s 调用 dictFn 异常, 保留源值: %s",
|
|
775
775
|
e.dictName,
|
|
776
776
|
A,
|
|
777
|
-
|
|
777
|
+
C instanceof Error ? C.message : String(C)
|
|
778
778
|
), c = l;
|
|
779
779
|
}
|
|
780
780
|
}
|
|
781
|
-
a[A] =
|
|
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)) &&
|
|
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 =
|
|
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 =
|
|
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
|
|
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" ? !
|
|
820
|
+
return r === "not" ? !Qt(t) : r === "toBoolean" ? Qt(t) : r === "concat" && e ? bs(t, e) : t;
|
|
821
821
|
}
|
|
822
|
-
function
|
|
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
|
|
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
|
|
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
|
|
863
|
+
function at(r, e) {
|
|
864
864
|
return {
|
|
865
|
-
id:
|
|
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 =
|
|
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 &&
|
|
885
|
+
a !== void 0 && ni(r, n.target, a);
|
|
886
886
|
}
|
|
887
887
|
}
|
|
888
|
-
function
|
|
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:
|
|
893
|
+
envelope: at($.DeviceCommand, t),
|
|
894
894
|
payload: a
|
|
895
895
|
};
|
|
896
896
|
}
|
|
897
|
-
function
|
|
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 :
|
|
899
|
-
|
|
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 }),
|
|
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 }),
|
|
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 }),
|
|
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),
|
|
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 :
|
|
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)) }),
|
|
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 }),
|
|
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
|
|
965
|
+
return C;
|
|
966
966
|
}
|
|
967
|
-
function
|
|
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
|
|
977
|
+
const C = n.resourceMappings;
|
|
978
978
|
switch (d) {
|
|
979
979
|
case "add":
|
|
980
|
-
return
|
|
980
|
+
return C?.add?.length ? C.add : Fe;
|
|
981
981
|
case "batch_add":
|
|
982
|
-
return
|
|
982
|
+
return C?.batch_add?.length ? C.batch_add : Ai;
|
|
983
983
|
case "transfer":
|
|
984
|
-
return
|
|
984
|
+
return C?.transfer?.length ? C.transfer : lt;
|
|
985
985
|
case "remove":
|
|
986
|
-
return
|
|
986
|
+
return C?.remove?.length ? C.remove : At;
|
|
987
987
|
case "batch_remove":
|
|
988
|
-
return
|
|
988
|
+
return C?.batch_remove?.length ? C.batch_remove : ct;
|
|
989
989
|
default:
|
|
990
990
|
return [];
|
|
991
991
|
}
|
|
992
|
-
}, l = (d,
|
|
992
|
+
}, l = (d, C) => {
|
|
993
993
|
const p = [];
|
|
994
|
-
for (const f of
|
|
994
|
+
for (const f of C)
|
|
995
995
|
if (f.enabled !== !1)
|
|
996
996
|
try {
|
|
997
|
-
const u =
|
|
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)
|
|
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
|
|
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
|
|
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 =
|
|
1035
|
-
return f ? { messages: [], runtimeStatus:
|
|
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:
|
|
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:
|
|
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:
|
|
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,
|
|
1078
|
-
return
|
|
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
|
|
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
|
|
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
|
-
],
|
|
1104
|
+
], At = [
|
|
1105
1105
|
{ target: "resource_id", source: "resource_id" },
|
|
1106
1106
|
{ target: "resource_type", source: "resource_type" }
|
|
1107
|
-
],
|
|
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
|
-
],
|
|
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
|
|
1125
|
+
function Ts() {
|
|
1126
1126
|
const r = {};
|
|
1127
|
-
for (const e of
|
|
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
|
|
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
|
-
],
|
|
1145
|
+
], Tt = [
|
|
1146
1146
|
{ target: "is_working", source: "is_working", defaultValue: !1, transformTargetType: "boolean" }
|
|
1147
|
-
],
|
|
1148
|
-
function
|
|
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:
|
|
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
|
|
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
|
-
...
|
|
1168
|
-
...
|
|
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
|
-
...
|
|
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
|
|
1239
|
+
function Rs() {
|
|
1240
1240
|
return {
|
|
1241
1241
|
className: "Resource",
|
|
1242
1242
|
// Resource 为虚拟资源操作规则(非画布预设组件),EQUIPMENTS_MENU 中无对应条目,显示名取固定值
|
|
1243
|
-
equipmentName:
|
|
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:
|
|
1253
|
-
transfer:
|
|
1254
|
-
remove:
|
|
1255
|
-
batch_remove:
|
|
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
|
|
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
|
|
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
|
|
1286
|
-
const e =
|
|
1287
|
-
return e ?
|
|
1285
|
+
function Io(r) {
|
|
1286
|
+
const e = hi[r];
|
|
1287
|
+
return e ? ci(r, e) : null;
|
|
1288
1288
|
}
|
|
1289
|
-
function
|
|
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 =
|
|
1293
|
-
o && i.push(
|
|
1292
|
+
const o = hi[s];
|
|
1293
|
+
o && i.push(ci(s, o));
|
|
1294
1294
|
}
|
|
1295
|
-
return i.push(
|
|
1296
|
-
fileUrl:
|
|
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
|
|
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 =
|
|
1325
|
+
const e = _s[r.target];
|
|
1326
1326
|
return e ? { ...r, target: e } : r;
|
|
1327
1327
|
}
|
|
1328
|
-
function
|
|
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
|
|
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(
|
|
1345
|
+
}), e.some((i) => i.operate === "statusPush") || e.push(gi()), e;
|
|
1346
1346
|
}
|
|
1347
|
-
function
|
|
1348
|
-
return { ...r, rules:
|
|
1347
|
+
function Qo(r) {
|
|
1348
|
+
return { ...r, rules: di(r.rules.map(ui)) };
|
|
1349
1349
|
}
|
|
1350
|
-
function
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 ||
|
|
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
|
|
1387
|
+
function Do(r) {
|
|
1388
1388
|
return JSON.stringify(
|
|
1389
|
-
r.map((e) => JSON.parse(
|
|
1389
|
+
r.map((e) => JSON.parse(Us(e))),
|
|
1390
1390
|
null,
|
|
1391
1391
|
2
|
|
1392
1392
|
);
|
|
1393
1393
|
}
|
|
1394
|
-
function
|
|
1395
|
-
const e =
|
|
1394
|
+
function pi(r) {
|
|
1395
|
+
const e = fi(r);
|
|
1396
1396
|
if (e) return e;
|
|
1397
|
-
const t =
|
|
1397
|
+
const t = ht(r);
|
|
1398
1398
|
return t ? [{ ...t, caseId: "" }] : [];
|
|
1399
1399
|
}
|
|
1400
|
-
function
|
|
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
|
|
1407
|
-
const t =
|
|
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 =
|
|
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 =
|
|
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
|
|
1429
|
-
logLevel:
|
|
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
|
-
},
|
|
1440
|
-
function
|
|
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(
|
|
1443
|
-
return 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
|
|
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(
|
|
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 =
|
|
1464
|
-
const t = localStorage.getItem(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
},
|
|
1493
|
+
}, ut = Ne(
|
|
1494
1494
|
"@jnrs/lingshu-smart/data",
|
|
1495
1495
|
() => {
|
|
1496
|
-
const r = oe(
|
|
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),
|
|
1515
|
+
if (Ue(g), As(g))
|
|
1516
1516
|
e.value = g;
|
|
1517
1517
|
else {
|
|
1518
1518
|
const m = "运行 updateCases 函数时参数校验失败:发现非法的 ICase, ILayer 或 IScene 结构";
|
|
1519
|
-
throw
|
|
1519
|
+
throw kt.error(m, g), new Error(m);
|
|
1520
1520
|
}
|
|
1521
|
-
},
|
|
1521
|
+
}, C = (g) => {
|
|
1522
1522
|
e.value.find((y) => y.id === g) && e.value.forEach((y) => {
|
|
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:
|
|
1536
|
+
selectCase: C,
|
|
1537
1537
|
addCase: (g) => {
|
|
1538
|
-
const m =
|
|
1538
|
+
const m = ot();
|
|
1539
1539
|
let y;
|
|
1540
1540
|
if (g)
|
|
1541
|
-
if (
|
|
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
|
|
1545
|
+
throw kt.error(E, g), new Error(E);
|
|
1546
1546
|
}
|
|
1547
1547
|
else
|
|
1548
|
-
y = oe(
|
|
1549
|
-
return e.value.push(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:
|
|
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 =
|
|
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
|
|
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
|
|
1618
|
+
function Ms(r) {
|
|
1619
1619
|
const e = [];
|
|
1620
|
-
return r.color !== void 0 && e.push(`运行灯:${
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1642
|
+
function qs(r) {
|
|
1643
1643
|
const e = r, t = [];
|
|
1644
|
-
e.light && t.push(
|
|
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(
|
|
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
|
-
|
|
1653
|
-
|
|
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(
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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(
|
|
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(
|
|
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,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAFP1JREFUeF7tnQGS2zgORdsny+RkmTnZJCfzNj1SVlGkGCAAEsT/rtrK1Dbtth4/H0FKLT0++CIBEoAl8IA9ch44CZDABwXAEJAAMAEKALjzeegkQAEwAyQATIACAO58HjoJUADMAAkAE6AAgDufh04CFAAzQALABCgA4M7noZNAegE8n8+/zt30eDy+s+tsBM5cydTGs717RaZpBHCA923rit8G/kUX7SL48fHx8Z0h/p3QxnVn2hpIuTamH4/H42/70Kj1CQamDcSPTEynCuAEUhJMSZL+QQ7uSaRkKkmMoM0hq15M2+Q1feKaIoDn89lmlS/C2UjQPbdN/slkW8uBvHtvQEDvfiWMYAcybaynZHWoAAYDPQZ4Ctx3g9bj52TqQfFy6dQmqePSKeYX/f6pQ7M6RAATQ3rGOxRuZGLINIbuVp3OGPi/TFijlrHhAkgC9Ai3rb2aCJY9k5CQ6bQS1ksDiYQ6tHINFcDz+fx3wDq/NwNLVgNJB//eB6sybRt7LasZX+3s1teoLxYigKQ2vWK4VGCTC3VJCSQX6jGzXyOqVncBLAR0mcAuJNSdaeis5TUbMqsfvncEWhDoEhJ4foL1Cv3Iz3l8noMd+fs0v4tZ/Y+WWwdts1TWdZQkGymXA4uU/Xd8U1YCCw/+nbPbcsBTAEvOUqfkuoGVGOddmwJBTXd2oAhTN7G6CGDxWeo8DlNIoEhQUy2xClSpx6y6SMAsgGJBbYBdwL6b3f/084JM2+FOF+uqeyl/yIp52WoSQNGgTpdAwaBmYDrr0l7LXCB5r0msFMA9YhNYSc9dtSks1an7AUWlahZrtwCKB9UM1iCACpupt4c/49QgQFa7JyuLAEoHdUtwN9geAQAEdXgVAMK0e9+qSwAgUIdXAYXL1GlnWoCy2rUh2CsAhNnf/aILwJ3/u0PunrE0lVWx037vDr2LqVoAYFCHVQFAs/9IplV3/u9koF6y9ggADWqXWd/p+vhzQKkOuS4ATKpdYu0RQOa/8deMO01btVk1Hw60Tj1i6VqzSrmCSlU9WfUIAGn9P2QfoNil1NIxqg6r9INbO1CpqisrlQCAoUaHFVGq6rAqBYBYqaqZagWACrU9IEPFShpWYKmqwyplulUAqFJVTVaqUIOWqqHLAHABhOwDgK7/95yGCgDVqmGzFQXg/+gxcAGoqlVtBUABaOpQQVvwqko1WwlwvpqAS5UCkAZF2S6qXIXdV4m69wK6ADT3XhBXAOhlVdSz2wAvVjl6lxWAchYSNhdft0IBCIkGzlbIyypVuSrtKlYA8rsvUQDSVAU9vRW8AqAA5PnTtGQFoKElbMs9ACEoRTMuARSwFE39BQB+cUU7fApAkUBh0ygBZH7WnxBNfzPNRWviJQAFIF9XaboO/DRglFQpAGEItQJAPmUlLquE7HnOOq6qQhaAqqqiAISjVVNWCT9yFwByWEMqAPBqlQLQDEBpWwpASkrVLqSq2gSAWq2qpKqtAFBnKxVU1RD479JVyGsBoqQKLgCVVFUCAC6togWAOFtFM4WcrLRS7REAXFi1UDsqAMSwhgoAdLJSM+0RAFpY1VC1AkAMa7RUQZcB6qyqBQAYVjXUTgEgVVajmEJNVj1S7RUATFh7oHYKACmsQwQAVgV0Me0VAEpYu6D2CAAorKOZQmS1d6LqEsAW1vIPCOmFahAAQlhVp6l6WR7fB3C5dbdUuwUAsBfQDdUS2uJhncW0tFgtE5VVAFWrgClB3aRaNqyWoFqkWnx5ZcqqSQCFwZqgOoS1olhnM60oVtV1/1e59BBANbBTg7p3UrGlQBam1cRq3k8xC6BY2ZoiqMUkYJ6lrBXVaUOwigRcsuoigCJnBVyAOoe1QnVlnqU8mRZZtrpl1U0Ai0sg1Sx1mrFWloBbUCmBnwRcmboKYFEJfN/u99f+Tfla9DbXrkH17pjtORffPm/33gS7ysudqbsAFpNA2pn/nMjFHsySruy/G+ELydV98DcmIQJYRAIhQKOnkuRnB9JXU1f9s4AEwoQaJoDkZweWHPyHswMZd7LJ1N/+4UINFUDCwIYD9c/A9Scmm7XCZqhRPA9Va/vPtjcw+zVkeTpEAAlEUGbgX+wNzKwGlp71k+4LDM3qUAFMsOxQmDOnjMEVQcmBP1muU7I6XACHaqCdfmn/iyi3psCcKYBTlfUl4PTWi+lr5/jxSHvKNKIPNrlGLA12jk2oU5hOE8Cxo7ZTXE0GvcGdDjIieNbPdAgurEjfLA8sMkgl0hQCuCi99osz7i7S+GnLWea0Ds4Z799E2371kWuT7o/t+7y4kqm8d6RMs3JNKQA5frYkARKwEKAALPT4XhJYnAAFsHgH8uuTgIUABWChx/eSwOIEKIDFO5BfnwQsBCgACz2+lwQWJ0ABLN6B/PokYCFAAVjo8b0ksDgBCmDxDuTXJwELAQrAQo/vJYHFCVAAi3cgvz4JWAhQABZ6fC8JLE6AAli8A/n1ScBCgAKw0ON7SWBxAhTA4h3Ir08CFgIUgIUe30sCixOgABbvQH59ErAQoAAs9PheElicAAWweAfy65OAhQAFYKHH95LA4gQogMU7kF+fBCwEUgng4g6r7Y61+2u/k+1+R+D9Trbt5+0xSlPuq26BP+q9h9uut18pZdruDtyeOsTXBYFTVq+YvnK5vfVnVrMxnS4Ah2cCHLtnf3AFfHA3ru2hK3e3VpcObDLdSDkybWJoUpg+cU0RwAFkQ2sN6F2Q4YLrGNA7pq/gZpvFpCbraTeAafta0x61NlwAg59h94KbwbQ94ZO+Z1BIz19nWmilXCztUJgOE8CEgV8+sJNCeuRariJIwHRoRRAugCRAf9knqFDCPp/PfwOXT9rJs0Q1kGCSGj5phQogIdAd8LKB3YTaBn/G19dVz8YkE+qwCStMAIkH/w53uSffLsB0aPnqYcCEFerVYYVNWCECSGzToXA9Arp/xiKDf6kKK3k1dY5PO2X41TNT7bPcBfD8TKr3lxzweWGG9fjuiw3+JSSwKNPG1nWZ5SqAxWb+89h0Besx8NtnLBzUtMuBxWb+0ErATQCLB3WHnEoCRZimq64WrVKPInBbDrgIoEhQG2A3sNYKYPFZKm11tXiV6n52wCyAQoM/1dq1wCz1iwQenxdfWKVofT+z+jtBc6dUC+qGaOpSoGBQp1dXRZmaNwVNAigMtf0prIlN72xVman3DraGcdGJyixWU8gLQ522g11ojXo1PqfssRSXqqkK6BYAANThVQAC0xlVQPGJylQFdAkAJKjDqwCAoJrCqin597ZAWe3at6IA3qeqC+z7j/21BVBQTSVrB9cVr0zVHma3WHsFgAJ1WFiLr/3PgR6yFwAm1a6sqgUACHVUWJGkOmR/BUyqFEBP3SR5T/QpQUCpdoVV0lfHNiB7KsdDVk9WPRUA1Ew14sIgUAGow6oRAChTdWWlEgAq1Oi/EQCcqV5jObKyAs6qatOaAhBOK1FhBQ5q6DIAVarayUorgEw3ohQOXZ9mFIAPx9OnhP2pMAUg6y+tABDX/ztJVWklw7/8DT+kh3nXLkQAxf6UWstYtbdCAcjxUgByVtKWqrBKPxRcAKq9FQpAmqqgxzcBnqs2nbaSdBf4vkqMANCtGvX8NgrA/0636ALQ/MGVuAKgAGJuFwa8WRV2KpACkN85mAKQ1JT/tYnasELeWFWVq9KuAq+qVKdXKQBpquIEAHtqVXvOWtpVrAACKoAGH7xcjaoAKADpyBa2QxeA5poVcQVAAcitKszpqxl4uRol1b8+Pj6yPkBVE4+utpECQJ6teB1AVxz/+CYKwJ+pal9FWwHACkBjVU2fgperIQIAr1ZVF1dRAMLRGigA5HKVAhDmT9FMxVQrANSwqqAqOmvfB4A8FRglVfC9FVVWVQIALq1UUDsEgLi0imYKOVlppdojALiwaqF2CAAxrKECAJ2s1Ex7BIAWVtWminbw7+3RrrGIliroMoAC6B2Af3ifGmrPdwC7HmCUVKEmqx6pqisANLP2QO0UAFJYR0mVTN+EsVcAKGCHBPWwDIDYXxkl1W2y+vvzgstvPVJe7D1dWe0SAEoVMDKoG1MEsXYF1TIYAfZXuplaBFA9rN1QjWGtXAUMWfuf+Ve/2tIyUXULoHoVYIFqFEBlsU6RavFTgiamVgFUDasJqkUAhcU6m2nJrFonKpMAim6yTA1q1esCrEG1SpVZvSZoFkAxsFPWqFddU+wejCF/St0jhULXW7hMVC4CqFK2ZpiljqEusnnlEtSewV5YrG5M3QRQQAJpZqlCEnALqpcACpxuda1SvQWw6kZLyqAe9gNWvJiFTD2ttX2Wd5XqKoBDYFc6l51y5l/8XHbqwb+oWF1n/p1BiAAW2Rj8vt3rv/27xGuRPYElBv9BAq1qbZcKt3+zvsKYhgkguQRCbDoiPcnPDixRTd1sDmZdZoUN/sYhVABJJRAKdIQEEnJdVqiJN1yHVKjhAki03hoCdJQADhL4MrF8Lcc0iVyHTVLDBDBRBCVDOnnmQmDa9gT2/YFRXh828MM3Ad8RG7ChVT6kN2cKIisCVKYNddQ9BfZN6Db4h29ID68ALkK7m9YjuHABvRPtJliP4JLpBtmZ6Y/t4ajDB/0xM9MFcDOL7f93k0J7HU/RHIG9IL52MyfY812Vk+Xnh+DecT0zbe3axt7UcGbhd/U9trMxx1yes3rJNFtW0wkgc6fzu5FANQIUQLUe5fGQgIIABaCAxaYkUI0ABVCtR3k8JKAgQAEoYLEpCVQjQAFU61EeDwkoCFAAClhsSgLVCFAA1XqUx0MCCgIUgAIWm5JANQIUQLUe5fGQgIIABaCAxaYkUI0ABVCtR3k8JKAgQAEoYLEpCVQjQAFU61EeDwkoCFAAClhsSgLVCFAA1XqUx0MCCgIUgAIWm5JANQIUQLUe5fGQgIIABaCAxaYkUI0ABVCtR3k8JKAgQAEoYLEpCVQjkFIA2x1Xd9b7nVfbXVfbXYD3F+8GrEzjgSuZKtndNb/J6rl52qymEMABouUprf806o/Hoz3kka/PJ1lsXMnUMQ0Hpu1Te54o3GSQ4pkAr/HiyEb1UQ4g//T7IGXgJNI7rq/gIgrWQaTvsjrtGQzDBRAM8wr08OetqUzo1HjAo9aO3xSF6f5swJ6ZXtuzUyatYQKYMPDPHVAytIMHPgrTkQN/KtMhAng+n/92rpe0Fn3Xfopl332pnp9vQm1cM7xKyDXBJDW8ygoVQDKgw+FGjczJs/7dYS0tgaRMG+uvkc9oDBNAshmqxN5AYqHufNtm1tco8UV9buLBvx9ymFxDBLAA0HCw3mFdQKjHQw6dtTzZJlqevjusEAm4C2Chwf9z1vo8Hdrgpn0U9oJMG9uQwL4bJdKfL1BNDalaXQWwaFAb6LSl68JMw9ev0sF+1W6hmf/89V3F6iaAxYOaUgKLlf134zHdcqBAVt0k4CKAAkBT7gksPEsdZZCquiqUVRexmgVQZJZKd4qwUFDTVFfFmLossTwEkOUiH8uS8PxeF7v2fqGCQZ2+KViUqbm6MgmgKNTpM9bzE2yvPJK/b5pYC2fVtB9gFUDVoLqUVz2DsXBQp4m1ONP2J/Dd47j7jdWhzjg1WHA/5cqBw6uAwhWVefPaIoDKs/8OdmhYAaQ6vAoAYdpdsXYJAAiqeZNFugwAYtodVinLYzuA2X8/3K6s9goAYfYfWgWACaArrFoBgDHt2gtQCwAN6qi9AKCZ6jWOLRtXUhEAZlW9ZKUABGmKDitgUIcsA9Ck2jNZ9QgAqfwfsgwAFUDoMgCUqbqyUgkA5DTVVU0QHVZEqarDKijWfjZBFYD2DkJaAbR77rf7zKO9wgQALNXQZQBg+d91NkArgIrX/YtkFrUPADxTUQCi5KkbqSYrCkDOV73DKvlocAGYrmO/4wteVYUKAHKtugWNApAYTddGFVbpR4MLQLW3oq0AKABpCoXtitz0Q3i0vzWLEgDqXpX6GguxANCtGnWTSwrA/zbi4Msq1d4KBSCfu6LWq8hVlapclXYVBSB/mAgFIE1V0G2ugU9XqctVaVeBV1WsAKRBUbaLqgBgT602/hGnV1kBsAJQjm1RcwpAhEnViJuAKlyyxhqpipcA7VeDl6sUgCx/mlZRAmiP987y5GQND5e2FIALxt8+hNcB+HONkioFIOwrbQWAvF6lAIShUjSjABSwhE1VVRUFIKSqKauEH/lqBn59RYgAwJeroQJALa1UUCkAGYEoqW4CQK1WVVLVVgCoAlBBlcX//61Az1uHSRW5stJKVSUAYLOGrP93BYCet46WKuJkpZYqBSCYrrVWFXzkL01A9wFCpQo6Waml2iMANLOqoWoFgBjWaKkiMtXeDqwxUgsAEGz4TAXIdJRUoSarHqn2CgDl762HBBVt06onqD1VFZhYu7LaJQAgsF1QDWFFEOtophBVQK9ULQKoDnZoUA9nBErfH6A3qL1SBZmsurPaLYDqYGcEdWNauQroDqpRAJUnKxNTqwCqgjVBtYS1slhnSbUyU+ut6kwCqDpjzQxq4Q3BqVItKgEzU7MACoIdctrvXZVQ7OpAc1Df8ZL8vNgFV+qr/q4YuQigkARSBPWwIVhhPyAb0xLLVq8q1VMAq4NNFdSDBFb+qzaXWUoyu2vaFKiu3KpUNwEsvh+QcvCvfmrQa5bSDG5p24Ul4JpVVwEsKgFXoNIAatst9ifD37fd6fZv2teCEnDPqrsAFtvFdgcamfZFApuy7L/rl1WYRgk1RACLrF/d1lGRg/782ckDu5RQF9lsDRVqqACSLgmWKE//JJWkElhy8B8k0Daxv318fLR/s7zCmYYL4CCB9p8N8MxXONCRB5dEBMsL9dhnaEyHCCBBqVVq4CdZFpQa+KhMhwpggghKh/Ri5hpRZcEwHbiEbUx/PB6PduHX0NcUAZzWXW3N9cVx7QUV0Ku0bGWspwxeTNsHPh6P1Kf2okZPENP2dVt1Oo3pVAHclF1NBu0l2Yw5gpsKMip41s89BFcqWTJ9A337m4J94tJmNZVIUwngjvsG/OePZxrTOiCzvJ9M/XvizHSFimkJAfh3FT+RBEjgJShiIAESwCVAAeD2PY+cBFgBMAMkgEyAFQBy7/PY4QlQAPARIABkAhQAcu/z2OEJUADwESAAZAIUAHLv89jhCVAA8BEgAGQC/wNnDVKmWrB+PgAAAABJRU5ErkJggg==", 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:
|
|
1782
|
-
DarkGrid:
|
|
1783
|
-
MatrixGrid:
|
|
1784
|
-
LightDot:
|
|
1785
|
-
DarkDot:
|
|
1786
|
-
WoodFloor:
|
|
1787
|
-
VerticalBar:
|
|
1903
|
+
const mi = "data:image/png;base64,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", yi = "data:image/png;base64,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", Ei = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAEAdJREFUeF7tne152lgYBUU3poqYclRF7CpUTkgVuBvWFwsWzMcdATEHafxj8zzZI1vMeTW6ksCZNQO+uq577eO/v222/fsB3+1Ho8v+p/3t/1y2bbv9ux/dEX9YJoEzs50+1wXmwWy3bfs2hPCMhLuuK9/0+0FPNk3PvA8Flv6C3D9OoD/oy1w/w4HOX9hXEs32RQF0XfdnpHC+w0SwhjZgPpPAyA/8QbN9UgATA7QPTBFkHrN326t+tsuJbWpfi1OXvUcCGPFynxauBCipJ8s528eXBQcCmLAdv4/ySVs+2by7u3sEPPh3MA5m+7sA1k7NaVByeW4CXdc5218Vlidgi22bOwFoyKMBPwD13OM/7b13ts/P9r4ANOTxceKlwJO7w8va0wW2bbs59jf/0ZBnp9xVwPMLYKzvYbm1mc3N7q0APPufwbk15a203f4xBLz2P8+9zLYCqM+llwF1RpEJl//VWhYzl/9VSL4voIooM+BsV3tRAFVE3x6bgLyREAITeiv7tcSXZQUwlff7Xwup8T7A1egeuqHX/1X8CqCKqGkUAIEUmFEA1VI2AvAJQIWTK4DqIEUGnO1qLQqgisgVAEEUmVEA9VpcAdQZlYSPAhmnmJSPAFkVCoBxUgCMU0xKAbAqFADjpAAYp5iUAmBVKADGSQEwTjEpBcCqUACMkwJgnGJSCoBVoQAYJwXAOMWkFACrQgEwTgqAcYpJKQBWhQJgnBQA4xSTUgCsCgXAOCkAxikmpQBYFQqAcVIAjFNMSgGwKhQA46QAGKeYlAJgVSgAxkkBME4xKQXAqlAAjJMCYJxiUgqAVaEAGCcFwDjFpBQAq0IBME4KgHGKSSkAVoUCYJwUAOMUk1IArAoFwDgpAMYpJqUAWBUKgHFSAIxTTEoBsCoUAOOkABinmJQCYFUoAMZJATBOMSkFwKpQAIyTAmCcYlIKgFWhABgnBcA4xaQUAKtCATBOCoBxikkpAFaFAmCcFADjFJNSAKwKBcA4KQDGKSalAFgVCoBxUgCMU0xKAbAqFADjpAAYp5iUAmBVKADGSQEwTjEpBcCqUACMkwJgnGJSCoBVoQAYJwXAOMWkFACrQgEwTgqAcYpJKQBWhQJgnBQA4xSTUgCsCgXAOCkAxikmpQBYFQqAcVIAjFNMSgGwKhQA46QAGKeYlAJgVSgAxkkBME4xKQXAqlAAjJMCYJxiUgqAVaEAAKe2bWcgZiSMQNd167BditsdBQAqUQAAUmBEAdRLKQL40zTNaz063YQCeM7uFUC1t6UCqDJqGgUAIAVGFEC1FAVQRdQ0y7ZtFyBnJIyAq9tqIe9lBVCW/+UywK/TBN7btn0TzvMRUADVzhRAFVHTKAAAKTHiya3aymLzeMtrpfOgvP6vDlF0wNm+PNtbAfgkwOV/9IF87c55GXCW3GZluxWA9wEUwLXHWPR2Xgacrme7st29w01THoHy7n/0oc13ztk+YrW7r7UvAFcBh5x8/z8/xqKTrgIO69m/r3XwHndB7UB55z/6kB6+c13XlUe5v4dvObotDmb76EMugvKx3+hGvn9BzvbxbJ/8lNuEQXnmH+vRrwROXtJe/JjrhESwbL7e8FP+9GvkBPpL3XI5MIUPwV2c7ern3HtYBdQYr5888Ed+sF96ef0JrkQmO9tVAewD3JPBrye15/YM79l+wgf+qZe+J4Nnnu2/n8dleXyNV7KDBFCxadxyagiIex4Pq9Vqy+J1NpuVgfLrSgLr9boMdflazudzPNhX/riTm/Unvnt+y5u/171m+24CuPkVPfk3KAf9bDabynXlw9par9fv5YfP53M/oXmHFhTAjRA98G8EeMPmRQaK4AaAn3e+FcAN/D4+PvwQ1Q387rGpEriNogK4gp9n/Sug/dtNlr0IHnKP4N++tH/73RXAFXw9818B7d9vsnx5efFXtw3krAAGAlutVm/9zb6BWxr/AQJKYCBkBTAAmAf/AFgPin4+Nlw86nHhg17yTT9WAQzA9/Hx4b80M4DXg6KuAgaAVwAQlmd/CCog5iqAl6AAICsFAEFlxFwFwB4UAATl8h+CCom9vLw426ALIQFI/XN///EUwCol4mUAa0IBAE4u/wGksIgCYIUoAMBJAQBIYRHfIswKUQCAk+/8A5DyIt4IBJ0oAABJAQBIeREFADpRAACSAgCQ8iIKAHSiAAAkBQAg5UUUAOhEAQBICgBAyosoANCJAgCQFACAlBdRAKATBQAgKQAAKS+iAEAnCgBAUgAAUl5EAYBOFACApAAApLyIAgCdKAAASQEASHkRBQA6UQAAkgIAkPIiCgB0ogAAJAUAIOVFFADoRAEASAoAQMqLKADQiQIAkBQAgJQXUQCgEwUAICkAACkvogBAJwoAQFIAAFJeRAGAThQAgKQAAKS8iAIAnSgAAEkBAEh5EQUAOlEAAJICAJDyIgoAdKIAACQFACDlRRQA6EQBAEgKAEDKiygA0IkCAJAUAICUF1EAoBMFACApAAApL6IAQCcKAEBSAABSXkQBgE4UAICkAACkvIgCAJ0oAABJAQBIeREFADpRAACSAgCQ8iIKAHSiAAAkBQAg5UUUAOhEAQBICgBAyosoANCJAgCQFACAlBdRAKATBQAgKQAAKS+iAEAnCgBAUgAAUl5EAYBOFACApAAApLyIAgCdKAAASQEASHkRBQA6UQAAkgIAkPIiCgB0ogAAJAUAIOVFFADoRAEASAoAQMqLKADQiQIAkBQAgJQXUQCgEwUAICkAACkvogBAJwoAQFIAAFJeRAGAThQAgKQAAKS8iAIAnSgAAEkBAEh5EQUAOlEAAJICAJDyIgoAdKIAACQFACDlRRQA6EQBAEgKAEDKiygA0IkCAJAUAICUF1EAoBMFACApAAApL6IAQCcKAEBSAABSXkQBgE4UAICkAACkvIgCAJ0oAABJAQBIeREFADpRAACSAgCQ8iIKAHSiAAAkBQAg5UUUAOhEAQBICgBAyosoANCJAgCQFACAlBdRAKATBQAgKQAAKS+iAEAnCgBAUgAAUl5EAYBOFACApAAApLyIAgCdKAAASQEASHkRBQA6UQAAkgIAkPIiCgB0ogAAJAUAIOVFFADoRAEASAoAQMqLKADQiQIAkBQAgJQXUQCgEwUAICkAACkvogBAJwoAQFIAAFJeRAGAThQAgKQAAKS8iAIAnSgAAEkBAEh5EQUAOlEAAJICAJDyIgoAdKIAACQFACDlRRQA6EQBAEgKAEDKiygA0IkCAJAUAICUF1EAoBMFACApAAApL6IAQCcKAEBSAABSXkQBgE4UAICkAACkvIgCAJ0oAABJAQBIeREFADpRAACSAgCQ8iIKAHSiAAAkBQAg5UUUAOhEAQBICgBAyosoANCJAgCQFACAlBdRAKATBQAgKQAAKS+iAEAnCgBAUgAAUl5EAYBOFACAtFqt3maz2W8QNRJCYL1ev8/n87eQ3YndDQUAqlmtVq+z2ewPiBoJIaAAWBEKAHBSAABSWGS9Xi/m8/kybLfidkcBwEo+Pj7WMGosgMDLy4uzDXoQEoBUIt4IhKACYi7/eQkKALLyMgCCCogpAF6CAuCsXAUMYPXIqMt/Tl8BcFaNq4ABsB4U9ew/DLwCGMbLVcBAXj8Z9+AfTlsBDGemBK5g9gOb+M6/KyArgCug9ZcC5Z2Br1ds7ib3J7Dsz/4+9x/IVgEMBLYf9y3CN8C736ae+W9gqQBugFc2VQI3Arx+c8/617PbbakA7gBxK4Lypx8auhPQ89/GA/+OiO8mgK7r4q6H27Z9yDVhuUewvT/w+SGiX3fsa3Lf6vM9/X8/WW56fNR7+8c824ME0IMow12GOu6AB0dHGaQyUE3btn5UFACbSqSf7e1Hvp95tpdDTnxVAeyBeUYotfl9VwY1ROP9/xOY7aoMzgpg5HC+T3VZGbwPMed4D4vxv7KJzXaZ67Or3ZMC6AFN8RdgXIQ1/kNj/K+w67pyMEzxtzudnO0jAUwY0Hb6lcBIPeBsb1a5B6uBAwEIaDf5SmBkEnC2d4Uu9i91vwvA33rz/+AfgBrZ8TCplzPhS9pzPe9meycADXnEqtxBXUzqSBnpi+26rtzPGuNTrGsb2832vgA8+x/jdBVw7YiFbOeJ7WwRm9neCEBIZyG5Cgg5kK/dDWf78mxvBeDZ/wyntm2rb5a6djjd7t8T6LrO2b4w2zNvkFSH0MuAKqLMgGf/ai+LIoCpvjGiSqcPeBlASYXlnO1qIQqgiqhpFACAlBjx7n+1lWVZAfiIpMLJ+wDVQYoMeP1frUUBVBF9fXTYG4EEVFhGAVQL2QjAu6SuAKqT8owBZ7vemgKoM3IFABglRhRAvRUFUGdUEj4KZJxiUj7eZlUoAMZJATBOMSkFwKpQAIyTAmCcYlIKgFWhABgnBcA4xaQUAKtCATBOCoBxikkpAFaFAmCcFADjFJNSAKwKBcA4KQDGKSalAFgVCoBxUgCMU0xKAbAqFADjpAAYp5iUAmBVKADGSQEwTjEpBcCqUACMkwJgnGJSCoBVoQAYJwXAOMWkFACrQgEwTgqAcYpJKQBWhQJgnBQA4xSTUgCsCgXAOCkAxikmpQBYFQqAcVIAjFNMSgGwKhQA46QAGKeYlAJgVSgAxkkBME4xKQXAqlAAjJMCYJxiUgqAVaEAGCcFwDjFpBQAq0IBME4KgHGKSSkAVoUCYJwUAOMUk1IArAoFwDgpAMYpJqUAWBUKgHFSAIxTTEoBsCoUAOOkABinmJQCYFUoAMZJATBOMSkFwKpQAIyTAmCcYlIKgFWhABgnBcA4xaQUAKtCATBOCoBxikkpAFaFAmCcFADjFJNSAKwKBcA4KQDGKSalAFgVCoBxUgCMU0xKAbAqFADjpAAYp5iUAmBVKADGSQEwTjEpBcCqUACMkwJgnGJSCoBVoQAYJwXAOMWkFACrQgEwTgqAcYpJKQBWhQIAnNq2nYGYkTACXdetw3YpbneKAP40TfMat2dBO6QAgsoYsCsKoA5LAdQZNQoAQAqMKIBqKUsFUGXUKADAKDGiAKqtKIAqoqZZtm27ADkjYQS8vK0W8l5WAOX6v9wH8Os0gfe2bd+E83wEuq4rvf1+vj3/sT1WAAC1jwABpMSIJ7fLrZR7W5vHW14rnQflDcDEQ5vvk7N9eba3AnCp5PKfH1VPlPQ+wNmyNpe2uze4aMqToFz+P9HBfmpXvQw4XeB2ZbsvAN8QdMjKm39PfvBvd99VwFGRu9k+eIuroP4H5bX/SI7+r3tcPunaq3N/tr8LQFBfoDz7j+f437wSJbAr9OCy9uhDLj479eAf2bG/eznO9vFsn/yU24Rt6U2/sR79/euaqASW/aq2/HnwdfFjrhOCdRbQyI+Hyb68Kc32pbeyo8+5jxiWB/5kFfD1wkc82+g+FhLA/oz0wMpf/er//hl+l8D+0ue97HfbtkfLoYkfC5N++f1l73aWn2W2v8/w4Nn+D8SgTEe5ANsmAAAAAElFTkSuQmCC", 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
|
|
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:
|
|
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
|
|
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 =
|
|
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:
|
|
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:
|
|
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
|
|
1941
|
-
function
|
|
1942
|
-
|
|
2063
|
+
let vi = !0;
|
|
2064
|
+
function Js(r) {
|
|
2065
|
+
vi = r;
|
|
1943
2066
|
}
|
|
1944
2067
|
function ue() {
|
|
1945
|
-
return
|
|
2068
|
+
return vi;
|
|
1946
2069
|
}
|
|
1947
|
-
class
|
|
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(),
|
|
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
|
-
|
|
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
|
-
}),
|
|
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
|
-
|
|
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
|
-
}),
|
|
2172
|
+
}), C?.set({
|
|
2050
2173
|
fill: p
|
|
2051
2174
|
});
|
|
2052
2175
|
} else
|
|
2053
|
-
|
|
2176
|
+
C?.set({
|
|
2054
2177
|
animation: void 0
|
|
2055
|
-
}),
|
|
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
|
|
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 =
|
|
2274
|
-
function
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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(
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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 =
|
|
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:
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
2974
|
-
const p = n +
|
|
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
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
3214
|
-
class
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3248
|
-
return i.forEach((d,
|
|
3249
|
-
const p = n +
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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 -
|
|
3330
|
-
width: (s -
|
|
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
|
-
|
|
3360
|
+
z({
|
|
3338
3361
|
title: i || "",
|
|
3339
3362
|
x: s / 2,
|
|
3340
|
-
y: o -
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
3802
|
-
return
|
|
3828
|
+
const w = v.stationSlotGroup;
|
|
3829
|
+
return w ? {
|
|
3803
3830
|
layerIndex: v.index,
|
|
3804
|
-
instance: new
|
|
3831
|
+
instance: new Z(
|
|
3805
3832
|
{
|
|
3806
|
-
...
|
|
3833
|
+
...w,
|
|
3807
3834
|
// 兼容旧数据:无 x/y 时按组内槽位类型给默认定位(tool 组居刀具杆端,其余居托盘中部),仅影响摆放
|
|
3808
|
-
x:
|
|
3809
|
-
y:
|
|
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
|
|
3844
|
+
const E = new si({
|
|
3818
3845
|
hitSelf: !1,
|
|
3819
3846
|
className: "smallArm",
|
|
3820
|
-
x:
|
|
3821
|
-
y:
|
|
3847
|
+
x: 27,
|
|
3848
|
+
y: 22,
|
|
3822
3849
|
zIndex: 1,
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
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 ?
|
|
3877
|
-
scaleY: g === x.AUXILIARY ?
|
|
3878
|
-
y: g === x.AUXILIARY ?
|
|
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 :
|
|
3882
|
-
strokeWidth: g === x.AUXILIARY ?
|
|
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.
|
|
3890
|
-
{ offset: 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:
|
|
4002
|
-
y:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ?
|
|
4146
|
-
scaleY: t ?
|
|
4147
|
-
y: t ?
|
|
4148
|
-
cornerRadius: t ? 0 :
|
|
4149
|
-
strokeWidth: t ?
|
|
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
|
|
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:
|
|
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
|
|
4254
|
-
return
|
|
4291
|
+
const w = v.stationSlotGroup;
|
|
4292
|
+
return w ? {
|
|
4255
4293
|
layerIndex: v.index,
|
|
4256
|
-
instance: new
|
|
4294
|
+
instance: new Z(
|
|
4257
4295
|
{
|
|
4258
|
-
...
|
|
4296
|
+
...w,
|
|
4259
4297
|
// 兼容旧数据:无 x/y 时按组内槽位类型给默认定位(tool 组居刀具杆端,其余居托盘中部),仅影响摆放
|
|
4260
|
-
x:
|
|
4261
|
-
y:
|
|
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
|
|
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 ?
|
|
4341
|
-
scaleY: g === x.AUXILIARY ?
|
|
4342
|
-
y: g === x.AUXILIARY ?
|
|
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 :
|
|
4346
|
-
strokeWidth: g === x.AUXILIARY ?
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ?
|
|
4619
|
-
scaleY: t ?
|
|
4620
|
-
y: t ?
|
|
4621
|
-
cornerRadius: t ? 0 :
|
|
4622
|
-
strokeWidth: t ?
|
|
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 =
|
|
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:
|
|
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
|
|
4716
|
-
return
|
|
4753
|
+
const w = v.stationSlotGroup;
|
|
4754
|
+
return w ? new Z(
|
|
4717
4755
|
{
|
|
4718
|
-
...
|
|
4756
|
+
...w,
|
|
4719
4757
|
// 兼容旧数据:无 x/y 时默认居储位面板中部,仅影响摆放
|
|
4720
|
-
x:
|
|
4721
|
-
y:
|
|
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(
|
|
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:
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
5189
|
-
|
|
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((
|
|
5194
|
-
const F = new
|
|
5231
|
+
this.stationSlotGroups = Q.map((w) => {
|
|
5232
|
+
const F = new Z(
|
|
5195
5233
|
{
|
|
5196
|
-
...
|
|
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:
|
|
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
|
-
|
|
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) :
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
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:
|
|
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(
|
|
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
|
-
|
|
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
|
|
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]:
|
|
5655
|
-
[D.MARKING_MACHINE]:
|
|
5656
|
-
[D.CLEANING_MACHINE]:
|
|
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]:
|
|
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
|
|
5666
|
-
const e =
|
|
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 =
|
|
5672
|
-
LightGrid:
|
|
5673
|
-
DarkGrid:
|
|
5674
|
-
MatrixGrid:
|
|
5675
|
-
LightDot:
|
|
5676
|
-
DarkDot:
|
|
5677
|
-
WoodFloor:
|
|
5678
|
-
},
|
|
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
|
-
},
|
|
5721
|
+
}, $t = {
|
|
5684
5722
|
critical: "#E83B30",
|
|
5685
5723
|
warning: "#E6A23C",
|
|
5686
5724
|
info: "#409EFF"
|
|
5687
5725
|
};
|
|
5688
|
-
class
|
|
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
|
|
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(
|
|
5782
|
+
}), this.app.on(Pi.READY, () => {
|
|
5745
5783
|
U.log("Leafer 引擎 READY");
|
|
5746
5784
|
});
|
|
5747
5785
|
const l = new I({
|
|
5748
|
-
...
|
|
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 ?
|
|
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(
|
|
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 =
|
|
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:
|
|
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:
|
|
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,
|
|
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 =
|
|
6206
|
-
class
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
},
|
|
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(
|
|
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
|
|
6321
|
-
const e = new
|
|
6358
|
+
function co(r) {
|
|
6359
|
+
const e = new Vi(r, {
|
|
6322
6360
|
enabled: !0,
|
|
6323
|
-
ruleSize:
|
|
6361
|
+
ruleSize: no,
|
|
6324
6362
|
unit: "px"
|
|
6325
6363
|
});
|
|
6326
|
-
e.addTheme(
|
|
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(
|
|
6369
|
+
}), e.changeTheme(ei);
|
|
6332
6370
|
}
|
|
6333
|
-
function
|
|
6334
|
-
new
|
|
6335
|
-
dotColor:
|
|
6336
|
-
dotSize:
|
|
6337
|
-
targetDotMatrixPixel:
|
|
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
|
|
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:
|
|
6348
|
-
}),
|
|
6349
|
-
const r =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
6473
|
+
}, Fi = () => {
|
|
6436
6474
|
t.value = !1;
|
|
6437
6475
|
};
|
|
6438
|
-
return
|
|
6439
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
6508
|
+
toggleTheme: w,
|
|
6471
6509
|
showDebugPanel: We,
|
|
6472
|
-
hideDebugPanel:
|
|
6510
|
+
hideDebugPanel: Fi
|
|
6473
6511
|
};
|
|
6474
|
-
}), K =
|
|
6475
|
-
const r =
|
|
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((
|
|
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
|
|
6483
|
-
},
|
|
6484
|
-
t && t.toggleShadows(
|
|
6485
|
-
}, p = (
|
|
6486
|
-
t && t.toggleAnimations(
|
|
6487
|
-
}, f = (
|
|
6488
|
-
t && t.setFps(
|
|
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
|
-
(
|
|
6530
|
+
(w) => C(w)
|
|
6493
6531
|
), ie(
|
|
6494
6532
|
() => e.animationsEnabled,
|
|
6495
|
-
(
|
|
6533
|
+
(w) => p(w)
|
|
6496
6534
|
), ie(
|
|
6497
6535
|
() => e.fpsMode,
|
|
6498
|
-
(
|
|
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
|
|
6550
|
+
const w = h.value?.id;
|
|
6513
6551
|
for (const F of c.value)
|
|
6514
|
-
t.addModel(F), i && F.id ===
|
|
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
|
|
6569
|
+
i = new Ct({
|
|
6532
6570
|
container: t,
|
|
6533
|
-
onSelected: (
|
|
6534
|
-
const F =
|
|
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: (
|
|
6577
|
+
onRotate: (w) => {
|
|
6540
6578
|
const F = h.value;
|
|
6541
|
-
F && (F.rotation =
|
|
6579
|
+
F && (F.rotation = w);
|
|
6542
6580
|
},
|
|
6543
|
-
onScale: (
|
|
6581
|
+
onScale: (w) => {
|
|
6544
6582
|
const F = h.value;
|
|
6545
|
-
F && F.width && F.height && (F.scale = Number((
|
|
6583
|
+
F && F.width && F.height && (F.scale = Number((w / F.width).toFixed(2)));
|
|
6546
6584
|
},
|
|
6547
|
-
onMove: (
|
|
6548
|
-
n = { x:
|
|
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
|
|
6562
|
-
|
|
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 = (
|
|
6603
|
+
}, E = (w) => {
|
|
6566
6604
|
if (!t) return;
|
|
6567
|
-
const F = t.findOne(`#${
|
|
6605
|
+
const F = t.findOne(`#${w.id}`);
|
|
6568
6606
|
if (F)
|
|
6569
6607
|
if (F.className === "ShuttleStation") {
|
|
6570
|
-
const { width: O, height: R, ...We } =
|
|
6608
|
+
const { width: O, height: R, ...We } = w;
|
|
6571
6609
|
F.set(We);
|
|
6572
6610
|
} else
|
|
6573
|
-
F.set(
|
|
6574
|
-
}, B = Se((
|
|
6611
|
+
F.set(w);
|
|
6612
|
+
}, B = Se((w) => {
|
|
6575
6613
|
if (s) {
|
|
6576
|
-
o =
|
|
6614
|
+
o = w;
|
|
6577
6615
|
return;
|
|
6578
6616
|
}
|
|
6579
|
-
i && (K.log("rerenderLayer..."), i.rerenderModel(
|
|
6580
|
-
}, 500), T = (
|
|
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 =
|
|
6586
|
-
...oe(
|
|
6623
|
+
const F = w.id || ot(), O = c.value.length + 1, R = {
|
|
6624
|
+
...oe(ys),
|
|
6587
6625
|
// 使用cloneDeep防止展开运算符的浅拷贝无法处理嵌套对象,导致污染初始值
|
|
6588
|
-
...oe(
|
|
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 = (
|
|
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 && (
|
|
6607
|
-
}, v = (
|
|
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 ===
|
|
6610
|
-
i.selectEquipment(F ? void 0 : `#${
|
|
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
|
-
(
|
|
6622
|
-
|
|
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 =
|
|
6646
|
-
class
|
|
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
|
|
6719
|
+
class fo {
|
|
6682
6720
|
appController;
|
|
6683
6721
|
getScene;
|
|
6684
6722
|
onAck;
|
|
6685
6723
|
onRaw;
|
|
6686
|
-
pool = new
|
|
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 >
|
|
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 =
|
|
7103
|
-
const r =
|
|
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
|
|
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
|
-
},
|
|
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:
|
|
7224
|
+
setSocketHandlers: C,
|
|
7187
7225
|
resetModels: f
|
|
7188
7226
|
};
|
|
7189
7227
|
});
|
|
7190
7228
|
export {
|
|
7191
|
-
|
|
7192
|
-
|
|
7193
|
-
|
|
7194
|
-
|
|
7195
|
-
|
|
7196
|
-
|
|
7197
|
-
|
|
7198
|
-
|
|
7199
|
-
|
|
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
|
-
|
|
7202
|
-
|
|
7203
|
-
|
|
7204
|
-
|
|
7205
|
-
|
|
7206
|
-
|
|
7207
|
-
|
|
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
|
-
|
|
7210
|
-
|
|
7211
|
-
|
|
7212
|
-
|
|
7213
|
-
|
|
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
|
-
|
|
7216
|
-
|
|
7217
|
-
|
|
7218
|
-
|
|
7219
|
-
|
|
7220
|
-
|
|
7221
|
-
|
|
7222
|
-
|
|
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
|
};
|