@pascal-app/nodes 1.0.0-beta.5 → 1.0.1
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 +4 -4
- 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/appliance-layout.d.ts +26 -0
- package/dist/cabinet/appliance-layout.d.ts.map +1 -0
- package/dist/cabinet/appliance-layout.js +52 -0
- 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/countertop-layout.d.ts +173 -0
- package/dist/cabinet/countertop-layout.d.ts.map +1 -0
- package/dist/cabinet/countertop-layout.js +80 -0
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +414 -61
- package/dist/cabinet/floorplan-move.d.ts.map +1 -1
- package/dist/cabinet/floorplan-move.js +91 -22
- package/dist/cabinet/geometry/cooktop.d.ts.map +1 -1
- package/dist/cabinet/geometry/cooktop.js +2 -2
- 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 +28 -71
- package/dist/cabinet/geometry/sink.d.ts +2 -12
- package/dist/cabinet/geometry/sink.d.ts.map +1 -1
- package/dist/cabinet/geometry/sink.js +8 -39
- package/dist/cabinet/geometry.d.ts.map +1 -1
- package/dist/cabinet/geometry.js +63 -1
- package/dist/cabinet/hosted-resize.d.ts +8 -0
- package/dist/cabinet/hosted-resize.d.ts.map +1 -0
- package/dist/cabinet/hosted-resize.js +158 -0
- 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 +98 -5
- package/dist/cabinet/run-layout.d.ts.map +1 -1
- package/dist/cabinet/run-layout.js +430 -37
- package/dist/cabinet/run-ops.d.ts +204 -12
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/run-ops.js +523 -36
- 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 +294 -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/surfaces.d.ts +4 -0
- package/dist/cabinet/surfaces.d.ts.map +1 -0
- package/dist/cabinet/surfaces.js +101 -0
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +615 -91
- package/dist/cabinet/tree-structure.d.ts.map +1 -1
- package/dist/cabinet/tree-structure.js +10 -9
- 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 +8 -2
- package/dist/ceiling/floorplan-affordances.d.ts +12 -12
- 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 +9 -9
- 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 +12 -12
- 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-position-section.js +2 -2
- 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 +49 -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 +38 -0
- package/dist/duct-segment/tool.d.ts.map +1 -1
- package/dist/duct-segment/tool.js +306 -677
- 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/inspector-editors.js +1 -1
- 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/imported-mesh/definition.d.ts +5 -0
- package/dist/imported-mesh/definition.d.ts.map +1 -0
- package/dist/imported-mesh/definition.js +38 -0
- package/dist/imported-mesh/floorplan.d.ts +4 -0
- package/dist/imported-mesh/floorplan.d.ts.map +1 -0
- package/dist/imported-mesh/floorplan.js +34 -0
- package/dist/imported-mesh/geometry.d.ts +5 -0
- package/dist/imported-mesh/geometry.d.ts.map +1 -0
- package/dist/imported-mesh/geometry.js +34 -0
- package/dist/imported-mesh/index.d.ts +4 -0
- package/dist/imported-mesh/index.d.ts.map +1 -0
- package/dist/imported-mesh/index.js +3 -0
- package/dist/imported-mesh/schema.d.ts +2 -0
- package/dist/imported-mesh/schema.d.ts.map +1 -0
- package/dist/imported-mesh/schema.js +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- package/dist/item/definition.d.ts.map +1 -1
- package/dist/item/definition.js +10 -2
- package/dist/item/floorplan-move.d.ts +9 -1
- package/dist/item/floorplan-move.d.ts.map +1 -1
- package/dist/item/floorplan-move.js +74 -2
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/floorplan.js +33 -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 +15 -3
- package/dist/item/panel.js +1 -1
- 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 +49 -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/procedural-item/definition.d.ts +4 -0
- package/dist/procedural-item/definition.d.ts.map +1 -0
- package/dist/procedural-item/definition.js +254 -0
- package/dist/procedural-item/geometry.d.ts +31 -0
- package/dist/procedural-item/geometry.d.ts.map +1 -0
- package/dist/procedural-item/geometry.js +88 -0
- package/dist/procedural-item/index.d.ts +3 -0
- package/dist/procedural-item/index.d.ts.map +1 -0
- package/dist/procedural-item/index.js +2 -0
- package/dist/procedural-item/move-session.d.ts +15 -0
- package/dist/procedural-item/move-session.d.ts.map +1 -0
- package/dist/procedural-item/move-session.js +197 -0
- package/dist/procedural-item/move-tool.d.ts +5 -0
- package/dist/procedural-item/move-tool.d.ts.map +1 -0
- package/dist/procedural-item/move-tool.js +193 -0
- package/dist/procedural-item/renderer.d.ts +5 -0
- package/dist/procedural-item/renderer.d.ts.map +1 -0
- package/dist/procedural-item/renderer.js +66 -0
- package/dist/ridge-vent/definition.js +1 -1
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +4 -4
- 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 +26 -25
- 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 +12 -0
- package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
- package/dist/shared/automatic-run-end-cap.js +169 -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 +117 -0
- package/dist/shared/distribution-run-tool.d.ts.map +1 -0
- package/dist/shared/distribution-run-tool.js +986 -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/panel-fields.d.ts +15 -0
- package/dist/shared/panel-fields.d.ts.map +1 -0
- package/dist/shared/panel-fields.js +31 -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/resting-surface-plan.d.ts +3 -0
- package/dist/shared/resting-surface-plan.d.ts.map +1 -0
- package/dist/shared/resting-surface-plan.js +28 -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/definition.d.ts.map +1 -1
- package/dist/shelf/definition.js +2 -1
- package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
- package/dist/shelf/floorplan-affordances.js +5 -3
- package/dist/shelf/floorplan-move.d.ts.map +1 -1
- package/dist/shelf/floorplan-move.js +3 -2
- package/dist/shelf/geometry.d.ts.map +1 -1
- package/dist/shelf/geometry.js +2 -10
- 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 +6 -6
- 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 +2 -2
- package/dist/solar-panel/parametrics.js +2 -2
- package/dist/spawn/panel.js +1 -1
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +23 -16
- 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 +45 -6
- 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/unit/definition.d.ts +10 -0
- package/dist/unit/definition.d.ts.map +1 -0
- package/dist/unit/definition.js +38 -0
- package/dist/unit/index.d.ts +2 -0
- package/dist/unit/index.d.ts.map +1 -0
- package/dist/unit/index.js +1 -0
- package/dist/unit/parametrics.d.ts +3 -0
- package/dist/unit/parametrics.d.ts.map +1 -0
- package/dist/unit/parametrics.js +4 -0
- package/dist/unit/schema.d.ts +2 -0
- package/dist/unit/schema.d.ts.map +1 -0
- package/dist/unit/schema.js +1 -0
- package/dist/unit/unit-panel.d.ts +5 -0
- package/dist/unit/unit-panel.d.ts.map +1 -0
- package/dist/unit/unit-panel.js +61 -0
- 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 +8 -6
- 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/definition.d.ts.map +1 -1
- package/dist/zone/definition.js +7 -1
- package/dist/zone/floorplan-affordances.d.ts +12 -12
- package/dist/zone/floorplan.d.ts +1 -3
- package/dist/zone/floorplan.d.ts.map +1 -1
- package/dist/zone/floorplan.js +43 -28
- package/dist/zone/quantities-panel.d.ts.map +1 -1
- package/dist/zone/quantities-panel.js +33 -29
- package/dist/zone/renderer.d.ts.map +1 -1
- package/dist/zone/renderer.js +20 -6
- package/dist/zone/unit-membership.d.ts +12 -0
- package/dist/zone/unit-membership.d.ts.map +1 -0
- package/dist/zone/unit-membership.js +22 -0
- package/package.json +16 -8
- 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
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { analyzePortConnectivity, DuctSegmentNode, nodeRegistry, pauseSceneHistory, resolveConnectivityUpdates, resumeSceneHistory, sceneRegistry, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
|
|
4
|
-
import { DimensionPill, swallowNextClick, triggerSFX, useEditor } from '@pascal-app/editor';
|
|
4
|
+
import { clearPlacementSurface, DimensionPill, isAngleSnapActive, isGridSnapActive, swallowNextClick, triggerSFX, useEditor, } from '@pascal-app/editor';
|
|
5
5
|
import { useViewer } from '@pascal-app/viewer';
|
|
6
6
|
import { Html } from '@react-three/drei';
|
|
7
7
|
import { createPortal, useFrame, useThree } from '@react-three/fiber';
|
|
8
8
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
9
9
|
import { Euler, Matrix4, Plane, Quaternion, Raycaster, Vector2, Vector3, } from 'three';
|
|
10
10
|
import { newAutoOffsetGroupId, readAutoOffsetTag, translateAutoOffsetBase, withAutoOffsetTag, withoutAutoOffsetTag, } from '../shared/auto-offset-tag';
|
|
11
|
+
import { planRunEndCapFollowUpdates } from '../shared/automatic-run-end-cap';
|
|
11
12
|
import { detectFittingEndpoint, planFittingEndpointReaim, } from '../shared/fitting-endpoint-reaim';
|
|
12
13
|
import { DuctSegmentGhost, FittingGhost } from '../shared/mep-ghost';
|
|
13
14
|
import { collectScenePorts, DUCT_PORT_SYSTEMS, findNearestPortXZ } from '../shared/ports';
|
|
14
15
|
import { planRunTranslationOffsets } from '../shared/run-translation-offset';
|
|
15
|
-
import { HandleCube, MoveChevron, RotateArc } from '../shared/selection-handles';
|
|
16
|
+
import { ContinuePlusHandle, HandleCube, MoveChevron, RotateArc } from '../shared/selection-handles';
|
|
16
17
|
import { planVerticalOffsets } from '../shared/vertical-offset';
|
|
18
|
+
import { refreshWallRunAttachment } from '../shared/wall-run-move';
|
|
19
|
+
import { activateDuctContinuation, ductContinuationHandlePlan, } from './continuation';
|
|
17
20
|
import { INCHES_TO_METERS } from './geometry';
|
|
18
21
|
/** Port-snap radius for dragged run endpoints (meters, XZ). */
|
|
19
22
|
const PORT_SNAP_RADIUS_M = 0.4;
|
|
@@ -21,7 +24,7 @@ const PORT_SNAP_RADIUS_M = 0.4;
|
|
|
21
24
|
// they clear thick trunks.
|
|
22
25
|
const CORNER_ARROW_GAP = 0.18;
|
|
23
26
|
const CORNER_ARROW_MIN_OFFSET = 0.24;
|
|
24
|
-
/** Roll snap increment — 45°, matching the fitting rotate step.
|
|
27
|
+
/** Roll snap increment — 45°, matching the fitting rotate step. */
|
|
25
28
|
const ROLL_STEP_RAD = Math.PI / 4;
|
|
26
29
|
const UP = new Vector3(0, 1, 0);
|
|
27
30
|
function collectPortsFromNodes(nodes, filter = {}) {
|
|
@@ -76,11 +79,10 @@ function runRadiusM(duct) {
|
|
|
76
79
|
* - **Alt** detaches: the joint breaks for this drag — the elbow does NOT
|
|
77
80
|
* re-aim and mated fittings / runs do NOT follow; the endpoint moves on its
|
|
78
81
|
* own (port re-mate still allowed so it can be reattached elsewhere).
|
|
79
|
-
* -
|
|
82
|
+
* - Snapping follows the active editor snapping mode.
|
|
80
83
|
*
|
|
81
|
-
* History
|
|
82
|
-
*
|
|
83
|
-
* reverted, history resumed, and the final path applied as one tracked
|
|
84
|
+
* History is paused during the drag while live overrides drive the preview.
|
|
85
|
+
* On release, history resumes and the final path is applied as one tracked
|
|
84
86
|
* change.
|
|
85
87
|
*/
|
|
86
88
|
const DuctSegmentSelectionAffordance = () => {
|
|
@@ -126,6 +128,8 @@ const DuctSegmentSelectionAffordance = () => {
|
|
|
126
128
|
};
|
|
127
129
|
const DuctPointHandles = ({ duct, target }) => {
|
|
128
130
|
const { camera, gl } = useThree();
|
|
131
|
+
const liveOverride = useLiveNodeOverrides((state) => state.overrides.get(duct.id));
|
|
132
|
+
const displayDuct = liveOverride ? { ...duct, ...liveOverride } : duct;
|
|
129
133
|
// Outer group mirrors the duct group's local pose so handles placed in
|
|
130
134
|
// node-local path coords land exactly where the duct mesh sits, even though
|
|
131
135
|
// they're mounted in the parent (to stay out of the duct's selection
|
|
@@ -259,21 +263,54 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
259
263
|
// leans). Otherwise: the dragged point moves and any mated fittings / runs
|
|
260
264
|
// translate via connectivity.
|
|
261
265
|
const buildDragBatch = (drag, next, detached) => {
|
|
266
|
+
const wall = duct.wallAttachment
|
|
267
|
+
? useScene.getState().nodes[duct.wallAttachment.wallId]
|
|
268
|
+
: undefined;
|
|
269
|
+
const attachmentFor = (path) => duct.wallAttachment && wall?.type === 'wall'
|
|
270
|
+
? refreshWallRunAttachment(path, duct.wallAttachment, wall)
|
|
271
|
+
: duct.wallAttachment;
|
|
272
|
+
const withEndCapFollow = (path, updates) => {
|
|
273
|
+
if (drag.index !== 0 && drag.index !== drag.initialPath.length - 1)
|
|
274
|
+
return updates;
|
|
275
|
+
const endpoint = drag.index === 0 ? 'start' : 'end';
|
|
276
|
+
const nextDuct = { ...duct, path };
|
|
277
|
+
const capUpdates = planRunEndCapFollowUpdates(duct, nextDuct, endpoint, useScene.getState().nodes);
|
|
278
|
+
const capIds = new Set(capUpdates.map((update) => update.id));
|
|
279
|
+
return [...updates.filter((update) => !capIds.has(update.id)), ...capUpdates];
|
|
280
|
+
};
|
|
262
281
|
if (!detached && drag.fittingEndpoint) {
|
|
263
282
|
const plan = planFittingEndpointReaim(drag.fittingEndpoint, drag.index, next);
|
|
264
283
|
// Out of the fitting's buildable range — hold this frame.
|
|
265
284
|
if (!plan)
|
|
266
285
|
return null;
|
|
267
|
-
return [
|
|
268
|
-
{
|
|
286
|
+
return withEndCapFollow(plan.path, [
|
|
287
|
+
{
|
|
288
|
+
id: duct.id,
|
|
289
|
+
data: { path: plan.path, wallAttachment: attachmentFor(plan.path) },
|
|
290
|
+
},
|
|
269
291
|
{ id: plan.fittingUpdate.id, data: plan.fittingUpdate.data },
|
|
270
|
-
|
|
292
|
+
...(drag.jointPartner
|
|
293
|
+
? [
|
|
294
|
+
{
|
|
295
|
+
id: drag.jointPartner.id,
|
|
296
|
+
data: {
|
|
297
|
+
path: drag.jointPartner.startPath.map((p, i) => i === (drag.index === 0 ? drag.jointPartner.startPath.length - 1 : 0)
|
|
298
|
+
? drag.index === 0
|
|
299
|
+
? plan.path[plan.path.length - 1]
|
|
300
|
+
: plan.path[0]
|
|
301
|
+
: p),
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
]
|
|
305
|
+
: []),
|
|
306
|
+
]);
|
|
271
307
|
}
|
|
272
|
-
const path =
|
|
273
|
-
|
|
274
|
-
{ id: duct.id, data: { path } },
|
|
308
|
+
const path = drag.initialPath.map((p, i) => (i === drag.index ? next : p));
|
|
309
|
+
const updates = [
|
|
310
|
+
{ id: duct.id, data: { path, wallAttachment: attachmentFor(path) } },
|
|
275
311
|
...(detached ? [] : connectivityUpdatesForPath(drag.connectivity, path)),
|
|
276
312
|
];
|
|
313
|
+
return detached ? updates : withEndCapFollow(path, updates);
|
|
277
314
|
};
|
|
278
315
|
/** World-space position of a local path point. */
|
|
279
316
|
const toWorld = (p) => target.localToWorld(new Vector3(p[0], p[1], p[2]));
|
|
@@ -301,6 +338,27 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
301
338
|
const startPoint = initialPath[index];
|
|
302
339
|
const connectivity = analyzePortConnectivity(duct, useScene.getState().nodes);
|
|
303
340
|
pauseSceneHistory(useScene);
|
|
341
|
+
const livePreviewIds = new Set();
|
|
342
|
+
const publishLivePreview = (updates) => {
|
|
343
|
+
const scene = useScene.getState();
|
|
344
|
+
const entries = updates
|
|
345
|
+
.filter((update) => scene.nodes[update.id])
|
|
346
|
+
.map((update) => [update.id, update.data]);
|
|
347
|
+
useLiveNodeOverrides.getState().setMany(entries);
|
|
348
|
+
for (const [id] of entries) {
|
|
349
|
+
livePreviewIds.add(id);
|
|
350
|
+
scene.markDirty(id);
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
const clearLivePreview = () => {
|
|
354
|
+
const scene = useScene.getState();
|
|
355
|
+
const overrides = useLiveNodeOverrides.getState();
|
|
356
|
+
for (const id of livePreviewIds) {
|
|
357
|
+
overrides.clear(id);
|
|
358
|
+
if (scene.nodes[id])
|
|
359
|
+
scene.markDirty(id);
|
|
360
|
+
}
|
|
361
|
+
};
|
|
304
362
|
useViewer.getState().setInputDragging(true);
|
|
305
363
|
document.body.style.cursor = kind.axis === 'y' ? 'ns-resize' : 'grabbing';
|
|
306
364
|
setDraggingIndex(index);
|
|
@@ -311,7 +369,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
311
369
|
// instead of lengthening. The along-run pair keeps the plain lengthen /
|
|
312
370
|
// shorten. The pivot is the adjacent vertex; null when there's no neighbour
|
|
313
371
|
// (a lone point) or the grabbed segment has zero length.
|
|
314
|
-
const swings = kind.axis === 'y' ? kind.along !== true : !kind.along;
|
|
372
|
+
const swings = kind.axis === 'y' ? kind.along !== true : kind.axis === 'horizontal' && !kind.along;
|
|
315
373
|
// Pivot only at an endpoint (its single neighbour is the unambiguous "other
|
|
316
374
|
// end"); interior vertices keep the plain per-axis drag.
|
|
317
375
|
const neighborIndex = index === 0 ? 1 : index === initialPath.length - 1 ? index - 1 : null;
|
|
@@ -327,15 +385,19 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
327
385
|
const fittingEndpoint = isEndpoint
|
|
328
386
|
? detectFittingEndpoint('duct-segment', initialPath, index, useScene.getState().nodes)
|
|
329
387
|
: null;
|
|
388
|
+
const partnerId = fittingEndpoint?.fitting.metadata?.altJoint
|
|
389
|
+
? fittingEndpoint.fitting.metadata.partnerIds?.find((id) => id !== duct.id)
|
|
390
|
+
: undefined;
|
|
391
|
+
const partner = partnerId ? useScene.getState().nodes[partnerId] : undefined;
|
|
330
392
|
const onMove = (event) => {
|
|
331
393
|
const drag = dragRef.current;
|
|
332
394
|
if (!drag)
|
|
333
395
|
return;
|
|
334
|
-
//
|
|
335
|
-
const step =
|
|
396
|
+
// Follow the active snapping mode; Shift cycles that mode globally.
|
|
397
|
+
const step = isGridSnapActive() ? useEditor.getState().gridSnapStep : 0;
|
|
336
398
|
// Alt = detach: break the joint for this drag (it can still port-snap to
|
|
337
399
|
// re-mate elsewhere). Mirrors the wall corner drag.
|
|
338
|
-
const detached = event.altKey;
|
|
400
|
+
const detached = event.altKey && !drag.jointPartner;
|
|
339
401
|
let next = null;
|
|
340
402
|
if (canSwing && pivot) {
|
|
341
403
|
// Length-preserving swing: aim from the pivot toward the cursor and
|
|
@@ -347,8 +409,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
347
409
|
? swingVertical(event, pivot, startPoint)
|
|
348
410
|
: swingHorizontal(event, pivot, startPoint);
|
|
349
411
|
if (aim) {
|
|
350
|
-
// The swung endpoint follows the grid snap
|
|
351
|
-
// sets step 0 so it sweeps smoothly. Snapping the landed coords (not
|
|
412
|
+
// The swung endpoint follows the active grid snap mode. Snapping the landed coords (not
|
|
352
413
|
// the arc angle) keeps the endpoint on the grid like every other
|
|
353
414
|
// arrow, trading a hair of the fixed radius for grid alignment.
|
|
354
415
|
next = [
|
|
@@ -388,7 +449,10 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
388
449
|
// radius yields to the port). Stays available while detaching or
|
|
389
450
|
// free-dragging; suppressed only while a fitting is actively re-aiming.
|
|
390
451
|
if (isEndpoint && (detached || !drag.fittingEndpoint)) {
|
|
391
|
-
const port = findNearestPortXZ([next[0], next[1], next[2]], collectScenePorts({
|
|
452
|
+
const port = findNearestPortXZ([next[0], next[1], next[2]], collectScenePorts({
|
|
453
|
+
excludeNodeId: duct.id,
|
|
454
|
+
systems: DUCT_PORT_SYSTEMS,
|
|
455
|
+
}), PORT_SNAP_RADIUS_M);
|
|
392
456
|
if (port)
|
|
393
457
|
next = [port.position[0], port.position[1], port.position[2]];
|
|
394
458
|
}
|
|
@@ -404,7 +468,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
404
468
|
// when the grid is live (step > 0): Shift-precision has nothing to snap.
|
|
405
469
|
if (step > 0)
|
|
406
470
|
triggerSFX('sfx:grid-snap');
|
|
407
|
-
|
|
471
|
+
publishLivePreview(batch);
|
|
408
472
|
};
|
|
409
473
|
const onUp = () => {
|
|
410
474
|
const drag = dragRef.current;
|
|
@@ -419,30 +483,15 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
419
483
|
drag.cleanup();
|
|
420
484
|
dragRef.current = null;
|
|
421
485
|
setDraggingIndex(null);
|
|
422
|
-
|
|
423
|
-
//
|
|
486
|
+
clearLivePreview();
|
|
487
|
+
// Resume history and apply the final batch as one tracked change. The
|
|
488
|
+
// final batch is built the same way as
|
|
424
489
|
// each live frame (elbow re-aim, rigid connectivity follow, or — when
|
|
425
490
|
// detached — just the duct path).
|
|
426
491
|
const detached = drag.detached;
|
|
492
|
+
const moved = drag.current.some((v, axis) => v !== drag.initialPath[drag.index][axis]);
|
|
427
493
|
const finalBatch = buildDragBatch(drag, drag.current, detached);
|
|
428
|
-
// Revert the run AND whatever the drag carried to their pre-drag state
|
|
429
|
-
// while paused so history captures a clean before→after delta. When
|
|
430
|
-
// detached nothing else moved, so only the run needs reverting.
|
|
431
|
-
const revertUpdates = detached
|
|
432
|
-
? []
|
|
433
|
-
: drag.fittingEndpoint
|
|
434
|
-
? [drag.fittingEndpoint.revert]
|
|
435
|
-
: (drag.connectivity?.connections ?? []).map((conn) => conn.kind === 'rigid-node'
|
|
436
|
-
? { id: conn.nodeId, data: { position: conn.startPosition } }
|
|
437
|
-
: { id: conn.nodeId, data: { path: conn.startPath } });
|
|
438
|
-
useScene
|
|
439
|
-
.getState()
|
|
440
|
-
.updateNodes([
|
|
441
|
-
{ id: duct.id, data: { path: drag.initialPath } },
|
|
442
|
-
...revertUpdates.filter((u) => useScene.getState().nodes[u.id]),
|
|
443
|
-
]);
|
|
444
494
|
resumeSceneHistory(useScene);
|
|
445
|
-
const moved = drag.current.some((v, axis) => v !== drag.initialPath[drag.index][axis]);
|
|
446
495
|
if (moved && finalBatch) {
|
|
447
496
|
// A manual corner edit invalidates any stored auto-offset base (the
|
|
448
497
|
// tag's snapshot no longer matches the geometry), so strip the tag on
|
|
@@ -473,6 +522,9 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
473
522
|
cleanup,
|
|
474
523
|
connectivity,
|
|
475
524
|
fittingEndpoint,
|
|
525
|
+
jointPartner: partner?.type === 'duct-segment'
|
|
526
|
+
? { id: partner.id, startPath: partner.path.map((p) => [...p]) }
|
|
527
|
+
: undefined,
|
|
476
528
|
detached: false,
|
|
477
529
|
};
|
|
478
530
|
window.addEventListener('pointermove', onMove);
|
|
@@ -527,23 +579,23 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
527
579
|
const b = bearing(event.clientX, event.clientY);
|
|
528
580
|
if (b === null)
|
|
529
581
|
return;
|
|
530
|
-
// Snap the roll to 45° steps
|
|
582
|
+
// Snap the roll to 45° steps only in the active angle mode.
|
|
531
583
|
const raw = b - startBearing;
|
|
532
|
-
const delta =
|
|
584
|
+
const delta = isAngleSnapActive() ? Math.round(raw / ROLL_STEP_RAD) * ROLL_STEP_RAD : raw;
|
|
533
585
|
const next = startRoll + delta;
|
|
534
586
|
if (next === current)
|
|
535
587
|
return;
|
|
536
588
|
current = next;
|
|
537
|
-
// Tick the rotate SFX each time a fresh
|
|
538
|
-
|
|
539
|
-
if (!event.shiftKey) {
|
|
589
|
+
// Tick the rotate SFX each time a fresh snapped step is crossed.
|
|
590
|
+
if (isAngleSnapActive()) {
|
|
540
591
|
const step = Math.round(raw / ROLL_STEP_RAD);
|
|
541
592
|
if (step !== lastStep) {
|
|
542
593
|
lastStep = step;
|
|
543
594
|
triggerSFX('sfx:item-rotate');
|
|
544
595
|
}
|
|
545
596
|
}
|
|
546
|
-
|
|
597
|
+
useLiveNodeOverrides.getState().set(duct.id, { roll: next });
|
|
598
|
+
useScene.getState().markDirty(duct.id);
|
|
547
599
|
};
|
|
548
600
|
const onUp = () => {
|
|
549
601
|
swallowNextClick();
|
|
@@ -551,12 +603,11 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
551
603
|
window.removeEventListener('pointerup', onUp);
|
|
552
604
|
window.removeEventListener('pointercancel', onUp);
|
|
553
605
|
useViewer.getState().setInputDragging(false);
|
|
606
|
+
clearPlacementSurface();
|
|
554
607
|
document.body.style.cursor = '';
|
|
555
608
|
setRolling(false);
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
// invalidates any stored auto-offset base, so strip the tag on commit.
|
|
559
|
-
useScene.getState().updateNode(duct.id, { roll: startRoll });
|
|
609
|
+
useLiveNodeOverrides.getState().clear(duct.id);
|
|
610
|
+
useScene.getState().markDirty(duct.id);
|
|
560
611
|
resumeSceneHistory(useScene);
|
|
561
612
|
if (current !== startRoll) {
|
|
562
613
|
useScene.getState().updateNode(duct.id, {
|
|
@@ -604,12 +655,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
604
655
|
const logicalPath = (runBase?.data?.path?.map((p) => [...p]) ?? initialPath);
|
|
605
656
|
const baseDy = tag?.dy ?? 0;
|
|
606
657
|
const mintedIds = (tag?.minted ?? []);
|
|
607
|
-
|
|
608
|
-
// restore the original Z (the single-undo baseline) before the final write.
|
|
609
|
-
const mintedSnapshots = mintedIds
|
|
610
|
-
.map((id) => preRewindNodes[id])
|
|
611
|
-
.filter((n) => Boolean(n));
|
|
612
|
-
const previewDeletedSnapshots = new Map();
|
|
658
|
+
const previewHiddenIds = new Set();
|
|
613
659
|
pauseSceneHistory(useScene);
|
|
614
660
|
const ensureSceneObjectsVisible = (ids) => {
|
|
615
661
|
const scene = useScene.getState();
|
|
@@ -640,11 +686,32 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
640
686
|
}
|
|
641
687
|
};
|
|
642
688
|
const clearLivePreview = () => {
|
|
689
|
+
const scene = useScene.getState();
|
|
643
690
|
const overrides = useLiveNodeOverrides.getState();
|
|
644
|
-
for (const id of livePreviewIds)
|
|
691
|
+
for (const id of livePreviewIds) {
|
|
645
692
|
overrides.clear(id);
|
|
693
|
+
if (scene.nodes[id])
|
|
694
|
+
scene.markDirty(id);
|
|
695
|
+
}
|
|
646
696
|
livePreviewIds.clear();
|
|
647
697
|
};
|
|
698
|
+
const setPreviewHidden = (ids) => {
|
|
699
|
+
const next = new Set(ids);
|
|
700
|
+
for (const id of previewHiddenIds) {
|
|
701
|
+
if (next.has(id))
|
|
702
|
+
continue;
|
|
703
|
+
const object = sceneRegistry.nodes.get(id);
|
|
704
|
+
if (object)
|
|
705
|
+
object.visible = true;
|
|
706
|
+
previewHiddenIds.delete(id);
|
|
707
|
+
}
|
|
708
|
+
for (const id of next) {
|
|
709
|
+
const object = sceneRegistry.nodes.get(id);
|
|
710
|
+
if (object)
|
|
711
|
+
object.visible = false;
|
|
712
|
+
previewHiddenIds.add(id);
|
|
713
|
+
}
|
|
714
|
+
};
|
|
648
715
|
// Connectivity + ports are read from an IN-MEMORY post-rewind scene (the
|
|
649
716
|
// logical L), so click-only pointerdown doesn't visually snap the committed
|
|
650
717
|
// offset down to the floor. The real scene is only rewound after the first
|
|
@@ -716,10 +783,15 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
716
783
|
const partnerReverts = () => (connectivity?.connections ?? [])
|
|
717
784
|
.map((conn) => {
|
|
718
785
|
if (conn.kind !== 'rigid-node') {
|
|
719
|
-
return {
|
|
786
|
+
return {
|
|
787
|
+
id: conn.nodeId,
|
|
788
|
+
data: { path: conn.startPath },
|
|
789
|
+
};
|
|
720
790
|
}
|
|
721
791
|
const start = nodesById[conn.nodeId];
|
|
722
|
-
const data = {
|
|
792
|
+
const data = {
|
|
793
|
+
position: conn.startPosition,
|
|
794
|
+
};
|
|
723
795
|
if (start?.rotation !== undefined)
|
|
724
796
|
data.rotation = start.rotation;
|
|
725
797
|
if (start?.angle !== undefined)
|
|
@@ -732,7 +804,10 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
732
804
|
// start paths / poses. A re-drag carries the existing tag's base forward.
|
|
733
805
|
const freshBase = () => [
|
|
734
806
|
{ id: duct.id, data: { path: initialPath } },
|
|
735
|
-
...partnerReverts().map((u) => ({
|
|
807
|
+
...partnerReverts().map((u) => ({
|
|
808
|
+
id: u.id,
|
|
809
|
+
data: u.data,
|
|
810
|
+
})),
|
|
736
811
|
];
|
|
737
812
|
// Patches restoring partners to their PRE-rewind (original Z) poses — the
|
|
738
813
|
// single-undo baseline. Untagged: same as the L (no rewind happened).
|
|
@@ -746,7 +821,10 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
746
821
|
if (!orig)
|
|
747
822
|
return null;
|
|
748
823
|
if ('path' in orig)
|
|
749
|
-
return {
|
|
824
|
+
return {
|
|
825
|
+
id: b.id,
|
|
826
|
+
data: { path: orig.path },
|
|
827
|
+
};
|
|
750
828
|
const data = {};
|
|
751
829
|
if (orig.position !== undefined)
|
|
752
830
|
data.position = orig.position;
|
|
@@ -760,47 +838,19 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
760
838
|
.filter((u) => useScene.getState().nodes[u.id]);
|
|
761
839
|
};
|
|
762
840
|
const restoreOriginalOffsetPreview = () => {
|
|
763
|
-
const scene = useScene.getState();
|
|
764
841
|
const partnerUpdates = originalPartnerReverts();
|
|
765
842
|
const updates = [
|
|
766
843
|
{
|
|
767
844
|
id: duct.id,
|
|
768
|
-
data: {
|
|
845
|
+
data: {
|
|
846
|
+
path: duct.path,
|
|
847
|
+
metadata: duct.metadata,
|
|
848
|
+
},
|
|
769
849
|
},
|
|
770
850
|
...partnerUpdates,
|
|
771
851
|
];
|
|
772
852
|
publishLivePreview(updates);
|
|
773
|
-
|
|
774
|
-
create: mintedSnapshots
|
|
775
|
-
.filter((n) => !scene.nodes[n.id])
|
|
776
|
-
.map((node) => ({ node, parentId })),
|
|
777
|
-
update: updates,
|
|
778
|
-
});
|
|
779
|
-
ensureSceneObjectsVisible([
|
|
780
|
-
duct.id,
|
|
781
|
-
...mintedSnapshots.map((node) => node.id),
|
|
782
|
-
...partnerUpdates.map((update) => update.id),
|
|
783
|
-
]);
|
|
784
|
-
};
|
|
785
|
-
const restorePreviewDeleted = (keepDeleted = []) => {
|
|
786
|
-
const keep = new Set(keepDeleted);
|
|
787
|
-
const scene = useScene.getState();
|
|
788
|
-
const create = [];
|
|
789
|
-
for (const [id, node] of previewDeletedSnapshots) {
|
|
790
|
-
if (keep.has(id))
|
|
791
|
-
continue;
|
|
792
|
-
if (!scene.nodes[id]) {
|
|
793
|
-
create.push({
|
|
794
|
-
node,
|
|
795
|
-
parentId: (node.parentId ?? undefined),
|
|
796
|
-
});
|
|
797
|
-
}
|
|
798
|
-
previewDeletedSnapshots.delete(id);
|
|
799
|
-
}
|
|
800
|
-
if (create.length > 0) {
|
|
801
|
-
scene.applyNodeChanges({ create });
|
|
802
|
-
ensureSceneObjectsVisible(create.map(({ node }) => node.id));
|
|
803
|
-
}
|
|
853
|
+
setPreviewHidden([]);
|
|
804
854
|
};
|
|
805
855
|
const applyLogicalBasePreview = () => {
|
|
806
856
|
if (!tag)
|
|
@@ -819,11 +869,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
819
869
|
.map((b) => ({ id: b.id, data: b.data })),
|
|
820
870
|
];
|
|
821
871
|
publishLivePreview(updates);
|
|
822
|
-
|
|
823
|
-
delete: mintedIds.filter((id) => scene.nodes[id]),
|
|
824
|
-
update: updates,
|
|
825
|
-
});
|
|
826
|
-
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
872
|
+
setPreviewHidden(mintedIds);
|
|
827
873
|
};
|
|
828
874
|
const onMove = (event) => {
|
|
829
875
|
if (startSample === null)
|
|
@@ -831,7 +877,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
831
877
|
const s = sample(event.clientX, event.clientY);
|
|
832
878
|
if (s === null)
|
|
833
879
|
return;
|
|
834
|
-
const step =
|
|
880
|
+
const step = isGridSnapActive() ? useEditor.getState().gridSnapStep : 0;
|
|
835
881
|
const next = snap(s - startSample, step);
|
|
836
882
|
if (next === delta)
|
|
837
883
|
return;
|
|
@@ -865,12 +911,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
865
911
|
const plan = offsetResult.plan;
|
|
866
912
|
const scene = useScene.getState();
|
|
867
913
|
const deletePreview = (plan.delete ?? []).filter((id) => scene.nodes[id]);
|
|
868
|
-
|
|
869
|
-
const node = scene.nodes[id];
|
|
870
|
-
if (node)
|
|
871
|
-
previewDeletedSnapshots.set(id, node);
|
|
872
|
-
}
|
|
873
|
-
restorePreviewDeleted(plan.delete ?? []);
|
|
914
|
+
setPreviewHidden([...mintedIds, ...deletePreview]);
|
|
874
915
|
const followUpdates = connectivityUpdatesForPath(connectivity, plan.followPath);
|
|
875
916
|
const updates = [
|
|
876
917
|
{ id: duct.id, data: { path: plan.ductPath } },
|
|
@@ -878,31 +919,29 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
878
919
|
...followUpdates,
|
|
879
920
|
];
|
|
880
921
|
publishLivePreview(updates);
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
922
|
+
setVerticalGhost({
|
|
923
|
+
tint: 'valid',
|
|
924
|
+
fittings: plan.fittings,
|
|
925
|
+
risers: plan.risers,
|
|
884
926
|
});
|
|
885
|
-
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
886
|
-
setVerticalGhost({ tint: 'valid', fittings: plan.fittings, risers: plan.risers });
|
|
887
927
|
}
|
|
888
928
|
else if (offsetResult?.status === 'invalid') {
|
|
889
929
|
// No clean offset at this height. Keep the last committed network
|
|
890
930
|
// visible (including any prior auto-offset we rewound at drag-start)
|
|
891
931
|
// and show a RED ghost of the run where it WOULD lift to. Nothing is
|
|
892
932
|
// committed on release, so the run snaps back to its prior state.
|
|
893
|
-
restorePreviewDeleted();
|
|
894
933
|
restoreOriginalOffsetPreview();
|
|
895
|
-
const lifted = DuctSegmentNode.parse({
|
|
934
|
+
const lifted = DuctSegmentNode.parse({
|
|
935
|
+
...logicalDuct,
|
|
936
|
+
path: shiftedPath(next),
|
|
937
|
+
});
|
|
896
938
|
setVerticalGhost({ tint: 'invalid', fittings: [], risers: [lifted] });
|
|
897
939
|
}
|
|
898
940
|
else {
|
|
899
|
-
restorePreviewDeleted();
|
|
900
941
|
applyLogicalBasePreview();
|
|
901
942
|
setVerticalGhost(null);
|
|
902
943
|
const updates = batchFor(shiftedPath(next));
|
|
903
944
|
publishLivePreview(updates);
|
|
904
|
-
useScene.getState().updateNodes(updates);
|
|
905
|
-
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
906
945
|
}
|
|
907
946
|
};
|
|
908
947
|
const onUp = () => {
|
|
@@ -915,35 +954,7 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
915
954
|
setRunMoving(false);
|
|
916
955
|
setVerticalGhost(null);
|
|
917
956
|
clearLivePreview();
|
|
918
|
-
|
|
919
|
-
// original Z — recreate the minted nodes the rewind deleted and restore
|
|
920
|
-
// the run + partners), resume, then write the final state as ONE tracked
|
|
921
|
-
// change so undo jumps straight back to the original.
|
|
922
|
-
const restore = useScene.getState();
|
|
923
|
-
const restoredPreviewNodes = Array.from(previewDeletedSnapshots.values()).filter((node) => !restore.nodes[node.id]);
|
|
924
|
-
const restoredMintedNodes = mintedSnapshots.filter((n) => !restore.nodes[n.id]);
|
|
925
|
-
const restoreUpdates = [
|
|
926
|
-
{
|
|
927
|
-
id: duct.id,
|
|
928
|
-
data: { path: duct.path, metadata: duct.metadata },
|
|
929
|
-
},
|
|
930
|
-
...originalPartnerReverts(),
|
|
931
|
-
];
|
|
932
|
-
restore.applyNodeChanges({
|
|
933
|
-
create: [
|
|
934
|
-
...restoredMintedNodes.map((node) => ({ node, parentId })),
|
|
935
|
-
...restoredPreviewNodes.map((node) => ({
|
|
936
|
-
node,
|
|
937
|
-
parentId: (node.parentId ?? undefined),
|
|
938
|
-
})),
|
|
939
|
-
],
|
|
940
|
-
update: restoreUpdates,
|
|
941
|
-
});
|
|
942
|
-
ensureSceneObjectsVisible([
|
|
943
|
-
...restoredMintedNodes.map((node) => node.id),
|
|
944
|
-
...restoredPreviewNodes.map((node) => node.id),
|
|
945
|
-
...restoreUpdates.map((update) => update.id),
|
|
946
|
-
]);
|
|
957
|
+
setPreviewHidden([]);
|
|
947
958
|
resumeSceneHistory(useScene);
|
|
948
959
|
if (delta === 0)
|
|
949
960
|
return;
|
|
@@ -1036,7 +1047,10 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
1036
1047
|
if (translationPlan) {
|
|
1037
1048
|
const created = [...translationPlan.fittings, ...translationPlan.connectors];
|
|
1038
1049
|
const updates = [
|
|
1039
|
-
{
|
|
1050
|
+
{
|
|
1051
|
+
id: duct.id,
|
|
1052
|
+
data: { path: translationPlan.ductPath },
|
|
1053
|
+
},
|
|
1040
1054
|
...translationPlan.updates,
|
|
1041
1055
|
];
|
|
1042
1056
|
scene.applyNodeChanges({
|
|
@@ -1084,19 +1098,19 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
1084
1098
|
window.addEventListener('pointerup', onUp);
|
|
1085
1099
|
window.addEventListener('pointercancel', onUp);
|
|
1086
1100
|
};
|
|
1087
|
-
const cornerArrows = useMemo(() => getCornerArrows(
|
|
1088
|
-
const rollGizmo = useMemo(() => (
|
|
1101
|
+
const cornerArrows = useMemo(() => getCornerArrows(displayDuct), [displayDuct]);
|
|
1102
|
+
const rollGizmo = useMemo(() => (displayDuct.shape === 'round' ? null : runAxisAndCenter(displayDuct)), [displayDuct]);
|
|
1089
1103
|
// Run-center cube position (centroid centerline). The six whole-run move
|
|
1090
1104
|
// arrows + the roll arc are revealed on hover, like the per-vertex clusters.
|
|
1091
|
-
const runCenter = useMemo(() => runAxisAndCenter(
|
|
1105
|
+
const runCenter = useMemo(() => runAxisAndCenter(displayDuct)?.center ?? null, [displayDuct]);
|
|
1092
1106
|
// Yaw the center cube to the run's horizontal heading so it stays aligned
|
|
1093
1107
|
// with the run (matching the per-vertex cubes). A pure riser has no heading.
|
|
1094
1108
|
const runCenterYaw = useMemo(() => {
|
|
1095
|
-
const axis = runAxisAndCenter(
|
|
1109
|
+
const axis = runAxisAndCenter(displayDuct);
|
|
1096
1110
|
if (!axis || Math.hypot(axis.dir[0], axis.dir[2]) < 1e-6)
|
|
1097
1111
|
return 0;
|
|
1098
1112
|
return Math.atan2(-axis.dir[2], axis.dir[0]);
|
|
1099
|
-
}, [
|
|
1113
|
+
}, [displayDuct]);
|
|
1100
1114
|
// Six whole-run move arrows offset off the center: four horizontal (along-run
|
|
1101
1115
|
// ± and across-run ±, aligned to the run's XZ tangent so they track the run
|
|
1102
1116
|
// instead of world ±X / ±Z) plus the up / down vertical pair. All shift every
|
|
@@ -1104,10 +1118,10 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
1104
1118
|
const centerArrows = useMemo(() => {
|
|
1105
1119
|
if (!runCenter)
|
|
1106
1120
|
return [];
|
|
1107
|
-
const base = Math.max(runRadiusM(
|
|
1121
|
+
const base = Math.max(runRadiusM(displayDuct) + CORNER_ARROW_GAP, CORNER_ARROW_MIN_OFFSET);
|
|
1108
1122
|
// Run's horizontal heading (node-local XZ). A pure riser has none → fall
|
|
1109
1123
|
// back to world +X so the arrows stay usable.
|
|
1110
|
-
const axis = runAxisAndCenter(
|
|
1124
|
+
const axis = runAxisAndCenter(displayDuct);
|
|
1111
1125
|
const t = axis && Math.hypot(axis.dir[0], axis.dir[2]) > 1e-6
|
|
1112
1126
|
? (() => {
|
|
1113
1127
|
const len = Math.hypot(axis.dir[0], axis.dir[2]);
|
|
@@ -1144,19 +1158,22 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
1144
1158
|
cursor: 'ns-resize',
|
|
1145
1159
|
});
|
|
1146
1160
|
return arrows;
|
|
1147
|
-
}, [
|
|
1161
|
+
}, [displayDuct, runCenter]);
|
|
1148
1162
|
return (_jsxs("group", { ref: outerRef, children: [verticalGhost?.fittings.map((f) => (_jsx(FittingGhost, { fitting: f, tint: verticalGhost.tint }, `vghost-fit-${f.id}`))), verticalGhost?.risers.map((r) => (_jsx(DuctSegmentGhost, { duct: r, tint: verticalGhost.tint }, `vghost-riser-${r.id}`))), draggingIndex === null &&
|
|
1149
1163
|
!rolling &&
|
|
1150
1164
|
!runMoving &&
|
|
1151
|
-
|
|
1165
|
+
['start', 'end'].map((endpoint) => (_jsx(DuctContinuationHandle, { duct: displayDuct, endpoint: endpoint }, endpoint))), draggingIndex === null &&
|
|
1166
|
+
!rolling &&
|
|
1167
|
+
!runMoving &&
|
|
1168
|
+
displayDuct.path.map((p, i) => (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === i, onClick: () => toggleCluster(i), position: p, rotationY: vertexYaw(displayDuct, i) }), openCluster === i &&
|
|
1152
1169
|
cornerArrows
|
|
1153
1170
|
.filter((a) => a.index === i)
|
|
1154
|
-
.map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onHandleDown(a.index, a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key)))] }, `vtx${i}`))), draggingIndex === null && !rolling && !runMoving && runCenter && (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === 'center', onClick: () => toggleCluster('center'), position: runCenter, rotationY: runCenterYaw }), openCluster === 'center' && (_jsxs(_Fragment, { children: [centerArrows.map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onRunMoveDown(a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key))), rollGizmo && (_jsx(RollHandle, { center: rollGizmo.center, dir: rollGizmo.dir, onPointerDown: onRollDown, radius: runRadiusM(
|
|
1155
|
-
|
|
1171
|
+
.map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onHandleDown(a.index, a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key)))] }, `vtx${i}`))), draggingIndex === null && !rolling && !runMoving && runCenter && (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === 'center', onClick: () => toggleCluster('center'), position: runCenter, rotationY: runCenterYaw }), openCluster === 'center' && (_jsxs(_Fragment, { children: [centerArrows.map((a) => (_jsx(MoveChevron, { cursor: a.cursor, onPointerDown: onRunMoveDown(a.kind), position: a.position, rotationY: a.rotationY, vertical: a.vertical }, a.key))), rollGizmo && (_jsx(RollHandle, { center: rollGizmo.center, dir: rollGizmo.dir, onPointerDown: onRollDown, radius: runRadiusM(displayDuct) + CORNER_ARROW_GAP }))] }))] })), draggingIndex !== null &&
|
|
1172
|
+
displayDuct.path[draggingIndex] &&
|
|
1156
1173
|
(() => {
|
|
1157
1174
|
// Same pill as the draw tool: signed per-axis deltas from the
|
|
1158
1175
|
// drag-start position, dominant axis emphasised.
|
|
1159
|
-
const point =
|
|
1176
|
+
const point = displayDuct.path[draggingIndex];
|
|
1160
1177
|
const origin = dragRef.current?.initialPath[draggingIndex] ?? point;
|
|
1161
1178
|
const deltas = [point[0] - origin[0], point[1] - origin[1], point[2] - origin[2]];
|
|
1162
1179
|
const axes = ['x', 'y', 'z'];
|
|
@@ -1169,6 +1186,17 @@ const DuctPointHandles = ({ duct, target }) => {
|
|
|
1169
1186
|
})), primary: primary, unit: unit }) }));
|
|
1170
1187
|
})()] }));
|
|
1171
1188
|
};
|
|
1189
|
+
function DuctContinuationHandle({ duct, endpoint, }) {
|
|
1190
|
+
const nodes = useScene((state) => state.nodes);
|
|
1191
|
+
const gap = Math.max(0.28, runRadiusM(duct) + 0.18);
|
|
1192
|
+
const plan = ductContinuationHandlePlan(duct, endpoint, nodes, gap);
|
|
1193
|
+
if (!plan)
|
|
1194
|
+
return null;
|
|
1195
|
+
return (_jsx(ContinuePlusHandle, { onActivate: () => {
|
|
1196
|
+
triggerSFX('sfx:item-pick');
|
|
1197
|
+
activateDuctContinuation(duct, endpoint, plan.fittingId);
|
|
1198
|
+
}, position: plan.position }));
|
|
1199
|
+
}
|
|
1172
1200
|
/**
|
|
1173
1201
|
* Roll gizmo — the shared `RotateArc` re-oriented to wrap the run's length
|
|
1174
1202
|
* axis, seated at a FIXED corner of the section frame. It does NOT track
|