@pascal-app/nodes 1.0.5 → 1.0.7
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 +1 -0
- package/dist/beam/actions/move-endpoint.d.ts +24 -0
- package/dist/beam/actions/move-endpoint.d.ts.map +1 -0
- package/dist/beam/actions/move-endpoint.js +54 -0
- package/dist/beam/definition.d.ts +14 -0
- package/dist/beam/definition.d.ts.map +1 -0
- package/dist/beam/definition.js +173 -0
- package/dist/beam/draft-settings.d.ts +17 -0
- package/dist/beam/draft-settings.d.ts.map +1 -0
- package/dist/beam/draft-settings.js +81 -0
- package/dist/beam/drafting.d.ts +35 -0
- package/dist/beam/drafting.d.ts.map +1 -0
- package/dist/beam/drafting.js +103 -0
- package/dist/beam/floorplan-affordances.d.ts +8 -0
- package/dist/beam/floorplan-affordances.d.ts.map +1 -0
- package/dist/beam/floorplan-affordances.js +40 -0
- package/dist/beam/floorplan-move.d.ts +11 -0
- package/dist/beam/floorplan-move.d.ts.map +1 -0
- package/dist/beam/floorplan-move.js +54 -0
- package/dist/beam/floorplan.d.ts +11 -0
- package/dist/beam/floorplan.d.ts.map +1 -0
- package/dist/beam/floorplan.js +91 -0
- package/dist/beam/geometry.d.ts +19 -0
- package/dist/beam/geometry.d.ts.map +1 -0
- package/dist/beam/geometry.js +63 -0
- package/dist/beam/index.d.ts +3 -0
- package/dist/beam/index.d.ts.map +1 -0
- package/dist/beam/index.js +2 -0
- package/dist/beam/move-endpoint-tool.d.ts +21 -0
- package/dist/beam/move-endpoint-tool.d.ts.map +1 -0
- package/dist/beam/move-endpoint-tool.js +49 -0
- package/dist/beam/move-tool.d.ts +12 -0
- package/dist/beam/move-tool.d.ts.map +1 -0
- package/dist/beam/move-tool.js +114 -0
- package/dist/beam/panel-model.d.ts +28 -0
- package/dist/beam/panel-model.d.ts.map +1 -0
- package/dist/beam/panel-model.js +123 -0
- package/dist/beam/panel.d.ts +13 -0
- package/dist/beam/panel.d.ts.map +1 -0
- package/dist/beam/panel.js +107 -0
- package/dist/beam/parametrics.d.ts +3 -0
- package/dist/beam/parametrics.d.ts.map +1 -0
- package/dist/beam/parametrics.js +4 -0
- package/dist/beam/renderer.d.ts +13 -0
- package/dist/beam/renderer.d.ts.map +1 -0
- package/dist/beam/renderer.js +36 -0
- package/dist/beam/schema.d.ts +2 -0
- package/dist/beam/schema.d.ts.map +1 -0
- package/dist/beam/schema.js +1 -0
- package/dist/beam/tool.d.ts +13 -0
- package/dist/beam/tool.d.ts.map +1 -0
- package/dist/beam/tool.js +152 -0
- package/dist/box-vent/panel.d.ts.map +1 -1
- package/dist/box-vent/panel.js +8 -7
- package/dist/cabinet/batchable.d.ts +10 -0
- package/dist/cabinet/batchable.d.ts.map +1 -0
- package/dist/cabinet/batchable.js +12 -0
- package/dist/cabinet/compartment-card.d.ts.map +1 -1
- package/dist/cabinet/compartment-card.js +142 -46
- package/dist/cabinet/countertop-layout.d.ts +5 -0
- package/dist/cabinet/countertop-layout.d.ts.map +1 -1
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +3 -0
- package/dist/cabinet/dimension-input.d.ts +6 -0
- package/dist/cabinet/dimension-input.d.ts.map +1 -0
- package/dist/cabinet/dimension-input.js +8 -0
- package/dist/cabinet/essential-controls.d.ts.map +1 -1
- package/dist/cabinet/essential-controls.js +82 -17
- package/dist/cabinet/index.d.ts +1 -1
- package/dist/cabinet/index.d.ts.map +1 -1
- package/dist/cabinet/index.js +1 -1
- package/dist/cabinet/kitchen-catalog.d.ts +17 -4
- package/dist/cabinet/kitchen-catalog.d.ts.map +1 -1
- package/dist/cabinet/kitchen-catalog.js +45 -7
- package/dist/cabinet/kitchen-collection.d.ts.map +1 -1
- package/dist/cabinet/kitchen-collection.js +21 -5
- package/dist/cabinet/kitchen-module-actions.d.ts.map +1 -1
- package/dist/cabinet/kitchen-module-actions.js +107 -14
- package/dist/cabinet/neighbor-placement.d.ts +10 -0
- package/dist/cabinet/neighbor-placement.d.ts.map +1 -1
- package/dist/cabinet/panel.d.ts.map +1 -1
- package/dist/cabinet/panel.js +127 -50
- package/dist/cabinet/run-finishing.d.ts +5 -0
- package/dist/cabinet/run-finishing.d.ts.map +1 -1
- package/dist/cabinet/run-ops.d.ts +5 -0
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/run-panel.d.ts.map +1 -1
- package/dist/cabinet/run-panel.js +203 -52
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +8 -5
- package/dist/ceiling/build-up-section.d.ts +7 -0
- package/dist/ceiling/build-up-section.d.ts.map +1 -0
- package/dist/ceiling/build-up-section.js +57 -0
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +3 -1
- package/dist/ceiling/floorplan-affordances.d.ts +112 -0
- package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
- package/dist/ceiling/materials.d.ts +5 -0
- package/dist/ceiling/materials.d.ts.map +1 -1
- package/dist/ceiling/materials.js +17 -0
- package/dist/ceiling/panel-model.d.ts +13 -0
- package/dist/ceiling/panel-model.d.ts.map +1 -0
- package/dist/ceiling/panel-model.js +49 -0
- package/dist/ceiling/panel.d.ts.map +1 -1
- package/dist/ceiling/panel.js +82 -18
- package/dist/ceiling/renderer.d.ts.map +1 -1
- package/dist/ceiling/renderer.js +10 -4
- package/dist/ceiling/tool.d.ts.map +1 -1
- package/dist/ceiling/tool.js +24 -4
- package/dist/chimney/panel.d.ts.map +1 -1
- package/dist/chimney/panel.js +113 -41
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +3 -0
- package/dist/column/floorplan.d.ts.map +1 -1
- package/dist/column/floorplan.js +17 -0
- package/dist/column/hosted-resize.d.ts +28 -1
- package/dist/column/hosted-resize.d.ts.map +1 -1
- package/dist/column/panel.d.ts.map +1 -1
- package/dist/column/panel.js +125 -37
- package/dist/column/post-options.d.ts +10 -0
- package/dist/column/post-options.d.ts.map +1 -0
- package/dist/column/post-options.js +71 -0
- package/dist/column/post-placement.d.ts +78 -0
- package/dist/column/post-placement.d.ts.map +1 -0
- package/dist/column/post-placement.js +157 -0
- package/dist/column/post-section.d.ts +17 -0
- package/dist/column/post-section.d.ts.map +1 -0
- package/dist/column/post-section.js +95 -0
- package/dist/column/post-tool.d.ts +11 -0
- package/dist/column/post-tool.d.ts.map +1 -0
- package/dist/column/post-tool.js +94 -0
- package/dist/column/tool.d.ts +3 -10
- package/dist/column/tool.d.ts.map +1 -1
- package/dist/column/tool.js +13 -1
- package/dist/cupola/panel.d.ts.map +1 -1
- package/dist/cupola/panel.js +14 -7
- package/dist/door/actions.d.ts +7 -0
- package/dist/door/actions.d.ts.map +1 -0
- package/dist/door/actions.js +32 -0
- package/dist/door/contextual-dimensions.d.ts.map +1 -1
- package/dist/door/contextual-dimensions.js +11 -1
- package/dist/door/definition.d.ts.map +1 -1
- package/dist/door/definition.js +34 -7
- package/dist/door/floorplan-affordances.d.ts.map +1 -1
- package/dist/door/floorplan-affordances.js +5 -2
- package/dist/door/floorplan-move.d.ts.map +1 -1
- package/dist/door/floorplan-move.js +28 -6
- package/dist/door/floorplan.d.ts +2 -0
- package/dist/door/floorplan.d.ts.map +1 -1
- package/dist/door/floorplan.js +89 -16
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +60 -16
- package/dist/door/paint.d.ts +2 -7
- package/dist/door/paint.d.ts.map +1 -1
- package/dist/door/paint.js +26 -2
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +242 -90
- package/dist/door/parametrics.js +1 -1
- package/dist/door/placement.d.ts.map +1 -1
- package/dist/door/placement.js +9 -2
- package/dist/door/swing.d.ts +22 -0
- package/dist/door/swing.d.ts.map +1 -0
- package/dist/door/swing.js +36 -0
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +76 -29
- package/dist/dormer/panel-actions-section.d.ts.map +1 -1
- package/dist/dormer/panel-actions-section.js +3 -1
- package/dist/dormer/panel-position-section.d.ts.map +1 -1
- package/dist/dormer/panel-position-section.js +4 -3
- package/dist/dormer/panel-windows-section.d.ts.map +1 -1
- package/dist/dormer/panel-windows-section.js +38 -1
- package/dist/dormer/panel.d.ts.map +1 -1
- package/dist/dormer/panel.js +24 -18
- package/dist/downspout/inspector-editors.d.ts.map +1 -1
- package/dist/downspout/inspector-editors.js +3 -2
- package/dist/duct-fitting/inspector-editors.d.ts.map +1 -1
- package/dist/duct-fitting/inspector-editors.js +6 -1
- package/dist/duct-fitting/tool.d.ts.map +1 -1
- package/dist/duct-fitting/tool.js +11 -2
- package/dist/duct-terminal/tool.d.ts.map +1 -1
- package/dist/duct-terminal/tool.js +11 -2
- package/dist/elevator/panel.d.ts.map +1 -1
- package/dist/elevator/panel.js +41 -18
- package/dist/eyebrow-vent/panel.d.ts.map +1 -1
- package/dist/eyebrow-vent/panel.js +16 -6
- package/dist/fence/drafting.d.ts +2 -3
- package/dist/fence/drafting.d.ts.map +1 -1
- package/dist/fence/drafting.js +2 -3
- package/dist/fence/inspector-editors.d.ts.map +1 -1
- package/dist/fence/inspector-editors.js +64 -21
- package/dist/fence/move-endpoint-tool.d.ts.map +1 -1
- package/dist/fence/move-endpoint-tool.js +11 -2
- package/dist/fence/system.d.ts.map +1 -1
- package/dist/fence/system.js +13 -0
- package/dist/fence-feature/actions.d.ts.map +1 -1
- package/dist/fence-feature/actions.js +5 -2
- package/dist/fence-feature/inspector.d.ts.map +1 -1
- package/dist/fence-feature/inspector.js +150 -34
- package/dist/fence-feature/move-session.d.ts +1 -1
- package/dist/floor-opening/floorplan.d.ts +29 -6
- package/dist/floor-opening/floorplan.d.ts.map +1 -1
- package/dist/floor-opening/floorplan.js +172 -14
- package/dist/gutter/downspouts-panel.d.ts.map +1 -1
- package/dist/gutter/downspouts-panel.js +14 -2
- package/dist/hvac-equipment/tool.d.ts.map +1 -1
- package/dist/hvac-equipment/tool.js +3 -2
- package/dist/i18n/definition-messages.d.ts +5 -0
- package/dist/i18n/definition-messages.d.ts.map +1 -0
- package/dist/i18n/definition-messages.js +771 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/item/authored-params.d.ts.map +1 -1
- package/dist/item/authored-params.js +19 -4
- package/dist/item/floorplan.d.ts +1 -1
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/panel.d.ts.map +1 -1
- package/dist/item/panel.js +9 -7
- package/dist/liquid-line/tool.d.ts.map +1 -1
- package/dist/liquid-line/tool.js +10 -3
- package/dist/measurement/tool.d.ts +1 -1
- package/dist/measurement/tool.d.ts.map +1 -1
- package/dist/measurement/tool.js +8 -8
- package/dist/pipe-fitting/tool.d.ts.map +1 -1
- package/dist/pipe-fitting/tool.js +3 -2
- package/dist/pipe-trap/tool.d.ts.map +1 -1
- package/dist/pipe-trap/tool.js +7 -2
- package/dist/procedural-item/renderer.d.ts.map +1 -1
- package/dist/procedural-item/renderer.js +8 -1
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +22 -9
- package/dist/roof/barrel-panel.d.ts.map +1 -1
- package/dist/roof/barrel-panel.js +7 -3
- package/dist/roof/definition.d.ts.map +1 -1
- package/dist/roof/definition.js +33 -3
- package/dist/roof/floorplan-overrides.d.ts +22 -0
- package/dist/roof/floorplan-overrides.d.ts.map +1 -0
- package/dist/roof/floorplan-overrides.js +46 -0
- package/dist/roof/floorplan-tool.d.ts +9 -0
- package/dist/roof/floorplan-tool.d.ts.map +1 -0
- package/dist/roof/floorplan-tool.js +168 -0
- package/dist/roof/floorplan.d.ts.map +1 -1
- package/dist/roof/floorplan.js +131 -41
- package/dist/roof/glazing-controls.d.ts +2 -1
- package/dist/roof/glazing-controls.d.ts.map +1 -1
- package/dist/roof/glazing-controls.js +51 -13
- package/dist/roof/glazing-panel-editor.d.ts.map +1 -1
- package/dist/roof/glazing-panel-editor.js +40 -13
- package/dist/roof/glazing-panel.d.ts.map +1 -1
- package/dist/roof/glazing-panel.js +73 -9
- package/dist/roof/paint.d.ts +19 -0
- package/dist/roof/paint.d.ts.map +1 -0
- package/dist/roof/paint.js +158 -0
- package/dist/roof/panel.d.ts.map +1 -1
- package/dist/roof/panel.js +90 -22
- package/dist/roof/renderer.d.ts.map +1 -1
- package/dist/roof/renderer.js +13 -2
- package/dist/roof/roof-footprint-source.d.ts +17 -0
- package/dist/roof/roof-footprint-source.d.ts.map +1 -1
- package/dist/roof/roof-footprint-source.js +14 -0
- package/dist/roof/roof-footprint.d.ts +36 -2
- package/dist/roof/roof-footprint.d.ts.map +1 -1
- package/dist/roof/roof-footprint.js +124 -2
- package/dist/roof/roof-materials.d.ts.map +1 -1
- package/dist/roof/roof-materials.js +10 -1
- package/dist/roof/roof-placement-mode.d.ts +0 -2
- package/dist/roof/roof-placement-mode.d.ts.map +1 -1
- package/dist/roof/roof-placement-mode.js +8 -6
- package/dist/roof/roof-plan-creases.d.ts +50 -0
- package/dist/roof/roof-plan-creases.d.ts.map +1 -0
- package/dist/roof/roof-plan-creases.js +194 -0
- package/dist/roof/roof-ridge-mode.d.ts +20 -0
- package/dist/roof/roof-ridge-mode.d.ts.map +1 -0
- package/dist/roof/roof-ridge-mode.js +16 -0
- package/dist/roof/tool.d.ts +17 -4
- package/dist/roof/tool.d.ts.map +1 -1
- package/dist/roof/tool.js +211 -113
- package/dist/roof/wall-catch.d.ts +106 -0
- package/dist/roof/wall-catch.d.ts.map +1 -0
- package/dist/roof/wall-catch.js +267 -0
- package/dist/roof-segment/build-up-section.d.ts +9 -0
- package/dist/roof-segment/build-up-section.d.ts.map +1 -0
- package/dist/roof-segment/build-up-section.js +191 -0
- package/dist/roof-segment/definition.d.ts.map +1 -1
- package/dist/roof-segment/definition.js +50 -5
- package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
- package/dist/roof-segment/floorplan-affordances.js +68 -19
- package/dist/roof-segment/floorplan.d.ts.map +1 -1
- package/dist/roof-segment/floorplan.js +16 -12
- package/dist/roof-segment/paint.d.ts +3 -1
- package/dist/roof-segment/paint.d.ts.map +1 -1
- package/dist/roof-segment/paint.js +43 -2
- package/dist/roof-segment/panel-model.d.ts +23 -0
- package/dist/roof-segment/panel-model.d.ts.map +1 -0
- package/dist/roof-segment/panel-model.js +64 -0
- package/dist/roof-segment/panel.d.ts.map +1 -1
- package/dist/roof-segment/panel.js +96 -14
- package/dist/roof-segment/parametrics.d.ts.map +1 -1
- package/dist/roof-segment/parametrics.js +4 -0
- package/dist/roof-segment/renderer.d.ts.map +1 -1
- package/dist/roof-segment/renderer.js +26 -5
- package/dist/separator/definition.d.ts.map +1 -1
- package/dist/separator/definition.js +10 -12
- package/dist/separator/floorplan-affordances.d.ts +9 -0
- package/dist/separator/floorplan-affordances.d.ts.map +1 -0
- package/dist/separator/floorplan-affordances.js +23 -0
- package/dist/separator/floorplan.d.ts +9 -0
- package/dist/separator/floorplan.d.ts.map +1 -0
- package/dist/separator/floorplan.js +54 -0
- package/dist/separator/renderer.d.ts +4 -0
- package/dist/separator/renderer.d.ts.map +1 -1
- package/dist/separator/renderer.js +21 -6
- package/dist/separator/selection.d.ts +10 -0
- package/dist/separator/selection.d.ts.map +1 -0
- package/dist/separator/selection.js +35 -0
- package/dist/shared/build-up-controls.d.ts +88 -0
- package/dist/shared/build-up-controls.d.ts.map +1 -0
- package/dist/shared/build-up-controls.js +139 -0
- package/dist/shared/curtain-opening-limits.d.ts.map +1 -1
- package/dist/shared/curtain-opening-limits.js +44 -14
- package/dist/shared/item-interaction-actions.d.ts.map +1 -1
- package/dist/shared/item-interaction-actions.js +11 -2
- package/dist/shared/layer-thickness.d.ts +2 -0
- package/dist/shared/layer-thickness.d.ts.map +1 -0
- package/dist/shared/layer-thickness.js +3 -0
- package/dist/shared/move-roof-tool.d.ts.map +1 -1
- package/dist/shared/move-roof-tool.js +100 -5
- package/dist/shared/node-batch/batchable.d.ts +2 -0
- package/dist/shared/node-batch/batchable.d.ts.map +1 -1
- package/dist/shared/node-batch/batchable.js +4 -0
- package/dist/shared/node-batch/candidates.d.ts +21 -5
- package/dist/shared/node-batch/candidates.d.ts.map +1 -1
- package/dist/shared/node-batch/candidates.js +85 -50
- package/dist/shared/node-batch/system.d.ts.map +1 -1
- package/dist/shared/node-batch/system.js +24 -15
- package/dist/shared/opening-casing-move.d.ts +16 -0
- package/dist/shared/opening-casing-move.d.ts.map +1 -0
- package/dist/shared/opening-casing-move.js +33 -0
- package/dist/shared/opening-casing-section.d.ts +15 -0
- package/dist/shared/opening-casing-section.d.ts.map +1 -0
- package/dist/shared/opening-casing-section.js +38 -0
- package/dist/shared/opening-casing.d.ts +26 -0
- package/dist/shared/opening-casing.d.ts.map +1 -0
- package/dist/shared/opening-casing.js +80 -0
- package/dist/shared/opening-depth-position.d.ts +13 -0
- package/dist/shared/opening-depth-position.d.ts.map +1 -0
- package/dist/shared/opening-depth-position.js +34 -0
- package/dist/shared/opening-documentation.d.ts.map +1 -1
- package/dist/shared/opening-documentation.js +17 -8
- package/dist/shared/opening-guides-runtime.d.ts +2 -1
- package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
- package/dist/shared/opening-guides-runtime.js +11 -7
- package/dist/shared/opening-labels.d.ts +11 -0
- package/dist/shared/opening-labels.d.ts.map +1 -0
- package/dist/shared/opening-labels.js +46 -0
- package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
- package/dist/shared/opening-placement-dimensions.js +11 -9
- package/dist/shared/opening-plane-offset.d.ts +4 -3
- package/dist/shared/opening-plane-offset.d.ts.map +1 -1
- package/dist/shared/opening-plane-offset.js +7 -4
- package/dist/shared/opening-swap.d.ts +8 -0
- package/dist/shared/opening-swap.d.ts.map +1 -0
- package/dist/shared/opening-swap.js +18 -0
- package/dist/shared/polygon-vertex-affordance.d.ts +19 -0
- package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
- package/dist/shared/polygon-vertex-affordance.js +65 -6
- package/dist/shared/roof-opening-host.d.ts +2 -1
- package/dist/shared/roof-opening-host.d.ts.map +1 -1
- package/dist/shared/roof-opening-host.js +14 -5
- package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -1
- package/dist/shared/roof-wall-opening-cut.js +14 -6
- package/dist/shared/roof-wall-opening-placement.d.ts +2 -1
- package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -1
- package/dist/shared/roof-wall-opening-placement.js +6 -4
- package/dist/shared/run-hanger-inspector.d.ts.map +1 -1
- package/dist/shared/run-hanger-inspector.js +39 -5
- package/dist/shared/system-check-panel.d.ts.map +1 -1
- package/dist/shared/system-check-panel.js +94 -15
- package/dist/shared/wall-attach-target.d.ts.map +1 -1
- package/dist/shared/wall-attach-target.js +6 -3
- package/dist/shelf/definition.d.ts.map +1 -1
- package/dist/shelf/definition.js +2 -0
- package/dist/site/ground-hole.d.ts +3 -3
- package/dist/site/ground-hole.js +3 -3
- package/dist/site/ground-veil.d.ts +5 -12
- package/dist/site/ground-veil.d.ts.map +1 -1
- package/dist/site/ground-veil.js +9 -33
- package/dist/site/panel.d.ts.map +1 -1
- package/dist/site/panel.js +52 -12
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +52 -23
- package/dist/skylight/panel.d.ts.map +1 -1
- package/dist/skylight/panel.js +49 -19
- package/dist/slab/deck-geometry.d.ts +28 -0
- package/dist/slab/deck-geometry.d.ts.map +1 -0
- package/dist/slab/deck-geometry.js +320 -0
- package/dist/slab/definition.d.ts +2 -1
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +6 -1
- package/dist/slab/dependency-tracker.d.ts.map +1 -1
- package/dist/slab/dependency-tracker.js +3 -0
- package/dist/slab/floorplan-affordances.d.ts +500 -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 +46 -9
- package/dist/slab/panel.d.ts.map +1 -1
- package/dist/slab/panel.js +97 -21
- package/dist/slab/renderer.d.ts +11 -0
- package/dist/slab/renderer.d.ts.map +1 -0
- package/dist/slab/renderer.js +19 -0
- package/dist/slab/system.d.ts.map +1 -1
- package/dist/slab/system.js +12 -1
- package/dist/solar-panel/panel.d.ts.map +1 -1
- package/dist/solar-panel/panel.js +49 -14
- package/dist/stair/construction-controls.d.ts +3 -1
- package/dist/stair/construction-controls.d.ts.map +1 -1
- package/dist/stair/construction-controls.js +75 -12
- package/dist/stair/paint.d.ts +6 -0
- package/dist/stair/paint.d.ts.map +1 -1
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +243 -51
- package/dist/stair/parametrics.d.ts.map +1 -1
- package/dist/stair/parametrics.js +7 -0
- package/dist/stair/placement-defaults.d.ts +18 -0
- package/dist/stair/placement-defaults.d.ts.map +1 -0
- package/dist/stair/placement-defaults.js +27 -0
- package/dist/stair/railing-controls.d.ts.map +1 -1
- package/dist/stair/railing-controls.js +78 -18
- package/dist/stair/renderer.d.ts.map +1 -1
- package/dist/stair/renderer.js +16 -10
- package/dist/stair/structure-controls.d.ts +18 -0
- package/dist/stair/structure-controls.d.ts.map +1 -0
- package/dist/stair/structure-controls.js +275 -0
- package/dist/stair/tool.d.ts.map +1 -1
- package/dist/stair/tool.js +13 -9
- package/dist/stair/use-stair-render-data.d.ts +41 -0
- package/dist/stair/use-stair-render-data.d.ts.map +1 -1
- package/dist/stair-segment/panel.d.ts.map +1 -1
- package/dist/stair-segment/panel.js +65 -18
- package/dist/turbine-vent/panel.d.ts.map +1 -1
- package/dist/turbine-vent/panel.js +14 -5
- package/dist/unit/unit-panel.d.ts.map +1 -1
- package/dist/unit/unit-panel.js +28 -12
- package/dist/wall/actions.d.ts +1 -1
- package/dist/wall/actions.d.ts.map +1 -1
- package/dist/wall/actions.js +17 -13
- package/dist/wall/construction-dimensions.d.ts +6 -0
- package/dist/wall/construction-dimensions.d.ts.map +1 -1
- package/dist/wall/construction-dimensions.js +8 -0
- package/dist/wall/contextual-dimensions.d.ts +6 -0
- package/dist/wall/contextual-dimensions.d.ts.map +1 -1
- package/dist/wall/contextual-dimensions.js +104 -17
- package/dist/wall/curtain-opening-frame.d.ts.map +1 -1
- package/dist/wall/curtain-opening-frame.js +6 -4
- package/dist/wall/curtain-wall-layout.d.ts +1 -1
- package/dist/wall/curtain-wall-layout.d.ts.map +1 -1
- package/dist/wall/curtain-wall-layout.js +6 -4
- package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
- package/dist/wall/curtain-wall-materials.js +8 -3
- package/dist/wall/curtain-wall-panel.d.ts.map +1 -1
- package/dist/wall/curtain-wall-panel.js +241 -37
- package/dist/wall/curve-tool.d.ts.map +1 -1
- package/dist/wall/curve-tool.js +2 -3
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +20 -5
- package/dist/wall/floorplan-affordances.d.ts.map +1 -1
- package/dist/wall/floorplan-affordances.js +9 -6
- package/dist/wall/floorplan-move.d.ts.map +1 -1
- package/dist/wall/floorplan-move.js +66 -16
- package/dist/wall/floorplan.d.ts +4 -5
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +62 -46
- package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
- package/dist/wall/move-endpoint-tool.js +1 -0
- package/dist/wall/move-tool.d.ts.map +1 -1
- package/dist/wall/move-tool.js +77 -12
- package/dist/wall/paint.d.ts +2 -2
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +11 -4
- package/dist/wall/panel-model.d.ts +17 -2
- package/dist/wall/panel-model.d.ts.map +1 -1
- package/dist/wall/panel-model.js +158 -18
- package/dist/wall/panel.d.ts +8 -0
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +228 -156
- package/dist/wall/parametrics.d.ts +1 -1
- package/dist/wall/parametrics.d.ts.map +1 -1
- package/dist/wall/parametrics.js +14 -1
- package/dist/wall/railing-wall-adapter.d.ts +7 -0
- package/dist/wall/railing-wall-adapter.d.ts.map +1 -0
- package/dist/wall/railing-wall-adapter.js +38 -0
- package/dist/wall/railing-wall-floorplan.d.ts +8 -0
- package/dist/wall/railing-wall-floorplan.d.ts.map +1 -0
- package/dist/wall/railing-wall-floorplan.js +27 -0
- package/dist/wall/railing-wall-geometry.d.ts +12 -0
- package/dist/wall/railing-wall-geometry.d.ts.map +1 -0
- package/dist/wall/railing-wall-geometry.js +51 -0
- package/dist/wall/railing-wall-guard.d.ts +81 -0
- package/dist/wall/railing-wall-guard.d.ts.map +1 -0
- package/dist/wall/railing-wall-guard.js +435 -0
- package/dist/wall/railing-wall-materials.d.ts +11 -0
- package/dist/wall/railing-wall-materials.d.ts.map +1 -0
- package/dist/wall/railing-wall-materials.js +31 -0
- package/dist/wall/railing-wall-panel-model.d.ts +30 -0
- package/dist/wall/railing-wall-panel-model.d.ts.map +1 -0
- package/dist/wall/railing-wall-panel-model.js +117 -0
- package/dist/wall/railing-wall-panel.d.ts +17 -0
- package/dist/wall/railing-wall-panel.d.ts.map +1 -0
- package/dist/wall/railing-wall-panel.js +42 -0
- package/dist/wall/rectangle-command.d.ts +79 -1
- package/dist/wall/rectangle-command.d.ts.map +1 -1
- package/dist/wall/rectangle-tool.d.ts.map +1 -1
- package/dist/wall/rectangle-tool.js +2 -0
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +3 -1
- package/dist/wall/skirting-floor-gaps.d.ts +8 -0
- package/dist/wall/skirting-floor-gaps.d.ts.map +1 -0
- package/dist/wall/skirting-floor-gaps.js +36 -0
- package/dist/wall/system.d.ts +0 -14
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +6 -1
- package/dist/wall/tool.d.ts +16 -0
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +160 -47
- package/dist/wall/treatments.d.ts +3 -0
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +30 -7
- package/dist/window/actions.d.ts +7 -0
- package/dist/window/actions.d.ts.map +1 -0
- package/dist/window/actions.js +29 -0
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +11 -2
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +5 -0
- package/dist/window/floorplan.d.ts +2 -0
- package/dist/window/floorplan.d.ts.map +1 -1
- package/dist/window/floorplan.js +58 -1
- package/dist/window/mechanism.d.ts.map +1 -1
- package/dist/window/mechanism.js +21 -1
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +10 -3
- package/dist/window/paint.d.ts +2 -7
- package/dist/window/paint.d.ts.map +1 -1
- package/dist/window/paint.js +31 -3
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +311 -69
- package/dist/window/placement.d.ts.map +1 -1
- package/dist/window/placement.js +5 -1
- package/dist/window/swing.d.ts +13 -0
- package/dist/window/swing.d.ts.map +1 -0
- package/dist/window/swing.js +16 -0
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +19 -14
- package/dist/zone/floorplan-affordances.d.ts +136 -0
- package/dist/zone/floorplan-affordances.d.ts.map +1 -1
- package/dist/zone/quantities-panel.d.ts.map +1 -1
- package/dist/zone/quantities-panel.js +34 -9
- package/dist/zone/renderer.d.ts.map +1 -1
- package/dist/zone/renderer.js +9 -5
- package/package.json +14 -14
- package/dist/site/generic-foundation-geometry.d.ts +0 -16
- package/dist/site/generic-foundation-geometry.d.ts.map +0 -1
- package/dist/site/generic-foundation-geometry.js +0 -75
- package/dist/site/generic-foundation.d.ts +0 -4
- package/dist/site/generic-foundation.d.ts.map +0 -1
- package/dist/site/generic-foundation.js +0 -91
|
@@ -59,8 +59,8 @@ export const wallCurveAffordance = {
|
|
|
59
59
|
affectedIds: [node.id],
|
|
60
60
|
apply({ planPoint }) {
|
|
61
61
|
const snapStep = getSegmentGridStep();
|
|
62
|
-
//
|
|
63
|
-
//
|
|
62
|
+
// Building-grid snap, the lattice the plan draws (it turns with the
|
|
63
|
+
// building).
|
|
64
64
|
const [x, y] = snapBuildingLocalToWorldGrid([planPoint[0], planPoint[1]], snapStep);
|
|
65
65
|
// Signed projection of (snappedPoint - chord midpoint) onto the
|
|
66
66
|
// chord normal. Legacy negates because the SVG y-axis flips
|
|
@@ -167,16 +167,19 @@ export const wallMoveEndpointAffordance = {
|
|
|
167
167
|
// is 0 outside grid mode), so `'lines' / 'angles' / 'off'` no longer
|
|
168
168
|
// force a grid snap the mode chip says is inactive. In `'angles'` mode
|
|
169
169
|
// the endpoint angle-locks off the fixed corner (free length), matching
|
|
170
|
-
// the draft tool — the angle path ignores the `gridSnap` override.
|
|
171
|
-
|
|
170
|
+
// the draft tool — the angle path ignores the `gridSnap` override. The
|
|
171
|
+
// fixed corner is the segment's start in every mode, as in the 3D tool:
|
|
172
|
+
// the body capture slides the end along it, so a wall whose fixed end
|
|
173
|
+
// is T-joined on another wall can't fold onto that wall's line.
|
|
172
174
|
const snapped = snapWallDraftPoint({
|
|
173
175
|
point: planPoint,
|
|
174
176
|
walls,
|
|
175
177
|
ignoreWallIds: staleWallIds,
|
|
176
|
-
start:
|
|
177
|
-
angleSnap:
|
|
178
|
+
start: fixedPoint,
|
|
179
|
+
angleSnap: isAngleSnapActive(),
|
|
178
180
|
magnetic: isMagneticSnapActive(),
|
|
179
181
|
gridSnap: (p) => snapBuildingLocalToWorldGrid(p, getSegmentGridStep()),
|
|
182
|
+
captureWallBodies: true,
|
|
180
183
|
});
|
|
181
184
|
// Figma-style alignment on the dragged corner — snaps it onto another
|
|
182
185
|
// object's edge / wall face and publishes a guide. The guide is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,mBAAmB,
|
|
1
|
+
{"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/wall/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,mBAAmB,EAYxB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAyBzB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,CAAC,QAAQ,CAqajE,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createLevelStructurePreview, getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, planWallEndRejoins, planWallMoveJunctions, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
2
|
-
import { getFloorplanWallThickness, getSegmentGridStep, isSegmentLongEnough, snapScalarToGrid, useWallMoveGhosts, WALL_CONNECT_SNAP_RADIUS, } from '@pascal-app/editor';
|
|
1
|
+
import { createLevelStructurePreview, finishWallEdit, generateId, getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, planAttachedWallChanges, planAttachedWallUpdates, planWallEndRejoins, planWallMoveJunctions, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
2
|
+
import { getFloorplanWallThickness, getSegmentGridStep, isSegmentLongEnough, isWallRunFree, nearestWallParallelTarget, publishWallParallelGuide, snapScalarToGrid, useWallMoveGhosts, WALL_CONNECT_SNAP_RADIUS, wallParallelTargets, } from '@pascal-app/editor';
|
|
3
3
|
import { useViewer } from '@pascal-app/viewer';
|
|
4
4
|
import { buildBridgeWallCreates, buildBridgeWallPreviews, getLinkedWallSnapshots, getWallsAfterUpdates, stripWallIsNewMetadata, } from './move-shared.js';
|
|
5
5
|
/**
|
|
@@ -78,7 +78,22 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
78
78
|
const dragNodes = Object.fromEntries(Object.values(useScene.getState().nodes)
|
|
79
79
|
.filter((node) => node.parentId === levelId)
|
|
80
80
|
.map((node) => [node.id, node]));
|
|
81
|
-
|
|
81
|
+
// Lines up with the parallel walls on the level: an outside wall's faces
|
|
82
|
+
// with the rest of the outside, any other wall's with every wall.
|
|
83
|
+
const parallelTargets = moveAxis
|
|
84
|
+
? wallParallelTargets(node, moveAxis, Object.values(dragNodes).filter((entry) => entry.type === 'wall'))
|
|
85
|
+
: [];
|
|
86
|
+
let lastLineUp = null;
|
|
87
|
+
// Walls T'd into this one stay on it, stretched along their own line.
|
|
88
|
+
const linkedIds = new Set(linkedOriginals.map((wall) => wall.id));
|
|
89
|
+
const attachedWalls = isNew
|
|
90
|
+
? []
|
|
91
|
+
: planAttachedWallUpdates(Object.values(dragNodes).filter((entry) => entry.type === 'wall' && entry.id !== wallId && !linkedIds.has(entry.id)), originalStart, originalEnd, originalStart, originalEnd).map(({ id }) => dragNodes[id]);
|
|
92
|
+
const affectedIds = [
|
|
93
|
+
wallId,
|
|
94
|
+
...linkedOriginals.map((wall) => wall.id),
|
|
95
|
+
...attachedWalls.map((wall) => wall.id),
|
|
96
|
+
];
|
|
82
97
|
const affectedIdSet = new Set(affectedIds);
|
|
83
98
|
const touchedSurfaceIds = new Set();
|
|
84
99
|
const publishSurfacePreviews = (walls) => {
|
|
@@ -121,25 +136,30 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
121
136
|
};
|
|
122
137
|
const session = {
|
|
123
138
|
affectedIds,
|
|
124
|
-
apply({ planPoint }) {
|
|
139
|
+
apply({ planPoint, modifiers }) {
|
|
125
140
|
if (!rawAnchor) {
|
|
126
141
|
rawAnchor = [planPoint[0], planPoint[1]];
|
|
127
142
|
return;
|
|
128
143
|
}
|
|
129
144
|
const rawDx = planPoint[0] - rawAnchor[0];
|
|
130
145
|
const rawDz = planPoint[1] - rawAnchor[1];
|
|
131
|
-
|
|
146
|
+
// Alt (or snapping off) moves the wall exactly with the pointer.
|
|
147
|
+
const free = isWallRunFree(modifiers);
|
|
148
|
+
const step = free ? 0 : getSegmentGridStep();
|
|
132
149
|
// Axis-lock the move to the wall's perpendicular (normal). Project
|
|
133
150
|
// the original centre + raw cursor delta onto the axis, snap the
|
|
134
|
-
// absolute projection to a
|
|
135
|
-
// by `axis * perpDelta`.
|
|
136
|
-
// produce identical wall
|
|
151
|
+
// absolute projection to a parallel wall it lines up with, else to a
|
|
152
|
+
// grid multiple, then translate the wall by `axis * perpDelta`.
|
|
153
|
+
// Matches `MoveWallTool` so 2D and 3D drag produce identical wall
|
|
154
|
+
// topology.
|
|
137
155
|
let dx;
|
|
138
156
|
let dz;
|
|
157
|
+
let lineUp = null;
|
|
139
158
|
if (moveAxis) {
|
|
140
159
|
const originalProj = originalCenter[0] * moveAxis[0] + originalCenter[1] * moveAxis[1];
|
|
141
160
|
const rawProj = originalProj + rawDx * moveAxis[0] + rawDz * moveAxis[1];
|
|
142
|
-
|
|
161
|
+
lineUp = free ? null : nearestWallParallelTarget(parallelTargets, rawProj);
|
|
162
|
+
const snappedProj = lineUp ? lineUp.position : snapScalarToGrid(rawProj, step);
|
|
143
163
|
const perpDelta = snappedProj - originalProj;
|
|
144
164
|
dx = moveAxis[0] * perpDelta;
|
|
145
165
|
dz = moveAxis[1] * perpDelta;
|
|
@@ -148,6 +168,10 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
148
168
|
dx = snapScalarToGrid(rawDx, step);
|
|
149
169
|
dz = snapScalarToGrid(rawDz, step);
|
|
150
170
|
}
|
|
171
|
+
if (lineUp !== lastLineUp) {
|
|
172
|
+
lastLineUp = lineUp;
|
|
173
|
+
publishWallParallelGuide(lineUp);
|
|
174
|
+
}
|
|
151
175
|
if (dx === lastDelta[0] && dz === lastDelta[1])
|
|
152
176
|
return;
|
|
153
177
|
lastDelta = [dx, dz];
|
|
@@ -185,11 +209,14 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
185
209
|
// until the user commits. Batched into a single zustand
|
|
186
210
|
// notification — otherwise each per-wall `.set` would re-render
|
|
187
211
|
// every override subscriber once per linked wall per tick.
|
|
212
|
+
const attachedById = new Map(planAttachedWallUpdates(attachedWalls, originalStart, originalEnd, nextStart, nextEnd).map((update) => [update.id, update]));
|
|
213
|
+
// A wall the move carries off this one's ends lets go: back where it was.
|
|
214
|
+
const attachedUpdates = attachedWalls.map((wall) => attachedById.get(wall.id) ?? { id: wall.id, start: wall.start, end: wall.end });
|
|
188
215
|
useLiveNodeOverrides
|
|
189
216
|
.getState()
|
|
190
217
|
.setMany([
|
|
191
218
|
[wallId, { start: nextStart, end: nextEnd }],
|
|
192
|
-
...linkedUpdates.map((upd) => [upd.id, { start: upd.start, end: upd.end }]),
|
|
219
|
+
...[...linkedUpdates, ...attachedUpdates].map((upd) => [upd.id, { start: upd.start, end: upd.end }]),
|
|
193
220
|
]);
|
|
194
221
|
// Surface bridge-wall previews so the floor-plan SVG layer can
|
|
195
222
|
// render dashed outlines of what `commit()` will insert. Mirrors
|
|
@@ -199,7 +226,10 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
199
226
|
// overrides we just published (zustand is still on baseline).
|
|
200
227
|
const previewSceneWalls = getWallsAfterUpdates(dragNodes, [
|
|
201
228
|
{ id: wallId, data: { start: nextStart, end: nextEnd } },
|
|
202
|
-
...linkedUpdates.map((u) => ({
|
|
229
|
+
...[...linkedUpdates, ...attachedUpdates].map((u) => ({
|
|
230
|
+
id: u.id,
|
|
231
|
+
data: { start: u.start, end: u.end },
|
|
232
|
+
})),
|
|
203
233
|
]).filter((wall) => !collapsedIds.has(wall.id));
|
|
204
234
|
const bridgePreviews = buildBridgeWallPreviews({
|
|
205
235
|
bridgePlans: plan.bridgePlans,
|
|
@@ -223,7 +253,7 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
223
253
|
// (override-merged) so the mesh follows the cursor.
|
|
224
254
|
const sceneState = useScene.getState();
|
|
225
255
|
sceneState.markDirty(wallId);
|
|
226
|
-
for (const upd of linkedUpdates) {
|
|
256
|
+
for (const upd of [...linkedUpdates, ...attachedUpdates]) {
|
|
227
257
|
sceneState.markDirty(upd.id);
|
|
228
258
|
}
|
|
229
259
|
},
|
|
@@ -235,14 +265,16 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
235
265
|
return dx !== 0 || dz !== 0;
|
|
236
266
|
},
|
|
237
267
|
commit() {
|
|
268
|
+
publishWallParallelGuide(null);
|
|
238
269
|
const sceneState = useScene.getState();
|
|
239
270
|
const liveWall = sceneState.nodes[wallId];
|
|
240
271
|
if (liveWall?.type !== 'wall') {
|
|
241
272
|
// Bail without leaving stale overrides behind.
|
|
242
273
|
const overrides = useLiveNodeOverrides.getState();
|
|
243
274
|
overrides.clear(wallId);
|
|
244
|
-
for (const wall of linkedOriginals)
|
|
275
|
+
for (const wall of [...linkedOriginals, ...attachedWalls]) {
|
|
245
276
|
overrides.clear(wall.id);
|
|
277
|
+
}
|
|
246
278
|
clearSurfacePreviews();
|
|
247
279
|
return;
|
|
248
280
|
}
|
|
@@ -281,10 +313,27 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
281
313
|
existingWalls,
|
|
282
314
|
wallCount: Object.values(sceneState.nodes).filter((entry) => entry?.type === 'wall').length,
|
|
283
315
|
});
|
|
284
|
-
|
|
285
|
-
|
|
316
|
+
// Walls T'd into this one follow it, what hangs on them staying put.
|
|
317
|
+
const attachedChanges = planAttachedWallChanges(sceneState.nodes, wallId, originalStart, originalEnd, lastNextStart, lastNextEnd, new Set([...linkedIds, ...collapsedLinkedWallIds]));
|
|
318
|
+
const attachedWallIds = attachedChanges.flatMap(({ id }) => sceneState.nodes[id]?.type === 'wall' ? [id] : []);
|
|
319
|
+
// The moved and stretched walls and the jogs take over any stretch of a
|
|
320
|
+
// parallel wall they now run along; jogs on the outline are outside walls.
|
|
321
|
+
sceneState.applyNodeChanges(finishWallEdit(sceneState.nodes, planWallEndRejoins(sceneState.nodes, commitUpdates.map(({ id }) => id), WALL_CONNECT_SNAP_RADIUS, {
|
|
322
|
+
update: [
|
|
323
|
+
...commitUpdates,
|
|
324
|
+
...attachedChanges,
|
|
325
|
+
],
|
|
286
326
|
create: bridgeCreates,
|
|
287
327
|
delete: Array.from(collapsedLinkedWallIds),
|
|
328
|
+
}), {
|
|
329
|
+
winnerIds: [
|
|
330
|
+
...commitUpdates.map(({ id }) => id),
|
|
331
|
+
...attachedWallIds,
|
|
332
|
+
...bridgeCreates.map(({ node }) => node.id),
|
|
333
|
+
],
|
|
334
|
+
movedWallId: wallId,
|
|
335
|
+
bridgeIds: bridgeCreates.map(({ node }) => node.id),
|
|
336
|
+
mintId: () => generateId('wall'),
|
|
288
337
|
}));
|
|
289
338
|
// Drop the live overrides now that the committed scene state
|
|
290
339
|
// matches them — leaving them around would keep the system
|
|
@@ -293,8 +342,9 @@ export const wallFloorplanMoveTarget = ({ node }) => {
|
|
|
293
342
|
// next frame reads the new scene state directly.
|
|
294
343
|
const overrides = useLiveNodeOverrides.getState();
|
|
295
344
|
overrides.clear(wallId);
|
|
296
|
-
for (const wall of linkedOriginals)
|
|
345
|
+
for (const wall of [...linkedOriginals, ...attachedWalls]) {
|
|
297
346
|
overrides.clear(wall.id);
|
|
347
|
+
}
|
|
298
348
|
clearSurfacePreviews();
|
|
299
349
|
// Swap ghosts → real walls: the bridges we just created render
|
|
300
350
|
// through the registry layer, so the dashed previews aren't
|
package/dist/wall/floorplan.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { type AnyNode, type FloorplanGeometry, type GeometryContext, type WallLayerMiterData, type WallMiterData, type WallNode } from '@pascal-app/core';
|
|
2
2
|
import { type WallConstructionDimensionPlan } from './construction-dimensions.js';
|
|
3
|
-
declare const WALL_DIMENSION_REFERENCES: readonly ['finished-faces', 'centerline', 'stud-faces'];
|
|
4
|
-
type WallDimensionReference = (typeof WALL_DIMENSION_REFERENCES)[number];
|
|
5
3
|
export type WallFloorplanLevelData = {
|
|
6
4
|
miters: WallMiterData;
|
|
7
5
|
documentMiters: WallMiterData;
|
|
8
6
|
layerMiters: WallLayerMiterData;
|
|
9
7
|
documentLayerMiters: WallLayerMiterData;
|
|
10
|
-
|
|
8
|
+
/** Built on first read: a level whose plan shows no automatic dimensions never pays for it. */
|
|
9
|
+
readonly constructionDimensions: WallConstructionDimensionPlan;
|
|
11
10
|
};
|
|
12
11
|
export declare function computeWallFloorplanLevelData({ siblings, nodes, }: {
|
|
13
12
|
siblings: ReadonlyArray<WallNode>;
|
|
@@ -22,7 +21,8 @@ export declare function computeWallFloorplanLevelData({ siblings, nodes, }: {
|
|
|
22
21
|
* 3. A transparent hit-line on the centerline so the user can grab the
|
|
23
22
|
* wall body easily.
|
|
24
23
|
* 4. Two endpoint handles (start + end) when selected — the registry
|
|
25
|
-
* layer hosts the 5-circle stack + hover transitions + 2D drag
|
|
24
|
+
* layer hosts the 5-circle stack + hover transitions + 2D drag — and,
|
|
25
|
+
* just past each, a "pull to continue" grip that draws the next wall.
|
|
26
26
|
* 5. Exterior facade strings plus interior wall spans and hosted-opening widths.
|
|
27
27
|
*
|
|
28
28
|
* `ctx.levelData` provides the shared level miter graph when the floor-plan
|
|
@@ -30,5 +30,4 @@ export declare function computeWallFloorplanLevelData({ siblings, nodes, }: {
|
|
|
30
30
|
* direct builder callers.
|
|
31
31
|
*/
|
|
32
32
|
export declare function buildWallFloorplan(node: WallNode, ctx: GeometryContext): FloorplanGeometry | null;
|
|
33
|
-
export {};
|
|
34
33
|
//# 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,EAGZ,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,EAGZ,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAapB,KAAK,kBAAkB,EAEvB,KAAK,aAAa,EAClB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAazB,OAAO,EAML,KAAK,6BAA6B,EACnC,MAAM,2BAA2B,CAAA;AA4ClC,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,EAAE,aAAa,CAAA;IAC7B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,mBAAmB,EAAE,kBAAkB,CAAA;IACvC,+FAA+F;IAC/F,QAAQ,CAAC,sBAAsB,EAAE,6BAA6B,CAAA;CAC/D,CAAA;AAqJD,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,CAoBzB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAoRjG"}
|
package/dist/wall/floorplan.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { calculateLevelLayerMiters, calculateLevelMiters, getWallBodyCenterOffset, getWallCurveFrameAt, getWallCurveLength, getWallEffectiveHeightForNodes, getWallFaceOffsets, getWallLayerPolylines, getWallLocalFaceZ, getWallMidpointHandlePoint, getWallPlanFootprint, getWallThickness, isCurvedWall, wallLayerBoundaryOffsets, } from '@pascal-app/core';
|
|
2
|
-
import { floorplanGeometryMetadata, readFloorplanContext, WALL_PUSH_AFFORDANCE, } from '@pascal-app/editor';
|
|
1
|
+
import { calculateLevelLayerMiters, calculateLevelMiters, getWallBodyCenterOffset, getWallCurveFrameAt, getWallCurveLength, getWallEffectiveHeightForNodes, getWallFaceOffsets, getWallLayerPolylines, getWallLocalFaceZ, getWallMidpointHandlePoint, getWallPlanFootprint, getWallThickness, isCurvedWall, isRailingWall, wallLayerBoundaryOffsets, } from '@pascal-app/core';
|
|
2
|
+
import { floorplanGeometryMetadata, readFloorplanContext, WALL_PULL_AFFORDANCE, WALL_PULL_GRIP_TITLE, WALL_PUSH_AFFORDANCE, wallPullSeed, } from '@pascal-app/editor';
|
|
3
3
|
import { constructionDimensionStandard } from '../shared/construction-dimension-standards.js';
|
|
4
|
-
import { buildCurvedWallConstructionDimensions, buildLevelWallConstructionDimensionPlan, buildWallConstructionDimensions, renderPlannedConstructionDimensions, } from './construction-dimensions.js';
|
|
4
|
+
import { buildCurvedWallConstructionDimensions, buildLevelWallConstructionDimensionPlan, buildWallConstructionDimensions, constructionDimensionFace, renderPlannedConstructionDimensions, } from './construction-dimensions.js';
|
|
5
5
|
import { buildCurtainWallFloorplan } from './curtain-wall-floorplan.js';
|
|
6
6
|
import { hasWallCurveBlockingChildren } from './curve-eligibility.js';
|
|
7
|
+
import { buildRailingWallFloorplan } from './railing-wall-floorplan.js';
|
|
7
8
|
// Same constants the legacy `getFloorplanWall` uses (editor/lib/floorplan/walls.ts).
|
|
8
9
|
// Slightly exaggerates thin walls so the 2D plan stays legible without
|
|
9
10
|
// drifting from BIM data. Inlined to keep nodes/wall self-contained.
|
|
@@ -12,10 +13,19 @@ const FLOORPLAN_MIN_VISIBLE_WALL_THICKNESS = 0.13;
|
|
|
12
13
|
const FLOORPLAN_MAX_EXTRA_THICKNESS = 0.035;
|
|
13
14
|
const FLOORPLAN_SELECTION_HATCH_SPACING = 0.12;
|
|
14
15
|
const FLOORPLAN_SELECTED_WALL_STROKE_WIDTH = 0.03;
|
|
16
|
+
const FLOORPLAN_RAILING_STROKE_WIDTH = 0.01;
|
|
15
17
|
const FLOORPLAN_SELECTION_HATCH_STROKE_WIDTH = 0.02;
|
|
16
|
-
|
|
18
|
+
// The automatic strings measure finished faces; a partition meeting a facade
|
|
19
|
+
// is dimensioned to both of its faces.
|
|
20
|
+
const FINISHED_FACE_DIMENSIONS = {
|
|
21
|
+
datumPolicy: 'wall-face',
|
|
22
|
+
intersectionReferencePolicy: 'both-faces',
|
|
23
|
+
};
|
|
17
24
|
function floorplanWallThickness(wall) {
|
|
18
25
|
const baseThickness = getWallThickness(wall);
|
|
26
|
+
// A railing draws as thin as its posts.
|
|
27
|
+
if (isRailingWall(wall))
|
|
28
|
+
return baseThickness;
|
|
19
29
|
const scaledThickness = baseThickness * FLOORPLAN_WALL_THICKNESS_SCALE;
|
|
20
30
|
return Math.min(baseThickness + FLOORPLAN_MAX_EXTRA_THICKNESS, Math.max(baseThickness, scaledThickness, FLOORPLAN_MIN_VISIBLE_WALL_THICKNESS));
|
|
21
31
|
}
|
|
@@ -166,38 +176,19 @@ function buildWallAssemblyLayers(wall, source, layerMiters, children, documentMo
|
|
|
166
176
|
}
|
|
167
177
|
export function computeWallFloorplanLevelData({ siblings, nodes, }) {
|
|
168
178
|
const walls = siblings.map(exaggerateWallThickness);
|
|
169
|
-
const constructionDimensionsByReference = {};
|
|
170
|
-
for (const reference of WALL_DIMENSION_REFERENCES) {
|
|
171
|
-
let cached;
|
|
172
|
-
Object.defineProperty(constructionDimensionsByReference, reference, {
|
|
173
|
-
enumerable: true,
|
|
174
|
-
get: () => {
|
|
175
|
-
if (cached)
|
|
176
|
-
return cached;
|
|
177
|
-
const datumPolicy = reference === 'finished-faces'
|
|
178
|
-
? 'wall-face'
|
|
179
|
-
: reference === 'stud-faces'
|
|
180
|
-
? 'structural-face'
|
|
181
|
-
: 'centerline';
|
|
182
|
-
cached = buildLevelWallConstructionDimensionPlan(siblings, nodes, constructionDimensionStandard({
|
|
183
|
-
datumPolicy,
|
|
184
|
-
...(reference === 'finished-faces'
|
|
185
|
-
? { intersectionReferencePolicy: 'both-faces' }
|
|
186
|
-
: {}),
|
|
187
|
-
}));
|
|
188
|
-
return cached;
|
|
189
|
-
},
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
179
|
const documentWalls = [...siblings];
|
|
193
180
|
const miters = calculateLevelMiters(walls);
|
|
194
181
|
const documentMiters = calculateLevelMiters(documentWalls);
|
|
182
|
+
let constructionDimensions;
|
|
195
183
|
return {
|
|
196
184
|
miters,
|
|
197
185
|
documentMiters,
|
|
198
186
|
layerMiters: calculateLevelLayerMiters(walls, miters, wallLayerOffsets),
|
|
199
187
|
documentLayerMiters: calculateLevelLayerMiters(documentWalls, documentMiters, wallLayerOffsets),
|
|
200
|
-
|
|
188
|
+
get constructionDimensions() {
|
|
189
|
+
constructionDimensions ??= buildLevelWallConstructionDimensionPlan(siblings, nodes, constructionDimensionStandard(FINISHED_FACE_DIMENSIONS));
|
|
190
|
+
return constructionDimensions;
|
|
191
|
+
},
|
|
201
192
|
};
|
|
202
193
|
}
|
|
203
194
|
/**
|
|
@@ -209,7 +200,8 @@ export function computeWallFloorplanLevelData({ siblings, nodes, }) {
|
|
|
209
200
|
* 3. A transparent hit-line on the centerline so the user can grab the
|
|
210
201
|
* wall body easily.
|
|
211
202
|
* 4. Two endpoint handles (start + end) when selected — the registry
|
|
212
|
-
* layer hosts the 5-circle stack + hover transitions + 2D drag
|
|
203
|
+
* layer hosts the 5-circle stack + hover transitions + 2D drag — and,
|
|
204
|
+
* just past each, a "pull to continue" grip that draws the next wall.
|
|
213
205
|
* 5. Exterior facade strings plus interior wall spans and hosted-opening widths.
|
|
214
206
|
*
|
|
215
207
|
* `ctx.levelData` provides the shared level miter graph when the floor-plan
|
|
@@ -217,7 +209,7 @@ export function computeWallFloorplanLevelData({ siblings, nodes, }) {
|
|
|
217
209
|
* direct builder callers.
|
|
218
210
|
*/
|
|
219
211
|
export function buildWallFloorplan(node, ctx) {
|
|
220
|
-
const { automaticDimensions, metricNotation, purpose,
|
|
212
|
+
const { automaticDimensions, metricNotation, purpose, wallDimensionFaces } = readFloorplanContext(ctx);
|
|
221
213
|
const documentMode = purpose === 'document';
|
|
222
214
|
const wallForPurpose = (wall) => (documentMode ? wall : exaggerateWallThickness(wall));
|
|
223
215
|
const self = wallForPurpose(node);
|
|
@@ -258,14 +250,24 @@ export function buildWallFloorplan(node, ctx) {
|
|
|
258
250
|
: isHovered && palette
|
|
259
251
|
? palette.wallHoverStroke
|
|
260
252
|
: '#1f2937';
|
|
261
|
-
|
|
253
|
+
// A railing is an outline round its posts, with no poché.
|
|
254
|
+
const railing = isRailingWall(node);
|
|
255
|
+
const fill = node.wallType === 'curtain' || railing
|
|
256
|
+
? 'transparent'
|
|
257
|
+
: showSelectedChrome
|
|
258
|
+
? '#ffffff'
|
|
259
|
+
: '#374151';
|
|
262
260
|
const children = [
|
|
263
261
|
{
|
|
264
262
|
kind: 'polygon',
|
|
265
263
|
points,
|
|
266
264
|
fill,
|
|
267
265
|
stroke,
|
|
268
|
-
strokeWidth: showSelectedChrome
|
|
266
|
+
strokeWidth: showSelectedChrome
|
|
267
|
+
? FLOORPLAN_SELECTED_WALL_STROKE_WIDTH
|
|
268
|
+
: railing
|
|
269
|
+
? FLOORPLAN_RAILING_STROKE_WIDTH
|
|
270
|
+
: 0.02,
|
|
269
271
|
opacity: 0.92,
|
|
270
272
|
metadata: floorplanGeometryMetadata({ annotationObstacle: 'outline' }),
|
|
271
273
|
// Once the wall is selected, the body keeps catching the pointer
|
|
@@ -279,6 +281,9 @@ export function buildWallFloorplan(node, ctx) {
|
|
|
279
281
|
if (node.wallType === 'curtain') {
|
|
280
282
|
children.push(...buildCurtainWallFloorplan(node, getWallEffectiveHeightForNodes(node, ctx.sceneNodes ?? {}), stroke, ctx.children));
|
|
281
283
|
}
|
|
284
|
+
else if (railing) {
|
|
285
|
+
children.push(...buildRailingWallFloorplan(node, ctx.children, ctx.siblings.filter((sibling) => sibling.type === 'wall'), stroke));
|
|
286
|
+
}
|
|
282
287
|
else if (node.assembly) {
|
|
283
288
|
// Assembly layer lines + framing poché, drawn inside the footprint.
|
|
284
289
|
children.push(...buildWallAssemblyLayers(self, node, getLayerMiters(), ctx.children, documentMode));
|
|
@@ -286,7 +291,7 @@ export function buildWallFloorplan(node, ctx) {
|
|
|
286
291
|
if (automaticDimensions) {
|
|
287
292
|
const dimensionStroke = isSelected && palette ? palette.selectedStroke : (palette?.measurementStroke ?? '#334155');
|
|
288
293
|
const dimensionStandard = constructionDimensionStandard({
|
|
289
|
-
|
|
294
|
+
...FINISHED_FACE_DIMENSIONS,
|
|
290
295
|
metricNotation,
|
|
291
296
|
});
|
|
292
297
|
const exteriorCornerDimensionStandard = constructionDimensionStandard({
|
|
@@ -303,11 +308,12 @@ export function buildWallFloorplan(node, ctx) {
|
|
|
303
308
|
}));
|
|
304
309
|
}
|
|
305
310
|
else {
|
|
306
|
-
const planned = levelData?.
|
|
311
|
+
const planned = levelData?.constructionDimensions.get(node.id);
|
|
307
312
|
if (planned) {
|
|
308
|
-
children.push(...renderPlannedConstructionDimensions(planned, view?.unit ?? 'metric', dimensionStroke, documentMode ? 'document' : 'editor', dimensionStandard));
|
|
313
|
+
children.push(...renderPlannedConstructionDimensions(planned.filter((entry) => measuresFace(wallDimensionFaces, constructionDimensionFace(entry.tier))), view?.unit ?? 'metric', dimensionStroke, documentMode ? 'document' : 'editor', dimensionStandard));
|
|
309
314
|
}
|
|
310
|
-
else if (!levelData) {
|
|
315
|
+
else if (!levelData && measuresFace(wallDimensionFaces, 'exterior')) {
|
|
316
|
+
// Without the level plan, only the exterior strings are drawn.
|
|
311
317
|
children.push(...buildWallConstructionDimensions(self, ctx, {
|
|
312
318
|
unit: view?.unit ?? 'metric',
|
|
313
319
|
stroke: dimensionStroke,
|
|
@@ -353,8 +359,25 @@ export function buildWallFloorplan(node, ctx) {
|
|
|
353
359
|
affordance: 'move-endpoint',
|
|
354
360
|
payload: { wallId: node.id, endpoint: 'end' },
|
|
355
361
|
});
|
|
362
|
+
// Pull grips — an arrow just past each end, pointing out along the wall:
|
|
363
|
+
// drag one to draw the next wall from that end (`startWallPull`).
|
|
364
|
+
for (const endpoint of ['start', 'end']) {
|
|
365
|
+
const seed = wallPullSeed(node, endpoint);
|
|
366
|
+
if (!seed)
|
|
367
|
+
continue;
|
|
368
|
+
children.push({
|
|
369
|
+
kind: 'move-arrow',
|
|
370
|
+
variant: 'pull',
|
|
371
|
+
point: seed.start,
|
|
372
|
+
angle: Math.atan2(seed.reference[1], seed.reference[0]),
|
|
373
|
+
affordance: WALL_PULL_AFFORDANCE,
|
|
374
|
+
payload: { wallId: node.id, endpoint },
|
|
375
|
+
title: WALL_PULL_GRIP_TITLE,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
356
378
|
const thicknessFrame = getWallCurveFrameAt(self, 0.5);
|
|
357
|
-
|
|
379
|
+
// A railing's posts set its thickness (the panel's Post size): it has no thickness handles.
|
|
380
|
+
for (const side of railing ? [] : [1, -1]) {
|
|
358
381
|
const halfVisibleThickness = getWallLocalFaceZ(self, side > 0 ? 'a' : 'b') * side;
|
|
359
382
|
children.push({
|
|
360
383
|
kind: 'endpoint-handle',
|
|
@@ -442,13 +465,6 @@ function buildSelectedWallHatchLines(wall, stroke) {
|
|
|
442
465
|
}
|
|
443
466
|
return lines;
|
|
444
467
|
}
|
|
445
|
-
function
|
|
446
|
-
|
|
447
|
-
case 'centerline':
|
|
448
|
-
return 'centerline';
|
|
449
|
-
case 'stud-faces':
|
|
450
|
-
return 'structural-face';
|
|
451
|
-
case 'finished-faces':
|
|
452
|
-
return 'wall-face';
|
|
453
|
-
}
|
|
468
|
+
function measuresFace(faces, face) {
|
|
469
|
+
return faces === 'both' || faces === face;
|
|
454
470
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-endpoint-tool.d.ts","sourceRoot":"","sources":["../../src/wall/move-endpoint-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAcL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AA4BzB;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;CAC1B,CAAA;AA6HD,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"move-endpoint-tool.d.ts","sourceRoot":"","sources":["../../src/wall/move-endpoint-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAcL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AA4BzB;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;CAC1B,CAAA;AA6HD,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CA8hBzE,CAAA;eAkBc,oBAAoB"}
|
|
@@ -260,6 +260,7 @@ export const MoveWallEndpointTool = ({ target }) => {
|
|
|
260
260
|
start: fixedPoint,
|
|
261
261
|
angleSnap: isAngleSnapActive(),
|
|
262
262
|
magnetic: isMagneticSnapActive(),
|
|
263
|
+
captureWallBodies: true,
|
|
263
264
|
});
|
|
264
265
|
const snappedPoint = snapResult.point;
|
|
265
266
|
// Figma-style alignment: nudge the dragged endpoint onto another wall /
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/wall/move-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/wall/move-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAoBL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAgIzB,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAunBrD,CAAA;eAEc,YAAY"}
|
package/dist/wall/move-tool.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { beginSceneHistoryPauseSession, createLevelStructurePreview, emitter, getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, planWallEndRejoins, planWallMoveJunctions, resolveMovedWallSupportSlabPatch, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
4
|
-
import { CursorSphere, EDITOR_LAYER, getSegmentGridStep, isSegmentLongEnough, isTypingTarget, markToolCancelConsumed, snapBuildingLocalToWorldGrid, snapScalarToGrid, triggerSFX, useEditor, WALL_CONNECT_SNAP_RADIUS, } from '@pascal-app/editor';
|
|
3
|
+
import { beginSceneHistoryPauseSession, createLevelStructurePreview, emitter, finishWallEdit, generateId, getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, planAttachedWallChanges, planAttachedWallUpdates, planWallEndRejoins, planWallMoveJunctions, resolveMovedWallSupportSlabPatch, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
4
|
+
import { CursorSphere, EDITOR_LAYER, getSegmentGridStep, isSegmentLongEnough, isTypingTarget, isWallRunFree, markToolCancelConsumed, nearestWallParallelTarget, publishWallParallelGuide, snapBuildingLocalToWorldGrid, snapScalarToGrid, triggerSFX, useEditor, WALL_CONNECT_SNAP_RADIUS, wallParallelTargets, } from '@pascal-app/editor';
|
|
5
5
|
import { useViewer } from '@pascal-app/viewer';
|
|
6
6
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
7
7
|
import { BufferGeometry, DoubleSide, Float32BufferAttribute } from 'three';
|
|
@@ -233,11 +233,43 @@ export const MoveWallTool = ({ node }) => {
|
|
|
233
233
|
const nextEnd = [center[0] + rotatedHalf[0], center[1] + rotatedHalf[1]];
|
|
234
234
|
return { start: nextStart, end: nextEnd };
|
|
235
235
|
};
|
|
236
|
+
// The level's other walls, which the moving wall lines up with when parallel
|
|
237
|
+
// (`wallParallelTargets`). Recomputed when R / T turns the wall.
|
|
238
|
+
const levelWalls = Object.values(useScene.getState().nodes).filter((entry) => entry?.type === 'wall' && (entry.parentId ?? null) === levelId);
|
|
239
|
+
const movingWall = levelWalls.find((entry) => entry.id === nodeId);
|
|
240
|
+
let parallelTargets = null;
|
|
241
|
+
const getParallelTargets = (axis) => {
|
|
242
|
+
const rotation = pendingRotationRef.current;
|
|
243
|
+
if (parallelTargets?.rotation !== rotation) {
|
|
244
|
+
const turned = buildWallFromCenter(originalCenter);
|
|
245
|
+
parallelTargets = {
|
|
246
|
+
rotation,
|
|
247
|
+
targets: movingWall
|
|
248
|
+
? wallParallelTargets({ ...movingWall, ...turned }, axis, levelWalls)
|
|
249
|
+
: [],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
return parallelTargets.targets;
|
|
253
|
+
};
|
|
254
|
+
let lastLineUp = null;
|
|
255
|
+
// Alt moves the wall exactly with the pointer, as in the floor plan.
|
|
256
|
+
let altHeld = false;
|
|
257
|
+
const onPointerMove = (event) => {
|
|
258
|
+
altHeld = event.altKey;
|
|
259
|
+
};
|
|
236
260
|
const getMovePlan = (nextStart, nextEnd) => planWallMoveJunctions(linkedOriginalsRef.current, originalStart, originalEnd, nextStart, nextEnd);
|
|
237
261
|
const getLinkedPreviewUpdates = (plan, nextStart, nextEnd) => {
|
|
238
262
|
const movedUpdates = getPlannedLinkedWallUpdates(plan, originalStart, originalEnd, nextStart, nextEnd);
|
|
239
263
|
const movedById = new Map(movedUpdates.map((entry) => [entry.id, entry]));
|
|
240
|
-
|
|
264
|
+
const linkedIds = new Set(linkedOriginalsRef.current.map((wall) => wall.id));
|
|
265
|
+
// Walls T'd into this one stay on it, stretched along their own line.
|
|
266
|
+
const attached = isNew
|
|
267
|
+
? []
|
|
268
|
+
: planAttachedWallUpdates(Object.values(dragNodes).filter((entry) => entry.type === 'wall' && entry.id !== nodeId && !linkedIds.has(entry.id)), originalStart, originalEnd, nextStart, nextEnd);
|
|
269
|
+
return [
|
|
270
|
+
...linkedOriginalsRef.current.map((wall) => movedById.get(wall.id) ?? { id: wall.id, start: wall.start, end: wall.end }),
|
|
271
|
+
...attached,
|
|
272
|
+
];
|
|
241
273
|
};
|
|
242
274
|
const applyPreview = (nextStart, nextEnd) => {
|
|
243
275
|
const previous = previewRef.current ?? { start: originalStart, end: originalEnd };
|
|
@@ -309,6 +341,7 @@ export const MoveWallTool = ({ node }) => {
|
|
|
309
341
|
const rawDeltaZ = rawZ - anchor[1];
|
|
310
342
|
if (!hasDraggedRef.current && Math.hypot(rawDeltaX, rawDeltaZ) < 1e-6)
|
|
311
343
|
return;
|
|
344
|
+
const free = isWallRunFree({ altKey: altHeld });
|
|
312
345
|
// When the move is axis-locked (side-handle drag), snap the wall
|
|
313
346
|
// center's absolute perpendicular offset to a multiple of
|
|
314
347
|
// `snapStep`. For axis-aligned walls this puts the wall on grid
|
|
@@ -320,31 +353,41 @@ export const MoveWallTool = ({ node }) => {
|
|
|
320
353
|
// the displacement alone preserves any pre-existing off-grid
|
|
321
354
|
// offset, so the wall could only ever sit at `originalCentre ±
|
|
322
355
|
// k·snapStep` — never on actual grid lines. Snapping the wall's
|
|
323
|
-
// own perpendicular coordinate fixes that.
|
|
356
|
+
// own perpendicular coordinate fixes that. A parallel wall the wall
|
|
357
|
+
// lines up with wins over the grid.
|
|
324
358
|
const axis = moveAxisRef.current;
|
|
325
359
|
let deltaX;
|
|
326
360
|
let deltaZ;
|
|
361
|
+
let lineUp = null;
|
|
327
362
|
if (axis) {
|
|
328
363
|
const originalProj = originalCenter[0] * axis[0] + originalCenter[1] * axis[1];
|
|
329
364
|
const rawProj = originalProj + rawDeltaX * axis[0] + rawDeltaZ * axis[1];
|
|
330
|
-
|
|
365
|
+
lineUp = free ? null : nearestWallParallelTarget(getParallelTargets(axis), rawProj);
|
|
366
|
+
const snappedProj = lineUp
|
|
367
|
+
? lineUp.position
|
|
368
|
+
: snapScalarToGrid(rawProj, free ? 0 : snapStep);
|
|
331
369
|
const perpDelta = snappedProj - originalProj;
|
|
332
370
|
deltaX = axis[0] * perpDelta;
|
|
333
371
|
deltaZ = axis[1] * perpDelta;
|
|
334
372
|
}
|
|
335
373
|
else {
|
|
336
|
-
// Snap the resulting wall center to the
|
|
337
|
-
//
|
|
338
|
-
//
|
|
339
|
-
// dragged the wall along its local axes instead of world ones.
|
|
374
|
+
// Snap the resulting wall center to the building's own grid lattice
|
|
375
|
+
// (the one the wall tool drafts on, square to a turned house), then
|
|
376
|
+
// express the result as a delta from the original centre.
|
|
340
377
|
const targetLocal = [
|
|
341
378
|
originalCenter[0] + rawDeltaX,
|
|
342
379
|
originalCenter[1] + rawDeltaZ,
|
|
343
380
|
];
|
|
344
|
-
const snappedLocal =
|
|
381
|
+
const snappedLocal = free
|
|
382
|
+
? targetLocal
|
|
383
|
+
: snapBuildingLocalToWorldGrid(targetLocal, snapStep);
|
|
345
384
|
deltaX = snappedLocal[0] - originalCenter[0];
|
|
346
385
|
deltaZ = snappedLocal[1] - originalCenter[1];
|
|
347
386
|
}
|
|
387
|
+
if (lineUp !== lastLineUp) {
|
|
388
|
+
lastLineUp = lineUp;
|
|
389
|
+
publishWallParallelGuide(lineUp);
|
|
390
|
+
}
|
|
348
391
|
const constrainedGridPos = [anchor[0] + deltaX, anchor[1] + deltaZ];
|
|
349
392
|
if (previousGridPosRef.current &&
|
|
350
393
|
(constrainedGridPos[0] !== previousGridPosRef.current[0] ||
|
|
@@ -422,10 +465,28 @@ export const MoveWallTool = ({ node }) => {
|
|
|
422
465
|
// The drag writes nothing to the store (the preview is live overrides), so history is
|
|
423
466
|
// paused only for this drop. Keyed by the moving wall: in split view the 2D move overlay
|
|
424
467
|
// co-owns the gesture, and commitStep lifts its pause too.
|
|
425
|
-
|
|
426
|
-
|
|
468
|
+
// The moved and stretched walls and the jogs take over any stretch of a
|
|
469
|
+
// parallel wall they now run along; jogs on the outline are outside walls.
|
|
470
|
+
// Walls T'd into this one follow it, what hangs on them staying put.
|
|
471
|
+
const attachedChanges = isNew
|
|
472
|
+
? []
|
|
473
|
+
: planAttachedWallChanges(sceneState.nodes, nodeId, originalStart, originalEnd, preview.start, preview.end, new Set([
|
|
474
|
+
...linkedOriginalsRef.current.map((wall) => wall.id),
|
|
475
|
+
...collapsedLinkedWallIds,
|
|
476
|
+
]));
|
|
477
|
+
const changes = finishWallEdit(sceneState.nodes, planWallEndRejoins(sceneState.nodes, commitUpdates.map(({ id }) => id), WALL_CONNECT_SNAP_RADIUS, {
|
|
478
|
+
update: [...wallUpdates, ...attachedChanges],
|
|
427
479
|
create: wallCreates,
|
|
428
480
|
delete: Array.from(collapsedLinkedWallIds),
|
|
481
|
+
}), {
|
|
482
|
+
winnerIds: [
|
|
483
|
+
...commitUpdates.map(({ id }) => id),
|
|
484
|
+
...attachedChanges.flatMap(({ id }) => sceneState.nodes[id]?.type === 'wall' ? [id] : []),
|
|
485
|
+
...wallCreates.map(({ node }) => node.id),
|
|
486
|
+
],
|
|
487
|
+
movedWallId: nodeId,
|
|
488
|
+
bridgeIds: wallCreates.map(({ node }) => node.id),
|
|
489
|
+
mintId: () => generateId('wall'),
|
|
429
490
|
});
|
|
430
491
|
const drop = beginSceneHistoryPauseSession(useScene, { gesture: nodeId });
|
|
431
492
|
try {
|
|
@@ -500,9 +561,12 @@ export const MoveWallTool = ({ node }) => {
|
|
|
500
561
|
};
|
|
501
562
|
emitter.on('grid:move', onGridMove);
|
|
502
563
|
emitter.on('tool:cancel', onCancel);
|
|
564
|
+
window.addEventListener('pointermove', onPointerMove);
|
|
503
565
|
window.addEventListener('pointerup', onPointerUp);
|
|
504
566
|
window.addEventListener('keydown', onKeyDown);
|
|
505
567
|
return () => {
|
|
568
|
+
if (lastLineUp)
|
|
569
|
+
publishWallParallelGuide(null);
|
|
506
570
|
if (shouldRestoreOnCleanup) {
|
|
507
571
|
// `shouldRestoreOnCleanup` is only true if neither `onPointerUp`
|
|
508
572
|
// (commit branch) nor `onCancel` ran — i.e., the unmount came
|
|
@@ -517,6 +581,7 @@ export const MoveWallTool = ({ node }) => {
|
|
|
517
581
|
}
|
|
518
582
|
emitter.off('grid:move', onGridMove);
|
|
519
583
|
emitter.off('tool:cancel', onCancel);
|
|
584
|
+
window.removeEventListener('pointermove', onPointerMove);
|
|
520
585
|
window.removeEventListener('pointerup', onPointerUp);
|
|
521
586
|
window.removeEventListener('keydown', onKeyDown);
|
|
522
587
|
};
|