@fmsim/machine 1.0.88 → 2.0.0-beta.100

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 (165) hide show
  1. package/dist/agv-line.js.map +1 -1
  2. package/dist/agv.js +6 -2
  3. package/dist/agv.js.map +1 -1
  4. package/dist/buffer.js.map +1 -1
  5. package/dist/carrier-manager.js +183 -0
  6. package/dist/carrier-manager.js.map +1 -0
  7. package/dist/carrier.js +105 -14
  8. package/dist/carrier.js.map +1 -1
  9. package/dist/conveyor-join.js +8 -2
  10. package/dist/conveyor-join.js.map +1 -1
  11. package/dist/conveyor.js +9 -1
  12. package/dist/conveyor.js.map +1 -1
  13. package/dist/crane-rail.js +53 -0
  14. package/dist/crane-rail.js.map +1 -0
  15. package/dist/crane.js +144 -1
  16. package/dist/crane.js.map +1 -1
  17. package/dist/equipment.js.map +1 -1
  18. package/dist/factories/agv-3d.js +147 -0
  19. package/dist/factories/agv-3d.js.map +1 -0
  20. package/dist/factories/conveyor-3d.js +345 -0
  21. package/dist/factories/conveyor-3d.js.map +1 -0
  22. package/dist/factories/crane-3d.js +186 -0
  23. package/dist/factories/crane-3d.js.map +1 -0
  24. package/dist/factories/crane-rail-3d.js +95 -0
  25. package/dist/factories/crane-rail-3d.js.map +1 -0
  26. package/dist/factories/machine-3d.js +973 -0
  27. package/dist/factories/machine-3d.js.map +1 -0
  28. package/dist/factories/oht-3d.js +177 -0
  29. package/dist/factories/oht-3d.js.map +1 -0
  30. package/dist/factories/shuttle-3d.js +159 -0
  31. package/dist/factories/shuttle-3d.js.map +1 -0
  32. package/dist/factories/z-priority-defaults.js +33 -0
  33. package/dist/factories/z-priority-defaults.js.map +1 -0
  34. package/dist/factories/z-priority.js +54 -0
  35. package/dist/factories/z-priority.js.map +1 -0
  36. package/dist/features/conveyor-mixin.js.map +1 -1
  37. package/dist/features/mcs-status-default.js +15 -1
  38. package/dist/features/mcs-status-default.js.map +1 -1
  39. package/dist/features/mcs-status-mixin.js +22 -0
  40. package/dist/features/mcs-status-mixin.js.map +1 -1
  41. package/dist/features/mcs-zone-mixin.js.map +1 -1
  42. package/dist/features/parent-object-mixin.js +15 -7
  43. package/dist/features/parent-object-mixin.js.map +1 -1
  44. package/dist/floating-container.js +5 -0
  45. package/dist/floating-container.js.map +1 -1
  46. package/dist/index.js +58 -2
  47. package/dist/index.js.map +1 -1
  48. package/dist/mcs-carrier-holder.js +56 -17
  49. package/dist/mcs-carrier-holder.js.map +1 -1
  50. package/dist/mcs-machine.js +39 -0
  51. package/dist/mcs-machine.js.map +1 -1
  52. package/dist/mcs-unit.js +20 -0
  53. package/dist/mcs-unit.js.map +1 -1
  54. package/dist/mcs-vehicle.js +10 -4
  55. package/dist/mcs-vehicle.js.map +1 -1
  56. package/dist/node.js +10 -3
  57. package/dist/node.js.map +1 -1
  58. package/dist/oht-line.js.map +1 -1
  59. package/dist/oht.js +4 -0
  60. package/dist/oht.js.map +1 -1
  61. package/dist/port-flow.js +4 -0
  62. package/dist/port-flow.js.map +1 -1
  63. package/dist/port.js +4 -0
  64. package/dist/port.js.map +1 -1
  65. package/dist/scanner.js +30 -0
  66. package/dist/scanner.js.map +1 -0
  67. package/dist/scene/root-container-override.js +160 -96
  68. package/dist/scene/root-container-override.js.map +1 -1
  69. package/dist/shelf.js +4 -0
  70. package/dist/shelf.js.map +1 -1
  71. package/dist/shuttle.js.map +1 -1
  72. package/dist/static-container.js +5 -0
  73. package/dist/static-container.js.map +1 -1
  74. package/dist/stocker-abnormal-bar.js +184 -0
  75. package/dist/stocker-abnormal-bar.js.map +1 -0
  76. package/dist/stocker-capacity-bar.js +253 -6
  77. package/dist/stocker-capacity-bar.js.map +1 -1
  78. package/dist/stocker-carrier-bar.js +198 -0
  79. package/dist/stocker-carrier-bar.js.map +1 -0
  80. package/dist/stocker.js +7 -1
  81. package/dist/stocker.js.map +1 -1
  82. package/dist/templates/backdrop.js +30 -0
  83. package/dist/templates/backdrop.js.map +1 -0
  84. package/dist/templates/decal.js +21 -0
  85. package/dist/templates/decal.js.map +1 -0
  86. package/dist/templates/index.js +7 -1
  87. package/dist/templates/index.js.map +1 -1
  88. package/dist/templates/scanner.js +20 -0
  89. package/dist/templates/scanner.js.map +1 -0
  90. package/dist/tsconfig.tsbuildinfo +1 -1
  91. package/dist/utils/crane-position.js +83 -0
  92. package/dist/utils/crane-position.js.map +1 -0
  93. package/dist/utils/data-value.js +21 -0
  94. package/dist/utils/data-value.js.map +1 -0
  95. package/dist/utils/fit-gauge-scale.js +28 -0
  96. package/dist/utils/fit-gauge-scale.js.map +1 -0
  97. package/dist/utils/get-value-on-ranges.js +2 -4
  98. package/dist/utils/get-value-on-ranges.js.map +1 -1
  99. package/dist/utils/stocker-gauge.js +78 -0
  100. package/dist/utils/stocker-gauge.js.map +1 -0
  101. package/dist/zone-capacity-bar.js +3 -3
  102. package/dist/zone-capacity-bar.js.map +1 -1
  103. package/icons/backdrop.png +0 -0
  104. package/icons/decal.png +0 -0
  105. package/jest.config.js +10 -0
  106. package/package.json +7 -6
  107. package/src/agv-line.ts +1 -1
  108. package/src/agv.ts +10 -5
  109. package/src/buffer.ts +1 -1
  110. package/src/carrier-manager.ts +223 -0
  111. package/src/carrier.ts +111 -18
  112. package/src/conveyor-join.ts +6 -3
  113. package/src/conveyor.ts +10 -2
  114. package/src/crane-rail.ts +58 -0
  115. package/src/crane.ts +182 -2
  116. package/src/equipment.ts +1 -1
  117. package/src/factories/agv-3d.ts +160 -0
  118. package/src/factories/conveyor-3d.ts +398 -0
  119. package/src/factories/crane-3d.ts +217 -0
  120. package/src/factories/crane-rail-3d.ts +115 -0
  121. package/src/factories/machine-3d.ts +1192 -0
  122. package/src/factories/oht-3d.ts +196 -0
  123. package/src/factories/shuttle-3d.ts +179 -0
  124. package/src/factories/z-priority-defaults.ts +38 -0
  125. package/src/factories/z-priority.ts +60 -0
  126. package/src/features/conveyor-mixin.ts +1 -1
  127. package/src/features/mcs-status-default.ts +15 -1
  128. package/src/features/mcs-status-mixin.ts +26 -4
  129. package/src/features/mcs-zone-mixin.ts +1 -1
  130. package/src/features/parent-object-mixin.ts +17 -8
  131. package/src/floating-container.ts +5 -0
  132. package/src/index.ts +66 -2
  133. package/src/mcs-carrier-holder.ts +58 -29
  134. package/src/mcs-machine.ts +43 -1
  135. package/src/mcs-unit.ts +25 -2
  136. package/src/mcs-vehicle.ts +12 -9
  137. package/src/node.ts +9 -3
  138. package/src/oht-line.ts +1 -1
  139. package/src/oht.ts +7 -2
  140. package/src/port-flow.ts +6 -1
  141. package/src/port.ts +6 -1
  142. package/src/scanner.ts +29 -0
  143. package/src/scene/root-container-override.ts +156 -105
  144. package/src/shelf.ts +6 -1
  145. package/src/shuttle.ts +1 -1
  146. package/src/static-container.ts +5 -0
  147. package/src/stocker-abnormal-bar.ts +247 -0
  148. package/src/stocker-capacity-bar.ts +301 -10
  149. package/src/stocker-carrier-bar.ts +262 -0
  150. package/src/stocker.ts +10 -3
  151. package/src/templates/backdrop.ts +30 -0
  152. package/src/templates/decal.ts +21 -0
  153. package/src/templates/index.ts +7 -1
  154. package/src/templates/scanner.ts +20 -0
  155. package/src/utils/crane-position.ts +105 -0
  156. package/src/utils/data-value.ts +19 -0
  157. package/src/utils/fit-gauge-scale.ts +35 -0
  158. package/src/utils/get-value-on-ranges.ts +2 -4
  159. package/src/utils/stocker-gauge.ts +111 -0
  160. package/src/zone-capacity-bar.ts +5 -5
  161. package/translations/en.json +26 -1
  162. package/translations/ja.json +26 -1
  163. package/translations/ko.json +26 -1
  164. package/translations/ms.json +26 -1
  165. package/translations/zh.json +26 -1
@@ -0,0 +1,54 @@
1
+ /*
2
+ * fmsim 컴포넌트별 z-priority 상수.
3
+ *
4
+ * 같은 평면에 겹친 *다른 type 의* mesh 들이 GPU depth test 에서 결정적으로 정렬되도록
5
+ * 각 컴포넌트 type 마다 unique polygonOffset 값을 부여. 각 RealObject 가 자기 클래스에서
6
+ * `get zPriority(): number` override 로 이 상수 중 하나를 반환.
7
+ *
8
+ * 위치 (geometry vertex, object3d.position) 는 변경하지 않음 — depth buffer 의 fragment
9
+ * depth 값에만 미세 bias.
10
+ *
11
+ * 컨벤션 (높은 값 = 뒤로, 낮은 값 = 앞으로):
12
+ *
13
+ * [14~17] 바닥 paths/lines (가장 뒤)
14
+ * [11~13] 큰 영역 시각화 (container, 흐름 영역)
15
+ * [10] zone capacity bar (영역 표시)
16
+ * [1~9] 바닥 설비 (facility)
17
+ * [0] 이동 entity (AGV/OHT/Crane/Shuttle/Carrier) — default OBJECTS
18
+ * [-1~-4] 설비 위 indicator bar (decal)
19
+ * [-9~-10] overlay / popup (가장 앞)
20
+ */
21
+ export const Z_FMSIM = {
22
+ // ── Floor paths (가장 뒤 — 바닥에 그려지는 선) ──────────────
23
+ AGV_LINE: 17,
24
+ OHT_LINE: 16,
25
+ CRANE_RAIL: 15,
26
+ NODE_PATH: 14,
27
+ PORT_FLOW: 13,
28
+ // ── Container 영역 ────────────────────────────────────────
29
+ STATIC_CONTAINER: 12,
30
+ FLOATING_CONTAINER: 11,
31
+ // ── Zone 표시 ─────────────────────────────────────────────
32
+ ZONE_CAPACITY_BAR: 10,
33
+ // ── 바닥 설비 (facility) ──────────────────────────────────
34
+ NODE: 9,
35
+ SCANNER: 8,
36
+ PORT: 7,
37
+ SHELF: 6,
38
+ STOCKER: 5,
39
+ CONVEYOR: 4,
40
+ CONVEYOR_JOIN: 3,
41
+ BUFFER: 2,
42
+ EQUIPMENT: 1,
43
+ // ── 이동 entity — priority 0 (default OBJECTS), polygonOffset 미적용 ──
44
+ // AGV, OHT, Crane, Shuttle, Carrier — override 안 함
45
+ // ── 설비 위 status indicator bar (decal) ─────────────────
46
+ MCS_GAUGE_CAPACITY_BAR: -1,
47
+ STOCKER_CAPACITY_BAR: -2,
48
+ STOCKER_CARRIER_BAR: -3,
49
+ STOCKER_ABNORMAL_BAR: -4,
50
+ // ── Overlay / popup (가장 앞) ──────────────────────────────
51
+ POPUP: -9,
52
+ CONFIDENTIAL_OVERLAY: -10
53
+ };
54
+ //# sourceMappingURL=z-priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"z-priority.js","sourceRoot":"","sources":["../../src/factories/z-priority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,oDAAoD;IACpD,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IAEb,2DAA2D;IAC3D,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,EAAE;IAEtB,2DAA2D;IAC3D,iBAAiB,EAAE,EAAE;IAErB,yDAAyD;IACzD,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC;IAEZ,oEAAoE;IACpE,mDAAmD;IAEnD,yDAAyD;IACzD,sBAAsB,EAAE,CAAC,CAAC;IAC1B,oBAAoB,EAAE,CAAC,CAAC;IACxB,mBAAmB,EAAE,CAAC,CAAC;IACvB,oBAAoB,EAAE,CAAC,CAAC;IAExB,2DAA2D;IAC3D,KAAK,EAAE,CAAC,CAAC;IACT,oBAAoB,EAAE,CAAC,EAAE;CACjB,CAAA","sourcesContent":["/*\n * fmsim 컴포넌트별 z-priority 상수.\n *\n * 같은 평면에 겹친 *다른 type 의* mesh 들이 GPU depth test 에서 결정적으로 정렬되도록\n * 각 컴포넌트 type 마다 unique polygonOffset 값을 부여. 각 RealObject 가 자기 클래스에서\n * `get zPriority(): number` override 로 이 상수 중 하나를 반환.\n *\n * 위치 (geometry vertex, object3d.position) 는 변경하지 않음 — depth buffer 의 fragment\n * depth 값에만 미세 bias.\n *\n * 컨벤션 (높은 값 = 뒤로, 낮은 값 = 앞으로):\n *\n * [14~17] 바닥 paths/lines (가장 뒤)\n * [11~13] 큰 영역 시각화 (container, 흐름 영역)\n * [10] zone capacity bar (영역 표시)\n * [1~9] 바닥 설비 (facility)\n * [0] 이동 entity (AGV/OHT/Crane/Shuttle/Carrier) — default OBJECTS\n * [-1~-4] 설비 위 indicator bar (decal)\n * [-9~-10] overlay / popup (가장 앞)\n */\n\nexport const Z_FMSIM = {\n // ── Floor paths (가장 뒤 — 바닥에 그려지는 선) ──────────────\n AGV_LINE: 17,\n OHT_LINE: 16,\n CRANE_RAIL: 15,\n NODE_PATH: 14,\n PORT_FLOW: 13,\n\n // ── Container 영역 ────────────────────────────────────────\n STATIC_CONTAINER: 12,\n FLOATING_CONTAINER: 11,\n\n // ── Zone 표시 ─────────────────────────────────────────────\n ZONE_CAPACITY_BAR: 10,\n\n // ── 바닥 설비 (facility) ──────────────────────────────────\n NODE: 9,\n SCANNER: 8,\n PORT: 7,\n SHELF: 6,\n STOCKER: 5,\n CONVEYOR: 4,\n CONVEYOR_JOIN: 3,\n BUFFER: 2,\n EQUIPMENT: 1,\n\n // ── 이동 entity — priority 0 (default OBJECTS), polygonOffset 미적용 ──\n // AGV, OHT, Crane, Shuttle, Carrier — override 안 함\n\n // ── 설비 위 status indicator bar (decal) ─────────────────\n MCS_GAUGE_CAPACITY_BAR: -1,\n STOCKER_CAPACITY_BAR: -2,\n STOCKER_CARRIER_BAR: -3,\n STOCKER_ABNORMAL_BAR: -4,\n\n // ── Overlay / popup (가장 앞) ──────────────────────────────\n POPUP: -9,\n CONFIDENTIAL_OVERLAY: -10\n} as const\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"conveyor-mixin.js","sourceRoot":"","sources":["../../src/features/conveyor-mixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAGlD,SAAS,OAAO,CAAC,SAAc;IAC7B,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAA;IAEjC,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,CAAA;IAExC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAElC,IAAI,KAAK,GAAG,SAAS,CAAC,WAAY,CAAA;IAClC,IAAI,MAAM,GAAG,SAAS,CAAC,QAAS,CAAA;IAChC,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QACxB,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IACvD,CAAC;IAED,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAA;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAA;IAElC,IAAI,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAEjD,OAAO,CAAC,SAAS,EAAE,CAAA;IACnB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;IACzB,OAAO,CAAC,WAAW,GAAG,MAAM,CAAA;IAC5B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;IAE7B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACzB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpB,OAAO,CAAC,IAAI,EAAE,CAAA;IAEd,OAAO,CAAC,SAAS,EAAE,CAAA;IAEnB,OAAO,CAAC,WAAW,GAAG,GAAG,CAAA;IAEzB,IAAI,UAAU,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAA;IAC/C,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACzB,UAAU,GAAG,KAAK,GAAG,UAAU,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IAE7B,OAAO,CAAC,MAAM,EAAE,CAAA;IAEhB,OAAO,SAAS,CAAC,QAAQ,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAuC,IAAW;IAC7E,MAAM,CAAC,GAAG,KAAM,SAAQ,IAAI;QAG1B,OAAO;YACL,KAAK,CAAC,OAAO,EAAE,CAAA;YACf,OAAO,IAAI,CAAC,QAAQ,CAAA;QACtB,CAAC;QAED,IAAI,SAAS;YACX,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;gBACpB,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,IAAI,EAAE,SAAS;aAChB,CAAA;QACH,CAAC;KACF,CAAA;IAED,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;IAElD,OAAO,CAAC,CAAA;AACV,CAAC","sourcesContent":["import { Component } from '@hatiolab/things-scene'\ntype Constructor<T = {}> = new (...args: any[]) => T\n\nfunction pattern(component: any) {\n var { height } = component.bounds\n\n var { rollWidth = 10 } = component.model\n\n var width = Math.max(rollWidth, 1)\n\n var color = component.statusColor!\n var stroke = component.auxColor!\n var lineWidth = 1\n\n if (!component._pattern) {\n component._pattern = document.createElement('canvas')\n }\n\n component._pattern.width = width\n component._pattern.height = height\n\n var context = component._pattern.getContext('2d')\n\n context.beginPath()\n context.fillStyle = color\n context.strokeStyle = stroke\n context.lineWidth = lineWidth\n\n context.moveTo(0, 0)\n context.lineTo(width, 0)\n context.lineTo(width, height)\n context.lineTo(0, height)\n context.lineTo(0, 0)\n context.fill()\n\n context.beginPath()\n\n context.globalAlpha = 0.2\n\n var x_for_belt = (component._step || 0) % width\n if (component.value == 2) {\n x_for_belt = width - x_for_belt\n }\n\n context.moveTo(x_for_belt, height)\n context.lineTo(x_for_belt, 0)\n\n context.stroke()\n\n return component._pattern\n}\n\nexport function ConveyorMixin<TBase extends Constructor<Component>>(Base: TBase) {\n const A = class extends Base {\n _pattern\n\n dispose() {\n super.dispose()\n delete this._pattern\n }\n\n get fillStyle() {\n return {\n image: pattern(this),\n offsetX: 0,\n offsetY: 0,\n type: 'pattern'\n }\n }\n }\n\n Component.memoize(A.prototype, 'fillStyle', false)\n\n return A\n}\n"]}
1
+ {"version":3,"file":"conveyor-mixin.js","sourceRoot":"","sources":["../../src/features/conveyor-mixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAGlD,SAAS,OAAO,CAAC,SAAc;IAC7B,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAA;IAEjC,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,CAAA;IAExC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAElC,IAAI,KAAK,GAAG,SAAS,CAAC,WAAY,CAAA;IAClC,IAAI,MAAM,GAAG,SAAS,CAAC,QAAS,CAAA;IAChC,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QACxB,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IACvD,CAAC;IAED,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAA;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAA;IAElC,IAAI,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAEjD,OAAO,CAAC,SAAS,EAAE,CAAA;IACnB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;IACzB,OAAO,CAAC,WAAW,GAAG,MAAM,CAAA;IAC5B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;IAE7B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACzB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpB,OAAO,CAAC,IAAI,EAAE,CAAA;IAEd,OAAO,CAAC,SAAS,EAAE,CAAA;IAEnB,OAAO,CAAC,WAAW,GAAG,GAAG,CAAA;IAEzB,IAAI,UAAU,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAA;IAC/C,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACzB,UAAU,GAAG,KAAK,GAAG,UAAU,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IAE7B,OAAO,CAAC,MAAM,EAAE,CAAA;IAEhB,OAAO,SAAS,CAAC,QAAQ,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAA4C,IAAW;IAClF,MAAM,CAAC,GAAG,KAAM,SAAQ,IAAI;QAG1B,OAAO;YACL,KAAK,CAAC,OAAO,EAAE,CAAA;YACf,OAAO,IAAI,CAAC,QAAQ,CAAA;QACtB,CAAC;QAED,IAAI,SAAS;YACX,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;gBACpB,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,IAAI,EAAE,SAAS;aAChB,CAAA;QACH,CAAC;KACF,CAAA;IAED,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;IAElD,OAAO,CAAC,CAAA;AACV,CAAC","sourcesContent":["import { Component } from '@hatiolab/things-scene'\ntype Constructor<T = {}> = new (...args: any[]) => T\n\nfunction pattern(component: any) {\n var { height } = component.bounds\n\n var { rollWidth = 10 } = component.model\n\n var width = Math.max(rollWidth, 1)\n\n var color = component.statusColor!\n var stroke = component.auxColor!\n var lineWidth = 1\n\n if (!component._pattern) {\n component._pattern = document.createElement('canvas')\n }\n\n component._pattern.width = width\n component._pattern.height = height\n\n var context = component._pattern.getContext('2d')\n\n context.beginPath()\n context.fillStyle = color\n context.strokeStyle = stroke\n context.lineWidth = lineWidth\n\n context.moveTo(0, 0)\n context.lineTo(width, 0)\n context.lineTo(width, height)\n context.lineTo(0, height)\n context.lineTo(0, 0)\n context.fill()\n\n context.beginPath()\n\n context.globalAlpha = 0.2\n\n var x_for_belt = (component._step || 0) % width\n if (component.value == 2) {\n x_for_belt = width - x_for_belt\n }\n\n context.moveTo(x_for_belt, height)\n context.lineTo(x_for_belt, 0)\n\n context.stroke()\n\n return component._pattern\n}\n\nexport function ConveyorMixin<TBase extends new (...args: any[]) => any>(Base: TBase): any {\n const A = class extends Base {\n _pattern\n\n dispose() {\n super.dispose()\n delete this._pattern\n }\n\n get fillStyle() {\n return {\n image: pattern(this),\n offsetX: 0,\n offsetY: 0,\n type: 'pattern'\n }\n }\n }\n\n Component.memoize(A.prototype, 'fillStyle', false)\n\n return A\n}\n"]}
@@ -51,10 +51,24 @@ export const LEGEND_CARRIER = {
51
51
  EMPTYEMPTY: '#019D59',
52
52
  default: '#F0F0F0'
53
53
  };
54
+ /**
55
+ * carrier legend(테마) 해석 — carrier 컴포넌트(carrier.ts get legend)와 동일 로직 단일 소스.
56
+ * parent 에 carrierLegendName 이 지정되면 그 style 을, 아니면 board 전역 carrierLegendTheme,
57
+ * 둘 다 없으면 LEGEND_CARRIER 기본값. carrier 컴포넌트·스토커 게이지(2D/3D)가 공유한다.
58
+ */
59
+ export function resolveCarrierLegend(component) {
60
+ var _a, _b, _c, _d, _e;
61
+ const carrierLegendName = (_b = (_a = component === null || component === void 0 ? void 0 : component.parent) === null || _a === void 0 ? void 0 : _a.state) === null || _b === void 0 ? void 0 : _b.carrierLegendName;
62
+ if (carrierLegendName) {
63
+ return ((_d = (_c = component.root) === null || _c === void 0 ? void 0 : _c.style) === null || _d === void 0 ? void 0 : _d[carrierLegendName]) || LEGEND_CARRIER;
64
+ }
65
+ return ((_e = component.root) === null || _e === void 0 ? void 0 : _e.carrierLegendTheme) || LEGEND_CARRIER;
66
+ }
54
67
  export const LEGEND_CAPACITY = {
55
68
  '0~20': '#5630D0',
56
69
  '20~80': '#8BDA5B',
57
- '80~100': '#FD9B00',
70
+ '80~': '#FD9B00', // 80% 이상 (= 100% 초과도 포함). 'from~' 형식이라
71
+ // getValueOnRanges 가 value >= 80 매칭.
58
72
  default: '#F0F0F0'
59
73
  };
60
74
  export const BATTERY_RATE_LEGEND = {
@@ -1 +1 @@
1
- {"version":3,"file":"mcs-status-default.js","sourceRoot":"","sources":["../../src/features/mcs-status-default.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,WAAW,GAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,MAAM,EAAE,SAAS,EAAE,eAAe;IAClC,MAAM,EAAE,SAAS,EAAE,KAAK;IACxB,MAAM,EAAE,SAAS,EAAE,eAAe;IAClC,MAAM,EAAE,SAAS,EAAE,KAAK;IACxB,MAAM,EAAE,SAAS,EAAE,YAAY;IAC/B,MAAM,EAAE,SAAS,EAAE,OAAO;IAC1B,MAAM,EAAE,SAAS,EAAE,UAAU;IAC7B,MAAM,EAAE,SAAS,EAAE,QAAQ;IAC3B,MAAM,EAAE,SAAS,EAAE,OAAO;IAC1B,OAAO,EAAE,SAAS;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,MAAM,EAAE,SAAS,EAAE,eAAe;IAClC,MAAM,EAAE,SAAS,EAAE,WAAW;IAC9B,2CAA2C;IAC3C,4CAA4C;IAC5C,yCAAyC;IACzC,wCAAwC;IACxC,MAAM,EAAE,SAAS,EAAE,cAAc;IACjC,MAAM,EAAE,SAAS,EAAE,YAAY;IAC/B,MAAM,EAAE,SAAS,EAAE,WAAW;IAC9B,MAAM,EAAE,SAAS,EAAE,UAAU;IAC7B,MAAM,EAAE,SAAS,EAAE,UAAU;IAC7B,OAAO,EAAE,SAAS;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAW;IACjC,MAAM,EAAE,SAAS,EAAE,SAAS;IAC5B,MAAM,EAAE,SAAS,EAAE,OAAO;IAC1B,MAAM,EAAE,SAAS,EAAE,QAAQ;IAC3B,MAAM,EAAE,SAAS,EAAE,iBAAiB;IACpC,MAAM,EAAE,SAAS,EAAE,gBAAgB;IACnC,MAAM,EAAE,SAAS,EAAE,OAAO;IAC1B,MAAM,EAAE,SAAS,EAAE,eAAe;IAClC,OAAO,EAAE,SAAS;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,MAAM,EAAE,SAAS,EAAE,eAAe;IAClC,6BAA6B;IAC7B,8BAA8B;IAC9B,MAAM,EAAE,SAAS,EAAE,OAAO;IAC1B,MAAM,EAAE,SAAS,EAAE,SAAS;IAC5B,6BAA6B;IAC7B,qCAAqC;IACrC,OAAO,EAAE,SAAS;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,SAAS;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,SAAS;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAW;IACzC,MAAM,EAAE,SAAS,EAAE,kBAAkB;IACrC,OAAO,EAAE,SAAS,EAAE,mBAAmB;IACvC,OAAO,EAAE,SAAS,EAAE,mBAAmB;IACvC,QAAQ,EAAE,SAAS,EAAE,mBAAmB;IACxC,OAAO,EAAE,SAAS;CACnB,CAAA","sourcesContent":["export interface Legend {\n [key: string]: string\n}\n\nexport const LEGEND_NULL: Legend = { default: '#F0F0F0' }\n\nexport const LEGEND_MACHINE: Legend = {\n '1000': '#707070', // DISCONNECTED\n '1001': '#8BDA5B', // UP\n '1002': '#EB3245', // OUTOFSERVICE\n '1003': '#5630D0', // PM\n '1004': '#FFFFFF', // NOTONLINE\n '1005': '#404040', // DOWN\n '1006': '#F4F226', // NOTAUTO\n '1007': '#FD9B00', // ALARM\n '1008': '#4AA7FE', // FULL\n default: '#F0F0F0'\n}\n\nexport const LEGEND_VEHICLE: Legend = {\n '4000': '#EB3245', // OUTOFSERVICE\n '4001': '#8BDA5B', // ASSIGNED\n // '4002': '#cbf266', // ASSIGNED_ACQUIRING\n // '4003': '#cbf266', // ASSIGNED_DEPOSITING\n // '4004': '#cbf266', // ASSIGNED_ENROUTE\n // '4005': '#cbf266', // ASSIGNED_PARKED\n '4006': '#FD9B00', // NOTASSIGNED\n '4007': '#32D1C4', // INSTALLED\n '4008': '#9790EC', // CHARGING\n '4009': '#4AA7FE', // CHARGED\n '4010': '#404040', // REMOVED\n default: '#F0F0F0'\n}\n\nexport const LEGEND_UNIT: Legend = {\n '2000': '#FD9B00', // BANNED\n '2001': '#404040', // DOWN\n '2002': '#8BDA5B', // EMPTY\n '2003': '#FFFFFF', // EMPTY_RESERVED\n '2004': '#32D1C4', // FULL_RESERVED\n '2005': '#4AA7FE', // FULL\n '2006': '#EB3245', // NOTINSERVICE\n default: '#F0F0F0'\n}\n\nexport const LEGEND_CRANE: Legend = {\n '3000': '#EB3245', // OUTOFSERVICE\n // '3001': '#404040', // DOWN\n // '3002': '#8BDA5B', // EMPTY\n '3003': '#FFFFFF', // IDLE\n '3004': '#32D1C4', // ACTIVE\n // '3005': '#4AA7FE', // FULL\n // '3006': '#EB3245', // NOTINSERVICE\n default: '#F0F0F0'\n}\n\nexport const LEGEND_CARRIER: Legend = {\n FULL: '#4AA7FE',\n EMPTY: '#8BDA5B',\n EMPTYEMPTY: '#019D59',\n default: '#F0F0F0'\n}\n\nexport const LEGEND_CAPACITY: Legend = {\n '0~20': '#5630D0',\n '20~80': '#8BDA5B',\n '80~100': '#FD9B00',\n default: '#F0F0F0'\n}\n\nexport const BATTERY_RATE_LEGEND: Legend = {\n '0~20': '#EB3245', // 0-20%: 빨간색 (위험)\n '20~40': '#FD9B00', // 20-40%: 주황색 (경고)\n '40~60': '#F4F226', // 40-60%: 노란색 (주의)\n '60~100': '#8BDA5B', // 60-100%: 녹색 (정상)\n default: '#F0F0F0'\n}\n"]}
1
+ {"version":3,"file":"mcs-status-default.js","sourceRoot":"","sources":["../../src/features/mcs-status-default.ts"],"names":[],"mappings":"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","sourcesContent":["export interface Legend {\n [key: string]: string\n}\n\nexport const LEGEND_NULL: Legend = { default: '#F0F0F0' }\n\nexport const LEGEND_MACHINE: Legend = {\n '1000': '#707070', // DISCONNECTED\n '1001': '#8BDA5B', // UP\n '1002': '#EB3245', // OUTOFSERVICE\n '1003': '#5630D0', // PM\n '1004': '#FFFFFF', // NOTONLINE\n '1005': '#404040', // DOWN\n '1006': '#F4F226', // NOTAUTO\n '1007': '#FD9B00', // ALARM\n '1008': '#4AA7FE', // FULL\n default: '#F0F0F0'\n}\n\nexport const LEGEND_VEHICLE: Legend = {\n '4000': '#EB3245', // OUTOFSERVICE\n '4001': '#8BDA5B', // ASSIGNED\n // '4002': '#cbf266', // ASSIGNED_ACQUIRING\n // '4003': '#cbf266', // ASSIGNED_DEPOSITING\n // '4004': '#cbf266', // ASSIGNED_ENROUTE\n // '4005': '#cbf266', // ASSIGNED_PARKED\n '4006': '#FD9B00', // NOTASSIGNED\n '4007': '#32D1C4', // INSTALLED\n '4008': '#9790EC', // CHARGING\n '4009': '#4AA7FE', // CHARGED\n '4010': '#404040', // REMOVED\n default: '#F0F0F0'\n}\n\nexport const LEGEND_UNIT: Legend = {\n '2000': '#FD9B00', // BANNED\n '2001': '#404040', // DOWN\n '2002': '#8BDA5B', // EMPTY\n '2003': '#FFFFFF', // EMPTY_RESERVED\n '2004': '#32D1C4', // FULL_RESERVED\n '2005': '#4AA7FE', // FULL\n '2006': '#EB3245', // NOTINSERVICE\n default: '#F0F0F0'\n}\n\nexport const LEGEND_CRANE: Legend = {\n '3000': '#EB3245', // OUTOFSERVICE\n // '3001': '#404040', // DOWN\n // '3002': '#8BDA5B', // EMPTY\n '3003': '#FFFFFF', // IDLE\n '3004': '#32D1C4', // ACTIVE\n // '3005': '#4AA7FE', // FULL\n // '3006': '#EB3245', // NOTINSERVICE\n default: '#F0F0F0'\n}\n\nexport const LEGEND_CARRIER: Legend = {\n FULL: '#4AA7FE',\n EMPTY: '#8BDA5B',\n EMPTYEMPTY: '#019D59',\n default: '#F0F0F0'\n}\n\n/**\n * carrier legend(테마) 해석 — carrier 컴포넌트(carrier.ts get legend)와 동일 로직 단일 소스.\n * parent 에 carrierLegendName 이 지정되면 그 style 을, 아니면 board 전역 carrierLegendTheme,\n * 둘 다 없으면 LEGEND_CARRIER 기본값. carrier 컴포넌트·스토커 게이지(2D/3D)가 공유한다.\n */\nexport function resolveCarrierLegend(component: any): Legend {\n const carrierLegendName = component?.parent?.state?.carrierLegendName\n if (carrierLegendName) {\n return (component.root as any)?.style?.[carrierLegendName] || LEGEND_CARRIER\n }\n return (component.root as any)?.carrierLegendTheme || LEGEND_CARRIER\n}\n\nexport const LEGEND_CAPACITY: Legend = {\n '0~20': '#5630D0',\n '20~80': '#8BDA5B',\n '80~': '#FD9B00', // 80% 이상 (= 100% 초과도 포함). 'from~' 형식이라\n // getValueOnRanges 가 value >= 80 매칭.\n default: '#F0F0F0'\n}\n\nexport const BATTERY_RATE_LEGEND: Legend = {\n '0~20': '#EB3245', // 0-20%: 빨간색 (위험)\n '20~40': '#FD9B00', // 20-40%: 주황색 (경고)\n '40~60': '#F4F226', // 40-60%: 노란색 (주의)\n '60~100': '#8BDA5B', // 60-100%: 녹색 (정상)\n default: '#F0F0F0'\n}\n"]}
@@ -37,6 +37,28 @@ export function MCSStatusMixin(Base) {
37
37
  const legend = this.auxLegend;
38
38
  return (status && legend && (legend[status] || legend[status] || legend.default)) || (legend === null || legend === void 0 ? void 0 : legend.default);
39
39
  }
40
+ /**
41
+ * 데이터 변경 시 status 기반 색상을 state.fillStyle 로 반영.
42
+ * things-scene 표준 경로(updateFillStyle)가 2D/3D 모두 자동 갱신하도록 유도.
43
+ *
44
+ * 주의: state.fillStyle 이 runtime 색상으로 덮어써짐. 모델 저장 시 status 색상이
45
+ * 남을 수 있는 트레이드오프가 있음 (data-driven 컴포넌트의 fillStyle 은 의미상
46
+ * 초기값일 뿐 항상 status 가 덮어쓰는 것이 자연스러움).
47
+ */
48
+ onchangeData(after, before) {
49
+ var _a;
50
+ // Base (mixin 인자) 의 onchangeData 를 렉시컬하게 호출.
51
+ // Object.getPrototypeOf(this) 는 leaf 를 가리켜 무한재귀되므로 Base.prototype 직접 사용.
52
+ const baseOnchange = Base.prototype.onchangeData;
53
+ if (typeof baseOnchange === 'function') {
54
+ baseOnchange.call(this, after, before);
55
+ }
56
+ const color = this.statusColor;
57
+ if (color && color !== ((_a = this.state) === null || _a === void 0 ? void 0 : _a.fillStyle)) {
58
+ ;
59
+ this.setState('fillStyle', color);
60
+ }
61
+ }
40
62
  };
41
63
  }
42
64
  //# sourceMappingURL=mcs-status-mixin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcs-status-mixin.js","sourceRoot":"","sources":["../../src/features/mcs-status-mixin.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,OAAO,EAAE,cAAc;SACxB;KACF;CACF,CAAA;AAED,MAAM,UAAU,cAAc,CAA4B,IAAW;IACnE,OAAO,KAAM,SAAQ,IAAI;QACvB,aAAa;YACX,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,MAAM;YACR,OAAM;QACR,CAAC;QAED,IAAI,SAAS;YACX,OAAM;QACR,CAAC;QAED,IAAI,MAAM;YACR,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,IAAI,SAAS;YACX,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,IAAI,WAAW;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAE1B,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,IAAI,SAAS,CAAA;QACpH,CAAC;QAED,IAAI,QAAQ;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAA;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAA;YAE7B,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,CAAA;QACvG,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["type Constructor<T = {}> = new (...args: any[]) => T\n\ninterface Legend {\n [key: string]: string\n}\n\nimport { themesColorMap } from '@fmsim/api'\nimport { LEGEND_NULL } from './mcs-status-default'\n\nexport const MCSStatusMixinProperties = [\n {\n type: 'select',\n label: 'legend-name',\n name: 'legendName',\n property: {\n options: themesColorMap\n }\n }\n]\n\nexport function MCSStatusMixin<TBase extends Constructor>(Base: TBase) {\n return class extends Base {\n isLVComponent() {\n return true\n }\n\n get status(): string | undefined {\n return\n }\n\n get auxStatus(): string | undefined {\n return\n }\n\n get legend(): Legend {\n return LEGEND_NULL\n }\n\n get auxLegend(): Legend {\n return LEGEND_NULL\n }\n\n get statusColor(): string | undefined {\n const status = this.status\n const legend = this.legend\n\n return (status && legend && (legend[status] || legend[status!] || legend.default)) || legend?.default || '#F0F0F0'\n }\n\n get auxColor(): string | undefined {\n const status = this.auxStatus\n const legend = this.auxLegend\n\n return (status && legend && (legend[status] || legend[status!] || legend.default)) || legend?.default\n }\n }\n}\n"]}
1
+ {"version":3,"file":"mcs-status-mixin.js","sourceRoot":"","sources":["../../src/features/mcs-status-mixin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAQlD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,OAAO,EAAE,cAAc;SACxB;KACF;CACF,CAAA;AAED,MAAM,UAAU,cAAc,CAAuC,IAAW;IAC9E,OAAO,KAAM,SAAQ,IAAI;QACvB,aAAa;YACX,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,MAAM;YACR,OAAM;QACR,CAAC;QAED,IAAI,SAAS;YACX,OAAM;QACR,CAAC;QAED,IAAI,MAAM;YACR,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,IAAI,SAAS;YACX,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,IAAI,WAAW;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAE1B,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,IAAI,SAAS,CAAA;QACpH,CAAC;QAED,IAAI,QAAQ;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAA;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAA;YAE7B,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,CAAA;QACvG,CAAC;QAED;;;;;;;WAOG;QACH,YAAY,CAAC,KAAU,EAAE,MAAW;;YAClC,6CAA6C;YAC7C,yEAAyE;YACzE,MAAM,YAAY,GAAI,IAAI,CAAC,SAAiB,CAAC,YAAY,CAAA;YACzD,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;gBACvC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;YACxC,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAA;YAC9B,IAAI,KAAK,IAAI,KAAK,MAAK,MAAC,IAAY,CAAC,KAAK,0CAAE,SAAS,CAAA,EAAE,CAAC;gBACtD,CAAC;gBAAC,IAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { Component } from '@hatiolab/things-scene'\nimport { themesColorMap } from '@fmsim/api'\nimport { LEGEND_NULL } from './mcs-status-default'\n\ntype Constructor<T = {}> = new (...args: any[]) => T\n\ninterface Legend {\n [key: string]: string\n}\n\nexport const MCSStatusMixinProperties = [\n {\n type: 'select',\n label: 'legend-name',\n name: 'legendName',\n property: {\n options: themesColorMap\n }\n }\n]\n\nexport function MCSStatusMixin<TBase extends Constructor<Component>>(Base: TBase): any {\n return class extends Base {\n isLVComponent() {\n return true\n }\n\n get status(): string | undefined {\n return\n }\n\n get auxStatus(): string | undefined {\n return\n }\n\n get legend(): Legend {\n return LEGEND_NULL\n }\n\n get auxLegend(): Legend {\n return LEGEND_NULL\n }\n\n get statusColor(): string | undefined {\n const status = this.status\n const legend = this.legend\n\n return (status && legend && (legend[status] || legend[status!] || legend.default)) || legend?.default || '#F0F0F0'\n }\n\n get auxColor(): string | undefined {\n const status = this.auxStatus\n const legend = this.auxLegend\n\n return (status && legend && (legend[status] || legend[status!] || legend.default)) || legend?.default\n }\n\n /**\n * 데이터 변경 시 status 기반 색상을 state.fillStyle 로 반영.\n * things-scene 표준 경로(updateFillStyle)가 2D/3D 모두 자동 갱신하도록 유도.\n *\n * 주의: state.fillStyle 이 runtime 색상으로 덮어써짐. 모델 저장 시 status 색상이\n * 남을 수 있는 트레이드오프가 있음 (data-driven 컴포넌트의 fillStyle 은 의미상\n * 초기값일 뿐 항상 status 가 덮어쓰는 것이 자연스러움).\n */\n onchangeData(after: any, before: any) {\n // Base (mixin 인자) 의 onchangeData 를 렉시컬하게 호출.\n // Object.getPrototypeOf(this) 는 leaf 를 가리켜 무한재귀되므로 Base.prototype 직접 사용.\n const baseOnchange = (Base.prototype as any).onchangeData\n if (typeof baseOnchange === 'function') {\n baseOnchange.call(this, after, before)\n }\n const color = this.statusColor\n if (color && color !== (this as any).state?.fillStyle) {\n ;(this as any).setState('fillStyle', color)\n }\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mcs-zone-mixin.js","sourceRoot":"","sources":["../../src/features/mcs-zone-mixin.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;KACb;CACF,CAAA;AAED,MAAM,UAAU,YAAY,CAAqC,IAAW;IAC1E,OAAO,KAAM,SAAQ,IAAI;QACvB,IAAI,IAAI;YACN,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,IAAwB;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["type Constructor<T = {}> = new (...args: any[]) => T\n\nimport MCSUnit from 'src/mcs-unit'\n\nexport const MCSZoneMixinProperties = [\n {\n type: 'string',\n label: 'zone',\n name: 'zone'\n }\n]\n\nexport function MCSZoneMixin<TBase extends Constructor<MCSUnit>>(Base: TBase) {\n return class extends Base {\n get zone(): string | undefined {\n return\n }\n\n set zone(zone: string | undefined) {\n this.zone = zone\n }\n }\n}\n"]}
1
+ {"version":3,"file":"mcs-zone-mixin.js","sourceRoot":"","sources":["../../src/features/mcs-zone-mixin.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;KACb;CACF,CAAA;AAED,MAAM,UAAU,YAAY,CAAqC,IAAW;IAC1E,OAAO,KAAM,SAAQ,IAAI;QACvB,IAAI,IAAI;YACN,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,IAAwB;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["type Constructor<T = {}> = new (...args: any[]) => T\n\nimport MCSUnit from 'src/mcs-unit'\n\nexport const MCSZoneMixinProperties = [\n {\n type: 'string',\n label: 'zone',\n name: 'zone'\n }\n]\n\nexport function MCSZoneMixin<TBase extends Constructor<MCSUnit>>(Base: TBase): any {\n return class extends Base {\n get zone(): string | undefined {\n return\n }\n\n set zone(zone: string | undefined) {\n this.zone = zone\n }\n }\n}\n"]}
@@ -1,12 +1,11 @@
1
1
  import MCSMachine from '../mcs-machine';
2
2
  import MCSUnit from '../mcs-unit';
3
- export const ParentObjectMixinProperties = [
4
- {
5
- type: 'string',
6
- label: 'parent-object-id',
7
- name: 'parentObjectId'
8
- }
9
- ];
3
+ /**
4
+ * parentObjectId 는 generic property builder 가 아니라 property-sidebar 의 모델 참조
5
+ * 룩업(ox-input-entity-id, parentObjectTypes 기준 씬 머신/유닛 선택)으로 렌더한다.
6
+ * 따라서 NATURE 속성 목록에서는 제외 — 빈 배열.
7
+ */
8
+ export const ParentObjectMixinProperties = [];
10
9
  export function ParentObjectMixin(Base) {
11
10
  return class extends Base {
12
11
  get parentObject() {
@@ -26,6 +25,15 @@ export function ParentObjectMixin(Base) {
26
25
  return parent;
27
26
  }
28
27
  }
28
+ /**
29
+ * parentObjectId 가 참조하는 모델 컴포넌트 타입들 — parentObject 후보를 모델(씬)에서
30
+ * 수집할 때 이 타입들로 거른다 (머신/유닛 무관, 복수 허용).
31
+ * 빈 배열(기본) 이면 모델의 모든 머신 (폴백). 참조 타입이 정해진 컴포넌트는 override:
32
+ * AGV→['AGVLine'], OHT→['OHTLine'], Crane/Shelf→['STOCKER'], PortFlow→['Port'].
33
+ */
34
+ get parentObjectTypes() {
35
+ return [];
36
+ }
29
37
  };
30
38
  }
31
39
  //# sourceMappingURL=parent-object-mixin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parent-object-mixin.js","sourceRoot":"","sources":["../../src/features/parent-object-mixin.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,gBAAgB,CAAA;AACvC,OAAO,OAAO,MAAM,aAAa,CAAA;AAEjC,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,gBAAgB;KACvB;CACF,CAAA;AAED,MAAM,UAAU,iBAAiB,CAAuC,IAAW;IACjF,OAAO,KAAM,SAAQ,IAAI;QACvB,IAAI,YAAY;;YACd,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;YAEzC,IAAI,cAAc,IAAI,EAAE,EAAE,CAAC;gBACzB,YAAY;gBACZ,MAAM,OAAO,GAAG,CAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC,KAAI,EAAE,CAAA;gBAClE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,MAAM,YAAY,UAAU,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;wBAC9D,OAAO,MAAM,CAAA;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAC1B,IAAI,MAAM,YAAY,UAAU,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9D,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["type Constructor<T = {}> = new (...args: any[]) => T\n\nimport { Component } from '@hatiolab/things-scene'\nimport MCSMachine from '../mcs-machine'\nimport MCSUnit from '../mcs-unit'\n\nexport const ParentObjectMixinProperties = [\n {\n type: 'string',\n label: 'parent-object-id',\n name: 'parentObjectId'\n }\n]\n\nexport function ParentObjectMixin<TBase extends Constructor<Component>>(Base: TBase) {\n return class extends Base {\n get parentObject(): MCSMachine | MCSUnit | undefined {\n const { id, parentObjectId } = this.state\n\n if (parentObjectId || id) {\n //@ts-ignore\n const targets = this.root?.findAllById(parentObjectId || id) || []\n for (const target of targets) {\n if (target instanceof MCSMachine || target instanceof MCSUnit) {\n return target\n }\n }\n }\n\n const parent = this.parent\n if (parent instanceof MCSMachine || parent instanceof MCSUnit) {\n return parent\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"parent-object-mixin.js","sourceRoot":"","sources":["../../src/features/parent-object-mixin.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,gBAAgB,CAAA;AACvC,OAAO,OAAO,MAAM,aAAa,CAAA;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAU,EAAE,CAAA;AAEpD,MAAM,UAAU,iBAAiB,CAAuC,IAAW;IACjF,OAAO,KAAM,SAAQ,IAAI;QACvB,IAAI,YAAY;;YACd,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;YAEzC,IAAI,cAAc,IAAI,EAAE,EAAE,CAAC;gBACzB,YAAY;gBACZ,MAAM,OAAO,GAAG,CAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC,KAAI,EAAE,CAAA;gBAClE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,MAAM,YAAY,UAAU,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;wBAC9D,OAAO,MAAM,CAAA;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAC1B,IAAI,MAAM,YAAY,UAAU,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9D,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;QAED;;;;;WAKG;QACH,IAAI,iBAAiB;YACnB,OAAO,EAAE,CAAA;QACX,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["type Constructor<T = {}> = new (...args: any[]) => T\n\nimport { Component } from '@hatiolab/things-scene'\nimport MCSMachine from '../mcs-machine'\nimport MCSUnit from '../mcs-unit'\n\n/**\n * parentObjectId 는 generic property builder 가 아니라 property-sidebar 의 모델 참조\n * 룩업(ox-input-entity-id, parentObjectTypes 기준 씬 머신/유닛 선택)으로 렌더한다.\n * 따라서 NATURE 속성 목록에서는 제외 — 빈 배열.\n */\nexport const ParentObjectMixinProperties: any[] = []\n\nexport function ParentObjectMixin<TBase extends Constructor<Component>>(Base: TBase): any {\n return class extends Base {\n get parentObject(): MCSMachine | MCSUnit | undefined {\n const { id, parentObjectId } = this.state\n\n if (parentObjectId || id) {\n //@ts-ignore\n const targets = this.root?.findAllById(parentObjectId || id) || []\n for (const target of targets) {\n if (target instanceof MCSMachine || target instanceof MCSUnit) {\n return target\n }\n }\n }\n\n const parent = this.parent\n if (parent instanceof MCSMachine || parent instanceof MCSUnit) {\n return parent\n }\n }\n\n /**\n * parentObjectId 가 참조하는 모델 컴포넌트 타입들 — parentObject 후보를 모델(씬)에서\n * 수집할 때 이 타입들로 거른다 (머신/유닛 무관, 복수 허용).\n * 빈 배열(기본) 이면 모델의 모든 머신 (폴백). 참조 타입이 정해진 컴포넌트는 override:\n * AGV→['AGVLine'], OHT→['OHTLine'], Crane/Shelf→['STOCKER'], PortFlow→['Port'].\n */\n get parentObjectTypes(): string[] {\n return []\n }\n }\n}\n"]}
@@ -40,6 +40,11 @@ const NATURE = {
40
40
  ]
41
41
  };
42
42
  let FloatingContainer = class FloatingContainer extends Container {
43
+ // things-scene 의 `declare const Container_base` 패턴이 base 인스턴스 타입의 accessor
44
+ // 정보를 object-type property 로 평탄화하여 TS2611 발생. 동일 위치를 override 하는
45
+ // 케이스가 operato-scene 엔 없어 fmsim 만 영향. things-scene 측 mixin 타입 패턴이
46
+ // 개선되면 제거.
47
+ // @ts-expect-error TS2611
43
48
  get position() {
44
49
  var _a;
45
50
  return ((_a = this.app) === null || _a === void 0 ? void 0 : _a.isViewMode) ? 'absolute' : 'static';
@@ -1 +1 @@
1
- {"version":3,"file":"floating-container.js","sourceRoot":"","sources":["../src/floating-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;QACV;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC1B,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;oBAC1C,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;oBAC9C,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;oBAC5C,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;oBAChD,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;oBACpD,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;oBAClD,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;oBAChD,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;oBACpD,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;iBACnD;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,SAAS;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,SAAS;SAChB;KACF;CACF,CAAA;AAEc,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,SAAS;IACtD,IAAI,QAAQ;;QACV,OAAO,CAAA,MAAA,IAAI,CAAC,GAAG,0CAAE,UAAU,EAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAA;IACrD,CAAC;IAED,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA;AARoB,iBAAiB;IADrC,cAAc,CAAC,mBAAmB,CAAC;GACf,iBAAiB,CAQrC;eARoB,iBAAiB","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 type: 'select',\n label: 'position-origin',\n name: 'origin',\n property: {\n options: [\n { display: '', value: '' },\n { display: 'left-top', value: 'left-top' },\n { display: 'center-top', value: 'center-top' },\n { display: 'right-top', value: 'right-top' },\n { display: 'left-middle', value: 'left-middle' },\n { display: 'center-middle', value: 'center-middle' },\n { display: 'right-middle', value: 'right-middle' },\n { display: 'left-bottom', value: 'left-bottom' },\n { display: 'center-bottom', value: 'center-bottom' },\n { display: 'right-bottom', value: 'right-bottom' }\n ]\n }\n },\n {\n type: 'number',\n label: 'offset-x',\n name: 'offsetX'\n },\n {\n type: 'number',\n label: 'offset-y',\n name: 'offsetY'\n }\n ]\n}\n@sceneComponent('FloatingContainer')\nexport default class FloatingContainer extends Container {\n get position() {\n return this.app?.isViewMode ? 'absolute' : 'static'\n }\n\n get nature() {\n return NATURE\n }\n}\n"]}
1
+ {"version":3,"file":"floating-container.js","sourceRoot":"","sources":["../src/floating-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;QACV;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC1B,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;oBAC1C,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;oBAC9C,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;oBAC5C,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;oBAChD,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;oBACpD,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;oBAClD,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;oBAChD,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;oBACpD,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;iBACnD;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,SAAS;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,SAAS;SAChB;KACF;CACF,CAAA;AAEc,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,SAAS;IACtD,2EAA2E;IAC3E,iEAAiE;IACjE,kEAAkE;IAClE,WAAW;IACX,0BAA0B;IAC1B,IAAI,QAAQ;;QACV,OAAO,CAAA,MAAA,IAAI,CAAC,GAAG,0CAAE,UAAU,EAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAA;IACrD,CAAC;IAED,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA;AAboB,iBAAiB;IADrC,cAAc,CAAC,mBAAmB,CAAC;GACf,iBAAiB,CAarC;eAboB,iBAAiB","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 type: 'select',\n label: 'position-origin',\n name: 'origin',\n property: {\n options: [\n { display: '', value: '' },\n { display: 'left-top', value: 'left-top' },\n { display: 'center-top', value: 'center-top' },\n { display: 'right-top', value: 'right-top' },\n { display: 'left-middle', value: 'left-middle' },\n { display: 'center-middle', value: 'center-middle' },\n { display: 'right-middle', value: 'right-middle' },\n { display: 'left-bottom', value: 'left-bottom' },\n { display: 'center-bottom', value: 'center-bottom' },\n { display: 'right-bottom', value: 'right-bottom' }\n ]\n }\n },\n {\n type: 'number',\n label: 'offset-x',\n name: 'offsetX'\n },\n {\n type: 'number',\n label: 'offset-y',\n name: 'offsetY'\n }\n ]\n}\n@sceneComponent('FloatingContainer')\nexport default class FloatingContainer extends Container {\n // things-scene 의 `declare const Container_base` 패턴이 base 인스턴스 타입의 accessor\n // 정보를 object-type property 로 평탄화하여 TS2611 발생. 동일 위치를 override 하는\n // 케이스가 operato-scene 엔 없어 fmsim 만 영향. things-scene 측 mixin 타입 패턴이\n // 개선되면 제거.\n // @ts-expect-error TS2611\n get position() {\n return this.app?.isViewMode ? 'absolute' : 'static'\n }\n\n get nature() {\n return NATURE\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -1,13 +1,63 @@
1
- import './scene/root-container-override.js';
1
+ // ── side-effect: scene override ──
2
+ import './scene/root-container-override';
3
+ // ── side-effect: 3D factories ──
4
+ import './factories/machine-3d';
5
+ import './factories/conveyor-3d';
6
+ import './factories/agv-3d';
7
+ import './factories/oht-3d';
8
+ import './factories/shuttle-3d';
9
+ import './factories/crane-3d';
10
+ import './factories/crane-rail-3d';
11
+ // 기본 factory (RealObjectDomTexture) 쓰는 컴포넌트들의 z-priority override
12
+ import './factories/z-priority-defaults';
13
+ // ── side-effect: @sceneComponent 등록 (tree-shaking 방지) ──
14
+ // bars & overlays
15
+ import './zone-capacity-bar';
16
+ import './stocker-capacity-bar';
17
+ import './stocker-carrier-bar';
18
+ import './stocker-abnormal-bar';
19
+ import './port-flow';
20
+ // facilities
21
+ import './agv-line';
22
+ import './buffer';
23
+ import './conveyor';
24
+ import './conveyor-join';
25
+ import './equipment';
26
+ import './oht-line';
27
+ import './stocker';
28
+ import './crane-rail';
29
+ import './scanner';
30
+ // vehicles
31
+ import './agv';
32
+ import './oht';
33
+ import './shuttle';
34
+ // units
35
+ import './port';
36
+ import './crane';
37
+ import './shelf';
38
+ import './carrier';
39
+ // topology
40
+ import './node';
41
+ import './node-path';
42
+ // containers
43
+ import './floating-container';
44
+ import './static-container';
45
+ import './clickable-popup';
46
+ // ── groups ──
2
47
  export { default as MachineGroups } from './groups';
48
+ // ── base classes ──
3
49
  export { default as MCSMachine } from './mcs-machine';
4
50
  export { default as MCSUnit } from './mcs-unit';
5
51
  export { default as MCSCarrierHolder } from './mcs-carrier-holder';
6
52
  export { default as MCSVehicle } from './mcs-vehicle';
7
53
  export { default as MCSTransport } from './mcs-transport';
54
+ // ── bars & overlays ──
8
55
  export { default as ZoneCapacityBar } from './zone-capacity-bar';
9
56
  export { default as StockerCapacityBar } from './stocker-capacity-bar';
57
+ export { default as StockerCarrierBar } from './stocker-carrier-bar';
58
+ export { default as StockerAbnormalBar } from './stocker-abnormal-bar';
10
59
  export { default as PortFlow } from './port-flow';
60
+ // ── facilities ──
11
61
  export { default as AGVLine } from './agv-line';
12
62
  export { default as Buffer } from './buffer';
13
63
  export { default as Conveyor } from './conveyor';
@@ -15,16 +65,22 @@ export { default as ConveyorJoin } from './conveyor-join';
15
65
  export { default as Equipment } from './equipment';
16
66
  export { default as OHTLine } from './oht-line';
17
67
  export { default as Stocker } from './stocker';
68
+ export { default as CraneRail } from './crane-rail';
69
+ export { default as Scanner } from './scanner';
70
+ // ── vehicles ──
18
71
  export { default as AGV } from './agv';
19
72
  export { default as OHT } from './oht';
20
73
  export { default as Shuttle } from './shuttle';
74
+ // ── units ──
21
75
  export { default as Port } from './port';
22
76
  export { default as Crane } from './crane';
23
77
  export { default as Shelf } from './shelf';
24
78
  export { default as Carrier } from './carrier';
79
+ // ── topology ──
25
80
  export { default as Node } from './node';
26
81
  export { default as NodePath } from './node-path';
82
+ // ── containers ──
27
83
  export { default as FloatingContainer } from './floating-container';
28
- export { default as StaticContainer } from './static-container.js';
84
+ export { default as StaticContainer } from './static-container';
29
85
  export { default as ClickablePopup } from './clickable-popup';
30
86
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,oCAAoC,CAAA;AAE3C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,UAAU,CAAA;AAEnD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA","sourcesContent":["import './scene/root-container-override.js'\n\nexport { default as MachineGroups } from './groups'\n\nexport { default as MCSMachine } from './mcs-machine'\nexport { default as MCSUnit } from './mcs-unit'\nexport { default as MCSCarrierHolder } from './mcs-carrier-holder'\nexport { default as MCSVehicle } from './mcs-vehicle'\nexport { default as MCSTransport } from './mcs-transport'\nexport { default as ZoneCapacityBar } from './zone-capacity-bar'\nexport { default as StockerCapacityBar } from './stocker-capacity-bar'\nexport { default as PortFlow } from './port-flow'\n\nexport { default as AGVLine } from './agv-line'\nexport { default as Buffer } from './buffer'\nexport { default as Conveyor } from './conveyor'\nexport { default as ConveyorJoin } from './conveyor-join'\nexport { default as Equipment } from './equipment'\nexport { default as OHTLine } from './oht-line'\nexport { default as Stocker } from './stocker'\n\nexport { default as AGV } from './agv'\nexport { default as OHT } from './oht'\nexport { default as Shuttle } from './shuttle'\n\nexport { default as Port } from './port'\nexport { default as Crane } from './crane'\nexport { default as Shelf } from './shelf'\nexport { default as Carrier } from './carrier'\n\nexport { default as Node } from './node'\nexport { default as NodePath } from './node-path'\n\nexport { default as FloatingContainer } from './floating-container'\nexport { default as StaticContainer } from './static-container.js'\nexport { default as ClickablePopup } from './clickable-popup'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// ── side-effect: scene override ──\nimport './scene/root-container-override'\n\n// ── side-effect: 3D factories ──\nimport './factories/machine-3d'\nimport './factories/conveyor-3d'\nimport './factories/agv-3d'\nimport './factories/oht-3d'\nimport './factories/shuttle-3d'\nimport './factories/crane-3d'\nimport './factories/crane-rail-3d'\n// 기본 factory (RealObjectDomTexture) 쓰는 컴포넌트들의 z-priority override\nimport './factories/z-priority-defaults'\n\n// ── side-effect: @sceneComponent 등록 (tree-shaking 방지) ──\n// bars & overlays\nimport './zone-capacity-bar'\nimport './stocker-capacity-bar'\nimport './stocker-carrier-bar'\nimport './stocker-abnormal-bar'\nimport './port-flow'\n\n// facilities\nimport './agv-line'\nimport './buffer'\nimport './conveyor'\nimport './conveyor-join'\nimport './equipment'\nimport './oht-line'\nimport './stocker'\nimport './crane-rail'\nimport './scanner'\n\n// vehicles\nimport './agv'\nimport './oht'\nimport './shuttle'\n\n// units\nimport './port'\nimport './crane'\nimport './shelf'\nimport './carrier'\n\n// topology\nimport './node'\nimport './node-path'\n\n// containers\nimport './floating-container'\nimport './static-container'\nimport './clickable-popup'\n\n// ── groups ──\nexport { default as MachineGroups } from './groups'\n\n// ── base classes ──\nexport { default as MCSMachine } from './mcs-machine'\nexport { default as MCSUnit } from './mcs-unit'\nexport { default as MCSCarrierHolder } from './mcs-carrier-holder'\nexport { default as MCSVehicle } from './mcs-vehicle'\nexport { default as MCSTransport } from './mcs-transport'\n\n// ── bars & overlays ──\nexport { default as ZoneCapacityBar } from './zone-capacity-bar'\nexport { default as StockerCapacityBar } from './stocker-capacity-bar'\nexport { default as StockerCarrierBar } from './stocker-carrier-bar'\nexport { default as StockerAbnormalBar } from './stocker-abnormal-bar'\nexport { default as PortFlow } from './port-flow'\n\n// ── facilities ──\nexport { default as AGVLine } from './agv-line'\nexport { default as Buffer } from './buffer'\nexport { default as Conveyor } from './conveyor'\nexport { default as ConveyorJoin } from './conveyor-join'\nexport { default as Equipment } from './equipment'\nexport { default as OHTLine } from './oht-line'\nexport { default as Stocker } from './stocker'\nexport { default as CraneRail } from './crane-rail'\nexport { default as Scanner } from './scanner'\n\n// ── vehicles ──\nexport { default as AGV } from './agv'\nexport { default as OHT } from './oht'\nexport { default as Shuttle } from './shuttle'\n\n// ── units ──\nexport { default as Port } from './port'\nexport { default as Crane } from './crane'\nexport { default as Shelf } from './shelf'\nexport { default as Carrier } from './carrier'\n\n// ── topology ──\nexport { default as Node } from './node'\nexport { default as NodePath } from './node-path'\n\n// ── containers ──\nexport { default as FloatingContainer } from './floating-container'\nexport { default as StaticContainer } from './static-container'\nexport { default as ClickablePopup } from './clickable-popup'\n"]}
@@ -1,6 +1,19 @@
1
- import { Model } from '@hatiolab/things-scene';
2
1
  import { themesColorMap, themesAnimationMap } from '@fmsim/api';
3
2
  import MCSUnit from './mcs-unit.js';
3
+ import { parseIfJsonString } from './utils/data-value';
4
+ /**
5
+ * Holder.data 변경 감지 시 carrierManager 에 전달할 4 키 묶음 + multiCarriers 배열.
6
+ * 비교 결과 단 하나라도 다르면 carrierManager.update 호출.
7
+ * (데이터 키는 모두 대문자 전제 — 케이스 정규화 없이 직접 읽는다)
8
+ */
9
+ const CARRIER_DATA_KEYS = ['CARRIERNAME', 'CARRIERTYPE', 'EMPTYTYPE', 'CARRIERSTATUS'];
10
+ function multiCarriersChanged(a, b) {
11
+ var _a, _b;
12
+ // MULTICARRIERS 값이 JSON 문자열로 올 수 있어 파싱 후 비교. shallow JSON 비교로 충분 —
13
+ // 각 항목이 4 키 primitive 만 가짐. 빈/누락은 같은 '[]' 직렬화로 동치 취급.
14
+ return (JSON.stringify((_a = parseIfJsonString(a === null || a === void 0 ? void 0 : a.MULTICARRIERS)) !== null && _a !== void 0 ? _a : []) !==
15
+ JSON.stringify((_b = parseIfJsonString(b === null || b === void 0 ? void 0 : b.MULTICARRIERS)) !== null && _b !== void 0 ? _b : []));
16
+ }
4
17
  export default class MCSCarrierHolder extends MCSUnit {
5
18
  static get properties() {
6
19
  return [
@@ -26,32 +39,58 @@ export default class MCSCarrierHolder extends MCSUnit {
26
39
  label: 'show-carrier-text',
27
40
  name: 'showCarrierText'
28
41
  }
42
+ // 적층 두께는 carrier 측 (Carrier.added) 에서 자기 default depth 를 결정.
43
+ // holder 측에는 별도 carrierDepth 속성을 두지 않는다.
29
44
  ];
30
45
  }
31
- ready() {
32
- super.ready();
33
- for (let component of this.components) {
34
- this.removeComponent(component);
35
- }
36
- this.carrier = Model.compile({
37
- type: 'Carrier',
38
- showText: this.getState('showCarrierText') || false
39
- }, this.root.app);
40
- this.addComponent(this.carrier);
41
- this.carrier.data = this.data;
46
+ get showOverflow() {
47
+ return true;
48
+ }
49
+ get hierarchy() {
50
+ return Object.assign(Object.assign({}, super.hierarchy), { components: [] });
42
51
  }
43
52
  dispose() {
44
- this.carrier = null;
53
+ var _a, _b;
54
+ ;
55
+ (_b = (_a = this.root) === null || _a === void 0 ? void 0 : _a.carrierManager) === null || _b === void 0 ? void 0 : _b.update(this, {}, this.data);
45
56
  super.dispose();
46
57
  }
47
- get hierarchy() {
48
- return Object.assign(Object.assign({}, super.hierarchy), { components: [] });
58
+ async ready() {
59
+ super.ready();
60
+ if (this._hasCarrierData(this.data)) {
61
+ ;
62
+ this.root.carrierManager.update(this, this.data || {}, undefined);
63
+ }
49
64
  }
50
65
  onchangeData(after, before) {
51
- if (this.carrier) {
52
- this.carrier.data = this.data;
66
+ const afterData = after.data || {};
67
+ const beforeData = before.data || {};
68
+ let changed = false;
69
+ for (const k of CARRIER_DATA_KEYS) {
70
+ if (afterData[k] !== beforeData[k]) {
71
+ changed = true;
72
+ break;
73
+ }
74
+ }
75
+ if (!changed) {
76
+ changed = multiCarriersChanged(afterData, beforeData);
77
+ }
78
+ if (changed) {
79
+ ;
80
+ this.root.carrierManager.update(this, afterData, beforeData);
53
81
  }
54
82
  super.onchangeData(after, before);
55
83
  }
84
+ /** data 안에 carrier 정보 (대표 또는 multiCarriers) 가 하나라도 있는지. */
85
+ _hasCarrierData(data) {
86
+ if (!data)
87
+ return false;
88
+ if (data.CARRIERNAME)
89
+ return true;
90
+ const list = parseIfJsonString(data.MULTICARRIERS);
91
+ if (Array.isArray(list) && list.some((a) => a === null || a === void 0 ? void 0 : a.CARRIERNAME))
92
+ return true;
93
+ return false;
94
+ }
56
95
  }
57
96
  //# sourceMappingURL=mcs-carrier-holder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcs-carrier-holder.js","sourceRoot":"","sources":["../src/mcs-carrier-holder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,OAAO,MAAM,eAAe,CAAA;AAGnC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,OAAO,CAAC,UAAU;YACrB;gBACE,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,qBAAqB;gBAC5B,IAAI,EAAE,mBAAmB;gBACzB,QAAQ,EAAE;oBACR,OAAO,EAAE,cAAc;iBACxB;aACF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,wBAAwB;gBAC/B,IAAI,EAAE,sBAAsB;gBAC5B,QAAQ,EAAE;oBACR,OAAO,EAAE,kBAAkB;iBAC5B;aACF;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,iBAAiB;aACxB;SACF,CAAA;IACH,CAAC;IAID,KAAK;QACH,KAAK,CAAC,KAAK,EAAE,CAAA;QAEb,KAAK,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QACjC,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAC1B;YACE,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK;SACpD,EACD,IAAI,CAAC,IAAI,CAAC,GAAG,CACP,CAAA;QAER,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAA;QAEhC,IAAI,CAAC,OAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QAEnB,KAAK,CAAC,OAAO,EAAE,CAAA;IACjB,CAAC;IAED,IAAI,SAAS;QACX,uCACK,KAAK,CAAC,SAAS,KAClB,UAAU,EAAE,EAAE,IACf;IACH,CAAC;IAED,YAAY,CAAC,KAAiB,EAAE,MAAkB;QAChD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAC/B,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;CACF","sourcesContent":["import { Model, Properties } from '@hatiolab/things-scene'\nimport { themesColorMap, themesAnimationMap } from '@fmsim/api'\nimport MCSUnit from './mcs-unit.js'\nimport Carrier from './carrier.js'\n\nexport default class MCSCarrierHolder extends MCSUnit {\n static get properties(): any {\n return [\n ...MCSUnit.properties,\n {\n type: 'select',\n label: 'carrier-legend-name',\n name: 'carrierLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'carrier-animation-name',\n name: 'carrierAnimationName',\n property: {\n options: themesAnimationMap\n }\n },\n {\n type: 'boolean',\n label: 'show-carrier-text',\n name: 'showCarrierText'\n }\n ]\n }\n\n carrier?: Carrier | null\n\n ready() {\n super.ready()\n\n for (let component of this.components) {\n this.removeComponent(component)\n }\n\n this.carrier = Model.compile(\n {\n type: 'Carrier',\n showText: this.getState('showCarrierText') || false\n },\n this.root.app\n ) as any\n\n this.addComponent(this.carrier!)\n\n this.carrier!.data = this.data\n }\n\n dispose(): void {\n this.carrier = null\n\n super.dispose()\n }\n\n get hierarchy() {\n return {\n ...super.hierarchy,\n components: []\n }\n }\n\n onchangeData(after: Properties, before: Properties): void {\n if (this.carrier) {\n this.carrier.data = this.data\n }\n\n super.onchangeData(after, before)\n }\n}\n"]}
1
+ {"version":3,"file":"mcs-carrier-holder.js","sourceRoot":"","sources":["../src/mcs-carrier-holder.ts"],"names":[],"mappings":"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","sourcesContent":["import { themesColorMap, themesAnimationMap } from '@fmsim/api'\nimport MCSUnit from './mcs-unit.js'\nimport { parseIfJsonString } from './utils/data-value'\n\n/**\n * Holder.data 변경 감지 시 carrierManager 에 전달할 4 키 묶음 + multiCarriers 배열.\n * 비교 결과 단 하나라도 다르면 carrierManager.update 호출.\n * (데이터 키는 모두 대문자 전제 — 케이스 정규화 없이 직접 읽는다)\n */\nconst CARRIER_DATA_KEYS = ['CARRIERNAME', 'CARRIERTYPE', 'EMPTYTYPE', 'CARRIERSTATUS'] as const\n\nfunction multiCarriersChanged(a: any, b: any): boolean {\n // MULTICARRIERS 값이 JSON 문자열로 올 수 있어 파싱 후 비교. shallow JSON 비교로 충분 —\n // 각 항목이 4 키 primitive 만 가짐. 빈/누락은 같은 '[]' 직렬화로 동치 취급.\n return (\n JSON.stringify(parseIfJsonString(a?.MULTICARRIERS) ?? []) !==\n JSON.stringify(parseIfJsonString(b?.MULTICARRIERS) ?? [])\n )\n}\n\nexport default class MCSCarrierHolder extends MCSUnit {\n static get properties(): any {\n return [\n ...MCSUnit.properties,\n {\n type: 'select',\n label: 'carrier-legend-name',\n name: 'carrierLegendName',\n property: {\n options: themesColorMap\n }\n },\n {\n type: 'select',\n label: 'carrier-animation-name',\n name: 'carrierAnimationName',\n property: {\n options: themesAnimationMap\n }\n },\n {\n type: 'boolean',\n label: 'show-carrier-text',\n name: 'showCarrierText'\n }\n // 적층 두께는 carrier 측 (Carrier.added) 에서 자기 default depth 를 결정.\n // holder 측에는 별도 carrierDepth 속성을 두지 않는다.\n ]\n }\n\n get showOverflow() {\n return true\n }\n\n get hierarchy() {\n return {\n ...super.hierarchy,\n components: []\n }\n }\n\n dispose(): void {\n ;(this.root as any)?.carrierManager?.update(this, {}, this.data)\n super.dispose()\n }\n\n async ready() {\n super.ready()\n\n if (this._hasCarrierData(this.data)) {\n ;(this.root as any).carrierManager.update(this, this.data || {}, undefined)\n }\n }\n\n onchangeData(after: Record<string, any>, before: Record<string, any>): void {\n const afterData = after.data || {}\n const beforeData = before.data || {}\n\n let changed = false\n for (const k of CARRIER_DATA_KEYS) {\n if (afterData[k] !== beforeData[k]) {\n changed = true\n break\n }\n }\n if (!changed) {\n changed = multiCarriersChanged(afterData, beforeData)\n }\n\n if (changed) {\n ;(this.root as any).carrierManager.update(this, afterData, beforeData)\n }\n\n super.onchangeData(after, before)\n }\n\n /** data 안에 carrier 정보 (대표 또는 multiCarriers) 가 하나라도 있는지. */\n private _hasCarrierData(data: any): boolean {\n if (!data) return false\n if (data.CARRIERNAME) return true\n const list = parseIfJsonString(data.MULTICARRIERS)\n if (Array.isArray(list) && list.some((a: any) => a?.CARRIERNAME)) return true\n return false\n }\n}\n"]}
@@ -21,6 +21,17 @@ export default class MCSMachine extends MCSStatusMixin(ContainerAbstract) {
21
21
  get showMoveHandle() {
22
22
  return false;
23
23
  }
24
+ /**
25
+ * id 후보를 조회할 때 백엔드에 보낼 타입명. 값이 있으면 검색(lookup) 대상.
26
+ * 기본은 자기 타입. 자기 타입과 다른 타입으로 조회해야 하는 특수 케이스는 override.
27
+ */
28
+ get idLookupType() {
29
+ return this.state.type;
30
+ }
31
+ /** MCS 머신 — parentObject(부모 머신) 후보 수집 시 머신으로 식별. */
32
+ get isMcsMachine() {
33
+ return true;
34
+ }
24
35
  containable(component) {
25
36
  return ['rect', 'ellipse'].includes(component.state.type);
26
37
  }
@@ -57,6 +68,34 @@ export default class MCSMachine extends MCSStatusMixin(ContainerAbstract) {
57
68
  getLegendFallback() {
58
69
  return LEGEND_MACHINE;
59
70
  }
71
+ /**
72
+ * In 2D, ignore `state.alpha`; preserve everything else.
73
+ *
74
+ * things-scene's base prerender (component-drawing.ts:31, 44) does:
75
+ * const fade = (alpha || 1) - this._delta.fade
76
+ * if (fade) context.globalAlpha = fade
77
+ *
78
+ * It *overwrites* `globalAlpha` (not multiplies), so the inherited
79
+ * parent alpha is also lost — that's a base-layer quirk we match the
80
+ * recovery for. Then at line 48 it applies editMode+hidden dimming
81
+ * with a *= 0.5.
82
+ *
83
+ * Our recovery:
84
+ * 1. Capture the inherited `globalAlpha` *before* super runs.
85
+ * 2. Let super do its work (transforms / shadow / dim flags).
86
+ * 3. Restore globalAlpha to inherited × editMode-hidden dim factor —
87
+ * i.e., what super would have produced if our state.alpha were 1.
88
+ *
89
+ * 3D path is unaffected: 3D factories read `state.alpha` directly via
90
+ * their `updateAlpha()` implementations and continue to honor it (with
91
+ * per-config opacity fallback).
92
+ */
93
+ prerender(ctx) {
94
+ const inherited = ctx.globalAlpha;
95
+ super.prerender(ctx);
96
+ const dim = this.app.isEditMode && this.hidden ? 0.5 : 1;
97
+ ctx.globalAlpha = inherited * dim;
98
+ }
60
99
  render(ctx) {
61
100
  var { round = 0, lineWidth } = this.state;
62
101
  var { left, top, width, height } = this.bounds;
@@ -1 +1 @@
1
- {"version":3,"file":"mcs-machine.js","sourceRoot":"","sources":["../src/mcs-machine.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ContainerAbstract } from '@hatiolab/things-scene'\nimport { getPopupData } from '@fmsim/api'\n\nimport { MCSStatusMixin, MCSStatusMixinProperties } from './features/mcs-status-mixin'\n\nimport { LEGEND_MACHINE, Legend } from './features/mcs-status-default'\n\n/**\n * MCS Machine의 공통 속성을 정의한 최상위 오브젝트\n * - Container\n * -\n */\nexport default class MCSMachine extends MCSStatusMixin(ContainerAbstract) {\n static get properties(): any {\n return [\n ...MCSStatusMixinProperties,\n {\n type: 'number',\n name: 'round',\n label: 'round'\n }\n ]\n }\n\n get showMoveHandle() {\n return false\n }\n\n containable(component: Component) {\n return ['rect', 'ellipse'].includes(component.state.type)\n }\n\n get decorators() {\n return ['decotag']\n }\n\n getTheme() {\n const { legendName } = this.state\n\n if (legendName) {\n return this.root?.style?.[legendName]\n }\n }\n\n get hasTextProperty() {\n return true\n }\n\n get status() {\n return this.data?.STATUS\n }\n\n get auxStatus() {\n return this.data?.STATUS\n }\n\n get legend(): Legend {\n return this.getTheme() || this.getLegendFallback()\n }\n\n get auxLegend() {\n return LEGEND_MACHINE\n }\n\n get auxColor() {\n return this.state.strokeStyle\n }\n\n getLegendFallback() {\n return LEGEND_MACHINE\n }\n\n render(ctx) {\n var { round = 0, lineWidth } = this.state\n var { left, top, width, height } = this.bounds\n\n ctx.beginPath()\n\n ctx.strokeStyle = this.auxColor\n ctx.fillStyle = this.statusColor!\n ctx.lineWidth = lineWidth || 1\n ctx.lineCap = 'round'\n ctx.setLineDash([])\n\n if (round > 0) {\n ctx.roundRect(left, top, width, height, round)\n } else {\n ctx.rect(left, top, width, height)\n }\n\n ctx.fill()\n ctx.stroke()\n }\n\n // get text() {\n // if (this.data?.LOCALENAME) {\n // // TODO 왜 LOCALENAME 데이타는 문자열인가 ? 오브젝트로 보내달라.\n // return JSON.parse(this.data.LOCALENAME)[getLocaleLanguage()]\n // }\n\n // return super.text\n // }\n\n // set text(text) {\n // super.text = text\n // }\n\n async detailInfo() {\n const { type, id } = this.state\n\n if (!id) {\n return\n }\n\n return await getPopupData(type, id)\n }\n}\n"]}
1
+ {"version":3,"file":"mcs-machine.js","sourceRoot":"","sources":["../src/mcs-machine.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ContainerAbstract } from '@hatiolab/things-scene'\nimport { getPopupData } from '@fmsim/api'\n\nimport { MCSStatusMixin, MCSStatusMixinProperties } from './features/mcs-status-mixin'\n\nimport { LEGEND_MACHINE, Legend } from './features/mcs-status-default'\n\n/**\n * MCS Machine의 공통 속성을 정의한 최상위 오브젝트\n * - Container\n * -\n */\nexport default class MCSMachine extends MCSStatusMixin(ContainerAbstract) {\n static get properties(): any {\n return [\n ...MCSStatusMixinProperties,\n {\n type: 'number',\n name: 'round',\n label: 'round'\n }\n ]\n }\n\n get showMoveHandle() {\n return false\n }\n\n /**\n * id 후보를 조회할 때 백엔드에 보낼 타입명. 값이 있으면 검색(lookup) 대상.\n * 기본은 자기 타입. 자기 타입과 다른 타입으로 조회해야 하는 특수 케이스는 override.\n */\n get idLookupType(): string | undefined {\n return this.state.type\n }\n\n /** MCS 머신 — parentObject(부모 머신) 후보 수집 시 머신으로 식별. */\n get isMcsMachine(): boolean {\n return true\n }\n\n containable(component: Component) {\n return ['rect', 'ellipse'].includes(component.state.type)\n }\n\n get decorators() {\n return ['decotag']\n }\n\n getTheme() {\n const { legendName } = this.state\n\n if (legendName) {\n return (this.root as any)?.style?.[legendName]\n }\n }\n\n get hasTextProperty() {\n return true\n }\n\n get status() {\n return this.data?.STATUS\n }\n\n get auxStatus() {\n return this.data?.STATUS\n }\n\n get legend(): Legend {\n return this.getTheme() || this.getLegendFallback()\n }\n\n get auxLegend() {\n return LEGEND_MACHINE\n }\n\n get auxColor() {\n return this.state.strokeStyle\n }\n\n getLegendFallback() {\n return LEGEND_MACHINE\n }\n\n /**\n * In 2D, ignore `state.alpha`; preserve everything else.\n *\n * things-scene's base prerender (component-drawing.ts:31, 44) does:\n * const fade = (alpha || 1) - this._delta.fade\n * if (fade) context.globalAlpha = fade\n *\n * It *overwrites* `globalAlpha` (not multiplies), so the inherited\n * parent alpha is also lost — that's a base-layer quirk we match the\n * recovery for. Then at line 48 it applies editMode+hidden dimming\n * with a *= 0.5.\n *\n * Our recovery:\n * 1. Capture the inherited `globalAlpha` *before* super runs.\n * 2. Let super do its work (transforms / shadow / dim flags).\n * 3. Restore globalAlpha to inherited × editMode-hidden dim factor —\n * i.e., what super would have produced if our state.alpha were 1.\n *\n * 3D path is unaffected: 3D factories read `state.alpha` directly via\n * their `updateAlpha()` implementations and continue to honor it (with\n * per-config opacity fallback).\n */\n prerender(ctx: any) {\n const inherited = ctx.globalAlpha\n super.prerender(ctx)\n const dim = this.app.isEditMode && this.hidden ? 0.5 : 1\n ctx.globalAlpha = inherited * dim\n }\n\n render(ctx) {\n var { round = 0, lineWidth } = this.state\n var { left, top, width, height } = this.bounds\n\n ctx.beginPath()\n\n ctx.strokeStyle = this.auxColor\n ctx.fillStyle = this.statusColor!\n ctx.lineWidth = lineWidth || 1\n ctx.lineCap = 'round'\n ctx.setLineDash([])\n\n if (round > 0) {\n ctx.roundRect(left, top, width, height, round)\n } else {\n ctx.rect(left, top, width, height)\n }\n\n ctx.fill()\n ctx.stroke()\n }\n\n // get text() {\n // if (this.data?.LOCALENAME) {\n // // TODO 왜 LOCALENAME 데이타는 문자열인가 ? 오브젝트로 보내달라.\n // return JSON.parse(this.data.LOCALENAME)[getLocaleLanguage()]\n // }\n\n // return super.text\n // }\n\n // set text(text) {\n // super.text = text\n // }\n\n async detailInfo() {\n const { type, id } = this.state\n\n if (!id) {\n return\n }\n\n return await getPopupData(type, id)\n }\n}\n"]}