@pascal-app/nodes 1.0.0-beta.5 → 1.0.0
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/LICENSE +21 -0
- package/dist/block/commands.d.ts +68 -0
- package/dist/block/commands.d.ts.map +1 -0
- package/dist/block/commands.js +1144 -0
- package/dist/block/contextual-help.d.ts +3 -0
- package/dist/block/contextual-help.d.ts.map +1 -0
- package/dist/block/contextual-help.js +38 -0
- package/dist/block/definition.d.ts +8 -0
- package/dist/block/definition.d.ts.map +1 -0
- package/dist/block/definition.js +126 -0
- package/dist/block/edit-session.d.ts +16 -0
- package/dist/block/edit-session.d.ts.map +1 -0
- package/dist/block/edit-session.js +32 -0
- package/dist/block/face-host.d.ts +3 -0
- package/dist/block/face-host.d.ts.map +1 -0
- package/dist/block/face-host.js +178 -0
- package/dist/block/floorplan.d.ts +3 -0
- package/dist/block/floorplan.d.ts.map +1 -0
- package/dist/block/floorplan.js +43 -0
- package/dist/block/geometry-snap.d.ts +18 -0
- package/dist/block/geometry-snap.d.ts.map +1 -0
- package/dist/block/geometry-snap.js +137 -0
- package/dist/block/geometry.d.ts +11 -0
- package/dist/block/geometry.d.ts.map +1 -0
- package/dist/block/geometry.js +146 -0
- package/dist/block/gesture-wheel.d.ts +8 -0
- package/dist/block/gesture-wheel.d.ts.map +1 -0
- package/dist/block/gesture-wheel.js +7 -0
- package/dist/block/interaction-sfx.d.ts +3 -0
- package/dist/block/interaction-sfx.d.ts.map +1 -0
- package/dist/block/interaction-sfx.js +16 -0
- package/dist/block/last-operation.d.ts +48 -0
- package/dist/block/last-operation.d.ts.map +1 -0
- package/dist/block/last-operation.js +120 -0
- package/dist/block/loop-cut-interaction.d.ts +5 -0
- package/dist/block/loop-cut-interaction.d.ts.map +1 -0
- package/dist/block/loop-cut-interaction.js +13 -0
- package/dist/block/material-slots.d.ts +61 -0
- package/dist/block/material-slots.d.ts.map +1 -0
- package/dist/block/material-slots.js +131 -0
- package/dist/block/modal-face-operation.d.ts +13 -0
- package/dist/block/modal-face-operation.d.ts.map +1 -0
- package/dist/block/modal-face-operation.js +40 -0
- package/dist/block/modal-session.d.ts +15 -0
- package/dist/block/modal-session.d.ts.map +1 -0
- package/dist/block/modal-session.js +40 -0
- package/dist/block/modal-transform.d.ts +30 -0
- package/dist/block/modal-transform.d.ts.map +1 -0
- package/dist/block/modal-transform.js +144 -0
- package/dist/block/paint.d.ts +3 -0
- package/dist/block/paint.d.ts.map +1 -0
- package/dist/block/paint.js +136 -0
- package/dist/block/panel.d.ts +2 -0
- package/dist/block/panel.d.ts.map +1 -0
- package/dist/block/panel.js +234 -0
- package/dist/block/parametrics.d.ts +4 -0
- package/dist/block/parametrics.d.ts.map +1 -0
- package/dist/block/parametrics.js +9 -0
- package/dist/block/preview.d.ts +6 -0
- package/dist/block/preview.d.ts.map +1 -0
- package/dist/block/preview.js +46 -0
- package/dist/block/rotation-drag.d.ts +5 -0
- package/dist/block/rotation-drag.d.ts.map +1 -0
- package/dist/block/rotation-drag.js +18 -0
- package/dist/block/schema.d.ts +2 -0
- package/dist/block/schema.d.ts.map +1 -0
- package/dist/block/schema.js +1 -0
- package/dist/block/selection-geometry.d.ts +9 -0
- package/dist/block/selection-geometry.d.ts.map +1 -0
- package/dist/block/selection-geometry.js +31 -0
- package/dist/block/selection-model.d.ts +17 -0
- package/dist/block/selection-model.d.ts.map +1 -0
- package/dist/block/selection-model.js +84 -0
- package/dist/block/selection.d.ts +4 -0
- package/dist/block/selection.d.ts.map +1 -0
- package/dist/block/selection.js +2570 -0
- package/dist/block/slots.d.ts +4 -0
- package/dist/block/slots.d.ts.map +1 -0
- package/dist/block/slots.js +17 -0
- package/dist/block/tool.d.ts +3 -0
- package/dist/block/tool.d.ts.map +1 -0
- package/dist/block/tool.js +174 -0
- package/dist/block/toolbar-state.d.ts +46 -0
- package/dist/block/toolbar-state.d.ts.map +1 -0
- package/dist/block/toolbar-state.js +67 -0
- package/dist/block/use-block-face-operation.d.ts +39 -0
- package/dist/block/use-block-face-operation.d.ts.map +1 -0
- package/dist/block/use-block-face-operation.js +218 -0
- package/dist/box-vent/definition.d.ts.map +1 -1
- package/dist/box-vent/definition.js +8 -5
- package/dist/box-vent/geometry.d.ts +4 -0
- package/dist/box-vent/geometry.d.ts.map +1 -1
- package/dist/box-vent/geometry.js +76 -44
- package/dist/box-vent/paint.d.ts +4 -0
- package/dist/box-vent/paint.d.ts.map +1 -0
- package/dist/box-vent/paint.js +40 -0
- package/dist/box-vent/panel.js +1 -1
- package/dist/box-vent/parametrics.js +3 -3
- package/dist/box-vent/renderer.d.ts.map +1 -1
- package/dist/box-vent/renderer.js +29 -10
- package/dist/cabinet/compartment-card.d.ts.map +1 -1
- package/dist/cabinet/compartment-card.js +11 -3
- package/dist/cabinet/continuous-placement.d.ts +3 -0
- package/dist/cabinet/continuous-placement.d.ts.map +1 -1
- package/dist/cabinet/continuous-placement.js +6 -0
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +400 -54
- package/dist/cabinet/floorplan-move.d.ts.map +1 -1
- package/dist/cabinet/floorplan-move.js +91 -22
- package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
- package/dist/cabinet/geometry/fridge.js +25 -1
- package/dist/cabinet/geometry/fronts.d.ts +4 -0
- package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
- package/dist/cabinet/geometry/fronts.js +1 -1
- package/dist/cabinet/geometry/run.d.ts.map +1 -1
- package/dist/cabinet/geometry/run.js +19 -1
- package/dist/cabinet/geometry.d.ts.map +1 -1
- package/dist/cabinet/geometry.js +63 -1
- package/dist/cabinet/index.d.ts +1 -0
- package/dist/cabinet/index.d.ts.map +1 -1
- package/dist/cabinet/index.js +1 -0
- package/dist/cabinet/insertion.d.ts +19 -0
- package/dist/cabinet/insertion.d.ts.map +1 -0
- package/dist/cabinet/insertion.js +49 -0
- package/dist/cabinet/move-frame.d.ts.map +1 -1
- package/dist/cabinet/move-frame.js +68 -2
- package/dist/cabinet/panel-context.d.ts +7 -0
- package/dist/cabinet/panel-context.d.ts.map +1 -0
- package/dist/cabinet/panel-context.js +16 -0
- package/dist/cabinet/panel-visibility.d.ts +9 -0
- package/dist/cabinet/panel-visibility.d.ts.map +1 -0
- package/dist/cabinet/panel-visibility.js +26 -0
- package/dist/cabinet/panel.d.ts.map +1 -1
- package/dist/cabinet/panel.js +221 -37
- package/dist/cabinet/placement-dimensions.d.ts +42 -0
- package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
- package/dist/cabinet/placement-dimensions.js +227 -0
- package/dist/cabinet/placement-snap.d.ts +21 -1
- package/dist/cabinet/placement-snap.d.ts.map +1 -1
- package/dist/cabinet/placement-snap.js +48 -6
- package/dist/cabinet/preset-width-debt.d.ts +7 -0
- package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
- package/dist/cabinet/preset-width-debt.js +45 -0
- package/dist/cabinet/presets.d.ts.map +1 -1
- package/dist/cabinet/presets.js +14 -13
- package/dist/cabinet/profiles.d.ts +14 -0
- package/dist/cabinet/profiles.d.ts.map +1 -0
- package/dist/cabinet/profiles.js +30 -0
- package/dist/cabinet/quick-actions.d.ts.map +1 -1
- package/dist/cabinet/quick-actions.js +8 -24
- package/dist/cabinet/reveals.d.ts +37 -0
- package/dist/cabinet/reveals.d.ts.map +1 -0
- package/dist/cabinet/reveals.js +13 -0
- package/dist/cabinet/run-layout.d.ts +90 -4
- package/dist/cabinet/run-layout.d.ts.map +1 -1
- package/dist/cabinet/run-layout.js +408 -23
- package/dist/cabinet/run-ops.d.ts +202 -10
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/run-ops.js +520 -33
- package/dist/cabinet/run-panel.d.ts +6 -2
- package/dist/cabinet/run-panel.d.ts.map +1 -1
- package/dist/cabinet/run-panel.js +285 -108
- package/dist/cabinet/stack-transitions.d.ts.map +1 -1
- package/dist/cabinet/stack-transitions.js +35 -24
- package/dist/cabinet/stack.d.ts +169 -1
- package/dist/cabinet/stack.d.ts.map +1 -1
- package/dist/cabinet/stack.js +57 -18
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +615 -91
- package/dist/cabinet/validation.d.ts +27 -0
- package/dist/cabinet/validation.d.ts.map +1 -0
- package/dist/cabinet/validation.js +56 -0
- package/dist/cabinet/wall-height-presets.d.ts +12 -0
- package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
- package/dist/cabinet/wall-height-presets.js +15 -0
- package/dist/cabinet/wall-snap.d.ts +27 -3
- package/dist/cabinet/wall-snap.d.ts.map +1 -1
- package/dist/cabinet/wall-snap.js +278 -62
- package/dist/cabinet/widths.d.ts +10 -0
- package/dist/cabinet/widths.d.ts.map +1 -0
- package/dist/cabinet/widths.js +13 -0
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +7 -1
- package/dist/ceiling/floorplan-affordances.d.ts +8 -8
- package/dist/ceiling/materials.d.ts.map +1 -1
- package/dist/ceiling/materials.js +0 -1
- package/dist/ceiling/panel.js +1 -1
- package/dist/ceiling/parametrics.js +1 -1
- package/dist/chimney/definition.js +1 -1
- package/dist/chimney/panel.js +1 -1
- package/dist/chimney/parametrics.js +3 -3
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +22 -4
- package/dist/column/panel.d.ts.map +1 -1
- package/dist/column/panel.js +37 -7
- package/dist/column/parametrics.d.ts.map +1 -1
- package/dist/column/parametrics.js +5 -3
- package/dist/column/tool.d.ts.map +1 -1
- package/dist/column/tool.js +50 -14
- package/dist/cupola/definition.d.ts.map +1 -1
- package/dist/cupola/definition.js +15 -6
- package/dist/cupola/geometry.d.ts +6 -0
- package/dist/cupola/geometry.d.ts.map +1 -1
- package/dist/cupola/geometry.js +60 -13
- package/dist/cupola/paint.d.ts +4 -0
- package/dist/cupola/paint.d.ts.map +1 -0
- package/dist/cupola/paint.js +39 -0
- package/dist/cupola/panel.js +1 -1
- package/dist/cupola/parametrics.js +3 -3
- package/dist/cupola/renderer.d.ts.map +1 -1
- package/dist/cupola/renderer.js +27 -8
- package/dist/door/floorplan-move.d.ts.map +1 -1
- package/dist/door/floorplan-move.js +1 -1
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +86 -32
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +1 -1
- package/dist/door/parametrics.js +2 -2
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +16 -4
- package/dist/dormer/csg-geometry.d.ts +6 -42
- package/dist/dormer/csg-geometry.d.ts.map +1 -1
- package/dist/dormer/csg-geometry.js +38 -209
- package/dist/dormer/definition.d.ts +4 -12
- package/dist/dormer/definition.d.ts.map +1 -1
- package/dist/dormer/definition.js +18 -193
- package/dist/dormer/floorplan.d.ts +3 -3
- package/dist/dormer/floorplan.d.ts.map +1 -1
- package/dist/dormer/floorplan.js +6 -17
- package/dist/dormer/geometry.d.ts +5 -24
- package/dist/dormer/geometry.d.ts.map +1 -1
- package/dist/dormer/geometry.js +64 -41
- package/dist/dormer/index.d.ts +1 -1
- package/dist/dormer/index.d.ts.map +1 -1
- package/dist/dormer/index.js +1 -1
- package/dist/dormer/move-tool.d.ts.map +1 -1
- package/dist/dormer/move-tool.js +31 -3
- package/dist/dormer/panel-windows-section.d.ts +9 -0
- package/dist/dormer/panel-windows-section.d.ts.map +1 -0
- package/dist/dormer/panel-windows-section.js +7 -0
- package/dist/dormer/panel.d.ts.map +1 -1
- package/dist/dormer/panel.js +100 -18
- package/dist/dormer/parametrics.d.ts.map +1 -1
- package/dist/dormer/parametrics.js +8 -77
- package/dist/dormer/preview.d.ts.map +1 -1
- package/dist/dormer/preview.js +9 -1
- package/dist/dormer/renderer.d.ts.map +1 -1
- package/dist/dormer/renderer.js +24 -26
- package/dist/dormer/tool.d.ts.map +1 -1
- package/dist/dormer/tool.js +3 -1
- package/dist/dormer/window-layout.d.ts +15 -0
- package/dist/dormer/window-layout.d.ts.map +1 -0
- package/dist/dormer/window-layout.js +59 -0
- package/dist/downspout/definition.d.ts.map +1 -1
- package/dist/downspout/definition.js +17 -4
- package/dist/downspout/geometry.d.ts.map +1 -1
- package/dist/downspout/geometry.js +10 -0
- package/dist/downspout/inspector-editors.d.ts.map +1 -1
- package/dist/downspout/inspector-editors.js +9 -1
- package/dist/downspout/parametrics.d.ts.map +1 -1
- package/dist/downspout/parametrics.js +2 -1
- package/dist/downspout/renderer.d.ts.map +1 -1
- package/dist/downspout/renderer.js +19 -3
- package/dist/downspout/system.d.ts +7 -0
- package/dist/downspout/system.d.ts.map +1 -0
- package/dist/downspout/system.js +114 -0
- package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
- package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
- package/dist/duct-fitting/accessory-geometry.js +47 -0
- package/dist/duct-fitting/definition.d.ts.map +1 -1
- package/dist/duct-fitting/definition.js +11 -1
- package/dist/duct-fitting/floorplan.d.ts.map +1 -1
- package/dist/duct-fitting/floorplan.js +8 -0
- package/dist/duct-fitting/geometry.d.ts.map +1 -1
- package/dist/duct-fitting/geometry.js +52 -38
- package/dist/duct-fitting/parametrics.d.ts.map +1 -1
- package/dist/duct-fitting/parametrics.js +78 -15
- package/dist/duct-fitting/ports.d.ts +1 -0
- package/dist/duct-fitting/ports.d.ts.map +1 -1
- package/dist/duct-fitting/ports.js +46 -0
- package/dist/duct-fitting/tool.d.ts +19 -0
- package/dist/duct-fitting/tool.d.ts.map +1 -1
- package/dist/duct-fitting/tool.js +126 -34
- package/dist/duct-segment/continuation.d.ts +21 -0
- package/dist/duct-segment/continuation.d.ts.map +1 -0
- package/dist/duct-segment/continuation.js +167 -0
- package/dist/duct-segment/definition.d.ts.map +1 -1
- package/dist/duct-segment/definition.js +19 -18
- package/dist/duct-segment/floorplan.d.ts.map +1 -1
- package/dist/duct-segment/floorplan.js +43 -0
- package/dist/duct-segment/geometry.d.ts.map +1 -1
- package/dist/duct-segment/geometry.js +3 -0
- package/dist/duct-segment/move-tool.d.ts.map +1 -1
- package/dist/duct-segment/move-tool.js +33 -6
- package/dist/duct-segment/parametrics.d.ts.map +1 -1
- package/dist/duct-segment/parametrics.js +45 -1
- package/dist/duct-segment/selection.d.ts +3 -4
- package/dist/duct-segment/selection.d.ts.map +1 -1
- package/dist/duct-segment/selection.js +186 -158
- package/dist/duct-segment/tool.d.ts +37 -0
- package/dist/duct-segment/tool.d.ts.map +1 -1
- package/dist/duct-segment/tool.js +305 -678
- package/dist/duct-terminal/parametrics.js +2 -2
- package/dist/duct-terminal/tool.d.ts.map +1 -1
- package/dist/duct-terminal/tool.js +37 -7
- package/dist/elevator/panel.d.ts.map +1 -1
- package/dist/elevator/panel.js +7 -7
- package/dist/elevator/system.d.ts.map +1 -1
- package/dist/elevator/system.js +10 -1
- package/dist/eyebrow-vent/definition.d.ts.map +1 -1
- package/dist/eyebrow-vent/definition.js +8 -5
- package/dist/eyebrow-vent/geometry.d.ts +4 -0
- package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
- package/dist/eyebrow-vent/geometry.js +60 -15
- package/dist/eyebrow-vent/paint.d.ts +4 -0
- package/dist/eyebrow-vent/paint.d.ts.map +1 -0
- package/dist/eyebrow-vent/paint.js +33 -0
- package/dist/eyebrow-vent/panel.js +1 -1
- package/dist/eyebrow-vent/parametrics.js +3 -3
- package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
- package/dist/eyebrow-vent/renderer.js +27 -8
- package/dist/fence/definition.d.ts.map +1 -1
- package/dist/fence/definition.js +2 -1
- package/dist/fence/floorplan-affordances.d.ts +1 -0
- package/dist/fence/floorplan-affordances.d.ts.map +1 -1
- package/dist/fence/floorplan-affordances.js +30 -1
- package/dist/fence/floorplan.d.ts.map +1 -1
- package/dist/fence/floorplan.js +14 -0
- package/dist/fence/parametrics.js +3 -3
- package/dist/fence/tool.d.ts.map +1 -1
- package/dist/fence/tool.js +47 -20
- package/dist/gutter/corner-mitre.d.ts.map +1 -1
- package/dist/gutter/corner-mitre.js +47 -7
- package/dist/gutter/definition.d.ts.map +1 -1
- package/dist/gutter/definition.js +23 -13
- package/dist/gutter/eave-align.d.ts.map +1 -1
- package/dist/gutter/eave-align.js +10 -0
- package/dist/gutter/eave-snap.d.ts +1 -1
- package/dist/gutter/eave-snap.d.ts.map +1 -1
- package/dist/gutter/eave-snap.js +10 -23
- package/dist/gutter/geometry.d.ts.map +1 -1
- package/dist/gutter/geometry.js +126 -8
- package/dist/gutter/outlet-lookup.d.ts.map +1 -1
- package/dist/gutter/outlet-lookup.js +22 -1
- package/dist/gutter/paint.d.ts +3 -0
- package/dist/gutter/paint.d.ts.map +1 -0
- package/dist/gutter/paint.js +6 -0
- package/dist/gutter/parametrics.d.ts.map +1 -1
- package/dist/gutter/parametrics.js +4 -1
- package/dist/gutter/renderer.d.ts.map +1 -1
- package/dist/gutter/renderer.js +63 -7
- package/dist/gutter/trim-clip.d.ts +3 -0
- package/dist/gutter/trim-clip.d.ts.map +1 -0
- package/dist/gutter/trim-clip.js +5 -0
- package/dist/hvac-equipment/parametrics.js +3 -3
- package/dist/hvac-equipment/tool.d.ts.map +1 -1
- package/dist/hvac-equipment/tool.js +12 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/item/definition.d.ts.map +1 -1
- package/dist/item/definition.js +10 -2
- package/dist/item/floorplan-move.d.ts.map +1 -1
- package/dist/item/floorplan-move.js +20 -1
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/floorplan.js +22 -1
- package/dist/item/move-tool.d.ts +28 -1
- package/dist/item/move-tool.d.ts.map +1 -1
- package/dist/item/move-tool.js +14 -2
- package/dist/item/renderer.d.ts.map +1 -1
- package/dist/item/renderer.js +16 -6
- package/dist/item/system.d.ts +5 -0
- package/dist/item/system.d.ts.map +1 -1
- package/dist/item/system.js +7 -1
- package/dist/lean-to-extension/arc.d.ts +14 -0
- package/dist/lean-to-extension/arc.d.ts.map +1 -0
- package/dist/lean-to-extension/arc.js +56 -0
- package/dist/lean-to-extension/assembly.d.ts +61 -0
- package/dist/lean-to-extension/assembly.d.ts.map +1 -0
- package/dist/lean-to-extension/assembly.js +761 -0
- package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
- package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
- package/dist/lean-to-extension/canopy-joint.js +234 -0
- package/dist/lean-to-extension/conical-host.d.ts +15 -0
- package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
- package/dist/lean-to-extension/conical-host.js +113 -0
- package/dist/lean-to-extension/corner-joint.d.ts +29 -0
- package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
- package/dist/lean-to-extension/corner-joint.js +1202 -0
- package/dist/lean-to-extension/definition.d.ts +4 -0
- package/dist/lean-to-extension/definition.d.ts.map +1 -0
- package/dist/lean-to-extension/definition.js +433 -0
- package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
- package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-affordances.js +144 -0
- package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
- package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-move.js +157 -0
- package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
- package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-tool.js +385 -0
- package/dist/lean-to-extension/floorplan.d.ts +3 -0
- package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan.js +373 -0
- package/dist/lean-to-extension/geometry.d.ts +7 -0
- package/dist/lean-to-extension/geometry.d.ts.map +1 -0
- package/dist/lean-to-extension/geometry.js +662 -0
- package/dist/lean-to-extension/index.d.ts +8 -0
- package/dist/lean-to-extension/index.d.ts.map +1 -0
- package/dist/lean-to-extension/index.js +7 -0
- package/dist/lean-to-extension/layout.d.ts +108 -0
- package/dist/lean-to-extension/layout.d.ts.map +1 -0
- package/dist/lean-to-extension/layout.js +477 -0
- package/dist/lean-to-extension/managed-preview.d.ts +3 -0
- package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
- package/dist/lean-to-extension/managed-preview.js +93 -0
- package/dist/lean-to-extension/move-tool.d.ts +8 -0
- package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
- package/dist/lean-to-extension/move-tool.js +202 -0
- package/dist/lean-to-extension/paint.d.ts +2 -0
- package/dist/lean-to-extension/paint.d.ts.map +1 -0
- package/dist/lean-to-extension/paint.js +16 -0
- package/dist/lean-to-extension/parametrics.d.ts +4 -0
- package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
- package/dist/lean-to-extension/parametrics.js +570 -0
- package/dist/lean-to-extension/placement-scope.d.ts +3 -0
- package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
- package/dist/lean-to-extension/placement-scope.js +4 -0
- package/dist/lean-to-extension/placement-validation.d.ts +4 -0
- package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
- package/dist/lean-to-extension/placement-validation.js +324 -0
- package/dist/lean-to-extension/placement.d.ts +59 -0
- package/dist/lean-to-extension/placement.d.ts.map +1 -0
- package/dist/lean-to-extension/placement.js +331 -0
- package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
- package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
- package/dist/lean-to-extension/plan-footprint.js +27 -0
- package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
- package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
- package/dist/lean-to-extension/preview-geometry.js +40 -0
- package/dist/lean-to-extension/preview.d.ts +7 -0
- package/dist/lean-to-extension/preview.d.ts.map +1 -0
- package/dist/lean-to-extension/preview.js +20 -0
- package/dist/lean-to-extension/renderer.d.ts +6 -0
- package/dist/lean-to-extension/renderer.d.ts.map +1 -0
- package/dist/lean-to-extension/renderer.js +34 -0
- package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
- package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
- package/dist/lean-to-extension/roof-attachment.js +376 -0
- package/dist/lean-to-extension/schema.d.ts +2 -0
- package/dist/lean-to-extension/schema.d.ts.map +1 -0
- package/dist/lean-to-extension/schema.js +1 -0
- package/dist/lean-to-extension/slots.d.ts +5 -0
- package/dist/lean-to-extension/slots.d.ts.map +1 -0
- package/dist/lean-to-extension/slots.js +15 -0
- package/dist/lean-to-extension/system.d.ts +7 -0
- package/dist/lean-to-extension/system.d.ts.map +1 -0
- package/dist/lean-to-extension/system.js +726 -0
- package/dist/lean-to-extension/tool.d.ts +3 -0
- package/dist/lean-to-extension/tool.d.ts.map +1 -0
- package/dist/lean-to-extension/tool.js +580 -0
- package/dist/lean-to-extension/wall-target.d.ts +10 -0
- package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
- package/dist/lean-to-extension/wall-target.js +29 -0
- package/dist/lineset/definition.d.ts.map +1 -1
- package/dist/lineset/definition.js +1 -0
- package/dist/liquid-line/definition.d.ts.map +1 -1
- package/dist/liquid-line/definition.js +1 -0
- package/dist/pipe-fitting/definition.d.ts.map +1 -1
- package/dist/pipe-fitting/definition.js +16 -2
- package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
- package/dist/pipe-fitting/floorplan.js +4 -0
- package/dist/pipe-fitting/geometry.d.ts +3 -5
- package/dist/pipe-fitting/geometry.d.ts.map +1 -1
- package/dist/pipe-fitting/geometry.js +154 -21
- package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
- package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
- package/dist/pipe-fitting/inline-insertion.js +96 -0
- package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
- package/dist/pipe-fitting/parametrics.js +17 -3
- package/dist/pipe-fitting/ports.d.ts.map +1 -1
- package/dist/pipe-fitting/ports.js +8 -1
- package/dist/pipe-fitting/tool.d.ts +26 -0
- package/dist/pipe-fitting/tool.d.ts.map +1 -1
- package/dist/pipe-fitting/tool.js +182 -37
- package/dist/pipe-segment/continuation.d.ts +22 -0
- package/dist/pipe-segment/continuation.d.ts.map +1 -0
- package/dist/pipe-segment/continuation.js +146 -0
- package/dist/pipe-segment/definition.d.ts.map +1 -1
- package/dist/pipe-segment/definition.js +23 -7
- package/dist/pipe-segment/floorplan.d.ts.map +1 -1
- package/dist/pipe-segment/floorplan.js +42 -0
- package/dist/pipe-segment/geometry.d.ts +2 -1
- package/dist/pipe-segment/geometry.d.ts.map +1 -1
- package/dist/pipe-segment/geometry.js +4 -1
- package/dist/pipe-segment/move-tool.d.ts.map +1 -1
- package/dist/pipe-segment/move-tool.js +25 -5
- package/dist/pipe-segment/parametrics.d.ts.map +1 -1
- package/dist/pipe-segment/parametrics.js +45 -0
- package/dist/pipe-segment/selection.d.ts +3 -4
- package/dist/pipe-segment/selection.d.ts.map +1 -1
- package/dist/pipe-segment/selection.js +169 -105
- package/dist/pipe-segment/slope.d.ts +5 -0
- package/dist/pipe-segment/slope.d.ts.map +1 -0
- package/dist/pipe-segment/slope.js +10 -0
- package/dist/pipe-segment/tool.d.ts.map +1 -1
- package/dist/pipe-segment/tool.js +325 -545
- package/dist/pipe-trap/tool.d.ts.map +1 -1
- package/dist/pipe-trap/tool.js +15 -2
- package/dist/ridge-vent/definition.js +1 -1
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +2 -2
- package/dist/ridge-vent/parametrics.js +1 -1
- package/dist/roof/conical-roof-placement.d.ts +36 -0
- package/dist/roof/conical-roof-placement.d.ts.map +1 -0
- package/dist/roof/conical-roof-placement.js +134 -0
- package/dist/roof/conical-roof.d.ts +3 -0
- package/dist/roof/conical-roof.d.ts.map +1 -0
- package/dist/roof/conical-roof.js +53 -0
- package/dist/roof/definition.d.ts +3 -10
- package/dist/roof/definition.d.ts.map +1 -1
- package/dist/roof/definition.js +83 -13
- package/dist/roof/floorplan.d.ts +3 -10
- package/dist/roof/floorplan.d.ts.map +1 -1
- package/dist/roof/floorplan.js +139 -165
- package/dist/roof/index.d.ts +1 -0
- package/dist/roof/index.d.ts.map +1 -1
- package/dist/roof/index.js +1 -0
- package/dist/roof/panel.d.ts.map +1 -1
- package/dist/roof/panel.js +22 -23
- package/dist/roof/renderer.d.ts.map +1 -1
- package/dist/roof/roof-footprint-source.d.ts +16 -0
- package/dist/roof/roof-footprint-source.d.ts.map +1 -0
- package/dist/roof/roof-footprint-source.js +14 -0
- package/dist/roof/roof-footprint.d.ts +25 -0
- package/dist/roof/roof-footprint.d.ts.map +1 -0
- package/dist/roof/roof-footprint.js +94 -0
- package/dist/roof/roof-placement-mode.d.ts +18 -0
- package/dist/roof/roof-placement-mode.d.ts.map +1 -0
- package/dist/roof/roof-placement-mode.js +24 -0
- package/dist/roof/tool.d.ts +10 -0
- package/dist/roof/tool.d.ts.map +1 -0
- package/dist/roof/tool.js +922 -0
- package/dist/roof-segment/definition.d.ts.map +1 -1
- package/dist/roof-segment/definition.js +52 -8
- package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
- package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
- package/dist/roof-segment/floorplan-affordances.js +64 -18
- package/dist/roof-segment/floorplan.d.ts +3 -2
- package/dist/roof-segment/floorplan.d.ts.map +1 -1
- package/dist/roof-segment/floorplan.js +95 -46
- package/dist/roof-segment/panel.d.ts.map +1 -1
- package/dist/roof-segment/panel.js +122 -27
- package/dist/scan/definition.d.ts +2 -3
- package/dist/scan/definition.d.ts.map +1 -1
- package/dist/scan/definition.js +9 -7
- package/dist/scan/parametrics.d.ts.map +1 -1
- package/dist/scan/parametrics.js +13 -1
- package/dist/scan/renderer.d.ts.map +1 -1
- package/dist/scan/renderer.js +8 -2
- package/dist/shared/accessory-cursor.d.ts +7 -0
- package/dist/shared/accessory-cursor.d.ts.map +1 -0
- package/dist/shared/accessory-cursor.js +83 -0
- package/dist/shared/accessory-floorplan.d.ts +4 -0
- package/dist/shared/accessory-floorplan.d.ts.map +1 -0
- package/dist/shared/accessory-floorplan.js +51 -0
- package/dist/shared/accessory-geometry.d.ts +7 -0
- package/dist/shared/accessory-geometry.d.ts.map +1 -0
- package/dist/shared/accessory-geometry.js +79 -0
- package/dist/shared/accessory-placement.d.ts +10 -0
- package/dist/shared/accessory-placement.d.ts.map +1 -0
- package/dist/shared/accessory-placement.js +126 -0
- package/dist/shared/accessory-snapping.d.ts +5 -0
- package/dist/shared/accessory-snapping.d.ts.map +1 -0
- package/dist/shared/accessory-snapping.js +40 -0
- package/dist/shared/automatic-run-end-cap.d.ts +11 -0
- package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
- package/dist/shared/automatic-run-end-cap.js +159 -0
- package/dist/shared/block-face-host.d.ts +15 -0
- package/dist/shared/block-face-host.d.ts.map +1 -0
- package/dist/shared/block-face-host.js +36 -0
- package/dist/shared/connection-compatibility.d.ts +8 -0
- package/dist/shared/connection-compatibility.d.ts.map +1 -0
- package/dist/shared/connection-compatibility.js +28 -0
- package/dist/shared/connection-feedback.d.ts +10 -0
- package/dist/shared/connection-feedback.d.ts.map +1 -0
- package/dist/shared/connection-feedback.js +17 -0
- package/dist/shared/distribution-run-contract.d.ts +49 -0
- package/dist/shared/distribution-run-contract.d.ts.map +1 -0
- package/dist/shared/distribution-run-contract.js +30 -0
- package/dist/shared/distribution-run-tool.d.ts +107 -0
- package/dist/shared/distribution-run-tool.d.ts.map +1 -0
- package/dist/shared/distribution-run-tool.js +941 -0
- package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
- package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
- package/dist/shared/dormer-wall-opening-placement.js +101 -0
- package/dist/shared/duct-adapter.d.ts +10 -0
- package/dist/shared/duct-adapter.d.ts.map +1 -0
- package/dist/shared/duct-adapter.js +43 -0
- package/dist/shared/elbow-branch-continuation.d.ts +20 -0
- package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
- package/dist/shared/elbow-branch-continuation.js +200 -0
- package/dist/shared/fitting-clearance.d.ts +5 -0
- package/dist/shared/fitting-clearance.d.ts.map +1 -0
- package/dist/shared/fitting-clearance.js +11 -0
- package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
- package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
- package/dist/shared/fitting-deletion-cleanup.js +297 -0
- package/dist/shared/fitting-surface-support.d.ts +5 -0
- package/dist/shared/fitting-surface-support.d.ts.map +1 -0
- package/dist/shared/fitting-surface-support.js +42 -0
- package/dist/shared/fitting-tool-options.d.ts +4 -0
- package/dist/shared/fitting-tool-options.d.ts.map +1 -0
- package/dist/shared/fitting-tool-options.js +175 -0
- package/dist/shared/floor-placement.d.ts +1 -1
- package/dist/shared/floor-placement.d.ts.map +1 -1
- package/dist/shared/floor-placement.js +13 -33
- package/dist/shared/ghost-materials.d.ts.map +1 -1
- package/dist/shared/ghost-materials.js +2 -1
- package/dist/shared/lean-to-post-omissions.d.ts +8 -0
- package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
- package/dist/shared/lean-to-post-omissions.js +51 -0
- package/dist/shared/mep-fitting-actions.d.ts +5 -0
- package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
- package/dist/shared/mep-fitting-actions.js +16 -0
- package/dist/shared/mep-presets.d.ts +11 -0
- package/dist/shared/mep-presets.d.ts.map +1 -0
- package/dist/shared/mep-presets.js +34 -0
- package/dist/shared/node-batch/candidates.d.ts +29 -0
- package/dist/shared/node-batch/candidates.d.ts.map +1 -0
- package/dist/shared/node-batch/candidates.js +260 -0
- package/dist/shared/node-batch/store.d.ts +26 -0
- package/dist/shared/node-batch/store.d.ts.map +1 -0
- package/dist/shared/node-batch/store.js +319 -0
- package/dist/shared/node-batch/system.d.ts +8 -0
- package/dist/shared/node-batch/system.d.ts.map +1 -0
- package/dist/shared/node-batch/system.js +569 -0
- package/dist/shared/node-batch/types.d.ts +99 -0
- package/dist/shared/node-batch/types.d.ts.map +1 -0
- package/dist/shared/node-batch/types.js +4 -0
- package/dist/shared/opening-move-history.d.ts +47 -0
- package/dist/shared/opening-move-history.d.ts.map +1 -0
- package/dist/shared/opening-move-history.js +18 -0
- package/dist/shared/opening-move-wall-gate.d.ts +55 -0
- package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
- package/dist/shared/opening-move-wall-gate.js +44 -0
- package/dist/shared/path-point-affordance.d.ts +2 -2
- package/dist/shared/path-point-affordance.d.ts.map +1 -1
- package/dist/shared/path-point-affordance.js +30 -6
- package/dist/shared/placeholder-geometry.d.ts.map +1 -1
- package/dist/shared/placeholder-geometry.js +4 -0
- package/dist/shared/ports.d.ts +20 -3
- package/dist/shared/ports.d.ts.map +1 -1
- package/dist/shared/ports.js +148 -7
- package/dist/shared/primitive-uv.d.ts +17 -0
- package/dist/shared/primitive-uv.d.ts.map +1 -0
- package/dist/shared/primitive-uv.js +107 -0
- package/dist/shared/reducer-size.d.ts +2 -0
- package/dist/shared/reducer-size.d.ts.map +1 -0
- package/dist/shared/reducer-size.js +12 -0
- package/dist/shared/ridge-snap.js +1 -1
- package/dist/shared/roof-surface.d.ts.map +1 -1
- package/dist/shared/roof-surface.js +17 -2
- package/dist/shared/run-cursor.d.ts +22 -0
- package/dist/shared/run-cursor.d.ts.map +1 -0
- package/dist/shared/run-cursor.js +19 -0
- package/dist/shared/run-direction-feedback.d.ts +20 -0
- package/dist/shared/run-direction-feedback.d.ts.map +1 -0
- package/dist/shared/run-direction-feedback.js +139 -0
- package/dist/shared/run-hanger-controls.d.ts +7 -0
- package/dist/shared/run-hanger-controls.d.ts.map +1 -0
- package/dist/shared/run-hanger-controls.js +44 -0
- package/dist/shared/run-hanger-inspector.d.ts +5 -0
- package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
- package/dist/shared/run-hanger-inspector.js +43 -0
- package/dist/shared/run-hanger-mode.d.ts +11 -0
- package/dist/shared/run-hanger-mode.d.ts.map +1 -0
- package/dist/shared/run-hanger-mode.js +32 -0
- package/dist/shared/run-hanger-system.d.ts +3 -0
- package/dist/shared/run-hanger-system.d.ts.map +1 -0
- package/dist/shared/run-hanger-system.js +39 -0
- package/dist/shared/run-hangers.d.ts +25 -0
- package/dist/shared/run-hangers.d.ts.map +1 -0
- package/dist/shared/run-hangers.js +261 -0
- package/dist/shared/run-port-snap.d.ts +11 -0
- package/dist/shared/run-port-snap.d.ts.map +1 -0
- package/dist/shared/run-port-snap.js +19 -0
- package/dist/shared/run-screen-direction.d.ts +5 -0
- package/dist/shared/run-screen-direction.d.ts.map +1 -0
- package/dist/shared/run-screen-direction.js +24 -0
- package/dist/shared/selection-handles.d.ts +4 -0
- package/dist/shared/selection-handles.d.ts.map +1 -1
- package/dist/shared/selection-handles.js +10 -0
- package/dist/shared/slot-paint.d.ts +8 -1
- package/dist/shared/slot-paint.d.ts.map +1 -1
- package/dist/shared/slot-paint.js +120 -27
- package/dist/shared/surface-paint.d.ts +1 -2
- package/dist/shared/surface-paint.d.ts.map +1 -1
- package/dist/shared/surface-paint.js +9 -20
- package/dist/shared/system-check-panel.d.ts +6 -0
- package/dist/shared/system-check-panel.d.ts.map +1 -0
- package/dist/shared/system-check-panel.js +62 -0
- package/dist/shared/system-checks.d.ts +9 -0
- package/dist/shared/system-checks.d.ts.map +1 -0
- package/dist/shared/system-checks.js +131 -0
- package/dist/shared/wall-attach-target.d.ts +14 -2
- package/dist/shared/wall-attach-target.d.ts.map +1 -1
- package/dist/shared/wall-attach-target.js +108 -4
- package/dist/shared/wall-opening-clearance.d.ts +19 -0
- package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
- package/dist/shared/wall-opening-clearance.js +28 -0
- package/dist/shared/wall-run-move.d.ts +17 -0
- package/dist/shared/wall-run-move.d.ts.map +1 -0
- package/dist/shared/wall-run-move.js +56 -0
- package/dist/shelf/parametrics.js +4 -4
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +40 -28
- package/dist/site/terrain-geometry.d.ts +1 -1
- package/dist/site/terrain-geometry.d.ts.map +1 -1
- package/dist/site/terrain-geometry.js +35 -9
- package/dist/site/terrain-mesh.d.ts +5 -0
- package/dist/site/terrain-mesh.d.ts.map +1 -1
- package/dist/site/terrain-mesh.js +63 -34
- package/dist/skylight/definition.js +1 -1
- package/dist/skylight/panel.js +1 -1
- package/dist/skylight/parametrics.js +2 -2
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +6 -1
- package/dist/slab/dependency-tracker.d.ts +3 -0
- package/dist/slab/dependency-tracker.d.ts.map +1 -0
- package/dist/slab/dependency-tracker.js +104 -0
- package/dist/slab/floorplan-affordances.d.ts +8 -8
- package/dist/slab/geometry.d.ts.map +1 -1
- package/dist/slab/geometry.js +16 -2
- package/dist/slab/panel.js +1 -1
- package/dist/slab/parametrics.js +1 -1
- package/dist/slab/system.d.ts.map +1 -1
- package/dist/slab/system.js +8 -64
- package/dist/solar-panel/definition.js +1 -1
- package/dist/solar-panel/panel.js +1 -1
- package/dist/solar-panel/parametrics.js +2 -2
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +18 -13
- package/dist/stair/stair-type.d.ts +18 -0
- package/dist/stair/stair-type.d.ts.map +1 -0
- package/dist/stair/stair-type.js +25 -0
- package/dist/stair-segment/panel.d.ts.map +1 -1
- package/dist/stair-segment/panel.js +44 -5
- package/dist/turbine-vent/definition.d.ts.map +1 -1
- package/dist/turbine-vent/definition.js +8 -5
- package/dist/turbine-vent/geometry.d.ts.map +1 -1
- package/dist/turbine-vent/geometry.js +48 -18
- package/dist/turbine-vent/paint.d.ts +4 -0
- package/dist/turbine-vent/paint.d.ts.map +1 -0
- package/dist/turbine-vent/paint.js +35 -0
- package/dist/turbine-vent/panel.js +1 -1
- package/dist/turbine-vent/parametrics.js +2 -2
- package/dist/turbine-vent/renderer.d.ts.map +1 -1
- package/dist/turbine-vent/renderer.js +31 -9
- package/dist/wall/curve-eligibility.d.ts +3 -0
- package/dist/wall/curve-eligibility.d.ts.map +1 -0
- package/dist/wall/curve-eligibility.js +10 -0
- package/dist/wall/curve-tool.d.ts.map +1 -1
- package/dist/wall/curve-tool.js +8 -11
- package/dist/wall/definition.d.ts +1 -1
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +36 -13
- package/dist/wall/floorplan-affordances.d.ts +1 -0
- package/dist/wall/floorplan-affordances.d.ts.map +1 -1
- package/dist/wall/floorplan-affordances.js +46 -7
- package/dist/wall/floorplan-move.d.ts +3 -4
- package/dist/wall/floorplan-move.d.ts.map +1 -1
- package/dist/wall/floorplan-move.js +122 -9
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +19 -23
- package/dist/wall/move-shared.d.ts.map +1 -1
- package/dist/wall/move-shared.js +10 -7
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +2 -0
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +10 -17
- package/dist/wall/parametrics.js +2 -2
- package/dist/wall/pointer-transparency.d.ts +128 -0
- package/dist/wall/pointer-transparency.d.ts.map +1 -0
- package/dist/wall/pointer-transparency.js +147 -0
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +65 -8
- package/dist/wall/selection-hit-owner.d.ts +53 -0
- package/dist/wall/selection-hit-owner.d.ts.map +1 -0
- package/dist/wall/selection-hit-owner.js +79 -0
- package/dist/wall/system.d.ts +2 -0
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +66 -25
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +5 -0
- package/dist/wall/treatment-level-data.d.ts +6 -1
- package/dist/wall/treatment-level-data.d.ts.map +1 -1
- package/dist/wall/treatment-level-data.js +82 -5
- package/dist/wall/treatments.d.ts +1 -0
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +5 -0
- package/dist/wall/wall-batch-system.d.ts +38 -6
- package/dist/wall/wall-batch-system.d.ts.map +1 -1
- package/dist/wall/wall-batch-system.js +122 -25
- package/dist/wall/wall-batch.js +2 -2
- package/dist/window/definition.d.ts +2 -1
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +51 -24
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +1 -1
- package/dist/window/move-tool.d.ts +7 -5
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +344 -58
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +2 -0
- package/dist/window/parametrics.js +2 -2
- package/dist/window/renderer.d.ts.map +1 -1
- package/dist/window/renderer.js +5 -7
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +227 -13
- package/dist/zone/floorplan-affordances.d.ts +12 -12
- package/package.json +11 -9
- package/dist/dormer/panel-window-section.d.ts +0 -14
- package/dist/dormer/panel-window-section.d.ts.map +0 -1
- package/dist/dormer/panel-window-section.js +0 -59
- package/dist/dormer/window-assembly.d.ts +0 -22
- package/dist/dormer/window-assembly.d.ts.map +0 -1
- package/dist/dormer/window-assembly.js +0 -111
- package/dist/dormer/window-frame.d.ts +0 -24
- package/dist/dormer/window-frame.d.ts.map +0 -1
- package/dist/dormer/window-frame.js +0 -100
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/** Return cumulative metre distances along a sampled open or closed profile. */
|
|
3
|
+
export function cumulativeProfileDistances(points) {
|
|
4
|
+
const distances = [0];
|
|
5
|
+
for (let index = 1; index < points.length; index += 1) {
|
|
6
|
+
const previous = points[index - 1];
|
|
7
|
+
const current = points[index];
|
|
8
|
+
distances.push(distances[index - 1] +
|
|
9
|
+
Math.hypot(current[0] - previous[0], current[1] - previous[1], current[2] - previous[2]));
|
|
10
|
+
}
|
|
11
|
+
return distances;
|
|
12
|
+
}
|
|
13
|
+
/** Project a flat polygon into metre-scaled UV coordinates without shearing trapezoids. */
|
|
14
|
+
export function planarMetricUvs(points, normal, uOffset = 0, vOffset = 0) {
|
|
15
|
+
const origin = points[0];
|
|
16
|
+
const uTarget = points[1];
|
|
17
|
+
const ux = uTarget[0] - origin[0];
|
|
18
|
+
const uy = uTarget[1] - origin[1];
|
|
19
|
+
const uz = uTarget[2] - origin[2];
|
|
20
|
+
const uLength = Math.hypot(ux, uy, uz) || 1;
|
|
21
|
+
const unitU = [ux / uLength, uy / uLength, uz / uLength];
|
|
22
|
+
const normalLength = Math.hypot(normal[0], normal[1], normal[2]) || 1;
|
|
23
|
+
const unitNormal = [
|
|
24
|
+
normal[0] / normalLength,
|
|
25
|
+
normal[1] / normalLength,
|
|
26
|
+
normal[2] / normalLength,
|
|
27
|
+
];
|
|
28
|
+
const unitV = [
|
|
29
|
+
unitNormal[1] * unitU[2] - unitNormal[2] * unitU[1],
|
|
30
|
+
unitNormal[2] * unitU[0] - unitNormal[0] * unitU[2],
|
|
31
|
+
unitNormal[0] * unitU[1] - unitNormal[1] * unitU[0],
|
|
32
|
+
];
|
|
33
|
+
return points.map((point) => {
|
|
34
|
+
const x = point[0] - origin[0];
|
|
35
|
+
const y = point[1] - origin[1];
|
|
36
|
+
const z = point[2] - origin[2];
|
|
37
|
+
return [
|
|
38
|
+
uOffset + x * unitU[0] + y * unitU[1] + z * unitU[2],
|
|
39
|
+
vOffset + x * unitV[0] + y * unitV[1] + z * unitV[2],
|
|
40
|
+
];
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Reuse the authored unwrap for AO and light maps, which read texture channel 2. */
|
|
44
|
+
export function copyUvToSecondaryChannel(geometry) {
|
|
45
|
+
const uv = geometry.getAttribute('uv');
|
|
46
|
+
if (uv)
|
|
47
|
+
geometry.setAttribute('uv2', uv.clone());
|
|
48
|
+
}
|
|
49
|
+
/** Apply metre-scaled planar UVs to a non-indexed, axis-aligned primitive. */
|
|
50
|
+
export function applyPlanarWorldUvs(geometry) {
|
|
51
|
+
const position = geometry.getAttribute('position');
|
|
52
|
+
const normal = geometry.getAttribute('normal');
|
|
53
|
+
const uvs = new Float32Array(position.count * 2);
|
|
54
|
+
for (let triangle = 0; triangle < position.count; triangle += 3) {
|
|
55
|
+
const nx = Math.abs(normal.getX(triangle));
|
|
56
|
+
const ny = Math.abs(normal.getY(triangle));
|
|
57
|
+
const nz = Math.abs(normal.getZ(triangle));
|
|
58
|
+
for (let corner = 0; corner < 3; corner += 1) {
|
|
59
|
+
const index = triangle + corner;
|
|
60
|
+
const x = position.getX(index);
|
|
61
|
+
const y = position.getY(index);
|
|
62
|
+
const z = position.getZ(index);
|
|
63
|
+
if (ny >= nx && ny >= nz) {
|
|
64
|
+
uvs[index * 2] = x;
|
|
65
|
+
uvs[index * 2 + 1] = z;
|
|
66
|
+
}
|
|
67
|
+
else if (nx >= nz) {
|
|
68
|
+
uvs[index * 2] = z;
|
|
69
|
+
uvs[index * 2 + 1] = y;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
uvs[index * 2] = x;
|
|
73
|
+
uvs[index * 2 + 1] = y;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
geometry.setAttribute('uv', new THREE.BufferAttribute(uvs, 2));
|
|
78
|
+
}
|
|
79
|
+
/** Scale cylinder/cone side UVs by circumference and height; caps use XZ metres. */
|
|
80
|
+
export function applyCylinderWorldUvs(geometry, radius, height) {
|
|
81
|
+
const position = geometry.getAttribute('position');
|
|
82
|
+
const normal = geometry.getAttribute('normal');
|
|
83
|
+
const sourceUv = geometry.getAttribute('uv');
|
|
84
|
+
const uvs = new Float32Array(position.count * 2);
|
|
85
|
+
const circumference = Math.PI * 2 * radius;
|
|
86
|
+
for (let index = 0; index < position.count; index += 1) {
|
|
87
|
+
if (Math.abs(normal.getY(index)) < 0.5) {
|
|
88
|
+
uvs[index * 2] = sourceUv.getX(index) * circumference;
|
|
89
|
+
uvs[index * 2 + 1] = (sourceUv.getY(index) - 0.5) * height;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
uvs[index * 2] = position.getX(index);
|
|
93
|
+
uvs[index * 2 + 1] = position.getZ(index);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
geometry.setAttribute('uv', new THREE.BufferAttribute(uvs, 2));
|
|
97
|
+
}
|
|
98
|
+
/** Scale a sphere's equirectangular UVs to its circumference and pole distance. */
|
|
99
|
+
export function applySphereWorldUvs(geometry, radius) {
|
|
100
|
+
const sourceUv = geometry.getAttribute('uv');
|
|
101
|
+
const uvs = new Float32Array(sourceUv.count * 2);
|
|
102
|
+
for (let index = 0; index < sourceUv.count; index += 1) {
|
|
103
|
+
uvs[index * 2] = sourceUv.getX(index) * Math.PI * 2 * radius;
|
|
104
|
+
uvs[index * 2 + 1] = sourceUv.getY(index) * Math.PI * radius;
|
|
105
|
+
}
|
|
106
|
+
geometry.setAttribute('uv', new THREE.BufferAttribute(uvs, 2));
|
|
107
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer-size.d.ts","sourceRoot":"","sources":["../../src/shared/reducer-size.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,GAAG,cAAc,EACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAOR"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const DUCT_SIZES = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 24, 30, 36, 48];
|
|
2
|
+
const PIPE_SIZES = [1.25, 1.5, 2, 3, 4, 6, 8, 10, 12, 16];
|
|
3
|
+
export function reducerOutletDiameter(kind, inlet, outlet) {
|
|
4
|
+
if (Math.abs(inlet - outlet) > 0.000001)
|
|
5
|
+
return outlet;
|
|
6
|
+
const sizes = kind === 'duct-fitting' ? DUCT_SIZES : PIPE_SIZES;
|
|
7
|
+
for (let i = sizes.length - 1; i >= 0; i--) {
|
|
8
|
+
if (sizes[i] < inlet)
|
|
9
|
+
return sizes[i];
|
|
10
|
+
}
|
|
11
|
+
return sizes.find((size) => size > inlet) ?? outlet;
|
|
12
|
+
}
|
|
@@ -23,7 +23,7 @@ import { getRidgeVentLinesForSegment, getRoofSegmentVisibleTopBounds, } from '@p
|
|
|
23
23
|
export const RIDGE_LIFT = 0.09;
|
|
24
24
|
export function resolveRidgeSnap(segment, cursorLocalX, cursorLocalZ) {
|
|
25
25
|
const roofType = segment.roofType ?? 'gable';
|
|
26
|
-
if (roofType === 'flat')
|
|
26
|
+
if (roofType === 'flat' || roofType === 'conical')
|
|
27
27
|
return null;
|
|
28
28
|
const lines = roofType === 'shed'
|
|
29
29
|
? getShedHighEaveLine(segment)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roof-surface.d.ts","sourceRoot":"","sources":["../../src/shared/roof-surface.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"roof-surface.d.ts","sourceRoot":"","sources":["../../src/shared/roof-surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAEhF;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAEvF;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjD,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5C,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IACpD,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;CACrD,CAAA;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,qBAAqB,CAkBvB;AAyVD,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,eAAe,EACpB,GAAG,gBAAsB,GACxB,KAAK,CAAC,OAAO,CAkHf;AAOD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,oBAqBjF;AAQD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAIpF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getRoofModuleFaces, getRoofSegmentSurfaceY, getRoofShapeInsets, getRoofShapeRatios, getSegmentSlopeFrame, ROOF_SHAPE_DEFAULTS, } from '@pascal-app/core';
|
|
1
|
+
import { getConicalRoofCoverage, getRoofModuleFaces, getRoofSegmentSurfaceY, getRoofShapeInsets, getRoofShapeRatios, getSegmentSlopeFrame, ROOF_SHAPE_DEFAULTS, } from '@pascal-app/core';
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
// ─── Roof-surface helpers ────────────────────────────────────────────
|
|
4
4
|
// Analytical slope geometry for a roof segment, shared by every roof
|
|
@@ -51,6 +51,7 @@ function getRoofSurfaceFaces(segment) {
|
|
|
51
51
|
return faces;
|
|
52
52
|
}
|
|
53
53
|
function roofSurfaceFaceCacheKey(segment) {
|
|
54
|
+
const conicalCoverage = getConicalRoofCoverage(segment);
|
|
54
55
|
return [
|
|
55
56
|
segment.roofType,
|
|
56
57
|
segment.width,
|
|
@@ -61,6 +62,8 @@ function roofSurfaceFaceCacheKey(segment) {
|
|
|
61
62
|
segment.overhang,
|
|
62
63
|
segment.shingleThickness,
|
|
63
64
|
segment.pitch,
|
|
65
|
+
conicalCoverage.startAngle,
|
|
66
|
+
conicalCoverage.sweepAngle,
|
|
64
67
|
segment.gambrelLowerWidthRatio ?? ROOF_SHAPE_DEFAULTS.gambrelLowerWidthRatio,
|
|
65
68
|
segment.gambrelLowerHeightRatio ?? ROOF_SHAPE_DEFAULTS.gambrelLowerHeightRatio,
|
|
66
69
|
segment.mansardSteepWidthRatio ?? ROOF_SHAPE_DEFAULTS.mansardSteepWidthRatio,
|
|
@@ -71,6 +74,7 @@ function roofSurfaceFaceCacheKey(segment) {
|
|
|
71
74
|
].join('|');
|
|
72
75
|
}
|
|
73
76
|
function buildRoofSurfaceFaces(segment) {
|
|
77
|
+
const conicalCoverage = getConicalRoofCoverage(segment);
|
|
74
78
|
const { roofType, width, depth, wallHeight, wallThickness, deckThickness, overhang } = segment;
|
|
75
79
|
const { activeRh, tanTheta, cosTheta, sinTheta } = getSegmentSlopeFrame(segment);
|
|
76
80
|
const verticalRt = activeRh > 0 ? deckThickness / cosTheta : deckThickness;
|
|
@@ -92,7 +96,10 @@ function buildRoofSurfaceFaces(segment) {
|
|
|
92
96
|
let shinTopW = shinBotW;
|
|
93
97
|
let shinTopD = shinBotD;
|
|
94
98
|
let transZ = 0;
|
|
95
|
-
if (roofType === 'hip' ||
|
|
99
|
+
if (roofType === 'hip' ||
|
|
100
|
+
roofType === 'mansard' ||
|
|
101
|
+
roofType === 'dutch' ||
|
|
102
|
+
roofType === 'conical') {
|
|
96
103
|
shinTopW += 2 * stSin;
|
|
97
104
|
shinTopD += 2 * stSin;
|
|
98
105
|
}
|
|
@@ -146,6 +153,8 @@ function buildRoofSurfaceFaces(segment) {
|
|
|
146
153
|
tanTheta,
|
|
147
154
|
shapeRatios,
|
|
148
155
|
dutchTopRakeThickness: segment.dutchTopRakeThickness,
|
|
156
|
+
conicalStartAngle: conicalCoverage.startAngle,
|
|
157
|
+
conicalSweepAngle: conicalCoverage.sweepAngle,
|
|
149
158
|
})
|
|
150
159
|
.filter((face) => faceNormalY(face) > SHINGLE_SURFACE_EPSILON)
|
|
151
160
|
.map((face) => {
|
|
@@ -361,6 +370,12 @@ export function getAnalyticalNormal(lx, lz, seg, out = new THREE.Vector3()) {
|
|
|
361
370
|
if (roofType === 'shed') {
|
|
362
371
|
return buildSlopeNormal(0, 1, primaryTan, out);
|
|
363
372
|
}
|
|
373
|
+
if (roofType === 'conical') {
|
|
374
|
+
const radius = Math.hypot(lx, lz);
|
|
375
|
+
if (radius <= 1e-6)
|
|
376
|
+
return out.set(0, 1, 0);
|
|
377
|
+
return buildSlopeNormal(lx / radius, lz / radius, primaryTan, out);
|
|
378
|
+
}
|
|
364
379
|
// 4-sided slopes: the dominant axis chooses which face the point sits
|
|
365
380
|
// on. Hip is uniform across all four faces. Mansard has a steep outer
|
|
366
381
|
// band (primaryTan) and a shallow top inside the waist. Dutch has hip
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { RunPoint, RunSurfaceFrame } from './distribution-run-contract';
|
|
2
|
+
export declare function intersectRunPlane(ray: {
|
|
3
|
+
origin: RunPoint;
|
|
4
|
+
direction: RunPoint;
|
|
5
|
+
}, frame: RunSurfaceFrame): RunPoint | null;
|
|
6
|
+
export declare function resolveRunCursorPlane({ hit, working, ray, fallback, clearance, }: {
|
|
7
|
+
hit: {
|
|
8
|
+
point: RunPoint;
|
|
9
|
+
frame: RunSurfaceFrame;
|
|
10
|
+
} | null;
|
|
11
|
+
working: RunSurfaceFrame | null;
|
|
12
|
+
ray?: {
|
|
13
|
+
origin: RunPoint;
|
|
14
|
+
direction: RunPoint;
|
|
15
|
+
};
|
|
16
|
+
fallback: RunPoint;
|
|
17
|
+
clearance: number;
|
|
18
|
+
}): {
|
|
19
|
+
point: RunPoint;
|
|
20
|
+
frame: RunSurfaceFrame;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=run-cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-cursor.d.ts","sourceRoot":"","sources":["../../src/shared/run-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAE5E,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,QAAQ,CAAA;CAAE,EAC9C,KAAK,EAAE,eAAe,GACrB,QAAQ,GAAG,IAAI,CAQjB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,EACH,OAAO,EACP,GAAG,EACH,QAAQ,EACR,SAAS,GACV,EAAE;IACD,GAAG,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,eAAe,CAAA;KAAE,GAAG,IAAI,CAAA;IACvD,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;IAC/B,GAAG,CAAC,EAAE;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,SAAS,EAAE,QAAQ,CAAA;KAAE,CAAA;IAC/C,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAQ9C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function intersectRunPlane(ray, frame) {
|
|
2
|
+
const denominator = ray.direction.reduce((sum, value, i) => sum + value * frame.normal[i], 0);
|
|
3
|
+
if (Math.abs(denominator) < 1e-5)
|
|
4
|
+
return null;
|
|
5
|
+
const distance = frame.origin.reduce((sum, value, i) => sum + (value - ray.origin[i]) * frame.normal[i], 0) /
|
|
6
|
+
denominator;
|
|
7
|
+
if (distance < 0 || !Number.isFinite(distance))
|
|
8
|
+
return null;
|
|
9
|
+
return ray.origin.map((value, i) => value + distance * ray.direction[i]);
|
|
10
|
+
}
|
|
11
|
+
export function resolveRunCursorPlane({ hit, working, ray, fallback, clearance, }) {
|
|
12
|
+
if (hit) {
|
|
13
|
+
const offset = (point) => point.map((value, i) => value + hit.frame.normal[i] * clearance);
|
|
14
|
+
return { point: offset(hit.point), frame: { ...hit.frame, origin: offset(hit.frame.origin) } };
|
|
15
|
+
}
|
|
16
|
+
if (!working)
|
|
17
|
+
throw new Error('A cursor requires a surface or a working plane');
|
|
18
|
+
return { point: ray ? (intersectRunPlane(ray, working) ?? fallback) : fallback, frame: working };
|
|
19
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RunPoint } from './distribution-run-tool';
|
|
2
|
+
export type RunDirectionMode = 'free' | 'angle' | 'snap' | 'vertical';
|
|
3
|
+
export type RunDirectionCandidate = {
|
|
4
|
+
direction: RunPoint;
|
|
5
|
+
active: boolean;
|
|
6
|
+
};
|
|
7
|
+
type RunVector = readonly [number, number, number];
|
|
8
|
+
export declare function run3DDirectionCandidates(sourceDirection: RunVector): RunPoint[];
|
|
9
|
+
export declare function runHorizontalDirectionCandidates(sourceDirection: RunVector | null): RunPoint[];
|
|
10
|
+
export declare function resolveRunDirectionCandidates(start: RunPoint, cursor: RunPoint, sourceDirection: RunVector | null, mode: RunDirectionMode): RunDirectionCandidate[];
|
|
11
|
+
export declare function RunDirectionFeedback({ start, cursor, sourceDirection, mode, snapped, onDirectionSelect, }: {
|
|
12
|
+
start: RunPoint;
|
|
13
|
+
cursor: RunPoint;
|
|
14
|
+
sourceDirection: RunVector | null;
|
|
15
|
+
mode: RunDirectionMode;
|
|
16
|
+
snapped: boolean;
|
|
17
|
+
onDirectionSelect?: (direction: RunPoint) => void;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=run-direction-feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-direction-feedback.d.ts","sourceRoot":"","sources":["../../src/shared/run-direction-feedback.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAA;AAErE,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,QAAQ,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,KAAK,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAuBlD,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,EAAE,CA2B/E;AAED,wBAAgB,gCAAgC,CAAC,eAAe,EAAE,SAAS,GAAG,IAAI,GAAG,QAAQ,EAAE,CAU9F;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,QAAQ,EAChB,eAAe,EAAE,SAAS,GAAG,IAAI,EACjC,IAAI,EAAE,gBAAgB,GACrB,qBAAqB,EAAE,CA8BzB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,MAAM,EACN,eAAe,EACf,IAAI,EACJ,OAAO,EACP,iBAAiB,GAClB,EAAE;IACD,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,QAAQ,CAAA;IAChB,eAAe,EAAE,SAAS,GAAG,IAAI,CAAA;IACjC,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAA;CAClD,+BAsCA"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { EDITOR_LAYER } from '@pascal-app/editor';
|
|
4
|
+
import { useThree } from '@react-three/fiber';
|
|
5
|
+
import { useMemo } from 'react';
|
|
6
|
+
import { OrthographicCamera, Quaternion, Vector3 } from 'three';
|
|
7
|
+
const WORLD_DIRECTIONS = Array.from({ length: 8 }, (_, index) => {
|
|
8
|
+
const angle = (index * Math.PI) / 4;
|
|
9
|
+
return [Math.cos(angle), 0, Math.sin(angle)];
|
|
10
|
+
});
|
|
11
|
+
function horizontalDirection(direction) {
|
|
12
|
+
const length = Math.hypot(direction[0], direction[2]);
|
|
13
|
+
return length < 1e-6 ? null : [direction[0] / length, 0, direction[2] / length];
|
|
14
|
+
}
|
|
15
|
+
function normalizedDirection(direction) {
|
|
16
|
+
const length = Math.hypot(direction[0], direction[1], direction[2]);
|
|
17
|
+
if (length < 1e-6)
|
|
18
|
+
return null;
|
|
19
|
+
const normalized = direction.map((component) => component / length);
|
|
20
|
+
return normalized.map((component) => (Math.abs(component) < 1e-12 ? 0 : component));
|
|
21
|
+
}
|
|
22
|
+
function cross(a, b) {
|
|
23
|
+
return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
24
|
+
}
|
|
25
|
+
export function run3DDirectionCandidates(sourceDirection) {
|
|
26
|
+
const source = normalizedDirection(sourceDirection);
|
|
27
|
+
if (!source)
|
|
28
|
+
return [];
|
|
29
|
+
const reference = Math.abs(source[1]) < 0.95 ? [0, 1, 0] : [1, 0, 0];
|
|
30
|
+
const lateral = normalizedDirection(cross(source, reference));
|
|
31
|
+
if (!lateral)
|
|
32
|
+
return [source];
|
|
33
|
+
const upright = normalizedDirection(cross(lateral, source));
|
|
34
|
+
if (!upright)
|
|
35
|
+
return [source];
|
|
36
|
+
const candidates = [source];
|
|
37
|
+
for (const perpendicular of [upright, lateral]) {
|
|
38
|
+
for (const sign of [1, -1]) {
|
|
39
|
+
const turn = [
|
|
40
|
+
perpendicular[0] * sign,
|
|
41
|
+
perpendicular[1] * sign,
|
|
42
|
+
perpendicular[2] * sign,
|
|
43
|
+
].map((component) => (Math.abs(component) < 1e-12 ? 0 : component));
|
|
44
|
+
candidates.push(turn);
|
|
45
|
+
const diagonal = normalizedDirection([
|
|
46
|
+
source[0] + turn[0],
|
|
47
|
+
source[1] + turn[1],
|
|
48
|
+
source[2] + turn[2],
|
|
49
|
+
]);
|
|
50
|
+
if (diagonal)
|
|
51
|
+
candidates.push(diagonal);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return candidates;
|
|
55
|
+
}
|
|
56
|
+
export function runHorizontalDirectionCandidates(sourceDirection) {
|
|
57
|
+
if (!sourceDirection)
|
|
58
|
+
return WORLD_DIRECTIONS;
|
|
59
|
+
const source = horizontalDirection(sourceDirection);
|
|
60
|
+
if (!source)
|
|
61
|
+
return WORLD_DIRECTIONS;
|
|
62
|
+
const angle = Math.atan2(source[2], source[0]);
|
|
63
|
+
return [-Math.PI / 2, -Math.PI / 4, 0, Math.PI / 4, Math.PI / 2].map((offset) => [
|
|
64
|
+
Math.cos(angle + offset),
|
|
65
|
+
0,
|
|
66
|
+
Math.sin(angle + offset),
|
|
67
|
+
]);
|
|
68
|
+
}
|
|
69
|
+
export function resolveRunDirectionCandidates(start, cursor, sourceDirection, mode) {
|
|
70
|
+
const delta = [cursor[0] - start[0], cursor[1] - start[1], cursor[2] - start[2]];
|
|
71
|
+
if (mode === 'vertical') {
|
|
72
|
+
const activeSign = delta[1] < 0 ? -1 : 1;
|
|
73
|
+
return [1, -1].map((sign) => ({
|
|
74
|
+
direction: [0, sign, 0],
|
|
75
|
+
active: sign === activeSign,
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
const directions = sourceDirection
|
|
79
|
+
? run3DDirectionCandidates(sourceDirection)
|
|
80
|
+
: runHorizontalDirectionCandidates(null);
|
|
81
|
+
let activeIndex = -1;
|
|
82
|
+
const pointerDirection = normalizedDirection(delta);
|
|
83
|
+
if (pointerDirection && mode === 'angle') {
|
|
84
|
+
let bestDot = Number.NEGATIVE_INFINITY;
|
|
85
|
+
for (let index = 0; index < directions.length; index++) {
|
|
86
|
+
const direction = directions[index];
|
|
87
|
+
const dot = direction[0] * pointerDirection[0] +
|
|
88
|
+
direction[1] * pointerDirection[1] +
|
|
89
|
+
direction[2] * pointerDirection[2];
|
|
90
|
+
if (dot > bestDot) {
|
|
91
|
+
bestDot = dot;
|
|
92
|
+
activeIndex = index;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return directions.map((direction, index) => ({ direction, active: index === activeIndex }));
|
|
97
|
+
}
|
|
98
|
+
export function RunDirectionFeedback({ start, cursor, sourceDirection, mode, snapped, onDirectionSelect, }) {
|
|
99
|
+
const candidates = useMemo(() => resolveRunDirectionCandidates(start, cursor, sourceDirection, mode), [cursor, mode, sourceDirection, start]);
|
|
100
|
+
const distance = Math.hypot(cursor[0] - start[0], cursor[1] - start[1], cursor[2] - start[2]);
|
|
101
|
+
const candidateLength = Math.min(1.8, Math.max(0.7, distance * 0.7));
|
|
102
|
+
const activeColor = snapped ? '#22c55e' : '#818cf8';
|
|
103
|
+
return (_jsxs("group", { children: [candidates.map((candidate, index) => (_jsx(DirectionRay, { active: candidate.active, color: candidate.active ? activeColor : '#818cf8', direction: candidate.direction, length: candidate.active ? Math.max(distance, candidateLength) : candidateLength, origin: start, onDirectionSelect: onDirectionSelect }, `${index}:${candidate.direction.join(':')}`))), distance > 0.01 && mode !== 'angle' && mode !== 'vertical' && (_jsx(DirectionRay, { active: true, color: activeColor, direction: [
|
|
104
|
+
(cursor[0] - start[0]) / distance,
|
|
105
|
+
(cursor[1] - start[1]) / distance,
|
|
106
|
+
(cursor[2] - start[2]) / distance,
|
|
107
|
+
], length: distance, origin: start, onDirectionSelect: onDirectionSelect }))] }));
|
|
108
|
+
}
|
|
109
|
+
function DirectionRay({ origin, direction, length, active, color, onDirectionSelect, }) {
|
|
110
|
+
const { camera } = useThree();
|
|
111
|
+
const zoomScale = camera instanceof OrthographicCamera ? 1 / camera.zoom : 1;
|
|
112
|
+
const placement = useMemo(() => {
|
|
113
|
+
const axis = new Vector3(direction[0], direction[1], direction[2]).normalize();
|
|
114
|
+
const start = new Vector3(origin[0], origin[1] + 0.015, origin[2]);
|
|
115
|
+
const end = start.clone().addScaledVector(axis, length);
|
|
116
|
+
return {
|
|
117
|
+
midpoint: start.clone().add(end).multiplyScalar(0.5).toArray(),
|
|
118
|
+
tip: end.toArray(),
|
|
119
|
+
rotation: new Quaternion().setFromUnitVectors(new Vector3(0, 1, 0), axis),
|
|
120
|
+
};
|
|
121
|
+
}, [direction, length, origin]);
|
|
122
|
+
const radius = (active ? 0.012 : 0.006) * zoomScale;
|
|
123
|
+
const arrowLength = (active ? 0.1 : 0.07) * zoomScale;
|
|
124
|
+
const arrowRadius = (active ? 0.04 : 0.025) * zoomScale;
|
|
125
|
+
const opacity = active ? 0.9 : 0.18;
|
|
126
|
+
return (_jsxs("group", { children: [_jsxs("mesh", { layers: EDITOR_LAYER, position: placement.midpoint, quaternion: placement.rotation, scale: [radius, length, radius], renderOrder: active ? 4 : 2, onPointerDown: (event) => {
|
|
127
|
+
if (!onDirectionSelect)
|
|
128
|
+
return;
|
|
129
|
+
event.stopPropagation();
|
|
130
|
+
event.nativeEvent.stopImmediatePropagation();
|
|
131
|
+
onDirectionSelect([...direction]);
|
|
132
|
+
}, children: [_jsx("cylinderGeometry", { args: [1, 1, 1, 8] }), _jsx("meshBasicMaterial", { color: color, depthTest: false, depthWrite: false, opacity: opacity, transparent: true })] }), _jsxs("mesh", { layers: EDITOR_LAYER, position: placement.tip, quaternion: placement.rotation, scale: [arrowRadius, arrowLength, arrowRadius], renderOrder: active ? 4 : 2, onPointerDown: (event) => {
|
|
133
|
+
if (!onDirectionSelect)
|
|
134
|
+
return;
|
|
135
|
+
event.stopPropagation();
|
|
136
|
+
event.nativeEvent.stopImmediatePropagation();
|
|
137
|
+
onDirectionSelect([...direction]);
|
|
138
|
+
}, children: [_jsx("coneGeometry", { args: [1, 1, 10] }), _jsx("meshBasicMaterial", { color: color, depthTest: false, depthWrite: false, opacity: opacity, transparent: true })] })] }));
|
|
139
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AnyNodeId } from '@pascal-app/core';
|
|
2
|
+
import { type SupportedRun } from './run-hangers';
|
|
3
|
+
export declare function RunHangerPreview({ run, levelId }: {
|
|
4
|
+
run: SupportedRun;
|
|
5
|
+
levelId: AnyNodeId;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=run-hanger-controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-hanger-controls.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-controls.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,SAAS,EAAY,MAAM,kBAAkB,CAAA;AAKzE,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAElE,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,SAAS,CAAA;CAAE,+BAoC3F"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useScene } from '@pascal-app/core';
|
|
4
|
+
import { EDITOR_LAYER } from '@pascal-app/editor';
|
|
5
|
+
import { disposeObject3DResources } from '@pascal-app/viewer';
|
|
6
|
+
import { useEffect, useMemo } from 'react';
|
|
7
|
+
import { Mesh, MeshBasicMaterial } from 'three';
|
|
8
|
+
import { buildRunHangers } from './run-hangers';
|
|
9
|
+
export function RunHangerPreview({ run, levelId }) {
|
|
10
|
+
const nodes = useScene.getState().nodes;
|
|
11
|
+
const geometry = useMemo(() => {
|
|
12
|
+
const group = buildRunHangers({ ...run, parentId: levelId }, {
|
|
13
|
+
resolve: (id) => nodes[id],
|
|
14
|
+
children: [],
|
|
15
|
+
siblings: [],
|
|
16
|
+
parent: nodes[levelId] ?? null,
|
|
17
|
+
sceneNodes: nodes,
|
|
18
|
+
});
|
|
19
|
+
const material = new MeshBasicMaterial({
|
|
20
|
+
color: '#818cf8',
|
|
21
|
+
transparent: true,
|
|
22
|
+
opacity: 0.55,
|
|
23
|
+
depthTest: false,
|
|
24
|
+
});
|
|
25
|
+
const disposed = new Set();
|
|
26
|
+
group.traverse((child) => {
|
|
27
|
+
if (!(child instanceof Mesh))
|
|
28
|
+
return;
|
|
29
|
+
for (const previous of Array.isArray(child.material) ? child.material : [child.material]) {
|
|
30
|
+
if (!disposed.has(previous)) {
|
|
31
|
+
previous.dispose();
|
|
32
|
+
disposed.add(previous);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
child.material = material;
|
|
36
|
+
child.layers.set(EDITOR_LAYER);
|
|
37
|
+
});
|
|
38
|
+
if (!group.children.length)
|
|
39
|
+
material.dispose();
|
|
40
|
+
return group;
|
|
41
|
+
}, [run, levelId, nodes]);
|
|
42
|
+
useEffect(() => () => disposeObject3DResources(geometry), [geometry]);
|
|
43
|
+
return _jsx("primitive", { object: geometry });
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-hanger-inspector.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-inspector.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAGrE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,+BAkH1E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { emitter, useScene } from '@pascal-app/core';
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import { planRunHangerSlots } from './run-hangers';
|
|
6
|
+
import SystemCheckPanel from './system-check-panel';
|
|
7
|
+
export default function RunHangerInspector({ node }) {
|
|
8
|
+
const nodes = useScene((state) => state.nodes);
|
|
9
|
+
const slots = useMemo(() => planRunHangerSlots(node, nodes), [node, nodes]);
|
|
10
|
+
if (!node.autoHangers)
|
|
11
|
+
return _jsx(SystemCheckPanel, { nodeId: node.id, nodes: nodes });
|
|
12
|
+
const hosts = Object.values(nodes).filter((candidate) => candidate.parentId === node.parentId &&
|
|
13
|
+
(candidate.type === 'wall' || candidate.type === 'ceiling'));
|
|
14
|
+
const update = (id, patch) => {
|
|
15
|
+
const live = useScene.getState().nodes[node.id];
|
|
16
|
+
if (live?.type !== 'duct-segment' && live?.type !== 'pipe-segment')
|
|
17
|
+
return;
|
|
18
|
+
useScene.getState().updateNode(node.id, {
|
|
19
|
+
hangerOverrides: {
|
|
20
|
+
...live.hangerOverrides,
|
|
21
|
+
[id]: { ...live.hangerOverrides?.[id], ...patch },
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
return (_jsxs(_Fragment, { children: [_jsx(SystemCheckPanel, { nodeId: node.id, nodes: nodes }), _jsxs("section", { className: "space-y-2 border-t pt-3", children: [_jsx("h3", { className: "text-sm font-medium", children: "Individual hangers" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Positions are measured along each path segment. Changing spacing regenerates the numbered slots." }), _jsx("div", { className: "max-h-72 space-y-3 overflow-y-auto", children: slots.map((slot, index) => {
|
|
26
|
+
const a = node.path[slot.segmentIndex];
|
|
27
|
+
const b = node.path[slot.segmentIndex + 1];
|
|
28
|
+
const length = Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]);
|
|
29
|
+
const hostId = node.hangerOverrides?.[slot.id]?.hostId ?? '';
|
|
30
|
+
return (_jsxs("div", { className: "space-y-1 rounded border p-2 text-xs", children: [_jsxs("div", { className: "flex justify-between", children: [_jsxs("span", { children: ["Hanger ", index + 1, " \u00B7 segment ", slot.segmentIndex + 1] }), _jsxs("label", { children: [_jsx("input", { type: "checkbox", checked: slot.skipped, onChange: (event) => update(slot.id, { skipped: event.target.checked }) }), ' ', "Skip"] })] }), !slot.skipped && !slot.hanger && (_jsx("p", { role: "status", className: "text-amber-600 dark:text-amber-400", children: "No support within reach. Move the hanger or choose another host." })), _jsxs("label", { className: "flex justify-between", children: ["Position (m)", _jsx("input", { "aria-label": `Hanger ${index + 1} position in metres`, type: "number", min: 0, max: length, step: 0.1, defaultValue: Number((slot.fraction * length).toFixed(3)), className: "w-20 bg-transparent", onBlur: (event) => {
|
|
31
|
+
const value = event.target.valueAsNumber;
|
|
32
|
+
if (Number.isFinite(value) &&
|
|
33
|
+
value >= 0 &&
|
|
34
|
+
value <= length &&
|
|
35
|
+
Math.abs(value - slot.fraction * length) > 0.0005)
|
|
36
|
+
update(slot.id, { fraction: value / length });
|
|
37
|
+
else
|
|
38
|
+
event.target.value = String(Number((slot.fraction * length).toFixed(3)));
|
|
39
|
+
} }, `${slot.id}:${slot.fraction}`)] }), _jsxs("select", { "aria-label": `Hanger ${index + 1} support`, value: hostId, className: "w-full bg-background", onChange: (event) => update(slot.id, { hostId: event.target.value }), children: [_jsx("option", { value: "", children: "Automatic support" }), hostId && !hosts.some((host) => host.id === hostId) && (_jsx("option", { value: hostId, children: "Missing support" })), hosts.map((host) => (_jsxs("option", { value: host.id, children: [host.name || host.type, " \u00B7 ", host.id.slice(-6)] }, host.id)))] }), slot.hanger && (_jsx("button", { type: "button", className: "underline", onClick: () => emitter.emit('camera-controls:focus', {
|
|
40
|
+
nodeId: slot.hanger.hostId,
|
|
41
|
+
}), children: "Reveal support" }))] }, slot.id));
|
|
42
|
+
}) })] })] }));
|
|
43
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolHint } from '@pascal-app/core';
|
|
2
|
+
export type RunHangerTool = 'duct-segment' | 'pipe-segment';
|
|
3
|
+
type RunHangerModeState = {
|
|
4
|
+
enabled: Record<RunHangerTool, boolean>;
|
|
5
|
+
setEnabled: (tool: RunHangerTool, enabled: boolean) => void;
|
|
6
|
+
toggle: (tool: RunHangerTool) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare const useRunHangerMode: import("zustand").UseBoundStore<import("zustand").StoreApi<RunHangerModeState>>;
|
|
9
|
+
export declare function createRunHangerToolHint(tool: RunHangerTool): ToolHint;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=run-hanger-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-hanger-mode.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhD,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,CAAA;AAE3D,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IACvC,UAAU,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3D,MAAM,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;CACtC,CAAA;AAED,eAAO,MAAM,gBAAgB,iFAS1B,CAAA;AAEH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAsBrE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { create } from 'zustand';
|
|
2
|
+
export const useRunHangerMode = create((set) => ({
|
|
3
|
+
enabled: {
|
|
4
|
+
'duct-segment': false,
|
|
5
|
+
'pipe-segment': false,
|
|
6
|
+
},
|
|
7
|
+
setEnabled: (tool, enabled) => set((state) => ({ enabled: { ...state.enabled, [tool]: enabled } })),
|
|
8
|
+
toggle: (tool) => set((state) => ({ enabled: { ...state.enabled, [tool]: !state.enabled[tool] } })),
|
|
9
|
+
}));
|
|
10
|
+
export function createRunHangerToolHint(tool) {
|
|
11
|
+
return {
|
|
12
|
+
key: 'H',
|
|
13
|
+
label: 'Auto hangers',
|
|
14
|
+
chip: {
|
|
15
|
+
subscribe: (onChange) => useRunHangerMode.subscribe((state, previous) => {
|
|
16
|
+
if (state.enabled[tool] !== previous.enabled[tool])
|
|
17
|
+
onChange();
|
|
18
|
+
}),
|
|
19
|
+
value: () => (useRunHangerMode.getState().enabled[tool] ? 'on' : 'off'),
|
|
20
|
+
cycle: () => useRunHangerMode.getState().toggle(tool),
|
|
21
|
+
labels: {
|
|
22
|
+
off: 'Auto hangers: Off',
|
|
23
|
+
on: 'Auto hangers: On',
|
|
24
|
+
},
|
|
25
|
+
icons: {
|
|
26
|
+
off: 'lucide:toggle-left',
|
|
27
|
+
on: 'lucide:toggle-right',
|
|
28
|
+
},
|
|
29
|
+
tooltip: 'Auto hangers - click or press H to toggle',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-hanger-system.d.ts","sourceRoot":"","sources":["../../src/shared/run-hanger-system.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,gBAAgB,SAG/B;AACD,wBAAgB,gBAAgB,SAG/B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useScene } from '@pascal-app/core';
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
|
+
function useHangerDependencies(kind) {
|
|
5
|
+
useEffect(() => useScene.subscribe((state, previous) => {
|
|
6
|
+
if (state.nodes === previous.nodes)
|
|
7
|
+
return;
|
|
8
|
+
const structural = new Set([
|
|
9
|
+
'wall',
|
|
10
|
+
'ceiling',
|
|
11
|
+
'slab',
|
|
12
|
+
'level',
|
|
13
|
+
'building',
|
|
14
|
+
'site',
|
|
15
|
+
'door',
|
|
16
|
+
'window',
|
|
17
|
+
]);
|
|
18
|
+
const changed = new Set([...Object.keys(state.nodes), ...Object.keys(previous.nodes)]);
|
|
19
|
+
const needsUpdate = [...changed].some((id) => {
|
|
20
|
+
const a = state.nodes[id];
|
|
21
|
+
const b = previous.nodes[id];
|
|
22
|
+
return a !== b && (structural.has(a?.type ?? '') || structural.has(b?.type ?? ''));
|
|
23
|
+
});
|
|
24
|
+
if (!needsUpdate)
|
|
25
|
+
return;
|
|
26
|
+
for (const node of Object.values(state.nodes)) {
|
|
27
|
+
if (node.type === kind && node.autoHangers)
|
|
28
|
+
state.markDirty(node.id);
|
|
29
|
+
}
|
|
30
|
+
}), [kind]);
|
|
31
|
+
}
|
|
32
|
+
export function DuctHangerSystem() {
|
|
33
|
+
useHangerDependencies('duct-segment');
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
export function PipeHangerSystem() {
|
|
37
|
+
useHangerDependencies('pipe-segment');
|
|
38
|
+
return null;
|
|
39
|
+
}
|