@fmsim/machine 2.0.0-beta.97 → 2.0.0-beta.98

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@fmsim/machine",
3
3
  "description": "Layout View를 구성하는 설비(machine)들과 유닛을 구현한 모듈입니다.",
4
4
  "author": "heartyoh",
5
- "version": "2.0.0-beta.97",
5
+ "version": "2.0.0-beta.98",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
8
8
  "things-scene": true,
@@ -55,5 +55,5 @@
55
55
  "prettier --write"
56
56
  ]
57
57
  },
58
- "gitHead": "f994681c569562e248ea20178a7749af6c4e050d"
58
+ "gitHead": "d1b766f96c1c9656d8cb950f4b70cb5b583969e5"
59
59
  }
@@ -338,7 +338,9 @@ Object.defineProperty(RootContainer.prototype, 'carrierManager', {
338
338
  //
339
339
  // 모델(state)에 저장하지 않는다 — nature 속성이 아니므로 보드 직렬화에 포함되지 않고,
340
340
  // 보드를 다시 열면 항상 기본값 'capacity' 로 시작한다. 실행 중 뷰어 컨트롤 등이
341
- // `scene.root.stockerGaugeMode = 'carrier'` 로 동적 변경한다.
341
+ // `scene.rootContainer.stockerGaugeMode = 'carrier'` 로 동적 변경한다.
342
+ // (주의: scene.root 은 model_layer 라 override 가 없다. 반드시 rootContainer 에 설정.
343
+ // 컴포넌트의 this.root 는 RootContainer(isRoot)로 해석되어 이 값을 읽는다.)
342
344
  //
343
345
  // 2D(StockerCapacityBar.gaugeMode) 와 3D(machine-3d buildGauge) 가 모두 이 값을 읽어
344
346
  // 게이지 표현이 항상 일치한다. 값이 바뀌면 setter 가 2D 리드로우 + 3D 게이지 재빌드를
@@ -186,6 +186,11 @@ export default class StockerCapacityBar extends ParentObjectMixin(MCSStatusMixin
186
186
  }
187
187
 
188
188
  get text() {
189
+ // usage% 값은 capacity 모드에서만 표시. carrier/abnormal 은 세그먼트별 자체 라벨을 그리므로
190
+ // base 의 value 텍스트(value-property=usage)를 억제한다.
191
+ if (this.gaugeMode !== 'capacity') {
192
+ return ''
193
+ }
189
194
  return this.usage + '%'
190
195
  }
191
196
 
@@ -206,6 +211,16 @@ export default class StockerCapacityBar extends ParentObjectMixin(MCSStatusMixin
206
211
  }
207
212
  }
208
213
 
214
+ /**
215
+ * Shape.postrender 의 drawFill/drawStroke 를 건너뛴다.
216
+ * 각 모드 render 가 자체 배경(fillStyle)·외곽선(strokeStyle)을 이미 그리므로, base 가
217
+ * fillStyle 로 게이지 전체를 다시 덮어(각 모드 표현이 사라지는) 것을 방지한다.
218
+ * 값 텍스트(drawText)는 Component.postrender 와 동일하게 유지한다.
219
+ */
220
+ postrender(context: CanvasRenderingContext2D) {
221
+ this.drawText(context)
222
+ }
223
+
209
224
  /**
210
225
  * carrier/abnormal mode 의 세그먼트 목록 (공유 유틸 = 3D 와 동일 계산).
211
226
  * 배열 순서 = portrait 아래→위 / landscape 왼→오.
@@ -288,23 +303,29 @@ export default class StockerCapacityBar extends ParentObjectMixin(MCSStatusMixin
288
303
  w: number,
289
304
  h: number
290
305
  ) {
291
- const percent = Math.round(seg.ratio * 100)
292
- const lines = seg.label.split('\n')
293
- lines.push(`${percent}%`)
294
-
295
- const fontSize = Math.max(9, Math.min(14, Math.min(w, h) * 0.22))
306
+ // 이름 라벨(Full/Empty/Abnormal…)은 그리지 않는다. 각 세그먼트 영역 중심에 숫자(%)만 표시.
307
+ // value 텍스트와 동일하게 state.fontSize 를 따른다 (기본 15). 속성 하나로 함께 조절.
308
+ const fontSize = this.state.fontSize || 15
296
309
  context.font = `bold ${fontSize}px sans-serif`
297
- context.fillStyle = '#333'
298
- context.textAlign = 'center'
299
- context.textBaseline = 'middle'
300
310
 
301
- const lineHeight = fontSize * 1.2
302
- const totalHeight = lines.length * lineHeight
303
- const startY = y + (h - totalHeight) / 2 + lineHeight / 2
311
+ // 공간에 따라 단계적 축소: 넉넉하면 '값%', 좁으면 '%' 떼고 값만, 더 좁으면 생략.
312
+ const value = `${Math.round(seg.ratio * 100)}`
313
+ const fits = (t: string) => fontSize <= h && context.measureText(t).width <= w
304
314
 
305
- for (let i = 0; i < lines.length; i++) {
306
- context.fillText(lines[i], x + w / 2, startY + i * lineHeight)
315
+ let text: string | null = null
316
+ if (fits(`${value}%`)) {
317
+ text = `${value}%`
318
+ } else if (fits(value)) {
319
+ text = value
320
+ }
321
+ if (text === null) {
322
+ return
307
323
  }
324
+
325
+ context.fillStyle = '#333'
326
+ context.textAlign = 'center'
327
+ context.textBaseline = 'middle'
328
+ context.fillText(text, x + w / 2, y + h / 2)
308
329
  }
309
330
 
310
331
  renderLandscape(context: CanvasRenderingContext2D) {
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "label.current-usage": "current usage",
3
3
  "label.fullup": "fullup",
4
+ "label.carrier-full": "carrier full",
5
+ "label.carrier-empty": "carrier empty",
6
+ "label.carrier-empty-empty": "carrier empty empty",
7
+ "label.carrier-normal": "carrier normal",
8
+ "label.carrier-abnormal": "carrier abnormal",
4
9
  "label.high-watermark": "high watermark",
5
10
  "label.legend-name": "legend",
6
11
  "label.max-capacity": "max capacity",
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "label.current-usage": "current usage",
3
3
  "label.fullup": "fullup",
4
+ "label.carrier-full": "carrier full",
5
+ "label.carrier-empty": "carrier empty",
6
+ "label.carrier-empty-empty": "carrier empty empty",
7
+ "label.carrier-normal": "carrier normal",
8
+ "label.carrier-abnormal": "carrier abnormal",
4
9
  "label.high-watermark": "high watermark",
5
10
  "label.low-watermark": "low watermark",
6
11
  "label.legend-name": "legend",
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "label.current-usage": "현재 사용량",
3
3
  "label.fullup": "만재",
4
+ "label.carrier-full": "적재 캐리어",
5
+ "label.carrier-empty": "공 캐리어",
6
+ "label.carrier-empty-empty": "이중 공 캐리어",
7
+ "label.carrier-normal": "정상 캐리어",
8
+ "label.carrier-abnormal": "비정상 캐리어",
4
9
  "label.high-watermark": "고수위워터마크",
5
10
  "label.low-watermark": "저수위워터마크",
6
11
  "label.legend-name": "레전드",
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "label.current-usage": "current usage",
3
3
  "label.fullup": "fullup",
4
+ "label.carrier-full": "carrier full",
5
+ "label.carrier-empty": "carrier empty",
6
+ "label.carrier-empty-empty": "carrier empty empty",
7
+ "label.carrier-normal": "carrier normal",
8
+ "label.carrier-abnormal": "carrier abnormal",
4
9
  "label.high-watermark": "high watermark",
5
10
  "label.low-watermark": "low watermark",
6
11
  "label.legend-name": "legend",
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "label.current-usage": "current usage",
3
3
  "label.fullup": "fullup",
4
+ "label.carrier-full": "carrier full",
5
+ "label.carrier-empty": "carrier empty",
6
+ "label.carrier-empty-empty": "carrier empty empty",
7
+ "label.carrier-normal": "carrier normal",
8
+ "label.carrier-abnormal": "carrier abnormal",
4
9
  "label.high-watermark": "high watermark",
5
10
  "label.low-watermark": "low watermark",
6
11
  "label.legend-name": "legend",