@pascal-app/nodes 1.0.6 → 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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { type InsulationKind, type InteriorFinishKind, type MessageDescriptor, type NominalLumber, type PanelKind, type PascalI18n } from '@pascal-app/core';
|
|
2
|
+
type LinearUnit = 'metric' | 'imperial';
|
|
3
|
+
/**
|
|
4
|
+
* A select over standard sizes (panel thicknesses, spacings). A stored value
|
|
5
|
+
* off the list stays selectable, so a scene written elsewhere reads back as
|
|
6
|
+
* it is.
|
|
7
|
+
*/
|
|
8
|
+
export declare function SizeSelect({ label, value, sizes, format, onChange, }: {
|
|
9
|
+
label: string;
|
|
10
|
+
value: number;
|
|
11
|
+
sizes: readonly number[];
|
|
12
|
+
format: (value: number) => string;
|
|
13
|
+
onChange: (value: number) => void;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
/** A free thickness, typed as `5/8`, `3 1/2"` or `90mm`; a bare number is inches or millimetres. */
|
|
16
|
+
export declare function ThicknessField({ label, metres, onCommit, unit, }: {
|
|
17
|
+
label: string;
|
|
18
|
+
metres: number;
|
|
19
|
+
onCommit: (metres: number) => void;
|
|
20
|
+
unit: LinearUnit;
|
|
21
|
+
}): import("react").JSX.Element;
|
|
22
|
+
export declare function BuildUpReadout({ label, value }: {
|
|
23
|
+
label: string;
|
|
24
|
+
value: string;
|
|
25
|
+
}): import("react").JSX.Element;
|
|
26
|
+
/** A spacing on centre, as the viewer's unit names it: `16" o.c.` or `406 mm o.c.`. */
|
|
27
|
+
export declare function formatSpacing(metres: number, unit: LinearUnit, i18n: PascalI18n): string;
|
|
28
|
+
export declare const NONE = "none";
|
|
29
|
+
/** What each panel, insulation and finish kind is called. */
|
|
30
|
+
export declare const LAYER_KIND_LABELS: Record<PanelKind | InsulationKind | InteriorFinishKind, MessageDescriptor>;
|
|
31
|
+
/** `base` with `change` applied and no longer a preset; a layer set to `undefined` goes. */
|
|
32
|
+
export declare function editedBuildUp<T extends {
|
|
33
|
+
presetId?: string;
|
|
34
|
+
}>(base: T, change: Partial<T>): T;
|
|
35
|
+
export declare function FramingSizeFields({ framing, onChange, sizeLabel, unit, }: {
|
|
36
|
+
framing: {
|
|
37
|
+
size: NominalLumber;
|
|
38
|
+
spacing: number;
|
|
39
|
+
};
|
|
40
|
+
onChange: (change: {
|
|
41
|
+
size?: NominalLumber;
|
|
42
|
+
spacing?: number;
|
|
43
|
+
}) => void;
|
|
44
|
+
sizeLabel: string;
|
|
45
|
+
unit: LinearUnit;
|
|
46
|
+
}): import("react").JSX.Element;
|
|
47
|
+
/** A structural panel; with `optional`, None takes it out and a new one is `added`. */
|
|
48
|
+
export declare function PanelFields({ added, label, layer, onChange, optional, unit, }: {
|
|
49
|
+
added?: number;
|
|
50
|
+
label: string;
|
|
51
|
+
layer: {
|
|
52
|
+
kind: PanelKind;
|
|
53
|
+
thickness: number;
|
|
54
|
+
} | undefined;
|
|
55
|
+
onChange: (layer: {
|
|
56
|
+
kind: PanelKind;
|
|
57
|
+
thickness: number;
|
|
58
|
+
} | undefined) => void;
|
|
59
|
+
optional?: boolean;
|
|
60
|
+
unit: LinearUnit;
|
|
61
|
+
}): import("react").JSX.Element;
|
|
62
|
+
/** A new insulation layer is cavity fill as deep as the framing, or 2 in of rigid board. */
|
|
63
|
+
export declare function InsulationFields({ framingDepth, layer, onChange, unit, }: {
|
|
64
|
+
framingDepth: number;
|
|
65
|
+
layer: {
|
|
66
|
+
kind: InsulationKind;
|
|
67
|
+
thickness: number;
|
|
68
|
+
} | undefined;
|
|
69
|
+
onChange: (layer: {
|
|
70
|
+
kind: InsulationKind;
|
|
71
|
+
thickness: number;
|
|
72
|
+
} | undefined) => void;
|
|
73
|
+
unit: LinearUnit;
|
|
74
|
+
}): import("react").JSX.Element;
|
|
75
|
+
export declare function FinishFields({ label, layer, onChange, unit, }: {
|
|
76
|
+
label: string;
|
|
77
|
+
layer: {
|
|
78
|
+
kind: InteriorFinishKind;
|
|
79
|
+
thickness: number;
|
|
80
|
+
} | undefined;
|
|
81
|
+
onChange: (layer: {
|
|
82
|
+
kind: InteriorFinishKind;
|
|
83
|
+
thickness: number;
|
|
84
|
+
} | undefined) => void;
|
|
85
|
+
unit: LinearUnit;
|
|
86
|
+
}): import("react").JSX.Element;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=build-up-controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-up-controls.d.ts","sourceRoot":"","sources":["../../src/shared/build-up-controls.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAEvB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAElB,KAAK,SAAS,EACd,KAAK,UAAU,EAIhB,MAAM,kBAAkB,CAAA;AAKzB,KAAK,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAA;AAIvC;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC,+BAeA;AAED,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,EACN,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,IAAI,EAAE,UAAU,CAAA;CACjB,+BA2BA;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAShF;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CASxF;AAED,eAAO,MAAM,IAAI,SAAS,CAAA;AAQ1B,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,SAAS,GAAG,cAAc,GAAG,kBAAkB,EAC/C,iBAAiB,CAUlB,CAAA;AAmCD,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAK7F;AAED,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE;IACD,OAAO,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACjD,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,aAAa,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACtE,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,UAAU,CAAA;CACjB,+BAmBA;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,EAC1B,KAA6B,EAC7B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,IAAI,GACL,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IACzD,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,KAAK,IAAI,CAAA;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,UAAU,CAAA;CACjB,+BA8BA;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,IAAI,GACL,EAAE;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IAC9D,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,KAAK,IAAI,CAAA;IAClF,IAAI,EAAE,UAAU,CAAA;CACjB,+BA6BA;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,GACL,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE;QAAE,IAAI,EAAE,kBAAkB,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IAClE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,kBAAkB,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,KAAK,IAAI,CAAA;IACtF,IAAI,EAAE,UAAU,CAAA;CACjB,+BA0BA"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { DRYWALL_THICKNESSES, FRAMING_SPACINGS, LUMBER_DEPTH, PANEL_THICKNESSES, PLASTER_THICKNESS, usePascalI18n, WOOD_PLANK_THICKNESS, } from '@pascal-app/core';
|
|
4
|
+
import { SelectControl } from '@pascal-app/editor';
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { formatLayerThickness, parseLayerThickness } from './layer-thickness.js';
|
|
7
|
+
const key = (value) => value.toFixed(6);
|
|
8
|
+
/**
|
|
9
|
+
* A select over standard sizes (panel thicknesses, spacings). A stored value
|
|
10
|
+
* off the list stays selectable, so a scene written elsewhere reads back as
|
|
11
|
+
* it is.
|
|
12
|
+
*/
|
|
13
|
+
export function SizeSelect({ label, value, sizes, format, onChange, }) {
|
|
14
|
+
const listed = sizes.some((size) => Math.abs(size - value) < 1e-6);
|
|
15
|
+
const choices = listed ? sizes : [value, ...sizes];
|
|
16
|
+
const current = choices.find((size) => Math.abs(size - value) < 1e-6) ?? value;
|
|
17
|
+
return (_jsx(SelectControl, { label: label, onChange: (next) => {
|
|
18
|
+
const picked = choices.find((size) => key(size) === next);
|
|
19
|
+
if (picked !== undefined)
|
|
20
|
+
onChange(picked);
|
|
21
|
+
}, options: choices.map((size) => ({ label: format(size), value: key(size) })), value: key(current) }));
|
|
22
|
+
}
|
|
23
|
+
/** A free thickness, typed as `5/8`, `3 1/2"` or `90mm`; a bare number is inches or millimetres. */
|
|
24
|
+
export function ThicknessField({ label, metres, onCommit, unit, }) {
|
|
25
|
+
const [draft, setDraft] = useState(null);
|
|
26
|
+
return (_jsxs("label", { className: "flex h-10 w-full items-center justify-between gap-2 rounded-lg border border-border/50 bg-black/4 px-3 text-sm dark:bg-[#2C2C2E]", children: [_jsx("span", { className: "select-none text-muted-foreground", children: label }), _jsx("input", { className: "w-24 bg-transparent text-right text-foreground outline-none", onBlur: () => {
|
|
27
|
+
if (draft !== null) {
|
|
28
|
+
const parsed = parseLayerThickness(draft, unit);
|
|
29
|
+
if (parsed !== null)
|
|
30
|
+
onCommit(parsed);
|
|
31
|
+
}
|
|
32
|
+
setDraft(null);
|
|
33
|
+
}, onChange: (event) => setDraft(event.target.value), onKeyDown: (event) => {
|
|
34
|
+
if (event.key === 'Enter')
|
|
35
|
+
event.currentTarget.blur();
|
|
36
|
+
if (event.key === 'Escape') {
|
|
37
|
+
setDraft(null);
|
|
38
|
+
event.currentTarget.blur();
|
|
39
|
+
}
|
|
40
|
+
}, spellCheck: false, value: draft ?? formatLayerThickness(metres, unit) })] }));
|
|
41
|
+
}
|
|
42
|
+
export function BuildUpReadout({ label, value }) {
|
|
43
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-2 px-2 py-1", children: [_jsx("span", { className: "font-medium text-[10px] text-muted-foreground uppercase tracking-wider", children: label }), _jsx("span", { className: "truncate text-[11px] text-muted-foreground tabular-nums", children: value })] }));
|
|
44
|
+
}
|
|
45
|
+
/** A spacing on centre, as the viewer's unit names it: `16" o.c.` or `406 mm o.c.`. */
|
|
46
|
+
export function formatSpacing(metres, unit, i18n) {
|
|
47
|
+
const spacing = unit === 'imperial' ? formatLayerThickness(metres, unit) : `${Math.round(metres * 1000)} mm`;
|
|
48
|
+
return i18n._({
|
|
49
|
+
id: 'node.shared.buildUpControls.spacingOC',
|
|
50
|
+
message: '{spacing} o.c.',
|
|
51
|
+
comment: 'A framing spacing on centre (centre of one member to the next), e.g. 16" o.c.',
|
|
52
|
+
values: { spacing },
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export const NONE = 'none';
|
|
56
|
+
const INCH = 0.0254;
|
|
57
|
+
const NONE_LABEL = /* i18n */ {
|
|
58
|
+
id: 'node.shared.buildUpControls.none',
|
|
59
|
+
message: 'None',
|
|
60
|
+
};
|
|
61
|
+
/** What each panel, insulation and finish kind is called. */
|
|
62
|
+
export const LAYER_KIND_LABELS = {
|
|
63
|
+
osb: /* i18n */ { id: 'node.shared.buildUpControls.osb', message: 'OSB' },
|
|
64
|
+
plywood: /* i18n */ { id: 'node.shared.buildUpControls.plywood', message: 'Plywood' },
|
|
65
|
+
batt: /* i18n */ { id: 'node.shared.buildUpControls.batt', message: 'Batt' },
|
|
66
|
+
blown: /* i18n */ { id: 'node.shared.buildUpControls.blown', message: 'Blown' },
|
|
67
|
+
rigid: /* i18n */ { id: 'node.shared.buildUpControls.rigidBoard', message: 'Rigid board' },
|
|
68
|
+
drywall: /* i18n */ { id: 'node.shared.buildUpControls.drywall', message: 'Drywall' },
|
|
69
|
+
plaster: /* i18n */ { id: 'node.shared.buildUpControls.plaster', message: 'Plaster' },
|
|
70
|
+
'wood-plank': /* i18n */ { id: 'node.shared.buildUpControls.woodPlank', message: 'Wood plank' },
|
|
71
|
+
};
|
|
72
|
+
const PANEL_OPTIONS = [
|
|
73
|
+
{ label: LAYER_KIND_LABELS.osb, value: 'osb' },
|
|
74
|
+
{ label: LAYER_KIND_LABELS.plywood, value: 'plywood' },
|
|
75
|
+
];
|
|
76
|
+
const OPTIONAL_PANEL_OPTIONS = [
|
|
77
|
+
{ label: NONE_LABEL, value: NONE },
|
|
78
|
+
...PANEL_OPTIONS,
|
|
79
|
+
];
|
|
80
|
+
const LUMBER_OPTIONS = Object.keys(LUMBER_DEPTH).map((size) => ({ label: size, value: size }));
|
|
81
|
+
const INSULATION_OPTIONS = [
|
|
82
|
+
{ label: NONE_LABEL, value: NONE },
|
|
83
|
+
{ label: LAYER_KIND_LABELS.batt, value: 'batt' },
|
|
84
|
+
{ label: LAYER_KIND_LABELS.blown, value: 'blown' },
|
|
85
|
+
{ label: LAYER_KIND_LABELS.rigid, value: 'rigid' },
|
|
86
|
+
];
|
|
87
|
+
const FINISH_OPTIONS = [
|
|
88
|
+
{ label: NONE_LABEL, value: NONE },
|
|
89
|
+
{ label: LAYER_KIND_LABELS.drywall, value: 'drywall' },
|
|
90
|
+
{ label: LAYER_KIND_LABELS.plaster, value: 'plaster' },
|
|
91
|
+
{ label: LAYER_KIND_LABELS['wood-plank'], value: 'wood-plank' },
|
|
92
|
+
];
|
|
93
|
+
const FINISH_THICKNESS = {
|
|
94
|
+
drywall: DRYWALL_THICKNESSES[0],
|
|
95
|
+
plaster: PLASTER_THICKNESS,
|
|
96
|
+
'wood-plank': WOOD_PLANK_THICKNESS,
|
|
97
|
+
};
|
|
98
|
+
/** `base` with `change` applied and no longer a preset; a layer set to `undefined` goes. */
|
|
99
|
+
export function editedBuildUp(base, change) {
|
|
100
|
+
const next = { ...base, ...change };
|
|
101
|
+
delete next.presetId;
|
|
102
|
+
for (const field of Object.keys(next))
|
|
103
|
+
if (next[field] === undefined)
|
|
104
|
+
delete next[field];
|
|
105
|
+
return next;
|
|
106
|
+
}
|
|
107
|
+
export function FramingSizeFields({ framing, onChange, sizeLabel, unit, }) {
|
|
108
|
+
const i18n = usePascalI18n();
|
|
109
|
+
return (_jsxs(_Fragment, { children: [_jsx(SelectControl, { label: sizeLabel, onChange: (size) => onChange({ size }), options: LUMBER_OPTIONS, value: framing.size }), _jsx(SizeSelect, { format: (value) => formatSpacing(value, unit, i18n), label: i18n._({ id: 'node.shared.buildUpControls.spacing', message: 'Spacing' }), onChange: (spacing) => onChange({ spacing }), sizes: FRAMING_SPACINGS, value: framing.spacing })] }));
|
|
110
|
+
}
|
|
111
|
+
/** A structural panel; with `optional`, None takes it out and a new one is `added`. */
|
|
112
|
+
export function PanelFields({ added = PANEL_THICKNESSES[0], label, layer, onChange, optional = false, unit, }) {
|
|
113
|
+
const i18n = usePascalI18n();
|
|
114
|
+
return (_jsxs(_Fragment, { children: [_jsx(SelectControl, { label: label, onChange: (kind) => onChange(kind === NONE ? undefined : { thickness: layer?.thickness ?? added, kind }), options: (optional ? OPTIONAL_PANEL_OPTIONS : PANEL_OPTIONS).map((option) => ({
|
|
115
|
+
...option,
|
|
116
|
+
label: i18n._(option.label),
|
|
117
|
+
})), value: layer?.kind ?? NONE }), layer && (_jsx(SizeSelect, { format: (value) => formatLayerThickness(value, unit), label: i18n._({
|
|
118
|
+
id: 'node.shared.buildUpControls.labelThickness',
|
|
119
|
+
message: '{label} thickness',
|
|
120
|
+
values: { label },
|
|
121
|
+
}), onChange: (thickness) => onChange({ ...layer, thickness }), sizes: PANEL_THICKNESSES, value: layer.thickness }))] }));
|
|
122
|
+
}
|
|
123
|
+
/** A new insulation layer is cavity fill as deep as the framing, or 2 in of rigid board. */
|
|
124
|
+
export function InsulationFields({ framingDepth, layer, onChange, unit, }) {
|
|
125
|
+
const i18n = usePascalI18n();
|
|
126
|
+
return (_jsxs(_Fragment, { children: [_jsx(SelectControl, { label: i18n._({ id: 'node.shared.buildUpControls.insulation', message: 'Insulation' }), onChange: (kind) => onChange(kind === NONE
|
|
127
|
+
? undefined
|
|
128
|
+
: { kind, thickness: kind === 'rigid' ? 2 * INCH : framingDepth }), options: INSULATION_OPTIONS.map((option) => ({ ...option, label: i18n._(option.label) })), value: layer?.kind ?? NONE }), layer && (_jsx(ThicknessField, { label: i18n._({
|
|
129
|
+
id: 'node.shared.buildUpControls.insulationThickness',
|
|
130
|
+
message: 'Insulation thickness',
|
|
131
|
+
}), metres: layer.thickness, onCommit: (thickness) => onChange({ ...layer, thickness }), unit: unit }))] }));
|
|
132
|
+
}
|
|
133
|
+
export function FinishFields({ label, layer, onChange, unit, }) {
|
|
134
|
+
const i18n = usePascalI18n();
|
|
135
|
+
return (_jsxs(_Fragment, { children: [_jsx(SelectControl, { label: label, onChange: (kind) => onChange(kind === NONE ? undefined : { kind, thickness: FINISH_THICKNESS[kind] }), options: FINISH_OPTIONS.map((option) => ({ ...option, label: i18n._(option.label) })), value: layer?.kind ?? NONE }), layer?.kind === 'drywall' && (_jsx(SizeSelect, { format: (value) => formatLayerThickness(value, unit), label: i18n._({
|
|
136
|
+
id: 'node.shared.buildUpControls.drywallThickness',
|
|
137
|
+
message: 'Drywall thickness',
|
|
138
|
+
}), onChange: (thickness) => onChange({ kind: 'drywall', thickness }), sizes: DRYWALL_THICKNESSES, value: layer.thickness }))] }));
|
|
139
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curtain-opening-limits.d.ts","sourceRoot":"","sources":["../../src/shared/curtain-opening-limits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"curtain-opening-limits.d.ts","sourceRoot":"","sources":["../../src/shared/curtain-opening-limits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,QAAQ,EAKb,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAIzB,KAAK,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEpC,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAC3C,IAAI,EAAE,GAAG,GAAG,GAAG,EACf,IAAI,EAAE,MAAM,sBAuBb;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;;;;;;;SA0B5C;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,OAAO,EACvD,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAC1C,OAAO,CAAC,CAAC,CAAC,CAyDZ"}
|
|
@@ -1,21 +1,30 @@
|
|
|
1
|
-
import { getCurtainWallConfig, getWallCurveLength, } from '@pascal-app/core';
|
|
1
|
+
import { getCurtainWallConfig, getDoorOpeningSize, getWallCurveLength, openingHostFacing, } from '@pascal-app/core';
|
|
2
|
+
import { clampDoorToWall } from '@pascal-app/core/building';
|
|
2
3
|
import { resolveWallOpeningCeiling } from './wall-opening-ceiling.js';
|
|
3
4
|
export function curtainOpeningResizeMax(opening, nodes, axis, sign) {
|
|
4
5
|
const limits = curtainOpeningLimits(opening, nodes);
|
|
5
6
|
if (!limits)
|
|
6
7
|
return undefined;
|
|
8
|
+
const size = getDoorOpeningSize(opening);
|
|
9
|
+
const extraWidth = size.width - opening.width;
|
|
10
|
+
const extraHeight = size.height - opening.height;
|
|
11
|
+
const centerX = opening.position[0] - size.leafOffsetX * openingHostFacing(opening);
|
|
7
12
|
if (axis === 'y') {
|
|
8
|
-
const anchor = opening.position[1] - (sign *
|
|
9
|
-
return Math.max(0, sign > 0 ? limits.top - anchor : anchor - limits.bottom);
|
|
13
|
+
const anchor = opening.position[1] + extraHeight / 2 - (sign * size.height) / 2;
|
|
14
|
+
return Math.max(0, sign > 0 ? limits.top - anchor - extraHeight : anchor - limits.bottom - extraHeight);
|
|
10
15
|
}
|
|
11
16
|
const direction = Math.cos(opening.rotation[1]) >= 0 ? sign : -sign;
|
|
12
|
-
const anchor =
|
|
13
|
-
return Math.max(0, direction > 0
|
|
17
|
+
const anchor = centerX - (direction * size.width) / 2;
|
|
18
|
+
return Math.max(0, direction > 0
|
|
19
|
+
? limits.length - limits.margin - anchor - extraWidth
|
|
20
|
+
: anchor - limits.margin - extraWidth);
|
|
14
21
|
}
|
|
15
22
|
export function curtainOpeningLimits(opening, nodes) {
|
|
16
23
|
const wall = nodes[(opening.parentId ?? opening.wallId)];
|
|
17
24
|
if (wall?.type !== 'wall' || wall.wallType !== 'curtain')
|
|
18
25
|
return null;
|
|
26
|
+
const size = getDoorOpeningSize(opening);
|
|
27
|
+
const centerX = opening.position[0] - size.leafOffsetX * openingHostFacing(opening);
|
|
19
28
|
const margin = getCurtainWallConfig(wall).perimeterWidth;
|
|
20
29
|
const length = getWallCurveLength(wall);
|
|
21
30
|
const top = resolveWallOpeningCeiling(wall, nodes) - margin;
|
|
@@ -25,29 +34,50 @@ export function curtainOpeningLimits(opening, nodes) {
|
|
|
25
34
|
length,
|
|
26
35
|
top,
|
|
27
36
|
bottom,
|
|
28
|
-
width: Math.max(0, 2 * Math.min(
|
|
37
|
+
width: Math.max(0, 2 * Math.min(centerX - margin, length - margin - centerX) - (size.width - opening.width)),
|
|
29
38
|
height: Math.max(0, opening.type === 'door'
|
|
30
|
-
? top
|
|
39
|
+
? top - (size.height - opening.height)
|
|
31
40
|
: 2 * Math.min(opening.position[1] - bottom, top - opening.position[1])),
|
|
32
41
|
};
|
|
33
42
|
}
|
|
34
43
|
export function constrainCurtainOpening(opening, patch, nodes) {
|
|
35
|
-
|
|
36
|
-
|
|
44
|
+
let next = { ...opening, ...patch };
|
|
45
|
+
const wall = nodes[(next.parentId ?? next.wallId)];
|
|
46
|
+
if (next.type === 'door' &&
|
|
47
|
+
wall?.type === 'wall' &&
|
|
48
|
+
'transomHeight' in next &&
|
|
49
|
+
next.transomHeight) {
|
|
50
|
+
const { transomHeight } = clampDoorToWall(wall, next.position[0], next.width, next.height, next, nodes);
|
|
51
|
+
if (transomHeight !== undefined && transomHeight !== next.transomHeight) {
|
|
52
|
+
patch = { ...patch, transomHeight };
|
|
53
|
+
next = { ...opening, ...patch };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const limits = curtainOpeningLimits(next, nodes);
|
|
57
|
+
if (!limits ||
|
|
58
|
+
!('width' in patch ||
|
|
59
|
+
'height' in patch ||
|
|
60
|
+
'position' in patch ||
|
|
61
|
+
'sidelightLeft' in patch ||
|
|
62
|
+
'sidelightRight' in patch ||
|
|
63
|
+
'transomHeight' in patch))
|
|
37
64
|
return patch;
|
|
38
|
-
const
|
|
65
|
+
const size = getDoorOpeningSize(next);
|
|
66
|
+
const extraWidth = size.width - next.width;
|
|
67
|
+
const extraHeight = size.height - next.height;
|
|
68
|
+
const offset = size.leafOffsetX * openingHostFacing(next);
|
|
39
69
|
const moving = patch.position !== undefined && patch.width === undefined && patch.height === undefined;
|
|
40
|
-
const availableWidth = Math.max(0, limits.length - 2 * limits.margin);
|
|
41
|
-
const availableHeight = Math.max(0, limits.top - limits.bottom);
|
|
70
|
+
const availableWidth = Math.max(0, limits.length - 2 * limits.margin - extraWidth);
|
|
71
|
+
const availableHeight = Math.max(0, limits.top - limits.bottom - extraHeight);
|
|
42
72
|
const widthLimit = moving || limits.width < 0.01 ? availableWidth : limits.width;
|
|
43
73
|
const heightLimit = moving || limits.height < 0.01 ? availableHeight : limits.height;
|
|
44
74
|
const width = Math.min(Math.max(0.01, next.width), widthLimit);
|
|
45
75
|
const height = Math.min(Math.max(0.01, next.height), heightLimit);
|
|
46
76
|
if (width < 0.01 || height < 0.01)
|
|
47
77
|
return {};
|
|
48
|
-
const x = Math.max(limits.margin + width / 2, Math.min(limits.length - limits.margin - width / 2, next.position[0]));
|
|
78
|
+
const x = Math.max(limits.margin + (width + extraWidth) / 2, Math.min(limits.length - limits.margin - (width + extraWidth) / 2, next.position[0] - offset));
|
|
49
79
|
const y = opening.type === 'door'
|
|
50
80
|
? height / 2
|
|
51
81
|
: Math.max(limits.bottom + height / 2, Math.min(limits.top - height / 2, next.position[1]));
|
|
52
|
-
return { ...patch, width, height, position: [x, y, next.position[2]] };
|
|
82
|
+
return { ...patch, width, height, position: [x + offset, y, next.position[2]] };
|
|
53
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-interaction-actions.d.ts","sourceRoot":"","sources":["../../src/shared/item-interaction-actions.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"item-interaction-actions.d.ts","sourceRoot":"","sources":["../../src/shared/item-interaction-actions.tsx"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,uCAiC7C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { nodeMechanism, useInteractive, useScene } from '@pascal-app/core';
|
|
3
|
+
import { nodeMechanism, useInteractive, usePascalI18n, useScene, } from '@pascal-app/core';
|
|
4
4
|
import { ActionMenuButton } from '@pascal-app/editor';
|
|
5
5
|
import { useViewer } from '@pascal-app/viewer';
|
|
6
6
|
import { Lightbulb, LightbulbOff } from 'lucide-react';
|
|
@@ -10,6 +10,7 @@ import { itemHasLights, itemLightsOn, toggleItemLights } from './item-interactio
|
|
|
10
10
|
* comes from the action menu's `capabilities.mechanism` button.
|
|
11
11
|
*/
|
|
12
12
|
export default function ItemInteractionActions() {
|
|
13
|
+
const i18n = usePascalI18n();
|
|
13
14
|
const selected = useViewer((s) => s.selection.selectedIds);
|
|
14
15
|
const node = useScene((s) => selected.length === 1 ? s.nodes[selected[0]] : undefined);
|
|
15
16
|
const hasLights = itemHasLights(node);
|
|
@@ -20,7 +21,15 @@ export default function ItemInteractionActions() {
|
|
|
20
21
|
// E runs the mechanism when there is one, and only otherwise the light.
|
|
21
22
|
, {
|
|
22
23
|
// E runs the mechanism when there is one, and only otherwise the light.
|
|
23
|
-
keys: nodeMechanism(node) ? undefined : ['E'], label: lit
|
|
24
|
+
keys: nodeMechanism(node) ? undefined : ['E'], label: lit
|
|
25
|
+
? i18n._({
|
|
26
|
+
id: 'node.shared.itemInteractionActions.turnLightOff',
|
|
27
|
+
message: 'Turn light off',
|
|
28
|
+
})
|
|
29
|
+
: i18n._({
|
|
30
|
+
id: 'node.shared.itemInteractionActions.turnLightOn',
|
|
31
|
+
message: 'Turn light on',
|
|
32
|
+
}), onClick: (event) => {
|
|
24
33
|
event.stopPropagation();
|
|
25
34
|
toggleItemLights(node);
|
|
26
35
|
}, pressed: lit, children: lit ? _jsx(Lightbulb, { className: "h-4 w-4" }) : _jsx(LightbulbOff, { className: "h-4 w-4" }) }));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-thickness.d.ts","sourceRoot":"","sources":["../../src/shared/layer-thickness.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"move-roof-tool.d.ts","sourceRoot":"","sources":["../../src/shared/move-roof-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,QAAQ,EACb,KAAK,eAAe,EAIpB,KAAK,SAAS,EACd,KAAK,gBAAgB,EAQtB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"move-roof-tool.d.ts","sourceRoot":"","sources":["../../src/shared/move-roof-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,QAAQ,EACb,KAAK,eAAe,EAIpB,KAAK,SAAS,EACd,KAAK,gBAAgB,EAQtB,MAAM,kBAAkB,CAAA;AAmEzB,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAClC,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,GAAG,gBAAgB,CAAA;CAChE,CA8sBA,CAAA;eAEc,YAAY"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { collectAlignmentAnchors, emitter, movingAlignmentAnchors, nodeRegistry, resolveAlignment, resolveStairSurfaceSnap, resolveSupportSlabPatch, sceneRegistry, seatRoofs, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
3
|
-
import { CursorSphere, commitFreshPlacementSubtree, consumePlacementDragRelease, DragBoundingBox, getFloorStackPreviewPosition, isMagneticSnapActive, isTypingTarget, resolvePlanarCursorPosition, selectPlacedNode, stripPlacementMetadataFlags, triggerSFX, useAlignmentGuides, useEditor, useFreshPlacementVisibility, } from '@pascal-app/editor';
|
|
3
|
+
import { CursorSphere, commitFreshPlacementSubtree, consumePlacementDragRelease, DragBoundingBox, getFloorStackPreviewPosition, isGridSnapActive, isMagneticSnapActive, isTypingTarget, resolvePlanarCursorPosition, selectPlacedNode, stripPlacementMetadataFlags, triggerSFX, useAlignmentGuides, useEditor, useFreshPlacementVisibility, } from '@pascal-app/editor';
|
|
4
4
|
import { useViewer } from '@pascal-app/viewer';
|
|
5
5
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
6
6
|
import * as THREE from 'three';
|
|
7
7
|
import { snapFenceDraftPoint } from '../fence/drafting.js';
|
|
8
|
+
import { bearingWallThickness, catchRoofOnWalls, placeRoofOnWalls, roofCatchWalls, segmentWallLine, } from '../roof/wall-catch.js';
|
|
8
9
|
import { clearStairMovePreview, publishStairMovePreview } from '../stair/surface-move-preview.js';
|
|
9
10
|
/** Figma-style alignment-snap threshold (meters), matching the other tools. */
|
|
10
11
|
const ALIGNMENT_THRESHOLD_M = 0.08;
|
|
@@ -185,6 +186,74 @@ export const MoveRoofTool = ({ node: sourceNode }) => {
|
|
|
185
186
|
useAlignmentGuides.getState().set(ar.guides);
|
|
186
187
|
return ar.snap && isMagneticSnapActive() ? [lx + ar.snap.dx, lz + ar.snap.dz] : [lx, lz];
|
|
187
188
|
};
|
|
189
|
+
// A roof's wall line lands on the walls under it, as in the plan's segment move
|
|
190
|
+
// (`catchRoofOnWalls`); that catch replaces the cursor's own snap onto a wall.
|
|
191
|
+
const catchesWalls = movingNode.type === 'roof' || movingNode.type === 'roof-segment';
|
|
192
|
+
const catchWalls = catchesWalls ? roofCatchWalls(useScene.getState().nodes, levelId) : [];
|
|
193
|
+
let rawAnchor = null;
|
|
194
|
+
const catchOnWalls = (raw, snapped) => {
|
|
195
|
+
const nodes = useScene.getState().nodes;
|
|
196
|
+
const roof = movingNode.type === 'roof'
|
|
197
|
+
? movingNode
|
|
198
|
+
: nodes[movingNode.parentId];
|
|
199
|
+
if (roof?.type !== 'roof' || catchWalls.length === 0)
|
|
200
|
+
return null;
|
|
201
|
+
// A segment's place is in its roof's frame; the walls are in the level's plan.
|
|
202
|
+
const cos = Math.cos(-roof.rotation);
|
|
203
|
+
const sin = Math.sin(-roof.rotation);
|
|
204
|
+
const toPlan = ([x, z]) => movingNode.type === 'roof'
|
|
205
|
+
? [x, z]
|
|
206
|
+
: [roof.position[0] + x * cos - z * sin, roof.position[2] + x * sin + z * cos];
|
|
207
|
+
const fromPlan = ([x, z]) => {
|
|
208
|
+
if (movingNode.type === 'roof')
|
|
209
|
+
return [x, z];
|
|
210
|
+
const dx = x - roof.position[0];
|
|
211
|
+
const dz = z - roof.position[2];
|
|
212
|
+
return [dx * cos + dz * sin, -dx * sin + dz * cos];
|
|
213
|
+
};
|
|
214
|
+
const lines = movingNode.type === 'roof'
|
|
215
|
+
? roof.children
|
|
216
|
+
.map((id) => nodes[id])
|
|
217
|
+
.filter((child) => child?.type === 'roof-segment')
|
|
218
|
+
.map((segment) => segmentWallLine({ position: [raw[0], 0, raw[1]], rotation: pendingRotation }, segment))
|
|
219
|
+
: movingNode.type === 'roof-segment'
|
|
220
|
+
? [
|
|
221
|
+
segmentWallLine(roof, {
|
|
222
|
+
...movingNode,
|
|
223
|
+
position: [raw[0], 0, raw[1]],
|
|
224
|
+
rotation: pendingRotation,
|
|
225
|
+
}),
|
|
226
|
+
]
|
|
227
|
+
: [];
|
|
228
|
+
const angle = movingNode.type === 'roof' ? -pendingRotation : -(roof.rotation + pendingRotation);
|
|
229
|
+
const caught = catchRoofOnWalls({ lines, walls: catchWalls, angle });
|
|
230
|
+
if (!(caught.u || caught.v))
|
|
231
|
+
return null;
|
|
232
|
+
return fromPlan(placeRoofOnWalls(toPlan(raw), toPlan(snapped), caught, angle));
|
|
233
|
+
};
|
|
234
|
+
// Dropped onto the walls under it, a roof's segments take their thickness for their gable
|
|
235
|
+
// and heel walls.
|
|
236
|
+
const bearingThicknesses = (position, rotation) => {
|
|
237
|
+
const nodes = useScene.getState().nodes;
|
|
238
|
+
const roof = movingNode.type === 'roof'
|
|
239
|
+
? { ...movingNode, position, rotation }
|
|
240
|
+
: nodes[movingNode.parentId];
|
|
241
|
+
if (roof?.type !== 'roof' || catchWalls.length === 0)
|
|
242
|
+
return [];
|
|
243
|
+
const segments = movingNode.type === 'roof'
|
|
244
|
+
? roof.children
|
|
245
|
+
.map((id) => nodes[id])
|
|
246
|
+
.filter((child) => child?.type === 'roof-segment')
|
|
247
|
+
: movingNode.type === 'roof-segment'
|
|
248
|
+
? [{ ...movingNode, position, rotation }]
|
|
249
|
+
: [];
|
|
250
|
+
return segments.flatMap((segment) => {
|
|
251
|
+
const thickness = bearingWallThickness(segmentWallLine(roof, segment), catchWalls);
|
|
252
|
+
return thickness === null || thickness === segment.wallThickness
|
|
253
|
+
? []
|
|
254
|
+
: [{ id: segment.id, data: { wallThickness: thickness } }];
|
|
255
|
+
});
|
|
256
|
+
};
|
|
188
257
|
const localToWorldPoint = (localPoint, y) => {
|
|
189
258
|
if (buildingObj) {
|
|
190
259
|
const worldPoint = buildingObj.localToWorld(new THREE.Vector3(localPoint[0], y, localPoint[1]));
|
|
@@ -236,9 +305,10 @@ export const MoveRoofTool = ({ node: sourceNode }) => {
|
|
|
236
305
|
revealFreshPlacement();
|
|
237
306
|
const y = event.position[1];
|
|
238
307
|
const roofBypassSnap = event.nativeEvent?.altKey === true;
|
|
308
|
+
const cursor = [event.localPosition[0], event.localPosition[2]];
|
|
239
309
|
const snappedLocal = snapFenceDraftPoint({
|
|
240
|
-
point:
|
|
241
|
-
walls: levelWalls,
|
|
310
|
+
point: cursor,
|
|
311
|
+
walls: catchesWalls ? [] : levelWalls,
|
|
242
312
|
fences: levelFences,
|
|
243
313
|
bypassSnap: roofBypassSnap,
|
|
244
314
|
magnetic: !roofBypassSnap && isMagneticSnapActive(),
|
|
@@ -253,7 +323,26 @@ export const MoveRoofTool = ({ node: sourceNode }) => {
|
|
|
253
323
|
});
|
|
254
324
|
dragAnchorRef.current = resolved.anchor;
|
|
255
325
|
let [localX, localZ] = resolved.point;
|
|
256
|
-
|
|
326
|
+
// The catch reads the unsnapped place, so the walls win over the grid near them.
|
|
327
|
+
let caught = null;
|
|
328
|
+
if (catchesWalls) {
|
|
329
|
+
const [cursorX, , cursorZ] = localToWorldPoint(cursor, y);
|
|
330
|
+
const raw = resolvePlanarCursorPosition({
|
|
331
|
+
cursor: computeLocal(cursorX, cursorZ, y, cursor[0], cursor[1]),
|
|
332
|
+
original: [movingNode.position[0], movingNode.position[2]],
|
|
333
|
+
anchor: rawAnchor,
|
|
334
|
+
mode: useAbsoluteCursorPlacement ? 'absolute' : 'relative',
|
|
335
|
+
});
|
|
336
|
+
rawAnchor = raw.anchor;
|
|
337
|
+
if (!roofBypassSnap && (isGridSnapActive() || isMagneticSnapActive()))
|
|
338
|
+
caught = catchOnWalls(raw.point, [localX, localZ]);
|
|
339
|
+
}
|
|
340
|
+
if (caught) {
|
|
341
|
+
;
|
|
342
|
+
[localX, localZ] = caught;
|
|
343
|
+
useAlignmentGuides.getState().clear();
|
|
344
|
+
}
|
|
345
|
+
else if (alignTopLevel) {
|
|
257
346
|
const aligned = alignLocalPoint(localX, localZ, event.nativeEvent?.altKey === true);
|
|
258
347
|
localX = aligned[0];
|
|
259
348
|
localZ = aligned[1];
|
|
@@ -382,7 +471,13 @@ export const MoveRoofTool = ({ node: sourceNode }) => {
|
|
|
382
471
|
if (movingNode.type === 'roof' || movingNode.type === 'roof-segment') {
|
|
383
472
|
// Moved or turned onto the walls that carry it, a roof goes to the level above them.
|
|
384
473
|
const scene = useScene.getState();
|
|
385
|
-
|
|
474
|
+
const thicknesses = bearingThicknesses(position, pendingRotation);
|
|
475
|
+
const own = thicknesses.find(({ id }) => id === movingNode.id)?.data;
|
|
476
|
+
const update = [
|
|
477
|
+
{ id: movingNode.id, data: { ...patch, ...own } },
|
|
478
|
+
...thicknesses.filter(({ id }) => id !== movingNode.id),
|
|
479
|
+
];
|
|
480
|
+
scene.applyNodeChanges(seatRoofs(scene.nodes, { update }).changes);
|
|
386
481
|
}
|
|
387
482
|
else {
|
|
388
483
|
useScene.getState().updateNodes([
|
|
@@ -9,4 +9,6 @@ export declare const doorBatchable: BatchableConfig;
|
|
|
9
9
|
export declare const windowBatchable: BatchableConfig;
|
|
10
10
|
/** Imported meshes and blocks build their own geometry per node, rebuilt in place. */
|
|
11
11
|
export declare const perNodeGeometryBatchable: BatchableConfig;
|
|
12
|
+
/** Parametric furniture that changes only through edits (shelves): its meshes hold still between marks. */
|
|
13
|
+
export declare const staticBatchable: BatchableConfig;
|
|
12
14
|
//# sourceMappingURL=batchable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchable.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/batchable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAA;AAEzB,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,SAAU,OAAO,aAAa,MAAM,WAA8B,CAAA;AAE/F,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,EAAE,eAI9B,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,eAgB3B,CAAA;AAMD,eAAO,MAAM,aAAa,EAAE,eAI3B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAA;AAED,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAA"}
|
|
1
|
+
{"version":3,"file":"batchable.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/batchable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAA;AAEzB,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,SAAU,OAAO,aAAa,MAAM,WAA8B,CAAA;AAE/F,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,EAAE,eAI9B,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,eAgB3B,CAAA;AAMD,eAAO,MAAM,aAAa,EAAE,eAI3B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAA;AAED,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAA;AAED,2GAA2G;AAC3G,eAAO,MAAM,eAAe,EAAE,eAE7B,CAAA"}
|
|
@@ -41,3 +41,7 @@ export const perNodeGeometryBatchable = {
|
|
|
41
41
|
scope: 'level',
|
|
42
42
|
batchKey: nodeMeshBatchKey,
|
|
43
43
|
};
|
|
44
|
+
/** Parametric furniture that changes only through edits (shelves): its meshes hold still between marks. */
|
|
45
|
+
export const staticBatchable = {
|
|
46
|
+
scope: 'level',
|
|
47
|
+
};
|
|
@@ -6,8 +6,23 @@ import type { BatchCandidate } from './types.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export declare function batchableKinds(): ReadonlyMap<string, BatchableConfig>;
|
|
8
8
|
export declare function batchableConfig(node: AnyNode | undefined): BatchableConfig | undefined;
|
|
9
|
-
/**
|
|
10
|
-
|
|
9
|
+
/**
|
|
10
|
+
* The node's hosts between it and its level, nearest first, or null when the
|
|
11
|
+
* chain does not reach a level or a host is hidden — a hidden host hides its
|
|
12
|
+
* children through group visibility, while batch instances hang off the level
|
|
13
|
+
* root and would keep drawing them — or a host draws itself because it moves
|
|
14
|
+
* (an animating item, a door mid-swing): what it carries moves with it. A host's edits, gestures and tint release
|
|
15
|
+
* the nodes it carries ({@link hostsBusy}), so a batched copy never stays
|
|
16
|
+
* behind when the host moves.
|
|
17
|
+
*/
|
|
18
|
+
export declare function hostChain(node: AnyNode, nodes: Record<string, AnyNode | undefined>): {
|
|
19
|
+
levelId: string;
|
|
20
|
+
hosts: AnyNode[];
|
|
21
|
+
} | null;
|
|
22
|
+
/** Whether any host of `nodeId` (not the node itself) satisfies `busy`. */
|
|
23
|
+
export declare function hostsBusy(nodeId: string, nodes: Record<string, AnyNode | undefined>, busy: (hostId: string) => boolean): boolean;
|
|
24
|
+
/** Adds every batchable node carried by `nodeId` (its descendants, at any depth) to `out`. */
|
|
25
|
+
export declare function addBatchableDescendants(nodeId: string, nodes: Record<string, AnyNode | undefined>, out: Set<string>): void;
|
|
11
26
|
export declare function collectBatchCandidate(nodeId: string): BatchCandidate | null;
|
|
12
27
|
export declare function hideBatchedNode(candidate: BatchCandidate): void;
|
|
13
28
|
/**
|
|
@@ -22,9 +37,10 @@ export declare function hideBatchedNode(candidate: BatchCandidate): void;
|
|
|
22
37
|
export declare function revealAllBatchedHolds(): void;
|
|
23
38
|
export declare function revealBatchedNode(nodeId: string): void;
|
|
24
39
|
/**
|
|
25
|
-
* Nodes the viewer is lighting up — plus
|
|
26
|
-
*
|
|
27
|
-
* overrides, and a batched copy would
|
|
40
|
+
* Nodes the viewer is lighting up — plus nodes whose host is lit or
|
|
41
|
+
* mid-gesture: a dragged wall carries its doors, a moved cabinet run its
|
|
42
|
+
* modules, through live overrides and transforms, and a batched copy would
|
|
43
|
+
* stay behind until commit.
|
|
28
44
|
*/
|
|
29
45
|
export declare function collectTintedNodes(nodeIds: ReadonlySet<string>): Set<string>;
|
|
30
46
|
export declare function getBatchableNodeIds(): ReadonlySet<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/candidates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,eAAe,EAOrB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAWzD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAYrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAEtF;
|
|
1
|
+
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/candidates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,eAAe,EAOrB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAWzD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAYrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAEtF;AAgCD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,GACzC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,IAAI,CAiB9C;AAkBD,2EAA2E;AAC3E,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,EAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAChC,OAAO,CAOT;AAED,8FAA8F;AAC9F,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC,EAC1C,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GACf,IAAI,CAQN;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA+E3E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAI/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAqB5E;AAED,wBAAgB,mBAAmB,IAAI,WAAW,CAAC,MAAM,CAAC,CAOzD"}
|