@fmsim/machine 3.0.0-beta.4 โ†’ 3.0.0-beta.6

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.
Files changed (94) hide show
  1. package/dist/agv-line.js +2 -2
  2. package/dist/agv-line.js.map +1 -1
  3. package/dist/agv.js +6 -2
  4. package/dist/agv.js.map +1 -1
  5. package/dist/buffer.js +2 -2
  6. package/dist/buffer.js.map +1 -1
  7. package/dist/conveyor-join.js +2 -2
  8. package/dist/conveyor-join.js.map +1 -1
  9. package/dist/conveyor.js +2 -2
  10. package/dist/conveyor.js.map +1 -1
  11. package/dist/crane.js +2 -2
  12. package/dist/crane.js.map +1 -1
  13. package/dist/equipment.js +2 -2
  14. package/dist/equipment.js.map +1 -1
  15. package/dist/factories/conveyor-3d.js +2 -2
  16. package/dist/factories/conveyor-3d.js.map +1 -1
  17. package/dist/factories/machine-3d.js +12 -12
  18. package/dist/factories/machine-3d.js.map +1 -1
  19. package/dist/factories/oht-3d.js +3 -4
  20. package/dist/factories/oht-3d.js.map +1 -1
  21. package/dist/features/legend-panel.js +29 -0
  22. package/dist/features/legend-panel.js.map +1 -0
  23. package/dist/features/legend-rows.js +88 -0
  24. package/dist/features/legend-rows.js.map +1 -0
  25. package/dist/features/lv-figures.js +143 -0
  26. package/dist/features/lv-figures.js.map +1 -0
  27. package/dist/features/lv-heights.js +20 -0
  28. package/dist/features/lv-heights.js.map +1 -0
  29. package/dist/features/mcs-status-default.js +3 -49
  30. package/dist/features/mcs-status-default.js.map +1 -1
  31. package/dist/features/oht-rail.js +32 -0
  32. package/dist/features/oht-rail.js.map +1 -0
  33. package/dist/features/vehicle-travel.js +18 -1
  34. package/dist/features/vehicle-travel.js.map +1 -1
  35. package/dist/index.js +4 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/mcs-carrier-holder.js +82 -33
  38. package/dist/mcs-carrier-holder.js.map +1 -1
  39. package/dist/mcs-machine.js +10 -1
  40. package/dist/mcs-machine.js.map +1 -1
  41. package/dist/mcs-unit.js +10 -1
  42. package/dist/mcs-unit.js.map +1 -1
  43. package/dist/mcs-vehicle.js +0 -4
  44. package/dist/mcs-vehicle.js.map +1 -1
  45. package/dist/oht-line.js +7 -3
  46. package/dist/oht-line.js.map +1 -1
  47. package/dist/oht.js +2 -2
  48. package/dist/oht.js.map +1 -1
  49. package/dist/port.js +2 -2
  50. package/dist/port.js.map +1 -1
  51. package/dist/scene/root-container-override.js +15 -210
  52. package/dist/scene/root-container-override.js.map +1 -1
  53. package/dist/shelf.js +2 -2
  54. package/dist/shelf.js.map +1 -1
  55. package/dist/shuttle.js +2 -2
  56. package/dist/shuttle.js.map +1 -1
  57. package/dist/stocker.js +2 -2
  58. package/dist/stocker.js.map +1 -1
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +5 -4
  61. package/src/agv-line.ts +2 -2
  62. package/src/agv.ts +7 -2
  63. package/src/buffer.ts +2 -2
  64. package/src/conveyor-join.ts +2 -2
  65. package/src/conveyor.ts +2 -2
  66. package/src/crane.ts +2 -2
  67. package/src/equipment.ts +2 -2
  68. package/src/factories/conveyor-3d.ts +2 -2
  69. package/src/factories/machine-3d.ts +11 -12
  70. package/src/factories/oht-3d.ts +3 -5
  71. package/src/features/legend-panel.ts +31 -0
  72. package/src/features/legend-rows.ts +86 -0
  73. package/src/features/lv-figures.ts +151 -0
  74. package/src/features/lv-heights.ts +22 -0
  75. package/src/features/mcs-status-default.ts +3 -53
  76. package/src/features/oht-rail.ts +31 -0
  77. package/src/features/vehicle-travel.ts +16 -1
  78. package/src/index.ts +4 -0
  79. package/src/mcs-carrier-holder.ts +79 -36
  80. package/src/mcs-machine.ts +12 -1
  81. package/src/mcs-unit.ts +12 -1
  82. package/src/mcs-vehicle.ts +0 -4
  83. package/src/oht-line.ts +7 -3
  84. package/src/oht.ts +2 -2
  85. package/src/port.ts +2 -2
  86. package/src/scene/root-container-override.ts +15 -207
  87. package/src/shelf.ts +2 -2
  88. package/src/shuttle.ts +2 -2
  89. package/src/stocker.ts +2 -2
  90. package/translations/en.json +7 -1
  91. package/translations/ja.json +7 -1
  92. package/translations/ko.json +7 -1
  93. package/translations/ms.json +7 -1
  94. package/translations/zh.json +7 -1
@@ -1,5 +1,7 @@
1
1
  import { Component, RootContainer, figureLegendSourcesChanged } from '@hatiolab/things-scene';
2
- import { themesColorMap, themesColorRange, themesAnimationMap } from '@fmsim/api';
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
- /* ๋ณด๋“œ์˜ Carrier ๋ฒ”๋ก€๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค: Carrier ํ”ผ๊ทœ์–ด๋“ค์ด ๋ฒ”๋ก€๋ฅผ ๋‹ค์‹œ ๊ณ ๋ฅธ๋‹ค (ADR-0166 ๊ฒฐ์ • 12) */
227
- if (after && ['carrierLegendName', 'carrierAnimationName'].some(k => Object.prototype.hasOwnProperty.call(after, k)))
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
- // === LegendTheme / AnimationTheme value resolve ===
82
+ // === ๋ฒ”๋ก€ ์ค„์˜ ๋ณด๋“œ ์†์„ฑ โ†’ ๋ฒ”๋ก€ (ADR-0167 ๊ฒฐ์ • 20) ===
232
83
  //
233
- // rootModel.state.style[name] ์— ์ €์žฅ๋œ legend/animation ๊ฐ’์€ ๋ณด๋“œ ์ง๋ ฌํ™”
234
- // ํ˜•ํƒœ์— ๋”ฐ๋ผ (a) ์ •์ƒ object ๋˜๋Š” (b) JSON ๋ฌธ์ž์—ด ๋‘˜ ๋‹ค๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค (2026-06-09
235
- // ์ง„๋‹จ โ€” consumer ์ธ carrier.ts:animationPreset ์ด ๊ฐ™์€ ์ด์œ ๋กœ typeof string
236
- // ๋ถ„๊ธฐ + JSON5.parse ์ฒ˜๋ฆฌํ•˜๋Š” ์„ ๋ก€ ์กด์žฌ). LegendTheme getter ๋“ค์ด ์ด ๋ถ„๊ธฐ๋ฅผ
237
- // ๋‘์ง€ ์•Š์•„ string ํ†ต๊ณผ โ†’ ๊ตฌ๊ฐ„ ์กฐํšŒ ๋งค์นญ ์‹คํŒจ โ†’ 3D gauge ์˜ ์ƒ‰์ƒ์ด
238
- // fallback ์œผ๋กœ๋งŒ ๊ฒฐ์ •๋˜๋˜ ์ฆ์ƒ.
239
- //
240
- // fix ๋Š” getter ํ•œ ๊ณณ์—์„œ lazy parse. WeakMap<state, Map<rawString, parsed>>
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
- getLegendFallback() {
27
- return this.root.shelfLegendTheme || super.getLegendFallback();
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,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;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 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"]}
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
- getLegendFallback() {
23
- return this.root.shuttleLegendTheme || super.getLegendFallback();
22
+ get statusLegendRow() {
23
+ return 'shuttle';
24
24
  }
25
25
  render(ctx) {
26
26
  var { left, top, width, height } = this.bounds;
@@ -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,iBAAiB;QACf,OAAQ,IAAI,CAAC,IAAY,CAAC,kBAAkB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAA;IAC3E,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 getLegendFallback() {\n return (this.root as any).shuttleLegendTheme || super.getLegendFallback()\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"]}
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
- getLegendFallback() {
60
- return this.root.stokerLegendTheme || super.getLegendFallback();
59
+ get statusLegendRow() {
60
+ return 'stocker';
61
61
  }
62
62
  containable(component) {
63
63
  return (super.containable(component) ||
@@ -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,iBAAiB;QACf,OAAQ,IAAI,CAAC,IAAY,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAA;IAC1E,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 getLegendFallback() {\n return (this.root as any).stokerLegendTheme || super.getLegendFallback()\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"]}
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"]}