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