@reekon-tools/boldr-cad 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -9
- package/dist/app/edit.d.ts +12 -1
- package/dist/app/edit.js +96 -11
- package/dist/app/edit.js.map +1 -1
- package/dist/app/state.d.ts +31 -4
- package/dist/app/state.js +31 -2
- package/dist/app/state.js.map +1 -1
- package/dist/data/memory.d.ts +5 -0
- package/dist/data/memory.js +2 -2
- package/dist/data/memory.js.map +1 -1
- package/dist/data/provider.d.ts +19 -7
- package/dist/data/sync.d.ts +7 -2
- package/dist/data/sync.js +115 -64
- package/dist/data/sync.js.map +1 -1
- package/dist/editor/actions.d.ts +1 -2
- package/dist/editor/actions.js +391 -113
- package/dist/editor/actions.js.map +1 -1
- package/dist/editor/confirm.d.ts +23 -0
- package/dist/editor/confirm.js +35 -0
- package/dist/editor/confirm.js.map +1 -0
- package/dist/editor/elevation.d.ts +191 -90
- package/dist/editor/elevation.js +812 -616
- package/dist/editor/elevation.js.map +1 -1
- package/dist/editor/face.d.ts +73 -0
- package/dist/editor/face.js +269 -0
- package/dist/editor/face.js.map +1 -0
- package/dist/editor/files.d.ts +6 -0
- package/dist/editor/files.js +50 -4
- package/dist/editor/files.js.map +1 -1
- package/dist/editor/gestures.d.ts +18 -3
- package/dist/editor/gestures.js +145 -30
- package/dist/editor/gestures.js.map +1 -1
- package/dist/editor/keypad.d.ts +19 -4
- package/dist/editor/keypad.js +39 -9
- package/dist/editor/keypad.js.map +1 -1
- package/dist/editor/keys.js +36 -4
- package/dist/editor/keys.js.map +1 -1
- package/dist/editor/laser.d.ts +20 -4
- package/dist/editor/laser.js +104 -21
- package/dist/editor/laser.js.map +1 -1
- package/dist/editor/linkActions.d.ts +49 -0
- package/dist/editor/linkActions.js +210 -0
- package/dist/editor/linkActions.js.map +1 -0
- package/dist/editor/linkFollow.d.ts +2 -0
- package/dist/editor/linkFollow.js +53 -0
- package/dist/editor/linkFollow.js.map +1 -0
- package/dist/editor/linkWrite.d.ts +13 -0
- package/dist/editor/linkWrite.js +84 -0
- package/dist/editor/linkWrite.js.map +1 -0
- package/dist/editor/links.d.ts +84 -0
- package/dist/editor/links.js +130 -0
- package/dist/editor/links.js.map +1 -0
- package/dist/editor/markup.d.ts +29 -3
- package/dist/editor/markup.js +95 -10
- package/dist/editor/markup.js.map +1 -1
- package/dist/editor/mode.d.ts +40 -2
- package/dist/editor/mode.js +71 -4
- package/dist/editor/mode.js.map +1 -1
- package/dist/editor/ports.d.ts +36 -6
- package/dist/editor/ports.js +10 -1
- package/dist/editor/ports.js.map +1 -1
- package/dist/editor/project.d.ts +38 -6
- package/dist/editor/project.js +167 -27
- package/dist/editor/project.js.map +1 -1
- package/dist/editor/selection.d.ts +10 -0
- package/dist/editor/selection.js +62 -8
- package/dist/editor/selection.js.map +1 -1
- package/dist/editor/status.js +3 -0
- package/dist/editor/status.js.map +1 -1
- package/dist/editor/tooltips.d.ts +5 -0
- package/dist/editor/tooltips.js +48 -0
- package/dist/editor/tooltips.js.map +1 -0
- package/dist/editor/view3d.d.ts +17 -0
- package/dist/editor/view3d.js +135 -0
- package/dist/editor/view3d.js.map +1 -0
- package/dist/editor/view3dState.d.ts +39 -0
- package/dist/editor/view3dState.js +44 -0
- package/dist/editor/view3dState.js.map +1 -0
- package/dist/export/dxf.js +1 -1
- package/dist/export/dxf.js.map +1 -1
- package/dist/export/pdf.js +17 -12
- package/dist/export/pdf.js.map +1 -1
- package/dist/export/plan.d.ts +23 -6
- package/dist/export/plan.js +127 -44
- package/dist/export/plan.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model/constraints.js +15 -4
- package/dist/model/constraints.js.map +1 -1
- package/dist/model/demo.js +3 -3
- package/dist/model/demo.js.map +1 -1
- package/dist/model/elevation.d.ts +6 -9
- package/dist/model/elevation.js +5 -13
- package/dist/model/elevation.js.map +1 -1
- package/dist/model/faces.d.ts +58 -0
- package/dist/model/faces.js +197 -0
- package/dist/model/faces.js.map +1 -0
- package/dist/model/facesolve.d.ts +72 -0
- package/dist/model/facesolve.js +369 -0
- package/dist/model/facesolve.js.map +1 -0
- package/dist/model/history.d.ts +3 -2
- package/dist/model/history.js +17 -11
- package/dist/model/history.js.map +1 -1
- package/dist/model/images.d.ts +18 -0
- package/dist/model/images.js +26 -0
- package/dist/model/images.js.map +1 -0
- package/dist/model/links.d.ts +46 -0
- package/dist/model/links.js +73 -0
- package/dist/model/links.js.map +1 -0
- package/dist/model/markup.d.ts +46 -0
- package/dist/model/markup.js +71 -0
- package/dist/model/markup.js.map +1 -0
- package/dist/model/measurement.d.ts +11 -0
- package/dist/model/measurement.js +24 -0
- package/dist/model/measurement.js.map +1 -0
- package/dist/model/openings.d.ts +4 -0
- package/dist/model/openings.js +4 -0
- package/dist/model/openings.js.map +1 -1
- package/dist/model/planGeom.d.ts +72 -2
- package/dist/model/planGeom.js +184 -10
- package/dist/model/planGeom.js.map +1 -1
- package/dist/model/project.js +3 -2
- package/dist/model/project.js.map +1 -1
- package/dist/model/projectfile.js +2 -1
- package/dist/model/projectfile.js.map +1 -1
- package/dist/model/rooms.js +2 -2
- package/dist/model/rooms.js.map +1 -1
- package/dist/model/settings.d.ts +6 -0
- package/dist/model/settings.js +2 -2
- package/dist/model/settings.js.map +1 -1
- package/dist/model/sketch.d.ts +14 -0
- package/dist/model/sketch.js +143 -24
- package/dist/model/sketch.js.map +1 -1
- package/dist/model/smooth.d.ts +6 -0
- package/dist/model/smooth.js +52 -0
- package/dist/model/smooth.js.map +1 -0
- package/dist/model/store.d.ts +12 -0
- package/dist/model/store.js +35 -3
- package/dist/model/store.js.map +1 -1
- package/dist/model/types.d.ts +173 -8
- package/dist/model/wallfaces.d.ts +32 -0
- package/dist/model/wallfaces.js +133 -20
- package/dist/model/wallfaces.js.map +1 -1
- package/dist/model/wallshape.d.ts +15 -0
- package/dist/model/wallshape.js +89 -0
- package/dist/model/wallshape.js.map +1 -0
- package/dist/react/BottomBar.d.ts +9 -5
- package/dist/react/BottomBar.js +213 -24
- package/dist/react/BottomBar.js.map +1 -1
- package/dist/react/Buttons.d.ts +13 -2
- package/dist/react/Buttons.js +37 -5
- package/dist/react/Buttons.js.map +1 -1
- package/dist/react/CadEditor.d.ts +46 -3
- package/dist/react/CadEditor.js +77 -20
- package/dist/react/CadEditor.js.map +1 -1
- package/dist/react/ConfirmSheet.d.ts +4 -0
- package/dist/react/ConfirmSheet.js +31 -0
- package/dist/react/ConfirmSheet.js.map +1 -0
- package/dist/react/ConflictSheet.d.ts +2 -1
- package/dist/react/ConflictSheet.js +16 -8
- package/dist/react/ConflictSheet.js.map +1 -1
- package/dist/react/Drawer.d.ts +8 -2
- package/dist/react/Drawer.js +167 -38
- package/dist/react/Drawer.js.map +1 -1
- package/dist/react/Duck.d.ts +13 -0
- package/dist/react/Duck.js +45 -0
- package/dist/react/Duck.js.map +1 -0
- package/dist/react/Empty3D.d.ts +2 -0
- package/dist/react/Empty3D.js +39 -0
- package/dist/react/Empty3D.js.map +1 -0
- package/dist/react/FitScroll.d.ts +6 -0
- package/dist/react/FitScroll.js +14 -0
- package/dist/react/FitScroll.js.map +1 -0
- package/dist/react/Icon.native.d.ts +6 -0
- package/dist/react/Icon.native.js +4 -0
- package/dist/react/Icon.native.js.map +1 -1
- package/dist/react/Icon.web.d.ts +6 -0
- package/dist/react/Icon.web.js +4 -0
- package/dist/react/Icon.web.js.map +1 -1
- package/dist/react/KeypadSheet.d.ts +9 -2
- package/dist/react/KeypadSheet.js +174 -42
- package/dist/react/KeypadSheet.js.map +1 -1
- package/dist/react/LaserTray.js +8 -5
- package/dist/react/LaserTray.js.map +1 -1
- package/dist/react/MarkupPanel.d.ts +8 -0
- package/dist/react/MarkupPanel.js +67 -0
- package/dist/react/MarkupPanel.js.map +1 -0
- package/dist/react/PageThumb.native.d.ts +7 -2
- package/dist/react/PageThumb.native.js +19 -7
- package/dist/react/PageThumb.native.js.map +1 -1
- package/dist/react/PageThumb.web.d.ts +3 -2
- package/dist/react/PageThumb.web.js +4 -4
- package/dist/react/PageThumb.web.js.map +1 -1
- package/dist/react/PlanCanvas.native.d.ts +1 -1
- package/dist/react/PlanCanvas.native.js +134 -36
- package/dist/react/PlanCanvas.native.js.map +1 -1
- package/dist/react/PlanCanvas.web.js +16 -5
- package/dist/react/PlanCanvas.web.js.map +1 -1
- package/dist/react/Popovers.d.ts +12 -6
- package/dist/react/Popovers.js +53 -26
- package/dist/react/Popovers.js.map +1 -1
- package/dist/react/Rail.d.ts +24 -0
- package/dist/react/Rail.js +324 -34
- package/dist/react/Rail.js.map +1 -1
- package/dist/react/ShapeMenu.d.ts +7 -0
- package/dist/react/ShapeMenu.js +58 -0
- package/dist/react/ShapeMenu.js.map +1 -0
- package/dist/react/Sheet.d.ts +14 -4
- package/dist/react/Sheet.js +54 -9
- package/dist/react/Sheet.js.map +1 -1
- package/dist/react/Slider.d.ts +18 -0
- package/dist/react/Slider.js +27 -0
- package/dist/react/Slider.js.map +1 -0
- package/dist/react/Toast.js +14 -6
- package/dist/react/Toast.js.map +1 -1
- package/dist/react/ToolTip.d.ts +7 -0
- package/dist/react/ToolTip.js +43 -0
- package/dist/react/ToolTip.js.map +1 -0
- package/dist/react/TopBar.d.ts +6 -3
- package/dist/react/TopBar.js +48 -17
- package/dist/react/TopBar.js.map +1 -1
- package/dist/react/Tween.d.ts +7 -0
- package/dist/react/Tween.js +26 -0
- package/dist/react/Tween.js.map +1 -0
- package/dist/react/Tween.native.d.ts +6 -0
- package/dist/react/Tween.native.js +43 -0
- package/dist/react/Tween.native.js.map +1 -0
- package/dist/react/View3D.native.d.ts +4 -0
- package/dist/react/View3D.native.js +103 -0
- package/dist/react/View3D.native.js.map +1 -0
- package/dist/react/View3D.web.d.ts +4 -0
- package/dist/react/View3D.web.js +151 -0
- package/dist/react/View3D.web.js.map +1 -0
- package/dist/react/View3DHost.d.ts +143 -0
- package/dist/react/View3DHost.js +377 -0
- package/dist/react/View3DHost.js.map +1 -0
- package/dist/react/corners.d.ts +7 -0
- package/dist/react/corners.js +51 -0
- package/dist/react/corners.js.map +1 -0
- package/dist/react/easing.d.ts +15 -0
- package/dist/react/easing.js +10 -0
- package/dist/react/easing.js.map +1 -0
- package/dist/react/host.d.ts +7 -2
- package/dist/react/host.js +8 -3
- package/dist/react/host.js.map +1 -1
- package/dist/react/hostKeypad.d.ts +56 -0
- package/dist/react/hostKeypad.js +5 -0
- package/dist/react/hostKeypad.js.map +1 -0
- package/dist/react/motion.d.ts +77 -0
- package/dist/react/motion.js +173 -0
- package/dist/react/motion.js.map +1 -0
- package/dist/react/ports.js +90 -8
- package/dist/react/ports.js.map +1 -1
- package/dist/react/saving.d.ts +15 -0
- package/dist/react/saving.js +76 -0
- package/dist/react/saving.js.map +1 -0
- package/dist/react/store.d.ts +38 -1
- package/dist/react/store.js +31 -1
- package/dist/react/store.js.map +1 -1
- package/dist/react/theme.d.ts +10 -0
- package/dist/react/theme.js +8 -0
- package/dist/react/theme.js.map +1 -1
- package/dist/react/topRow.d.ts +22 -0
- package/dist/react/topRow.js +61 -0
- package/dist/react/topRow.js.map +1 -0
- package/dist/react/touch.d.ts +6 -0
- package/dist/react/touch.js +9 -0
- package/dist/react/touch.js.map +1 -0
- package/dist/render/ctx.d.ts +8 -0
- package/dist/render/draw.d.ts +33 -1
- package/dist/render/draw.js +593 -215
- package/dist/render/draw.js.map +1 -1
- package/dist/render/elevation.d.ts +65 -43
- package/dist/render/elevation.js +414 -140
- package/dist/render/elevation.js.map +1 -1
- package/dist/render/figmaIcons.d.ts +12 -0
- package/dist/render/figmaIcons.js +21 -0
- package/dist/render/figmaIcons.js.map +1 -0
- package/dist/render/hit.d.ts +22 -2
- package/dist/render/hit.js +168 -25
- package/dist/render/hit.js.map +1 -1
- package/dist/render/icons.js +69 -10
- package/dist/render/icons.js.map +1 -1
- package/dist/render/linkTile.d.ts +15 -0
- package/dist/render/linkTile.js +369 -0
- package/dist/render/linkTile.js.map +1 -0
- package/dist/render/markup.d.ts +11 -0
- package/dist/render/markup.js +112 -0
- package/dist/render/markup.js.map +1 -0
- package/dist/render/navigate.d.ts +88 -0
- package/dist/render/navigate.js +100 -0
- package/dist/render/navigate.js.map +1 -0
- package/dist/render/snap.d.ts +20 -1
- package/dist/render/snap.js +118 -25
- package/dist/render/snap.js.map +1 -1
- package/dist/render/squircle.d.ts +8 -0
- package/dist/render/squircle.js +71 -0
- package/dist/render/squircle.js.map +1 -0
- package/dist/render/view.d.ts +115 -2
- package/dist/render/view.js +244 -19
- package/dist/render/view.js.map +1 -1
- package/dist/skia/SkiaDrawCtx.d.ts +30 -2
- package/dist/skia/SkiaDrawCtx.js +198 -43
- package/dist/skia/SkiaDrawCtx.js.map +1 -1
- package/dist/skia/host.d.ts +18 -2
- package/dist/skia/host.js +46 -1
- package/dist/skia/host.js.map +1 -1
- package/dist/solver/equations.js +37 -2
- package/dist/solver/equations.js.map +1 -1
- package/dist/solver/gauss-newton.d.ts +17 -0
- package/dist/solver/gauss-newton.js +144 -36
- package/dist/solver/gauss-newton.js.map +1 -1
- package/dist/solver/linalg.d.ts +45 -2
- package/dist/solver/linalg.js +164 -10
- package/dist/solver/linalg.js.map +1 -1
- package/dist/solver/types.d.ts +5 -0
- package/dist/tools/annotate.d.ts +57 -1
- package/dist/tools/annotate.js +64 -43
- package/dist/tools/annotate.js.map +1 -1
- package/dist/tools/chamfer.d.ts +12 -0
- package/dist/tools/chamfer.js +114 -0
- package/dist/tools/chamfer.js.map +1 -0
- package/dist/tools/corner.d.ts +38 -0
- package/dist/tools/corner.js +99 -0
- package/dist/tools/corner.js.map +1 -0
- package/dist/tools/dim.d.ts +86 -9
- package/dist/tools/dim.js +581 -96
- package/dist/tools/dim.js.map +1 -1
- package/dist/tools/elevation.js +1 -1
- package/dist/tools/elevation.js.map +1 -1
- package/dist/tools/fillet.d.ts +9 -0
- package/dist/tools/fillet.js +86 -0
- package/dist/tools/fillet.js.map +1 -0
- package/dist/tools/freehand.d.ts +3 -2
- package/dist/tools/freehand.js +19 -12
- package/dist/tools/freehand.js.map +1 -1
- package/dist/tools/index.js +14 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/line.d.ts +8 -3
- package/dist/tools/line.js +66 -30
- package/dist/tools/line.js.map +1 -1
- package/dist/tools/modify.d.ts +13 -0
- package/dist/tools/modify.js +105 -25
- package/dist/tools/modify.js.map +1 -1
- package/dist/tools/openings.js +22 -15
- package/dist/tools/openings.js.map +1 -1
- package/dist/tools/registry.d.ts +8 -0
- package/dist/tools/registry.js +42 -2
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/select.d.ts +77 -3
- package/dist/tools/select.js +560 -74
- package/dist/tools/select.js.map +1 -1
- package/dist/tools/shapes.d.ts +14 -0
- package/dist/tools/shapes.js +154 -75
- package/dist/tools/shapes.js.map +1 -1
- package/dist/units/format.d.ts +10 -2
- package/dist/units/format.js +18 -3
- package/dist/units/format.js.map +1 -1
- package/dist/view3d/build.d.ts +35 -0
- package/dist/view3d/build.js +630 -0
- package/dist/view3d/build.js.map +1 -0
- package/dist/view3d/camera.d.ts +60 -0
- package/dist/view3d/camera.js +84 -0
- package/dist/view3d/camera.js.map +1 -0
- package/dist/view3d/fatLines.d.ts +11 -0
- package/dist/view3d/fatLines.js +83 -0
- package/dist/view3d/fatLines.js.map +1 -0
- package/dist/view3d/lines.d.ts +17 -0
- package/dist/view3d/lines.js +271 -0
- package/dist/view3d/lines.js.map +1 -0
- package/dist/view3d/mesh.d.ts +51 -0
- package/dist/view3d/mesh.js +101 -0
- package/dist/view3d/mesh.js.map +1 -0
- package/dist/view3d/poly.d.ts +16 -0
- package/dist/view3d/poly.js +109 -0
- package/dist/view3d/poly.js.map +1 -0
- package/dist/view3d/viewer.d.ts +86 -0
- package/dist/view3d/viewer.js +350 -0
- package/dist/view3d/viewer.js.map +1 -0
- package/package.json +15 -2
- package/src/app/edit.ts +83 -12
- package/src/app/main.ts +11 -5
- package/src/app/state.ts +38 -5
- package/src/data/memory.ts +2 -2
- package/src/data/provider.ts +15 -7
- package/src/data/sync.ts +87 -50
- package/src/editor/actions.ts +292 -83
- package/src/editor/confirm.ts +58 -0
- package/src/editor/elevation.ts +698 -478
- package/src/editor/face.ts +227 -0
- package/src/editor/files.ts +40 -4
- package/src/editor/gestures.ts +147 -31
- package/src/editor/keypad.ts +43 -11
- package/src/editor/keys.ts +25 -5
- package/src/editor/laser.ts +98 -20
- package/src/editor/linkActions.ts +194 -0
- package/src/editor/linkFollow.ts +43 -0
- package/src/editor/linkWrite.ts +77 -0
- package/src/editor/links.ts +181 -0
- package/src/editor/markup.ts +92 -8
- package/src/editor/mode.ts +83 -7
- package/src/editor/ports.ts +37 -6
- package/src/editor/project.ts +155 -26
- package/src/editor/selection.ts +54 -8
- package/src/editor/status.ts +2 -0
- package/src/editor/tooltips.ts +47 -0
- package/src/editor/view3d.ts +119 -0
- package/src/editor/view3dState.ts +61 -0
- package/src/export/dxf.ts +1 -1
- package/src/export/pdf.ts +15 -7
- package/src/export/plan.ts +119 -35
- package/src/index.ts +5 -0
- package/src/input/keyboard.ts +2 -4
- package/src/model/constraints.ts +13 -4
- package/src/model/demo.ts +3 -3
- package/src/model/elevation.ts +6 -16
- package/src/model/faces.ts +153 -0
- package/src/model/facesolve.ts +322 -0
- package/src/model/history.ts +19 -11
- package/src/model/images.ts +35 -0
- package/src/model/links.ts +77 -0
- package/src/model/markup.ts +80 -0
- package/src/model/measurement.ts +26 -0
- package/src/model/openings.ts +6 -0
- package/src/model/planGeom.ts +174 -8
- package/src/model/project.ts +3 -2
- package/src/model/projectfile.ts +2 -1
- package/src/model/rooms.ts +1 -1
- package/src/model/settings.ts +8 -2
- package/src/model/sketch.ts +101 -14
- package/src/model/smooth.ts +51 -0
- package/src/model/store.ts +35 -4
- package/src/model/types.ts +170 -8
- package/src/model/wallfaces.ts +126 -17
- package/src/model/wallshape.ts +97 -0
- package/src/react/BottomBar.tsx +263 -46
- package/src/react/Buttons.tsx +50 -9
- package/src/react/CadEditor.tsx +133 -30
- package/src/react/ConfirmSheet.tsx +38 -0
- package/src/react/ConflictSheet.tsx +19 -12
- package/src/react/Drawer.tsx +213 -110
- package/src/react/Duck.tsx +50 -0
- package/src/react/Empty3D.tsx +32 -0
- package/src/react/FitScroll.tsx +19 -0
- package/src/react/Icon.native.tsx +5 -0
- package/src/react/Icon.web.tsx +5 -0
- package/src/react/KeypadSheet.tsx +253 -60
- package/src/react/LaserTray.tsx +12 -8
- package/src/react/MarkupPanel.tsx +150 -0
- package/src/react/PageThumb.native.tsx +18 -7
- package/src/react/PageThumb.web.tsx +4 -4
- package/src/react/PlanCanvas.native.tsx +151 -34
- package/src/react/PlanCanvas.web.tsx +15 -5
- package/src/react/Popovers.tsx +116 -51
- package/src/react/Rail.tsx +360 -27
- package/src/react/ShapeMenu.tsx +66 -0
- package/src/react/Sheet.tsx +56 -11
- package/src/react/Slider.tsx +48 -0
- package/src/react/Toast.tsx +16 -9
- package/src/react/ToolTip.tsx +49 -0
- package/src/react/TopBar.tsx +97 -39
- package/src/react/Tween.native.tsx +36 -0
- package/src/react/Tween.tsx +24 -0
- package/src/react/View3D.native.tsx +131 -0
- package/src/react/View3D.web.tsx +131 -0
- package/src/react/View3DHost.ts +367 -0
- package/src/react/corners.ts +52 -0
- package/src/react/easing.ts +14 -0
- package/src/react/host.ts +8 -3
- package/src/react/hostKeypad.ts +66 -0
- package/src/react/motion.tsx +239 -0
- package/src/react/ports.ts +78 -9
- package/src/react/saving.ts +80 -0
- package/src/react/store.ts +35 -3
- package/src/react/theme.ts +8 -0
- package/src/react/topRow.ts +71 -0
- package/src/react/touch.ts +10 -0
- package/src/render/ctx.ts +8 -0
- package/src/render/draw.ts +437 -175
- package/src/render/elevation.ts +349 -143
- package/src/render/figmaIcons.ts +22 -0
- package/src/render/hit.ts +140 -21
- package/src/render/icons.ts +69 -10
- package/src/render/linkTile.ts +297 -0
- package/src/render/markup.ts +91 -0
- package/src/render/navigate.ts +114 -0
- package/src/render/snap.ts +105 -22
- package/src/render/squircle.ts +73 -0
- package/src/render/view.ts +255 -19
- package/src/skia/SkiaDrawCtx.ts +163 -41
- package/src/skia/host.ts +46 -1
- package/src/solver/equations.ts +37 -2
- package/src/solver/gauss-newton.ts +125 -28
- package/src/solver/linalg.ts +141 -5
- package/src/solver/types.ts +5 -0
- package/src/styles.css +91 -42
- package/src/tools/annotate.ts +58 -29
- package/src/tools/chamfer.ts +103 -0
- package/src/tools/corner.ts +99 -0
- package/src/tools/dim.ts +524 -92
- package/src/tools/elevation.ts +1 -1
- package/src/tools/fillet.ts +82 -0
- package/src/tools/freehand.ts +20 -16
- package/src/tools/index.ts +17 -4
- package/src/tools/line.ts +59 -23
- package/src/tools/modify.ts +86 -24
- package/src/tools/openings.ts +8 -13
- package/src/tools/registry.ts +27 -2
- package/src/tools/select.ts +424 -75
- package/src/tools/shapes.ts +119 -58
- package/src/ui/ctx.ts +2 -1
- package/src/ui/domPorts.ts +23 -4
- package/src/ui/drawer.ts +6 -26
- package/src/ui/elevation.ts +10 -101
- package/src/ui/keypad.ts +8 -14
- package/src/ui/laser.ts +2 -2
- package/src/ui/menu.ts +63 -17
- package/src/ui/noteinput.ts +3 -3
- package/src/ui/opacity.ts +108 -0
- package/src/ui/palette.ts +67 -12
- package/src/ui/rail.ts +21 -7
- package/src/ui/topbar.ts +4 -14
- package/src/units/format.ts +18 -3
- package/src/view3d/build.ts +607 -0
- package/src/view3d/camera.ts +113 -0
- package/src/view3d/fatLines.ts +83 -0
- package/src/view3d/lines.ts +258 -0
- package/src/view3d/mesh.ts +111 -0
- package/src/view3d/poly.ts +104 -0
- package/src/view3d/viewer.ts +348 -0
- package/dist/react/ElevCanvas.native.d.ts +0 -3
- package/dist/react/ElevCanvas.native.js +0 -58
- package/dist/react/ElevCanvas.native.js.map +0 -1
- package/dist/react/ElevCanvas.web.d.ts +0 -4
- package/dist/react/ElevCanvas.web.js +0 -44
- package/dist/react/ElevCanvas.web.js.map +0 -1
- package/dist/react/ElevationSheet.d.ts +0 -2
- package/dist/react/ElevationSheet.js +0 -38
- package/dist/react/ElevationSheet.js.map +0 -1
- package/dist/render/elevationView.d.ts +0 -3
- package/dist/render/elevationView.js +0 -100
- package/dist/render/elevationView.js.map +0 -1
- package/src/react/ElevCanvas.native.tsx +0 -68
- package/src/react/ElevCanvas.web.tsx +0 -42
- package/src/react/ElevationSheet.tsx +0 -88
- package/src/render/elevationView.ts +0 -73
package/dist/editor/keys.js
CHANGED
|
@@ -5,17 +5,30 @@ import { saveSoon } from '../model/store';
|
|
|
5
5
|
import { fitView, requestDraw } from '../render/view';
|
|
6
6
|
import { cancelTool, setTool, tools } from '../tools/registry';
|
|
7
7
|
import { applyCtxAction, deleteSelection } from './actions';
|
|
8
|
+
import { addLinks, linkPlusVisible, openSelectedLink, selectedLink } from './linkActions';
|
|
8
9
|
import { keys } from './gestures';
|
|
9
10
|
import { keypadApply, keypadDeleteLast, keypadInsert, keypadOpen } from './keypad';
|
|
10
|
-
import {
|
|
11
|
+
import { confirmCancel, confirmChoose, confirmOpen } from './confirm';
|
|
12
|
+
import { toggleConstr, toggleWalls } from './mode';
|
|
13
|
+
import { closeElevation, elevOpen, WALL_KEYS } from './elevation';
|
|
14
|
+
import { key3d } from './view3d';
|
|
15
|
+
import { is3d } from './view3dState';
|
|
11
16
|
import { closeKeypad, dismissConflict, dismissPopovers, refreshKeypad, saveNowPort, setCursor, toast, updateCtx, updateHint, } from './ports';
|
|
12
17
|
const TOOLKEYS = {
|
|
13
|
-
draft: { v: 'select', l: 'line', s: 'freehand',
|
|
14
|
-
annotate: { v: 'aselect', k: 'arrow', p: 'pen', n: 'text', q: 'cloud', j: 'calib' },
|
|
18
|
+
draft: { v: 'select', l: 'line', s: 'freehand', r: 'rect', c: 'circle', a: 'arc', d: 'dim', t: 'trim', o: 'offset', b: 'door', n: 'window', m: 'room' },
|
|
19
|
+
annotate: { v: 'aselect', l: 'mline', k: 'arrow', r: 'mrect', c: 'mcircle', p: 'pen', n: 'text', q: 'cloud', j: 'calib' },
|
|
15
20
|
};
|
|
16
21
|
const SHIFT_CONS = { H: 'h', V: 'v', P: 'par', R: 'perp', L: 'col', T: 'tan', E: 'eq', M: 'mid', O: 'online', F: 'lock' };
|
|
17
22
|
/** Handle a key press on the plan. Returns true when the key was used, so the host should stop its default action. */
|
|
18
23
|
export function keyDown(e) {
|
|
24
|
+
// a question up: Enter is its first choice, Escape closes it
|
|
25
|
+
if (confirmOpen()) {
|
|
26
|
+
if (e.key === 'Enter')
|
|
27
|
+
confirmChoose(0);
|
|
28
|
+
else if (e.key === 'Escape')
|
|
29
|
+
confirmCancel();
|
|
30
|
+
return !e.mod;
|
|
31
|
+
}
|
|
19
32
|
if (ed.readOnly) {
|
|
20
33
|
// view only: fit, and Space to pan
|
|
21
34
|
if (e.key === ' ' && !keys.spaceDown) {
|
|
@@ -67,6 +80,9 @@ export function keyDown(e) {
|
|
|
67
80
|
}
|
|
68
81
|
if (e.mod)
|
|
69
82
|
return false;
|
|
83
|
+
// (the 3D tab has no tools)
|
|
84
|
+
if (is3d())
|
|
85
|
+
return key3d(e);
|
|
70
86
|
const t = tools[ed.tool];
|
|
71
87
|
if (t && t.key && t.key(e))
|
|
72
88
|
return true;
|
|
@@ -86,6 +102,8 @@ export function keyDown(e) {
|
|
|
86
102
|
const home = ed.mode === 'draft' ? 'select' : 'aselect';
|
|
87
103
|
if (ed.tool !== home)
|
|
88
104
|
setTool(home);
|
|
105
|
+
else if (elevOpen())
|
|
106
|
+
closeElevation(); // the wall view: back to the plan
|
|
89
107
|
return false;
|
|
90
108
|
}
|
|
91
109
|
if (e.key === 'Delete' || e.key === 'Backspace') {
|
|
@@ -94,6 +112,15 @@ export function keyDown(e) {
|
|
|
94
112
|
deleteSelection();
|
|
95
113
|
return true;
|
|
96
114
|
}
|
|
115
|
+
// Annotate: + adds files and measurements (the + by the rail), Enter opens the selected link
|
|
116
|
+
if ((e.key === '+' || e.key === '=') && linkPlusVisible()) {
|
|
117
|
+
void addLinks();
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (e.key === 'Enter' && ed.mode === 'annotate' && selectedLink()) {
|
|
121
|
+
openSelectedLink();
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
97
124
|
if (e.shift) {
|
|
98
125
|
const c = SHIFT_CONS[e.key.toUpperCase()];
|
|
99
126
|
if (c && ed.mode === 'draft') {
|
|
@@ -118,7 +145,12 @@ export function keyDown(e) {
|
|
|
118
145
|
toast(ed.drawConstr ? 'Drawing construction lines' : 'Drawing regular lines');
|
|
119
146
|
return false;
|
|
120
147
|
}
|
|
121
|
-
|
|
148
|
+
if (k === 'w' && ed.mode === 'draft' && !elevOpen()) {
|
|
149
|
+
toggleWalls();
|
|
150
|
+
toast(ed.drawWalls ? 'Drawing walls' : 'Drawing lines');
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
const tk = (elevOpen() ? WALL_KEYS : TOOLKEYS[ed.mode])[k];
|
|
122
154
|
if (tk)
|
|
123
155
|
setTool(tk);
|
|
124
156
|
return false;
|
package/dist/editor/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/editor/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAa,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/editor/keys.ts"],"names":[],"mappings":"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"}
|
package/dist/editor/laser.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { type DimValueOpts } from '../tools/dim';
|
|
2
|
+
/** A reading, and the host's record of it (laserReading's `capture`), kept with it in the tray. */
|
|
1
3
|
export interface Reading {
|
|
2
4
|
id: string;
|
|
3
5
|
v: number;
|
|
6
|
+
capture?: unknown;
|
|
4
7
|
}
|
|
5
8
|
/** `external`: a real measure the host app is connected to (otherwise the harness's simulated one). */
|
|
6
9
|
export declare const laser: {
|
|
@@ -8,10 +11,23 @@ export declare const laser: {
|
|
|
8
11
|
external: boolean;
|
|
9
12
|
readings: Reading[];
|
|
10
13
|
};
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Set a line's length: edit its length dimension, or add a driving one. A wall's is measured on `side`, the edge picked
|
|
16
|
+
* — or, picked whole, where the + measures it (the side a space is on, else its centerline). `opts`: a measurement of
|
|
17
|
+
* the job it's linked to, the laser reading it's from (see setDimValue). Whether it took (false: refused, or asked).
|
|
18
|
+
*/
|
|
19
|
+
export declare function setLineLength(lid: string, v: number, side?: 1 | -1, opts?: DimValueOpts): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Set a circle's or arc's diameter: edit its diameter dimension (a fillet's radius, as the radius), or add a driving
|
|
22
|
+
* one. A curved wall's is measured across `side`, the edge picked — or, picked whole, where the + measures it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function setCurveDiameter(id: string, v: number, side?: 1 | -1, opts?: DimValueOpts): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* A reading arrived: into the keypad, onto the selected line or curve, or into the tray (newest first, at most 8).
|
|
27
|
+
* `capture` is the host's record of it (its device, its number), kept with the dimension it sets until that's saved
|
|
28
|
+
* to the group — or handed to the job with it, for one linked to a measurement there.
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyReading(v: number, capture?: unknown): void;
|
|
15
31
|
/**
|
|
16
32
|
* Use a reading from the tray: `dropOn` is the line it was dragged onto (null: dropped off any line); without it
|
|
17
33
|
* (a tap), it goes to the one selected line.
|
package/dist/editor/laser.js
CHANGED
|
@@ -3,44 +3,115 @@ import { ed } from '../app/state';
|
|
|
3
3
|
import { dropHistory, pushHistory } from '../model/history';
|
|
4
4
|
import { uid } from '../model/ids';
|
|
5
5
|
import { sessionState } from '../model/session';
|
|
6
|
+
import { measure } from '../model/constraints';
|
|
7
|
+
import { defaultFace, edgeLabel, edgeOf, wallOf } from '../model/planGeom';
|
|
6
8
|
import { lengthDimOf, lineLen } from '../model/sketch';
|
|
7
9
|
import { SK } from '../model/store';
|
|
8
|
-
import {
|
|
10
|
+
import { faceLength } from '../model/wallfaces';
|
|
11
|
+
import { V } from '../render/view';
|
|
12
|
+
import { LENGTH_SET_ALREADY, setDimValue } from '../tools/dim';
|
|
9
13
|
import { fmtLen } from '../units';
|
|
10
14
|
import { keypadTakeLaser } from './keypad';
|
|
11
15
|
import { refreshKeypad, refreshTray, toast } from './ports';
|
|
12
16
|
import { selInfo } from './selection';
|
|
13
17
|
/** `external`: a real measure the host app is connected to (otherwise the harness's simulated one). */
|
|
14
18
|
export const laser = sessionState(() => ({ on: false, external: false, readings: [] }));
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
/** What a new dimension takes from DimValueOpts: its link, and the reading it's from. */
|
|
20
|
+
const linkFields = (o) => ({ ...(o.link ? { measurementRef: o.link } : {}), ...(o.capture !== undefined && !o.link ? { capture: o.capture } : {}) });
|
|
21
|
+
/**
|
|
22
|
+
* Set a line's length: edit its length dimension, or add a driving one. A wall's is measured on `side`, the edge picked
|
|
23
|
+
* — or, picked whole, where the + measures it (the side a space is on, else its centerline). `opts`: a measurement of
|
|
24
|
+
* the job it's linked to, the laser reading it's from (see setDimValue). Whether it took (false: refused, or asked).
|
|
25
|
+
*/
|
|
26
|
+
export function setLineLength(lid, v, side, opts = {}) {
|
|
27
|
+
const sk = SK(), l = sk.lines[lid];
|
|
28
|
+
if (!l)
|
|
29
|
+
return false;
|
|
30
|
+
const wall = l.kind === 'wall' && !l.constr;
|
|
18
31
|
const ex = lengthDimOf(sk, lid);
|
|
19
|
-
if (ex)
|
|
20
|
-
setDimValue(ex, v);
|
|
21
|
-
|
|
32
|
+
if (ex)
|
|
33
|
+
return setDimValue(ex, v, wall && side ? { face: side } : undefined, opts);
|
|
34
|
+
const face = wall ? side ?? defaultFace(sk, lid, ed.wallTap?.id === lid ? ed.wallTap.side : undefined) : undefined;
|
|
35
|
+
pushHistory();
|
|
36
|
+
const r = tryAddConstraint({ type: 'dist', a: l.a, b: l.b, kind: 'al', value: v, line: lid, driving: true, off: face ? (face * 30) / V().s : 0, ...(face ? { face } : {}), ...linkFields(opts) });
|
|
37
|
+
// a measurement of the job drives a line, or nothing: not one whose length the drawing already sets
|
|
38
|
+
if (r.ok && r.ref && opts.link) {
|
|
39
|
+
delete sk.cons[r.id];
|
|
40
|
+
dropHistory();
|
|
41
|
+
toast(LENGTH_SET_ALREADY, { warn: true });
|
|
42
|
+
afterEdit();
|
|
43
|
+
return false;
|
|
22
44
|
}
|
|
23
|
-
|
|
45
|
+
if (!r.ok)
|
|
46
|
+
dropHistory();
|
|
47
|
+
afterEdit();
|
|
48
|
+
return r.ok;
|
|
49
|
+
}
|
|
50
|
+
/** A circle's or arc's diameter dimension (a fillet's radius), if it has one. */
|
|
51
|
+
const diamDimOf = (id) => { const sk = SK(); return Object.keys(sk.cons).find(k => sk.cons[k].type === 'diam' && sk.cons[k].c === id); };
|
|
52
|
+
/**
|
|
53
|
+
* Set a circle's or arc's diameter: edit its diameter dimension (a fillet's radius, as the radius), or add a driving
|
|
54
|
+
* one. A curved wall's is measured across `side`, the edge picked — or, picked whole, where the + measures it.
|
|
55
|
+
*/
|
|
56
|
+
export function setCurveDiameter(id, v, side, opts = {}) {
|
|
57
|
+
const sk = SK();
|
|
58
|
+
if (!sk.circles[id] && !sk.arcs[id])
|
|
59
|
+
return false;
|
|
60
|
+
const wall = !!wallOf(sk, id), ex = diamDimOf(id);
|
|
61
|
+
if (ex)
|
|
62
|
+
return setDimValue(ex, sk.cons[ex].rad ? v * 2 : v, wall && side ? { face: side } : undefined, opts);
|
|
63
|
+
const face = wall ? side ?? defaultFace(sk, id, ed.wallTap?.id === id ? ed.wallTap.side : undefined) : undefined;
|
|
24
64
|
pushHistory();
|
|
25
|
-
const r = tryAddConstraint({ type: '
|
|
65
|
+
const r = tryAddConstraint({ type: 'diam', c: id, value: v, driving: true, ...(face ? { face } : {}), ...linkFields(opts) });
|
|
26
66
|
if (!r.ok)
|
|
27
67
|
dropHistory();
|
|
28
68
|
afterEdit();
|
|
69
|
+
return r.ok;
|
|
70
|
+
}
|
|
71
|
+
/** What a reading goes on — a selected line, circle, arc or wall edge (or one it's dropped on): its id, and the edge's side. */
|
|
72
|
+
function readingTarget(id) {
|
|
73
|
+
const sk = SK();
|
|
74
|
+
return sk.lines[id] || sk.circles[id] || sk.arcs[id] ? [id] : edgeOf(id);
|
|
29
75
|
}
|
|
30
|
-
/** A reading
|
|
31
|
-
|
|
32
|
-
if (
|
|
76
|
+
/** A reading put on a line's (or straight wall's) length, or a circle's or arc's diameter. */
|
|
77
|
+
function setReading(id, v, side, capture) {
|
|
78
|
+
if (SK().lines[id])
|
|
79
|
+
setLineLength(id, v, side, { capture });
|
|
80
|
+
else
|
|
81
|
+
setCurveDiameter(id, v, side, { capture });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* What a reading was put on, as the toast says it: 'the selected line', 'the inside edge of the wall', 'the Kitchen
|
|
85
|
+
* side of the wall', 'the circle across its inner edge'.
|
|
86
|
+
*/
|
|
87
|
+
function appliedTo(id) {
|
|
88
|
+
const sk = SK(), l = sk.lines[id];
|
|
89
|
+
const kind = l ? (l.kind === 'wall' ? 'wall' : 'line') : sk.circles[id] ? 'circle' : 'arc';
|
|
90
|
+
const ex = l ? lengthDimOf(sk, id) : diamDimOf(id), face = ex ? sk.cons[ex].face : undefined;
|
|
91
|
+
if (!face)
|
|
92
|
+
return 'the selected ' + kind;
|
|
93
|
+
const e = edgeLabel(sk, id, face), lower = e.endsWith(' edge') ? e[0].toLowerCase() + e.slice(1) : e;
|
|
94
|
+
return l ? 'the ' + lower + ' of the ' + kind : 'the ' + kind + ' across its ' + lower;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A reading arrived: into the keypad, onto the selected line or curve, or into the tray (newest first, at most 8).
|
|
98
|
+
* `capture` is the host's record of it (its device, its number), kept with the dimension it sets until that's saved
|
|
99
|
+
* to the group — or handed to the job with it, for one linked to a measurement there.
|
|
100
|
+
*/
|
|
101
|
+
export function applyReading(v, capture) {
|
|
102
|
+
if (keypadTakeLaser(v, capture)) {
|
|
33
103
|
refreshKeypad();
|
|
34
104
|
return;
|
|
35
105
|
}
|
|
36
|
-
const s = selInfo()
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
106
|
+
const s = selInfo();
|
|
107
|
+
const one = s.n === 1 ? s.lines[0] ?? s.wfaces[0] ?? s.curves[0] : undefined;
|
|
108
|
+
if (ed.mode === 'draft' && one) {
|
|
109
|
+
const [id, side] = readingTarget(one);
|
|
110
|
+
setReading(id, v, side, capture);
|
|
111
|
+
toast('Laser ' + fmtLen(v) + ' applied to ' + appliedTo(id));
|
|
41
112
|
return;
|
|
42
113
|
}
|
|
43
|
-
laser.readings.unshift({ id: uid('m'), v });
|
|
114
|
+
laser.readings.unshift({ id: uid('m'), v, ...(capture !== undefined ? { capture } : {}) });
|
|
44
115
|
laser.readings = laser.readings.slice(0, 8);
|
|
45
116
|
refreshTray();
|
|
46
117
|
toast('Reading ' + fmtLen(v) + ' saved to the tray');
|
|
@@ -53,16 +124,22 @@ export function useTrayReading(id, dropOn) {
|
|
|
53
124
|
const r = laser.readings.find(x => x.id === id);
|
|
54
125
|
if (!r)
|
|
55
126
|
return;
|
|
127
|
+
// (a line's id, or a wall edge's)
|
|
56
128
|
let target = dropOn ?? null;
|
|
57
129
|
if (dropOn === undefined) {
|
|
58
130
|
const s = selInfo();
|
|
59
131
|
if (s.lines.length === 1)
|
|
60
132
|
target = s.lines[0];
|
|
133
|
+
else if (s.wfaces.length === 1)
|
|
134
|
+
target = s.wfaces[0];
|
|
135
|
+
else if (s.curves.length === 1)
|
|
136
|
+
target = s.curves[0];
|
|
61
137
|
else
|
|
62
|
-
toast('Select a line first, or drag the reading onto one.');
|
|
138
|
+
toast('Select a line first, or drag the reading onto one.', { warn: true });
|
|
63
139
|
}
|
|
64
140
|
if (target && ed.mode === 'draft') {
|
|
65
|
-
|
|
141
|
+
const [id, side] = readingTarget(target);
|
|
142
|
+
setReading(id, r.v, side, r.capture);
|
|
66
143
|
laser.readings = laser.readings.filter(x => x !== r);
|
|
67
144
|
refreshTray();
|
|
68
145
|
toast(fmtLen(r.v) + ' applied');
|
|
@@ -77,7 +154,7 @@ export function keypadLaserReading() {
|
|
|
77
154
|
return simulatedReading();
|
|
78
155
|
const r = laser.readings.shift();
|
|
79
156
|
if (!r) {
|
|
80
|
-
toast('Take a reading with the laser: it goes straight into this keypad.');
|
|
157
|
+
toast('Take a reading with the laser: it goes straight into this keypad.', { warn: true });
|
|
81
158
|
return null;
|
|
82
159
|
}
|
|
83
160
|
refreshTray();
|
|
@@ -89,6 +166,12 @@ export function simulatedReading() {
|
|
|
89
166
|
let base = 48 + Math.random() * 168;
|
|
90
167
|
if (s.lines.length === 1)
|
|
91
168
|
base = lineLen(sk, sk.lines[s.lines[0]]);
|
|
169
|
+
else if (s.wfaces.length === 1) {
|
|
170
|
+
const [id, side] = edgeOf(s.wfaces[0]);
|
|
171
|
+
base = sk.lines[id] ? faceLength(sk, id, side) : measure(sk, { type: 'diam', c: id, face: side });
|
|
172
|
+
}
|
|
173
|
+
else if (s.curves.length === 1)
|
|
174
|
+
base = measure(sk, { type: 'diam', c: s.curves[0] });
|
|
92
175
|
return Math.max(1, Math.round((base + (Math.random() - 0.5) * 2.2) * 16) / 16);
|
|
93
176
|
}
|
|
94
177
|
//# sourceMappingURL=laser.js.map
|
package/dist/editor/laser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"laser.js","sourceRoot":"","sources":["../../src/editor/laser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"laser.js","sourceRoot":"","sources":["../../src/editor/laser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { LinkTarget, Note } from '../model/types';
|
|
2
|
+
/** Whether the + shows: Annotate's plan (not the wall view or 3D), for someone who can edit, with a host that links. */
|
|
3
|
+
export declare const linkPlusVisible: () => boolean;
|
|
4
|
+
export declare const LINK_PLUS_LABEL = "Add a file";
|
|
5
|
+
/** The one selected tile, if a tile is all that's selected. */
|
|
6
|
+
export declare function selectedLink(): (Note & {
|
|
7
|
+
link: LinkTarget;
|
|
8
|
+
}) | null;
|
|
9
|
+
/** Whether a tile's target can be opened: it's there (as far as the host has said), and the host can open it. */
|
|
10
|
+
export declare function canOpenLink(t: LinkTarget): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* The +: the person picks from the job, and what they picked goes on the plan (one undo step) in the middle of the
|
|
13
|
+
* screen, side by side and in rows if there are many — moved down and across, all together, from tiles already there
|
|
14
|
+
* — all selected, with Select markup on.
|
|
15
|
+
*/
|
|
16
|
+
export declare function addLinks(): Promise<void>;
|
|
17
|
+
/** The size of the page's tiles, inches on the drawing (null: it has none). */
|
|
18
|
+
export declare function pageLinkSize(sk?: import("../core").Sketch): number | null;
|
|
19
|
+
/** Whether the Tile size slider shows: Annotate's plan, for someone who can edit, with a tile among what's selected. */
|
|
20
|
+
export declare function linkSizeVisible(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Size every tile on the page (inches, to the quarter, from LINK_MIN_IN to LINK_MAX_IN), drawn at once — for the slider
|
|
23
|
+
* as it moves. The caller makes the undo step before, and finishes the edit after.
|
|
24
|
+
*/
|
|
25
|
+
export declare function setLinkSize(inches: number): void;
|
|
26
|
+
/** The slider runs along a log scale (a few inches to many feet, each step as noticeable as the last): 0 to SIZE_STEPS. */
|
|
27
|
+
export declare const SIZE_STEPS = 1000;
|
|
28
|
+
export declare const sizeToStep: (inches: number) => number;
|
|
29
|
+
export declare const stepToSize: (step: number) => number;
|
|
30
|
+
/** A tile's leader on or off. On, it points out beside the tile (to the right, or the left near the screen's edge). */
|
|
31
|
+
export declare function toggleLeader(id: string): void;
|
|
32
|
+
/** Open what the selected tile is for. */
|
|
33
|
+
export declare function openSelectedLink(): void;
|
|
34
|
+
/** A view-only tap on the plan: on a link's tile, the person is asked, then what it's for opens. */
|
|
35
|
+
export declare function readOnlyTap(sx: number, sy: number, touch: boolean): void;
|
|
36
|
+
/** Let go of a dimension's link: its value stays, the drawing's alone now. */
|
|
37
|
+
export declare function unlinkDim(id: string): void;
|
|
38
|
+
/** Open the measurement a dimension is linked to. */
|
|
39
|
+
export declare function openDimLink(id: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Whether a dimension can be saved to the drawing's group: one of the drawing's own driving dimensions with a value,
|
|
42
|
+
* on the plan, with a host that can save one there.
|
|
43
|
+
*/
|
|
44
|
+
export declare function canSaveDim(id: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Save to group: the dimension becomes a measurement of the drawing's group (in its list, like any other — with the
|
|
47
|
+
* laser reading it's from, if one set it), and the dimension is linked to it from then on.
|
|
48
|
+
*/
|
|
49
|
+
export declare function saveDimToGroup(id: string): Promise<void>;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { afterEdit } from '../app/edit';
|
|
2
|
+
import { ed } from '../app/state';
|
|
3
|
+
import { clamp } from '../model/geom';
|
|
4
|
+
import { pushHistory } from '../model/history';
|
|
5
|
+
import { uid } from '../model/ids';
|
|
6
|
+
import { isLink, LINK_COLOR, LINK_MAX_IN, LINK_MIN_IN, LINK_TILE_PX, linkInfoOf, linkName, linkSide, linkSnapshot } from '../model/links';
|
|
7
|
+
import { dimMeasurement } from '../model/measurement';
|
|
8
|
+
import { linkAt } from '../render/hit';
|
|
9
|
+
import { askConfirm } from './confirm';
|
|
10
|
+
import { SK, store } from '../model/store';
|
|
11
|
+
import { cvs, linkBox, mainT, requestDraw, s2w } from '../render/view';
|
|
12
|
+
import { setTool } from '../tools/registry';
|
|
13
|
+
import { elevOpen } from './elevation';
|
|
14
|
+
import { is3d } from './view3dState';
|
|
15
|
+
import { canLink, linksHost, openLink, pickLinks } from './links';
|
|
16
|
+
import { toast } from './ports';
|
|
17
|
+
/*
|
|
18
|
+
Linking. In Annotate the + puts the job's files the person picks on the plan as tiles (selected, to move them where
|
|
19
|
+
they belong), and a selected tile is opened, or given a leader, from the bar. Measurements come into a drawing only
|
|
20
|
+
as the lengths of lines, from a line's length keypad in Draft (tools/dim.ts): a linked dimension is opened or let go
|
|
21
|
+
of from the bar, and one of the drawing's own driving dimensions is saved to the drawing's group as a measurement of
|
|
22
|
+
the job (Save to group), linked to it from then on.
|
|
23
|
+
*/
|
|
24
|
+
/** Whether the + shows: Annotate's plan (not the wall view or 3D), for someone who can edit, with a host that links. */
|
|
25
|
+
export const linkPlusVisible = () => !ed.readOnly && ed.mode === 'annotate' && !elevOpen() && !is3d() && canLink();
|
|
26
|
+
export const LINK_PLUS_LABEL = 'Add a file';
|
|
27
|
+
/** The one selected tile, if a tile is all that's selected. */
|
|
28
|
+
export function selectedLink() {
|
|
29
|
+
if (ed.sel.length !== 1 || ed.sel[0].type !== 'note')
|
|
30
|
+
return null;
|
|
31
|
+
const n = SK().notes.find(x => x.id === ed.sel[0].id);
|
|
32
|
+
return n && isLink(n) ? n : null;
|
|
33
|
+
}
|
|
34
|
+
/** Whether a tile's target can be opened: it's there (as far as the host has said), and the host can open it. */
|
|
35
|
+
export function canOpenLink(t) {
|
|
36
|
+
const info = linkInfoOf(t);
|
|
37
|
+
return info?.exists !== false && info?.canOpen !== false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The +: the person picks from the job, and what they picked goes on the plan (one undo step) in the middle of the
|
|
41
|
+
* screen, side by side and in rows if there are many — moved down and across, all together, from tiles already there
|
|
42
|
+
* — all selected, with Select markup on.
|
|
43
|
+
*/
|
|
44
|
+
export async function addLinks() {
|
|
45
|
+
if (!linkPlusVisible())
|
|
46
|
+
return;
|
|
47
|
+
const pageId = store.curPageId;
|
|
48
|
+
const picked = await pickLinks();
|
|
49
|
+
if (!picked.length)
|
|
50
|
+
return;
|
|
51
|
+
// (the person may have moved on meanwhile: another page, the other tab)
|
|
52
|
+
if (store.curPageId !== pageId || !linkPlusVisible()) {
|
|
53
|
+
toast('Nothing was added: the drawing changed while you were picking. Try again.', { warn: true });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// (the page's tiles are all one size: the first is placed at a comfortable size on the screen, the rest follow it)
|
|
57
|
+
const T = mainT(), sk = SK(), ts = pageLinkSize(sk) ?? Math.round(clamp(LINK_TILE_PX / T.s, LINK_MIN_IN, LINK_MAX_IN) * 4) / 4;
|
|
58
|
+
// each a tile and a gap from the next, as many to a row as fit the screen
|
|
59
|
+
const cell = ts + LINK_GAP_PX / T.s, step = 30 / T.s;
|
|
60
|
+
const cols = Math.max(1, Math.min(picked.length, Math.floor((cvs.W - 160) / (cell * T.s))));
|
|
61
|
+
const rows = Math.ceil(picked.length / cols), [cx, cy] = s2w(cvs.W / 2, cvs.H / 2);
|
|
62
|
+
const spots = picked.map((_, i) => [cx + ((i % cols) - (cols - 1) / 2) * cell, cy - (Math.floor(i / cols) - (rows - 1) / 2) * cell]);
|
|
63
|
+
const taken = (px, py) => sk.notes.some(n => n.type === 'link' && Math.abs((n.x ?? 0) - px) < step / 2 && Math.abs((n.y ?? 0) - py) < step / 2);
|
|
64
|
+
let k = 0;
|
|
65
|
+
while (k < 40 && spots.some(([x, y]) => taken(x + k * step, y - k * step)))
|
|
66
|
+
k++;
|
|
67
|
+
pushHistory();
|
|
68
|
+
const ids = picked.map((t, i) => {
|
|
69
|
+
const n = { id: uid('lk'), type: 'link', x: spots[i][0] + k * step, y: spots[i][1] - k * step, ts, color: LINK_COLOR, link: linkSnapshot(t) };
|
|
70
|
+
sk.notes.push(n);
|
|
71
|
+
return n.id;
|
|
72
|
+
});
|
|
73
|
+
setTool('aselect');
|
|
74
|
+
ed.sel = ids.map(id => ({ type: 'note', id }));
|
|
75
|
+
afterEdit();
|
|
76
|
+
}
|
|
77
|
+
/** The space between tiles added together, on the screen (points). */
|
|
78
|
+
const LINK_GAP_PX = 16;
|
|
79
|
+
/*
|
|
80
|
+
Every tile on a page is one size, on the drawing (so it zooms with the plan and prints at that size): the Tile size
|
|
81
|
+
slider above the bar, shown while a tile is selected, sizes them all together.
|
|
82
|
+
*/
|
|
83
|
+
/** The size of the page's tiles, inches on the drawing (null: it has none). */
|
|
84
|
+
export function pageLinkSize(sk = SK()) {
|
|
85
|
+
const n = sk.notes.find(isLink);
|
|
86
|
+
return n ? linkSide(n) : null;
|
|
87
|
+
}
|
|
88
|
+
/** Whether the Tile size slider shows: Annotate's plan, for someone who can edit, with a tile among what's selected. */
|
|
89
|
+
export function linkSizeVisible() {
|
|
90
|
+
if (ed.readOnly || ed.mode !== 'annotate' || elevOpen() || is3d() || !ed.sel.length)
|
|
91
|
+
return false;
|
|
92
|
+
const sk = SK();
|
|
93
|
+
return ed.sel.some(x => x.type === 'note' && sk.notes.find(n => n.id === x.id)?.type === 'link');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Size every tile on the page (inches, to the quarter, from LINK_MIN_IN to LINK_MAX_IN), drawn at once — for the slider
|
|
97
|
+
* as it moves. The caller makes the undo step before, and finishes the edit after.
|
|
98
|
+
*/
|
|
99
|
+
export function setLinkSize(inches) {
|
|
100
|
+
const v = Math.round(clamp(inches, LINK_MIN_IN, LINK_MAX_IN) * 4) / 4;
|
|
101
|
+
for (const n of SK().notes)
|
|
102
|
+
if (isLink(n))
|
|
103
|
+
n.ts = v;
|
|
104
|
+
requestDraw();
|
|
105
|
+
}
|
|
106
|
+
/** The slider runs along a log scale (a few inches to many feet, each step as noticeable as the last): 0 to SIZE_STEPS. */
|
|
107
|
+
export const SIZE_STEPS = 1000;
|
|
108
|
+
const LOG_MIN = Math.log(LINK_MIN_IN), LOG_SPAN = Math.log(LINK_MAX_IN) - LOG_MIN;
|
|
109
|
+
export const sizeToStep = (inches) => Math.round(((Math.log(clamp(inches, LINK_MIN_IN, LINK_MAX_IN)) - LOG_MIN) / LOG_SPAN) * SIZE_STEPS);
|
|
110
|
+
export const stepToSize = (step) => Math.exp(LOG_MIN + (clamp(step, 0, SIZE_STEPS) / SIZE_STEPS) * LOG_SPAN);
|
|
111
|
+
/** A tile's leader on or off. On, it points out beside the tile (to the right, or the left near the screen's edge). */
|
|
112
|
+
export function toggleLeader(id) {
|
|
113
|
+
const n = SK().notes.find(x => x.id === id);
|
|
114
|
+
if (!n || !isLink(n))
|
|
115
|
+
return;
|
|
116
|
+
pushHistory();
|
|
117
|
+
if (n.leader)
|
|
118
|
+
delete n.leader;
|
|
119
|
+
else {
|
|
120
|
+
const b = linkBox(mainT(), n), right = b.x + b.s + 80 < cvs.W - 24;
|
|
121
|
+
const [x, y] = s2w(right ? b.x + b.s + 70 : b.x - 70, b.cy + 50);
|
|
122
|
+
n.leader = [x, y];
|
|
123
|
+
}
|
|
124
|
+
afterEdit();
|
|
125
|
+
}
|
|
126
|
+
/** Open what the selected tile is for. */
|
|
127
|
+
export function openSelectedLink() {
|
|
128
|
+
const n = selectedLink();
|
|
129
|
+
if (!n)
|
|
130
|
+
return;
|
|
131
|
+
if (!canOpenLink(n.link)) {
|
|
132
|
+
toast(linkInfoOf(n.link)?.exists === false ? 'That’s been removed from the job, so it can’t be opened.' : 'That can’t be opened from here.', { warn: true });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
openLink(n.link);
|
|
136
|
+
}
|
|
137
|
+
/** A view-only tap on the plan: on a link's tile, the person is asked, then what it's for opens. */
|
|
138
|
+
export function readOnlyTap(sx, sy, touch) {
|
|
139
|
+
if (!ed.readOnly || !canLink())
|
|
140
|
+
return;
|
|
141
|
+
const n = linkAt(sx, sy, touch);
|
|
142
|
+
if (!n || !canOpenLink(n.link))
|
|
143
|
+
return;
|
|
144
|
+
const t = n.link, where = linkInfoOf(t)?.groupName ?? t.groupName;
|
|
145
|
+
askConfirm({
|
|
146
|
+
title: 'Open ' + linkName(t) + '?',
|
|
147
|
+
msg: where ? 'It’s in ' + where + '.' : undefined,
|
|
148
|
+
choices: [{ label: 'Open', run: () => openLink(t) }, { label: 'Cancel', run: () => { } }],
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/** Let go of a dimension's link: its value stays, the drawing's alone now. */
|
|
152
|
+
export function unlinkDim(id) {
|
|
153
|
+
const c = SK().cons[id];
|
|
154
|
+
if (!c?.measurementRef)
|
|
155
|
+
return;
|
|
156
|
+
pushHistory();
|
|
157
|
+
delete c.measurementRef;
|
|
158
|
+
afterEdit();
|
|
159
|
+
}
|
|
160
|
+
/** Open the measurement a dimension is linked to. */
|
|
161
|
+
export function openDimLink(id) {
|
|
162
|
+
const t = SK().cons[id]?.measurementRef;
|
|
163
|
+
if (!t)
|
|
164
|
+
return;
|
|
165
|
+
if (!canOpenLink(t)) {
|
|
166
|
+
toast(linkInfoOf(t)?.exists === false ? 'That measurement has been removed from the job, so it can’t be opened.' : 'That can’t be opened from here.', { warn: true });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
openLink(t);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Whether a dimension can be saved to the drawing's group: one of the drawing's own driving dimensions with a value,
|
|
173
|
+
* on the plan, with a host that can save one there.
|
|
174
|
+
*/
|
|
175
|
+
export function canSaveDim(id) {
|
|
176
|
+
const c = SK().cons[id], h = linksHost();
|
|
177
|
+
return !!c && !ed.readOnly && !elevOpen() && !!h?.saveMeasurement && h.canSave !== false && !c.measurementRef && !c.measurementId && !!dimMeasurement(c);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Save to group: the dimension becomes a measurement of the drawing's group (in its list, like any other — with the
|
|
181
|
+
* laser reading it's from, if one set it), and the dimension is linked to it from then on.
|
|
182
|
+
*/
|
|
183
|
+
export async function saveDimToGroup(id) {
|
|
184
|
+
const h = linksHost(), c = SK().cons[id];
|
|
185
|
+
if (!h || !c || !canSaveDim(id))
|
|
186
|
+
return;
|
|
187
|
+
const m = dimMeasurement(c), pageId = store.curPageId, was = JSON.stringify(c);
|
|
188
|
+
let t = null;
|
|
189
|
+
try {
|
|
190
|
+
t = await h.saveMeasurement({ kind: m.kind, value: m.value, ...(c.capture !== undefined ? { capture: c.capture } : {}) });
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
t = null;
|
|
194
|
+
}
|
|
195
|
+
if (!t) {
|
|
196
|
+
toast('It couldn’t be saved to the group. Check the connection and try again.', { warn: true });
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// (the drawing may have moved on meanwhile: the dimension's linked as it was saved, or not at all)
|
|
200
|
+
const cur = store.curPageId === pageId ? SK().cons[id] : undefined;
|
|
201
|
+
if (!cur || JSON.stringify(cur) !== was) {
|
|
202
|
+
toast('Saved to the group, but the dimension changed meanwhile, so it isn’t linked. To link it, select its line, tap +, and pick it under the keys.', { warn: true });
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
pushHistory();
|
|
206
|
+
cur.measurementRef = linkSnapshot(t);
|
|
207
|
+
delete cur.capture;
|
|
208
|
+
afterEdit();
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=linkActions.js.map
|