@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,7 @@
|
|
|
1
|
+
import { buildWallHostedOpeningContextualDimensions } from '../wall/contextual-dimensions';
|
|
2
|
+
export function buildWindowContextualDimensions(node, ctx) {
|
|
3
|
+
return buildWallHostedOpeningContextualDimensions(node, ctx, {
|
|
4
|
+
showClearancesWhileMoving: true,
|
|
5
|
+
useExteriorNormal: true,
|
|
6
|
+
});
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/window/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/window/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,kBAAkB,CAAA;AAiBzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAkIrC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CAqG9D,CAAA"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { buildWindowFloorplanSchedule, computeWindowFloorplanLevelData, } from '../shared/opening-documentation';
|
|
1
2
|
import { publishOpeningResizeGuides } from '../shared/opening-guides-runtime';
|
|
2
3
|
import { readRoofFaceHeightMax, readRoofFaceWidthMax } from '../shared/roof-opening-host';
|
|
3
4
|
import { buildRoofWallOpeningCut } from '../shared/roof-wall-opening-cut';
|
|
5
|
+
import { readHostWallCeiling } from '../shared/wall-opening-ceiling';
|
|
4
6
|
import { wallFloorplanSiblingOverrides } from '../wall/floorplan-overrides';
|
|
7
|
+
import { buildWindowContextualDimensions } from './contextual-dimensions';
|
|
5
8
|
import { buildWindowFloorplan } from './floorplan';
|
|
6
9
|
import { windowWidthAffordance } from './floorplan-affordances';
|
|
7
10
|
import { windowFloorplanMoveTarget } from './floorplan-move';
|
|
@@ -24,12 +27,6 @@ function readWallLength(w, scene) {
|
|
|
24
27
|
return Number.POSITIVE_INFINITY;
|
|
25
28
|
return Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
|
|
26
29
|
}
|
|
27
|
-
function readWallHeight(w, scene) {
|
|
28
|
-
if (!w.wallId)
|
|
29
|
-
return Number.POSITIVE_INFINITY;
|
|
30
|
-
const wall = scene.get(w.wallId);
|
|
31
|
-
return wall?.height ?? Number.POSITIVE_INFINITY;
|
|
32
|
-
}
|
|
33
30
|
function windowWidthHandle(side) {
|
|
34
31
|
const sign = side === 'right' ? 1 : -1;
|
|
35
32
|
return {
|
|
@@ -88,9 +85,9 @@ function windowHeightHandle(edge) {
|
|
|
88
85
|
if (roofMax !== null)
|
|
89
86
|
return Math.max(MIN_WINDOW_HEIGHT, roofMax);
|
|
90
87
|
// Maximum: distance from the anchored edge to the wall's allowed Y
|
|
91
|
-
// bounds. Top arrow caps at wall
|
|
92
|
-
// at top (positive Y room above the floor).
|
|
93
|
-
const wallH =
|
|
88
|
+
// bounds. Top arrow caps at the wall's resolved ceiling - bottom;
|
|
89
|
+
// bottom arrow caps at top (positive Y room above the floor).
|
|
90
|
+
const wallH = readHostWallCeiling(n.wallId, scene);
|
|
94
91
|
const anchored = edge === 'top' ? n.position[1] - n.height / 2 : n.position[1] + n.height / 2;
|
|
95
92
|
return edge === 'top'
|
|
96
93
|
? Math.max(MIN_WINDOW_HEIGHT, wallH - anchored)
|
|
@@ -154,9 +151,15 @@ export const windowDefinition = {
|
|
|
154
151
|
kind: 'window',
|
|
155
152
|
snapProfile: 'item',
|
|
156
153
|
facingIndicator: true,
|
|
157
|
-
schemaVersion:
|
|
154
|
+
schemaVersion: 2,
|
|
158
155
|
schema: WindowNode,
|
|
159
156
|
category: 'structure',
|
|
157
|
+
extensions: {
|
|
158
|
+
'pascal:editor/floorplan': {
|
|
159
|
+
contextualDimensions: buildWindowContextualDimensions,
|
|
160
|
+
schedule: buildWindowFloorplanSchedule,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
160
163
|
// Same schema-driven defaults trick as door: parse a stub, strip
|
|
161
164
|
// id/type. Window also has many fields with zod `.default()` set.
|
|
162
165
|
defaults: () => {
|
|
@@ -191,6 +194,7 @@ export const windowDefinition = {
|
|
|
191
194
|
kind: 'parametric',
|
|
192
195
|
module: () => import('./renderer'),
|
|
193
196
|
},
|
|
197
|
+
preview: () => import('./preview'),
|
|
194
198
|
system: {
|
|
195
199
|
module: () => import('./system'),
|
|
196
200
|
priority: 3,
|
|
@@ -198,6 +202,7 @@ export const windowDefinition = {
|
|
|
198
202
|
// Stage C: floor-plan polygon. ctx.parent gives the wall for direction
|
|
199
203
|
// + thickness — same shape as door.
|
|
200
204
|
floorplan: buildWindowFloorplan,
|
|
205
|
+
computeFloorplanLevelData: computeWindowFloorplanLevelData,
|
|
201
206
|
floorplanDependsOnSiblings: true,
|
|
202
207
|
// Opening symbols position from `ctx.parent` (the host wall); merge the
|
|
203
208
|
// walls' live drag overrides so the symbol tracks a wall / group drag in
|
|
@@ -12,11 +12,8 @@ import { type FloorplanAffordance, type WindowNode } from '@pascal-app/core';
|
|
|
12
12
|
* - `'end'`: arrow at the edge closer to `wall.end`. The wall-start
|
|
13
13
|
* edge stays fixed.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* overrides for walls, so an override-based preview wouldn't show on
|
|
18
|
-
* windows. The dispatcher snapshots / pauses history at start, so
|
|
19
|
-
* per-tick scene writes still collapse to one undoable entry on commit.
|
|
15
|
+
* Preview state stays in the live override store so the scene graph is
|
|
16
|
+
* written only once, when the drag commits.
|
|
20
17
|
*/
|
|
21
18
|
export declare const windowWidthAffordance: FloorplanAffordance<WindowNode>;
|
|
22
19
|
//# sourceMappingURL=floorplan-affordances.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,
|
|
1
|
+
{"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAKxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAMzB;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAAmB,CAAC,UAAU,CAqEjE,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useScene, } from '@pascal-app/core';
|
|
1
|
+
import { useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
2
2
|
const MIN_WINDOW_WIDTH = 0.3;
|
|
3
3
|
/**
|
|
4
4
|
* 2D drag affordance for the window's width side-arrows. Sister to the 3D
|
|
@@ -13,11 +13,8 @@ const MIN_WINDOW_WIDTH = 0.3;
|
|
|
13
13
|
* - `'end'`: arrow at the edge closer to `wall.end`. The wall-start
|
|
14
14
|
* edge stays fixed.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* overrides for walls, so an override-based preview wouldn't show on
|
|
19
|
-
* windows. The dispatcher snapshots / pauses history at start, so
|
|
20
|
-
* per-tick scene writes still collapse to one undoable entry on commit.
|
|
16
|
+
* Preview state stays in the live override store so the scene graph is
|
|
17
|
+
* written only once, when the drag commits.
|
|
21
18
|
*/
|
|
22
19
|
export const windowWidthAffordance = {
|
|
23
20
|
start({ node, payload, nodes, initialPlanPoint }) {
|
|
@@ -53,20 +50,17 @@ export const windowWidthAffordance = {
|
|
|
53
50
|
const newWindowX = anchorX + growDir * (newWidth / 2);
|
|
54
51
|
lastWidth = newWidth;
|
|
55
52
|
lastWindowX = newWindowX;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
position: [newWindowX, initialWindowY, initialWindowZ],
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
]);
|
|
53
|
+
useLiveNodeOverrides.getState().set(windowId, {
|
|
54
|
+
width: newWidth,
|
|
55
|
+
position: [newWindowX, initialWindowY, initialWindowZ],
|
|
56
|
+
});
|
|
57
|
+
useScene.getState().markDirty(windowId);
|
|
65
58
|
},
|
|
66
59
|
canCommit() {
|
|
67
60
|
return true;
|
|
68
61
|
},
|
|
69
62
|
commit() {
|
|
63
|
+
useLiveNodeOverrides.getState().clear(windowId);
|
|
70
64
|
useScene.getState().updateNodes([
|
|
71
65
|
{
|
|
72
66
|
id: windowId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAOxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAOxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,UAAU,CAiPrE,CAAA"}
|
|
@@ -152,7 +152,7 @@ export const windowFloorplanMoveTarget = ({ node }) => {
|
|
|
152
152
|
nodes,
|
|
153
153
|
});
|
|
154
154
|
const snappedLocalX = neighborX ?? snapToHalf(hit.localX);
|
|
155
|
-
const { clampedX, clampedY } = clampToWall(hit.wall, snappedLocalX, startLocalY, node.width, node.height);
|
|
155
|
+
const { clampedX, clampedY } = clampToWall(hit.wall, snappedLocalX, startLocalY, node.width, node.height, nodes);
|
|
156
156
|
// One click per real position step, keyed on the SNAPPED along-wall value
|
|
157
157
|
// so it ticks only when the window actually moves to a new cell.
|
|
158
158
|
tickGridStep(clampedX);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/window/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEf,UAAU,EACX,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/window/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEf,UAAU,EACX,MAAM,kBAAkB,CAAA;AAQzB;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CA4J1B"}
|
package/dist/window/floorplan.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { floorplanGeometryMetadata, readFloorplanContext } from '@pascal-app/editor';
|
|
2
|
+
import { buildOpeningMarkAnnotation, } from '../shared/opening-documentation';
|
|
1
3
|
import { buildOpeningPlacementDimensions } from '../shared/opening-placement-dimensions';
|
|
2
4
|
/**
|
|
3
5
|
* Stage C floor-plan builder for window. Mirrors the legacy
|
|
@@ -84,6 +86,7 @@ export function buildWindowFloorplan(node, ctx) {
|
|
|
84
86
|
strokeWidth: showSelectedChrome ? 1.9 : 1.25,
|
|
85
87
|
vectorEffect: 'non-scaling-stroke',
|
|
86
88
|
strokeLinejoin: 'round',
|
|
89
|
+
metadata: floorplanGeometryMetadata({ annotationObstacle: 'bounds' }),
|
|
87
90
|
},
|
|
88
91
|
// Inset glass-pane outline.
|
|
89
92
|
{
|
|
@@ -142,10 +145,13 @@ export function buildWindowFloorplan(node, ctx) {
|
|
|
142
145
|
}
|
|
143
146
|
// Placement-measurement dimensions when actively moving — same
|
|
144
147
|
// contract as door (see `nodes/src/door/floorplan.ts`).
|
|
145
|
-
if (view?.moving) {
|
|
148
|
+
if (view?.moving && readFloorplanContext(ctx).automaticDimensions) {
|
|
146
149
|
for (const dim of buildOpeningPlacementDimensions(node, ctx)) {
|
|
147
150
|
children.push(dim);
|
|
148
151
|
}
|
|
149
152
|
}
|
|
153
|
+
const markAnnotation = buildOpeningMarkAnnotation(node, wall, ctx.levelData, { stroke: showSelectedChrome ? '#f97316' : '#334155' });
|
|
154
|
+
if (markAnnotation)
|
|
155
|
+
children.push(markAnnotation);
|
|
150
156
|
return { kind: 'group', children };
|
|
151
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/window/move-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EAYL,UAAU,EACX,MAAM,kBAAkB,CAAA;AAqDzB;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/window/move-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EAYL,UAAU,EACX,MAAM,kBAAkB,CAAA;AAqDzB;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAigClD,CAAA;AAED,eAAe,cAAc,CAAA"}
|
package/dist/window/move-tool.js
CHANGED
|
@@ -174,7 +174,7 @@ const MoveWindowTool = ({ node: movingWindowNode }) => {
|
|
|
174
174
|
const y = movingWindowNode.position[1];
|
|
175
175
|
return y > 0.1 ? y : DEFAULT_WINDOW_SILL_M + movingWindowNode.height / 2;
|
|
176
176
|
};
|
|
177
|
-
const getSlabElevation = (wallEvent) => spatialGridManager.getSlabElevationForWall(wallEvent.node.parentId ?? '', wallEvent.node.start, wallEvent.node.end);
|
|
177
|
+
const getSlabElevation = (wallEvent) => spatialGridManager.getSlabElevationForWall(wallEvent.node.parentId ?? '', wallEvent.node.start, wallEvent.node.end, wallEvent.node.curveOffset ?? 0, wallEvent.node.thickness, wallEvent.node.supportSlabId);
|
|
178
178
|
const hideCursor = () => {
|
|
179
179
|
if (cursorGroupRef.current)
|
|
180
180
|
cursorGroupRef.current.visible = false;
|
|
@@ -256,7 +256,7 @@ const MoveWindowTool = ({ node: movingWindowNode }) => {
|
|
|
256
256
|
// component lives in `snapToHalf` (itself mode-aware).
|
|
257
257
|
applySnap: isMagneticSnapActive(),
|
|
258
258
|
});
|
|
259
|
-
const { clampedX, clampedY } = clampToWall(event.node, localX, targetLocalY, movingWindowNode.width, movingWindowNode.height);
|
|
259
|
+
const { clampedX, clampedY } = clampToWall(event.node, localX, targetLocalY, movingWindowNode.width, movingWindowNode.height, useScene.getState().nodes);
|
|
260
260
|
const valid = !hasWallChildOverlap(event.node.id, clampedX, clampedY, movingWindowNode.width, movingWindowNode.height, movingWindowNode.id);
|
|
261
261
|
return {
|
|
262
262
|
wallNode: event.node,
|
|
@@ -838,7 +838,7 @@ const MoveWindowTool = ({ node: movingWindowNode }) => {
|
|
|
838
838
|
if (hostWall?.type === 'wall') {
|
|
839
839
|
const wallAngle = Math.atan2(hostWall.end[1] - hostWall.start[1], hostWall.end[0] - hostWall.start[0]);
|
|
840
840
|
const ghostYaw = movingWindowNode.rotation[1] - wallAngle;
|
|
841
|
-
const seedPos = wallLocalToWorld(hostWall, movingWindowNode.position[0], movingWindowNode.position[1], getLevelYOffset(), spatialGridManager.getSlabElevationForWall(hostWall.parentId ?? '', hostWall.start, hostWall.end));
|
|
841
|
+
const seedPos = wallLocalToWorld(hostWall, movingWindowNode.position[0], movingWindowNode.position[1], getLevelYOffset(), spatialGridManager.getSlabElevationForWall(hostWall.parentId ?? '', hostWall.start, hostWall.end, hostWall.curveOffset ?? 0, hostWall.thickness, hostWall.supportSlabId));
|
|
842
842
|
publishPlacementSurface(new Vector3(...seedPos), new Vector3(Math.sin(ghostYaw), 0, Math.cos(ghostYaw)));
|
|
843
843
|
// Claim the pointer for the wall so the floor free-follow stands down for
|
|
844
844
|
// the first frames after grab. Otherwise the first `grid:move` (the window
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/window/panel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/window/panel.tsx"],"names":[],"mappings":"AA6FA,MAAM,CAAC,OAAO,UAAU,WAAW,uCAy1BlC"}
|
package/dist/window/panel.js
CHANGED
|
@@ -5,6 +5,7 @@ import { ActionButton, ActionGroup, cn, PanelSection, PanelWrapper, SegmentedCon
|
|
|
5
5
|
import { useViewer } from '@pascal-app/viewer';
|
|
6
6
|
import { Copy, FlipHorizontal2, Move, Trash2 } from 'lucide-react';
|
|
7
7
|
import { useCallback, useRef } from 'react';
|
|
8
|
+
import { OpeningDocumentationFields } from '../shared/opening-documentation-fields';
|
|
8
9
|
function isSameWindowValue(current, next) {
|
|
9
10
|
if (typeof current === 'number' && typeof next === 'number') {
|
|
10
11
|
return Math.abs(current - next) < 1e-6;
|
|
@@ -153,6 +154,8 @@ export default function WindowPanel() {
|
|
|
153
154
|
parentId: node.parentId,
|
|
154
155
|
width: node.width,
|
|
155
156
|
height: node.height,
|
|
157
|
+
roughOpeningWidth: node.roughOpeningWidth,
|
|
158
|
+
roughOpeningHeight: node.roughOpeningHeight,
|
|
156
159
|
windowType: node.windowType,
|
|
157
160
|
operationState: node.operationState,
|
|
158
161
|
awningDirection: node.awningDirection,
|
|
@@ -314,7 +317,7 @@ export default function WindowPanel() {
|
|
|
314
317
|
}), options: [
|
|
315
318
|
{ value: 'window', label: 'Window' },
|
|
316
319
|
{ value: 'opening', label: 'Opening' },
|
|
317
|
-
], value: node.openingKind ?? 'window' }) }), showWindowTypeSection && (_jsxs(PanelSection, { title: "Window Type", children: [_jsx("div", { className: "grid grid-cols-2 gap-2 px-1 pt-1", children: windowTypeOptions.map((option) => {
|
|
320
|
+
], value: node.openingKind ?? 'window' }) }), _jsx(PanelSection, { title: "Documentation", children: _jsx(OpeningDocumentationFields, { constructionType: node.constructionType, dimensionReference: node.dimensionReference, finishOpeningHeight: node.finishOpeningHeight, finishOpeningWidth: node.finishOpeningWidth, mark: node.mark, masonryOpeningHeight: node.masonryOpeningHeight, masonryOpeningWidth: node.masonryOpeningWidth, onChange: handleUpdate, roughOpeningHeight: node.roughOpeningHeight, roughOpeningWidth: node.roughOpeningWidth }) }), showWindowTypeSection && (_jsxs(PanelSection, { title: "Window Type", children: [_jsx("div", { className: "grid grid-cols-2 gap-2 px-1 pt-1", children: windowTypeOptions.map((option) => {
|
|
318
321
|
const isSelected = displayedWindowType === option.value;
|
|
319
322
|
return (_jsx("button", { className: cn('flex min-h-12 items-center rounded-lg border px-3 py-2.5 text-left text-xs transition-colors', isSelected
|
|
320
323
|
? 'border-orange-400/60 bg-orange-400/10 text-foreground'
|
package/dist/window/schema.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { WindowNode } from '@pascal-app/core';
|
|
1
|
+
export { WindowConstructionType, WindowDimensionReference, WindowNode, } from '@pascal-app/core';
|
|
2
2
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/window/schema.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/window/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,GACX,MAAM,kBAAkB,CAAA"}
|
package/dist/window/schema.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { WindowNode } from '@pascal-app/core';
|
|
1
|
+
export { WindowConstructionType, WindowDimensionReference, WindowNode, } from '@pascal-app/core';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/window/tool.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/window/tool.tsx"],"names":[],"mappings":"AAgFA;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EA6uBvB,CAAA;AAED,eAAe,UAAU,CAAA"}
|
package/dist/window/tool.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { emitter, isCurvedWall, sceneRegistry, spatialGridManager, useScene, WindowNode, } from '@pascal-app/core';
|
|
3
|
-
import { calculateCursorRotation, calculateItemRotation, EDITOR_LAYER, getSideFromNormal, isMagneticSnapActive, isValidWallSideFace, snapToHalf, triggerSFX, useAlignmentGuides, useEditor, useFacingPose, } from '@pascal-app/editor';
|
|
2
|
+
import { emitter, isCurvedWall, sceneRegistry, spatialGridManager, useScene, WallNode as WallNodeSchema, WindowNode, } from '@pascal-app/core';
|
|
3
|
+
import { calculateCursorRotation, calculateItemRotation, EDITOR_LAYER, getSideFromNormal, isMagneticSnapActive, isValidWallSideFace, snapToHalf, triggerSFX, useAlignmentGuides, useEditor, useFacingPose, usePlacementPreview, } from '@pascal-app/editor';
|
|
4
4
|
import { useViewer } from '@pascal-app/viewer';
|
|
5
5
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
6
6
|
import { BoxGeometry, EdgesGeometry, Vector3 } from 'three';
|
|
@@ -58,6 +58,36 @@ const WindowTool = () => {
|
|
|
58
58
|
const frameDepthRef = useRef(ghostStub.frameDepth);
|
|
59
59
|
useEffect(() => {
|
|
60
60
|
useScene.temporal.getState().pause();
|
|
61
|
+
const ownedPreviewIds = new Set();
|
|
62
|
+
const fallbackPreview = WindowNode.parse({
|
|
63
|
+
position: [0, 0, 0],
|
|
64
|
+
rotation: [0, 0, 0],
|
|
65
|
+
side: 'front',
|
|
66
|
+
});
|
|
67
|
+
const fallbackWallId = WallNodeSchema.parse({
|
|
68
|
+
end: [1, 0],
|
|
69
|
+
start: [0, 0],
|
|
70
|
+
thickness: 0.1,
|
|
71
|
+
}).id;
|
|
72
|
+
const publishPlacementPreview = (node, parentNode) => {
|
|
73
|
+
ownedPreviewIds.add(node.id);
|
|
74
|
+
usePlacementPreview.getState().set(node, parentNode);
|
|
75
|
+
};
|
|
76
|
+
const clearPlacementPreview = () => {
|
|
77
|
+
const current = usePlacementPreview.getState().node;
|
|
78
|
+
if (current && ownedPreviewIds.has(current.id))
|
|
79
|
+
usePlacementPreview.getState().clear();
|
|
80
|
+
};
|
|
81
|
+
const publishDraftPreview = (parentNode) => {
|
|
82
|
+
const draft = draftRef.current;
|
|
83
|
+
if (!draft)
|
|
84
|
+
return;
|
|
85
|
+
const live = useScene.getState().nodes[draft.id];
|
|
86
|
+
if (live?.type !== 'window')
|
|
87
|
+
return;
|
|
88
|
+
draftRef.current = live;
|
|
89
|
+
publishPlacementPreview(live, parentNode);
|
|
90
|
+
};
|
|
61
91
|
let hostKind = null;
|
|
62
92
|
// timeStamp of the most recent wall/roof mesh event. A wall/roof hover and
|
|
63
93
|
// the grid raycast from the SAME pointermove share the source DOM event's
|
|
@@ -78,16 +108,20 @@ const WindowTool = () => {
|
|
|
78
108
|
const id = getLevelId();
|
|
79
109
|
return id ? (sceneRegistry.nodes.get(id)?.position.y ?? 0) : 0;
|
|
80
110
|
};
|
|
81
|
-
const getSlabElevationForWall = (wall) => spatialGridManager.getSlabElevationForWall(wall.parentId ?? '', wall.start, wall.end);
|
|
111
|
+
const getSlabElevationForWall = (wall) => spatialGridManager.getSlabElevationForWall(wall.parentId ?? '', wall.start, wall.end, wall.curveOffset ?? 0, wall.thickness, wall.supportSlabId);
|
|
82
112
|
const markHostDirty = (hostId) => {
|
|
83
113
|
useScene.getState().dirtyNodes.add(hostId);
|
|
84
114
|
};
|
|
85
115
|
const destroyDraft = () => {
|
|
86
|
-
|
|
116
|
+
const draft = draftRef.current;
|
|
117
|
+
if (!draft) {
|
|
118
|
+
clearPlacementPreview();
|
|
87
119
|
return;
|
|
88
|
-
|
|
89
|
-
|
|
120
|
+
}
|
|
121
|
+
const wallId = draft.parentId;
|
|
122
|
+
useScene.getState().deleteNode(draft.id);
|
|
90
123
|
draftRef.current = null;
|
|
124
|
+
clearPlacementPreview();
|
|
91
125
|
// Rebuild wall so it removes the cutout from the deleted draft
|
|
92
126
|
if (wallId)
|
|
93
127
|
markHostDirty(wallId);
|
|
@@ -99,6 +133,7 @@ const WindowTool = () => {
|
|
|
99
133
|
clearOpeningGuides3D();
|
|
100
134
|
setFallbackPose(null);
|
|
101
135
|
useFacingPose.getState().clear();
|
|
136
|
+
clearPlacementPreview();
|
|
102
137
|
};
|
|
103
138
|
// Alignment candidates — anchors of every alignable object; refreshed
|
|
104
139
|
// after each placement. A window aligns by the plan position of its centre
|
|
@@ -138,6 +173,23 @@ const WindowTool = () => {
|
|
|
138
173
|
floorY,
|
|
139
174
|
side: sideFlip ? 'back' : 'front',
|
|
140
175
|
});
|
|
176
|
+
const halfWidth = fallbackPreview.width / 2 + 0.5;
|
|
177
|
+
const wall = WallNodeSchema.parse({
|
|
178
|
+
end: [position[0] + halfWidth, position[2]],
|
|
179
|
+
id: fallbackWallId,
|
|
180
|
+
start: [position[0] - halfWidth, position[2]],
|
|
181
|
+
thickness: 0.1,
|
|
182
|
+
});
|
|
183
|
+
const ghost = WindowNode.parse({
|
|
184
|
+
...fallbackPreview,
|
|
185
|
+
metadata: { isTransient: true },
|
|
186
|
+
parentId: wall.id,
|
|
187
|
+
position: [halfWidth, FALLBACK_SILL_LIFT + fallbackPreview.height / 2, 0],
|
|
188
|
+
rotation: [0, sideFlip ? Math.PI : 0, 0],
|
|
189
|
+
side: sideFlip ? 'back' : 'front',
|
|
190
|
+
wallId: wall.id,
|
|
191
|
+
});
|
|
192
|
+
publishPlacementPreview(ghost, wall);
|
|
141
193
|
useAlignmentGuides.getState().clear();
|
|
142
194
|
clearOpeningGuides3D();
|
|
143
195
|
// Off-host (invalid) floating ghost — no direction triangle.
|
|
@@ -191,7 +243,7 @@ const WindowTool = () => {
|
|
|
191
243
|
width,
|
|
192
244
|
height,
|
|
193
245
|
});
|
|
194
|
-
const { clampedX, clampedY } = clampToWall(wall, localX, localY, width, height);
|
|
246
|
+
const { clampedX, clampedY } = clampToWall(wall, localX, localY, width, height, useScene.getState().nodes);
|
|
195
247
|
const valid = !hasWallChildOverlap(wall.id, clampedX, clampedY, width, height, ignoreId);
|
|
196
248
|
return { clampedX, clampedY, valid };
|
|
197
249
|
};
|
|
@@ -236,6 +288,7 @@ const WindowTool = () => {
|
|
|
236
288
|
roofFace: undefined,
|
|
237
289
|
});
|
|
238
290
|
}
|
|
291
|
+
publishDraftPreview(wall);
|
|
239
292
|
updateCursor(wallLocalToWorld(wall, clampedX, clampedY, getLevelYOffset(), getSlabElevationForWall(wall)), cursorRotationY, valid, -clampedY);
|
|
240
293
|
if (draftRef.current) {
|
|
241
294
|
publishOpeningGuidesForWallEvent({
|
|
@@ -258,6 +311,7 @@ const WindowTool = () => {
|
|
|
258
311
|
const draft = draftRef.current;
|
|
259
312
|
if (!draft)
|
|
260
313
|
return;
|
|
314
|
+
clearPlacementPreview();
|
|
261
315
|
draftRef.current = null;
|
|
262
316
|
hostKind = null;
|
|
263
317
|
useScene.getState().deleteNode(draft.id);
|
|
@@ -438,6 +492,7 @@ const WindowTool = () => {
|
|
|
438
492
|
useScene.getState().createNode(node, segment.id);
|
|
439
493
|
draftRef.current = node;
|
|
440
494
|
}
|
|
495
|
+
publishDraftPreview(segment);
|
|
441
496
|
// Opening guides are wall-specific; clear them while over a roof face.
|
|
442
497
|
clearOpeningGuides3D();
|
|
443
498
|
updateRoofCursor(target, event.node);
|
|
@@ -454,6 +509,7 @@ const WindowTool = () => {
|
|
|
454
509
|
return;
|
|
455
510
|
const { segment, face, position } = target;
|
|
456
511
|
const draft = draftRef.current;
|
|
512
|
+
clearPlacementPreview();
|
|
457
513
|
draftRef.current = null;
|
|
458
514
|
hostKind = null;
|
|
459
515
|
useScene.getState().deleteNode(draft.id);
|
|
@@ -549,6 +605,7 @@ const WindowTool = () => {
|
|
|
549
605
|
return () => {
|
|
550
606
|
destroyDraft();
|
|
551
607
|
hideCursor();
|
|
608
|
+
clearPlacementPreview();
|
|
552
609
|
useAlignmentGuides.getState().clear();
|
|
553
610
|
clearOpeningGuides3D();
|
|
554
611
|
useScene.temporal.getState().resume();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WallNode } from '@pascal-app/core';
|
|
1
|
+
import type { AnyNode, AnyNodeId, WallNode } from '@pascal-app/core';
|
|
2
2
|
/**
|
|
3
3
|
* Default sill height (metres from the floor to the BOTTOM of a window) for a
|
|
4
4
|
* fresh window that has no wall-face height yet — the off-wall ghost and the
|
|
@@ -16,9 +16,13 @@ export declare const DEFAULT_WINDOW_SILL_M = 0.5;
|
|
|
16
16
|
*/
|
|
17
17
|
export declare function wallLocalToWorld(wallNode: WallNode, localX: number, localY: number, levelYOffset?: number, slabElevation?: number): [number, number, number];
|
|
18
18
|
/**
|
|
19
|
-
* Clamps window center position so it stays fully within wall bounds.
|
|
19
|
+
* Clamps window center position so it stays fully within wall bounds. The Y
|
|
20
|
+
* ceiling is the wall's RESOLVED top (storey plane for plane-bound walls,
|
|
21
|
+
* stored height for explicit ones, minus the elected slab base) — `nodes` is
|
|
22
|
+
* required because a plane-bound wall's top lives on its level, not on the
|
|
23
|
+
* wall record.
|
|
20
24
|
*/
|
|
21
|
-
export declare function clampToWall(wallNode: WallNode, localX: number, localY: number, width: number, height: number): {
|
|
25
|
+
export declare function clampToWall(wallNode: WallNode, localX: number, localY: number, width: number, height: number, nodes: Readonly<Record<AnyNodeId, AnyNode>>): {
|
|
22
26
|
clampedX: number;
|
|
23
27
|
clampedY: number;
|
|
24
28
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window-math.d.ts","sourceRoot":"","sources":["../../src/window/window-math.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"window-math.d.ts","sourceRoot":"","sources":["../../src/window/window-math.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGpE;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,SAAI,EAChB,aAAa,SAAI,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAU1B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAC1C;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CASxC;AAED;;;;GAIG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
|
|
1
2
|
/**
|
|
2
3
|
* Default sill height (metres from the floor to the BOTTOM of a window) for a
|
|
3
4
|
* fresh window that has no wall-face height yet — the off-wall ghost and the
|
|
@@ -22,13 +23,17 @@ export function wallLocalToWorld(wallNode, localX, localY, levelYOffset = 0, sla
|
|
|
22
23
|
];
|
|
23
24
|
}
|
|
24
25
|
/**
|
|
25
|
-
* Clamps window center position so it stays fully within wall bounds.
|
|
26
|
+
* Clamps window center position so it stays fully within wall bounds. The Y
|
|
27
|
+
* ceiling is the wall's RESOLVED top (storey plane for plane-bound walls,
|
|
28
|
+
* stored height for explicit ones, minus the elected slab base) — `nodes` is
|
|
29
|
+
* required because a plane-bound wall's top lives on its level, not on the
|
|
30
|
+
* wall record.
|
|
26
31
|
*/
|
|
27
|
-
export function clampToWall(wallNode, localX, localY, width, height) {
|
|
32
|
+
export function clampToWall(wallNode, localX, localY, width, height, nodes) {
|
|
28
33
|
const dx = wallNode.end[0] - wallNode.start[0];
|
|
29
34
|
const dz = wallNode.end[1] - wallNode.start[1];
|
|
30
35
|
const wallLength = Math.sqrt(dx * dx + dz * dz);
|
|
31
|
-
const wallHeight = wallNode
|
|
36
|
+
const wallHeight = resolveWallOpeningCeiling(wallNode, nodes);
|
|
32
37
|
const clampedX = Math.max(width / 2, Math.min(wallLength - width / 2, localX));
|
|
33
38
|
const clampedY = Math.max(height / 2, Math.min(wallHeight - height / 2, localY));
|
|
34
39
|
return { clampedX, clampedY };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextual-dimensions.d.ts","sourceRoot":"","sources":["../../src/zone/contextual-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAEpB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAGzB,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CAc1B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { resolveAutoZonePolygon, } from '@pascal-app/core';
|
|
2
|
+
import { formatAreaLabel } from '@pascal-app/editor';
|
|
3
|
+
export function buildZoneContextualDimensions(node, ctx) {
|
|
4
|
+
const polygon = resolveAutoZonePolygon(node, ctx.resolve);
|
|
5
|
+
if (polygon.length < 3)
|
|
6
|
+
return null;
|
|
7
|
+
const { area, centroid } = polygonAreaAndCentroid(polygon);
|
|
8
|
+
if (area <= 1e-6)
|
|
9
|
+
return null;
|
|
10
|
+
return {
|
|
11
|
+
kind: 'dimension-label',
|
|
12
|
+
appearance: 'outlined',
|
|
13
|
+
cx: centroid[0],
|
|
14
|
+
cy: centroid[1],
|
|
15
|
+
text: formatAreaLabel(area, ctx.viewState?.unit ?? 'metric', 1),
|
|
16
|
+
angle: 0,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function polygonAreaAndCentroid(points) {
|
|
20
|
+
let twiceSignedArea = 0;
|
|
21
|
+
let weightedX = 0;
|
|
22
|
+
let weightedY = 0;
|
|
23
|
+
for (let index = 0; index < points.length; index += 1) {
|
|
24
|
+
const current = points[index];
|
|
25
|
+
const next = points[(index + 1) % points.length];
|
|
26
|
+
const cross = current[0] * next[1] - next[0] * current[1];
|
|
27
|
+
twiceSignedArea += cross;
|
|
28
|
+
weightedX += (current[0] + next[0]) * cross;
|
|
29
|
+
weightedY += (current[1] + next[1]) * cross;
|
|
30
|
+
}
|
|
31
|
+
const area = Math.abs(twiceSignedArea) / 2;
|
|
32
|
+
if (Math.abs(twiceSignedArea) <= 1e-9) {
|
|
33
|
+
const sum = points.reduce((acc, point) => [acc[0] + point[0], acc[1] + point[1]], [0, 0]);
|
|
34
|
+
return {
|
|
35
|
+
area,
|
|
36
|
+
centroid: [sum[0] / points.length, sum[1] / points.length],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
area,
|
|
41
|
+
centroid: [weightedX / (3 * twiceSignedArea), weightedY / (3 * twiceSignedArea)],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/zone/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/zone/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AAezB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,QAAQ,CA8E1D,CAAA"}
|
package/dist/zone/definition.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { resolveAutoZonePolygon, ZoneNode as ZoneNodeSchema, } from '@pascal-app/core';
|
|
2
2
|
import { polygonMeasurementFeatures } from '../shared/polygon-measurement';
|
|
3
|
+
import { buildZoneContextualDimensions } from './contextual-dimensions';
|
|
3
4
|
import { buildZoneFloorplan } from './floorplan';
|
|
4
5
|
import { zoneAddVertexAffordance, zoneDeleteVertexAffordance, zoneMoveEdgeAffordance, zoneMoveVertexAffordance, } from './floorplan-affordances';
|
|
5
6
|
import { zoneFloorplanMoveTarget } from './floorplan-move';
|
|
6
7
|
import { zoneParametrics } from './parametrics';
|
|
7
8
|
import { zoneQuickMeasurement } from './quick-measurement';
|
|
9
|
+
import { buildRoomFloorplanSchedule } from './room-documentation';
|
|
8
10
|
import { ZoneNode } from './schema';
|
|
9
11
|
/**
|
|
10
12
|
* Zone — Stage A. Custom-behavior escape hatch: zone uses TSL shader
|
|
@@ -15,9 +17,15 @@ import { ZoneNode } from './schema';
|
|
|
15
17
|
export const zoneDefinition = {
|
|
16
18
|
kind: 'zone',
|
|
17
19
|
snapProfile: 'structural',
|
|
18
|
-
schemaVersion:
|
|
20
|
+
schemaVersion: 2,
|
|
19
21
|
schema: ZoneNode,
|
|
20
22
|
category: 'site',
|
|
23
|
+
extensions: {
|
|
24
|
+
'pascal:editor/floorplan': {
|
|
25
|
+
contextualDimensions: buildZoneContextualDimensions,
|
|
26
|
+
schedule: buildRoomFloorplanSchedule,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
21
29
|
defaults: () => {
|
|
22
30
|
const stub = ZoneNodeSchema.parse({ id: 'zone_default', type: 'zone' });
|
|
23
31
|
const { id: _id, type: _type, ...rest } = stub;
|