@pascal-app/nodes 0.1.1 → 1.0.0-beta.2
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/README.md +34 -0
- package/dist/building/definition.js +1 -1
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +809 -72
- package/dist/cabinet/geometry.d.ts.map +1 -1
- package/dist/cabinet/geometry.js +4 -0
- package/dist/cabinet/move-frame.js +3 -3
- package/dist/cabinet/panel.d.ts.map +1 -1
- package/dist/cabinet/panel.js +1 -0
- package/dist/cabinet/placement-snap.d.ts +8 -0
- package/dist/cabinet/placement-snap.d.ts.map +1 -0
- package/dist/cabinet/placement-snap.js +19 -0
- package/dist/cabinet/presets.js +8 -8
- package/dist/cabinet/quick-actions.d.ts.map +1 -1
- package/dist/cabinet/quick-actions.js +9 -3
- package/dist/cabinet/resize-limits.d.ts +11 -0
- package/dist/cabinet/resize-limits.d.ts.map +1 -0
- package/dist/cabinet/resize-limits.js +22 -0
- package/dist/cabinet/run-layout.d.ts +8 -2
- package/dist/cabinet/run-layout.d.ts.map +1 -1
- package/dist/cabinet/run-layout.js +59 -7
- package/dist/cabinet/run-ops.d.ts +44 -3
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/run-ops.js +646 -110
- package/dist/cabinet/run-panel.d.ts +2 -1
- package/dist/cabinet/run-panel.d.ts.map +1 -1
- package/dist/cabinet/run-panel.js +38 -4
- package/dist/cabinet/stack-transitions.js +4 -4
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +95 -17
- package/dist/cabinet/wall-snap.d.ts.map +1 -1
- package/dist/cabinet/wall-snap.js +2 -6
- package/dist/ceiling/boundary-editor.d.ts.map +1 -1
- package/dist/ceiling/boundary-editor.js +2 -2
- package/dist/ceiling/definition.d.ts +1 -1
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +36 -5
- package/dist/ceiling/floorplan-affordances.d.ts +4 -4
- package/dist/ceiling/floorplan-move.d.ts +4 -4
- package/dist/ceiling/floorplan-move.d.ts.map +1 -1
- package/dist/ceiling/floorplan-move.js +5 -4
- package/dist/ceiling/hole-editor.d.ts.map +1 -1
- package/dist/ceiling/hole-editor.js +2 -2
- package/dist/ceiling/move-tool.d.ts.map +1 -1
- package/dist/ceiling/move-tool.js +4 -3
- package/dist/ceiling/panel.d.ts.map +1 -1
- package/dist/ceiling/panel.js +65 -3
- package/dist/ceiling/renderer.d.ts.map +1 -1
- package/dist/ceiling/renderer.js +6 -2
- package/dist/ceiling/tool.d.ts.map +1 -1
- package/dist/ceiling/tool.js +12 -1
- package/dist/chimney/definition.d.ts.map +1 -1
- package/dist/chimney/definition.js +1 -0
- package/dist/chimney/tool.d.ts.map +1 -1
- package/dist/chimney/tool.js +16 -1
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +14 -2
- package/dist/column/floorplan-affordances.d.ts.map +1 -1
- package/dist/column/floorplan-affordances.js +19 -14
- package/dist/column/floorplan-move.d.ts.map +1 -1
- package/dist/column/floorplan-move.js +7 -2
- package/dist/column/floorplan.d.ts +9 -1
- package/dist/column/floorplan.d.ts.map +1 -1
- package/dist/column/floorplan.js +59 -4
- package/dist/column/tool.d.ts.map +1 -1
- package/dist/column/tool.js +33 -7
- package/dist/construction-dimension/definition.d.ts +4 -0
- package/dist/construction-dimension/definition.d.ts.map +1 -0
- package/dist/construction-dimension/definition.js +83 -0
- package/dist/construction-dimension/drawing-coordination.d.ts +7 -0
- package/dist/construction-dimension/drawing-coordination.d.ts.map +1 -0
- package/dist/construction-dimension/drawing-coordination.js +54 -0
- package/dist/construction-dimension/floorplan-affordances.d.ts +4 -0
- package/dist/construction-dimension/floorplan-affordances.d.ts.map +1 -0
- package/dist/construction-dimension/floorplan-affordances.js +114 -0
- package/dist/construction-dimension/floorplan-tool.d.ts +21 -0
- package/dist/construction-dimension/floorplan-tool.d.ts.map +1 -0
- package/dist/construction-dimension/floorplan-tool.js +557 -0
- package/dist/construction-dimension/floorplan.d.ts +3 -0
- package/dist/construction-dimension/floorplan.d.ts.map +1 -0
- package/dist/construction-dimension/floorplan.js +457 -0
- package/dist/construction-dimension/geometry.d.ts +31 -0
- package/dist/construction-dimension/geometry.d.ts.map +1 -0
- package/dist/construction-dimension/geometry.js +144 -0
- package/dist/construction-dimension/index.d.ts +4 -0
- package/dist/construction-dimension/index.d.ts.map +1 -0
- package/dist/construction-dimension/index.js +3 -0
- package/dist/construction-dimension/panel.d.ts +2 -0
- package/dist/construction-dimension/panel.d.ts.map +1 -0
- package/dist/construction-dimension/panel.js +128 -0
- package/dist/construction-dimension/parametrics.d.ts +3 -0
- package/dist/construction-dimension/parametrics.d.ts.map +1 -0
- package/dist/construction-dimension/parametrics.js +4 -0
- package/dist/construction-dimension/schema.d.ts +2 -0
- package/dist/construction-dimension/schema.d.ts.map +1 -0
- package/dist/construction-dimension/schema.js +1 -0
- package/dist/door/contextual-dimensions.d.ts +3 -0
- package/dist/door/contextual-dimensions.d.ts.map +1 -0
- package/dist/door/contextual-dimensions.js +7 -0
- package/dist/door/definition.d.ts.map +1 -1
- package/dist/door/definition.js +13 -8
- package/dist/door/floorplan-affordances.d.ts +2 -5
- package/dist/door/floorplan-affordances.d.ts.map +1 -1
- package/dist/door/floorplan-affordances.js +9 -18
- package/dist/door/floorplan.d.ts +3 -4
- package/dist/door/floorplan.d.ts.map +1 -1
- package/dist/door/floorplan.js +88 -6
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +2 -2
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +3 -1
- package/dist/door/schema.d.ts +1 -1
- package/dist/door/schema.d.ts.map +1 -1
- package/dist/door/schema.js +1 -1
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +63 -6
- package/dist/dormer/definition.d.ts.map +1 -1
- package/dist/dormer/definition.js +1 -0
- package/dist/dormer/tool.d.ts.map +1 -1
- package/dist/dormer/tool.js +23 -1
- package/dist/duct-segment/tool.d.ts.map +1 -1
- package/dist/duct-segment/tool.js +20 -9
- package/dist/duct-terminal/tool.d.ts.map +1 -1
- package/dist/duct-terminal/tool.js +9 -6
- package/dist/elevator/floorplan-affordances.d.ts +2 -6
- package/dist/elevator/floorplan-affordances.d.ts.map +1 -1
- package/dist/elevator/floorplan-affordances.js +13 -12
- package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
- package/dist/fence/actions/move-endpoint.js +29 -1
- package/dist/fence/definition.d.ts.map +1 -1
- package/dist/fence/definition.js +74 -14
- package/dist/fence/floorplan-affordances.d.ts.map +1 -1
- package/dist/fence/floorplan-affordances.js +48 -11
- package/dist/fence/floorplan-move.d.ts.map +1 -1
- package/dist/fence/floorplan-move.js +38 -3
- package/dist/fence/geometry.d.ts.map +1 -1
- package/dist/fence/geometry.js +15 -1
- package/dist/fence/lift.d.ts +38 -0
- package/dist/fence/lift.d.ts.map +1 -0
- package/dist/fence/lift.js +51 -0
- package/dist/fence/move-tool.d.ts.map +1 -1
- package/dist/fence/move-tool.js +25 -5
- package/dist/fence/system.d.ts +3 -0
- package/dist/fence/system.d.ts.map +1 -0
- package/dist/fence/system.js +46 -0
- package/dist/fence/tool.d.ts.map +1 -1
- package/dist/fence/tool.js +103 -32
- package/dist/hvac-equipment/tool.d.ts.map +1 -1
- package/dist/hvac-equipment/tool.js +8 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/item/definition.d.ts.map +1 -1
- package/dist/item/definition.js +7 -1
- package/dist/item/floorplan-move.d.ts.map +1 -1
- package/dist/item/floorplan-move.js +50 -43
- package/dist/item/floorplan.d.ts +1 -0
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/floorplan.js +49 -0
- package/dist/item/renderer.d.ts +3 -0
- package/dist/item/renderer.d.ts.map +1 -1
- package/dist/item/renderer.js +96 -8
- package/dist/level/definition.d.ts.map +1 -1
- package/dist/level/definition.js +7 -3
- package/dist/lineset/tool.d.ts.map +1 -1
- package/dist/lineset/tool.js +5 -1
- package/dist/liquid-line/tool.d.ts.map +1 -1
- package/dist/liquid-line/tool.js +7 -1
- package/dist/measurement/definition.d.ts.map +1 -1
- package/dist/measurement/definition.js +5 -0
- package/dist/measurement/floorplan.d.ts.map +1 -1
- package/dist/measurement/floorplan.js +11 -10
- package/dist/measurement/index.d.ts +1 -1
- package/dist/measurement/index.d.ts.map +1 -1
- package/dist/measurement/index.js +1 -1
- package/dist/measurement/resolve.d.ts +5 -0
- package/dist/measurement/resolve.d.ts.map +1 -1
- package/dist/measurement/resolve.js +2 -2
- package/dist/measurement/surface-query.js +5 -5
- package/dist/measurement/tool.d.ts +6 -1
- package/dist/measurement/tool.d.ts.map +1 -1
- package/dist/measurement/tool.js +7 -11
- package/dist/pipe-segment/tool.d.ts.map +1 -1
- package/dist/pipe-segment/tool.js +22 -19
- package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
- package/dist/roof-segment/floorplan-affordances.js +14 -8
- package/dist/shared/construction-dimension-standards.d.ts +34 -0
- package/dist/shared/construction-dimension-standards.d.ts.map +1 -0
- package/dist/shared/construction-dimension-standards.js +18 -0
- package/dist/shared/construction-length.d.ts +10 -0
- package/dist/shared/construction-length.d.ts.map +1 -0
- package/dist/shared/construction-length.js +57 -0
- package/dist/shared/dimension-string.d.ts +20 -0
- package/dist/shared/dimension-string.d.ts.map +1 -0
- package/dist/shared/dimension-string.js +19 -0
- package/dist/shared/draft-axis-guides.d.ts +36 -0
- package/dist/shared/draft-axis-guides.d.ts.map +1 -0
- package/dist/shared/draft-axis-guides.js +107 -0
- package/dist/shared/move-roof-tool.d.ts.map +1 -1
- package/dist/shared/move-roof-tool.js +17 -3
- package/dist/shared/opening-documentation-fields.d.ts +16 -0
- package/dist/shared/opening-documentation-fields.d.ts.map +1 -0
- package/dist/shared/opening-documentation-fields.js +54 -0
- package/dist/shared/opening-documentation.d.ts +47 -0
- package/dist/shared/opening-documentation.d.ts.map +1 -0
- package/dist/shared/opening-documentation.js +300 -0
- package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
- package/dist/shared/opening-guides-runtime.js +3 -2
- package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
- package/dist/shared/opening-placement-dimensions.js +14 -5
- package/dist/shared/wall-opening-ceiling.d.ts +30 -0
- package/dist/shared/wall-opening-ceiling.d.ts.map +1 -0
- package/dist/shared/wall-opening-ceiling.js +29 -0
- package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
- package/dist/shelf/floorplan-affordances.js +10 -5
- package/dist/shelf/floorplan-move.d.ts +2 -16
- package/dist/shelf/floorplan-move.d.ts.map +1 -1
- package/dist/shelf/floorplan-move.js +19 -40
- package/dist/shelf/tool.d.ts.map +1 -1
- package/dist/shelf/tool.js +8 -3
- package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
- package/dist/site/recessed-slab-ground-holes.js +1 -4
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +118 -28
- package/dist/site/terrain-drape.d.ts +91 -0
- package/dist/site/terrain-drape.d.ts.map +1 -0
- package/dist/site/terrain-drape.js +205 -0
- package/dist/site/terrain-geometry.d.ts +131 -0
- package/dist/site/terrain-geometry.d.ts.map +1 -0
- package/dist/site/terrain-geometry.js +259 -0
- package/dist/site/terrain-mesh.d.ts +49 -0
- package/dist/site/terrain-mesh.d.ts.map +1 -0
- package/dist/site/terrain-mesh.js +122 -0
- package/dist/site/terrain-renderer.d.ts +28 -0
- package/dist/site/terrain-renderer.d.ts.map +1 -0
- package/dist/site/terrain-renderer.js +69 -0
- package/dist/skylight/definition.d.ts.map +1 -1
- package/dist/skylight/definition.js +1 -0
- package/dist/skylight/tool.d.ts.map +1 -1
- package/dist/skylight/tool.js +16 -1
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +87 -10
- package/dist/slab/elevation-limit.d.ts +43 -0
- package/dist/slab/elevation-limit.d.ts.map +1 -0
- package/dist/slab/elevation-limit.js +124 -0
- package/dist/slab/floorplan-affordances.d.ts +16 -0
- package/dist/slab/floorplan-affordances.d.ts.map +1 -1
- package/dist/slab/geometry.d.ts.map +1 -1
- package/dist/slab/geometry.js +98 -5
- package/dist/slab/panel.d.ts.map +1 -1
- package/dist/slab/panel.js +82 -4
- package/dist/slab/parametrics.d.ts +1 -1
- package/dist/slab/parametrics.d.ts.map +1 -1
- package/dist/slab/parametrics.js +13 -1
- package/dist/slab/placement-ownership.d.ts +3 -0
- package/dist/slab/placement-ownership.d.ts.map +1 -0
- package/dist/slab/placement-ownership.js +3 -0
- package/dist/slab/quick-measurement.d.ts.map +1 -1
- package/dist/slab/quick-measurement.js +3 -2
- package/dist/slab/system.d.ts.map +1 -1
- package/dist/slab/system.js +14 -4
- package/dist/slab/tool.d.ts.map +1 -1
- package/dist/slab/tool.js +81 -23
- package/dist/solar-panel/definition.d.ts.map +1 -1
- package/dist/solar-panel/definition.js +1 -0
- package/dist/solar-panel/tool.d.ts.map +1 -1
- package/dist/solar-panel/tool.js +17 -1
- package/dist/spawn/definition.d.ts.map +1 -1
- package/dist/spawn/definition.js +1 -0
- package/dist/spawn/floorplan-affordances.d.ts.map +1 -1
- package/dist/spawn/floorplan-affordances.js +7 -4
- package/dist/spawn/floorplan-move.d.ts.map +1 -1
- package/dist/spawn/floorplan-move.js +8 -6
- package/dist/spawn/renderer.d.ts +4 -0
- package/dist/spawn/renderer.d.ts.map +1 -1
- package/dist/spawn/renderer.js +32 -18
- package/dist/spawn/tool.d.ts +2 -2
- package/dist/spawn/tool.d.ts.map +1 -1
- package/dist/spawn/tool.js +78 -11
- package/dist/stair/definition.d.ts.map +1 -1
- package/dist/stair/definition.js +15 -7
- package/dist/stair/destination.d.ts +16 -0
- package/dist/stair/destination.d.ts.map +1 -0
- package/dist/stair/destination.js +24 -0
- package/dist/stair/documentation.d.ts +8 -0
- package/dist/stair/documentation.d.ts.map +1 -0
- package/dist/stair/documentation.js +245 -0
- package/dist/stair/floor-stack.d.ts.map +1 -1
- package/dist/stair/floor-stack.js +38 -0
- package/dist/stair/floorplan-affordances.d.ts.map +1 -1
- package/dist/stair/floorplan-affordances.js +28 -9
- package/dist/stair/floorplan-move.d.ts +3 -5
- package/dist/stair/floorplan-move.d.ts.map +1 -1
- package/dist/stair/floorplan-move.js +14 -16
- package/dist/stair/floorplan.d.ts.map +1 -1
- package/dist/stair/floorplan.js +27 -14
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +35 -2
- package/dist/stair/renderer.d.ts.map +1 -1
- package/dist/stair/renderer.js +4 -3
- package/dist/structural-grid/coordination.d.ts +16 -0
- package/dist/structural-grid/coordination.d.ts.map +1 -0
- package/dist/structural-grid/coordination.js +105 -0
- package/dist/structural-grid/definition.d.ts +4 -0
- package/dist/structural-grid/definition.d.ts.map +1 -0
- package/dist/structural-grid/definition.js +51 -0
- package/dist/structural-grid/floorplan-tool.d.ts +16 -0
- package/dist/structural-grid/floorplan-tool.d.ts.map +1 -0
- package/dist/structural-grid/floorplan-tool.js +183 -0
- package/dist/structural-grid/floorplan.d.ts +3 -0
- package/dist/structural-grid/floorplan.d.ts.map +1 -0
- package/dist/structural-grid/floorplan.js +61 -0
- package/dist/structural-grid/index.d.ts +2 -0
- package/dist/structural-grid/index.d.ts.map +1 -0
- package/dist/structural-grid/index.js +1 -0
- package/dist/structural-grid/schema.d.ts +2 -0
- package/dist/structural-grid/schema.d.ts.map +1 -0
- package/dist/structural-grid/schema.js +1 -0
- package/dist/wall/construction-dimensions.d.ts +32 -0
- package/dist/wall/construction-dimensions.d.ts.map +1 -0
- package/dist/wall/construction-dimensions.js +1031 -0
- package/dist/wall/contextual-dimensions.d.ts +13 -0
- package/dist/wall/contextual-dimensions.d.ts.map +1 -0
- package/dist/wall/contextual-dimensions.js +221 -0
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +20 -1
- package/dist/wall/floorplan-affordances.d.ts.map +1 -1
- package/dist/wall/floorplan-affordances.js +23 -8
- package/dist/wall/floorplan-overrides.d.ts +9 -6
- package/dist/wall/floorplan-overrides.d.ts.map +1 -1
- package/dist/wall/floorplan-overrides.js +20 -11
- package/dist/wall/floorplan.d.ts +12 -3
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +121 -79
- package/dist/wall/measurement.d.ts.map +1 -1
- package/dist/wall/measurement.js +17 -4
- package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
- package/dist/wall/move-endpoint-tool.js +74 -27
- package/dist/wall/move-shared.d.ts.map +1 -1
- package/dist/wall/move-shared.js +3 -2
- package/dist/wall/move-tool.d.ts.map +1 -1
- package/dist/wall/move-tool.js +15 -3
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +10 -6
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +32 -5
- package/dist/wall/parametrics.d.ts.map +1 -1
- package/dist/wall/parametrics.js +2 -0
- package/dist/wall/preview.d.ts +8 -0
- package/dist/wall/preview.d.ts.map +1 -0
- package/dist/wall/preview.js +39 -0
- package/dist/wall/quick-measurement.d.ts.map +1 -1
- package/dist/wall/quick-measurement.js +3 -2
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +7 -5
- package/dist/wall/system.d.ts +1 -1
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +37 -2
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +148 -96
- package/dist/wall/treatment-level-data.d.ts +14 -0
- package/dist/wall/treatment-level-data.d.ts.map +1 -0
- package/dist/wall/treatment-level-data.js +31 -0
- package/dist/wall/treatments.d.ts +8 -2
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +58 -15
- package/dist/window/contextual-dimensions.d.ts +3 -0
- package/dist/window/contextual-dimensions.d.ts.map +1 -0
- package/dist/window/contextual-dimensions.js +7 -0
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +15 -10
- package/dist/window/floorplan-affordances.d.ts +2 -5
- package/dist/window/floorplan-affordances.d.ts.map +1 -1
- package/dist/window/floorplan-affordances.js +9 -15
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +1 -1
- package/dist/window/floorplan.d.ts.map +1 -1
- package/dist/window/floorplan.js +7 -1
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +3 -3
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +4 -1
- package/dist/window/schema.d.ts +1 -1
- package/dist/window/schema.d.ts.map +1 -1
- package/dist/window/schema.js +1 -1
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +64 -7
- package/dist/window/window-math.d.ts +7 -3
- package/dist/window/window-math.d.ts.map +1 -1
- package/dist/window/window-math.js +8 -3
- package/dist/zone/contextual-dimensions.d.ts +3 -0
- package/dist/zone/contextual-dimensions.d.ts.map +1 -0
- package/dist/zone/contextual-dimensions.js +43 -0
- package/dist/zone/definition.d.ts.map +1 -1
- package/dist/zone/definition.js +9 -1
- package/dist/zone/floorplan-affordances.d.ts +36 -0
- package/dist/zone/floorplan-affordances.d.ts.map +1 -1
- package/dist/zone/floorplan.d.ts.map +1 -1
- package/dist/zone/floorplan.js +59 -3
- package/dist/zone/quantities-panel.d.ts.map +1 -1
- package/dist/zone/quantities-panel.js +48 -4
- package/dist/zone/room-clear-dimensions.d.ts +3 -0
- package/dist/zone/room-clear-dimensions.d.ts.map +1 -0
- package/dist/zone/room-clear-dimensions.js +406 -0
- package/dist/zone/room-documentation.d.ts +11 -0
- package/dist/zone/room-documentation.d.ts.map +1 -0
- package/dist/zone/room-documentation.js +97 -0
- package/package.json +7 -7
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type FloorplanGeometry, type GeometryContext, type WallNode } from '@pascal-app/core';
|
|
2
|
+
type WallHostedOpening = {
|
|
3
|
+
position: readonly [number, number, number];
|
|
4
|
+
width: number;
|
|
5
|
+
};
|
|
6
|
+
type OpeningDimensionOptions = {
|
|
7
|
+
showClearancesWhileMoving: boolean;
|
|
8
|
+
useExteriorNormal: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function buildWallContextualDimensions(node: WallNode, ctx: GeometryContext): FloorplanGeometry | null;
|
|
11
|
+
export declare function buildWallHostedOpeningContextualDimensions(node: WallHostedOpening, ctx: GeometryContext, options: OpeningDimensionOptions): FloorplanGeometry | null;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=contextual-dimensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextual-dimensions.d.ts","sourceRoot":"","sources":["../../src/wall/contextual-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAKpB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAGzB,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,uBAAuB,GAAG;IAC7B,yBAAyB,EAAE,OAAO,CAAA;IAClC,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAAA;AA+ID,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CA8C1B;AAED,wBAAgB,0CAA0C,CACxD,IAAI,EAAE,iBAAiB,EACvB,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,uBAAuB,GAC/B,iBAAiB,GAAG,IAAI,CAyE1B"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { getWallCurveFrameAt, getWallCurveLength, getWallThickness, isCurvedWall, } from '@pascal-app/core';
|
|
2
|
+
import { formatLinearMeasurement, readFloorplanMetricNotationOverride } from '@pascal-app/editor';
|
|
3
|
+
const WALL_CONNECTION_TOLERANCE = 0.03;
|
|
4
|
+
function formatLength(value, ctx) {
|
|
5
|
+
return formatLinearMeasurement(value, ctx.viewState?.unit ?? 'metric', readFloorplanMetricNotationOverride(ctx) ?? 'meters');
|
|
6
|
+
}
|
|
7
|
+
function selectedStroke(ctx) {
|
|
8
|
+
return ctx.viewState?.palette?.selectedStroke ?? '#2563eb';
|
|
9
|
+
}
|
|
10
|
+
function contextualWallDimensionNormal(wall, frontNormal, siblings) {
|
|
11
|
+
const front = [cleanZero(frontNormal[0]), cleanZero(frontNormal[1])];
|
|
12
|
+
const back = [cleanZero(-front[0]), cleanZero(-front[1])];
|
|
13
|
+
if (wall.frontSide === 'exterior' && wall.backSide !== 'exterior')
|
|
14
|
+
return front;
|
|
15
|
+
if (wall.backSide === 'exterior' && wall.frontSide !== 'exterior')
|
|
16
|
+
return back;
|
|
17
|
+
if (wall.frontSide === 'interior' && wall.backSide === 'interior')
|
|
18
|
+
return front;
|
|
19
|
+
const walls = [
|
|
20
|
+
wall,
|
|
21
|
+
...siblings.filter((sibling) => sibling.type === 'wall'),
|
|
22
|
+
];
|
|
23
|
+
let centroidX = 0;
|
|
24
|
+
let centroidY = 0;
|
|
25
|
+
for (const candidate of walls) {
|
|
26
|
+
centroidX += candidate.start[0] + candidate.end[0];
|
|
27
|
+
centroidY += candidate.start[1] + candidate.end[1];
|
|
28
|
+
}
|
|
29
|
+
const centroid = [centroidX / (walls.length * 2), centroidY / (walls.length * 2)];
|
|
30
|
+
const midpoint = [
|
|
31
|
+
(wall.start[0] + wall.end[0]) / 2,
|
|
32
|
+
(wall.start[1] + wall.end[1]) / 2,
|
|
33
|
+
];
|
|
34
|
+
const towardFront = (midpoint[0] - centroid[0]) * front[0] + (midpoint[1] - centroid[1]) * front[1];
|
|
35
|
+
return towardFront >= 0 ? front : back;
|
|
36
|
+
}
|
|
37
|
+
function cleanZero(value) {
|
|
38
|
+
return Math.abs(value) <= Number.EPSILON ? 0 : value;
|
|
39
|
+
}
|
|
40
|
+
function cross(left, right) {
|
|
41
|
+
return left[0] * right[1] - left[1] * right[0];
|
|
42
|
+
}
|
|
43
|
+
function pointSegmentDistance(point, start, end) {
|
|
44
|
+
const dx = end[0] - start[0];
|
|
45
|
+
const dy = end[1] - start[1];
|
|
46
|
+
const lengthSquared = dx * dx + dy * dy;
|
|
47
|
+
if (lengthSquared <= 1e-12)
|
|
48
|
+
return Math.hypot(point[0] - start[0], point[1] - start[1]);
|
|
49
|
+
const t = Math.max(0, Math.min(1, ((point[0] - start[0]) * dx + (point[1] - start[1]) * dy) / lengthSquared));
|
|
50
|
+
return Math.hypot(point[0] - (start[0] + dx * t), point[1] - (start[1] + dy * t));
|
|
51
|
+
}
|
|
52
|
+
function structuralFaceProjections(wallStart, wallTangent, connectedWall) {
|
|
53
|
+
if (isCurvedWall(connectedWall))
|
|
54
|
+
return [];
|
|
55
|
+
const dx = connectedWall.end[0] - connectedWall.start[0];
|
|
56
|
+
const dy = connectedWall.end[1] - connectedWall.start[1];
|
|
57
|
+
const length = Math.hypot(dx, dy);
|
|
58
|
+
if (length <= 1e-6)
|
|
59
|
+
return [];
|
|
60
|
+
const direction = [dx / length, dy / length];
|
|
61
|
+
const denominator = cross(wallTangent, direction);
|
|
62
|
+
if (Math.abs(denominator) <= 1e-6)
|
|
63
|
+
return [];
|
|
64
|
+
const normal = [-direction[1], direction[0]];
|
|
65
|
+
const halfThickness = getWallThickness(connectedWall) / 2;
|
|
66
|
+
return [-halfThickness, halfThickness].map((offset) => {
|
|
67
|
+
const facePoint = [
|
|
68
|
+
connectedWall.start[0] + normal[0] * offset,
|
|
69
|
+
connectedWall.start[1] + normal[1] * offset,
|
|
70
|
+
];
|
|
71
|
+
return (cross([facePoint[0] - wallStart[0], facePoint[1] - wallStart[1]], direction) / denominator);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function wallStudFaceSpan(wall, siblings) {
|
|
75
|
+
const dx = wall.end[0] - wall.start[0];
|
|
76
|
+
const dy = wall.end[1] - wall.start[1];
|
|
77
|
+
const centerlineLength = Math.hypot(dx, dy);
|
|
78
|
+
if (centerlineLength <= 1e-6) {
|
|
79
|
+
return { start: wall.start, end: wall.end, length: centerlineLength };
|
|
80
|
+
}
|
|
81
|
+
const tangent = [dx / centerlineLength, dy / centerlineLength];
|
|
82
|
+
let startProjection = 0;
|
|
83
|
+
let endProjection = centerlineLength;
|
|
84
|
+
for (const sibling of siblings) {
|
|
85
|
+
if (sibling.type !== 'wall' || sibling.id === wall.id)
|
|
86
|
+
continue;
|
|
87
|
+
const projections = structuralFaceProjections(wall.start, tangent, sibling);
|
|
88
|
+
if (pointSegmentDistance(wall.start, sibling.start, sibling.end) <= WALL_CONNECTION_TOLERANCE) {
|
|
89
|
+
for (const projection of projections) {
|
|
90
|
+
if (projection > startProjection && projection < endProjection) {
|
|
91
|
+
startProjection = projection;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (pointSegmentDistance(wall.end, sibling.start, sibling.end) <= WALL_CONNECTION_TOLERANCE) {
|
|
96
|
+
for (const projection of projections) {
|
|
97
|
+
if (projection > startProjection && projection < endProjection) {
|
|
98
|
+
endProjection = projection;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const start = [
|
|
104
|
+
wall.start[0] + tangent[0] * startProjection,
|
|
105
|
+
wall.start[1] + tangent[1] * startProjection,
|
|
106
|
+
];
|
|
107
|
+
const end = [
|
|
108
|
+
wall.start[0] + tangent[0] * endProjection,
|
|
109
|
+
wall.start[1] + tangent[1] * endProjection,
|
|
110
|
+
];
|
|
111
|
+
return { start, end, length: Math.max(0, endProjection - startProjection) };
|
|
112
|
+
}
|
|
113
|
+
export function buildWallContextualDimensions(node, ctx) {
|
|
114
|
+
const length = getWallCurveLength(node);
|
|
115
|
+
if (!Number.isFinite(length) || length <= 1e-6)
|
|
116
|
+
return null;
|
|
117
|
+
if (isCurvedWall(node)) {
|
|
118
|
+
const frame = getWallCurveFrameAt(node, 0.5);
|
|
119
|
+
const offsetNormal = contextualWallDimensionNormal(node, [frame.normal.x, frame.normal.y], ctx.siblings);
|
|
120
|
+
return {
|
|
121
|
+
kind: 'dimension-label',
|
|
122
|
+
appearance: 'outlined',
|
|
123
|
+
cx: frame.point.x + offsetNormal[0] * 0.38,
|
|
124
|
+
cy: frame.point.y + offsetNormal[1] * 0.38,
|
|
125
|
+
text: formatLength(length, ctx),
|
|
126
|
+
angle: Math.atan2(frame.tangent.y, frame.tangent.x),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const dx = node.end[0] - node.start[0];
|
|
130
|
+
const dy = node.end[1] - node.start[1];
|
|
131
|
+
const chordLength = Math.hypot(dx, dy);
|
|
132
|
+
if (chordLength <= 1e-6)
|
|
133
|
+
return null;
|
|
134
|
+
const offsetNormal = contextualWallDimensionNormal(node, [-dy / chordLength, dx / chordLength], ctx.siblings);
|
|
135
|
+
const span = node.frontSide === 'interior' && node.backSide === 'interior'
|
|
136
|
+
? wallStudFaceSpan(node, ctx.siblings)
|
|
137
|
+
: { start: node.start, end: node.end, length: chordLength };
|
|
138
|
+
if (span.length <= 1e-6)
|
|
139
|
+
return null;
|
|
140
|
+
return {
|
|
141
|
+
kind: 'dimension',
|
|
142
|
+
start: span.start,
|
|
143
|
+
end: span.end,
|
|
144
|
+
offsetNormal,
|
|
145
|
+
offsetDistance: 0.34,
|
|
146
|
+
extensionOvershoot: 0.08,
|
|
147
|
+
text: formatLength(span.length, ctx),
|
|
148
|
+
stroke: selectedStroke(ctx),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
export function buildWallHostedOpeningContextualDimensions(node, ctx, options) {
|
|
152
|
+
const wall = ctx.parent;
|
|
153
|
+
if (wall?.type !== 'wall' || node.width <= 1e-6)
|
|
154
|
+
return null;
|
|
155
|
+
const dx = wall.end[0] - wall.start[0];
|
|
156
|
+
const dy = wall.end[1] - wall.start[1];
|
|
157
|
+
const wallLength = Math.hypot(dx, dy);
|
|
158
|
+
if (wallLength <= 1e-6)
|
|
159
|
+
return null;
|
|
160
|
+
const dirX = dx / wallLength;
|
|
161
|
+
const dirY = dy / wallLength;
|
|
162
|
+
const cx = wall.start[0] + dirX * node.position[0];
|
|
163
|
+
const cy = wall.start[1] + dirY * node.position[0];
|
|
164
|
+
const halfWidth = node.width / 2;
|
|
165
|
+
const openingStart = [cx - dirX * halfWidth, cy - dirY * halfWidth];
|
|
166
|
+
const openingEnd = [cx + dirX * halfWidth, cy + dirY * halfWidth];
|
|
167
|
+
if (!options.useExteriorNormal || isCurvedWall(wall)) {
|
|
168
|
+
return {
|
|
169
|
+
kind: 'dimension',
|
|
170
|
+
start: openingStart,
|
|
171
|
+
end: openingEnd,
|
|
172
|
+
offsetNormal: [-dirY, dirX],
|
|
173
|
+
offsetDistance: 0.34,
|
|
174
|
+
extensionOvershoot: 0.08,
|
|
175
|
+
text: formatLength(node.width, ctx),
|
|
176
|
+
stroke: selectedStroke(ctx),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const offsetNormal = contextualWallDimensionNormal(wall, [-dirY, dirX], ctx.siblings);
|
|
180
|
+
if (!options.showClearancesWhileMoving || !ctx.viewState?.moving) {
|
|
181
|
+
return {
|
|
182
|
+
kind: 'dimension',
|
|
183
|
+
start: openingStart,
|
|
184
|
+
end: openingEnd,
|
|
185
|
+
offsetNormal,
|
|
186
|
+
offsetDistance: 0.34,
|
|
187
|
+
extensionOvershoot: 0.08,
|
|
188
|
+
text: formatLength(node.width, ctx),
|
|
189
|
+
stroke: selectedStroke(ctx),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const span = wallStudFaceSpan(wall, ctx.siblings);
|
|
193
|
+
const spanStart = (span.start[0] - wall.start[0]) * dirX + (span.start[1] - wall.start[1]) * dirY;
|
|
194
|
+
const spanEnd = (span.end[0] - wall.start[0]) * dirX + (span.end[1] - wall.start[1]) * dirY;
|
|
195
|
+
const openingStartAlong = node.position[0] - halfWidth;
|
|
196
|
+
const openingEndAlong = node.position[0] + halfWidth;
|
|
197
|
+
return {
|
|
198
|
+
kind: 'dimension-string',
|
|
199
|
+
segments: [
|
|
200
|
+
{
|
|
201
|
+
start: span.start,
|
|
202
|
+
end: openingStart,
|
|
203
|
+
text: formatLength(Math.max(0, openingStartAlong - spanStart), ctx),
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
start: openingStart,
|
|
207
|
+
end: openingEnd,
|
|
208
|
+
text: formatLength(node.width, ctx),
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
start: openingEnd,
|
|
212
|
+
end: span.end,
|
|
213
|
+
text: formatLength(Math.max(0, spanEnd - openingEndAlong), ctx),
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
offsetNormal,
|
|
217
|
+
offsetDistance: 0.34,
|
|
218
|
+
extensionOvershoot: 0.08,
|
|
219
|
+
stroke: selectedStroke(ctx),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/wall/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/wall/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAejE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGnC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,QAAQ,CAoI1D,CAAA"}
|
package/dist/wall/definition.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { buildWallContextualDimensions } from './contextual-dimensions';
|
|
1
2
|
import { buildWallFloorplan, computeWallFloorplanLevelData } from './floorplan';
|
|
2
3
|
import { wallCurveAffordance, wallMoveEndpointAffordance } from './floorplan-affordances';
|
|
3
4
|
import { wallFloorplanMoveTarget } from './floorplan-move';
|
|
@@ -26,10 +27,27 @@ import { wallSlots } from './slots';
|
|
|
26
27
|
export const wallDefinition = {
|
|
27
28
|
kind: 'wall',
|
|
28
29
|
snapProfile: 'structural',
|
|
29
|
-
schemaVersion:
|
|
30
|
+
schemaVersion: 7,
|
|
30
31
|
schema: WallNode,
|
|
31
32
|
category: 'structure',
|
|
32
33
|
surfaceRole: 'wall',
|
|
34
|
+
extensions: {
|
|
35
|
+
'pascal:editor/floorplan': {
|
|
36
|
+
contextualDimensions: buildWallContextualDimensions,
|
|
37
|
+
actionMenu: {
|
|
38
|
+
canCurve: ({ node, nodes }) => !node.children.some((childId) => {
|
|
39
|
+
const child = nodes[childId];
|
|
40
|
+
if (!child)
|
|
41
|
+
return false;
|
|
42
|
+
if (child.type === 'door' || child.type === 'window')
|
|
43
|
+
return true;
|
|
44
|
+
if (child.type !== 'item')
|
|
45
|
+
return false;
|
|
46
|
+
return child.asset?.attachTo === 'wall' || child.asset?.attachTo === 'wall-side';
|
|
47
|
+
}),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
33
51
|
defaults: () => ({
|
|
34
52
|
object: 'node',
|
|
35
53
|
parentId: null,
|
|
@@ -80,6 +98,7 @@ export const wallDefinition = {
|
|
|
80
98
|
// auto-slab live preview, history dances). Placement is wired via
|
|
81
99
|
// `def.tool`.
|
|
82
100
|
tool: () => import('./tool'),
|
|
101
|
+
preview: () => import('./preview'),
|
|
83
102
|
affordanceTools: {
|
|
84
103
|
curve: () => import('./curve-tool'),
|
|
85
104
|
'move-endpoint': () => import('./move-endpoint-tool'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAQxB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAoFzB;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,QAAQ,CAuD7D,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAQxB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAoFzB;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,QAAQ,CAuD7D,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,QAAQ,CA0KpE,CAAA"}
|
|
@@ -97,6 +97,18 @@ export const wallMoveEndpointAffordance = {
|
|
|
97
97
|
const originalEnd = [...node.end];
|
|
98
98
|
const linkedWalls = collectLinkedWalls(nodes, node.id, originalStart, originalEnd);
|
|
99
99
|
const affectedIds = [node.id, ...linkedWalls.map((w) => w.id)];
|
|
100
|
+
const movingOriginal = endpoint === 'start' ? originalStart : originalEnd;
|
|
101
|
+
// Walls attached to the MOVING corner cascade with the drag, but the snap
|
|
102
|
+
// pipeline reads the scene store, which keeps their pre-drag coordinates
|
|
103
|
+
// until commit. Their stale corners would recreate the old junction as a
|
|
104
|
+
// snap/alignment target: inside the connect radius the endpoint could
|
|
105
|
+
// never land closer than ~5cm to where it started, making sub-5cm
|
|
106
|
+
// corrections (e.g. squaring a scan-imported 91° corner) impossible.
|
|
107
|
+
// Excluded while attached; under Alt-detach they stay put and remain
|
|
108
|
+
// legitimate targets. Mirrors the 3D move-endpoint tool.
|
|
109
|
+
const movingLinkedWallIds = linkedWalls
|
|
110
|
+
.filter((w) => pointsEqual(w.start, movingOriginal) || pointsEqual(w.end, movingOriginal))
|
|
111
|
+
.map((w) => w.id);
|
|
100
112
|
// Remember the latest preview so `commit()` can write it tracked.
|
|
101
113
|
let lastPrimaryStart = originalStart;
|
|
102
114
|
let lastPrimaryEnd = originalEnd;
|
|
@@ -107,11 +119,12 @@ export const wallMoveEndpointAffordance = {
|
|
|
107
119
|
// Re-collect walls every tick so the snap pipeline sees fresh
|
|
108
120
|
// positions (matters when the user releases + re-grabs without
|
|
109
121
|
// unmounting the layer). Snap reads from scene — which holds
|
|
110
|
-
// the pre-drag positions throughout — so
|
|
111
|
-
//
|
|
112
|
-
// the
|
|
122
|
+
// the pre-drag positions throughout — so walls that cascade with
|
|
123
|
+
// the moving corner are excluded (stale coordinates); under
|
|
124
|
+
// Alt-detach they stay put, so they rejoin the candidate pool.
|
|
113
125
|
const sceneNodes = useScene.getState().nodes;
|
|
114
126
|
const walls = collectLevelWalls(sceneNodes, node.id);
|
|
127
|
+
const staleWallIds = modifiers.altKey ? [node.id] : [node.id, ...movingLinkedWallIds];
|
|
115
128
|
// The grid step follows the active snapping mode (`getSegmentGridStep()`
|
|
116
129
|
// is 0 outside grid mode), so `'lines' / 'angles' / 'off'` no longer
|
|
117
130
|
// force a grid snap the mode chip says is inactive. In `'angles'` mode
|
|
@@ -121,7 +134,7 @@ export const wallMoveEndpointAffordance = {
|
|
|
121
134
|
const snapped = snapWallDraftPoint({
|
|
122
135
|
point: planPoint,
|
|
123
136
|
walls,
|
|
124
|
-
ignoreWallIds:
|
|
137
|
+
ignoreWallIds: staleWallIds,
|
|
125
138
|
start: angleLocked ? fixedPoint : undefined,
|
|
126
139
|
angleSnap: angleLocked,
|
|
127
140
|
magnetic: isMagneticSnapActive(),
|
|
@@ -131,13 +144,15 @@ export const wallMoveEndpointAffordance = {
|
|
|
131
144
|
// object's edge / wall face and publishes a guide. The guide is
|
|
132
145
|
// DISPLAYED in every mode except Off (isAlignmentGuideActive); the
|
|
133
146
|
// magnetic pull onto it is applied only in 'lines' mode
|
|
134
|
-
// (isMagneticSnapActive), like the draft tool does.
|
|
135
|
-
//
|
|
136
|
-
// the candidate pool
|
|
147
|
+
// (isMagneticSnapActive), like the draft tool does. Only the dragged
|
|
148
|
+
// wall and the siblings cascading with the moving corner are excluded
|
|
149
|
+
// from the candidate pool — walls linked at the FIXED corner don't
|
|
150
|
+
// move, and their anchors are what let the dragged corner align back
|
|
151
|
+
// onto a true axis. Alt is detach, NOT bypass.
|
|
137
152
|
const aligned = alignFloorplanDraftPoint(snapped, {
|
|
138
153
|
applySnap: isMagneticSnapActive(),
|
|
139
154
|
bypass: !isAlignmentGuideActive(),
|
|
140
|
-
excludeIds:
|
|
155
|
+
excludeIds: staleWallIds,
|
|
141
156
|
});
|
|
142
157
|
const primaryStart = endpoint === 'start' ? aligned : fixedPoint;
|
|
143
158
|
const primaryEnd = endpoint === 'end' ? aligned : fixedPoint;
|
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
import type { AnyNode, AnyNodeId } from '@pascal-app/core';
|
|
1
|
+
import type { AnyNode, AnyNodeId, LiveTransform } from '@pascal-app/core';
|
|
2
2
|
/**
|
|
3
|
-
* Project per-frame wall drag overrides
|
|
4
|
-
*
|
|
3
|
+
* Project per-frame wall and opening drag overrides into a fresh `nodes`
|
|
4
|
+
* snapshot. Wall overrides keep shared miters current; door and window
|
|
5
|
+
* overrides keep associative construction dimensions current while an
|
|
6
|
+
* opening moves or changes host. The 2D drag
|
|
5
7
|
* handlers publish overrides for the moved wall plus its linked
|
|
6
8
|
* neighbours; the floor-plan layer hands the merged snapshot to
|
|
7
9
|
* `buildContext` so each wall's `ctx.siblings` (which feeds the
|
|
8
10
|
* miter calculation) reflects the live cursor positions instead of
|
|
9
11
|
* the last committed scene state.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
13
|
+
* Other node types are shared by reference. The allocation cost is one
|
|
14
|
+
* shallow object per relevant override — the override map is small, so
|
|
15
|
+
* this is cheap. When the
|
|
14
16
|
* override map is empty (no live drag) the input is returned
|
|
15
17
|
* unchanged.
|
|
16
18
|
*/
|
|
17
19
|
export declare function wallFloorplanSiblingOverrides(args: {
|
|
18
20
|
nodeId: AnyNodeId;
|
|
19
21
|
nodes: Record<AnyNodeId, AnyNode>;
|
|
22
|
+
liveTransforms?: Map<string, LiveTransform>;
|
|
20
23
|
liveOverrides: Map<string, Record<string, unknown>>;
|
|
21
24
|
}): Record<AnyNodeId, AnyNode>;
|
|
22
25
|
//# sourceMappingURL=floorplan-overrides.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan-overrides.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-overrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"floorplan-overrides.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-overrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEzE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,MAAM,EAAE,SAAS,CAAA;IACjB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACjC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACpD,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAqB7B"}
|
|
@@ -1,32 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project per-frame wall drag overrides
|
|
3
|
-
*
|
|
2
|
+
* Project per-frame wall and opening drag overrides into a fresh `nodes`
|
|
3
|
+
* snapshot. Wall overrides keep shared miters current; door and window
|
|
4
|
+
* overrides keep associative construction dimensions current while an
|
|
5
|
+
* opening moves or changes host. The 2D drag
|
|
4
6
|
* handlers publish overrides for the moved wall plus its linked
|
|
5
7
|
* neighbours; the floor-plan layer hands the merged snapshot to
|
|
6
8
|
* `buildContext` so each wall's `ctx.siblings` (which feeds the
|
|
7
9
|
* miter calculation) reflects the live cursor positions instead of
|
|
8
10
|
* the last committed scene state.
|
|
9
11
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
12
|
+
* Other node types are shared by reference. The allocation cost is one
|
|
13
|
+
* shallow object per relevant override — the override map is small, so
|
|
14
|
+
* this is cheap. When the
|
|
13
15
|
* override map is empty (no live drag) the input is returned
|
|
14
16
|
* unchanged.
|
|
15
17
|
*/
|
|
16
18
|
export function wallFloorplanSiblingOverrides(args) {
|
|
17
|
-
const { nodes, liveOverrides } = args;
|
|
18
|
-
if (liveOverrides.size === 0)
|
|
19
|
+
const { nodes, liveOverrides, liveTransforms } = args;
|
|
20
|
+
if (liveOverrides.size === 0 && !liveTransforms?.size)
|
|
19
21
|
return nodes;
|
|
20
22
|
let out = null;
|
|
21
|
-
|
|
23
|
+
const ids = new Set([...liveOverrides.keys(), ...(liveTransforms?.keys() ?? [])]);
|
|
24
|
+
for (const id of ids) {
|
|
22
25
|
const existing = nodes[id];
|
|
23
|
-
if (existing?.type !== 'wall')
|
|
26
|
+
if (existing?.type !== 'wall' && existing?.type !== 'door' && existing?.type !== 'window') {
|
|
24
27
|
continue;
|
|
25
|
-
|
|
28
|
+
}
|
|
29
|
+
const override = liveOverrides.get(id);
|
|
30
|
+
const liveTransform = liveTransforms?.get(id);
|
|
31
|
+
const livePosition = liveTransform && (existing.type === 'door' || existing.type === 'window')
|
|
32
|
+
? { position: liveTransform.position }
|
|
33
|
+
: undefined;
|
|
34
|
+
if ((!override || Object.keys(override).length === 0) && !livePosition)
|
|
26
35
|
continue;
|
|
27
36
|
if (!out)
|
|
28
37
|
out = { ...nodes };
|
|
29
|
-
out[id] = { ...existing, ...override };
|
|
38
|
+
out[id] = { ...existing, ...override, ...livePosition };
|
|
30
39
|
}
|
|
31
40
|
return out ?? nodes;
|
|
32
41
|
}
|
package/dist/wall/floorplan.d.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { type AnyNode, type FloorplanGeometry, type GeometryContext, type WallMiterData, type WallNode } from '@pascal-app/core';
|
|
2
|
-
|
|
2
|
+
import { type WallConstructionDimensionPlan } from './construction-dimensions';
|
|
3
|
+
declare const WALL_DIMENSION_REFERENCES: readonly ["finished-faces", "centerline", "stud-faces"];
|
|
4
|
+
type WallDimensionReference = (typeof WALL_DIMENSION_REFERENCES)[number];
|
|
5
|
+
export type WallFloorplanLevelData = {
|
|
6
|
+
miters: WallMiterData;
|
|
7
|
+
documentMiters: WallMiterData;
|
|
8
|
+
constructionDimensionsByReference: Record<WallDimensionReference, WallConstructionDimensionPlan>;
|
|
9
|
+
};
|
|
10
|
+
export declare function computeWallFloorplanLevelData({ siblings, nodes, }: {
|
|
3
11
|
siblings: ReadonlyArray<WallNode>;
|
|
4
12
|
nodes: Record<string, AnyNode>;
|
|
5
|
-
}):
|
|
13
|
+
}): WallFloorplanLevelData;
|
|
6
14
|
/**
|
|
7
15
|
* Stage C floor-plan builder for wall — emits the full chrome stack the
|
|
8
16
|
* legacy `floorplan-panel.tsx` rendered inline:
|
|
@@ -13,11 +21,12 @@ export declare function computeWallFloorplanLevelData({ siblings, }: {
|
|
|
13
21
|
* wall body easily.
|
|
14
22
|
* 4. Two endpoint handles (start + end) when selected — the registry
|
|
15
23
|
* layer hosts the 5-circle stack + hover transitions + 2D drag.
|
|
16
|
-
* 5.
|
|
24
|
+
* 5. Exterior facade strings plus interior wall spans and hosted-opening widths.
|
|
17
25
|
*
|
|
18
26
|
* `ctx.levelData` provides the shared level miter graph when the floor-plan
|
|
19
27
|
* dispatcher precomputes it; `ctx.siblings` remains the fallback path for
|
|
20
28
|
* direct builder callers.
|
|
21
29
|
*/
|
|
22
30
|
export declare function buildWallFloorplan(node: WallNode, ctx: GeometryContext): FloorplanGeometry | null;
|
|
31
|
+
export {};
|
|
23
32
|
//# sourceMappingURL=floorplan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,iBAAiB,EAEtB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAOpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAKL,KAAK,6BAA6B,EACnC,MAAM,2BAA2B,CAAA;AAWlC,QAAA,MAAM,yBAAyB,yDAA0D,CAAA;AAEzF,KAAK,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAexE,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,EAAE,aAAa,CAAA;IAC7B,iCAAiC,EAAE,MAAM,CAAC,sBAAsB,EAAE,6BAA6B,CAAC,CAAA;CACjG,CAAA;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,sBAAsB,CAqCzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAoMjG"}
|