@operato/scene-visualizer 9.2.2 → 10.0.0-beta.10

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 (249) hide show
  1. package/dist/carrier.d.ts +263 -0
  2. package/dist/carrier.js +272 -0
  3. package/dist/carrier.js.map +1 -0
  4. package/dist/desk.d.ts +238 -3
  5. package/dist/desk.js +1 -2
  6. package/dist/desk.js.map +1 -1
  7. package/dist/editors/index.d.ts +3 -0
  8. package/dist/editors/index.js +15 -0
  9. package/dist/editors/index.js.map +1 -1
  10. package/dist/editors/property-editor-gltf-fill-targets.d.ts +20 -0
  11. package/dist/editors/property-editor-gltf-fill-targets.js +313 -0
  12. package/dist/editors/property-editor-gltf-fill-targets.js.map +1 -0
  13. package/dist/editors/property-editor-gltf-info.d.ts +25 -3
  14. package/dist/editors/property-editor-gltf-info.js +333 -73
  15. package/dist/editors/property-editor-gltf-info.js.map +1 -1
  16. package/dist/editors/property-editor-gltf-play-targets.d.ts +25 -0
  17. package/dist/editors/property-editor-gltf-play-targets.js +388 -0
  18. package/dist/editors/property-editor-gltf-play-targets.js.map +1 -0
  19. package/dist/editors/property-editor-location-increase-pattern.js +87 -95
  20. package/dist/editors/property-editor-location-increase-pattern.js.map +1 -1
  21. package/dist/editors/property-editor-stocker-location.d.ts +13 -0
  22. package/dist/editors/property-editor-stocker-location.js +151 -0
  23. package/dist/editors/property-editor-stocker-location.js.map +1 -0
  24. package/dist/editors/property-editor-stocker-ports.d.ts +8 -0
  25. package/dist/editors/property-editor-stocker-ports.js +112 -0
  26. package/dist/editors/property-editor-stocker-ports.js.map +1 -0
  27. package/dist/effects/outline.js +1 -1
  28. package/dist/effects/outline.js.map +1 -1
  29. package/dist/index.d.ts +8 -17
  30. package/dist/index.js +10 -17
  31. package/dist/index.js.map +1 -1
  32. package/dist/rack-table-3d.d.ts +16 -0
  33. package/dist/rack-table-3d.js +95 -0
  34. package/dist/rack-table-3d.js.map +1 -0
  35. package/dist/rack-table-cell.d.ts +238 -3
  36. package/dist/rack-table-cell.js +44 -51
  37. package/dist/rack-table-cell.js.map +1 -1
  38. package/dist/rack-table-location.d.ts +37 -0
  39. package/dist/rack-table-location.js +227 -0
  40. package/dist/rack-table-location.js.map +1 -0
  41. package/dist/rack-table.d.ts +13 -29
  42. package/dist/rack-table.js +121 -380
  43. package/dist/rack-table.js.map +1 -1
  44. package/dist/rack.d.ts +16 -5
  45. package/dist/rack.js +106 -19
  46. package/dist/rack.js.map +1 -1
  47. package/dist/signal-tower.d.ts +492 -0
  48. package/dist/signal-tower.js +275 -0
  49. package/dist/signal-tower.js.map +1 -0
  50. package/dist/stock-hub.d.ts +25 -0
  51. package/dist/stock-hub.js +147 -0
  52. package/dist/stock-hub.js.map +1 -0
  53. package/dist/stock.d.ts +52 -8
  54. package/dist/stock.js +223 -120
  55. package/dist/stock.js.map +1 -1
  56. package/dist/stocker-3d.d.ts +23 -0
  57. package/dist/stocker-3d.js +352 -0
  58. package/dist/stocker-3d.js.map +1 -0
  59. package/dist/stocker-port-3d.d.ts +14 -0
  60. package/dist/stocker-port-3d.js +80 -0
  61. package/dist/stocker-port-3d.js.map +1 -0
  62. package/dist/stocker-port.d.ts +254 -0
  63. package/dist/stocker-port.js +123 -0
  64. package/dist/stocker-port.js.map +1 -0
  65. package/dist/stocker.d.ts +340 -0
  66. package/dist/stocker.js +370 -0
  67. package/dist/stocker.js.map +1 -0
  68. package/dist/tank.d.ts +492 -0
  69. package/dist/tank.js +312 -0
  70. package/dist/tank.js.map +1 -0
  71. package/dist/templates/carrier.d.ts +19 -0
  72. package/dist/templates/carrier.js +20 -0
  73. package/dist/templates/carrier.js.map +1 -0
  74. package/dist/templates/cube.js +1 -1
  75. package/dist/templates/cube.js.map +1 -1
  76. package/dist/templates/cylinder.js +3 -3
  77. package/dist/templates/cylinder.js.map +1 -1
  78. package/dist/templates/index.d.ts +38 -38
  79. package/dist/templates/index.js +15 -1
  80. package/dist/templates/index.js.map +1 -1
  81. package/dist/templates/rack-table.d.ts +2 -0
  82. package/dist/templates/rack-table.js +4 -2
  83. package/dist/templates/rack-table.js.map +1 -1
  84. package/dist/templates/signal-tower.d.ts +21 -0
  85. package/dist/templates/signal-tower.js +22 -0
  86. package/dist/templates/signal-tower.js.map +1 -0
  87. package/dist/templates/sphere.d.ts +1 -0
  88. package/dist/templates/sphere.js +5 -4
  89. package/dist/templates/sphere.js.map +1 -1
  90. package/dist/templates/stock-hub.d.ts +14 -0
  91. package/dist/templates/stock-hub.js +15 -0
  92. package/dist/templates/stock-hub.js.map +1 -0
  93. package/dist/templates/stocker-port.d.ts +17 -0
  94. package/dist/templates/stocker-port.js +17 -0
  95. package/dist/templates/stocker-port.js.map +1 -0
  96. package/dist/templates/stocker.d.ts +27 -0
  97. package/dist/templates/stocker.js +38 -0
  98. package/dist/templates/stocker.js.map +1 -0
  99. package/dist/templates/tank.d.ts +21 -0
  100. package/dist/templates/tank.js +22 -0
  101. package/dist/templates/tank.js.map +1 -0
  102. package/dist/templates/vehicle.d.ts +19 -0
  103. package/dist/templates/vehicle.js +20 -0
  104. package/dist/templates/vehicle.js.map +1 -0
  105. package/dist/templates/visualizer.js +1 -1
  106. package/dist/templates/visualizer.js.map +1 -1
  107. package/dist/vehicle.d.ts +248 -0
  108. package/dist/vehicle.js +133 -0
  109. package/dist/vehicle.js.map +1 -0
  110. package/dist/visualizer.d.ts +5 -5
  111. package/dist/visualizer.js +72 -68
  112. package/dist/visualizer.js.map +1 -1
  113. package/icons/carrier.png +0 -0
  114. package/icons/signal-tower.png +0 -0
  115. package/icons/stock-hub.png +0 -0
  116. package/icons/tank.png +0 -0
  117. package/icons/vehicle.png +0 -0
  118. package/package.json +16 -18
  119. package/translations/en.json +6 -0
  120. package/translations/ja.json +5 -0
  121. package/translations/ko.json +6 -1
  122. package/translations/ms.json +5 -0
  123. package/translations/zh.json +5 -0
  124. package/dist/banner.d.ts +0 -15
  125. package/dist/banner.js +0 -76
  126. package/dist/banner.js.map +0 -1
  127. package/dist/camera.d.ts +0 -20
  128. package/dist/camera.js +0 -108
  129. package/dist/camera.js.map +0 -1
  130. package/dist/cube.d.ts +0 -13
  131. package/dist/cube.js +0 -38
  132. package/dist/cube.js.map +0 -1
  133. package/dist/cylinder.d.ts +0 -11
  134. package/dist/cylinder.js +0 -38
  135. package/dist/cylinder.js.map +0 -1
  136. package/dist/ellipse.d.ts +0 -5
  137. package/dist/ellipse.js +0 -22
  138. package/dist/ellipse.js.map +0 -1
  139. package/dist/gltf-object.d.ts +0 -20
  140. package/dist/gltf-object.js +0 -104
  141. package/dist/gltf-object.js.map +0 -1
  142. package/dist/html-overlay-element.d.ts +0 -1
  143. package/dist/html-overlay-element.js +0 -12
  144. package/dist/html-overlay-element.js.map +0 -1
  145. package/dist/light.d.ts +0 -15
  146. package/dist/light.js +0 -135
  147. package/dist/light.js.map +0 -1
  148. package/dist/polygon.d.ts +0 -17
  149. package/dist/polygon.js +0 -64
  150. package/dist/polygon.js.map +0 -1
  151. package/dist/rect.d.ts +0 -5
  152. package/dist/rect.js +0 -36
  153. package/dist/rect.js.map +0 -1
  154. package/dist/scene/component.d.ts +0 -1
  155. package/dist/scene/component.js +0 -29
  156. package/dist/scene/component.js.map +0 -1
  157. package/dist/sphere.d.ts +0 -11
  158. package/dist/sphere.js +0 -38
  159. package/dist/sphere.js.map +0 -1
  160. package/dist/sprite.d.ts +0 -9
  161. package/dist/sprite.js +0 -28
  162. package/dist/sprite.js.map +0 -1
  163. package/dist/text.d.ts +0 -1
  164. package/dist/text.js +0 -9
  165. package/dist/text.js.map +0 -1
  166. package/dist/three-container-editor.d.ts +0 -22
  167. package/dist/three-container-editor.js +0 -132
  168. package/dist/three-container-editor.js.map +0 -1
  169. package/dist/three-container.d.ts +0 -85
  170. package/dist/three-container.js +0 -565
  171. package/dist/three-container.js.map +0 -1
  172. package/dist/three-controls.d.ts +0 -11
  173. package/dist/three-controls.js +0 -616
  174. package/dist/three-controls.js.map +0 -1
  175. package/dist/three-layout.d.ts +0 -8
  176. package/dist/three-layout.js +0 -20
  177. package/dist/three-layout.js.map +0 -1
  178. package/dist/three-space.d.ts +0 -85
  179. package/dist/three-space.js +0 -570
  180. package/dist/three-space.js.map +0 -1
  181. package/dist/threed/common.d.ts +0 -22
  182. package/dist/threed/common.js +0 -19
  183. package/dist/threed/common.js.map +0 -1
  184. package/dist/threed/floor/floor.d.ts +0 -3
  185. package/dist/threed/floor/floor.js +0 -51
  186. package/dist/threed/floor/floor.js.map +0 -1
  187. package/dist/threed/html/elements.d.ts +0 -2
  188. package/dist/threed/html/elements.js +0 -21
  189. package/dist/threed/html/elements.js.map +0 -1
  190. package/dist/threed/index.d.ts +0 -15
  191. package/dist/threed/index.js +0 -16
  192. package/dist/threed/index.js.map +0 -1
  193. package/dist/threed/real-object-camera-meshed.d.ts +0 -12
  194. package/dist/threed/real-object-camera-meshed.js +0 -49
  195. package/dist/threed/real-object-camera-meshed.js.map +0 -1
  196. package/dist/threed/real-object-camera.d.ts +0 -9
  197. package/dist/threed/real-object-camera.js +0 -31
  198. package/dist/threed/real-object-camera.js.map +0 -1
  199. package/dist/threed/real-object-dom-element.d.ts +0 -9
  200. package/dist/threed/real-object-dom-element.js +0 -40
  201. package/dist/threed/real-object-dom-element.js.map +0 -1
  202. package/dist/threed/real-object-dummy.d.ts +0 -6
  203. package/dist/threed/real-object-dummy.js +0 -11
  204. package/dist/threed/real-object-dummy.js.map +0 -1
  205. package/dist/threed/real-object-extrude.d.ts +0 -21
  206. package/dist/threed/real-object-extrude.js +0 -173
  207. package/dist/threed/real-object-extrude.js.map +0 -1
  208. package/dist/threed/real-object-gltf.d.ts +0 -16
  209. package/dist/threed/real-object-gltf.js +0 -101
  210. package/dist/threed/real-object-gltf.js.map +0 -1
  211. package/dist/threed/real-object-group.d.ts +0 -5
  212. package/dist/threed/real-object-group.js +0 -11
  213. package/dist/threed/real-object-group.js.map +0 -1
  214. package/dist/threed/real-object-mesh.d.ts +0 -13
  215. package/dist/threed/real-object-mesh.js +0 -75
  216. package/dist/threed/real-object-mesh.js.map +0 -1
  217. package/dist/threed/real-object-plane.d.ts +0 -5
  218. package/dist/threed/real-object-plane.js +0 -22
  219. package/dist/threed/real-object-plane.js.map +0 -1
  220. package/dist/threed/real-object-scene.d.ts +0 -21
  221. package/dist/threed/real-object-scene.js +0 -67
  222. package/dist/threed/real-object-scene.js.map +0 -1
  223. package/dist/threed/real-object-sprite-2d.d.ts +0 -14
  224. package/dist/threed/real-object-sprite-2d.js +0 -45
  225. package/dist/threed/real-object-sprite-2d.js.map +0 -1
  226. package/dist/threed/real-object-sprite.d.ts +0 -11
  227. package/dist/threed/real-object-sprite.js +0 -50
  228. package/dist/threed/real-object-sprite.js.map +0 -1
  229. package/dist/threed/real-object-text.d.ts +0 -15
  230. package/dist/threed/real-object-text.js +0 -64
  231. package/dist/threed/real-object-text.js.map +0 -1
  232. package/dist/threed/real-object.d.ts +0 -64
  233. package/dist/threed/real-object.js +0 -260
  234. package/dist/threed/real-object.js.map +0 -1
  235. package/dist/threed/texture/canvas-texture.d.ts +0 -4
  236. package/dist/threed/texture/canvas-texture.js +0 -49
  237. package/dist/threed/texture/canvas-texture.js.map +0 -1
  238. package/dist/threed/texture/text-texture.d.ts +0 -8
  239. package/dist/threed/texture/text-texture.js +0 -79
  240. package/dist/threed/texture/text-texture.js.map +0 -1
  241. package/dist/threed/three-dimensional-container.d.ts +0 -8
  242. package/dist/threed/three-dimensional-container.js +0 -2
  243. package/dist/threed/three-dimensional-container.js.map +0 -1
  244. package/dist/threed/utils/bound-uv-generator.d.ts +0 -16
  245. package/dist/threed/utils/bound-uv-generator.js +0 -42
  246. package/dist/threed/utils/bound-uv-generator.js.map +0 -1
  247. package/dist/wall.d.ts +0 -13
  248. package/dist/wall.js +0 -45
  249. package/dist/wall.js.map +0 -1
@@ -2,11 +2,9 @@
2
2
  * Copyright © HatioLab Inc. All rights reserved.
3
3
  */
4
4
  import { __decorate } from "tslib";
5
- import * as THREE from 'three';
6
- import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
7
5
  import { Component, ContainerAbstract, Layout, Model, sceneComponent } from '@hatiolab/things-scene';
8
- import { Rack } from './rack.js';
9
- import { RealObjectGroup } from './threed/real-object-group.js';
6
+ import { RackTable3d } from './rack-table-3d.js';
7
+ import { increaseLocation } from './rack-table-location.js';
10
8
  const NATURE = {
11
9
  mutable: false,
12
10
  resizable: true,
@@ -80,6 +78,19 @@ const NATURE = {
80
78
  type: 'checkbox',
81
79
  label: 'hide-rack-frame',
82
80
  name: 'hideRackFrame'
81
+ },
82
+ {
83
+ type: 'id-input',
84
+ label: 'legend-target',
85
+ name: 'legendTarget',
86
+ property: {
87
+ component: 'legend'
88
+ }
89
+ },
90
+ {
91
+ type: 'checkbox',
92
+ label: 'hide-empty-stock',
93
+ name: 'hideEmptyStock'
83
94
  }
84
95
  ],
85
96
  help: 'scene/component/rack-table'
@@ -120,7 +131,7 @@ function buildNewCell(app) {
120
131
  }, app);
121
132
  }
122
133
  function buildCopiedCell(copy, app) {
123
- var obj = JSON.parse(JSON.stringify(copy));
134
+ const obj = JSON.parse(JSON.stringify(copy));
124
135
  delete obj.text;
125
136
  return Model.compile(obj, app);
126
137
  }
@@ -161,29 +172,29 @@ function after(columns, i) {
161
172
  return !((i + 1) % columns) ? -1 : i + 1;
162
173
  }
163
174
  function array(value, size) {
164
- var arr = [];
175
+ const arr = [];
165
176
  for (let i = 0; i < size; i++)
166
177
  arr.push(1);
167
178
  return arr;
168
179
  }
169
- var columnControlHandler = {
180
+ const columnControlHandler = {
170
181
  ondragmove: function (point, index, component) {
171
- var { left, top, width, height } = component.textBounds;
172
- var widths_sum = component.widths_sum;
173
- var widths = component.widths.slice();
182
+ const { left, top, width, height } = component.textBounds;
183
+ const widths_sum = component.widths_sum;
184
+ const widths = component.widths.slice();
174
185
  /* 컨트롤의 원래 위치를 구한다. */
175
- var origin_pos_unit = widths.slice(0, index + 1).reduce((sum, width) => sum + width, 0);
176
- var origin_offset = left + (origin_pos_unit / widths_sum) * width;
186
+ const origin_pos_unit = widths.slice(0, index + 1).reduce((sum, width) => sum + width, 0);
187
+ const origin_offset = left + (origin_pos_unit / widths_sum) * width;
177
188
  /*
178
189
  * point의 좌표는 부모 레이어 기준의 x, y 값이다.
179
190
  * 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.
180
191
  * Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,
181
192
  * 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).
182
193
  */
183
- var transcoorded = component.transcoordP2S(point.x, point.y);
184
- var diff = transcoorded.x - origin_offset;
185
- var diff_unit = (diff / width) * widths_sum;
186
- var min_width_unit = (widths_sum / width) * 5; // 5픽셀정도를 최소로
194
+ const transcoorded = component.transcoordP2S(point.x, point.y);
195
+ const diff = transcoorded.x - origin_offset;
196
+ let diff_unit = (diff / width) * widths_sum;
197
+ const min_width_unit = (widths_sum / width) * 5; // 5픽셀정도를 최소로
187
198
  if (diff_unit < 0)
188
199
  diff_unit = -Math.min(widths[index] - min_width_unit, -diff_unit);
189
200
  else
@@ -193,25 +204,25 @@ var columnControlHandler = {
193
204
  component.set('widths', widths);
194
205
  }
195
206
  };
196
- var rowControlHandler = {
207
+ const rowControlHandler = {
197
208
  ondragmove: function (point, index, component) {
198
- var { left, top, width, height } = component.textBounds;
199
- var heights_sum = component.heights_sum;
200
- var heights = component.heights.slice();
209
+ const { left, top, width, height } = component.textBounds;
210
+ const heights_sum = component.heights_sum;
211
+ const heights = component.heights.slice();
201
212
  /* 컨트롤의 원래 위치를 구한다. */
202
213
  index -= component.columns - 1;
203
- var origin_pos_unit = heights.slice(0, index + 1).reduce((sum, height) => sum + height, 0);
204
- var origin_offset = top + (origin_pos_unit / heights_sum) * height;
214
+ const origin_pos_unit = heights.slice(0, index + 1).reduce((sum, height) => sum + height, 0);
215
+ const origin_offset = top + (origin_pos_unit / heights_sum) * height;
205
216
  /*
206
217
  * point의 좌표는 부모 레이어 기준의 x, y 값이다.
207
218
  * 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.
208
219
  * Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,
209
220
  * 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).
210
221
  */
211
- var transcoorded = component.transcoordP2S(point.x, point.y);
212
- var diff = transcoorded.y - origin_offset;
213
- var diff_unit = (diff / height) * heights_sum;
214
- var min_height_unit = (heights_sum / height) * 5; // 5픽셀정도를 최소로
222
+ const transcoorded = component.transcoordP2S(point.x, point.y);
223
+ const diff = transcoorded.y - origin_offset;
224
+ let diff_unit = (diff / height) * heights_sum;
225
+ const min_height_unit = (heights_sum / height) * 5; // 5픽셀정도를 최소로
215
226
  if (diff_unit < 0)
216
227
  diff_unit = -Math.min(heights[index] - min_height_unit, -diff_unit);
217
228
  else
@@ -221,99 +232,47 @@ var rowControlHandler = {
221
232
  component.set('heights', heights);
222
233
  }
223
234
  };
224
- export class RackTable3d extends RealObjectGroup {
225
- build() {
226
- super.build();
227
- this.createRacks();
228
- }
229
- get position() {
230
- var { zPos = 0 } = this.component.state;
231
- return {
232
- x: this.cx || 0,
233
- y: zPos,
234
- z: this.cy || 0
235
- };
236
- }
237
- createRacks() {
238
- var { rotation = 0, shelfLocations, shelves = 1 } = this.component.state;
239
- this.object3d.rotation.y = -rotation;
240
- const racks = this.component.components
241
- .map((cell) => {
242
- let { shelfLocations: shelfLoc = shelfLocations, isEmpty } = cell.state;
243
- if (!isEmpty) {
244
- cell.setState('shelfLocations', shelfLoc);
245
- var rack = new Rack(cell);
246
- rack.update();
247
- this.object3d.add(rack.object3d);
248
- return rack;
249
- }
250
- return;
251
- })
252
- .filter(rack => !!rack);
253
- this.mergeAndAddRackCommonObjects(racks);
254
- }
255
- mergeAndAddRackCommonObjects(racks) {
256
- var framesGeometries = [];
257
- var boardsGeometries = [];
258
- if (racks.length > 0) {
259
- racks.forEach(rack => {
260
- const geometry = rack.frame;
261
- if (!geometry) {
262
- return;
263
- }
264
- geometry.translate(rack.position.x, rack.position.y, rack.position.z);
265
- geometry.scale(rack.scale.x, rack.scale.y, rack.scale.z);
266
- framesGeometries.push(geometry);
267
- });
268
- if (framesGeometries.length > 0) {
269
- const frameMesh = new THREE.Mesh(BufferGeometryUtils.mergeGeometries(framesGeometries), Rack.frameMaterial);
270
- this.object3d.add(frameMesh);
271
- }
272
- racks.forEach(rack => {
273
- const geometry = rack.board;
274
- if (!geometry) {
275
- return;
276
- }
277
- geometry.translate(rack.position.x, rack.position.y, rack.position.z);
278
- geometry.scale(rack.scale.x, rack.scale.y, rack.scale.z);
279
- boardsGeometries.push(geometry);
280
- });
281
- if (boardsGeometries.length > 0) {
282
- const material = Rack.boardMaterial;
283
- material.opacity = 0.5;
284
- material.transparent = true;
285
- const boardMesh = new THREE.Mesh(BufferGeometryUtils.mergeGeometries(boardsGeometries), material);
286
- this.object3d.add(boardMesh);
287
- }
288
- }
289
- }
290
- makeShelfString(pattern, shelf, length) {
291
- /**
292
- * pattern #: 숫자
293
- * pattern 0: 고정 자리수
294
- * pattern -: 역순
295
- */
296
- if (!pattern || !shelf || !length)
297
- return;
298
- var isReverse = /^\-/.test(pattern);
299
- pattern = pattern.replace(/#+/, '#');
300
- var fixedLength = (pattern.match(/0/g) || []).length || 0;
301
- var shelfString = String(isReverse ? length - shelf + 1 : shelf);
302
- if (shelfString.length > fixedLength && fixedLength > 0) {
303
- shelfString = shelfString.substring(shelfString.length - fixedLength);
235
+ let RackTable = class RackTable extends ContainerAbstract {
236
+ _focused_cell;
237
+ // StockMaterialProvider 구현
238
+ _stock_materials = [];
239
+ _default_material;
240
+ _empty_material;
241
+ _legendTarget;
242
+ get legendTarget() {
243
+ const { legendTarget } = this.state;
244
+ if (!this._legendTarget && legendTarget) {
245
+ this._legendTarget = this.root.findById?.(legendTarget);
246
+ this._legendTarget?.on('change', this._onLegendChanged, this);
304
247
  }
305
- else {
306
- var prefix = '';
307
- for (var i = 0; i < fixedLength - shelfString.length; i++) {
308
- prefix += '0';
248
+ // 하위호환: 자체 legendTarget이 없으면 부모(Visualizer)의 legendTarget 폴백
249
+ if (!this._legendTarget) {
250
+ let ancestor = this.parent;
251
+ while (ancestor) {
252
+ if (ancestor.legendTarget)
253
+ return ancestor.legendTarget;
254
+ ancestor = ancestor.parent;
309
255
  }
310
- shelfString = prefix + shelfString;
256
+ // 서비스 레지스트리 폴백: stock-hub의 legendTarget
257
+ const stockHub = this.root?.getService?.('stock');
258
+ if (stockHub?.legendTarget)
259
+ return stockHub.legendTarget;
311
260
  }
312
- return shelfString;
261
+ return this._legendTarget;
262
+ }
263
+ get hideEmptyStock() {
264
+ return !!this.getState('hideEmptyStock');
265
+ }
266
+ _onLegendChanged() {
267
+ this._resetMaterials();
268
+ this.invalidate();
269
+ }
270
+ _resetMaterials() {
271
+ this._stock_materials.forEach(m => m.dispose?.());
272
+ this._stock_materials = [];
273
+ delete this._default_material;
274
+ delete this._empty_material;
313
275
  }
314
- updateAlpha() { }
315
- }
316
- let RackTable = class RackTable extends ContainerAbstract {
317
276
  is3dish() {
318
277
  return true;
319
278
  }
@@ -321,12 +280,15 @@ let RackTable = class RackTable extends ContainerAbstract {
321
280
  return new RackTable3d(this);
322
281
  }
323
282
  dispose() {
283
+ this._legendTarget?.off('change', this._onLegendChanged, this);
284
+ delete this._legendTarget;
285
+ this._resetMaterials();
324
286
  super.dispose();
325
287
  delete this._focused_cell;
326
288
  }
327
289
  created() {
328
- var tobeSize = this.rows * this.columns;
329
- var gap = this.size() - tobeSize;
290
+ const tobeSize = this.rows * this.columns;
291
+ const gap = this.size() - tobeSize;
330
292
  if (gap == 0) {
331
293
  return;
332
294
  }
@@ -340,8 +302,8 @@ let RackTable = class RackTable extends ContainerAbstract {
340
302
  newbies.push(buildNewCell(this.app));
341
303
  this.add(newbies);
342
304
  }
343
- var widths = this.getState('widths');
344
- var heights = this.getState('heights');
305
+ const widths = this.getState('widths');
306
+ const heights = this.getState('heights');
345
307
  if (!widths || widths.length < this.columns)
346
308
  this.set('widths', this.widths);
347
309
  if (!heights || heights.length < this.rows)
@@ -352,7 +314,7 @@ let RackTable = class RackTable extends ContainerAbstract {
352
314
  return false;
353
315
  }
354
316
  get widths() {
355
- var widths = this.getState('widths');
317
+ const widths = this.getState('widths');
356
318
  if (!widths)
357
319
  return array(1, this.columns);
358
320
  if (widths.length < this.columns)
@@ -362,7 +324,7 @@ let RackTable = class RackTable extends ContainerAbstract {
362
324
  return widths;
363
325
  }
364
326
  get heights() {
365
- var heights = this.getState('heights');
327
+ const heights = this.getState('heights');
366
328
  if (!heights)
367
329
  return array(1, this.rows);
368
330
  if (heights.length < this.rows)
@@ -376,7 +338,7 @@ let RackTable = class RackTable extends ContainerAbstract {
376
338
  let removals = this.components.slice(oldcolumns * newrows);
377
339
  this.remove(removals);
378
340
  }
379
- var minrows = Math.min(newrows, oldrows);
341
+ const minrows = Math.min(newrows, oldrows);
380
342
  if (newcolumns > oldcolumns) {
381
343
  for (let r = 0; r < minrows; r++) {
382
344
  for (let c = oldcolumns; c < newcolumns; c++) {
@@ -414,11 +376,11 @@ let RackTable = class RackTable extends ContainerAbstract {
414
376
  return this.getState('rows');
415
377
  }
416
378
  setCellsStyle(cells, style, where) {
417
- var components = this.components;
418
- var total = components.length;
419
- var columns = this.getState('columns');
379
+ const components = this.components;
380
+ const total = components.length;
381
+ const columns = this.getState('columns');
420
382
  // 병합된 셀도 포함시킨다.
421
- var _cells = [];
383
+ const _cells = [];
422
384
  cells.forEach(c => {
423
385
  _cells.push(c);
424
386
  if (c.colspan || c.rowspan) {
@@ -430,9 +392,9 @@ let RackTable = class RackTable extends ContainerAbstract {
430
392
  _cells.push(this.components[i * this.columns + j]);
431
393
  }
432
394
  });
433
- var indices = _cells.map(cell => components.indexOf(cell));
395
+ const indices = _cells.map(cell => components.indexOf(cell));
434
396
  indices.forEach(i => {
435
- var cell = components[i];
397
+ const cell = components[i];
436
398
  switch (where) {
437
399
  case 'all':
438
400
  setCellBorder(cell, style, where);
@@ -531,8 +493,7 @@ let RackTable = class RackTable extends ContainerAbstract {
531
493
  });
532
494
  }
533
495
  getRowColumn(cell) {
534
- var idx = this.components.indexOf(cell);
535
- var length = this.components.length;
496
+ const idx = this.components.indexOf(cell);
536
497
  return {
537
498
  column: idx % this.columns,
538
499
  row: Math.floor(idx / this.columns)
@@ -542,8 +503,8 @@ let RackTable = class RackTable extends ContainerAbstract {
542
503
  return this.components.slice(row * this.columns, (row + 1) * this.columns);
543
504
  }
544
505
  getCellsByColumn(column) {
545
- var cells = [];
546
- for (var i = 0; i < this.rows; i++)
506
+ const cells = [];
507
+ for (let i = 0; i < this.rows; i++)
547
508
  cells.push(this.components[this.columns * i + column]);
548
509
  return cells;
549
510
  }
@@ -560,7 +521,7 @@ let RackTable = class RackTable extends ContainerAbstract {
560
521
  return a - b;
561
522
  });
562
523
  rows.reverse();
563
- var heights = this.heights.slice();
524
+ const heights = this.heights.slice();
564
525
  rows.forEach(row => {
565
526
  this.remove(this.getCellsByRow(row));
566
527
  });
@@ -581,7 +542,7 @@ let RackTable = class RackTable extends ContainerAbstract {
581
542
  });
582
543
  columns.reverse();
583
544
  columns.forEach(column => {
584
- var widths = this.widths.slice();
545
+ const widths = this.widths.slice();
585
546
  this.remove(this.getCellsByColumn(column));
586
547
  widths.splice(column, 1);
587
548
  this.model.columns -= 1; // 고의적으로, change 이벤트가 발생하지 않도록 set(..)을 사용하지 않음.
@@ -729,268 +690,43 @@ let RackTable = class RackTable extends ContainerAbstract {
729
690
  });
730
691
  }
731
692
  distributeHorizontal(cells) {
732
- var columns = [];
693
+ const columns = [];
733
694
  cells.forEach(cell => {
734
695
  let rowcolumn = this.getRowColumn(cell);
735
696
  if (-1 == columns.indexOf(rowcolumn.column))
736
697
  columns.push(rowcolumn.column);
737
698
  });
738
- var sum = columns.reduce((sum, column) => {
699
+ const sum = columns.reduce((sum, column) => {
739
700
  return sum + this.widths[column];
740
701
  }, 0);
741
- var newval = Math.round((sum / columns.length) * 100) / 100;
742
- var widths = this.widths.slice();
702
+ const newval = Math.round((sum / columns.length) * 100) / 100;
703
+ const widths = this.widths.slice();
743
704
  columns.forEach(column => {
744
705
  widths[column] = newval;
745
706
  });
746
707
  this.set('widths', widths);
747
708
  }
748
709
  distributeVertical(cells) {
749
- var rows = [];
710
+ const rows = [];
750
711
  cells.forEach(cell => {
751
712
  let rowcolumn = this.getRowColumn(cell);
752
713
  if (-1 == rows.indexOf(rowcolumn.row))
753
714
  rows.push(rowcolumn.row);
754
715
  });
755
- var sum = rows.reduce((sum, row) => {
716
+ const sum = rows.reduce((sum, row) => {
756
717
  return sum + this.heights[row];
757
718
  }, 0);
758
- var newval = Math.round((sum / rows.length) * 100) / 100;
759
- var heights = this.heights.slice();
719
+ const newval = Math.round((sum / rows.length) * 100) / 100;
720
+ const heights = this.heights.slice();
760
721
  rows.forEach(row => {
761
722
  heights[row] = newval;
762
723
  });
763
724
  this.set('heights', heights);
764
725
  }
765
- /**
766
- * visualizer location setting functions
767
- */
768
726
  increaseLocation(type, skipNumbering, startSection, startUnit) {
769
- /**
770
- * step 1
771
- *
772
- * selected collect rack-cell
773
- */
774
- var selectedCells = this.root.selected;
775
- /**
776
- * step 2
777
- *
778
- * classify cells by row
779
- */
780
- var classified = this.classifyByRow(selectedCells);
781
- /**
782
- * step 3
783
- *
784
- * find aisle
785
- */
786
- var aisleRowIndices = this.getAisleRowIndices(classified);
787
- /**
788
- * step 4
789
- *
790
- * classify cells by section
791
- */
792
- var sections = this.classifyCellsBySection(classified, aisleRowIndices);
793
- /**
794
- * step 5
795
- *
796
- * rearrange by aisle
797
- */
798
- var rearranged = this.rearrangeByAisle(type, sections);
799
- /**
800
- * step 6
801
- *
802
- * if skip numbering, remove empty cells
803
- */
804
- if (skipNumbering)
805
- rearranged = this.removeEmptyCells(rearranged);
806
- /**
807
- * step 7
808
- *
809
- * merge rows
810
- */
811
- var merged = this.mergeRows(rearranged);
812
- /**
813
- * step 8
814
- *
815
- * set location
816
- */
817
- this.setLocations(merged, startSection, startUnit);
818
- }
819
- classifyByRow(cells) {
820
- var classified = [];
821
- cells.forEach(c => {
822
- var index = c.index;
823
- var { row, column } = index;
824
- if (!classified[row]) {
825
- classified[row] = [];
826
- }
827
- classified[row][column] = c;
828
- });
829
- return classified;
830
- }
831
- findAisle(rows) {
832
- if (!rows) {
833
- return [];
834
- }
835
- return rows.filter(r => {
836
- return r[0] && r[0].isAisle;
837
- });
838
- }
839
- getAisleRowIndices(rows) {
840
- var aisles = this.findAisle(rows);
841
- var aisleRowIndices = [];
842
- aisles.forEach(aisle => {
843
- aisleRowIndices.push(rows.indexOf(aisle));
844
- });
845
- return aisleRowIndices;
846
- }
847
- classifyCellsBySection(rows, aisleRowIndices) {
848
- var sections = [];
849
- var wasAisle = false;
850
- var section;
851
- rows.forEach((row, i) => {
852
- var isAisle = aisleRowIndices.indexOf(i) > -1;
853
- if (!(wasAisle || isAisle)) {
854
- section = [];
855
- sections.push(section);
856
- }
857
- wasAisle = isAisle;
858
- section.push(row);
859
- });
860
- return sections;
861
- }
862
- rearrangeByAisle(type, sections) {
863
- var rearranged = [];
864
- switch (type.toLowerCase()) {
865
- case 'cw':
866
- var reverse = false;
867
- sections.forEach((rows, i) => {
868
- var section = [];
869
- rearranged.push(section);
870
- rows.forEach((r, i) => {
871
- if (reverse)
872
- r.reverse();
873
- if (i % 2 === 0) {
874
- section.push(r);
875
- reverse = !reverse;
876
- }
877
- });
878
- });
879
- break;
880
- case 'ccw':
881
- var reverse = true;
882
- sections.forEach((rows, i) => {
883
- var section = [];
884
- rearranged.push(section);
885
- rows.forEach((r, i) => {
886
- if (reverse)
887
- r.reverse();
888
- if (i % 2 === 0) {
889
- section.push(r);
890
- reverse = !reverse;
891
- }
892
- });
893
- });
894
- break;
895
- case 'zigzag':
896
- sections.forEach((rows, i) => {
897
- var section = [];
898
- rows.forEach((r, i) => {
899
- if (i % 2 === 0) {
900
- section.push(r);
901
- }
902
- });
903
- var sectionLength = section.length;
904
- var tempRow = [];
905
- var tempSection = [];
906
- section.forEach((row, rowIdx) => {
907
- row.forEach((cell, idx) => {
908
- tempRow[rowIdx + idx * section.length] = cell;
909
- });
910
- });
911
- var chunkSize = tempRow.length / sectionLength;
912
- for (var idx = 0; idx < sectionLength; idx++) {
913
- tempSection.push(tempRow.slice(idx * chunkSize, (idx + 1) * chunkSize));
914
- }
915
- rearranged.push(tempSection);
916
- });
917
- break;
918
- case 'zigzag-reverse':
919
- sections.forEach((rows, i) => {
920
- var section = [];
921
- rows.forEach((r, i) => {
922
- if (i % 2 === 0) {
923
- r.reverse();
924
- section.push(r);
925
- }
926
- });
927
- var sectionLength = section.length;
928
- var tempRow = [];
929
- var tempSection = [];
930
- section.forEach((row, rowIdx) => {
931
- row.forEach((cell, idx) => {
932
- tempRow[rowIdx + idx * section.length] = cell;
933
- });
934
- });
935
- var chunkSize = tempRow.length / sectionLength;
936
- for (var idx = 0; idx < sectionLength; idx++) {
937
- tempSection.push(tempRow.slice(idx * chunkSize, (idx + 1) * chunkSize));
938
- }
939
- rearranged.push(tempSection);
940
- });
941
- break;
942
- }
943
- return rearranged;
944
- }
945
- removeEmptyCells(sections) {
946
- var newSections = [];
947
- sections.forEach(rows => {
948
- var newRows = [];
949
- newSections.push(newRows);
950
- rows.forEach(row => {
951
- var newRow = [];
952
- newRows.push(newRow);
953
- row.forEach((c, i) => {
954
- if (!c.isEmpty)
955
- newRow.push(c);
956
- });
957
- });
958
- });
959
- return newSections;
960
- }
961
- mergeRows(sections) {
962
- var merged = [];
963
- sections.forEach(section => {
964
- var newSection = [];
965
- section.forEach(rows => {
966
- var mergedRow = [];
967
- rows.forEach(row => {
968
- mergedRow = mergedRow.concat(row);
969
- });
970
- newSection = newSection.concat(mergedRow);
971
- });
972
- merged.push(newSection);
973
- });
974
- return merged;
975
- }
976
- setLocations(sections, startSection, startUnit) {
977
- var { sectionDigits = 2, unitDigits = 2 } = this.state;
978
- var sectionNumber = Number(startSection) || 1;
979
- sections.forEach(section => {
980
- var unitNumber = Number(startUnit) || 1;
981
- section.forEach(c => {
982
- if (!c.isEmpty) {
983
- c.set('section', String(sectionNumber).padStart(sectionDigits, '0'));
984
- c.set('unit', String(unitNumber).padStart(unitDigits, '0'));
985
- }
986
- else {
987
- c.set('section', null);
988
- c.set('unit', null);
989
- }
990
- unitNumber++;
991
- });
992
- sectionNumber++;
993
- });
727
+ const { sectionDigits = 2, unitDigits = 2 } = this.state;
728
+ const selectedCells = this.root.selected;
729
+ increaseLocation(selectedCells, type, skipNumbering, startSection, startUnit, sectionDigits, unitDigits);
994
730
  }
995
731
  get columns() {
996
732
  return this.getState('columns');
@@ -1023,25 +759,25 @@ let RackTable = class RackTable extends ContainerAbstract {
1023
759
  return this.components;
1024
760
  }
1025
761
  get widths_sum() {
1026
- var widths = this.widths;
762
+ const widths = this.widths;
1027
763
  return widths ? widths.filter((width, i) => i < this.columns).reduce((sum, width) => sum + width, 0) : this.columns;
1028
764
  }
1029
765
  get heights_sum() {
1030
- var heights = this.heights;
766
+ const heights = this.heights;
1031
767
  return heights ? heights.filter((height, i) => i < this.rows).reduce((sum, height) => sum + height, 0) : this.rows;
1032
768
  }
1033
769
  get nature() {
1034
770
  return NATURE;
1035
771
  }
1036
772
  get controls() {
1037
- var widths = this.widths;
1038
- var heights = this.heights;
1039
- var inside = this.textBounds;
1040
- var width_unit = inside.width / this.widths_sum;
1041
- var height_unit = inside.height / this.heights_sum;
1042
- var x = inside.left;
1043
- var y = inside.top;
1044
- var controls = [];
773
+ const widths = this.widths;
774
+ const heights = this.heights;
775
+ const inside = this.textBounds;
776
+ const width_unit = inside.width / this.widths_sum;
777
+ const height_unit = inside.height / this.heights_sum;
778
+ let x = inside.left;
779
+ let y = inside.top;
780
+ const controls = [];
1045
781
  widths.slice(0, this.columns - 1).forEach((width) => {
1046
782
  x += width * width_unit;
1047
783
  controls.push({
@@ -1061,6 +797,11 @@ let RackTable = class RackTable extends ContainerAbstract {
1061
797
  return controls;
1062
798
  }
1063
799
  onchange(after, before) {
800
+ if ('legendTarget' in after || 'legendTarget' in before) {
801
+ this._legendTarget?.off('change', this._onLegendChanged, this);
802
+ delete this._legendTarget;
803
+ this._resetMaterials();
804
+ }
1064
805
  if ('rows' in after || 'columns' in after) {
1065
806
  this.buildCells(this.getState('rows'), this.getState('columns'), before.hasOwnProperty('rows') ? before.rows : this.getState('rows'), before.hasOwnProperty('columns') ? before.columns : this.getState('columns'));
1066
807
  }