@pascal-app/core 1.0.1 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +235 -0
- package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/add-object-cases.js +129 -0
- package/dist/agent-operations/__fixtures__/build-room-cases.d.ts +4 -0
- package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/build-room-cases.js +635 -0
- package/dist/agent-operations/__fixtures__/cases.d.ts +52 -0
- package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/cases.js +689 -0
- package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts +7 -0
- package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/find-by-type-cases.js +21 -0
- package/dist/agent-operations/__fixtures__/place-items-cases.d.ts +17 -0
- package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/place-items-cases.js +506 -0
- package/dist/agent-operations/__fixtures__/room-cases.d.ts +3 -0
- package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/room-cases.js +338 -0
- package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts +5 -0
- package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/search-assets-cases.js +137 -0
- package/dist/agent-operations/__fixtures__/structure-cases.d.ts +6 -0
- package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/structure-cases.js +588 -0
- package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +3 -0
- package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/verify-scene-cases.js +302 -0
- package/dist/agent-operations/achieved.d.ts +16 -0
- package/dist/agent-operations/achieved.d.ts.map +1 -0
- package/dist/agent-operations/achieved.js +28 -0
- package/dist/agent-operations/add-column.d.ts +23 -0
- package/dist/agent-operations/add-column.d.ts.map +1 -0
- package/dist/agent-operations/add-column.js +97 -0
- package/dist/agent-operations/add-level.d.ts +14 -0
- package/dist/agent-operations/add-level.d.ts.map +1 -0
- package/dist/agent-operations/add-level.js +94 -0
- package/dist/agent-operations/add-object.d.ts +114 -0
- package/dist/agent-operations/add-object.d.ts.map +1 -0
- package/dist/agent-operations/add-object.js +361 -0
- package/dist/agent-operations/add-wall.d.ts +15 -0
- package/dist/agent-operations/add-wall.d.ts.map +1 -0
- package/dist/agent-operations/add-wall.js +47 -0
- package/dist/agent-operations/apply-changes.d.ts +16 -0
- package/dist/agent-operations/apply-changes.d.ts.map +1 -0
- package/dist/agent-operations/apply-changes.js +93 -0
- package/dist/agent-operations/apply-outcome.d.ts +15 -0
- package/dist/agent-operations/apply-outcome.d.ts.map +1 -0
- package/dist/agent-operations/apply-outcome.js +18 -0
- package/dist/agent-operations/collections.d.ts +28 -0
- package/dist/agent-operations/collections.d.ts.map +1 -0
- package/dist/agent-operations/collections.js +130 -0
- package/dist/agent-operations/create-room.d.ts +36 -0
- package/dist/agent-operations/create-room.d.ts.map +1 -0
- package/dist/agent-operations/create-room.js +177 -0
- package/dist/agent-operations/create-stair.d.ts +33 -0
- package/dist/agent-operations/create-stair.d.ts.map +1 -0
- package/dist/agent-operations/create-stair.js +247 -0
- package/dist/agent-operations/delete-node.d.ts +6 -0
- package/dist/agent-operations/delete-node.d.ts.map +1 -0
- package/dist/agent-operations/delete-node.js +9 -0
- package/dist/agent-operations/door-clearance.d.ts +135 -0
- package/dist/agent-operations/door-clearance.d.ts.map +1 -0
- package/dist/agent-operations/door-clearance.js +334 -0
- package/dist/agent-operations/duplicate-level.d.ts +12 -0
- package/dist/agent-operations/duplicate-level.d.ts.map +1 -0
- package/dist/agent-operations/duplicate-level.js +54 -0
- package/dist/agent-operations/find-by-type.d.ts +11 -0
- package/dist/agent-operations/find-by-type.d.ts.map +1 -0
- package/dist/agent-operations/find-by-type.js +94 -0
- package/dist/agent-operations/furnish-room.d.ts +18 -0
- package/dist/agent-operations/furnish-room.d.ts.map +1 -0
- package/dist/agent-operations/furnish-room.js +259 -0
- package/dist/agent-operations/get-node.d.ts +9 -0
- package/dist/agent-operations/get-node.d.ts.map +1 -0
- package/dist/agent-operations/get-node.js +33 -0
- package/dist/agent-operations/hosted-services.d.ts +13 -0
- package/dist/agent-operations/hosted-services.d.ts.map +1 -0
- package/dist/agent-operations/hosted-services.js +22 -0
- package/dist/agent-operations/index.d.ts +277 -0
- package/dist/agent-operations/index.d.ts.map +1 -0
- package/dist/agent-operations/index.js +80 -0
- package/dist/agent-operations/layout-clearance.d.ts +108 -0
- package/dist/agent-operations/layout-clearance.d.ts.map +1 -0
- package/dist/agent-operations/layout-clearance.js +190 -0
- package/dist/agent-operations/level-reads.d.ts +33 -0
- package/dist/agent-operations/level-reads.d.ts.map +1 -0
- package/dist/agent-operations/level-reads.js +161 -0
- package/dist/agent-operations/level-target.d.ts +11 -0
- package/dist/agent-operations/level-target.d.ts.map +1 -0
- package/dist/agent-operations/level-target.js +29 -0
- package/dist/agent-operations/list-levels.d.ts +4 -0
- package/dist/agent-operations/list-levels.d.ts.map +1 -0
- package/dist/agent-operations/list-levels.js +31 -0
- package/dist/agent-operations/material-preset.d.ts +11 -0
- package/dist/agent-operations/material-preset.d.ts.map +1 -0
- package/dist/agent-operations/material-preset.js +74 -0
- package/dist/agent-operations/material-refs.d.ts +24 -0
- package/dist/agent-operations/material-refs.d.ts.map +1 -0
- package/dist/agent-operations/material-refs.js +100 -0
- package/dist/agent-operations/node-patch.d.ts +3 -0
- package/dist/agent-operations/node-patch.d.ts.map +1 -0
- package/dist/agent-operations/node-patch.js +114 -0
- package/dist/agent-operations/paint.d.ts +21 -0
- package/dist/agent-operations/paint.d.ts.map +1 -0
- package/dist/agent-operations/paint.js +219 -0
- package/dist/agent-operations/place-items.d.ts +20 -0
- package/dist/agent-operations/place-items.d.ts.map +1 -0
- package/dist/agent-operations/place-items.js +226 -0
- package/dist/agent-operations/plan-geometry.d.ts +24 -0
- package/dist/agent-operations/plan-geometry.d.ts.map +1 -0
- package/dist/agent-operations/plan-geometry.js +94 -0
- package/dist/agent-operations/room-structure.d.ts +87 -0
- package/dist/agent-operations/room-structure.d.ts.map +1 -0
- package/dist/agent-operations/room-structure.js +144 -0
- package/dist/agent-operations/scene-materials.d.ts +15 -0
- package/dist/agent-operations/scene-materials.d.ts.map +1 -0
- package/dist/agent-operations/scene-materials.js +62 -0
- package/dist/agent-operations/scene-measure.d.ts +73 -0
- package/dist/agent-operations/scene-measure.d.ts.map +1 -0
- package/dist/agent-operations/scene-measure.js +73 -0
- package/dist/agent-operations/scene-queries.d.ts +4510 -0
- package/dist/agent-operations/scene-queries.d.ts.map +1 -0
- package/dist/agent-operations/scene-queries.js +84 -0
- package/dist/agent-operations/scene-view.d.ts +98 -0
- package/dist/agent-operations/scene-view.d.ts.map +1 -0
- package/dist/agent-operations/scene-view.js +559 -0
- package/dist/agent-operations/search-assets.d.ts +14 -0
- package/dist/agent-operations/search-assets.d.ts.map +1 -0
- package/dist/agent-operations/search-assets.js +42 -0
- package/dist/agent-operations/search-materials.d.ts +12 -0
- package/dist/agent-operations/search-materials.d.ts.map +1 -0
- package/dist/agent-operations/search-materials.js +111 -0
- package/dist/agent-operations/stairs.d.ts +5 -0
- package/dist/agent-operations/stairs.d.ts.map +1 -0
- package/dist/agent-operations/stairs.js +70 -0
- package/dist/agent-operations/types.d.ts +59 -0
- package/dist/agent-operations/types.d.ts.map +1 -0
- package/dist/agent-operations/types.js +1 -0
- package/dist/agent-operations/verify-scene.d.ts +50 -0
- package/dist/agent-operations/verify-scene.d.ts.map +1 -0
- package/dist/agent-operations/verify-scene.js +369 -0
- package/dist/agent-operations/wall-opening.d.ts +65 -0
- package/dist/agent-operations/wall-opening.d.ts.map +1 -0
- package/dist/agent-operations/wall-opening.js +55 -0
- package/dist/agent-tools/achieved.d.ts +9 -0
- package/dist/agent-tools/achieved.d.ts.map +1 -0
- package/dist/agent-tools/achieved.js +8 -0
- package/dist/agent-tools/add-object.d.ts +43 -0
- package/dist/agent-tools/add-object.d.ts.map +1 -0
- package/dist/agent-tools/add-object.js +86 -0
- package/dist/agent-tools/assets.d.ts +13 -0
- package/dist/agent-tools/assets.d.ts.map +1 -0
- package/dist/agent-tools/assets.js +18 -0
- package/dist/agent-tools/clear-scene.d.ts +10 -0
- package/dist/agent-tools/clear-scene.d.ts.map +1 -0
- package/dist/agent-tools/clear-scene.js +9 -0
- package/dist/agent-tools/collections.d.ts +35 -0
- package/dist/agent-tools/collections.d.ts.map +1 -0
- package/dist/agent-tools/collections.js +31 -0
- package/dist/agent-tools/columns.d.ts +44 -0
- package/dist/agent-tools/columns.d.ts.map +1 -0
- package/dist/agent-tools/columns.js +59 -0
- package/dist/agent-tools/contract.d.ts +68 -0
- package/dist/agent-tools/contract.d.ts.map +1 -0
- package/dist/agent-tools/contract.js +1 -0
- package/dist/agent-tools/create-room.d.ts +63 -0
- package/dist/agent-tools/create-room.d.ts.map +1 -0
- package/dist/agent-tools/create-room.js +90 -0
- package/dist/agent-tools/find-by-type.d.ts +11 -0
- package/dist/agent-tools/find-by-type.d.ts.map +1 -0
- package/dist/agent-tools/find-by-type.js +14 -0
- package/dist/agent-tools/furnish-room.d.ts +26 -0
- package/dist/agent-tools/furnish-room.d.ts.map +1 -0
- package/dist/agent-tools/furnish-room.js +35 -0
- package/dist/agent-tools/hosted-services.d.ts +402 -0
- package/dist/agent-tools/hosted-services.d.ts.map +1 -0
- package/dist/agent-tools/hosted-services.js +148 -0
- package/dist/agent-tools/index.d.ts +864 -0
- package/dist/agent-tools/index.d.ts.map +1 -0
- package/dist/agent-tools/index.js +82 -0
- package/dist/agent-tools/levels.d.ts +72 -0
- package/dist/agent-tools/levels.d.ts.map +1 -0
- package/dist/agent-tools/levels.js +76 -0
- package/dist/agent-tools/measurement.d.ts +37 -0
- package/dist/agent-tools/measurement.d.ts.map +1 -0
- package/dist/agent-tools/measurement.js +94 -0
- package/dist/agent-tools/node-id.d.ts +3 -0
- package/dist/agent-tools/node-id.d.ts.map +1 -0
- package/dist/agent-tools/node-id.js +2 -0
- package/dist/agent-tools/nodes.d.ts +17 -0
- package/dist/agent-tools/nodes.d.ts.map +1 -0
- package/dist/agent-tools/nodes.js +13 -0
- package/dist/agent-tools/paint.d.ts +46 -0
- package/dist/agent-tools/paint.d.ts.map +1 -0
- package/dist/agent-tools/paint.js +29 -0
- package/dist/agent-tools/place-items.d.ts +19 -0
- package/dist/agent-tools/place-items.d.ts.map +1 -0
- package/dist/agent-tools/place-items.js +29 -0
- package/dist/agent-tools/refusal.d.ts +20 -0
- package/dist/agent-tools/refusal.d.ts.map +1 -0
- package/dist/agent-tools/refusal.js +29 -0
- package/dist/agent-tools/room-structure.d.ts +438 -0
- package/dist/agent-tools/room-structure.d.ts.map +1 -0
- package/dist/agent-tools/room-structure.js +207 -0
- package/dist/agent-tools/search-materials.d.ts +20 -0
- package/dist/agent-tools/search-materials.d.ts.map +1 -0
- package/dist/agent-tools/search-materials.js +32 -0
- package/dist/agent-tools/stairs.d.ts +86 -0
- package/dist/agent-tools/stairs.d.ts.map +1 -0
- package/dist/agent-tools/stairs.js +103 -0
- package/dist/agent-tools/verify-scene.d.ts +13 -0
- package/dist/agent-tools/verify-scene.d.ts.map +1 -0
- package/dist/agent-tools/verify-scene.js +21 -0
- package/dist/agent-tools/view-scene.d.ts +43 -0
- package/dist/agent-tools/view-scene.d.ts.map +1 -0
- package/dist/agent-tools/view-scene.js +80 -0
- package/dist/agent-tools/wall-openings.d.ts +163 -0
- package/dist/agent-tools/wall-openings.d.ts.map +1 -0
- package/dist/agent-tools/wall-openings.js +144 -0
- package/dist/agent-tools/walls.d.ts +21 -0
- package/dist/agent-tools/walls.d.ts.map +1 -0
- package/dist/agent-tools/walls.js +30 -0
- package/dist/agent-tools/write-target.d.ts +12 -0
- package/dist/agent-tools/write-target.d.ts.map +1 -0
- package/dist/agent-tools/write-target.js +10 -0
- package/dist/building/__fixtures__/wall-opening-cases.d.ts +736 -0
- package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -0
- package/dist/building/__fixtures__/wall-opening-cases.js +307 -0
- package/dist/building/door-types.d.ts +22 -0
- package/dist/building/door-types.d.ts.map +1 -0
- package/dist/building/door-types.js +167 -0
- package/dist/building/floor-item-fit.d.ts +38 -0
- package/dist/building/floor-item-fit.d.ts.map +1 -0
- package/dist/building/floor-item-fit.js +47 -0
- package/dist/building/index.d.ts +7 -0
- package/dist/building/index.d.ts.map +1 -0
- package/dist/building/index.js +6 -0
- package/dist/building/level-duplication.d.ts +8983 -0
- package/dist/building/level-duplication.d.ts.map +1 -0
- package/dist/building/level-duplication.js +314 -0
- package/dist/building/opening-style-presets.d.ts +46 -0
- package/dist/building/opening-style-presets.d.ts.map +1 -0
- package/dist/building/opening-style-presets.js +195 -0
- package/dist/building/wall-openings.d.ts +445 -0
- package/dist/building/wall-openings.d.ts.map +1 -0
- package/dist/building/wall-openings.js +231 -0
- package/dist/building/window-types.d.ts +17 -0
- package/dist/building/window-types.d.ts.map +1 -0
- package/dist/building/window-types.js +31 -0
- package/dist/commands/structure/apply-zone-transform.d.ts +23 -0
- package/dist/commands/structure/apply-zone-transform.d.ts.map +1 -0
- package/dist/commands/structure/apply-zone-transform.js +55 -0
- package/dist/commands/structure/create-mezzanine.d.ts +12 -0
- package/dist/commands/structure/create-mezzanine.d.ts.map +1 -0
- package/dist/commands/structure/create-mezzanine.js +46 -0
- package/dist/commands/structure/create-zone.d.ts +32 -0
- package/dist/commands/structure/create-zone.d.ts.map +1 -0
- package/dist/commands/structure/create-zone.js +126 -0
- package/dist/commands/structure/delete-zone.d.ts +51 -0
- package/dist/commands/structure/delete-zone.d.ts.map +1 -0
- package/dist/commands/structure/delete-zone.js +354 -0
- package/dist/commands/structure/divide-zone.d.ts +38 -0
- package/dist/commands/structure/divide-zone.d.ts.map +1 -0
- package/dist/commands/structure/divide-zone.js +186 -0
- package/dist/commands/structure/duplicate-zone.d.ts +7 -0
- package/dist/commands/structure/duplicate-zone.d.ts.map +1 -0
- package/dist/commands/structure/duplicate-zone.js +21 -0
- package/dist/commands/structure/floor-opening.d.ts +36 -0
- package/dist/commands/structure/floor-opening.d.ts.map +1 -0
- package/dist/commands/structure/floor-opening.js +124 -0
- package/dist/commands/structure/index.d.ts +22 -0
- package/dist/commands/structure/index.d.ts.map +1 -0
- package/dist/commands/structure/index.js +20 -0
- package/dist/commands/structure/lock-outside-faces.d.ts +12 -0
- package/dist/commands/structure/lock-outside-faces.d.ts.map +1 -0
- package/dist/commands/structure/lock-outside-faces.js +32 -0
- package/dist/commands/structure/merge-zones.d.ts +5 -0
- package/dist/commands/structure/merge-zones.d.ts.map +1 -0
- package/dist/commands/structure/merge-zones.js +22 -0
- package/dist/commands/structure/mezzanine-content.d.ts +16 -0
- package/dist/commands/structure/mezzanine-content.d.ts.map +1 -0
- package/dist/commands/structure/mezzanine-content.js +109 -0
- package/dist/commands/structure/plan-mezzanine-stair.d.ts +7 -0
- package/dist/commands/structure/plan-mezzanine-stair.d.ts.map +1 -0
- package/dist/commands/structure/plan-mezzanine-stair.js +127 -0
- package/dist/commands/structure/plan-wall-deletion.d.ts +9 -0
- package/dist/commands/structure/plan-wall-deletion.d.ts.map +1 -0
- package/dist/commands/structure/plan-wall-deletion.js +151 -0
- package/dist/commands/structure/rebase-floor-reference.d.ts +7 -0
- package/dist/commands/structure/rebase-floor-reference.d.ts.map +1 -0
- package/dist/commands/structure/rebase-floor-reference.js +90 -0
- package/dist/commands/structure/resize-mezzanine.d.ts +8 -0
- package/dist/commands/structure/resize-mezzanine.d.ts.map +1 -0
- package/dist/commands/structure/resize-mezzanine.js +43 -0
- package/dist/commands/structure/rotate-zone.d.ts +8 -0
- package/dist/commands/structure/rotate-zone.d.ts.map +1 -0
- package/dist/commands/structure/rotate-zone.js +28 -0
- package/dist/commands/structure/set-floor-foundation.d.ts +62 -0
- package/dist/commands/structure/set-floor-foundation.d.ts.map +1 -0
- package/dist/commands/structure/set-floor-foundation.js +162 -0
- package/dist/commands/structure/set-room-floor-construction.d.ts +8 -0
- package/dist/commands/structure/set-room-floor-construction.d.ts.map +1 -0
- package/dist/commands/structure/set-room-floor-construction.js +72 -0
- package/dist/commands/structure/set-wall-geometry.d.ts +10 -0
- package/dist/commands/structure/set-wall-geometry.d.ts.map +1 -0
- package/dist/commands/structure/set-wall-geometry.js +52 -0
- package/dist/commands/structure/set-zone-edges.d.ts +14 -0
- package/dist/commands/structure/set-zone-edges.d.ts.map +1 -0
- package/dist/commands/structure/set-zone-edges.js +143 -0
- package/dist/commands/structure/set-zone-intent.d.ts +39 -0
- package/dist/commands/structure/set-zone-intent.d.ts.map +1 -0
- package/dist/commands/structure/set-zone-intent.js +125 -0
- package/dist/commands/structure/shared.d.ts +4512 -0
- package/dist/commands/structure/shared.d.ts.map +1 -0
- package/dist/commands/structure/shared.js +102 -0
- package/dist/commands/structure/transform-zone.d.ts +23 -0
- package/dist/commands/structure/transform-zone.d.ts.map +1 -0
- package/dist/commands/structure/transform-zone.js +472 -0
- package/dist/commands/structure/validate-mezzanine.d.ts +5 -0
- package/dist/commands/structure/validate-mezzanine.d.ts.map +1 -0
- package/dist/commands/structure/validate-mezzanine.js +46 -0
- package/dist/commands/structure/zone-crossings.d.ts +8 -0
- package/dist/commands/structure/zone-crossings.d.ts.map +1 -0
- package/dist/commands/structure/zone-crossings.js +162 -0
- package/dist/commands/structure/zone-drop.d.ts +4 -0
- package/dist/commands/structure/zone-drop.d.ts.map +1 -0
- package/dist/commands/structure/zone-drop.js +68 -0
- package/dist/commands/structure/zone-insertion.d.ts +4 -0
- package/dist/commands/structure/zone-insertion.d.ts.map +1 -0
- package/dist/commands/structure/zone-insertion.js +200 -0
- package/dist/commands/structure/zone-transform-content.d.ts +6 -0
- package/dist/commands/structure/zone-transform-content.d.ts.map +1 -0
- package/dist/commands/structure/zone-transform-content.js +117 -0
- package/dist/commands/structure/zone-wall-merge.d.ts +4977 -0
- package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -0
- package/dist/commands/structure/zone-wall-merge.js +135 -0
- package/dist/contracts/reference-discovery.d.ts +18 -0
- package/dist/contracts/reference-discovery.d.ts.map +1 -0
- package/dist/contracts/reference-discovery.js +100 -0
- package/dist/contracts/reference-inventory.d.ts +44 -0
- package/dist/contracts/reference-inventory.d.ts.map +1 -0
- package/dist/contracts/reference-inventory.js +872 -0
- package/dist/events/bus.d.ts +70 -9
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/hooks/scene-registry/item-clip-registry.d.ts +6 -3
- package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -1
- package/dist/hooks/scene-registry/item-clip-registry.js +2 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.js +15 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +3 -2
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +53 -66
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +1650 -131
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +86 -83
- package/dist/hooks/spatial-grid/support-host-patch.d.ts +1 -0
- package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/support-host-patch.js +12 -5
- package/dist/index.d.ts +83 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -11
- package/dist/lib/__bench__/near-linear-walls.d.ts +2 -0
- package/dist/lib/__bench__/near-linear-walls.d.ts.map +1 -0
- package/dist/lib/__bench__/near-linear-walls.js +24 -0
- package/dist/lib/__bench__/structure-preview.bench.d.ts +2 -0
- package/dist/lib/__bench__/structure-preview.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/structure-preview.bench.js +72 -0
- package/dist/lib/__fixtures__/mezzanine.d.ts +13968 -0
- package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -0
- package/dist/lib/__fixtures__/mezzanine.js +43 -0
- package/dist/lib/absorb-wall-separators.d.ts +4483 -0
- package/dist/lib/absorb-wall-separators.d.ts.map +1 -0
- package/dist/lib/absorb-wall-separators.js +65 -0
- package/dist/lib/angle-accumulator.d.ts +3 -0
- package/dist/lib/angle-accumulator.d.ts.map +1 -0
- package/dist/lib/angle-accumulator.js +13 -0
- package/dist/lib/artifact-store.d.ts +31 -0
- package/dist/lib/artifact-store.d.ts.map +1 -0
- package/dist/lib/artifact-store.js +42 -0
- package/dist/lib/assembly-stack.d.ts +54 -0
- package/dist/lib/assembly-stack.d.ts.map +1 -0
- package/dist/lib/assembly-stack.js +52 -0
- package/dist/lib/asset-storage.d.ts.map +1 -1
- package/dist/lib/asset-storage.js +3 -0
- package/dist/lib/canonical-opening-ring.d.ts +3 -0
- package/dist/lib/canonical-opening-ring.d.ts.map +1 -0
- package/dist/lib/canonical-opening-ring.js +14 -0
- package/dist/lib/ceiling-children.d.ts +8 -0
- package/dist/lib/ceiling-children.d.ts.map +1 -0
- package/dist/lib/ceiling-children.js +36 -0
- package/dist/lib/ceiling-surface.d.ts +40 -0
- package/dist/lib/ceiling-surface.d.ts.map +1 -0
- package/dist/lib/ceiling-surface.js +65 -0
- package/dist/lib/cutter-host.d.ts +5 -0
- package/dist/lib/cutter-host.d.ts.map +1 -0
- package/dist/lib/cutter-host.js +30 -0
- package/dist/lib/floor-construction-lift.d.ts +4 -0
- package/dist/lib/floor-construction-lift.d.ts.map +1 -0
- package/dist/lib/floor-construction-lift.js +54 -0
- package/dist/lib/floor-footprint-key.d.ts +3 -0
- package/dist/lib/floor-footprint-key.d.ts.map +1 -0
- package/dist/lib/floor-footprint-key.js +9 -0
- package/dist/lib/floor-footprint-name.d.ts +11 -0
- package/dist/lib/floor-footprint-name.d.ts.map +1 -0
- package/dist/lib/floor-footprint-name.js +52 -0
- package/dist/lib/floor-foundation-datum.d.ts +31 -0
- package/dist/lib/floor-foundation-datum.d.ts.map +1 -0
- package/dist/lib/floor-foundation-datum.js +226 -0
- package/dist/lib/floor-foundation-stack.d.ts +16 -0
- package/dist/lib/floor-foundation-stack.d.ts.map +1 -0
- package/dist/lib/floor-foundation-stack.js +214 -0
- package/dist/lib/floor-intent-changes.d.ts +10 -0
- package/dist/lib/floor-intent-changes.d.ts.map +1 -0
- package/dist/lib/floor-intent-changes.js +461 -0
- package/dist/lib/floor-opening-footprints.d.ts +24 -0
- package/dist/lib/floor-opening-footprints.d.ts.map +1 -0
- package/dist/lib/floor-opening-footprints.js +127 -0
- package/dist/lib/floor-opening-intent.d.ts +16 -0
- package/dist/lib/floor-opening-intent.d.ts.map +1 -0
- package/dist/lib/floor-opening-intent.js +82 -0
- package/dist/lib/floor-plate-id.d.ts +5 -0
- package/dist/lib/floor-plate-id.d.ts.map +1 -0
- package/dist/lib/floor-plate-id.js +20 -0
- package/dist/lib/floor-plate-paint.d.ts +8 -0
- package/dist/lib/floor-plate-paint.d.ts.map +1 -0
- package/dist/lib/floor-plate-paint.js +11 -0
- package/dist/lib/floor-plates.d.ts +211 -0
- package/dist/lib/floor-plates.d.ts.map +1 -0
- package/dist/lib/floor-plates.js +729 -0
- package/dist/lib/floor-room-faces.d.ts +5 -0
- package/dist/lib/floor-room-faces.d.ts.map +1 -0
- package/dist/lib/floor-room-faces.js +29 -0
- package/dist/lib/floor-step-finish.d.ts +49 -0
- package/dist/lib/floor-step-finish.d.ts.map +1 -0
- package/dist/lib/floor-step-finish.js +128 -0
- package/dist/lib/geometry-script-node.d.ts +82 -0
- package/dist/lib/geometry-script-node.d.ts.map +1 -0
- package/dist/lib/geometry-script-node.js +147 -0
- package/dist/lib/geometry-surfaces.d.ts +61 -0
- package/dist/lib/geometry-surfaces.d.ts.map +1 -0
- package/dist/lib/geometry-surfaces.js +156 -0
- package/dist/lib/item-slab-support.d.ts +14 -0
- package/dist/lib/item-slab-support.d.ts.map +1 -0
- package/dist/lib/item-slab-support.js +40 -0
- package/dist/lib/level-footprints.d.ts +23 -0
- package/dist/lib/level-footprints.d.ts.map +1 -0
- package/dist/lib/level-footprints.js +398 -0
- package/dist/lib/level-name.d.ts +7 -0
- package/dist/lib/level-name.d.ts.map +1 -1
- package/dist/lib/level-name.js +11 -3
- package/dist/lib/new-zone.d.ts +10 -0
- package/dist/lib/new-zone.d.ts.map +1 -0
- package/dist/lib/new-zone.js +10 -0
- package/dist/lib/node-ancestry.d.ts +30 -0
- package/dist/lib/node-ancestry.d.ts.map +1 -0
- package/dist/lib/node-ancestry.js +76 -0
- package/dist/lib/node-visibility.d.ts +12 -0
- package/dist/lib/node-visibility.d.ts.map +1 -0
- package/dist/lib/node-visibility.js +12 -0
- package/dist/lib/object-cuts.d.ts +11 -0
- package/dist/lib/object-cuts.d.ts.map +1 -0
- package/dist/lib/object-cuts.js +63 -0
- package/dist/lib/opening-floor-datum.d.ts +24 -0
- package/dist/lib/opening-floor-datum.d.ts.map +1 -0
- package/dist/lib/opening-floor-datum.js +145 -0
- package/dist/lib/own-floor-intent.d.ts +15 -0
- package/dist/lib/own-floor-intent.d.ts.map +1 -0
- package/dist/lib/own-floor-intent.js +201 -0
- package/dist/lib/plate-reference.d.ts +3 -0
- package/dist/lib/plate-reference.d.ts.map +1 -0
- package/dist/lib/plate-reference.js +91 -0
- package/dist/lib/plate-surface.d.ts +120 -0
- package/dist/lib/plate-surface.d.ts.map +1 -0
- package/dist/lib/plate-surface.js +725 -0
- package/dist/lib/polygon-boolean.d.ts +17 -0
- package/dist/lib/polygon-boolean.d.ts.map +1 -0
- package/dist/lib/polygon-boolean.js +195 -0
- package/dist/lib/polygon-label.d.ts +7 -0
- package/dist/lib/polygon-label.d.ts.map +1 -0
- package/dist/lib/polygon-label.js +94 -0
- package/dist/lib/room-drawn-floor.d.ts +29 -0
- package/dist/lib/room-drawn-floor.d.ts.map +1 -0
- package/dist/lib/room-drawn-floor.js +88 -0
- package/dist/lib/room-floor-choices.d.ts +11 -0
- package/dist/lib/room-floor-choices.d.ts.map +1 -0
- package/dist/lib/room-floor-choices.js +60 -0
- package/dist/lib/room-floor-feasibility.d.ts +25 -0
- package/dist/lib/room-floor-feasibility.d.ts.map +1 -0
- package/dist/lib/room-floor-feasibility.js +293 -0
- package/dist/lib/room-floor-plate.d.ts +3 -0
- package/dist/lib/room-floor-plate.d.ts.map +1 -0
- package/dist/lib/room-floor-plate.js +4 -0
- package/dist/lib/room-graph.d.ts +79 -0
- package/dist/lib/room-graph.d.ts.map +1 -0
- package/dist/lib/room-graph.js +1265 -0
- package/dist/lib/room-name.d.ts +10 -0
- package/dist/lib/room-name.d.ts.map +1 -0
- package/dist/lib/room-name.js +22 -0
- package/dist/lib/room-topology-index.d.ts +53 -5
- package/dist/lib/room-topology-index.d.ts.map +1 -1
- package/dist/lib/room-topology-index.js +176 -30
- package/dist/lib/room-vertical-placement.d.ts +12 -0
- package/dist/lib/room-vertical-placement.d.ts.map +1 -0
- package/dist/lib/room-vertical-placement.js +28 -0
- package/dist/lib/room-zone-adoption.d.ts +74 -0
- package/dist/lib/room-zone-adoption.d.ts.map +1 -0
- package/dist/lib/room-zone-adoption.js +150 -0
- package/dist/lib/setback-envelope.d.ts +73 -0
- package/dist/lib/setback-envelope.d.ts.map +1 -0
- package/dist/lib/setback-envelope.js +506 -0
- package/dist/lib/slab-polygon.d.ts.map +1 -1
- package/dist/lib/slab-polygon.js +33 -12
- package/dist/lib/slots.d.ts +20 -0
- package/dist/lib/slots.d.ts.map +1 -1
- package/dist/lib/slots.js +44 -0
- package/dist/lib/space-detection.d.ts +14 -94
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +244 -1616
- package/dist/lib/structure-commit.d.ts +38 -0
- package/dist/lib/structure-commit.d.ts.map +1 -0
- package/dist/lib/structure-commit.js +52 -0
- package/dist/lib/structure-kernel.d.ts +66 -0
- package/dist/lib/structure-kernel.d.ts.map +1 -0
- package/dist/lib/structure-kernel.js +735 -0
- package/dist/lib/structure-reconcile.d.ts +15 -0
- package/dist/lib/structure-reconcile.d.ts.map +1 -0
- package/dist/lib/structure-reconcile.js +218 -0
- package/dist/lib/terrain-contours.d.ts +29 -0
- package/dist/lib/terrain-contours.d.ts.map +1 -0
- package/dist/lib/terrain-contours.js +199 -0
- package/dist/lib/terrain-source-persisted.d.ts +42 -0
- package/dist/lib/terrain-source-persisted.d.ts.map +1 -0
- package/dist/lib/terrain-source-persisted.js +68 -0
- package/dist/lib/terrain-source.d.ts +2 -40
- package/dist/lib/terrain-source.d.ts.map +1 -1
- package/dist/lib/terrain-source.js +2 -68
- package/dist/lib/terrain-support-query.d.ts +83 -0
- package/dist/lib/terrain-support-query.d.ts.map +1 -0
- package/dist/lib/terrain-support-query.js +187 -0
- package/dist/lib/terrain-support.d.ts +1 -77
- package/dist/lib/terrain-support.d.ts.map +1 -1
- package/dist/lib/terrain-support.js +3 -181
- package/dist/lib/unit-containment.js +2 -2
- package/dist/lib/unit-report.d.ts.map +1 -1
- package/dist/lib/unit-report.js +5 -4
- package/dist/lib/zone-colors.d.ts +11 -0
- package/dist/lib/zone-colors.d.ts.map +1 -0
- package/dist/lib/zone-colors.js +32 -0
- package/dist/lib/zone-quantities.d.ts.map +1 -1
- package/dist/lib/zone-quantities.js +113 -223
- package/dist/material-library.d.ts +9 -1
- package/dist/material-library.d.ts.map +1 -1
- package/dist/material-library.js +550 -1
- package/dist/node-slots/block.d.ts +7 -0
- package/dist/node-slots/block.d.ts.map +1 -0
- package/dist/node-slots/block.js +27 -0
- package/dist/node-slots/cabinet.d.ts +4 -0
- package/dist/node-slots/cabinet.d.ts.map +1 -0
- package/dist/node-slots/cabinet.js +24 -0
- package/dist/node-slots/ceiling.d.ts +6 -0
- package/dist/node-slots/ceiling.d.ts.map +1 -0
- package/dist/node-slots/ceiling.js +7 -0
- package/dist/node-slots/column.d.ts +9 -0
- package/dist/node-slots/column.d.ts.map +1 -0
- package/dist/node-slots/column.js +24 -0
- package/dist/node-slots/door.d.ts +9 -0
- package/dist/node-slots/door.d.ts.map +1 -0
- package/dist/node-slots/door.js +20 -0
- package/dist/node-slots/duct.d.ts +5 -0
- package/dist/node-slots/duct.d.ts.map +1 -0
- package/dist/node-slots/duct.js +5 -0
- package/dist/node-slots/elevator.d.ts +9 -0
- package/dist/node-slots/elevator.d.ts.map +1 -0
- package/dist/node-slots/elevator.js +17 -0
- package/dist/node-slots/fence.d.ts +10 -0
- package/dist/node-slots/fence.d.ts.map +1 -0
- package/dist/node-slots/fence.js +23 -0
- package/dist/node-slots/index.d.ts +25 -0
- package/dist/node-slots/index.d.ts.map +1 -0
- package/dist/node-slots/index.js +92 -0
- package/dist/node-slots/lean-to-extension.d.ts +5 -0
- package/dist/node-slots/lean-to-extension.d.ts.map +1 -0
- package/dist/node-slots/lean-to-extension.js +15 -0
- package/dist/node-slots/procedural-item.d.ts +4 -0
- package/dist/node-slots/procedural-item.d.ts.map +1 -0
- package/dist/node-slots/procedural-item.js +3 -0
- package/dist/node-slots/roof-accessories.d.ts +9 -0
- package/dist/node-slots/roof-accessories.d.ts.map +1 -0
- package/dist/node-slots/roof-accessories.js +34 -0
- package/dist/node-slots/shelf.d.ts +9 -0
- package/dist/node-slots/shelf.d.ts.map +1 -0
- package/dist/node-slots/shelf.js +30 -0
- package/dist/node-slots/slab.d.ts +7 -0
- package/dist/node-slots/slab.d.ts.map +1 -0
- package/dist/node-slots/slab.js +21 -0
- package/dist/node-slots/stair.d.ts +8 -0
- package/dist/node-slots/stair.d.ts.map +1 -0
- package/dist/node-slots/stair.js +17 -0
- package/dist/node-slots/wall.d.ts +12 -0
- package/dist/node-slots/wall.d.ts.map +1 -0
- package/dist/node-slots/wall.js +55 -0
- package/dist/node-slots/window.d.ts +5 -0
- package/dist/node-slots/window.d.ts.map +1 -0
- package/dist/node-slots/window.js +11 -0
- package/dist/procedural-items/design-placement.d.ts +49 -0
- package/dist/procedural-items/design-placement.d.ts.map +1 -0
- package/dist/procedural-items/design-placement.js +129 -0
- package/dist/procedural-items/design.d.ts +261 -0
- package/dist/procedural-items/design.d.ts.map +1 -0
- package/dist/procedural-items/design.js +707 -0
- package/dist/procedural-items/fixtures.d.ts +464 -24
- package/dist/procedural-items/fixtures.d.ts.map +1 -1
- package/dist/procedural-items/index.d.ts +5 -0
- package/dist/procedural-items/index.d.ts.map +1 -1
- package/dist/procedural-items/index.js +5 -0
- package/dist/procedural-items/integration.d.ts +127 -6
- package/dist/procedural-items/integration.d.ts.map +1 -1
- package/dist/procedural-items/joints.d.ts +56 -0
- package/dist/procedural-items/joints.d.ts.map +1 -0
- package/dist/procedural-items/joints.js +251 -0
- package/dist/procedural-items/library-colors.d.ts +12 -0
- package/dist/procedural-items/library-colors.d.ts.map +1 -1
- package/dist/procedural-items/library-colors.js +37 -3
- package/dist/procedural-items/motion-controller.d.ts +29 -0
- package/dist/procedural-items/motion-controller.d.ts.map +1 -0
- package/dist/procedural-items/motion-controller.js +130 -0
- package/dist/procedural-items/node.d.ts +490 -24
- package/dist/procedural-items/node.d.ts.map +1 -1
- package/dist/procedural-items/query.d.ts +19 -1
- package/dist/procedural-items/query.d.ts.map +1 -1
- package/dist/procedural-items/query.js +131 -48
- package/dist/procedural-items/recipe.d.ts +258 -14
- package/dist/procedural-items/recipe.d.ts.map +1 -1
- package/dist/procedural-items/recipe.js +933 -61
- package/dist/procedural-items/section.d.ts +27 -0
- package/dist/procedural-items/section.d.ts.map +1 -0
- package/dist/procedural-items/section.js +237 -0
- package/dist/procedural-items/spatial.d.ts +21 -0
- package/dist/procedural-items/spatial.d.ts.map +1 -1
- package/dist/procedural-items/spatial.js +90 -0
- package/dist/registry/handles.d.ts +30 -1
- package/dist/registry/handles.d.ts.map +1 -1
- package/dist/registry/index.d.ts +7 -5
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +4 -2
- package/dist/registry/mechanism.d.ts +9 -0
- package/dist/registry/mechanism.d.ts.map +1 -0
- package/dist/registry/mechanism.js +21 -0
- package/dist/registry/registry.d.ts +6 -3
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +59 -22
- package/dist/registry/scene-api.d.ts +20 -0
- package/dist/registry/scene-api.d.ts.map +1 -1
- package/dist/registry/scene-api.js +26 -13
- package/dist/registry/subtree.d.ts +8 -0
- package/dist/registry/subtree.d.ts.map +1 -1
- package/dist/registry/subtree.js +59 -0
- package/dist/registry/types.d.ts +352 -13
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
- package/dist/schema/__fixtures__/node-fixtures.js +2 -0
- package/dist/schema/assembly.d.ts +153 -0
- package/dist/schema/assembly.d.ts.map +1 -0
- package/dist/schema/assembly.js +155 -0
- package/dist/schema/asset-url.d.ts +2 -1
- package/dist/schema/asset-url.d.ts.map +1 -1
- package/dist/schema/asset-url.js +5 -2
- package/dist/schema/base.d.ts +26 -0
- package/dist/schema/base.d.ts.map +1 -1
- package/dist/schema/base.js +2 -0
- package/dist/schema/collection-templates.d.ts +46 -0
- package/dist/schema/collection-templates.d.ts.map +1 -0
- package/dist/schema/collection-templates.js +14 -0
- package/dist/schema/collections.d.ts +7 -0
- package/dist/schema/collections.d.ts.map +1 -1
- package/dist/schema/cut.d.ts +29 -0
- package/dist/schema/cut.d.ts.map +1 -0
- package/dist/schema/cut.js +50 -0
- package/dist/schema/geometry-metadata.d.ts +51 -0
- package/dist/schema/geometry-metadata.d.ts.map +1 -0
- package/dist/schema/geometry-metadata.js +57 -0
- package/dist/schema/geometry-source.d.ts +250 -0
- package/dist/schema/geometry-source.d.ts.map +1 -0
- package/dist/schema/geometry-source.js +130 -0
- package/dist/schema/index.d.ts +20 -7
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +22 -5
- package/dist/schema/nodes/block.d.ts +28 -2
- package/dist/schema/nodes/block.d.ts.map +1 -1
- package/dist/schema/nodes/block.js +22 -9
- package/dist/schema/nodes/box-vent.d.ts +26 -0
- package/dist/schema/nodes/box-vent.d.ts.map +1 -1
- package/dist/schema/nodes/building.d.ts +26 -0
- package/dist/schema/nodes/building.d.ts.map +1 -1
- package/dist/schema/nodes/cabinet.d.ts +61 -9
- package/dist/schema/nodes/cabinet.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.d.ts +37 -0
- package/dist/schema/nodes/ceiling.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.js +8 -0
- package/dist/schema/nodes/chimney.d.ts +26 -0
- package/dist/schema/nodes/chimney.d.ts.map +1 -1
- package/dist/schema/nodes/column.d.ts +126 -0
- package/dist/schema/nodes/column.d.ts.map +1 -1
- package/dist/schema/nodes/column.js +2 -0
- package/dist/schema/nodes/construction-dimension.d.ts +26 -0
- package/dist/schema/nodes/construction-dimension.d.ts.map +1 -1
- package/dist/schema/nodes/cupola.d.ts +26 -0
- package/dist/schema/nodes/cupola.d.ts.map +1 -1
- package/dist/schema/nodes/curtain-wall.d.ts +129 -0
- package/dist/schema/nodes/curtain-wall.d.ts.map +1 -0
- package/dist/schema/nodes/curtain-wall.js +49 -0
- package/dist/schema/nodes/door.d.ts +141 -22
- package/dist/schema/nodes/door.d.ts.map +1 -1
- package/dist/schema/nodes/door.js +18 -33
- package/dist/schema/nodes/dormer.d.ts +28 -2
- package/dist/schema/nodes/dormer.d.ts.map +1 -1
- package/dist/schema/nodes/downspout.d.ts +27 -1
- package/dist/schema/nodes/downspout.d.ts.map +1 -1
- package/dist/schema/nodes/duct-fitting.d.ts +27 -1
- package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/duct-segment.d.ts +27 -1
- package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
- package/dist/schema/nodes/duct-terminal.d.ts +26 -0
- package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
- package/dist/schema/nodes/elevator.d.ts +26 -0
- package/dist/schema/nodes/elevator.d.ts.map +1 -1
- package/dist/schema/nodes/eyebrow-vent.d.ts +26 -0
- package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
- package/dist/schema/nodes/fence-feature.d.ts +141 -0
- package/dist/schema/nodes/fence-feature.d.ts.map +1 -0
- package/dist/schema/nodes/fence-feature.js +21 -0
- package/dist/schema/nodes/fence.d.ts +186 -0
- package/dist/schema/nodes/fence.d.ts.map +1 -1
- package/dist/schema/nodes/fence.js +92 -7
- package/dist/schema/nodes/floor-opening.d.ts +61 -0
- package/dist/schema/nodes/floor-opening.d.ts.map +1 -0
- package/dist/schema/nodes/floor-opening.js +17 -0
- package/dist/schema/nodes/guide.d.ts +26 -0
- package/dist/schema/nodes/guide.d.ts.map +1 -1
- package/dist/schema/nodes/gutter.d.ts +26 -0
- package/dist/schema/nodes/gutter.d.ts.map +1 -1
- package/dist/schema/nodes/hvac-equipment.d.ts +26 -0
- package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
- package/dist/schema/nodes/imported-mesh.d.ts +26 -0
- package/dist/schema/nodes/imported-mesh.d.ts.map +1 -1
- package/dist/schema/nodes/item.d.ts +153 -2
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +13 -0
- package/dist/schema/nodes/lean-to-extension.d.ts +26 -0
- package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -1
- package/dist/schema/nodes/level.d.ts +27 -1
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/lineset.d.ts +26 -0
- package/dist/schema/nodes/lineset.d.ts.map +1 -1
- package/dist/schema/nodes/liquid-line.d.ts +26 -0
- package/dist/schema/nodes/liquid-line.d.ts.map +1 -1
- package/dist/schema/nodes/measurement.d.ts +26 -0
- package/dist/schema/nodes/measurement.d.ts.map +1 -1
- package/dist/schema/nodes/opening-types.d.ts +41 -0
- package/dist/schema/nodes/opening-types.d.ts.map +1 -0
- package/dist/schema/nodes/opening-types.js +48 -0
- package/dist/schema/nodes/pipe-fitting.d.ts +26 -0
- package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-segment.d.ts +26 -0
- package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-trap.d.ts +26 -0
- package/dist/schema/nodes/pipe-trap.d.ts.map +1 -1
- package/dist/schema/nodes/ridge-vent.d.ts +26 -0
- package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-walls.js +2 -1
- package/dist/schema/nodes/roof-segment.d.ts +30 -2
- package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment.js +9 -0
- package/dist/schema/nodes/roof.d.ts +101 -0
- package/dist/schema/nodes/roof.d.ts.map +1 -1
- package/dist/schema/nodes/roof.js +6 -0
- package/dist/schema/nodes/scan.d.ts +26 -0
- package/dist/schema/nodes/scan.d.ts.map +1 -1
- package/dist/schema/nodes/separator.d.ts +50 -0
- package/dist/schema/nodes/separator.d.ts.map +1 -0
- package/dist/schema/nodes/separator.js +8 -0
- package/dist/schema/nodes/shelf.d.ts +26 -0
- package/dist/schema/nodes/shelf.d.ts.map +1 -1
- package/dist/schema/nodes/site.d.ts +192 -0
- package/dist/schema/nodes/site.d.ts.map +1 -1
- package/dist/schema/nodes/site.js +178 -1
- package/dist/schema/nodes/skylight.d.ts +30 -4
- package/dist/schema/nodes/skylight.d.ts.map +1 -1
- package/dist/schema/nodes/slab.d.ts +84 -0
- package/dist/schema/nodes/slab.d.ts.map +1 -1
- package/dist/schema/nodes/slab.js +37 -2
- package/dist/schema/nodes/solar-panel.d.ts +26 -0
- package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
- package/dist/schema/nodes/spawn.d.ts +26 -0
- package/dist/schema/nodes/spawn.d.ts.map +1 -1
- package/dist/schema/nodes/stair-construction.d.ts +21 -0
- package/dist/schema/nodes/stair-construction.d.ts.map +1 -0
- package/dist/schema/nodes/stair-construction.js +13 -0
- package/dist/schema/nodes/stair-design-targets.d.ts +9 -0
- package/dist/schema/nodes/stair-design-targets.d.ts.map +1 -0
- package/dist/schema/nodes/stair-design-targets.js +7 -0
- package/dist/schema/nodes/stair-segment.d.ts +72 -4
- package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
- package/dist/schema/nodes/stair-segment.js +13 -0
- package/dist/schema/nodes/stair.d.ts +119 -2
- package/dist/schema/nodes/stair.d.ts.map +1 -1
- package/dist/schema/nodes/stair.js +59 -2
- package/dist/schema/nodes/structural-grid.d.ts +26 -0
- package/dist/schema/nodes/structural-grid.d.ts.map +1 -1
- package/dist/schema/nodes/surface-hole-metadata.d.ts +3 -0
- package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
- package/dist/schema/nodes/surface-hole-metadata.js +2 -1
- package/dist/schema/nodes/surface-paint-region.d.ts +14 -0
- package/dist/schema/nodes/surface-paint-region.d.ts.map +1 -0
- package/dist/schema/nodes/surface-paint-region.js +12 -0
- package/dist/schema/nodes/turbine-vent.d.ts +26 -0
- package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
- package/dist/schema/nodes/unit.d.ts +26 -0
- package/dist/schema/nodes/unit.d.ts.map +1 -1
- package/dist/schema/nodes/wall.d.ts +423 -59
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +188 -186
- package/dist/schema/nodes/window.d.ts +139 -20
- package/dist/schema/nodes/window.d.ts.map +1 -1
- package/dist/schema/nodes/window.js +12 -14
- package/dist/schema/nodes/zone.d.ts +69 -1
- package/dist/schema/nodes/zone.d.ts.map +1 -1
- package/dist/schema/nodes/zone.js +46 -0
- package/dist/schema/provenance.d.ts +118 -0
- package/dist/schema/provenance.d.ts.map +1 -0
- package/dist/schema/provenance.js +76 -0
- package/dist/schema/source-ref.d.ts +23 -0
- package/dist/schema/source-ref.d.ts.map +1 -0
- package/dist/schema/source-ref.js +29 -0
- package/dist/schema/types.d.ts +3389 -67
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +7 -0
- package/dist/services/__fixtures__/hosting.d.ts +3 -0
- package/dist/services/__fixtures__/hosting.d.ts.map +1 -0
- package/dist/services/__fixtures__/hosting.js +9 -0
- package/dist/services/__fixtures__/shelf-surface-rows.d.ts +4 -0
- package/dist/services/__fixtures__/shelf-surface-rows.d.ts.map +1 -0
- package/dist/services/__fixtures__/shelf-surface-rows.js +18 -0
- package/dist/services/alignment-anchors.d.ts +2 -1
- package/dist/services/alignment-anchors.d.ts.map +1 -1
- package/dist/services/alignment-anchors.js +9 -6
- package/dist/services/hosting.d.ts +3 -0
- package/dist/services/hosting.d.ts.map +1 -1
- package/dist/services/hosting.js +24 -7
- package/dist/services/index.d.ts +4 -4
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +4 -4
- package/dist/services/level-height.d.ts.map +1 -1
- package/dist/services/level-height.js +6 -4
- package/dist/services/snap.d.ts +3 -0
- package/dist/services/snap.d.ts.map +1 -1
- package/dist/services/snap.js +11 -0
- package/dist/services/storey.d.ts +21 -1
- package/dist/services/storey.d.ts.map +1 -1
- package/dist/services/storey.js +94 -8
- package/dist/services/surface-hosting.d.ts +6 -2
- package/dist/services/surface-hosting.d.ts.map +1 -1
- package/dist/services/surface-hosting.js +51 -11
- package/dist/store/actions/node-actions.d.ts +4563 -8
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +497 -269
- package/dist/store/derived-node-guard.d.ts +84 -0
- package/dist/store/derived-node-guard.d.ts.map +1 -0
- package/dist/store/derived-node-guard.js +586 -0
- package/dist/store/history-control.d.ts +34 -0
- package/dist/store/history-control.d.ts.map +1 -1
- package/dist/store/history-control.js +99 -1
- package/dist/store/history-drafts.d.ts +48 -0
- package/dist/store/history-drafts.d.ts.map +1 -0
- package/dist/store/history-drafts.js +403 -0
- package/dist/store/history-invalidation.d.ts.map +1 -1
- package/dist/store/history-invalidation.js +1 -0
- package/dist/store/item-interaction.d.ts +28 -0
- package/dist/store/item-interaction.d.ts.map +1 -0
- package/dist/store/item-interaction.js +34 -0
- package/dist/store/registered-node-defaults.d.ts +11 -0
- package/dist/store/registered-node-defaults.d.ts.map +1 -0
- package/dist/store/registered-node-defaults.js +25 -0
- package/dist/store/scene-annotations.d.ts +8969 -0
- package/dist/store/scene-annotations.d.ts.map +1 -0
- package/dist/store/scene-annotations.js +107 -0
- package/dist/store/use-interactive.d.ts +23 -1
- package/dist/store/use-interactive.d.ts.map +1 -1
- package/dist/store/use-interactive.js +128 -5
- package/dist/store/use-scene.d.ts +68 -12
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +429 -306
- package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-opening-sync.js +4 -6
- package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-opening-system.js +12 -6
- package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-service.js +8 -3
- package/dist/systems/fence/fence-centerline.d.ts.map +1 -1
- package/dist/systems/fence/fence-centerline.js +6 -5
- package/dist/systems/fence/fence-features.d.ts +36 -0
- package/dist/systems/fence/fence-features.d.ts.map +1 -0
- package/dist/systems/fence/fence-features.js +105 -0
- package/dist/systems/fence/fence-spline.d.ts +8 -5
- package/dist/systems/fence/fence-spline.d.ts.map +1 -1
- package/dist/systems/fence/fence-spline.js +51 -16
- package/dist/systems/owned-floor-openings.d.ts +9 -0
- package/dist/systems/owned-floor-openings.d.ts.map +1 -0
- package/dist/systems/owned-floor-openings.js +326 -0
- package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -0
- package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -0
- package/dist/systems/reconcile-owned-floor-openings.js +25 -0
- package/dist/systems/slab/__fixtures__/doorway-steps.d.ts +8 -0
- package/dist/systems/slab/__fixtures__/doorway-steps.d.ts.map +1 -0
- package/dist/systems/slab/__fixtures__/doorway-steps.js +62 -0
- package/dist/systems/slab/__fixtures__/floor-step.d.ts +5636 -0
- package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -0
- package/dist/systems/slab/__fixtures__/floor-step.js +66 -0
- package/dist/systems/slab/__fixtures__/raised-room.d.ts +5775 -0
- package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -0
- package/dist/systems/slab/__fixtures__/raised-room.js +54 -0
- package/dist/systems/slab/ensure-slab-openings.d.ts +9 -0
- package/dist/systems/slab/ensure-slab-openings.d.ts.map +1 -0
- package/dist/systems/slab/ensure-slab-openings.js +41 -0
- package/dist/systems/slab/slab-support.d.ts +25 -6
- package/dist/systems/slab/slab-support.d.ts.map +1 -1
- package/dist/systems/slab/slab-support.js +471 -54
- package/dist/systems/stair/stair-base-elevation.d.ts +3 -0
- package/dist/systems/stair/stair-base-elevation.d.ts.map +1 -0
- package/dist/systems/stair/stair-base-elevation.js +49 -0
- package/dist/systems/stair/stair-clearance.d.ts +39 -0
- package/dist/systems/stair/stair-clearance.d.ts.map +1 -0
- package/dist/systems/stair/stair-clearance.js +508 -0
- package/dist/systems/stair/stair-construction.d.ts +37 -0
- package/dist/systems/stair/stair-construction.d.ts.map +1 -0
- package/dist/systems/stair/stair-construction.js +314 -0
- package/dist/systems/stair/stair-detail-budget.d.ts +13 -0
- package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -0
- package/dist/systems/stair/stair-detail-budget.js +64 -0
- package/dist/systems/stair/stair-flight.d.ts +2 -2
- package/dist/systems/stair/stair-flight.d.ts.map +1 -1
- package/dist/systems/stair/stair-flight.js +4 -3
- package/dist/systems/stair/stair-floor-footprints.d.ts +7 -0
- package/dist/systems/stair/stair-floor-footprints.d.ts.map +1 -0
- package/dist/systems/stair/stair-floor-footprints.js +113 -0
- package/dist/systems/stair/stair-footprint.d.ts +3 -1
- package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
- package/dist/systems/stair/stair-footprint.js +97 -44
- package/dist/systems/stair/stair-layout.d.ts +39 -0
- package/dist/systems/stair/stair-layout.d.ts.map +1 -0
- package/dist/systems/stair/stair-layout.js +58 -0
- package/dist/systems/stair/stair-opening-preview.d.ts +1650 -84
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.d.ts +8 -2
- package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.js +136 -315
- package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-system.js +40 -8
- package/dist/systems/stair/stair-presets.d.ts +276 -0
- package/dist/systems/stair/stair-presets.d.ts.map +1 -0
- package/dist/systems/stair/stair-presets.js +151 -0
- package/dist/systems/stair/stair-rail-budget.d.ts +6 -0
- package/dist/systems/stair/stair-rail-budget.d.ts.map +1 -0
- package/dist/systems/stair/stair-rail-budget.js +36 -0
- package/dist/systems/stair/stair-rail-path.d.ts +22 -0
- package/dist/systems/stair/stair-rail-path.d.ts.map +1 -0
- package/dist/systems/stair/stair-rail-path.js +497 -0
- package/dist/systems/stair/stair-rise-edit.d.ts +9 -0
- package/dist/systems/stair/stair-rise-edit.d.ts.map +1 -0
- package/dist/systems/stair/stair-rise-edit.js +46 -0
- package/dist/systems/stair/stair-rise-query.d.ts +24 -0
- package/dist/systems/stair/stair-rise-query.d.ts.map +1 -0
- package/dist/systems/stair/stair-rise-query.js +125 -0
- package/dist/systems/stair/stair-rise.d.ts +4 -19
- package/dist/systems/stair/stair-rise.d.ts.map +1 -1
- package/dist/systems/stair/stair-rise.js +8 -71
- package/dist/systems/stair/stair-sizing.d.ts +414 -0
- package/dist/systems/stair/stair-sizing.d.ts.map +1 -0
- package/dist/systems/stair/stair-sizing.js +255 -0
- package/dist/systems/stair/stair-sweep-edit.d.ts +7 -0
- package/dist/systems/stair/stair-sweep-edit.d.ts.map +1 -0
- package/dist/systems/stair/stair-sweep-edit.js +8 -0
- package/dist/systems/stair/stair-walking-line.d.ts +5 -0
- package/dist/systems/stair/stair-walking-line.d.ts.map +1 -0
- package/dist/systems/stair/stair-walking-line.js +91 -0
- package/dist/systems/stair/stair-winder.d.ts +36 -0
- package/dist/systems/stair/stair-winder.d.ts.map +1 -0
- package/dist/systems/stair/stair-winder.js +173 -0
- package/dist/systems/wall/wall-assembly.d.ts +234 -0
- package/dist/systems/wall/wall-assembly.d.ts.map +1 -0
- package/dist/systems/wall/wall-assembly.js +854 -0
- package/dist/systems/wall/wall-curve.d.ts +2 -1
- package/dist/systems/wall/wall-curve.d.ts.map +1 -1
- package/dist/systems/wall/wall-curve.js +21 -5
- package/dist/systems/wall/wall-finish.d.ts +102 -0
- package/dist/systems/wall/wall-finish.d.ts.map +1 -0
- package/dist/systems/wall/wall-finish.js +264 -0
- package/dist/systems/wall/wall-footprint.d.ts +3 -0
- package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
- package/dist/systems/wall/wall-footprint.js +15 -13
- package/dist/systems/wall/wall-frame.d.ts +45 -0
- package/dist/systems/wall/wall-frame.d.ts.map +1 -0
- package/dist/systems/wall/wall-frame.js +162 -0
- package/dist/systems/wall/wall-layer-bands.d.ts +38 -0
- package/dist/systems/wall/wall-layer-bands.d.ts.map +1 -0
- package/dist/systems/wall/wall-layer-bands.js +109 -0
- package/dist/systems/wall/wall-merge.d.ts +57 -0
- package/dist/systems/wall/wall-merge.d.ts.map +1 -0
- package/dist/systems/wall/wall-merge.js +411 -0
- package/dist/systems/wall/wall-mitering.d.ts +6 -5
- package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
- package/dist/systems/wall/wall-mitering.js +70 -20
- package/dist/systems/wall/wall-operations.d.ts +28 -0
- package/dist/systems/wall/wall-operations.d.ts.map +1 -0
- package/dist/systems/wall/wall-operations.js +146 -0
- package/dist/systems/wall/wall-paint-plan.d.ts +30 -0
- package/dist/systems/wall/wall-paint-plan.d.ts.map +1 -0
- package/dist/systems/wall/wall-paint-plan.js +167 -0
- package/dist/systems/wall/wall-room-sides.d.ts +6 -0
- package/dist/systems/wall/wall-room-sides.d.ts.map +1 -0
- package/dist/systems/wall/wall-room-sides.js +14 -0
- package/dist/systems/wall/wall-step-openings.d.ts +17 -0
- package/dist/systems/wall/wall-step-openings.d.ts.map +1 -0
- package/dist/systems/wall/wall-step-openings.js +32 -0
- package/dist/systems/wall/wall-top.d.ts +2 -6
- package/dist/systems/wall/wall-top.d.ts.map +1 -1
- package/dist/systems/wall/wall-top.js +3 -9
- package/dist/systems/wall/wall-topology.d.ts +28 -0
- package/dist/systems/wall/wall-topology.d.ts.map +1 -1
- package/dist/systems/wall/wall-topology.js +458 -9
- package/dist/utils/clone-scene-graph.d.ts +6 -0
- package/dist/utils/clone-scene-graph.d.ts.map +1 -1
- package/dist/utils/clone-scene-graph.js +123 -15
- package/dist/utils/ensure-scene-openings.d.ts +8965 -0
- package/dist/utils/ensure-scene-openings.d.ts.map +1 -0
- package/dist/utils/ensure-scene-openings.js +29 -0
- package/dist/utils/exterior-threshold-migration.d.ts +4 -0
- package/dist/utils/exterior-threshold-migration.d.ts.map +1 -0
- package/dist/utils/exterior-threshold-migration.js +114 -0
- package/dist/utils/floor-follow-migration.d.ts +3 -0
- package/dist/utils/floor-follow-migration.d.ts.map +1 -0
- package/dist/utils/floor-follow-migration.js +29 -0
- package/dist/utils/floor-opening-migration.d.ts +13 -0
- package/dist/utils/floor-opening-migration.d.ts.map +1 -0
- package/dist/utils/floor-opening-migration.js +148 -0
- package/dist/utils/floor-piece-adoption.d.ts +50 -0
- package/dist/utils/floor-piece-adoption.d.ts.map +1 -0
- package/dist/utils/floor-piece-adoption.js +182 -0
- package/dist/utils/floor-plate-migration.d.ts +4507 -0
- package/dist/utils/floor-plate-migration.d.ts.map +1 -0
- package/dist/utils/floor-plate-migration.js +1360 -0
- package/dist/utils/heal-plan-coordinates.d.ts +2 -0
- package/dist/utils/heal-plan-coordinates.d.ts.map +1 -0
- package/dist/utils/heal-plan-coordinates.js +69 -0
- package/dist/utils/heal-scene-graph.d.ts +20 -6
- package/dist/utils/heal-scene-graph.d.ts.map +1 -1
- package/dist/utils/heal-scene-graph.js +61 -16
- package/dist/utils/legacy-material-slots.d.ts +23 -0
- package/dist/utils/legacy-material-slots.d.ts.map +1 -0
- package/dist/utils/legacy-material-slots.js +120 -0
- package/dist/utils/legacy-opening-datums.d.ts +11 -0
- package/dist/utils/legacy-opening-datums.d.ts.map +1 -0
- package/dist/utils/legacy-opening-datums.js +92 -0
- package/dist/utils/legacy-wall-datums.d.ts +6 -0
- package/dist/utils/legacy-wall-datums.d.ts.map +1 -0
- package/dist/utils/legacy-wall-datums.js +199 -0
- package/dist/utils/load-migration.d.ts +28 -0
- package/dist/utils/load-migration.d.ts.map +1 -0
- package/dist/utils/load-migration.js +89 -0
- package/dist/utils/node-defaults.d.ts +37 -0
- package/dist/utils/node-defaults.d.ts.map +1 -0
- package/dist/utils/node-defaults.js +96 -0
- package/dist/utils/normalize-legacy-structure.d.ts +2 -0
- package/dist/utils/normalize-legacy-structure.d.ts.map +1 -0
- package/dist/utils/normalize-legacy-structure.js +61 -0
- package/dist/utils/omit-undefined.d.ts +2 -0
- package/dist/utils/omit-undefined.d.ts.map +1 -0
- package/dist/utils/omit-undefined.js +17 -0
- package/dist/utils/owned-floor-opening-migration.d.ts +4489 -0
- package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -0
- package/dist/utils/owned-floor-opening-migration.js +365 -0
- package/dist/utils/reconcile-structure-on-load.d.ts +8965 -0
- package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -0
- package/dist/utils/reconcile-structure-on-load.js +307 -0
- package/dist/utils/room-zone-migration.d.ts +18 -0
- package/dist/utils/room-zone-migration.d.ts.map +1 -0
- package/dist/utils/room-zone-migration.js +258 -0
- package/dist/utils/scene-migrations.d.ts +16 -1
- package/dist/utils/scene-migrations.d.ts.map +1 -1
- package/dist/utils/scene-migrations.js +15 -1
- package/dist/utils/structure-id.d.ts +4 -0
- package/dist/utils/structure-id.d.ts.map +1 -0
- package/dist/utils/structure-id.js +115 -0
- package/dist/utils/vertical-scene-migration.d.ts +8 -8
- package/dist/utils/vertical-scene-migration.d.ts.map +1 -1
- package/dist/utils/vertical-scene-migration.js +18 -8
- package/dist/utils/wall-assembly-migration.d.ts +14 -0
- package/dist/utils/wall-assembly-migration.d.ts.map +1 -0
- package/dist/utils/wall-assembly-migration.js +23 -0
- package/dist/utils/wall-face-migration.d.ts +23 -0
- package/dist/utils/wall-face-migration.d.ts.map +1 -0
- package/dist/utils/wall-face-migration.js +246 -0
- package/dist/validation/opening-bounds.d.ts +36 -0
- package/dist/validation/opening-bounds.d.ts.map +1 -0
- package/dist/validation/opening-bounds.js +34 -0
- package/dist/validation/validate-build-json.d.ts +2 -0
- package/dist/validation/validate-build-json.d.ts.map +1 -1
- package/dist/validation/validate-build-json.js +48 -1
- package/package.json +37 -4
- package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +0 -13
- package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +0 -1
- package/dist/services/surface-hosting-procedural-parity.fixtures.js +0 -4691
- package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +0 -1060
- package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +0 -1
- package/dist/services/surface-hosting-shelf-parity.fixtures.js +0 -3127
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { planWallDeletion } from '../../commands/structure/plan-wall-deletion.js';
|
|
2
|
+
import { withoutFloorStepOverrideKeys } from '../../lib/floor-step-finish.js';
|
|
3
|
+
import { isSpaceDetectionPaused } from '../../lib/space-detection.js';
|
|
1
4
|
import { nodeRegistry } from '../../registry/registry.js';
|
|
2
5
|
import { validateNodeRelations } from '../../registry/validate-relations.js';
|
|
3
|
-
import { AnyNode as AnyNodeSchema, createDefaultGuttersForSegment, createDefaultRidgeVentsForSegment, DownspoutNode as DownspoutNodeSchema, defaultDownspoutMetadata, generateId, getDefaultGutterSide,
|
|
6
|
+
import { AnyNode as AnyNodeSchema, createDefaultGuttersForSegment, createDefaultRidgeVentsForSegment, DownspoutNode as DownspoutNodeSchema, defaultDownspoutMetadata, generateId, getDefaultGutterSide, isAutoGutterEnabled, isAutoRidgeVentEnabled, isDefaultDownspoutNode, isDefaultGutterNode, isDefaultRidgeVentNode, parseNode, planAutomaticDownspouts, resolveAutomaticDownspoutLength, } from '../../schema/index.js';
|
|
7
|
+
import { Provenance } from '../../schema/provenance.js';
|
|
4
8
|
import { constrainWallCurveOffsetToAvoidIntersections } from '../../systems/wall/wall-curve.js';
|
|
9
|
+
import { areWallStylesCompatible, areWallsCollinearAcrossPoint, buildMergedWallAttachmentUpdates, getWallEndpointAtPoint, mergeWallFaceRegions, planMergedZoneReferences, resolveMergedWallEndpoints, } from '../../systems/wall/wall-merge.js';
|
|
10
|
+
import { convertDerivedPlateHoleWrites, DERIVED_WRITER_TOKEN, derivedDeletionIntent, derivedDetachPatch, filterDerivedNodeWrites, isDerivedNode, } from '../derived-node-guard.js';
|
|
5
11
|
import { activeSceneCommitNodeIds, addActiveSceneCommitNodeIds, runWithSceneCommitNodeIds, } from '../history-control.js';
|
|
6
12
|
const DEFAULT_RIDGE_VENT_REFRESH_FIELDS = new Set([
|
|
7
13
|
'roofType',
|
|
@@ -366,12 +372,42 @@ function warnSanitizedNodeMutation(mutation, nodeId, issues) {
|
|
|
366
372
|
// A broken diagnostic sink must not interrupt a node mutation either.
|
|
367
373
|
}
|
|
368
374
|
}
|
|
375
|
+
/**
|
|
376
|
+
* Source ids cannot be repaired the way the numeric fallback repairs a value:
|
|
377
|
+
* any fix would drop or rewrite them (D5). A write that sets an invalid
|
|
378
|
+
* `provenance` throws, whatever the node's kind (a plain plugin kind never
|
|
379
|
+
* reaches a schema that knows the field), so the mutation applies nothing.
|
|
380
|
+
*/
|
|
381
|
+
function assertProvenanceWrite(nodeId, value) {
|
|
382
|
+
if (value === undefined)
|
|
383
|
+
return;
|
|
384
|
+
const parsed = Provenance.safeParse(value);
|
|
385
|
+
if (parsed.success)
|
|
386
|
+
return;
|
|
387
|
+
const issue = parsed.error.issues[0];
|
|
388
|
+
const at = ['provenance', ...(issue?.path ?? [])].join('.');
|
|
389
|
+
throw new Error(`Node "${nodeId}": provenance refused at ${at}: ${issue?.message}`);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* A strict kind parses everything but `provenance`, which core checks on write
|
|
393
|
+
* and carries verbatim: a stored over-cap value (kept at load) must not make
|
|
394
|
+
* the node uneditable, and a schema that never declared the base field must
|
|
395
|
+
* not drop it.
|
|
396
|
+
*/
|
|
397
|
+
function parseStrict(schema, candidate) {
|
|
398
|
+
if (!Object.hasOwn(candidate, 'provenance'))
|
|
399
|
+
return schema.parse(candidate);
|
|
400
|
+
const { provenance, ...rest } = candidate;
|
|
401
|
+
const parsed = schema.parse(rest);
|
|
402
|
+
return provenance === undefined ? parsed : { ...parsed, provenance };
|
|
403
|
+
}
|
|
369
404
|
function parseCreatedNode(node, parentId) {
|
|
370
405
|
const candidate = { ...node, parentId };
|
|
406
|
+
assertProvenanceWrite(candidate.id, candidate.provenance);
|
|
371
407
|
const registered = nodeRegistry.get(candidate.type)?.schema;
|
|
372
408
|
// Generated definitions must reject invalid geometry instead of retaining a failed parse.
|
|
373
409
|
if (registered?.meta?.()?.strictMutations === true)
|
|
374
|
-
return registered
|
|
410
|
+
return parseStrict(registered, candidate);
|
|
375
411
|
const parsed = parseNode(candidate);
|
|
376
412
|
if (parsed.success)
|
|
377
413
|
return parsed.data;
|
|
@@ -397,6 +433,9 @@ function mergeNodeUpdate(currentNode, patch) {
|
|
|
397
433
|
return merged;
|
|
398
434
|
}
|
|
399
435
|
function parseUpdatedNode(currentNode, data) {
|
|
436
|
+
// Only a write of the field is checked: a stored over-cap value stays editable.
|
|
437
|
+
if (Object.hasOwn(data, 'provenance'))
|
|
438
|
+
assertProvenanceWrite(currentNode.id, data.provenance);
|
|
400
439
|
const candidate = mergeNodeUpdate(currentNode, data);
|
|
401
440
|
// Graph links survive schemas that omit children; only an explicit patch may change them.
|
|
402
441
|
const preserveChildren = (updated) => !Object.hasOwn(data, 'children') &&
|
|
@@ -407,7 +446,7 @@ function parseUpdatedNode(currentNode, data) {
|
|
|
407
446
|
const registered = nodeRegistry.get(currentNode.type)?.schema;
|
|
408
447
|
// Generated definitions must reject invalid geometry instead of retaining a failed parse.
|
|
409
448
|
if (registered?.meta?.()?.strictMutations === true)
|
|
410
|
-
return preserveChildren(registered
|
|
449
|
+
return preserveChildren(parseStrict(registered, candidate));
|
|
411
450
|
const parsed = parseNode(candidate);
|
|
412
451
|
if (parsed.success)
|
|
413
452
|
return preserveChildren(parsed.data);
|
|
@@ -750,100 +789,6 @@ function refreshDefaultGuttersForRoofIds(nextNodes, roofIds, dirtyIds, deletedId
|
|
|
750
789
|
// Track pending RAF for updateNodesAction to prevent multiple queued callbacks
|
|
751
790
|
let pendingRafId = null;
|
|
752
791
|
let pendingUpdates = new Set();
|
|
753
|
-
function pointsEqual(a, b, tolerance = 1e-6) {
|
|
754
|
-
const dx = a[0] - b[0];
|
|
755
|
-
const dz = a[1] - b[1];
|
|
756
|
-
return dx * dx + dz * dz <= tolerance * tolerance;
|
|
757
|
-
}
|
|
758
|
-
function wallLength(wall) {
|
|
759
|
-
return Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
|
|
760
|
-
}
|
|
761
|
-
function getWallEndpointAtPoint(wall, point) {
|
|
762
|
-
if (pointsEqual(wall.start, point))
|
|
763
|
-
return 'start';
|
|
764
|
-
if (pointsEqual(wall.end, point))
|
|
765
|
-
return 'end';
|
|
766
|
-
return null;
|
|
767
|
-
}
|
|
768
|
-
function getWallFreeEndpoint(wall, sharedPoint) {
|
|
769
|
-
return pointsEqual(wall.start, sharedPoint) ? wall.end : wall.start;
|
|
770
|
-
}
|
|
771
|
-
function areWallStylesCompatible(a, b) {
|
|
772
|
-
const aInterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(a, 'interior'));
|
|
773
|
-
const bInterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(b, 'interior'));
|
|
774
|
-
const aExterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(a, 'exterior'));
|
|
775
|
-
const bExterior = getWallSurfaceMaterialSignature(getEffectiveWallSurfaceMaterial(b, 'exterior'));
|
|
776
|
-
return ((a.parentId ?? null) === (b.parentId ?? null) &&
|
|
777
|
-
Math.abs((a.curveOffset ?? 0) - (b.curveOffset ?? 0)) <= 1e-6 &&
|
|
778
|
-
Math.abs((a.thickness ?? 0.2) - (b.thickness ?? 0.2)) <= 1e-6 &&
|
|
779
|
-
// Absent height means plane-bound (follows the storey), which must never
|
|
780
|
-
// merge with an explicit height — even one that currently matches the plane.
|
|
781
|
-
(a.height == null) === (b.height == null) &&
|
|
782
|
-
Math.abs((a.height ?? 0) - (b.height ?? 0)) <= 1e-6 &&
|
|
783
|
-
aInterior === bInterior &&
|
|
784
|
-
aExterior === bExterior &&
|
|
785
|
-
a.frontSide === b.frontSide &&
|
|
786
|
-
a.backSide === b.backSide &&
|
|
787
|
-
a.visible === b.visible);
|
|
788
|
-
}
|
|
789
|
-
function areWallsCollinearAcrossPoint(a, b, sharedPoint) {
|
|
790
|
-
const freeA = getWallFreeEndpoint(a, sharedPoint);
|
|
791
|
-
const freeB = getWallFreeEndpoint(b, sharedPoint);
|
|
792
|
-
const ax = freeA[0] - sharedPoint[0];
|
|
793
|
-
const az = freeA[1] - sharedPoint[1];
|
|
794
|
-
const bx = freeB[0] - sharedPoint[0];
|
|
795
|
-
const bz = freeB[1] - sharedPoint[1];
|
|
796
|
-
const lenA = Math.hypot(ax, az);
|
|
797
|
-
const lenB = Math.hypot(bx, bz);
|
|
798
|
-
if (lenA < 1e-6 || lenB < 1e-6)
|
|
799
|
-
return false;
|
|
800
|
-
const cross = (ax * bz - az * bx) / (lenA * lenB);
|
|
801
|
-
const dot = (ax * bx + az * bz) / (lenA * lenB);
|
|
802
|
-
return Math.abs(cross) <= 1e-4 && dot < -0.999;
|
|
803
|
-
}
|
|
804
|
-
function resolveMergedWallEndpoints(primary, secondary, sharedPoint) {
|
|
805
|
-
const primaryEndpoint = getWallEndpointAtPoint(primary, sharedPoint);
|
|
806
|
-
const secondaryEndpoint = getWallEndpointAtPoint(secondary, sharedPoint);
|
|
807
|
-
if (primaryEndpoint === 'end' && secondaryEndpoint === 'start') {
|
|
808
|
-
return { start: primary.start, end: secondary.end };
|
|
809
|
-
}
|
|
810
|
-
if (primaryEndpoint === 'start' && secondaryEndpoint === 'end') {
|
|
811
|
-
return { start: secondary.start, end: primary.end };
|
|
812
|
-
}
|
|
813
|
-
if (primaryEndpoint === 'start' && secondaryEndpoint === 'start') {
|
|
814
|
-
return { start: primary.end, end: secondary.end };
|
|
815
|
-
}
|
|
816
|
-
return { start: primary.start, end: secondary.start };
|
|
817
|
-
}
|
|
818
|
-
function buildMergedWallAttachmentUpdates(primary, secondary, mergedWallId, mergedStart, mergedEnd, nodes) {
|
|
819
|
-
const mergedLength = Math.max(Math.hypot(mergedEnd[0] - mergedStart[0], mergedEnd[1] - mergedStart[1]), 1e-6);
|
|
820
|
-
const tangentX = (mergedEnd[0] - mergedStart[0]) / mergedLength;
|
|
821
|
-
const tangentZ = (mergedEnd[1] - mergedStart[1]) / mergedLength;
|
|
822
|
-
const updates = [];
|
|
823
|
-
const wallChildren = [...(primary.children ?? []), ...(secondary.children ?? [])];
|
|
824
|
-
for (const childId of wallChildren) {
|
|
825
|
-
const child = nodes[childId];
|
|
826
|
-
if (!(child && 'position' in child && Array.isArray(child.position))) {
|
|
827
|
-
continue;
|
|
828
|
-
}
|
|
829
|
-
const sourceWall = child.parentId === secondary.id ? secondary : primary;
|
|
830
|
-
const sourceLength = Math.max(wallLength(sourceWall), 1e-6);
|
|
831
|
-
const localX = typeof child.position[0] === 'number' ? child.position[0] : 0;
|
|
832
|
-
const worldX = sourceWall.start[0] + ((sourceWall.end[0] - sourceWall.start[0]) * localX) / sourceLength;
|
|
833
|
-
const worldZ = sourceWall.start[1] + ((sourceWall.end[1] - sourceWall.start[1]) * localX) / sourceLength;
|
|
834
|
-
const nextLocalX = Math.max(0, Math.min(mergedLength, (worldX - mergedStart[0]) * tangentX + (worldZ - mergedStart[1]) * tangentZ));
|
|
835
|
-
updates.push({
|
|
836
|
-
id: childId,
|
|
837
|
-
data: {
|
|
838
|
-
parentId: mergedWallId,
|
|
839
|
-
wallId: mergedWallId,
|
|
840
|
-
position: [nextLocalX, child.position[1], child.position[2]],
|
|
841
|
-
...('wallT' in child ? { wallT: nextLocalX / mergedLength } : {}),
|
|
842
|
-
},
|
|
843
|
-
});
|
|
844
|
-
}
|
|
845
|
-
return updates;
|
|
846
|
-
}
|
|
847
792
|
function buildWallMergePlans(nodes, idsToDelete) {
|
|
848
793
|
const deletedWalls = idsToDelete
|
|
849
794
|
.map((id) => nodes[id])
|
|
@@ -861,7 +806,7 @@ function buildWallMergePlans(nodes, idsToDelete) {
|
|
|
861
806
|
return false;
|
|
862
807
|
if ((node.parentId ?? null) !== (deletedWall.parentId ?? null))
|
|
863
808
|
return false;
|
|
864
|
-
return
|
|
809
|
+
return getWallEndpointAtPoint(node, junction) !== null;
|
|
865
810
|
});
|
|
866
811
|
if (candidates.length !== 2) {
|
|
867
812
|
continue;
|
|
@@ -881,6 +826,11 @@ function buildWallMergePlans(nodes, idsToDelete) {
|
|
|
881
826
|
continue;
|
|
882
827
|
}
|
|
883
828
|
const { start, end } = resolveMergedWallEndpoints(primary, secondary, junction);
|
|
829
|
+
// A heal that would repaint a room or overflow a side's regions leaves the walls split.
|
|
830
|
+
const mergedFaceRegions = mergeWallFaceRegions([primary, secondary], start, end);
|
|
831
|
+
const zoneUpdates = planMergedZoneReferences(nodes, primary, secondary, start, end);
|
|
832
|
+
if (!(mergedFaceRegions && zoneUpdates))
|
|
833
|
+
continue;
|
|
884
834
|
const mergedChildren = Array.from(new Set([...(primary.children ?? []), ...(secondary.children ?? [])]));
|
|
885
835
|
const attachmentUpdates = buildMergedWallAttachmentUpdates(primary, secondary, primary.id, start, end, nodes);
|
|
886
836
|
mergePlans.push({
|
|
@@ -889,7 +839,9 @@ function buildWallMergePlans(nodes, idsToDelete) {
|
|
|
889
839
|
mergedStart: start,
|
|
890
840
|
mergedEnd: end,
|
|
891
841
|
mergedChildren,
|
|
842
|
+
mergedFaceRegions: mergedFaceRegions.length > 0 ? mergedFaceRegions : undefined,
|
|
892
843
|
attachmentUpdates,
|
|
844
|
+
zoneUpdates,
|
|
893
845
|
});
|
|
894
846
|
usedWallIds.add(primary.id);
|
|
895
847
|
usedWallIds.add(secondary.id);
|
|
@@ -897,17 +849,21 @@ function buildWallMergePlans(nodes, idsToDelete) {
|
|
|
897
849
|
}
|
|
898
850
|
return mergePlans;
|
|
899
851
|
}
|
|
900
|
-
const createNodesActionImpl = (set, get, ops) => {
|
|
852
|
+
const createNodesActionImpl = (set, get, ops, options) => {
|
|
901
853
|
if (get().readOnly)
|
|
902
854
|
return;
|
|
855
|
+
ops = filterDerivedNodeWrites(get().nodes, { create: ops }, options).create;
|
|
856
|
+
if (!ops.length)
|
|
857
|
+
return;
|
|
903
858
|
const extraNodesToMarkDirty = new Set();
|
|
904
859
|
const extraNodesToClearDirty = new Set();
|
|
905
860
|
set((state) => {
|
|
906
861
|
const nextNodes = { ...state.nodes };
|
|
907
862
|
const nextRootIds = [...state.rootNodeIds];
|
|
908
|
-
|
|
863
|
+
const nextCollections = { ...state.collections };
|
|
864
|
+
for (const { node, parentId, collectionIds } of ops) {
|
|
909
865
|
const effectiveParentId = parentId ?? node.parentId ?? null;
|
|
910
|
-
const newNode = parseCreatedNode(node, effectiveParentId);
|
|
866
|
+
const newNode = joinCollections(nextCollections, parseCreatedNode(node, effectiveParentId), collectionIds);
|
|
911
867
|
nextNodes[newNode.id] = newNode;
|
|
912
868
|
// 2. Update the Parent's children list. We append to ANY container
|
|
913
869
|
// parent (kind has `children` in its schema) — if the field is
|
|
@@ -946,7 +902,12 @@ const createNodesActionImpl = (set, get, ops) => {
|
|
|
946
902
|
}
|
|
947
903
|
refreshDefaultGuttersForRoofIds(nextNodes, refreshedRoofIds, extraNodesToMarkDirty, extraNodesToClearDirty);
|
|
948
904
|
addActiveSceneCommitNodeIds([...extraNodesToMarkDirty, ...extraNodesToClearDirty]);
|
|
949
|
-
|
|
905
|
+
const joined = Object.entries(nextCollections).some(([id, collection]) => state.collections[id] !== collection);
|
|
906
|
+
return {
|
|
907
|
+
nodes: nextNodes,
|
|
908
|
+
rootNodeIds: nextRootIds,
|
|
909
|
+
...(joined && { collections: nextCollections }),
|
|
910
|
+
};
|
|
950
911
|
});
|
|
951
912
|
// 4. System Sync
|
|
952
913
|
ops.forEach(({ node, parentId }) => {
|
|
@@ -961,11 +922,55 @@ const createNodesActionImpl = (set, get, ops) => {
|
|
|
961
922
|
for (const id of extraNodesToClearDirty)
|
|
962
923
|
get().clearDirty(id);
|
|
963
924
|
};
|
|
964
|
-
|
|
925
|
+
/**
|
|
926
|
+
* A created node joins the collections it is given, or an item those its mirror
|
|
927
|
+
* names, so a duplicate or a same-project paste stays a member; ids of
|
|
928
|
+
* collections this scene lacks (a paste from another project) are dropped.
|
|
929
|
+
* Writes the joined collections into `collections` and returns the node, an
|
|
930
|
+
* item with its mirror set to what it joined.
|
|
931
|
+
*/
|
|
932
|
+
export function joinCollections(collections, node, requested = node.type === 'item' ? node.collectionIds : undefined) {
|
|
933
|
+
const collectionIds = (requested ?? []).filter((id) => collections[id]);
|
|
934
|
+
for (const id of collectionIds) {
|
|
935
|
+
const collection = collections[id];
|
|
936
|
+
if (!collection.nodeIds.includes(node.id))
|
|
937
|
+
collections[id] = { ...collection, nodeIds: [...collection.nodeIds, node.id] };
|
|
938
|
+
}
|
|
939
|
+
if (node.type !== 'item' || sameIds(node.collectionIds ?? [], collectionIds))
|
|
940
|
+
return node;
|
|
941
|
+
return { ...node, collectionIds };
|
|
942
|
+
}
|
|
943
|
+
function sameIds(left, right) {
|
|
944
|
+
return left.length === right.length && left.every((id, index) => right[index] === id);
|
|
945
|
+
}
|
|
946
|
+
/** The collections `id` belongs to: membership lives on the collection for every kind. */
|
|
947
|
+
export function collectionIdsOf(collections, id) {
|
|
948
|
+
return Object.values(collections)
|
|
949
|
+
.filter((collection) => collection.nodeIds.includes(id))
|
|
950
|
+
.map((collection) => collection.id);
|
|
951
|
+
}
|
|
952
|
+
/** Membership lives on the collection; only items mirror it, so every collection is checked. */
|
|
953
|
+
function removeFromCollections(collections, id) {
|
|
954
|
+
for (const [collectionId, collection] of Object.entries(collections)) {
|
|
955
|
+
if (collection.nodeIds.includes(id))
|
|
956
|
+
collections[collectionId] = {
|
|
957
|
+
...collection,
|
|
958
|
+
nodeIds: collection.nodeIds.filter((nodeId) => nodeId !== id),
|
|
959
|
+
};
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
const applyNodeChangesActionImpl = (set, get, changes, options) => {
|
|
965
963
|
if (get().readOnly)
|
|
966
964
|
return;
|
|
965
|
+
changes = convertDerivedPlateHoleWrites(get().nodes, changes, options);
|
|
966
|
+
changes = filterDerivedNodeWrites(get().nodes, changes, options);
|
|
967
|
+
if (!changes.create?.length && !changes.update?.length && !changes.delete?.length)
|
|
968
|
+
return;
|
|
967
969
|
const createOps = changes.create ?? [];
|
|
968
|
-
const
|
|
970
|
+
const deletionIntent = options?.derivedWriter === DERIVED_WRITER_TOKEN
|
|
971
|
+
? []
|
|
972
|
+
: derivedDeletionIntent(get().nodes, changes.delete ?? []);
|
|
973
|
+
const updateOps = [...(changes.update ?? []), ...deletionIntent];
|
|
969
974
|
const deleteOps = changes.delete ?? [];
|
|
970
975
|
const nodesToMarkDirty = new Set();
|
|
971
976
|
const nodesToClearDirty = new Set();
|
|
@@ -1016,9 +1021,9 @@ const applyNodeChangesActionImpl = (set, get, changes) => {
|
|
|
1016
1021
|
}
|
|
1017
1022
|
nodesToMarkDirty.add(id);
|
|
1018
1023
|
}
|
|
1019
|
-
for (const { node, parentId } of createOps) {
|
|
1024
|
+
for (const { node, parentId, collectionIds } of createOps) {
|
|
1020
1025
|
const effectiveParentId = parentId ?? node.parentId ?? null;
|
|
1021
|
-
const newNode = parseCreatedNode(node, effectiveParentId);
|
|
1026
|
+
const newNode = joinCollections(nextCollections, parseCreatedNode(node, effectiveParentId), collectionIds);
|
|
1022
1027
|
nextNodes[newNode.id] = newNode;
|
|
1023
1028
|
nodesToMarkDirty.add(newNode.id);
|
|
1024
1029
|
if (newNode.type === 'roof-segment' && effectiveParentId) {
|
|
@@ -1077,17 +1082,7 @@ const applyNodeChangesActionImpl = (set, get, changes) => {
|
|
|
1077
1082
|
}
|
|
1078
1083
|
}
|
|
1079
1084
|
resolvedRootIds = resolvedRootIds.filter((rootId) => rootId !== id);
|
|
1080
|
-
|
|
1081
|
-
for (const collectionId of node.collectionIds) {
|
|
1082
|
-
const collection = nextCollections[collectionId];
|
|
1083
|
-
if (collection) {
|
|
1084
|
-
nextCollections[collectionId] = {
|
|
1085
|
-
...collection,
|
|
1086
|
-
nodeIds: collection.nodeIds.filter((nodeId) => nodeId !== id),
|
|
1087
|
-
};
|
|
1088
|
-
}
|
|
1089
|
-
}
|
|
1090
|
-
}
|
|
1085
|
+
removeFromCollections(nextCollections, id);
|
|
1091
1086
|
delete nextNodes[id];
|
|
1092
1087
|
}
|
|
1093
1088
|
refreshDefaultGuttersForRoofIds(nextNodes, roofsToRefresh, nodesToMarkDirty, nodesToClearDirty);
|
|
@@ -1115,9 +1110,17 @@ const applyNodeChangesActionImpl = (set, get, changes) => {
|
|
|
1115
1110
|
}
|
|
1116
1111
|
}
|
|
1117
1112
|
};
|
|
1118
|
-
const updateNodesActionImpl = (set, get, updates) => {
|
|
1113
|
+
const updateNodesActionImpl = (set, get, updates, options, deferDirty = true) => {
|
|
1119
1114
|
if (get().readOnly)
|
|
1120
1115
|
return;
|
|
1116
|
+
const converted = convertDerivedPlateHoleWrites(get().nodes, { update: updates }, options);
|
|
1117
|
+
if (converted.create?.length || converted.delete?.length) {
|
|
1118
|
+
applyNodeChangesActionImpl(set, get, converted, options);
|
|
1119
|
+
return;
|
|
1120
|
+
}
|
|
1121
|
+
updates = filterDerivedNodeWrites(get().nodes, { update: converted.update ?? [] }, options).update;
|
|
1122
|
+
if (!updates.length)
|
|
1123
|
+
return;
|
|
1121
1124
|
const parentsToUpdate = new Set();
|
|
1122
1125
|
const extraNodesToUpdate = new Set();
|
|
1123
1126
|
const extraNodesToDelete = new Set();
|
|
@@ -1194,6 +1197,13 @@ const updateNodesActionImpl = (set, get, updates) => {
|
|
|
1194
1197
|
]);
|
|
1195
1198
|
return { nodes: nextNodes };
|
|
1196
1199
|
});
|
|
1200
|
+
if (!deferDirty) {
|
|
1201
|
+
for (const id of [...updates.map((u) => u.id), ...parentsToUpdate, ...extraNodesToUpdate])
|
|
1202
|
+
get().markDirty(id);
|
|
1203
|
+
for (const id of extraNodesToDelete)
|
|
1204
|
+
get().clearDirty(id);
|
|
1205
|
+
return;
|
|
1206
|
+
}
|
|
1197
1207
|
// Batch dirty-marking into a single RAF to avoid redundant callbacks during rapid updates
|
|
1198
1208
|
for (const u of updates) {
|
|
1199
1209
|
// Visibility is applied by React before the deferred dirty callback. Mark
|
|
@@ -1223,175 +1233,309 @@ const updateNodesActionImpl = (set, get, updates) => {
|
|
|
1223
1233
|
pendingRafId = null;
|
|
1224
1234
|
});
|
|
1225
1235
|
};
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1236
|
+
/**
|
|
1237
|
+
* The delete store action's planner, without committing: the requested ids,
|
|
1238
|
+
* their `children` subtrees and kind `onDeleteCascade` companions, collinear
|
|
1239
|
+
* walls merged across a deleted junction, the separators that keep two rooms
|
|
1240
|
+
* apart when the wall between them goes, derived-construction deletion intent,
|
|
1241
|
+
* neighbour patches, support and unit cleanup, and the default gutter and
|
|
1242
|
+
* downspout refresh.
|
|
1243
|
+
*
|
|
1244
|
+
* The refresh mints gutters, downspouts and outlets with random ids, and which
|
|
1245
|
+
* existing defaults it keeps can depend on them. With `mintDefaults: false`
|
|
1246
|
+
* (a preview, such as the MCP patch dry run) the refresh does not run: the
|
|
1247
|
+
* existing defaults it would touch are listed in `unsettledIds`, and the plan
|
|
1248
|
+
* is deterministic and equals the commit for every other existing id. The
|
|
1249
|
+
* delete action mints.
|
|
1250
|
+
*/
|
|
1251
|
+
export function planNodeDeletion(scene, ids, { mintDefaults = true, options, wallDeletionPlan, } = {}) {
|
|
1229
1252
|
const parentsToMarkDirty = new Set();
|
|
1230
1253
|
const nodesToMarkDirty = new Set();
|
|
1231
1254
|
const deletedIds = new Set();
|
|
1232
|
-
const mergePlans = buildWallMergePlans(
|
|
1255
|
+
const mergePlans = buildWallMergePlans(scene.nodes, ids);
|
|
1233
1256
|
const requestedDeleteIds = new Set(ids);
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1257
|
+
// Deleting derived construction is an intent edit ("this room has no
|
|
1258
|
+
// ceiling"), not a refusal — the reconciler must not rebuild it.
|
|
1259
|
+
const deletionIntent = options?.derivedWriter === DERIVED_WRITER_TOKEN ? [] : derivedDeletionIntent(scene.nodes, ids);
|
|
1260
|
+
// A preview names the separators a room-preserving delete adds without random ids.
|
|
1261
|
+
let previewCount = 0;
|
|
1262
|
+
const previewId = (kind) => {
|
|
1263
|
+
let id;
|
|
1264
|
+
do
|
|
1265
|
+
id = `${kind}_preview${++previewCount}`;
|
|
1266
|
+
while (id in scene.nodes);
|
|
1267
|
+
return id;
|
|
1268
|
+
};
|
|
1269
|
+
const nextNodes = { ...scene.nodes };
|
|
1270
|
+
const nextCollections = { ...scene.collections };
|
|
1271
|
+
let nextRootIds = [...scene.rootNodeIds];
|
|
1272
|
+
// Collect all ids to delete (the requested ids + all their descendants) before
|
|
1273
|
+
// mutating anything, so the recursive walk reads consistent state.
|
|
1274
|
+
const allIds = new Set();
|
|
1275
|
+
const collect = (id) => {
|
|
1276
|
+
if (allIds.has(id))
|
|
1277
|
+
return;
|
|
1278
|
+
allIds.add(id);
|
|
1279
|
+
const node = nextNodes[id];
|
|
1280
|
+
const cascadeDeletes = node
|
|
1281
|
+
? nodeRegistry
|
|
1282
|
+
.get(node.type)
|
|
1283
|
+
?.parametrics?.onDeleteCascade?.(node, nextNodes, allIds, requestedDeleteIds)
|
|
1284
|
+
: null;
|
|
1285
|
+
if (cascadeDeletes) {
|
|
1286
|
+
for (const companionId of cascadeDeletes)
|
|
1287
|
+
collect(companionId);
|
|
1288
|
+
}
|
|
1289
|
+
if (node && 'children' in node) {
|
|
1290
|
+
for (const cid of node.children)
|
|
1291
|
+
collect(cid);
|
|
1292
|
+
}
|
|
1293
|
+
};
|
|
1294
|
+
for (const id of ids)
|
|
1295
|
+
collect(id);
|
|
1296
|
+
if (wallDeletionPlan ||
|
|
1297
|
+
(options?.derivedWriter !== DERIVED_WRITER_TOKEN && !isSpaceDetectionPaused())) {
|
|
1298
|
+
const plan = wallDeletionPlan ??
|
|
1299
|
+
planWallDeletion(scene.nodes, {
|
|
1300
|
+
nodeIds: [...allIds],
|
|
1301
|
+
mintId: mintDefaults ? generateId : previewId,
|
|
1302
|
+
});
|
|
1303
|
+
for (const change of plan.changes) {
|
|
1304
|
+
if (change.op === 'delete')
|
|
1305
|
+
collect(change.id);
|
|
1306
|
+
else if (change.op === 'update') {
|
|
1307
|
+
const current = nextNodes[change.id];
|
|
1308
|
+
if (current)
|
|
1309
|
+
nextNodes[change.id] = parseUpdatedNode(current, change.data);
|
|
1310
|
+
nodesToMarkDirty.add(change.id);
|
|
1254
1311
|
}
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1312
|
+
else {
|
|
1313
|
+
const node = change.node;
|
|
1314
|
+
nextNodes[node.id] = node;
|
|
1315
|
+
nodesToMarkDirty.add(node.id);
|
|
1316
|
+
const parent = node.parentId ? nextNodes[node.parentId] : undefined;
|
|
1317
|
+
if (parent && 'children' in parent && Array.isArray(parent.children)) {
|
|
1318
|
+
nextNodes[parent.id] = { ...parent, children: [...parent.children, node.id] };
|
|
1319
|
+
parentsToMarkDirty.add(parent.id);
|
|
1320
|
+
}
|
|
1258
1321
|
}
|
|
1259
|
-
};
|
|
1260
|
-
for (const id of ids)
|
|
1261
|
-
collect(id);
|
|
1262
|
-
for (const plan of mergePlans) {
|
|
1263
|
-
allIds.add(plan.secondaryWallId);
|
|
1264
1322
|
}
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1323
|
+
}
|
|
1324
|
+
for (const plan of mergePlans) {
|
|
1325
|
+
allIds.add(plan.secondaryWallId);
|
|
1326
|
+
}
|
|
1327
|
+
const affectedRoofIds = new Set();
|
|
1328
|
+
for (const id of allIds) {
|
|
1329
|
+
const node = nextNodes[id];
|
|
1330
|
+
addLeanToHostRoofId(node, nextNodes, affectedRoofIds);
|
|
1331
|
+
if (node?.type === 'roof-segment' && node.parentId) {
|
|
1332
|
+
affectedRoofIds.add(node.parentId);
|
|
1272
1333
|
}
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1334
|
+
}
|
|
1335
|
+
for (const id of allIds)
|
|
1336
|
+
deletedIds.add(id);
|
|
1337
|
+
// Let each deleted kind undo what it imposed on its neighbours (e.g. an
|
|
1338
|
+
// auto-inserted elbow re-extends the duct runs it trimmed back onto the
|
|
1339
|
+
// corner it replaced). Read against pre-deletion `nextNodes`; skip
|
|
1340
|
+
// patches that target a node also being deleted.
|
|
1341
|
+
for (const id of allIds) {
|
|
1342
|
+
const node = nextNodes[id];
|
|
1343
|
+
if (!node)
|
|
1344
|
+
continue;
|
|
1345
|
+
const onDelete = nodeRegistry.get(node.type)?.parametrics?.onDelete;
|
|
1346
|
+
if (!onDelete)
|
|
1347
|
+
continue;
|
|
1348
|
+
for (const { id: targetId, data } of onDelete(node, nextNodes, allIds, requestedDeleteIds)) {
|
|
1349
|
+
if (allIds.has(targetId))
|
|
1282
1350
|
continue;
|
|
1283
|
-
const
|
|
1284
|
-
if (!
|
|
1351
|
+
const target = nextNodes[targetId];
|
|
1352
|
+
if (!target)
|
|
1285
1353
|
continue;
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
continue;
|
|
1289
|
-
const target = nextNodes[targetId];
|
|
1290
|
-
if (!target)
|
|
1291
|
-
continue;
|
|
1292
|
-
nextNodes[targetId] = { ...target, ...data };
|
|
1293
|
-
nodesToMarkDirty.add(targetId);
|
|
1294
|
-
}
|
|
1354
|
+
nextNodes[targetId] = { ...target, ...data };
|
|
1355
|
+
nodesToMarkDirty.add(targetId);
|
|
1295
1356
|
}
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1357
|
+
}
|
|
1358
|
+
for (const plan of mergePlans) {
|
|
1359
|
+
const primaryWall = nextNodes[plan.primaryWallId];
|
|
1360
|
+
if (!(primaryWall && primaryWall.type === 'wall') || allIds.has(plan.primaryWallId)) {
|
|
1361
|
+
continue;
|
|
1362
|
+
}
|
|
1363
|
+
const { faceRegions: _regions, ...keptWall } = primaryWall;
|
|
1364
|
+
nextNodes[plan.primaryWallId] = {
|
|
1365
|
+
...keptWall,
|
|
1366
|
+
...(plan.mergedFaceRegions ? { faceRegions: plan.mergedFaceRegions } : {}),
|
|
1367
|
+
start: plan.mergedStart,
|
|
1368
|
+
end: plan.mergedEnd,
|
|
1369
|
+
children: plan.mergedChildren,
|
|
1370
|
+
};
|
|
1371
|
+
nodesToMarkDirty.add(plan.primaryWallId);
|
|
1372
|
+
for (const update of plan.zoneUpdates) {
|
|
1373
|
+
if (allIds.has(update.id))
|
|
1299
1374
|
continue;
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
...
|
|
1303
|
-
start: plan.mergedStart,
|
|
1304
|
-
end: plan.mergedEnd,
|
|
1305
|
-
children: plan.mergedChildren,
|
|
1306
|
-
};
|
|
1307
|
-
nodesToMarkDirty.add(plan.primaryWallId);
|
|
1308
|
-
for (const update of plan.attachmentUpdates) {
|
|
1309
|
-
if (allIds.has(update.id))
|
|
1310
|
-
continue;
|
|
1311
|
-
const child = nextNodes[update.id];
|
|
1312
|
-
if (!child)
|
|
1313
|
-
continue;
|
|
1314
|
-
nextNodes[update.id] = { ...child, ...update.data };
|
|
1315
|
-
nodesToMarkDirty.add(update.id);
|
|
1316
|
-
}
|
|
1375
|
+
const zone = nextNodes[update.id];
|
|
1376
|
+
if (zone)
|
|
1377
|
+
nextNodes[update.id] = { ...zone, ...update.data };
|
|
1317
1378
|
}
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
if (nextNodes[id]?.type === 'slab')
|
|
1327
|
-
deletedSlabIds.add(id);
|
|
1379
|
+
for (const update of plan.attachmentUpdates) {
|
|
1380
|
+
if (allIds.has(update.id))
|
|
1381
|
+
continue;
|
|
1382
|
+
const child = nextNodes[update.id];
|
|
1383
|
+
if (!child)
|
|
1384
|
+
continue;
|
|
1385
|
+
nextNodes[update.id] = { ...child, ...update.data };
|
|
1386
|
+
nodesToMarkDirty.add(update.id);
|
|
1328
1387
|
}
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1388
|
+
}
|
|
1389
|
+
// Deleting a slab strips `supportSlabId` / `deckSlabId` references from
|
|
1390
|
+
// surviving nodes in the same undo commit (mirrors the collectionIds
|
|
1391
|
+
// cleanup below), so those nodes re-elect their support / re-derive
|
|
1392
|
+
// their rise. Deletion is the ONLY writer — a host merely reshaped away
|
|
1393
|
+
// keeps the field and the read path falls back, letting hosting resume
|
|
1394
|
+
// if the slab returns.
|
|
1395
|
+
const deletedSlabIds = new Set();
|
|
1396
|
+
for (const id of allIds) {
|
|
1397
|
+
if (nextNodes[id]?.type === 'slab')
|
|
1398
|
+
deletedSlabIds.add(id);
|
|
1399
|
+
}
|
|
1400
|
+
if (deletedSlabIds.size > 0) {
|
|
1401
|
+
for (const [nodeId, node] of Object.entries(nextNodes)) {
|
|
1402
|
+
if (allIds.has(nodeId))
|
|
1403
|
+
continue;
|
|
1404
|
+
const patch = {};
|
|
1405
|
+
const hostId = node.supportSlabId;
|
|
1406
|
+
if (hostId && deletedSlabIds.has(hostId))
|
|
1407
|
+
patch.supportSlabId = undefined;
|
|
1408
|
+
const deckId = node.deckSlabId;
|
|
1409
|
+
if (deckId && deletedSlabIds.has(deckId))
|
|
1410
|
+
patch.deckSlabId = undefined;
|
|
1411
|
+
if (Object.keys(patch).length > 0) {
|
|
1412
|
+
nextNodes[nodeId] = { ...node, ...patch };
|
|
1413
|
+
nodesToMarkDirty.add(nodeId);
|
|
1344
1414
|
}
|
|
1345
1415
|
}
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1416
|
+
}
|
|
1417
|
+
// A deleted door takes its step paint with it, in the same undo step; every
|
|
1418
|
+
// other doorway keeps its own.
|
|
1419
|
+
for (const node of Object.values(nextNodes)) {
|
|
1420
|
+
if (node.type !== 'zone' || allIds.has(node.id))
|
|
1421
|
+
continue;
|
|
1422
|
+
const pruned = withoutFloorStepOverrideKeys(node, allIds);
|
|
1423
|
+
if (!pruned)
|
|
1424
|
+
continue;
|
|
1425
|
+
nextNodes[node.id] = pruned;
|
|
1426
|
+
nodesToMarkDirty.add(node.id);
|
|
1427
|
+
}
|
|
1428
|
+
const deletedZoneIds = new Set();
|
|
1429
|
+
for (const id of allIds) {
|
|
1430
|
+
if (nextNodes[id]?.type === 'zone')
|
|
1431
|
+
deletedZoneIds.add(id);
|
|
1432
|
+
}
|
|
1433
|
+
if (deletedZoneIds.size > 0) {
|
|
1434
|
+
for (const node of Object.values(nextNodes)) {
|
|
1435
|
+
if (node.type !== 'unit' || allIds.has(node.id))
|
|
1436
|
+
continue;
|
|
1437
|
+
const members = node.members.filter((id) => !deletedZoneIds.has(id));
|
|
1438
|
+
if (members.length === node.members.length)
|
|
1439
|
+
continue;
|
|
1440
|
+
nextNodes[node.id] = { ...node, members };
|
|
1441
|
+
nodesToMarkDirty.add(node.id);
|
|
1350
1442
|
}
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1443
|
+
}
|
|
1444
|
+
for (const id of allIds) {
|
|
1445
|
+
const node = nextNodes[id];
|
|
1446
|
+
if (!node)
|
|
1447
|
+
continue;
|
|
1448
|
+
// Legacy graphs can link children without a reciprocal parentId.
|
|
1449
|
+
const parentId = (node.parentId ??
|
|
1450
|
+
Object.values(nextNodes).find((candidate) => 'children' in candidate && candidate.children?.some((childId) => childId === id))?.id);
|
|
1451
|
+
if (parentId && nextNodes[parentId] && !allIds.has(parentId)) {
|
|
1452
|
+
const parent = nextNodes[parentId];
|
|
1453
|
+
if (parent.children) {
|
|
1454
|
+
nextNodes[parent.id] = {
|
|
1455
|
+
...parent,
|
|
1456
|
+
children: parent.children.filter((cid) => cid !== id),
|
|
1457
|
+
};
|
|
1458
|
+
parentsToMarkDirty.add(parent.id);
|
|
1360
1459
|
}
|
|
1361
1460
|
}
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1461
|
+
// 2. Remove from root list
|
|
1462
|
+
nextRootIds = nextRootIds.filter((rid) => rid !== id);
|
|
1463
|
+
// 3. Remove from any collections it belongs to
|
|
1464
|
+
removeFromCollections(nextCollections, id);
|
|
1465
|
+
// 4. Delete the node itself
|
|
1466
|
+
delete nextNodes[id];
|
|
1467
|
+
}
|
|
1468
|
+
for (const { id, data } of deletionIntent) {
|
|
1469
|
+
const zone = nextNodes[id];
|
|
1470
|
+
if (!zone)
|
|
1471
|
+
continue;
|
|
1472
|
+
nextNodes[id] = { ...zone, ...data };
|
|
1473
|
+
nodesToMarkDirty.add(id);
|
|
1474
|
+
}
|
|
1475
|
+
const unsettledIds = new Set();
|
|
1476
|
+
const regeneratedHostIds = new Set();
|
|
1477
|
+
if (mintDefaults) {
|
|
1478
|
+
refreshDefaultGuttersForRoofIds(nextNodes, affectedRoofIds, nodesToMarkDirty, deletedIds);
|
|
1479
|
+
}
|
|
1480
|
+
else {
|
|
1481
|
+
collectRefreshedDefaults(nextNodes, affectedRoofIds, unsettledIds, regeneratedHostIds);
|
|
1482
|
+
}
|
|
1483
|
+
return {
|
|
1484
|
+
nodes: nextNodes,
|
|
1485
|
+
rootNodeIds: nextRootIds,
|
|
1486
|
+
collections: nextCollections,
|
|
1487
|
+
deletedIds,
|
|
1488
|
+
parentsToMarkDirty,
|
|
1489
|
+
nodesToMarkDirty,
|
|
1490
|
+
unsettledIds,
|
|
1491
|
+
regeneratedHostIds,
|
|
1492
|
+
};
|
|
1493
|
+
}
|
|
1494
|
+
/**
|
|
1495
|
+
* The existing nodes the default gutter refresh of `roofIds` may keep, move or
|
|
1496
|
+
* replace: each roof's default gutters and the downspouts on them. Which of
|
|
1497
|
+
* them survive depends on the gutters the refresh mints, whose ids are random.
|
|
1498
|
+
* `hosts` receives the roof segments whose `children` the refresh rewrites.
|
|
1499
|
+
*/
|
|
1500
|
+
function collectRefreshedDefaults(nodes, roofIds, out, hosts) {
|
|
1501
|
+
const gutterIds = new Set();
|
|
1502
|
+
for (const roofId of new Set(roofIds)) {
|
|
1503
|
+
const roof = nodes[roofId];
|
|
1504
|
+
if (roof?.type !== 'roof')
|
|
1505
|
+
continue;
|
|
1506
|
+
for (const segmentId of roof.children ?? []) {
|
|
1507
|
+
const segment = nodes[segmentId];
|
|
1508
|
+
if (segment?.type !== 'roof-segment')
|
|
1365
1509
|
continue;
|
|
1366
|
-
|
|
1367
|
-
const
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
if (parent.children) {
|
|
1371
|
-
nextNodes[parent.id] = {
|
|
1372
|
-
...parent,
|
|
1373
|
-
children: parent.children.filter((cid) => cid !== id),
|
|
1374
|
-
};
|
|
1375
|
-
parentsToMarkDirty.add(parent.id);
|
|
1510
|
+
hosts.add(segment.id);
|
|
1511
|
+
for (const childId of segment.children ?? []) {
|
|
1512
|
+
if (isDefaultGutterNode(nodes[childId], segment.id)) {
|
|
1513
|
+
gutterIds.add(childId);
|
|
1376
1514
|
}
|
|
1377
1515
|
}
|
|
1378
|
-
// 2. Remove from root list
|
|
1379
|
-
nextRootIds = nextRootIds.filter((rid) => rid !== id);
|
|
1380
|
-
// 3. Remove from any collections it belongs to
|
|
1381
|
-
if ('collectionIds' in node && node.collectionIds) {
|
|
1382
|
-
for (const cid of node.collectionIds) {
|
|
1383
|
-
const col = nextCollections[cid];
|
|
1384
|
-
if (col) {
|
|
1385
|
-
nextCollections[cid] = { ...col, nodeIds: col.nodeIds.filter((nid) => nid !== id) };
|
|
1386
|
-
}
|
|
1387
|
-
}
|
|
1388
|
-
}
|
|
1389
|
-
// 4. Delete the node itself
|
|
1390
|
-
delete nextNodes[id];
|
|
1391
1516
|
}
|
|
1392
|
-
|
|
1517
|
+
}
|
|
1518
|
+
for (const id of gutterIds)
|
|
1519
|
+
out.add(id);
|
|
1520
|
+
for (const node of Object.values(nodes)) {
|
|
1521
|
+
if (node?.type === 'downspout' && node.gutterId && gutterIds.has(node.gutterId)) {
|
|
1522
|
+
out.add(node.id);
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
const deleteNodesActionImpl = (set, get, ids, options, wallDeletionPlan) => {
|
|
1527
|
+
if (get().readOnly)
|
|
1528
|
+
return;
|
|
1529
|
+
let deletedIds = new Set();
|
|
1530
|
+
let parentsToMarkDirty = new Set();
|
|
1531
|
+
let nodesToMarkDirty = new Set();
|
|
1532
|
+
set((state) => {
|
|
1533
|
+
const plan = planNodeDeletion(state, ids, { options, wallDeletionPlan });
|
|
1534
|
+
deletedIds = plan.deletedIds;
|
|
1535
|
+
parentsToMarkDirty = plan.parentsToMarkDirty;
|
|
1536
|
+
nodesToMarkDirty = plan.nodesToMarkDirty;
|
|
1393
1537
|
addActiveSceneCommitNodeIds([...deletedIds, ...parentsToMarkDirty, ...nodesToMarkDirty]);
|
|
1394
|
-
return { nodes:
|
|
1538
|
+
return { nodes: plan.nodes, rootNodeIds: plan.rootNodeIds, collections: plan.collections };
|
|
1395
1539
|
});
|
|
1396
1540
|
// Deleted ids must leave the dirty set: every consumer skips missing
|
|
1397
1541
|
// nodes without clearing them, so a mark on a deleted node would sit in
|
|
@@ -1421,17 +1565,101 @@ function validatedSet(set) {
|
|
|
1421
1565
|
return patch;
|
|
1422
1566
|
});
|
|
1423
1567
|
}
|
|
1424
|
-
|
|
1568
|
+
/** Runs the same deletion hooks and update constraints for headless scene owners. */
|
|
1569
|
+
export function planSceneNodeChanges(snapshot, changes) {
|
|
1570
|
+
const dirtyIds = new Set();
|
|
1571
|
+
let state = {
|
|
1572
|
+
...snapshot,
|
|
1573
|
+
readOnly: false,
|
|
1574
|
+
markDirty: (id) => {
|
|
1575
|
+
dirtyIds.add(id);
|
|
1576
|
+
},
|
|
1577
|
+
clearDirty: (id) => {
|
|
1578
|
+
dirtyIds.delete(id);
|
|
1579
|
+
},
|
|
1580
|
+
};
|
|
1581
|
+
const set = (update) => {
|
|
1582
|
+
state = { ...state, ...update(state) };
|
|
1583
|
+
};
|
|
1584
|
+
if (changes.update?.length)
|
|
1585
|
+
updateNodesActionImpl(set, () => state, changes.update, undefined, false);
|
|
1586
|
+
if (changes.delete?.length)
|
|
1587
|
+
deleteNodesActionImpl(set, () => state, changes.delete, undefined, changes.wallDeletionPlan);
|
|
1588
|
+
return {
|
|
1589
|
+
nodes: state.nodes,
|
|
1590
|
+
rootNodeIds: state.rootNodeIds,
|
|
1591
|
+
collections: state.collections,
|
|
1592
|
+
dirtyIds: [...dirtyIds],
|
|
1593
|
+
};
|
|
1594
|
+
}
|
|
1595
|
+
export const createNodesAction = (set, get, ops, options) => runWithSceneCommitNodeIds(ops.flatMap(({ node, parentId }) => {
|
|
1425
1596
|
const effectiveParentId = parentId ?? node.parentId;
|
|
1426
1597
|
return effectiveParentId ? [node.id, effectiveParentId] : [node.id];
|
|
1427
|
-
}), () => createNodesActionImpl(validatedSet(set), get, ops));
|
|
1428
|
-
export const applyNodeChangesAction = (set, get, changes) => runWithSceneCommitNodeIds([
|
|
1598
|
+
}), () => createNodesActionImpl(validatedSet(set), get, ops, options));
|
|
1599
|
+
export const applyNodeChangesAction = (set, get, changes, options) => runWithSceneCommitNodeIds([
|
|
1429
1600
|
...(changes.create ?? []).flatMap(({ node, parentId }) => {
|
|
1430
1601
|
const effectiveParentId = parentId ?? node.parentId;
|
|
1431
1602
|
return effectiveParentId ? [node.id, effectiveParentId] : [node.id];
|
|
1432
1603
|
}),
|
|
1433
1604
|
...(changes.update ?? []).map(({ id }) => id),
|
|
1434
1605
|
...(changes.delete ?? []),
|
|
1435
|
-
], () => applyNodeChangesActionImpl(validatedSet(set), get, changes));
|
|
1436
|
-
export const updateNodesAction = (set, get, updates) => runWithSceneCommitNodeIds(updates.map(({ id }) => id), () => updateNodesActionImpl(validatedSet(set), get, updates));
|
|
1437
|
-
export const deleteNodesAction = (set, get, ids) => runWithSceneCommitNodeIds(ids, () => deleteNodesActionImpl(validatedSet(set), get, ids));
|
|
1606
|
+
], () => applyNodeChangesActionImpl(validatedSet(set), get, changes, options));
|
|
1607
|
+
export const updateNodesAction = (set, get, updates, options) => runWithSceneCommitNodeIds(updates.map(({ id }) => id), () => updateNodesActionImpl(validatedSet(set), get, updates, options));
|
|
1608
|
+
export const deleteNodesAction = (set, get, ids, options) => runWithSceneCommitNodeIds(ids, () => deleteNodesActionImpl(validatedSet(set), get, ids, options));
|
|
1609
|
+
/**
|
|
1610
|
+
* The sanctioned conversion from derived construction to an authored surface:
|
|
1611
|
+
* the boundary editors' polygon edit, a 2D reshape, a manual move. Clears the
|
|
1612
|
+
* derived markers (and the zone link) in the same update that carries the
|
|
1613
|
+
* caller's own change, so the reconciler stops owning the surface from this
|
|
1614
|
+
* commit on.
|
|
1615
|
+
*/
|
|
1616
|
+
export const detachDerivedNodeAction = (set, get, id, data) => {
|
|
1617
|
+
const node = get().nodes[id];
|
|
1618
|
+
if (!node)
|
|
1619
|
+
return;
|
|
1620
|
+
// An automatic ceiling draws its room's paint regions; once it is its own it
|
|
1621
|
+
// keeps them on itself.
|
|
1622
|
+
const zone = node.type === 'ceiling' && node.zoneId ? get().nodes[node.zoneId] : null;
|
|
1623
|
+
const keptRegions = node.type === 'ceiling' &&
|
|
1624
|
+
isDerivedNode(node) &&
|
|
1625
|
+
zone?.type === 'zone' &&
|
|
1626
|
+
zone.ceiling?.regions?.length &&
|
|
1627
|
+
!(data && 'regions' in data)
|
|
1628
|
+
? { regions: zone.ceiling.regions }
|
|
1629
|
+
: {};
|
|
1630
|
+
// Spread through a plain record: merging two `Partial<AnyNode>` unions
|
|
1631
|
+
// explodes into a union TypeScript cannot represent.
|
|
1632
|
+
const patch = {
|
|
1633
|
+
...data,
|
|
1634
|
+
...keptRegions,
|
|
1635
|
+
...(isDerivedNode(node) ? derivedDetachPatch(node) : {}),
|
|
1636
|
+
...(node.type === 'slab' && isDerivedNode(node)
|
|
1637
|
+
? { associatedZoneIds: node.zoneIds ?? [] }
|
|
1638
|
+
: {}),
|
|
1639
|
+
};
|
|
1640
|
+
if (Object.keys(patch).length === 0)
|
|
1641
|
+
return;
|
|
1642
|
+
const ownerUpdates = node.type === 'slab' && isDerivedNode(node)
|
|
1643
|
+
? (node.zoneIds ?? []).flatMap((zoneId) => {
|
|
1644
|
+
const zone = get().nodes[zoneId];
|
|
1645
|
+
return zone?.type === 'zone'
|
|
1646
|
+
? [{ id: zone.id, data: { floor: { ...zone.floor, sourceSlabId: node.id } } }]
|
|
1647
|
+
: [];
|
|
1648
|
+
})
|
|
1649
|
+
: [];
|
|
1650
|
+
runWithSceneCommitNodeIds([id, ...ownerUpdates.map(({ id }) => id)], () => updateNodesActionImpl(validatedSet(set), get, [{ id, data: patch }, ...ownerUpdates], {
|
|
1651
|
+
derivedWriter: DERIVED_WRITER_TOKEN,
|
|
1652
|
+
}));
|
|
1653
|
+
};
|
|
1654
|
+
/**
|
|
1655
|
+
* What the default gutter refresh of `roofIds` would touch, without running
|
|
1656
|
+
* it: the existing default gutters and downspouts it may keep or replace, and
|
|
1657
|
+
* the roof segments whose `children` it rewrites. For previews of edits that
|
|
1658
|
+
* trigger the refresh (a roof segment update, a delete).
|
|
1659
|
+
*/
|
|
1660
|
+
export function previewDefaultGutterRefresh(nodes, roofIds) {
|
|
1661
|
+
const unsettledIds = new Set();
|
|
1662
|
+
const regeneratedHostIds = new Set();
|
|
1663
|
+
collectRefreshedDefaults(nodes, roofIds, unsettledIds, regeneratedHostIds);
|
|
1664
|
+
return { unsettledIds, regeneratedHostIds };
|
|
1665
|
+
}
|