@pascal-app/nodes 0.1.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/dist/box-vent/definition.d.ts +30 -0
- package/dist/box-vent/definition.d.ts.map +1 -0
- package/dist/box-vent/definition.js +210 -0
- package/dist/box-vent/floorplan.d.ts +15 -0
- package/dist/box-vent/floorplan.d.ts.map +1 -0
- package/dist/box-vent/floorplan.js +187 -0
- package/dist/box-vent/geometry.d.ts +40 -0
- package/dist/box-vent/geometry.d.ts.map +1 -0
- package/dist/box-vent/geometry.js +421 -0
- package/dist/box-vent/index.d.ts +4 -0
- package/dist/box-vent/index.d.ts.map +1 -0
- package/dist/box-vent/index.js +3 -0
- package/dist/box-vent/move-tool.d.ts +14 -0
- package/dist/box-vent/move-tool.d.ts.map +1 -0
- package/dist/box-vent/move-tool.js +217 -0
- package/dist/box-vent/panel.d.ts +14 -0
- package/dist/box-vent/panel.d.ts.map +1 -0
- package/dist/box-vent/panel.js +143 -0
- package/dist/box-vent/parametrics.d.ts +9 -0
- package/dist/box-vent/parametrics.d.ts.map +1 -0
- package/dist/box-vent/parametrics.js +35 -0
- package/dist/box-vent/preview.d.ts +17 -0
- package/dist/box-vent/preview.d.ts.map +1 -0
- package/dist/box-vent/preview.js +41 -0
- package/dist/box-vent/renderer.d.ts +26 -0
- package/dist/box-vent/renderer.d.ts.map +1 -0
- package/dist/box-vent/renderer.js +127 -0
- package/dist/box-vent/schema.d.ts +2 -0
- package/dist/box-vent/schema.d.ts.map +1 -0
- package/dist/box-vent/schema.js +3 -0
- package/dist/box-vent/tool.d.ts +13 -0
- package/dist/box-vent/tool.d.ts.map +1 -0
- package/dist/box-vent/tool.js +116 -0
- package/dist/building/definition.d.ts +12 -0
- package/dist/building/definition.d.ts.map +1 -0
- package/dist/building/definition.js +53 -0
- package/dist/building/index.d.ts +2 -0
- package/dist/building/index.d.ts.map +1 -0
- package/dist/building/index.js +1 -0
- package/dist/building/move-tool.d.ts +6 -0
- package/dist/building/move-tool.d.ts.map +1 -0
- package/dist/building/move-tool.js +187 -0
- package/dist/building/parametrics.d.ts +3 -0
- package/dist/building/parametrics.d.ts.map +1 -0
- package/dist/building/parametrics.js +3 -0
- package/dist/building/renderer.d.ts +6 -0
- package/dist/building/renderer.d.ts.map +1 -0
- package/dist/building/renderer.js +12 -0
- package/dist/building/schema.d.ts +2 -0
- package/dist/building/schema.d.ts.map +1 -0
- package/dist/building/schema.js +1 -0
- package/dist/cabinet/animation.d.ts +5 -0
- package/dist/cabinet/animation.d.ts.map +1 -0
- package/dist/cabinet/animation.js +48 -0
- package/dist/cabinet/compartment-card.d.ts +17 -0
- package/dist/cabinet/compartment-card.d.ts.map +1 -0
- package/dist/cabinet/compartment-card.js +145 -0
- package/dist/cabinet/continuous-placement.d.ts +49 -0
- package/dist/cabinet/continuous-placement.d.ts.map +1 -0
- package/dist/cabinet/continuous-placement.js +110 -0
- package/dist/cabinet/cooktop-flame.d.ts +14 -0
- package/dist/cabinet/cooktop-flame.d.ts.map +1 -0
- package/dist/cabinet/cooktop-flame.js +115 -0
- package/dist/cabinet/definition.d.ts +26 -0
- package/dist/cabinet/definition.d.ts.map +1 -0
- package/dist/cabinet/definition.js +1016 -0
- package/dist/cabinet/floorplan-move.d.ts +15 -0
- package/dist/cabinet/floorplan-move.d.ts.map +1 -0
- package/dist/cabinet/floorplan-move.js +192 -0
- package/dist/cabinet/floorplan-overrides.d.ts +16 -0
- package/dist/cabinet/floorplan-overrides.d.ts.map +1 -0
- package/dist/cabinet/floorplan-overrides.js +47 -0
- package/dist/cabinet/floorplan.d.ts +4 -0
- package/dist/cabinet/floorplan.d.ts.map +1 -0
- package/dist/cabinet/floorplan.js +311 -0
- package/dist/cabinet/geometry/cooktop.d.ts +20 -0
- package/dist/cabinet/geometry/cooktop.d.ts.map +1 -0
- package/dist/cabinet/geometry/cooktop.js +269 -0
- package/dist/cabinet/geometry/dishwasher.d.ts +4 -0
- package/dist/cabinet/geometry/dishwasher.d.ts.map +1 -0
- package/dist/cabinet/geometry/dishwasher.js +100 -0
- package/dist/cabinet/geometry/fridge.d.ts +5 -0
- package/dist/cabinet/geometry/fridge.d.ts.map +1 -0
- package/dist/cabinet/geometry/fridge.js +393 -0
- package/dist/cabinet/geometry/fronts.d.ts +9 -0
- package/dist/cabinet/geometry/fronts.d.ts.map +1 -0
- package/dist/cabinet/geometry/fronts.js +468 -0
- package/dist/cabinet/geometry/hood.d.ts +6 -0
- package/dist/cabinet/geometry/hood.d.ts.map +1 -0
- package/dist/cabinet/geometry/hood.js +108 -0
- package/dist/cabinet/geometry/oven-microwave.d.ts +5 -0
- package/dist/cabinet/geometry/oven-microwave.d.ts.map +1 -0
- package/dist/cabinet/geometry/oven-microwave.js +292 -0
- package/dist/cabinet/geometry/pantry.d.ts +5 -0
- package/dist/cabinet/geometry/pantry.d.ts.map +1 -0
- package/dist/cabinet/geometry/pantry.js +80 -0
- package/dist/cabinet/geometry/run.d.ts +6 -0
- package/dist/cabinet/geometry/run.d.ts.map +1 -0
- package/dist/cabinet/geometry/run.js +124 -0
- package/dist/cabinet/geometry/shared.d.ts +46 -0
- package/dist/cabinet/geometry/shared.d.ts.map +1 -0
- package/dist/cabinet/geometry/shared.js +356 -0
- package/dist/cabinet/geometry/sink.d.ts +29 -0
- package/dist/cabinet/geometry/sink.d.ts.map +1 -0
- package/dist/cabinet/geometry/sink.js +262 -0
- package/dist/cabinet/geometry.d.ts +6 -0
- package/dist/cabinet/geometry.d.ts.map +1 -0
- package/dist/cabinet/geometry.js +219 -0
- package/dist/cabinet/index.d.ts +5 -0
- package/dist/cabinet/index.d.ts.map +1 -0
- package/dist/cabinet/index.js +4 -0
- package/dist/cabinet/interaction.d.ts +15 -0
- package/dist/cabinet/interaction.d.ts.map +1 -0
- package/dist/cabinet/interaction.js +109 -0
- package/dist/cabinet/move-frame.d.ts +3 -0
- package/dist/cabinet/move-frame.d.ts.map +1 -0
- package/dist/cabinet/move-frame.js +252 -0
- package/dist/cabinet/paint.d.ts +2 -0
- package/dist/cabinet/paint.d.ts.map +1 -0
- package/dist/cabinet/paint.js +17 -0
- package/dist/cabinet/panel.d.ts +2 -0
- package/dist/cabinet/panel.d.ts.map +1 -0
- package/dist/cabinet/panel.js +356 -0
- package/dist/cabinet/parametrics.d.ts +4 -0
- package/dist/cabinet/parametrics.d.ts.map +1 -0
- package/dist/cabinet/parametrics.js +46 -0
- package/dist/cabinet/placement-status.d.ts +7 -0
- package/dist/cabinet/placement-status.d.ts.map +1 -0
- package/dist/cabinet/placement-status.js +6 -0
- package/dist/cabinet/placement-type.d.ts +9 -0
- package/dist/cabinet/placement-type.d.ts.map +1 -0
- package/dist/cabinet/placement-type.js +13 -0
- package/dist/cabinet/presets.d.ts +10 -0
- package/dist/cabinet/presets.d.ts.map +1 -0
- package/dist/cabinet/presets.js +168 -0
- package/dist/cabinet/quick-action-icons.d.ts +13 -0
- package/dist/cabinet/quick-action-icons.d.ts.map +1 -0
- package/dist/cabinet/quick-action-icons.js +29 -0
- package/dist/cabinet/quick-actions.d.ts +6 -0
- package/dist/cabinet/quick-actions.d.ts.map +1 -0
- package/dist/cabinet/quick-actions.js +203 -0
- package/dist/cabinet/run-layout.d.ts +94 -0
- package/dist/cabinet/run-layout.d.ts.map +1 -0
- package/dist/cabinet/run-layout.js +315 -0
- package/dist/cabinet/run-ops.d.ts +140 -0
- package/dist/cabinet/run-ops.d.ts.map +1 -0
- package/dist/cabinet/run-ops.js +1472 -0
- package/dist/cabinet/run-panel.d.ts +17 -0
- package/dist/cabinet/run-panel.d.ts.map +1 -0
- package/dist/cabinet/run-panel.js +220 -0
- package/dist/cabinet/scene-action.d.ts +8 -0
- package/dist/cabinet/scene-action.d.ts.map +1 -0
- package/dist/cabinet/scene-action.js +130 -0
- package/dist/cabinet/schema.d.ts +2 -0
- package/dist/cabinet/schema.d.ts.map +1 -0
- package/dist/cabinet/schema.js +1 -0
- package/dist/cabinet/slots.d.ts +4 -0
- package/dist/cabinet/slots.d.ts.map +1 -0
- package/dist/cabinet/slots.js +24 -0
- package/dist/cabinet/stack-transitions.d.ts +12 -0
- package/dist/cabinet/stack-transitions.d.ts.map +1 -0
- package/dist/cabinet/stack-transitions.js +112 -0
- package/dist/cabinet/stack.d.ts +102 -0
- package/dist/cabinet/stack.d.ts.map +1 -0
- package/dist/cabinet/stack.js +388 -0
- package/dist/cabinet/system.d.ts +13 -0
- package/dist/cabinet/system.d.ts.map +1 -0
- package/dist/cabinet/system.js +116 -0
- package/dist/cabinet/tool.d.ts +3 -0
- package/dist/cabinet/tool.d.ts.map +1 -0
- package/dist/cabinet/tool.js +850 -0
- package/dist/cabinet/tree-structure.d.ts +13 -0
- package/dist/cabinet/tree-structure.d.ts.map +1 -0
- package/dist/cabinet/tree-structure.js +138 -0
- package/dist/cabinet/wall-snap.d.ts +66 -0
- package/dist/cabinet/wall-snap.d.ts.map +1 -0
- package/dist/cabinet/wall-snap.js +255 -0
- package/dist/ceiling/boundary-editor.d.ts +17 -0
- package/dist/ceiling/boundary-editor.d.ts.map +1 -0
- package/dist/ceiling/boundary-editor.js +118 -0
- package/dist/ceiling/definition.d.ts +20 -0
- package/dist/ceiling/definition.d.ts.map +1 -0
- package/dist/ceiling/definition.js +161 -0
- package/dist/ceiling/floorplan-affordances.d.ts +181 -0
- package/dist/ceiling/floorplan-affordances.d.ts.map +1 -0
- package/dist/ceiling/floorplan-affordances.js +28 -0
- package/dist/ceiling/floorplan-move.d.ts +12 -0
- package/dist/ceiling/floorplan-move.d.ts.map +1 -0
- package/dist/ceiling/floorplan-move.js +16 -0
- package/dist/ceiling/floorplan.d.ts +9 -0
- package/dist/ceiling/floorplan.d.ts.map +1 -0
- package/dist/ceiling/floorplan.js +90 -0
- package/dist/ceiling/hole-editor.d.ts +10 -0
- package/dist/ceiling/hole-editor.d.ts.map +1 -0
- package/dist/ceiling/hole-editor.js +45 -0
- package/dist/ceiling/index.d.ts +3 -0
- package/dist/ceiling/index.d.ts.map +1 -0
- package/dist/ceiling/index.js +2 -0
- package/dist/ceiling/materials.d.ts +15 -0
- package/dist/ceiling/materials.d.ts.map +1 -0
- package/dist/ceiling/materials.js +61 -0
- package/dist/ceiling/move-tool.d.ts +6 -0
- package/dist/ceiling/move-tool.d.ts.map +1 -0
- package/dist/ceiling/move-tool.js +264 -0
- package/dist/ceiling/paint.d.ts +9 -0
- package/dist/ceiling/paint.d.ts.map +1 -0
- package/dist/ceiling/paint.js +37 -0
- package/dist/ceiling/panel.d.ts +11 -0
- package/dist/ceiling/panel.d.ts.map +1 -0
- package/dist/ceiling/panel.js +138 -0
- package/dist/ceiling/parametrics.d.ts +11 -0
- package/dist/ceiling/parametrics.d.ts.map +1 -0
- package/dist/ceiling/parametrics.js +16 -0
- package/dist/ceiling/renderer.d.ts +6 -0
- package/dist/ceiling/renderer.d.ts.map +1 -0
- package/dist/ceiling/renderer.js +87 -0
- package/dist/ceiling/schema.d.ts +2 -0
- package/dist/ceiling/schema.d.ts.map +1 -0
- package/dist/ceiling/schema.js +1 -0
- package/dist/ceiling/slots.d.ts +6 -0
- package/dist/ceiling/slots.d.ts.map +1 -0
- package/dist/ceiling/slots.js +7 -0
- package/dist/ceiling/system.d.ts +10 -0
- package/dist/ceiling/system.d.ts.map +1 -0
- package/dist/ceiling/system.js +14 -0
- package/dist/ceiling/tool.d.ts +3 -0
- package/dist/ceiling/tool.d.ts.map +1 -0
- package/dist/ceiling/tool.js +227 -0
- package/dist/chimney/definition.d.ts +18 -0
- package/dist/chimney/definition.d.ts.map +1 -0
- package/dist/chimney/definition.js +387 -0
- package/dist/chimney/floorplan.d.ts +17 -0
- package/dist/chimney/floorplan.d.ts.map +1 -0
- package/dist/chimney/floorplan.js +190 -0
- package/dist/chimney/geometry.d.ts +29 -0
- package/dist/chimney/geometry.d.ts.map +1 -0
- package/dist/chimney/geometry.js +500 -0
- package/dist/chimney/holes.d.ts +30 -0
- package/dist/chimney/holes.d.ts.map +1 -0
- package/dist/chimney/holes.js +310 -0
- package/dist/chimney/index.d.ts +4 -0
- package/dist/chimney/index.d.ts.map +1 -0
- package/dist/chimney/index.js +3 -0
- package/dist/chimney/move-tool.d.ts +19 -0
- package/dist/chimney/move-tool.d.ts.map +1 -0
- package/dist/chimney/move-tool.js +286 -0
- package/dist/chimney/paint.d.ts +24 -0
- package/dist/chimney/paint.d.ts.map +1 -0
- package/dist/chimney/paint.js +96 -0
- package/dist/chimney/panel.d.ts +2 -0
- package/dist/chimney/panel.d.ts.map +1 -0
- package/dist/chimney/panel.js +350 -0
- package/dist/chimney/parametrics.d.ts +4 -0
- package/dist/chimney/parametrics.d.ts.map +1 -0
- package/dist/chimney/parametrics.js +177 -0
- package/dist/chimney/presets.d.ts +27 -0
- package/dist/chimney/presets.d.ts.map +1 -0
- package/dist/chimney/presets.js +93 -0
- package/dist/chimney/preview.d.ts +14 -0
- package/dist/chimney/preview.d.ts.map +1 -0
- package/dist/chimney/preview.js +74 -0
- package/dist/chimney/renderer.d.ts +17 -0
- package/dist/chimney/renderer.d.ts.map +1 -0
- package/dist/chimney/renderer.js +193 -0
- package/dist/chimney/roof-trim.d.ts +23 -0
- package/dist/chimney/roof-trim.d.ts.map +1 -0
- package/dist/chimney/roof-trim.js +94 -0
- package/dist/chimney/schema.d.ts +2 -0
- package/dist/chimney/schema.d.ts.map +1 -0
- package/dist/chimney/schema.js +1 -0
- package/dist/chimney/tool.d.ts +3 -0
- package/dist/chimney/tool.d.ts.map +1 -0
- package/dist/chimney/tool.js +126 -0
- package/dist/column/definition.d.ts +21 -0
- package/dist/column/definition.d.ts.map +1 -0
- package/dist/column/definition.js +375 -0
- package/dist/column/floorplan-affordances.d.ts +32 -0
- package/dist/column/floorplan-affordances.d.ts.map +1 -0
- package/dist/column/floorplan-affordances.js +126 -0
- package/dist/column/floorplan-move.d.ts +11 -0
- package/dist/column/floorplan-move.d.ts.map +1 -0
- package/dist/column/floorplan-move.js +66 -0
- package/dist/column/floorplan.d.ts +15 -0
- package/dist/column/floorplan.d.ts.map +1 -0
- package/dist/column/floorplan.js +238 -0
- package/dist/column/index.d.ts +2 -0
- package/dist/column/index.d.ts.map +1 -0
- package/dist/column/index.js +1 -0
- package/dist/column/paint.d.ts +2 -0
- package/dist/column/paint.d.ts.map +1 -0
- package/dist/column/paint.js +15 -0
- package/dist/column/panel.d.ts +2 -0
- package/dist/column/panel.d.ts.map +1 -0
- package/dist/column/panel.js +414 -0
- package/dist/column/parametrics.d.ts +12 -0
- package/dist/column/parametrics.d.ts.map +1 -0
- package/dist/column/parametrics.js +21 -0
- package/dist/column/renderer.d.ts +20 -0
- package/dist/column/renderer.d.ts.map +1 -0
- package/dist/column/renderer.js +1016 -0
- package/dist/column/schema.d.ts +2 -0
- package/dist/column/schema.d.ts.map +1 -0
- package/dist/column/schema.js +1 -0
- package/dist/column/slots.d.ts +9 -0
- package/dist/column/slots.d.ts.map +1 -0
- package/dist/column/slots.js +19 -0
- package/dist/column/tool.d.ts +14 -0
- package/dist/column/tool.d.ts.map +1 -0
- package/dist/column/tool.js +133 -0
- package/dist/cupola/definition.d.ts +11 -0
- package/dist/cupola/definition.d.ts.map +1 -0
- package/dist/cupola/definition.js +143 -0
- package/dist/cupola/floorplan.d.ts +9 -0
- package/dist/cupola/floorplan.d.ts.map +1 -0
- package/dist/cupola/floorplan.js +89 -0
- package/dist/cupola/geometry.d.ts +23 -0
- package/dist/cupola/geometry.d.ts.map +1 -0
- package/dist/cupola/geometry.js +262 -0
- package/dist/cupola/index.d.ts +4 -0
- package/dist/cupola/index.d.ts.map +1 -0
- package/dist/cupola/index.js +3 -0
- package/dist/cupola/move-tool.d.ts +12 -0
- package/dist/cupola/move-tool.d.ts.map +1 -0
- package/dist/cupola/move-tool.js +206 -0
- package/dist/cupola/panel.d.ts +7 -0
- package/dist/cupola/panel.d.ts.map +1 -0
- package/dist/cupola/panel.js +106 -0
- package/dist/cupola/parametrics.d.ts +9 -0
- package/dist/cupola/parametrics.d.ts.map +1 -0
- package/dist/cupola/parametrics.js +30 -0
- package/dist/cupola/preview.d.ts +13 -0
- package/dist/cupola/preview.d.ts.map +1 -0
- package/dist/cupola/preview.js +37 -0
- package/dist/cupola/renderer.d.ts +12 -0
- package/dist/cupola/renderer.d.ts.map +1 -0
- package/dist/cupola/renderer.js +66 -0
- package/dist/cupola/schema.d.ts +2 -0
- package/dist/cupola/schema.d.ts.map +1 -0
- package/dist/cupola/schema.js +3 -0
- package/dist/cupola/tool.d.ts +8 -0
- package/dist/cupola/tool.d.ts.map +1 -0
- package/dist/cupola/tool.js +105 -0
- package/dist/door/definition.d.ts +23 -0
- package/dist/door/definition.d.ts.map +1 -0
- package/dist/door/definition.js +257 -0
- package/dist/door/door-math.d.ts +23 -0
- package/dist/door/door-math.d.ts.map +1 -0
- package/dist/door/door-math.js +38 -0
- package/dist/door/floorplan-affordances.d.ts +21 -0
- package/dist/door/floorplan-affordances.d.ts.map +1 -0
- package/dist/door/floorplan-affordances.js +102 -0
- package/dist/door/floorplan-move.d.ts +18 -0
- package/dist/door/floorplan-move.d.ts.map +1 -0
- package/dist/door/floorplan-move.js +239 -0
- package/dist/door/floorplan.d.ts +37 -0
- package/dist/door/floorplan.d.ts.map +1 -0
- package/dist/door/floorplan.js +702 -0
- package/dist/door/index.d.ts +3 -0
- package/dist/door/index.d.ts.map +1 -0
- package/dist/door/index.js +2 -0
- package/dist/door/move-tool.d.ts +6 -0
- package/dist/door/move-tool.d.ts.map +1 -0
- package/dist/door/move-tool.js +898 -0
- package/dist/door/paint.d.ts +8 -0
- package/dist/door/paint.d.ts.map +1 -0
- package/dist/door/paint.js +11 -0
- package/dist/door/panel.d.ts +2 -0
- package/dist/door/panel.d.ts.map +1 -0
- package/dist/door/panel.js +576 -0
- package/dist/door/parametrics.d.ts +12 -0
- package/dist/door/parametrics.d.ts.map +1 -0
- package/dist/door/parametrics.js +27 -0
- package/dist/door/preview.d.ts +18 -0
- package/dist/door/preview.d.ts.map +1 -0
- package/dist/door/preview.js +36 -0
- package/dist/door/renderer.d.ts +6 -0
- package/dist/door/renderer.d.ts.map +1 -0
- package/dist/door/renderer.js +26 -0
- package/dist/door/schema.d.ts +2 -0
- package/dist/door/schema.d.ts.map +1 -0
- package/dist/door/schema.js +1 -0
- package/dist/door/slots.d.ts +9 -0
- package/dist/door/slots.d.ts.map +1 -0
- package/dist/door/slots.js +20 -0
- package/dist/door/system.d.ts +18 -0
- package/dist/door/system.d.ts.map +1 -0
- package/dist/door/system.js +22 -0
- package/dist/door/tool.d.ts +15 -0
- package/dist/door/tool.d.ts.map +1 -0
- package/dist/door/tool.js +555 -0
- package/dist/dormer/csg-geometry.d.ts +104 -0
- package/dist/dormer/csg-geometry.d.ts.map +1 -0
- package/dist/dormer/csg-geometry.js +755 -0
- package/dist/dormer/definition.d.ts +20 -0
- package/dist/dormer/definition.d.ts.map +1 -0
- package/dist/dormer/definition.js +491 -0
- package/dist/dormer/floorplan.d.ts +23 -0
- package/dist/dormer/floorplan.d.ts.map +1 -0
- package/dist/dormer/floorplan.js +193 -0
- package/dist/dormer/geometry.d.ts +42 -0
- package/dist/dormer/geometry.d.ts.map +1 -0
- package/dist/dormer/geometry.js +63 -0
- package/dist/dormer/index.d.ts +5 -0
- package/dist/dormer/index.d.ts.map +1 -0
- package/dist/dormer/index.js +3 -0
- package/dist/dormer/move-tool.d.ts +16 -0
- package/dist/dormer/move-tool.d.ts.map +1 -0
- package/dist/dormer/move-tool.js +136 -0
- package/dist/dormer/paint.d.ts +24 -0
- package/dist/dormer/paint.d.ts.map +1 -0
- package/dist/dormer/paint.js +103 -0
- package/dist/dormer/panel-actions-section.d.ts +10 -0
- package/dist/dormer/panel-actions-section.d.ts.map +1 -0
- package/dist/dormer/panel-actions-section.js +11 -0
- package/dist/dormer/panel-position-section.d.ts +17 -0
- package/dist/dormer/panel-position-section.d.ts.map +1 -0
- package/dist/dormer/panel-position-section.js +162 -0
- package/dist/dormer/panel-window-section.d.ts +14 -0
- package/dist/dormer/panel-window-section.d.ts.map +1 -0
- package/dist/dormer/panel-window-section.js +59 -0
- package/dist/dormer/panel.d.ts +2 -0
- package/dist/dormer/panel.d.ts.map +1 -0
- package/dist/dormer/panel.js +134 -0
- package/dist/dormer/parametrics.d.ts +4 -0
- package/dist/dormer/parametrics.d.ts.map +1 -0
- package/dist/dormer/parametrics.js +110 -0
- package/dist/dormer/placement-guides.d.ts +28 -0
- package/dist/dormer/placement-guides.d.ts.map +1 -0
- package/dist/dormer/placement-guides.js +170 -0
- package/dist/dormer/preview.d.ts +7 -0
- package/dist/dormer/preview.d.ts.map +1 -0
- package/dist/dormer/preview.js +29 -0
- package/dist/dormer/renderer.d.ts +8 -0
- package/dist/dormer/renderer.d.ts.map +1 -0
- package/dist/dormer/renderer.js +134 -0
- package/dist/dormer/schema.d.ts +3 -0
- package/dist/dormer/schema.d.ts.map +1 -0
- package/dist/dormer/schema.js +1 -0
- package/dist/dormer/tool.d.ts +11 -0
- package/dist/dormer/tool.d.ts.map +1 -0
- package/dist/dormer/tool.js +69 -0
- package/dist/dormer/use-dormer-placement.d.ts +44 -0
- package/dist/dormer/use-dormer-placement.d.ts.map +1 -0
- package/dist/dormer/use-dormer-placement.js +166 -0
- package/dist/dormer/window-assembly.d.ts +22 -0
- package/dist/dormer/window-assembly.d.ts.map +1 -0
- package/dist/dormer/window-assembly.js +111 -0
- package/dist/dormer/window-frame.d.ts +24 -0
- package/dist/dormer/window-frame.d.ts.map +1 -0
- package/dist/dormer/window-frame.js +100 -0
- package/dist/downspout/definition.d.ts +17 -0
- package/dist/downspout/definition.d.ts.map +1 -0
- package/dist/downspout/definition.js +173 -0
- package/dist/downspout/geometry.d.ts +5 -0
- package/dist/downspout/geometry.d.ts.map +1 -0
- package/dist/downspout/geometry.js +204 -0
- package/dist/downspout/index.d.ts +4 -0
- package/dist/downspout/index.d.ts.map +1 -0
- package/dist/downspout/index.js +3 -0
- package/dist/downspout/inspector-editors.d.ts +25 -0
- package/dist/downspout/inspector-editors.d.ts.map +1 -0
- package/dist/downspout/inspector-editors.js +61 -0
- package/dist/downspout/parametrics.d.ts +4 -0
- package/dist/downspout/parametrics.d.ts.map +1 -0
- package/dist/downspout/parametrics.js +66 -0
- package/dist/downspout/preview.d.ts +19 -0
- package/dist/downspout/preview.d.ts.map +1 -0
- package/dist/downspout/preview.js +48 -0
- package/dist/downspout/renderer.d.ts +22 -0
- package/dist/downspout/renderer.d.ts.map +1 -0
- package/dist/downspout/renderer.js +153 -0
- package/dist/downspout/routing.d.ts +81 -0
- package/dist/downspout/routing.d.ts.map +1 -0
- package/dist/downspout/routing.js +131 -0
- package/dist/downspout/schema.d.ts +2 -0
- package/dist/downspout/schema.d.ts.map +1 -0
- package/dist/downspout/schema.js +3 -0
- package/dist/downspout/tool.d.ts +3 -0
- package/dist/downspout/tool.d.ts.map +1 -0
- package/dist/downspout/tool.js +148 -0
- package/dist/duct-fitting/definition.d.ts +12 -0
- package/dist/duct-fitting/definition.d.ts.map +1 -0
- package/dist/duct-fitting/definition.js +124 -0
- package/dist/duct-fitting/floorplan.d.ts +12 -0
- package/dist/duct-fitting/floorplan.d.ts.map +1 -0
- package/dist/duct-fitting/floorplan.js +59 -0
- package/dist/duct-fitting/geometry.d.ts +26 -0
- package/dist/duct-fitting/geometry.d.ts.map +1 -0
- package/dist/duct-fitting/geometry.js +341 -0
- package/dist/duct-fitting/index.d.ts +5 -0
- package/dist/duct-fitting/index.d.ts.map +1 -0
- package/dist/duct-fitting/index.js +4 -0
- package/dist/duct-fitting/inspector-editors.d.ts +6 -0
- package/dist/duct-fitting/inspector-editors.d.ts.map +1 -0
- package/dist/duct-fitting/inspector-editors.js +16 -0
- package/dist/duct-fitting/move-tool.d.ts +23 -0
- package/dist/duct-fitting/move-tool.d.ts.map +1 -0
- package/dist/duct-fitting/move-tool.js +302 -0
- package/dist/duct-fitting/parametrics.d.ts +4 -0
- package/dist/duct-fitting/parametrics.d.ts.map +1 -0
- package/dist/duct-fitting/parametrics.js +328 -0
- package/dist/duct-fitting/ports.d.ts +32 -0
- package/dist/duct-fitting/ports.d.ts.map +1 -0
- package/dist/duct-fitting/ports.js +140 -0
- package/dist/duct-fitting/schema.d.ts +2 -0
- package/dist/duct-fitting/schema.d.ts.map +1 -0
- package/dist/duct-fitting/schema.js +1 -0
- package/dist/duct-fitting/selection.d.ts +27 -0
- package/dist/duct-fitting/selection.d.ts.map +1 -0
- package/dist/duct-fitting/selection.js +677 -0
- package/dist/duct-fitting/tool.d.ts +18 -0
- package/dist/duct-fitting/tool.d.ts.map +1 -0
- package/dist/duct-fitting/tool.js +160 -0
- package/dist/duct-segment/definition.d.ts +4 -0
- package/dist/duct-segment/definition.d.ts.map +1 -0
- package/dist/duct-segment/definition.js +180 -0
- package/dist/duct-segment/floorplan.d.ts +12 -0
- package/dist/duct-segment/floorplan.d.ts.map +1 -0
- package/dist/duct-segment/floorplan.js +121 -0
- package/dist/duct-segment/geometry.d.ts +99 -0
- package/dist/duct-segment/geometry.d.ts.map +1 -0
- package/dist/duct-segment/geometry.js +368 -0
- package/dist/duct-segment/index.d.ts +4 -0
- package/dist/duct-segment/index.d.ts.map +1 -0
- package/dist/duct-segment/index.js +3 -0
- package/dist/duct-segment/move-tool.d.ts +22 -0
- package/dist/duct-segment/move-tool.d.ts.map +1 -0
- package/dist/duct-segment/move-tool.js +347 -0
- package/dist/duct-segment/parametrics.d.ts +4 -0
- package/dist/duct-segment/parametrics.d.ts.map +1 -0
- package/dist/duct-segment/parametrics.js +165 -0
- package/dist/duct-segment/schema.d.ts +2 -0
- package/dist/duct-segment/schema.d.ts.map +1 -0
- package/dist/duct-segment/schema.js +1 -0
- package/dist/duct-segment/selection.d.ts +34 -0
- package/dist/duct-segment/selection.d.ts.map +1 -0
- package/dist/duct-segment/selection.js +1395 -0
- package/dist/duct-segment/tool.d.ts +3 -0
- package/dist/duct-segment/tool.d.ts.map +1 -0
- package/dist/duct-segment/tool.js +924 -0
- package/dist/duct-terminal/definition.d.ts +13 -0
- package/dist/duct-terminal/definition.d.ts.map +1 -0
- package/dist/duct-terminal/definition.js +87 -0
- package/dist/duct-terminal/floorplan.d.ts +11 -0
- package/dist/duct-terminal/floorplan.d.ts.map +1 -0
- package/dist/duct-terminal/floorplan.js +61 -0
- package/dist/duct-terminal/geometry.d.ts +14 -0
- package/dist/duct-terminal/geometry.d.ts.map +1 -0
- package/dist/duct-terminal/geometry.js +78 -0
- package/dist/duct-terminal/index.d.ts +5 -0
- package/dist/duct-terminal/index.d.ts.map +1 -0
- package/dist/duct-terminal/index.js +4 -0
- package/dist/duct-terminal/parametrics.d.ts +4 -0
- package/dist/duct-terminal/parametrics.d.ts.map +1 -0
- package/dist/duct-terminal/parametrics.js +69 -0
- package/dist/duct-terminal/ports.d.ts +27 -0
- package/dist/duct-terminal/ports.d.ts.map +1 -0
- package/dist/duct-terminal/ports.js +60 -0
- package/dist/duct-terminal/schema.d.ts +2 -0
- package/dist/duct-terminal/schema.d.ts.map +1 -0
- package/dist/duct-terminal/schema.js +1 -0
- package/dist/duct-terminal/tool.d.ts +13 -0
- package/dist/duct-terminal/tool.d.ts.map +1 -0
- package/dist/duct-terminal/tool.js +360 -0
- package/dist/elevator/definition.d.ts +11 -0
- package/dist/elevator/definition.d.ts.map +1 -0
- package/dist/elevator/definition.js +255 -0
- package/dist/elevator/floorplan-affordances.d.ts +21 -0
- package/dist/elevator/floorplan-affordances.d.ts.map +1 -0
- package/dist/elevator/floorplan-affordances.js +94 -0
- package/dist/elevator/floorplan.d.ts +3 -0
- package/dist/elevator/floorplan.d.ts.map +1 -0
- package/dist/elevator/floorplan.js +360 -0
- package/dist/elevator/index.d.ts +2 -0
- package/dist/elevator/index.d.ts.map +1 -0
- package/dist/elevator/index.js +1 -0
- package/dist/elevator/paint.d.ts +2 -0
- package/dist/elevator/paint.d.ts.map +1 -0
- package/dist/elevator/paint.js +6 -0
- package/dist/elevator/panel.d.ts +2 -0
- package/dist/elevator/panel.d.ts.map +1 -0
- package/dist/elevator/panel.js +397 -0
- package/dist/elevator/parametrics.d.ts +3 -0
- package/dist/elevator/parametrics.d.ts.map +1 -0
- package/dist/elevator/parametrics.js +4 -0
- package/dist/elevator/renderer.d.ts +6 -0
- package/dist/elevator/renderer.d.ts.map +1 -0
- package/dist/elevator/renderer.js +583 -0
- package/dist/elevator/schema.d.ts +2 -0
- package/dist/elevator/schema.d.ts.map +1 -0
- package/dist/elevator/schema.js +1 -0
- package/dist/elevator/slots.d.ts +8 -0
- package/dist/elevator/slots.d.ts.map +1 -0
- package/dist/elevator/slots.js +17 -0
- package/dist/elevator/system.d.ts +8 -0
- package/dist/elevator/system.d.ts.map +1 -0
- package/dist/elevator/system.js +13 -0
- package/dist/eyebrow-vent/definition.d.ts +12 -0
- package/dist/eyebrow-vent/definition.d.ts.map +1 -0
- package/dist/eyebrow-vent/definition.js +150 -0
- package/dist/eyebrow-vent/floorplan.d.ts +9 -0
- package/dist/eyebrow-vent/floorplan.d.ts.map +1 -0
- package/dist/eyebrow-vent/floorplan.js +86 -0
- package/dist/eyebrow-vent/geometry.d.ts +25 -0
- package/dist/eyebrow-vent/geometry.d.ts.map +1 -0
- package/dist/eyebrow-vent/geometry.js +313 -0
- package/dist/eyebrow-vent/index.d.ts +4 -0
- package/dist/eyebrow-vent/index.d.ts.map +1 -0
- package/dist/eyebrow-vent/index.js +3 -0
- package/dist/eyebrow-vent/move-tool.d.ts +13 -0
- package/dist/eyebrow-vent/move-tool.d.ts.map +1 -0
- package/dist/eyebrow-vent/move-tool.js +207 -0
- package/dist/eyebrow-vent/panel.d.ts +7 -0
- package/dist/eyebrow-vent/panel.d.ts.map +1 -0
- package/dist/eyebrow-vent/panel.js +106 -0
- package/dist/eyebrow-vent/parametrics.d.ts +9 -0
- package/dist/eyebrow-vent/parametrics.d.ts.map +1 -0
- package/dist/eyebrow-vent/parametrics.js +31 -0
- package/dist/eyebrow-vent/preview.d.ts +13 -0
- package/dist/eyebrow-vent/preview.d.ts.map +1 -0
- package/dist/eyebrow-vent/preview.js +37 -0
- package/dist/eyebrow-vent/renderer.d.ts +12 -0
- package/dist/eyebrow-vent/renderer.d.ts.map +1 -0
- package/dist/eyebrow-vent/renderer.js +68 -0
- package/dist/eyebrow-vent/schema.d.ts +2 -0
- package/dist/eyebrow-vent/schema.d.ts.map +1 -0
- package/dist/eyebrow-vent/schema.js +3 -0
- package/dist/eyebrow-vent/tool.d.ts +9 -0
- package/dist/eyebrow-vent/tool.d.ts.map +1 -0
- package/dist/eyebrow-vent/tool.js +111 -0
- package/dist/fence/actions/move-endpoint.d.ts +32 -0
- package/dist/fence/actions/move-endpoint.d.ts.map +1 -0
- package/dist/fence/actions/move-endpoint.js +201 -0
- package/dist/fence/curve-tool.d.ts +17 -0
- package/dist/fence/curve-tool.d.ts.map +1 -0
- package/dist/fence/curve-tool.js +122 -0
- package/dist/fence/definition.d.ts +17 -0
- package/dist/fence/definition.d.ts.map +1 -0
- package/dist/fence/definition.js +281 -0
- package/dist/fence/floorplan-affordances.d.ts +31 -0
- package/dist/fence/floorplan-affordances.d.ts.map +1 -0
- package/dist/fence/floorplan-affordances.js +271 -0
- package/dist/fence/floorplan-move.d.ts +10 -0
- package/dist/fence/floorplan-move.d.ts.map +1 -0
- package/dist/fence/floorplan-move.js +162 -0
- package/dist/fence/floorplan.d.ts +4 -0
- package/dist/fence/floorplan.d.ts.map +1 -0
- package/dist/fence/floorplan.js +452 -0
- package/dist/fence/geometry.d.ts +6 -0
- package/dist/fence/geometry.d.ts.map +1 -0
- package/dist/fence/geometry.js +65 -0
- package/dist/fence/index.d.ts +3 -0
- package/dist/fence/index.d.ts.map +1 -0
- package/dist/fence/index.js +2 -0
- package/dist/fence/inspector-editors.d.ts +24 -0
- package/dist/fence/inspector-editors.d.ts.map +1 -0
- package/dist/fence/inspector-editors.js +43 -0
- package/dist/fence/move-control-point-tool.d.ts +9 -0
- package/dist/fence/move-control-point-tool.d.ts.map +1 -0
- package/dist/fence/move-control-point-tool.js +91 -0
- package/dist/fence/move-endpoint-tool.d.ts +27 -0
- package/dist/fence/move-endpoint-tool.d.ts.map +1 -0
- package/dist/fence/move-endpoint-tool.js +190 -0
- package/dist/fence/move-tangent-tool.d.ts +10 -0
- package/dist/fence/move-tangent-tool.d.ts.map +1 -0
- package/dist/fence/move-tangent-tool.js +88 -0
- package/dist/fence/move-tool.d.ts +6 -0
- package/dist/fence/move-tool.d.ts.map +1 -0
- package/dist/fence/move-tool.js +271 -0
- package/dist/fence/paint.d.ts +2 -0
- package/dist/fence/paint.d.ts.map +1 -0
- package/dist/fence/paint.js +17 -0
- package/dist/fence/parametrics.d.ts +16 -0
- package/dist/fence/parametrics.d.ts.map +1 -0
- package/dist/fence/parametrics.js +86 -0
- package/dist/fence/schema.d.ts +10 -0
- package/dist/fence/schema.d.ts.map +1 -0
- package/dist/fence/schema.js +9 -0
- package/dist/fence/slots.d.ts +10 -0
- package/dist/fence/slots.d.ts.map +1 -0
- package/dist/fence/slots.js +23 -0
- package/dist/fence/tool.d.ts +3 -0
- package/dist/fence/tool.d.ts.map +1 -0
- package/dist/fence/tool.js +563 -0
- package/dist/guide/definition.d.ts +10 -0
- package/dist/guide/definition.d.ts.map +1 -0
- package/dist/guide/definition.js +52 -0
- package/dist/guide/index.d.ts +2 -0
- package/dist/guide/index.d.ts.map +1 -0
- package/dist/guide/index.js +1 -0
- package/dist/guide/parametrics.d.ts +3 -0
- package/dist/guide/parametrics.d.ts.map +1 -0
- package/dist/guide/parametrics.js +3 -0
- package/dist/guide/renderer.d.ts +6 -0
- package/dist/guide/renderer.d.ts.map +1 -0
- package/dist/guide/renderer.js +52 -0
- package/dist/guide/schema.d.ts +2 -0
- package/dist/guide/schema.d.ts.map +1 -0
- package/dist/guide/schema.js +1 -0
- package/dist/guide/system.d.ts +3 -0
- package/dist/guide/system.d.ts.map +1 -0
- package/dist/guide/system.js +3 -0
- package/dist/gutter/corner-mitre.d.ts +88 -0
- package/dist/gutter/corner-mitre.d.ts.map +1 -0
- package/dist/gutter/corner-mitre.js +176 -0
- package/dist/gutter/definition.d.ts +19 -0
- package/dist/gutter/definition.d.ts.map +1 -0
- package/dist/gutter/definition.js +164 -0
- package/dist/gutter/downspouts-panel.d.ts +8 -0
- package/dist/gutter/downspouts-panel.d.ts.map +1 -0
- package/dist/gutter/downspouts-panel.js +111 -0
- package/dist/gutter/eave-align.d.ts +33 -0
- package/dist/gutter/eave-align.d.ts.map +1 -0
- package/dist/gutter/eave-align.js +50 -0
- package/dist/gutter/eave-snap.d.ts +45 -0
- package/dist/gutter/eave-snap.d.ts.map +1 -0
- package/dist/gutter/eave-snap.js +128 -0
- package/dist/gutter/floorplan.d.ts +18 -0
- package/dist/gutter/floorplan.d.ts.map +1 -0
- package/dist/gutter/floorplan.js +274 -0
- package/dist/gutter/geometry.d.ts +39 -0
- package/dist/gutter/geometry.d.ts.map +1 -0
- package/dist/gutter/geometry.js +532 -0
- package/dist/gutter/index.d.ts +4 -0
- package/dist/gutter/index.d.ts.map +1 -0
- package/dist/gutter/index.js +3 -0
- package/dist/gutter/length-snap.d.ts +16 -0
- package/dist/gutter/length-snap.d.ts.map +1 -0
- package/dist/gutter/length-snap.js +177 -0
- package/dist/gutter/move-tool.d.ts +21 -0
- package/dist/gutter/move-tool.d.ts.map +1 -0
- package/dist/gutter/move-tool.js +223 -0
- package/dist/gutter/outlet-lookup.d.ts +43 -0
- package/dist/gutter/outlet-lookup.d.ts.map +1 -0
- package/dist/gutter/outlet-lookup.js +50 -0
- package/dist/gutter/parametrics.d.ts +4 -0
- package/dist/gutter/parametrics.d.ts.map +1 -0
- package/dist/gutter/parametrics.js +62 -0
- package/dist/gutter/preview.d.ts +22 -0
- package/dist/gutter/preview.d.ts.map +1 -0
- package/dist/gutter/preview.js +57 -0
- package/dist/gutter/profile-geometry.d.ts +44 -0
- package/dist/gutter/profile-geometry.d.ts.map +1 -0
- package/dist/gutter/profile-geometry.js +56 -0
- package/dist/gutter/renderer.d.ts +22 -0
- package/dist/gutter/renderer.d.ts.map +1 -0
- package/dist/gutter/renderer.js +202 -0
- package/dist/gutter/schema.d.ts +2 -0
- package/dist/gutter/schema.d.ts.map +1 -0
- package/dist/gutter/schema.js +3 -0
- package/dist/gutter/tool.d.ts +25 -0
- package/dist/gutter/tool.d.ts.map +1 -0
- package/dist/gutter/tool.js +124 -0
- package/dist/hvac-equipment/definition.d.ts +13 -0
- package/dist/hvac-equipment/definition.d.ts.map +1 -0
- package/dist/hvac-equipment/definition.js +92 -0
- package/dist/hvac-equipment/floorplan.d.ts +10 -0
- package/dist/hvac-equipment/floorplan.d.ts.map +1 -0
- package/dist/hvac-equipment/floorplan.js +71 -0
- package/dist/hvac-equipment/geometry.d.ts +20 -0
- package/dist/hvac-equipment/geometry.d.ts.map +1 -0
- package/dist/hvac-equipment/geometry.js +701 -0
- package/dist/hvac-equipment/index.d.ts +5 -0
- package/dist/hvac-equipment/index.d.ts.map +1 -0
- package/dist/hvac-equipment/index.js +4 -0
- package/dist/hvac-equipment/parametrics.d.ts +4 -0
- package/dist/hvac-equipment/parametrics.d.ts.map +1 -0
- package/dist/hvac-equipment/parametrics.js +101 -0
- package/dist/hvac-equipment/ports.d.ts +36 -0
- package/dist/hvac-equipment/ports.d.ts.map +1 -0
- package/dist/hvac-equipment/ports.js +91 -0
- package/dist/hvac-equipment/schema.d.ts +2 -0
- package/dist/hvac-equipment/schema.d.ts.map +1 -0
- package/dist/hvac-equipment/schema.js +1 -0
- package/dist/hvac-equipment/tool.d.ts +11 -0
- package/dist/hvac-equipment/tool.d.ts.map +1 -0
- package/dist/hvac-equipment/tool.js +103 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +158 -0
- package/dist/item/definition.d.ts +32 -0
- package/dist/item/definition.d.ts.map +1 -0
- package/dist/item/definition.js +309 -0
- package/dist/item/floorplan-move.d.ts +3 -0
- package/dist/item/floorplan-move.d.ts.map +1 -0
- package/dist/item/floorplan-move.js +307 -0
- package/dist/item/floorplan.d.ts +3 -0
- package/dist/item/floorplan.d.ts.map +1 -0
- package/dist/item/floorplan.js +204 -0
- package/dist/item/index.d.ts +3 -0
- package/dist/item/index.d.ts.map +1 -0
- package/dist/item/index.js +2 -0
- package/dist/item/model-loader.d.ts +18 -0
- package/dist/item/model-loader.d.ts.map +1 -0
- package/dist/item/model-loader.js +131 -0
- package/dist/item/move-tool.d.ts +6 -0
- package/dist/item/move-tool.d.ts.map +1 -0
- package/dist/item/move-tool.js +150 -0
- package/dist/item/paint.d.ts +3 -0
- package/dist/item/paint.d.ts.map +1 -0
- package/dist/item/paint.js +214 -0
- package/dist/item/panel.d.ts +16 -0
- package/dist/item/panel.d.ts.map +1 -0
- package/dist/item/panel.js +103 -0
- package/dist/item/parametrics.d.ts +12 -0
- package/dist/item/parametrics.d.ts.map +1 -0
- package/dist/item/parametrics.js +12 -0
- package/dist/item/renderer.d.ts +6 -0
- package/dist/item/renderer.d.ts.map +1 -0
- package/dist/item/renderer.js +425 -0
- package/dist/item/schema.d.ts +2 -0
- package/dist/item/schema.d.ts.map +1 -0
- package/dist/item/schema.js +1 -0
- package/dist/item/system.d.ts +11 -0
- package/dist/item/system.d.ts.map +1 -0
- package/dist/item/system.js +15 -0
- package/dist/item/tool.d.ts +3 -0
- package/dist/item/tool.d.ts.map +1 -0
- package/dist/item/tool.js +46 -0
- package/dist/level/definition.d.ts +9 -0
- package/dist/level/definition.d.ts.map +1 -0
- package/dist/level/definition.js +55 -0
- package/dist/level/index.d.ts +2 -0
- package/dist/level/index.d.ts.map +1 -0
- package/dist/level/index.js +1 -0
- package/dist/level/parametrics.d.ts +3 -0
- package/dist/level/parametrics.d.ts.map +1 -0
- package/dist/level/parametrics.js +3 -0
- package/dist/level/renderer.d.ts +6 -0
- package/dist/level/renderer.d.ts.map +1 -0
- package/dist/level/renderer.js +12 -0
- package/dist/level/schema.d.ts +2 -0
- package/dist/level/schema.d.ts.map +1 -0
- package/dist/level/schema.js +1 -0
- package/dist/level/system.d.ts +3 -0
- package/dist/level/system.d.ts.map +1 -0
- package/dist/level/system.js +3 -0
- package/dist/lineset/definition.d.ts +15 -0
- package/dist/lineset/definition.d.ts.map +1 -0
- package/dist/lineset/definition.js +118 -0
- package/dist/lineset/floorplan.d.ts +10 -0
- package/dist/lineset/floorplan.d.ts.map +1 -0
- package/dist/lineset/floorplan.js +78 -0
- package/dist/lineset/geometry.d.ts +20 -0
- package/dist/lineset/geometry.d.ts.map +1 -0
- package/dist/lineset/geometry.js +87 -0
- package/dist/lineset/index.d.ts +4 -0
- package/dist/lineset/index.d.ts.map +1 -0
- package/dist/lineset/index.js +3 -0
- package/dist/lineset/move-tool.d.ts +27 -0
- package/dist/lineset/move-tool.d.ts.map +1 -0
- package/dist/lineset/move-tool.js +256 -0
- package/dist/lineset/parametrics.d.ts +4 -0
- package/dist/lineset/parametrics.d.ts.map +1 -0
- package/dist/lineset/parametrics.js +34 -0
- package/dist/lineset/schema.d.ts +2 -0
- package/dist/lineset/schema.d.ts.map +1 -0
- package/dist/lineset/schema.js +1 -0
- package/dist/lineset/selection.d.ts +3 -0
- package/dist/lineset/selection.d.ts.map +1 -0
- package/dist/lineset/selection.js +3 -0
- package/dist/lineset/tool.d.ts +3 -0
- package/dist/lineset/tool.d.ts.map +1 -0
- package/dist/lineset/tool.js +298 -0
- package/dist/liquid-line/definition.d.ts +16 -0
- package/dist/liquid-line/definition.d.ts.map +1 -0
- package/dist/liquid-line/definition.js +110 -0
- package/dist/liquid-line/floorplan.d.ts +10 -0
- package/dist/liquid-line/floorplan.d.ts.map +1 -0
- package/dist/liquid-line/floorplan.js +66 -0
- package/dist/liquid-line/geometry.d.ts +16 -0
- package/dist/liquid-line/geometry.d.ts.map +1 -0
- package/dist/liquid-line/geometry.js +57 -0
- package/dist/liquid-line/index.d.ts +5 -0
- package/dist/liquid-line/index.d.ts.map +1 -0
- package/dist/liquid-line/index.js +4 -0
- package/dist/liquid-line/move-tool.d.ts +23 -0
- package/dist/liquid-line/move-tool.d.ts.map +1 -0
- package/dist/liquid-line/move-tool.js +231 -0
- package/dist/liquid-line/options.d.ts +16 -0
- package/dist/liquid-line/options.d.ts.map +1 -0
- package/dist/liquid-line/options.js +6 -0
- package/dist/liquid-line/parametrics.d.ts +4 -0
- package/dist/liquid-line/parametrics.d.ts.map +1 -0
- package/dist/liquid-line/parametrics.js +17 -0
- package/dist/liquid-line/schema.d.ts +2 -0
- package/dist/liquid-line/schema.d.ts.map +1 -0
- package/dist/liquid-line/schema.js +1 -0
- package/dist/liquid-line/selection.d.ts +3 -0
- package/dist/liquid-line/selection.d.ts.map +1 -0
- package/dist/liquid-line/selection.js +3 -0
- package/dist/liquid-line/tool.d.ts +3 -0
- package/dist/liquid-line/tool.d.ts.map +1 -0
- package/dist/liquid-line/tool.js +517 -0
- package/dist/measurement/definition.d.ts +4 -0
- package/dist/measurement/definition.d.ts.map +1 -0
- package/dist/measurement/definition.js +61 -0
- package/dist/measurement/edit.d.ts +9 -0
- package/dist/measurement/edit.d.ts.map +1 -0
- package/dist/measurement/edit.js +97 -0
- package/dist/measurement/floorplan-affordance.d.ts +3 -0
- package/dist/measurement/floorplan-affordance.d.ts.map +1 -0
- package/dist/measurement/floorplan-affordance.js +90 -0
- package/dist/measurement/floorplan.d.ts +3 -0
- package/dist/measurement/floorplan.d.ts.map +1 -0
- package/dist/measurement/floorplan.js +195 -0
- package/dist/measurement/index.d.ts +3 -0
- package/dist/measurement/index.d.ts.map +1 -0
- package/dist/measurement/index.js +2 -0
- package/dist/measurement/renderer.d.ts +8 -0
- package/dist/measurement/renderer.d.ts.map +1 -0
- package/dist/measurement/renderer.js +285 -0
- package/dist/measurement/resolve.d.ts +42 -0
- package/dist/measurement/resolve.d.ts.map +1 -0
- package/dist/measurement/resolve.js +207 -0
- package/dist/measurement/schema.d.ts +2 -0
- package/dist/measurement/schema.d.ts.map +1 -0
- package/dist/measurement/schema.js +1 -0
- package/dist/measurement/selection.d.ts +3 -0
- package/dist/measurement/selection.d.ts.map +1 -0
- package/dist/measurement/selection.js +259 -0
- package/dist/measurement/smart-surface.d.ts +4 -0
- package/dist/measurement/smart-surface.d.ts.map +1 -0
- package/dist/measurement/smart-surface.js +21 -0
- package/dist/measurement/smart-tool.d.ts +3 -0
- package/dist/measurement/smart-tool.d.ts.map +1 -0
- package/dist/measurement/smart-tool.js +264 -0
- package/dist/measurement/surface-query.d.ts +90 -0
- package/dist/measurement/surface-query.d.ts.map +1 -0
- package/dist/measurement/surface-query.js +519 -0
- package/dist/measurement/tool-router.d.ts +2 -0
- package/dist/measurement/tool-router.d.ts.map +1 -0
- package/dist/measurement/tool-router.js +9 -0
- package/dist/measurement/tool.d.ts +62 -0
- package/dist/measurement/tool.d.ts.map +1 -0
- package/dist/measurement/tool.js +1342 -0
- package/dist/pipe-fitting/definition.d.ts +10 -0
- package/dist/pipe-fitting/definition.d.ts.map +1 -0
- package/dist/pipe-fitting/definition.js +91 -0
- package/dist/pipe-fitting/floorplan.d.ts +10 -0
- package/dist/pipe-fitting/floorplan.d.ts.map +1 -0
- package/dist/pipe-fitting/floorplan.js +50 -0
- package/dist/pipe-fitting/geometry.d.ts +11 -0
- package/dist/pipe-fitting/geometry.d.ts.map +1 -0
- package/dist/pipe-fitting/geometry.js +31 -0
- package/dist/pipe-fitting/index.d.ts +5 -0
- package/dist/pipe-fitting/index.d.ts.map +1 -0
- package/dist/pipe-fitting/index.js +4 -0
- package/dist/pipe-fitting/move-tool.d.ts +30 -0
- package/dist/pipe-fitting/move-tool.d.ts.map +1 -0
- package/dist/pipe-fitting/move-tool.js +312 -0
- package/dist/pipe-fitting/parametrics.d.ts +4 -0
- package/dist/pipe-fitting/parametrics.d.ts.map +1 -0
- package/dist/pipe-fitting/parametrics.js +105 -0
- package/dist/pipe-fitting/ports.d.ts +26 -0
- package/dist/pipe-fitting/ports.d.ts.map +1 -0
- package/dist/pipe-fitting/ports.js +93 -0
- package/dist/pipe-fitting/schema.d.ts +2 -0
- package/dist/pipe-fitting/schema.d.ts.map +1 -0
- package/dist/pipe-fitting/schema.js +1 -0
- package/dist/pipe-fitting/selection.d.ts +3 -0
- package/dist/pipe-fitting/selection.d.ts.map +1 -0
- package/dist/pipe-fitting/selection.js +579 -0
- package/dist/pipe-fitting/tool.d.ts +19 -0
- package/dist/pipe-fitting/tool.d.ts.map +1 -0
- package/dist/pipe-fitting/tool.js +162 -0
- package/dist/pipe-segment/definition.d.ts +14 -0
- package/dist/pipe-segment/definition.d.ts.map +1 -0
- package/dist/pipe-segment/definition.js +116 -0
- package/dist/pipe-segment/floorplan.d.ts +9 -0
- package/dist/pipe-segment/floorplan.d.ts.map +1 -0
- package/dist/pipe-segment/floorplan.js +87 -0
- package/dist/pipe-segment/geometry.d.ts +16 -0
- package/dist/pipe-segment/geometry.d.ts.map +1 -0
- package/dist/pipe-segment/geometry.js +54 -0
- package/dist/pipe-segment/index.d.ts +4 -0
- package/dist/pipe-segment/index.d.ts.map +1 -0
- package/dist/pipe-segment/index.js +3 -0
- package/dist/pipe-segment/move-tool.d.ts +25 -0
- package/dist/pipe-segment/move-tool.d.ts.map +1 -0
- package/dist/pipe-segment/move-tool.js +254 -0
- package/dist/pipe-segment/parametrics.d.ts +4 -0
- package/dist/pipe-segment/parametrics.d.ts.map +1 -0
- package/dist/pipe-segment/parametrics.js +33 -0
- package/dist/pipe-segment/schema.d.ts +2 -0
- package/dist/pipe-segment/schema.d.ts.map +1 -0
- package/dist/pipe-segment/schema.js +1 -0
- package/dist/pipe-segment/selection.d.ts +31 -0
- package/dist/pipe-segment/selection.d.ts.map +1 -0
- package/dist/pipe-segment/selection.js +841 -0
- package/dist/pipe-segment/tool.d.ts +3 -0
- package/dist/pipe-segment/tool.d.ts.map +1 -0
- package/dist/pipe-segment/tool.js +595 -0
- package/dist/pipe-trap/definition.d.ts +10 -0
- package/dist/pipe-trap/definition.d.ts.map +1 -0
- package/dist/pipe-trap/definition.js +59 -0
- package/dist/pipe-trap/floorplan.d.ts +10 -0
- package/dist/pipe-trap/floorplan.d.ts.map +1 -0
- package/dist/pipe-trap/floorplan.js +41 -0
- package/dist/pipe-trap/geometry.d.ts +16 -0
- package/dist/pipe-trap/geometry.d.ts.map +1 -0
- package/dist/pipe-trap/geometry.js +74 -0
- package/dist/pipe-trap/index.d.ts +5 -0
- package/dist/pipe-trap/index.d.ts.map +1 -0
- package/dist/pipe-trap/index.js +4 -0
- package/dist/pipe-trap/parametrics.d.ts +4 -0
- package/dist/pipe-trap/parametrics.d.ts.map +1 -0
- package/dist/pipe-trap/parametrics.js +16 -0
- package/dist/pipe-trap/ports.d.ts +11 -0
- package/dist/pipe-trap/ports.d.ts.map +1 -0
- package/dist/pipe-trap/ports.js +32 -0
- package/dist/pipe-trap/schema.d.ts +2 -0
- package/dist/pipe-trap/schema.d.ts.map +1 -0
- package/dist/pipe-trap/schema.js +1 -0
- package/dist/pipe-trap/tool.d.ts +9 -0
- package/dist/pipe-trap/tool.d.ts.map +1 -0
- package/dist/pipe-trap/tool.js +99 -0
- package/dist/ridge-vent/definition.d.ts +16 -0
- package/dist/ridge-vent/definition.d.ts.map +1 -0
- package/dist/ridge-vent/definition.js +195 -0
- package/dist/ridge-vent/floorplan.d.ts +15 -0
- package/dist/ridge-vent/floorplan.d.ts.map +1 -0
- package/dist/ridge-vent/floorplan.js +121 -0
- package/dist/ridge-vent/geometry.d.ts +22 -0
- package/dist/ridge-vent/geometry.d.ts.map +1 -0
- package/dist/ridge-vent/geometry.js +526 -0
- package/dist/ridge-vent/index.d.ts +4 -0
- package/dist/ridge-vent/index.d.ts.map +1 -0
- package/dist/ridge-vent/index.js +3 -0
- package/dist/ridge-vent/move-tool.d.ts +12 -0
- package/dist/ridge-vent/move-tool.d.ts.map +1 -0
- package/dist/ridge-vent/move-tool.js +210 -0
- package/dist/ridge-vent/panel.d.ts +7 -0
- package/dist/ridge-vent/panel.d.ts.map +1 -0
- package/dist/ridge-vent/panel.js +118 -0
- package/dist/ridge-vent/parametrics.d.ts +4 -0
- package/dist/ridge-vent/parametrics.d.ts.map +1 -0
- package/dist/ridge-vent/parametrics.js +28 -0
- package/dist/ridge-vent/preview.d.ts +7 -0
- package/dist/ridge-vent/preview.d.ts.map +1 -0
- package/dist/ridge-vent/preview.js +31 -0
- package/dist/ridge-vent/renderer.d.ts +20 -0
- package/dist/ridge-vent/renderer.d.ts.map +1 -0
- package/dist/ridge-vent/renderer.js +205 -0
- package/dist/ridge-vent/schema.d.ts +2 -0
- package/dist/ridge-vent/schema.d.ts.map +1 -0
- package/dist/ridge-vent/schema.js +2 -0
- package/dist/ridge-vent/tool.d.ts +8 -0
- package/dist/ridge-vent/tool.d.ts.map +1 -0
- package/dist/ridge-vent/tool.js +130 -0
- package/dist/roof/definition.d.ts +16 -0
- package/dist/roof/definition.d.ts.map +1 -0
- package/dist/roof/definition.js +170 -0
- package/dist/roof/floorplan.d.ts +21 -0
- package/dist/roof/floorplan.d.ts.map +1 -0
- package/dist/roof/floorplan.js +271 -0
- package/dist/roof/index.d.ts +3 -0
- package/dist/roof/index.d.ts.map +1 -0
- package/dist/roof/index.js +2 -0
- package/dist/roof/panel.d.ts +2 -0
- package/dist/roof/panel.d.ts.map +1 -0
- package/dist/roof/panel.js +214 -0
- package/dist/roof/parametrics.d.ts +3 -0
- package/dist/roof/parametrics.d.ts.map +1 -0
- package/dist/roof/parametrics.js +4 -0
- package/dist/roof/renderer.d.ts +6 -0
- package/dist/roof/renderer.d.ts.map +1 -0
- package/dist/roof/renderer.js +79 -0
- package/dist/roof/roof-materials.d.ts +5 -0
- package/dist/roof/roof-materials.d.ts.map +1 -0
- package/dist/roof/roof-materials.js +43 -0
- package/dist/roof/schema.d.ts +2 -0
- package/dist/roof/schema.d.ts.map +1 -0
- package/dist/roof/schema.js +1 -0
- package/dist/roof/system.d.ts +3 -0
- package/dist/roof/system.d.ts.map +1 -0
- package/dist/roof/system.js +3 -0
- package/dist/roof-segment/definition.d.ts +10 -0
- package/dist/roof-segment/definition.d.ts.map +1 -0
- package/dist/roof-segment/definition.js +305 -0
- package/dist/roof-segment/floorplan-affordances.d.ts +31 -0
- package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -0
- package/dist/roof-segment/floorplan-affordances.js +170 -0
- package/dist/roof-segment/floorplan.d.ts +41 -0
- package/dist/roof-segment/floorplan.d.ts.map +1 -0
- package/dist/roof-segment/floorplan.js +265 -0
- package/dist/roof-segment/index.d.ts +2 -0
- package/dist/roof-segment/index.d.ts.map +1 -0
- package/dist/roof-segment/index.js +1 -0
- package/dist/roof-segment/measurement.d.ts +4 -0
- package/dist/roof-segment/measurement.d.ts.map +1 -0
- package/dist/roof-segment/measurement.js +64 -0
- package/dist/roof-segment/panel.d.ts +2 -0
- package/dist/roof-segment/panel.d.ts.map +1 -0
- package/dist/roof-segment/panel.js +180 -0
- package/dist/roof-segment/parametrics.d.ts +3 -0
- package/dist/roof-segment/parametrics.d.ts.map +1 -0
- package/dist/roof-segment/parametrics.js +4 -0
- package/dist/roof-segment/renderer.d.ts +6 -0
- package/dist/roof-segment/renderer.d.ts.map +1 -0
- package/dist/roof-segment/renderer.js +93 -0
- package/dist/roof-segment/schema.d.ts +2 -0
- package/dist/roof-segment/schema.d.ts.map +1 -0
- package/dist/roof-segment/schema.js +1 -0
- package/dist/scan/definition.d.ts +9 -0
- package/dist/scan/definition.d.ts.map +1 -0
- package/dist/scan/definition.js +49 -0
- package/dist/scan/index.d.ts +2 -0
- package/dist/scan/index.d.ts.map +1 -0
- package/dist/scan/index.js +1 -0
- package/dist/scan/parametrics.d.ts +3 -0
- package/dist/scan/parametrics.d.ts.map +1 -0
- package/dist/scan/parametrics.js +3 -0
- package/dist/scan/renderer.d.ts +6 -0
- package/dist/scan/renderer.d.ts.map +1 -0
- package/dist/scan/renderer.js +54 -0
- package/dist/scan/schema.d.ts +2 -0
- package/dist/scan/schema.d.ts.map +1 -0
- package/dist/scan/schema.js +1 -0
- package/dist/scan/system.d.ts +3 -0
- package/dist/scan/system.d.ts.map +1 -0
- package/dist/scan/system.js +3 -0
- package/dist/shared/auto-fitting.d.ts +253 -0
- package/dist/shared/auto-fitting.d.ts.map +1 -0
- package/dist/shared/auto-fitting.js +659 -0
- package/dist/shared/auto-offset-tag.d.ts +67 -0
- package/dist/shared/auto-offset-tag.d.ts.map +1 -0
- package/dist/shared/auto-offset-tag.js +94 -0
- package/dist/shared/draw-alignment.d.ts +25 -0
- package/dist/shared/draw-alignment.d.ts.map +1 -0
- package/dist/shared/draw-alignment.js +30 -0
- package/dist/shared/duct-body-paint.d.ts +6 -0
- package/dist/shared/duct-body-paint.d.ts.map +1 -0
- package/dist/shared/duct-body-paint.js +13 -0
- package/dist/shared/fitting-endpoint-reaim.d.ts +72 -0
- package/dist/shared/fitting-endpoint-reaim.d.ts.map +1 -0
- package/dist/shared/fitting-endpoint-reaim.js +123 -0
- package/dist/shared/fitting-rotation.d.ts +21 -0
- package/dist/shared/fitting-rotation.d.ts.map +1 -0
- package/dist/shared/fitting-rotation.js +39 -0
- package/dist/shared/floor-placement.d.ts +25 -0
- package/dist/shared/floor-placement.d.ts.map +1 -0
- package/dist/shared/floor-placement.js +109 -0
- package/dist/shared/floorplan-cursor.d.ts +11 -0
- package/dist/shared/floorplan-cursor.d.ts.map +1 -0
- package/dist/shared/floorplan-cursor.js +17 -0
- package/dist/shared/ghost-alignment.d.ts +31 -0
- package/dist/shared/ghost-alignment.d.ts.map +1 -0
- package/dist/shared/ghost-alignment.js +29 -0
- package/dist/shared/ghost-materials.d.ts +29 -0
- package/dist/shared/ghost-materials.d.ts.map +1 -0
- package/dist/shared/ghost-materials.js +81 -0
- package/dist/shared/level-offset-group.d.ts +18 -0
- package/dist/shared/level-offset-group.d.ts.map +1 -0
- package/dist/shared/level-offset-group.js +31 -0
- package/dist/shared/mep-ghost.d.ts +37 -0
- package/dist/shared/mep-ghost.d.ts.map +1 -0
- package/dist/shared/mep-ghost.js +83 -0
- package/dist/shared/move-roof-tool.d.ts +6 -0
- package/dist/shared/move-roof-tool.d.ts.map +1 -0
- package/dist/shared/move-roof-tool.js +420 -0
- package/dist/shared/opening-guides-runtime.d.ts +70 -0
- package/dist/shared/opening-guides-runtime.d.ts.map +1 -0
- package/dist/shared/opening-guides-runtime.js +182 -0
- package/dist/shared/opening-placement-dimensions.d.ts +19 -0
- package/dist/shared/opening-placement-dimensions.d.ts.map +1 -0
- package/dist/shared/opening-placement-dimensions.js +152 -0
- package/dist/shared/path-offset.d.ts +10 -0
- package/dist/shared/path-offset.d.ts.map +1 -0
- package/dist/shared/path-offset.js +74 -0
- package/dist/shared/path-point-affordance.d.ts +34 -0
- package/dist/shared/path-point-affordance.d.ts.map +1 -0
- package/dist/shared/path-point-affordance.js +97 -0
- package/dist/shared/path-segment-affordance.d.ts +33 -0
- package/dist/shared/path-segment-affordance.d.ts.map +1 -0
- package/dist/shared/path-segment-affordance.js +77 -0
- package/dist/shared/pipe-run-translation-offset.d.ts +27 -0
- package/dist/shared/pipe-run-translation-offset.d.ts.map +1 -0
- package/dist/shared/pipe-run-translation-offset.js +131 -0
- package/dist/shared/pipe-vertical-offset.d.ts +98 -0
- package/dist/shared/pipe-vertical-offset.d.ts.map +1 -0
- package/dist/shared/pipe-vertical-offset.js +836 -0
- package/dist/shared/placeholder-geometry.d.ts +22 -0
- package/dist/shared/placeholder-geometry.d.ts.map +1 -0
- package/dist/shared/placeholder-geometry.js +31 -0
- package/dist/shared/polygon-centroid-move.d.ts +21 -0
- package/dist/shared/polygon-centroid-move.d.ts.map +1 -0
- package/dist/shared/polygon-centroid-move.js +117 -0
- package/dist/shared/polygon-measurement.d.ts +10 -0
- package/dist/shared/polygon-measurement.d.ts.map +1 -0
- package/dist/shared/polygon-measurement.js +35 -0
- package/dist/shared/polygon-vertex-affordance.d.ts +108 -0
- package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -0
- package/dist/shared/polygon-vertex-affordance.js +325 -0
- package/dist/shared/ports.d.ts +75 -0
- package/dist/shared/ports.d.ts.map +1 -0
- package/dist/shared/ports.js +164 -0
- package/dist/shared/quick-measurement.d.ts +8 -0
- package/dist/shared/quick-measurement.d.ts.map +1 -0
- package/dist/shared/quick-measurement.js +15 -0
- package/dist/shared/refrigerant-line-selection.d.ts +4 -0
- package/dist/shared/refrigerant-line-selection.d.ts.map +1 -0
- package/dist/shared/refrigerant-line-selection.js +405 -0
- package/dist/shared/relative-roof-drag.d.ts +18 -0
- package/dist/shared/relative-roof-drag.d.ts.map +1 -0
- package/dist/shared/relative-roof-drag.js +83 -0
- package/dist/shared/ridge-snap.d.ts +31 -0
- package/dist/shared/ridge-snap.d.ts.map +1 -0
- package/dist/shared/ridge-snap.js +61 -0
- package/dist/shared/roof-attachment-fallback-preview.d.ts +14 -0
- package/dist/shared/roof-attachment-fallback-preview.d.ts.map +1 -0
- package/dist/shared/roof-attachment-fallback-preview.js +84 -0
- package/dist/shared/roof-face-host.d.ts +17 -0
- package/dist/shared/roof-face-host.d.ts.map +1 -0
- package/dist/shared/roof-face-host.js +24 -0
- package/dist/shared/roof-opening-host.d.ts +66 -0
- package/dist/shared/roof-opening-host.d.ts.map +1 -0
- package/dist/shared/roof-opening-host.js +98 -0
- package/dist/shared/roof-segment-hit.d.ts +34 -0
- package/dist/shared/roof-segment-hit.d.ts.map +1 -0
- package/dist/shared/roof-segment-hit.js +72 -0
- package/dist/shared/roof-surface-placement-guides.d.ts +68 -0
- package/dist/shared/roof-surface-placement-guides.d.ts.map +1 -0
- package/dist/shared/roof-surface-placement-guides.js +716 -0
- package/dist/shared/roof-surface.d.ts +20 -0
- package/dist/shared/roof-surface.d.ts.map +1 -0
- package/dist/shared/roof-surface.js +467 -0
- package/dist/shared/roof-wall-opening-cut.d.ts +16 -0
- package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -0
- package/dist/shared/roof-wall-opening-cut.js +52 -0
- package/dist/shared/roof-wall-opening-placement.d.ts +53 -0
- package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -0
- package/dist/shared/roof-wall-opening-placement.js +58 -0
- package/dist/shared/rotate-affordance.d.ts +16 -0
- package/dist/shared/rotate-affordance.d.ts.map +1 -0
- package/dist/shared/rotate-affordance.js +20 -0
- package/dist/shared/run-move-connectivity.d.ts +52 -0
- package/dist/shared/run-move-connectivity.d.ts.map +1 -0
- package/dist/shared/run-move-connectivity.js +82 -0
- package/dist/shared/run-translation-offset.d.ts +24 -0
- package/dist/shared/run-translation-offset.d.ts.map +1 -0
- package/dist/shared/run-translation-offset.js +140 -0
- package/dist/shared/selection-handles.d.ts +51 -0
- package/dist/shared/selection-handles.d.ts.map +1 -0
- package/dist/shared/selection-handles.js +74 -0
- package/dist/shared/slot-paint.d.ts +46 -0
- package/dist/shared/slot-paint.d.ts.map +1 -0
- package/dist/shared/slot-paint.js +235 -0
- package/dist/shared/surface-paint.d.ts +3 -0
- package/dist/shared/surface-paint.d.ts.map +1 -0
- package/dist/shared/surface-paint.js +41 -0
- package/dist/shared/use-segment-trim-clip.d.ts +44 -0
- package/dist/shared/use-segment-trim-clip.d.ts.map +1 -0
- package/dist/shared/use-segment-trim-clip.js +149 -0
- package/dist/shared/vertical-offset.d.ts +95 -0
- package/dist/shared/vertical-offset.d.ts.map +1 -0
- package/dist/shared/vertical-offset.js +851 -0
- package/dist/shared/wall-attach-target.d.ts +109 -0
- package/dist/shared/wall-attach-target.d.ts.map +1 -0
- package/dist/shared/wall-attach-target.js +192 -0
- package/dist/shared/wall-opening-alignment.d.ts +34 -0
- package/dist/shared/wall-opening-alignment.d.ts.map +1 -0
- package/dist/shared/wall-opening-alignment.js +113 -0
- package/dist/shelf/definition.d.ts +4 -0
- package/dist/shelf/definition.d.ts.map +1 -0
- package/dist/shelf/definition.js +265 -0
- package/dist/shelf/dimensions.d.ts +3 -0
- package/dist/shelf/dimensions.d.ts.map +1 -0
- package/dist/shelf/dimensions.js +15 -0
- package/dist/shelf/floorplan-affordances.d.ts +26 -0
- package/dist/shelf/floorplan-affordances.d.ts.map +1 -0
- package/dist/shelf/floorplan-affordances.js +88 -0
- package/dist/shelf/floorplan-move.d.ts +25 -0
- package/dist/shelf/floorplan-move.d.ts.map +1 -0
- package/dist/shelf/floorplan-move.js +90 -0
- package/dist/shelf/floorplan.d.ts +20 -0
- package/dist/shelf/floorplan.d.ts.map +1 -0
- package/dist/shelf/floorplan.js +124 -0
- package/dist/shelf/geometry.d.ts +15 -0
- package/dist/shelf/geometry.d.ts.map +1 -0
- package/dist/shelf/geometry.js +304 -0
- package/dist/shelf/index.d.ts +4 -0
- package/dist/shelf/index.d.ts.map +1 -0
- package/dist/shelf/index.js +3 -0
- package/dist/shelf/paint.d.ts +3 -0
- package/dist/shelf/paint.d.ts.map +1 -0
- package/dist/shelf/paint.js +181 -0
- package/dist/shelf/parametrics.d.ts +14 -0
- package/dist/shelf/parametrics.d.ts.map +1 -0
- package/dist/shelf/parametrics.js +81 -0
- package/dist/shelf/preview.d.ts +31 -0
- package/dist/shelf/preview.d.ts.map +1 -0
- package/dist/shelf/preview.js +77 -0
- package/dist/shelf/schema.d.ts +2 -0
- package/dist/shelf/schema.d.ts.map +1 -0
- package/dist/shelf/schema.js +6 -0
- package/dist/shelf/slots.d.ts +9 -0
- package/dist/shelf/slots.d.ts.map +1 -0
- package/dist/shelf/slots.js +30 -0
- package/dist/shelf/tool.d.ts +3 -0
- package/dist/shelf/tool.d.ts.map +1 -0
- package/dist/shelf/tool.js +125 -0
- package/dist/site/definition.d.ts +10 -0
- package/dist/site/definition.d.ts.map +1 -0
- package/dist/site/definition.js +54 -0
- package/dist/site/index.d.ts +2 -0
- package/dist/site/index.d.ts.map +1 -0
- package/dist/site/index.js +1 -0
- package/dist/site/parametrics.d.ts +3 -0
- package/dist/site/parametrics.d.ts.map +1 -0
- package/dist/site/parametrics.js +3 -0
- package/dist/site/recessed-slab-ground-holes.d.ts +3 -0
- package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -0
- package/dist/site/recessed-slab-ground-holes.js +46 -0
- package/dist/site/renderer.d.ts +6 -0
- package/dist/site/renderer.d.ts.map +1 -0
- package/dist/site/renderer.js +196 -0
- package/dist/site/schema.d.ts +2 -0
- package/dist/site/schema.d.ts.map +1 -0
- package/dist/site/schema.js +1 -0
- package/dist/skylight/definition.d.ts +10 -0
- package/dist/skylight/definition.d.ts.map +1 -0
- package/dist/skylight/definition.js +268 -0
- package/dist/skylight/floorplan.d.ts +16 -0
- package/dist/skylight/floorplan.d.ts.map +1 -0
- package/dist/skylight/floorplan.js +129 -0
- package/dist/skylight/frame-csg.d.ts +4 -0
- package/dist/skylight/frame-csg.d.ts.map +1 -0
- package/dist/skylight/frame-csg.js +49 -0
- package/dist/skylight/geometry.d.ts +7 -0
- package/dist/skylight/geometry.d.ts.map +1 -0
- package/dist/skylight/geometry.js +114 -0
- package/dist/skylight/index.d.ts +5 -0
- package/dist/skylight/index.d.ts.map +1 -0
- package/dist/skylight/index.js +4 -0
- package/dist/skylight/interaction.d.ts +11 -0
- package/dist/skylight/interaction.d.ts.map +1 -0
- package/dist/skylight/interaction.js +42 -0
- package/dist/skylight/move-tool.d.ts +5 -0
- package/dist/skylight/move-tool.d.ts.map +1 -0
- package/dist/skylight/move-tool.js +233 -0
- package/dist/skylight/panel.d.ts +2 -0
- package/dist/skylight/panel.d.ts.map +1 -0
- package/dist/skylight/panel.js +253 -0
- package/dist/skylight/parametrics.d.ts +4 -0
- package/dist/skylight/parametrics.d.ts.map +1 -0
- package/dist/skylight/parametrics.js +99 -0
- package/dist/skylight/preview.d.ts +7 -0
- package/dist/skylight/preview.d.ts.map +1 -0
- package/dist/skylight/preview.js +49 -0
- package/dist/skylight/renderer.d.ts +6 -0
- package/dist/skylight/renderer.d.ts.map +1 -0
- package/dist/skylight/renderer.js +303 -0
- package/dist/skylight/roof-cut.d.ts +21 -0
- package/dist/skylight/roof-cut.d.ts.map +1 -0
- package/dist/skylight/roof-cut.js +61 -0
- package/dist/skylight/schema.d.ts +2 -0
- package/dist/skylight/schema.d.ts.map +1 -0
- package/dist/skylight/schema.js +1 -0
- package/dist/skylight/system.d.ts +3 -0
- package/dist/skylight/system.d.ts.map +1 -0
- package/dist/skylight/system.js +49 -0
- package/dist/skylight/tool.d.ts +3 -0
- package/dist/skylight/tool.d.ts.map +1 -0
- package/dist/skylight/tool.js +100 -0
- package/dist/slab/boundary-editor.d.ts +24 -0
- package/dist/slab/boundary-editor.d.ts.map +1 -0
- package/dist/slab/boundary-editor.js +127 -0
- package/dist/slab/definition.d.ts +20 -0
- package/dist/slab/definition.d.ts.map +1 -0
- package/dist/slab/definition.js +218 -0
- package/dist/slab/floorplan-affordances.d.ts +177 -0
- package/dist/slab/floorplan-affordances.d.ts.map +1 -0
- package/dist/slab/floorplan-affordances.js +52 -0
- package/dist/slab/floorplan-move.d.ts +12 -0
- package/dist/slab/floorplan-move.d.ts.map +1 -0
- package/dist/slab/floorplan-move.js +19 -0
- package/dist/slab/floorplan.d.ts +20 -0
- package/dist/slab/floorplan.d.ts.map +1 -0
- package/dist/slab/floorplan.js +144 -0
- package/dist/slab/geometry.d.ts +5 -0
- package/dist/slab/geometry.d.ts.map +1 -0
- package/dist/slab/geometry.js +133 -0
- package/dist/slab/hole-editor.d.ts +14 -0
- package/dist/slab/hole-editor.d.ts.map +1 -0
- package/dist/slab/hole-editor.js +54 -0
- package/dist/slab/index.d.ts +3 -0
- package/dist/slab/index.d.ts.map +1 -0
- package/dist/slab/index.js +2 -0
- package/dist/slab/move-tool.d.ts +6 -0
- package/dist/slab/move-tool.d.ts.map +1 -0
- package/dist/slab/move-tool.js +232 -0
- package/dist/slab/paint.d.ts +8 -0
- package/dist/slab/paint.d.ts.map +1 -0
- package/dist/slab/paint.js +26 -0
- package/dist/slab/panel.d.ts +14 -0
- package/dist/slab/panel.d.ts.map +1 -0
- package/dist/slab/panel.js +144 -0
- package/dist/slab/parametrics.d.ts +14 -0
- package/dist/slab/parametrics.d.ts.map +1 -0
- package/dist/slab/parametrics.js +19 -0
- package/dist/slab/quick-measurement.d.ts +3 -0
- package/dist/slab/quick-measurement.d.ts.map +1 -0
- package/dist/slab/quick-measurement.js +35 -0
- package/dist/slab/schema.d.ts +2 -0
- package/dist/slab/schema.d.ts.map +1 -0
- package/dist/slab/schema.js +1 -0
- package/dist/slab/slots.d.ts +10 -0
- package/dist/slab/slots.d.ts.map +1 -0
- package/dist/slab/slots.js +20 -0
- package/dist/slab/system.d.ts +3 -0
- package/dist/slab/system.d.ts.map +1 -0
- package/dist/slab/system.js +63 -0
- package/dist/slab/tool.d.ts +3 -0
- package/dist/slab/tool.d.ts.map +1 -0
- package/dist/slab/tool.js +204 -0
- package/dist/solar-panel/definition.d.ts +15 -0
- package/dist/solar-panel/definition.d.ts.map +1 -0
- package/dist/solar-panel/definition.js +260 -0
- package/dist/solar-panel/floorplan.d.ts +21 -0
- package/dist/solar-panel/floorplan.d.ts.map +1 -0
- package/dist/solar-panel/floorplan.js +120 -0
- package/dist/solar-panel/geometry.d.ts +29 -0
- package/dist/solar-panel/geometry.d.ts.map +1 -0
- package/dist/solar-panel/geometry.js +196 -0
- package/dist/solar-panel/index.d.ts +5 -0
- package/dist/solar-panel/index.d.ts.map +1 -0
- package/dist/solar-panel/index.js +4 -0
- package/dist/solar-panel/move-tool.d.ts +5 -0
- package/dist/solar-panel/move-tool.d.ts.map +1 -0
- package/dist/solar-panel/move-tool.js +257 -0
- package/dist/solar-panel/panel.d.ts +2 -0
- package/dist/solar-panel/panel.d.ts.map +1 -0
- package/dist/solar-panel/panel.js +146 -0
- package/dist/solar-panel/parametrics.d.ts +4 -0
- package/dist/solar-panel/parametrics.d.ts.map +1 -0
- package/dist/solar-panel/parametrics.js +52 -0
- package/dist/solar-panel/preview.d.ts +7 -0
- package/dist/solar-panel/preview.d.ts.map +1 -0
- package/dist/solar-panel/preview.js +46 -0
- package/dist/solar-panel/renderer.d.ts +26 -0
- package/dist/solar-panel/renderer.d.ts.map +1 -0
- package/dist/solar-panel/renderer.js +162 -0
- package/dist/solar-panel/schema.d.ts +2 -0
- package/dist/solar-panel/schema.d.ts.map +1 -0
- package/dist/solar-panel/schema.js +1 -0
- package/dist/solar-panel/tool.d.ts +11 -0
- package/dist/solar-panel/tool.d.ts.map +1 -0
- package/dist/solar-panel/tool.js +120 -0
- package/dist/spawn/definition.d.ts +4 -0
- package/dist/spawn/definition.d.ts.map +1 -0
- package/dist/spawn/definition.js +107 -0
- package/dist/spawn/floorplan-affordances.d.ts +3 -0
- package/dist/spawn/floorplan-affordances.d.ts.map +1 -0
- package/dist/spawn/floorplan-affordances.js +31 -0
- package/dist/spawn/floorplan-move.d.ts +3 -0
- package/dist/spawn/floorplan-move.d.ts.map +1 -0
- package/dist/spawn/floorplan-move.js +31 -0
- package/dist/spawn/floorplan.d.ts +14 -0
- package/dist/spawn/floorplan.d.ts.map +1 -0
- package/dist/spawn/floorplan.js +135 -0
- package/dist/spawn/index.d.ts +3 -0
- package/dist/spawn/index.d.ts.map +1 -0
- package/dist/spawn/index.js +2 -0
- package/dist/spawn/panel.d.ts +2 -0
- package/dist/spawn/panel.d.ts.map +1 -0
- package/dist/spawn/panel.js +71 -0
- package/dist/spawn/parametrics.d.ts +8 -0
- package/dist/spawn/parametrics.d.ts.map +1 -0
- package/dist/spawn/parametrics.js +23 -0
- package/dist/spawn/renderer.d.ts +16 -0
- package/dist/spawn/renderer.d.ts.map +1 -0
- package/dist/spawn/renderer.js +47 -0
- package/dist/spawn/schema.d.ts +2 -0
- package/dist/spawn/schema.d.ts.map +1 -0
- package/dist/spawn/schema.js +5 -0
- package/dist/spawn/tool.d.ts +10 -0
- package/dist/spawn/tool.d.ts.map +1 -0
- package/dist/spawn/tool.js +109 -0
- package/dist/stair/definition.d.ts +9 -0
- package/dist/stair/definition.d.ts.map +1 -0
- package/dist/stair/definition.js +440 -0
- package/dist/stair/floor-stack.d.ts +10 -0
- package/dist/stair/floor-stack.d.ts.map +1 -0
- package/dist/stair/floor-stack.js +77 -0
- package/dist/stair/floorplan-affordances.d.ts +53 -0
- package/dist/stair/floorplan-affordances.d.ts.map +1 -0
- package/dist/stair/floorplan-affordances.js +266 -0
- package/dist/stair/floorplan-move.d.ts +17 -0
- package/dist/stair/floorplan-move.d.ts.map +1 -0
- package/dist/stair/floorplan-move.js +64 -0
- package/dist/stair/floorplan.d.ts +26 -0
- package/dist/stair/floorplan.d.ts.map +1 -0
- package/dist/stair/floorplan.js +455 -0
- package/dist/stair/index.d.ts +2 -0
- package/dist/stair/index.d.ts.map +1 -0
- package/dist/stair/index.js +1 -0
- package/dist/stair/paint.d.ts +2 -0
- package/dist/stair/paint.d.ts.map +1 -0
- package/dist/stair/paint.js +86 -0
- package/dist/stair/panel.d.ts +2 -0
- package/dist/stair/panel.d.ts.map +1 -0
- package/dist/stair/panel.js +196 -0
- package/dist/stair/parametrics.d.ts +3 -0
- package/dist/stair/parametrics.d.ts.map +1 -0
- package/dist/stair/parametrics.js +4 -0
- package/dist/stair/renderer.d.ts +6 -0
- package/dist/stair/renderer.d.ts.map +1 -0
- package/dist/stair/renderer.js +667 -0
- package/dist/stair/schema.d.ts +2 -0
- package/dist/stair/schema.d.ts.map +1 -0
- package/dist/stair/schema.js +1 -0
- package/dist/stair/slots.d.ts +7 -0
- package/dist/stair/slots.d.ts.map +1 -0
- package/dist/stair/slots.js +13 -0
- package/dist/stair/system.d.ts +3 -0
- package/dist/stair/system.d.ts.map +1 -0
- package/dist/stair/system.js +3 -0
- package/dist/stair-segment/definition.d.ts +8 -0
- package/dist/stair-segment/definition.d.ts.map +1 -0
- package/dist/stair-segment/definition.js +133 -0
- package/dist/stair-segment/index.d.ts +2 -0
- package/dist/stair-segment/index.d.ts.map +1 -0
- package/dist/stair-segment/index.js +1 -0
- package/dist/stair-segment/panel.d.ts +2 -0
- package/dist/stair-segment/panel.d.ts.map +1 -0
- package/dist/stair-segment/panel.js +126 -0
- package/dist/stair-segment/parametrics.d.ts +3 -0
- package/dist/stair-segment/parametrics.d.ts.map +1 -0
- package/dist/stair-segment/parametrics.js +4 -0
- package/dist/stair-segment/renderer.d.ts +6 -0
- package/dist/stair-segment/renderer.d.ts.map +1 -0
- package/dist/stair-segment/renderer.js +55 -0
- package/dist/stair-segment/schema.d.ts +2 -0
- package/dist/stair-segment/schema.d.ts.map +1 -0
- package/dist/stair-segment/schema.js +1 -0
- package/dist/turbine-vent/definition.d.ts +24 -0
- package/dist/turbine-vent/definition.d.ts.map +1 -0
- package/dist/turbine-vent/definition.js +119 -0
- package/dist/turbine-vent/floorplan.d.ts +13 -0
- package/dist/turbine-vent/floorplan.d.ts.map +1 -0
- package/dist/turbine-vent/floorplan.js +111 -0
- package/dist/turbine-vent/geometry.d.ts +6 -0
- package/dist/turbine-vent/geometry.d.ts.map +1 -0
- package/dist/turbine-vent/geometry.js +284 -0
- package/dist/turbine-vent/index.d.ts +4 -0
- package/dist/turbine-vent/index.d.ts.map +1 -0
- package/dist/turbine-vent/index.js +3 -0
- package/dist/turbine-vent/move-tool.d.ts +13 -0
- package/dist/turbine-vent/move-tool.d.ts.map +1 -0
- package/dist/turbine-vent/move-tool.js +207 -0
- package/dist/turbine-vent/panel.d.ts +8 -0
- package/dist/turbine-vent/panel.d.ts.map +1 -0
- package/dist/turbine-vent/panel.js +127 -0
- package/dist/turbine-vent/parametrics.d.ts +9 -0
- package/dist/turbine-vent/parametrics.d.ts.map +1 -0
- package/dist/turbine-vent/parametrics.js +34 -0
- package/dist/turbine-vent/preview.d.ts +14 -0
- package/dist/turbine-vent/preview.d.ts.map +1 -0
- package/dist/turbine-vent/preview.js +38 -0
- package/dist/turbine-vent/renderer.d.ts +18 -0
- package/dist/turbine-vent/renderer.d.ts.map +1 -0
- package/dist/turbine-vent/renderer.js +107 -0
- package/dist/turbine-vent/schema.d.ts +2 -0
- package/dist/turbine-vent/schema.d.ts.map +1 -0
- package/dist/turbine-vent/schema.js +3 -0
- package/dist/turbine-vent/tool.d.ts +9 -0
- package/dist/turbine-vent/tool.d.ts.map +1 -0
- package/dist/turbine-vent/tool.js +111 -0
- package/dist/wall/curve-tool.d.ts +14 -0
- package/dist/wall/curve-tool.d.ts.map +1 -0
- package/dist/wall/curve-tool.js +123 -0
- package/dist/wall/definition.d.ts +19 -0
- package/dist/wall/definition.d.ts.map +1 -0
- package/dist/wall/definition.js +132 -0
- package/dist/wall/floorplan-affordances.d.ts +13 -0
- package/dist/wall/floorplan-affordances.d.ts.map +1 -0
- package/dist/wall/floorplan-affordances.js +241 -0
- package/dist/wall/floorplan-move.d.ts +32 -0
- package/dist/wall/floorplan-move.d.ts.map +1 -0
- package/dist/wall/floorplan-move.js +259 -0
- package/dist/wall/floorplan-overrides.d.ts +22 -0
- package/dist/wall/floorplan-overrides.d.ts.map +1 -0
- package/dist/wall/floorplan-overrides.js +32 -0
- package/dist/wall/floorplan.d.ts +23 -0
- package/dist/wall/floorplan.d.ts.map +1 -0
- package/dist/wall/floorplan.js +249 -0
- package/dist/wall/index.d.ts +3 -0
- package/dist/wall/index.d.ts.map +1 -0
- package/dist/wall/index.js +2 -0
- package/dist/wall/measurement.d.ts +5 -0
- package/dist/wall/measurement.d.ts.map +1 -0
- package/dist/wall/measurement.js +174 -0
- package/dist/wall/move-endpoint-tool.d.ts +22 -0
- package/dist/wall/move-endpoint-tool.d.ts.map +1 -0
- package/dist/wall/move-endpoint-tool.js +450 -0
- package/dist/wall/move-shared.d.ts +48 -0
- package/dist/wall/move-shared.d.ts.map +1 -0
- package/dist/wall/move-shared.js +162 -0
- package/dist/wall/move-tool.d.ts +6 -0
- package/dist/wall/move-tool.d.ts.map +1 -0
- package/dist/wall/move-tool.js +523 -0
- package/dist/wall/paint.d.ts +33 -0
- package/dist/wall/paint.d.ts.map +1 -0
- package/dist/wall/paint.js +176 -0
- package/dist/wall/panel.d.ts +2 -0
- package/dist/wall/panel.d.ts.map +1 -0
- package/dist/wall/panel.js +198 -0
- package/dist/wall/parametrics.d.ts +16 -0
- package/dist/wall/parametrics.d.ts.map +1 -0
- package/dist/wall/parametrics.js +30 -0
- package/dist/wall/quick-measurement.d.ts +3 -0
- package/dist/wall/quick-measurement.d.ts.map +1 -0
- package/dist/wall/quick-measurement.js +30 -0
- package/dist/wall/renderer.d.ts +25 -0
- package/dist/wall/renderer.d.ts.map +1 -0
- package/dist/wall/renderer.js +65 -0
- package/dist/wall/schema.d.ts +12 -0
- package/dist/wall/schema.d.ts.map +1 -0
- package/dist/wall/schema.js +10 -0
- package/dist/wall/slots.d.ts +10 -0
- package/dist/wall/slots.d.ts.map +1 -0
- package/dist/wall/slots.js +84 -0
- package/dist/wall/system.d.ts +14 -0
- package/dist/wall/system.d.ts.map +1 -0
- package/dist/wall/system.js +18 -0
- package/dist/wall/tool.d.ts +3 -0
- package/dist/wall/tool.d.ts.map +1 -0
- package/dist/wall/tool.js +628 -0
- package/dist/wall/treatments.d.ts +26 -0
- package/dist/wall/treatments.d.ts.map +1 -0
- package/dist/wall/treatments.js +503 -0
- package/dist/window/definition.d.ts +15 -0
- package/dist/window/definition.d.ts.map +1 -0
- package/dist/window/definition.js +237 -0
- package/dist/window/floor-projection.d.ts +9 -0
- package/dist/window/floor-projection.d.ts.map +1 -0
- package/dist/window/floor-projection.js +84 -0
- package/dist/window/floorplan-affordances.d.ts +22 -0
- package/dist/window/floorplan-affordances.d.ts.map +1 -0
- package/dist/window/floorplan-affordances.js +82 -0
- package/dist/window/floorplan-move.d.ts +14 -0
- package/dist/window/floorplan-move.d.ts.map +1 -0
- package/dist/window/floorplan-move.js +223 -0
- package/dist/window/floorplan.d.ts +16 -0
- package/dist/window/floorplan.d.ts.map +1 -0
- package/dist/window/floorplan.js +151 -0
- package/dist/window/index.d.ts +3 -0
- package/dist/window/index.d.ts.map +1 -0
- package/dist/window/index.js +2 -0
- package/dist/window/move-tool.d.ts +18 -0
- package/dist/window/move-tool.d.ts.map +1 -0
- package/dist/window/move-tool.js +914 -0
- package/dist/window/paint.d.ts +8 -0
- package/dist/window/paint.d.ts.map +1 -0
- package/dist/window/paint.js +11 -0
- package/dist/window/panel.d.ts +2 -0
- package/dist/window/panel.d.ts.map +1 -0
- package/dist/window/panel.js +384 -0
- package/dist/window/parametrics.d.ts +11 -0
- package/dist/window/parametrics.d.ts.map +1 -0
- package/dist/window/parametrics.js +22 -0
- package/dist/window/preview.d.ts +18 -0
- package/dist/window/preview.d.ts.map +1 -0
- package/dist/window/preview.js +36 -0
- package/dist/window/renderer.d.ts +6 -0
- package/dist/window/renderer.d.ts.map +1 -0
- package/dist/window/renderer.js +37 -0
- package/dist/window/schema.d.ts +2 -0
- package/dist/window/schema.d.ts.map +1 -0
- package/dist/window/schema.js +1 -0
- package/dist/window/slots.d.ts +5 -0
- package/dist/window/slots.d.ts.map +1 -0
- package/dist/window/slots.js +11 -0
- package/dist/window/system.d.ts +12 -0
- package/dist/window/system.d.ts.map +1 -0
- package/dist/window/system.js +16 -0
- package/dist/window/tool.d.ts +13 -0
- package/dist/window/tool.d.ts.map +1 -0
- package/dist/window/tool.js +580 -0
- package/dist/window/window-math.d.ts +31 -0
- package/dist/window/window-math.d.ts.map +1 -0
- package/dist/window/window-math.js +41 -0
- package/dist/zone/definition.d.ts +10 -0
- package/dist/zone/definition.d.ts.map +1 -0
- package/dist/zone/definition.js +80 -0
- package/dist/zone/floorplan-affordances.d.ts +81 -0
- package/dist/zone/floorplan-affordances.d.ts.map +1 -0
- package/dist/zone/floorplan-affordances.js +19 -0
- package/dist/zone/floorplan-move.d.ts +13 -0
- package/dist/zone/floorplan-move.d.ts.map +1 -0
- package/dist/zone/floorplan-move.js +17 -0
- package/dist/zone/floorplan.d.ts +13 -0
- package/dist/zone/floorplan.d.ts.map +1 -0
- package/dist/zone/floorplan.js +147 -0
- package/dist/zone/index.d.ts +2 -0
- package/dist/zone/index.d.ts.map +1 -0
- package/dist/zone/index.js +1 -0
- package/dist/zone/parametrics.d.ts +3 -0
- package/dist/zone/parametrics.d.ts.map +1 -0
- package/dist/zone/parametrics.js +4 -0
- package/dist/zone/quantities-panel.d.ts +2 -0
- package/dist/zone/quantities-panel.d.ts.map +1 -0
- package/dist/zone/quantities-panel.js +83 -0
- package/dist/zone/quick-measurement.d.ts +3 -0
- package/dist/zone/quick-measurement.d.ts.map +1 -0
- package/dist/zone/quick-measurement.js +29 -0
- package/dist/zone/renderer.d.ts +6 -0
- package/dist/zone/renderer.d.ts.map +1 -0
- package/dist/zone/renderer.js +205 -0
- package/dist/zone/schema.d.ts +2 -0
- package/dist/zone/schema.d.ts.map +1 -0
- package/dist/zone/schema.js +1 -0
- package/dist/zone/system.d.ts +3 -0
- package/dist/zone/system.d.ts.map +1 -0
- package/dist/zone/system.js +3 -0
- package/package.json +61 -0
|
@@ -0,0 +1,1395 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
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';
|
|
5
|
+
import { useViewer } from '@pascal-app/viewer';
|
|
6
|
+
import { Html } from '@react-three/drei';
|
|
7
|
+
import { createPortal, useFrame, useThree } from '@react-three/fiber';
|
|
8
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
9
|
+
import { Euler, Matrix4, Plane, Quaternion, Raycaster, Vector2, Vector3, } from 'three';
|
|
10
|
+
import { newAutoOffsetGroupId, readAutoOffsetTag, translateAutoOffsetBase, withAutoOffsetTag, withoutAutoOffsetTag, } from '../shared/auto-offset-tag';
|
|
11
|
+
import { detectFittingEndpoint, planFittingEndpointReaim, } from '../shared/fitting-endpoint-reaim';
|
|
12
|
+
import { DuctSegmentGhost, FittingGhost } from '../shared/mep-ghost';
|
|
13
|
+
import { collectScenePorts, DUCT_PORT_SYSTEMS, findNearestPortXZ } from '../shared/ports';
|
|
14
|
+
import { planRunTranslationOffsets } from '../shared/run-translation-offset';
|
|
15
|
+
import { HandleCube, MoveChevron, RotateArc } from '../shared/selection-handles';
|
|
16
|
+
import { planVerticalOffsets } from '../shared/vertical-offset';
|
|
17
|
+
import { INCHES_TO_METERS } from './geometry';
|
|
18
|
+
/** Port-snap radius for dragged run endpoints (meters, XZ). */
|
|
19
|
+
const PORT_SNAP_RADIUS_M = 0.4;
|
|
20
|
+
// In-world arrow handle layout (meters) — the arrows stand off the run body so
|
|
21
|
+
// they clear thick trunks.
|
|
22
|
+
const CORNER_ARROW_GAP = 0.18;
|
|
23
|
+
const CORNER_ARROW_MIN_OFFSET = 0.24;
|
|
24
|
+
/** Roll snap increment — 45°, matching the fitting rotate step. Shift bypasses. */
|
|
25
|
+
const ROLL_STEP_RAD = Math.PI / 4;
|
|
26
|
+
const UP = new Vector3(0, 1, 0);
|
|
27
|
+
function collectPortsFromNodes(nodes, filter = {}) {
|
|
28
|
+
const { excludeNodeId, systems } = filter;
|
|
29
|
+
const result = [];
|
|
30
|
+
for (const node of Object.values(nodes)) {
|
|
31
|
+
if (!node || node.id === excludeNodeId)
|
|
32
|
+
continue;
|
|
33
|
+
const ports = nodeRegistry.get(node.type)?.ports?.(node);
|
|
34
|
+
if (!ports)
|
|
35
|
+
continue;
|
|
36
|
+
for (const port of ports) {
|
|
37
|
+
if (systems && port.system !== undefined && !systems.includes(port.system))
|
|
38
|
+
continue;
|
|
39
|
+
result.push({ ...port, nodeId: node.id });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
function snap(value, step) {
|
|
45
|
+
if (step <= 0)
|
|
46
|
+
return value;
|
|
47
|
+
return Math.round(value / step) * step;
|
|
48
|
+
}
|
|
49
|
+
/** Half the run's cross-section (meters) — the arrow stand-off radius. */
|
|
50
|
+
function runRadiusM(duct) {
|
|
51
|
+
if (duct.shape === 'round')
|
|
52
|
+
return (duct.diameter * INCHES_TO_METERS) / 2;
|
|
53
|
+
return (Math.max(duct.width, duct.height) * INCHES_TO_METERS) / 2;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Selection-time editing for committed duct runs: each path point shows a
|
|
57
|
+
* cluster of directional arrows instead of a free-drag handle — four XZ
|
|
58
|
+
* chevrons (±X / ±Z) plus an up / down vertical pair.
|
|
59
|
+
*
|
|
60
|
+
* Handles are PORTALED into the duct's registered scene group so they
|
|
61
|
+
* share its exact frame — path coords are node-local, and the level /
|
|
62
|
+
* building transform above the group applies to the handles for free.
|
|
63
|
+
* Drag raycasts run in world space and convert hits back into the
|
|
64
|
+
* group's local frame before writing the path.
|
|
65
|
+
*
|
|
66
|
+
* Drag model: the along-run arrow lengthens / shortens the run (locked to the
|
|
67
|
+
* run axis). The across-run (side) and up / down arrows instead SWING the
|
|
68
|
+
* grabbed endpoint around its neighbour at a fixed radius — the run pivots like
|
|
69
|
+
* a compass arm, keeping its length, rather than stretching. Dragged run
|
|
70
|
+
* endpoints still snap onto nearby typed ports (along-run drag) so a loose run
|
|
71
|
+
* can be mated onto a fitting after the fact, and when the dragged endpoint
|
|
72
|
+
* belongs to a straight run whose OTHER end sits on an elbow collar, the elbow
|
|
73
|
+
* re-aims to follow the drag (junction + far collar fixed, bend angle adapts).
|
|
74
|
+
*
|
|
75
|
+
* Modifiers (mirroring the wall corner drag):
|
|
76
|
+
* - **Alt** detaches: the joint breaks for this drag — the elbow does NOT
|
|
77
|
+
* re-aim and mated fittings / runs do NOT follow; the endpoint moves on its
|
|
78
|
+
* own (port re-mate still allowed so it can be reattached elsewhere).
|
|
79
|
+
* - **Shift** bypasses grid snapping for a perfectly smooth precision drag.
|
|
80
|
+
*
|
|
81
|
+
* History does the single-undo dance: paused during the drag (the live
|
|
82
|
+
* `updateNode` ticks are untracked), then on release the path is
|
|
83
|
+
* reverted, history resumed, and the final path applied as one tracked
|
|
84
|
+
* change.
|
|
85
|
+
*/
|
|
86
|
+
const DuctSegmentSelectionAffordance = () => {
|
|
87
|
+
const selectedIds = useViewer((s) => s.selection.selectedIds);
|
|
88
|
+
const duct = useScene((s) => {
|
|
89
|
+
if (selectedIds.length !== 1)
|
|
90
|
+
return null;
|
|
91
|
+
const node = s.nodes[selectedIds[0]];
|
|
92
|
+
return node?.type === 'duct-segment' ? node : null;
|
|
93
|
+
});
|
|
94
|
+
// Portal target: the duct's registered group. Resolved with a rAF
|
|
95
|
+
// retry because registration happens on the renderer's mount, which
|
|
96
|
+
// can land a frame after selection.
|
|
97
|
+
const ductId = duct?.id ?? null;
|
|
98
|
+
const [target, setTarget] = useState(null);
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (!ductId) {
|
|
101
|
+
setTarget(null);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
let frameId = 0;
|
|
105
|
+
const resolve = () => {
|
|
106
|
+
const next = sceneRegistry.nodes.get(ductId) ?? null;
|
|
107
|
+
setTarget((cur) => (cur === next ? cur : next));
|
|
108
|
+
if (!next)
|
|
109
|
+
frameId = window.requestAnimationFrame(resolve);
|
|
110
|
+
};
|
|
111
|
+
resolve();
|
|
112
|
+
return () => window.cancelAnimationFrame(frameId);
|
|
113
|
+
}, [ductId]);
|
|
114
|
+
if (!duct || !target)
|
|
115
|
+
return null;
|
|
116
|
+
// Mount the handles in the duct group's PARENT (a sibling of the duct
|
|
117
|
+
// mesh), NOT inside the duct group itself. The selection outliner
|
|
118
|
+
// (`MergedOutlineNode`) traces every descendant mesh of the SELECTED node,
|
|
119
|
+
// so a hit-area cylinder parented under the duct would get swept into the
|
|
120
|
+
// duct's selection outline — the stray circle around the arrows. Walls /
|
|
121
|
+
// doors / windows dodge this the same way: their handle rig rides the
|
|
122
|
+
// parent, never the selected node. `DuctPointHandles` re-creates the duct
|
|
123
|
+
// group's own pose on an outer group so placements stay node-local.
|
|
124
|
+
const mount = target.parent ?? target;
|
|
125
|
+
return createPortal(_jsx(DuctPointHandles, { duct: duct, target: target }), mount, undefined);
|
|
126
|
+
};
|
|
127
|
+
const DuctPointHandles = ({ duct, target }) => {
|
|
128
|
+
const { camera, gl } = useThree();
|
|
129
|
+
// Outer group mirrors the duct group's local pose so handles placed in
|
|
130
|
+
// node-local path coords land exactly where the duct mesh sits, even though
|
|
131
|
+
// they're mounted in the parent (to stay out of the duct's selection
|
|
132
|
+
// outline). Mirrors the wall arrow rig's ride-group.
|
|
133
|
+
const outerRef = useRef(null);
|
|
134
|
+
useFrame(() => {
|
|
135
|
+
const outer = outerRef.current;
|
|
136
|
+
if (!outer)
|
|
137
|
+
return;
|
|
138
|
+
outer.position.copy(target.position);
|
|
139
|
+
outer.quaternion.copy(target.quaternion);
|
|
140
|
+
outer.scale.copy(target.scale);
|
|
141
|
+
});
|
|
142
|
+
const unit = useViewer((s) => s.unit);
|
|
143
|
+
const [draggingIndex, setDraggingIndex] = useState(null);
|
|
144
|
+
const [rolling, setRolling] = useState(false);
|
|
145
|
+
const [runMoving, setRunMoving] = useState(false);
|
|
146
|
+
// Auto-routed offset preview shown while the run-center cube's ±Y arrows
|
|
147
|
+
// lift / lower a connected run. Two flavours:
|
|
148
|
+
// - `valid` (green): the elbows + plumb riser the release will mint are
|
|
149
|
+
// ghosted while the run lifts + trims live; release commits them.
|
|
150
|
+
// - `invalid` (red): no clean offset fits at this height. ONLY the dragged
|
|
151
|
+
// run lifts (as a red preview); every partner is frozen and the release
|
|
152
|
+
// snaps back, committing nothing. The fittings/risers arrays are empty
|
|
153
|
+
// here — there's nothing buildable to ghost, the run body carries the cue.
|
|
154
|
+
// Null when the move is a plain translate (open ends, or no connections).
|
|
155
|
+
const [verticalGhost, setVerticalGhost] = useState(null);
|
|
156
|
+
const [openCluster, setOpenCluster] = useState(null);
|
|
157
|
+
const toggleCluster = (key) => setOpenCluster((cur) => (cur === key ? null : key));
|
|
158
|
+
// Set while a drag is live; null otherwise. Holds everything the window
|
|
159
|
+
// pointer handlers need so they never read stale React state.
|
|
160
|
+
const dragRef = useRef(null);
|
|
161
|
+
const makeRay = (clientX, clientY) => {
|
|
162
|
+
const rect = gl.domElement.getBoundingClientRect();
|
|
163
|
+
const ndc = new Vector2(((clientX - rect.left) / rect.width) * 2 - 1, -((clientY - rect.top) / rect.height) * 2 + 1);
|
|
164
|
+
const raycaster = new Raycaster();
|
|
165
|
+
raycaster.setFromCamera(ndc, camera);
|
|
166
|
+
return raycaster.ray;
|
|
167
|
+
};
|
|
168
|
+
const intersect = (clientX, clientY, plane) => {
|
|
169
|
+
const hit = new Vector3();
|
|
170
|
+
return makeRay(clientX, clientY).intersectPlane(plane, hit) ? hit : null;
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Local-frame Y where the cursor ray meets a vertical plane through
|
|
174
|
+
* `anchorWorld` that faces the camera — drives the up / down vertical drag.
|
|
175
|
+
* Null when the ray is parallel to the plane.
|
|
176
|
+
*/
|
|
177
|
+
const intersectVerticalY = (clientX, clientY, anchorWorld) => {
|
|
178
|
+
// Plane normal: camera forward flattened onto the horizontal plane, so
|
|
179
|
+
// the plane stands upright through the point and faces the viewer.
|
|
180
|
+
const forward = camera.getWorldDirection(new Vector3());
|
|
181
|
+
forward.y = 0;
|
|
182
|
+
if (forward.lengthSq() < 1e-6)
|
|
183
|
+
forward.set(0, 0, 1);
|
|
184
|
+
forward.normalize();
|
|
185
|
+
const plane = new Plane().setFromNormalAndCoplanarPoint(forward, anchorWorld);
|
|
186
|
+
const hit = intersect(clientX, clientY, plane);
|
|
187
|
+
return hit ? toLocal(hit)[1] : null;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Length-preserving HORIZONTAL swing: the unit direction from `pivot` toward
|
|
191
|
+
* a point sharing the cursor's heading but keeping the run's current pitch
|
|
192
|
+
* (vertical component). Caller re-extends it to the fixed radius. Sweeping
|
|
193
|
+
* the end around the pivot in the horizontal plane (a yaw) without changing
|
|
194
|
+
* length. Null when the cursor sits on the pivot's vertical axis (no
|
|
195
|
+
* heading) or the ray misses.
|
|
196
|
+
*/
|
|
197
|
+
const swingHorizontal = (event, pivot, startPoint) => {
|
|
198
|
+
const r = Math.hypot(startPoint[0] - pivot[0], startPoint[1] - pivot[1], startPoint[2] - pivot[2]);
|
|
199
|
+
if (r < 1e-6)
|
|
200
|
+
return null;
|
|
201
|
+
const verticalN = (startPoint[1] - pivot[1]) / r;
|
|
202
|
+
const horizN = Math.sqrt(Math.max(0, 1 - verticalN * verticalN));
|
|
203
|
+
const plane = new Plane().setFromNormalAndCoplanarPoint(UP, toWorld(pivot));
|
|
204
|
+
const hit = intersect(event.clientX, event.clientY, plane);
|
|
205
|
+
if (!hit)
|
|
206
|
+
return null;
|
|
207
|
+
const local = toLocal(hit);
|
|
208
|
+
const bx = local[0] - pivot[0];
|
|
209
|
+
const bz = local[2] - pivot[2];
|
|
210
|
+
const blen = Math.hypot(bx, bz);
|
|
211
|
+
if (blen < 1e-6)
|
|
212
|
+
return null;
|
|
213
|
+
return [(bx / blen) * horizN, verticalN, (bz / blen) * horizN];
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* Length-preserving VERTICAL swing: the unit direction from `pivot` toward
|
|
217
|
+
* the cursor within the vertical plane that contains the run's current
|
|
218
|
+
* horizontal heading — so the end tilts up / down (changing pitch) while its
|
|
219
|
+
* heading and length stay fixed. Falls back to a camera-facing vertical plane
|
|
220
|
+
* for a pure riser (no horizontal heading). Null when the ray misses.
|
|
221
|
+
*/
|
|
222
|
+
const swingVertical = (event, pivot, startPoint) => {
|
|
223
|
+
let hx = startPoint[0] - pivot[0];
|
|
224
|
+
let hz = startPoint[2] - pivot[2];
|
|
225
|
+
let hlen = Math.hypot(hx, hz);
|
|
226
|
+
if (hlen < 1e-6) {
|
|
227
|
+
// Pure riser: no heading — sweep in the plane facing the camera.
|
|
228
|
+
const forward = camera.getWorldDirection(new Vector3());
|
|
229
|
+
hx = forward.x;
|
|
230
|
+
hz = forward.z;
|
|
231
|
+
hlen = Math.hypot(hx, hz);
|
|
232
|
+
if (hlen < 1e-6) {
|
|
233
|
+
hx = 0;
|
|
234
|
+
hz = 1;
|
|
235
|
+
hlen = 1;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const headingWorld = new Vector3(hx / hlen, 0, hz / hlen);
|
|
239
|
+
// Plane normal: horizontal, perpendicular to the heading — the plane stands
|
|
240
|
+
// upright and contains both the heading and world-up through the pivot.
|
|
241
|
+
const normal = new Vector3().crossVectors(UP, headingWorld).normalize();
|
|
242
|
+
const plane = new Plane().setFromNormalAndCoplanarPoint(normal, toWorld(pivot));
|
|
243
|
+
const hit = intersect(event.clientX, event.clientY, plane);
|
|
244
|
+
if (!hit)
|
|
245
|
+
return null;
|
|
246
|
+
const local = toLocal(hit);
|
|
247
|
+
const ax = local[0] - pivot[0];
|
|
248
|
+
const ay = local[1] - pivot[1];
|
|
249
|
+
const az = local[2] - pivot[2];
|
|
250
|
+
const len = Math.hypot(ax, ay, az);
|
|
251
|
+
if (len < 1e-6)
|
|
252
|
+
return null;
|
|
253
|
+
return [ax / len, ay / len, az / len];
|
|
254
|
+
};
|
|
255
|
+
// Build the per-frame update batch for the dragged endpoint at `next`.
|
|
256
|
+
// Detached (Alt): only the duct path moves — no fitting re-aim, no
|
|
257
|
+
// connectivity follow. Re-aim mode: the run rides the fitting's re-aimed
|
|
258
|
+
// collar and the fitting swings to fit (elbow body turns, or a tee branch
|
|
259
|
+
// leans). Otherwise: the dragged point moves and any mated fittings / runs
|
|
260
|
+
// translate via connectivity.
|
|
261
|
+
const buildDragBatch = (drag, next, detached) => {
|
|
262
|
+
if (!detached && drag.fittingEndpoint) {
|
|
263
|
+
const plan = planFittingEndpointReaim(drag.fittingEndpoint, drag.index, next);
|
|
264
|
+
// Out of the fitting's buildable range — hold this frame.
|
|
265
|
+
if (!plan)
|
|
266
|
+
return null;
|
|
267
|
+
return [
|
|
268
|
+
{ id: duct.id, data: { path: plan.path } },
|
|
269
|
+
{ id: plan.fittingUpdate.id, data: plan.fittingUpdate.data },
|
|
270
|
+
];
|
|
271
|
+
}
|
|
272
|
+
const path = duct.path.map((p, i) => (i === drag.index ? next : p));
|
|
273
|
+
return [
|
|
274
|
+
{ id: duct.id, data: { path } },
|
|
275
|
+
...(detached ? [] : connectivityUpdatesForPath(drag.connectivity, path)),
|
|
276
|
+
];
|
|
277
|
+
};
|
|
278
|
+
/** World-space position of a local path point. */
|
|
279
|
+
const toWorld = (p) => target.localToWorld(new Vector3(p[0], p[1], p[2]));
|
|
280
|
+
/** Convert a world-space hit back into the duct group's local frame. */
|
|
281
|
+
const toLocal = (world) => {
|
|
282
|
+
const local = target.worldToLocal(world.clone());
|
|
283
|
+
return [local.x, local.y, local.z];
|
|
284
|
+
};
|
|
285
|
+
// Follow-updates for fittings / ducts mated to this run's endpoints, given
|
|
286
|
+
// the run's live path. Endpoints whose position didn't change resolve to a
|
|
287
|
+
// zero delta, so only the dragged endpoint's partner actually moves.
|
|
288
|
+
const connectivityUpdatesForPath = (connectivity, path) => {
|
|
289
|
+
if (!connectivity)
|
|
290
|
+
return [];
|
|
291
|
+
const preview = { ...duct, path };
|
|
292
|
+
return resolveConnectivityUpdates(connectivity, preview).filter((u) => useScene.getState().nodes[u.id]);
|
|
293
|
+
};
|
|
294
|
+
// A corner arrow drag: the point is locked to one axis (X / Z / Y). All the
|
|
295
|
+
// rich behaviour — port-snap, elbow re-aim, connectivity follow, single-undo
|
|
296
|
+
// — is shared with every arrow; only the
|
|
297
|
+
// cursor→point projection differs per `kind`.
|
|
298
|
+
const onHandleDown = (index, kind) => (e) => {
|
|
299
|
+
e.stopPropagation();
|
|
300
|
+
const initialPath = duct.path.map((p) => [...p]);
|
|
301
|
+
const startPoint = initialPath[index];
|
|
302
|
+
const connectivity = analyzePortConnectivity(duct, useScene.getState().nodes);
|
|
303
|
+
pauseSceneHistory(useScene);
|
|
304
|
+
useViewer.getState().setInputDragging(true);
|
|
305
|
+
document.body.style.cursor = kind.axis === 'y' ? 'ns-resize' : 'grabbing';
|
|
306
|
+
setDraggingIndex(index);
|
|
307
|
+
const isEndpoint = index === 0 || index === initialPath.length - 1;
|
|
308
|
+
// Swing pivot: the across-run (side) and up / down arrows DON'T stretch the
|
|
309
|
+
// run — they sweep the grabbed point around its neighbour at a fixed radius
|
|
310
|
+
// (the segment's current length), so the run pivots like a compass arm
|
|
311
|
+
// instead of lengthening. The along-run pair keeps the plain lengthen /
|
|
312
|
+
// shorten. The pivot is the adjacent vertex; null when there's no neighbour
|
|
313
|
+
// (a lone point) or the grabbed segment has zero length.
|
|
314
|
+
const swings = kind.axis === 'y' ? kind.along !== true : !kind.along;
|
|
315
|
+
// Pivot only at an endpoint (its single neighbour is the unambiguous "other
|
|
316
|
+
// end"); interior vertices keep the plain per-axis drag.
|
|
317
|
+
const neighborIndex = index === 0 ? 1 : index === initialPath.length - 1 ? index - 1 : null;
|
|
318
|
+
const pivot = neighborIndex !== null ? initialPath[neighborIndex] : null;
|
|
319
|
+
const radius = pivot
|
|
320
|
+
? Math.hypot(startPoint[0] - pivot[0], startPoint[1] - pivot[1], startPoint[2] - pivot[2])
|
|
321
|
+
: 0;
|
|
322
|
+
const canSwing = swings && isEndpoint && pivot !== null && radius > 1e-6;
|
|
323
|
+
// Fitting re-aim: if this is a straight run whose OTHER end sits on an
|
|
324
|
+
// elbow collar (junction + far collar fixed, bend angle adapts) or a tee
|
|
325
|
+
// branch collar (run legs fixed, branch lean adapts), the fitting swings
|
|
326
|
+
// to follow the drag. Detected once against a drag-start snapshot.
|
|
327
|
+
const fittingEndpoint = isEndpoint
|
|
328
|
+
? detectFittingEndpoint('duct-segment', initialPath, index, useScene.getState().nodes)
|
|
329
|
+
: null;
|
|
330
|
+
const onMove = (event) => {
|
|
331
|
+
const drag = dragRef.current;
|
|
332
|
+
if (!drag)
|
|
333
|
+
return;
|
|
334
|
+
// Shift = precision: bypass grid snapping (snap() is a no-op at step 0).
|
|
335
|
+
const step = event.shiftKey ? 0 : useEditor.getState().gridSnapStep;
|
|
336
|
+
// Alt = detach: break the joint for this drag (it can still port-snap to
|
|
337
|
+
// re-mate elsewhere). Mirrors the wall corner drag.
|
|
338
|
+
const detached = event.altKey;
|
|
339
|
+
let next = null;
|
|
340
|
+
if (canSwing && pivot) {
|
|
341
|
+
// Length-preserving swing: aim from the pivot toward the cursor and
|
|
342
|
+
// re-extend to the fixed radius. The up / down arrow swings in the
|
|
343
|
+
// vertical plane that contains the run (so it tilts the run up / down
|
|
344
|
+
// without changing its length); the side arrow swings in the
|
|
345
|
+
// horizontal plane (a yaw about the pivot).
|
|
346
|
+
const aim = kind.axis === 'y'
|
|
347
|
+
? swingVertical(event, pivot, startPoint)
|
|
348
|
+
: swingHorizontal(event, pivot, startPoint);
|
|
349
|
+
if (aim) {
|
|
350
|
+
// The swung endpoint follows the grid snap points by default; Shift
|
|
351
|
+
// sets step 0 so it sweeps smoothly. Snapping the landed coords (not
|
|
352
|
+
// the arc angle) keeps the endpoint on the grid like every other
|
|
353
|
+
// arrow, trading a hair of the fixed radius for grid alignment.
|
|
354
|
+
next = [
|
|
355
|
+
snap(pivot[0] + aim[0] * radius, step),
|
|
356
|
+
Math.max(0, snap(pivot[1] + aim[1] * radius, step)),
|
|
357
|
+
snap(pivot[2] + aim[2] * radius, step),
|
|
358
|
+
];
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
else if (kind.axis === 'y') {
|
|
362
|
+
// Vertical (riser): keep XZ pinned to the start and drive Y off the
|
|
363
|
+
// cursor against a vertical plane through the point.
|
|
364
|
+
const y = intersectVerticalY(event.clientX, event.clientY, toWorld(startPoint));
|
|
365
|
+
if (y !== null)
|
|
366
|
+
next = [startPoint[0], Math.max(0, snap(y, step)), startPoint[2]];
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
// Horizontal: project the cursor onto the plane at the point's height,
|
|
370
|
+
// then lock to the arrow's run-relative line (node-local XZ direction)
|
|
371
|
+
// through the point — so an angled run drags along / across itself, not
|
|
372
|
+
// world ±X / ±Z.
|
|
373
|
+
const plane = new Plane().setFromNormalAndCoplanarPoint(UP, toWorld(startPoint));
|
|
374
|
+
const hit = intersect(event.clientX, event.clientY, plane);
|
|
375
|
+
if (hit) {
|
|
376
|
+
const local = toLocal(hit);
|
|
377
|
+
const [dx, dz] = kind.dir;
|
|
378
|
+
// Signed displacement of the cursor along the lock direction, snapped.
|
|
379
|
+
const t = snap((local[0] - startPoint[0]) * dx + (local[2] - startPoint[2]) * dz, step);
|
|
380
|
+
next = [startPoint[0] + t * dx, startPoint[1], startPoint[2] + t * dz];
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (!next)
|
|
384
|
+
return;
|
|
385
|
+
// Port re-mate for any endpoint arrow — the along-/across-run drags AND
|
|
386
|
+
// the length-preserving swings all snap onto a nearby typed port so a
|
|
387
|
+
// loose run can be mated onto a fitting after the fact (the swing's fixed
|
|
388
|
+
// radius yields to the port). Stays available while detaching or
|
|
389
|
+
// free-dragging; suppressed only while a fitting is actively re-aiming.
|
|
390
|
+
if (isEndpoint && (detached || !drag.fittingEndpoint)) {
|
|
391
|
+
const port = findNearestPortXZ([next[0], next[1], next[2]], collectScenePorts({ excludeNodeId: duct.id, systems: DUCT_PORT_SYSTEMS }), PORT_SNAP_RADIUS_M);
|
|
392
|
+
if (port)
|
|
393
|
+
next = [port.position[0], port.position[1], port.position[2]];
|
|
394
|
+
}
|
|
395
|
+
if (next[0] === drag.current[0] && next[1] === drag.current[1] && next[2] === drag.current[2])
|
|
396
|
+
return;
|
|
397
|
+
const batch = buildDragBatch(drag, next, detached);
|
|
398
|
+
if (!batch)
|
|
399
|
+
return;
|
|
400
|
+
drag.current = next;
|
|
401
|
+
drag.detached = detached;
|
|
402
|
+
// Tick on each new snapped position — the same grid-snap SFX the draw
|
|
403
|
+
// tools fire; the player debounces rapid repeats (minIntervalMs). Only
|
|
404
|
+
// when the grid is live (step > 0): Shift-precision has nothing to snap.
|
|
405
|
+
if (step > 0)
|
|
406
|
+
triggerSFX('sfx:grid-snap');
|
|
407
|
+
useScene.getState().updateNodes(batch);
|
|
408
|
+
};
|
|
409
|
+
const onUp = () => {
|
|
410
|
+
const drag = dragRef.current;
|
|
411
|
+
if (!drag)
|
|
412
|
+
return;
|
|
413
|
+
// Swallow the trailing synthetic click so it doesn't reach the
|
|
414
|
+
// background-click deselect handler — `cleanup()` drops `inputDragging`
|
|
415
|
+
// synchronously here, so without this the click that fires after
|
|
416
|
+
// pointerup would land with the drag gate already down and clear the
|
|
417
|
+
// selection. Mirrors `useHandleDrag`'s onUp.
|
|
418
|
+
swallowNextClick();
|
|
419
|
+
drag.cleanup();
|
|
420
|
+
dragRef.current = null;
|
|
421
|
+
setDraggingIndex(null);
|
|
422
|
+
// Single-undo dance: revert (still paused), resume, re-apply the final
|
|
423
|
+
// batch as one tracked change. The final batch is built the same way as
|
|
424
|
+
// each live frame (elbow re-aim, rigid connectivity follow, or — when
|
|
425
|
+
// detached — just the duct path).
|
|
426
|
+
const detached = drag.detached;
|
|
427
|
+
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
|
+
resumeSceneHistory(useScene);
|
|
445
|
+
const moved = drag.current.some((v, axis) => v !== drag.initialPath[drag.index][axis]);
|
|
446
|
+
if (moved && finalBatch) {
|
|
447
|
+
// A manual corner edit invalidates any stored auto-offset base (the
|
|
448
|
+
// tag's snapshot no longer matches the geometry), so strip the tag on
|
|
449
|
+
// commit. The duct becomes plain independent geometry.
|
|
450
|
+
const finalWithTagStrip = finalBatch.map((u) => u.id === duct.id && readAutoOffsetTag(duct)
|
|
451
|
+
? {
|
|
452
|
+
...u,
|
|
453
|
+
data: {
|
|
454
|
+
...u.data,
|
|
455
|
+
metadata: withoutAutoOffsetTag(duct.metadata),
|
|
456
|
+
},
|
|
457
|
+
}
|
|
458
|
+
: u);
|
|
459
|
+
useScene.getState().updateNodes(finalWithTagStrip);
|
|
460
|
+
}
|
|
461
|
+
};
|
|
462
|
+
const cleanup = () => {
|
|
463
|
+
window.removeEventListener('pointermove', onMove);
|
|
464
|
+
window.removeEventListener('pointerup', onUp);
|
|
465
|
+
window.removeEventListener('pointercancel', onUp);
|
|
466
|
+
useViewer.getState().setInputDragging(false);
|
|
467
|
+
document.body.style.cursor = '';
|
|
468
|
+
};
|
|
469
|
+
dragRef.current = {
|
|
470
|
+
index,
|
|
471
|
+
initialPath,
|
|
472
|
+
current: startPoint,
|
|
473
|
+
cleanup,
|
|
474
|
+
connectivity,
|
|
475
|
+
fittingEndpoint,
|
|
476
|
+
detached: false,
|
|
477
|
+
};
|
|
478
|
+
window.addEventListener('pointermove', onMove);
|
|
479
|
+
window.addEventListener('pointerup', onUp);
|
|
480
|
+
window.addEventListener('pointercancel', onUp);
|
|
481
|
+
};
|
|
482
|
+
// Roll: spin the rect / oval cross-section about the run (length) axis. The
|
|
483
|
+
// cursor's bearing in the plane perpendicular to the run direction (taken in
|
|
484
|
+
// the cross-section's own width / height basis so the angle maps 1:1 to the
|
|
485
|
+
// visible profile) drives the `roll` field. Round runs look identical at any
|
|
486
|
+
// roll, so the gizmo isn't rendered for them. Roll doesn't move the ports
|
|
487
|
+
// (they sit on the path, whose positions are unchanged), so mated runs /
|
|
488
|
+
// fittings need no follow — just the single-undo dance on the scalar field.
|
|
489
|
+
const onRollDown = (e) => {
|
|
490
|
+
e.stopPropagation();
|
|
491
|
+
const axis = runAxisAndCenter(duct);
|
|
492
|
+
if (!axis)
|
|
493
|
+
return;
|
|
494
|
+
const startRoll = duct.roll;
|
|
495
|
+
const dir = new Vector3(axis.dir[0], axis.dir[1], axis.dir[2]);
|
|
496
|
+
const worldDir = target.localToWorld(dir.clone()).sub(target.localToWorld(new Vector3()));
|
|
497
|
+
worldDir.normalize();
|
|
498
|
+
const center = toWorld(axis.center);
|
|
499
|
+
// Width / height axes at roll 0, mapped to world — the bearing basis. This
|
|
500
|
+
// is the same construction `rectSectionAxes` uses, so a turn of the cursor
|
|
501
|
+
// by θ rolls the section by θ.
|
|
502
|
+
const xBase = new Vector3().crossVectors(UP, dir);
|
|
503
|
+
if (xBase.lengthSq() < 1e-8)
|
|
504
|
+
xBase.set(1, 0, 0);
|
|
505
|
+
xBase.normalize();
|
|
506
|
+
const zBase = new Vector3().crossVectors(xBase, dir).normalize();
|
|
507
|
+
const u = target.localToWorld(xBase.clone()).sub(target.localToWorld(new Vector3())).normalize();
|
|
508
|
+
const v = target.localToWorld(zBase.clone()).sub(target.localToWorld(new Vector3())).normalize();
|
|
509
|
+
const plane = new Plane().setFromNormalAndCoplanarPoint(worldDir, center);
|
|
510
|
+
const bearing = (clientX, clientY) => {
|
|
511
|
+
const hit = intersect(clientX, clientY, plane);
|
|
512
|
+
if (!hit)
|
|
513
|
+
return null;
|
|
514
|
+
const d = hit.sub(center);
|
|
515
|
+
return Math.atan2(d.dot(v), d.dot(u));
|
|
516
|
+
};
|
|
517
|
+
const startBearing = bearing(e.nativeEvent.clientX, e.nativeEvent.clientY);
|
|
518
|
+
pauseSceneHistory(useScene);
|
|
519
|
+
useViewer.getState().setInputDragging(true);
|
|
520
|
+
document.body.style.cursor = 'grabbing';
|
|
521
|
+
setRolling(true);
|
|
522
|
+
let current = startRoll;
|
|
523
|
+
let lastStep = Number.NaN;
|
|
524
|
+
const onMove = (event) => {
|
|
525
|
+
if (startBearing === null)
|
|
526
|
+
return;
|
|
527
|
+
const b = bearing(event.clientX, event.clientY);
|
|
528
|
+
if (b === null)
|
|
529
|
+
return;
|
|
530
|
+
// Snap the roll to 45° steps; Shift = smooth (no snap).
|
|
531
|
+
const raw = b - startBearing;
|
|
532
|
+
const delta = event.shiftKey ? raw : Math.round(raw / ROLL_STEP_RAD) * ROLL_STEP_RAD;
|
|
533
|
+
const next = startRoll + delta;
|
|
534
|
+
if (next === current)
|
|
535
|
+
return;
|
|
536
|
+
current = next;
|
|
537
|
+
// Tick the rotate SFX each time a fresh snap step is crossed (snapped
|
|
538
|
+
// rolls only — a smooth Shift-drag has no discrete steps to mark).
|
|
539
|
+
if (!event.shiftKey) {
|
|
540
|
+
const step = Math.round(raw / ROLL_STEP_RAD);
|
|
541
|
+
if (step !== lastStep) {
|
|
542
|
+
lastStep = step;
|
|
543
|
+
triggerSFX('sfx:item-rotate');
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
useScene.getState().updateNode(duct.id, { roll: next });
|
|
547
|
+
};
|
|
548
|
+
const onUp = () => {
|
|
549
|
+
swallowNextClick();
|
|
550
|
+
window.removeEventListener('pointermove', onMove);
|
|
551
|
+
window.removeEventListener('pointerup', onUp);
|
|
552
|
+
window.removeEventListener('pointercancel', onUp);
|
|
553
|
+
useViewer.getState().setInputDragging(false);
|
|
554
|
+
document.body.style.cursor = '';
|
|
555
|
+
setRolling(false);
|
|
556
|
+
// Single-undo dance: revert to the pre-drag roll while paused, resume,
|
|
557
|
+
// then re-apply the final roll as one tracked change. A roll edit also
|
|
558
|
+
// invalidates any stored auto-offset base, so strip the tag on commit.
|
|
559
|
+
useScene.getState().updateNode(duct.id, { roll: startRoll });
|
|
560
|
+
resumeSceneHistory(useScene);
|
|
561
|
+
if (current !== startRoll) {
|
|
562
|
+
useScene.getState().updateNode(duct.id, {
|
|
563
|
+
roll: current,
|
|
564
|
+
...(readAutoOffsetTag(duct) ? { metadata: withoutAutoOffsetTag(duct.metadata) } : {}),
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
};
|
|
568
|
+
window.addEventListener('pointermove', onMove);
|
|
569
|
+
window.addEventListener('pointerup', onUp);
|
|
570
|
+
window.addEventListener('pointercancel', onUp);
|
|
571
|
+
};
|
|
572
|
+
// Move the WHOLE run, locked to one direction: the vertical world axis, or a
|
|
573
|
+
// run-relative horizontal line (node-local XZ unit dir) so the along-/across-
|
|
574
|
+
// run arrows track the run instead of world ±X / ±Z. Every path point shifts
|
|
575
|
+
// by the same delta; mated fittings / runs follow via connectivity, and the
|
|
576
|
+
// gesture lands as a single undo step (the same dance the per-point drag
|
|
577
|
+
// uses). The center arrows each bind one direction; the projection is the
|
|
578
|
+
// only thing that differs.
|
|
579
|
+
const onRunMoveDown = (kind) => (e) => {
|
|
580
|
+
e.stopPropagation();
|
|
581
|
+
const parentId = (duct.parentId ?? undefined);
|
|
582
|
+
const initialPath = duct.path.map((p) => [...p]);
|
|
583
|
+
const center = runAxisAndCenter(duct)?.center ?? initialPath[0];
|
|
584
|
+
const anchorWorld = toWorld(center);
|
|
585
|
+
// Cross-section the auto-routed offset fittings inherit (vertical move).
|
|
586
|
+
const profile = {
|
|
587
|
+
shape: duct.shape,
|
|
588
|
+
diameter: duct.diameter,
|
|
589
|
+
width: duct.width,
|
|
590
|
+
height: duct.height,
|
|
591
|
+
};
|
|
592
|
+
// Auto-routed offsets carry an auto-offset tag recording the minted
|
|
593
|
+
// elbows/risers + the pre-offset base. A re-drag must REWIND that tag
|
|
594
|
+
// (delete the prior minted nodes, restore the base) before planning the
|
|
595
|
+
// fresh offset — otherwise each re-drag strands the previous elbows/riser
|
|
596
|
+
// in place. Read the tag on vertical drags so the rewind/delete plumbing
|
|
597
|
+
// (keyed on `mintedIds` below) runs; horizontal moves translate a stored
|
|
598
|
+
// base if one remains.
|
|
599
|
+
const isVertical = kind.axis === 'y';
|
|
600
|
+
const preRewindNodes = useScene.getState().nodes;
|
|
601
|
+
const existingTag = readAutoOffsetTag(duct);
|
|
602
|
+
const tag = isVertical ? existingTag : null;
|
|
603
|
+
const runBase = tag?.base.find((b) => b.id === duct.id);
|
|
604
|
+
const logicalPath = (runBase?.data?.path?.map((p) => [...p]) ?? initialPath);
|
|
605
|
+
const baseDy = tag?.dy ?? 0;
|
|
606
|
+
const mintedIds = (tag?.minted ?? []);
|
|
607
|
+
// Snapshots of the existing minted nodes, so the pre-commit revert can
|
|
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();
|
|
613
|
+
pauseSceneHistory(useScene);
|
|
614
|
+
const ensureSceneObjectsVisible = (ids) => {
|
|
615
|
+
const scene = useScene.getState();
|
|
616
|
+
for (const id of ids) {
|
|
617
|
+
const obj = sceneRegistry.nodes.get(id);
|
|
618
|
+
if (obj) {
|
|
619
|
+
obj.visible = true;
|
|
620
|
+
obj.traverse((child) => {
|
|
621
|
+
child.visible = true;
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
if (scene.nodes[id])
|
|
625
|
+
scene.markDirty(id);
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
const livePreviewIds = new Set();
|
|
629
|
+
const publishLivePreview = (updates) => {
|
|
630
|
+
const scene = useScene.getState();
|
|
631
|
+
const entries = updates
|
|
632
|
+
.filter((update) => scene.nodes[update.id])
|
|
633
|
+
.map((update) => [update.id, update.data]);
|
|
634
|
+
if (entries.length === 0)
|
|
635
|
+
return;
|
|
636
|
+
useLiveNodeOverrides.getState().setMany(entries);
|
|
637
|
+
for (const [id] of entries) {
|
|
638
|
+
livePreviewIds.add(id);
|
|
639
|
+
scene.markDirty(id);
|
|
640
|
+
}
|
|
641
|
+
};
|
|
642
|
+
const clearLivePreview = () => {
|
|
643
|
+
const overrides = useLiveNodeOverrides.getState();
|
|
644
|
+
for (const id of livePreviewIds)
|
|
645
|
+
overrides.clear(id);
|
|
646
|
+
livePreviewIds.clear();
|
|
647
|
+
};
|
|
648
|
+
// Connectivity + ports are read from an IN-MEMORY post-rewind scene (the
|
|
649
|
+
// logical L), so click-only pointerdown doesn't visually snap the committed
|
|
650
|
+
// offset down to the floor. The real scene is only rewound after the first
|
|
651
|
+
// actual drag delta, inside `applyLogicalBasePreview`.
|
|
652
|
+
const nodesById = { ...preRewindNodes };
|
|
653
|
+
if (tag) {
|
|
654
|
+
for (const id of mintedIds)
|
|
655
|
+
delete nodesById[id];
|
|
656
|
+
for (const b of tag.base) {
|
|
657
|
+
const current = nodesById[b.id];
|
|
658
|
+
if (current)
|
|
659
|
+
nodesById[b.id] = { ...current, ...b.data };
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
const logicalDuct = DuctSegmentNode.parse({
|
|
663
|
+
...duct,
|
|
664
|
+
path: logicalPath,
|
|
665
|
+
metadata: withoutAutoOffsetTag(duct.metadata),
|
|
666
|
+
});
|
|
667
|
+
nodesById[duct.id] = logicalDuct;
|
|
668
|
+
const connectivity = analyzePortConnectivity(logicalDuct, nodesById);
|
|
669
|
+
const scenePorts = collectPortsFromNodes(nodesById, {
|
|
670
|
+
excludeNodeId: duct.id,
|
|
671
|
+
systems: DUCT_PORT_SYSTEMS,
|
|
672
|
+
});
|
|
673
|
+
// Grab offset: cursor's start coordinate along the locked direction (signed
|
|
674
|
+
// distance for the horizontal run-relative line), so the run doesn't jump
|
|
675
|
+
// on grab.
|
|
676
|
+
const sample = (clientX, clientY) => {
|
|
677
|
+
if (kind.axis === 'y')
|
|
678
|
+
return intersectVerticalY(clientX, clientY, anchorWorld);
|
|
679
|
+
const plane = new Plane().setFromNormalAndCoplanarPoint(UP, anchorWorld);
|
|
680
|
+
const hit = intersect(clientX, clientY, plane);
|
|
681
|
+
if (!hit)
|
|
682
|
+
return null;
|
|
683
|
+
const local = toLocal(hit);
|
|
684
|
+
return local[0] * kind.dir[0] + local[2] * kind.dir[1];
|
|
685
|
+
};
|
|
686
|
+
const startSample = sample(e.nativeEvent.clientX, e.nativeEvent.clientY);
|
|
687
|
+
useViewer.getState().setInputDragging(true);
|
|
688
|
+
document.body.style.cursor = kind.axis === 'y' ? 'ns-resize' : 'grabbing';
|
|
689
|
+
setRunMoving(true);
|
|
690
|
+
let delta = 0;
|
|
691
|
+
// Last frame's offset outcome (vertical move only): a valid plan to mint on
|
|
692
|
+
// release, an invalid marker (preview-only, snap back), or null for a plain
|
|
693
|
+
// translate. `onUp` reads it to decide create vs. translate vs. nothing.
|
|
694
|
+
let offsetResult = null;
|
|
695
|
+
// Shift the LOGICAL L: vertical adds the carried `baseDy` plus this drag's
|
|
696
|
+
// delta (so a re-drag accumulates from the L, not the lifted Z); horizontal
|
|
697
|
+
// (always untagged → baseDy 0, logicalPath === initialPath) slides in plane.
|
|
698
|
+
const shiftedPath = (d) => logicalPath.map((p) => {
|
|
699
|
+
const next = [...p];
|
|
700
|
+
if (kind.axis === 'y') {
|
|
701
|
+
next[1] = Math.max(0, p[1] + baseDy + d);
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
next[0] = p[0] + d * kind.dir[0];
|
|
705
|
+
next[2] = p[2] + d * kind.dir[1];
|
|
706
|
+
}
|
|
707
|
+
return next;
|
|
708
|
+
});
|
|
709
|
+
const batchFor = (path) => [
|
|
710
|
+
{ id: duct.id, data: { path } },
|
|
711
|
+
...connectivityUpdatesForPath(connectivity, path),
|
|
712
|
+
];
|
|
713
|
+
// Patches restoring every connected partner to its post-rewind (logical-L)
|
|
714
|
+
// pose — runs by path, fittings by position (+ a re-aimed elbow's rotation /
|
|
715
|
+
// angle). Used to FREEZE partners on an invalid frame.
|
|
716
|
+
const partnerReverts = () => (connectivity?.connections ?? [])
|
|
717
|
+
.map((conn) => {
|
|
718
|
+
if (conn.kind !== 'rigid-node') {
|
|
719
|
+
return { id: conn.nodeId, data: { path: conn.startPath } };
|
|
720
|
+
}
|
|
721
|
+
const start = nodesById[conn.nodeId];
|
|
722
|
+
const data = { position: conn.startPosition };
|
|
723
|
+
if (start?.rotation !== undefined)
|
|
724
|
+
data.rotation = start.rotation;
|
|
725
|
+
if (start?.angle !== undefined)
|
|
726
|
+
data.angle = start.angle;
|
|
727
|
+
return { id: conn.nodeId, data: data };
|
|
728
|
+
})
|
|
729
|
+
.filter((u) => useScene.getState().nodes[u.id]);
|
|
730
|
+
// Base for a NEWLY formed offset (untagged run): the logical L IS the
|
|
731
|
+
// drag-start pose, so the L is `initialPath` and partners are at their
|
|
732
|
+
// start paths / poses. A re-drag carries the existing tag's base forward.
|
|
733
|
+
const freshBase = () => [
|
|
734
|
+
{ id: duct.id, data: { path: initialPath } },
|
|
735
|
+
...partnerReverts().map((u) => ({ id: u.id, data: u.data })),
|
|
736
|
+
];
|
|
737
|
+
// Patches restoring partners to their PRE-rewind (original Z) poses — the
|
|
738
|
+
// single-undo baseline. Untagged: same as the L (no rewind happened).
|
|
739
|
+
const originalPartnerReverts = () => {
|
|
740
|
+
if (!tag)
|
|
741
|
+
return partnerReverts();
|
|
742
|
+
return tag.base
|
|
743
|
+
.filter((b) => b.id !== duct.id)
|
|
744
|
+
.map((b) => {
|
|
745
|
+
const orig = preRewindNodes[b.id];
|
|
746
|
+
if (!orig)
|
|
747
|
+
return null;
|
|
748
|
+
if ('path' in orig)
|
|
749
|
+
return { id: b.id, data: { path: orig.path } };
|
|
750
|
+
const data = {};
|
|
751
|
+
if (orig.position !== undefined)
|
|
752
|
+
data.position = orig.position;
|
|
753
|
+
if (orig.rotation !== undefined)
|
|
754
|
+
data.rotation = orig.rotation;
|
|
755
|
+
if (orig.angle !== undefined)
|
|
756
|
+
data.angle = orig.angle;
|
|
757
|
+
return { id: b.id, data: data };
|
|
758
|
+
})
|
|
759
|
+
.filter((u) => u !== null)
|
|
760
|
+
.filter((u) => useScene.getState().nodes[u.id]);
|
|
761
|
+
};
|
|
762
|
+
const restoreOriginalOffsetPreview = () => {
|
|
763
|
+
const scene = useScene.getState();
|
|
764
|
+
const partnerUpdates = originalPartnerReverts();
|
|
765
|
+
const updates = [
|
|
766
|
+
{
|
|
767
|
+
id: duct.id,
|
|
768
|
+
data: { path: duct.path, metadata: duct.metadata },
|
|
769
|
+
},
|
|
770
|
+
...partnerUpdates,
|
|
771
|
+
];
|
|
772
|
+
publishLivePreview(updates);
|
|
773
|
+
scene.applyNodeChanges({
|
|
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
|
+
}
|
|
804
|
+
};
|
|
805
|
+
const applyLogicalBasePreview = () => {
|
|
806
|
+
if (!tag)
|
|
807
|
+
return;
|
|
808
|
+
const scene = useScene.getState();
|
|
809
|
+
const updates = [
|
|
810
|
+
{
|
|
811
|
+
id: duct.id,
|
|
812
|
+
data: {
|
|
813
|
+
path: logicalPath,
|
|
814
|
+
metadata: withoutAutoOffsetTag(duct.metadata),
|
|
815
|
+
},
|
|
816
|
+
},
|
|
817
|
+
...tag.base
|
|
818
|
+
.filter((b) => b.id !== duct.id && scene.nodes[b.id])
|
|
819
|
+
.map((b) => ({ id: b.id, data: b.data })),
|
|
820
|
+
];
|
|
821
|
+
publishLivePreview(updates);
|
|
822
|
+
scene.applyNodeChanges({
|
|
823
|
+
delete: mintedIds.filter((id) => scene.nodes[id]),
|
|
824
|
+
update: updates,
|
|
825
|
+
});
|
|
826
|
+
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
827
|
+
};
|
|
828
|
+
const onMove = (event) => {
|
|
829
|
+
if (startSample === null)
|
|
830
|
+
return;
|
|
831
|
+
const s = sample(event.clientX, event.clientY);
|
|
832
|
+
if (s === null)
|
|
833
|
+
return;
|
|
834
|
+
const step = event.shiftKey ? 0 : useEditor.getState().gridSnapStep;
|
|
835
|
+
const next = snap(s - startSample, step);
|
|
836
|
+
if (next === delta)
|
|
837
|
+
return;
|
|
838
|
+
delta = next;
|
|
839
|
+
if (step > 0)
|
|
840
|
+
triggerSFX('sfx:grid-snap');
|
|
841
|
+
const dyEff = baseDy + next;
|
|
842
|
+
// Vertical move: connected ends stay welded to their (stationary)
|
|
843
|
+
// partner via an auto-routed elbow → riser → elbow offset, planned from
|
|
844
|
+
// the LOGICAL L by the accumulated lift. The planner returns valid (offset
|
|
845
|
+
// fits), invalid (connected but no clean offset at this height), or null
|
|
846
|
+
// (no connections, or dyEff 0 → back at the L → plain translate).
|
|
847
|
+
offsetResult =
|
|
848
|
+
isVertical && dyEff !== 0
|
|
849
|
+
? planVerticalOffsets({
|
|
850
|
+
duct: logicalDuct,
|
|
851
|
+
dy: dyEff,
|
|
852
|
+
profile,
|
|
853
|
+
connections: connectivity?.connections ?? [],
|
|
854
|
+
scenePorts,
|
|
855
|
+
nodesById,
|
|
856
|
+
})
|
|
857
|
+
: null;
|
|
858
|
+
if (offsetResult?.status === 'valid') {
|
|
859
|
+
applyLogicalBasePreview();
|
|
860
|
+
// Lift the run to the offset path; trim run-offset partners back one
|
|
861
|
+
// leg, and let connectivity-follow (seeded from followPath, which zeroes
|
|
862
|
+
// the offset ends) lift any FITTING / open partner so its elbow rides
|
|
863
|
+
// up and its riser lengthens into a clean L. Ghost the new elbows +
|
|
864
|
+
// riser GREEN; they're minted for real on release.
|
|
865
|
+
const plan = offsetResult.plan;
|
|
866
|
+
const scene = useScene.getState();
|
|
867
|
+
const deletePreview = (plan.delete ?? []).filter((id) => scene.nodes[id]);
|
|
868
|
+
for (const id of deletePreview) {
|
|
869
|
+
const node = scene.nodes[id];
|
|
870
|
+
if (node)
|
|
871
|
+
previewDeletedSnapshots.set(id, node);
|
|
872
|
+
}
|
|
873
|
+
restorePreviewDeleted(plan.delete ?? []);
|
|
874
|
+
const followUpdates = connectivityUpdatesForPath(connectivity, plan.followPath);
|
|
875
|
+
const updates = [
|
|
876
|
+
{ id: duct.id, data: { path: plan.ductPath } },
|
|
877
|
+
...plan.updates.filter((u) => scene.nodes[u.id]),
|
|
878
|
+
...followUpdates,
|
|
879
|
+
];
|
|
880
|
+
publishLivePreview(updates);
|
|
881
|
+
scene.applyNodeChanges({
|
|
882
|
+
delete: deletePreview,
|
|
883
|
+
update: updates,
|
|
884
|
+
});
|
|
885
|
+
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
886
|
+
setVerticalGhost({ tint: 'valid', fittings: plan.fittings, risers: plan.risers });
|
|
887
|
+
}
|
|
888
|
+
else if (offsetResult?.status === 'invalid') {
|
|
889
|
+
// No clean offset at this height. Keep the last committed network
|
|
890
|
+
// visible (including any prior auto-offset we rewound at drag-start)
|
|
891
|
+
// and show a RED ghost of the run where it WOULD lift to. Nothing is
|
|
892
|
+
// committed on release, so the run snaps back to its prior state.
|
|
893
|
+
restorePreviewDeleted();
|
|
894
|
+
restoreOriginalOffsetPreview();
|
|
895
|
+
const lifted = DuctSegmentNode.parse({ ...logicalDuct, path: shiftedPath(next) });
|
|
896
|
+
setVerticalGhost({ tint: 'invalid', fittings: [], risers: [lifted] });
|
|
897
|
+
}
|
|
898
|
+
else {
|
|
899
|
+
restorePreviewDeleted();
|
|
900
|
+
applyLogicalBasePreview();
|
|
901
|
+
setVerticalGhost(null);
|
|
902
|
+
const updates = batchFor(shiftedPath(next));
|
|
903
|
+
publishLivePreview(updates);
|
|
904
|
+
useScene.getState().updateNodes(updates);
|
|
905
|
+
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
906
|
+
}
|
|
907
|
+
};
|
|
908
|
+
const onUp = () => {
|
|
909
|
+
swallowNextClick();
|
|
910
|
+
window.removeEventListener('pointermove', onMove);
|
|
911
|
+
window.removeEventListener('pointerup', onUp);
|
|
912
|
+
window.removeEventListener('pointercancel', onUp);
|
|
913
|
+
useViewer.getState().setInputDragging(false);
|
|
914
|
+
document.body.style.cursor = '';
|
|
915
|
+
setRunMoving(false);
|
|
916
|
+
setVerticalGhost(null);
|
|
917
|
+
clearLivePreview();
|
|
918
|
+
// Single-undo dance: while paused, revert to the PRE-drag baseline (the
|
|
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
|
+
]);
|
|
947
|
+
resumeSceneHistory(useScene);
|
|
948
|
+
if (delta === 0)
|
|
949
|
+
return;
|
|
950
|
+
const dyEff = baseDy + delta;
|
|
951
|
+
const result = offsetResult;
|
|
952
|
+
// Invalid lift: nothing buildable at this height — keep the prior state
|
|
953
|
+
// (the revert above already restored it) and commit nothing.
|
|
954
|
+
if (result?.status === 'invalid')
|
|
955
|
+
return;
|
|
956
|
+
const scene = useScene.getState();
|
|
957
|
+
if (result?.status === 'valid') {
|
|
958
|
+
// Mint the new offset (fresh elbows + riser), delete any prior minted,
|
|
959
|
+
// trim run-offset partners, lift fitting / open partners via
|
|
960
|
+
// connectivity-follow, and stamp the run with the offset tag — all one
|
|
961
|
+
// tracked change. The base (logical L) is carried forward unchanged.
|
|
962
|
+
const plan = result.plan;
|
|
963
|
+
const group = tag?.group ?? newAutoOffsetGroupId();
|
|
964
|
+
const base = tag?.base ?? freshBase();
|
|
965
|
+
const minted = [...plan.fittings, ...plan.risers];
|
|
966
|
+
const hasMintedOffset = minted.length > 0;
|
|
967
|
+
const newTag = {
|
|
968
|
+
group,
|
|
969
|
+
dy: plan.dy,
|
|
970
|
+
minted: minted.map((n) => n.id),
|
|
971
|
+
base,
|
|
972
|
+
};
|
|
973
|
+
const followUpdates = connectivityUpdatesForPath(connectivity, plan.followPath);
|
|
974
|
+
const updates = [
|
|
975
|
+
{
|
|
976
|
+
id: duct.id,
|
|
977
|
+
data: {
|
|
978
|
+
path: plan.ductPath,
|
|
979
|
+
metadata: hasMintedOffset
|
|
980
|
+
? withAutoOffsetTag(duct.metadata, newTag)
|
|
981
|
+
: withoutAutoOffsetTag(duct.metadata),
|
|
982
|
+
},
|
|
983
|
+
},
|
|
984
|
+
...plan.updates.filter((u) => scene.nodes[u.id]),
|
|
985
|
+
...followUpdates,
|
|
986
|
+
];
|
|
987
|
+
scene.applyNodeChanges({
|
|
988
|
+
create: minted.map((node) => ({ node, parentId })),
|
|
989
|
+
delete: [
|
|
990
|
+
...mintedIds.filter((id) => scene.nodes[id]),
|
|
991
|
+
...(plan.delete ?? []).filter((id) => scene.nodes[id]),
|
|
992
|
+
],
|
|
993
|
+
update: updates,
|
|
994
|
+
});
|
|
995
|
+
ensureSceneObjectsVisible([
|
|
996
|
+
...minted.map((node) => node.id),
|
|
997
|
+
...updates.map((update) => update.id),
|
|
998
|
+
]);
|
|
999
|
+
}
|
|
1000
|
+
else if (tag && dyEff === 0) {
|
|
1001
|
+
// Dragged a re-grabbed offset all the way back to its logical L: the Z
|
|
1002
|
+
// dissolves for good — delete the minted nodes, drop the tag, and leave
|
|
1003
|
+
// the run + partners on the clean L.
|
|
1004
|
+
const updates = [
|
|
1005
|
+
{
|
|
1006
|
+
id: duct.id,
|
|
1007
|
+
data: {
|
|
1008
|
+
path: logicalPath,
|
|
1009
|
+
metadata: withoutAutoOffsetTag(duct.metadata),
|
|
1010
|
+
},
|
|
1011
|
+
},
|
|
1012
|
+
...tag.base
|
|
1013
|
+
.filter((b) => b.id !== duct.id && scene.nodes[b.id])
|
|
1014
|
+
.map((b) => ({ id: b.id, data: b.data })),
|
|
1015
|
+
];
|
|
1016
|
+
scene.applyNodeChanges({
|
|
1017
|
+
delete: mintedIds.filter((id) => scene.nodes[id]),
|
|
1018
|
+
update: updates,
|
|
1019
|
+
});
|
|
1020
|
+
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
1021
|
+
}
|
|
1022
|
+
else {
|
|
1023
|
+
// Plain translate, or a horizontal connected slide that can be
|
|
1024
|
+
// rerouted with elbows + a connector instead of dragging the network.
|
|
1025
|
+
const finalPath = shiftedPath(delta);
|
|
1026
|
+
const translationPlan = !isVertical && connectivity
|
|
1027
|
+
? planRunTranslationOffsets({
|
|
1028
|
+
duct: logicalDuct,
|
|
1029
|
+
translatedPath: finalPath,
|
|
1030
|
+
profile,
|
|
1031
|
+
connections: connectivity.connections,
|
|
1032
|
+
scenePorts,
|
|
1033
|
+
nodesById,
|
|
1034
|
+
})
|
|
1035
|
+
: null;
|
|
1036
|
+
if (translationPlan) {
|
|
1037
|
+
const created = [...translationPlan.fittings, ...translationPlan.connectors];
|
|
1038
|
+
const updates = [
|
|
1039
|
+
{ id: duct.id, data: { path: translationPlan.ductPath } },
|
|
1040
|
+
...translationPlan.updates,
|
|
1041
|
+
];
|
|
1042
|
+
scene.applyNodeChanges({
|
|
1043
|
+
create: created.map((node) => ({
|
|
1044
|
+
node: node,
|
|
1045
|
+
parentId,
|
|
1046
|
+
})),
|
|
1047
|
+
update: updates,
|
|
1048
|
+
});
|
|
1049
|
+
ensureSceneObjectsVisible([
|
|
1050
|
+
...created.map((node) => node.id),
|
|
1051
|
+
...updates.map((update) => update.id),
|
|
1052
|
+
]);
|
|
1053
|
+
return;
|
|
1054
|
+
}
|
|
1055
|
+
const updates = batchFor(finalPath);
|
|
1056
|
+
if (isVertical && existingTag) {
|
|
1057
|
+
updates[0] = {
|
|
1058
|
+
...updates[0],
|
|
1059
|
+
data: {
|
|
1060
|
+
...updates[0].data,
|
|
1061
|
+
metadata: withoutAutoOffsetTag(duct.metadata),
|
|
1062
|
+
},
|
|
1063
|
+
};
|
|
1064
|
+
}
|
|
1065
|
+
if (!isVertical && existingTag && kind.axis === 'horizontal') {
|
|
1066
|
+
const movedTag = translateAutoOffsetBase(existingTag, [
|
|
1067
|
+
delta * kind.dir[0],
|
|
1068
|
+
0,
|
|
1069
|
+
delta * kind.dir[1],
|
|
1070
|
+
]);
|
|
1071
|
+
updates[0] = {
|
|
1072
|
+
...updates[0],
|
|
1073
|
+
data: {
|
|
1074
|
+
...updates[0].data,
|
|
1075
|
+
metadata: withAutoOffsetTag(duct.metadata, movedTag),
|
|
1076
|
+
},
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
useScene.getState().updateNodes(updates);
|
|
1080
|
+
ensureSceneObjectsVisible(updates.map((update) => update.id));
|
|
1081
|
+
}
|
|
1082
|
+
};
|
|
1083
|
+
window.addEventListener('pointermove', onMove);
|
|
1084
|
+
window.addEventListener('pointerup', onUp);
|
|
1085
|
+
window.addEventListener('pointercancel', onUp);
|
|
1086
|
+
};
|
|
1087
|
+
const cornerArrows = useMemo(() => getCornerArrows(duct), [duct]);
|
|
1088
|
+
const rollGizmo = useMemo(() => (duct.shape === 'round' ? null : runAxisAndCenter(duct)), [duct]);
|
|
1089
|
+
// Run-center cube position (centroid centerline). The six whole-run move
|
|
1090
|
+
// arrows + the roll arc are revealed on hover, like the per-vertex clusters.
|
|
1091
|
+
const runCenter = useMemo(() => runAxisAndCenter(duct)?.center ?? null, [duct]);
|
|
1092
|
+
// Yaw the center cube to the run's horizontal heading so it stays aligned
|
|
1093
|
+
// with the run (matching the per-vertex cubes). A pure riser has no heading.
|
|
1094
|
+
const runCenterYaw = useMemo(() => {
|
|
1095
|
+
const axis = runAxisAndCenter(duct);
|
|
1096
|
+
if (!axis || Math.hypot(axis.dir[0], axis.dir[2]) < 1e-6)
|
|
1097
|
+
return 0;
|
|
1098
|
+
return Math.atan2(-axis.dir[2], axis.dir[0]);
|
|
1099
|
+
}, [duct]);
|
|
1100
|
+
// Six whole-run move arrows offset off the center: four horizontal (along-run
|
|
1101
|
+
// ± and across-run ±, aligned to the run's XZ tangent so they track the run
|
|
1102
|
+
// instead of world ±X / ±Z) plus the up / down vertical pair. All shift every
|
|
1103
|
+
// path point rigidly — no swing (the whole run has no pivot).
|
|
1104
|
+
const centerArrows = useMemo(() => {
|
|
1105
|
+
if (!runCenter)
|
|
1106
|
+
return [];
|
|
1107
|
+
const base = Math.max(runRadiusM(duct) + CORNER_ARROW_GAP, CORNER_ARROW_MIN_OFFSET);
|
|
1108
|
+
// Run's horizontal heading (node-local XZ). A pure riser has none → fall
|
|
1109
|
+
// back to world +X so the arrows stay usable.
|
|
1110
|
+
const axis = runAxisAndCenter(duct);
|
|
1111
|
+
const t = axis && Math.hypot(axis.dir[0], axis.dir[2]) > 1e-6
|
|
1112
|
+
? (() => {
|
|
1113
|
+
const len = Math.hypot(axis.dir[0], axis.dir[2]);
|
|
1114
|
+
return [axis.dir[0] / len, axis.dir[2] / len];
|
|
1115
|
+
})()
|
|
1116
|
+
: [1, 0];
|
|
1117
|
+
const runYaw = Math.atan2(-t[1], t[0]);
|
|
1118
|
+
const horiz = [
|
|
1119
|
+
{ key: 'along+', dir: [t[0], t[1]] },
|
|
1120
|
+
{ key: 'along-', dir: [-t[0], -t[1]] },
|
|
1121
|
+
{ key: 'across+', dir: [-t[1], t[0]] },
|
|
1122
|
+
{ key: 'across-', dir: [t[1], -t[0]] },
|
|
1123
|
+
];
|
|
1124
|
+
const arrows = horiz.map(({ key, dir }) => ({
|
|
1125
|
+
key,
|
|
1126
|
+
kind: { axis: 'horizontal', dir },
|
|
1127
|
+
position: [runCenter[0] + dir[0] * base, runCenter[1], runCenter[2] + dir[1] * base],
|
|
1128
|
+
rotationY: Math.atan2(-dir[1], dir[0]),
|
|
1129
|
+
cursor: 'grab',
|
|
1130
|
+
}));
|
|
1131
|
+
arrows.push({
|
|
1132
|
+
key: '+y',
|
|
1133
|
+
kind: { axis: 'y' },
|
|
1134
|
+
position: [runCenter[0], runCenter[1] + base, runCenter[2]],
|
|
1135
|
+
rotationY: runYaw,
|
|
1136
|
+
vertical: 'up',
|
|
1137
|
+
cursor: 'ns-resize',
|
|
1138
|
+
}, {
|
|
1139
|
+
key: '-y',
|
|
1140
|
+
kind: { axis: 'y' },
|
|
1141
|
+
position: [runCenter[0], runCenter[1] - base, runCenter[2]],
|
|
1142
|
+
rotationY: runYaw,
|
|
1143
|
+
vertical: 'down',
|
|
1144
|
+
cursor: 'ns-resize',
|
|
1145
|
+
});
|
|
1146
|
+
return arrows;
|
|
1147
|
+
}, [duct, runCenter]);
|
|
1148
|
+
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
|
+
!rolling &&
|
|
1150
|
+
!runMoving &&
|
|
1151
|
+
duct.path.map((p, i) => (_jsxs("group", { children: [_jsx(HandleCube, { active: openCluster === i, onClick: () => toggleCluster(i), position: p, rotationY: vertexYaw(duct, i) }), openCluster === i &&
|
|
1152
|
+
cornerArrows
|
|
1153
|
+
.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(duct) + CORNER_ARROW_GAP }))] }))] })), draggingIndex !== null &&
|
|
1155
|
+
duct.path[draggingIndex] &&
|
|
1156
|
+
(() => {
|
|
1157
|
+
// Same pill as the draw tool: signed per-axis deltas from the
|
|
1158
|
+
// drag-start position, dominant axis emphasised.
|
|
1159
|
+
const point = duct.path[draggingIndex];
|
|
1160
|
+
const origin = dragRef.current?.initialPath[draggingIndex] ?? point;
|
|
1161
|
+
const deltas = [point[0] - origin[0], point[1] - origin[1], point[2] - origin[2]];
|
|
1162
|
+
const axes = ['x', 'y', 'z'];
|
|
1163
|
+
const primary = axes.reduce((best, axis, i) => Math.abs(deltas[i]) > Math.abs(deltas[axes.indexOf(best)]) ? axis : best);
|
|
1164
|
+
return (_jsx(Html, { center: true, position: [point[0], point[1] + 0.35, point[2]], style: { pointerEvents: 'none', userSelect: 'none' }, zIndexRange: [100, 0], children: _jsx(DimensionPill, { parts: axes.map((axis, i) => ({
|
|
1165
|
+
key: axis,
|
|
1166
|
+
prefix: axis.toUpperCase(),
|
|
1167
|
+
value: deltas[i],
|
|
1168
|
+
signed: true,
|
|
1169
|
+
})), primary: primary, unit: unit }) }));
|
|
1170
|
+
})()] }));
|
|
1171
|
+
};
|
|
1172
|
+
/**
|
|
1173
|
+
* Roll gizmo — the shared `RotateArc` re-oriented to wrap the run's length
|
|
1174
|
+
* axis, seated at a FIXED corner of the section frame. It does NOT track
|
|
1175
|
+
* `roll`, so the grip stays still while the user spins the duct (otherwise it
|
|
1176
|
+
* chases the cursor and is hard to keep hold of).
|
|
1177
|
+
*
|
|
1178
|
+
* The `curved-arrow` geometry wraps its LOCAL +Y (the spin axis) and bulges
|
|
1179
|
+
* its arc apex along LOCAL +X. Orienting with a single `setFromUnitVectors`
|
|
1180
|
+
* only pins the spin axis and leaves the apex pointing an arbitrary way, so the
|
|
1181
|
+
* arc faced inconsistently across run directions. Instead we build a FULLY
|
|
1182
|
+
* determined basis: +Y → run direction (the roll axis), +X → the top-outer 45°
|
|
1183
|
+
* corner direction (so the apex always bulges outward at that corner), +Z the
|
|
1184
|
+
* derived right-handed third axis. Position rides the same corner direction off
|
|
1185
|
+
* the centre, so the grip and its curve always agree.
|
|
1186
|
+
*/
|
|
1187
|
+
function RollHandle({ center, dir, radius, onPointerDown, }) {
|
|
1188
|
+
const { position, rotation } = useMemo(() => {
|
|
1189
|
+
const runDir = new Vector3(dir[0], dir[1], dir[2]).normalize();
|
|
1190
|
+
const xBase = new Vector3().crossVectors(UP, runDir);
|
|
1191
|
+
if (xBase.lengthSq() < 1e-8)
|
|
1192
|
+
xBase.set(1, 0, 0);
|
|
1193
|
+
xBase.normalize();
|
|
1194
|
+
const zBase = new Vector3().crossVectors(xBase, runDir).normalize();
|
|
1195
|
+
const a = Math.PI / 4;
|
|
1196
|
+
// Top-outer 45° corner of the section frame (between the top and a side
|
|
1197
|
+
// face) — both the position offset and the arc apex ride this direction.
|
|
1198
|
+
const cornerDir = xBase
|
|
1199
|
+
.clone()
|
|
1200
|
+
.multiplyScalar(Math.sin(a))
|
|
1201
|
+
.addScaledVector(zBase, -Math.cos(a))
|
|
1202
|
+
.normalize();
|
|
1203
|
+
const pos = [
|
|
1204
|
+
center[0] + cornerDir.x * radius,
|
|
1205
|
+
center[1] + cornerDir.y * radius,
|
|
1206
|
+
center[2] + cornerDir.z * radius,
|
|
1207
|
+
];
|
|
1208
|
+
// Basis: X = apex/corner, Y = roll axis (run dir), Z = right-handed third.
|
|
1209
|
+
const zAxis = new Vector3().crossVectors(cornerDir, runDir).normalize();
|
|
1210
|
+
const q = new Quaternion().setFromRotationMatrix(new Matrix4().makeBasis(cornerDir, runDir, zAxis));
|
|
1211
|
+
const e = new Euler().setFromQuaternion(q);
|
|
1212
|
+
return { position: pos, rotation: [e.x, e.y, e.z] };
|
|
1213
|
+
}, [center, dir, radius]);
|
|
1214
|
+
return _jsx(RotateArc, { onPointerDown: onPointerDown, position: position, rotation: rotation });
|
|
1215
|
+
}
|
|
1216
|
+
// Per-point directional arrows: at every path vertex, four horizontal chevrons
|
|
1217
|
+
// (along-run ± and across-run ±) plus an up / down vertical pair. The
|
|
1218
|
+
// horizontal pair is aligned to the run's node-local TANGENT at that vertex,
|
|
1219
|
+
// not world ±X / ±Z, so a duct drawn at any angle (or rotated) keeps
|
|
1220
|
+
// along-/across-run arrows. Pure vertical risers have no XZ tangent, so their
|
|
1221
|
+
// horizontal arrows become side-swing controls and the outward ±Y chevron
|
|
1222
|
+
// becomes the along-run length handle. `rotationY` orients each flat chevron to
|
|
1223
|
+
// point along its direction (the same `atan2(-z, x)` mapping the wall move
|
|
1224
|
+
// handles use). Arrows stand off the run body so they clear thick trunks. At an
|
|
1225
|
+
// endpoint the chevron pointing back INTO the run (toward the neighbour) is
|
|
1226
|
+
// dropped — its outward twin already shortens / lengthens that end either way.
|
|
1227
|
+
function getCornerArrows(duct) {
|
|
1228
|
+
const arrows = [];
|
|
1229
|
+
const base = Math.max(runRadiusM(duct) + CORNER_ARROW_GAP, CORNER_ARROW_MIN_OFFSET);
|
|
1230
|
+
const last = duct.path.length - 1;
|
|
1231
|
+
duct.path.forEach((p, i) => {
|
|
1232
|
+
// Run tangent at this vertex (node-local XZ). A pure-riser vertex has no
|
|
1233
|
+
// horizontal extent, so keep its side arrows world-cardinal and let the
|
|
1234
|
+
// outward vertical arrow carry the along-run action.
|
|
1235
|
+
const tangentXZ = vertexTangentXZ(duct, i);
|
|
1236
|
+
const verticalTangentY = tangentXZ ? null : vertexTangentY(duct, i);
|
|
1237
|
+
const t = tangentXZ ?? [1, 0];
|
|
1238
|
+
// Yaw that aligns a handle's local +X with the run tangent — shared by the
|
|
1239
|
+
// up / down chevrons so their flat plates align with the run (the ±Y tip
|
|
1240
|
+
// is added on top, and yawing about Y keeps them pointing up / down).
|
|
1241
|
+
const runYaw = Math.atan2(-t[1], t[0]);
|
|
1242
|
+
// along the run (lengthen / shorten), then across it (swing — tangent
|
|
1243
|
+
// rotated ±90°).
|
|
1244
|
+
const dirs = tangentXZ
|
|
1245
|
+
? [
|
|
1246
|
+
{ dir: [t[0], t[1]], along: true },
|
|
1247
|
+
{ dir: [-t[0], -t[1]], along: true },
|
|
1248
|
+
{ dir: [-t[1], t[0]], along: false },
|
|
1249
|
+
{ dir: [t[1], -t[0]], along: false },
|
|
1250
|
+
]
|
|
1251
|
+
: [
|
|
1252
|
+
{ dir: [1, 0], along: false },
|
|
1253
|
+
{ dir: [-1, 0], along: false },
|
|
1254
|
+
{ dir: [0, 1], along: false },
|
|
1255
|
+
{ dir: [0, -1], along: false },
|
|
1256
|
+
];
|
|
1257
|
+
// Inward (toward the run body) at an endpoint: i=0 the tangent points at
|
|
1258
|
+
// the neighbour, i=last it points away — so inward is ∓tangent. Interior
|
|
1259
|
+
// points keep all four arrows.
|
|
1260
|
+
const inward = tangentXZ && i === 0 ? [t[0], t[1]] : tangentXZ && i === last ? [-t[0], -t[1]] : null;
|
|
1261
|
+
for (const { dir, along } of dirs) {
|
|
1262
|
+
const [dx, dz] = dir;
|
|
1263
|
+
if (inward && dx * inward[0] + dz * inward[1] > 0.999)
|
|
1264
|
+
continue;
|
|
1265
|
+
arrows.push({
|
|
1266
|
+
key: `pt${i}-${dx.toFixed(3)}:${dz.toFixed(3)}`,
|
|
1267
|
+
index: i,
|
|
1268
|
+
kind: { axis: 'horizontal', dir: [dx, dz], along },
|
|
1269
|
+
position: [p[0] + dx * base, p[1], p[2] + dz * base],
|
|
1270
|
+
rotationY: Math.atan2(-dz, dx),
|
|
1271
|
+
cursor: 'grab',
|
|
1272
|
+
});
|
|
1273
|
+
}
|
|
1274
|
+
// Inward at a vertical endpoint is the chevron that points back toward the
|
|
1275
|
+
// neighbour; hide it so a riser endpoint exposes one clear outer length
|
|
1276
|
+
// handle along the duct instead of a misleading up/down swing pair.
|
|
1277
|
+
const inwardY = verticalTangentY && i === 0
|
|
1278
|
+
? verticalTangentY
|
|
1279
|
+
: verticalTangentY && i === last
|
|
1280
|
+
? -verticalTangentY
|
|
1281
|
+
: null;
|
|
1282
|
+
for (const sign of [1, -1]) {
|
|
1283
|
+
if (inwardY === sign)
|
|
1284
|
+
continue;
|
|
1285
|
+
arrows.push({
|
|
1286
|
+
key: `pt${i}-${sign > 0 ? 'up' : 'down'}`,
|
|
1287
|
+
index: i,
|
|
1288
|
+
kind: { axis: 'y', along: verticalTangentY !== null },
|
|
1289
|
+
position: [p[0], p[1] + sign * base, p[2]],
|
|
1290
|
+
rotationY: runYaw,
|
|
1291
|
+
vertical: sign > 0 ? 'up' : 'down',
|
|
1292
|
+
cursor: 'ns-resize',
|
|
1293
|
+
});
|
|
1294
|
+
}
|
|
1295
|
+
});
|
|
1296
|
+
return arrows;
|
|
1297
|
+
}
|
|
1298
|
+
/**
|
|
1299
|
+
* Node-local XZ unit tangent of the run at vertex `i`: toward the neighbour at
|
|
1300
|
+
* an endpoint, the averaged direction of the two adjacent segments at an
|
|
1301
|
+
* interior corner. Null when the run has no horizontal extent there (a pure
|
|
1302
|
+
* riser vertex), so the caller falls back to a world-aligned arrow.
|
|
1303
|
+
*/
|
|
1304
|
+
function vertexTangentXZ(duct, i) {
|
|
1305
|
+
const path = duct.path;
|
|
1306
|
+
const last = path.length - 1;
|
|
1307
|
+
if (last < 1)
|
|
1308
|
+
return null;
|
|
1309
|
+
const seg = (a, b) => {
|
|
1310
|
+
const dx = path[b][0] - path[a][0];
|
|
1311
|
+
const dz = path[b][2] - path[a][2];
|
|
1312
|
+
const len = Math.hypot(dx, dz);
|
|
1313
|
+
return len < 1e-6 ? null : [dx / len, dz / len];
|
|
1314
|
+
};
|
|
1315
|
+
if (i === 0)
|
|
1316
|
+
return seg(0, 1);
|
|
1317
|
+
if (i === last)
|
|
1318
|
+
return seg(last - 1, last);
|
|
1319
|
+
const inc = seg(i - 1, i);
|
|
1320
|
+
const out = seg(i, i + 1);
|
|
1321
|
+
if (!inc)
|
|
1322
|
+
return out;
|
|
1323
|
+
if (!out)
|
|
1324
|
+
return inc;
|
|
1325
|
+
const sx = inc[0] + out[0];
|
|
1326
|
+
const sz = inc[1] + out[1];
|
|
1327
|
+
const len = Math.hypot(sx, sz);
|
|
1328
|
+
return len < 1e-6 ? inc : [sx / len, sz / len];
|
|
1329
|
+
}
|
|
1330
|
+
/**
|
|
1331
|
+
* Node-local Y tangent for a vertex whose adjacent run direction is vertical.
|
|
1332
|
+
* Uses the same endpoint orientation convention as `vertexTangentXZ`: start
|
|
1333
|
+
* points toward its neighbour, end points away from its previous neighbour.
|
|
1334
|
+
*/
|
|
1335
|
+
function vertexTangentY(duct, i) {
|
|
1336
|
+
const path = duct.path;
|
|
1337
|
+
const last = path.length - 1;
|
|
1338
|
+
if (last < 1)
|
|
1339
|
+
return null;
|
|
1340
|
+
const seg = (a, b) => {
|
|
1341
|
+
const dx = path[b][0] - path[a][0];
|
|
1342
|
+
const dy = path[b][1] - path[a][1];
|
|
1343
|
+
const dz = path[b][2] - path[a][2];
|
|
1344
|
+
if (Math.hypot(dx, dz) > 1e-6 || Math.abs(dy) < 1e-6)
|
|
1345
|
+
return null;
|
|
1346
|
+
return dy > 0 ? 1 : -1;
|
|
1347
|
+
};
|
|
1348
|
+
if (i === 0)
|
|
1349
|
+
return seg(0, 1);
|
|
1350
|
+
if (i === last)
|
|
1351
|
+
return seg(last - 1, last);
|
|
1352
|
+
const inc = seg(i - 1, i);
|
|
1353
|
+
const out = seg(i, i + 1);
|
|
1354
|
+
if (!inc)
|
|
1355
|
+
return out;
|
|
1356
|
+
if (!out)
|
|
1357
|
+
return inc;
|
|
1358
|
+
return inc === out ? inc : null;
|
|
1359
|
+
}
|
|
1360
|
+
/** Y-yaw that aligns a handle's local +X with the run tangent at vertex `i`. */
|
|
1361
|
+
function vertexYaw(duct, i) {
|
|
1362
|
+
const t = vertexTangentXZ(duct, i);
|
|
1363
|
+
return t ? Math.atan2(-t[1], t[0]) : 0;
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* Overall run direction and midpoint (node-local), for the roll gizmo. The
|
|
1367
|
+
* direction is path[0]→last (the run's gross axis), falling back to the first
|
|
1368
|
+
* segment when the ends coincide; the centre is their midpoint. Null when the
|
|
1369
|
+
* run has no length to roll about.
|
|
1370
|
+
*/
|
|
1371
|
+
function runAxisAndCenter(duct) {
|
|
1372
|
+
const path = duct.path;
|
|
1373
|
+
if (path.length < 2)
|
|
1374
|
+
return null;
|
|
1375
|
+
const a = path[0];
|
|
1376
|
+
const b = path[path.length - 1];
|
|
1377
|
+
let dx = b[0] - a[0];
|
|
1378
|
+
let dy = b[1] - a[1];
|
|
1379
|
+
let dz = b[2] - a[2];
|
|
1380
|
+
let len = Math.hypot(dx, dy, dz);
|
|
1381
|
+
if (len < 1e-6) {
|
|
1382
|
+
const c = path[1];
|
|
1383
|
+
dx = c[0] - a[0];
|
|
1384
|
+
dy = c[1] - a[1];
|
|
1385
|
+
dz = c[2] - a[2];
|
|
1386
|
+
len = Math.hypot(dx, dy, dz);
|
|
1387
|
+
if (len < 1e-6)
|
|
1388
|
+
return null;
|
|
1389
|
+
}
|
|
1390
|
+
return {
|
|
1391
|
+
dir: [dx / len, dy / len, dz / len],
|
|
1392
|
+
center: [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2],
|
|
1393
|
+
};
|
|
1394
|
+
}
|
|
1395
|
+
export default DuctSegmentSelectionAffordance;
|