@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opening-guides-runtime.d.ts","sourceRoot":"","sources":["../../src/shared/opening-guides-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"opening-guides-runtime.d.ts","sourceRoot":"","sources":["../../src/shared/opening-guides-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,kBAAkB,CAAA;AAMvF,OAAO,EACL,KAAK,OAAO,EAOZ,KAAK,WAAW,EAGhB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAUzB;;qFAEqF;AACrF,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjE,sEAAsE;AACtE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,WAAW,EAAE,CAqBf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,MAAM,GAAG,IAAI,CAoBhB;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,IAAI,CAmFP;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAcD;yEACyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,IAAI,CAQP;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CACT,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC,CAC/F,EACD,eAAe,EAAE,OAAO,GACvB,IAAI,CAgBN"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getDoorOpeningSize, openingHostFacing } from '@pascal-app/core';
|
|
1
2
|
// Runtime glue between the pure `computeOpeningGuides` geometry (core) and the
|
|
2
3
|
// editor's 3D guide store, used by the door/window move + placement tools. Lives
|
|
3
4
|
// in `nodes` (not core) because it talks to the editor store; kept thin so each
|
|
@@ -20,14 +21,16 @@ export function collectOpeningSiblings(wall, movingId, nodes) {
|
|
|
20
21
|
const node = nodes[childId];
|
|
21
22
|
if (!node || (node.type !== 'door' && node.type !== 'window'))
|
|
22
23
|
continue;
|
|
24
|
+
const size = getDoorOpeningSize(node);
|
|
23
25
|
out.push({
|
|
24
26
|
id: node.id,
|
|
25
|
-
centerS: node.position[0],
|
|
26
|
-
width:
|
|
27
|
+
centerS: node.position[0] - size.leafOffsetX * openingHostFacing(node),
|
|
28
|
+
width: size.width,
|
|
27
29
|
centerY: node.position[1] +
|
|
30
|
+
(size.height - node.height) / 2 +
|
|
28
31
|
getOpeningFloorDatum(wall, node, nodes) -
|
|
29
32
|
wallSupportForNodes(wall, nodes).elevation,
|
|
30
|
-
height:
|
|
33
|
+
height: size.height,
|
|
31
34
|
});
|
|
32
35
|
}
|
|
33
36
|
return out;
|
|
@@ -172,13 +175,14 @@ export function publishOpeningResizeGuides(node, includeVertical) {
|
|
|
172
175
|
const wall = node.parentId ? nodes[node.parentId] : undefined;
|
|
173
176
|
if (wall?.type !== 'wall')
|
|
174
177
|
return;
|
|
178
|
+
const size = getDoorOpeningSize(node);
|
|
175
179
|
publishOpeningGuides3D({
|
|
176
180
|
wall,
|
|
177
181
|
movingId: node.id,
|
|
178
|
-
centerS: node.position[0],
|
|
179
|
-
centerY: node.position[1],
|
|
180
|
-
width:
|
|
181
|
-
height:
|
|
182
|
+
centerS: node.position[0] - size.leafOffsetX * openingHostFacing(node),
|
|
183
|
+
centerY: node.position[1] + (size.height - node.height) / 2,
|
|
184
|
+
width: size.width,
|
|
185
|
+
height: size.height,
|
|
182
186
|
includeVertical,
|
|
183
187
|
nodes,
|
|
184
188
|
toWorld: wallToWorld(wall),
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MessageDescriptor, WindowNode } from '@pascal-app/core';
|
|
2
|
+
import type { DoorStyle, WindowStyle } from '@pascal-app/core/building';
|
|
3
|
+
/**
|
|
4
|
+
* The door and window panels' card names. Core's `DOOR_STYLE_LABELS`,
|
|
5
|
+
* `WINDOW_STYLE_LABELS` and the placement options stay English: the tool
|
|
6
|
+
* chips and agents read them.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DOOR_STYLE_MESSAGES: Record<DoorStyle, MessageDescriptor>;
|
|
9
|
+
export declare const WINDOW_STYLE_MESSAGES: Record<WindowStyle, MessageDescriptor>;
|
|
10
|
+
export declare const WINDOW_TYPE_MESSAGES: Record<WindowNode['windowType'], MessageDescriptor>;
|
|
11
|
+
//# sourceMappingURL=opening-labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opening-labels.d.ts","sourceRoot":"","sources":["../../src/shared/opening-labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAWpE,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAexE,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAYpF,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The door and window panels' card names. Core's `DOOR_STYLE_LABELS`,
|
|
3
|
+
* `WINDOW_STYLE_LABELS` and the placement options stay English: the tool
|
|
4
|
+
* chips and agents read them.
|
|
5
|
+
*/
|
|
6
|
+
export const DOOR_STYLE_MESSAGES = {
|
|
7
|
+
panel: /* i18n */ { id: 'node.door.style.panel', message: 'Panel' },
|
|
8
|
+
glass: /* i18n */ { id: 'node.door.style.glass', message: 'Glass' },
|
|
9
|
+
modern: /* i18n */ { id: 'node.door.style.modern', message: 'Modern' },
|
|
10
|
+
'paneled-glass': /* i18n */ { id: 'node.door.style.paneledGlass', message: 'Paneled glass' },
|
|
11
|
+
french: /* i18n */ { id: 'node.door.style.french', message: 'French' },
|
|
12
|
+
shaker: /* i18n */ { id: 'node.door.style.shaker', message: 'Shaker' },
|
|
13
|
+
'six-panel': /* i18n */ { id: 'node.door.style.sixPanel', message: 'Six-panel' },
|
|
14
|
+
craftsman: /* i18n */ { id: 'node.door.style.craftsman', message: 'Craftsman' },
|
|
15
|
+
'half-louvered': /* i18n */ { id: 'node.door.style.halfLouvered', message: 'Half-louvered' },
|
|
16
|
+
barn: /* i18n */ { id: 'node.door.style.barn', message: 'Barn' },
|
|
17
|
+
};
|
|
18
|
+
export const WINDOW_STYLE_MESSAGES = {
|
|
19
|
+
single: /* i18n */ { id: 'node.window.style.single', message: 'Single' },
|
|
20
|
+
'double-hung': /* i18n */ { id: 'node.window.style.doubleHung', message: 'Double-hung' },
|
|
21
|
+
'triple-hung': /* i18n */ { id: 'node.window.style.tripleHung', message: 'Triple-hung' },
|
|
22
|
+
casement: /* i18n */ { id: 'node.window.style.casement', message: 'Casement' },
|
|
23
|
+
sliding: /* i18n */ { id: 'node.window.style.sliding', message: 'Sliding' },
|
|
24
|
+
grid: /* i18n */ { id: 'node.window.style.grid', message: 'Grid' },
|
|
25
|
+
'tall-grid': /* i18n */ { id: 'node.window.style.tallGrid', message: 'Tall grid' },
|
|
26
|
+
'wide-grid': /* i18n */ { id: 'node.window.style.wideGrid', message: 'Wide grid' },
|
|
27
|
+
'horizontal-bands': /* i18n */ {
|
|
28
|
+
id: 'node.window.style.horizontalBands',
|
|
29
|
+
message: 'Horizontal bands',
|
|
30
|
+
},
|
|
31
|
+
transom: /* i18n */ { id: 'node.window.style.transom', message: 'Transom' },
|
|
32
|
+
picture: /* i18n */ { id: 'node.window.style.picture', message: 'Picture' },
|
|
33
|
+
};
|
|
34
|
+
export const WINDOW_TYPE_MESSAGES = {
|
|
35
|
+
fixed: /* i18n */ { id: 'node.window.type.fixed', message: 'Fixed' },
|
|
36
|
+
sliding: /* i18n */ { id: 'node.window.type.sliding', message: 'Sliding' },
|
|
37
|
+
casement: /* i18n */ { id: 'node.window.type.casement', message: 'Casement' },
|
|
38
|
+
awning: /* i18n */ { id: 'node.window.type.awning', message: 'Awning' },
|
|
39
|
+
hopper: /* i18n */ { id: 'node.window.type.hopper', message: 'Hopper' },
|
|
40
|
+
'tilt-turn': /* i18n */ { id: 'node.window.type.tiltTurn', message: 'Tilt and turn' },
|
|
41
|
+
'single-hung': /* i18n */ { id: 'node.window.type.singleHung', message: 'Single-hung' },
|
|
42
|
+
'double-hung': /* i18n */ { id: 'node.window.type.doubleHung', message: 'Double-hung' },
|
|
43
|
+
bay: /* i18n */ { id: 'node.window.type.bay', message: 'Bay' },
|
|
44
|
+
bow: /* i18n */ { id: 'node.window.type.bow', message: 'Bow' },
|
|
45
|
+
louvered: /* i18n */ { id: 'node.window.type.louvered', message: 'Louvered' },
|
|
46
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAQpB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAKzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CA+GrB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { computeOpeningGuides, getWallFaceOffsets, isCurvedWall, useScene, } from '@pascal-app/core';
|
|
1
|
+
import { computeOpeningGuides, getDoorOpeningSize, getWallFaceOffsets, isCurvedWall, openingHostFacing, useScene, } from '@pascal-app/core';
|
|
2
2
|
import { readFloorplanContext } from '@pascal-app/editor';
|
|
3
3
|
import { formatConstructionLength } from './construction-length.js';
|
|
4
4
|
import { resolveWallOpeningCeiling } from './wall-opening-ceiling.js';
|
|
@@ -63,21 +63,23 @@ export function buildOpeningPlacementDimensions(opening, ctx) {
|
|
|
63
63
|
if (!sibling || (sibling.type !== 'door' && sibling.type !== 'window'))
|
|
64
64
|
continue;
|
|
65
65
|
const sib = sibling;
|
|
66
|
+
const size = getDoorOpeningSize(sib);
|
|
66
67
|
siblings.push({
|
|
67
68
|
id: sib.id,
|
|
68
|
-
centerS: sib.position[0],
|
|
69
|
-
width:
|
|
70
|
-
centerY: sib.position[1],
|
|
71
|
-
height:
|
|
69
|
+
centerS: sib.position[0] - size.leafOffsetX * openingHostFacing(sib),
|
|
70
|
+
width: size.width,
|
|
71
|
+
centerY: sib.position[1] + (size.height - sib.height) / 2,
|
|
72
|
+
height: size.height,
|
|
72
73
|
});
|
|
73
74
|
}
|
|
75
|
+
const size = getDoorOpeningSize(opening);
|
|
74
76
|
const guides = computeOpeningGuides({
|
|
75
77
|
moving: {
|
|
76
78
|
id: opening.id,
|
|
77
|
-
centerS: opening.position[0],
|
|
78
|
-
width:
|
|
79
|
-
centerY: opening.position[1],
|
|
80
|
-
height:
|
|
79
|
+
centerS: opening.position[0] - size.leafOffsetX * openingHostFacing(opening),
|
|
80
|
+
width: size.width,
|
|
81
|
+
centerY: opening.position[1] + (size.height - opening.height) / 2,
|
|
82
|
+
height: size.height,
|
|
81
83
|
},
|
|
82
84
|
siblings,
|
|
83
85
|
wall: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type DoorNode, type WindowNode } from '@pascal-app/core';
|
|
2
2
|
type PlanarOpening = Pick<DoorNode | WindowNode, 'position' | 'wallId' | 'parentId'>;
|
|
3
3
|
/**
|
|
4
4
|
* The wall-local plane offset (`position[2]`) a moved door / window keeps on
|
|
@@ -12,8 +12,9 @@ export declare function openingPlaneOffsetOnWall(opening: PlanarOpening, targetW
|
|
|
12
12
|
* Where an opening's plan symbol sits across its wall. A centred opening keeps
|
|
13
13
|
* the long-standing symbol: centred in the cutout, as deep as the wall. An
|
|
14
14
|
* opening offset from the centre plane draws its frame at that offset with its
|
|
15
|
-
*
|
|
16
|
-
* cutout, because the wall is still
|
|
15
|
+
* resolved frame depth, like the 3D
|
|
16
|
+
* renderer; the builder then also draws the cutout, because the wall is still
|
|
17
|
+
* cut through its whole thickness.
|
|
17
18
|
*/
|
|
18
19
|
export declare function resolveOpeningPlanPlane(opening: Pick<DoorNode | WindowNode, 'position' | 'frameDepth'>, wallThickness: number): {
|
|
19
20
|
offset: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opening-plane-offset.d.ts","sourceRoot":"","sources":["../../src/shared/opening-plane-offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"opening-plane-offset.d.ts","sourceRoot":"","sources":["../../src/shared/opening-plane-offset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAA4B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE3F,KAAK,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAA;AAEpF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,YAAY,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKnC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveOpeningFrameDepth } from '@pascal-app/core';
|
|
1
2
|
/**
|
|
2
3
|
* The wall-local plane offset (`position[2]`) a moved door / window keeps on
|
|
3
4
|
* `targetWallId`. The offset is measured from the centre plane of the wall the
|
|
@@ -13,12 +14,14 @@ export function openingPlaneOffsetOnWall(opening, targetWallId) {
|
|
|
13
14
|
* Where an opening's plan symbol sits across its wall. A centred opening keeps
|
|
14
15
|
* the long-standing symbol: centred in the cutout, as deep as the wall. An
|
|
15
16
|
* opening offset from the centre plane draws its frame at that offset with its
|
|
16
|
-
*
|
|
17
|
-
* cutout, because the wall is still
|
|
17
|
+
* resolved frame depth, like the 3D
|
|
18
|
+
* renderer; the builder then also draws the cutout, because the wall is still
|
|
19
|
+
* cut through its whole thickness.
|
|
18
20
|
*/
|
|
19
21
|
export function resolveOpeningPlanPlane(opening, wallThickness) {
|
|
20
22
|
const offset = opening.position[2] ?? 0;
|
|
21
|
-
|
|
23
|
+
const frameDepth = resolveOpeningFrameDepth(opening, wallThickness);
|
|
24
|
+
if (offset === 0 || !(frameDepth > 0))
|
|
22
25
|
return { offset: 0, depth: wallThickness };
|
|
23
|
-
return { offset, depth:
|
|
26
|
+
return { offset, depth: frameDepth };
|
|
24
27
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DoorNode, type MechanismCapability, type WindowNode } from '@pascal-app/core';
|
|
2
|
+
/**
|
|
3
|
+
* Commits a hinge or swing swap of a door or window as one undo step, then opens it through its
|
|
4
|
+
* kind's mechanism when it is closed, so the new side is visible. The opening is the mechanism's
|
|
5
|
+
* preview (the action menu's Open): it leaves the saved open state and the undo history alone.
|
|
6
|
+
*/
|
|
7
|
+
export declare function applyOpeningSwap<N extends DoorNode | WindowNode>(node: N, patch: Partial<N>, mechanism: MechanismCapability): void;
|
|
8
|
+
//# sourceMappingURL=opening-swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opening-swap.d.ts","sourceRoot":"","sources":["../../src/shared/opening-swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EAGxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAGzB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU,EAC9D,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,SAAS,EAAE,mBAAmB,QAS/B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useInteractive, useScene, } from '@pascal-app/core';
|
|
2
|
+
import { triggerSFX } from '@pascal-app/editor';
|
|
3
|
+
/**
|
|
4
|
+
* Commits a hinge or swing swap of a door or window as one undo step, then opens it through its
|
|
5
|
+
* kind's mechanism when it is closed, so the new side is visible. The opening is the mechanism's
|
|
6
|
+
* preview (the action menu's Open): it leaves the saved open state and the undo history alone.
|
|
7
|
+
*/
|
|
8
|
+
export function applyOpeningSwap(node, patch, mechanism) {
|
|
9
|
+
const scene = useScene.getState();
|
|
10
|
+
scene.updateNode(node.id, patch);
|
|
11
|
+
scene.dirtyNodes.add(node.id);
|
|
12
|
+
if (node.parentId)
|
|
13
|
+
scene.dirtyNodes.add(node.parentId);
|
|
14
|
+
triggerSFX('sfx:item-rotate');
|
|
15
|
+
const swapped = useScene.getState().nodes[node.id];
|
|
16
|
+
if (swapped && !mechanism.isOn(swapped, useInteractive.getState()))
|
|
17
|
+
mechanism.set(swapped, true);
|
|
18
|
+
}
|
|
@@ -44,6 +44,12 @@ export type PolygonAffordanceSnapContext<N extends PolygonShape & {
|
|
|
44
44
|
modifiers: FloorplanAffordanceModifiers;
|
|
45
45
|
holeIndex?: number;
|
|
46
46
|
mode: PolygonAffordanceMode;
|
|
47
|
+
/**
|
|
48
|
+
* `move-vertex` / `add-vertex`: the ring as the drag found it (the new vertex inserted) and the
|
|
49
|
+
* dragged vertex's index in it, so a resolver can square the vertex to its neighbours.
|
|
50
|
+
*/
|
|
51
|
+
ring?: ReadonlyArray<readonly [number, number]>;
|
|
52
|
+
vertexIndex?: number;
|
|
47
53
|
};
|
|
48
54
|
export type PolygonEdgeSnapContext<N extends PolygonShape & {
|
|
49
55
|
id: AnyNodeId;
|
|
@@ -70,6 +76,13 @@ export type PolygonAffordanceOptions<N extends PolygonShape & {
|
|
|
70
76
|
* translated edge, or `null` to keep the candidate.
|
|
71
77
|
*/
|
|
72
78
|
snapEdge?: (context: PolygonEdgeSnapContext<N>) => [[number, number], [number, number]] | null;
|
|
79
|
+
/**
|
|
80
|
+
* `move-edge`: the sides beside the dragged one keep their own angle, running on to meet it
|
|
81
|
+
* where it goes; a side in line with it (a side split in two) gets a square jog instead, so
|
|
82
|
+
* pulling out part of a side makes a bump-out. Off, both ends of the side translate square to
|
|
83
|
+
* it and its neighbours pivot on their far ends.
|
|
84
|
+
*/
|
|
85
|
+
keepNeighbourAngles?: boolean;
|
|
73
86
|
};
|
|
74
87
|
type PolygonShape = {
|
|
75
88
|
polygon: ReadonlyArray<readonly [number, number]>;
|
|
@@ -92,6 +105,12 @@ export declare function createPolygonAddVertexAffordance<N extends PolygonShape
|
|
|
92
105
|
export declare function createPolygonDeleteVertexAffordance<N extends PolygonShape & {
|
|
93
106
|
id: AnyNodeId;
|
|
94
107
|
}>(kind: string, options?: PolygonAffordanceOptions<N>): FloorplanAffordance<N>;
|
|
108
|
+
/**
|
|
109
|
+
* `ring` with edge `edgeIndex` moved `distance` along `normal`, its neighbours keeping their angles
|
|
110
|
+
* (`keepNeighbourAngles`): each end goes where the neighbouring side's line meets the moved edge's,
|
|
111
|
+
* and a neighbour in line with the edge keeps its vertex, a square jog joining it to the moved end.
|
|
112
|
+
*/
|
|
113
|
+
export declare function movedEdgeKeepingNeighbours(ring: ReadonlyArray<readonly [number, number]>, edgeIndex: number, normal: readonly [number, number], distance: number): [number, number][];
|
|
95
114
|
/**
|
|
96
115
|
* Edge-drag: move a whole edge perpendicular to itself. Both endpoints
|
|
97
116
|
* translate by `edgeNormal * projectedDelta`. The other vertices of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polygon-vertex-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-vertex-affordance.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EAGlC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,oBAAoB,GAAG;IACjC,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,KAAK,qBAAqB,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,CAAA;AAEvE,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,YAAY,GAAG;IAAE,EAAE,EAAE,SAAS,CAAA;CAAE,IAAI;IACrF,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,EAAE,aAAa,CAAA;IACvB,aAAa,EAAE,aAAa,CAAA;IAC5B,SAAS,EAAE,4BAA4B,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"polygon-vertex-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-vertex-affordance.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,6 +71,8 @@ export function createPolygonVertexAffordance(kind, options) {
|
|
|
71
71
|
modifiers,
|
|
72
72
|
holeIndex,
|
|
73
73
|
mode: 'move-vertex',
|
|
74
|
+
ring: originalRing,
|
|
75
|
+
vertexIndex,
|
|
74
76
|
});
|
|
75
77
|
const nextRing = originalRing.map((p, i) => i === vertexIndex ? [snapped[0], snapped[1]] : p);
|
|
76
78
|
const patch = buildRingPatch(node, holeIndex, nextRing, options?.boundaryCommitData);
|
|
@@ -148,6 +150,8 @@ export function createPolygonAddVertexAffordance(kind, options) {
|
|
|
148
150
|
modifiers,
|
|
149
151
|
holeIndex,
|
|
150
152
|
mode: 'add-vertex',
|
|
153
|
+
ring: initialRing,
|
|
154
|
+
vertexIndex: newVertexIndex,
|
|
151
155
|
});
|
|
152
156
|
const nextRing = initialRing.map((p, i) => i === newVertexIndex ? [snapped[0], snapped[1]] : p);
|
|
153
157
|
const patch = buildRingPatch(node, holeIndex, nextRing, options?.boundaryCommitData);
|
|
@@ -203,6 +207,59 @@ export function createPolygonDeleteVertexAffordance(kind, options) {
|
|
|
203
207
|
},
|
|
204
208
|
};
|
|
205
209
|
}
|
|
210
|
+
/** A neighbouring side within this sine of the dragged one's line is in line with it (a split side). */
|
|
211
|
+
const IN_LINE_SINE = 0.05;
|
|
212
|
+
/**
|
|
213
|
+
* `ring` with edge `edgeIndex` moved `distance` along `normal`, its neighbours keeping their angles
|
|
214
|
+
* (`keepNeighbourAngles`): each end goes where the neighbouring side's line meets the moved edge's,
|
|
215
|
+
* and a neighbour in line with the edge keeps its vertex, a square jog joining it to the moved end.
|
|
216
|
+
*/
|
|
217
|
+
export function movedEdgeKeepingNeighbours(ring, edgeIndex, normal, distance) {
|
|
218
|
+
const copy = ring.map(([x, y]) => [x, y]);
|
|
219
|
+
const count = ring.length;
|
|
220
|
+
// Under a millimetre the side has not moved: no jog a hair long.
|
|
221
|
+
if (count < 3 || Math.abs(distance) < 1e-3)
|
|
222
|
+
return copy;
|
|
223
|
+
const startIndex = edgeIndex;
|
|
224
|
+
const endIndex = (edgeIndex + 1) % count;
|
|
225
|
+
const start = ring[startIndex];
|
|
226
|
+
const end = ring[endIndex];
|
|
227
|
+
const moved = (p) => [
|
|
228
|
+
p[0] + normal[0] * distance,
|
|
229
|
+
p[1] + normal[1] * distance,
|
|
230
|
+
];
|
|
231
|
+
/** Where the side from `neighbour` to `vertex` meets the moved edge; `null` in line with it. */
|
|
232
|
+
const meet = (vertex, neighbour) => {
|
|
233
|
+
const dx = vertex[0] - neighbour[0];
|
|
234
|
+
const dy = vertex[1] - neighbour[1];
|
|
235
|
+
const length = Math.hypot(dx, dy);
|
|
236
|
+
if (length < 1e-9)
|
|
237
|
+
return null;
|
|
238
|
+
const along = (dx * normal[0] + dy * normal[1]) / length;
|
|
239
|
+
if (Math.abs(along) < IN_LINE_SINE)
|
|
240
|
+
return null;
|
|
241
|
+
const target = moved(start);
|
|
242
|
+
const t = ((target[0] - neighbour[0]) * normal[0] + (target[1] - neighbour[1]) * normal[1]) /
|
|
243
|
+
(along * length);
|
|
244
|
+
return [neighbour[0] + dx * t, neighbour[1] + dy * t];
|
|
245
|
+
};
|
|
246
|
+
const startMeet = meet(start, ring[(startIndex - 1 + count) % count]);
|
|
247
|
+
const endMeet = meet(end, ring[(endIndex + 1) % count]);
|
|
248
|
+
const startPoints = startMeet
|
|
249
|
+
? [startMeet]
|
|
250
|
+
: [[start[0], start[1]], moved(start)];
|
|
251
|
+
const endPoints = endMeet ? [endMeet] : [moved(end), [end[0], end[1]]];
|
|
252
|
+
const out = [];
|
|
253
|
+
for (let i = 0; i < count; i++) {
|
|
254
|
+
if (i === startIndex)
|
|
255
|
+
out.push(...startPoints);
|
|
256
|
+
else if (i === endIndex)
|
|
257
|
+
out.push(...endPoints);
|
|
258
|
+
else
|
|
259
|
+
out.push(copy[i]);
|
|
260
|
+
}
|
|
261
|
+
return out;
|
|
262
|
+
}
|
|
206
263
|
/**
|
|
207
264
|
* Edge-drag: move a whole edge perpendicular to itself. Both endpoints
|
|
208
265
|
* translate by `edgeNormal * projectedDelta`. The other vertices of
|
|
@@ -307,12 +364,14 @@ export function createPolygonMoveEdgeAffordance(kind, options) {
|
|
|
307
364
|
(snappedEdge[0][1] - startVertex[1]) * normalY;
|
|
308
365
|
}
|
|
309
366
|
}
|
|
310
|
-
const nextRing =
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
367
|
+
const nextRing = options?.keepNeighbourAngles
|
|
368
|
+
? movedEdgeKeepingNeighbours(originalRing, edgeIndex, [normalX, normalY], normalDistance)
|
|
369
|
+
: originalRing.map((p, i) => {
|
|
370
|
+
if (i === edgeStartIndex || i === edgeEndIndex) {
|
|
371
|
+
return [p[0] + normalX * normalDistance, p[1] + normalY * normalDistance];
|
|
372
|
+
}
|
|
373
|
+
return [p[0], p[1]];
|
|
374
|
+
});
|
|
316
375
|
const patch = buildRingPatch(node, holeIndex, nextRing, options?.boundaryCommitData);
|
|
317
376
|
commitRingPatch(node.id, holeIndex, patch);
|
|
318
377
|
},
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AnyNode, AnyNodeId, RoofWallFaceId } from '@pascal-app/core';
|
|
2
|
+
import { type DoorNode } from '@pascal-app/core';
|
|
2
3
|
/**
|
|
3
4
|
* Host-side helpers for openings (door / window) hosted on a roof-segment
|
|
4
5
|
* wall face: resize-handle limits derived from the face profile, and the
|
|
@@ -12,7 +13,7 @@ type RoofHostedOpening = {
|
|
|
12
13
|
position: [number, number, number];
|
|
13
14
|
width: number;
|
|
14
15
|
height: number;
|
|
15
|
-
}
|
|
16
|
+
} & Partial<Pick<DoorNode, 'rotation' | 'doorType' | 'sidelightLeft' | 'sidelightRight' | 'transomHeight'>>;
|
|
16
17
|
type SceneReader = {
|
|
17
18
|
get: (id: AnyNodeId) => unknown;
|
|
18
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roof-opening-host.d.ts","sourceRoot":"","sources":["../../src/shared/roof-opening-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAGT,cAAc,EACf,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"roof-opening-host.d.ts","sourceRoot":"","sources":["../../src/shared/roof-opening-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAGT,cAAc,EACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,kBAAkB,CAAA;AAEzB;;;;;GAKG;AAEH,KAAK,iBAAiB,GAAG;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CACT,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC,CAC/F,CAAA;AAED,KAAK,WAAW,GAAG;IAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAA;CAAE,CAAA;AAStD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAYf;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAWf;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,SAAS,GAAG,IAAI,CAMlB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,SAAS,GAAG,IAAI,CAOlB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC,EACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAqBzB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getMaxRoofRectHeightFromAnchor, getMaxRoofRectWidthFromAnchor, getRoofSegmentWallFace, roofFacePointToSegment, } from '@pascal-app/core';
|
|
1
|
+
import { getDoorOpeningSize, getMaxRoofRectHeightFromAnchor, getMaxRoofRectWidthFromAnchor, getRoofSegmentWallFace, openingHostFacing, roofFacePointToSegment, } from '@pascal-app/core';
|
|
2
2
|
function resolveHostFace(node, scene) {
|
|
3
3
|
if (!(node.roofSegmentId && node.roofFace))
|
|
4
4
|
return null;
|
|
@@ -16,8 +16,13 @@ export function readRoofFaceWidthMax(node, scene, growSign) {
|
|
|
16
16
|
const host = resolveHostFace(node, scene);
|
|
17
17
|
if (!host)
|
|
18
18
|
return null;
|
|
19
|
-
const
|
|
20
|
-
|
|
19
|
+
const size = getDoorOpeningSize(node);
|
|
20
|
+
const centerX = node.position[0] - size.leafOffsetX * openingHostFacing(node);
|
|
21
|
+
const centerY = node.position[1] + (size.height - node.height) / 2;
|
|
22
|
+
const direction = growSign * openingHostFacing(node);
|
|
23
|
+
const anchorU = centerX - (direction * size.width) / 2;
|
|
24
|
+
return (getMaxRoofRectWidthFromAnchor(host.face, anchorU, direction, centerY, size.height) -
|
|
25
|
+
(size.width - node.width));
|
|
21
26
|
}
|
|
22
27
|
/**
|
|
23
28
|
* Resize-handle height limit for a roof-hosted opening. `growSign` +1 =
|
|
@@ -28,8 +33,12 @@ export function readRoofFaceHeightMax(node, scene, growSign) {
|
|
|
28
33
|
const host = resolveHostFace(node, scene);
|
|
29
34
|
if (!host)
|
|
30
35
|
return null;
|
|
31
|
-
const
|
|
32
|
-
|
|
36
|
+
const size = getDoorOpeningSize(node);
|
|
37
|
+
const centerX = node.position[0] - size.leafOffsetX * openingHostFacing(node);
|
|
38
|
+
const centerY = node.position[1] + (size.height - node.height) / 2;
|
|
39
|
+
const anchorV = centerY - (growSign * size.height) / 2;
|
|
40
|
+
return (getMaxRoofRectHeightFromAnchor(host.face, centerX, size.width, anchorV, growSign) -
|
|
41
|
+
(size.height - node.height));
|
|
33
42
|
}
|
|
34
43
|
/**
|
|
35
44
|
* Level hosting a roof-hosted opening's roof (opening → segment → roof →
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roof-wall-opening-cut.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-cut.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"roof-wall-opening-cut.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-cut.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAQ7E,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAC3B,WAAW,EAAE,eAAe,GAC3B,KAAK,CAAC,cAAc,GAAG,IAAI,CA0B7B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getRoofWallFaceFrame, roofFacePointToSegment } from '@pascal-app/core';
|
|
1
|
+
import { getDoorOpeningSize, getRoofWallFaceFrame, openingHostFacing, roofFacePointToSegment, } from '@pascal-app/core';
|
|
2
2
|
import { buildOpeningCutoutGeometry, getOpeningCutoutBottomPadding } from '@pascal-app/viewer';
|
|
3
3
|
import * as THREE from 'three';
|
|
4
4
|
/**
|
|
@@ -38,15 +38,23 @@ export function buildRoofWallOpeningCut(node, hostSegment) {
|
|
|
38
38
|
return geo;
|
|
39
39
|
}
|
|
40
40
|
function buildCutGeometry(node, wallThickness, depth, bottomPad) {
|
|
41
|
+
const size = getDoorOpeningSize(node);
|
|
42
|
+
const offsetX = -size.leafOffsetX * openingHostFacing(node);
|
|
43
|
+
const offsetY = (size.height - node.height) / 2;
|
|
41
44
|
const shaped = node.openingKind === 'opening' ||
|
|
42
45
|
node.openingShape === 'arch' ||
|
|
43
46
|
node.openingShape === 'rounded';
|
|
44
47
|
if (!shaped) {
|
|
45
|
-
const geo = new THREE.BoxGeometry(
|
|
46
|
-
geo.translate(
|
|
48
|
+
const geo = new THREE.BoxGeometry(size.width, size.height + bottomPad, depth);
|
|
49
|
+
geo.translate(offsetX, offsetY - bottomPad / 2, 0);
|
|
47
50
|
return geo;
|
|
48
51
|
}
|
|
49
|
-
const halfWidth =
|
|
50
|
-
const halfHeight =
|
|
51
|
-
return buildOpeningCutoutGeometry(node, {
|
|
52
|
+
const halfWidth = size.width / 2;
|
|
53
|
+
const halfHeight = size.height / 2;
|
|
54
|
+
return buildOpeningCutoutGeometry(node, {
|
|
55
|
+
left: offsetX - halfWidth,
|
|
56
|
+
right: offsetX + halfWidth,
|
|
57
|
+
bottom: offsetY - halfHeight - bottomPad,
|
|
58
|
+
top: offsetY + halfHeight,
|
|
59
|
+
}, depth, wallThickness);
|
|
52
60
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type RoofEvent, type RoofNode, type RoofSegmentNode, type RoofSegmentWallFace } from '@pascal-app/core';
|
|
1
|
+
import { type DoorNode, type RoofEvent, type RoofNode, type RoofSegmentNode, type RoofSegmentWallFace } from '@pascal-app/core';
|
|
2
2
|
import { Vector3 } from 'three';
|
|
3
3
|
/**
|
|
4
4
|
* Stateless target/cursor math shared by the door and window placement
|
|
@@ -35,6 +35,7 @@ export declare function resolveRoofWallOpeningTarget(args: {
|
|
|
35
35
|
width: number;
|
|
36
36
|
height: number;
|
|
37
37
|
ignoreId?: string;
|
|
38
|
+
opening?: Partial<DoorNode>;
|
|
38
39
|
vertical: RoofWallOpeningVertical;
|
|
39
40
|
}): RoofWallOpeningTarget | null;
|
|
40
41
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roof-wall-opening-placement.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-placement.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAGzB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B;;;;;GAKG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,mBAAmB,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,uBAAuB;AACjC,0DAA0D;AACxD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE;AAC3B,sEAAsE;GACpE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,uBAAuB,CAAA;CAClC,GAAG,qBAAqB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"roof-wall-opening-placement.d.ts","sourceRoot":"","sources":["../../src/shared/roof-wall-opening-placement.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAGzB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B;;;;;GAKG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,mBAAmB,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,uBAAuB;AACjC,0DAA0D;AACxD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE;AAC3B,sEAAsE;GACpE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3B,QAAQ,EAAE,uBAAuB,CAAA;CAClC,GAAG,qBAAqB,GAAG,IAAI,CAiC/B;AAID;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAQrF;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,QAAQ,GACb;IAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWlE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { clampRectToRoofWallFace, roofFacePointToSegment, sceneRegistry, } from '@pascal-app/core';
|
|
1
|
+
import { clampRectToRoofWallFace, getDoorOpeningSize, roofFacePointToSegment, sceneRegistry, } from '@pascal-app/core';
|
|
2
2
|
import { hasRoofFaceChildOverlap, resolveRoofWallHit } from '@pascal-app/editor';
|
|
3
3
|
import { useViewer } from '@pascal-app/viewer';
|
|
4
4
|
import { Vector3 } from 'three';
|
|
@@ -9,19 +9,21 @@ import { Vector3 } from 'three';
|
|
|
9
9
|
* fit at that spot.
|
|
10
10
|
*/
|
|
11
11
|
export function resolveRoofWallOpeningTarget(args) {
|
|
12
|
-
const { event,
|
|
12
|
+
const { event, ignoreId, vertical } = args;
|
|
13
|
+
const size = getDoorOpeningSize({ ...args.opening, width: args.width, height: args.height });
|
|
14
|
+
const { width, height } = size;
|
|
13
15
|
const hit = resolveRoofWallHit(event.node, event.position, event.normal, event.object);
|
|
14
16
|
if (!hit)
|
|
15
17
|
return null;
|
|
16
18
|
const centerV = vertical.kind === 'bottom-locked' ? height / 2 : (vertical.snap?.(hit.v) ?? hit.v);
|
|
17
|
-
const clamped = clampRectToRoofWallFace(hit.face, hit.u, centerV, width, height, vertical.kind === 'bottom-locked' ? { lockV: true } : undefined);
|
|
19
|
+
const clamped = clampRectToRoofWallFace(hit.face, hit.u - size.leafOffsetX, centerV, width, height, vertical.kind === 'bottom-locked' ? { lockV: true } : undefined);
|
|
18
20
|
if (!clamped)
|
|
19
21
|
return null;
|
|
20
22
|
const valid = !hasRoofFaceChildOverlap(hit.segment, hit.face.id, clamped.u, clamped.v, width, height, ignoreId);
|
|
21
23
|
return {
|
|
22
24
|
segment: hit.segment,
|
|
23
25
|
face: hit.face,
|
|
24
|
-
position: [clamped.u, clamped.v, 0],
|
|
26
|
+
position: [clamped.u + size.leafOffsetX, clamped.v - (height - args.height) / 2, 0],
|
|
25
27
|
valid,
|
|
26
28
|
};
|
|
27
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-hanger-inspector.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-inspector.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAGrE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,+
|
|
1
|
+
{"version":3,"file":"run-hanger-inspector.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-inspector.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAGrE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,+BA0J1E"}
|