@fmsim/machine 1.0.17 → 1.0.18
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/dist/carrier.js +154 -0
- package/dist/carrier.js.map +1 -0
- package/dist/features/animation-default.js +20 -0
- package/dist/features/animation-default.js.map +1 -0
- package/dist/mcs-carrier-holder.js +99 -17
- package/dist/mcs-carrier-holder.js.map +1 -1
- package/dist/port-flow.js +22 -17
- package/dist/port-flow.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/carrier.ts +202 -0
- package/src/features/animation-default.ts +27 -0
- package/src/mcs-carrier-holder.ts +118 -20
- package/src/port-flow.ts +23 -17
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +2 -1
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
package/dist/carrier.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import JSON5 from 'json5';
|
|
2
|
+
import { Component } from '@hatiolab/things-scene';
|
|
3
|
+
import { ANIMATION_DEFAULT } from './features/animation-default.js';
|
|
4
|
+
import { LEGEND_CARRIER } from './features/mcs-status-default.js';
|
|
5
|
+
import { MCSStatusMixin } from './features/mcs-status-mixin.js';
|
|
6
|
+
export class Carrier extends MCSStatusMixin(Component) {
|
|
7
|
+
set data(data) {
|
|
8
|
+
const { CARRIERNAME, CARRIERTYPE = '', EMPTYTYPE, CARRIERSTATUS } = data || {};
|
|
9
|
+
this.setState('id', CARRIERNAME);
|
|
10
|
+
this.emptyType = EMPTYTYPE;
|
|
11
|
+
this.carrierStatus = CARRIERSTATUS;
|
|
12
|
+
// TODO carrierstatus에 따라서 매핑되는 애니메이션 테마 수행
|
|
13
|
+
if (this.lastCarrierStatus !== this.carrierStatus) {
|
|
14
|
+
const lastAnimationConfig = this.getAnimationConfig(this.lastCarrierStatus);
|
|
15
|
+
if (lastAnimationConfig) {
|
|
16
|
+
let { animation, decorator, border, arrow } = lastAnimationConfig;
|
|
17
|
+
if (animation) {
|
|
18
|
+
;
|
|
19
|
+
this.started = false;
|
|
20
|
+
this._animation = null;
|
|
21
|
+
this.setState('animation', {
|
|
22
|
+
oncreate: null
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (decorator) {
|
|
26
|
+
this.trigger('iconoff');
|
|
27
|
+
}
|
|
28
|
+
if (border) {
|
|
29
|
+
this.trigger('borderoff');
|
|
30
|
+
}
|
|
31
|
+
if (arrow) {
|
|
32
|
+
this.trigger('bouncingoff');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const animationConfig = this.getAnimationConfig(this.carrierStatus);
|
|
36
|
+
if (animationConfig) {
|
|
37
|
+
let { animation, decorator, border, arrow } = animationConfig;
|
|
38
|
+
if (animation) {
|
|
39
|
+
;
|
|
40
|
+
this.started = false;
|
|
41
|
+
this._animation = null;
|
|
42
|
+
this.setState('animation', {
|
|
43
|
+
oncreate: animation
|
|
44
|
+
});
|
|
45
|
+
this.started = true;
|
|
46
|
+
}
|
|
47
|
+
if (decorator) {
|
|
48
|
+
this.trigger('iconoff');
|
|
49
|
+
this.trigger('icon', decorator);
|
|
50
|
+
}
|
|
51
|
+
if (border) {
|
|
52
|
+
this.trigger('borderoff');
|
|
53
|
+
this.trigger('border', border);
|
|
54
|
+
}
|
|
55
|
+
if (arrow) {
|
|
56
|
+
this.trigger('bouncingoff');
|
|
57
|
+
this.trigger('bouncing', arrow);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
this.lastCarrierStatus = this.carrierStatus;
|
|
62
|
+
}
|
|
63
|
+
get status() {
|
|
64
|
+
return this.emptyType;
|
|
65
|
+
}
|
|
66
|
+
get legend() {
|
|
67
|
+
var _a;
|
|
68
|
+
const { carrierLegendName } = this.parent.state;
|
|
69
|
+
if (carrierLegendName) {
|
|
70
|
+
return (_a = this.root) === null || _a === void 0 ? void 0 : _a.style[carrierLegendName];
|
|
71
|
+
}
|
|
72
|
+
return LEGEND_CARRIER;
|
|
73
|
+
}
|
|
74
|
+
getAnimationConfig(carrierStatus) {
|
|
75
|
+
const config = this.animationPreset[carrierStatus || 'default'];
|
|
76
|
+
if (config && typeof config == 'string') {
|
|
77
|
+
try {
|
|
78
|
+
return JSON5.parse(config);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error(e);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return config || null;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
get animationPreset() {
|
|
90
|
+
var _a;
|
|
91
|
+
const { carrierAnimationName } = this.parent.state;
|
|
92
|
+
if (carrierAnimationName) {
|
|
93
|
+
return ((_a = this.parent.root) === null || _a === void 0 ? void 0 : _a.style[carrierAnimationName]) || ANIMATION_DEFAULT;
|
|
94
|
+
}
|
|
95
|
+
return ANIMATION_DEFAULT;
|
|
96
|
+
}
|
|
97
|
+
calculateShrunkRectangle(originalRect) {
|
|
98
|
+
const shrunkRect = Object.assign({}, originalRect);
|
|
99
|
+
shrunkRect.left += originalRect.width * 0.1;
|
|
100
|
+
shrunkRect.width *= 0.8;
|
|
101
|
+
shrunkRect.top += originalRect.height * 0.1;
|
|
102
|
+
shrunkRect.height *= 0.8;
|
|
103
|
+
return shrunkRect;
|
|
104
|
+
}
|
|
105
|
+
contains(x, y) {
|
|
106
|
+
const rect = this.calculateShrunkRectangle(this.parent.bounds);
|
|
107
|
+
x -= rect.left;
|
|
108
|
+
y -= rect.top;
|
|
109
|
+
if (x < 0 || y < 0 || x > rect.width || y > rect.height) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
// 윗변 중앙 좌표
|
|
113
|
+
const topCenterX = rect.width / 2;
|
|
114
|
+
const topCenterY = 0;
|
|
115
|
+
// 오른쪽 변 중앙 좌표
|
|
116
|
+
const rightCenterX = rect.width;
|
|
117
|
+
const rightCenterY = rect.height / 2;
|
|
118
|
+
// 기울기 m = (y2 - y1) / (x2 - x1)
|
|
119
|
+
const m = (rightCenterY - topCenterY) / (rightCenterX - topCenterX);
|
|
120
|
+
// y 절편 b = y - mx
|
|
121
|
+
const b = topCenterY - m * topCenterX;
|
|
122
|
+
// 점(px, py)이 선 아래(좌하부)에 있는지 확인
|
|
123
|
+
return y > m * x + b;
|
|
124
|
+
}
|
|
125
|
+
render(ctx) {
|
|
126
|
+
if (!this.emptyType) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const { left, top, width, height } = this.calculateShrunkRectangle(this.parent.bounds);
|
|
130
|
+
const radius = Math.round(Math.min(width, height) * 0.1);
|
|
131
|
+
// 시작점 설정
|
|
132
|
+
ctx.beginPath();
|
|
133
|
+
ctx.moveTo(left + radius, top);
|
|
134
|
+
// 상단 가로선 그리기
|
|
135
|
+
ctx.lineTo(left + width / 2, top);
|
|
136
|
+
// 우측 세로선 그리기
|
|
137
|
+
ctx.lineTo(left + width, top + height / 2);
|
|
138
|
+
ctx.lineTo(left + width, top + height);
|
|
139
|
+
// 하단 가로선 그리기
|
|
140
|
+
ctx.lineTo(left, top + height);
|
|
141
|
+
// 좌측 세로선 그리기
|
|
142
|
+
ctx.lineTo(left, top);
|
|
143
|
+
// 경로 닫기 및 그리기
|
|
144
|
+
ctx.closePath();
|
|
145
|
+
ctx.lineWidth = radius > 5 ? 1 : 0.5;
|
|
146
|
+
ctx.fillStyle = this.statusColor || 'transparent';
|
|
147
|
+
ctx.strokeStyle = this.auxColor || 'transparent';
|
|
148
|
+
ctx.fill();
|
|
149
|
+
ctx.stroke();
|
|
150
|
+
ctx.beginPath();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
Component.register('Carrier', Carrier);
|
|
154
|
+
//# sourceMappingURL=carrier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carrier.js","sourceRoot":"","sources":["../src/carrier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAU,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAoC,MAAM,iCAAiC,CAAA;AACrG,OAAO,EAAE,cAAc,EAAU,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAE/D,MAAM,OAAO,OAAQ,SAAQ,cAAc,CAAC,SAAS,CAAC;IAOpD,IAAI,IAAI,CAAC,IAAS;QAChB,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI,IAAI,EAAE,CAAA;QAE9E,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAEhC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAElC,2CAA2C;QAC3C,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAClD,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAE3E,IAAI,mBAAmB,EAAE,CAAC;gBACxB,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAA;gBACjE,IAAI,SAAS,EAAE,CAAC;oBACd,CAAC;oBAAC,IAAY,CAAC,OAAO,GAAG,KAAK,CAC7B;oBAAC,IAAY,CAAC,UAAU,GAAG,IAAI,CAAA;oBAChC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;wBACzB,QAAQ,EAAE,IAAI;qBACf,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBACzB,CAAC;gBAED,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;gBAC3B,CAAC;gBAED,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAEnE,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,CAAA;gBAC7D,IAAI,SAAS,EAAE,CAAC;oBACd,CAAC;oBAAC,IAAY,CAAC,OAAO,GAAG,KAAK,CAC7B;oBAAC,IAAY,CAAC,UAAU,GAAG,IAAI,CAAA;oBAChC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;wBACzB,QAAQ,EAAE,SAAS;qBACpB,CAAC,CACD;oBAAC,IAAY,CAAC,OAAO,GAAG,IAAI,CAAA;gBAC/B,CAAC;gBAED,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;oBACvB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;gBACjC,CAAC;gBAED,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;oBACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAChC,CAAC;gBAED,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;oBAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAA;IAC7C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,IAAI,MAAM;;QACR,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;QAE/C,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,MAAC,IAAI,CAAC,IAAY,0CAAE,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACrD,CAAC;QAED,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,kBAAkB,CAAC,aAAa;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,IAAI,SAAS,CAAC,CAAA;QAE/D,IAAI,MAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAC5B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAQ,MAA0B,IAAI,IAAI,CAAA;QAC5C,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,eAAe;;QACjB,MAAM,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;QAElD,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,CAAA,MAAC,IAAI,CAAC,MAAM,CAAC,IAAY,0CAAE,KAAK,CAAC,oBAAoB,CAAC,KAAI,iBAAiB,CAAA;QACpF,CAAC;QAED,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IAED,wBAAwB,CAAC,YAAoB;QAC3C,MAAM,UAAU,qBAAgB,YAAY,CAAE,CAAA;QAE9C,UAAU,CAAC,IAAI,IAAI,YAAY,CAAC,KAAK,GAAG,GAAG,CAAA;QAC3C,UAAU,CAAC,KAAK,IAAI,GAAG,CAAA;QAEvB,UAAU,CAAC,GAAG,IAAI,YAAY,CAAC,MAAM,GAAG,GAAG,CAAA;QAC3C,UAAU,CAAC,MAAM,IAAI,GAAG,CAAA;QAExB,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,QAAQ,CAAC,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC9D,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA;QACd,CAAC,IAAI,IAAI,CAAC,GAAG,CAAA;QAEb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACxD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,WAAW;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACjC,MAAM,UAAU,GAAG,CAAC,CAAA;QAEpB,cAAc;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAA;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QAEpC,gCAAgC;QAChC,MAAM,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,CAAA;QAEnE,kBAAkB;QAClB,MAAM,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,UAAU,CAAA;QAErC,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,CAAC,GAA6B;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAEtF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAA;QAExD,SAAS;QACT,GAAG,CAAC,SAAS,EAAE,CAAA;QACf,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,CAAA;QAE9B,aAAa;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;QAEjC,aAAa;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA;QAC1C,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC,CAAA;QAEtC,aAAa;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC,CAAA;QAE9B,aAAa;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAErB,cAAc;QACd,GAAG,CAAC,SAAS,EAAE,CAAA;QAEf,GAAG,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACpC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,IAAI,aAAa,CAAA;QACjD,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAA;QAEhD,GAAG,CAAC,IAAI,EAAE,CAAA;QACV,GAAG,CAAC,MAAM,EAAE,CAAA;QAEZ,GAAG,CAAC,SAAS,EAAE,CAAA;IACjB,CAAC;CACF;AAED,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA","sourcesContent":["import JSON5 from 'json5'\n\nimport { BOUNDS, Component } from '@hatiolab/things-scene'\nimport { ANIMATION_DEFAULT, AnimationPreset, AnimationConfig } from './features/animation-default.js'\nimport { LEGEND_CARRIER, Legend } from './features/mcs-status-default.js'\nimport { MCSStatusMixin } from './features/mcs-status-mixin.js'\n\nexport class Carrier extends MCSStatusMixin(Component) {\n id?: string\n emptyType?: 'FULL' | 'EMPTY' | 'EMPTYEMPTY'\n carrierStatus?: string\n\n lastCarrierStatus?: string\n\n set data(data: any) {\n const { CARRIERNAME, CARRIERTYPE = '', EMPTYTYPE, CARRIERSTATUS } = data || {}\n\n this.setState('id', CARRIERNAME)\n\n this.emptyType = EMPTYTYPE\n this.carrierStatus = CARRIERSTATUS\n\n // TODO carrierstatus에 따라서 매핑되는 애니메이션 테마 수행\n if (this.lastCarrierStatus !== this.carrierStatus) {\n const lastAnimationConfig = this.getAnimationConfig(this.lastCarrierStatus)\n\n if (lastAnimationConfig) {\n let { animation, decorator, border, arrow } = lastAnimationConfig\n if (animation) {\n ;(this as any).started = false\n ;(this as any)._animation = null\n this.setState('animation', {\n oncreate: null\n })\n }\n\n if (decorator) {\n this.trigger('iconoff')\n }\n\n if (border) {\n this.trigger('borderoff')\n }\n\n if (arrow) {\n this.trigger('bouncingoff')\n }\n }\n\n const animationConfig = this.getAnimationConfig(this.carrierStatus)\n\n if (animationConfig) {\n let { animation, decorator, border, arrow } = animationConfig\n if (animation) {\n ;(this as any).started = false\n ;(this as any)._animation = null\n this.setState('animation', {\n oncreate: animation\n })\n ;(this as any).started = true\n }\n\n if (decorator) {\n this.trigger('iconoff')\n this.trigger('icon', decorator)\n }\n\n if (border) {\n this.trigger('borderoff')\n this.trigger('border', border)\n }\n\n if (arrow) {\n this.trigger('bouncingoff')\n this.trigger('bouncing', arrow)\n }\n }\n }\n\n this.lastCarrierStatus = this.carrierStatus\n }\n\n get status() {\n return this.emptyType\n }\n\n get legend(): Legend {\n const { carrierLegendName } = this.parent.state\n\n if (carrierLegendName) {\n return (this.root as any)?.style[carrierLegendName]\n }\n\n return LEGEND_CARRIER\n }\n\n getAnimationConfig(carrierStatus): AnimationConfig | null {\n const config = this.animationPreset[carrierStatus || 'default']\n\n if (config && typeof config == 'string') {\n try {\n return JSON5.parse(config)\n } catch (e) {\n console.error(e)\n }\n } else {\n return (config as AnimationConfig) || null\n }\n\n return null\n }\n\n get animationPreset(): AnimationPreset {\n const { carrierAnimationName } = this.parent.state\n\n if (carrierAnimationName) {\n return (this.parent.root as any)?.style[carrierAnimationName] || ANIMATION_DEFAULT\n }\n\n return ANIMATION_DEFAULT\n }\n\n calculateShrunkRectangle(originalRect: BOUNDS): BOUNDS {\n const shrunkRect: BOUNDS = { ...originalRect }\n\n shrunkRect.left += originalRect.width * 0.1\n shrunkRect.width *= 0.8\n\n shrunkRect.top += originalRect.height * 0.1\n shrunkRect.height *= 0.8\n\n return shrunkRect\n }\n\n contains(x, y) {\n const rect = this.calculateShrunkRectangle(this.parent.bounds)\n x -= rect.left\n y -= rect.top\n\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) {\n return false\n }\n\n // 윗변 중앙 좌표\n const topCenterX = rect.width / 2\n const topCenterY = 0\n\n // 오른쪽 변 중앙 좌표\n const rightCenterX = rect.width\n const rightCenterY = rect.height / 2\n\n // 기울기 m = (y2 - y1) / (x2 - x1)\n const m = (rightCenterY - topCenterY) / (rightCenterX - topCenterX)\n\n // y 절편 b = y - mx\n const b = topCenterY - m * topCenterX\n\n // 점(px, py)이 선 아래(좌하부)에 있는지 확인\n return y > m * x + b\n }\n\n render(ctx: CanvasRenderingContext2D) {\n if (!this.emptyType) {\n return\n }\n\n const { left, top, width, height } = this.calculateShrunkRectangle(this.parent.bounds)\n\n const radius = Math.round(Math.min(width, height) * 0.1)\n\n // 시작점 설정\n ctx.beginPath()\n ctx.moveTo(left + radius, top)\n\n // 상단 가로선 그리기\n ctx.lineTo(left + width / 2, top)\n\n // 우측 세로선 그리기\n ctx.lineTo(left + width, top + height / 2)\n ctx.lineTo(left + width, top + height)\n\n // 하단 가로선 그리기\n ctx.lineTo(left, top + height)\n\n // 좌측 세로선 그리기\n ctx.lineTo(left, top)\n\n // 경로 닫기 및 그리기\n ctx.closePath()\n\n ctx.lineWidth = radius > 5 ? 1 : 0.5\n ctx.fillStyle = this.statusColor || 'transparent'\n ctx.strokeStyle = this.auxColor || 'transparent'\n\n ctx.fill()\n ctx.stroke()\n\n ctx.beginPath()\n }\n}\n\nComponent.register('Carrier', Carrier)\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const ANIMATION_DEFAULT = {
|
|
2
|
+
WARN: {
|
|
3
|
+
animation: {
|
|
4
|
+
type: 'vibration',
|
|
5
|
+
duration: 1000,
|
|
6
|
+
theta: 0.3,
|
|
7
|
+
repeat: true
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
CRITICAL: {
|
|
11
|
+
animation: {
|
|
12
|
+
type: 'vibration',
|
|
13
|
+
duration: 500,
|
|
14
|
+
theta: 0.5,
|
|
15
|
+
repeat: true
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
default: null
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=animation-default.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation-default.js","sourceRoot":"","sources":["../../src/features/animation-default.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,iBAAiB,GAAoB;IAChD,IAAI,EAAE;QACJ,SAAS,EAAE;YACT,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb;KACF;IACD,QAAQ,EAAE;QACR,SAAS,EAAE;YACT,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb;KACF;IACD,OAAO,EAAE,IAAI;CACd,CAAA","sourcesContent":["export type AnimationConfig = {\n [key: string]: any\n}\n\nexport interface AnimationPreset {\n [state: string]: AnimationConfig | string | null\n}\n\nexport const ANIMATION_DEFAULT: AnimationPreset = {\n WARN: {\n animation: {\n type: 'vibration',\n duration: 1000,\n theta: 0.3,\n repeat: true\n }\n },\n CRITICAL: {\n animation: {\n type: 'vibration',\n duration: 500,\n theta: 0.5,\n repeat: true\n }\n },\n default: null\n}\n"]}
|
|
@@ -1,18 +1,68 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
1
|
+
import JSON5 from 'json5';
|
|
2
|
+
import { themesColorMap, themesAnimationMap } from '@fmsim/api';
|
|
3
|
+
import { ANIMATION_DEFAULT } from './features/animation-default.js';
|
|
4
|
+
import { LEGEND_CARRIER } from './features/mcs-status-default.js';
|
|
5
|
+
import { MCSStatusMixin } from './features/mcs-status-mixin.js';
|
|
6
|
+
import MCSUnit from './mcs-unit.js';
|
|
5
7
|
export class Carrier extends MCSStatusMixin(Object) {
|
|
6
8
|
constructor(host) {
|
|
7
9
|
super();
|
|
8
|
-
this.type = [];
|
|
9
10
|
this.host = host;
|
|
10
11
|
}
|
|
11
12
|
set data(data) {
|
|
12
|
-
const {
|
|
13
|
-
this.id =
|
|
14
|
-
this.type = CARRIERTYPE.split(';');
|
|
13
|
+
const { CARRIERNAME, CARRIERTYPE = '', EMPTYTYPE, CARRIERSTATUS } = data || {};
|
|
14
|
+
this.id = CARRIERNAME;
|
|
15
15
|
this.emptyType = EMPTYTYPE;
|
|
16
|
+
this.carrierStatus = CARRIERSTATUS;
|
|
17
|
+
// TODO carrierstatus에 따라서 매핑되는 애니메이션 테마 수행
|
|
18
|
+
if (this.lastCarrierStatus !== this.carrierStatus) {
|
|
19
|
+
const lastAnimationConfig = this.getAnimationConfig(this.lastCarrierStatus);
|
|
20
|
+
const target = this.host;
|
|
21
|
+
if (lastAnimationConfig) {
|
|
22
|
+
let { animation, decorator, border, arrow } = lastAnimationConfig;
|
|
23
|
+
if (animation) {
|
|
24
|
+
target.started = false;
|
|
25
|
+
target._animation = null;
|
|
26
|
+
target.setState('animation', {
|
|
27
|
+
oncreate: null
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (decorator) {
|
|
31
|
+
target.trigger('iconoff');
|
|
32
|
+
}
|
|
33
|
+
if (border) {
|
|
34
|
+
target.trigger('borderoff');
|
|
35
|
+
}
|
|
36
|
+
if (arrow) {
|
|
37
|
+
target.trigger('bouncingoff');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const animationConfig = this.getAnimationConfig(this.carrierStatus);
|
|
41
|
+
if (animationConfig) {
|
|
42
|
+
let { animation, decorator, border, arrow } = animationConfig;
|
|
43
|
+
if (animation) {
|
|
44
|
+
target.started = false;
|
|
45
|
+
target._animation = null;
|
|
46
|
+
target.setState('animation', {
|
|
47
|
+
oncreate: animation
|
|
48
|
+
});
|
|
49
|
+
target.started = true;
|
|
50
|
+
}
|
|
51
|
+
if (decorator) {
|
|
52
|
+
target.trigger('iconoff');
|
|
53
|
+
target.trigger('icon', decorator);
|
|
54
|
+
}
|
|
55
|
+
if (border) {
|
|
56
|
+
target.trigger('borderoff');
|
|
57
|
+
target.trigger('border', border);
|
|
58
|
+
}
|
|
59
|
+
if (arrow) {
|
|
60
|
+
target.trigger('bouncingoff');
|
|
61
|
+
target.trigger('bouncing', arrow);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
this.lastCarrierStatus = this.carrierStatus;
|
|
16
66
|
}
|
|
17
67
|
get status() {
|
|
18
68
|
return this.emptyType;
|
|
@@ -25,6 +75,29 @@ export class Carrier extends MCSStatusMixin(Object) {
|
|
|
25
75
|
}
|
|
26
76
|
return LEGEND_CARRIER;
|
|
27
77
|
}
|
|
78
|
+
getAnimationConfig(carrierStatus) {
|
|
79
|
+
const config = this.animationPreset[carrierStatus || 'default'];
|
|
80
|
+
if (config && typeof config == 'string') {
|
|
81
|
+
try {
|
|
82
|
+
return JSON5.parse(config);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
console.error(e);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return config || null;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
get animationPreset() {
|
|
94
|
+
var _a;
|
|
95
|
+
const { carrierAnimationName } = this.host.state;
|
|
96
|
+
if (carrierAnimationName) {
|
|
97
|
+
return ((_a = this.host.root) === null || _a === void 0 ? void 0 : _a.style[carrierAnimationName]) || ANIMATION_DEFAULT;
|
|
98
|
+
}
|
|
99
|
+
return ANIMATION_DEFAULT;
|
|
100
|
+
}
|
|
28
101
|
calculateShrunkRectangle(originalRect) {
|
|
29
102
|
const shrunkRect = Object.assign({}, originalRect);
|
|
30
103
|
shrunkRect.left += originalRect.width * 0.1;
|
|
@@ -79,15 +152,16 @@ export class Carrier extends MCSStatusMixin(Object) {
|
|
|
79
152
|
ctx.fill();
|
|
80
153
|
ctx.stroke();
|
|
81
154
|
ctx.beginPath();
|
|
82
|
-
const text =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
155
|
+
// const text =
|
|
156
|
+
// this.emptyType == 'FULL' ? 'F' : this.emptyType == 'EMPTY' ? 'E' : this.emptyType == 'EMPTYEMPTY' ? 'X' : ''
|
|
157
|
+
// if (text) {
|
|
158
|
+
// const { x: cx, y: cy } = this.host.center
|
|
159
|
+
// ctx.fillStyle = 'black'
|
|
160
|
+
// ctx.font = `normal ${Math.round(radius * 8)}px Arial`
|
|
161
|
+
// ctx.textAlign = 'center'
|
|
162
|
+
// ctx.textBaseline = 'middle'
|
|
163
|
+
// ctx.fillText(text, cx - width / 8, cy + height / 8)
|
|
164
|
+
// }
|
|
91
165
|
}
|
|
92
166
|
}
|
|
93
167
|
export default class MCSCarrierHolder extends MCSUnit {
|
|
@@ -105,6 +179,14 @@ export default class MCSCarrierHolder extends MCSUnit {
|
|
|
105
179
|
property: {
|
|
106
180
|
options: themesColorMap
|
|
107
181
|
}
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'select',
|
|
185
|
+
label: 'carrier-animation-name',
|
|
186
|
+
name: 'carrierAnimationName',
|
|
187
|
+
property: {
|
|
188
|
+
options: themesAnimationMap
|
|
189
|
+
}
|
|
108
190
|
}
|
|
109
191
|
];
|
|
110
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcs-carrier-holder.js","sourceRoot":"","sources":["../src/mcs-carrier-holder.ts"],"names":[],"mappings":"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","sourcesContent":["import { BOUNDS, Component } from '@hatiolab/things-scene'\nimport { themesColorMap } from '@fmsim/api'\nimport { LEGEND_CARRIER, Legend } from './features/mcs-status-default'\nimport { MCSStatusMixin } from './features/mcs-status-mixin'\nimport MCSUnit from './mcs-unit'\n\nexport class Carrier extends MCSStatusMixin(Object) {\n host: Component\n\n id?: string\n type: ('ALL' | 'BOBIN' | 'MAGAZINE' | 'PALLET' | 'REEL_TRAY' | 'PLATE')[] = []\n // emptyType?: '5000' | '5001' | '5002' // 'Full' | 'Empty' | 'EmptyEmpty'\n emptyType?: 'Full' | 'Empty' | 'EmptyEmpty'\n\n constructor(host: Component) {\n super()\n this.host = host\n }\n\n set data(data: any) {\n const { CARRIERID, CARRIERTYPE = '', EMPTYTYPE } = data || {}\n\n this.id = CARRIERID\n this.type = CARRIERTYPE.split(';')\n this.emptyType = EMPTYTYPE\n }\n\n get status() {\n return this.emptyType\n }\n\n get legend(): Legend {\n const { carrierLegendName } = this.host.state\n\n if (carrierLegendName) {\n return (this.host.root as any)?.style[carrierLegendName]\n }\n\n return LEGEND_CARRIER\n }\n\n calculateShrunkRectangle(originalRect: BOUNDS): BOUNDS {\n const shrunkRect: BOUNDS = { ...originalRect }\n\n shrunkRect.left += originalRect.width * 0.1\n shrunkRect.width *= 0.8\n\n shrunkRect.top += originalRect.height * 0.1\n shrunkRect.height *= 0.8\n\n return shrunkRect\n }\n\n isPointOnCarrier(x, y, { left, top, width, height }) {\n const rect = this.calculateShrunkRectangle({ left, top, width, height })\n x -= rect.left\n y -= rect.top\n\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) {\n return false\n }\n\n // 윗변 중앙 좌표\n const topCenterX = rect.width / 2\n const topCenterY = 0\n\n // 오른쪽 변 중앙 좌표\n const rightCenterX = rect.width\n const rightCenterY = rect.height / 2\n\n // 기울기 m = (y2 - y1) / (x2 - x1)\n const m = (rightCenterY - topCenterY) / (rightCenterX - topCenterX)\n\n // y 절편 b = y - mx\n const b = topCenterY - m * topCenterX\n\n // 점(px, py)이 선 아래(좌하부)에 있는지 확인\n return y > m * x + b\n }\n\n render(ctx: CanvasRenderingContext2D) {\n if (!this.emptyType) {\n return\n }\n\n const { left, top, width, height } = this.calculateShrunkRectangle(this.host.bounds)\n\n const radius = Math.round(Math.min(width, height) * 0.1)\n\n // 시작점 설정\n ctx.beginPath()\n ctx.moveTo(left + radius, top)\n\n // 상단 가로선 그리기\n ctx.lineTo(left + width / 2, top)\n\n // 우측 세로선 그리기\n ctx.lineTo(left + width, top + height / 2)\n ctx.lineTo(left + width, top + height)\n\n // 하단 가로선 그리기\n ctx.lineTo(left, top + height)\n\n // 좌측 세로선 그리기\n ctx.lineTo(left, top)\n\n // 경로 닫기 및 그리기\n ctx.closePath()\n\n ctx.lineWidth = radius > 5 ? 1 : 0.5\n ctx.fillStyle = this.statusColor || 'transparent'\n ctx.strokeStyle = this.auxColor || 'transparent'\n\n ctx.fill()\n ctx.stroke()\n\n ctx.beginPath()\n\n const text =\n this.emptyType == 'Full' ? 'F' : this.emptyType == 'Empty' ? 'E' : this.emptyType == 'EmptyEmpty' ? 'X' : ''\n\n if (text) {\n const { x: cx, y: cy } = this.host.center\n\n ctx.fillStyle = 'black'\n ctx.font = `normal ${Math.round(radius * 8)}px Arial`\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n\n ctx.fillText(text, cx - width / 8, cy + height / 8)\n }\n }\n}\n\nexport default class MCSCarrierHolder extends MCSUnit {\n static get properties(): any {\n return [\n ...MCSUnit.properties,\n {\n type: 'select',\n label: 'carrier-legend-name',\n name: 'carrierLegendName',\n property: {\n options: themesColorMap\n }\n }\n ]\n }\n\n carrier: Carrier = new Carrier(this)\n\n ready() {\n this.carrier.data = this.data\n }\n\n postrender(ctx: CanvasRenderingContext2D) {\n this.carrier.render(ctx)\n\n super.postrender(ctx)\n }\n\n onchangeData(after: any, before: any) {\n this.carrier.data = this.data\n\n super.onchangeData(after, before)\n }\n\n isPointOnCarrier(x, y) {\n const { CARRIERID } = this.data || {}\n if (!CARRIERID) {\n return false\n }\n\n const point = this.transcoordC2S(x, y)\n const { left, top, width, height } = this.bounds\n\n point.x -= left\n point.y -= top\n\n return this.carrier.isPointOnCarrier(point.x, point.y, { left: 0, top: 0, width, height })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcs-carrier-holder.js","sourceRoot":"","sources":["../src/mcs-carrier-holder.ts"],"names":[],"mappings":"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","sourcesContent":["import JSON5 from 'json5'\n\nimport { BOUNDS, Component } from '@hatiolab/things-scene'\nimport { themesColorMap, themesAnimationMap } from '@fmsim/api'\nimport { ANIMATION_DEFAULT, AnimationPreset, AnimationConfig } from './features/animation-default.js'\nimport { LEGEND_CARRIER, Legend } from './features/mcs-status-default.js'\nimport { MCSStatusMixin } from './features/mcs-status-mixin.js'\nimport MCSUnit from './mcs-unit.js'\n\nexport class Carrier extends MCSStatusMixin(Object) {\n host: Component\n\n id?: string\n emptyType?: 'FULL' | 'EMPTY' | 'EMPTYEMPTY'\n carrierStatus?: string\n\n lastCarrierStatus?: string\n\n constructor(host: Component) {\n super()\n this.host = host\n }\n\n set data(data: any) {\n const { CARRIERNAME, CARRIERTYPE = '', EMPTYTYPE, CARRIERSTATUS } = data || {}\n\n this.id = CARRIERNAME\n this.emptyType = EMPTYTYPE\n this.carrierStatus = CARRIERSTATUS\n\n // TODO carrierstatus에 따라서 매핑되는 애니메이션 테마 수행\n if (this.lastCarrierStatus !== this.carrierStatus) {\n const lastAnimationConfig = this.getAnimationConfig(this.lastCarrierStatus)\n const target = this.host as any\n\n if (lastAnimationConfig) {\n let { animation, decorator, border, arrow } = lastAnimationConfig\n if (animation) {\n target.started = false\n target._animation = null\n target.setState('animation', {\n oncreate: null\n })\n }\n\n if (decorator) {\n target.trigger('iconoff')\n }\n\n if (border) {\n target.trigger('borderoff')\n }\n\n if (arrow) {\n target.trigger('bouncingoff')\n }\n }\n\n const animationConfig = this.getAnimationConfig(this.carrierStatus)\n\n if (animationConfig) {\n let { animation, decorator, border, arrow } = animationConfig\n if (animation) {\n target.started = false\n target._animation = null\n target.setState('animation', {\n oncreate: animation\n })\n target.started = true\n }\n\n if (decorator) {\n target.trigger('iconoff')\n target.trigger('icon', decorator)\n }\n\n if (border) {\n target.trigger('borderoff')\n target.trigger('border', border)\n }\n\n if (arrow) {\n target.trigger('bouncingoff')\n target.trigger('bouncing', arrow)\n }\n }\n }\n\n this.lastCarrierStatus = this.carrierStatus\n }\n\n get status() {\n return this.emptyType\n }\n\n get legend(): Legend {\n const { carrierLegendName } = this.host.state\n\n if (carrierLegendName) {\n return (this.host.root as any)?.style[carrierLegendName]\n }\n\n return LEGEND_CARRIER\n }\n\n getAnimationConfig(carrierStatus): AnimationConfig | null {\n const config = this.animationPreset[carrierStatus || 'default']\n\n if (config && typeof config == 'string') {\n try {\n return JSON5.parse(config)\n } catch (e) {\n console.error(e)\n }\n } else {\n return (config as AnimationConfig) || null\n }\n\n return null\n }\n\n get animationPreset(): AnimationPreset {\n const { carrierAnimationName } = this.host.state\n\n if (carrierAnimationName) {\n return (this.host.root as any)?.style[carrierAnimationName] || ANIMATION_DEFAULT\n }\n\n return ANIMATION_DEFAULT\n }\n\n calculateShrunkRectangle(originalRect: BOUNDS): BOUNDS {\n const shrunkRect: BOUNDS = { ...originalRect }\n\n shrunkRect.left += originalRect.width * 0.1\n shrunkRect.width *= 0.8\n\n shrunkRect.top += originalRect.height * 0.1\n shrunkRect.height *= 0.8\n\n return shrunkRect\n }\n\n isPointOnCarrier(x, y, { left, top, width, height }) {\n const rect = this.calculateShrunkRectangle({ left, top, width, height })\n x -= rect.left\n y -= rect.top\n\n if (x < 0 || y < 0 || x > rect.width || y > rect.height) {\n return false\n }\n\n // 윗변 중앙 좌표\n const topCenterX = rect.width / 2\n const topCenterY = 0\n\n // 오른쪽 변 중앙 좌표\n const rightCenterX = rect.width\n const rightCenterY = rect.height / 2\n\n // 기울기 m = (y2 - y1) / (x2 - x1)\n const m = (rightCenterY - topCenterY) / (rightCenterX - topCenterX)\n\n // y 절편 b = y - mx\n const b = topCenterY - m * topCenterX\n\n // 점(px, py)이 선 아래(좌하부)에 있는지 확인\n return y > m * x + b\n }\n\n render(ctx: CanvasRenderingContext2D) {\n if (!this.emptyType) {\n return\n }\n\n const { left, top, width, height } = this.calculateShrunkRectangle(this.host.bounds)\n\n const radius = Math.round(Math.min(width, height) * 0.1)\n\n // 시작점 설정\n ctx.beginPath()\n ctx.moveTo(left + radius, top)\n\n // 상단 가로선 그리기\n ctx.lineTo(left + width / 2, top)\n\n // 우측 세로선 그리기\n ctx.lineTo(left + width, top + height / 2)\n ctx.lineTo(left + width, top + height)\n\n // 하단 가로선 그리기\n ctx.lineTo(left, top + height)\n\n // 좌측 세로선 그리기\n ctx.lineTo(left, top)\n\n // 경로 닫기 및 그리기\n ctx.closePath()\n\n ctx.lineWidth = radius > 5 ? 1 : 0.5\n ctx.fillStyle = this.statusColor || 'transparent'\n ctx.strokeStyle = this.auxColor || 'transparent'\n\n ctx.fill()\n ctx.stroke()\n\n ctx.beginPath()\n\n // const text =\n // this.emptyType == 'FULL' ? 'F' : this.emptyType == 'EMPTY' ? 'E' : this.emptyType == 'EMPTYEMPTY' ? 'X' : ''\n\n // if (text) {\n // const { x: cx, y: cy } = this.host.center\n\n // ctx.fillStyle = 'black'\n // ctx.font = `normal ${Math.round(radius * 8)}px Arial`\n // ctx.textAlign = 'center'\n // ctx.textBaseline = 'middle'\n\n // ctx.fillText(text, cx - width / 8, cy + height / 8)\n // }\n }\n}\n\nexport default class MCSCarrierHolder extends MCSUnit {\n static get properties(): any {\n return [\n ...MCSUnit.properties,\n {\n type: 'select',\n label: 'carrier-legend-name',\n name: 'carrierLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'carrier-animation-name',\n name: 'carrierAnimationName',\n property: {\n options: themesAnimationMap\n }\n }\n ]\n }\n\n carrier: Carrier = new Carrier(this)\n\n ready() {\n this.carrier.data = this.data\n }\n\n postrender(ctx: CanvasRenderingContext2D) {\n this.carrier.render(ctx)\n\n super.postrender(ctx)\n }\n\n onchangeData(after: any, before: any) {\n this.carrier.data = this.data\n\n super.onchangeData(after, before)\n }\n\n isPointOnCarrier(x, y) {\n const { CARRIERID } = this.data || {}\n if (!CARRIERID) {\n return false\n }\n\n const point = this.transcoordC2S(x, y)\n const { left, top, width, height } = this.bounds\n\n point.x -= left\n point.y -= top\n\n return this.carrier.isPointOnCarrier(point.x, point.y, { left: 0, top: 0, width, height })\n }\n}\n"]}
|
package/dist/port-flow.js
CHANGED
|
@@ -11,7 +11,7 @@ const NATURE = {
|
|
|
11
11
|
name: 'orientation',
|
|
12
12
|
label: 'orientation',
|
|
13
13
|
property: {
|
|
14
|
-
options: ['left
|
|
14
|
+
options: ['left to right', 'right to left', 'top to bottom', 'bottom to top']
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
{
|
|
@@ -27,7 +27,7 @@ const NATURE = {
|
|
|
27
27
|
name: 'direction',
|
|
28
28
|
label: 'direction',
|
|
29
29
|
property: {
|
|
30
|
-
options: ['
|
|
30
|
+
options: ['IN', 'OUT', 'BOTH']
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
]
|
|
@@ -53,40 +53,45 @@ export default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
get text() {
|
|
56
|
-
const { direction = '
|
|
56
|
+
const { direction = 'IN' } = this.state;
|
|
57
57
|
return direction.toUpperCase();
|
|
58
58
|
}
|
|
59
59
|
render(ctx) {
|
|
60
60
|
const { left, top, width, height } = this.bounds;
|
|
61
|
-
|
|
61
|
+
var { orientation = 'left to right', direction = 'IN' } = this.state;
|
|
62
|
+
const { INOUTTYPE } = this.data;
|
|
63
|
+
if (INOUTTYPE) {
|
|
64
|
+
// TODO bothtype value 조정하기.
|
|
65
|
+
direction = INOUTTYPE; /* IN | OUT | BOTH */
|
|
66
|
+
}
|
|
62
67
|
ctx.beginPath();
|
|
63
68
|
const arrowSize = Math.min(width, height) * 0.3;
|
|
64
|
-
const bodyWidth = orientation === 'left
|
|
69
|
+
const bodyWidth = orientation === 'left to right' || orientation === 'right to left' ? height * 0.2 : width * 0.2;
|
|
65
70
|
const centerX = left + width / 2;
|
|
66
71
|
const centerY = top + height / 2;
|
|
67
72
|
let startX, startY, endX, endY;
|
|
68
73
|
let reverse = 1;
|
|
69
74
|
switch (orientation) {
|
|
70
|
-
case 'left
|
|
75
|
+
case 'left to right':
|
|
71
76
|
startX = left;
|
|
72
77
|
endX = left + width;
|
|
73
78
|
startY = centerY;
|
|
74
79
|
endY = centerY;
|
|
75
80
|
break;
|
|
76
|
-
case 'right
|
|
81
|
+
case 'right to left':
|
|
77
82
|
startX = left + width;
|
|
78
83
|
endX = left;
|
|
79
84
|
startY = centerY;
|
|
80
85
|
endY = centerY;
|
|
81
86
|
reverse = -1;
|
|
82
87
|
break;
|
|
83
|
-
case 'top
|
|
88
|
+
case 'top to bottom':
|
|
84
89
|
startX = centerX;
|
|
85
90
|
endX = centerX;
|
|
86
91
|
startY = top;
|
|
87
92
|
endY = top + height;
|
|
88
93
|
break;
|
|
89
|
-
case 'bottom
|
|
94
|
+
case 'bottom to top':
|
|
90
95
|
startX = centerX;
|
|
91
96
|
endX = centerX;
|
|
92
97
|
startY = top + height;
|
|
@@ -96,7 +101,7 @@ export default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {
|
|
|
96
101
|
}
|
|
97
102
|
ctx.lineTo(startX, startY);
|
|
98
103
|
if (orientation.includes('left')) {
|
|
99
|
-
if (direction === '
|
|
104
|
+
if (direction === 'OUT' || direction === 'BOTH') {
|
|
100
105
|
ctx.lineTo(startX + arrowSize * reverse, startY - bodyWidth * reverse * 2);
|
|
101
106
|
}
|
|
102
107
|
else {
|
|
@@ -104,14 +109,14 @@ export default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {
|
|
|
104
109
|
}
|
|
105
110
|
ctx.lineTo(startX + arrowSize * reverse, startY - bodyWidth * reverse);
|
|
106
111
|
ctx.lineTo(endX - arrowSize * reverse, endY - bodyWidth * reverse);
|
|
107
|
-
if (direction === '
|
|
112
|
+
if (direction === 'IN' || direction === 'BOTH') {
|
|
108
113
|
ctx.lineTo(endX - arrowSize * reverse, endY - bodyWidth * 2 * reverse);
|
|
109
114
|
}
|
|
110
115
|
else {
|
|
111
116
|
ctx.lineTo(endX, endY - bodyWidth * reverse);
|
|
112
117
|
}
|
|
113
118
|
ctx.lineTo(endX, endY);
|
|
114
|
-
if (direction === '
|
|
119
|
+
if (direction === 'IN' || direction === 'BOTH') {
|
|
115
120
|
ctx.lineTo(endX - arrowSize * reverse, endY + bodyWidth * 2 * reverse);
|
|
116
121
|
}
|
|
117
122
|
else {
|
|
@@ -119,7 +124,7 @@ export default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {
|
|
|
119
124
|
}
|
|
120
125
|
ctx.lineTo(endX - arrowSize * reverse, endY + bodyWidth * reverse);
|
|
121
126
|
ctx.lineTo(startX + arrowSize * reverse, startY + bodyWidth * reverse);
|
|
122
|
-
if (direction === '
|
|
127
|
+
if (direction === 'OUT' || direction === 'BOTH') {
|
|
123
128
|
ctx.lineTo(startX + arrowSize * reverse, startY + bodyWidth * 2 * reverse);
|
|
124
129
|
}
|
|
125
130
|
else {
|
|
@@ -127,7 +132,7 @@ export default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {
|
|
|
127
132
|
}
|
|
128
133
|
}
|
|
129
134
|
else {
|
|
130
|
-
if (direction === '
|
|
135
|
+
if (direction === 'OUT' || direction === 'BOTH') {
|
|
131
136
|
ctx.lineTo(startX - bodyWidth * reverse * 2, startY + arrowSize * reverse);
|
|
132
137
|
}
|
|
133
138
|
else {
|
|
@@ -135,14 +140,14 @@ export default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {
|
|
|
135
140
|
}
|
|
136
141
|
ctx.lineTo(startX - bodyWidth * reverse, startY + arrowSize * reverse);
|
|
137
142
|
ctx.lineTo(endX - bodyWidth * reverse, endY - arrowSize * reverse);
|
|
138
|
-
if (direction === '
|
|
143
|
+
if (direction === 'IN' || direction === 'BOTH') {
|
|
139
144
|
ctx.lineTo(endX - bodyWidth * 2 * reverse, endY - arrowSize * reverse);
|
|
140
145
|
}
|
|
141
146
|
else {
|
|
142
147
|
ctx.lineTo(endX - bodyWidth * reverse, endY);
|
|
143
148
|
}
|
|
144
149
|
ctx.lineTo(endX, endY);
|
|
145
|
-
if (direction === '
|
|
150
|
+
if (direction === 'IN' || direction === 'BOTH') {
|
|
146
151
|
ctx.lineTo(endX + bodyWidth * 2 * reverse, endY - arrowSize * reverse);
|
|
147
152
|
}
|
|
148
153
|
else {
|
|
@@ -150,7 +155,7 @@ export default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {
|
|
|
150
155
|
}
|
|
151
156
|
ctx.lineTo(endX + bodyWidth * reverse, endY - arrowSize * reverse);
|
|
152
157
|
ctx.lineTo(startX + bodyWidth * reverse, startY + arrowSize * reverse);
|
|
153
|
-
if (direction === '
|
|
158
|
+
if (direction === 'OUT' || direction === 'BOTH') {
|
|
154
159
|
ctx.lineTo(startX + bodyWidth * 2 * reverse, startY + arrowSize * reverse);
|
|
155
160
|
}
|
|
156
161
|
else {
|
package/dist/port-flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port-flow.js","sourceRoot":"","sources":["../src/port-flow.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ComponentNature, RectPath, Shape } from '@hatiolab/things-scene'\nimport { ParentObjectMixin, ParentObjectMixinProperties } from './features/parent-object-mixin'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n ...ParentObjectMixinProperties,\n {\n type: 'select',\n name: 'orientation',\n label: 'orientation',\n property: {\n options: ['left-right', 'right-left', 'top-bottom', 'bottom-top']\n }\n },\n {\n type: 'select',\n name: 'labelPosition',\n label: 'label-position',\n property: {\n options: ['left', 'right', 'top', 'bottom']\n }\n },\n {\n type: 'select',\n name: 'direction',\n label: 'direction',\n property: {\n options: ['in', 'out', 'inout']\n }\n }\n ]\n}\n\nexport default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {\n static get nature() {\n return NATURE\n }\n\n get textBounds() {\n const { left, top, width, height } = this.bounds\n const { labelPosition = 'top' } = this.state\n\n switch (labelPosition) {\n case 'top':\n return {\n ...this.bounds,\n top: top - 24,\n height: 24\n }\n case 'bottom':\n return {\n ...this.bounds,\n top: top + height,\n height: 24\n }\n case 'left':\n return {\n ...this.bounds,\n left: left - 60,\n width: 60\n }\n case 'right':\n return {\n ...this.bounds,\n left: left + width,\n width: 60\n }\n default:\n return {\n ...this.bounds,\n top: top - 24,\n height: 24\n }\n }\n }\n\n get text() {\n const { direction = 'in' } = this.state\n\n return direction.toUpperCase()\n }\n\n render(ctx) {\n const { left, top, width, height } = this.bounds\n const { orientation = 'left-right', direction = 'in' }: { orientation?: string; direction?: string } = this.state\n\n ctx.beginPath()\n\n const arrowSize = Math.min(width, height) * 0.3\n const bodyWidth = orientation === 'left-right' || orientation === 'right-left' ? height * 0.2 : width * 0.2\n const centerX = left + width / 2\n const centerY = top + height / 2\n\n let startX, startY, endX, endY\n let reverse = 1\n\n switch (orientation) {\n case 'left-right':\n startX = left\n endX = left + width\n startY = centerY\n endY = centerY\n break\n case 'right-left':\n startX = left + width\n endX = left\n startY = centerY\n endY = centerY\n reverse = -1\n break\n case 'top-bottom':\n startX = centerX\n endX = centerX\n startY = top\n endY = top + height\n break\n case 'bottom-top':\n startX = centerX\n endX = centerX\n startY = top + height\n endY = top\n reverse = -1\n break\n }\n\n ctx.lineTo(startX, startY)\n\n if (orientation.includes('left')) {\n if (direction === 'out' || direction === 'inout') {\n ctx.lineTo(startX + arrowSize * reverse, startY - bodyWidth * reverse * 2)\n } else {\n ctx.lineTo(startX, startY - bodyWidth * reverse)\n }\n\n ctx.lineTo(startX + arrowSize * reverse, startY - bodyWidth * reverse)\n ctx.lineTo(endX - arrowSize * reverse, endY - bodyWidth * reverse)\n\n if (direction === 'in' || direction === 'inout') {\n ctx.lineTo(endX - arrowSize * reverse, endY - bodyWidth * 2 * reverse)\n } else {\n ctx.lineTo(endX, endY - bodyWidth * reverse)\n }\n\n ctx.lineTo(endX, endY)\n\n if (direction === 'in' || direction === 'inout') {\n ctx.lineTo(endX - arrowSize * reverse, endY + bodyWidth * 2 * reverse)\n } else {\n ctx.lineTo(endX, endY + bodyWidth * reverse)\n }\n\n ctx.lineTo(endX - arrowSize * reverse, endY + bodyWidth * reverse)\n ctx.lineTo(startX + arrowSize * reverse, startY + bodyWidth * reverse)\n\n if (direction === 'out' || direction === 'inout') {\n ctx.lineTo(startX + arrowSize * reverse, startY + bodyWidth * 2 * reverse)\n } else {\n ctx.lineTo(startX, startY + bodyWidth * reverse)\n }\n } else {\n if (direction === 'out' || direction === 'inout') {\n ctx.lineTo(startX - bodyWidth * reverse * 2, startY + arrowSize * reverse)\n } else {\n ctx.lineTo(startX - bodyWidth * reverse, startY)\n }\n\n ctx.lineTo(startX - bodyWidth * reverse, startY + arrowSize * reverse)\n ctx.lineTo(endX - bodyWidth * reverse, endY - arrowSize * reverse)\n\n if (direction === 'in' || direction === 'inout') {\n ctx.lineTo(endX - bodyWidth * 2 * reverse, endY - arrowSize * reverse)\n } else {\n ctx.lineTo(endX - bodyWidth * reverse, endY)\n }\n\n ctx.lineTo(endX, endY)\n\n if (direction === 'in' || direction === 'inout') {\n ctx.lineTo(endX + bodyWidth * 2 * reverse, endY - arrowSize * reverse)\n } else {\n ctx.lineTo(endX + bodyWidth * reverse, endY)\n }\n\n ctx.lineTo(endX + bodyWidth * reverse, endY - arrowSize * reverse)\n ctx.lineTo(startX + bodyWidth * reverse, startY + arrowSize * reverse)\n\n if (direction === 'out' || direction === 'inout') {\n ctx.lineTo(startX + bodyWidth * 2 * reverse, startY + arrowSize * reverse)\n } else {\n ctx.lineTo(startX + bodyWidth * reverse, startY)\n }\n }\n\n ctx.closePath()\n\n this.drawStroke(ctx)\n }\n}\n\nComponent.register('PortFlow', PortFlow)\n"]}
|
|
1
|
+
{"version":3,"file":"port-flow.js","sourceRoot":"","sources":["../src/port-flow.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ComponentNature, RectPath, Shape } from '@hatiolab/things-scene'\nimport { ParentObjectMixin, ParentObjectMixinProperties } from './features/parent-object-mixin'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n ...ParentObjectMixinProperties,\n {\n type: 'select',\n name: 'orientation',\n label: 'orientation',\n property: {\n options: ['left to right', 'right to left', 'top to bottom', 'bottom to top']\n }\n },\n {\n type: 'select',\n name: 'labelPosition',\n label: 'label-position',\n property: {\n options: ['left', 'right', 'top', 'bottom']\n }\n },\n {\n type: 'select',\n name: 'direction',\n label: 'direction',\n property: {\n options: ['IN', 'OUT', 'BOTH']\n }\n }\n ]\n}\n\nexport default class PortFlow extends ParentObjectMixin(RectPath(Shape)) {\n static get nature() {\n return NATURE\n }\n\n get textBounds() {\n const { left, top, width, height } = this.bounds\n const { labelPosition = 'top' } = this.state\n\n switch (labelPosition) {\n case 'top':\n return {\n ...this.bounds,\n top: top - 24,\n height: 24\n }\n case 'bottom':\n return {\n ...this.bounds,\n top: top + height,\n height: 24\n }\n case 'left':\n return {\n ...this.bounds,\n left: left - 60,\n width: 60\n }\n case 'right':\n return {\n ...this.bounds,\n left: left + width,\n width: 60\n }\n default:\n return {\n ...this.bounds,\n top: top - 24,\n height: 24\n }\n }\n }\n\n get text() {\n const { direction = 'IN' } = this.state\n\n return direction.toUpperCase()\n }\n\n render(ctx) {\n const { left, top, width, height } = this.bounds\n var { orientation = 'left to right', direction = 'IN' }: { orientation?: string; direction?: string } = this.state\n const { INOUTTYPE } = this.data\n\n if (INOUTTYPE) {\n // TODO bothtype value 조정하기.\n direction = INOUTTYPE /* IN | OUT | BOTH */\n }\n\n ctx.beginPath()\n\n const arrowSize = Math.min(width, height) * 0.3\n const bodyWidth = orientation === 'left to right' || orientation === 'right to left' ? height * 0.2 : width * 0.2\n const centerX = left + width / 2\n const centerY = top + height / 2\n\n let startX, startY, endX, endY\n let reverse = 1\n\n switch (orientation) {\n case 'left to right':\n startX = left\n endX = left + width\n startY = centerY\n endY = centerY\n break\n case 'right to left':\n startX = left + width\n endX = left\n startY = centerY\n endY = centerY\n reverse = -1\n break\n case 'top to bottom':\n startX = centerX\n endX = centerX\n startY = top\n endY = top + height\n break\n case 'bottom to top':\n startX = centerX\n endX = centerX\n startY = top + height\n endY = top\n reverse = -1\n break\n }\n\n ctx.lineTo(startX, startY)\n\n if (orientation.includes('left')) {\n if (direction === 'OUT' || direction === 'BOTH') {\n ctx.lineTo(startX + arrowSize * reverse, startY - bodyWidth * reverse * 2)\n } else {\n ctx.lineTo(startX, startY - bodyWidth * reverse)\n }\n\n ctx.lineTo(startX + arrowSize * reverse, startY - bodyWidth * reverse)\n ctx.lineTo(endX - arrowSize * reverse, endY - bodyWidth * reverse)\n\n if (direction === 'IN' || direction === 'BOTH') {\n ctx.lineTo(endX - arrowSize * reverse, endY - bodyWidth * 2 * reverse)\n } else {\n ctx.lineTo(endX, endY - bodyWidth * reverse)\n }\n\n ctx.lineTo(endX, endY)\n\n if (direction === 'IN' || direction === 'BOTH') {\n ctx.lineTo(endX - arrowSize * reverse, endY + bodyWidth * 2 * reverse)\n } else {\n ctx.lineTo(endX, endY + bodyWidth * reverse)\n }\n\n ctx.lineTo(endX - arrowSize * reverse, endY + bodyWidth * reverse)\n ctx.lineTo(startX + arrowSize * reverse, startY + bodyWidth * reverse)\n\n if (direction === 'OUT' || direction === 'BOTH') {\n ctx.lineTo(startX + arrowSize * reverse, startY + bodyWidth * 2 * reverse)\n } else {\n ctx.lineTo(startX, startY + bodyWidth * reverse)\n }\n } else {\n if (direction === 'OUT' || direction === 'BOTH') {\n ctx.lineTo(startX - bodyWidth * reverse * 2, startY + arrowSize * reverse)\n } else {\n ctx.lineTo(startX - bodyWidth * reverse, startY)\n }\n\n ctx.lineTo(startX - bodyWidth * reverse, startY + arrowSize * reverse)\n ctx.lineTo(endX - bodyWidth * reverse, endY - arrowSize * reverse)\n\n if (direction === 'IN' || direction === 'BOTH') {\n ctx.lineTo(endX - bodyWidth * 2 * reverse, endY - arrowSize * reverse)\n } else {\n ctx.lineTo(endX - bodyWidth * reverse, endY)\n }\n\n ctx.lineTo(endX, endY)\n\n if (direction === 'IN' || direction === 'BOTH') {\n ctx.lineTo(endX + bodyWidth * 2 * reverse, endY - arrowSize * reverse)\n } else {\n ctx.lineTo(endX + bodyWidth * reverse, endY)\n }\n\n ctx.lineTo(endX + bodyWidth * reverse, endY - arrowSize * reverse)\n ctx.lineTo(startX + bodyWidth * reverse, startY + arrowSize * reverse)\n\n if (direction === 'OUT' || direction === 'BOTH') {\n ctx.lineTo(startX + bodyWidth * 2 * reverse, startY + arrowSize * reverse)\n } else {\n ctx.lineTo(startX + bodyWidth * reverse, startY)\n }\n }\n\n ctx.closePath()\n\n this.drawStroke(ctx)\n }\n}\n\nComponent.register('PortFlow', PortFlow)\n"]}
|