@operato/scene-storage 10.0.0-beta.44 → 10.0.0-beta.46

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 (42) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/crane-3d.d.ts +10 -0
  3. package/dist/crane-3d.js +34 -5
  4. package/dist/crane-3d.js.map +1 -1
  5. package/dist/crane.d.ts +136 -6
  6. package/dist/crane.js +567 -46
  7. package/dist/crane.js.map +1 -1
  8. package/dist/parcel-3d.d.ts +1 -0
  9. package/dist/parcel-3d.js +18 -1
  10. package/dist/parcel-3d.js.map +1 -1
  11. package/dist/rack-grid-3d.js +26 -8
  12. package/dist/rack-grid-3d.js.map +1 -1
  13. package/dist/rack-grid.d.ts +94 -10
  14. package/dist/rack-grid.js +468 -86
  15. package/dist/rack-grid.js.map +1 -1
  16. package/dist/storage-rack-3d.js +1 -1
  17. package/dist/storage-rack-3d.js.map +1 -1
  18. package/dist/storage-rack.d.ts +31 -6
  19. package/dist/storage-rack.js +96 -14
  20. package/dist/storage-rack.js.map +1 -1
  21. package/package.json +3 -3
  22. package/src/crane-3d.ts +34 -4
  23. package/src/crane.ts +615 -55
  24. package/src/parcel-3d.ts +19 -1
  25. package/src/rack-grid-3d.ts +31 -8
  26. package/src/rack-grid.ts +488 -82
  27. package/src/storage-rack-3d.ts +1 -1
  28. package/src/storage-rack.ts +96 -14
  29. package/test/test-coord-alignment.ts +2 -2
  30. package/test/test-crane-bay-match.ts +130 -0
  31. package/test/test-crane-binding-resolve.ts +168 -0
  32. package/test/test-crane-duration.ts +90 -0
  33. package/test/test-crane-rotation-reach.ts +218 -0
  34. package/test/test-rack-grid-3d-alignment.ts +235 -0
  35. package/test/test-rack-grid-3d-attach-real.ts +375 -0
  36. package/test/test-rack-grid-cell.ts +2 -2
  37. package/test/test-rack-grid-location.ts +2 -2
  38. package/test/test-rack-grid-occupied-slots.ts +165 -0
  39. package/test/test-rack-grid-picking-position.ts +154 -0
  40. package/test/test-rack-grid-slot-api.ts +483 -0
  41. package/test/test-slot-ids-enumeration.ts +137 -0
  42. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rack-grid.js","sourceRoot":"","sources":["../src/rack-grid.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * RackGrid — *grid layout 의 컨테이너*.\n *\n * 각 (col, row) 위치마다 *하나의 자식 컴포넌트* 보유 가능:\n * - StorageRack (한 column 의 vertical stack — stock 보관)\n * - Crane / AGV / forklift / 미니로드 등 *operation archetype* (이동/작업 설비)\n * - 또는 비어 있음 (= 통로 / 작업자 공간 / 무엇이든)\n *\n * 외부에는 *location string* (예: \"Z-A01-03-1\") 으로 API 노출. 내부 cellId 와 양방향\n * 변환은 RackGrid 가 책임.\n *\n * **Performance** — 각 자식 StorageRack 이 자체 InstancedMesh 로 stock 렌더링.\n * storage-rack 의 batched 시각화 성능 그대로 계승. RackGrid 는 *얇은 wrapper*.\n *\n * **Transfer 컨트랙** — SlottedHolder 인터페이스 구현. 내부적으로 *자식 StorageRack*\n * 으로 위임. Mover / Crane 등이 *RackGrid 의 slot target* 으로 인터랙트 가능.\n *\n * **Configuration 생산성** — rack-table 의 *location 룰* (locPattern, sectionDigits 등)\n * 차용. cell-component 없이 *sparse cellOverrides* 만으로 동일 UX 제공.\n *\n * **Aisle/Empty** — `cellOverrides[posKey].isEmpty = true` 로 명시. 의미는\n * *location 미부여 + increaseLocation 의 aisle row 인식* 만. 그 위치의 자식 컴포넌트\n * 종류는 *자유* (Crane/AGV/forklift/그냥 비움 모두 가능).\n *\n * **CellId 컨벤션** (내부):\n * - posKey = `${col-1}-${row-1}` (0-based, 2 segments) — *grid 평면 위치*\n * - cellId = `${col-1}-${row-1}-${shelf-1}` (0-based, 3 segments) — *grid + shelf*\n * - 자식 StorageRack 내부에서는 `0-0-${shelf-1}` (자체 cellId 형식). RackGrid 가 변환.\n */\nimport {\n ApplicationContext, Component, ComponentNature, ContainerAbstract, Control, Layout,\n Model, POINT, Properties, RealObject, sceneComponent\n} from '@hatiolab/things-scene'\nimport type { State } from '@hatiolab/things-scene'\nimport * as THREE from 'three'\nimport {\n Placeable,\n SlotTarget,\n type Alignment,\n type Heights,\n type PlacementArchetype,\n type SlotRecord,\n type SlottedHolder\n} from '@operato/scene-base'\n\nimport StorageRack from './storage-rack.js'\nimport RackGridCell from './rack-grid-cell.js'\nimport { RackGrid3D } from './rack-grid-3d.js'\n\n// RackGridCell 의 refid 충돌 회피 — load 시 동적 생성되는 cell 의 refid 가 *부모\n// RackGrid + 모델 안 다른 컴포넌트* refid 와 겹치지 않도록 *높은 시작값 + monotonic\n// counter*. hierarchy override 가 save 시 refid 제거 → 모델 파일엔 안 새겨짐.\nlet _cellRefidCounter = 100_000_000\nfunction _nextCellRefid(): number {\n return _cellRefidCounter++\n}\n\nfunction buildNewCell(app: ApplicationContext) {\n const refid = _nextCellRefid()\n const m: any = Model.compile(\n {\n type: 'rack-grid-cell',\n refid,\n left: 0, top: 0, width: 1, height: 1, isEmpty: false\n },\n app\n )\n // Model.compile 이 refid 를 자동 generator 로 덮어쓸 수 있어 *강제 재 set*.\n try {\n if (m.refid !== refid) {\n m.refid = refid\n m.state && (m.state.refid = refid)\n m._state && (m._state.refid = refid)\n }\n } catch {}\n return m\n}\n\nconst TABLE_LAYOUT = Layout.get('table')\n\nfunction arrayOf(value: number, size: number): number[] {\n const arr: number[] = []\n for (let i = 0; i < size; i++) arr.push(value)\n return arr\n}\n\nconst columnControlHandler = {\n ondragmove(point: POINT, index: number, component: RackGrid) {\n const { left, top, width, height } = component.textBounds\n const widths_sum = component.widths_sum\n const widths = component.widths.slice()\n\n const origin_pos_unit = widths.slice(0, index + 1).reduce((sum, w) => sum + w, 0)\n const origin_offset = left + (origin_pos_unit / widths_sum) * width\n\n const transcoorded = component.transcoordP2S(point.x, point.y)\n const diff = transcoorded.x - origin_offset\n\n let diff_unit = (diff / width) * widths_sum\n const min_width_unit = (widths_sum / width) * 5\n\n if (diff_unit < 0) diff_unit = -Math.min(widths[index] - min_width_unit, -diff_unit)\n else diff_unit = Math.min(widths[index + 1] - min_width_unit, diff_unit)\n\n widths[index] = Math.round((widths[index] + diff_unit) * 100) / 100\n widths[index + 1] = Math.round((widths[index + 1] - diff_unit) * 100) / 100\n\n component.set('widths', widths)\n }\n}\n\nconst rowControlHandler = {\n ondragmove(point: POINT, index: number, component: RackGrid) {\n const { left, top, width, height } = component.textBounds\n const heights_sum = component.heights_sum\n const heights = component.heights.slice()\n\n index -= component.columns - 1\n const origin_pos_unit = heights.slice(0, index + 1).reduce((sum, h) => sum + h, 0)\n const origin_offset = top + (origin_pos_unit / heights_sum) * height\n\n const transcoorded = component.transcoordP2S(point.x, point.y)\n const diff = transcoorded.y - origin_offset\n\n let diff_unit = (diff / height) * heights_sum\n const min_height_unit = (heights_sum / height) * 5\n\n if (diff_unit < 0) diff_unit = -Math.min(heights[index] - min_height_unit, -diff_unit)\n else diff_unit = Math.min(heights[index + 1] - min_height_unit, diff_unit)\n\n heights[index] = Math.round((heights[index] + diff_unit) * 100) / 100\n heights[index + 1] = Math.round((heights[index + 1] - diff_unit) * 100) / 100\n\n component.set('heights', heights)\n }\n}\n\n// ─── Cell-level metadata (sparse override) ────────────────────────────────────\n\n/** 한 (col, row) 위치의 메타데이터. 명시되지 않은 위치는 *룰의 기본값* 적용 (= location 없음). */\nexport interface CellOverride {\n /** Location 의 `{s}` 부분. unit 과 함께 명시되어야 location 부여됨. */\n section?: string\n /** Location 의 `{u}` 부분. section 과 함께 명시되어야 location 부여됨. */\n unit?: string\n /**\n * 명시적 통로/공실 표시. 의미:\n * - location 미부여 (이 cell 로는 외부 location key 매칭 불가)\n * - increaseLocation 의 aisle row 로 인식 (skipNumbering 시 건너뜀)\n * 자식 컴포넌트 종류는 무관 — Crane/AGV/forklift/비움 모두 OK.\n */\n isEmpty?: boolean\n /** 4-side border style (top/left/bottom/right) — modeling 시각 용. */\n border?: any\n /** Grid merge — 시각 표현. */\n merged?: boolean\n rowspan?: number\n colspan?: number\n}\n\n// ─── State ────────────────────────────────────────────────────────────────────\n\nexport interface RackGridState extends State {\n /** Grid 가로 칸 수 (X 축). 각 칸 ≈ 1 column 의 StorageRack (또는 Crane 등). */\n columns?: number\n /** Grid 세로 칸 수 (Z 축, depth). 통상 1, double-deep rack 등은 2. */\n rows?: number\n /** 각 (col, row) 의 수직 shelf 수 (Y 축, level). 자식 StorageRack 의 levels 와 일치. */\n shelves?: number\n\n /**\n * 첫 shelf 의 시작 높이 (mm, 3D Y 축, 바닥부터). 미명시 0 (바닥 = 첫 shelf).\n * 양수 시 그만큼 위로 올라가 *stocker port / conveyor 같은 컴포넌트가 들어갈 빈 공간*\n * 확보. Frame uprights 는 바닥 ~ 천장 그대로.\n */\n shelfBaseHeight?: number\n\n // ── Location 룰 (rack-table 컨벤션) ──\n zone?: string\n /** 기본 `'{z}{s}-{u}-{sh}'`. placeholders: {z} {s} {u} {sh}. */\n locPattern?: string\n /** Section 숫자 자리수 (zero-pad). 기본 2. */\n sectionDigits?: number\n /** Unit 숫자 자리수 (zero-pad). 기본 2. */\n unitDigits?: number\n /** Shelf label CSV. 예: '1,2,3' / ',,,04'. 빈 자리는 1-based 인덱스 default. */\n shelfLocations?: string\n\n /** Sparse cell metadata. key = posKey = `${col-1}-${row-1}` (0-based, 2 segments). */\n cellOverrides?: { [posKey: string]: CellOverride }\n\n /**\n * Stock records — `{ cellId: 'col-row-shelf', type, ... }`. cellId 가 RackGrid 의\n * cell 위치 (3 segments) 와 매칭되는 record 만 InstancedMesh instance 로 렌더링.\n * Plan A 정신 — sparse 데이터, 자식 컴포넌트 없이 batched 시각화.\n */\n data?: Array<{ cellId: string; [key: string]: any }>\n\n /**\n * Popup 컴포넌트 id — 클릭 시 그 popup 을 invoke (anchor = 클릭된 cell 의 SlotTarget).\n * 미명시 시 click event (`rack-grid-cell-click`) 만 emit.\n */\n popupRef?: string\n\n // ── 시각화 옵션 ──\n hideRackFrame?: boolean // post + beam 모두 숨김\n hideHorizontalFrame?: boolean // 가로 frame (beam) 만 숨김 (post 유지)\n legendTarget?: string\n hideEmptyStock?: boolean\n widths?: number[]\n heights?: number[]\n}\n\n// ─── Nature ───────────────────────────────────────────────────────────────────\n//\n// `nature` 는 *static const* 가 아니라 *get nature()* — properties 의 widget event\n// handler 안 `this` 가 *해당 RackGrid 인스턴스* 를 가리키도록 (화살표 함수가\n// getter 의 `this` 를 capture). rack-table-cell 의 동일 패턴.\n\n// ─── RackGrid ─────────────────────────────────────────────────────────────────\n\n@sceneComponent('rack-grid')\nexport default class RackGrid\n extends Placeable(ContainerAbstract)\n implements SlottedHolder\n{\n declare state: RackGridState\n\n static placement: PlacementArchetype = 'floor'\n static align: Alignment = 'bottom'\n static defaultDepth = (h: Heights) => h.ceiling - h.floor\n\n get nature(): ComponentNature {\n return {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n { type: 'number', label: 'columns', name: 'columns' },\n { type: 'number', label: 'rows', name: 'rows' },\n { type: 'number', label: 'shelves', name: 'shelves' },\n { type: 'number', label: 'shelf-base-height', name: 'shelfBaseHeight' },\n { type: 'string', label: 'zone', name: 'zone' },\n { type: 'string', label: 'location-pattern', name: 'locPattern', placeholder: '{z}{s}-{u}-{sh}' },\n { type: 'number', label: 'section-digits', name: 'sectionDigits' },\n { type: 'number', label: 'unit-digits', name: 'unitDigits' },\n { type: 'string', label: 'shelf-locations', name: 'shelfLocations', placeholder: '1,2,3 또는 ,,,04' },\n {\n // root.selected 의 RackGridCell 들 또는 *전체 grid* 에 채번 적용.\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 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 this.increaseLocation(keys, increasingDirection, skipNumbering, startSection, startUnit)\n }\n }\n }\n },\n { type: 'checkbox', label: 'hide-rack-frame', name: 'hideRackFrame' },\n { type: 'checkbox', label: 'hide-horizontal-frame', name: 'hideHorizontalFrame' },\n { type: 'id-input', label: 'legend-target', name: 'legendTarget', property: { component: 'legend' } },\n { type: 'checkbox', label: 'hide-empty-stock', name: 'hideEmptyStock' },\n { type: 'id-input', label: 'popup-ref', name: 'popupRef', property: { component: 'popup' } }\n ],\n help: 'scene/component/rack-grid'\n }\n }\n\n get anchors() {\n return []\n }\n\n /**\n * Serialize 시 자식 RackGridCell 의 redundant 속성 제거:\n * - 좌표/변환 (left/top/width/height/zPos/rotation/scale/translate) — table layout 이\n * runtime 에 자동 결정. state 저장하면 layout 결과와 불일치 위험.\n * - **refid** — *동적 생성* 되는 자식이라 *부모의 refid 가 그대로 들어가면 충돌*\n * (\"Refid Index replaced\" 경고). 자식의 refid 는 *load 시 새로 자동 부여*. (외부\n * 참조용 *id* 는 사용자 명시 시만 유지)\n *\n * 유지: cellId, section, unit, isEmpty, border, shelfLocations 등 *own 데이터*.\n */\n get hierarchy(): any {\n const base: any = super.hierarchy\n if (base?.components && Array.isArray(base.components)) {\n base.components = base.components.map((c: any) => {\n if (!c || typeof c !== 'object') return c\n const { left, top, width, height, zPos, rotation, scale, translate, refid, ...rest } = c\n return rest\n })\n }\n return base\n }\n\n /** Focusible — children (RackGridCell) 도 editor 의 selection 가능 (rack-table 동일). */\n get focusible() {\n return false\n }\n\n /** Lifecycle — children 자동 생성. columns × rows 만큼 RackGridCell 자식. */\n created() {\n const tobeSize = this.columns * this.rackRows\n const gap = ((this as any).size?.() ?? this.components.length) - tobeSize\n\n if (gap === 0) {\n // 자식 수는 맞음 — cellId 만 sync\n this._syncChildCellIds()\n return\n } else if (gap > 0) {\n ;(this as any).remove?.(this.components.slice(gap))\n } else {\n const newbies: any[] = []\n for (let i = 0; i < -gap; i++) newbies.push(buildNewCell((this as any).app))\n ;(this as any).add?.(newbies)\n }\n\n const widths = this.getState('widths')\n const heights = this.getState('heights')\n if (!widths || (widths as number[]).length < this.columns) this.set('widths', this.widths)\n if (!heights || (heights as number[]).length < this.rackRows) this.set('heights', this.heights)\n\n this._syncChildCellIds()\n }\n\n /** columns/rows 변경 시 children 재구성. rack-table.buildCells 패턴. */\n onchange(after: Properties, _before: Properties) {\n super.onchange?.(after, _before)\n if ('columns' in after || 'rows' in after) {\n const oldCols = (_before as any).columns ?? this.columns\n const oldRows = (_before as any).rows ?? this.rackRows\n this._buildCells(this.rackRows, this.columns, oldRows, oldCols)\n }\n // 룰 관련 변경 → location 역인덱스 무효화\n if ('locPattern' in after || 'sectionDigits' in after || 'unitDigits' in after ||\n 'shelfLocations' in after || 'zone' in after || 'shelves' in after) {\n this.invalidateLocationIndex()\n }\n // stock 시각 영향 속성 → InstancedMesh 재빌드\n if ('data' in after || 'hideEmptyStock' in after || 'shelves' in after ||\n 'shelfBaseHeight' in after || 'width' in after || 'depth' in after ||\n 'height' in after || 'columns' in after || 'rows' in after) {\n ;(this._realObject as any)?.rebuildStockMesh?.()\n }\n // hideRackFrame / hideHorizontalFrame 변경 → frame visibility 즉시 토글\n if ('hideRackFrame' in after || 'hideHorizontalFrame' in after) {\n ;(this._realObject as any)?.applyFrameVisibility?.()\n }\n }\n\n /** state.data 변경 시 호출 (things-scene 의 onchange<PropName>). */\n onchangeData(): void {\n ;(this._realObject as any)?.rebuildStockMesh?.()\n }\n\n /** state.data 의 records — Plan A 의 stock 보관소. */\n get records(): Array<{ cellId: string; [key: string]: any }> {\n return (this.state.data as any) ?? []\n }\n\n // ── Legend integration ──────────────────────────────────\n\n private _legendTarget?: Component\n\n /**\n * Legend 컴포넌트 lookup. 우선순위:\n * 1) state.legendTarget id 명시\n * 2) scene 전체 의 type='legend' 첫 번째 컴포넌트 (자동 발견)\n */\n get legendTarget(): Component | undefined {\n if (this._legendTarget) return this._legendTarget\n\n const id = this.state.legendTarget\n if (id) {\n const found = (this.root as any)?.findById?.(id) as Component | undefined\n if (found) {\n this._legendTarget = found\n ;(found as any).on?.('change', this._onLegendChanged, this)\n return found\n }\n }\n\n const visit = (node: any): Component | undefined => {\n if (!node) return undefined\n if (node.state?.type === 'legend') return node as Component\n const children = node.components as Component[] | undefined\n if (children) {\n for (const c of children) {\n const r = visit(c)\n if (r) return r\n }\n }\n return undefined\n }\n const found = visit(this.root)\n if (found) {\n this._legendTarget = found\n ;(found as any).on?.('change', this._onLegendChanged, this)\n }\n return found\n }\n\n private _onLegendChanged = (): void => {\n ;(this._realObject as any)?.rebuildStockMesh?.()\n }\n\n /**\n * record 의 legend.field 값을 ranges 와 매칭해 색상 해석.\n * - `range.value === recordValue` (카테고리 일치)\n * - `range.min ≤ Number(v) < range.max` (수치 범위)\n * - 매칭 없으면 `defaultColor` 또는 undefined\n */\n // ── View-mode click → rack-grid-cell-click event + popup ──\n\n get eventMap() {\n return {\n '(self)': {\n '(self)': {\n click: this._onViewClick\n }\n }\n }\n }\n\n private _onViewClick = (mouseEvent: MouseEvent) => {\n if (!(this as any).app?.isViewMode) return\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return\n\n const hit = this._raycastHit(mouseEvent)\n if (!hit) return\n\n const stockMesh: THREE.InstancedMesh | undefined = ro.stockMesh\n let cellId: string | undefined\n let record: any\n let isStock = false\n let instanceId: number | undefined\n\n if (hit.object === stockMesh) {\n const records: any[] | undefined = (stockMesh as any).userData?._records\n record = records?.[hit.instanceId ?? -1]\n cellId = record?.cellId\n isStock = true\n instanceId = hit.instanceId\n } else {\n const cid = this._cellIdFromWorldPoint(hit.point)\n if (!cid || cid.startsWith('out-of-bounds')) return\n cellId = cid\n const data = this.state.data as Array<any> | undefined\n record = Array.isArray(data) ? data.find(r => r?.cellId === cid) : undefined\n }\n\n const payload = { cellId, record, hitPoint: hit.point, instanceId, isStock }\n this.trigger('rack-grid-cell-click', payload)\n this._invokePopup(cellId, record)\n\n // popup 외부 click 으로 인식되어 자동 close 되는 회귀 차단\n mouseEvent.stopPropagation?.()\n }\n\n /** state.popupRef Popup 컴포넌트 invoke. anchor = 클릭된 cell 의 SlotTarget. */\n private _invokePopup(cellId: string | undefined, record: any): void {\n const popupRefId = this.state.popupRef\n if (!popupRefId || !cellId) return\n const popupComp: any = (this.root as any)?.findById?.(popupRefId)\n if (!popupComp || typeof popupComp.openPopup !== 'function') {\n console.warn(`[rack-grid] popupRef=\"${popupRefId}\" 가 가리키는 컴포넌트 없거나 openPopup 미지원`)\n return\n }\n const anchor = this.slotTargetAt(cellId)\n popupComp.openPopup(record ?? { cellId }, { anchor })\n }\n\n /** raycast → 우리 RackGrid 의 어떤 mesh 가 closest hit 인지. */\n private _raycastHit(mouseEvent: MouseEvent): THREE.Intersection | undefined {\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return undefined\n const tc: any = ro.threeContainer\n if (!tc) return undefined\n\n const cap: any = tc._threeCapability ?? tc._capability\n let intersects: THREE.Intersection[] | undefined\n if (cap?.getObjectsByRaycast) {\n intersects = cap.getObjectsByRaycast() as THREE.Intersection[] | undefined\n }\n\n if (!intersects || intersects.length === 0) {\n const scene = tc.scene3d as THREE.Scene | undefined\n const renderer = tc.renderer3d as THREE.WebGLRenderer | undefined\n const camera =\n (tc.activeCamera3d as THREE.Camera | undefined) ??\n (cap?.activeCamera as THREE.Camera | undefined) ??\n (cap?.camera as THREE.Camera | undefined)\n const canvas = renderer?.domElement\n if (!scene || !canvas || !camera) return undefined\n const rect = canvas.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return undefined\n const ndc = new THREE.Vector2(\n ((mouseEvent.clientX - rect.left) / rect.width) * 2 - 1,\n -((mouseEvent.clientY - rect.top) / rect.height) * 2 + 1\n )\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(ndc, camera)\n intersects = raycaster.intersectObjects(scene.children, true)\n }\n if (!intersects || intersects.length === 0) return undefined\n\n const closest = intersects[0]\n let obj: THREE.Object3D | null = closest.object\n while (obj) {\n if (obj.userData?.context === ro) return closest\n obj = obj.parent\n }\n return undefined\n }\n\n /** world point → cellId (col-row-shelf) 역산. */\n private _cellIdFromWorldPoint(worldPoint: THREE.Vector3): string | null {\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return null\n\n const local = new THREE.Vector3().copy(worldPoint)\n const mInv = new THREE.Matrix4().copy(ro.object3d.matrixWorld).invert()\n local.applyMatrix4(mInv)\n\n const cols = this.columns\n const rows = this.rackRows\n const shelves = this.shelves\n const width = (this.state.width as number) || 1000\n const height = (this.state.depth as number) || 2000 // 3D Y\n const depth = (this.state.height as number) || 200 // 3D Z\n const shelfBase = (this.state.shelfBaseHeight as number) || 0\n const shelfZone = height - shelfBase\n\n const bayW = width / cols\n const bayD = depth / rows\n const cellY = shelfZone / shelves\n\n // center-based: X [-width/2, +width/2], Y [-height/2, +height/2], Z [-depth/2, +depth/2]\n const col = Math.floor((local.x + width / 2) / bayW)\n const yFromBottom = local.y + height / 2 - shelfBase\n const shelf = Math.floor(yFromBottom / cellY)\n const row = Math.floor((local.z + depth / 2) / bayD)\n\n if (col < 0 || col >= cols || row < 0 || row >= rows || shelf < 0 || shelf >= shelves) {\n return `out-of-bounds(col=${col},row=${row},shelf=${shelf})`\n }\n return `${col}-${row}-${shelf}`\n }\n\n resolveLegendColor(record: any): string | undefined {\n const legend = this.legendTarget\n if (!legend) return undefined\n const status: any = (legend as any).getState?.('status') ?? (legend.state as any)?.status\n if (!status) return undefined\n\n const field = status.field as string | undefined\n const ranges = status.ranges as any[] | undefined\n if (!field || !Array.isArray(ranges)) return undefined\n\n const value = record?.[field]\n if (value === undefined || value === null) return status.defaultColor\n\n for (const range of ranges) {\n if (!range) continue\n if (range.value !== undefined) {\n if (range.value === value) return range.color\n continue\n }\n const num = Number(value)\n if (!Number.isFinite(num)) continue\n const min = range.min !== undefined && range.min !== '' ? Number(range.min) : undefined\n const max = range.max !== undefined && range.max !== '' ? Number(range.max) : undefined\n const minOk = min === undefined || num >= min\n const maxOk = max === undefined || num < max\n if (minOk && maxOk) return range.color\n }\n return status.defaultColor as string | undefined\n }\n\n /**\n * 새 (rows × columns) 에 맞춰 children 재구성. rack-table.buildCells 정확 클론.\n */\n private _buildCells(newrows: number, newcolumns: number, oldrows: number, oldcolumns: number) {\n const app = (this as any).app\n if (newrows < oldrows) {\n const removals = this.components.slice(oldcolumns * newrows)\n ;(this as any).remove?.(removals)\n }\n const minrows = Math.min(newrows, oldrows)\n if (newcolumns > oldcolumns) {\n for (let r = 0; r < minrows; r++) {\n for (let c = oldcolumns; c < newcolumns; c++) {\n ;(this as any).insertComponentAt?.(buildNewCell(app), r * newcolumns + c)\n }\n }\n } else if (newcolumns < oldcolumns) {\n const removals: any[] = []\n for (let r = 0; r < minrows; r++) {\n for (let c = newcolumns; c < oldcolumns; c++) {\n removals.push(this.components[r * oldcolumns + c])\n }\n }\n ;(this as any).remove?.(removals)\n }\n if (newrows > oldrows) {\n const newbies: any[] = []\n for (let r = oldrows; r < newrows; r++) {\n for (let i = 0; i < newcolumns; i++) newbies.push(buildNewCell(app))\n }\n ;(this as any).add?.(newbies)\n }\n this.set({ widths: this.widths, heights: this.heights })\n this._syncChildCellIds()\n }\n\n /** children 의 state.cellId 가 *순서 기반 bayKey* 와 일치하도록 동기화. */\n private _syncChildCellIds() {\n const cols = this.columns\n const children = this.components\n for (let i = 0; i < children.length; i++) {\n const col = i % cols\n const row = Math.floor(i / cols)\n const bayKey = `${col}-${row}`\n const c: any = children[i]\n if (c?.state?.cellId !== bayKey) c?.set?.('cellId', bayKey)\n }\n }\n\n /** Row 인덱스의 cell 들. rack-table-cell 의 rowCells 가 사용. */\n getCellsByRow(row: number): Component[] {\n return this.components.slice(row * this.columns, (row + 1) * this.columns)\n }\n /** Column 인덱스의 cell 들. */\n getCellsByColumn(column: number): Component[] {\n const out: Component[] = []\n for (let i = 0; i < this.rackRows; i++) out.push(this.components[this.columns * i + column])\n return out\n }\n\n /** (col, row) 위치의 cell-component. */\n cellAt(col: number, row: number = 0): RackGridCell | null {\n const idx = row * this.columns + col\n return (this.components[idx] as any) ?? null\n }\n\n /** bayKey 의 cell-component. */\n cellAtBayKey(bayKey: string): RackGridCell | null {\n const parsed = this.parsePosKey(bayKey)\n if (!parsed) return null\n return this.cellAt(parsed.col, parsed.row)\n }\n\n /**\n * (col, row) bay 가 *isEmpty* 인가. cell-component 의 state.isEmpty 가 source of\n * truth, 없으면 cellOverrides[posKey].isEmpty fallback.\n */\n isBayEmpty(col: number, row: number = 0): boolean {\n const cell = this.cellAt(col, row)\n if (cell) return !!cell.state.isEmpty\n const posKey = `${col}-${row}`\n return !!this.cellOverrides[posKey]?.isEmpty\n }\n\n buildRealObject(): RealObject | undefined {\n return new RackGrid3D(this)\n }\n\n // ── Table layout — 자식 자동 배치 + columns/rows 의 가변 widths/heights ──\n\n get layout(): any {\n return TABLE_LAYOUT\n }\n\n get widths(): number[] {\n const widths = this.getState('widths') as number[] | undefined\n if (!widths) return arrayOf(1, this.columns)\n if (widths.length < this.columns) return widths.concat(arrayOf(1, this.columns - widths.length))\n if (widths.length > this.columns) return widths.slice(0, this.columns)\n return widths\n }\n\n get heights(): number[] {\n const heights = this.getState('heights') as number[] | undefined\n if (!heights) return arrayOf(1, this.rackRows)\n if (heights.length < this.rackRows) return heights.concat(arrayOf(1, this.rackRows - heights.length))\n if (heights.length > this.rackRows) return heights.slice(0, this.rackRows)\n return heights\n }\n\n get widths_sum(): number {\n return this.widths.reduce((sum, w) => sum + w, 0) || this.columns\n }\n\n get heights_sum(): number {\n return this.heights.reduce((sum, h) => sum + h, 0) || this.rackRows\n }\n\n /** Column / Row 사이 드래그 핸들 — editor 의 widths/heights 가변 조절. */\n get controls(): Array<Control> | undefined {\n const widths = this.widths\n const heights = this.heights\n const inside = this.textBounds\n const width_unit = inside.width / this.widths_sum\n const height_unit = inside.height / this.heights_sum\n\n const controls: Array<Control> = []\n\n let x = inside.left\n widths.slice(0, this.columns - 1).forEach(w => {\n x += w * width_unit\n controls.push({ x, y: inside.top, handler: columnControlHandler })\n })\n\n let y = inside.top\n heights.slice(0, this.rackRows - 1).forEach(h => {\n y += h * height_unit\n controls.push({ x: inside.left, y, handler: rowControlHandler })\n })\n\n return controls\n }\n\n // ── 2D 렌더링 — table layout 의 widths/heights 기반 격자 ─────\n //\n // 자식 컴포넌트 가 자기 렌더링하지만 *비어있는 grid 도 modeling 시 가시화*. 격자\n // 좌표는 widths/heights (table layout 의 가변 분할) 기반. cellOverrides 의\n // isEmpty (사선) + border (4-side) 도 표시.\n\n render(ctx: CanvasRenderingContext2D) {\n // 2D 에서는 hideRackFrame 이어도 *외곽 + 격자선 + cell 마커* 는 항상 그림.\n // (2D 의 frame 은 시각적 *분할선* 이라 frame mesh 와 의미가 다름)\n const inside = this.textBounds\n const left = inside.left\n const top = inside.top\n const width = inside.width\n const height = inside.height\n const cols = this.columns\n const rows = this.rackRows\n const widths = this.widths\n const heights = this.heights\n const wSum = this.widths_sum\n const hSum = this.heights_sum\n const fill = (this.state.fillStyle as string) || '#e8e8ec'\n const stroke = (this.state.strokeStyle as string) || '#888'\n const lineWidth = (this.state.lineWidth as number) || 1\n const overrides = this.cellOverrides\n\n // column 별 X 좌표 (좌→우 누적)\n const xs: number[] = [left]\n for (let c = 0; c < cols; c++) xs.push(xs[c] + (widths[c] / wSum) * width)\n // row 별 Y 좌표 (상→하 누적)\n const ys: number[] = [top]\n for (let r = 0; r < rows; r++) ys.push(ys[r] + (heights[r] / hSum) * height)\n\n // Fill (반투명) — 외곽 영역\n ctx.save()\n ctx.fillStyle = fill\n ctx.globalAlpha = 0.2\n ctx.fillRect(left, top, width, height)\n ctx.restore()\n\n // isEmpty cell 표시 (사선 + 회색 fill)\n ctx.save()\n for (const [posKey, ov] of Object.entries(overrides)) {\n if (!ov.isEmpty) continue\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n if (parsed.col < 0 || parsed.col >= cols || parsed.row < 0 || parsed.row >= rows) continue\n const cl = xs[parsed.col]\n const ct = ys[parsed.row]\n const cw = xs[parsed.col + 1] - cl\n const ch = ys[parsed.row + 1] - ct\n ctx.fillStyle = '#cccccc'\n ctx.globalAlpha = 0.5\n ctx.fillRect(cl, ct, cw, ch)\n ctx.globalAlpha = 1\n ctx.strokeStyle = '#999'\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(cl, ct); ctx.lineTo(cl + cw, ct + ch)\n ctx.moveTo(cl + cw, ct); ctx.lineTo(cl, ct + ch)\n ctx.stroke()\n }\n ctx.restore()\n\n // 외곽 + 격자\n ctx.save()\n ctx.strokeStyle = stroke\n ctx.lineWidth = lineWidth\n ctx.strokeRect(left, top, width, height)\n ctx.beginPath()\n for (let c = 1; c < cols; c++) {\n ctx.moveTo(xs[c], top); ctx.lineTo(xs[c], top + height)\n }\n for (let r = 1; r < rows; r++) {\n ctx.moveTo(left, ys[r]); ctx.lineTo(left + width, ys[r])\n }\n ctx.stroke()\n ctx.restore()\n\n // cell 별 명시 border\n for (const [posKey, ov] of Object.entries(overrides)) {\n if (!ov.border) continue\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n if (parsed.col < 0 || parsed.col >= cols || parsed.row < 0 || parsed.row >= rows) continue\n const cl = xs[parsed.col]\n const ct = ys[parsed.row]\n const cr = xs[parsed.col + 1]\n const cb = ys[parsed.row + 1]\n const b = ov.border\n const drawSide = (style: any, x1: number, y1: number, x2: number, y2: number) => {\n if (!style?.strokeStyle) return\n ctx.save()\n ctx.strokeStyle = style.strokeStyle\n ctx.lineWidth = style.lineWidth ?? 1\n ctx.beginPath()\n ctx.moveTo(x1, y1); ctx.lineTo(x2, y2)\n ctx.stroke()\n ctx.restore()\n }\n drawSide(b.top, cl, ct, cr, ct)\n drawSide(b.left, cl, ct, cl, cb)\n drawSide(b.bottom, cl, cb, cr, cb)\n drawSide(b.right, cr, ct, cr, cb)\n }\n\n // Selected bay 강조는 *rack-grid-cell 자체* 의 render 가 처리 (framework 의\n // selection 시스템이 cell 의 outline 자동 그림). RackGrid 는 grid 골격만.\n }\n\n // ── Grid layout ─────────────────────────────────────────\n\n get columns(): number {\n return Math.max(1, Math.floor(this.state.columns ?? 5))\n }\n\n get rackRows(): number {\n return Math.max(1, Math.floor(this.state.rows ?? 1))\n }\n\n get shelves(): number {\n return Math.max(1, Math.floor(this.state.shelves ?? 4))\n }\n\n // ── cellId / posKey 변환 ────────────────────────────────\n\n /** posKey = `${col-1}-${row-1}` (0-based, 2 segments). 1-based input. */\n posKeyOf(col: number, row: number = 1): string {\n return `${col - 1}-${row - 1}`\n }\n\n /** cellId = `${col-1}-${row-1}-${shelf-1}` (0-based, 3 segments). 1-based input. */\n cellIdOf(col: number, row: number = 1, shelf: number = 1): string {\n return `${col - 1}-${row - 1}-${shelf - 1}`\n }\n\n parseCellId(cellId: string): { col: number; row: number; shelf: number } | null {\n const parts = cellId.split('-')\n if (parts.length !== 3) return null\n const [c, r, s] = parts.map(Number)\n if (!Number.isFinite(c) || !Number.isFinite(r) || !Number.isFinite(s)) return null\n return { col: c, row: r, shelf: s }\n }\n\n parsePosKey(posKey: string): { col: number; row: number } | null {\n const parts = posKey.split('-')\n if (parts.length !== 2) return null\n const [c, r] = parts.map(Number)\n if (!Number.isFinite(c) || !Number.isFinite(r)) return null\n return { col: c, row: r }\n }\n\n // ── cellOverrides accessor ─────────────────────────────\n\n get cellOverrides(): { [posKey: string]: CellOverride } {\n return (this.state.cellOverrides ?? {}) as { [posKey: string]: CellOverride }\n }\n\n getCellOverride(posKey: string): CellOverride | undefined {\n return this.cellOverrides[posKey]\n }\n\n // ── Shelf labels ───────────────────────────────────────\n\n /**\n * Parse `state.shelfLocations` 를 levels 길이 array 로. 빈 슬롯은 1-based index default.\n * '1,2,3' → ['1', '2', '3', ...]\n * ',,,04' → ['1', '2', '3', '04']\n * undefined → ['1', '2', '3', '4', ...]\n */\n get shelfLabels(): string[] {\n const input = this.state.shelfLocations\n const levels = this.shelves\n const parts = (input || '').split(',')\n const out: string[] = []\n for (let i = 0; i < levels; i++) {\n const p = parts[i]\n out[i] = p && p.trim().length > 0 ? p.trim() : String(i + 1)\n }\n return out\n }\n\n // ── Location 변환 (양방향) ──────────────────────────────\n\n /**\n * cellId → location string. 우선순위:\n * 1. cell-component (state.section/unit) — source of truth\n * 2. cellOverrides[posKey] — 호환성 fallback\n * section/unit 둘 다 있고 isEmpty=false 일 때만 부여. 미부여 시 null.\n */\n locationOf(cellId: string): string | null {\n const parsed = this.parseCellId(cellId)\n if (!parsed) return null\n const posKey = `${parsed.col}-${parsed.row}`\n\n let section: string | undefined\n let unit: string | undefined\n let isEmpty: boolean | undefined\n let cellShelfLocations: string | undefined\n\n const cell = this.cellAt(parsed.col, parsed.row)\n if (cell) {\n section = cell.state.section\n unit = cell.state.unit\n isEmpty = cell.state.isEmpty\n cellShelfLocations = cell.state.shelfLocations\n } else {\n const override = this.cellOverrides[posKey]\n section = override?.section\n unit = override?.unit\n isEmpty = override?.isEmpty\n }\n\n if (!section || !unit || isEmpty) return null\n\n const pattern = this.state.locPattern ?? '{z}{s}-{u}-{sh}'\n const zone = this.state.zone ?? ''\n const shelfLabel = this._shelfLabelsFromCell(cellShelfLocations)[parsed.shelf] ?? String(parsed.shelf + 1)\n\n return pattern\n .replace(/\\{z\\}/g, zone)\n .replace(/\\{s\\}/g, section)\n .replace(/\\{u\\}/g, unit)\n .replace(/\\{sh\\}/g, shelfLabel)\n }\n\n /** cell.state.shelfLocations 명시 시 그것, 아니면 RackGrid 의 shelfLabels. */\n private _shelfLabelsFromCell(cellShelfLocations: string | undefined): string[] {\n const input = cellShelfLocations ?? this.state.shelfLocations\n const levels = this.shelves\n const parts = (input || '').split(',')\n const out: string[] = []\n for (let i = 0; i < levels; i++) {\n const p = parts[i]\n out[i] = p && p.trim().length > 0 ? p.trim() : String(i + 1)\n }\n return out\n }\n\n /** location string → cellId. sparse 역인덱스 lookup. 없으면 null. */\n cellIdOfLocation(location: string): string | null {\n return this._locationIndex.get(location) ?? null\n }\n\n /** 모든 (override 명시된) cell 의 location 목록. inspection 용. */\n get allLocations(): Array<{ cellId: string; location: string }> {\n const result: Array<{ cellId: string; location: string }> = []\n for (const [location, cellId] of this._locationIndex.entries()) {\n result.push({ cellId, location })\n }\n return result\n }\n\n // ── Location 역인덱스 (sparse cache) ────────────────────\n\n private _locationIndexCache?: Map<string, string>\n\n private get _locationIndex(): Map<string, string> {\n if (this._locationIndexCache) return this._locationIndexCache\n const map = new Map<string, string>()\n const shelves = this.shelves\n\n // 1. cell-component 들 (source of truth) — 모든 bay 순회\n const cells = this.components as Component[] | undefined\n if (cells && cells.length > 0) {\n for (let i = 0; i < cells.length; i++) {\n const cell: any = cells[i]\n if (cell?.state?.type !== 'rack-grid-cell') continue\n const bayKey = cell.state.cellId\n if (!bayKey) continue\n const parsed = this.parsePosKey(bayKey)\n if (!parsed) continue\n for (let shelfIdx = 0; shelfIdx < shelves; shelfIdx++) {\n const cellId = `${parsed.col}-${parsed.row}-${shelfIdx}`\n const loc = this.locationOf(cellId)\n if (loc) map.set(loc, cellId)\n }\n }\n }\n\n // 2. cellOverrides fallback (cell-component 없는 시점 — 호환)\n const overrides = this.cellOverrides\n for (const posKey of Object.keys(overrides)) {\n const override = overrides[posKey]\n if (!override.section || !override.unit || override.isEmpty) continue\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n for (let shelfIdx = 0; shelfIdx < shelves; shelfIdx++) {\n const cellId = `${parsed.col}-${parsed.row}-${shelfIdx}`\n if (!map.has(this.locationOf(cellId) || '')) {\n const loc = this.locationOf(cellId)\n if (loc && !map.has(loc)) map.set(loc, cellId)\n }\n }\n }\n\n this._locationIndexCache = map\n return map\n }\n\n /** 룰 / cellOverrides 변경 시 호출. things-scene 의 onchange* 가 자동 호출. */\n invalidateLocationIndex(): void {\n this._locationIndexCache = undefined\n }\n\n onchangeCellOverrides(): void { this.invalidateLocationIndex() }\n onchangeLocPattern(): void { this.invalidateLocationIndex() }\n onchangeShelfLocations(): void { this.invalidateLocationIndex() }\n onchangeZone(): void { this.invalidateLocationIndex() }\n onchangeSectionDigits(): void { this.invalidateLocationIndex() }\n onchangeUnitDigits(): void { this.invalidateLocationIndex() }\n onchangeShelves(): void { this.invalidateLocationIndex() }\n\n // ── 자식 lookup ────────────────────────────────────────\n\n /**\n * (col, row) 위치의 자식 StorageRack. 자식이 StorageRack 이 아닌 경우 (Crane, AGV 등)\n * 는 null — Carrier 보관은 StorageRack 만.\n *\n * 자식의 grid 위치 식별: 자식의 state.column / state.row (1-based) 명시. RackGrid 가\n * 자식 추가 시 자동 할당 또는 사용자가 명시.\n */\n private _childRackAt(posKey: string): StorageRack | null {\n const parsed = this.parsePosKey(posKey)\n if (!parsed) return null\n const children = (this.components as Component[] | undefined) ?? []\n for (const c of children) {\n const type = (c.state as any)?.type\n if (type !== 'storage-rack') continue\n const childCol = ((c.state as any)?.column ?? 1) - 1\n const childRow = ((c.state as any)?.row ?? 1) - 1\n if (childCol === parsed.col && childRow === parsed.row) {\n return c as unknown as StorageRack\n }\n }\n return null\n }\n\n // ── SlottedHolder 컨트랙 — 자식 StorageRack 으로 위임 ────\n\n hasCarrierAt(slotId: string): boolean {\n const parsed = this.parseCellId(slotId)\n if (!parsed) return false\n const child = this._childRackAt(`${parsed.col}-${parsed.row}`)\n return child?.hasCarrierAt(`0-0-${parsed.shelf}`) ?? false\n }\n\n obtainCarrier(slotIdOrLocation: string): Component | null {\n const slotId = this._resolveToCellId(slotIdOrLocation)\n if (!slotId) return null\n const parsed = this.parseCellId(slotId)\n if (!parsed) return null\n const child = this._childRackAt(`${parsed.col}-${parsed.row}`)\n return child?.obtainCarrier(`0-0-${parsed.shelf}`) ?? null\n }\n\n canReceiveAt(slotIdOrLocation: string, carrier?: Component): boolean {\n const slotId = this._resolveToCellId(slotIdOrLocation)\n if (!slotId) return false\n const parsed = this.parseCellId(slotId)\n if (!parsed) return false\n // isEmpty 위치 는 carrier 못 받음 (location-less, modeling 차원)\n const override = this.cellOverrides[`${parsed.col}-${parsed.row}`]\n if (override?.isEmpty) return false\n const child = this._childRackAt(`${parsed.col}-${parsed.row}`)\n return child?.canReceiveAt(`0-0-${parsed.shelf}`, carrier) ?? false\n }\n\n async receiveAt(slotIdOrLocation: string, carrier: Component, options?: any): Promise<void> {\n const slotId = this._resolveToCellId(slotIdOrLocation)\n if (!slotId) throw new Error(`RackGrid.receiveAt: cannot resolve \"${slotIdOrLocation}\"`)\n const parsed = this.parseCellId(slotId)\n if (!parsed) throw new Error(`RackGrid.receiveAt: invalid cellId \"${slotId}\"`)\n const child = this._childRackAt(`${parsed.col}-${parsed.row}`)\n if (!child) {\n throw new Error(`RackGrid.receiveAt: no StorageRack at posKey=${parsed.col}-${parsed.row}`)\n }\n return child.receiveAt(`0-0-${parsed.shelf}`, carrier, options)\n }\n\n recordFromCarrier(carrier: Component, slotId: string): SlotRecord {\n const { id, refid, transform, ...rest } = ((carrier.state as any) || {}) as any\n return { ...rest, cellId: slotId }\n }\n\n /**\n * Slot 의 attach object3d — Stock InstancedMesh 의 instance 와 *같은 world 위치* 에\n * 위치한 invisible Object3D. popup tether / Carriable.applyHolderAttachPoint 가 이\n * object3d 의 matrixWorld 를 사용. lazy 생성 + cache.\n */\n private _attachAnchorByCell: Map<string, THREE.Object3D> = new Map()\n\n getSlotAttachObject3d(slotId: string): THREE.Object3D | undefined {\n const parsed = this.parseCellId(slotId)\n if (!parsed) return undefined\n if (parsed.col < 0 || parsed.col >= this.columns) return undefined\n if (parsed.row < 0 || parsed.row >= this.rackRows) return undefined\n if (parsed.shelf < 0 || parsed.shelf >= this.shelves) return undefined\n\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return undefined\n\n let obj = this._attachAnchorByCell.get(slotId)\n if (!obj) {\n obj = new THREE.Object3D()\n obj.name = `rack-grid-anchor:${slotId}`\n ro.object3d.add(obj)\n this._attachAnchorByCell.set(slotId, obj)\n }\n\n // 위치 갱신 — Stock InstancedMesh 의 instance 위치 와 동일 공식\n const rs: any = this.state\n const cols = this.columns\n const rows = this.rackRows\n const shelves = this.shelves\n const width = (rs?.width as number) ?? 400\n const height = (rs?.depth as number) ?? 2000\n const depth = (rs?.height as number) ?? 200\n const shelfBase = Math.max(0, Math.min((rs?.shelfBaseHeight as number) || 0, height * 0.9))\n const shelfZone = height - shelfBase\n const bayW = width / cols\n const bayD = depth / rows\n const cellY = shelfZone / shelves\n const baseY = -height / 2\n const shelfBaseY = baseY + shelfBase\n const stockD = cellY * 0.7\n\n const cx = (parsed.col - cols / 2 + 0.5) * bayW\n const cellBottomY = shelfBaseY + parsed.shelf * cellY\n const cy = cellBottomY + stockD / 2\n const cz = (parsed.row - rows / 2 + 0.5) * bayD\n obj.position.set(cx, cy, cz)\n // *parent 의 matrixWorld 가 dirty 면 자식 matrixWorld 도 dirty* — 강제 갱신.\n ro.object3d.updateMatrixWorld(true)\n obj.updateMatrixWorld(true)\n return obj\n }\n\n getSlotSize(slotId: string): { width: number; height: number; depth: number } | undefined {\n const parsed = this.parseCellId(slotId)\n if (!parsed) return undefined\n const rs: any = this.state\n const width = (rs?.width as number) ?? 400\n const height = (rs?.depth as number) ?? 2000\n const depth = (rs?.height as number) ?? 200\n const shelfBase = Math.max(0, Math.min((rs?.shelfBaseHeight as number) || 0, height * 0.9))\n const shelfZone = height - shelfBase\n const cellY = shelfZone / this.shelves\n return {\n width: (width / this.columns) * 0.85,\n height: (depth / this.rackRows) * 0.85, // 2D height = 3D Z 폭\n depth: cellY * 0.7 // 3D Y 폭 (= stockD)\n }\n }\n\n cellCenter2D(slotId: string): { x: number; y: number } | null {\n const parsed = this.parseCellId(slotId)\n if (!parsed) return null\n const rs: any = this.state\n const left = (rs?.left as number) ?? 0\n const top = (rs?.top as number) ?? 0\n const width = (rs?.width as number) ?? 400\n const height = (rs?.height as number) ?? 200\n // table layout 의 widths/heights 비례 위치\n const widths = this.widths\n const heights = this.heights\n const wSum = this.widths_sum\n const hSum = this.heights_sum\n let cumW = 0\n for (let c = 0; c < parsed.col; c++) cumW += widths[c]\n let cumH = 0\n for (let r = 0; r < parsed.row; r++) cumH += heights[r]\n const x = left + (cumW + widths[parsed.col] / 2) / wSum * width\n const y = top + (cumH + heights[parsed.row] / 2) / hSum * height\n return { x, y }\n }\n\n slotTargetAt(slotIdOrLocation: string): SlotTarget {\n const slotId = this._resolveToCellId(slotIdOrLocation)\n if (!slotId) throw new Error(`RackGrid.slotTargetAt: cannot resolve \"${slotIdOrLocation}\"`)\n return new SlotTarget(this, slotId)\n }\n\n // ── Helpers ──────────────────────────────────────────\n\n /**\n * 외부 입력 → 내부 cellId 변환:\n * - \"N-N-N\" (3 segments, 모두 숫자) → cellId 그대로 (dual-accept)\n * - 그 외 → location 으로 간주, locationIndex lookup\n */\n private _resolveToCellId(input: string): string | null {\n if (this._isCellIdFormat(input)) return input\n return this.cellIdOfLocation(input)\n }\n\n private _isCellIdFormat(s: string): boolean {\n const parts = s.split('-')\n return parts.length === 3 && parts.every(p => /^\\d+$/.test(p))\n }\n\n // ── Bulk 편집 API ────────────────────────────────────────\n //\n // 모두 *single setState* 로 cellOverrides 갱신 → 단일 'change' 이벤트만 발사.\n // 매핑 cascade 회피 위해 silent 갱신 메서드 제공 (`_setCellOverridesSilently`).\n\n /**\n * 한 위치의 cellOverride 를 갱신 (merge). 기존 필드는 유지, 새 필드만 덮어씀.\n * `partial` 의 필드가 *undefined* 면 *그 필드 삭제* (override 키에서 제거).\n */\n setCellOverride(posKey: string, partial: Partial<CellOverride>): void {\n const current = this.cellOverrides\n const existing = current[posKey] ?? {}\n const merged: any = { ...existing }\n for (const [k, v] of Object.entries(partial)) {\n if (v === undefined) delete merged[k]\n else merged[k] = v\n }\n const next = { ...current }\n if (Object.keys(merged).length === 0) delete next[posKey]\n else next[posKey] = merged\n this.setState({ cellOverrides: next })\n }\n\n /** 한 위치의 override 전체 삭제. */\n clearCellOverride(posKey: string): void {\n const current = this.cellOverrides\n if (!(posKey in current)) return\n const next = { ...current }\n delete next[posKey]\n this.setState({ cellOverrides: next })\n }\n\n /**\n * 여러 위치의 isEmpty 일괄 토글. cell-component 있으면 cell.set(), 없으면 cellOverrides.\n */\n setIsEmpty(posKeys: string[], isEmpty: boolean): void {\n const hasCells = this.components.some((c: Component) => (c as any)?.state?.type === 'rack-grid-cell')\n if (hasCells) {\n for (const posKey of posKeys) {\n const cell = this.cellAtBayKey(posKey)\n cell?.set?.('isEmpty', isEmpty)\n }\n this.invalidateLocationIndex()\n return\n }\n // Fallback: cellOverrides\n const current = this.cellOverrides\n const next = { ...current }\n for (const posKey of posKeys) {\n const existing = next[posKey] ?? {}\n const merged: any = { ...existing, isEmpty }\n if (!isEmpty && !existing.section && !existing.unit && !existing.border && !existing.merged) {\n delete next[posKey]\n } else {\n next[posKey] = merged\n }\n }\n this.setState({ cellOverrides: next })\n }\n\n /**\n * 여러 위치의 border 스타일 일괄 설정. `where` ('top'|'left'|'bottom'|'right'|'all').\n * - style = null → 해당 side 삭제\n * - where = 'all' → 4면 모두 동일 style\n */\n setBorder(posKeys: string[], style: any, where: 'all' | 'top' | 'left' | 'bottom' | 'right' = 'all'): void {\n const sides = where === 'all' ? ['top', 'left', 'bottom', 'right'] : [where]\n const current = this.cellOverrides\n const next = { ...current }\n for (const posKey of posKeys) {\n const existing = next[posKey] ?? {}\n const border = { ...(existing.border ?? {}) }\n for (const side of sides) {\n if (style == null) delete border[side]\n else border[side] = style\n }\n const merged: any = { ...existing, border }\n if (Object.keys(border).length === 0) delete merged.border\n next[posKey] = merged\n }\n this.setState({ cellOverrides: next })\n }\n\n /**\n * 자동 채번 — 선택된 cell 들에 section/unit 자동 부여.\n *\n * @param posKeys 채번 대상 (선택 영역). 빈 array 면 *전체 grid*.\n * @param direction 순회 방향:\n * 'cw' — 한 row 내 col 증가 → 다음 row 는 반대 방향 (boustrophedon)\n * 'ccw' — 반대 방향\n * 'zigzag' — col 우선 증가 (cw 의 90° 회전)\n * 'zigzag-reverse' — 반대\n * @param skipNumbering true 면 isEmpty cell 건너뜀 (단위 번호 안 증가).\n * @param startSection 첫 section 번호 (default 1)\n * @param startUnit 첫 unit 번호 (default 1)\n *\n * Aisle row (모든 cell isEmpty) 는 section 경계로 인식 — section 번호가 다음 row 에서 +1.\n *\n * setState 한 번 (cellOverrides 일괄 갱신) → location 역인덱스 1회 무효화.\n */\n increaseLocation(\n posKeys: string[],\n direction: 'cw' | 'ccw' | 'zigzag' | 'zigzag-reverse' = 'cw',\n skipNumbering: boolean = false,\n startSection: number = 1,\n startUnit: number = 1\n ): void {\n const sectionDigits = Math.max(1, Math.floor(this.state.sectionDigits ?? 2))\n const unitDigits = Math.max(1, Math.floor(this.state.unitDigits ?? 2))\n\n // 대상 결정: posKeys 비었으면 전체 grid\n const targets: string[] = posKeys.length > 0\n ? [...posKeys]\n : this._allPosKeys()\n\n // (1) row 별 분류 (2D 배열, [row][col] = posKey)\n const byRow: (string | null)[][] = []\n let maxRow = -1\n let maxCol = -1\n for (const posKey of targets) {\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n if (!byRow[parsed.row]) byRow[parsed.row] = []\n byRow[parsed.row][parsed.col] = posKey\n if (parsed.row > maxRow) maxRow = parsed.row\n if (parsed.col > maxCol) maxCol = parsed.col\n }\n\n // (2) aisle row 식별 — row 의 모든 (선택된) cell 이 isEmpty\n const overrides = this.cellOverrides\n const isAisleRow = (row: number): boolean => {\n const cells = byRow[row]\n if (!cells || cells.length === 0) return true\n return cells.every(p => p == null || overrides[p]?.isEmpty === true)\n }\n\n // (3) section 별 묶기 (aisle 사이의 연속 row 들)\n const sections: number[][] = []\n let currentSection: number[] = []\n for (let r = 0; r <= maxRow; r++) {\n if (!byRow[r]) continue\n if (isAisleRow(r)) {\n if (currentSection.length > 0) {\n sections.push(currentSection)\n currentSection = []\n }\n } else {\n currentSection.push(r)\n }\n }\n if (currentSection.length > 0) sections.push(currentSection)\n\n // (4) 방향별 순회로 (section, unit) 부여\n const hasCells = this.components.some((c: Component) => (c as any)?.state?.type === 'rack-grid-cell')\n const next = { ...overrides }\n let sectionNum = Number(startSection) || 1\n\n const setSU = (posKey: string, section: number, unit: number) => {\n const sStr = String(section).padStart(sectionDigits, '0')\n const uStr = String(unit).padStart(unitDigits, '0')\n if (hasCells) {\n const cell = this.cellAtBayKey(posKey)\n cell?.set?.('section', sStr)\n cell?.set?.('unit', uStr)\n } else {\n const existing = next[posKey] ?? {}\n next[posKey] = { ...existing, section: sStr, unit: uStr }\n }\n }\n\n const clearSU = (posKey: string) => {\n if (hasCells) {\n const cell = this.cellAtBayKey(posKey)\n cell?.set?.('section', null)\n cell?.set?.('unit', null)\n } else {\n const existing = next[posKey]\n if (!existing) return\n const { section, unit, ...rest } = existing\n if (Object.keys(rest).length === 0) delete next[posKey]\n else next[posKey] = rest\n }\n }\n\n for (const sectionRows of sections) {\n for (const row of sectionRows) {\n const cells = byRow[row]\n if (!cells) continue\n // 방향별 cell 순회 순서 결정\n const orderedCols = this._orderCols(row, sectionRows, direction, maxCol)\n let unitNum = Number(startUnit) || 1\n for (const col of orderedCols) {\n const posKey = cells[col]\n if (!posKey) continue\n const isEmpty = overrides[posKey]?.isEmpty === true\n if (isEmpty) {\n clearSU(posKey)\n if (!skipNumbering) unitNum++\n } else {\n setSU(posKey, sectionNum, unitNum)\n unitNum++\n }\n }\n // row 마다 section 증가? 아님 — section 은 *aisle 로 구분된 묶음 단위*.\n // 동일 section 내 다음 row 는 unit 번호 다시 startUnit 부터.\n // rack-table 의 원본 동작과 동일.\n }\n sectionNum++\n }\n\n // cell-component 가 있으면 cell.set() 으로 이미 갱신됨 (setSU/clearSU 안에서).\n // 없으면 cellOverrides fallback 적용.\n if (!hasCells) {\n this.setState({ cellOverrides: next })\n } else {\n this.invalidateLocationIndex()\n }\n }\n\n /**\n * 모든 grid 위치 (전체 columns × rows) 의 posKey 목록.\n */\n private _allPosKeys(): string[] {\n const cols = this.columns\n const rows = this.rackRows\n const out: string[] = []\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n out.push(`${c}-${r}`)\n }\n }\n return out\n }\n\n /**\n * Row 의 col 순회 순서 결정. boustrophedon (S 자형) 패턴 지원.\n * cw : 짝수 row 는 좌→우, 홀수 row 는 우→좌\n * ccw : 짝수 row 는 우→좌, 홀수 row 는 좌→우\n * zigzag : 모든 row 좌→우 (단순)\n * zigzag-reverse : 모든 row 우→좌\n */\n private _orderCols(\n row: number,\n sectionRows: number[],\n direction: 'cw' | 'ccw' | 'zigzag' | 'zigzag-reverse',\n maxCol: number\n ): number[] {\n // section 내 row 의 *상대 인덱스* — section 경계에서 패턴이 리셋되도록.\n const idxInSection = sectionRows.indexOf(row)\n const cols: number[] = []\n for (let c = 0; c <= maxCol; c++) cols.push(c)\n\n switch (direction) {\n case 'cw':\n return idxInSection % 2 === 0 ? cols : cols.slice().reverse()\n case 'ccw':\n return idxInSection % 2 === 0 ? cols.slice().reverse() : cols\n case 'zigzag':\n return cols\n case 'zigzag-reverse':\n return cols.slice().reverse()\n }\n }\n}\n"]}
1
+ {"version":3,"file":"rack-grid.js","sourceRoot":"","sources":["../src/rack-grid.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * RackGrid — *grid layout 의 컨테이너*.\n *\n * 각 (col, row) 위치마다 *하나의 자식 컴포넌트* 보유 가능:\n * - StorageRack (한 column 의 vertical stack — stock 보관)\n * - Crane / AGV / forklift / 미니로드 등 *operation archetype* (이동/작업 설비)\n * - 또는 비어 있음 (= 통로 / 작업자 공간 / 무엇이든)\n *\n * 외부에는 *location string* (예: \"Z-A01-03-1\") 으로 API 노출. 내부 cellId 와 양방향\n * 변환은 RackGrid 가 책임.\n *\n * **Performance** — 각 자식 StorageRack 이 자체 InstancedMesh 로 stock 렌더링.\n * storage-rack 의 batched 시각화 성능 그대로 계승. RackGrid 는 *얇은 wrapper*.\n *\n * **Transfer 컨트랙** — SlottedHolder 인터페이스 구현. 내부적으로 *자식 StorageRack*\n * 으로 위임. Mover / Crane 등이 *RackGrid 의 slot target* 으로 인터랙트 가능.\n *\n * **Configuration 생산성** — rack-table 의 *location 룰* (locPattern, sectionDigits 등)\n * 차용. cell-component 없이 *sparse cellOverrides* 만으로 동일 UX 제공.\n *\n * **Aisle/Empty** — `cellOverrides[posKey].isEmpty = true` 로 명시. 의미는\n * *location 미부여 + increaseLocation 의 aisle row 인식* 만. 그 위치의 자식 컴포넌트\n * 종류는 *자유* (Crane/AGV/forklift/그냥 비움 모두 가능).\n *\n * **CellId 컨벤션** (내부):\n * - posKey = `${col-1}-${row-1}` (0-based, 2 segments) — *grid 평면 위치*\n * - cellId = `${col-1}-${row-1}-${shelf-1}` (0-based, 3 segments) — *grid + shelf*\n * - 자식 StorageRack 내부에서는 `0-0-${shelf-1}` (자체 cellId 형식). RackGrid 가 변환.\n */\nimport {\n ApplicationContext, Component, ComponentNature, ContainerAbstract, Control, Layout,\n Model, POINT, Properties, RealObject, sceneComponent\n} from '@hatiolab/things-scene'\nimport type { State } from '@hatiolab/things-scene'\nimport * as THREE from 'three'\nimport {\n CarrierHolder,\n Placeable,\n SlotTarget,\n type AttachFrame,\n type Alignment,\n type Heights,\n type PlacementArchetype,\n type SlotRecord,\n type SlottedHolder\n} from '@operato/scene-base'\n\nimport StorageRack from './storage-rack.js'\nimport RackGridCell from './rack-grid-cell.js'\nimport { RackGrid3D } from './rack-grid-3d.js'\n\n// RackGridCell 의 refid 충돌 회피 — load 시 동적 생성되는 cell 의 refid 가 *부모\n// RackGrid + 모델 안 다른 컴포넌트* refid 와 겹치지 않도록 *높은 시작값 + monotonic\n// counter*. hierarchy override 가 save 시 refid 제거 → 모델 파일엔 안 새겨짐.\nlet _cellRefidCounter = 100_000_000\nfunction _nextCellRefid(): number {\n return _cellRefidCounter++\n}\n\n// Transient carrier (obtainCarrier 가 materialize 한 컴포넌트) 용 refid. 모델 안\n// 다른 컴포넌트와 겹치지 않도록 별도 대역.\nlet _carrierRefidCounter = 200_000_000\nfunction _nextCarrierRefid(): number {\n return _carrierRefidCounter++\n}\n\nfunction buildNewCell(app: ApplicationContext) {\n const refid = _nextCellRefid()\n const m: any = Model.compile(\n {\n type: 'rack-grid-cell',\n refid,\n left: 0, top: 0, width: 1, height: 1, isEmpty: false\n },\n app\n )\n // Model.compile 이 refid 를 자동 generator 로 덮어쓸 수 있어 *강제 재 set*.\n try {\n if (m.refid !== refid) {\n m.refid = refid\n m.state && (m.state.refid = refid)\n m._state && (m._state.refid = refid)\n }\n } catch {}\n return m\n}\n\nconst TABLE_LAYOUT: any = Layout.get('table')\n\n/**\n * RackGrid 의 *layout-aware children* — `rack-grid-cell` (= 데이타-proxy 시각\n * 자식) 만 Table 분배 대상. obtainCarrier 가 만든 *실물 carrier* (Carriable —\n * Parcel/Pallet 등) 는 *transient* 라 layout 분배 외. Table.reflow 가 *carrier\n * 도 cells 다음 인덱스로 분배* 하면 `heights[rackRows] = undefined` → carrier.\n * state.height = NaN → BoxGeometry NaN → invisible. 그 회귀 방지.\n */\nconst RACK_GRID_LAYOUT: any = {\n reflow(container: any) {\n const all = container.components ?? []\n const cellsOnly = all.filter((c: any) => c?.state?.type === 'rack-grid-cell')\n if (cellsOnly.length === all.length) {\n return TABLE_LAYOUT.reflow.call(TABLE_LAYOUT, container)\n }\n // Carrier 자식이 있는 경우 — container.components 를 *cells only* 로\n // 임시 교체 후 base reflow. base 가 idx 기반 분배 시 carrier 가 *out of\n // range* 인덱스에 안 오게.\n const desc = Object.getOwnPropertyDescriptor(container, 'components')\n Object.defineProperty(container, 'components', { value: cellsOnly, configurable: true, writable: true })\n try {\n TABLE_LAYOUT.reflow.call(TABLE_LAYOUT, container)\n } finally {\n if (desc) Object.defineProperty(container, 'components', desc)\n else delete container.components\n }\n },\n capturables(container: any) { return TABLE_LAYOUT.capturables(container) },\n drawables(container: any) { return TABLE_LAYOUT.drawables(container) },\n isStuck(component: any) { return TABLE_LAYOUT.isStuck?.(component) ?? true },\n keyNavigate(container: any, component: any, e: any) {\n return TABLE_LAYOUT.keyNavigate?.(container, component, e)\n },\n joinType: TABLE_LAYOUT.joinType\n}\n\nfunction arrayOf(value: number, size: number): number[] {\n const arr: number[] = []\n for (let i = 0; i < size; i++) arr.push(value)\n return arr\n}\n\nconst columnControlHandler = {\n ondragmove(point: POINT, index: number, component: RackGrid) {\n const { left, top, width, height } = component.textBounds\n const widths_sum = component.widths_sum\n const widths = component.widths.slice()\n\n const origin_pos_unit = widths.slice(0, index + 1).reduce((sum, w) => sum + w, 0)\n const origin_offset = left + (origin_pos_unit / widths_sum) * width\n\n const transcoorded = component.transcoordP2S(point.x, point.y)\n const diff = transcoorded.x - origin_offset\n\n let diff_unit = (diff / width) * widths_sum\n const min_width_unit = (widths_sum / width) * 5\n\n if (diff_unit < 0) diff_unit = -Math.min(widths[index] - min_width_unit, -diff_unit)\n else diff_unit = Math.min(widths[index + 1] - min_width_unit, diff_unit)\n\n widths[index] = Math.round((widths[index] + diff_unit) * 100) / 100\n widths[index + 1] = Math.round((widths[index + 1] - diff_unit) * 100) / 100\n\n component.set('widths', widths)\n }\n}\n\nconst rowControlHandler = {\n ondragmove(point: POINT, index: number, component: RackGrid) {\n const { left, top, width, height } = component.textBounds\n const heights_sum = component.heights_sum\n const heights = component.heights.slice()\n\n index -= component.columns - 1\n const origin_pos_unit = heights.slice(0, index + 1).reduce((sum, h) => sum + h, 0)\n const origin_offset = top + (origin_pos_unit / heights_sum) * height\n\n const transcoorded = component.transcoordP2S(point.x, point.y)\n const diff = transcoorded.y - origin_offset\n\n let diff_unit = (diff / height) * heights_sum\n const min_height_unit = (heights_sum / height) * 5\n\n if (diff_unit < 0) diff_unit = -Math.min(heights[index] - min_height_unit, -diff_unit)\n else diff_unit = Math.min(heights[index + 1] - min_height_unit, diff_unit)\n\n heights[index] = Math.round((heights[index] + diff_unit) * 100) / 100\n heights[index + 1] = Math.round((heights[index + 1] - diff_unit) * 100) / 100\n\n component.set('heights', heights)\n }\n}\n\n// ─── Cell-level metadata (sparse override) ────────────────────────────────────\n\n/** 한 (col, row) 위치의 메타데이터. 명시되지 않은 위치는 *룰의 기본값* 적용 (= location 없음). */\nexport interface CellOverride {\n /** Location 의 `{s}` 부분. unit 과 함께 명시되어야 location 부여됨. */\n section?: string\n /** Location 의 `{u}` 부분. section 과 함께 명시되어야 location 부여됨. */\n unit?: string\n /**\n * 명시적 통로/공실 표시. 의미:\n * - location 미부여 (이 cell 로는 외부 location key 매칭 불가)\n * - increaseLocation 의 aisle row 로 인식 (skipNumbering 시 건너뜀)\n * 자식 컴포넌트 종류는 무관 — Crane/AGV/forklift/비움 모두 OK.\n */\n isEmpty?: boolean\n /** 4-side border style (top/left/bottom/right) — modeling 시각 용. */\n border?: any\n /** Grid merge — 시각 표현. */\n merged?: boolean\n rowspan?: number\n colspan?: number\n}\n\n// ─── State ────────────────────────────────────────────────────────────────────\n\nexport interface RackGridState extends State {\n /** Grid 가로 칸 수 (X 축). 각 칸 ≈ 1 column 의 StorageRack (또는 Crane 등). */\n columns?: number\n /** Grid 세로 칸 수 (Z 축, depth). 통상 1, double-deep rack 등은 2. */\n rows?: number\n /** 각 (col, row) 의 수직 shelf 수 (Y 축, level). 자식 StorageRack 의 levels 와 일치. */\n shelves?: number\n\n /**\n * 첫 shelf 의 시작 높이 (mm, 3D Y 축, 바닥부터). 미명시 0 (바닥 = 첫 shelf).\n * 양수 시 그만큼 위로 올라가 *stocker port / conveyor 같은 컴포넌트가 들어갈 빈 공간*\n * 확보. Frame uprights 는 바닥 ~ 천장 그대로.\n */\n shelfBaseHeight?: number\n\n // ── Location 룰 (rack-table 컨벤션) ──\n zone?: string\n /** 기본 `'{z}{s}-{u}-{sh}'`. placeholders: {z} {s} {u} {sh}. */\n locPattern?: string\n /** Section 숫자 자리수 (zero-pad). 기본 2. */\n sectionDigits?: number\n /** Unit 숫자 자리수 (zero-pad). 기본 2. */\n unitDigits?: number\n /** Shelf label CSV. 예: '1,2,3' / ',,,04'. 빈 자리는 1-based 인덱스 default. */\n shelfLocations?: string\n\n /** Sparse cell metadata. key = posKey = `${col-1}-${row-1}` (0-based, 2 segments). */\n cellOverrides?: { [posKey: string]: CellOverride }\n\n /**\n * Stock records — `{ cellId: 'col-row-shelf', type, ... }`. cellId 가 RackGrid 의\n * cell 위치 (3 segments) 와 매칭되는 record 만 InstancedMesh instance 로 렌더링.\n * Plan A 정신 — sparse 데이터, 자식 컴포넌트 없이 batched 시각화.\n */\n data?: Array<{ cellId: string; [key: string]: any }>\n\n /**\n * Popup 컴포넌트 id — 클릭 시 그 popup 을 invoke (anchor = 클릭된 cell 의 SlotTarget).\n * 미명시 시 click event (`rack-grid-cell-click`) 만 emit.\n */\n popupRef?: string\n\n // ── 시각화 옵션 ──\n hideRackFrame?: boolean // post + beam 모두 숨김\n hideHorizontalFrame?: boolean // 가로 frame (beam) 만 숨김 (post 유지)\n legendTarget?: string\n hideEmptyStock?: boolean\n widths?: number[]\n heights?: number[]\n}\n\n// ─── Nature ───────────────────────────────────────────────────────────────────\n//\n// `nature` 는 *static const* 가 아니라 *get nature()* — properties 의 widget event\n// handler 안 `this` 가 *해당 RackGrid 인스턴스* 를 가리키도록 (화살표 함수가\n// getter 의 `this` 를 capture). rack-table-cell 의 동일 패턴.\n\n// ─── RackGrid ─────────────────────────────────────────────────────────────────\n\n@sceneComponent('rack-grid')\nexport default class RackGrid\n extends CarrierHolder(Placeable(ContainerAbstract))\n implements SlottedHolder\n{\n declare state: RackGridState\n\n static placement: PlacementArchetype = 'floor'\n static align: Alignment = 'bottom'\n static defaultDepth = (h: Heights) => h.ceiling - h.floor\n\n get nature(): ComponentNature {\n return {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n { type: 'number', label: 'columns', name: 'columns' },\n { type: 'number', label: 'rows', name: 'rows' },\n { type: 'number', label: 'shelves', name: 'shelves' },\n { type: 'number', label: 'shelf-base-height', name: 'shelfBaseHeight' },\n { type: 'string', label: 'zone', name: 'zone' },\n { type: 'string', label: 'location-pattern', name: 'locPattern', placeholder: '{z}{s}-{u}-{sh}' },\n { type: 'number', label: 'section-digits', name: 'sectionDigits' },\n { type: 'number', label: 'unit-digits', name: 'unitDigits' },\n { type: 'string', label: 'shelf-locations', name: 'shelfLocations', placeholder: '1,2,3 또는 ,,,04' },\n {\n // root.selected 의 RackGridCell 들 또는 *전체 grid* 에 채번 적용.\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 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 this.increaseLocation(keys, increasingDirection, skipNumbering, startSection, startUnit)\n }\n }\n }\n },\n { type: 'checkbox', label: 'hide-rack-frame', name: 'hideRackFrame' },\n { type: 'checkbox', label: 'hide-horizontal-frame', name: 'hideHorizontalFrame' },\n { type: 'id-input', label: 'legend-target', name: 'legendTarget', property: { component: 'legend' } },\n { type: 'checkbox', label: 'hide-empty-stock', name: 'hideEmptyStock' },\n { type: 'id-input', label: 'popup-ref', name: 'popupRef', property: { component: 'popup' } }\n ],\n help: 'scene/component/rack-grid'\n }\n }\n\n get anchors() {\n return []\n }\n\n /**\n * Serialize 시 자식 RackGridCell 의 redundant 속성 제거:\n * - 좌표/변환 (left/top/width/height/zPos/rotation/scale/translate) — table layout 이\n * runtime 에 자동 결정. state 저장하면 layout 결과와 불일치 위험.\n * - **refid** — *동적 생성* 되는 자식이라 *부모의 refid 가 그대로 들어가면 충돌*\n * (\"Refid Index replaced\" 경고). 자식의 refid 는 *load 시 새로 자동 부여*. (외부\n * 참조용 *id* 는 사용자 명시 시만 유지)\n *\n * 유지: cellId, section, unit, isEmpty, border, shelfLocations 등 *own 데이터*.\n */\n get hierarchy(): any {\n const base: any = super.hierarchy\n if (base?.components && Array.isArray(base.components)) {\n base.components = base.components.map((c: any) => {\n if (!c || typeof c !== 'object') return c\n const { left, top, width, height, zPos, rotation, scale, translate, refid, ...rest } = c\n return rest\n })\n }\n return base\n }\n\n /** Focusible — children (RackGridCell) 도 editor 의 selection 가능 (rack-table 동일). */\n get focusible() {\n return false\n }\n\n /** Lifecycle — children 자동 생성. columns × rows 만큼 RackGridCell 자식. */\n created() {\n const tobeSize = this.columns * this.rackRows\n const gap = ((this as any).size?.() ?? this.components.length) - tobeSize\n\n if (gap === 0) {\n // 자식 수는 맞음 — cellId 만 sync\n this._syncChildCellIds()\n return\n } else if (gap > 0) {\n ;(this as any).remove?.(this.components.slice(gap))\n } else {\n const newbies: any[] = []\n for (let i = 0; i < -gap; i++) newbies.push(buildNewCell((this as any).app))\n ;(this as any).add?.(newbies)\n }\n\n const widths = this.getState('widths')\n const heights = this.getState('heights')\n if (!widths || (widths as number[]).length < this.columns) this.set('widths', this.widths)\n if (!heights || (heights as number[]).length < this.rackRows) this.set('heights', this.heights)\n\n this._syncChildCellIds()\n }\n\n /** columns/rows 변경 시 children 재구성. rack-table.buildCells 패턴. */\n onchange(after: Properties, _before: Properties) {\n super.onchange?.(after, _before)\n if ('columns' in after || 'rows' in after) {\n const oldCols = (_before as any).columns ?? this.columns\n const oldRows = (_before as any).rows ?? this.rackRows\n this._buildCells(this.rackRows, this.columns, oldRows, oldCols)\n }\n // 룰 관련 변경 → location 역인덱스 무효화\n if ('locPattern' in after || 'sectionDigits' in after || 'unitDigits' in after ||\n 'shelfLocations' in after || 'zone' in after || 'shelves' in after) {\n this.invalidateLocationIndex()\n }\n // stock 시각 영향 속성 → InstancedMesh 재빌드\n if ('data' in after || 'hideEmptyStock' in after || 'shelves' in after ||\n 'shelfBaseHeight' in after || 'width' in after || 'depth' in after ||\n 'height' in after || 'columns' in after || 'rows' in after) {\n ;(this._realObject as any)?.rebuildStockMesh?.()\n }\n // hideRackFrame / hideHorizontalFrame 변경 → frame visibility 즉시 토글\n if ('hideRackFrame' in after || 'hideHorizontalFrame' in after) {\n ;(this._realObject as any)?.applyFrameVisibility?.()\n }\n }\n\n /** state.data 변경 시 호출 (things-scene 의 onchange<PropName>). */\n onchangeData(): void {\n ;(this._realObject as any)?.rebuildStockMesh?.()\n }\n\n /** state.data 의 records — Plan A 의 stock 보관소. */\n get records(): Array<{ cellId: string; [key: string]: any }> {\n return (this.state.data as any) ?? []\n }\n\n // ── Legend integration ──────────────────────────────────\n\n private _legendTarget?: Component\n\n /**\n * Legend 컴포넌트 lookup. 우선순위:\n * 1) state.legendTarget id 명시\n * 2) scene 전체 의 type='legend' 첫 번째 컴포넌트 (자동 발견)\n */\n get legendTarget(): Component | undefined {\n if (this._legendTarget) return this._legendTarget\n\n const id = this.state.legendTarget\n if (id) {\n const found = (this.root as any)?.findById?.(id) as Component | undefined\n if (found) {\n this._legendTarget = found\n ;(found as any).on?.('change', this._onLegendChanged, this)\n return found\n }\n }\n\n const visit = (node: any): Component | undefined => {\n if (!node) return undefined\n if (node.state?.type === 'legend') return node as Component\n const children = node.components as Component[] | undefined\n if (children) {\n for (const c of children) {\n const r = visit(c)\n if (r) return r\n }\n }\n return undefined\n }\n const found = visit(this.root)\n if (found) {\n this._legendTarget = found\n ;(found as any).on?.('change', this._onLegendChanged, this)\n }\n return found\n }\n\n private _onLegendChanged = (): void => {\n ;(this._realObject as any)?.rebuildStockMesh?.()\n }\n\n /**\n * record 의 legend.field 값을 ranges 와 매칭해 색상 해석.\n * - `range.value === recordValue` (카테고리 일치)\n * - `range.min ≤ Number(v) < range.max` (수치 범위)\n * - 매칭 없으면 `defaultColor` 또는 undefined\n */\n // ── View-mode click → rack-grid-cell-click event + popup ──\n\n get eventMap() {\n return {\n '(self)': {\n '(self)': {\n click: this._onViewClick\n }\n }\n }\n }\n\n private _onViewClick = (mouseEvent: MouseEvent) => {\n if (!(this as any).app?.isViewMode) return\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return\n\n const hit = this._raycastHit(mouseEvent)\n if (!hit) return\n\n const stockMesh: THREE.InstancedMesh | undefined = ro.stockMesh\n let cellId: string | undefined\n let record: any\n let isStock = false\n let instanceId: number | undefined\n\n if (hit.object === stockMesh) {\n const records: any[] | undefined = (stockMesh as any).userData?._records\n record = records?.[hit.instanceId ?? -1]\n cellId = record?.cellId\n isStock = true\n instanceId = hit.instanceId\n } else {\n const cid = this._cellIdFromWorldPoint(hit.point)\n if (!cid || cid.startsWith('out-of-bounds')) return\n cellId = cid\n const data = this.state.data as Array<any> | undefined\n record = Array.isArray(data) ? data.find(r => r?.cellId === cid) : undefined\n }\n\n const payload = { cellId, record, hitPoint: hit.point, instanceId, isStock }\n this.trigger('rack-grid-cell-click', payload)\n this._invokePopup(cellId, record)\n\n // popup 외부 click 으로 인식되어 자동 close 되는 회귀 차단\n mouseEvent.stopPropagation?.()\n }\n\n /** state.popupRef Popup 컴포넌트 invoke. anchor = 클릭된 cell 의 SlotTarget. */\n private _invokePopup(cellId: string | undefined, record: any): void {\n const popupRefId = this.state.popupRef\n if (!popupRefId || !cellId) return\n const popupComp: any = (this.root as any)?.findById?.(popupRefId)\n if (!popupComp || typeof popupComp.openPopup !== 'function') {\n console.warn(`[rack-grid] popupRef=\"${popupRefId}\" 가 가리키는 컴포넌트 없거나 openPopup 미지원`)\n return\n }\n const anchor = this.slotTargetAt(cellId)\n popupComp.openPopup(record ?? { cellId }, { anchor })\n }\n\n /** raycast → 우리 RackGrid 의 어떤 mesh 가 closest hit 인지. */\n private _raycastHit(mouseEvent: MouseEvent): THREE.Intersection | undefined {\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return undefined\n const tc: any = ro.threeContainer\n if (!tc) return undefined\n\n const cap: any = tc._threeCapability ?? tc._capability\n let intersects: THREE.Intersection[] | undefined\n if (cap?.getObjectsByRaycast) {\n intersects = cap.getObjectsByRaycast() as THREE.Intersection[] | undefined\n }\n\n if (!intersects || intersects.length === 0) {\n const scene = tc.scene3d as THREE.Scene | undefined\n const renderer = tc.renderer3d as THREE.WebGLRenderer | undefined\n const camera =\n (tc.activeCamera3d as THREE.Camera | undefined) ??\n (cap?.activeCamera as THREE.Camera | undefined) ??\n (cap?.camera as THREE.Camera | undefined)\n const canvas = renderer?.domElement\n if (!scene || !canvas || !camera) return undefined\n const rect = canvas.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return undefined\n const ndc = new THREE.Vector2(\n ((mouseEvent.clientX - rect.left) / rect.width) * 2 - 1,\n -((mouseEvent.clientY - rect.top) / rect.height) * 2 + 1\n )\n const raycaster = new THREE.Raycaster()\n raycaster.setFromCamera(ndc, camera)\n intersects = raycaster.intersectObjects(scene.children, true)\n }\n if (!intersects || intersects.length === 0) return undefined\n\n const closest = intersects[0]\n let obj: THREE.Object3D | null = closest.object\n while (obj) {\n if (obj.userData?.context === ro) return closest\n obj = obj.parent\n }\n return undefined\n }\n\n /** world point → cellId (col-row-shelf) 역산. */\n private _cellIdFromWorldPoint(worldPoint: THREE.Vector3): string | null {\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return null\n\n const local = new THREE.Vector3().copy(worldPoint)\n const mInv = new THREE.Matrix4().copy(ro.object3d.matrixWorld).invert()\n local.applyMatrix4(mInv)\n\n const cols = this.columns\n const rows = this.rackRows\n const shelves = this.shelves\n const width = (this.state.width as number) || 1000\n const height = (this.state.depth as number) || 2000 // 3D Y\n const depth = (this.state.height as number) || 200 // 3D Z\n const shelfBase = (this.state.shelfBaseHeight as number) || 0\n const shelfZone = height - shelfBase\n\n const bayW = width / cols\n const bayD = depth / rows\n const cellY = shelfZone / shelves\n\n // center-based: X [-width/2, +width/2], Y [-height/2, +height/2], Z [-depth/2, +depth/2]\n const col = Math.floor((local.x + width / 2) / bayW)\n const yFromBottom = local.y + height / 2 - shelfBase\n const shelf = Math.floor(yFromBottom / cellY)\n const row = Math.floor((local.z + depth / 2) / bayD)\n\n if (col < 0 || col >= cols || row < 0 || row >= rows || shelf < 0 || shelf >= shelves) {\n return `out-of-bounds(col=${col},row=${row},shelf=${shelf})`\n }\n return `${col}-${row}-${shelf}`\n }\n\n resolveLegendColor(record: any): string | undefined {\n const legend = this.legendTarget\n if (!legend) return undefined\n const status: any = (legend as any).getState?.('status') ?? (legend.state as any)?.status\n if (!status) return undefined\n\n const field = status.field as string | undefined\n const ranges = status.ranges as any[] | undefined\n if (!field || !Array.isArray(ranges)) return undefined\n\n const value = record?.[field]\n if (value === undefined || value === null) return status.defaultColor\n\n for (const range of ranges) {\n if (!range) continue\n if (range.value !== undefined) {\n if (range.value === value) return range.color\n continue\n }\n const num = Number(value)\n if (!Number.isFinite(num)) continue\n const min = range.min !== undefined && range.min !== '' ? Number(range.min) : undefined\n const max = range.max !== undefined && range.max !== '' ? Number(range.max) : undefined\n const minOk = min === undefined || num >= min\n const maxOk = max === undefined || num < max\n if (minOk && maxOk) return range.color\n }\n return status.defaultColor as string | undefined\n }\n\n /**\n * 새 (rows × columns) 에 맞춰 children 재구성. rack-table.buildCells 정확 클론.\n */\n private _buildCells(newrows: number, newcolumns: number, oldrows: number, oldcolumns: number) {\n const app = (this as any).app\n if (newrows < oldrows) {\n const removals = this.components.slice(oldcolumns * newrows)\n ;(this as any).remove?.(removals)\n }\n const minrows = Math.min(newrows, oldrows)\n if (newcolumns > oldcolumns) {\n for (let r = 0; r < minrows; r++) {\n for (let c = oldcolumns; c < newcolumns; c++) {\n ;(this as any).insertComponentAt?.(buildNewCell(app), r * newcolumns + c)\n }\n }\n } else if (newcolumns < oldcolumns) {\n const removals: any[] = []\n for (let r = 0; r < minrows; r++) {\n for (let c = newcolumns; c < oldcolumns; c++) {\n removals.push(this.components[r * oldcolumns + c])\n }\n }\n ;(this as any).remove?.(removals)\n }\n if (newrows > oldrows) {\n const newbies: any[] = []\n for (let r = oldrows; r < newrows; r++) {\n for (let i = 0; i < newcolumns; i++) newbies.push(buildNewCell(app))\n }\n ;(this as any).add?.(newbies)\n }\n this.set({ widths: this.widths, heights: this.heights })\n this._syncChildCellIds()\n }\n\n /** children 의 state.cellId 가 *순서 기반 bayKey* 와 일치하도록 동기화. */\n private _syncChildCellIds() {\n const cols = this.columns\n const children = this.components\n for (let i = 0; i < children.length; i++) {\n const col = i % cols\n const row = Math.floor(i / cols)\n const bayKey = `${col}-${row}`\n const c: any = children[i]\n if (c?.state?.cellId !== bayKey) c?.set?.('cellId', bayKey)\n }\n }\n\n /** Row 인덱스의 cell 들. rack-table-cell 의 rowCells 가 사용. */\n getCellsByRow(row: number): Component[] {\n return this.components.slice(row * this.columns, (row + 1) * this.columns)\n }\n /** Column 인덱스의 cell 들. */\n getCellsByColumn(column: number): Component[] {\n const out: Component[] = []\n for (let i = 0; i < this.rackRows; i++) out.push(this.components[this.columns * i + column])\n return out\n }\n\n /** (col, row) 위치의 cell-component. */\n cellAt(col: number, row: number = 0): RackGridCell | null {\n const idx = row * this.columns + col\n return (this.components[idx] as any) ?? null\n }\n\n /** bayKey 의 cell-component. */\n cellAtBayKey(bayKey: string): RackGridCell | null {\n const parsed = this.parsePosKey(bayKey)\n if (!parsed) return null\n return this.cellAt(parsed.col, parsed.row)\n }\n\n /**\n * (col, row) bay 가 *isEmpty* 인가. cell-component 의 state.isEmpty 가 source of\n * truth, 없으면 cellOverrides[posKey].isEmpty fallback.\n */\n isBayEmpty(col: number, row: number = 0): boolean {\n // cell.state.isEmpty 가 *명시 true* 일 때만 우선. false / undefined 면 fallback\n // 으로 cellOverrides 확인. _buildCells 가 모든 bay 에 cell 자동 생성 + default\n // isEmpty=false 라서, \"cell 객체 존재 만으로 cellOverrides 차단\" 시 사용자가\n // cellOverrides 만 설정한 모델에서 isEmpty 효과 0 회귀.\n const cell = this.cellAt(col, row)\n if (cell?.state?.isEmpty === true) return true\n const posKey = `${col}-${row}`\n return !!this.cellOverrides[posKey]?.isEmpty\n }\n\n /**\n * 모든 slot id 의 목록. columns × rackRows × shelves 조합. *isEmpty bay 는 제외*\n * (물리적으로 없는 위치). SlottedHolder.slotIds — capability 기반 enumeration\n * entry point.\n */\n slotIds(): ReadonlyArray<string> {\n const ids: string[] = []\n const cols = this.columns\n const rows = this.rackRows\n const shelves = this.shelves\n for (let col = 0; col < cols; col++) {\n for (let row = 0; row < rows; row++) {\n if (this.isBayEmpty(col, row)) continue // 물리적 없음 — 제외\n for (let shelf = 0; shelf < shelves; shelf++) {\n ids.push(`${col}-${row}-${shelf}`)\n }\n }\n }\n return ids\n }\n\n /**\n * 점유된 slot 의 id 목록 — state.data record + child *carrier* 둘 다.\n *\n * 중요: RackGridCell (시각 proxy) 의 *state.cellId 는 bayKey (\"col-row\")\n * 형식* (`_syncChildCellIds` 가 set). slot 의 *full id (\"col-row-shelf\")* 와\n * 다르다 — RackGridCell 은 *carrier 아닌 시각 proxy* 라 *occupied 카운트\n * 대상 아님*. carriable child (= 실 carrier) 만 sweep.\n *\n * @param filter predicate — 통과하는 slotId 만. sweep 중 즉시 reject.\n */\n occupiedSlotIds(filter?: (slotId: string) => boolean): ReadonlyArray<string> {\n const set = new Set<string>()\n for (const r of this.records as any[]) {\n const cid = r?.cellId\n if (typeof cid === 'string' && (!filter || filter(cid))) set.add(cid)\n }\n for (const c of (this as any).components ?? []) {\n // *carriable 만* — RackGridCell (rack-grid-cell type) 의 bayKey 제외.\n if (!(c as any)?.isCarriable) continue\n const cid = (c as any)?.state?.cellId\n if (typeof cid === 'string' && (!filter || filter(cid))) set.add(cid)\n }\n return Array.from(set)\n }\n\n /** 비어있는 slot 의 id 목록 — slotIds() - occupiedSlotIds(). isEmpty bay 자동 제외. */\n emptySlotIds(filter?: (slotId: string) => boolean): ReadonlyArray<string> {\n const occ = new Set(this.occupiedSlotIds())\n const result: string[] = []\n for (const id of this.slotIds()) {\n if (occ.has(id)) continue\n if (filter && !filter(id)) continue\n result.push(id)\n }\n return result\n }\n\n /**\n * slot 의 *world position* — anchor object3d *생성 없이* 직접 계산. crane 의\n * reach 검사 같은 *match 전 단계* 에서 *anchor 생성 0* 으로 사용 가능.\n * match 후 *실제 attach* 가 필요할 때 `getSlotAttachObject3d` 가 lazy 생성.\n */\n slotWorldPosition(slotId: string): { x: number; y: number; z: number } | undefined {\n const parsed = this.parseSlotId(slotId)\n if (!parsed) return undefined\n if (parsed.col < 0 || parsed.col >= this.columns) return undefined\n if (parsed.row < 0 || parsed.row >= this.rackRows) return undefined\n if (parsed.shelf < 0 || parsed.shelf >= this.shelves) return undefined\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return undefined\n\n const rs: any = this.state\n const width = (rs?.width as number) ?? 400\n const height = (rs?.depth as number) ?? 2000\n const depth = (rs?.height as number) ?? 200\n const shelfBase = Math.max(0, Math.min((rs?.shelfBaseHeight as number) || 0, height * 0.9))\n const cols = this.columns\n const rows = this.rackRows\n const shelves = this.shelves\n const shelfZone = height - shelfBase\n const bayW = width / cols\n const bayD = depth / rows\n const cellY = shelfZone / shelves\n const baseY = -height / 2\n const shelfBaseY = baseY + shelfBase\n const stockD = cellY * 0.7\n\n const cx = (parsed.col - cols / 2 + 0.5) * bayW\n const cellBottomY = shelfBaseY + parsed.shelf * cellY\n const cy = cellBottomY + stockD / 2\n const cz = (parsed.row - rows / 2 + 0.5) * bayD\n\n const v = new THREE.Vector3(cx, cy, cz)\n ro.object3d.localToWorld(v)\n return { x: v.x, y: v.y, z: v.z }\n }\n\n buildRealObject(): RealObject | undefined {\n return new RackGrid3D(this)\n }\n\n // ── Table layout — 자식 자동 배치 + columns/rows 의 가변 widths/heights ──\n\n get layout(): any {\n return TABLE_LAYOUT\n }\n\n get widths(): number[] {\n const widths = this.getState('widths') as number[] | undefined\n if (!widths) return arrayOf(1, this.columns)\n if (widths.length < this.columns) return widths.concat(arrayOf(1, this.columns - widths.length))\n if (widths.length > this.columns) return widths.slice(0, this.columns)\n return widths\n }\n\n get heights(): number[] {\n const heights = this.getState('heights') as number[] | undefined\n if (!heights) return arrayOf(1, this.rackRows)\n if (heights.length < this.rackRows) return heights.concat(arrayOf(1, this.rackRows - heights.length))\n if (heights.length > this.rackRows) return heights.slice(0, this.rackRows)\n return heights\n }\n\n get widths_sum(): number {\n return this.widths.reduce((sum, w) => sum + w, 0) || this.columns\n }\n\n get heights_sum(): number {\n return this.heights.reduce((sum, h) => sum + h, 0) || this.rackRows\n }\n\n /** Column / Row 사이 드래그 핸들 — editor 의 widths/heights 가변 조절. */\n get controls(): Array<Control> | undefined {\n const widths = this.widths\n const heights = this.heights\n const inside = this.textBounds\n const width_unit = inside.width / this.widths_sum\n const height_unit = inside.height / this.heights_sum\n\n const controls: Array<Control> = []\n\n let x = inside.left\n widths.slice(0, this.columns - 1).forEach(w => {\n x += w * width_unit\n controls.push({ x, y: inside.top, handler: columnControlHandler })\n })\n\n let y = inside.top\n heights.slice(0, this.rackRows - 1).forEach(h => {\n y += h * height_unit\n controls.push({ x: inside.left, y, handler: rowControlHandler })\n })\n\n return controls\n }\n\n // ── 2D 렌더링 — table layout 의 widths/heights 기반 격자 ─────\n //\n // 자식 컴포넌트 가 자기 렌더링하지만 *비어있는 grid 도 modeling 시 가시화*. 격자\n // 좌표는 widths/heights (table layout 의 가변 분할) 기반. cellOverrides 의\n // isEmpty (사선) + border (4-side) 도 표시.\n\n render(ctx: CanvasRenderingContext2D) {\n // 2D 에서는 hideRackFrame 이어도 *외곽 + 격자선 + cell 마커* 는 항상 그림.\n // (2D 의 frame 은 시각적 *분할선* 이라 frame mesh 와 의미가 다름)\n const inside = this.textBounds\n const left = inside.left\n const top = inside.top\n const width = inside.width\n const height = inside.height\n const cols = this.columns\n const rows = this.rackRows\n const widths = this.widths\n const heights = this.heights\n const wSum = this.widths_sum\n const hSum = this.heights_sum\n const fill = (this.state.fillStyle as string) || '#e8e8ec'\n const stroke = (this.state.strokeStyle as string) || '#888'\n const lineWidth = (this.state.lineWidth as number) || 1\n const overrides = this.cellOverrides\n\n // column 별 X 좌표 (좌→우 누적)\n const xs: number[] = [left]\n for (let c = 0; c < cols; c++) xs.push(xs[c] + (widths[c] / wSum) * width)\n // row 별 Y 좌표 (상→하 누적)\n const ys: number[] = [top]\n for (let r = 0; r < rows; r++) ys.push(ys[r] + (heights[r] / hSum) * height)\n\n // Fill (반투명) — 외곽 영역\n ctx.save()\n ctx.fillStyle = fill\n ctx.globalAlpha = 0.2\n ctx.fillRect(left, top, width, height)\n ctx.restore()\n\n // isEmpty cell 표시 (사선 + 회색 fill)\n ctx.save()\n for (const [posKey, ov] of Object.entries(overrides)) {\n if (!ov.isEmpty) continue\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n if (parsed.col < 0 || parsed.col >= cols || parsed.row < 0 || parsed.row >= rows) continue\n const cl = xs[parsed.col]\n const ct = ys[parsed.row]\n const cw = xs[parsed.col + 1] - cl\n const ch = ys[parsed.row + 1] - ct\n ctx.fillStyle = '#cccccc'\n ctx.globalAlpha = 0.5\n ctx.fillRect(cl, ct, cw, ch)\n ctx.globalAlpha = 1\n ctx.strokeStyle = '#999'\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(cl, ct); ctx.lineTo(cl + cw, ct + ch)\n ctx.moveTo(cl + cw, ct); ctx.lineTo(cl, ct + ch)\n ctx.stroke()\n }\n ctx.restore()\n\n // 외곽 + 격자\n ctx.save()\n ctx.strokeStyle = stroke\n ctx.lineWidth = lineWidth\n ctx.strokeRect(left, top, width, height)\n ctx.beginPath()\n for (let c = 1; c < cols; c++) {\n ctx.moveTo(xs[c], top); ctx.lineTo(xs[c], top + height)\n }\n for (let r = 1; r < rows; r++) {\n ctx.moveTo(left, ys[r]); ctx.lineTo(left + width, ys[r])\n }\n ctx.stroke()\n ctx.restore()\n\n // cell 별 명시 border\n for (const [posKey, ov] of Object.entries(overrides)) {\n if (!ov.border) continue\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n if (parsed.col < 0 || parsed.col >= cols || parsed.row < 0 || parsed.row >= rows) continue\n const cl = xs[parsed.col]\n const ct = ys[parsed.row]\n const cr = xs[parsed.col + 1]\n const cb = ys[parsed.row + 1]\n const b = ov.border\n const drawSide = (style: any, x1: number, y1: number, x2: number, y2: number) => {\n if (!style?.strokeStyle) return\n ctx.save()\n ctx.strokeStyle = style.strokeStyle\n ctx.lineWidth = style.lineWidth ?? 1\n ctx.beginPath()\n ctx.moveTo(x1, y1); ctx.lineTo(x2, y2)\n ctx.stroke()\n ctx.restore()\n }\n drawSide(b.top, cl, ct, cr, ct)\n drawSide(b.left, cl, ct, cl, cb)\n drawSide(b.bottom, cl, cb, cr, cb)\n drawSide(b.right, cr, ct, cr, cb)\n }\n\n // Selected bay 강조는 *rack-grid-cell 자체* 의 render 가 처리 (framework 의\n // selection 시스템이 cell 의 outline 자동 그림). RackGrid 는 grid 골격만.\n }\n\n // ── Grid layout ─────────────────────────────────────────\n\n get columns(): number {\n const v = this.state.columns\n return Math.max(1, Math.floor(typeof v === 'number' && Number.isFinite(v) ? v : 5))\n }\n\n get rackRows(): number {\n const v = this.state.rows\n return Math.max(1, Math.floor(typeof v === 'number' && Number.isFinite(v) ? v : 1))\n }\n\n get shelves(): number {\n const v = this.state.shelves\n return Math.max(1, Math.floor(typeof v === 'number' && Number.isFinite(v) ? v : 4))\n }\n\n // ── cellId / posKey 변환 ────────────────────────────────\n\n /** posKey = `${col-1}-${row-1}` (0-based, 2 segments). 1-based input. */\n posKeyOf(col: number, row: number = 1): string {\n return `${col - 1}-${row - 1}`\n }\n\n /** cellId = `${col-1}-${row-1}-${shelf-1}` (0-based, 3 segments). 1-based input. */\n slotIdOf(col: number, row: number = 1, shelf: number = 1): string {\n return `${col - 1}-${row - 1}-${shelf - 1}`\n }\n\n parseSlotId(cellId: string): { col: number; row: number; shelf: number } | null {\n const parts = cellId.split('-')\n if (parts.length !== 3) return null\n const [c, r, s] = parts.map(Number)\n if (!Number.isFinite(c) || !Number.isFinite(r) || !Number.isFinite(s)) return null\n return { col: c, row: r, shelf: s }\n }\n\n parsePosKey(posKey: string): { col: number; row: number } | null {\n const parts = posKey.split('-')\n if (parts.length !== 2) return null\n const [c, r] = parts.map(Number)\n if (!Number.isFinite(c) || !Number.isFinite(r)) return null\n return { col: c, row: r }\n }\n\n // ── cellOverrides accessor ─────────────────────────────\n\n get cellOverrides(): { [posKey: string]: CellOverride } {\n return (this.state.cellOverrides ?? {}) as { [posKey: string]: CellOverride }\n }\n\n getCellOverride(posKey: string): CellOverride | undefined {\n return this.cellOverrides[posKey]\n }\n\n // ── Shelf labels ───────────────────────────────────────\n\n /**\n * Parse `state.shelfLocations` 를 levels 길이 array 로. 빈 슬롯은 1-based index default.\n * '1,2,3' → ['1', '2', '3', ...]\n * ',,,04' → ['1', '2', '3', '04']\n * undefined → ['1', '2', '3', '4', ...]\n */\n get shelfLabels(): string[] {\n const input = this.state.shelfLocations\n const levels = this.shelves\n const parts = (input || '').split(',')\n const out: string[] = []\n for (let i = 0; i < levels; i++) {\n const p = parts[i]\n out[i] = p && p.trim().length > 0 ? p.trim() : String(i + 1)\n }\n return out\n }\n\n // ── Location 변환 (양방향) ──────────────────────────────\n\n /**\n * cellId → location string. 우선순위:\n * 1. cell-component (state.section/unit) — source of truth\n * 2. cellOverrides[posKey] — 호환성 fallback\n * section/unit 둘 다 있고 isEmpty=false 일 때만 부여. 미부여 시 null.\n */\n locationOf(cellId: string): string | null {\n const parsed = this.parseSlotId(cellId)\n if (!parsed) return null\n const posKey = `${parsed.col}-${parsed.row}`\n\n let section: string | undefined\n let unit: string | undefined\n let isEmpty: boolean | undefined\n let cellShelfLocations: string | undefined\n\n const cell = this.cellAt(parsed.col, parsed.row)\n if (cell) {\n section = cell.state.section\n unit = cell.state.unit\n isEmpty = cell.state.isEmpty\n cellShelfLocations = cell.state.shelfLocations\n } else {\n const override = this.cellOverrides[posKey]\n section = override?.section\n unit = override?.unit\n isEmpty = override?.isEmpty\n }\n\n if (!section || !unit || isEmpty) return null\n\n const pattern = this.state.locPattern ?? '{z}{s}-{u}-{sh}'\n const zone = this.state.zone ?? ''\n const shelfLabel = this._shelfLabelsFromCell(cellShelfLocations)[parsed.shelf] ?? String(parsed.shelf + 1)\n\n return pattern\n .replace(/\\{z\\}/g, zone)\n .replace(/\\{s\\}/g, section)\n .replace(/\\{u\\}/g, unit)\n .replace(/\\{sh\\}/g, shelfLabel)\n }\n\n /** cell.state.shelfLocations 명시 시 그것, 아니면 RackGrid 의 shelfLabels. */\n private _shelfLabelsFromCell(cellShelfLocations: string | undefined): string[] {\n const input = cellShelfLocations ?? this.state.shelfLocations\n const levels = this.shelves\n const parts = (input || '').split(',')\n const out: string[] = []\n for (let i = 0; i < levels; i++) {\n const p = parts[i]\n out[i] = p && p.trim().length > 0 ? p.trim() : String(i + 1)\n }\n return out\n }\n\n /** location string → cellId. sparse 역인덱스 lookup. 없으면 null. */\n cellIdOfLocation(location: string): string | null {\n return this._locationIndex.get(location) ?? null\n }\n\n /** 모든 (override 명시된) cell 의 location 목록. inspection 용. */\n get allLocations(): Array<{ cellId: string; location: string }> {\n const result: Array<{ cellId: string; location: string }> = []\n for (const [location, cellId] of this._locationIndex.entries()) {\n result.push({ cellId, location })\n }\n return result\n }\n\n // ── Location 역인덱스 (sparse cache) ────────────────────\n\n private _locationIndexCache?: Map<string, string>\n\n private get _locationIndex(): Map<string, string> {\n if (this._locationIndexCache) return this._locationIndexCache\n const map = new Map<string, string>()\n const shelves = this.shelves\n\n // 1. cell-component 들 (source of truth) — 모든 bay 순회\n const cells = this.components as Component[] | undefined\n if (cells && cells.length > 0) {\n for (let i = 0; i < cells.length; i++) {\n const cell: any = cells[i]\n if (cell?.state?.type !== 'rack-grid-cell') continue\n const bayKey = cell.state.cellId\n if (!bayKey) continue\n const parsed = this.parsePosKey(bayKey)\n if (!parsed) continue\n for (let shelfIdx = 0; shelfIdx < shelves; shelfIdx++) {\n const cellId = `${parsed.col}-${parsed.row}-${shelfIdx}`\n const loc = this.locationOf(cellId)\n if (loc) map.set(loc, cellId)\n }\n }\n }\n\n // 2. cellOverrides fallback (cell-component 없는 시점 — 호환)\n const overrides = this.cellOverrides\n for (const posKey of Object.keys(overrides)) {\n const override = overrides[posKey]\n if (!override.section || !override.unit || override.isEmpty) continue\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n for (let shelfIdx = 0; shelfIdx < shelves; shelfIdx++) {\n const cellId = `${parsed.col}-${parsed.row}-${shelfIdx}`\n if (!map.has(this.locationOf(cellId) || '')) {\n const loc = this.locationOf(cellId)\n if (loc && !map.has(loc)) map.set(loc, cellId)\n }\n }\n }\n\n this._locationIndexCache = map\n return map\n }\n\n /** 룰 / cellOverrides 변경 시 호출. things-scene 의 onchange* 가 자동 호출. */\n invalidateLocationIndex(): void {\n this._locationIndexCache = undefined\n }\n\n onchangeCellOverrides(): void { this.invalidateLocationIndex() }\n onchangeLocPattern(): void { this.invalidateLocationIndex() }\n onchangeShelfLocations(): void { this.invalidateLocationIndex() }\n onchangeZone(): void { this.invalidateLocationIndex() }\n onchangeSectionDigits(): void { this.invalidateLocationIndex() }\n onchangeUnitDigits(): void { this.invalidateLocationIndex() }\n onchangeShelves(): void { this.invalidateLocationIndex() }\n\n // ── 자식 lookup ────────────────────────────────────────\n\n /**\n * (col, row) 위치의 자식 StorageRack. 자식이 StorageRack 이 아닌 경우 (Crane, AGV 등)\n * 는 null — Carrier 보관은 StorageRack 만.\n *\n * 자식의 grid 위치 식별: 자식의 state.column / state.row (1-based) 명시. RackGrid 가\n * 자식 추가 시 자동 할당 또는 사용자가 명시.\n */\n /**\n * cellId 매칭되는 RackGrid 의 직접 자식 carrier (operation archetype).\n * RackGrid 의 자식 중 rack-grid-cell (시각 proxy) 외에 obtainCarrier 가 add 한\n * transient carrier 들이 섞임 — 그 중 cellId / placement='operation' 매칭.\n * storage-rack 의 동일 패턴.\n */\n private _carrierChildAt(cellId: string): Component | undefined {\n const children = (this.components as Component[] | undefined) ?? []\n return children.find(c => {\n const placement = (c.constructor as any).placement\n return placement === 'operation' && (c.state as any)?.cellId === cellId\n })\n }\n\n /**\n * state.data 의 internal 갱신 — obtainCarrier / receiveAt 가 사용.\n * setState 와 달리 'change' / onchangeData / mapping cascade 우회 — 사용자 script\n * 의 자기-자신 호출 회귀 차단. 시각 갱신은 직접 RealObject.rebuildStockMesh 호출.\n * storage-rack 의 동일 패턴.\n */\n private _setDataSilently(newData: any[]): void {\n const self = this as any\n if (!self._state) self._state = {}\n self._state.data = newData\n self._cachedState = null\n ;(this._realObject as any)?.rebuildStockMesh?.()\n }\n\n // ── SlottedHolder 컨트랙 — RackGrid 자체의 records 에서 직접 처리 ────\n //\n // Plan A 정신: stock 데이터는 RackGrid 의 state.data 에 sparse 로 통합 저장.\n // 자식 컴포넌트는 시각용 rack-grid-cell (light proxy) 뿐 carrier 보유 X.\n // storage-rack 의 본체 로직 (transient materialize / silent setData) 을 차용,\n // 좌표 / 사이즈만 RackGrid 의 cellAt(col,row).bounds + getSlotSize 로 적응.\n\n /** state.data record 또는 이미 transient materialize 된 carrier child 가 있는가. */\n hasCarrierAt(slotIdOrLocation: string): boolean {\n const cellId = this._resolveToCellId(slotIdOrLocation)\n if (!cellId) return false\n if (this._carrierChildAt(cellId)) return true\n return this.records.some(r => r.cellId === cellId)\n }\n\n /**\n * carrier 를 obtain — 이미 child 면 그대로, 아니면 state.data record 로 transient\n * materialize 후 RackGrid 의 직접 자식으로 add 하고 state.data 에서 그 record 제거.\n * record 도 child 도 없으면 null.\n */\n obtainCarrier(slotIdOrLocation: string): Component | null {\n const cellId = this._resolveToCellId(slotIdOrLocation)\n if (!cellId) return null\n\n const existing = this._carrierChildAt(cellId)\n if (existing) return existing\n\n const records = this.records as Array<any>\n const idx = records.findIndex(r => r?.cellId === cellId)\n if (idx === -1) return null\n const record = records[idx]\n\n const carrierType = (record.type as string) || 'parcel'\n const CarrierClass = (Component as any).register(carrierType) as\n | (new (...args: any[]) => Component) | undefined\n if (!CarrierClass) {\n console.warn(`[rack-grid] obtainCarrier(\"${cellId}\"): carrier type \"${carrierType}\" 미등록`)\n return null\n }\n\n // RackGrid-inner 좌표 — anchor (getSlotAttachObject3d) / stock InstancedMesh 와\n // *동일 식* 사용: 균등 분할 + center origin → top-left origin 변환.\n // 이전엔 widths/heights *비례 분할* 을 썼는데 anchor/stock 은 *균등 분할* 이라\n // 어긋났음. update loop 이 carrier.state.left/top 기반으로 위치 재계산해도\n // anchor 와 일치하도록 *처음부터 같은 식* 으로 박는다.\n const parsed = this.parseSlotId(cellId)\n if (!parsed) return null\n const rackWidth = (this.state.width as number) ?? 400\n const rackDepthY = (this.state.height as number) ?? 200 // 2D height = 3D Z = inner Y\n const stateDepth = (this.state.depth as number) ?? 2000 // 3D Y (vertical)\n const bayW = rackWidth / this.columns\n const bayD = rackDepthY / this.rackRows\n // anchor X(center) = (col - cols/2 + 0.5) * bayW → 2D top-left center = anchor.X + rackWidth/2\n const cellCenterInnerX = (parsed.col + 0.5) * bayW\n const cellCenterInnerY = (parsed.row + 0.5) * bayD\n // shelf level Y — anchor (getSlotAttachObject3d) 와 동일 식.\n const shelfBase = Math.max(0, Math.min(((this.state as any).shelfBaseHeight as number) || 0, stateDepth * 0.9))\n const shelfZone = stateDepth - shelfBase\n const cellYHeight = shelfZone / this.shelves\n const shelfBaseY = -stateDepth / 2 + shelfBase\n const cellBottomY = shelfBaseY + parsed.shelf * cellYHeight\n\n const slotSize = this.getSlotSize(cellId) ?? { width: 50, height: 50, depth: 50 }\n // record 의 사이즈가 *0* 또는 *non-finite (NaN/Infinity)* 이면 slotSize fallback —\n // nullish 만으로는 NaN/0 통과해 BoxGeometry NaN bug 유발.\n const pickSize = (v: any, fb: number) =>\n typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : fb\n const carrierW = pickSize(record.width, slotSize.width)\n const carrierH = pickSize(record.height, slotSize.height)\n const carrierD = pickSize(record.depth, slotSize.depth)\n\n // 차원 / 좌표 finite 검증 — 어느 단계에서 NaN 이 들어왔는지 명시 진단.\n if (\n !Number.isFinite(carrierW) || !Number.isFinite(carrierH) || !Number.isFinite(carrierD) ||\n !Number.isFinite(cellCenterInnerX) || !Number.isFinite(cellCenterInnerY)\n ) {\n console.error('[rack-grid] obtainCarrier: non-finite dim/pos — carrier 생성 차단', {\n cellId,\n carrierW, carrierH, carrierD,\n cellCenterInnerX, cellCenterInnerY,\n slotSize,\n recordSize: { w: record.width, h: record.height, d: record.depth },\n gridDims: {\n columns: this.columns, rackRows: this.rackRows, shelves: this.shelves,\n stateW: (this.state as any)?.width, stateH: (this.state as any)?.height,\n stateD: (this.state as any)?.depth\n }\n })\n return null\n }\n\n // record 에서 id / refid / transform 류는 *제외* — id 가 들어가면 scene 안 기존\n // component 와 충돌해 parent 가 잘못 잡힘.\n const { id: _id, refid: _refid, transform: _tf, ...recordCopy } = record as any\n const carrierState: any = {\n ...recordCopy,\n type: carrierType,\n cellId, // 슬롯 주소\n refid: _nextCarrierRefid(), // refid 충돌 회피\n width: carrierW,\n height: carrierH,\n depth: carrierD,\n left: cellCenterInnerX - carrierW / 2,\n top: cellCenterInnerY - carrierH / 2,\n // zPos = carrier 의 *parent-local 3D Y bottom*. things-scene 의 RealObject 가\n // 3D Y center = zPos + depth/2 로 계산. 미명시 시 NaN — carrier.matrixWorld NaN\n // → fork 가 NaN target 따라가서 빈 포크질. anchor 식 (cellBottomY + stockD/2)\n // 와 일치하도록 zPos = cellBottomY 명시.\n zPos: cellBottomY\n }\n\n const carrier = new CarrierClass(carrierState, (this as any)._app)\n // silent: true — Plan A transient materialize 는 내부 use, mapping cascade 차단.\n ;(this as any).addComponent(carrier, { silent: true })\n\n // 3D 강제 빌드 + holder attach + manual placement/anchor.\n void (carrier as any).realObject\n ;(carrier as any).applyHolderAttachPoint?.()\n ;(carrier as any).realObject?.setTransientPlacement?.({ policy: 'carried' })\n const anchor = this.getSlotAttachObject3d(cellId)\n const carrierObj3d = (carrier as any).realObject?.object3d\n if (anchor && carrierObj3d) {\n anchor.add(carrierObj3d)\n carrierObj3d.position.set(0, 0, 0)\n carrierObj3d.updateMatrixWorld(true)\n }\n\n // record 제거 — silent (mapping cascade 회피). 동일 cellId 의 *모든* record 정리.\n this._setDataSilently(records.filter(r => r?.cellId !== cellId))\n\n return carrier\n }\n\n /**\n * cell 이 carrier 를 받을 수 있는가.\n * - isEmpty 위치 는 거부 (modeling 차원 location-less)\n * - state.data 에 record 있으면 점유 → false\n * - 자기 자신 carrier 가 child 면 idempotent true (자기 자리 복귀)\n */\n canReceiveAt(slotIdOrLocation: string, carrier?: Component): boolean {\n const cellId = this._resolveToCellId(slotIdOrLocation)\n if (!cellId) return false\n const parsed = this.parseSlotId(cellId)\n if (!parsed) return false\n const override = this.cellOverrides[`${parsed.col}-${parsed.row}`]\n if (override?.isEmpty) return false\n\n const records = this.records as Array<any>\n if (records.some(r => r?.cellId === cellId)) return false\n const existingChild = this._carrierChildAt(cellId)\n if (existingChild && existingChild !== carrier) return false\n return true\n }\n\n /**\n * Carrier 가 RackGrid 의 slot 으로 들어옴 — 즉시 dispose + state.data 에 record 로\n * 환원. 결과: stock InstancedMesh 가 그 자리에 instance 표시, RackGrid 의 자식 트리는\n * 깨끗 (rack-grid-cell 만 남음).\n */\n async receiveAt(slotIdOrLocation: string, carrier: Component, _options?: any): Promise<void> {\n const cellId = this._resolveToCellId(slotIdOrLocation)\n if (!cellId) throw new Error(`RackGrid.receiveAt: cannot resolve \"${slotIdOrLocation}\"`)\n\n // disposed carrier 의 재처리 차단\n if ((carrier as any)?._disposed) {\n throw new Error(\n `RackGrid.receiveAt(\"${cellId}\"): carrier is already disposed. ` +\n 'After a successful pickAndPlace the carrier becomes a state.data record — ' +\n 'use rack.obtainCarrier(cellId) to get a fresh transient carrier instead.'\n )\n }\n if (!this.canReceiveAt(cellId, carrier)) {\n ;(this as any).trigger?.('transfer-rejected', {\n type: 'transfer-rejected',\n component: carrier, container: this, reason: 'slot-occupied', cellId\n })\n return\n }\n\n const record = this.recordFromCarrier(carrier, cellId)\n\n // Carrier 의 parent 에서 떼고 dispose. parent 는 보통 mover (crane) 이거나 RackGrid 자신.\n const carrierParent: any = (carrier as any).parent\n if (carrierParent && typeof carrierParent.removeComponent === 'function') {\n carrierParent.removeComponent(carrier)\n }\n\n // 명시적 Three.js detach — RealObject.dispose() 의 clear() 는 object3d 자체를\n // scene graph 의 parent 에서 떼지 않으므로 ghost 방지 위해 명시 제거.\n const carrierObj3d: any = (carrier as any)._realObject?.object3d\n if (carrierObj3d?.parent && typeof carrierObj3d.parent.remove === 'function') {\n carrierObj3d.parent.remove(carrierObj3d)\n }\n\n ;(carrier as any).dispose?.()\n\n // state.data 에 push — silent (mapping cascade 회피). 동일 cellId 중복 방어.\n const currentRecords = (this.records as any[]).filter(r => r?.cellId !== cellId)\n this._setDataSilently([...currentRecords, record])\n\n ;(this as any).trigger?.('transfer-received', {\n type: 'transfer-received',\n component: carrier, container: this, slotId: cellId, record\n })\n }\n\n /**\n * Carrier 의 state 를 state.data record 로 추출. transform/position 관련은 record\n * 와 무관해 skip. (storage-rack 의 동일 패턴.)\n */\n recordFromCarrier(carrier: Component, cellId: string): SlotRecord {\n const state: any = (carrier as any).state ?? {}\n const SKIP_KEYS = new Set([\n 'left', 'top', 'zPos',\n 'transform', 'rotation', 'scale',\n '_transferSlotId',\n 'cellId',\n 'id',\n 'refid'\n ])\n const record: any = { cellId, type: state.type }\n for (const key of Object.keys(state)) {\n if (SKIP_KEYS.has(key)) continue\n record[key] = state[key]\n }\n return record\n }\n\n // ── CarrierHolder — attach frame for direct carrier children ─────────────\n\n /**\n * children gate — CarrierHolder.containable 의 *carriable-only* 제한을 완화.\n * RackGrid 의 자식은 두 종류:\n * - RackGridCell : modeling-time visual proxy (carriable 아님)\n * - carrier : Plan A 의 obtainCarrier 가 materialize (carriable)\n * 둘 다 허용해야 정상 동작.\n */\n containable(component: Component): boolean {\n if (!component) return false\n if ((component as any)?.state?.type === 'rack-grid-cell') return true\n return (component as any).isCarriable === true\n }\n\n /**\n * Attach frame for direct-child carrier — `applyHolderAttachPoint` 가 이 결과의\n * `attach` 에 carrier obj3d 를 attach 하고 `localPosition` 을 set. cell anchor\n * 반환 + carried placement 와 함께 동작 — carrier 가 cell 위치에 고정.\n */\n attachPointFor(carrier: Component): AttachFrame | null {\n const cellId = (carrier as any)?.state?.cellId as string | undefined\n if (cellId) {\n const obj = this.getSlotAttachObject3d(cellId)\n if (obj) return { attach: obj, localPosition: { x: 0, y: 0, z: 0 } }\n }\n const root = this._realObject?.object3d\n if (!root) return null\n return { attach: root, localPosition: { x: 0, y: 0, z: 0 } }\n }\n\n /**\n * Slot 의 attach object3d — Stock InstancedMesh 의 instance 와 *같은 world 위치* 에\n * 위치한 invisible Object3D. popup tether 등이 이 object3d 의 matrixWorld 를\n * 사용. lazy 생성 + cache.\n */\n private _attachAnchorBySlot: Map<string, THREE.Object3D> = new Map()\n\n /**\n * Anchor position cache 의 signature — rack 의 차원 state 변경 시 무효화 trigger.\n * 동일 signature 인 동안 *anchor.position.set 재계산 skip*. crane 의 첫\n * findAdjacentSlots 가 *수많은 anchor 의 position.set 매 호출* — *동일 차원\n * state 일 때* 의 *중복 계산 차단*.\n */\n private _attachAnchorSig?: string\n\n getSlotAttachObject3d(slotId: string): THREE.Object3D | undefined {\n const parsed = this.parseSlotId(slotId)\n if (!parsed) {\n console.warn(`[rack-grid] getSlotAttachObject3d: invalid cellId format \"${slotId}\"`)\n return undefined\n }\n if (parsed.col < 0 || parsed.col >= this.columns) {\n console.warn(`[rack-grid] getSlotAttachObject3d: col=${parsed.col} out of range [0, ${this.columns})`)\n return undefined\n }\n if (parsed.row < 0 || parsed.row >= this.rackRows) {\n console.warn(`[rack-grid] getSlotAttachObject3d: row=${parsed.row} out of range [0, ${this.rackRows})`)\n return undefined\n }\n if (parsed.shelf < 0 || parsed.shelf >= this.shelves) {\n console.warn(`[rack-grid] getSlotAttachObject3d: shelf=${parsed.shelf} out of range [0, ${this.shelves}) — cellId \"${slotId}\" — fork 가 fallback 위치 (한 층 아래 등) 로 갈 수 있음`)\n return undefined\n }\n\n const ro: any = (this as any)._realObject\n if (!ro?.object3d) return undefined\n\n // signature 검사 — 차원 state 변경 시 *모든 anchor invalidate* 후 새로 생성.\n // 동일 sig 일 때 *기존 anchor 그대로 사용 (position.set skip)*.\n const rs: any = this.state\n const cols = this.columns\n const rows = this.rackRows\n const shelves = this.shelves\n const width = (rs?.width as number) ?? 400\n const height = (rs?.depth as number) ?? 2000\n const depth = (rs?.height as number) ?? 200\n const shelfBase = Math.max(0, Math.min((rs?.shelfBaseHeight as number) || 0, height * 0.9))\n const sig = `${cols}-${rows}-${shelves}-${width}-${height}-${depth}-${shelfBase}`\n\n if (this._attachAnchorSig !== sig) {\n // 차원 변경 — 모든 기존 anchor 폐기 후 sig 갱신.\n for (const oldObj of this._attachAnchorBySlot.values()) {\n ro.object3d.remove(oldObj)\n }\n this._attachAnchorBySlot.clear()\n this._attachAnchorSig = sig\n }\n\n let obj = this._attachAnchorBySlot.get(slotId)\n if (!obj) {\n obj = new THREE.Object3D()\n obj.name = `rack-grid-anchor:${slotId}`\n ro.object3d.add(obj)\n this._attachAnchorBySlot.set(slotId, obj)\n\n // 신규 anchor — position 계산 + set (1 회 만, 이후 호출은 cache hit).\n const shelfZone = height - shelfBase\n const bayW = width / cols\n const bayD = depth / rows\n const cellY = shelfZone / shelves\n const baseY = -height / 2\n const shelfBaseY = baseY + shelfBase\n const stockD = cellY * 0.7\n\n const cx = (parsed.col - cols / 2 + 0.5) * bayW\n const cellBottomY = shelfBaseY + parsed.shelf * cellY\n const cy = cellBottomY + stockD / 2\n const cz = (parsed.row - rows / 2 + 0.5) * bayD\n obj.position.set(cx, cy, cz)\n }\n // *parent 의 matrixWorld 가 dirty 면 자식 matrixWorld 도 dirty* — 강제 갱신.\n ro.object3d.updateMatrixWorld(true)\n obj.updateMatrixWorld(true)\n return obj\n }\n\n getSlotSize(slotId: string): { width: number; height: number; depth: number } | undefined {\n const parsed = this.parseSlotId(slotId)\n if (!parsed) return undefined\n const rs: any = this.state\n const width = (rs?.width as number) ?? 400\n const height = (rs?.depth as number) ?? 2000\n const depth = (rs?.height as number) ?? 200\n const shelfBase = Math.max(0, Math.min((rs?.shelfBaseHeight as number) || 0, height * 0.9))\n const shelfZone = height - shelfBase\n const cellY = shelfZone / this.shelves\n return {\n width: (width / this.columns) * 0.85,\n height: (depth / this.rackRows) * 0.85, // 2D height = 3D Z 폭\n depth: cellY * 0.7 // 3D Y 폭 (= stockD)\n }\n }\n\n cellCenter2D(slotId: string): { x: number; y: number } | null {\n const parsed = this.parseSlotId(slotId)\n if (!parsed) return null\n const rs: any = this.state\n const left = (rs?.left as number) ?? 0\n const top = (rs?.top as number) ?? 0\n const width = (rs?.width as number) ?? 400\n const height = (rs?.height as number) ?? 200\n // table layout 의 widths/heights 비례 위치\n const widths = this.widths\n const heights = this.heights\n const wSum = this.widths_sum\n const hSum = this.heights_sum\n let cumW = 0\n for (let c = 0; c < parsed.col; c++) cumW += widths[c]\n let cumH = 0\n for (let r = 0; r < parsed.row; r++) cumH += heights[r]\n const x = left + (cumW + widths[parsed.col] / 2) / wSum * width\n const y = top + (cumH + heights[parsed.row] / 2) / hSum * height\n return { x, y }\n }\n\n slotTargetAt(slotIdOrLocation: string): SlotTarget {\n const slotId = this._resolveToCellId(slotIdOrLocation)\n if (!slotId) throw new Error(`RackGrid.slotTargetAt: cannot resolve \"${slotIdOrLocation}\"`)\n return new SlotTarget(this, slotId)\n }\n\n // ── Helpers ──────────────────────────────────────────\n\n /**\n * 외부 입력 → 내부 cellId 변환:\n * - \"N-N-N\" (3 segments, 모두 숫자) → cellId 그대로 (dual-accept)\n * - 그 외 → location 으로 간주, locationIndex lookup\n */\n private _resolveToCellId(input: string): string | null {\n if (this._isCellIdFormat(input)) return input\n return this.cellIdOfLocation(input)\n }\n\n private _isCellIdFormat(s: string): boolean {\n const parts = s.split('-')\n return parts.length === 3 && parts.every(p => /^\\d+$/.test(p))\n }\n\n // ── Bulk 편집 API ────────────────────────────────────────\n //\n // 모두 *single setState* 로 cellOverrides 갱신 → 단일 'change' 이벤트만 발사.\n // 매핑 cascade 회피 위해 silent 갱신 메서드 제공 (`_setCellOverridesSilently`).\n\n /**\n * 한 위치의 cellOverride 를 갱신 (merge). 기존 필드는 유지, 새 필드만 덮어씀.\n * `partial` 의 필드가 *undefined* 면 *그 필드 삭제* (override 키에서 제거).\n */\n setCellOverride(posKey: string, partial: Partial<CellOverride>): void {\n const current = this.cellOverrides\n const existing = current[posKey] ?? {}\n const merged: any = { ...existing }\n for (const [k, v] of Object.entries(partial)) {\n if (v === undefined) delete merged[k]\n else merged[k] = v\n }\n const next = { ...current }\n if (Object.keys(merged).length === 0) delete next[posKey]\n else next[posKey] = merged\n this.setState({ cellOverrides: next })\n }\n\n /** 한 위치의 override 전체 삭제. */\n clearCellOverride(posKey: string): void {\n const current = this.cellOverrides\n if (!(posKey in current)) return\n const next = { ...current }\n delete next[posKey]\n this.setState({ cellOverrides: next })\n }\n\n /**\n * 여러 위치의 isEmpty 일괄 토글. cell-component 있으면 cell.set(), 없으면 cellOverrides.\n */\n setIsEmpty(posKeys: string[], isEmpty: boolean): void {\n const hasCells = this.components.some((c: Component) => (c as any)?.state?.type === 'rack-grid-cell')\n if (hasCells) {\n for (const posKey of posKeys) {\n const cell = this.cellAtBayKey(posKey)\n cell?.set?.('isEmpty', isEmpty)\n }\n this.invalidateLocationIndex()\n return\n }\n // Fallback: cellOverrides\n const current = this.cellOverrides\n const next = { ...current }\n for (const posKey of posKeys) {\n const existing = next[posKey] ?? {}\n const merged: any = { ...existing, isEmpty }\n if (!isEmpty && !existing.section && !existing.unit && !existing.border && !existing.merged) {\n delete next[posKey]\n } else {\n next[posKey] = merged\n }\n }\n this.setState({ cellOverrides: next })\n }\n\n /**\n * 여러 위치의 border 스타일 일괄 설정. `where` ('top'|'left'|'bottom'|'right'|'all').\n * - style = null → 해당 side 삭제\n * - where = 'all' → 4면 모두 동일 style\n */\n setBorder(posKeys: string[], style: any, where: 'all' | 'top' | 'left' | 'bottom' | 'right' = 'all'): void {\n const sides = where === 'all' ? ['top', 'left', 'bottom', 'right'] : [where]\n const current = this.cellOverrides\n const next = { ...current }\n for (const posKey of posKeys) {\n const existing = next[posKey] ?? {}\n const border = { ...(existing.border ?? {}) }\n for (const side of sides) {\n if (style == null) delete border[side]\n else border[side] = style\n }\n const merged: any = { ...existing, border }\n if (Object.keys(border).length === 0) delete merged.border\n next[posKey] = merged\n }\n this.setState({ cellOverrides: next })\n }\n\n /**\n * 자동 채번 — 선택된 cell 들에 section/unit 자동 부여.\n *\n * @param posKeys 채번 대상 (선택 영역). 빈 array 면 *전체 grid*.\n * @param direction 순회 방향:\n * 'cw' — 한 row 내 col 증가 → 다음 row 는 반대 방향 (boustrophedon)\n * 'ccw' — 반대 방향\n * 'zigzag' — col 우선 증가 (cw 의 90° 회전)\n * 'zigzag-reverse' — 반대\n * @param skipNumbering true 면 isEmpty cell 건너뜀 (단위 번호 안 증가).\n * @param startSection 첫 section 번호 (default 1)\n * @param startUnit 첫 unit 번호 (default 1)\n *\n * Aisle row (모든 cell isEmpty) 는 section 경계로 인식 — section 번호가 다음 row 에서 +1.\n *\n * setState 한 번 (cellOverrides 일괄 갱신) → location 역인덱스 1회 무효화.\n */\n increaseLocation(\n posKeys: string[],\n direction: 'cw' | 'ccw' | 'zigzag' | 'zigzag-reverse' = 'cw',\n skipNumbering: boolean = false,\n startSection: number = 1,\n startUnit: number = 1\n ): void {\n const sectionDigits = Math.max(1, Math.floor(this.state.sectionDigits ?? 2))\n const unitDigits = Math.max(1, Math.floor(this.state.unitDigits ?? 2))\n\n // 대상 결정: posKeys 비었으면 전체 grid\n const targets: string[] = posKeys.length > 0\n ? [...posKeys]\n : this._allPosKeys()\n\n // (1) row 별 분류 (2D 배열, [row][col] = posKey)\n const byRow: (string | null)[][] = []\n let maxRow = -1\n let maxCol = -1\n for (const posKey of targets) {\n const parsed = this.parsePosKey(posKey)\n if (!parsed) continue\n if (!byRow[parsed.row]) byRow[parsed.row] = []\n byRow[parsed.row][parsed.col] = posKey\n if (parsed.row > maxRow) maxRow = parsed.row\n if (parsed.col > maxCol) maxCol = parsed.col\n }\n\n // (2) aisle row 식별 — row 의 모든 (선택된) cell 이 isEmpty\n const overrides = this.cellOverrides\n const isAisleRow = (row: number): boolean => {\n const cells = byRow[row]\n if (!cells || cells.length === 0) return true\n return cells.every(p => p == null || overrides[p]?.isEmpty === true)\n }\n\n // (3) section 별 묶기 (aisle 사이의 연속 row 들)\n const sections: number[][] = []\n let currentSection: number[] = []\n for (let r = 0; r <= maxRow; r++) {\n if (!byRow[r]) continue\n if (isAisleRow(r)) {\n if (currentSection.length > 0) {\n sections.push(currentSection)\n currentSection = []\n }\n } else {\n currentSection.push(r)\n }\n }\n if (currentSection.length > 0) sections.push(currentSection)\n\n // (4) 방향별 순회로 (section, unit) 부여\n const hasCells = this.components.some((c: Component) => (c as any)?.state?.type === 'rack-grid-cell')\n const next = { ...overrides }\n let sectionNum = Number(startSection) || 1\n\n const setSU = (posKey: string, section: number, unit: number) => {\n const sStr = String(section).padStart(sectionDigits, '0')\n const uStr = String(unit).padStart(unitDigits, '0')\n if (hasCells) {\n const cell = this.cellAtBayKey(posKey)\n cell?.set?.('section', sStr)\n cell?.set?.('unit', uStr)\n } else {\n const existing = next[posKey] ?? {}\n next[posKey] = { ...existing, section: sStr, unit: uStr }\n }\n }\n\n const clearSU = (posKey: string) => {\n if (hasCells) {\n const cell = this.cellAtBayKey(posKey)\n cell?.set?.('section', null)\n cell?.set?.('unit', null)\n } else {\n const existing = next[posKey]\n if (!existing) return\n const { section, unit, ...rest } = existing\n if (Object.keys(rest).length === 0) delete next[posKey]\n else next[posKey] = rest\n }\n }\n\n for (const sectionRows of sections) {\n for (const row of sectionRows) {\n const cells = byRow[row]\n if (!cells) continue\n // 방향별 cell 순회 순서 결정\n const orderedCols = this._orderCols(row, sectionRows, direction, maxCol)\n let unitNum = Number(startUnit) || 1\n for (const col of orderedCols) {\n const posKey = cells[col]\n if (!posKey) continue\n const isEmpty = overrides[posKey]?.isEmpty === true\n if (isEmpty) {\n clearSU(posKey)\n if (!skipNumbering) unitNum++\n } else {\n setSU(posKey, sectionNum, unitNum)\n unitNum++\n }\n }\n // row 마다 section 증가? 아님 — section 은 *aisle 로 구분된 묶음 단위*.\n // 동일 section 내 다음 row 는 unit 번호 다시 startUnit 부터.\n // rack-table 의 원본 동작과 동일.\n }\n sectionNum++\n }\n\n // cell-component 가 있으면 cell.set() 으로 이미 갱신됨 (setSU/clearSU 안에서).\n // 없으면 cellOverrides fallback 적용.\n if (!hasCells) {\n this.setState({ cellOverrides: next })\n } else {\n this.invalidateLocationIndex()\n }\n }\n\n /**\n * 모든 grid 위치 (전체 columns × rows) 의 posKey 목록.\n */\n private _allPosKeys(): string[] {\n const cols = this.columns\n const rows = this.rackRows\n const out: string[] = []\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n out.push(`${c}-${r}`)\n }\n }\n return out\n }\n\n /**\n * Row 의 col 순회 순서 결정. boustrophedon (S 자형) 패턴 지원.\n * cw : 짝수 row 는 좌→우, 홀수 row 는 우→좌\n * ccw : 짝수 row 는 우→좌, 홀수 row 는 좌→우\n * zigzag : 모든 row 좌→우 (단순)\n * zigzag-reverse : 모든 row 우→좌\n */\n private _orderCols(\n row: number,\n sectionRows: number[],\n direction: 'cw' | 'ccw' | 'zigzag' | 'zigzag-reverse',\n maxCol: number\n ): number[] {\n // section 내 row 의 *상대 인덱스* — section 경계에서 패턴이 리셋되도록.\n const idxInSection = sectionRows.indexOf(row)\n const cols: number[] = []\n for (let c = 0; c <= maxCol; c++) cols.push(c)\n\n switch (direction) {\n case 'cw':\n return idxInSection % 2 === 0 ? cols : cols.slice().reverse()\n case 'ccw':\n return idxInSection % 2 === 0 ? cols.slice().reverse() : cols\n case 'zigzag':\n return cols\n case 'zigzag-reverse':\n return cols.slice().reverse()\n }\n }\n}\n"]}