@pascal-app/nodes 1.0.3 → 1.0.4
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/dist/block/definition.d.ts.map +1 -1
- package/dist/block/definition.js +18 -3
- package/dist/block/floorplan.d.ts +11 -1
- package/dist/block/floorplan.d.ts.map +1 -1
- package/dist/block/floorplan.js +81 -13
- package/dist/block/geometry.d.ts +2 -2
- package/dist/block/geometry.d.ts.map +1 -1
- package/dist/block/geometry.js +39 -24
- package/dist/block/hosted-edit.d.ts.map +1 -1
- package/dist/block/hosted-edit.js +25 -0
- package/dist/block/material-slots.d.ts +1 -3
- package/dist/block/material-slots.d.ts.map +1 -1
- package/dist/block/material-slots.js +1 -11
- package/dist/block/paint.d.ts.map +1 -1
- package/dist/block/paint.js +4 -10
- package/dist/block/panel.d.ts.map +1 -1
- package/dist/block/panel.js +8 -3
- package/dist/block/selection.d.ts.map +1 -1
- package/dist/block/selection.js +2 -2
- package/dist/box-vent/definition.d.ts.map +1 -1
- package/dist/box-vent/definition.js +2 -5
- package/dist/box-vent/panel.d.ts.map +1 -1
- package/dist/box-vent/panel.js +5 -28
- package/dist/cabinet/countertop-layout.d.ts +13 -2
- package/dist/cabinet/countertop-layout.d.ts.map +1 -1
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +1 -2
- package/dist/cabinet/floorplan.d.ts.map +1 -1
- package/dist/cabinet/floorplan.js +125 -28
- package/dist/cabinet/geometry/shared.d.ts +1 -2
- package/dist/cabinet/geometry/shared.d.ts.map +1 -1
- package/dist/cabinet/geometry/shared.js +1 -2
- package/dist/cabinet/run-layout.d.ts.map +1 -1
- package/dist/cabinet/run-layout.js +8 -5
- package/dist/cabinet/run-ops.d.ts +13 -2
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +22 -24
- package/dist/cabinet/wall-snap.d.ts.map +1 -1
- package/dist/cabinet/wall-snap.js +8 -8
- package/dist/ceiling/boundary-editor.d.ts.map +1 -1
- package/dist/ceiling/boundary-editor.js +5 -3
- package/dist/ceiling/definition.d.ts +4 -4
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +15 -15
- package/dist/ceiling/floorplan-affordances.d.ts +84 -4
- package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
- package/dist/ceiling/floorplan-affordances.js +0 -1
- package/dist/ceiling/floorplan-move.d.ts.map +1 -1
- package/dist/ceiling/floorplan-move.js +0 -1
- package/dist/ceiling/floorplan.d.ts +1 -1
- package/dist/ceiling/floorplan.d.ts.map +1 -1
- package/dist/ceiling/floorplan.js +2 -1
- package/dist/ceiling/height-bounds.d.ts +19 -0
- package/dist/ceiling/height-bounds.d.ts.map +1 -0
- package/dist/ceiling/height-bounds.js +24 -0
- package/dist/ceiling/hole-editor.d.ts.map +1 -1
- package/dist/ceiling/hole-editor.js +3 -4
- package/dist/ceiling/materials.d.ts +1 -1
- package/dist/ceiling/materials.d.ts.map +1 -1
- package/dist/ceiling/materials.js +10 -3
- package/dist/ceiling/paint.d.ts +2 -8
- package/dist/ceiling/paint.d.ts.map +1 -1
- package/dist/ceiling/paint.js +121 -24
- package/dist/ceiling/panel.d.ts.map +1 -1
- package/dist/ceiling/panel.js +40 -23
- package/dist/ceiling/renderer.d.ts.map +1 -1
- package/dist/ceiling/renderer.js +41 -5
- package/dist/chimney/move-tool.d.ts.map +1 -1
- package/dist/chimney/move-tool.js +8 -2
- package/dist/chimney/paint.d.ts.map +1 -1
- package/dist/chimney/paint.js +3 -10
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +24 -2
- package/dist/column/floorplan-affordances.d.ts.map +1 -1
- package/dist/column/floorplan-affordances.js +5 -0
- package/dist/column/floorplan.d.ts +1 -1
- package/dist/column/floorplan.d.ts.map +1 -1
- package/dist/column/floorplan.js +47 -2
- package/dist/column/hosted-resize.d.ts +101 -2
- package/dist/column/hosted-resize.d.ts.map +1 -1
- package/dist/column/panel.d.ts.map +1 -1
- package/dist/column/panel.js +147 -146
- package/dist/column/renderer.d.ts.map +1 -1
- package/dist/column/renderer.js +6 -4
- package/dist/column/surface.d.ts.map +1 -1
- package/dist/column/surface.js +7 -0
- package/dist/construction-dimension/floorplan.js +7 -3
- package/dist/cupola/definition.d.ts.map +1 -1
- package/dist/cupola/definition.js +2 -8
- package/dist/cupola/panel.d.ts.map +1 -1
- package/dist/cupola/panel.js +5 -23
- package/dist/door/definition.d.ts.map +1 -1
- package/dist/door/definition.js +12 -3
- package/dist/door/door-math.d.ts +5 -10
- package/dist/door/door-math.d.ts.map +1 -1
- package/dist/door/door-math.js +14 -15
- package/dist/door/floorplan-move.d.ts.map +1 -1
- package/dist/door/floorplan-move.js +3 -1
- package/dist/door/floorplan.d.ts.map +1 -1
- package/dist/door/floorplan.js +55 -21
- package/dist/door/mechanism.d.ts +4 -0
- package/dist/door/mechanism.d.ts.map +1 -0
- package/dist/door/mechanism.js +24 -0
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +72 -48
- package/dist/door/paint.d.ts.map +1 -1
- package/dist/door/paint.js +3 -0
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +34 -259
- package/dist/door/placement.d.ts +45 -0
- package/dist/door/placement.d.ts.map +1 -0
- package/dist/door/placement.js +51 -0
- package/dist/door/preview.d.ts.map +1 -1
- package/dist/door/preview.js +2 -0
- package/dist/door/renderer.d.ts.map +1 -1
- package/dist/door/renderer.js +3 -2
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +92 -21
- package/dist/dormer/csg-geometry.d.ts.map +1 -1
- package/dist/dormer/csg-geometry.js +2 -0
- package/dist/dormer/paint.d.ts.map +1 -1
- package/dist/dormer/paint.js +2 -5
- package/dist/dormer/panel.d.ts.map +1 -1
- package/dist/dormer/panel.js +4 -14
- package/dist/downspout/definition.d.ts.map +1 -1
- package/dist/downspout/definition.js +2 -2
- package/dist/duct-fitting/definition.d.ts.map +1 -1
- package/dist/duct-fitting/definition.js +2 -1
- package/dist/duct-fitting/geometry.d.ts.map +1 -1
- package/dist/duct-fitting/geometry.js +1 -1
- package/dist/duct-fitting/move-tool.d.ts.map +1 -1
- package/dist/duct-fitting/move-tool.js +8 -2
- package/dist/duct-segment/definition.d.ts.map +1 -1
- package/dist/duct-segment/definition.js +2 -2
- package/dist/duct-segment/geometry.d.ts.map +1 -1
- package/dist/duct-segment/geometry.js +1 -1
- package/dist/duct-segment/move-tool.d.ts.map +1 -1
- package/dist/duct-segment/move-tool.js +8 -2
- package/dist/elevator/definition.d.ts.map +1 -1
- package/dist/elevator/definition.js +1 -2
- package/dist/elevator/panel.d.ts.map +1 -1
- package/dist/elevator/panel.js +5 -27
- package/dist/elevator/parametrics.js +1 -1
- package/dist/elevator/renderer.d.ts.map +1 -1
- package/dist/elevator/renderer.js +3 -4
- package/dist/eyebrow-vent/definition.d.ts.map +1 -1
- package/dist/eyebrow-vent/definition.js +2 -5
- package/dist/eyebrow-vent/paint.d.ts.map +1 -1
- package/dist/eyebrow-vent/paint.js +3 -6
- package/dist/eyebrow-vent/panel.d.ts.map +1 -1
- package/dist/eyebrow-vent/panel.js +5 -23
- package/dist/fence/actions/move-endpoint.d.ts +1 -1
- package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
- package/dist/fence/actions/move-endpoint.js +2 -1
- package/dist/fence/definition.d.ts +2 -1
- package/dist/fence/definition.d.ts.map +1 -1
- package/dist/fence/definition.js +83 -28
- package/dist/fence/drafting.d.ts +36 -0
- package/dist/fence/drafting.d.ts.map +1 -0
- package/dist/fence/drafting.js +210 -0
- package/dist/fence/feature-tool.d.ts +4 -0
- package/dist/fence/feature-tool.d.ts.map +1 -0
- package/dist/fence/feature-tool.js +140 -0
- package/dist/fence/features.d.ts +2 -0
- package/dist/fence/features.d.ts.map +1 -0
- package/dist/fence/features.js +12 -0
- package/dist/fence/floorplan-affordances.d.ts.map +1 -1
- package/dist/fence/floorplan-affordances.js +2 -1
- package/dist/fence/floorplan.d.ts +2 -3
- package/dist/fence/floorplan.d.ts.map +1 -1
- package/dist/fence/floorplan.js +131 -71
- package/dist/fence/geometry-parts.d.ts +50 -0
- package/dist/fence/geometry-parts.d.ts.map +1 -0
- package/dist/fence/geometry-parts.js +1144 -0
- package/dist/fence/geometry.d.ts +2 -3
- package/dist/fence/geometry.d.ts.map +1 -1
- package/dist/fence/geometry.js +84 -7
- package/dist/fence/index.d.ts +1 -0
- package/dist/fence/index.d.ts.map +1 -1
- package/dist/fence/index.js +1 -0
- package/dist/fence/inspector-editors.d.ts +15 -0
- package/dist/fence/inspector-editors.d.ts.map +1 -1
- package/dist/fence/inspector-editors.js +128 -3
- package/dist/fence/lift.d.ts.map +1 -1
- package/dist/fence/lift.js +5 -2
- package/dist/fence/move-tool.js +2 -1
- package/dist/fence/panel-model.d.ts +4 -0
- package/dist/fence/panel-model.d.ts.map +1 -0
- package/dist/fence/panel-model.js +12 -0
- package/dist/fence/parametrics.d.ts +0 -12
- package/dist/fence/parametrics.d.ts.map +1 -1
- package/dist/fence/parametrics.js +185 -18
- package/dist/fence/system.d.ts.map +1 -1
- package/dist/fence/system.js +141 -31
- package/dist/fence/tool.d.ts.map +1 -1
- package/dist/fence/tool.js +256 -47
- package/dist/fence-feature/actions.d.ts +7 -0
- package/dist/fence-feature/actions.d.ts.map +1 -0
- package/dist/fence-feature/actions.js +26 -0
- package/dist/fence-feature/definition.d.ts +4 -0
- package/dist/fence-feature/definition.d.ts.map +1 -0
- package/dist/fence-feature/definition.js +112 -0
- package/dist/fence-feature/floorplan-affordances.d.ts +3 -0
- package/dist/fence-feature/floorplan-affordances.d.ts.map +1 -0
- package/dist/fence-feature/floorplan-affordances.js +37 -0
- package/dist/fence-feature/floorplan.d.ts +4 -0
- package/dist/fence-feature/floorplan.d.ts.map +1 -0
- package/dist/fence-feature/floorplan.js +120 -0
- package/dist/fence-feature/geometry.d.ts +5 -0
- package/dist/fence-feature/geometry.d.ts.map +1 -0
- package/dist/fence-feature/geometry.js +43 -0
- package/dist/fence-feature/handles.d.ts +5 -0
- package/dist/fence-feature/handles.d.ts.map +1 -0
- package/dist/fence-feature/handles.js +84 -0
- package/dist/fence-feature/inspector.d.ts +6 -0
- package/dist/fence-feature/inspector.d.ts.map +1 -0
- package/dist/fence-feature/inspector.js +214 -0
- package/dist/fence-feature/interaction.d.ts +3 -0
- package/dist/fence-feature/interaction.d.ts.map +1 -0
- package/dist/fence-feature/interaction.js +41 -0
- package/dist/fence-feature/move-session.d.ts +9 -0
- package/dist/fence-feature/move-session.d.ts.map +1 -0
- package/dist/fence-feature/move-session.js +48 -0
- package/dist/fence-feature/move-tool.d.ts +5 -0
- package/dist/fence-feature/move-tool.d.ts.map +1 -0
- package/dist/fence-feature/move-tool.js +58 -0
- package/dist/fence-feature/pick-target.d.ts +7 -0
- package/dist/fence-feature/pick-target.d.ts.map +1 -0
- package/dist/fence-feature/pick-target.js +52 -0
- package/dist/floor-opening/definition.d.ts +3 -0
- package/dist/floor-opening/definition.d.ts.map +1 -0
- package/dist/floor-opening/definition.js +41 -0
- package/dist/floor-opening/floorplan.d.ts +156 -0
- package/dist/floor-opening/floorplan.d.ts.map +1 -0
- package/dist/floor-opening/floorplan.js +63 -0
- package/dist/gutter/definition.d.ts.map +1 -1
- package/dist/gutter/definition.js +2 -2
- package/dist/imported-mesh/definition.d.ts.map +1 -1
- package/dist/imported-mesh/definition.js +2 -0
- package/dist/imported-mesh/geometry.d.ts +1 -1
- package/dist/imported-mesh/geometry.d.ts.map +1 -1
- package/dist/imported-mesh/geometry.js +40 -12
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -2
- package/dist/item/authored-face-host.d.ts +10 -0
- package/dist/item/authored-face-host.d.ts.map +1 -0
- package/dist/item/authored-face-host.js +87 -0
- package/dist/item/authored-params.d.ts +15 -0
- package/dist/item/authored-params.d.ts.map +1 -0
- package/dist/item/authored-params.js +72 -0
- package/dist/item/definition.d.ts +2 -2
- package/dist/item/definition.d.ts.map +1 -1
- package/dist/item/definition.js +33 -4
- package/dist/item/floorplan.d.ts +1 -1
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/floorplan.js +35 -5
- package/dist/item/index.d.ts +1 -0
- package/dist/item/index.d.ts.map +1 -1
- package/dist/item/index.js +1 -0
- package/dist/item/model-loader.d.ts +2 -0
- package/dist/item/model-loader.d.ts.map +1 -1
- package/dist/item/model-loader.js +55 -23
- package/dist/item/move-tool.js +4 -4
- package/dist/item/paint.d.ts.map +1 -1
- package/dist/item/paint.js +5 -24
- package/dist/item/panel.d.ts +1 -3
- package/dist/item/panel.d.ts.map +1 -1
- package/dist/item/panel.js +20 -24
- package/dist/item/placement-notice.d.ts +14 -0
- package/dist/item/placement-notice.d.ts.map +1 -0
- package/dist/item/placement-notice.js +38 -0
- package/dist/item/plan-symbols.d.ts +67 -0
- package/dist/item/plan-symbols.d.ts.map +1 -0
- package/dist/item/plan-symbols.js +407 -0
- package/dist/item/renderer.d.ts +10 -0
- package/dist/item/renderer.d.ts.map +1 -1
- package/dist/item/renderer.js +64 -38
- package/dist/item/script-param-defaults.d.ts +12 -0
- package/dist/item/script-param-defaults.d.ts.map +1 -0
- package/dist/item/script-param-defaults.js +34 -0
- package/dist/lean-to-extension/definition.d.ts.map +1 -1
- package/dist/lean-to-extension/definition.js +1 -2
- package/dist/lean-to-extension/geometry.d.ts.map +1 -1
- package/dist/lean-to-extension/geometry.js +1 -1
- package/dist/lean-to-extension/layout.d.ts.map +1 -1
- package/dist/lean-to-extension/layout.js +2 -3
- package/dist/lean-to-extension/placement-validation.d.ts.map +1 -1
- package/dist/lean-to-extension/placement-validation.js +5 -5
- package/dist/lean-to-extension/tool.d.ts.map +1 -1
- package/dist/lean-to-extension/tool.js +5 -5
- package/dist/lineset/move-tool.d.ts.map +1 -1
- package/dist/lineset/move-tool.js +8 -2
- package/dist/liquid-line/move-tool.d.ts.map +1 -1
- package/dist/liquid-line/move-tool.js +8 -2
- package/dist/measurement/definition.js +1 -1
- package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
- package/dist/pipe-fitting/move-tool.js +8 -2
- package/dist/pipe-segment/move-tool.d.ts.map +1 -1
- package/dist/pipe-segment/move-tool.js +8 -2
- package/dist/procedural-item/animation.d.ts +8 -0
- package/dist/procedural-item/animation.d.ts.map +1 -0
- package/dist/procedural-item/animation.js +116 -0
- package/dist/procedural-item/definition.d.ts.map +1 -1
- package/dist/procedural-item/definition.js +74 -8
- package/dist/procedural-item/geometry.d.ts +5 -1
- package/dist/procedural-item/geometry.d.ts.map +1 -1
- package/dist/procedural-item/geometry.js +239 -15
- package/dist/procedural-item/renderer.d.ts.map +1 -1
- package/dist/procedural-item/renderer.js +272 -23
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +5 -23
- package/dist/ridge-vent/renderer.d.ts.map +1 -1
- package/dist/ridge-vent/renderer.js +9 -8
- package/dist/roof/definition.d.ts.map +1 -1
- package/dist/roof/definition.js +4 -1
- package/dist/roof/floorplan.d.ts +8 -0
- package/dist/roof/floorplan.d.ts.map +1 -1
- package/dist/roof/floorplan.js +194 -18
- package/dist/roof/panel-model.d.ts.map +1 -1
- package/dist/roof/panel-model.js +10 -6
- package/dist/roof/panel.d.ts.map +1 -1
- package/dist/roof/panel.js +3 -10
- package/dist/roof/renderer.d.ts.map +1 -1
- package/dist/roof/renderer.js +5 -2
- package/dist/roof-segment/panel.d.ts.map +1 -1
- package/dist/roof-segment/panel.js +5 -24
- package/dist/roof-segment/renderer.d.ts.map +1 -1
- package/dist/roof-segment/renderer.js +17 -8
- package/dist/separator/definition.d.ts +3 -0
- package/dist/separator/definition.d.ts.map +1 -0
- package/dist/separator/definition.js +39 -0
- package/dist/separator/renderer.d.ts +5 -0
- package/dist/separator/renderer.d.ts.map +1 -0
- package/dist/separator/renderer.js +36 -0
- package/dist/shared/duct-body-paint.d.ts +0 -4
- package/dist/shared/duct-body-paint.d.ts.map +1 -1
- package/dist/shared/duct-body-paint.js +1 -5
- package/dist/shared/item-interaction-actions.d.ts +6 -0
- package/dist/shared/item-interaction-actions.d.ts.map +1 -0
- package/dist/shared/item-interaction-actions.js +27 -0
- package/dist/shared/item-interactions.d.ts +9 -0
- package/dist/shared/item-interactions.d.ts.map +1 -0
- package/dist/shared/item-interactions.js +74 -0
- package/dist/shared/item-light-placement.d.ts +2 -0
- package/dist/shared/item-light-placement.d.ts.map +1 -0
- package/dist/shared/item-light-placement.js +3 -0
- package/dist/shared/move-roof-tool.js +2 -1
- package/dist/shared/node-batch/batchable.d.ts +12 -0
- package/dist/shared/node-batch/batchable.d.ts.map +1 -0
- package/dist/shared/node-batch/batchable.js +41 -0
- package/dist/shared/node-batch/candidates.d.ts +7 -5
- package/dist/shared/node-batch/candidates.d.ts.map +1 -1
- package/dist/shared/node-batch/candidates.js +43 -59
- package/dist/shared/node-batch/release.d.ts +8 -0
- package/dist/shared/node-batch/release.d.ts.map +1 -0
- package/dist/shared/node-batch/release.js +16 -0
- package/dist/shared/node-batch/system.d.ts.map +1 -1
- package/dist/shared/node-batch/system.js +17 -12
- package/dist/shared/node-batch/types.d.ts +4 -1
- package/dist/shared/node-batch/types.d.ts.map +1 -1
- package/dist/shared/opening-documentation.d.ts +13 -1
- package/dist/shared/opening-documentation.d.ts.map +1 -1
- package/dist/shared/opening-documentation.js +245 -59
- package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
- package/dist/shared/opening-guides-runtime.js +17 -14
- package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
- package/dist/shared/opening-placement-dimensions.js +3 -3
- package/dist/shared/opening-plane-offset.d.ts +23 -0
- package/dist/shared/opening-plane-offset.d.ts.map +1 -0
- package/dist/shared/opening-plane-offset.js +24 -0
- package/dist/shared/polygon-centroid-move.d.ts.map +1 -1
- package/dist/shared/polygon-centroid-move.js +4 -1
- package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
- package/dist/shared/polygon-vertex-affordance.js +19 -15
- package/dist/shared/run-hangers.d.ts.map +1 -1
- package/dist/shared/run-hangers.js +5 -4
- package/dist/shared/scripted-opening-handles.d.ts +18 -0
- package/dist/shared/scripted-opening-handles.d.ts.map +1 -0
- package/dist/shared/scripted-opening-handles.js +53 -0
- package/dist/shared/scripted-opening.d.ts +25 -0
- package/dist/shared/scripted-opening.d.ts.map +1 -0
- package/dist/shared/scripted-opening.js +72 -0
- package/dist/shared/slot-paint.d.ts +14 -2
- package/dist/shared/slot-paint.d.ts.map +1 -1
- package/dist/shared/slot-paint.js +29 -29
- package/dist/shared/surface-paint.d.ts.map +1 -1
- package/dist/shared/surface-paint.js +2 -5
- package/dist/shared/swap-preview-material.d.ts +11 -0
- package/dist/shared/swap-preview-material.d.ts.map +1 -0
- package/dist/shared/swap-preview-material.js +16 -0
- package/dist/shared/system-checks.d.ts.map +1 -1
- package/dist/shared/system-checks.js +5 -3
- package/dist/shared/wall-attach-target.d.ts +3 -10
- package/dist/shared/wall-attach-target.d.ts.map +1 -1
- package/dist/shared/wall-attach-target.js +3 -63
- package/dist/shared/wall-opening-ceiling.d.ts +5 -15
- package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
- package/dist/shared/wall-opening-ceiling.js +10 -18
- package/dist/shelf/definition.d.ts.map +1 -1
- package/dist/shelf/definition.js +1 -1
- package/dist/shelf/geometry.d.ts.map +1 -1
- package/dist/shelf/geometry.js +1 -2
- package/dist/shelf/paint.d.ts.map +1 -1
- package/dist/shelf/paint.js +4 -10
- package/dist/site/line-ribbon.d.ts +31 -0
- package/dist/site/line-ribbon.d.ts.map +1 -0
- package/dist/site/line-ribbon.js +117 -0
- package/dist/site/lot-mask.d.ts +18 -0
- package/dist/site/lot-mask.d.ts.map +1 -0
- package/dist/site/lot-mask.js +35 -0
- package/dist/site/panel.d.ts +10 -0
- package/dist/site/panel.d.ts.map +1 -0
- package/dist/site/panel.js +155 -0
- package/dist/site/parametrics.d.ts +7 -0
- package/dist/site/parametrics.d.ts.map +1 -1
- package/dist/site/parametrics.js +8 -0
- package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
- package/dist/site/recessed-slab-ground-holes.js +5 -2
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +150 -19
- package/dist/site/setbacks.d.ts +33 -0
- package/dist/site/setbacks.d.ts.map +1 -0
- package/dist/site/setbacks.js +204 -0
- package/dist/site/terrain-geometry.d.ts +28 -1
- package/dist/site/terrain-geometry.d.ts.map +1 -1
- package/dist/site/terrain-geometry.js +78 -4
- package/dist/site/terrain-holes.d.ts +15 -0
- package/dist/site/terrain-holes.d.ts.map +1 -0
- package/dist/site/terrain-holes.js +74 -0
- package/dist/site/terrain-mesh.d.ts +9 -2
- package/dist/site/terrain-mesh.d.ts.map +1 -1
- package/dist/site/terrain-mesh.js +36 -9
- package/dist/site/terrain-renderer.d.ts +9 -2
- package/dist/site/terrain-renderer.d.ts.map +1 -1
- package/dist/site/terrain-renderer.js +14 -4
- package/dist/slab/boundary-editor.d.ts +1 -1
- package/dist/slab/boundary-editor.d.ts.map +1 -1
- package/dist/slab/boundary-editor.js +13 -13
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +19 -3
- package/dist/slab/dependency-tracker.d.ts.map +1 -1
- package/dist/slab/dependency-tracker.js +67 -7
- package/dist/slab/elevation-limit.d.ts.map +1 -1
- package/dist/slab/elevation-limit.js +2 -2
- package/dist/slab/floorplan-affordances.d.ts +176 -4
- package/dist/slab/floorplan-affordances.d.ts.map +1 -1
- package/dist/slab/floorplan-affordances.js +0 -1
- package/dist/slab/floorplan-move.d.ts.map +1 -1
- package/dist/slab/floorplan-move.js +3 -4
- package/dist/slab/floorplan.d.ts +7 -0
- package/dist/slab/floorplan.d.ts.map +1 -1
- package/dist/slab/floorplan.js +22 -5
- package/dist/slab/geometry.d.ts.map +1 -1
- package/dist/slab/geometry.js +186 -76
- package/dist/slab/move-tool.js +7 -6
- package/dist/slab/paint.d.ts +18 -5
- package/dist/slab/paint.d.ts.map +1 -1
- package/dist/slab/paint.js +458 -9
- package/dist/slab/panel.d.ts.map +1 -1
- package/dist/slab/panel.js +28 -9
- package/dist/slab/placement-ownership.d.ts +2 -1
- package/dist/slab/placement-ownership.d.ts.map +1 -1
- package/dist/slab/placement-ownership.js +2 -2
- package/dist/slab/surface-split.d.ts +24 -0
- package/dist/slab/surface-split.d.ts.map +1 -0
- package/dist/slab/surface-split.js +389 -0
- package/dist/slab/tool.d.ts.map +1 -1
- package/dist/slab/tool.js +3 -3
- package/dist/stair/baluster-geometry.d.ts +21 -0
- package/dist/stair/baluster-geometry.d.ts.map +1 -0
- package/dist/stair/baluster-geometry.js +74 -0
- package/dist/stair/baluster-guard.d.ts +50 -0
- package/dist/stair/baluster-guard.d.ts.map +1 -0
- package/dist/stair/baluster-guard.js +71 -0
- package/dist/stair/boards-guard.d.ts +37 -0
- package/dist/stair/boards-guard.d.ts.map +1 -0
- package/dist/stair/boards-guard.js +61 -0
- package/dist/stair/cable-guard.d.ts +39 -0
- package/dist/stair/cable-guard.d.ts.map +1 -0
- package/dist/stair/cable-guard.js +105 -0
- package/dist/stair/construction-controls.d.ts +15 -0
- package/dist/stair/construction-controls.d.ts.map +1 -0
- package/dist/stair/construction-controls.js +29 -0
- package/dist/stair/continuous-railings.d.ts +10 -0
- package/dist/stair/continuous-railings.d.ts.map +1 -0
- package/dist/stair/continuous-railings.js +159 -0
- package/dist/stair/definition.d.ts.map +1 -1
- package/dist/stair/definition.js +16 -37
- package/dist/stair/documentation.d.ts +1 -1
- package/dist/stair/documentation.d.ts.map +1 -1
- package/dist/stair/documentation.js +10 -17
- package/dist/stair/floorplan-affordances.d.ts.map +1 -1
- package/dist/stair/floorplan-affordances.js +9 -25
- package/dist/stair/floorplan.d.ts +1 -23
- package/dist/stair/floorplan.d.ts.map +1 -1
- package/dist/stair/floorplan.js +102 -86
- package/dist/stair/glass-guard.d.ts +72 -0
- package/dist/stair/glass-guard.d.ts.map +1 -0
- package/dist/stair/glass-guard.js +167 -0
- package/dist/stair/guard-path.d.ts +119 -0
- package/dist/stair/guard-path.d.ts.map +1 -0
- package/dist/stair/guard-path.js +208 -0
- package/dist/stair/materials.d.ts +11 -0
- package/dist/stair/materials.d.ts.map +1 -0
- package/dist/stair/materials.js +51 -0
- package/dist/stair/metal-guard.d.ts +38 -0
- package/dist/stair/metal-guard.d.ts.map +1 -0
- package/dist/stair/metal-guard.js +79 -0
- package/dist/stair/paint.d.ts +32 -0
- package/dist/stair/paint.d.ts.map +1 -1
- package/dist/stair/paint.js +75 -36
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +154 -17
- package/dist/stair/parametrics.d.ts +1 -1
- package/dist/stair/parametrics.d.ts.map +1 -1
- package/dist/stair/parametrics.js +32 -15
- package/dist/stair/plan-entry.d.ts +31 -0
- package/dist/stair/plan-entry.d.ts.map +1 -0
- package/dist/stair/plan-entry.js +325 -0
- package/dist/stair/post-and-rail-guard.d.ts +31 -0
- package/dist/stair/post-and-rail-guard.d.ts.map +1 -0
- package/dist/stair/post-and-rail-guard.js +63 -0
- package/dist/stair/railing-controls.d.ts +9 -0
- package/dist/stair/railing-controls.d.ts.map +1 -0
- package/dist/stair/railing-controls.js +49 -0
- package/dist/stair/renderer.d.ts.map +1 -1
- package/dist/stair/renderer.js +259 -259
- package/dist/stair/use-stair-render-data.d.ts +317 -0
- package/dist/stair/use-stair-render-data.d.ts.map +1 -0
- package/dist/stair/use-stair-render-data.js +73 -0
- package/dist/stair-segment/definition.d.ts.map +1 -1
- package/dist/stair-segment/definition.js +51 -10
- package/dist/stair-segment/panel.d.ts.map +1 -1
- package/dist/stair-segment/panel.js +36 -42
- package/dist/stair-segment/parametrics.d.ts +1 -1
- package/dist/stair-segment/parametrics.d.ts.map +1 -1
- package/dist/stair-segment/parametrics.js +21 -8
- package/dist/stair-segment/renderer.d.ts.map +1 -1
- package/dist/stair-segment/renderer.js +16 -28
- package/dist/turbine-vent/definition.d.ts.map +1 -1
- package/dist/turbine-vent/definition.js +2 -5
- package/dist/turbine-vent/paint.d.ts.map +1 -1
- package/dist/turbine-vent/paint.js +2 -5
- package/dist/turbine-vent/panel.d.ts.map +1 -1
- package/dist/turbine-vent/panel.js +5 -23
- package/dist/unit/unit-panel.d.ts.map +1 -1
- package/dist/unit/unit-panel.js +6 -1
- package/dist/wall/actions.d.ts.map +1 -1
- package/dist/wall/actions.js +7 -2
- package/dist/wall/construction-dimensions.js +8 -5
- package/dist/wall/contextual-dimensions.js +4 -4
- package/dist/wall/curtain-wall-materials.d.ts +1 -1
- package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
- package/dist/wall/curtain-wall-materials.js +2 -2
- package/dist/wall/curve-tool.d.ts.map +1 -1
- package/dist/wall/curve-tool.js +4 -0
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +41 -17
- package/dist/wall/floorplan-move.d.ts +1 -1
- package/dist/wall/floorplan-move.d.ts.map +1 -1
- package/dist/wall/floorplan-move.js +20 -83
- package/dist/wall/floorplan-tool.d.ts.map +1 -1
- package/dist/wall/floorplan-tool.js +10 -11
- package/dist/wall/floorplan.d.ts +3 -1
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +184 -21
- package/dist/wall/measurement.d.ts.map +1 -1
- package/dist/wall/measurement.js +5 -5
- package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
- package/dist/wall/move-endpoint-tool.js +20 -7
- package/dist/wall/move-shared.d.ts.map +1 -1
- package/dist/wall/move-shared.js +11 -7
- package/dist/wall/move-tool.d.ts.map +1 -1
- package/dist/wall/move-tool.js +118 -148
- package/dist/wall/paint.d.ts +26 -15
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +306 -117
- package/dist/wall/panel-model.d.ts +18 -0
- package/dist/wall/panel-model.d.ts.map +1 -1
- package/dist/wall/panel-model.js +77 -19
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +217 -41
- package/dist/wall/parametrics.d.ts.map +1 -1
- package/dist/wall/parametrics.js +3 -0
- package/dist/wall/rectangle-command.d.ts +111 -12
- 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 +26 -8
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +4 -2
- package/dist/wall/split-floorplan-layer.d.ts.map +1 -1
- package/dist/wall/split-floorplan-layer.js +7 -7
- package/dist/wall/split-session.d.ts.map +1 -1
- package/dist/wall/split-session.js +7 -1
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +36 -4
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +105 -49
- package/dist/wall/treatment-level-data.d.ts +3 -2
- package/dist/wall/treatment-level-data.d.ts.map +1 -1
- package/dist/wall/treatment-level-data.js +17 -13
- package/dist/wall/treatments.d.ts +10 -10
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +67 -54
- package/dist/wall/wall-batch-system.d.ts +7 -0
- package/dist/wall/wall-batch-system.d.ts.map +1 -1
- package/dist/wall/wall-batch-system.js +35 -3
- package/dist/wall/wall-batch.d.ts +6 -0
- package/dist/wall/wall-batch.d.ts.map +1 -1
- package/dist/wall/wall-batch.js +7 -1
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +12 -4
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +3 -1
- package/dist/window/floorplan.d.ts.map +1 -1
- package/dist/window/floorplan.js +145 -60
- package/dist/window/mechanism.d.ts +4 -0
- package/dist/window/mechanism.d.ts.map +1 -0
- package/dist/window/mechanism.js +20 -0
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +79 -48
- package/dist/window/paint.d.ts.map +1 -1
- package/dist/window/paint.js +3 -0
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +32 -88
- package/dist/window/placement.d.ts +23 -0
- package/dist/window/placement.d.ts.map +1 -0
- package/dist/window/placement.js +66 -0
- package/dist/window/preview.d.ts.map +1 -1
- package/dist/window/preview.js +2 -0
- package/dist/window/renderer.d.ts.map +1 -1
- package/dist/window/renderer.js +3 -2
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +96 -24
- package/dist/window/window-math.d.ts +6 -14
- package/dist/window/window-math.d.ts.map +1 -1
- package/dist/window/window-math.js +14 -20
- package/dist/zone/contextual-dimensions.d.ts.map +1 -1
- package/dist/zone/contextual-dimensions.js +6 -28
- package/dist/zone/definition.d.ts.map +1 -1
- package/dist/zone/definition.js +3 -3
- package/dist/zone/floorplan-affordances.d.ts +200 -0
- package/dist/zone/floorplan-affordances.d.ts.map +1 -1
- package/dist/zone/floorplan.d.ts +1 -1
- package/dist/zone/floorplan.d.ts.map +1 -1
- package/dist/zone/floorplan.js +93 -53
- package/dist/zone/quantities-panel.d.ts.map +1 -1
- package/dist/zone/quantities-panel.js +3 -14
- package/dist/zone/quick-measurement.d.ts +2 -2
- package/dist/zone/quick-measurement.d.ts.map +1 -1
- package/dist/zone/quick-measurement.js +6 -5
- package/dist/zone/renderer.d.ts +1 -1
- package/dist/zone/renderer.d.ts.map +1 -1
- package/dist/zone/renderer.js +58 -146
- package/dist/zone/room-clear-dimensions.js +3 -3
- package/dist/zone/room-documentation.d.ts.map +1 -1
- package/dist/zone/room-documentation.js +2 -6
- package/package.json +11 -11
- package/dist/block/slots.d.ts +0 -4
- package/dist/block/slots.d.ts.map +0 -1
- package/dist/block/slots.js +0 -17
- package/dist/cabinet/slots.d.ts +0 -4
- package/dist/cabinet/slots.d.ts.map +0 -1
- package/dist/cabinet/slots.js +0 -24
- package/dist/ceiling/slots.d.ts +0 -6
- package/dist/ceiling/slots.d.ts.map +0 -1
- package/dist/ceiling/slots.js +0 -7
- package/dist/column/slots.d.ts +0 -9
- package/dist/column/slots.d.ts.map +0 -1
- package/dist/column/slots.js +0 -19
- package/dist/door/slots.d.ts +0 -9
- package/dist/door/slots.d.ts.map +0 -1
- package/dist/door/slots.js +0 -20
- package/dist/elevator/slots.d.ts +0 -8
- package/dist/elevator/slots.d.ts.map +0 -1
- package/dist/elevator/slots.js +0 -17
- package/dist/fence/slots.d.ts +0 -10
- package/dist/fence/slots.d.ts.map +0 -1
- package/dist/fence/slots.js +0 -23
- package/dist/item/__fixtures__/main-floorplan.d.ts +0 -26
- package/dist/item/__fixtures__/main-floorplan.d.ts.map +0 -1
- package/dist/item/__fixtures__/main-floorplan.js +0 -297
- package/dist/lean-to-extension/slots.d.ts +0 -5
- package/dist/lean-to-extension/slots.d.ts.map +0 -1
- package/dist/lean-to-extension/slots.js +0 -15
- package/dist/shelf/slots.d.ts +0 -9
- package/dist/shelf/slots.d.ts.map +0 -1
- package/dist/shelf/slots.js +0 -30
- package/dist/slab/slots.d.ts +0 -10
- package/dist/slab/slots.d.ts.map +0 -1
- package/dist/slab/slots.js +0 -20
- package/dist/stair/floor-stack.d.ts +0 -10
- package/dist/stair/floor-stack.d.ts.map +0 -1
- package/dist/stair/floor-stack.js +0 -115
- package/dist/stair/slots.d.ts +0 -7
- package/dist/stair/slots.d.ts.map +0 -1
- package/dist/stair/slots.js +0 -13
- package/dist/wall/drawing-mode.d.ts +0 -12
- package/dist/wall/drawing-mode.d.ts.map +0 -1
- package/dist/wall/drawing-mode.js +0 -38
- package/dist/wall/slots.d.ts +0 -10
- package/dist/wall/slots.d.ts.map +0 -1
- package/dist/wall/slots.js +0 -92
- package/dist/window/slots.d.ts +0 -5
- package/dist/window/slots.d.ts.map +0 -1
- package/dist/window/slots.js +0 -11
package/dist/wall/paint.js
CHANGED
|
@@ -1,39 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { setSurfaceRaycastLayers } from '@pascal-app/viewer';
|
|
3
|
-
import { Raycaster } from 'three';
|
|
4
|
-
import { buildSlotPreviewMaterial, createSlotPaintCapability, previewSlotByUserData, } from '../shared/slot-paint';
|
|
5
|
-
import {
|
|
1
|
+
import { buildWallFinishLayout, getCurtainWallConfig, getEffectiveWallFaceMaterial, getWallFaceAtLocalPoint, getWallLevelZones, parseWallPaintRole as parseCoreWallPaintRole, parseMaterialRef, plannedWallIds, planWallPaint, resolveWallFaceChain, resolveWallFinish, sceneRegistry, useScene, WALL_SURFACE_SLOT_DEFAULTS, wallRegionRole, wallRoomFaceRole, wallRoomFinishRole, } from '@pascal-app/core';
|
|
2
|
+
import { getWallFaceBaseAt, getWallFinishData, getWallFinishRefs, hasMaterialsForGroups, setSurfaceRaycastLayers, } from '@pascal-app/viewer';
|
|
3
|
+
import { Raycaster, Vector3, } from 'three';
|
|
4
|
+
import { buildSlotPreviewMaterial, createSlotPaintCapability, previewSlotByUserData, resolveSlotPaintMaterialRef, } from '../shared/slot-paint';
|
|
5
|
+
import { swapPreviewMaterial } from '../shared/swap-preview-material';
|
|
6
6
|
const WALL_SLOT_IDS = new Set(Object.keys(WALL_SURFACE_SLOT_DEFAULTS));
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
middleExterior: 8,
|
|
16
|
-
upperExterior: 9,
|
|
17
|
-
topExterior: 10,
|
|
18
|
-
};
|
|
19
|
-
const WALL_INDEX_SLOT = new Map(Object.entries(WALL_ARRAY_SLOT_INDEX).map(([slotId, index]) => [
|
|
20
|
-
index,
|
|
21
|
-
slotId,
|
|
22
|
-
]));
|
|
7
|
+
// A curtain wall paints its frame, glass and solid panels (palette 0..2) instead of faces.
|
|
8
|
+
const CURTAIN_WALL_ROLES = ['curtain-frame', 'curtain-glass', 'curtain-solid'];
|
|
9
|
+
const isCurtainWallRole = (role) => CURTAIN_WALL_ROLES.includes(role);
|
|
10
|
+
const FACE_MATERIAL_INDEX = { a: 1, b: 2 };
|
|
11
|
+
export { wallRegionRole, wallRoomFaceRole, wallRoomFinishRole };
|
|
12
|
+
export function parseWallPaintRole(role) {
|
|
13
|
+
return parseCoreWallPaintRole(role, (slotId) => WALL_SLOT_IDS.has(slotId) || isCurtainWallRole(slotId));
|
|
14
|
+
}
|
|
23
15
|
const wallSlotRaycaster = new Raycaster();
|
|
24
16
|
setSurfaceRaycastLayers(wallSlotRaycaster.layers);
|
|
25
|
-
function resolveSideFromMaterialIndex(materialIndex) {
|
|
26
|
-
const slotId = materialIndex === null ? undefined : WALL_INDEX_SLOT.get(materialIndex);
|
|
27
|
-
if (slotId)
|
|
28
|
-
return getWallSurfaceSideFromBandSlot(slotId);
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
17
|
function resolveWallSlotByRay(node, ray) {
|
|
32
18
|
if (!ray)
|
|
33
19
|
return null;
|
|
34
20
|
const root = sceneRegistry.nodes.get(node.id);
|
|
35
21
|
if (!root)
|
|
36
22
|
return null;
|
|
23
|
+
// A mesh caught between a rebuild and its new palette cannot be raycast (three
|
|
24
|
+
// reads each group's material); no trim answers from it this move.
|
|
25
|
+
let drawable = true;
|
|
26
|
+
root.traverse((object) => {
|
|
27
|
+
drawable &&= hasMaterialsForGroups(object);
|
|
28
|
+
});
|
|
29
|
+
if (!drawable)
|
|
30
|
+
return null;
|
|
37
31
|
wallSlotRaycaster.ray.copy(ray);
|
|
38
32
|
const hits = wallSlotRaycaster.intersectObject(root, true);
|
|
39
33
|
for (const hit of hits) {
|
|
@@ -45,25 +39,19 @@ function resolveWallSlotByRay(node, ray) {
|
|
|
45
39
|
return null;
|
|
46
40
|
}
|
|
47
41
|
/**
|
|
48
|
-
* Resolve which wall
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* groups aren't conclusive. Front/back of the wall maps to the
|
|
52
|
-
* node's `frontSide` / `backSide` semantic; absent that, front
|
|
53
|
-
* → interior, back → exterior.
|
|
54
|
-
*
|
|
55
|
-
* Returns null when the click is too oblique (or lands on the wall's
|
|
56
|
-
* end-cap, etc.) to confidently assign a side.
|
|
42
|
+
* Resolve which wall surface the user clicked: a trim slot, a paint region,
|
|
43
|
+
* the room finish on that face, or the face slot itself. Returns null when the
|
|
44
|
+
* click is too oblique (or lands on the wall's end-cap, etc.) to pick a face.
|
|
57
45
|
*/
|
|
58
46
|
export function resolveWallRole(args) {
|
|
59
|
-
const { node, hitObject,
|
|
47
|
+
const { node, hitObject, localPosition, ray } = args;
|
|
60
48
|
if (node.wallType === 'curtain') {
|
|
61
49
|
const root = sceneRegistry.nodes.get(node.id);
|
|
62
50
|
if (!(root && ray))
|
|
63
51
|
return null;
|
|
64
52
|
wallSlotRaycaster.ray.copy(ray);
|
|
65
53
|
const hit = wallSlotRaycaster.intersectObject(root, false)[0];
|
|
66
|
-
return
|
|
54
|
+
return CURTAIN_WALL_ROLES[hit?.face?.materialIndex ?? -1] ?? null;
|
|
67
55
|
}
|
|
68
56
|
const directSlotId = hitObject?.userData?.slotId;
|
|
69
57
|
if (typeof directSlotId === 'string' && WALL_SLOT_IDS.has(directSlotId)) {
|
|
@@ -72,88 +60,262 @@ export function resolveWallRole(args) {
|
|
|
72
60
|
const raySlotId = resolveWallSlotByRay(node, ray);
|
|
73
61
|
if (raySlotId)
|
|
74
62
|
return raySlotId;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (indexedSlotId && indexedSlotId !== 'interior' && indexedSlotId !== 'exterior') {
|
|
79
|
-
return indexedSlotId;
|
|
80
|
-
}
|
|
81
|
-
if (sideFromIndex && localPosition) {
|
|
82
|
-
const effectiveWallHeight = resolveWallOpeningCeiling(node, useScene.getState().nodes);
|
|
83
|
-
const bands = getWallFaceBandConfig(node, effectiveWallHeight);
|
|
84
|
-
if (!bands.enabled)
|
|
85
|
-
return sideFromIndex;
|
|
86
|
-
return getWallBandSlotId(sideFromIndex, getWallFaceBandForHeight(node, localPosition[1], effectiveWallHeight));
|
|
63
|
+
// The underpinning's stemwall, below the finish carried over the rim.
|
|
64
|
+
if (node.underpinning && localPosition && localPosition[1] < -node.underpinning.rim) {
|
|
65
|
+
return 'foundation';
|
|
87
66
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
if (
|
|
94
|
-
localZ === undefined ||
|
|
95
|
-
localPosition === undefined ||
|
|
96
|
-
Math.abs(normalZ) < 0.65 ||
|
|
97
|
-
Math.abs(localZ) < Math.max(thickness * 0.2, 0.01)) {
|
|
67
|
+
// The physical face comes from where the hit lies, never from the material
|
|
68
|
+
// index: a region can draw with a face slot's material on the other face.
|
|
69
|
+
if (!localPosition)
|
|
70
|
+
return null;
|
|
71
|
+
const face = getWallFaceAtLocalPoint(node, localPosition, args.normal);
|
|
72
|
+
if (!face)
|
|
98
73
|
return null;
|
|
74
|
+
const nodes = args.nodes ?? useScene.getState().nodes;
|
|
75
|
+
const layout = buildWallFinishLayout(node, getWallLevelZones(node, nodes));
|
|
76
|
+
if (layout.plain)
|
|
77
|
+
return face;
|
|
78
|
+
const mesh = sceneRegistry.nodes.get(node.id);
|
|
79
|
+
const u = localPosition[0];
|
|
80
|
+
const v = localPosition[1] - getWallFaceBaseAt(getWallFinishData(mesh?.geometry), face, u);
|
|
81
|
+
const hit = resolveWallFinish(layout, face, u, v);
|
|
82
|
+
if (hit.source === 'region')
|
|
83
|
+
return wallRegionRole(hit.regionId);
|
|
84
|
+
if (hit.source === 'override' || hit.source === 'zone')
|
|
85
|
+
return wallRoomFaceRole(hit.zoneId, face);
|
|
86
|
+
return face;
|
|
87
|
+
}
|
|
88
|
+
function zoneOf(zoneId, nodes = useScene.getState().nodes) {
|
|
89
|
+
const node = nodes[zoneId];
|
|
90
|
+
return node?.type === 'zone' ? node : null;
|
|
91
|
+
}
|
|
92
|
+
/** The finish ref a non-slot role currently shows, if any. */
|
|
93
|
+
function currentRoleRef(wall, role, nodes) {
|
|
94
|
+
if (role.kind === 'region') {
|
|
95
|
+
return wall.faceRegions?.find((region) => region.id === role.regionId)?.finish;
|
|
99
96
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
97
|
+
if (role.kind === 'room')
|
|
98
|
+
return zoneOf(role.zoneId, nodes)?.wallMaterial;
|
|
99
|
+
if (role.kind === 'room-face') {
|
|
100
|
+
const zone = zoneOf(role.zoneId, nodes);
|
|
101
|
+
return (zone?.wallOverrides?.find((entry) => entry.wallId === wall.id && entry.face === role.face)
|
|
102
|
+
?.finish ?? zone?.wallMaterial);
|
|
103
|
+
}
|
|
104
|
+
return wall.slots?.[role.slotId];
|
|
105
|
+
}
|
|
106
|
+
function refToEffective(ref) {
|
|
107
|
+
const parsed = parseMaterialRef(ref);
|
|
108
|
+
if (parsed?.kind === 'library')
|
|
109
|
+
return { material: undefined, materialPreset: ref };
|
|
110
|
+
if (parsed?.kind === 'scene') {
|
|
111
|
+
const sceneMaterial = useScene.getState().materials[parsed.id];
|
|
112
|
+
if (sceneMaterial)
|
|
113
|
+
return { material: sceneMaterial.material, materialPreset: undefined };
|
|
108
114
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The wall mesh's palette entry a non-face slot draws with, when it is part of
|
|
119
|
+
* the wall body rather than its own mesh: a curtain wall's frame / glass /
|
|
120
|
+
* solid panels (0..2), or the underpinning's stemwall (a finish ref, 3..).
|
|
121
|
+
*/
|
|
122
|
+
function wallPaletteSlotIndex(wall, slotId, mesh) {
|
|
123
|
+
if (isCurtainWallRole(slotId))
|
|
124
|
+
return CURTAIN_WALL_ROLES.indexOf(slotId);
|
|
125
|
+
if (slotId !== 'foundation' || !wall.underpinning)
|
|
126
|
+
return null;
|
|
127
|
+
const ref = wall.slots?.foundation ?? WALL_SURFACE_SLOT_DEFAULTS.foundation;
|
|
128
|
+
const at = getWallFinishRefs(mesh.geometry).indexOf(ref);
|
|
129
|
+
return at < 0 ? null : 3 + at;
|
|
130
|
+
}
|
|
131
|
+
/** Swap one palette entry of a copy of the wall's material array; cleanup restores it. */
|
|
132
|
+
function previewPaletteEntry(args, mesh, index) {
|
|
133
|
+
const current = mesh.material;
|
|
134
|
+
if (!Array.isArray(current) || index >= current.length)
|
|
135
|
+
return () => { };
|
|
136
|
+
const preview = buildSlotPreviewMaterial(args.material, args.materialPreset);
|
|
137
|
+
if (!preview)
|
|
138
|
+
return () => { };
|
|
139
|
+
const next = current.slice();
|
|
140
|
+
next[index] = preview;
|
|
141
|
+
return swapPreviewMaterial(mesh, next);
|
|
142
|
+
}
|
|
143
|
+
/** The finish the preview plan writes, so the surfaces it lands on can be told apart. */
|
|
144
|
+
const PREVIEW_REF = '__paint-preview__';
|
|
145
|
+
function sameChain(a, b) {
|
|
146
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
115
147
|
}
|
|
116
148
|
/**
|
|
117
|
-
* Preview a wall paint by
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
149
|
+
* Preview a wall paint by drawing the plan the click commits: every face
|
|
150
|
+
* triangle of this wall is resolved again against the planned wall and rooms,
|
|
151
|
+
* and takes the material that resolution draws — the paint where the click
|
|
152
|
+
* paints, what shows once erased where it erases. The material array is copied
|
|
153
|
+
* (never the shared cache) and the triangles are regrouped; cleanup restores
|
|
154
|
+
* both.
|
|
121
155
|
*/
|
|
122
156
|
function applyWallPreview(args) {
|
|
123
157
|
const { role, material, materialPreset } = args;
|
|
124
|
-
const
|
|
125
|
-
if (
|
|
126
|
-
return
|
|
127
|
-
}
|
|
128
|
-
const index = curtainIndex >= 0 ? curtainIndex : WALL_ARRAY_SLOT_INDEX[role];
|
|
129
|
-
if (index === undefined)
|
|
130
|
-
return previewSlotByUserData(args);
|
|
158
|
+
const parsed = parseWallPaintRole(role);
|
|
159
|
+
if (!parsed)
|
|
160
|
+
return null;
|
|
131
161
|
const mesh = sceneRegistry.nodes.get(args.node.id);
|
|
132
|
-
if (!(
|
|
162
|
+
if (parsed.kind === 'slot' && !(parsed.slotId === 'a' || parsed.slotId === 'b')) {
|
|
163
|
+
const index = mesh?.isMesh
|
|
164
|
+
? wallPaletteSlotIndex(args.node, parsed.slotId, mesh)
|
|
165
|
+
: null;
|
|
166
|
+
return index === null ? previewSlotByUserData(args) : previewPaletteEntry(args, mesh, index);
|
|
167
|
+
}
|
|
168
|
+
if (!mesh?.isMesh)
|
|
133
169
|
return null;
|
|
134
|
-
const
|
|
135
|
-
const current = wallMesh.material;
|
|
170
|
+
const current = mesh.material;
|
|
136
171
|
if (!Array.isArray(current))
|
|
137
172
|
return null;
|
|
138
|
-
const
|
|
139
|
-
|
|
173
|
+
const erasing = material === undefined && materialPreset === undefined;
|
|
174
|
+
const paint = erasing ? null : buildSlotPreviewMaterial(material, materialPreset);
|
|
175
|
+
if (!(erasing || paint))
|
|
140
176
|
return () => { };
|
|
141
|
-
const
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
177
|
+
const nodes = useScene.getState().nodes;
|
|
178
|
+
const before = (nodes[args.node.id] ?? args.node);
|
|
179
|
+
const plan = planWallPaint(nodes, before, parsed, erasing ? undefined : PREVIEW_REF);
|
|
180
|
+
const after = { ...nodes, ...plan };
|
|
181
|
+
const wall = (after[before.id] ?? before);
|
|
182
|
+
const layout = buildWallFinishLayout(wall, getWallLevelZones(wall, after));
|
|
183
|
+
const refs = getWallFinishRefs(mesh.geometry);
|
|
184
|
+
const chains = {
|
|
185
|
+
before: { a: resolveWallFaceChain(before, 'a'), b: resolveWallFaceChain(before, 'b') },
|
|
186
|
+
after: { a: resolveWallFaceChain(wall, 'a'), b: resolveWallFaceChain(wall, 'b') },
|
|
187
|
+
};
|
|
188
|
+
const materials = current.slice();
|
|
189
|
+
const added = new Map();
|
|
190
|
+
const extra = (key, make) => {
|
|
191
|
+
const known = added.get(key);
|
|
192
|
+
if (known !== undefined)
|
|
193
|
+
return known;
|
|
194
|
+
const made = make();
|
|
195
|
+
if (!made)
|
|
196
|
+
return null;
|
|
197
|
+
materials.push(made);
|
|
198
|
+
added.set(key, materials.length - 1);
|
|
199
|
+
return materials.length - 1;
|
|
200
|
+
};
|
|
201
|
+
const lookIndex = (look) => extra(`look:${JSON.stringify(look)}`, () => buildSlotPreviewMaterial(look.material, look.materialPreset));
|
|
202
|
+
const indexFor = (face, u, v) => {
|
|
203
|
+
const hit = resolveWallFinish(layout, face, u, v);
|
|
204
|
+
if (hit.source !== 'slot') {
|
|
205
|
+
if (hit.ref === PREVIEW_REF)
|
|
206
|
+
return extra('paint', () => paint);
|
|
207
|
+
const at = refs.indexOf(hit.ref);
|
|
208
|
+
return at >= 0 ? 3 + at : lookIndex({ materialPreset: hit.ref });
|
|
209
|
+
}
|
|
210
|
+
const chain = chains.after[face];
|
|
211
|
+
if (sameChain(chain, chains.before[face]))
|
|
212
|
+
return FACE_MATERIAL_INDEX[face];
|
|
213
|
+
if (chain.kind !== 'legacy' && chain.ref === PREVIEW_REF)
|
|
214
|
+
return extra('paint', () => paint);
|
|
215
|
+
return lookIndex(chain.kind === 'legacy' ? chain.spec : { materialPreset: chain.ref });
|
|
216
|
+
};
|
|
217
|
+
const geometry = mesh.geometry;
|
|
218
|
+
const groups = geometry.groups.map((group) => ({ ...group }));
|
|
219
|
+
const regrouped = regroupWallFaces(geometry, before, indexFor);
|
|
220
|
+
if (!regrouped)
|
|
221
|
+
return () => { };
|
|
222
|
+
geometry.groups = regrouped;
|
|
223
|
+
const restoreMaterial = swapPreviewMaterial(mesh, materials);
|
|
145
224
|
return () => {
|
|
146
|
-
|
|
225
|
+
restoreMaterial();
|
|
226
|
+
if (mesh.geometry === geometry)
|
|
227
|
+
geometry.groups = groups;
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* The wall's face triangles regrouped by the material index `indexFor` gives
|
|
232
|
+
* each (the face and station its centre lies at); caps keep theirs. Null when
|
|
233
|
+
* nothing moves.
|
|
234
|
+
*/
|
|
235
|
+
export function regroupWallFaces(geometry, wall, indexFor) {
|
|
236
|
+
const position = geometry.getAttribute('position');
|
|
237
|
+
if (!position)
|
|
238
|
+
return null;
|
|
239
|
+
const index = geometry.getIndex();
|
|
240
|
+
const vertex = (at) => (index ? index.getX(at) : at);
|
|
241
|
+
const finish = getWallFinishData(geometry);
|
|
242
|
+
const a = new Vector3();
|
|
243
|
+
const b = new Vector3();
|
|
244
|
+
const c = new Vector3();
|
|
245
|
+
const ab = new Vector3();
|
|
246
|
+
const ac = new Vector3();
|
|
247
|
+
const out = [];
|
|
248
|
+
let changed = false;
|
|
249
|
+
const push = (start, materialIndex) => {
|
|
250
|
+
const last = out[out.length - 1];
|
|
251
|
+
if (last && last.materialIndex === materialIndex && last.start + last.count === start)
|
|
252
|
+
last.count += 3;
|
|
253
|
+
else
|
|
254
|
+
out.push({ start, count: 3, materialIndex });
|
|
147
255
|
};
|
|
256
|
+
for (const group of geometry.groups) {
|
|
257
|
+
const own = group.materialIndex ?? 0;
|
|
258
|
+
for (let at = group.start; at + 2 < group.start + group.count; at += 3) {
|
|
259
|
+
let next = own;
|
|
260
|
+
if (own !== 0) {
|
|
261
|
+
a.fromBufferAttribute(position, vertex(at));
|
|
262
|
+
b.fromBufferAttribute(position, vertex(at + 1));
|
|
263
|
+
c.fromBufferAttribute(position, vertex(at + 2));
|
|
264
|
+
const centre = [
|
|
265
|
+
(a.x + b.x + c.x) / 3,
|
|
266
|
+
(a.y + b.y + c.y) / 3,
|
|
267
|
+
(a.z + b.z + c.z) / 3,
|
|
268
|
+
];
|
|
269
|
+
const normal = ab.subVectors(b, a).cross(ac.subVectors(c, a)).normalize();
|
|
270
|
+
const face = getWallFaceAtLocalPoint(wall, centre, [normal.x, normal.y, normal.z]);
|
|
271
|
+
if (face) {
|
|
272
|
+
const v = centre[1] - getWallFaceBaseAt(finish, face, centre[0]);
|
|
273
|
+
next = indexFor(face, centre[0], v) ?? own;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (next !== own)
|
|
277
|
+
changed = true;
|
|
278
|
+
push(at, next);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return changed ? out : null;
|
|
148
282
|
}
|
|
149
283
|
/**
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* whole-side fallback so old scenes still show the current value.
|
|
284
|
+
* Write a wall paint in one history step through the same plan the preview
|
|
285
|
+
* draws, minting the shared scene material the way `commitSlotPaint` does so a
|
|
286
|
+
* one-off colour is stored once.
|
|
154
287
|
*/
|
|
155
|
-
|
|
288
|
+
function commitWallPlan(wallId, role, material, materialPreset) {
|
|
289
|
+
const state = useScene.getState();
|
|
290
|
+
const resolution = resolveSlotPaintMaterialRef(state.materials, material, materialPreset);
|
|
291
|
+
if (!resolution)
|
|
292
|
+
return;
|
|
293
|
+
const { ref, newSceneMaterial } = resolution;
|
|
294
|
+
let touched = [];
|
|
295
|
+
useScene.setState((current) => {
|
|
296
|
+
if (current.readOnly)
|
|
297
|
+
return current;
|
|
298
|
+
const wall = current.nodes[wallId];
|
|
299
|
+
if (wall?.type !== 'wall')
|
|
300
|
+
return current;
|
|
301
|
+
const plan = planWallPaint(current.nodes, wall, role, ref);
|
|
302
|
+
if (!Object.keys(plan).length)
|
|
303
|
+
return current;
|
|
304
|
+
touched = plannedWallIds(current.nodes, plan);
|
|
305
|
+
return {
|
|
306
|
+
...(newSceneMaterial
|
|
307
|
+
? { materials: { ...current.materials, [newSceneMaterial.id]: newSceneMaterial } }
|
|
308
|
+
: {}),
|
|
309
|
+
nodes: { ...current.nodes, ...plan },
|
|
310
|
+
};
|
|
311
|
+
});
|
|
312
|
+
for (const id of new Set([wallId, ...touched]))
|
|
313
|
+
useScene.getState().markDirty(id);
|
|
314
|
+
}
|
|
315
|
+
const base = createSlotPaintCapability({
|
|
156
316
|
roomScope: true,
|
|
317
|
+
// The preview draws the erase plan itself.
|
|
318
|
+
erasedLook: () => null,
|
|
157
319
|
resolveRole: ({ node, hitObject, materialIndex, normal, localPosition, ray }) => resolveWallRole({
|
|
158
320
|
node: node,
|
|
159
321
|
hitObject: hitObject,
|
|
@@ -190,28 +352,55 @@ export const wallPaint = createSlotPaintCapability({
|
|
|
190
352
|
},
|
|
191
353
|
};
|
|
192
354
|
}
|
|
193
|
-
|
|
194
|
-
|
|
355
|
+
if (role === 'a' || role === 'b') {
|
|
356
|
+
const spec = getEffectiveWallFaceMaterial(node, role);
|
|
357
|
+
if (spec.material === undefined && spec.materialPreset === undefined)
|
|
358
|
+
return null;
|
|
359
|
+
return { material: spec.material, materialPreset: spec.materialPreset };
|
|
360
|
+
}
|
|
361
|
+
if (role in WALL_SURFACE_SLOT_DEFAULTS) {
|
|
195
362
|
return {
|
|
196
363
|
material: undefined,
|
|
197
364
|
materialPreset: WALL_SURFACE_SLOT_DEFAULTS[role],
|
|
198
365
|
};
|
|
199
366
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
367
|
+
return null;
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
/**
|
|
371
|
+
* Capability binding for the wall kind on the unified slot model. Face and trim
|
|
372
|
+
* slots write `node.slots[slotId]` like every other kind; regions write the
|
|
373
|
+
* region's finish and room roles write the zone, because a room's wall finish
|
|
374
|
+
* belongs to the room, not to one of its walls.
|
|
375
|
+
*/
|
|
376
|
+
export const wallPaint = {
|
|
377
|
+
...base,
|
|
378
|
+
roleLabel: (_node, role) => {
|
|
379
|
+
const parsed = parseWallPaintRole(role);
|
|
380
|
+
if (parsed?.kind === 'region' || parsed?.kind === 'room-face')
|
|
381
|
+
return 'Face';
|
|
382
|
+
if (parsed?.kind === 'room')
|
|
383
|
+
return 'Room';
|
|
384
|
+
return null;
|
|
385
|
+
},
|
|
386
|
+
buildPatch: (args) => parseWallPaintRole(args.role)?.kind === 'slot' ? base.buildPatch(args) : {},
|
|
387
|
+
commit: (args) => {
|
|
388
|
+
const parsed = parseWallPaintRole(args.role);
|
|
389
|
+
if (!parsed)
|
|
390
|
+
return;
|
|
391
|
+
// A trim is a slot like any other; faces, regions and rooms go through the plan.
|
|
392
|
+
if (parsed.kind === 'slot' && parsed.slotId !== 'a' && parsed.slotId !== 'b') {
|
|
393
|
+
base.commit?.(args);
|
|
394
|
+
return;
|
|
211
395
|
}
|
|
212
|
-
|
|
213
|
-
|
|
396
|
+
commitWallPlan(args.node.id, parsed, args.material, args.materialPreset);
|
|
397
|
+
},
|
|
398
|
+
getEffectiveMaterial: (args) => {
|
|
399
|
+
const parsed = parseWallPaintRole(args.role);
|
|
400
|
+
if (!parsed)
|
|
214
401
|
return null;
|
|
215
|
-
|
|
402
|
+
if (parsed.kind === 'slot')
|
|
403
|
+
return base.getEffectiveMaterial?.(args) ?? null;
|
|
404
|
+
return refToEffective(currentRoleRef(args.node, parsed, args.nodes));
|
|
216
405
|
},
|
|
217
|
-
}
|
|
406
|
+
};
|
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
import { type AnyNode, type AnyNodeId, type WallNode } from '@pascal-app/core';
|
|
2
2
|
import { type PanelRow } from '@pascal-app/editor';
|
|
3
|
+
export type WallReferenceValue = 'outside' | 'center' | 'inside' | 'left' | 'right';
|
|
4
|
+
export type WallReferenceOption = {
|
|
5
|
+
label: string;
|
|
6
|
+
value: WallReferenceValue;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* The Reference control for one or more walls. The drawn line never moves; the
|
|
10
|
+
* choice picks which face sits on it. Walls with a room on exactly one side read
|
|
11
|
+
* Outside face / Center / Inside face; otherwise Left / Center / Right along the
|
|
12
|
+
* drawing direction (left is face a). A selection shows the room labels only
|
|
13
|
+
* when every wall has them, applies each choice to each wall's own faces, and
|
|
14
|
+
* shows no active option when the walls disagree.
|
|
15
|
+
*/
|
|
16
|
+
export declare function wallReferenceModel(walls: readonly WallNode[], nodes: Record<AnyNodeId, AnyNode>): {
|
|
17
|
+
options: WallReferenceOption[];
|
|
18
|
+
value: WallReferenceValue | null;
|
|
19
|
+
apply: (next: WallReferenceValue) => void;
|
|
20
|
+
};
|
|
3
21
|
export declare function wallSettings(node: WallNode, nodes: Record<AnyNodeId, AnyNode>, update: (patch: Partial<WallNode>) => void, reshape?: () => void): PanelRow[];
|
|
4
22
|
//# sourceMappingURL=panel-model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel-model.d.ts","sourceRoot":"","sources":["../../src/wall/panel-model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"panel-model.d.ts","sourceRoot":"","sources":["../../src/wall/panel-model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAed,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,oBAAoB,CAAA;AAiB3B,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AACnF,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAA;AAqB9E;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;;;kBAsB9E,kBAAkB;EAYnC;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,EAC1C,OAAO,GAAE,MAAM,IAId,GACA,QAAQ,EAAE,CA8LZ"}
|
package/dist/wall/panel-model.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { faceOnLine, GROUND_SUPPORT_ID, getClampedWallCurveOffset, getMaxWallCurveOffset, getWallCurveLength, justificationForFaceOnLine, normalizeWallCurveOffset, planWallJustification, roomSideFaces, terrainSupportLift, useScene, WALL_CHAIR_RAIL_DEFAULT, WALL_CROWN_DEFAULT, WALL_SKIRTING_DEFAULT, } from '@pascal-app/core';
|
|
2
2
|
import { curveReshapeScope, triggerSFX, useInteractionScope, } from '@pascal-app/editor';
|
|
3
3
|
import { useViewer } from '@pascal-app/viewer';
|
|
4
4
|
import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
|
|
@@ -12,6 +12,66 @@ const profiles = {
|
|
|
12
12
|
const pretty = (value) => value
|
|
13
13
|
.replace(/^(base|crown|rail)-/, '')
|
|
14
14
|
.replace(/(^|[- ])\w/g, (s) => s.replace('-', ' ').toUpperCase());
|
|
15
|
+
const ROOM_REFERENCE_OPTIONS = [
|
|
16
|
+
{ label: 'Outside face', value: 'outside' },
|
|
17
|
+
{ label: 'Center', value: 'center' },
|
|
18
|
+
{ label: 'Inside face', value: 'inside' },
|
|
19
|
+
];
|
|
20
|
+
const DIRECTION_REFERENCE_OPTIONS = [
|
|
21
|
+
{ label: 'Left', value: 'left' },
|
|
22
|
+
{ label: 'Center', value: 'center' },
|
|
23
|
+
{ label: 'Right', value: 'right' },
|
|
24
|
+
];
|
|
25
|
+
/** Faces a wall's reference choices name: its room sides when a room is on exactly one side. */
|
|
26
|
+
function referenceFaces(wall, nodes) {
|
|
27
|
+
const sides = roomSideFaces(nodes, wall.id);
|
|
28
|
+
return sides.inside && sides.outside
|
|
29
|
+
? { kind: 'room', outside: sides.outside, inside: sides.inside }
|
|
30
|
+
: { kind: 'direction' };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The Reference control for one or more walls. The drawn line never moves; the
|
|
34
|
+
* choice picks which face sits on it. Walls with a room on exactly one side read
|
|
35
|
+
* Outside face / Center / Inside face; otherwise Left / Center / Right along the
|
|
36
|
+
* drawing direction (left is face a). A selection shows the room labels only
|
|
37
|
+
* when every wall has them, applies each choice to each wall's own faces, and
|
|
38
|
+
* shows no active option when the walls disagree.
|
|
39
|
+
*/
|
|
40
|
+
export function wallReferenceModel(walls, nodes) {
|
|
41
|
+
const faces = walls.map((wall) => referenceFaces(wall, nodes));
|
|
42
|
+
const room = faces.length > 0 && faces.every((entry) => entry.kind === 'room');
|
|
43
|
+
const options = room ? ROOM_REFERENCE_OPTIONS : DIRECTION_REFERENCE_OPTIONS;
|
|
44
|
+
const faceFor = (index, value) => {
|
|
45
|
+
if (value === 'center')
|
|
46
|
+
return 'center';
|
|
47
|
+
if (value === 'left')
|
|
48
|
+
return 'a';
|
|
49
|
+
if (value === 'right')
|
|
50
|
+
return 'b';
|
|
51
|
+
const entry = faces[index];
|
|
52
|
+
return entry.kind === 'room' ? entry[value] : 'center';
|
|
53
|
+
};
|
|
54
|
+
const current = walls.map((wall, index) => {
|
|
55
|
+
const face = faceOnLine(wall);
|
|
56
|
+
if (face === 'center')
|
|
57
|
+
return 'center';
|
|
58
|
+
const entry = faces[index];
|
|
59
|
+
if (room && entry.kind === 'room')
|
|
60
|
+
return face === entry.outside ? 'outside' : 'inside';
|
|
61
|
+
return face === 'a' ? 'left' : 'right';
|
|
62
|
+
});
|
|
63
|
+
const value = current.every((entry) => entry === current[0]) ? (current[0] ?? null) : null;
|
|
64
|
+
return {
|
|
65
|
+
options,
|
|
66
|
+
value,
|
|
67
|
+
apply: (next) => {
|
|
68
|
+
const scene = useScene.getState();
|
|
69
|
+
const updates = walls.flatMap((wall, index) => planWallJustification(scene.nodes, wall.id, justificationForFaceOnLine(faceFor(index, next))));
|
|
70
|
+
if (updates.length > 0)
|
|
71
|
+
scene.updateNodes(updates);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
15
75
|
export function wallSettings(node, nodes, update, reshape = () => {
|
|
16
76
|
triggerSFX('sfx:item-pick');
|
|
17
77
|
useInteractionScope.getState().begin(curveReshapeScope(node.id));
|
|
@@ -51,6 +111,20 @@ export function wallSettings(node, nodes, update, reshape = () => {
|
|
|
51
111
|
previous: () => change(-1),
|
|
52
112
|
});
|
|
53
113
|
};
|
|
114
|
+
const reference = wallReferenceModel([node], nodes);
|
|
115
|
+
const step = (by) => {
|
|
116
|
+
const index = reference.options.findIndex((option) => option.value === reference.value);
|
|
117
|
+
reference.apply(reference.options[(index + by + 3) % 3].value);
|
|
118
|
+
};
|
|
119
|
+
rows.push({
|
|
120
|
+
section: 'Dimensions',
|
|
121
|
+
id: 'wall-reference',
|
|
122
|
+
kind: 'cycle',
|
|
123
|
+
label: 'Reference',
|
|
124
|
+
value: reference.options.find((option) => option.value === reference.value)?.label ?? 'Mixed',
|
|
125
|
+
next: () => step(1),
|
|
126
|
+
previous: () => step(-1),
|
|
127
|
+
});
|
|
54
128
|
const length = getWallCurveLength(node);
|
|
55
129
|
number('Dimensions', 'wall-length', 'Length', length, 0.1, 1000, 0.05, (next) => {
|
|
56
130
|
update(buildWallLengthPatch(node, next));
|
|
@@ -79,23 +153,6 @@ export function wallSettings(node, nodes, update, reshape = () => {
|
|
|
79
153
|
onSelect: reshape,
|
|
80
154
|
});
|
|
81
155
|
}
|
|
82
|
-
const bands = getWallFaceBandConfig(node, height);
|
|
83
|
-
number('Wall bands', 'wall-band-count', 'Bands', bands.count, 1, 4, 1, (count) => update(buildWallFaceBandCountPatch(node, Math.round(count))), '');
|
|
84
|
-
const band = (key, label, max) => number('Wall bands', `wall-band-${key}`, label, bands[key], 0, Math.max(0, max), 0.01, (value) => update({
|
|
85
|
-
faceBands: {
|
|
86
|
-
...WALL_FACE_BAND_DEFAULT,
|
|
87
|
-
...node.faceBands,
|
|
88
|
-
enabled: bands.count > 1,
|
|
89
|
-
count: bands.count,
|
|
90
|
-
[key]: value,
|
|
91
|
-
},
|
|
92
|
-
}));
|
|
93
|
-
if (bands.count >= 2)
|
|
94
|
-
band('lowerHeight', 'Lower', height);
|
|
95
|
-
if (bands.count >= 3)
|
|
96
|
-
band('middleHeight', 'Middle', height - bands.lowerHeight);
|
|
97
|
-
if (bands.count >= 4)
|
|
98
|
-
band('upperHeight', 'Upper', height - bands.lowerHeight - bands.middleHeight);
|
|
99
156
|
for (const [key, title, defaults] of [
|
|
100
157
|
['skirting', 'Skirting', WALL_SKIRTING_DEFAULT],
|
|
101
158
|
['crown', 'Crown molding', WALL_CROWN_DEFAULT],
|
|
@@ -106,7 +163,8 @@ export function wallSettings(node, nodes, update, reshape = () => {
|
|
|
106
163
|
choice(title, `${key}-enabled`, title, trim.enabled ? 'On' : 'Off', () => patch({ enabled: !trim.enabled }));
|
|
107
164
|
if (!trim.enabled)
|
|
108
165
|
continue;
|
|
109
|
-
|
|
166
|
+
const sides = trim.sides === 'interior' ? 'a' : trim.sides === 'exterior' ? 'b' : trim.sides;
|
|
167
|
+
cycle(title, `${key}-sides`, 'Sides', sides, ['a', 'b', 'both'], (next) => patch({ sides: next }));
|
|
110
168
|
cycle(title, `${key}-profile`, 'Profile', trim.profile, profiles[key], (profile) => patch({ profile: profile }));
|
|
111
169
|
number(title, `${key}-height`, 'Height', trim.height, 0.01, Math.max(0.05, height), 0.01, (height) => patch({ height }));
|
|
112
170
|
number(title, `${key}-proud`, 'Projection', trim.proud, 0.001, 0.2, 0.005, (proud) => patch({ proud }));
|
package/dist/wall/panel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/wall/panel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/wall/panel.tsx"],"names":[],"mappings":"AAkHA,MAAM,CAAC,OAAO,UAAU,SAAS,uCA0XhC"}
|