@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
package/dist/door/definition.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { doorSlots } from '@pascal-app/core';
|
|
1
|
+
import { doorSlots, getDoorOpeningSize } from '@pascal-app/core';
|
|
2
|
+
import { NEW_DOOR_FRAME_THICKNESS } from '@pascal-app/core/building';
|
|
2
3
|
import { curtainOpeningResizeMax } from '../shared/curtain-opening-limits.js';
|
|
3
4
|
import { doorBatchable } from '../shared/node-batch/batchable.js';
|
|
4
5
|
import { buildDoorFloorplanSchedule, computeDoorFloorplanLevelData, } from '../shared/opening-documentation.js';
|
|
@@ -54,7 +55,8 @@ function doorWidthHandle(side) {
|
|
|
54
55
|
const roofMax = readRoofFaceWidthMax(n, scene, sign);
|
|
55
56
|
if (roofMax !== null)
|
|
56
57
|
return Math.max(MIN_DOOR_WIDTH, roofMax);
|
|
57
|
-
return curtainOpeningResizeMax(n, scene.nodes(), 'x', sign) ??
|
|
58
|
+
return (curtainOpeningResizeMax(n, scene.nodes(), 'x', sign) ??
|
|
59
|
+
readWallLength(n, scene) - (getDoorOpeningSize(n).width - n.width));
|
|
58
60
|
},
|
|
59
61
|
currentValue: (n) => n.width,
|
|
60
62
|
onDrag: (node) => publishOpeningResizeGuides(node, false),
|
|
@@ -80,7 +82,12 @@ function doorWidthHandle(side) {
|
|
|
80
82
|
placement: {
|
|
81
83
|
// door-local: +X axis lives along door's own X. Inner ride group
|
|
82
84
|
// applies door.rotation, so we sit purely on door-local +X / -X.
|
|
83
|
-
position: (n) => [
|
|
85
|
+
position: (n) => [
|
|
86
|
+
-getDoorOpeningSize(n).leafOffsetX +
|
|
87
|
+
sign * (getDoorOpeningSize(n).width / 2 + SIDE_HANDLE_OFFSET),
|
|
88
|
+
0,
|
|
89
|
+
0,
|
|
90
|
+
],
|
|
84
91
|
rotationY: () => (side === 'right' ? 0 : Math.PI),
|
|
85
92
|
},
|
|
86
93
|
portal: 'grandparent',
|
|
@@ -100,7 +107,9 @@ function doorHeightHandle() {
|
|
|
100
107
|
if (curtainMax !== undefined)
|
|
101
108
|
return curtainMax;
|
|
102
109
|
const bottom = n.position[1] - n.height / 2;
|
|
103
|
-
return Math.max(MIN_DOOR_HEIGHT, readHostWallCeiling(n.wallId, scene, n) -
|
|
110
|
+
return Math.max(MIN_DOOR_HEIGHT, readHostWallCeiling(n.wallId, scene, n) -
|
|
111
|
+
bottom -
|
|
112
|
+
(getDoorOpeningSize(n).height - n.height));
|
|
104
113
|
},
|
|
105
114
|
currentValue: (n) => n.height,
|
|
106
115
|
onDrag: (node) => publishOpeningResizeGuides(node, false),
|
|
@@ -115,7 +124,7 @@ function doorHeightHandle() {
|
|
|
115
124
|
};
|
|
116
125
|
},
|
|
117
126
|
placement: {
|
|
118
|
-
position: (n) => [0, n.height / 2 + HEIGHT_HANDLE_OFFSET, 0],
|
|
127
|
+
position: (n) => [0, getDoorOpeningSize(n).height - n.height / 2 + HEIGHT_HANDLE_OFFSET, 0],
|
|
119
128
|
},
|
|
120
129
|
portal: 'grandparent',
|
|
121
130
|
};
|
|
@@ -205,6 +214,8 @@ export const doorDefinition = {
|
|
|
205
214
|
'pascal:editor/floorplan': {
|
|
206
215
|
contextualDimensions: buildDoorContextualDimensions,
|
|
207
216
|
schedule: buildDoorFloorplanSchedule,
|
|
217
|
+
// Swap hinge / swing side from the action bar, in 2D and 3D.
|
|
218
|
+
actionMenu: { actions: () => import('./actions.js') },
|
|
208
219
|
},
|
|
209
220
|
},
|
|
210
221
|
surfaceRole: 'joinery',
|
|
@@ -212,14 +223,30 @@ export const doorDefinition = {
|
|
|
212
223
|
// full default shape — door has 40+ fields, listing them inline would
|
|
213
224
|
// duplicate the schema. Parse a minimal stub, drop id/type, return rest.
|
|
214
225
|
defaults: () => {
|
|
215
|
-
const stub = DoorNode.parse({
|
|
226
|
+
const stub = DoorNode.parse({
|
|
227
|
+
id: 'door_default',
|
|
228
|
+
type: 'door',
|
|
229
|
+
frameThickness: NEW_DOOR_FRAME_THICKNESS,
|
|
230
|
+
casingFaceA: true,
|
|
231
|
+
casingFaceB: true,
|
|
232
|
+
});
|
|
216
233
|
const { id: _id, type: _type, ...rest } = stub;
|
|
217
234
|
return rest;
|
|
218
235
|
},
|
|
219
236
|
capabilities: {
|
|
220
237
|
reveal: { phase: 'openings', style: 'cut' },
|
|
221
238
|
exterior: openingSeenFromOutside,
|
|
222
|
-
revealOnEdit: [
|
|
239
|
+
revealOnEdit: [
|
|
240
|
+
'position',
|
|
241
|
+
'width',
|
|
242
|
+
'height',
|
|
243
|
+
'sidelightLeft',
|
|
244
|
+
'sidelightRight',
|
|
245
|
+
'transomHeight',
|
|
246
|
+
'openingShape',
|
|
247
|
+
'openingKind',
|
|
248
|
+
'doorType',
|
|
249
|
+
],
|
|
223
250
|
batchable: doorBatchable,
|
|
224
251
|
selectable: { hitVolume: 'bbox' },
|
|
225
252
|
duplicable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/door/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,mBAAmB,
|
|
1
|
+
{"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/door/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EAQzB,MAAM,kBAAkB,CAAA;AAQzB;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,QAAQ,CAsF7D,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getWallCurveLength, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
1
|
+
import { getDoorOpeningSize, getWallCurveLength, openingHostFacing, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
2
2
|
import { curtainOpeningLimits } from '../shared/curtain-opening-limits.js';
|
|
3
3
|
import { projectPlanPointToWallLocalX } from '../shared/wall-attach-target.js';
|
|
4
4
|
const MIN_DOOR_WIDTH = 0.3;
|
|
@@ -37,7 +37,10 @@ export const doorWidthAffordance = {
|
|
|
37
37
|
// legal width is the headroom on the grow side.
|
|
38
38
|
const limits = curtainOpeningLimits(node, nodes);
|
|
39
39
|
const margin = limits?.margin ?? 0;
|
|
40
|
-
const
|
|
40
|
+
const size = getDoorOpeningSize(node);
|
|
41
|
+
const sidelight = (size.width - node.width) / 2 - growDir * size.leafOffsetX * openingHostFacing(node);
|
|
42
|
+
const maxWidth = (growDir > 0 ? (limits?.length ?? wallLength) - margin - anchorX : anchorX - margin) -
|
|
43
|
+
sidelight;
|
|
41
44
|
const projectToWallLocalX = (planPoint) => {
|
|
42
45
|
return wall ? projectPlanPointToWallLocalX(wall, planPoint) : planPoint[0];
|
|
43
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/door/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/door/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEb,KAAK,mBAAmB,EASzB,MAAM,kBAAkB,CAAA;AAqBzB;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,CAAC,QAAQ,CA2RjE,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { useLiveNodeOverrides, useLiveTransforms, useScene, WallNode as WallNodeSchema, } from '@pascal-app/core';
|
|
1
|
+
import { doorPositionForFacing, getDoorOpeningSize, openingHostFacing, useLiveNodeOverrides, useLiveTransforms, useScene, WallNode as WallNodeSchema, } from '@pascal-app/core';
|
|
2
2
|
import { isGridSnapActive, isMagneticSnapActive, snapToHalf, triggerSFX, useEditor, usePlacementPreview, } from '@pascal-app/editor';
|
|
3
3
|
import { createFloorplanCursorResolver } from '../shared/floorplan-cursor.js';
|
|
4
|
+
import { movedOpeningCasingFaces } from '../shared/opening-casing-move.js';
|
|
4
5
|
import { openingPlaneOffsetOnWall } from '../shared/opening-plane-offset.js';
|
|
5
6
|
import { getOpeningHostLevelId, getRoofHostedOpeningPlanPoint } from '../shared/roof-opening-host.js';
|
|
6
7
|
import { findClosestWallInPlan, projectWallLocalPointToPlan, resolveOpeningPlacement, snapLocalXToNeighbors, } from '../shared/wall-attach-target.js';
|
|
@@ -158,23 +159,37 @@ export const doorFloorplanMoveTarget = ({ node }) => {
|
|
|
158
159
|
// openings / wall ends); it competes with — and wins over — the grid
|
|
159
160
|
// snap. Follows the magnetic ("lines") mode; the grid component lives in
|
|
160
161
|
// `snapToHalf` (mode-aware → raw when grid is off).
|
|
162
|
+
const facingX = doorPositionForFacing({ ...node, position: [hit.localX, node.position[1], node.position[2]] }, [0, hit.itemRotation + (flipped ? Math.PI : 0), 0])[0];
|
|
161
163
|
const neighborX = !isMagneticSnapActive()
|
|
162
164
|
? null
|
|
163
165
|
: snapLocalXToNeighbors({
|
|
164
166
|
wall: hit.wall,
|
|
165
|
-
localX:
|
|
166
|
-
|
|
167
|
+
localX: facingX -
|
|
168
|
+
getDoorOpeningSize(node).leafOffsetX *
|
|
169
|
+
openingHostFacing({ rotation: [0, hit.itemRotation + (flipped ? Math.PI : 0), 0] }),
|
|
170
|
+
width: getDoorOpeningSize(node).width,
|
|
167
171
|
selfId: nodeId,
|
|
168
172
|
nodes,
|
|
169
173
|
});
|
|
170
|
-
const
|
|
171
|
-
|
|
174
|
+
const offset = getDoorOpeningSize(node).leafOffsetX *
|
|
175
|
+
openingHostFacing({ rotation: [0, hit.itemRotation + (flipped ? Math.PI : 0), 0] });
|
|
176
|
+
const snappedLocalX = neighborX === null
|
|
177
|
+
? snapToHalf(facingX - offset) + offset
|
|
178
|
+
: neighborX +
|
|
179
|
+
getDoorOpeningSize(node).leafOffsetX *
|
|
180
|
+
openingHostFacing({ rotation: [0, hit.itemRotation + (flipped ? Math.PI : 0), 0] });
|
|
181
|
+
const { clampedX, clampedY, transomHeight } = clampToWall(hit.wall, snappedLocalX, node.width, node.height, {
|
|
182
|
+
...node,
|
|
183
|
+
rotation: [0, hit.itemRotation + (flipped ? Math.PI : 0), 0],
|
|
184
|
+
}, nodes);
|
|
172
185
|
// One click per real position step, keyed on the SNAPPED along-wall value
|
|
173
186
|
// so it ticks only when the door actually moves to a new cell.
|
|
174
187
|
tickGridStep(clampedX);
|
|
175
188
|
// Apply the R-flip on top of the wall-derived side.
|
|
176
189
|
const side = flipped ? (hit.side === 'front' ? 'back' : 'front') : hit.side;
|
|
177
190
|
const itemRotation = hit.itemRotation + (flipped ? Math.PI : 0);
|
|
191
|
+
// Another wall may be drawn the other way round: the casing keeps to its side.
|
|
192
|
+
const casing = movedOpeningCasingFaces(node, hit.wall.id, [0, itemRotation, 0], nodes);
|
|
178
193
|
lastValid = {
|
|
179
194
|
// Same-wall moves keep the wall-local plane offset; another host resets it.
|
|
180
195
|
position: [clampedX, clampedY, openingPlaneOffsetOnWall(node, hit.wall.id)],
|
|
@@ -187,6 +202,8 @@ export const doorFloorplanMoveTarget = ({ node }) => {
|
|
|
187
202
|
roofSegmentId: undefined,
|
|
188
203
|
roofFace: undefined,
|
|
189
204
|
visible: true,
|
|
205
|
+
...casing,
|
|
206
|
+
...(transomHeight === undefined ? {} : { transomHeight }),
|
|
190
207
|
};
|
|
191
208
|
setLiveOverride(`wall:${hit.wall.id}:${side}`, {
|
|
192
209
|
parentId: hit.wall.id,
|
|
@@ -195,6 +212,8 @@ export const doorFloorplanMoveTarget = ({ node }) => {
|
|
|
195
212
|
roofSegmentId: undefined,
|
|
196
213
|
roofFace: undefined,
|
|
197
214
|
visible: true,
|
|
215
|
+
...casing,
|
|
216
|
+
...(transomHeight === undefined ? {} : { transomHeight }),
|
|
198
217
|
});
|
|
199
218
|
useLiveTransforms.getState().set(nodeId, {
|
|
200
219
|
position: lastValid.position,
|
|
@@ -215,7 +234,10 @@ export const doorFloorplanMoveTarget = ({ node }) => {
|
|
|
215
234
|
// Block commit if the door overlaps another wall child — UNLESS Alt
|
|
216
235
|
// force-places (same `placeable` rule as the 3D move + the shared
|
|
217
236
|
// `resolveOpeningPlacement`).
|
|
218
|
-
const collides = hasWallChildOverlap(lastValid.parentId, useScene.getState().nodes, lastValid.position[0]
|
|
237
|
+
const collides = hasWallChildOverlap(lastValid.parentId, useScene.getState().nodes, lastValid.position[0] -
|
|
238
|
+
getDoorOpeningSize({ ...live, ...lastValid }).leafOffsetX *
|
|
239
|
+
openingHostFacing({ rotation: lastValid.rotation }), lastValid.position[1] +
|
|
240
|
+
(getDoorOpeningSize({ ...live, ...lastValid }).height - live.height) / 2, getDoorOpeningSize({ ...live, ...lastValid }).width, getDoorOpeningSize({ ...live, ...lastValid }).height, live.id);
|
|
219
241
|
return resolveOpeningPlacement({ collides, forcePlace }).placeable;
|
|
220
242
|
},
|
|
221
243
|
commit() {
|
package/dist/door/floorplan.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ import type { DoorNode, FloorplanGeometry, GeometryContext } from '@pascal-app/c
|
|
|
23
23
|
* with no swing arc.
|
|
24
24
|
* 4. Center line through the cutout (matches the legacy's
|
|
25
25
|
* `getOpeningCenterLine` segment for visual continuity).
|
|
26
|
+
* 5. Casing legs standing proud of each cased wall face beside the
|
|
27
|
+
* cutout (`buildOpeningCasingPlan`).
|
|
26
28
|
*
|
|
27
29
|
* Requires `ctx.parent` to be a wall (door.parentId is the wall it's
|
|
28
30
|
* mounted on). Returns null when the parent isn't a wall (orphaned
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/door/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/door/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,kBAAkB,CAAA;AAezB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CA+1BjG"}
|
package/dist/door/floorplan.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { getWallBodyCenterOffset } from '@pascal-app/core';
|
|
1
|
+
import { getDoorOpeningSize, getWallBodyCenterOffset, openingHostFacing } from '@pascal-app/core';
|
|
2
2
|
import { readFloorplanContext, readFloorplanGeometryMetadata, withFloorplanGeometryMetadata, } from '@pascal-app/editor';
|
|
3
|
+
import { buildOpeningCasingPlan } from '../shared/opening-casing.js';
|
|
3
4
|
import { buildOpeningMarkAnnotation, } from '../shared/opening-documentation.js';
|
|
4
5
|
import { buildOpeningPlacementDimensions } from '../shared/opening-placement-dimensions.js';
|
|
5
6
|
import { resolveOpeningPlanPlane } from '../shared/opening-plane-offset.js';
|
|
@@ -27,6 +28,8 @@ import { resolveOpeningPlanPlane } from '../shared/opening-plane-offset.js';
|
|
|
27
28
|
* with no swing arc.
|
|
28
29
|
* 4. Center line through the cutout (matches the legacy's
|
|
29
30
|
* `getOpeningCenterLine` segment for visual continuity).
|
|
31
|
+
* 5. Casing legs standing proud of each cased wall face beside the
|
|
32
|
+
* cutout (`buildOpeningCasingPlan`).
|
|
30
33
|
*
|
|
31
34
|
* Requires `ctx.parent` to be a wall (door.parentId is the wall it's
|
|
32
35
|
* mounted on). Returns null when the parent isn't a wall (orphaned
|
|
@@ -54,6 +57,8 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
54
57
|
const perpZ = dirX;
|
|
55
58
|
const distance = node.position[0];
|
|
56
59
|
const width = node.width;
|
|
60
|
+
const opening = getDoorOpeningSize(node);
|
|
61
|
+
const openingOffset = -opening.leafOffsetX * openingHostFacing(node);
|
|
57
62
|
const wallDepth = wall.thickness ?? 0.1;
|
|
58
63
|
const plane = resolveOpeningPlanPlane(node, wallDepth);
|
|
59
64
|
const depth = plane.depth;
|
|
@@ -82,17 +87,41 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
82
87
|
const swingAngle = Math.PI / 2;
|
|
83
88
|
// Footprint rectangle in the cutout.
|
|
84
89
|
const points = [
|
|
85
|
-
[
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
90
|
+
[
|
|
91
|
+
cx + dirX * openingOffset - dirX * (opening.width / 2) + perpX * halfDepth,
|
|
92
|
+
cz + dirZ * openingOffset - dirZ * (opening.width / 2) + perpZ * halfDepth,
|
|
93
|
+
],
|
|
94
|
+
[
|
|
95
|
+
cx + dirX * openingOffset + dirX * (opening.width / 2) + perpX * halfDepth,
|
|
96
|
+
cz + dirZ * openingOffset + dirZ * (opening.width / 2) + perpZ * halfDepth,
|
|
97
|
+
],
|
|
98
|
+
[
|
|
99
|
+
cx + dirX * openingOffset + dirX * (opening.width / 2) - perpX * halfDepth,
|
|
100
|
+
cz + dirZ * openingOffset + dirZ * (opening.width / 2) - perpZ * halfDepth,
|
|
101
|
+
],
|
|
102
|
+
[
|
|
103
|
+
cx + dirX * openingOffset - dirX * (opening.width / 2) - perpX * halfDepth,
|
|
104
|
+
cz + dirZ * openingOffset - dirZ * (opening.width / 2) - perpZ * halfDepth,
|
|
105
|
+
],
|
|
89
106
|
];
|
|
90
107
|
const halfWallDepth = wallDepth / 2;
|
|
91
108
|
const openingCutoutPoints = (ox, oz) => [
|
|
92
|
-
[
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
109
|
+
[
|
|
110
|
+
ox + dirX * openingOffset - dirX * (opening.width / 2) + perpX * halfWallDepth,
|
|
111
|
+
oz + dirZ * openingOffset - dirZ * (opening.width / 2) + perpZ * halfWallDepth,
|
|
112
|
+
],
|
|
113
|
+
[
|
|
114
|
+
ox + dirX * openingOffset + dirX * (opening.width / 2) + perpX * halfWallDepth,
|
|
115
|
+
oz + dirZ * openingOffset + dirZ * (opening.width / 2) + perpZ * halfWallDepth,
|
|
116
|
+
],
|
|
117
|
+
[
|
|
118
|
+
ox + dirX * openingOffset + dirX * (opening.width / 2) - perpX * halfWallDepth,
|
|
119
|
+
oz + dirZ * openingOffset + dirZ * (opening.width / 2) - perpZ * halfWallDepth,
|
|
120
|
+
],
|
|
121
|
+
[
|
|
122
|
+
ox + dirX * openingOffset - dirX * (opening.width / 2) - perpX * halfWallDepth,
|
|
123
|
+
oz + dirZ * openingOffset - dirZ * (opening.width / 2) - perpZ * halfWallDepth,
|
|
124
|
+
],
|
|
96
125
|
];
|
|
97
126
|
const view = ctx.viewState;
|
|
98
127
|
const palette = view?.palette;
|
|
@@ -134,6 +163,36 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
134
163
|
strokeLinejoin: 'round',
|
|
135
164
|
},
|
|
136
165
|
];
|
|
166
|
+
for (const [side, extra] of [
|
|
167
|
+
[-1, node.sidelightLeft ?? 0],
|
|
168
|
+
[1, node.sidelightRight ?? 0],
|
|
169
|
+
]) {
|
|
170
|
+
if (!extra || opening.width === width)
|
|
171
|
+
continue;
|
|
172
|
+
const sign = side * openingHostFacing(node);
|
|
173
|
+
const a = (sign * width) / 2;
|
|
174
|
+
const b = sign * (width / 2 + extra);
|
|
175
|
+
children.push({
|
|
176
|
+
kind: 'polyline',
|
|
177
|
+
points: [
|
|
178
|
+
[cx + dirX * a, cz + dirZ * a],
|
|
179
|
+
[cx + dirX * b, cz + dirZ * b],
|
|
180
|
+
],
|
|
181
|
+
fill: 'none',
|
|
182
|
+
stroke: accentColor,
|
|
183
|
+
strokeWidth: 2,
|
|
184
|
+
vectorEffect: 'non-scaling-stroke',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// Casing legs on the wall faces beside the cutout, as the 3D door has them.
|
|
188
|
+
const casing = buildOpeningCasingPlan(node, wall, {
|
|
189
|
+
fill: fillColor,
|
|
190
|
+
stroke: accentMuted,
|
|
191
|
+
strokeWidth: showSelectedChrome ? 1.4 : 1,
|
|
192
|
+
vectorEffect: 'non-scaling-stroke',
|
|
193
|
+
});
|
|
194
|
+
if (casing)
|
|
195
|
+
children.push(casing);
|
|
137
196
|
if (node.openingShape !== 'rectangle') {
|
|
138
197
|
const overheadRise = Math.min(width, node.openingShape === 'arch' ? node.archHeight : node.cornerRadius) * 0.2;
|
|
139
198
|
const overheadSide = swingDirection === 'inward' ? 1 : -1;
|
|
@@ -263,8 +322,9 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
263
322
|
// fall through to just the opening footprint (the earlier behaviour).
|
|
264
323
|
const isSwingDoor = node.doorType === 'hinged' || isDoubleLeaf;
|
|
265
324
|
// A frameless wall opening — drawn as a bare gap, no leaf / arc / panel
|
|
266
|
-
// (mirrors the 3D system, which renders only the cutout for openings).
|
|
267
|
-
|
|
325
|
+
// (mirrors the 3D system, which renders only the cutout for openings). A
|
|
326
|
+
// door on a railing is always one: a gap in the guard.
|
|
327
|
+
const isOpening = node.openingKind === 'opening' || wall.wallType === 'railing';
|
|
268
328
|
if (isOpening) {
|
|
269
329
|
// Open doorway — a frameless gap in the wall. No leaf, arc, or panel;
|
|
270
330
|
// the cleared footprint above is the whole symbol.
|
|
@@ -278,7 +338,7 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
278
338
|
// The fold span / depth are fixed so the plan symbol stays static
|
|
279
339
|
// regardless of the live open state.
|
|
280
340
|
const FOLD_SPAN_RATIO = 0.8;
|
|
281
|
-
const panelCount = node.leafCount === 2 ? 2 : 4;
|
|
341
|
+
const panelCount = node.leafCount >= 6 ? node.leafCount : node.leafCount === 2 ? 2 : 4;
|
|
282
342
|
const panelLen = (width * FOLD_SPAN_RATIO) / panelCount;
|
|
283
343
|
const peakDepth = panelLen * 0.7;
|
|
284
344
|
// Anchor the accordion's base line on the room-facing wall face (the
|
|
@@ -287,7 +347,11 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
287
347
|
const baseOffX = perpX * halfDepth * swingSign;
|
|
288
348
|
const baseOffZ = perpZ * halfDepth * swingSign;
|
|
289
349
|
// Start at the hinge edge and step toward the opposite jamb.
|
|
290
|
-
const hingeTangentSign =
|
|
350
|
+
const hingeTangentSign = panelCount > 4
|
|
351
|
+
? (node.slideDirection === 'right' ? -1 : 1) * openingHostFacing(node)
|
|
352
|
+
: hingesSide === 'left'
|
|
353
|
+
? 1
|
|
354
|
+
: -1;
|
|
291
355
|
const startX = cx - dirX * halfWidth * hingeTangentSign + baseOffX;
|
|
292
356
|
const startZ = cz - dirZ * halfWidth * hingeTangentSign + baseOffZ;
|
|
293
357
|
const stepX = dirX * panelLen * hingeTangentSign;
|
|
@@ -322,7 +386,8 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
322
386
|
// regardless of the live open state.
|
|
323
387
|
const slideSign = node.slideDirection === 'right' ? 1 : -1;
|
|
324
388
|
const panelHalfThick = Math.min(depth * 0.22, 0.03);
|
|
325
|
-
const
|
|
389
|
+
const panelCount = Math.max(2, Math.min(4, node.leafCount));
|
|
390
|
+
const panelHalfLen = panelCount === 2 ? width * 0.275 : width / panelCount / 2 + 0.01;
|
|
326
391
|
const panelRect = (centerAlong, perpSign) => {
|
|
327
392
|
const rcx = cx + dirX * centerAlong + perpX * panelHalfThick * perpSign;
|
|
328
393
|
const rcz = cz + dirZ * centerAlong + perpZ * panelHalfThick * perpSign;
|
|
@@ -348,8 +413,16 @@ export function buildDoorFloorplan(node, ctx) {
|
|
|
348
413
|
});
|
|
349
414
|
// Left panel toward one face, right panel toward the other; they
|
|
350
415
|
// overlap across the centre.
|
|
351
|
-
|
|
352
|
-
|
|
416
|
+
for (let index = 0; index < panelCount; index++) {
|
|
417
|
+
const front = node.slidingStyle === 'bypass'
|
|
418
|
+
? index % 2 === (panelCount === 3 || slideSign < 0 ? 1 : 0)
|
|
419
|
+
: panelCount === 4
|
|
420
|
+
? index === 1 || index === 2
|
|
421
|
+
: panelCount === 3
|
|
422
|
+
? index === 1
|
|
423
|
+
: index === (slideSign < 0 ? 1 : 0);
|
|
424
|
+
pushPanel(panelRect(-halfWidth + (width * (index + 0.5)) / panelCount, front ? 1 : -1));
|
|
425
|
+
}
|
|
353
426
|
// Slide-direction arrow, centred and pushed clear of the wall face
|
|
354
427
|
// so it doesn't overlap the wall or panels.
|
|
355
428
|
const arrowPerp = -(halfDepth + Math.max(panelHalfThick * 4, halfWidth * 0.22));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/door/move-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,QAAQ,
|
|
1
|
+
{"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/door/move-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,QAAQ,EAqBT,MAAM,kBAAkB,CAAA;AAqDzB,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CA8mC9C,CAAA;eAEc,YAAY"}
|
package/dist/door/move-tool.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { beginSceneHistoryDraft, collectionIdsOf, DoorNode, emitter, getOpeningWallPlacement, holdHiddenWallPointerEvents, isCurvedWall, runSceneHistoryDraftWrite, sceneRegistry, spatialGridManager, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
2
|
+
import { beginSceneHistoryDraft, collectionIdsOf, DoorNode, doorPositionForFacing, emitter, getDoorOpeningSize, getOpeningWallPlacement, getWallThickness, holdHiddenWallPointerEvents, isCurvedWall, openingHostFacing, resolveHostedOpeningFrameDepth, resolveOpeningFrameDepth, runSceneHistoryDraftWrite, sceneRegistry, spatialGridManager, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
3
3
|
import { calculateItemRotation, clearPlacementSurface, consumePlacementDragRelease, EDITOR_LAYER, getSideFromNormal, isGridSnapActive, isMagneticSnapActive, isValidWallSideFace, publishPlacementSurface, stripPlacementMetadataFlags, triggerSFX, useAlignmentGuides, useEditor, useFacingPose, } from '@pascal-app/editor';
|
|
4
4
|
import { useViewer } from '@pascal-app/viewer';
|
|
5
5
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
6
|
import { BoxGeometry, EdgesGeometry, Vector3 } from 'three';
|
|
7
7
|
import { LineBasicNodeMaterial } from 'three/webgpu';
|
|
8
8
|
import { commitOpeningMove } from '../shared/commit-opening-move.js';
|
|
9
|
+
import { movedOpeningCasingFaces } from '../shared/opening-casing-move.js';
|
|
9
10
|
import { clearOpeningGuides3D, publishOpeningGuidesForWallEvent, } from '../shared/opening-guides-runtime.js';
|
|
10
11
|
import { beginOpeningMoveHistorySession } from '../shared/opening-move-history.js';
|
|
11
12
|
import { isWallMeshHidden, shouldIgnoreWallEventForOpeningMove, } from '../shared/opening-move-wall-gate.js';
|
|
@@ -40,9 +41,10 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
40
41
|
const ghostNode = useMemo(() => ({
|
|
41
42
|
...movingDoorNode,
|
|
42
43
|
side: ghostSide,
|
|
44
|
+
transomHeight: ghostPose?.transomHeight ?? movingDoorNode.transomHeight,
|
|
43
45
|
position: [0, 0, 0],
|
|
44
46
|
rotation: [0, 0, 0],
|
|
45
|
-
}), [movingDoorNode, ghostSide]);
|
|
47
|
+
}), [movingDoorNode, ghostSide, ghostPose?.transomHeight]);
|
|
46
48
|
const exitMoveMode = useCallback(() => {
|
|
47
49
|
useEditor.getState().setMovingNode(null);
|
|
48
50
|
}, []);
|
|
@@ -90,6 +92,8 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
90
92
|
}
|
|
91
93
|
// Same-wall moves keep the wall-local plane offset; another host resets it.
|
|
92
94
|
const planeOffsetOn = (wallId) => openingPlaneOffsetOnWall(movingDoorNode, wallId);
|
|
95
|
+
// Another host may name its faces the other way round: the casing keeps to its side of it.
|
|
96
|
+
const casingOn = (hostId, rotation) => movedOpeningCasingFaces(movingDoorNode, hostId, rotation, useScene.getState().nodes);
|
|
93
97
|
let currentHostId = movingDoorNode.parentId;
|
|
94
98
|
let dragAnchor = null;
|
|
95
99
|
// The wall the door was grabbed from. Nulled the first time the anchor
|
|
@@ -177,6 +181,7 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
177
181
|
};
|
|
178
182
|
const getSlabElevation = (wallEvent) => spatialGridManager.getSlabElevationForWall(wallEvent.node.parentId ?? '', wallEvent.node.start, wallEvent.node.end, wallEvent.node.curveOffset ?? 0, wallEvent.node.thickness, wallEvent.node.supportSlabId, wallEvent.node.justification);
|
|
179
183
|
const hideCursor = () => {
|
|
184
|
+
useLiveNodeOverrides.getState().clearFields(movingDoorNode.id, ['transomHeight']);
|
|
180
185
|
if (cursorGroupRef.current)
|
|
181
186
|
cursorGroupRef.current.visible = false;
|
|
182
187
|
useAlignmentGuides.getState().clear();
|
|
@@ -243,19 +248,36 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
243
248
|
startX: preserveGrab ? original.position[0] : rawLocalX,
|
|
244
249
|
};
|
|
245
250
|
}
|
|
246
|
-
const targetLocalX =
|
|
251
|
+
const targetLocalX = doorPositionForFacing({
|
|
252
|
+
...movingDoorNode,
|
|
253
|
+
position: [
|
|
254
|
+
dragAnchor.startX + (rawLocalX - dragAnchor.rawX),
|
|
255
|
+
movingDoorNode.position[1],
|
|
256
|
+
movingDoorNode.position[2],
|
|
257
|
+
],
|
|
258
|
+
}, [0, itemRotation, 0])[0];
|
|
247
259
|
const localX = resolveWallSlideAlignment({
|
|
248
260
|
wallNode: event.node,
|
|
249
|
-
rawLocalX: targetLocalX
|
|
250
|
-
|
|
261
|
+
rawLocalX: targetLocalX -
|
|
262
|
+
getDoorOpeningSize(movingDoorNode).leafOffsetX *
|
|
263
|
+
openingHostFacing({ rotation: [0, itemRotation, 0] }),
|
|
264
|
+
width: getDoorOpeningSize(movingDoorNode).width,
|
|
251
265
|
candidates: alignmentCandidates,
|
|
252
266
|
// Along-wall alignment guides display in every snapping mode; the
|
|
253
267
|
// magnetic pull onto them lands only in "lines" mode. The grid
|
|
254
268
|
// component lives in `snapToHalf` (itself mode-aware).
|
|
255
269
|
applySnap: isMagneticSnapActive(),
|
|
256
270
|
});
|
|
257
|
-
const { clampedX, clampedY } = clampToWall(event.node, localX
|
|
258
|
-
|
|
271
|
+
const { clampedX, clampedY, transomHeight } = clampToWall(event.node, localX +
|
|
272
|
+
getDoorOpeningSize(movingDoorNode).leafOffsetX *
|
|
273
|
+
openingHostFacing({ rotation: [0, itemRotation, 0] }), movingDoorNode.width, movingDoorNode.height, { ...movingDoorNode, rotation: [0, itemRotation, 0] }, useScene.getState().nodes);
|
|
274
|
+
const fittedSize = getDoorOpeningSize({
|
|
275
|
+
...movingDoorNode,
|
|
276
|
+
transomHeight: transomHeight ?? movingDoorNode.transomHeight,
|
|
277
|
+
});
|
|
278
|
+
const valid = !hasWallChildOverlap(event.node.id, useScene.getState().nodes, clampedX -
|
|
279
|
+
getDoorOpeningSize(movingDoorNode).leafOffsetX *
|
|
280
|
+
openingHostFacing({ rotation: [0, itemRotation, 0] }), clampedY + (fittedSize.height - movingDoorNode.height) / 2, fittedSize.width, fittedSize.height, movingDoorNode.id);
|
|
259
281
|
return {
|
|
260
282
|
wallNode: event.node,
|
|
261
283
|
wallId: event.node.id,
|
|
@@ -264,10 +286,15 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
264
286
|
clampedX,
|
|
265
287
|
clampedY,
|
|
266
288
|
valid,
|
|
289
|
+
transomHeight,
|
|
267
290
|
event,
|
|
268
291
|
};
|
|
269
292
|
};
|
|
270
293
|
const applyPreview = (target) => {
|
|
294
|
+
if (target.transomHeight !== undefined)
|
|
295
|
+
useLiveNodeOverrides
|
|
296
|
+
.getState()
|
|
297
|
+
.set(movingDoorNode.id, { transomHeight: target.transomHeight });
|
|
271
298
|
// One grid-snap tick per real position step, keyed on the SNAPPED
|
|
272
299
|
// along-wall position so it ticks only when the door actually moves to a
|
|
273
300
|
// new cell (not on every micro mouse-move). Per-frame guard collapses any
|
|
@@ -336,29 +363,36 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
336
363
|
rotationY: ghostYaw,
|
|
337
364
|
tint: placement.tint,
|
|
338
365
|
side: target.side,
|
|
366
|
+
transomHeight: target.transomHeight,
|
|
339
367
|
});
|
|
340
368
|
// Forward-facing triangle (editor-side overlay), in the same building-local
|
|
341
369
|
// frame the ghost renders in. The door's front is its local +Z. Drop it to
|
|
342
|
-
// the
|
|
370
|
+
// the door's sill (the ghost Y is the opening centre, ~1m up).
|
|
343
371
|
useFacingPose.getState().set({
|
|
344
372
|
position: [
|
|
345
373
|
ghostWorldPos[0],
|
|
346
|
-
|
|
374
|
+
ghostWorldPos[1] - movingDoorNode.height / 2,
|
|
347
375
|
ghostWorldPos[2],
|
|
348
376
|
],
|
|
349
377
|
rotationY: ghostYaw,
|
|
350
|
-
depth: movingDoorNode
|
|
378
|
+
depth: resolveOpeningFrameDepth(movingDoorNode, getWallThickness(target.wallNode)),
|
|
351
379
|
});
|
|
352
380
|
// Publish the wall surface so the snap grid tilts into the wall plane at
|
|
353
381
|
// the opening (its outward normal is the door's facing, +Z by `ghostYaw`).
|
|
354
382
|
publishPlacementSurface(new Vector3(...ghostWorldPos), new Vector3(Math.sin(ghostYaw), 0, Math.cos(ghostYaw)));
|
|
383
|
+
const fittedSize = getDoorOpeningSize({
|
|
384
|
+
...movingDoorNode,
|
|
385
|
+
transomHeight: target.transomHeight ?? movingDoorNode.transomHeight,
|
|
386
|
+
});
|
|
355
387
|
publishOpeningGuidesForWallEvent({
|
|
356
388
|
wall: target.wallNode,
|
|
357
389
|
movingId: movingDoorNode.id,
|
|
358
|
-
centerS: target.clampedX
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
390
|
+
centerS: target.clampedX -
|
|
391
|
+
getDoorOpeningSize(movingDoorNode).leafOffsetX *
|
|
392
|
+
openingHostFacing({ rotation: [0, target.itemRotation, 0] }),
|
|
393
|
+
centerY: target.clampedY + (fittedSize.height - movingDoorNode.height) / 2,
|
|
394
|
+
width: getDoorOpeningSize(movingDoorNode).width,
|
|
395
|
+
height: fittedSize.height,
|
|
362
396
|
// Doors sit on the floor — no sill/head or vertical alignment guides.
|
|
363
397
|
includeVertical: false,
|
|
364
398
|
levelYOffset: getLevelYOffset(),
|
|
@@ -437,8 +471,10 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
437
471
|
position: [target.clampedX, target.clampedY, planeOffsetOn(target.wallId)],
|
|
438
472
|
rotation: [0, target.itemRotation, 0],
|
|
439
473
|
side: target.side,
|
|
474
|
+
...(target.transomHeight === undefined ? {} : { transomHeight: target.transomHeight }),
|
|
440
475
|
wallId: target.wallId,
|
|
441
476
|
parentId: target.wallId,
|
|
477
|
+
...casingOn(target.wallId, [0, target.itemRotation, 0]),
|
|
442
478
|
roofSegmentId: undefined,
|
|
443
479
|
roofFace: undefined,
|
|
444
480
|
// The moving node is hidden during free-follow; the committed door
|
|
@@ -472,8 +508,10 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
472
508
|
position: [target.clampedX, target.clampedY, planeOffsetOn(target.wallId)],
|
|
473
509
|
rotation: [0, target.itemRotation, 0],
|
|
474
510
|
side: target.side,
|
|
511
|
+
...(target.transomHeight === undefined ? {} : { transomHeight: target.transomHeight }),
|
|
475
512
|
parentId: target.wallId,
|
|
476
513
|
wallId: target.wallId,
|
|
514
|
+
...casingOn(target.wallId, [0, target.itemRotation, 0]),
|
|
477
515
|
roofSegmentId: undefined,
|
|
478
516
|
visible: true,
|
|
479
517
|
});
|
|
@@ -625,6 +663,7 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
625
663
|
width: movingDoorNode.width,
|
|
626
664
|
height: movingDoorNode.height,
|
|
627
665
|
ignoreId: movingDoorNode.id,
|
|
666
|
+
opening: movingDoorNode,
|
|
628
667
|
vertical: { kind: 'bottom-locked' },
|
|
629
668
|
});
|
|
630
669
|
const updateRoofCursor = (target, roof) => {
|
|
@@ -709,6 +748,7 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
709
748
|
roofSegmentId: segmentId,
|
|
710
749
|
roofFace: target.face.id,
|
|
711
750
|
parentId: segmentId,
|
|
751
|
+
...casingOn(segmentId, [0, 0, 0]),
|
|
712
752
|
visible: true,
|
|
713
753
|
});
|
|
714
754
|
history.commitStep(() => {
|
|
@@ -741,6 +781,7 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
741
781
|
wallId: undefined,
|
|
742
782
|
roofSegmentId: segmentId,
|
|
743
783
|
roofFace: target.face.id,
|
|
784
|
+
...casingOn(segmentId, [0, 0, 0]),
|
|
744
785
|
visible: true,
|
|
745
786
|
});
|
|
746
787
|
});
|
|
@@ -852,9 +893,11 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
852
893
|
// No preview yet (R pressed before the first pointermove at initial
|
|
853
894
|
// placement): flip the hidden node so the FIRST preview/commit already
|
|
854
895
|
// reflects the chosen side.
|
|
896
|
+
const rotation = [0, sideOverride === 'back' ? Math.PI : 0, 0];
|
|
855
897
|
updateDraft({
|
|
856
898
|
side: sideOverride,
|
|
857
|
-
rotation
|
|
899
|
+
rotation,
|
|
900
|
+
position: doorPositionForFacing(movingDoorNode, rotation),
|
|
858
901
|
});
|
|
859
902
|
}
|
|
860
903
|
};
|
|
@@ -940,6 +983,7 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
940
983
|
updateDraft({ visible: true });
|
|
941
984
|
}
|
|
942
985
|
useLiveTransforms.getState().clear(movingDoorNode.id);
|
|
986
|
+
useLiveNodeOverrides.getState().clearFields(movingDoorNode.id, ['transomHeight']);
|
|
943
987
|
useAlignmentGuides.getState().clear();
|
|
944
988
|
clearOpeningGuides3D();
|
|
945
989
|
useFacingPose.getState().clear();
|
|
@@ -964,7 +1008,7 @@ const MoveDoorTool = ({ node: movingDoorNode }) => {
|
|
|
964
1008
|
};
|
|
965
1009
|
}, [movingDoorNode, exitMoveMode]);
|
|
966
1010
|
const edgesGeo = useMemo(() => {
|
|
967
|
-
const boxGeo = new BoxGeometry(movingDoorNode.width, movingDoorNode.height, movingDoorNode
|
|
1011
|
+
const boxGeo = new BoxGeometry(movingDoorNode.width, movingDoorNode.height, resolveHostedOpeningFrameDepth(movingDoorNode, useScene.getState().nodes));
|
|
968
1012
|
const geo = new EdgesGeometry(boxGeo);
|
|
969
1013
|
boxGeo.dispose();
|
|
970
1014
|
return geo;
|
package/dist/door/paint.d.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* invisible cutout) wins the shared scene raycast over the wall in front of the
|
|
4
|
-
* recessed door body, so `resolveSlotByReRaycast` re-raycasts the door's own
|
|
5
|
-
* subtree to find the part (panel / frame / glass / hardware) under the cursor.
|
|
6
|
-
*/
|
|
7
|
-
export declare const doorPaint: import("@pascal-app/core").PaintCapability;
|
|
1
|
+
import { type PaintCapability } from '@pascal-app/core';
|
|
2
|
+
export declare const doorPaint: PaintCapability;
|
|
8
3
|
//# sourceMappingURL=paint.d.ts.map
|
package/dist/door/paint.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/door/paint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/door/paint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAA+C,MAAM,kBAAkB,CAAA;AAiCpG,eAAO,MAAM,SAAS,EAAE,eAQvB,CAAA"}
|