@pascal-app/core 1.0.0-beta.5 → 1.0.1
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/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/capture/index.d.ts +3 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +2 -0
- package/dist/capture/schema.d.ts +417 -0
- package/dist/capture/schema.d.ts.map +1 -0
- package/dist/capture/schema.js +350 -0
- package/dist/capture/source.d.ts +60 -0
- package/dist/capture/source.d.ts.map +1 -0
- package/dist/capture/source.js +254 -0
- package/dist/events/bus.d.ts +58 -7
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/hidden-wall-pointer-hold.d.ts +28 -0
- package/dist/events/hidden-wall-pointer-hold.d.ts.map +1 -0
- package/dist/events/hidden-wall-pointer-hold.js +37 -0
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +4 -4
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.js +7 -12
- package/dist/hooks/spatial-grid/floor-placed-footprints.d.ts +4 -0
- package/dist/hooks/spatial-grid/floor-placed-footprints.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/floor-placed-footprints.js +7 -0
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +5 -8
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +23 -106
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2931 -2
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +207 -30
- package/dist/hooks/spatial-grid/support-host-patch.d.ts +45 -1
- package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/support-host-patch.js +174 -9
- package/dist/hooks/spatial-grid/use-spatial-query.d.ts +1 -1
- package/dist/hooks/spatial-grid/use-spatial-query.js +1 -1
- package/dist/index.d.ts +74 -64
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +74 -61
- package/dist/lib/asset-storage.d.ts.map +1 -1
- package/dist/lib/asset-storage.js +4 -1
- package/dist/lib/door-operation.d.ts +1 -1
- package/dist/lib/item-polygon-overlap.d.ts +6 -0
- package/dist/lib/item-polygon-overlap.d.ts.map +1 -0
- package/dist/lib/item-polygon-overlap.js +67 -0
- package/dist/lib/level-name.d.ts +1 -1
- package/dist/lib/measurement-geometry.d.ts +4 -4
- package/dist/lib/plan-footprint.d.ts +41 -0
- package/dist/lib/plan-footprint.d.ts.map +1 -0
- package/dist/lib/plan-footprint.js +58 -0
- package/dist/lib/polygon-union.d.ts +4 -0
- package/dist/lib/polygon-union.d.ts.map +1 -0
- package/dist/lib/polygon-union.js +306 -0
- package/dist/lib/roof-overlap.d.ts +32 -0
- package/dist/lib/roof-overlap.d.ts.map +1 -0
- package/dist/lib/roof-overlap.js +72 -0
- package/dist/lib/room-topology-index.d.ts +1 -1
- package/dist/lib/room-topology-index.js +1 -1
- package/dist/lib/selection-proxy.d.ts +1 -1
- package/dist/lib/slab-polygon.d.ts +36 -3
- package/dist/lib/slab-polygon.d.ts.map +1 -1
- package/dist/lib/slab-polygon.js +135 -29
- package/dist/lib/space-detection.d.ts +12 -1
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +58 -25
- package/dist/lib/terrain-brush.d.ts +1 -1
- package/dist/lib/terrain-brush.js +1 -1
- package/dist/lib/terrain-codec.d.ts +2 -2
- package/dist/lib/terrain-codec.js +1 -1
- package/dist/lib/terrain-raycast.d.ts +1 -1
- package/dist/lib/terrain-raycast.js +1 -1
- package/dist/lib/terrain-source.d.ts +3 -3
- package/dist/lib/terrain-source.js +3 -3
- package/dist/lib/terrain-support.d.ts +1 -1
- package/dist/lib/terrain-support.js +3 -3
- package/dist/lib/unit-containment.d.ts +19 -0
- package/dist/lib/unit-containment.d.ts.map +1 -0
- package/dist/lib/unit-containment.js +158 -0
- package/dist/lib/unit-report.d.ts +19 -0
- package/dist/lib/unit-report.d.ts.map +1 -0
- package/dist/lib/unit-report.js +36 -0
- package/dist/lib/wall-distance.d.ts +2 -2
- package/dist/lib/wall-distance.js +1 -1
- package/dist/lib/zone-quantities.d.ts +1 -1
- package/dist/lib/zone-quantities.js +7 -7
- package/dist/material-library.d.ts +1 -1
- package/dist/material-library.js +1 -1
- package/dist/procedural-items/fixtures.d.ts +261 -0
- package/dist/procedural-items/fixtures.d.ts.map +1 -0
- package/dist/procedural-items/fixtures.js +349 -0
- package/dist/procedural-items/index.d.ts +10 -0
- package/dist/procedural-items/index.d.ts.map +1 -0
- package/dist/procedural-items/index.js +9 -0
- package/dist/procedural-items/integration.d.ts +92 -0
- package/dist/procedural-items/integration.d.ts.map +1 -0
- package/dist/procedural-items/integration.js +19 -0
- package/dist/procedural-items/library-colors.d.ts +56 -0
- package/dist/procedural-items/library-colors.d.ts.map +1 -0
- package/dist/procedural-items/library-colors.js +84 -0
- package/dist/procedural-items/materials.d.ts +5 -0
- package/dist/procedural-items/materials.d.ts.map +1 -0
- package/dist/procedural-items/materials.js +47 -0
- package/dist/procedural-items/node.d.ts +280 -0
- package/dist/procedural-items/node.d.ts.map +1 -0
- package/dist/procedural-items/node.js +71 -0
- package/dist/procedural-items/placement.d.ts +7 -0
- package/dist/procedural-items/placement.d.ts.map +1 -0
- package/dist/procedural-items/placement.js +48 -0
- package/dist/procedural-items/query.d.ts +50 -0
- package/dist/procedural-items/query.d.ts.map +1 -0
- package/dist/procedural-items/query.js +298 -0
- package/dist/procedural-items/recipe.d.ts +144 -0
- package/dist/procedural-items/recipe.d.ts.map +1 -0
- package/dist/procedural-items/recipe.js +372 -0
- package/dist/procedural-items/spatial.d.ts +19 -0
- package/dist/procedural-items/spatial.d.ts.map +1 -0
- package/dist/procedural-items/spatial.js +39 -0
- package/dist/registry/__bench__/relations-resolver.bench.js +2 -2
- package/dist/registry/handles.d.ts +36 -7
- package/dist/registry/handles.d.ts.map +1 -1
- package/dist/registry/index.d.ts +6 -7
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +4 -5
- package/dist/registry/registry.d.ts +13 -6
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +37 -4
- package/dist/registry/relations-resolver.d.ts +2 -2
- package/dist/registry/relations-resolver.js +1 -1
- package/dist/registry/scene-api.d.ts +18 -2
- package/dist/registry/scene-api.d.ts.map +1 -1
- package/dist/registry/scene-api.js +50 -2
- package/dist/registry/subtree.d.ts +1 -1
- package/dist/registry/subtree.js +2 -2
- package/dist/registry/types.d.ts +246 -21
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/use-registry-version.js +1 -1
- package/dist/registry/validate-relations.d.ts +4 -0
- package/dist/registry/validate-relations.d.ts.map +1 -0
- package/dist/registry/validate-relations.js +22 -0
- package/dist/schema/__bench__/node-parsers.bench.d.ts +24 -0
- package/dist/schema/__bench__/node-parsers.bench.d.ts.map +1 -0
- package/dist/schema/__bench__/node-parsers.bench.js +314 -0
- package/dist/schema/__fixtures__/node-fixtures.d.ts +28 -0
- package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -0
- package/dist/schema/__fixtures__/node-fixtures.js +127 -0
- package/dist/schema/base.d.ts +1 -1
- package/dist/schema/base.d.ts.map +1 -1
- package/dist/schema/base.js +9 -2
- package/dist/schema/collections.d.ts +1 -1
- package/dist/schema/collections.js +1 -1
- package/dist/schema/compiled-node-parsers.d.ts +40 -0
- package/dist/schema/compiled-node-parsers.d.ts.map +1 -0
- package/dist/schema/compiled-node-parsers.js +95 -0
- package/dist/schema/index.d.ts +73 -66
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +65 -57
- package/dist/schema/material.d.ts +1 -0
- package/dist/schema/material.d.ts.map +1 -1
- package/dist/schema/material.js +2 -1
- package/dist/schema/nodes/automatic-downspout.d.ts +17 -0
- package/dist/schema/nodes/automatic-downspout.d.ts.map +1 -0
- package/dist/schema/nodes/automatic-downspout.js +237 -0
- package/dist/schema/nodes/block.d.ts +107 -0
- package/dist/schema/nodes/block.d.ts.map +1 -0
- package/dist/schema/nodes/block.js +206 -0
- package/dist/schema/nodes/box-vent.d.ts +8 -2
- package/dist/schema/nodes/box-vent.d.ts.map +1 -1
- package/dist/schema/nodes/box-vent.js +4 -2
- package/dist/schema/nodes/building.d.ts +2 -2
- package/dist/schema/nodes/building.d.ts.map +1 -1
- package/dist/schema/nodes/building.js +8 -5
- package/dist/schema/nodes/cabinet.d.ts +26 -4
- package/dist/schema/nodes/cabinet.d.ts.map +1 -1
- package/dist/schema/nodes/cabinet.js +29 -8
- package/dist/schema/nodes/ceiling.d.ts +2 -2
- package/dist/schema/nodes/ceiling.js +5 -5
- package/dist/schema/nodes/chimney.d.ts +2 -2
- package/dist/schema/nodes/chimney.js +2 -2
- package/dist/schema/nodes/column.d.ts +7 -6
- package/dist/schema/nodes/column.d.ts.map +1 -1
- package/dist/schema/nodes/column.js +3 -2
- package/dist/schema/nodes/construction-dimension.d.ts +1 -1
- package/dist/schema/nodes/construction-dimension.js +2 -2
- package/dist/schema/nodes/cupola.d.ts +9 -1
- package/dist/schema/nodes/cupola.d.ts.map +1 -1
- package/dist/schema/nodes/cupola.js +4 -2
- package/dist/schema/nodes/door.d.ts +1 -1
- package/dist/schema/nodes/door.js +2 -2
- package/dist/schema/nodes/dormer.d.ts +45 -2
- package/dist/schema/nodes/dormer.d.ts.map +1 -1
- package/dist/schema/nodes/dormer.js +133 -9
- package/dist/schema/nodes/downspout.d.ts +11 -1
- package/dist/schema/nodes/downspout.d.ts.map +1 -1
- package/dist/schema/nodes/downspout.js +26 -2
- package/dist/schema/nodes/duct-fitting.d.ts +18 -1
- package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/duct-fitting.js +26 -5
- package/dist/schema/nodes/duct-segment.d.ts +23 -1
- package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
- package/dist/schema/nodes/duct-segment.js +21 -1
- package/dist/schema/nodes/duct-terminal.d.ts +1 -1
- package/dist/schema/nodes/duct-terminal.js +1 -1
- package/dist/schema/nodes/elevator.d.ts +1 -1
- package/dist/schema/nodes/elevator.js +2 -2
- package/dist/schema/nodes/eyebrow-vent.d.ts +8 -2
- package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
- package/dist/schema/nodes/eyebrow-vent.js +4 -2
- package/dist/schema/nodes/fence.d.ts +1 -1
- package/dist/schema/nodes/fence.js +2 -2
- package/dist/schema/nodes/guide.d.ts +1 -1
- package/dist/schema/nodes/guide.js +2 -2
- package/dist/schema/nodes/gutter.d.ts +36 -2
- package/dist/schema/nodes/gutter.d.ts.map +1 -1
- package/dist/schema/nodes/gutter.js +310 -3
- package/dist/schema/nodes/hanger-overrides.d.ts +7 -0
- package/dist/schema/nodes/hanger-overrides.d.ts.map +1 -0
- package/dist/schema/nodes/hanger-overrides.js +6 -0
- package/dist/schema/nodes/hvac-equipment.d.ts +1 -1
- package/dist/schema/nodes/hvac-equipment.js +1 -1
- package/dist/schema/nodes/imported-mesh.d.ts +40 -0
- package/dist/schema/nodes/imported-mesh.d.ts.map +1 -0
- package/dist/schema/nodes/imported-mesh.js +27 -0
- package/dist/schema/nodes/item.d.ts +3 -2
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +8 -3
- package/dist/schema/nodes/lean-to-extension.d.ts +212 -0
- package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -0
- package/dist/schema/nodes/lean-to-extension.js +114 -0
- package/dist/schema/nodes/level.d.ts +2 -2
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/level.js +1 -1
- package/dist/schema/nodes/lineset.d.ts +1 -1
- package/dist/schema/nodes/lineset.js +1 -1
- package/dist/schema/nodes/liquid-line.d.ts +1 -1
- package/dist/schema/nodes/liquid-line.js +1 -1
- package/dist/schema/nodes/measurement.d.ts +1 -1
- package/dist/schema/nodes/measurement.js +2 -2
- package/dist/schema/nodes/pipe-fitting.d.ts +10 -2
- package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-fitting.js +7 -3
- package/dist/schema/nodes/pipe-segment.d.ts +24 -2
- package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-segment.js +21 -1
- package/dist/schema/nodes/pipe-trap.d.ts +2 -2
- package/dist/schema/nodes/pipe-trap.js +1 -1
- package/dist/schema/nodes/ridge-vent.d.ts +2 -2
- package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
- package/dist/schema/nodes/ridge-vent.js +7 -4
- package/dist/schema/nodes/roof-segment-shape.d.ts +5 -1
- package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-shape.js +65 -2
- package/dist/schema/nodes/roof-segment-walls.d.ts +4 -2
- package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-walls.js +2 -2
- package/dist/schema/nodes/roof-segment.d.ts +42 -2
- package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment.js +81 -4
- package/dist/schema/nodes/roof.d.ts +23 -2
- package/dist/schema/nodes/roof.d.ts.map +1 -1
- package/dist/schema/nodes/roof.js +17 -3
- package/dist/schema/nodes/scan.d.ts +19 -2
- package/dist/schema/nodes/scan.d.ts.map +1 -1
- package/dist/schema/nodes/scan.js +13 -3
- package/dist/schema/nodes/shelf.d.ts +3 -3
- package/dist/schema/nodes/shelf.d.ts.map +1 -1
- package/dist/schema/nodes/shelf.js +3 -4
- package/dist/schema/nodes/site.d.ts +1 -1
- package/dist/schema/nodes/site.js +2 -2
- package/dist/schema/nodes/skylight.d.ts +5 -5
- package/dist/schema/nodes/skylight.js +2 -2
- package/dist/schema/nodes/slab.d.ts +1 -1
- package/dist/schema/nodes/slab.js +3 -3
- package/dist/schema/nodes/solar-panel.d.ts +1 -1
- package/dist/schema/nodes/solar-panel.js +3 -3
- package/dist/schema/nodes/spawn.d.ts +1 -1
- package/dist/schema/nodes/spawn.js +1 -1
- package/dist/schema/nodes/stair-segment.d.ts +1 -1
- package/dist/schema/nodes/stair-segment.js +2 -2
- package/dist/schema/nodes/stair.d.ts +2 -2
- package/dist/schema/nodes/stair.js +3 -3
- package/dist/schema/nodes/structural-grid.d.ts +1 -1
- package/dist/schema/nodes/structural-grid.js +1 -1
- package/dist/schema/nodes/turbine-vent.d.ts +8 -2
- package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
- package/dist/schema/nodes/turbine-vent.js +4 -2
- package/dist/schema/nodes/unit.d.ts +33 -0
- package/dist/schema/nodes/unit.d.ts.map +1 -0
- package/dist/schema/nodes/unit.js +13 -0
- package/dist/schema/nodes/wall.d.ts +5 -5
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +13 -6
- package/dist/schema/nodes/window.d.ts +10 -3
- package/dist/schema/nodes/window.d.ts.map +1 -1
- package/dist/schema/nodes/window.js +6 -2
- package/dist/schema/nodes/zone.d.ts +2 -2
- package/dist/schema/nodes/zone.js +2 -2
- package/dist/schema/scene-material.js +2 -2
- package/dist/schema/types.d.ts +815 -118
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +79 -46
- package/dist/services/alignment-anchors.d.ts +6 -11
- package/dist/services/alignment-anchors.d.ts.map +1 -1
- package/dist/services/alignment-anchors.js +7 -34
- package/dist/services/drag-session.d.ts +4 -4
- package/dist/services/drag-session.js +1 -1
- package/dist/services/hosting.d.ts +4 -10
- package/dist/services/hosting.d.ts.map +1 -1
- package/dist/services/hosting.js +6 -16
- package/dist/services/index.d.ts +16 -13
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +16 -13
- package/dist/services/level-height.d.ts +2 -2
- package/dist/services/level-height.js +3 -3
- package/dist/services/movement.d.ts +3 -3
- package/dist/services/movement.js +2 -2
- package/dist/services/port-connectivity.d.ts +1 -1
- package/dist/services/port-connectivity.js +1 -1
- package/dist/services/riser-diagram.d.ts +1 -1
- package/dist/services/shelf-board.d.ts +5 -0
- package/dist/services/shelf-board.d.ts.map +1 -0
- package/dist/services/shelf-board.js +15 -0
- package/dist/services/storey.d.ts +2 -2
- package/dist/services/storey.js +2 -2
- package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +13 -0
- package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +1 -0
- package/dist/services/surface-hosting-procedural-parity.fixtures.js +4691 -0
- package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +1060 -0
- package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +1 -0
- package/dist/services/surface-hosting-shelf-parity.fixtures.js +3127 -0
- package/dist/services/surface-hosting.d.ts +88 -0
- package/dist/services/surface-hosting.d.ts.map +1 -0
- package/dist/services/surface-hosting.js +268 -0
- package/dist/services/surface-region.d.ts +8 -0
- package/dist/services/surface-region.d.ts.map +1 -0
- package/dist/services/surface-region.js +44 -0
- package/dist/services/system-graph.d.ts +12 -1
- package/dist/services/system-graph.d.ts.map +1 -1
- package/dist/services/system-graph.js +36 -6
- package/dist/services/validate-dwv.d.ts +1 -1
- package/dist/services/validate-dwv.js +1 -1
- package/dist/store/actions/node-actions.d.ts +9 -2
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +475 -24
- package/dist/store/history-control.d.ts +3 -3
- package/dist/store/history-invalidation.d.ts +3 -0
- package/dist/store/history-invalidation.d.ts.map +1 -0
- package/dist/store/history-invalidation.js +72 -0
- package/dist/store/scene-hydration.d.ts +5 -0
- package/dist/store/scene-hydration.d.ts.map +1 -0
- package/dist/store/scene-hydration.js +57 -0
- package/dist/store/use-interactive.d.ts +2 -2
- package/dist/store/use-live-terrain.d.ts +1 -1
- package/dist/store/use-scene.d.ts +7 -4
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +361 -87
- package/dist/systems/elevator/elevator-dispatch.d.ts +2 -2
- package/dist/systems/elevator/elevator-dispatch.js +1 -1
- package/dist/systems/elevator/elevator-geometry.d.ts +1 -1
- package/dist/systems/elevator/elevator-opening-sync.d.ts +1 -1
- package/dist/systems/elevator/elevator-opening-sync.js +2 -2
- package/dist/systems/elevator/elevator-opening-system.js +3 -3
- package/dist/systems/elevator/elevator-runtime.d.ts +3 -3
- package/dist/systems/elevator/elevator-runtime.js +3 -3
- package/dist/systems/elevator/elevator-service.d.ts +1 -1
- package/dist/systems/elevator/elevator-service.js +1 -1
- package/dist/systems/fence/fence-centerline.d.ts +2 -2
- package/dist/systems/fence/fence-centerline.js +2 -2
- package/dist/systems/fence/fence-spline.d.ts +2 -2
- package/dist/systems/roof/roof-elevation-system.d.ts +3 -0
- package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -0
- package/dist/systems/roof/roof-elevation-system.js +94 -0
- package/dist/systems/roof/roof-elevation.d.ts +4 -0
- package/dist/systems/roof/roof-elevation.d.ts.map +1 -0
- package/dist/systems/roof/roof-elevation.js +95 -0
- package/dist/systems/roof/roof-footprint.d.ts +17 -0
- package/dist/systems/roof/roof-footprint.d.ts.map +1 -0
- package/dist/systems/roof/roof-footprint.js +83 -0
- package/dist/systems/slab/slab-placement.d.ts +1 -1
- package/dist/systems/slab/slab-support.d.ts +1 -1
- package/dist/systems/slab/slab-support.js +4 -4
- package/dist/systems/stair/stair-flight.d.ts +17 -0
- package/dist/systems/stair/stair-flight.d.ts.map +1 -0
- package/dist/systems/stair/stair-flight.js +27 -0
- package/dist/systems/stair/stair-footprint.d.ts +1 -1
- package/dist/systems/stair/stair-opening-preview.d.ts +1621 -1267
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-preview.js +2 -2
- package/dist/systems/stair/stair-opening-sync.d.ts +1 -1
- package/dist/systems/stair/stair-opening-sync.js +6 -6
- package/dist/systems/stair/stair-opening-system.d.ts +1 -0
- package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-system.js +100 -103
- package/dist/systems/stair/stair-rise.d.ts +1 -1
- package/dist/systems/stair/stair-rise.d.ts.map +1 -1
- package/dist/systems/stair/stair-rise.js +23 -24
- package/dist/systems/wall/wall-curve.d.ts +3 -2
- package/dist/systems/wall/wall-curve.d.ts.map +1 -1
- package/dist/systems/wall/wall-curve.js +73 -0
- package/dist/systems/wall/wall-footprint.d.ts +3 -2
- package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
- package/dist/systems/wall/wall-footprint.js +3 -2
- package/dist/systems/wall/wall-mitering.d.ts +1 -1
- package/dist/systems/wall/wall-mitering.js +1 -1
- package/dist/systems/wall/wall-move.d.ts +1 -1
- package/dist/systems/wall/wall-top.d.ts +1 -1
- package/dist/systems/wall/wall-topology.d.ts +2 -2
- package/dist/systems/wall/wall-topology.js +4 -4
- package/dist/utils/clone-scene-graph.d.ts +3 -3
- package/dist/utils/clone-scene-graph.d.ts.map +1 -1
- package/dist/utils/clone-scene-graph.js +35 -3
- package/dist/utils/scene-migrations.d.ts +3 -3
- package/dist/utils/scene-migrations.js +3 -3
- package/dist/utils/vertical-scene-migration.js +5 -5
- package/dist/validation/validate-build-json.d.ts +7 -1
- package/dist/validation/validate-build-json.d.ts.map +1 -1
- package/dist/validation/validate-build-json.js +92 -4
- package/package.json +23 -5
- package/dist/systems/elevator/elevator-runtime-system.d.ts +0 -2
- package/dist/systems/elevator/elevator-runtime-system.d.ts.map +0 -1
- package/dist/systems/elevator/elevator-runtime-system.js +0 -8
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import dedent from 'dedent';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
|
+
import { HangerOverrides } from './hanger-overrides.js';
|
|
4
5
|
/**
|
|
5
6
|
* Round duct segment — a polyline of 3D points connected by cylindrical
|
|
6
7
|
* duct sections. Forced-air HVAC supply/return runs in US residential.
|
|
@@ -20,6 +21,22 @@ export const DuctSegmentNode = BaseNode.extend({
|
|
|
20
21
|
type: nodeType('duct-segment'),
|
|
21
22
|
// Polyline path in level-local meters. Minimum two points (start, end).
|
|
22
23
|
path: z.array(z.tuple([z.number(), z.number(), z.number()])).min(2),
|
|
24
|
+
autoHangers: z.boolean().optional(),
|
|
25
|
+
hangerOverrides: HangerOverrides.optional(),
|
|
26
|
+
hangerStyle: z.enum(['single', 'double']).optional(),
|
|
27
|
+
hangerSpacing: z.number().finite().positive().optional(),
|
|
28
|
+
hangerMaxReach: z.number().finite().positive().optional(),
|
|
29
|
+
// Logical wall host for runs drafted on a wall. The path remains
|
|
30
|
+
// level-local; UV coordinates let wall edits reproject the run later.
|
|
31
|
+
wallAttachment: z
|
|
32
|
+
.object({
|
|
33
|
+
wallId: objectId('wall'),
|
|
34
|
+
side: z.enum(['front', 'back']),
|
|
35
|
+
startUV: z.tuple([z.number(), z.number()]),
|
|
36
|
+
endUV: z.tuple([z.number(), z.number()]),
|
|
37
|
+
offset: z.number().finite().nonnegative(),
|
|
38
|
+
})
|
|
39
|
+
.optional(),
|
|
23
40
|
// Cross-section. Round is the branch default; rect is the trunk /
|
|
24
41
|
// plenum profile (real US systems: rect trunk, round branches); oval
|
|
25
42
|
// is the flat-oval profile (two semicircles of the duct height joined
|
|
@@ -60,6 +77,9 @@ export const DuctSegmentNode = BaseNode.extend({
|
|
|
60
77
|
slots: z.record(z.string(), z.string()).optional(),
|
|
61
78
|
}).describe(dedent `
|
|
62
79
|
Duct segment - polyline of 3D points connected by duct sections.
|
|
80
|
+
- autoHangers: automatically attach supports to nearby walls or ceilings (off when absent)
|
|
81
|
+
- hangerSpacing: distance between supports in meters (default 1.5)
|
|
82
|
+
- hangerMaxReach: maximum centerline-to-host distance in meters (default 2)
|
|
63
83
|
- path: list of [x, y, z] points in level-local meters (min 2)
|
|
64
84
|
- shape: round (branches) | rect (trunks / plenums) | oval (flat-oval, tight joist bays)
|
|
65
85
|
- diameter: nominal inner diameter in inches for round (typ. 4-14 residential)
|
|
@@ -26,7 +26,7 @@ export declare const DuctTerminalNode: z.ZodObject<{
|
|
|
26
26
|
fov: z.ZodOptional<z.ZodNumber>;
|
|
27
27
|
zoom: z.ZodOptional<z.ZodNumber>;
|
|
28
28
|
}, z.core.$strip>>;
|
|
29
|
-
metadata: z.ZodDefault<z.ZodOptional<z.
|
|
29
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
30
30
|
id: z.ZodDefault<z.ZodTemplateLiteral<`duct-terminal_${string}`>>;
|
|
31
31
|
type: z.ZodDefault<z.ZodLiteral<"duct-terminal">>;
|
|
32
32
|
position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import dedent from 'dedent';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
4
|
/**
|
|
5
5
|
* Duct terminal — where the air loop meets the room: supply registers,
|
|
6
6
|
* ceiling diffusers, return grilles.
|
|
@@ -31,7 +31,7 @@ export declare const ElevatorNode: z.ZodObject<{
|
|
|
31
31
|
fov: z.ZodOptional<z.ZodNumber>;
|
|
32
32
|
zoom: z.ZodOptional<z.ZodNumber>;
|
|
33
33
|
}, z.core.$strip>>;
|
|
34
|
-
metadata: z.ZodDefault<z.ZodOptional<z.
|
|
34
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
35
35
|
id: z.ZodDefault<z.ZodTemplateLiteral<`elevator_${string}`>>;
|
|
36
36
|
type: z.ZodDefault<z.ZodLiteral<"elevator">>;
|
|
37
37
|
material: z.ZodOptional<z.ZodObject<{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import dedent from 'dedent';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
|
-
import { MaterialSchema } from '../material';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
|
+
import { MaterialSchema } from '../material.js';
|
|
5
5
|
export const ElevatorDoorStyle = z.enum(['center-opening', 'single-left', 'single-right']);
|
|
6
6
|
export const ElevatorDoorPanelStyle = z.enum(['glass-frame', 'solid-panel', 'segmented-panel']);
|
|
7
7
|
export const ElevatorShaftStyle = z.enum(['solid', 'glass']);
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
export declare const EyebrowVentMaterialRole: z.ZodEnum<{
|
|
3
|
+
front: "front";
|
|
4
|
+
hood: "hood";
|
|
5
|
+
}>;
|
|
6
|
+
export type EyebrowVentMaterialRole = z.infer<typeof EyebrowVentMaterialRole>;
|
|
2
7
|
export declare const EyebrowVentNode: z.ZodObject<{
|
|
3
8
|
object: z.ZodDefault<z.ZodLiteral<"node">>;
|
|
4
9
|
name: z.ZodOptional<z.ZodString>;
|
|
@@ -14,7 +19,7 @@ export declare const EyebrowVentNode: z.ZodObject<{
|
|
|
14
19
|
fov: z.ZodOptional<z.ZodNumber>;
|
|
15
20
|
zoom: z.ZodOptional<z.ZodNumber>;
|
|
16
21
|
}, z.core.$strip>>;
|
|
17
|
-
metadata: z.ZodDefault<z.ZodOptional<z.
|
|
22
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
18
23
|
id: z.ZodDefault<z.ZodTemplateLiteral<`eyebrow-vent_${string}`>>;
|
|
19
24
|
type: z.ZodDefault<z.ZodLiteral<"eyebrow-vent">>;
|
|
20
25
|
material: z.ZodOptional<z.ZodObject<{
|
|
@@ -49,6 +54,7 @@ export declare const EyebrowVentNode: z.ZodObject<{
|
|
|
49
54
|
scale: z.ZodOptional<z.ZodNumber>;
|
|
50
55
|
}, z.core.$strip>>;
|
|
51
56
|
}, z.core.$strip>>;
|
|
57
|
+
slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
52
58
|
materialPreset: z.ZodDefault<z.ZodString>;
|
|
53
59
|
roofSegmentId: z.ZodOptional<z.ZodString>;
|
|
54
60
|
position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
@@ -57,8 +63,8 @@ export declare const EyebrowVentNode: z.ZodObject<{
|
|
|
57
63
|
depth: z.ZodDefault<z.ZodNumber>;
|
|
58
64
|
height: z.ZodDefault<z.ZodNumber>;
|
|
59
65
|
style: z.ZodDefault<z.ZodEnum<{
|
|
60
|
-
scoop: "scoop";
|
|
61
66
|
"half-round": "half-round";
|
|
67
|
+
scoop: "scoop";
|
|
62
68
|
"slant-box": "slant-box";
|
|
63
69
|
}>>;
|
|
64
70
|
louverCount: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eyebrow-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/eyebrow-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"eyebrow-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/eyebrow-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,uBAAuB;;;EAA4B,CAAA;AAChE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4C3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import dedent from 'dedent';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
|
-
import { MaterialSchema } from '../material';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
|
+
import { MaterialSchema } from '../material.js';
|
|
5
|
+
export const EyebrowVentMaterialRole = z.enum(['hood', 'front']);
|
|
5
6
|
export const EyebrowVentNode = BaseNode.extend({
|
|
6
7
|
id: objectId('eyebrow-vent'),
|
|
7
8
|
type: nodeType('eyebrow-vent'),
|
|
8
9
|
material: MaterialSchema.optional(),
|
|
10
|
+
slots: z.record(z.string(), z.string()).optional(),
|
|
9
11
|
// Default to the white preset so a freshly-placed vent reads as clean
|
|
10
12
|
// painted metal and the paint inspector shows "White" (matches box-vent).
|
|
11
13
|
materialPreset: z.string().default('preset-white'),
|
|
@@ -29,7 +29,7 @@ export declare const FenceNode: z.ZodObject<{
|
|
|
29
29
|
fov: z.ZodOptional<z.ZodNumber>;
|
|
30
30
|
zoom: z.ZodOptional<z.ZodNumber>;
|
|
31
31
|
}, z.core.$strip>>;
|
|
32
|
-
metadata: z.ZodDefault<z.ZodOptional<z.
|
|
32
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
33
33
|
id: z.ZodDefault<z.ZodTemplateLiteral<`fence_${string}`>>;
|
|
34
34
|
type: z.ZodDefault<z.ZodLiteral<"fence">>;
|
|
35
35
|
material: z.ZodOptional<z.ZodObject<{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import dedent from 'dedent';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
|
-
import { MaterialSchema } from '../material';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
|
+
import { MaterialSchema } from '../material.js';
|
|
5
5
|
export const FenceStyle = z.enum(['slat', 'rail', 'privacy', 'horizontal']);
|
|
6
6
|
export const FenceBaseStyle = z.enum(['floating', 'grounded']);
|
|
7
7
|
export const FencePostCap = z.enum(['none', 'flat', 'pyramid']);
|
|
@@ -22,7 +22,7 @@ export declare const GuideNode: z.ZodObject<{
|
|
|
22
22
|
fov: z.ZodOptional<z.ZodNumber>;
|
|
23
23
|
zoom: z.ZodOptional<z.ZodNumber>;
|
|
24
24
|
}, z.core.$strip>>;
|
|
25
|
-
metadata: z.ZodDefault<z.ZodOptional<z.
|
|
25
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
26
26
|
id: z.ZodDefault<z.ZodTemplateLiteral<`guide_${string}`>>;
|
|
27
27
|
type: z.ZodDefault<z.ZodLiteral<"guide">>;
|
|
28
28
|
url: z.ZodString;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { AssetUrl } from '../asset-url';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
2
|
+
import { AssetUrl } from '../asset-url.js';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
4
|
export const GuideScaleReference = z.object({
|
|
5
5
|
start: z.tuple([z.number(), z.number()]),
|
|
6
6
|
end: z.tuple([z.number(), z.number()]),
|
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { type RoofSegmentNode } from './roof-segment.js';
|
|
3
|
+
export declare const GUTTER_EAVE_TUCK_INWARD = 0.04;
|
|
4
|
+
export declare const GUTTER_EAVE_TUCK_UP = 0.04;
|
|
5
|
+
export type GutterEaveSide = '+X' | '-X' | '+Z' | '-Z';
|
|
6
|
+
export type GutterRun = {
|
|
7
|
+
side: GutterEaveSide;
|
|
8
|
+
position: [number, number, number];
|
|
9
|
+
rotation: number;
|
|
10
|
+
length: number;
|
|
11
|
+
};
|
|
12
|
+
export type GutterEdgeExclusion = {
|
|
13
|
+
side: GutterEaveSide;
|
|
14
|
+
from: number;
|
|
15
|
+
to: number;
|
|
16
|
+
};
|
|
2
17
|
export declare const GutterOutlet: z.ZodObject<{
|
|
3
18
|
id: z.ZodString;
|
|
4
19
|
offset: z.ZodDefault<z.ZodNumber>;
|
|
5
20
|
diameter: z.ZodDefault<z.ZodNumber>;
|
|
21
|
+
generatedBy: z.ZodOptional<z.ZodLiteral<"default-downspout">>;
|
|
6
22
|
}, z.core.$strip>;
|
|
7
23
|
export type GutterOutlet = z.infer<typeof GutterOutlet>;
|
|
8
24
|
export declare const GutterNode: z.ZodObject<{
|
|
@@ -20,7 +36,7 @@ export declare const GutterNode: z.ZodObject<{
|
|
|
20
36
|
fov: z.ZodOptional<z.ZodNumber>;
|
|
21
37
|
zoom: z.ZodOptional<z.ZodNumber>;
|
|
22
38
|
}, z.core.$strip>>;
|
|
23
|
-
metadata: z.ZodDefault<z.ZodOptional<z.
|
|
39
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
24
40
|
id: z.ZodDefault<z.ZodTemplateLiteral<`gutter_${string}`>>;
|
|
25
41
|
type: z.ZodDefault<z.ZodLiteral<"gutter">>;
|
|
26
42
|
material: z.ZodOptional<z.ZodObject<{
|
|
@@ -55,17 +71,23 @@ export declare const GutterNode: z.ZodObject<{
|
|
|
55
71
|
scale: z.ZodOptional<z.ZodNumber>;
|
|
56
72
|
}, z.core.$strip>>;
|
|
57
73
|
}, z.core.$strip>>;
|
|
74
|
+
slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
58
75
|
materialPreset: z.ZodDefault<z.ZodString>;
|
|
59
76
|
roofSegmentId: z.ZodOptional<z.ZodString>;
|
|
60
77
|
position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
61
78
|
rotation: z.ZodDefault<z.ZodNumber>;
|
|
62
79
|
length: z.ZodDefault<z.ZodNumber>;
|
|
80
|
+
arc: z.ZodOptional<z.ZodObject<{
|
|
81
|
+
centerX: z.ZodNumber;
|
|
82
|
+
centerZ: z.ZodNumber;
|
|
83
|
+
radius: z.ZodNumber;
|
|
84
|
+
}, z.core.$strip>>;
|
|
63
85
|
size: z.ZodDefault<z.ZodNumber>;
|
|
64
86
|
thickness: z.ZodDefault<z.ZodNumber>;
|
|
65
87
|
profile: z.ZodDefault<z.ZodEnum<{
|
|
66
88
|
box: "box";
|
|
67
|
-
"half-round": "half-round";
|
|
68
89
|
"k-style": "k-style";
|
|
90
|
+
"half-round": "half-round";
|
|
69
91
|
}>>;
|
|
70
92
|
endCapLeft: z.ZodDefault<z.ZodBoolean>;
|
|
71
93
|
endCapRight: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -78,7 +100,19 @@ export declare const GutterNode: z.ZodObject<{
|
|
|
78
100
|
id: z.ZodString;
|
|
79
101
|
offset: z.ZodDefault<z.ZodNumber>;
|
|
80
102
|
diameter: z.ZodDefault<z.ZodNumber>;
|
|
103
|
+
generatedBy: z.ZodOptional<z.ZodLiteral<"default-downspout">>;
|
|
81
104
|
}, z.core.$strip>>>;
|
|
82
105
|
}, z.core.$strip>;
|
|
83
106
|
export type GutterNode = z.infer<typeof GutterNode>;
|
|
107
|
+
export declare function computeGutterEaveY(segment: Pick<RoofSegmentNode, 'wallHeight' | 'overhang' | 'pitch' | 'roofType'>): number;
|
|
108
|
+
export declare function getGutterRunsForSegment(segment: RoofSegmentNode, roofSegments?: readonly RoofSegmentNode[], exclusions?: readonly GutterEdgeExclusion[]): GutterRun[];
|
|
109
|
+
export declare function createDefaultGuttersForSegment(segment: RoofSegmentNode, roofSegments?: readonly RoofSegmentNode[], exclusions?: readonly GutterEdgeExclusion[]): GutterNode[];
|
|
110
|
+
export declare function getDefaultGutterSide(node: unknown, roofSegmentId?: RoofSegmentNode['id']): GutterEaveSide | null;
|
|
111
|
+
export declare function isDefaultGutterNode(node: unknown, roofSegmentId?: RoofSegmentNode['id']): node is GutterNode;
|
|
112
|
+
export declare function hasAutoGutterMetadata(segment: Pick<RoofSegmentNode, 'metadata'>): segment is Pick<RoofSegmentNode, 'metadata'> & {
|
|
113
|
+
metadata: Record<string, unknown> & {
|
|
114
|
+
autoGutter: boolean;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
export declare function isAutoGutterEnabled(segment: Pick<RoofSegmentNode, 'id' | 'children' | 'metadata'>, nodes?: Record<string, unknown>): boolean;
|
|
84
118
|
//# sourceMappingURL=gutter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gutter.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/gutter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"gutter.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/gutter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAO/E,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAC3C,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEtD,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,cAAc,CAAA;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAQD,eAAO,MAAM,YAAY;;;;;iBAWvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8EtB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AASnD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC,GAC/E,MAAM,CAKR;AAmND,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,eAAe,EACxB,YAAY,GAAE,SAAS,eAAe,EAAO,EAC7C,UAAU,GAAE,SAAS,mBAAmB,EAAO,GAC9C,SAAS,EAAE,CAkDb;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,eAAe,EACxB,YAAY,GAAE,SAAS,eAAe,EAAO,EAC7C,UAAU,GAAE,SAAS,mBAAmB,EAAO,GAC9C,UAAU,EAAE,CAcd;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,GACpC,cAAc,GAAG,IAAI,CAQvB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,GACpC,IAAI,IAAI,UAAU,CAEpB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG,OAAO,IAAI,IAAI,CAChG,eAAe,EACf,UAAU,CACX,GAAG;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,CAAA;CAC5D,CAEA;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAKT"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import dedent from 'dedent';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
|
-
import { MaterialSchema } from '../material';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
|
+
import { MaterialSchema } from '../material.js';
|
|
5
|
+
import { normalizeRoofSegmentTrim } from './roof-segment.js';
|
|
6
|
+
import { getRoofShapeEaveSides } from './roof-segment-shape.js';
|
|
7
|
+
const MIN_DEFAULT_GUTTER_LENGTH_M = 0.2;
|
|
8
|
+
const DEFAULT_GUTTER_GENERATOR = 'default-gutter';
|
|
9
|
+
const AUTO_GUTTER_METADATA_KEY = 'autoGutter';
|
|
10
|
+
export const GUTTER_EAVE_TUCK_INWARD = 0.04;
|
|
11
|
+
export const GUTTER_EAVE_TUCK_UP = 0.04;
|
|
5
12
|
// A single drop outlet drilled in the gutter floor. A gutter can carry
|
|
6
13
|
// several so a long run can split between multiple downspouts (each
|
|
7
14
|
// downspout links to one outlet via its `outletId`).
|
|
@@ -15,11 +22,13 @@ export const GutterOutlet = z.object({
|
|
|
15
22
|
// Bore diameter of this drop. Default 0.07 m ≈ 3″. The cross-section
|
|
16
23
|
// SHAPE (round vs rectangular) follows the gutter's profile, not this.
|
|
17
24
|
diameter: z.number().default(0.07),
|
|
25
|
+
generatedBy: z.literal('default-downspout').optional(),
|
|
18
26
|
});
|
|
19
27
|
export const GutterNode = BaseNode.extend({
|
|
20
28
|
id: objectId('gutter'),
|
|
21
29
|
type: nodeType('gutter'),
|
|
22
30
|
material: MaterialSchema.optional(),
|
|
31
|
+
slots: z.record(z.string(), z.string()).optional(),
|
|
23
32
|
// White preset by default — matches the rest of the roof accessory
|
|
24
33
|
// family (box-vent / ridge-vent) so the paint inspector reads as
|
|
25
34
|
// "White" instead of "no material" on a freshly-placed gutter.
|
|
@@ -35,8 +44,19 @@ export const GutterNode = BaseNode.extend({
|
|
|
35
44
|
// direction (segment-local +X) — but exposed in case the user wants
|
|
36
45
|
// to tilt for a custom run.
|
|
37
46
|
rotation: z.number().default(0),
|
|
38
|
-
// Length along the eave (gutter-local +X).
|
|
47
|
+
// Length along the eave (gutter-local +X). For a curved eave this is the
|
|
48
|
+
// arc length of the run.
|
|
39
49
|
length: z.number().default(2.0),
|
|
50
|
+
// Concentric-arc descriptor for a run that follows a curved eave, in
|
|
51
|
+
// gutter-mesh-local coordinates (center + true radius). Absent for a straight
|
|
52
|
+
// gutter.
|
|
53
|
+
arc: z
|
|
54
|
+
.object({
|
|
55
|
+
centerX: z.number(),
|
|
56
|
+
centerZ: z.number(),
|
|
57
|
+
radius: z.number(),
|
|
58
|
+
})
|
|
59
|
+
.optional(),
|
|
40
60
|
// Profile size — the vertical drop of the U-channel below the eave
|
|
41
61
|
// line. 5″ (0.127 m) is the most common residential gutter size; 6″
|
|
42
62
|
// (0.152 m) is the common commercial / heavy-duty size. Default
|
|
@@ -74,3 +94,290 @@ export const GutterNode = BaseNode.extend({
|
|
|
74
94
|
- hangerStyle / hangerSpacing: visible metal straps across the rim
|
|
75
95
|
- outlets: drop-tube outlets (id + along-length offset + bore diameter)
|
|
76
96
|
`);
|
|
97
|
+
function metadataRecord(metadata) {
|
|
98
|
+
if (typeof metadata === 'object' && metadata !== null && !Array.isArray(metadata)) {
|
|
99
|
+
return metadata;
|
|
100
|
+
}
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
export function computeGutterEaveY(segment) {
|
|
104
|
+
const wallHeight = segment.wallHeight ?? 0;
|
|
105
|
+
if ((segment.roofType ?? 'gable') === 'flat')
|
|
106
|
+
return wallHeight;
|
|
107
|
+
const pitchRad = ((segment.pitch ?? 0) * Math.PI) / 180;
|
|
108
|
+
return wallHeight - (segment.overhang ?? 0) * Math.tan(pitchRad) + GUTTER_EAVE_TUCK_UP;
|
|
109
|
+
}
|
|
110
|
+
function getDefaultGutterSides(segment) {
|
|
111
|
+
return getRoofShapeEaveSides(segment.roofType);
|
|
112
|
+
}
|
|
113
|
+
function getGutterEnvelope(segment) {
|
|
114
|
+
const halfW = Math.max(0, segment.width) / 2;
|
|
115
|
+
const halfD = Math.max(0, segment.depth) / 2;
|
|
116
|
+
const overhang = Math.max(0, segment.overhang ?? 0);
|
|
117
|
+
const outerHalfW = Math.max(halfW, halfW + overhang - GUTTER_EAVE_TUCK_INWARD);
|
|
118
|
+
const outerHalfD = Math.max(halfD, halfD + overhang - GUTTER_EAVE_TUCK_INWARD);
|
|
119
|
+
const trim = normalizeRoofSegmentTrim(segment);
|
|
120
|
+
const minX = trim.left > 0 ? -halfW + trim.left : -outerHalfW;
|
|
121
|
+
const maxX = trim.right > 0 ? halfW - trim.right : outerHalfW;
|
|
122
|
+
const minZ = trim.back > 0 ? -halfD + trim.back : -outerHalfD;
|
|
123
|
+
const maxZ = trim.front > 0 ? halfD - trim.front : outerHalfD;
|
|
124
|
+
return { minX, maxX, minZ, maxZ, outerHalfW, outerHalfD, trim };
|
|
125
|
+
}
|
|
126
|
+
function getGutterEnvelopePolygon(segment) {
|
|
127
|
+
const { minX, maxX, minZ, maxZ, trim } = getGutterEnvelope(segment);
|
|
128
|
+
return [
|
|
129
|
+
[minX + trim.backLeftX, minZ],
|
|
130
|
+
[maxX - trim.backRightX, minZ],
|
|
131
|
+
[maxX, minZ + trim.backRightZ],
|
|
132
|
+
[maxX, maxZ - trim.frontRightZ],
|
|
133
|
+
[maxX - trim.frontRightX, maxZ],
|
|
134
|
+
[minX + trim.frontLeftX, maxZ],
|
|
135
|
+
[minX, maxZ - trim.frontLeftZ],
|
|
136
|
+
[minX, minZ + trim.backLeftZ],
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
function segmentLocalToRoof(segment, point) {
|
|
140
|
+
const rotation = segment.rotation ?? 0;
|
|
141
|
+
const cos = Math.cos(rotation);
|
|
142
|
+
const sin = Math.sin(rotation);
|
|
143
|
+
return [
|
|
144
|
+
(segment.position?.[0] ?? 0) + point[0] * cos + point[1] * sin,
|
|
145
|
+
(segment.position?.[2] ?? 0) - point[0] * sin + point[1] * cos,
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
function pointOnSegment(point, a, b) {
|
|
149
|
+
const lengthSq = (b[0] - a[0]) ** 2 + (b[1] - a[1]) ** 2;
|
|
150
|
+
if (lengthSq <= 1e-14) {
|
|
151
|
+
return (point[0] - a[0]) ** 2 + (point[1] - a[1]) ** 2 <= 1e-14;
|
|
152
|
+
}
|
|
153
|
+
const cross = (point[0] - a[0]) * (b[1] - a[1]) - (point[1] - a[1]) * (b[0] - a[0]);
|
|
154
|
+
if (Math.abs(cross) > 1e-7)
|
|
155
|
+
return false;
|
|
156
|
+
const dot = (point[0] - a[0]) * (b[0] - a[0]) + (point[1] - a[1]) * (b[1] - a[1]);
|
|
157
|
+
if (dot < -1e-7)
|
|
158
|
+
return false;
|
|
159
|
+
return dot <= lengthSq + 1e-7;
|
|
160
|
+
}
|
|
161
|
+
function pointStrictlyInsidePolygon(point, polygon) {
|
|
162
|
+
let inside = false;
|
|
163
|
+
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
|
|
164
|
+
const a = polygon[j];
|
|
165
|
+
const b = polygon[i];
|
|
166
|
+
if (pointOnSegment(point, a, b))
|
|
167
|
+
return false;
|
|
168
|
+
if (a[1] > point[1] !== b[1] > point[1] &&
|
|
169
|
+
point[0] < ((b[0] - a[0]) * (point[1] - a[1])) / (b[1] - a[1]) + a[0]) {
|
|
170
|
+
inside = !inside;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return inside;
|
|
174
|
+
}
|
|
175
|
+
function segmentCrossingT(start, end, a, b) {
|
|
176
|
+
const rx = end[0] - start[0];
|
|
177
|
+
const rz = end[1] - start[1];
|
|
178
|
+
const sx = b[0] - a[0];
|
|
179
|
+
const sz = b[1] - a[1];
|
|
180
|
+
const denominator = rx * sz - rz * sx;
|
|
181
|
+
if (Math.abs(denominator) < 1e-10)
|
|
182
|
+
return null;
|
|
183
|
+
const dx = a[0] - start[0];
|
|
184
|
+
const dz = a[1] - start[1];
|
|
185
|
+
const t = (dx * sz - dz * sx) / denominator;
|
|
186
|
+
const u = (dx * rz - dz * rx) / denominator;
|
|
187
|
+
if (t < -1e-8 || t > 1 + 1e-8 || u < -1e-8 || u > 1 + 1e-8)
|
|
188
|
+
return null;
|
|
189
|
+
return Math.max(0, Math.min(1, t));
|
|
190
|
+
}
|
|
191
|
+
function coveredIntervals(start, end, polygon) {
|
|
192
|
+
const splits = [0, 1];
|
|
193
|
+
for (let i = 0; i < polygon.length; i++) {
|
|
194
|
+
const t = segmentCrossingT(start, end, polygon[i], polygon[(i + 1) % polygon.length]);
|
|
195
|
+
if (t !== null)
|
|
196
|
+
splits.push(t);
|
|
197
|
+
}
|
|
198
|
+
splits.sort((a, b) => a - b);
|
|
199
|
+
const unique = splits.filter((value, index) => index === 0 || value - splits[index - 1] > 1e-7);
|
|
200
|
+
const intervals = [];
|
|
201
|
+
for (let i = 0; i < unique.length - 1; i++) {
|
|
202
|
+
const from = unique[i];
|
|
203
|
+
const to = unique[i + 1];
|
|
204
|
+
if (to - from <= 1e-7)
|
|
205
|
+
continue;
|
|
206
|
+
const middle = (from + to) / 2;
|
|
207
|
+
const point = [
|
|
208
|
+
start[0] + (end[0] - start[0]) * middle,
|
|
209
|
+
start[1] + (end[1] - start[1]) * middle,
|
|
210
|
+
];
|
|
211
|
+
if (pointStrictlyInsidePolygon(point, polygon))
|
|
212
|
+
intervals.push([from, to]);
|
|
213
|
+
}
|
|
214
|
+
return intervals;
|
|
215
|
+
}
|
|
216
|
+
function subtractInterval(visible, covered) {
|
|
217
|
+
const next = [];
|
|
218
|
+
for (const [from, to] of visible) {
|
|
219
|
+
if (covered[1] <= from + 1e-7 || covered[0] >= to - 1e-7) {
|
|
220
|
+
next.push([from, to]);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (covered[0] > from + 1e-7)
|
|
224
|
+
next.push([from, Math.min(to, covered[0])]);
|
|
225
|
+
if (covered[1] < to - 1e-7)
|
|
226
|
+
next.push([Math.max(from, covered[1]), to]);
|
|
227
|
+
}
|
|
228
|
+
return next;
|
|
229
|
+
}
|
|
230
|
+
function clipRunAgainstSegments(run, segment, roofSegments) {
|
|
231
|
+
const direction = [Math.cos(run.rotation), -Math.sin(run.rotation)];
|
|
232
|
+
const localStart = [
|
|
233
|
+
run.position[0] - direction[0] * (run.length / 2),
|
|
234
|
+
run.position[2] - direction[1] * (run.length / 2),
|
|
235
|
+
];
|
|
236
|
+
const localEnd = [
|
|
237
|
+
run.position[0] + direction[0] * (run.length / 2),
|
|
238
|
+
run.position[2] + direction[1] * (run.length / 2),
|
|
239
|
+
];
|
|
240
|
+
const roofStart = segmentLocalToRoof(segment, localStart);
|
|
241
|
+
const roofEnd = segmentLocalToRoof(segment, localEnd);
|
|
242
|
+
let visible = [[0, 1]];
|
|
243
|
+
for (const sibling of roofSegments) {
|
|
244
|
+
if (sibling.id === segment.id)
|
|
245
|
+
continue;
|
|
246
|
+
const polygon = getGutterEnvelopePolygon(sibling).map((point) => segmentLocalToRoof(sibling, point));
|
|
247
|
+
for (const covered of coveredIntervals(roofStart, roofEnd, polygon)) {
|
|
248
|
+
visible = subtractInterval(visible, covered);
|
|
249
|
+
}
|
|
250
|
+
if (visible.length === 0)
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
return visible
|
|
254
|
+
.map(([from, to]) => {
|
|
255
|
+
const length = run.length * (to - from);
|
|
256
|
+
const middle = (from + to) / 2;
|
|
257
|
+
return {
|
|
258
|
+
...run,
|
|
259
|
+
position: [
|
|
260
|
+
localStart[0] + (localEnd[0] - localStart[0]) * middle,
|
|
261
|
+
run.position[1],
|
|
262
|
+
localStart[1] + (localEnd[1] - localStart[1]) * middle,
|
|
263
|
+
],
|
|
264
|
+
length,
|
|
265
|
+
};
|
|
266
|
+
})
|
|
267
|
+
.filter((candidate) => candidate.length >= MIN_DEFAULT_GUTTER_LENGTH_M);
|
|
268
|
+
}
|
|
269
|
+
function clipRunAgainstExclusions(run, exclusions) {
|
|
270
|
+
let visible = [[0, 1]];
|
|
271
|
+
for (const exclusion of exclusions) {
|
|
272
|
+
if (exclusion.side !== run.side)
|
|
273
|
+
continue;
|
|
274
|
+
const from = Math.max(0, Math.min(1, Math.min(exclusion.from, exclusion.to)));
|
|
275
|
+
const to = Math.max(0, Math.min(1, Math.max(exclusion.from, exclusion.to)));
|
|
276
|
+
visible = subtractInterval(visible, [from, to]);
|
|
277
|
+
if (visible.length === 0)
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
const direction = [Math.cos(run.rotation), -Math.sin(run.rotation)];
|
|
281
|
+
const start = [
|
|
282
|
+
run.position[0] - direction[0] * (run.length / 2),
|
|
283
|
+
run.position[2] - direction[1] * (run.length / 2),
|
|
284
|
+
];
|
|
285
|
+
return visible
|
|
286
|
+
.map(([from, to]) => {
|
|
287
|
+
const length = run.length * (to - from);
|
|
288
|
+
const middle = (from + to) / 2;
|
|
289
|
+
return {
|
|
290
|
+
...run,
|
|
291
|
+
position: [
|
|
292
|
+
start[0] + direction[0] * run.length * middle,
|
|
293
|
+
run.position[1],
|
|
294
|
+
start[1] + direction[1] * run.length * middle,
|
|
295
|
+
],
|
|
296
|
+
length,
|
|
297
|
+
};
|
|
298
|
+
})
|
|
299
|
+
.filter((candidate) => candidate.length >= MIN_DEFAULT_GUTTER_LENGTH_M);
|
|
300
|
+
}
|
|
301
|
+
export function getGutterRunsForSegment(segment, roofSegments = [], exclusions = []) {
|
|
302
|
+
const { minX, maxX, minZ, maxZ, outerHalfW, outerHalfD, trim } = getGutterEnvelope(segment);
|
|
303
|
+
const eaveY = computeGutterEaveY(segment);
|
|
304
|
+
const runs = {
|
|
305
|
+
'+Z': trim.front > 0
|
|
306
|
+
? null
|
|
307
|
+
: {
|
|
308
|
+
side: '+Z',
|
|
309
|
+
position: [(minX + maxX) / 2, eaveY, outerHalfD],
|
|
310
|
+
rotation: 0,
|
|
311
|
+
length: maxX - minX,
|
|
312
|
+
},
|
|
313
|
+
'-Z': trim.back > 0
|
|
314
|
+
? null
|
|
315
|
+
: {
|
|
316
|
+
side: '-Z',
|
|
317
|
+
position: [(minX + maxX) / 2, eaveY, -outerHalfD],
|
|
318
|
+
rotation: Math.PI,
|
|
319
|
+
length: maxX - minX,
|
|
320
|
+
},
|
|
321
|
+
'+X': trim.right > 0
|
|
322
|
+
? null
|
|
323
|
+
: {
|
|
324
|
+
side: '+X',
|
|
325
|
+
position: [outerHalfW, eaveY, (minZ + maxZ) / 2],
|
|
326
|
+
rotation: Math.PI / 2,
|
|
327
|
+
length: maxZ - minZ,
|
|
328
|
+
},
|
|
329
|
+
'-X': trim.left > 0
|
|
330
|
+
? null
|
|
331
|
+
: {
|
|
332
|
+
side: '-X',
|
|
333
|
+
position: [-outerHalfW, eaveY, (minZ + maxZ) / 2],
|
|
334
|
+
rotation: -Math.PI / 2,
|
|
335
|
+
length: maxZ - minZ,
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
const candidates = getDefaultGutterSides(segment)
|
|
339
|
+
.map((side) => runs[side])
|
|
340
|
+
.filter((run) => run !== null && run.length >= MIN_DEFAULT_GUTTER_LENGTH_M);
|
|
341
|
+
return candidates
|
|
342
|
+
.flatMap((run) => clipRunAgainstExclusions(run, exclusions))
|
|
343
|
+
.flatMap((run) => clipRunAgainstSegments(run, segment, roofSegments));
|
|
344
|
+
}
|
|
345
|
+
export function createDefaultGuttersForSegment(segment, roofSegments = [], exclusions = []) {
|
|
346
|
+
return getGutterRunsForSegment(segment, roofSegments, exclusions).map((run) => GutterNode.parse({
|
|
347
|
+
name: 'Gutter',
|
|
348
|
+
roofSegmentId: segment.id,
|
|
349
|
+
position: run.position,
|
|
350
|
+
rotation: run.rotation,
|
|
351
|
+
length: run.length,
|
|
352
|
+
metadata: {
|
|
353
|
+
generatedBy: DEFAULT_GUTTER_GENERATOR,
|
|
354
|
+
autoGutterSide: run.side,
|
|
355
|
+
},
|
|
356
|
+
}));
|
|
357
|
+
}
|
|
358
|
+
export function getDefaultGutterSide(node, roofSegmentId) {
|
|
359
|
+
const parsed = GutterNode.safeParse(node);
|
|
360
|
+
if (!parsed.success)
|
|
361
|
+
return null;
|
|
362
|
+
if (roofSegmentId && parsed.data.roofSegmentId !== roofSegmentId)
|
|
363
|
+
return null;
|
|
364
|
+
const metadata = metadataRecord(parsed.data.metadata);
|
|
365
|
+
if (metadata.generatedBy !== DEFAULT_GUTTER_GENERATOR)
|
|
366
|
+
return null;
|
|
367
|
+
const side = metadata.autoGutterSide;
|
|
368
|
+
return side === '+X' || side === '-X' || side === '+Z' || side === '-Z' ? side : null;
|
|
369
|
+
}
|
|
370
|
+
export function isDefaultGutterNode(node, roofSegmentId) {
|
|
371
|
+
return getDefaultGutterSide(node, roofSegmentId) !== null;
|
|
372
|
+
}
|
|
373
|
+
export function hasAutoGutterMetadata(segment) {
|
|
374
|
+
return typeof metadataRecord(segment.metadata)[AUTO_GUTTER_METADATA_KEY] === 'boolean';
|
|
375
|
+
}
|
|
376
|
+
export function isAutoGutterEnabled(segment, nodes) {
|
|
377
|
+
const metadataValue = metadataRecord(segment.metadata)[AUTO_GUTTER_METADATA_KEY];
|
|
378
|
+
if (typeof metadataValue === 'boolean')
|
|
379
|
+
return metadataValue;
|
|
380
|
+
if (!nodes)
|
|
381
|
+
return false;
|
|
382
|
+
return (segment.children ?? []).some((childId) => isDefaultGutterNode(nodes[childId], segment.id));
|
|
383
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const HangerOverrides: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
3
|
+
fraction: z.ZodOptional<z.ZodNumber>;
|
|
4
|
+
skipped: z.ZodOptional<z.ZodBoolean>;
|
|
5
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, z.core.$strip>>;
|
|
7
|
+
//# sourceMappingURL=hanger-overrides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hanger-overrides.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/hanger-overrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,eAAe;;;;kBAO3B,CAAA"}
|
|
@@ -28,7 +28,7 @@ export declare const HvacEquipmentNode: z.ZodObject<{
|
|
|
28
28
|
fov: z.ZodOptional<z.ZodNumber>;
|
|
29
29
|
zoom: z.ZodOptional<z.ZodNumber>;
|
|
30
30
|
}, z.core.$strip>>;
|
|
31
|
-
metadata: z.ZodDefault<z.ZodOptional<z.
|
|
31
|
+
metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
32
32
|
id: z.ZodDefault<z.ZodTemplateLiteral<`hvac-equipment_${string}`>>;
|
|
33
33
|
type: z.ZodDefault<z.ZodLiteral<"hvac-equipment">>;
|
|
34
34
|
position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import dedent from 'dedent';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { BaseNode, nodeType, objectId } from '../base';
|
|
3
|
+
import { BaseNode, nodeType, objectId } from '../base.js';
|
|
4
4
|
/**
|
|
5
5
|
* HVAC equipment — the boxes duct systems start and end at: furnace,
|
|
6
6
|
* air handler, outdoor condenser.
|