@fmsim/machine 3.0.0-beta.4 → 3.0.0-beta.5
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/agv-line.js +2 -2
- package/dist/agv-line.js.map +1 -1
- package/dist/agv.js +6 -2
- package/dist/agv.js.map +1 -1
- package/dist/buffer.js +2 -2
- package/dist/buffer.js.map +1 -1
- package/dist/conveyor-join.js +2 -2
- package/dist/conveyor-join.js.map +1 -1
- package/dist/conveyor.js +2 -2
- package/dist/conveyor.js.map +1 -1
- package/dist/crane.js +2 -2
- package/dist/crane.js.map +1 -1
- package/dist/equipment.js +2 -2
- package/dist/equipment.js.map +1 -1
- package/dist/factories/conveyor-3d.js +2 -2
- package/dist/factories/conveyor-3d.js.map +1 -1
- package/dist/factories/machine-3d.js +12 -12
- package/dist/factories/machine-3d.js.map +1 -1
- package/dist/factories/oht-3d.js +3 -4
- package/dist/factories/oht-3d.js.map +1 -1
- package/dist/features/legend-panel.js +29 -0
- package/dist/features/legend-panel.js.map +1 -0
- package/dist/features/legend-rows.js +88 -0
- package/dist/features/legend-rows.js.map +1 -0
- package/dist/features/lv-figures.js +137 -0
- package/dist/features/lv-figures.js.map +1 -0
- package/dist/features/lv-heights.js +20 -0
- package/dist/features/lv-heights.js.map +1 -0
- package/dist/features/mcs-status-default.js +3 -49
- package/dist/features/mcs-status-default.js.map +1 -1
- package/dist/features/oht-rail.js +32 -0
- package/dist/features/oht-rail.js.map +1 -0
- package/dist/features/vehicle-travel.js +18 -1
- package/dist/features/vehicle-travel.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcs-carrier-holder.js +19 -26
- package/dist/mcs-carrier-holder.js.map +1 -1
- package/dist/mcs-machine.js +10 -1
- package/dist/mcs-machine.js.map +1 -1
- package/dist/mcs-unit.js +10 -1
- package/dist/mcs-unit.js.map +1 -1
- package/dist/mcs-vehicle.js +0 -4
- package/dist/mcs-vehicle.js.map +1 -1
- package/dist/oht-line.js +7 -3
- package/dist/oht-line.js.map +1 -1
- package/dist/oht.js +2 -2
- package/dist/oht.js.map +1 -1
- package/dist/port.js +2 -2
- package/dist/port.js.map +1 -1
- package/dist/scene/root-container-override.js +15 -210
- package/dist/scene/root-container-override.js.map +1 -1
- package/dist/shelf.js +2 -2
- package/dist/shelf.js.map +1 -1
- package/dist/shuttle.js +2 -2
- package/dist/shuttle.js.map +1 -1
- package/dist/stocker.js +2 -2
- package/dist/stocker.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/src/agv-line.ts +2 -2
- package/src/agv.ts +7 -2
- package/src/buffer.ts +2 -2
- package/src/conveyor-join.ts +2 -2
- package/src/conveyor.ts +2 -2
- package/src/crane.ts +2 -2
- package/src/equipment.ts +2 -2
- package/src/factories/conveyor-3d.ts +2 -2
- package/src/factories/machine-3d.ts +11 -12
- package/src/factories/oht-3d.ts +3 -5
- package/src/features/legend-panel.ts +31 -0
- package/src/features/legend-rows.ts +86 -0
- package/src/features/lv-figures.ts +144 -0
- package/src/features/lv-heights.ts +22 -0
- package/src/features/mcs-status-default.ts +3 -53
- package/src/features/oht-rail.ts +31 -0
- package/src/features/vehicle-travel.ts +16 -1
- package/src/index.ts +4 -0
- package/src/mcs-carrier-holder.ts +17 -29
- package/src/mcs-machine.ts +12 -1
- package/src/mcs-unit.ts +12 -1
- package/src/mcs-vehicle.ts +0 -4
- package/src/oht-line.ts +7 -3
- package/src/oht.ts +2 -2
- package/src/port.ts +2 -2
- package/src/scene/root-container-override.ts +15 -207
- package/src/shelf.ts +2 -2
- package/src/shuttle.ts +2 -2
- package/src/stocker.ts +2 -2
- package/translations/en.json +7 -1
- package/translations/ja.json +7 -1
- package/translations/ko.json +7 -1
- package/translations/ms.json +7 -1
- package/translations/zh.json +7 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Component, RootContainer, figureLegendSourcesChanged } from '@hatiolab/things-scene';
|
|
2
|
-
import {
|
|
2
|
+
import { FMSIM_LEGEND_ROWS, legendRows } from '@fmsim/figure-capabilities';
|
|
3
|
+
import { boardLegendOf } from '../features/legend-rows';
|
|
4
|
+
import { legendPanel } from '../features/legend-panel';
|
|
3
5
|
/**
|
|
4
6
|
* 스토커 적재율 게이지 표시 모드 — 런타임 선택지.
|
|
5
7
|
* value 는 엔진 canonical(2D StockerCapacityBar / 3D buildGauge 공통), label 은 표시명.
|
|
@@ -23,158 +25,7 @@ Object.defineProperty(ModelLayer.prototype, 'nature', {
|
|
|
23
25
|
label: 'vehicle-animation',
|
|
24
26
|
name: 'vehicleAnimation'
|
|
25
27
|
},
|
|
26
|
-
|
|
27
|
-
type: 'legend',
|
|
28
|
-
label: '',
|
|
29
|
-
name: 'LEGENDS',
|
|
30
|
-
property: {
|
|
31
|
-
label: 'LEGENDS'
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
type: 'select',
|
|
36
|
-
label: 'equipment-legend-name',
|
|
37
|
-
name: 'equipmentLegendName',
|
|
38
|
-
property: {
|
|
39
|
-
options: themesColorMap
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
type: 'select',
|
|
44
|
-
label: 'buffer-legend-name',
|
|
45
|
-
name: 'bufferLegendName',
|
|
46
|
-
property: {
|
|
47
|
-
options: themesColorMap
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
type: 'select',
|
|
52
|
-
label: 'agvline-legend-name',
|
|
53
|
-
name: 'agvlineLegendName',
|
|
54
|
-
property: {
|
|
55
|
-
options: themesColorMap
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
type: 'select',
|
|
60
|
-
label: 'ohtline-legend-name',
|
|
61
|
-
name: 'ohtlineLegendName',
|
|
62
|
-
property: {
|
|
63
|
-
options: themesColorMap
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
type: 'select',
|
|
68
|
-
label: 'conveyor-legend-name',
|
|
69
|
-
name: 'conveyorLegendName',
|
|
70
|
-
property: {
|
|
71
|
-
options: themesColorMap
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
type: 'select',
|
|
76
|
-
label: 'stoker-legend-name',
|
|
77
|
-
name: 'stokerLegendName',
|
|
78
|
-
property: {
|
|
79
|
-
options: themesColorMap
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
type: 'select',
|
|
84
|
-
label: 'port-legend-name',
|
|
85
|
-
name: 'portLegendName',
|
|
86
|
-
property: {
|
|
87
|
-
options: themesColorMap
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
type: 'select',
|
|
92
|
-
label: 'agv-legend-name',
|
|
93
|
-
name: 'agvLegendName',
|
|
94
|
-
property: {
|
|
95
|
-
options: themesColorMap
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
type: 'select',
|
|
100
|
-
label: 'oht-legend-name',
|
|
101
|
-
name: 'ohtLegendName',
|
|
102
|
-
property: {
|
|
103
|
-
options: themesColorMap
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
type: 'select',
|
|
108
|
-
label: 'shuttle-legend-name',
|
|
109
|
-
name: 'shuttleLegendName',
|
|
110
|
-
property: {
|
|
111
|
-
options: themesColorMap
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
type: 'select',
|
|
116
|
-
label: 'crane-legend-name',
|
|
117
|
-
name: 'craneLegendName',
|
|
118
|
-
property: {
|
|
119
|
-
options: themesColorMap
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
type: 'select',
|
|
124
|
-
label: 'port-legend-name',
|
|
125
|
-
name: 'portLegendName',
|
|
126
|
-
property: {
|
|
127
|
-
options: themesColorMap
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
type: 'select',
|
|
132
|
-
label: 'shelf-legend-name',
|
|
133
|
-
name: 'shelfLegendName',
|
|
134
|
-
property: {
|
|
135
|
-
options: themesColorMap
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
type: 'select',
|
|
140
|
-
label: 'carrier-legend-name',
|
|
141
|
-
name: 'carrierLegendName',
|
|
142
|
-
property: {
|
|
143
|
-
options: themesColorMap
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
type: 'select',
|
|
148
|
-
label: 'carrier-animation-name',
|
|
149
|
-
name: 'carrierAnimationName',
|
|
150
|
-
property: {
|
|
151
|
-
options: themesAnimationMap
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
type: 'select',
|
|
156
|
-
label: 'stocker-capacity-legend-name',
|
|
157
|
-
name: 'stockerCapacityLegendName',
|
|
158
|
-
property: {
|
|
159
|
-
options: themesColorRange
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
type: 'select',
|
|
164
|
-
label: 'zone-capacity-legend-name',
|
|
165
|
-
name: 'zoneCapacityLegendName',
|
|
166
|
-
property: {
|
|
167
|
-
options: themesColorRange
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
type: 'select',
|
|
172
|
-
label: 'battery-rate-legend-name',
|
|
173
|
-
name: 'batteryRateLegendName',
|
|
174
|
-
property: {
|
|
175
|
-
options: themesColorRange
|
|
176
|
-
}
|
|
177
|
-
},
|
|
28
|
+
...legendPanel(this),
|
|
178
29
|
{
|
|
179
30
|
type: 'legend',
|
|
180
31
|
label: '',
|
|
@@ -223,68 +74,22 @@ ModelLayer.prototype.onchange = function (after) {
|
|
|
223
74
|
});
|
|
224
75
|
}
|
|
225
76
|
}
|
|
226
|
-
/* 보드의
|
|
227
|
-
if (after &&
|
|
77
|
+
/* 보드의 범례 줄이 바뀌었다: 피규어들이 범례를 다시 고른다 (ADR-0166 결정 12 · ADR-0167 결정 20) */
|
|
78
|
+
if (after && legendRows().some(row => Object.prototype.hasOwnProperty.call(after, row.property)))
|
|
228
79
|
figureLegendSourcesChanged();
|
|
229
80
|
return _origModelLayerOnchange.call(this, after);
|
|
230
81
|
};
|
|
231
|
-
// ===
|
|
82
|
+
// === 범례 줄의 보드 속성 → 범례 (ADR-0167 결정 20) ===
|
|
232
83
|
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
// 으로 *raw string 자체를 key* — 보드 편집으로 raw 가 바뀌면 자연 무효화,
|
|
242
|
-
// 같은 raw 의 반복 lookup 은 O(1). root 가 GC 되면 cache 도 같이 GC.
|
|
243
|
-
const _legendParseCache = new WeakMap();
|
|
244
|
-
function parseLegendIfString(state, raw) {
|
|
245
|
-
if (typeof raw !== 'string')
|
|
246
|
-
return raw;
|
|
247
|
-
let cache = _legendParseCache.get(state);
|
|
248
|
-
if (!cache) {
|
|
249
|
-
cache = new Map();
|
|
250
|
-
_legendParseCache.set(state, cache);
|
|
251
|
-
}
|
|
252
|
-
if (cache.has(raw))
|
|
253
|
-
return cache.get(raw);
|
|
254
|
-
let parsed;
|
|
255
|
-
try {
|
|
256
|
-
parsed = JSON.parse(raw);
|
|
257
|
-
}
|
|
258
|
-
catch (_a) {
|
|
259
|
-
parsed = raw;
|
|
260
|
-
} // parse 실패 시 raw 보존
|
|
261
|
-
cache.set(raw, parsed);
|
|
262
|
-
return parsed;
|
|
263
|
-
}
|
|
264
|
-
function legendThemeGetter(stateKey) {
|
|
265
|
-
return function () {
|
|
266
|
-
const name = this.rootModel.state[stateKey];
|
|
267
|
-
const raw = name && this.state.style[name];
|
|
268
|
-
return parseLegendIfString(this.state, raw);
|
|
269
|
-
};
|
|
84
|
+
// 줄마다 손으로 적던 getter 대신 등록된 줄에서 만든다: 보드 속성 `<x>Name` 의 범례를 `<x>Theme` 로 읽는다
|
|
85
|
+
// (equipmentLegendName → equipmentLegendTheme, carrierAnimationName → carrierAnimationTheme). 문자열 범례는 legend-rows 가 한 번 읽는다.
|
|
86
|
+
for (const row of FMSIM_LEGEND_ROWS) {
|
|
87
|
+
Object.defineProperty(RootContainer.prototype, row.property.replace(/Name$/, 'Theme'), {
|
|
88
|
+
get: function () {
|
|
89
|
+
return boardLegendOf(this, row.property);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
270
92
|
}
|
|
271
|
-
Object.defineProperty(RootContainer.prototype, 'equipmentLegendTheme', { get: legendThemeGetter('equipmentLegendName') });
|
|
272
|
-
Object.defineProperty(RootContainer.prototype, 'bufferLegendTheme', { get: legendThemeGetter('bufferLegendName') });
|
|
273
|
-
Object.defineProperty(RootContainer.prototype, 'agvlineLegendTheme', { get: legendThemeGetter('agvlineLegendName') });
|
|
274
|
-
Object.defineProperty(RootContainer.prototype, 'ohtlineLegendTheme', { get: legendThemeGetter('ohtlineLegendName') });
|
|
275
|
-
Object.defineProperty(RootContainer.prototype, 'conveyorLegendTheme', { get: legendThemeGetter('conveyorLegendName') });
|
|
276
|
-
Object.defineProperty(RootContainer.prototype, 'stokerLegendTheme', { get: legendThemeGetter('stokerLegendName') });
|
|
277
|
-
Object.defineProperty(RootContainer.prototype, 'agvLegendTheme', { get: legendThemeGetter('agvLegendName') });
|
|
278
|
-
Object.defineProperty(RootContainer.prototype, 'ohtLegendTheme', { get: legendThemeGetter('ohtLegendName') });
|
|
279
|
-
Object.defineProperty(RootContainer.prototype, 'shuttleLegendTheme', { get: legendThemeGetter('shuttleLegendName') });
|
|
280
|
-
Object.defineProperty(RootContainer.prototype, 'craneLegendTheme', { get: legendThemeGetter('craneLegendName') });
|
|
281
|
-
Object.defineProperty(RootContainer.prototype, 'shelfLegendTheme', { get: legendThemeGetter('shelfLegendName') });
|
|
282
|
-
Object.defineProperty(RootContainer.prototype, 'portLegendTheme', { get: legendThemeGetter('portLegendName') });
|
|
283
|
-
Object.defineProperty(RootContainer.prototype, 'carrierLegendTheme', { get: legendThemeGetter('carrierLegendName') });
|
|
284
|
-
Object.defineProperty(RootContainer.prototype, 'carrierAnimationTheme', { get: legendThemeGetter('carrierAnimationName') });
|
|
285
|
-
Object.defineProperty(RootContainer.prototype, 'stockerCapacityLegendTheme', { get: legendThemeGetter('stockerCapacityLegendName') });
|
|
286
|
-
Object.defineProperty(RootContainer.prototype, 'zoneCapacityLegendTheme', { get: legendThemeGetter('zoneCapacityLegendName') });
|
|
287
|
-
Object.defineProperty(RootContainer.prototype, 'batteryRateLegendTheme', { get: legendThemeGetter('batteryRateLegendName') });
|
|
288
93
|
Object.defineProperty(RootContainer.prototype, 'vehicleAnimation', {
|
|
289
94
|
get: function () {
|
|
290
95
|
const { vehicleAnimation } = this.rootModel.state;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-container-override.js","sourceRoot":"","sources":["../../src/scene/root-container-override.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, RootContainer, figureLegendSourcesChanged } from '@hatiolab/things-scene'\nimport { themesColorMap, themesColorRange, themesAnimationMap } from '@fmsim/api'\nimport { Legend } from '../features/mcs-status-default'\n\n// RootContainer 클래스 타입 확장\ndeclare module '@hatiolab/things-scene' {\n interface RootContainer {\n portLegendTheme?: any\n carrierLegendTheme?: any\n carrierAnimationTheme?: any\n stockerCapacityLegendTheme?: any\n zoneCapacityLegendTheme?: any\n batteryRateLegendTheme?: any\n bufferLegendTheme?: any\n agvlineLegendTheme?: any\n ohtlineLegendTheme?: any\n conveyorLegendTheme?: any\n stokerLegendTheme?: any\n agvLegendTheme?: any\n ohtLegendTheme?: any\n shuttleLegendTheme?: any\n craneLegendTheme?: any\n shelfLegendTheme?: any\n equipmentLegendTheme?: any\n style: any\n vehicleAnimation?: boolean\n // 스토커 게이지 표시 모드 — 런타임 전용 transient (모델 비저장, 항상 'capacity' 시작)\n stockerGaugeMode: string\n _stockerGaugeMode?: string\n _refreshStockerGauges(): void\n // 캐시 관련 속성 추가\n _animationConfigCache?: Map<string, any>\n }\n}\n\n/**\n * 스토커 적재율 게이지 표시 모드 — 런타임 선택지.\n * value 는 엔진 canonical(2D StockerCapacityBar / 3D buildGauge 공통), label 은 표시명.\n * 런타임 UI(뷰어 컨트롤)가 이 목록으로 selector 를 구성한다.\n */\nexport const STOCKER_GAUGE_MODES: { value: string; label: string }[] = [\n { value: 'capacity', label: 'Capacity' },\n { value: 'carrier', label: 'Carrier Status' },\n { value: 'abnormal', label: 'Abnormal Carrier' }\n]\n\nconst ModelLayer = (Component as any).register('model-layer') as any\n\nObject.defineProperty(ModelLayer.prototype, 'nature', {\n get: function () {\n return {\n mutable: false,\n rotatable: false,\n resizable: true,\n properties: [\n {\n type: 'boolean',\n label: 'vehicle-animation',\n name: 'vehicleAnimation'\n },\n {\n type: 'legend',\n label: '',\n name: 'LEGENDS',\n property: {\n label: 'LEGENDS'\n }\n },\n {\n type: 'select',\n label: 'equipment-legend-name',\n name: 'equipmentLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'buffer-legend-name',\n name: 'bufferLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'agvline-legend-name',\n name: 'agvlineLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'ohtline-legend-name',\n name: 'ohtlineLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'conveyor-legend-name',\n name: 'conveyorLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'stoker-legend-name',\n name: 'stokerLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'port-legend-name',\n name: 'portLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'agv-legend-name',\n name: 'agvLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'oht-legend-name',\n name: 'ohtLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'shuttle-legend-name',\n name: 'shuttleLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'crane-legend-name',\n name: 'craneLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'port-legend-name',\n name: 'portLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'shelf-legend-name',\n name: 'shelfLegendName',\n property: {\n options: themesColorMap\n }\n },\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 type: 'select',\n label: 'stocker-capacity-legend-name',\n name: 'stockerCapacityLegendName',\n property: {\n options: themesColorRange\n }\n },\n {\n type: 'select',\n label: 'zone-capacity-legend-name',\n name: 'zoneCapacityLegendName',\n property: {\n options: themesColorRange\n }\n },\n {\n type: 'select',\n label: 'battery-rate-legend-name',\n name: 'batteryRateLegendName',\n property: {\n options: themesColorRange\n }\n },\n {\n type: 'legend',\n label: '',\n name: 'MOOD',\n requires3d: true,\n property: {\n label: 'MOOD'\n }\n },\n {\n type: 'select',\n label: 'light-preset',\n name: 'lightPreset',\n requires3d: true,\n property: {\n options: ['dark', 'medium', 'bright']\n }\n }\n ],\n 'value-property': 'text'\n }\n }\n})\n\n/**\n * 조명 프리셋 — 3 단계 밝기 토글.\n *\n * fmsim 은 디테일 조명 옵션 UI 를 노출하지 않으므로 단일 select 로 단순화.\n * medium = things-scene 의 현재 default 값과 동일 (외관 변화 없음).\n * 사용자가 select 변경 시 onchange 가 exposure + hemiIntensity + dirLightIntensity\n * 를 일괄 set → three-capability 의 변경 감지 핸들러가 즉시 갱신.\n */\nconst LIGHT_PRESETS: Record<string, { exposure: number; hemiIntensity: number; dirLightIntensity: number }> = {\n dark: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 0.6 },\n medium: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 2.0 },\n bright: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 5.0 }\n}\n\nconst _origModelLayerOnchange = ModelLayer.prototype.onchange\nModelLayer.prototype.onchange = function (after: any) {\n if (after && Object.prototype.hasOwnProperty.call(after, 'lightPreset')) {\n const preset = LIGHT_PRESETS[after.lightPreset as string]\n if (preset) {\n this.set({\n exposure: preset.exposure,\n hemiIntensity: preset.hemiIntensity,\n dirLightIntensity: preset.dirLightIntensity\n })\n }\n }\n /* 보드의 Carrier 범례가 바뀌었다: Carrier 피규어들이 범례를 다시 고른다 (ADR-0166 결정 12) */\n if (after && ['carrierLegendName', 'carrierAnimationName'].some(k => Object.prototype.hasOwnProperty.call(after, k))) figureLegendSourcesChanged()\n return _origModelLayerOnchange.call(this, after)\n}\n\n// === LegendTheme / AnimationTheme value resolve ===\n//\n// rootModel.state.style[name] 에 저장된 legend/animation 값은 보드 직렬화\n// 형태에 따라 (a) 정상 object 또는 (b) JSON 문자열 둘 다로 나타난다 (2026-06-09\n// 진단 — consumer 인 carrier.ts:animationPreset 이 같은 이유로 typeof string\n// 분기 + JSON5.parse 처리하는 선례 존재). LegendTheme getter 들이 이 분기를\n// 두지 않아 string 통과 → 구간 조회 매칭 실패 → 3D gauge 의 색상이\n// fallback 으로만 결정되던 증상.\n//\n// fix 는 getter 한 곳에서 lazy parse. WeakMap<state, Map<rawString, parsed>>\n// 으로 *raw string 자체를 key* — 보드 편집으로 raw 가 바뀌면 자연 무효화,\n// 같은 raw 의 반복 lookup 은 O(1). root 가 GC 되면 cache 도 같이 GC.\nconst _legendParseCache = new WeakMap<object, Map<string, any>>()\n\nfunction parseLegendIfString(state: any, raw: any): any {\n if (typeof raw !== 'string') return raw\n let cache = _legendParseCache.get(state)\n if (!cache) {\n cache = new Map()\n _legendParseCache.set(state, cache)\n }\n if (cache.has(raw)) return cache.get(raw)\n let parsed: any\n try { parsed = JSON.parse(raw) } catch { parsed = raw } // parse 실패 시 raw 보존\n cache.set(raw, parsed)\n return parsed\n}\n\nfunction legendThemeGetter(stateKey: string) {\n return function (this: any) {\n const name = this.rootModel.state[stateKey]\n const raw = name && this.state.style[name]\n return parseLegendIfString(this.state, raw)\n }\n}\n\nObject.defineProperty(RootContainer.prototype, 'equipmentLegendTheme', { get: legendThemeGetter('equipmentLegendName') })\nObject.defineProperty(RootContainer.prototype, 'bufferLegendTheme', { get: legendThemeGetter('bufferLegendName') })\nObject.defineProperty(RootContainer.prototype, 'agvlineLegendTheme', { get: legendThemeGetter('agvlineLegendName') })\nObject.defineProperty(RootContainer.prototype, 'ohtlineLegendTheme', { get: legendThemeGetter('ohtlineLegendName') })\nObject.defineProperty(RootContainer.prototype, 'conveyorLegendTheme', { get: legendThemeGetter('conveyorLegendName') })\nObject.defineProperty(RootContainer.prototype, 'stokerLegendTheme', { get: legendThemeGetter('stokerLegendName') })\nObject.defineProperty(RootContainer.prototype, 'agvLegendTheme', { get: legendThemeGetter('agvLegendName') })\nObject.defineProperty(RootContainer.prototype, 'ohtLegendTheme', { get: legendThemeGetter('ohtLegendName') })\nObject.defineProperty(RootContainer.prototype, 'shuttleLegendTheme', { get: legendThemeGetter('shuttleLegendName') })\nObject.defineProperty(RootContainer.prototype, 'craneLegendTheme', { get: legendThemeGetter('craneLegendName') })\nObject.defineProperty(RootContainer.prototype, 'shelfLegendTheme', { get: legendThemeGetter('shelfLegendName') })\nObject.defineProperty(RootContainer.prototype, 'portLegendTheme', { get: legendThemeGetter('portLegendName') })\nObject.defineProperty(RootContainer.prototype, 'carrierLegendTheme', { get: legendThemeGetter('carrierLegendName') })\nObject.defineProperty(RootContainer.prototype, 'carrierAnimationTheme', { get: legendThemeGetter('carrierAnimationName') })\nObject.defineProperty(RootContainer.prototype, 'stockerCapacityLegendTheme', { get: legendThemeGetter('stockerCapacityLegendName') })\nObject.defineProperty(RootContainer.prototype, 'zoneCapacityLegendTheme', { get: legendThemeGetter('zoneCapacityLegendName') })\nObject.defineProperty(RootContainer.prototype, 'batteryRateLegendTheme', { get: legendThemeGetter('batteryRateLegendName') })\n\nObject.defineProperty(RootContainer.prototype, 'vehicleAnimation', {\n get: function () {\n const { vehicleAnimation } = this.rootModel.state\n return !!vehicleAnimation\n }\n})\n\n// === 스토커 게이지 표시 모드 (런타임 전용 transient) ===\n//\n// 모델(state)에 저장하지 않는다 — nature 속성이 아니므로 보드 직렬화에 포함되지 않고,\n// 보드를 다시 열면 항상 기본값 'capacity' 로 시작한다. 실행 중 뷰어 컨트롤 등이\n// `scene.rootContainer.stockerGaugeMode = 'carrier'` 로 동적 변경한다.\n// (주의: scene.root 은 model_layer 라 override 가 없다. 반드시 rootContainer 에 설정.\n// 컴포넌트의 this.root 는 RootContainer(isRoot)로 해석되어 이 값을 읽는다.)\n//\n// 2D(StockerCapacityBar.gaugeMode) 와 3D(machine-3d buildGauge) 가 모두 이 값을 읽어\n// 게이지 표현이 항상 일치한다. 값이 바뀌면 setter 가 2D 리드로우 + 3D 게이지 재빌드를\n// 즉시 트리거한다.\nObject.defineProperty(RootContainer.prototype, 'stockerGaugeMode', {\n get: function () {\n return this._stockerGaugeMode || 'capacity'\n },\n set: function (mode: string) {\n const next = mode || 'capacity'\n if (this._stockerGaugeMode === next) return\n this._stockerGaugeMode = next\n this._refreshStockerGauges()\n }\n})\n\n/** scene 하위 STOCKER(3D 게이지) + StockerCapacityBar(2D 게이지) 를 새 모드로 갱신. */\nRootContainer.prototype._refreshStockerGauges = function () {\n const walk = (container: any) => {\n const kids = container?.components\n if (!Array.isArray(kids)) return\n for (const c of kids) {\n const type = c?.state?.type\n if (type === 'STOCKER') {\n // 3D 게이지는 스토커 자신의 real-object 가 그린다 → 재빌드 (2D 모드면 _realObject 없음)\n c._realObject?.update?.()\n } else if (type === 'StockerCapacityBar' || type === 'MCSGaugeCapacityBar' || type === 'ZoneCapacityBar') {\n // 2D 게이지(스토커·존)는 자식 컴포넌트가 그린다 → 리드로우.\n // 존 게이지도 스토커 게이지와 같은 stockerGaugeMode 스위치로 함께 전환된다.\n c.invalidate?.()\n }\n walk(c)\n }\n }\n walk(this)\n this.invalidate?.()\n}\n"]}
|
|
1
|
+
{"version":3,"file":"root-container-override.js","sourceRoot":"","sources":["../../src/scene/root-container-override.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, RootContainer, figureLegendSourcesChanged } from '@hatiolab/things-scene'\nimport { FMSIM_LEGEND_ROWS, legendRows } from '@fmsim/figure-capabilities'\nimport { boardLegendOf } from '../features/legend-rows'\nimport { legendPanel } from '../features/legend-panel'\n\n// RootContainer 클래스 타입 확장\ndeclare module '@hatiolab/things-scene' {\n interface RootContainer {\n portLegendTheme?: any\n carrierLegendTheme?: any\n carrierAnimationTheme?: any\n stockerCapacityLegendTheme?: any\n zoneCapacityLegendTheme?: any\n batteryRateLegendTheme?: any\n bufferLegendTheme?: any\n agvlineLegendTheme?: any\n ohtlineLegendTheme?: any\n conveyorLegendTheme?: any\n stokerLegendTheme?: any\n agvLegendTheme?: any\n ohtLegendTheme?: any\n shuttleLegendTheme?: any\n craneLegendTheme?: any\n shelfLegendTheme?: any\n equipmentLegendTheme?: any\n style: any\n vehicleAnimation?: boolean\n // 스토커 게이지 표시 모드 — 런타임 전용 transient (모델 비저장, 항상 'capacity' 시작)\n stockerGaugeMode: string\n _stockerGaugeMode?: string\n _refreshStockerGauges(): void\n // 캐시 관련 속성 추가\n _animationConfigCache?: Map<string, any>\n }\n}\n\n/**\n * 스토커 적재율 게이지 표시 모드 — 런타임 선택지.\n * value 는 엔진 canonical(2D StockerCapacityBar / 3D buildGauge 공통), label 은 표시명.\n * 런타임 UI(뷰어 컨트롤)가 이 목록으로 selector 를 구성한다.\n */\nexport const STOCKER_GAUGE_MODES: { value: string; label: string }[] = [\n { value: 'capacity', label: 'Capacity' },\n { value: 'carrier', label: 'Carrier Status' },\n { value: 'abnormal', label: 'Abnormal Carrier' }\n]\n\nconst ModelLayer = (Component as any).register('model-layer') as any\n\nObject.defineProperty(ModelLayer.prototype, 'nature', {\n get: function () {\n return {\n mutable: false,\n rotatable: false,\n resizable: true,\n properties: [\n {\n type: 'boolean',\n label: 'vehicle-animation',\n name: 'vehicleAnimation'\n },\n ...legendPanel(this),\n {\n type: 'legend',\n label: '',\n name: 'MOOD',\n requires3d: true,\n property: {\n label: 'MOOD'\n }\n },\n {\n type: 'select',\n label: 'light-preset',\n name: 'lightPreset',\n requires3d: true,\n property: {\n options: ['dark', 'medium', 'bright']\n }\n }\n ],\n 'value-property': 'text'\n }\n }\n})\n\n/**\n * 조명 프리셋 — 3 단계 밝기 토글.\n *\n * fmsim 은 디테일 조명 옵션 UI 를 노출하지 않으므로 단일 select 로 단순화.\n * medium = things-scene 의 현재 default 값과 동일 (외관 변화 없음).\n * 사용자가 select 변경 시 onchange 가 exposure + hemiIntensity + dirLightIntensity\n * 를 일괄 set → three-capability 의 변경 감지 핸들러가 즉시 갱신.\n */\nconst LIGHT_PRESETS: Record<string, { exposure: number; hemiIntensity: number; dirLightIntensity: number }> = {\n dark: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 0.6 },\n medium: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 2.0 },\n bright: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 5.0 }\n}\n\nconst _origModelLayerOnchange = ModelLayer.prototype.onchange\nModelLayer.prototype.onchange = function (after: any) {\n if (after && Object.prototype.hasOwnProperty.call(after, 'lightPreset')) {\n const preset = LIGHT_PRESETS[after.lightPreset as string]\n if (preset) {\n this.set({\n exposure: preset.exposure,\n hemiIntensity: preset.hemiIntensity,\n dirLightIntensity: preset.dirLightIntensity\n })\n }\n }\n /* 보드의 범례 줄이 바뀌었다: 피규어들이 범례를 다시 고른다 (ADR-0166 결정 12 · ADR-0167 결정 20) */\n if (after && legendRows().some(row => Object.prototype.hasOwnProperty.call(after, row.property))) figureLegendSourcesChanged()\n return _origModelLayerOnchange.call(this, after)\n}\n\n// === 범례 줄의 보드 속성 → 범례 (ADR-0167 결정 20) ===\n//\n// 줄마다 손으로 적던 getter 대신 등록된 줄에서 만든다: 보드 속성 `<x>Name` 의 범례를 `<x>Theme` 로 읽는다\n// (equipmentLegendName → equipmentLegendTheme, carrierAnimationName → carrierAnimationTheme). 문자열 범례는 legend-rows 가 한 번 읽는다.\nfor (const row of FMSIM_LEGEND_ROWS) {\n Object.defineProperty(RootContainer.prototype, row.property.replace(/Name$/, 'Theme'), {\n get: function (this: any) {\n return boardLegendOf(this, row.property)\n }\n })\n}\n\nObject.defineProperty(RootContainer.prototype, 'vehicleAnimation', {\n get: function () {\n const { vehicleAnimation } = this.rootModel.state\n return !!vehicleAnimation\n }\n})\n\n// === 스토커 게이지 표시 모드 (런타임 전용 transient) ===\n//\n// 모델(state)에 저장하지 않는다 — nature 속성이 아니므로 보드 직렬화에 포함되지 않고,\n// 보드를 다시 열면 항상 기본값 'capacity' 로 시작한다. 실행 중 뷰어 컨트롤 등이\n// `scene.rootContainer.stockerGaugeMode = 'carrier'` 로 동적 변경한다.\n// (주의: scene.root 은 model_layer 라 override 가 없다. 반드시 rootContainer 에 설정.\n// 컴포넌트의 this.root 는 RootContainer(isRoot)로 해석되어 이 값을 읽는다.)\n//\n// 2D(StockerCapacityBar.gaugeMode) 와 3D(machine-3d buildGauge) 가 모두 이 값을 읽어\n// 게이지 표현이 항상 일치한다. 값이 바뀌면 setter 가 2D 리드로우 + 3D 게이지 재빌드를\n// 즉시 트리거한다.\nObject.defineProperty(RootContainer.prototype, 'stockerGaugeMode', {\n get: function () {\n return this._stockerGaugeMode || 'capacity'\n },\n set: function (mode: string) {\n const next = mode || 'capacity'\n if (this._stockerGaugeMode === next) return\n this._stockerGaugeMode = next\n this._refreshStockerGauges()\n }\n})\n\n/** scene 하위 STOCKER(3D 게이지) + StockerCapacityBar(2D 게이지) 를 새 모드로 갱신. */\nRootContainer.prototype._refreshStockerGauges = function () {\n const walk = (container: any) => {\n const kids = container?.components\n if (!Array.isArray(kids)) return\n for (const c of kids) {\n const type = c?.state?.type\n if (type === 'STOCKER') {\n // 3D 게이지는 스토커 자신의 real-object 가 그린다 → 재빌드 (2D 모드면 _realObject 없음)\n c._realObject?.update?.()\n } else if (type === 'StockerCapacityBar' || type === 'MCSGaugeCapacityBar' || type === 'ZoneCapacityBar') {\n // 2D 게이지(스토커·존)는 자식 컴포넌트가 그린다 → 리드로우.\n // 존 게이지도 스토커 게이지와 같은 stockerGaugeMode 스위치로 함께 전환된다.\n c.invalidate?.()\n }\n walk(c)\n }\n }\n walk(this)\n this.invalidate?.()\n}\n"]}
|
package/dist/shelf.js
CHANGED
|
@@ -23,8 +23,8 @@ let Shelf = class Shelf extends MCSZoneMixin(MCSCarrierHolder) {
|
|
|
23
23
|
get parentObjectTypes() {
|
|
24
24
|
return ['STOCKER'];
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
return
|
|
26
|
+
get statusLegendRow() {
|
|
27
|
+
return 'shelf';
|
|
28
28
|
}
|
|
29
29
|
render(ctx) {
|
|
30
30
|
var { left, top, width, height } = this.bounds;
|
package/dist/shelf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shelf.js","sourceRoot":"","sources":["../src/shelf.ts"],"names":[],"mappings":";AAAA,OAAO,EAA8B,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,gBAAgB,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAEhF,MAAM,MAAM,GAAoB;IAC9B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,CAAC,GAAG,sBAAsB,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC;CACxE,CAAA;AAGc,IAAM,KAAK,GAAX,MAAM,KAAM,SAAQ,YAAY,CAAC,gBAAgB,CAAC;IAC/D,MAAM,KAAK,MAAM;QACf,OAAO,MAAM,CAAA;IACf,CAAC;IAED,sDAAsD;IACtD,IAAI,WAAW;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,sCAAsC;IACtC,IAAI,iBAAiB;QACnB,OAAO,CAAC,SAAS,CAAC,CAAA;IACpB,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"shelf.js","sourceRoot":"","sources":["../src/shelf.ts"],"names":[],"mappings":";AAAA,OAAO,EAA8B,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,gBAAgB,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAEhF,MAAM,MAAM,GAAoB;IAC9B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,CAAC,GAAG,sBAAsB,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC;CACxE,CAAA;AAGc,IAAM,KAAK,GAAX,MAAM,KAAM,SAAQ,YAAY,CAAC,gBAAgB,CAAC;IAC/D,MAAM,KAAK,MAAM;QACf,OAAO,MAAM,CAAA;IACf,CAAC;IAED,sDAAsD;IACtD,IAAI,WAAW;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,sCAAsC;IACtC,IAAI,iBAAiB;QACnB,OAAO,CAAC,SAAS,CAAC,CAAA;IACpB,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,CAAC,GAA6B;QAClC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAE9C,GAAG,CAAC,IAAI,EAAE,CAAA;QAEV,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACxB,GAAG,CAAC,SAAS,EAAE,CAAA;QAEf,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC/B,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,WAAY,CAAA;QACjC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAA;QACjB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAA;QACrB,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QAEnB,oBAAoB;QACpB,2DAA2D;QAC3D,6CAA6C;QAC7C,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAE7B,GAAG,CAAC,IAAI,EAAE,CAAA;QAEV,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAChB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACzB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACrB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAEpB,GAAG,CAAC,IAAI,EAAE,CAAA;QACV,GAAG,CAAC,MAAM,EAAE,CAAA;QAEZ,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;QAC1B,GAAG,CAAC,OAAO,EAAE,CAAA;IACf,CAAC;CACF,CAAA;AAvDoB,KAAK;IADzB,cAAc,CAAC,OAAO,CAAC;GACH,KAAK,CAuDzB;eAvDoB,KAAK","sourcesContent":["import { Component, ComponentNature, sceneComponent } from '@hatiolab/things-scene'\nimport MCSCarrierHolder from './mcs-carrier-holder'\nimport { MCSZoneMixin, MCSZoneMixinProperties } from './features/mcs-zone-mixin'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [...MCSZoneMixinProperties, ...MCSCarrierHolder.properties]\n}\n\n@sceneComponent('Shelf')\nexport default class Shelf extends MCSZoneMixin(MCSCarrierHolder) {\n static get nature() {\n return NATURE\n }\n\n /** Carriers stand at the Shelf's bottom (fmsim v2) */\n get carrierRest(): { height: number; mount: 'ON' | 'HANG' } {\n return { height: 0, mount: 'ON' }\n }\n\n get auxColor() {\n return 'black'\n }\n\n /** Shelf 의 parentObject 는 STOCKER. */\n get parentObjectTypes(): string[] {\n return ['STOCKER']\n }\n\n get statusLegendRow(): string {\n return 'shelf'\n }\n\n render(ctx: CanvasRenderingContext2D) {\n var { left, top, width, height } = this.bounds\n\n ctx.save()\n\n ctx.translate(left, top)\n ctx.beginPath()\n\n ctx.strokeStyle = this.auxColor\n ctx.fillStyle = this.statusColor!\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.setLineDash([])\n\n // Performance aware\n // const radius = Math.round(Math.min(width, height) * 0.1)\n // ctx.roundRect(0, 0, width, height, radius)\n ctx.rect(0, 0, width, height)\n\n ctx.clip()\n\n ctx.moveTo(0, 0)\n ctx.lineTo(width, height)\n ctx.moveTo(0, height)\n ctx.lineTo(width, 0)\n\n ctx.fill()\n ctx.stroke()\n\n ctx.translate(-left, -top)\n ctx.restore()\n }\n}\n"]}
|
package/dist/shuttle.js
CHANGED
|
@@ -19,8 +19,8 @@ let Shuttle = class Shuttle extends MCSVehicle {
|
|
|
19
19
|
get auxColor() {
|
|
20
20
|
return 'black';
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
return
|
|
22
|
+
get statusLegendRow() {
|
|
23
|
+
return 'shuttle';
|
|
24
24
|
}
|
|
25
25
|
render(ctx) {
|
|
26
26
|
var { left, top, width, height } = this.bounds;
|
package/dist/shuttle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shuttle.js","sourceRoot":"","sources":["../src/shuttle.ts"],"names":[],"mappings":";AAAA,OAAO,EAA8B,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,UAAU,MAAM,eAAe,CAAA;AAEtC,MAAM,MAAM,GAAoB;IAC9B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC;CACvC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,CAAA;AAEJ,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,UAAU;IAC7C,MAAM,KAAK,MAAM;QACf,OAAO,MAAM,CAAA;IACf,CAAC;IAED,wDAAwD;IACxD,IAAI,WAAW;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"shuttle.js","sourceRoot":"","sources":["../src/shuttle.ts"],"names":[],"mappings":";AAAA,OAAO,EAA8B,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,UAAU,MAAM,eAAe,CAAA;AAEtC,MAAM,MAAM,GAAoB;IAC9B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC;CACvC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,CAAA;AAEJ,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,UAAU;IAC7C,MAAM,KAAK,MAAM;QACf,OAAO,MAAM,CAAA;IACf,CAAC;IAED,wDAAwD;IACxD,IAAI,WAAW;QACb,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,GAA6B;QAClC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAE9C,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAExB,qBAAqB;QACrB,GAAG,CAAC,SAAS,EAAE,CAAA;QAEf,GAAG,CAAC,WAAW,GAAG,OAAO,CAAA;QACzB,GAAG,CAAC,SAAS,GAAG,SAAS,GAAG,CAAC,CAAA;QAE7B,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAChB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACrB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACpB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACzB,GAAG,CAAC,MAAM,EAAE,CAAA;QAEZ,YAAY;QACZ,GAAG,CAAC,SAAS,EAAE,CAAA;QAEf,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,QAAS,CAAA;QAChC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,WAAY,CAAA;QACjC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAA;QACjB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAA;QACrB,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QAEnB,oBAAoB;QACpB,2DAA2D;QAE3D,6FAA6F;QAC7F,aAAa;QAEb,kBAAkB;QAClB,wDAAwD;QACxD,qEAAqE;QAErE,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;QAC7E,GAAG,CAAC,IAAI,EAAE,CAAA;QAEV,GAAG,CAAC,SAAS,EAAE,CAAA;QACf,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QACxC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QAErD,GAAG,CAAC,IAAI,EAAE,CAAA;QACV,GAAG,CAAC,MAAM,EAAE,CAAA;QAEZ,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;QAE1B,oBAAoB;QACpB,4BAA4B;IAC9B,CAAC;CACF,CAAA;AArEoB,OAAO;IAD3B,cAAc,CAAC,SAAS,CAAC;GACL,OAAO,CAqE3B;eArEoB,OAAO","sourcesContent":["import { Component, ComponentNature, sceneComponent } from '@hatiolab/things-scene'\nimport MCSVehicle from './mcs-vehicle'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [...MCSVehicle.properties]\n}\n\nconst RAILWIDTH = 2\n@sceneComponent('Shuttle')\nexport default class Shuttle extends MCSVehicle {\n static get nature() {\n return NATURE\n }\n\n /** Carriers stand at the Shuttle's bottom (fmsim v2) */\n get carrierRest(): { height: number; mount: 'ON' | 'HANG' } {\n return { height: 0, mount: 'ON' }\n }\n\n get auxColor() {\n return 'black'\n }\n\n get statusLegendRow(): string {\n return 'shuttle'\n }\n\n render(ctx: CanvasRenderingContext2D) {\n var { left, top, width, height } = this.bounds\n\n ctx.translate(left, top)\n\n // draw rail metapore\n ctx.beginPath()\n\n ctx.strokeStyle = 'black'\n ctx.lineWidth = RAILWIDTH * 2\n\n ctx.moveTo(0, 0)\n ctx.lineTo(0, height)\n ctx.moveTo(width, 0)\n ctx.lineTo(width, height)\n ctx.stroke()\n\n // draw body\n ctx.beginPath()\n\n ctx.strokeStyle = this.auxColor!\n ctx.fillStyle = this.statusColor!\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.setLineDash([])\n\n // Performance aware\n // const radius = Math.round(Math.min(width, height) * 0.1)\n\n // ctx.roundRect(RAILWIDTH / 2, RAILWIDTH / 2, width - RAILWIDTH, height - RAILWIDTH, radius)\n // ctx.fill()\n\n // ctx.beginPath()\n // ctx.roundRect(0, RAILWIDTH, width, RAILWIDTH, radius)\n // ctx.roundRect(0, height - RAILWIDTH * 2, width, RAILWIDTH, radius)\n\n ctx.rect(RAILWIDTH / 2, RAILWIDTH / 2, width - RAILWIDTH, height - RAILWIDTH)\n ctx.fill()\n\n ctx.beginPath()\n ctx.rect(0, RAILWIDTH, width, RAILWIDTH)\n ctx.rect(0, height - RAILWIDTH * 2, width, RAILWIDTH)\n\n ctx.fill()\n ctx.stroke()\n\n ctx.translate(-left, -top)\n\n // Performance aware\n // this.renderDirection(ctx)\n }\n}\n"]}
|
package/dist/stocker.js
CHANGED
|
@@ -56,8 +56,8 @@ let Stocker = class Stocker extends MCSTransport {
|
|
|
56
56
|
static get nature() {
|
|
57
57
|
return NATURE;
|
|
58
58
|
}
|
|
59
|
-
|
|
60
|
-
return
|
|
59
|
+
get statusLegendRow() {
|
|
60
|
+
return 'stocker';
|
|
61
61
|
}
|
|
62
62
|
containable(component) {
|
|
63
63
|
return (super.containable(component) ||
|
package/dist/stocker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stocker.js","sourceRoot":"","sources":["../src/stocker.ts"],"names":[],"mappings":";AAAA,OAAO,EAA0C,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC/F,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAE1C,MAAM,MAAM,GAAoB;IAC9B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE;QACV,GAAG,YAAY,CAAC,UAAU;QAC1B;;;sEAG8D;QAC9D;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP,EAAE,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC5C,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;oBACpC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACvC;aACF;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,cAAc;SACrB;QACD;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,cAAc;SACrB;KACF;CACF,CAAA;AAED,mEAAmE;AAEnE,wCAAwC;AACxC,oBAAoB;AACpB,wCAAwC;AACxC,cAAc;AACd,0CAA0C;AAC1C,sCAAsC;AACtC,6DAA6D;AAC7D,wBAAwB;AACxB,wGAAwG;AACxG,0EAA0E;AAC1E,QAAQ;AACR,8CAA8C;AAC9C,wBAAwB;AACxB,MAAM;AACN,uBAAuB;AACvB,IAAI;AAGW,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,YAAY;IAC/C,MAAM,KAAK,MAAM;QACf,OAAO,MAAM,CAAA;IACf,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"stocker.js","sourceRoot":"","sources":["../src/stocker.ts"],"names":[],"mappings":";AAAA,OAAO,EAA0C,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC/F,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAE1C,MAAM,MAAM,GAAoB;IAC9B,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE;QACV,GAAG,YAAY,CAAC,UAAU;QAC1B;;;sEAG8D;QAC9D;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP,EAAE,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC5C,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;oBACpC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACvC;aACF;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,cAAc;SACrB;QACD;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,cAAc;SACrB;KACF;CACF,CAAA;AAED,mEAAmE;AAEnE,wCAAwC;AACxC,oBAAoB;AACpB,wCAAwC;AACxC,cAAc;AACd,0CAA0C;AAC1C,sCAAsC;AACtC,6DAA6D;AAC7D,wBAAwB;AACxB,wGAAwG;AACxG,0EAA0E;AAC1E,QAAQ;AACR,8CAA8C;AAC9C,wBAAwB;AACxB,MAAM;AACN,uBAAuB;AACvB,IAAI;AAGW,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,YAAY;IAC/C,MAAM,KAAK,MAAM;QACf,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,WAAW,CAAC,SAAoB;QAC9B,OAAO,CACL,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC;YAC5B,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CACzJ,SAAS,CAAC,KAAK,CAAC,IAAI,CACrB,CACF,CAAA;IACH,CAAC;IAED,YAAY,CAAC,KAA0B,EAAE,MAA2B;QAClE;;;;0EAIkE;QAClE,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAEjC,kEAAkE;QAClE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACrH,CAAC;CACF,CAAA;AA7BoB,OAAO;IAD3B,cAAc,CAAC,SAAS,CAAC;GACL,OAAO,CA6B3B;eA7BoB,OAAO","sourcesContent":["import { Component, ComponentNature, Properties, sceneComponent } from '@hatiolab/things-scene'\nimport MCSTransport from './mcs-transport'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n ...MCSTransport.properties,\n /* 이 스토커의 *내부 좌표계* 규약 — 외부 시스템이 보내는 X/Y 를 footprint 의 어느\n * 축·어느 방향에 대응시킬지 정한다(크레인 위치 데이터 CRANEPOSITION 등이 이를 따른다).\n * 미설정이면 종전 폴백(긴 변 = X축, 원점 = 좌상단). 모두 *로컬 프레임* 기준이라\n * 스토커 회전(rotation)과는 무관하다. Z(높이)는 바닥 기준이 물리적으로 고정이라 설정 없음. */\n {\n type: 'select',\n label: 'coord-axis-x',\n name: 'coordAxisX',\n property: {\n options: [\n { display: 'auto (longer side)', value: '' },\n { display: 'width', value: 'width' },\n { display: 'height', value: 'height' }\n ]\n }\n },\n {\n type: 'checkbox',\n label: 'coord-invert-x',\n name: 'coordInvertX'\n },\n {\n type: 'checkbox',\n label: 'coord-invert-y',\n name: 'coordInvertY'\n }\n ]\n}\n\n// const capacity = { ko: 'Capacity', en: 'Capacity', zh_CN: '容量' }\n\n// export function getLocaleLanguage() {\n// let localeValue\n// let nameOfCookie = 'miipLang' + '='\n// let x = 0\n// while (x <= document.cookie.length) {\n// let y = x + nameOfCookie.length\n// if (document.cookie.substring(x, y) == nameOfCookie) {\n// let endOfCookie\n// if ((endOfCookie = document.cookie.indexOf(';', y)) == -1) endOfCookie = document.cookie.length\n// localeValue = unescape(document.cookie.substring(y, endOfCookie))\n// }\n// x = document.cookie.indexOf(' ', x) + 1\n// if (x == 0) break\n// }\n// return localeValue\n// }\n\n@sceneComponent('STOCKER')\nexport default class Stocker extends MCSTransport {\n static get nature() {\n return NATURE\n }\n\n get statusLegendRow(): string {\n return 'stocker'\n }\n\n containable(component: Component) {\n return (\n super.containable(component) ||\n ['Crane', 'CraneRail', 'Shelf', 'Port', 'MCSGaugeCapacityBar', 'StockerCapacityBar', 'StockerCarrierBar', 'StockerAbnormalBar', 'ZoneCapacityBar'].includes(\n component.state.type\n )\n )\n }\n\n onchangeData(after: Record<string, any>, before: Record<string, any>): void {\n /* MCSStatusMixin.onchangeData 의 statusColor → state.fillStyle 동기화 로직을\n * 호출. 3D 경로에서는 mesh material 의 color 가 build 시점 한 번 결정되므로\n * 데이터 변경 시 fillStyle 이 갱신되어야 MCSRealObject3D.onchange 의\n * 'fillStyle in after' 분기를 타고 mesh rebuild 가 발생한다.\n * (2D 는 render() 가 매 프레임 statusColor getter 를 직접 사용하므로 영향 없음.) */\n super.onchangeData(after, before)\n\n /* non-identifiable component 즉, StockerCapacityBar 에게 데이터를 전달함 */\n this.components.filter(component => !component.isIdentifiable()).forEach(component => (component.data = this.data))\n }\n}\n"]}
|