@fmsim/machine 2.0.0-beta.10 → 2.0.0-beta.101
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.js +6 -2
- package/dist/agv.js.map +1 -1
- package/dist/carrier-manager.js +183 -0
- package/dist/carrier-manager.js.map +1 -0
- package/dist/carrier.js +99 -9
- package/dist/carrier.js.map +1 -1
- package/dist/conveyor-join.js +8 -2
- package/dist/conveyor-join.js.map +1 -1
- package/dist/conveyor.js +8 -0
- package/dist/conveyor.js.map +1 -1
- package/dist/crane.js +144 -1
- package/dist/crane.js.map +1 -1
- package/dist/factories/agv-3d.js +17 -36
- package/dist/factories/agv-3d.js.map +1 -1
- package/dist/factories/conveyor-3d.js +179 -100
- package/dist/factories/conveyor-3d.js.map +1 -1
- package/dist/factories/crane-3d.js +56 -29
- package/dist/factories/crane-3d.js.map +1 -1
- package/dist/factories/crane-rail-3d.js +14 -18
- package/dist/factories/crane-rail-3d.js.map +1 -1
- package/dist/factories/machine-3d.js +533 -197
- package/dist/factories/machine-3d.js.map +1 -1
- package/dist/factories/oht-3d.js +29 -47
- package/dist/factories/oht-3d.js.map +1 -1
- package/dist/factories/shuttle-3d.js +13 -32
- package/dist/factories/shuttle-3d.js.map +1 -1
- package/dist/factories/z-priority-defaults.js +33 -0
- package/dist/factories/z-priority-defaults.js.map +1 -0
- package/dist/factories/z-priority.js +54 -0
- package/dist/factories/z-priority.js.map +1 -0
- package/dist/features/conveyor-mixin.js.map +1 -1
- package/dist/features/mcs-status-default.js +15 -1
- package/dist/features/mcs-status-default.js.map +1 -1
- package/dist/features/mcs-status-mixin.js +22 -0
- package/dist/features/mcs-status-mixin.js.map +1 -1
- package/dist/features/mcs-zone-mixin.js.map +1 -1
- package/dist/features/parent-object-mixin.js +15 -7
- package/dist/features/parent-object-mixin.js.map +1 -1
- package/dist/floating-container.js +5 -0
- package/dist/floating-container.js.map +1 -1
- package/dist/index.js +52 -34
- package/dist/index.js.map +1 -1
- package/dist/mcs-carrier-holder.js +56 -22
- package/dist/mcs-carrier-holder.js.map +1 -1
- package/dist/mcs-machine.js +20 -0
- package/dist/mcs-machine.js.map +1 -1
- package/dist/mcs-unit.js +17 -0
- package/dist/mcs-unit.js.map +1 -1
- package/dist/mcs-vehicle.js +8 -3
- package/dist/mcs-vehicle.js.map +1 -1
- package/dist/node.js +10 -3
- package/dist/node.js.map +1 -1
- package/dist/oht.js +4 -0
- package/dist/oht.js.map +1 -1
- package/dist/port-flow.js +4 -0
- package/dist/port-flow.js.map +1 -1
- package/dist/port.js +4 -0
- package/dist/port.js.map +1 -1
- package/dist/scanner.js +30 -0
- package/dist/scanner.js.map +1 -0
- package/dist/scene/root-container-override.js +160 -96
- package/dist/scene/root-container-override.js.map +1 -1
- package/dist/shelf.js +4 -0
- package/dist/shelf.js.map +1 -1
- package/dist/static-container.js +5 -0
- package/dist/static-container.js.map +1 -1
- package/dist/stocker-abnormal-bar.js +5 -1
- package/dist/stocker-abnormal-bar.js.map +1 -1
- package/dist/stocker-capacity-bar.js +253 -6
- package/dist/stocker-capacity-bar.js.map +1 -1
- package/dist/stocker-carrier-bar.js +5 -1
- package/dist/stocker-carrier-bar.js.map +1 -1
- package/dist/stocker.js +6 -0
- package/dist/stocker.js.map +1 -1
- package/dist/templates/backdrop.js +30 -0
- package/dist/templates/backdrop.js.map +1 -0
- package/dist/templates/decal.js +21 -0
- package/dist/templates/decal.js.map +1 -0
- package/dist/templates/index.js +7 -1
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/scanner.js +20 -0
- package/dist/templates/scanner.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/crane-position.js +83 -0
- package/dist/utils/crane-position.js.map +1 -0
- package/dist/utils/data-value.js +21 -0
- package/dist/utils/data-value.js.map +1 -0
- package/dist/utils/fit-gauge-scale.js +28 -0
- package/dist/utils/fit-gauge-scale.js.map +1 -0
- package/dist/utils/get-value-on-ranges.js +2 -4
- package/dist/utils/get-value-on-ranges.js.map +1 -1
- package/dist/utils/stocker-gauge.js +78 -0
- package/dist/utils/stocker-gauge.js.map +1 -0
- package/dist/zone-capacity-bar.js +3 -3
- package/dist/zone-capacity-bar.js.map +1 -1
- package/icons/backdrop.png +0 -0
- package/icons/decal.png +0 -0
- package/jest.config.js +10 -0
- package/package.json +4 -3
- package/src/agv.ts +7 -2
- package/src/carrier-manager.ts +223 -0
- package/src/carrier.ts +103 -10
- package/src/conveyor-join.ts +5 -2
- package/src/conveyor.ts +8 -0
- package/src/crane.ts +181 -1
- package/src/factories/agv-3d.ts +19 -36
- package/src/factories/conveyor-3d.ts +183 -103
- package/src/factories/crane-3d.ts +62 -29
- package/src/factories/crane-rail-3d.ts +17 -20
- package/src/factories/machine-3d.ts +631 -205
- package/src/factories/oht-3d.ts +30 -46
- package/src/factories/shuttle-3d.ts +14 -32
- package/src/factories/z-priority-defaults.ts +38 -0
- package/src/factories/z-priority.ts +60 -0
- package/src/features/conveyor-mixin.ts +1 -1
- package/src/features/mcs-status-default.ts +15 -1
- package/src/features/mcs-status-mixin.ts +26 -4
- package/src/features/mcs-zone-mixin.ts +1 -1
- package/src/features/parent-object-mixin.ts +17 -8
- package/src/floating-container.ts +5 -0
- package/src/index.ts +58 -34
- package/src/mcs-carrier-holder.ts +57 -34
- package/src/mcs-machine.ts +23 -0
- package/src/mcs-unit.ts +21 -1
- package/src/mcs-vehicle.ts +9 -6
- package/src/node.ts +9 -3
- package/src/oht.ts +6 -1
- package/src/port-flow.ts +5 -0
- package/src/port.ts +5 -0
- package/src/scanner.ts +29 -0
- package/src/scene/root-container-override.ts +154 -103
- package/src/shelf.ts +5 -0
- package/src/static-container.ts +5 -0
- package/src/stocker-abnormal-bar.ts +6 -1
- package/src/stocker-capacity-bar.ts +298 -7
- package/src/stocker-carrier-bar.ts +6 -1
- package/src/stocker.ts +7 -0
- package/src/templates/backdrop.ts +30 -0
- package/src/templates/decal.ts +21 -0
- package/src/templates/index.ts +7 -1
- package/src/templates/scanner.ts +20 -0
- package/src/utils/crane-position.ts +105 -0
- package/src/utils/data-value.ts +19 -0
- package/src/utils/fit-gauge-scale.ts +35 -0
- package/src/utils/get-value-on-ranges.ts +2 -4
- package/src/utils/stocker-gauge.ts +111 -0
- package/src/zone-capacity-bar.ts +3 -3
- package/translations/en.json +26 -1
- package/translations/ja.json +26 -1
- package/translations/ko.json +26 -1
- package/translations/ms.json +26 -1
- package/translations/zh.json +26 -1
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { Component, RootContainer } from '@hatiolab/things-scene';
|
|
2
2
|
import { themesColorMap, themesColorRange, themesAnimationMap } from '@fmsim/api';
|
|
3
|
+
import CarrierManager from '../carrier-manager';
|
|
4
|
+
/**
|
|
5
|
+
* 스토커 적재율 게이지 표시 모드 — 런타임 선택지.
|
|
6
|
+
* value 는 엔진 canonical(2D StockerCapacityBar / 3D buildGauge 공통), label 은 표시명.
|
|
7
|
+
* 런타임 UI(뷰어 컨트롤)가 이 목록으로 selector 를 구성한다.
|
|
8
|
+
*/
|
|
9
|
+
export const STOCKER_GAUGE_MODES = [
|
|
10
|
+
{ value: 'capacity', label: 'Capacity' },
|
|
11
|
+
{ value: 'carrier', label: 'Carrier Status' },
|
|
12
|
+
{ value: 'abnormal', label: 'Abnormal Carrier' }
|
|
13
|
+
];
|
|
3
14
|
const ModelLayer = Component.register('model-layer');
|
|
4
15
|
Object.defineProperty(ModelLayer.prototype, 'nature', {
|
|
5
16
|
get: function () {
|
|
@@ -164,118 +175,171 @@ Object.defineProperty(ModelLayer.prototype, 'nature', {
|
|
|
164
175
|
property: {
|
|
165
176
|
options: themesColorRange
|
|
166
177
|
}
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
type: 'legend',
|
|
181
|
+
label: '',
|
|
182
|
+
name: 'MOOD',
|
|
183
|
+
property: {
|
|
184
|
+
label: 'MOOD'
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
type: 'select',
|
|
189
|
+
label: 'light-preset',
|
|
190
|
+
name: 'lightPreset',
|
|
191
|
+
property: {
|
|
192
|
+
options: ['dark', 'medium', 'bright']
|
|
193
|
+
}
|
|
167
194
|
}
|
|
168
195
|
],
|
|
169
196
|
'value-property': 'text'
|
|
170
197
|
};
|
|
171
198
|
}
|
|
172
199
|
});
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
200
|
+
/**
|
|
201
|
+
* 조명 프리셋 — 3 단계 밝기 토글.
|
|
202
|
+
*
|
|
203
|
+
* fmsim 은 디테일 조명 옵션 UI 를 노출하지 않으므로 단일 select 로 단순화.
|
|
204
|
+
* medium = things-scene 의 현재 default 값과 동일 (외관 변화 없음).
|
|
205
|
+
* 사용자가 select 변경 시 onchange 가 exposure + hemiIntensity + dirLightIntensity
|
|
206
|
+
* 를 일괄 set → three-capability 의 변경 감지 핸들러가 즉시 갱신.
|
|
207
|
+
*/
|
|
208
|
+
const LIGHT_PRESETS = {
|
|
209
|
+
dark: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 0.6 },
|
|
210
|
+
medium: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 2.0 },
|
|
211
|
+
bright: { exposure: 1.2, hemiIntensity: 4.0, dirLightIntensity: 5.0 }
|
|
212
|
+
};
|
|
213
|
+
const _origModelLayerOnchange = ModelLayer.prototype.onchange;
|
|
214
|
+
ModelLayer.prototype.onchange = function (after) {
|
|
215
|
+
if (after && Object.prototype.hasOwnProperty.call(after, 'lightPreset')) {
|
|
216
|
+
const preset = LIGHT_PRESETS[after.lightPreset];
|
|
217
|
+
if (preset) {
|
|
218
|
+
this.set({
|
|
219
|
+
exposure: preset.exposure,
|
|
220
|
+
hemiIntensity: preset.hemiIntensity,
|
|
221
|
+
dirLightIntensity: preset.dirLightIntensity
|
|
222
|
+
});
|
|
223
|
+
}
|
|
189
224
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
225
|
+
return _origModelLayerOnchange.call(this, after);
|
|
226
|
+
};
|
|
227
|
+
// === LegendTheme / AnimationTheme value resolve ===
|
|
228
|
+
//
|
|
229
|
+
// rootModel.state.style[name] 에 저장된 legend/animation 값은 보드 직렬화
|
|
230
|
+
// 형태에 따라 (a) 정상 object 또는 (b) JSON 문자열 둘 다로 나타난다 (2026-06-09
|
|
231
|
+
// 진단 — consumer 인 carrier.ts:animationPreset 이 같은 이유로 typeof string
|
|
232
|
+
// 분기 + JSON5.parse 처리하는 선례 존재). LegendTheme getter 들이 이 분기를
|
|
233
|
+
// 두지 않아 string 통과 → getValueOnRanges 매칭 실패 → 3D gauge 의 색상이
|
|
234
|
+
// fallback 으로만 결정되던 증상.
|
|
235
|
+
//
|
|
236
|
+
// fix 는 getter 한 곳에서 lazy parse. WeakMap<state, Map<rawString, parsed>>
|
|
237
|
+
// 으로 *raw string 자체를 key* — 보드 편집으로 raw 가 바뀌면 자연 무효화,
|
|
238
|
+
// 같은 raw 의 반복 lookup 은 O(1). root 가 GC 되면 cache 도 같이 GC.
|
|
239
|
+
const _legendParseCache = new WeakMap();
|
|
240
|
+
function parseLegendIfString(state, raw) {
|
|
241
|
+
if (typeof raw !== 'string')
|
|
242
|
+
return raw;
|
|
243
|
+
let cache = _legendParseCache.get(state);
|
|
244
|
+
if (!cache) {
|
|
245
|
+
cache = new Map();
|
|
246
|
+
_legendParseCache.set(state, cache);
|
|
195
247
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
248
|
+
if (cache.has(raw))
|
|
249
|
+
return cache.get(raw);
|
|
250
|
+
let parsed;
|
|
251
|
+
try {
|
|
252
|
+
parsed = JSON.parse(raw);
|
|
201
253
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
const
|
|
212
|
-
return
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
Object.defineProperty(RootContainer.prototype, '
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
});
|
|
221
|
-
Object.defineProperty(RootContainer.prototype, '
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
});
|
|
227
|
-
Object.defineProperty(RootContainer.prototype, '
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
Object.defineProperty(RootContainer.prototype, 'shelfLegendTheme', {
|
|
234
|
-
get: function () {
|
|
235
|
-
const { shelfLegendName } = this.rootModel.state;
|
|
236
|
-
return shelfLegendName && this.state.style[shelfLegendName];
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
Object.defineProperty(RootContainer.prototype, 'portLegendTheme', {
|
|
240
|
-
get: function () {
|
|
241
|
-
const { portLegendName } = this.rootModel.state;
|
|
242
|
-
return portLegendName && this.state.style[portLegendName];
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
Object.defineProperty(RootContainer.prototype, 'carrierLegendTheme', {
|
|
246
|
-
get: function () {
|
|
247
|
-
const { carrierLegendName } = this.rootModel.state;
|
|
248
|
-
return carrierLegendName && this.state.style[carrierLegendName];
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
Object.defineProperty(RootContainer.prototype, 'carrierAnimationTheme', {
|
|
252
|
-
get: function () {
|
|
253
|
-
const { carrierAnimationName } = this.rootModel.state;
|
|
254
|
-
return carrierAnimationName && this.state.style[carrierAnimationName];
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
Object.defineProperty(RootContainer.prototype, 'stockerCapacityLegendTheme', {
|
|
258
|
-
get: function () {
|
|
259
|
-
const { stockerCapacityLegendName } = this.rootModel.state;
|
|
260
|
-
return stockerCapacityLegendName && this.state.style[stockerCapacityLegendName];
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
Object.defineProperty(RootContainer.prototype, 'zoneCapacityLegendTheme', {
|
|
254
|
+
catch (_a) {
|
|
255
|
+
parsed = raw;
|
|
256
|
+
} // parse 실패 시 raw 보존
|
|
257
|
+
cache.set(raw, parsed);
|
|
258
|
+
return parsed;
|
|
259
|
+
}
|
|
260
|
+
function legendThemeGetter(stateKey) {
|
|
261
|
+
return function () {
|
|
262
|
+
const name = this.rootModel.state[stateKey];
|
|
263
|
+
const raw = name && this.state.style[name];
|
|
264
|
+
return parseLegendIfString(this.state, raw);
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
Object.defineProperty(RootContainer.prototype, 'equipmentLegendTheme', { get: legendThemeGetter('equipmentLegendName') });
|
|
268
|
+
Object.defineProperty(RootContainer.prototype, 'bufferLegendTheme', { get: legendThemeGetter('bufferLegendName') });
|
|
269
|
+
Object.defineProperty(RootContainer.prototype, 'agvlineLegendTheme', { get: legendThemeGetter('agvlineLegendName') });
|
|
270
|
+
Object.defineProperty(RootContainer.prototype, 'ohtlineLegendTheme', { get: legendThemeGetter('ohtlineLegendName') });
|
|
271
|
+
Object.defineProperty(RootContainer.prototype, 'conveyorLegendTheme', { get: legendThemeGetter('conveyorLegendName') });
|
|
272
|
+
Object.defineProperty(RootContainer.prototype, 'stokerLegendTheme', { get: legendThemeGetter('stokerLegendName') });
|
|
273
|
+
Object.defineProperty(RootContainer.prototype, 'agvLegendTheme', { get: legendThemeGetter('agvLegendName') });
|
|
274
|
+
Object.defineProperty(RootContainer.prototype, 'ohtLegendTheme', { get: legendThemeGetter('ohtLegendName') });
|
|
275
|
+
Object.defineProperty(RootContainer.prototype, 'shuttleLegendTheme', { get: legendThemeGetter('shuttleLegendName') });
|
|
276
|
+
Object.defineProperty(RootContainer.prototype, 'craneLegendTheme', { get: legendThemeGetter('craneLegendName') });
|
|
277
|
+
Object.defineProperty(RootContainer.prototype, 'shelfLegendTheme', { get: legendThemeGetter('shelfLegendName') });
|
|
278
|
+
Object.defineProperty(RootContainer.prototype, 'portLegendTheme', { get: legendThemeGetter('portLegendName') });
|
|
279
|
+
Object.defineProperty(RootContainer.prototype, 'carrierLegendTheme', { get: legendThemeGetter('carrierLegendName') });
|
|
280
|
+
Object.defineProperty(RootContainer.prototype, 'carrierAnimationTheme', { get: legendThemeGetter('carrierAnimationName') });
|
|
281
|
+
Object.defineProperty(RootContainer.prototype, 'stockerCapacityLegendTheme', { get: legendThemeGetter('stockerCapacityLegendName') });
|
|
282
|
+
Object.defineProperty(RootContainer.prototype, 'zoneCapacityLegendTheme', { get: legendThemeGetter('zoneCapacityLegendName') });
|
|
283
|
+
Object.defineProperty(RootContainer.prototype, 'batteryRateLegendTheme', { get: legendThemeGetter('batteryRateLegendName') });
|
|
284
|
+
Object.defineProperty(RootContainer.prototype, 'vehicleAnimation', {
|
|
264
285
|
get: function () {
|
|
265
|
-
const {
|
|
266
|
-
return
|
|
286
|
+
const { vehicleAnimation } = this.rootModel.state;
|
|
287
|
+
return !!vehicleAnimation;
|
|
267
288
|
}
|
|
268
289
|
});
|
|
269
|
-
Object.defineProperty(RootContainer.prototype, '
|
|
290
|
+
Object.defineProperty(RootContainer.prototype, 'carrierManager', {
|
|
270
291
|
get: function () {
|
|
271
|
-
|
|
272
|
-
|
|
292
|
+
if (!this._carrierManager) {
|
|
293
|
+
this._carrierManager = new CarrierManager(this);
|
|
294
|
+
}
|
|
295
|
+
return this._carrierManager;
|
|
273
296
|
}
|
|
274
297
|
});
|
|
275
|
-
|
|
298
|
+
// === 스토커 게이지 표시 모드 (런타임 전용 transient) ===
|
|
299
|
+
//
|
|
300
|
+
// 모델(state)에 저장하지 않는다 — nature 속성이 아니므로 보드 직렬화에 포함되지 않고,
|
|
301
|
+
// 보드를 다시 열면 항상 기본값 'capacity' 로 시작한다. 실행 중 뷰어 컨트롤 등이
|
|
302
|
+
// `scene.rootContainer.stockerGaugeMode = 'carrier'` 로 동적 변경한다.
|
|
303
|
+
// (주의: scene.root 은 model_layer 라 override 가 없다. 반드시 rootContainer 에 설정.
|
|
304
|
+
// 컴포넌트의 this.root 는 RootContainer(isRoot)로 해석되어 이 값을 읽는다.)
|
|
305
|
+
//
|
|
306
|
+
// 2D(StockerCapacityBar.gaugeMode) 와 3D(machine-3d buildGauge) 가 모두 이 값을 읽어
|
|
307
|
+
// 게이지 표현이 항상 일치한다. 값이 바뀌면 setter 가 2D 리드로우 + 3D 게이지 재빌드를
|
|
308
|
+
// 즉시 트리거한다.
|
|
309
|
+
Object.defineProperty(RootContainer.prototype, 'stockerGaugeMode', {
|
|
276
310
|
get: function () {
|
|
277
|
-
|
|
278
|
-
|
|
311
|
+
return this._stockerGaugeMode || 'capacity';
|
|
312
|
+
},
|
|
313
|
+
set: function (mode) {
|
|
314
|
+
const next = mode || 'capacity';
|
|
315
|
+
if (this._stockerGaugeMode === next)
|
|
316
|
+
return;
|
|
317
|
+
this._stockerGaugeMode = next;
|
|
318
|
+
this._refreshStockerGauges();
|
|
279
319
|
}
|
|
280
320
|
});
|
|
321
|
+
/** scene 하위 STOCKER(3D 게이지) + StockerCapacityBar(2D 게이지) 를 새 모드로 갱신. */
|
|
322
|
+
RootContainer.prototype._refreshStockerGauges = function () {
|
|
323
|
+
var _a;
|
|
324
|
+
const walk = (container) => {
|
|
325
|
+
var _a, _b, _c, _d;
|
|
326
|
+
const kids = container === null || container === void 0 ? void 0 : container.components;
|
|
327
|
+
if (!Array.isArray(kids))
|
|
328
|
+
return;
|
|
329
|
+
for (const c of kids) {
|
|
330
|
+
const type = (_a = c === null || c === void 0 ? void 0 : c.state) === null || _a === void 0 ? void 0 : _a.type;
|
|
331
|
+
if (type === 'STOCKER') {
|
|
332
|
+
// 3D 게이지는 스토커 자신의 real-object 가 그린다 → 재빌드 (2D 모드면 _realObject 없음)
|
|
333
|
+
(_c = (_b = c._realObject) === null || _b === void 0 ? void 0 : _b.update) === null || _c === void 0 ? void 0 : _c.call(_b);
|
|
334
|
+
}
|
|
335
|
+
else if (type === 'StockerCapacityBar' || type === 'MCSGaugeCapacityBar') {
|
|
336
|
+
// 2D 게이지는 자식 컴포넌트가 그린다 → 리드로우
|
|
337
|
+
(_d = c.invalidate) === null || _d === void 0 ? void 0 : _d.call(c);
|
|
338
|
+
}
|
|
339
|
+
walk(c);
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
walk(this);
|
|
343
|
+
(_a = this.invalidate) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
344
|
+
};
|
|
281
345
|
//# sourceMappingURL=root-container-override.js.map
|
|
@@ -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 } 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 // 캐시 관련 속성 추가\n _animationConfigCache?: Map<string, any>\n }\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 'value-property': 'text'\n }\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'equipmentLegendTheme', {\n get: function () {\n const { equipmentLegendName } = this.rootModel.state\n return equipmentLegendName && this.state.style[equipmentLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'bufferLegendTheme', {\n get: function () {\n const { bufferLegendName } = this.rootModel.state\n return bufferLegendName && this.state.style[bufferLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'agvlineLegendTheme', {\n get: function () {\n const { agvlineLegendName } = this.rootModel.state\n return agvlineLegendName && this.state.style[agvlineLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'ohtlineLegendTheme', {\n get: function () {\n const { ohtlineLegendName } = this.rootModel.state\n return ohtlineLegendName && this.state.style[ohtlineLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'conveyorLegendTheme', {\n get: function () {\n const { conveyorLegendName } = this.rootModel.state\n return conveyorLegendName && this.state.style[conveyorLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'stokerLegendTheme', {\n get: function () {\n const { stokerLegendName } = this.rootModel.state\n return stokerLegendName && this.state.style[stokerLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'agvLegendTheme', {\n get: function () {\n const { agvLegendName } = this.rootModel.state\n return agvLegendName && this.state.style[agvLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'ohtLegendTheme', {\n get: function () {\n const { ohtLegendName } = this.rootModel.state\n return ohtLegendName && this.state.style[ohtLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'shuttleLegendTheme', {\n get: function () {\n const { shuttleLegendName } = this.rootModel.state\n return shuttleLegendName && this.state.style[shuttleLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'craneLegendTheme', {\n get: function () {\n const { craneLegendName } = this.rootModel.state\n return craneLegendName && this.state.style[craneLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'shelfLegendTheme', {\n get: function () {\n const { shelfLegendName } = this.rootModel.state\n return shelfLegendName && this.state.style[shelfLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'portLegendTheme', {\n get: function () {\n const { portLegendName } = this.rootModel.state\n return portLegendName && this.state.style[portLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'carrierLegendTheme', {\n get: function () {\n const { carrierLegendName } = this.rootModel.state\n return carrierLegendName && this.state.style[carrierLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'carrierAnimationTheme', {\n get: function () {\n const { carrierAnimationName } = this.rootModel.state\n return carrierAnimationName && this.state.style[carrierAnimationName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'stockerCapacityLegendTheme', {\n get: function () {\n const { stockerCapacityLegendName } = this.rootModel.state\n return stockerCapacityLegendName && this.state.style[stockerCapacityLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'zoneCapacityLegendTheme', {\n get: function () {\n const { zoneCapacityLegendName } = this.rootModel.state\n return zoneCapacityLegendName && this.state.style[zoneCapacityLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'batteryRateLegendTheme', {\n get: function () {\n const { batteryRateLegendName } = this.rootModel.state\n return batteryRateLegendName && this.state.style[batteryRateLegendName]\n }\n})\n\nObject.defineProperty(RootContainer.prototype, 'vehicleAnimation', {\n get: function () {\n const { vehicleAnimation } = this.rootModel.state\n return !!vehicleAnimation\n }\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 } from '@hatiolab/things-scene'\nimport { themesColorMap, themesColorRange, themesAnimationMap } from '@fmsim/api'\nimport { Legend } from '../features/mcs-status-default'\nimport CarrierManager from '../carrier-manager'\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 _carrierManager?: CarrierManager\n carrierManager: CarrierManager\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 property: {\n label: 'MOOD'\n }\n },\n {\n type: 'select',\n label: 'light-preset',\n name: 'lightPreset',\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 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 통과 → getValueOnRanges 매칭 실패 → 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\nObject.defineProperty(RootContainer.prototype, 'carrierManager', {\n get: function () {\n if (!this._carrierManager) {\n this._carrierManager = new CarrierManager(this)\n }\n return this._carrierManager\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') {\n // 2D 게이지는 자식 컴포넌트가 그린다 → 리드로우\n c.invalidate?.()\n }\n walk(c)\n }\n }\n walk(this)\n this.invalidate?.()\n}\n"]}
|
package/dist/shelf.js
CHANGED
|
@@ -15,6 +15,10 @@ let Shelf = class Shelf extends MCSZoneMixin(MCSCarrierHolder) {
|
|
|
15
15
|
get auxColor() {
|
|
16
16
|
return 'black';
|
|
17
17
|
}
|
|
18
|
+
/** Shelf 의 parentObject 는 STOCKER. */
|
|
19
|
+
get parentObjectTypes() {
|
|
20
|
+
return ['STOCKER'];
|
|
21
|
+
}
|
|
18
22
|
getLegendFallback() {
|
|
19
23
|
return this.root.shelfLegendTheme || super.getLegendFallback();
|
|
20
24
|
}
|
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,IAAI,QAAQ;QACV,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,iBAAiB;QACf,OAAQ,IAAI,CAAC,IAAY,CAAC,gBAAgB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAA;IACzE,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;
|
|
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,IAAI,QAAQ;QACV,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,sCAAsC;IACtC,IAAI,iBAAiB;QACnB,OAAO,CAAC,SAAS,CAAC,CAAA;IACpB,CAAC;IAED,iBAAiB;QACf,OAAQ,IAAI,CAAC,IAAY,CAAC,gBAAgB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAA;IACzE,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;AAlDoB,KAAK;IADzB,cAAc,CAAC,OAAO,CAAC;GACH,KAAK,CAkDzB;eAlDoB,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 get auxColor() {\n return 'black'\n }\n\n /** Shelf 의 parentObject 는 STOCKER. */\n get parentObjectTypes(): string[] {\n return ['STOCKER']\n }\n\n getLegendFallback() {\n return (this.root as any).shelfLegendTheme || super.getLegendFallback()\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/static-container.js
CHANGED
|
@@ -10,6 +10,11 @@ const NATURE = {
|
|
|
10
10
|
properties: []
|
|
11
11
|
};
|
|
12
12
|
let StaticContainer = class StaticContainer extends Container {
|
|
13
|
+
// things-scene 의 `declare const Container_base` 패턴이 base 인스턴스 타입의 accessor
|
|
14
|
+
// 정보를 object-type property 로 평탄화하여 TS2611 발생. operato-scene 은 position
|
|
15
|
+
// override 케이스가 없어 미발현, fmsim 만 해당. things-scene 측 mixin 타입 패턴이
|
|
16
|
+
// 개선되면 제거.
|
|
17
|
+
// @ts-expect-error TS2611
|
|
13
18
|
get position() {
|
|
14
19
|
return 'static';
|
|
15
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-container.js","sourceRoot":"","sources":["../src/static-container.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAElE,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,EAAE;CACf,CAAA;AAGc,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,SAAS;IACpD,IAAI,QAAQ;QACV,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"static-container.js","sourceRoot":"","sources":["../src/static-container.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAElE,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,EAAE;CACf,CAAA;AAGc,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,SAAS;IACpD,2EAA2E;IAC3E,uEAAuE;IACvE,gEAAgE;IAChE,WAAW;IACX,0BAA0B;IAC1B,IAAI,QAAQ;QACV,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA;AAboB,eAAe;IADnC,cAAc,CAAC,WAAW,CAAC;GACP,eAAe,CAanC;eAboB,eAAe","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { Container, sceneComponent } from '@hatiolab/things-scene'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: []\n}\n\n@sceneComponent('container')\nexport default class StaticContainer extends Container {\n // things-scene 의 `declare const Container_base` 패턴이 base 인스턴스 타입의 accessor\n // 정보를 object-type property 로 평탄화하여 TS2611 발생. operato-scene 은 position\n // override 케이스가 없어 미발현, fmsim 만 해당. things-scene 측 mixin 타입 패턴이\n // 개선되면 제거.\n // @ts-expect-error TS2611\n get position() {\n return 'static'\n }\n\n get nature() {\n return NATURE\n }\n}\n"]}
|
|
@@ -43,6 +43,10 @@ let StockerAbnormalBar = class StockerAbnormalBar extends ParentObjectMixin(Rect
|
|
|
43
43
|
static get nature() {
|
|
44
44
|
return NATURE;
|
|
45
45
|
}
|
|
46
|
+
/** StockerAbnormalBar 의 parentObject 는 STOCKER. */
|
|
47
|
+
get parentObjectTypes() {
|
|
48
|
+
return ['STOCKER'];
|
|
49
|
+
}
|
|
46
50
|
get controls() {
|
|
47
51
|
var { left, top, width, round, height } = this.state;
|
|
48
52
|
round = round == undefined ? 0 : safeRound(round, width, height);
|
|
@@ -166,7 +170,7 @@ let StockerAbnormalBar = class StockerAbnormalBar extends ParentObjectMixin(Rect
|
|
|
166
170
|
}
|
|
167
171
|
}
|
|
168
172
|
onchangeData(after, before) {
|
|
169
|
-
const { CARRIER_NORMAL = 0, CARRIER_ABNORMAL = 0 } = typeof this.data == 'object' ? this.data : {};
|
|
173
|
+
const { CARRIER_NORMAL = 0, CARRIER_ABNORMAL = 0 } = this.data && typeof this.data == 'object' ? this.data : {};
|
|
170
174
|
this.setState({
|
|
171
175
|
carrierNormal: Number(CARRIER_NORMAL) || 0,
|
|
172
176
|
carrierAbnormal: Number(CARRIER_ABNORMAL) || 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stocker-abnormal-bar.js","sourceRoot":"","sources":["../src/stocker-abnormal-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n ComponentNature,\n POSITION,\n RectPath,\n Shape,\n sceneComponent\n} from '@hatiolab/things-scene'\nimport { safeRound } from './utils/safe-round'\nimport { ParentObjectMixin, ParentObjectMixinProperties } from './features/parent-object-mixin'\n\n/**\n * 캐리어 ID 정상/비정상 비율 게이지 (Normal / Abnormal)\n *\n * 스토커에 보관된 캐리어들의 정상/비정상 비율을 세그먼트 게이지로 표시한다.\n * Portrait(세로) 모드에서는 아래→위, Landscape(가로) 모드에서는 왼→오 방향으로 채운다.\n */\n\ninterface Segment {\n label: string\n count: number\n ratio: number\n color: string\n}\n\nconst COLOR_NORMAL = '#8BDA5B'\nconst COLOR_ABNORMAL = '#F4B4B4'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n ...ParentObjectMixinProperties,\n {\n type: 'number',\n name: 'carrierNormal',\n label: 'carrier-normal'\n },\n {\n type: 'number',\n name: 'carrierAbnormal',\n label: 'carrier-abnormal'\n },\n {\n type: 'number',\n label: 'round',\n name: 'round',\n property: {\n min: 0\n }\n }\n ]\n}\n\nvar controlHandler = {\n ondragmove: function (point: POSITION, index: number, component: Component) {\n var { left, top, width, height } = component.model\n\n var transcoorded = component.transcoordP2S(point.x, point.y)\n var round = ((transcoorded.x - left) / (width / 2)) * 100\n\n round = safeRound(round, width, height)\n\n component.set({ round })\n }\n}\n\n@sceneComponent('StockerAbnormalBar')\nexport default class StockerAbnormalBar extends ParentObjectMixin(RectPath(Shape)) {\n static get nature() {\n return NATURE\n }\n\n get controls() {\n var { left, top, width, round, height } = this.state\n round = round == undefined ? 0 : safeRound(round, width, height)\n\n return [\n {\n x: left + (width / 2) * (round / 100),\n y: top,\n handler: controlHandler\n }\n ]\n }\n\n isIdentifiable() {\n return false\n }\n\n get segments(): Segment[] {\n const { carrierNormal = 0, carrierAbnormal = 0 } = this.state\n const total = carrierNormal + carrierAbnormal\n\n if (total === 0) {\n return [\n { label: 'Normal', count: 0, ratio: 0, color: COLOR_NORMAL },\n { label: 'Abnormal', count: 0, ratio: 0, color: COLOR_ABNORMAL }\n ]\n }\n\n return [\n { label: 'Normal', count: carrierNormal, ratio: carrierNormal / total, color: COLOR_NORMAL },\n { label: 'Abnormal', count: carrierAbnormal, ratio: carrierAbnormal / total, color: COLOR_ABNORMAL }\n ]\n }\n\n render(context: CanvasRenderingContext2D) {\n const { width, height } = this.bounds\n\n if (width >= height) {\n this.renderLandscape(context)\n } else {\n this.renderPortrait(context)\n }\n }\n\n renderPortrait(context: CanvasRenderingContext2D) {\n const { left, top, width, height } = this.bounds\n const { lineWidth, strokeStyle, round, fillStyle = 'white' } = this.state\n const segments = this.segments\n\n context.save()\n context.translate(left, top)\n\n // background\n context.beginPath()\n context.fillStyle = fillStyle\n context.roundRect(0, 0, width, height, round)\n context.fill()\n context.clip()\n\n // segments (아래→위: Abnormal이 아래, Normal이 위)\n let y = height\n for (const seg of [...segments].reverse()) {\n const segHeight = height * seg.ratio\n if (segHeight <= 0) continue\n\n y -= segHeight\n\n context.beginPath()\n context.fillStyle = seg.color\n context.rect(0, y, width, segHeight)\n context.fill()\n\n this._drawSegmentLabel(context, seg, 0, y, width, segHeight)\n }\n\n // outline\n context.beginPath()\n context.setLineDash([])\n context.strokeStyle = strokeStyle\n context.lineWidth = lineWidth\n context.roundRect(0, 0, width, height, round)\n context.stroke()\n\n context.translate(-left, -top)\n context.restore()\n }\n\n renderLandscape(context: CanvasRenderingContext2D) {\n const { left, top, width, height } = this.bounds\n const { lineWidth, strokeStyle, round, fillStyle = 'white' } = this.state\n const segments = this.segments\n\n context.save()\n context.translate(left, top)\n\n // background\n context.beginPath()\n context.fillStyle = fillStyle\n context.roundRect(0, 0, width, height, round)\n context.fill()\n context.clip()\n\n // segments (왼→오)\n let x = 0\n for (const seg of segments) {\n const segWidth = width * seg.ratio\n if (segWidth <= 0) continue\n\n context.beginPath()\n context.fillStyle = seg.color\n context.rect(x, 0, segWidth, height)\n context.fill()\n\n this._drawSegmentLabel(context, seg, x, 0, segWidth, height)\n\n x += segWidth\n }\n\n // outline\n context.beginPath()\n context.setLineDash([])\n context.strokeStyle = strokeStyle\n context.lineWidth = lineWidth\n context.roundRect(0, 0, width, height, round)\n context.stroke()\n\n context.translate(-left, -top)\n context.restore()\n }\n\n private _drawSegmentLabel(\n context: CanvasRenderingContext2D,\n seg: Segment,\n x: number,\n y: number,\n w: number,\n h: number\n ) {\n const percent = Math.round(seg.ratio * 100)\n const lines = [seg.label, `${percent}%`]\n\n const fontSize = Math.max(9, Math.min(14, Math.min(w, h) * 0.22))\n context.font = `bold ${fontSize}px sans-serif`\n context.fillStyle = '#333'\n context.textAlign = 'center'\n context.textBaseline = 'middle'\n\n const lineHeight = fontSize * 1.2\n const totalHeight = lines.length * lineHeight\n const startY = y + (h - totalHeight) / 2 + lineHeight / 2\n\n for (let i = 0; i < lines.length; i++) {\n context.fillText(lines[i], x + w / 2, startY + i * lineHeight)\n }\n }\n\n onchangeData(after: Record<string, any>, before: Record<string, any>): void {\n const {\n CARRIER_NORMAL = 0,\n CARRIER_ABNORMAL = 0\n } = typeof this.data == 'object' ? this.data : {}\n\n this.setState({\n carrierNormal: Number(CARRIER_NORMAL) || 0,\n carrierAbnormal: Number(CARRIER_ABNORMAL) || 0\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"stocker-abnormal-bar.js","sourceRoot":"","sources":["../src/stocker-abnormal-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n ComponentNature,\n POSITION,\n RectPath,\n Shape,\n sceneComponent\n} from '@hatiolab/things-scene'\nimport { safeRound } from './utils/safe-round'\nimport { ParentObjectMixin, ParentObjectMixinProperties } from './features/parent-object-mixin'\n\n/**\n * 캐리어 ID 정상/비정상 비율 게이지 (Normal / Abnormal)\n *\n * 스토커에 보관된 캐리어들의 정상/비정상 비율을 세그먼트 게이지로 표시한다.\n * Portrait(세로) 모드에서는 아래→위, Landscape(가로) 모드에서는 왼→오 방향으로 채운다.\n */\n\ninterface Segment {\n label: string\n count: number\n ratio: number\n color: string\n}\n\nconst COLOR_NORMAL = '#8BDA5B'\nconst COLOR_ABNORMAL = '#F4B4B4'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n ...ParentObjectMixinProperties,\n {\n type: 'number',\n name: 'carrierNormal',\n label: 'carrier-normal'\n },\n {\n type: 'number',\n name: 'carrierAbnormal',\n label: 'carrier-abnormal'\n },\n {\n type: 'number',\n label: 'round',\n name: 'round',\n property: {\n min: 0\n }\n }\n ]\n}\n\nvar controlHandler = {\n ondragmove: function (point: POSITION, index: number, component: Component) {\n var { left, top, width, height } = component.model\n\n var transcoorded = component.transcoordP2S(point.x, point.y)\n var round = ((transcoorded.x - left) / (width / 2)) * 100\n\n round = safeRound(round, width, height)\n\n component.set({ round })\n }\n}\n\n@sceneComponent('StockerAbnormalBar')\nexport default class StockerAbnormalBar extends ParentObjectMixin(RectPath(Shape)) {\n static get nature() {\n return NATURE\n }\n\n /** StockerAbnormalBar 의 parentObject 는 STOCKER. */\n get parentObjectTypes(): string[] {\n return ['STOCKER']\n }\n\n get controls() {\n var { left, top, width, round, height } = this.state\n round = round == undefined ? 0 : safeRound(round, width, height)\n\n return [\n {\n x: left + (width / 2) * (round / 100),\n y: top,\n handler: controlHandler\n }\n ]\n }\n\n isIdentifiable() {\n return false\n }\n\n get segments(): Segment[] {\n const { carrierNormal = 0, carrierAbnormal = 0 } = this.state\n const total = carrierNormal + carrierAbnormal\n\n if (total === 0) {\n return [\n { label: 'Normal', count: 0, ratio: 0, color: COLOR_NORMAL },\n { label: 'Abnormal', count: 0, ratio: 0, color: COLOR_ABNORMAL }\n ]\n }\n\n return [\n { label: 'Normal', count: carrierNormal, ratio: carrierNormal / total, color: COLOR_NORMAL },\n { label: 'Abnormal', count: carrierAbnormal, ratio: carrierAbnormal / total, color: COLOR_ABNORMAL }\n ]\n }\n\n render(context: CanvasRenderingContext2D) {\n const { width, height } = this.bounds\n\n if (width >= height) {\n this.renderLandscape(context)\n } else {\n this.renderPortrait(context)\n }\n }\n\n renderPortrait(context: CanvasRenderingContext2D) {\n const { left, top, width, height } = this.bounds\n const { lineWidth, strokeStyle, round, fillStyle = 'white' } = this.state\n const segments = this.segments\n\n context.save()\n context.translate(left, top)\n\n // background\n context.beginPath()\n context.fillStyle = fillStyle\n context.roundRect(0, 0, width, height, round)\n context.fill()\n context.clip()\n\n // segments (아래→위: Abnormal이 아래, Normal이 위)\n let y = height\n for (const seg of [...segments].reverse()) {\n const segHeight = height * seg.ratio\n if (segHeight <= 0) continue\n\n y -= segHeight\n\n context.beginPath()\n context.fillStyle = seg.color\n context.rect(0, y, width, segHeight)\n context.fill()\n\n this._drawSegmentLabel(context, seg, 0, y, width, segHeight)\n }\n\n // outline\n context.beginPath()\n context.setLineDash([])\n context.strokeStyle = strokeStyle\n context.lineWidth = lineWidth\n context.roundRect(0, 0, width, height, round)\n context.stroke()\n\n context.translate(-left, -top)\n context.restore()\n }\n\n renderLandscape(context: CanvasRenderingContext2D) {\n const { left, top, width, height } = this.bounds\n const { lineWidth, strokeStyle, round, fillStyle = 'white' } = this.state\n const segments = this.segments\n\n context.save()\n context.translate(left, top)\n\n // background\n context.beginPath()\n context.fillStyle = fillStyle\n context.roundRect(0, 0, width, height, round)\n context.fill()\n context.clip()\n\n // segments (왼→오)\n let x = 0\n for (const seg of segments) {\n const segWidth = width * seg.ratio\n if (segWidth <= 0) continue\n\n context.beginPath()\n context.fillStyle = seg.color\n context.rect(x, 0, segWidth, height)\n context.fill()\n\n this._drawSegmentLabel(context, seg, x, 0, segWidth, height)\n\n x += segWidth\n }\n\n // outline\n context.beginPath()\n context.setLineDash([])\n context.strokeStyle = strokeStyle\n context.lineWidth = lineWidth\n context.roundRect(0, 0, width, height, round)\n context.stroke()\n\n context.translate(-left, -top)\n context.restore()\n }\n\n private _drawSegmentLabel(\n context: CanvasRenderingContext2D,\n seg: Segment,\n x: number,\n y: number,\n w: number,\n h: number\n ) {\n const percent = Math.round(seg.ratio * 100)\n const lines = [seg.label, `${percent}%`]\n\n const fontSize = Math.max(9, Math.min(14, Math.min(w, h) * 0.22))\n context.font = `bold ${fontSize}px sans-serif`\n context.fillStyle = '#333'\n context.textAlign = 'center'\n context.textBaseline = 'middle'\n\n const lineHeight = fontSize * 1.2\n const totalHeight = lines.length * lineHeight\n const startY = y + (h - totalHeight) / 2 + lineHeight / 2\n\n for (let i = 0; i < lines.length; i++) {\n context.fillText(lines[i], x + w / 2, startY + i * lineHeight)\n }\n }\n\n onchangeData(after: Record<string, any>, before: Record<string, any>): void {\n const {\n CARRIER_NORMAL = 0,\n CARRIER_ABNORMAL = 0\n } = this.data && typeof this.data == 'object' ? this.data : {}\n\n this.setState({\n carrierNormal: Number(CARRIER_NORMAL) || 0,\n carrierAbnormal: Number(CARRIER_ABNORMAL) || 0\n })\n }\n}\n"]}
|