@operato/scene-storage 10.0.0-beta.41 → 10.0.0-beta.42

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 (82) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/MIGRATION-plan-a-slot-api.md +266 -0
  3. package/PLAN-A-rack-as-slot-holder.md +164 -0
  4. package/dist/crane.js +1 -1
  5. package/dist/crane.js.map +1 -1
  6. package/dist/index.d.ts +3 -4
  7. package/dist/index.js +1 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/rack-grid-3d.d.ts +18 -7
  10. package/dist/rack-grid-3d.js +372 -69
  11. package/dist/rack-grid-3d.js.map +1 -1
  12. package/dist/rack-grid-cell.d.ts +21 -72
  13. package/dist/rack-grid-cell.js +147 -243
  14. package/dist/rack-grid-cell.js.map +1 -1
  15. package/dist/rack-grid.d.ts +277 -56
  16. package/dist/rack-grid.js +1230 -695
  17. package/dist/rack-grid.js.map +1 -1
  18. package/dist/rack-materials.d.ts +9 -0
  19. package/dist/rack-materials.js +55 -0
  20. package/dist/rack-materials.js.map +1 -0
  21. package/dist/storage-rack-3d.d.ts +15 -0
  22. package/dist/storage-rack-3d.js +131 -30
  23. package/dist/storage-rack-3d.js.map +1 -1
  24. package/dist/storage-rack.d.ts +242 -45
  25. package/dist/storage-rack.js +684 -106
  26. package/dist/storage-rack.js.map +1 -1
  27. package/package.json +3 -3
  28. package/src/crane.ts +1 -1
  29. package/src/index.ts +3 -4
  30. package/src/rack-grid-3d.ts +383 -80
  31. package/src/rack-grid-cell.ts +161 -305
  32. package/src/rack-grid.ts +1263 -762
  33. package/src/rack-materials.ts +61 -0
  34. package/src/storage-rack-3d.ts +144 -30
  35. package/src/storage-rack.ts +763 -111
  36. package/test/test-carrier-lifecycle.ts +361 -0
  37. package/test/test-coord-alignment.ts +201 -0
  38. package/test/test-external-to-rack.ts +461 -0
  39. package/test/test-mover-concurrent-bug.ts +304 -0
  40. package/test/test-mover-rollback.ts +290 -0
  41. package/test/test-r19-place-absorb.ts +174 -0
  42. package/test/test-rack-3d-attach-real.ts +301 -0
  43. package/test/test-rack-concurrent.ts +254 -0
  44. package/test/test-rack-edge-cases.ts +323 -0
  45. package/test/test-rack-grid-cell.ts +318 -0
  46. package/test/test-rack-grid-location.ts +657 -0
  47. package/test/test-real-3d-positioning.ts +158 -0
  48. package/test/test-slot-center-convention.ts +116 -0
  49. package/test/test-slot-target.ts +189 -0
  50. package/test/test-storage-rack-batched.ts +606 -0
  51. package/test/test-storage-rack-click.ts +329 -0
  52. package/test/test-storage-rack-slot-api.ts +357 -0
  53. package/test/test-toscene-convention.ts +162 -0
  54. package/test/test-user-scenario-sequential.ts +334 -0
  55. package/translations/en.json +2 -0
  56. package/translations/ja.json +2 -0
  57. package/translations/ko.json +2 -0
  58. package/translations/ms.json +2 -0
  59. package/translations/zh.json +2 -0
  60. package/tsconfig.tsbuildinfo +1 -1
  61. package/dist/rack-column.d.ts +0 -35
  62. package/dist/rack-column.js +0 -258
  63. package/dist/rack-column.js.map +0 -1
  64. package/dist/rack-grid-helpers.d.ts +0 -28
  65. package/dist/rack-grid-helpers.js +0 -71
  66. package/dist/rack-grid-helpers.js.map +0 -1
  67. package/dist/rack-grid-location.d.ts +0 -37
  68. package/dist/rack-grid-location.js +0 -227
  69. package/dist/rack-grid-location.js.map +0 -1
  70. package/dist/storage-cell-3d.d.ts +0 -25
  71. package/dist/storage-cell-3d.js +0 -88
  72. package/dist/storage-cell-3d.js.map +0 -1
  73. package/dist/storage-cell.d.ts +0 -73
  74. package/dist/storage-cell.js +0 -215
  75. package/dist/storage-cell.js.map +0 -1
  76. package/src/rack-column.ts +0 -340
  77. package/src/rack-grid-helpers.ts +0 -77
  78. package/src/rack-grid-location.ts +0 -286
  79. package/src/storage-cell-3d.ts +0 -101
  80. package/src/storage-cell.ts +0 -267
  81. package/test/test-cell-position.ts +0 -105
  82. package/test/test-rack-grid.ts +0 -77
@@ -1 +1 @@
1
- {"version":3,"file":"rack-grid-cell.js","sourceRoot":"","sources":["../src/rack-grid-cell.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport { Component, Properties, RectPath, sceneComponent, RealObject } from '@hatiolab/things-scene'\nimport type { State } from '@hatiolab/things-scene'\nimport { Rack } from './rack-column.js'\n\n/** RackGridCell 컴포넌트 state */\nexport interface RackGridCellState extends State {\n section?: string\n unit?: string\n shelfLocations?: string\n binLocations?: string\n isEmpty?: boolean\n border?: any\n merged?: boolean\n rowspan?: number\n colspan?: number\n}\n\nconst EMPTY_BORDER = {}\n\nfunction isBottomMost(idx: number, rows: number, columns: number) {\n return idx >= (rows - 1) * columns\n}\n\nfunction isRightMost(idx: number, rows: number, columns: number) {\n return (idx + 1) % columns == 0\n}\n\nfunction hasAnyProperty(o: any, ...properties: string[]) {\n for (let p in properties) {\n if (o.hasOwnProperty(properties[p])) {\n return true\n }\n }\n}\n\nconst EMPTY_CELL_STROKE_STYLE = '#ccc'\nconst EMPTY_CELL_LINE_WIDTH = 1\nconst EMPTY_CELL_FILL_STYLE = '#efefef'\n\n/**\n * 1. 스타일을 상속 받아야 함. (cascade-style)\n * 2. 스타일을 동적처리할 수 있음. (로직처리)\n * 3. 데이타를 받을 수 있음.\n */\n@sceneComponent('rack-grid-cell')\nexport class RackGridCell extends RectPath(Component) {\n override get state(): RackGridCellState {\n return super.state as RackGridCellState\n }\n\n _focused: boolean = false\n\n get hasTextProperty() {\n return false\n }\n\n get nature() {\n return {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'string',\n label: 'section',\n name: 'section'\n },\n {\n type: 'string',\n label: 'unit',\n name: 'unit'\n },\n {\n type: 'string',\n label: 'shelf-locations',\n name: 'shelfLocations',\n placeholder: '1,2,3,... / ,,,04'\n },\n {\n type: 'textarea',\n label: 'bin-locations',\n name: 'binLocations',\n placeholder: '1,2,3,...'\n },\n {\n type: 'checkbox',\n label: 'is-empty',\n name: 'isEmpty'\n },\n {\n type: 'location-increase-pattern',\n label: '',\n name: '',\n property: {\n event: {\n 'increase-location-pattern': (event: CustomEvent) => {\n const { increasingDirection, skipNumbering, startSection, startUnit } = event.detail\n const rackTable = this.parent as any\n rackTable.increaseLocation(increasingDirection, skipNumbering, startSection, startUnit)\n }\n }\n }\n },\n {\n type: 'editor-table',\n label: '',\n name: '',\n property: {\n merge: false,\n split: false\n }\n }\n ]\n }\n }\n\n buildRealObject(): RealObject | undefined {\n // isEmpty cell 은 3D 에 mesh 를 만들지 않는다. v9 에서는 RackGrid3D.createRacks 가\n // cell._realObject 를 사전 설정하면 3D pipeline 이 자동 buildRealObject 호출을 skip\n // 하던 것을, v10 의 ThreeCapability 도입 이후로는 *항상* 자동 호출됨. RackGrid3D\n // createRacks 의 isEmpty 체크와 이 자동 경로 사이의 불일치로 isEmpty=true cell 도\n // 3D 에 그려지던 regression — 여기 isEmpty 체크 추가로 두 경로 정합.\n if (this.getState('isEmpty')) return undefined\n return new Rack(this)\n }\n\n set merged(merged) {\n this.set('merged', !!merged)\n if (merged) this.set('text', '')\n }\n\n get merged() {\n return this.getState('merged')\n }\n\n set rowspan(rowspan) {\n this.set('rowspan', rowspan)\n }\n\n get rowspan() {\n return this.getState('rowspan')\n }\n\n set colspan(colspan) {\n this.set('colspan', colspan)\n }\n\n get colspan() {\n return this.getState('colspan')\n }\n\n get border() {\n return this.state.border || EMPTY_BORDER\n }\n\n get isEmpty() {\n return this.getState('isEmpty')\n }\n\n _drawBorder(context: CanvasRenderingContext2D, x: number, y: number, to_x: number, to_y: number, style: any) {\n if (style && style.strokeStyle && style.lineWidth && style.lineDash) {\n context.beginPath()\n context.moveTo(x, y)\n context.lineTo(to_x, to_y)\n\n Component.drawStroke(context, style)\n }\n }\n\n render(context: CanvasRenderingContext2D) {\n const { left, top, width, height } = this.bounds\n const { isEmpty } = this.state\n\n const border = this.border\n\n if (!isEmpty) {\n this._draw_rack_cell(context)\n }\n\n // Cell 채우기.\n context.beginPath()\n context.lineWidth = 0\n context.rect(left, top, width, height)\n\n // Border 그리기\n const parent = this.parent as any\n const idx = parent.components.indexOf(this)\n const columns = parent.columns || 1\n const rows = parent.rows || 1\n\n this._drawBorder(context, left, top, left + width, top, border.top)\n this._drawBorder(context, left, top + height, left, top, border.left)\n if (isRightMost(idx, rows, columns))\n this._drawBorder(context, left + width, top, left + width, top + height, border.right)\n if (isBottomMost(idx, rows, columns))\n this._drawBorder(context, left + width, top + height, left, top + height, border.bottom)\n }\n\n _draw_rack_cell(context: CanvasRenderingContext2D) {\n const { left, top, width, height } = this.bounds\n\n context.save()\n context.fillStyle = EMPTY_CELL_FILL_STYLE\n context.fillRect(left, top, width, height)\n\n context.beginPath()\n context.lineWidth = EMPTY_CELL_LINE_WIDTH\n context.strokeStyle = EMPTY_CELL_STROKE_STYLE\n\n context.moveTo(left, top)\n context.lineTo(left + width, top + height)\n context.moveTo(left + width, top)\n context.lineTo(left, top + height)\n\n context.stroke()\n context.closePath()\n context.restore()\n }\n\n get decotag() {\n const rackTable = this.parent\n let { locPattern, zone = '' } = rackTable.model\n\n locPattern = locPattern.substring(0, locPattern.indexOf('{u}') + 3)\n\n let locationString = ''\n if (this.getState('section') && this.getState('unit'))\n locationString = locPattern\n .replace('{z}', zone)\n .replace('{s}', this.getState('section'))\n .replace('{u}', this.getState('unit'))\n\n return locationString || ''\n }\n\n get index() {\n const rackTable = this.parent as any\n const index = rackTable.components.indexOf(this)\n\n const rowIndex = Math.floor(index / rackTable.columns)\n const columnIndex = index % rackTable.columns\n\n return {\n row: rowIndex,\n column: columnIndex\n }\n }\n\n get rowIndex() {\n return this.index.row\n }\n\n get columnIndex() {\n return this.index.column\n }\n\n get leftCell() {\n const rackTable = this.parent as any\n\n const rowIndex = this.rowIndex\n const columnIndex = this.columnIndex\n\n if (columnIndex === 0) return null\n\n const leftCell = rackTable.components[rowIndex * rackTable.columns + columnIndex - 1]\n\n return leftCell\n }\n\n get rightCell() {\n const rackTable = this.parent as any\n\n const rowIndex = this.rowIndex\n const columnIndex = this.columnIndex\n\n if (columnIndex === rackTable.columns) return null\n\n const rightCell = rackTable.components[rowIndex * rackTable.columns + columnIndex + 1]\n\n return rightCell\n }\n\n get aboveCell() {\n const rackTable = this.parent as any\n\n const rowIndex = this.rowIndex\n const columnIndex = this.columnIndex\n\n if (rowIndex === 0) return null\n\n const aboveCell = rackTable.components[(rowIndex - 1) * rackTable.columns + columnIndex]\n\n return aboveCell\n }\n\n get belowCell() {\n const rackTable = this.parent as any\n\n const rowIndex = this.rowIndex\n const columnIndex = this.columnIndex\n\n if (rowIndex === rackTable.rows) return null\n\n const belowCell = rackTable.components[(rowIndex + 1) * rackTable.columns + columnIndex]\n\n return belowCell\n }\n\n get rowCells() {\n const rackTable = this.parent as any\n return rackTable.getCellsByRow(this.rowIndex)\n }\n\n get columnCells() {\n const rackTable = this.parent as any\n return rackTable.getCellsByColumn(this.columnIndex)\n }\n\n get aboveRowCells() {\n let aboveCell = this.aboveCell\n while (1) {\n const aboveRowCells = aboveCell.notEmptyRowCells\n\n if (aboveRowCells.length > 0) return aboveRowCells\n\n aboveCell = aboveCell.aboveCell\n }\n }\n\n get lastUnit() {\n const rowCells = this.aboveRowCells\n\n for (let i = rowCells.length - 1; i > 0; i--) {\n const cell = rowCells[i]\n\n const unit = cell.getState('unit')\n\n if (unit) return Number(unit)\n }\n\n return 0\n }\n\n get firstUnit() {\n const rowCells = this.aboveRowCells\n\n for (let i = 0; i < rowCells.length; i++) {\n const cell = rowCells[i]\n\n const unit = cell.getState('unit')\n\n if (unit) return Number(unit)\n }\n\n return 0\n }\n\n get notEmptyRowCells() {\n return this.rowCells.filter((c: Component) => {\n return !c.getState('isEmpty')\n })\n }\n\n get emptyRowCells() {\n return this.rowCells.filter((c: Component) => {\n return c.getState('isEmpty')\n })\n }\n\n get isAisle() {\n return this.notEmptyRowCells.length === 0\n }\n\n onchange(after: Properties, before: Properties) {\n if (hasAnyProperty(after, 'isEmpty')) {\n // FIXME\n delete this.model.unit\n delete this.model.section\n }\n }\n\n onmouseenter() {\n this.trigger('deco')\n }\n\n onmouseleave() {\n this.trigger('decoreset')\n }\n\n contains(x: number, y: number) {\n const contains = super.contains(x, y)\n if (!contains) {\n this._focused = false\n this.invalidate()\n }\n\n return contains\n }\n}\n\n;['border'].forEach(getter => Component.memoize(RackGridCell.prototype, getter, false))\n"]}
1
+ {"version":3,"file":"rack-grid-cell.js","sourceRoot":"","sources":["../src/rack-grid-cell.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * RackGridCell — RackGrid 의 *configuration storage* 단위 = 한 bay 의 메타데이터 핸들.\n *\n * 모드별 역할:\n * - modeling (2D editor): 자체 사각형 render + click + nature.properties UI\n * (rack-table-cell 패턴 그대로)\n * - 2D / 3D view: *data holder 만* — render/mesh 모두 X. 외부 location API 가\n * 이 cell 의 state.section/unit/isEmpty 등을 *configuration source of truth* 로 lookup.\n *\n * 3D mesh 는 *없음* (buildRealObject = undefined). 3D stock 시각화는 *RackGrid\n * 자체의 RackGrid3D + InstancedMesh* 가 처리. cell-component 는 *3D 리소스 0*.\n *\n * 영속 데이터: cellId (bay 위치), section, unit, shelfLocations, isEmpty, border 등.\n * RackGrid 의 hierarchy override 가 *redundant 좌표 (left/top/width/height)* 만 제거 —\n * 위 own 데이터는 그대로 직렬화 (저장/로드 시 복원).\n */\n\nimport {\n Component, ComponentNature, Properties, RectPath, sceneComponent\n} from '@hatiolab/things-scene'\nimport type { State } from '@hatiolab/things-scene'\n\nexport interface RackGridCellState extends State {\n cellId?: string // bayKey 형식: `${col-1}-${row-1}` (0-based, 2 segments)\n section?: string // location 의 {s}\n unit?: string // location 의 {u}\n shelfLocations?: string // cell 별 shelf 명시 (CSV); 미지정 시 parent.shelfLocations\n binLocations?: string // cell 내 bin 명시 (CSV) — rack-table 호환\n isEmpty?: boolean // 통로/공실 표시\n border?: any // 4-side border (top/left/bottom/right)\n merged?: boolean\n rowspan?: number\n colspan?: number\n}\n\nconst EMPTY_BORDER = {}\nconst EMPTY_CELL_FILL = '#efefef'\nconst EMPTY_CELL_STROKE = '#ccc'\n\nfunction hasAnyProperty(o: any, ...props: string[]): boolean {\n for (const p of props) if (Object.prototype.hasOwnProperty.call(o, p)) return true\n return false\n}\n\nfunction isRightMost(idx: number, _rows: number, columns: number): boolean {\n return (idx + 1) % columns === 0\n}\nfunction isBottomMost(idx: number, rows: number, columns: number): boolean {\n return idx >= (rows - 1) * columns\n}\n\n// RackGridCell 의 refid 충돌 회피 — load 시 root.onadded → _addTraverse 가 자식부터\n// addRefidIndex 호출. cell 의 model.refid 가 *비어있으면* root.getNewRefid() = 1,2,3...\n// 작은 값 부여 → 부모 RackGrid (refid 7) / Crane (202) 등 *기존 refid 와 충돌*.\n// constructor 에서 *큰 시작값 + monotonic counter* 로 자체 부여 → 충돌 0.\nlet _cellRefidCounter = 100_000_000\n\n@sceneComponent('rack-grid-cell')\nexport default class RackGridCell extends RectPath(Component) {\n override get state(): RackGridCellState {\n return super.state as RackGridCellState\n }\n\n _focused: boolean = false\n\n constructor(model: any, context: any) {\n super(model, context)\n // refid 미부여 시 큰 값 자체 부여 — root.getNewRefid() 의 1,2,3... 충돌 회피.\n // hierarchy override 가 save 시 refid 제거 → load 마다 fresh.\n if (this.model.refid == null) {\n this.model.refid = _cellRefidCounter++\n }\n }\n\n get hasTextProperty() {\n return false\n }\n\n get nature(): ComponentNature {\n return {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n { type: 'string', label: 'section', name: 'section' },\n { type: 'string', label: 'unit', name: 'unit' },\n { type: 'string', label: 'shelf-locations', name: 'shelfLocations', placeholder: '1,2,3 또는 ,,,04' },\n { type: 'textarea', label: 'bin-locations', name: 'binLocations', placeholder: '1,2,3,...' },\n { type: 'checkbox', label: 'is-empty', name: 'isEmpty' },\n {\n type: 'location-increase-pattern',\n label: '',\n name: '',\n property: {\n event: {\n 'increase-location-pattern': (event: CustomEvent) => {\n const { increasingDirection, skipNumbering, startSection, startUnit } = event.detail\n const parent: any = this.parent\n if (typeof parent?.increaseLocation === 'function') {\n // RackGrid 의 root.selected 활용 — framework 가 자동 갱신\n const selected = (this.root as any)?.selected as RackGridCell[] | undefined\n const keys = (selected || [])\n .filter(c => (c as any)?.state?.type === 'rack-grid-cell')\n .map(c => c.state.cellId)\n .filter((k): k is string => !!k)\n parent.increaseLocation(keys, increasingDirection, skipNumbering, startSection, startUnit)\n }\n }\n }\n }\n },\n {\n type: 'editor-table',\n label: '',\n name: '',\n property: { merge: false, split: false }\n }\n ]\n }\n }\n\n /** 3D mesh 미생성 — view mode 의 리소스 0. */\n buildRealObject(): undefined {\n return undefined\n }\n\n // ── Domain getters ────────────────────────────────────\n\n get isEmpty(): boolean {\n return !!this.getState('isEmpty')\n }\n\n get border(): any {\n return this.state.border || EMPTY_BORDER\n }\n\n set merged(v: boolean) {\n this.set('merged', !!v)\n if (v) this.set('text', '')\n }\n get merged(): boolean {\n return !!this.getState('merged')\n }\n\n set rowspan(v: number) { this.set('rowspan', v) }\n get rowspan(): number { return (this.getState('rowspan') as number) ?? 1 }\n\n set colspan(v: number) { this.set('colspan', v) }\n get colspan(): number { return (this.getState('colspan') as number) ?? 1 }\n\n /** Parent (RackGrid) 안에서 자기 (col, row) 인덱스 — components 순서 = row * columns + col. */\n get index(): { row: number; column: number } {\n const parent = this.parent as any\n if (!parent) return { row: 0, column: 0 }\n const idx = parent.components.indexOf(this)\n const cols = parent.columns ?? 1\n return { row: Math.floor(idx / cols), column: idx % cols }\n }\n\n get rowIndex(): number { return this.index.row }\n get columnIndex(): number { return this.index.column }\n\n get rowCells(): Component[] {\n const parent = this.parent as any\n return parent?.getCellsByRow?.(this.rowIndex) ?? []\n }\n get columnCells(): Component[] {\n const parent = this.parent as any\n return parent?.getCellsByColumn?.(this.columnIndex) ?? []\n }\n get notEmptyRowCells(): Component[] {\n return this.rowCells.filter(c => !(c as any).getState?.('isEmpty'))\n }\n get isAisle(): boolean {\n return this.notEmptyRowCells.length === 0\n }\n\n // ── Lifecycle ─────────────────────────────────────────\n\n onchange(after: Properties, _before: Properties) {\n if (hasAnyProperty(after, 'isEmpty')) {\n // isEmpty 토글 시 section/unit 클리어 (rack-table-cell 동작)\n delete this.model.unit\n delete this.model.section\n }\n // Parent 의 location index 무효화 (RackGrid 가 onchange 다시 안 받으므로 자식이 알림)\n const parent: any = this.parent\n parent?.invalidateLocationIndex?.()\n }\n\n onmouseenter() { this.trigger('deco') }\n onmouseleave() { this.trigger('decoreset') }\n\n contains(x: number, y: number) {\n const c = super.contains(x, y)\n if (!c) {\n this._focused = false\n this.invalidate()\n }\n return c\n }\n\n // ── 2D rendering (modeling editor) ────────────────────\n //\n // *view mode* (= app.isViewMode) 면 안 그림 — *configuration storage 만*. modeling\n // 시에만 사각형 + border + isEmpty 패턴 시각화.\n\n render(context: CanvasRenderingContext2D) {\n if ((this as any).app?.isViewMode) return\n\n const { left, top, width, height } = this.bounds\n const { isEmpty } = this.state\n const border = this.border\n\n if (isEmpty) {\n // 빈 cell — 회색 fill + 대각선\n context.save()\n context.fillStyle = EMPTY_CELL_FILL\n context.fillRect(left, top, width, height)\n context.strokeStyle = EMPTY_CELL_STROKE\n context.lineWidth = 1\n context.beginPath()\n context.moveTo(left, top); context.lineTo(left + width, top + height)\n context.moveTo(left + width, top); context.lineTo(left, top + height)\n context.stroke()\n context.restore()\n }\n\n // 명시적 cell 영역 표시 (border default — 자식 cell 의 미니 frame)\n context.beginPath()\n context.lineWidth = 0\n context.rect(left, top, width, height)\n\n const parent = this.parent as any\n const idx = parent?.components?.indexOf?.(this) ?? 0\n const columns = parent?.columns ?? 1\n const rows = parent?.rackRows ?? 1\n\n this._drawSide(context, left, top, left + width, top, border.top)\n this._drawSide(context, left, top + height, left, top, border.left)\n if (isRightMost(idx, rows, columns)) {\n this._drawSide(context, left + width, top, left + width, top + height, border.right)\n }\n if (isBottomMost(idx, rows, columns)) {\n this._drawSide(context, left + width, top + height, left, top + height, border.bottom)\n }\n }\n\n private _drawSide(ctx: CanvasRenderingContext2D, x: number, y: number, tx: number, ty: number, style: any) {\n if (!style?.strokeStyle || !style.lineWidth) return\n ctx.beginPath()\n ctx.moveTo(x, y)\n ctx.lineTo(tx, ty)\n Component.drawStroke(ctx, style)\n }\n}\n\n;['border'].forEach(g => Component.memoize(RackGridCell.prototype, g, false))\n"]}
@@ -1,80 +1,301 @@
1
- import { Component, ComponentNature, ContainerAbstract, Control, Properties, RealObject } from '@hatiolab/things-scene';
1
+ import { Component, ComponentNature, Control, Properties, RealObject } from '@hatiolab/things-scene';
2
2
  import type { State } from '@hatiolab/things-scene';
3
3
  import * as THREE from 'three';
4
- /** RackGrid 컴포넌트 state */
4
+ import { SlotTarget, type Alignment, type Heights, type PlacementArchetype, type SlotRecord, type SlottedHolder } from '@operato/scene-base';
5
+ import RackGridCell from './rack-grid-cell.js';
6
+ /** 한 (col, row) 위치의 메타데이터. 명시되지 않은 위치는 *룰의 기본값* 적용 (= location 없음). */
7
+ export interface CellOverride {
8
+ /** Location 의 `{s}` 부분. unit 과 함께 명시되어야 location 부여됨. */
9
+ section?: string;
10
+ /** Location 의 `{u}` 부분. section 과 함께 명시되어야 location 부여됨. */
11
+ unit?: string;
12
+ /**
13
+ * 명시적 통로/공실 표시. 의미:
14
+ * - location 미부여 (이 cell 로는 외부 location key 매칭 불가)
15
+ * - increaseLocation 의 aisle row 로 인식 (skipNumbering 시 건너뜀)
16
+ * 자식 컴포넌트 종류는 무관 — Crane/AGV/forklift/비움 모두 OK.
17
+ */
18
+ isEmpty?: boolean;
19
+ /** 4-side border style (top/left/bottom/right) — modeling 시각 용. */
20
+ border?: any;
21
+ /** Grid merge — 시각 표현. */
22
+ merged?: boolean;
23
+ rowspan?: number;
24
+ colspan?: number;
25
+ }
5
26
  export interface RackGridState extends State {
6
- rows?: number;
27
+ /** Grid 가로 칸 수 (X 축). 각 칸 ≈ 1 column 의 StorageRack (또는 Crane 등). */
7
28
  columns?: number;
8
- zone?: string;
29
+ /** Grid 세로 칸 수 (Z 축, depth). 통상 1, double-deep rack 등은 2. */
30
+ rows?: number;
31
+ /** 각 (col, row) 의 수직 shelf 수 (Y 축, level). 자식 StorageRack 의 levels 와 일치. */
9
32
  shelves?: number;
33
+ /**
34
+ * 첫 shelf 의 시작 높이 (mm, 3D Y 축, 바닥부터). 미명시 0 (바닥 = 첫 shelf).
35
+ * 양수 시 그만큼 위로 올라가 *stocker port / conveyor 같은 컴포넌트가 들어갈 빈 공간*
36
+ * 확보. Frame uprights 는 바닥 ~ 천장 그대로.
37
+ */
38
+ shelfBaseHeight?: number;
39
+ zone?: string;
40
+ /** 기본 `'{z}{s}-{u}-{sh}'`. placeholders: {z} {s} {u} {sh}. */
10
41
  locPattern?: string;
42
+ /** Section 숫자 자리수 (zero-pad). 기본 2. */
11
43
  sectionDigits?: number;
44
+ /** Unit 숫자 자리수 (zero-pad). 기본 2. */
12
45
  unitDigits?: number;
46
+ /** Shelf label CSV. 예: '1,2,3' / ',,,04'. 빈 자리는 1-based 인덱스 default. */
13
47
  shelfLocations?: string;
14
- stockScale?: number;
48
+ /** Sparse cell metadata. key = posKey = `${col-1}-${row-1}` (0-based, 2 segments). */
49
+ cellOverrides?: {
50
+ [posKey: string]: CellOverride;
51
+ };
52
+ /**
53
+ * Stock records — `{ cellId: 'col-row-shelf', type, ... }`. cellId 가 RackGrid 의
54
+ * cell 위치 (3 segments) 와 매칭되는 record 만 InstancedMesh instance 로 렌더링.
55
+ * Plan A 정신 — sparse 데이터, 자식 컴포넌트 없이 batched 시각화.
56
+ */
57
+ data?: Array<{
58
+ cellId: string;
59
+ [key: string]: any;
60
+ }>;
61
+ /**
62
+ * Popup 컴포넌트 id — 클릭 시 그 popup 을 invoke (anchor = 클릭된 cell 의 SlotTarget).
63
+ * 미명시 시 click event (`rack-grid-cell-click`) 만 emit.
64
+ */
65
+ popupRef?: string;
15
66
  hideRackFrame?: boolean;
67
+ hideHorizontalFrame?: boolean;
16
68
  legendTarget?: string;
17
69
  hideEmptyStock?: boolean;
18
70
  widths?: number[];
19
71
  heights?: number[];
20
72
  }
21
- import { RackGridCell } from './rack-grid-cell.js';
22
- import type { StockMaterialProvider } from './stock.js';
23
- export default class RackGrid extends ContainerAbstract implements StockMaterialProvider {
24
- get state(): RackGridState;
25
- _focused_cell?: RackGridCell;
26
- _stock_materials: THREE.Material[];
27
- _default_material?: THREE.Material;
28
- _empty_material?: THREE.Material;
73
+ declare const RackGrid_base: any;
74
+ export default class RackGrid extends RackGrid_base implements SlottedHolder {
75
+ state: RackGridState;
76
+ static placement: PlacementArchetype;
77
+ static align: Alignment;
78
+ static defaultDepth: (h: Heights) => number;
79
+ get nature(): ComponentNature;
80
+ get anchors(): never[];
81
+ /**
82
+ * Serialize 시 자식 RackGridCell 의 redundant 속성 제거:
83
+ * - 좌표/변환 (left/top/width/height/zPos/rotation/scale/translate) — table layout 이
84
+ * runtime 에 자동 결정. state 저장하면 layout 결과와 불일치 위험.
85
+ * - **refid** — *동적 생성* 되는 자식이라 *부모의 refid 가 그대로 들어가면 충돌*
86
+ * ("Refid Index replaced" 경고). 자식의 refid 는 *load 시 새로 자동 부여*. (외부
87
+ * 참조용 *id* 는 사용자 명시 시만 유지)
88
+ *
89
+ * 유지: cellId, section, unit, isEmpty, border, shelfLocations 등 *own 데이터*.
90
+ */
91
+ get hierarchy(): any;
92
+ /** Focusible — children (RackGridCell) 도 editor 의 selection 가능 (rack-table 동일). */
93
+ get focusible(): boolean;
94
+ /** Lifecycle — children 자동 생성. columns × rows 만큼 RackGridCell 자식. */
95
+ created(): void;
96
+ /** columns/rows 변경 시 children 재구성. rack-table.buildCells 패턴. */
97
+ onchange(after: Properties, _before: Properties): void;
98
+ /** state.data 변경 시 호출 (things-scene 의 onchange<PropName>). */
99
+ onchangeData(): void;
100
+ /** state.data 의 records — Plan A 의 stock 보관소. */
101
+ get records(): Array<{
102
+ cellId: string;
103
+ [key: string]: any;
104
+ }>;
29
105
  private _legendTarget?;
106
+ /**
107
+ * Legend 컴포넌트 lookup. 우선순위:
108
+ * 1) state.legendTarget id 명시
109
+ * 2) scene 전체 의 type='legend' 첫 번째 컴포넌트 (자동 발견)
110
+ */
30
111
  get legendTarget(): Component | undefined;
31
- get hideEmptyStock(): boolean;
32
112
  private _onLegendChanged;
33
- private _resetMaterials;
34
- buildRealObject(): RealObject | undefined;
35
- dispose(): void;
36
- created(): void;
37
- get focusible(): boolean;
38
- get widths(): number[];
39
- get heights(): number[];
40
- buildCells(newrows: number, newcolumns: number, oldrows: number, oldcolumns: number): void;
41
- get layout(): any;
42
- get rows(): any;
43
- setCellsStyle(cells: RackGridCell[], style: any, where: string): void;
44
- getRowColumn(cell: RackGridCell): {
45
- column: number;
46
- row: number;
47
- };
48
- getCellsByRow(row: number): Component[];
49
- getCellsByColumn(column: number): Component[];
50
- deleteRows(cells: RackGridCell[]): void;
51
- deleteColumns(cells: RackGridCell[]): void;
52
- insertCellsAbove(cells: RackGridCell[]): false | undefined;
53
- insertCellsBelow(cells: RackGridCell[]): false | undefined;
54
- insertCellsLeft(cells: RackGridCell[]): false | undefined;
55
- insertCellsRight(cells: RackGridCell[]): false | undefined;
56
- distributeHorizontal(cells: RackGridCell[]): void;
57
- distributeVertical(cells: RackGridCell[]): void;
58
- increaseLocation(type: string, skipNumbering: boolean, startSection: number, startUnit: number): void;
59
- get columns(): any;
60
- get lefts(): Component[];
61
- get centers(): Component[];
62
- get rights(): Component[];
63
- get tops(): Component[];
64
- get middles(): Component[];
65
- get bottoms(): Component[];
66
- get all(): Component[];
67
- get widths_sum(): any;
68
- get heights_sum(): any;
69
- get nature(): ComponentNature;
70
- get controls(): Array<Control> | undefined;
71
- onchange(after: Properties, before: Properties): void;
113
+ /**
114
+ * record legend.field 값을 ranges 와 매칭해 색상 해석.
115
+ * - `range.value === recordValue` (카테고리 일치)
116
+ * - `range.min ≤ Number(v) < range.max` (수치 범위)
117
+ * - 매칭 없으면 `defaultColor` 또는 undefined
118
+ */
72
119
  get eventMap(): {
73
120
  '(self)': {
74
- '(descendant)': {
75
- change: (after: Properties, before: Properties) => void;
121
+ '(self)': {
122
+ click: (mouseEvent: MouseEvent) => void;
76
123
  };
77
124
  };
78
125
  };
79
- oncellchanged(after: Properties, before: Properties): void;
126
+ private _onViewClick;
127
+ /** state.popupRef Popup 컴포넌트 invoke. anchor = 클릭된 cell 의 SlotTarget. */
128
+ private _invokePopup;
129
+ /** raycast → 우리 RackGrid 의 어떤 mesh 가 closest hit 인지. */
130
+ private _raycastHit;
131
+ /** world point → cellId (col-row-shelf) 역산. */
132
+ private _cellIdFromWorldPoint;
133
+ resolveLegendColor(record: any): string | undefined;
134
+ /**
135
+ * 새 (rows × columns) 에 맞춰 children 재구성. rack-table.buildCells 정확 클론.
136
+ */
137
+ private _buildCells;
138
+ /** children 의 state.cellId 가 *순서 기반 bayKey* 와 일치하도록 동기화. */
139
+ private _syncChildCellIds;
140
+ /** Row 인덱스의 cell 들. rack-table-cell 의 rowCells 가 사용. */
141
+ getCellsByRow(row: number): Component[];
142
+ /** Column 인덱스의 cell 들. */
143
+ getCellsByColumn(column: number): Component[];
144
+ /** (col, row) 위치의 cell-component. */
145
+ cellAt(col: number, row?: number): RackGridCell | null;
146
+ /** bayKey 의 cell-component. */
147
+ cellAtBayKey(bayKey: string): RackGridCell | null;
148
+ /**
149
+ * (col, row) bay 가 *isEmpty* 인가. cell-component 의 state.isEmpty 가 source of
150
+ * truth, 없으면 cellOverrides[posKey].isEmpty fallback.
151
+ */
152
+ isBayEmpty(col: number, row?: number): boolean;
153
+ buildRealObject(): RealObject | undefined;
154
+ get layout(): any;
155
+ get widths(): number[];
156
+ get heights(): number[];
157
+ get widths_sum(): number;
158
+ get heights_sum(): number;
159
+ /** Column / Row 사이 드래그 핸들 — editor 의 widths/heights 가변 조절. */
160
+ get controls(): Array<Control> | undefined;
161
+ render(ctx: CanvasRenderingContext2D): void;
162
+ get columns(): number;
163
+ get rackRows(): number;
164
+ get shelves(): number;
165
+ /** posKey = `${col-1}-${row-1}` (0-based, 2 segments). 1-based input. */
166
+ posKeyOf(col: number, row?: number): string;
167
+ /** cellId = `${col-1}-${row-1}-${shelf-1}` (0-based, 3 segments). 1-based input. */
168
+ cellIdOf(col: number, row?: number, shelf?: number): string;
169
+ parseCellId(cellId: string): {
170
+ col: number;
171
+ row: number;
172
+ shelf: number;
173
+ } | null;
174
+ parsePosKey(posKey: string): {
175
+ col: number;
176
+ row: number;
177
+ } | null;
178
+ get cellOverrides(): {
179
+ [posKey: string]: CellOverride;
180
+ };
181
+ getCellOverride(posKey: string): CellOverride | undefined;
182
+ /**
183
+ * Parse `state.shelfLocations` 를 levels 길이 array 로. 빈 슬롯은 1-based index default.
184
+ * '1,2,3' → ['1', '2', '3', ...]
185
+ * ',,,04' → ['1', '2', '3', '04']
186
+ * undefined → ['1', '2', '3', '4', ...]
187
+ */
188
+ get shelfLabels(): string[];
189
+ /**
190
+ * cellId → location string. 우선순위:
191
+ * 1. cell-component (state.section/unit) — source of truth
192
+ * 2. cellOverrides[posKey] — 호환성 fallback
193
+ * section/unit 둘 다 있고 isEmpty=false 일 때만 부여. 미부여 시 null.
194
+ */
195
+ locationOf(cellId: string): string | null;
196
+ /** cell.state.shelfLocations 명시 시 그것, 아니면 RackGrid 의 shelfLabels. */
197
+ private _shelfLabelsFromCell;
198
+ /** location string → cellId. sparse 역인덱스 lookup. 없으면 null. */
199
+ cellIdOfLocation(location: string): string | null;
200
+ /** 모든 (override 명시된) cell 의 location 목록. inspection 용. */
201
+ get allLocations(): Array<{
202
+ cellId: string;
203
+ location: string;
204
+ }>;
205
+ private _locationIndexCache?;
206
+ private get _locationIndex();
207
+ /** 룰 / cellOverrides 변경 시 호출. things-scene 의 onchange* 가 자동 호출. */
208
+ invalidateLocationIndex(): void;
209
+ onchangeCellOverrides(): void;
210
+ onchangeLocPattern(): void;
211
+ onchangeShelfLocations(): void;
212
+ onchangeZone(): void;
213
+ onchangeSectionDigits(): void;
214
+ onchangeUnitDigits(): void;
215
+ onchangeShelves(): void;
216
+ /**
217
+ * (col, row) 위치의 자식 StorageRack. 자식이 StorageRack 이 아닌 경우 (Crane, AGV 등)
218
+ * 는 null — Carrier 보관은 StorageRack 만.
219
+ *
220
+ * 자식의 grid 위치 식별: 자식의 state.column / state.row (1-based) 명시. RackGrid 가
221
+ * 자식 추가 시 자동 할당 또는 사용자가 명시.
222
+ */
223
+ private _childRackAt;
224
+ hasCarrierAt(slotId: string): boolean;
225
+ obtainCarrier(slotIdOrLocation: string): Component | null;
226
+ canReceiveAt(slotIdOrLocation: string, carrier?: Component): boolean;
227
+ receiveAt(slotIdOrLocation: string, carrier: Component, options?: any): Promise<void>;
228
+ recordFromCarrier(carrier: Component, slotId: string): SlotRecord;
229
+ /**
230
+ * Slot 의 attach object3d — Stock InstancedMesh 의 instance 와 *같은 world 위치* 에
231
+ * 위치한 invisible Object3D. popup tether / Carriable.applyHolderAttachPoint 가 이
232
+ * object3d 의 matrixWorld 를 사용. lazy 생성 + cache.
233
+ */
234
+ private _attachAnchorByCell;
235
+ getSlotAttachObject3d(slotId: string): THREE.Object3D | undefined;
236
+ getSlotSize(slotId: string): {
237
+ width: number;
238
+ height: number;
239
+ depth: number;
240
+ } | undefined;
241
+ cellCenter2D(slotId: string): {
242
+ x: number;
243
+ y: number;
244
+ } | null;
245
+ slotTargetAt(slotIdOrLocation: string): SlotTarget;
246
+ /**
247
+ * 외부 입력 → 내부 cellId 변환:
248
+ * - "N-N-N" (3 segments, 모두 숫자) → cellId 그대로 (dual-accept)
249
+ * - 그 외 → location 으로 간주, locationIndex lookup
250
+ */
251
+ private _resolveToCellId;
252
+ private _isCellIdFormat;
253
+ /**
254
+ * 한 위치의 cellOverride 를 갱신 (merge). 기존 필드는 유지, 새 필드만 덮어씀.
255
+ * `partial` 의 필드가 *undefined* 면 *그 필드 삭제* (override 키에서 제거).
256
+ */
257
+ setCellOverride(posKey: string, partial: Partial<CellOverride>): void;
258
+ /** 한 위치의 override 전체 삭제. */
259
+ clearCellOverride(posKey: string): void;
260
+ /**
261
+ * 여러 위치의 isEmpty 일괄 토글. cell-component 있으면 cell.set(), 없으면 cellOverrides.
262
+ */
263
+ setIsEmpty(posKeys: string[], isEmpty: boolean): void;
264
+ /**
265
+ * 여러 위치의 border 스타일 일괄 설정. `where` ('top'|'left'|'bottom'|'right'|'all').
266
+ * - style = null → 해당 side 삭제
267
+ * - where = 'all' → 4면 모두 동일 style
268
+ */
269
+ setBorder(posKeys: string[], style: any, where?: 'all' | 'top' | 'left' | 'bottom' | 'right'): void;
270
+ /**
271
+ * 자동 채번 — 선택된 cell 들에 section/unit 자동 부여.
272
+ *
273
+ * @param posKeys 채번 대상 (선택 영역). 빈 array 면 *전체 grid*.
274
+ * @param direction 순회 방향:
275
+ * 'cw' — 한 row 내 col 증가 → 다음 row 는 반대 방향 (boustrophedon)
276
+ * 'ccw' — 반대 방향
277
+ * 'zigzag' — col 우선 증가 (cw 의 90° 회전)
278
+ * 'zigzag-reverse' — 반대
279
+ * @param skipNumbering true 면 isEmpty cell 건너뜀 (단위 번호 안 증가).
280
+ * @param startSection 첫 section 번호 (default 1)
281
+ * @param startUnit 첫 unit 번호 (default 1)
282
+ *
283
+ * Aisle row (모든 cell isEmpty) 는 section 경계로 인식 — section 번호가 다음 row 에서 +1.
284
+ *
285
+ * setState 한 번 (cellOverrides 일괄 갱신) → location 역인덱스 1회 무효화.
286
+ */
287
+ increaseLocation(posKeys: string[], direction?: 'cw' | 'ccw' | 'zigzag' | 'zigzag-reverse', skipNumbering?: boolean, startSection?: number, startUnit?: number): void;
288
+ /**
289
+ * 모든 grid 위치 (전체 columns × rows) 의 posKey 목록.
290
+ */
291
+ private _allPosKeys;
292
+ /**
293
+ * Row 의 col 순회 순서 결정. boustrophedon (S 자형) 패턴 지원.
294
+ * cw : 짝수 row 는 좌→우, 홀수 row 는 우→좌
295
+ * ccw : 짝수 row 는 우→좌, 홀수 row 는 좌→우
296
+ * zigzag : 모든 row 좌→우 (단순)
297
+ * zigzag-reverse : 모든 row 우→좌
298
+ */
299
+ private _orderCols;
80
300
  }
301
+ export {};