@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.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 +201 -460
- package/esm2022/index.mjs +28 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +60 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer.component.mjs +480 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +18 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +47 -83
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +27 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer.component.d.ts +201 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { PIXEL_WORLD_QUANTUM, snapToWorldGrid } from '../../../spatial/world-grid';
|
|
2
|
+
import { applyAffine } from '../../../region-overlay/svg-region-renderer';
|
|
3
|
+
/**
|
|
4
|
+
* The region overlay's coordinate spaces: pointer CLIENT pixels, svg-LOCAL pixels and WORLD
|
|
5
|
+
* units, through the viewer's own transforms (see {@link OverlayViewer}).
|
|
6
|
+
*
|
|
7
|
+
* World → svg-local is the viewer's camera affine (`canvasTransform`), which reads no layout, so
|
|
8
|
+
* drawing and following the camera read none. Only a pointer, in client pixels, needs the svg's
|
|
9
|
+
* client origin: read once per {@link withOrigin} block (a gesture event), as an uncached read
|
|
10
|
+
* per vertex — interleaved with the elements a redraw appends — forced a synchronous layout per
|
|
11
|
+
* vertex (review NAPARI-BOUNDARY-10).
|
|
12
|
+
*/
|
|
13
|
+
export class OverlayProjection {
|
|
14
|
+
constructor(svg, viewer) {
|
|
15
|
+
this.svg = svg;
|
|
16
|
+
this.viewer = viewer;
|
|
17
|
+
/**
|
|
18
|
+
* How finely a drawn vertex may be placed, in world units.
|
|
19
|
+
*
|
|
20
|
+
* One by default, because for an image the world IS pixels and a region should align to
|
|
21
|
+
* them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
|
|
22
|
+
* sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
|
|
23
|
+
* placeable positions and no ROI can be drawn at all.
|
|
24
|
+
*/
|
|
25
|
+
this.worldQuantum = PIXEL_WORLD_QUANTUM;
|
|
26
|
+
/** The svg's client origin and the camera affine, cached while a {@link withOrigin} block runs. */
|
|
27
|
+
this.origin = null;
|
|
28
|
+
this.camera = null;
|
|
29
|
+
/** {@link toLocal} as the shared region geometry takes it. */
|
|
30
|
+
this.toScreen = (x, y) => this.toLocal(x, y);
|
|
31
|
+
}
|
|
32
|
+
setWorldQuantum(quantum) {
|
|
33
|
+
this.worldQuantum = Number.isFinite(quantum) && quantum > 0 ? quantum : PIXEL_WORLD_QUANTUM;
|
|
34
|
+
}
|
|
35
|
+
/** Pointer client coords → world coords, snapped to the world quantum (for placing vertices). */
|
|
36
|
+
toImage(clientX, clientY) {
|
|
37
|
+
const [wx, wy] = this.viewer.canvasToWorld(clientX, clientY);
|
|
38
|
+
return [snapToWorldGrid(wx, this.worldQuantum), snapToWorldGrid(wy, this.worldQuantum)];
|
|
39
|
+
}
|
|
40
|
+
/** Pointer client coords → world coords, exact (for picking: snapping is for placing). */
|
|
41
|
+
toWorld(clientX, clientY) {
|
|
42
|
+
return this.viewer.canvasToWorld(clientX, clientY);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* World units spanned by one screen pixel, measured through the viewer's own transform.
|
|
46
|
+
*
|
|
47
|
+
* Read from the transform rather than from the camera, so it holds for both the 2D and
|
|
48
|
+
* the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
|
|
49
|
+
* if the transform gives nothing usable, which keeps the established pixel behaviour
|
|
50
|
+
* rather than collapsing the threshold to zero and recording a point per event.
|
|
51
|
+
*/
|
|
52
|
+
worldPerCanvasPixel() {
|
|
53
|
+
const [x0] = this.viewer.canvasToWorld(0, 0);
|
|
54
|
+
const [x1] = this.viewer.canvasToWorld(1, 0);
|
|
55
|
+
const per = Math.abs(x1 - x0);
|
|
56
|
+
return Number.isFinite(per) && per > 0 ? per : 1;
|
|
57
|
+
}
|
|
58
|
+
/** Run `fn` with the svg's client origin and the camera affine read once (nested calls reuse them). */
|
|
59
|
+
withOrigin(fn) {
|
|
60
|
+
if (this.origin)
|
|
61
|
+
return fn();
|
|
62
|
+
const r = this.svg.getBoundingClientRect();
|
|
63
|
+
this.origin = { left: r.left, top: r.top };
|
|
64
|
+
this.camera = this.viewer.canvasTransform();
|
|
65
|
+
try {
|
|
66
|
+
return fn();
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
this.origin = null;
|
|
70
|
+
this.camera = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Client px → SVG-local px. */
|
|
74
|
+
clientToLocal(clientX, clientY) {
|
|
75
|
+
const o = this.origin ?? this.svg.getBoundingClientRect();
|
|
76
|
+
return [clientX - o.left, clientY - o.top];
|
|
77
|
+
}
|
|
78
|
+
/** World coords → SVG-local px, through the camera affine: no layout read. */
|
|
79
|
+
toLocal(imgX, imgY) {
|
|
80
|
+
return applyAffine(this.affine(), imgX, imgY);
|
|
81
|
+
}
|
|
82
|
+
/** Screen distance (px) between a client point and a world point. */
|
|
83
|
+
screenDist(clientX, clientY, imgX, imgY) {
|
|
84
|
+
const [lx, ly] = this.toLocal(imgX, imgY);
|
|
85
|
+
const [px, py] = this.clientToLocal(clientX, clientY);
|
|
86
|
+
return Math.hypot(px - lx, py - ly);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The world → svg-local affine for the current camera: the viewer's `canvasTransform`, which
|
|
90
|
+
* reads no layout. The svg and the canvas share an origin (see {@link OverlayViewer}).
|
|
91
|
+
*/
|
|
92
|
+
affine() {
|
|
93
|
+
return this.camera ?? this.viewer.canvasTransform();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wcm9qZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL3JlZ2lvbi1vdmVybGF5L292ZXJsYXktcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsT0FBTyxFQUFVLFdBQVcsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBR2xGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFjNUIsWUFDbUIsR0FBa0IsRUFDbEIsTUFBcUI7UUFEckIsUUFBRyxHQUFILEdBQUcsQ0FBZTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBZnhDOzs7Ozs7O1dBT0c7UUFDSyxpQkFBWSxHQUFHLG1CQUFtQixDQUFDO1FBQzNDLG1HQUFtRztRQUMzRixXQUFNLEdBQXlDLElBQUksQ0FBQztRQUNwRCxXQUFNLEdBQWtCLElBQUksQ0FBQztRQThEckMsOERBQThEO1FBQ3JELGFBQVEsR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBMUR4RCxDQUFDO0lBRUosZUFBZSxDQUFDLE9BQWU7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFDOUYsQ0FBQztJQUVELGlHQUFpRztJQUNqRyxPQUFPLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDdEMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFB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QU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3RELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBJWEVMX1dPUkxEX1FVQU5UVU0sIHNuYXBUb1dvcmxkR3JpZCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvd29ybGQtZ3JpZCc7XG5pbXBvcnQgdHlwZSB7IFRvU2NyZWVuIH0gZnJvbSAnLi4vLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWdlb21ldHJ5JztcbmltcG9ydCB7IEFmZmluZSwgYXBwbHlBZmZpbmUgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9zdmctcmVnaW9uLXJlbmRlcmVyJztcbmltcG9ydCB0eXBlIHsgT3ZlcmxheVZpZXdlciB9IGZyb20gJy4uL25hcGFyaS1yZWdpb24tb3ZlcmxheSc7XG5cbi8qKlxuICogVGhlIHJlZ2lvbiBvdmVybGF5J3MgY29vcmRpbmF0ZSBzcGFjZXM6IHBvaW50ZXIgQ0xJRU5UIHBpeGVscywgc3ZnLUxPQ0FMIHBpeGVscyBhbmQgV09STERcbiAqIHVuaXRzLCB0aHJvdWdoIHRoZSB2aWV3ZXIncyBvd24gdHJhbnNmb3JtcyAoc2VlIHtAbGluayBPdmVybGF5Vmlld2VyfSkuXG4gKlxuICogV29ybGQg4oaSIHN2Zy1sb2NhbCBpcyB0aGUgdmlld2VyJ3MgY2FtZXJhIGFmZmluZSAoYGNhbnZhc1RyYW5zZm9ybWApLCB3aGljaCByZWFkcyBubyBsYXlvdXQsIHNvXG4gKiBkcmF3aW5nIGFuZCBmb2xsb3dpbmcgdGhlIGNhbWVyYSByZWFkIG5vbmUuIE9ubHkgYSBwb2ludGVyLCBpbiBjbGllbnQgcGl4ZWxzLCBuZWVkcyB0aGUgc3ZnJ3NcbiAqIGNsaWVudCBvcmlnaW46IHJlYWQgb25jZSBwZXIge0BsaW5rIHdpdGhPcmlnaW59IGJsb2NrIChhIGdlc3R1cmUgZXZlbnQpLCBhcyBhbiB1bmNhY2hlZCByZWFkXG4gKiBwZXIgdmVydGV4IOKAlCBpbnRlcmxlYXZlZCB3aXRoIHRoZSBlbGVtZW50cyBhIHJlZHJhdyBhcHBlbmRzIOKAlCBmb3JjZWQgYSBzeW5jaHJvbm91cyBsYXlvdXQgcGVyXG4gKiB2ZXJ0ZXggKHJldmlldyBOQVBBUkktQk9VTkRBUlktMTApLlxuICovXG5leHBvcnQgY2xhc3MgT3ZlcmxheVByb2plY3Rpb24ge1xuICAvKipcbiAgICogSG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLCBpbiB3b3JsZCB1bml0cy5cbiAgICpcbiAgICogT25lIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZm9yIGFuIGltYWdlIHRoZSB3b3JsZCBJUyBwaXhlbHMgYW5kIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0b1xuICAgKiB0aGVtLiBBIGRhdGFzZXQgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIG5vdCBwaXhlbHMgc2V0cyBpdCBmaW5lciDigJQgc2VxRklTSCdzIHdob2xlXG4gICAqIHNhbXBsZSBzcGFucyBhYm91dCA1IHggNyB1bml0cywgd2hlcmUgd2hvbGUtdW5pdCB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodFxuICAgKiBwbGFjZWFibGUgcG9zaXRpb25zIGFuZCBubyBST0kgY2FuIGJlIGRyYXduIGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgd29ybGRRdWFudHVtID0gUElYRUxfV09STERfUVVBTlRVTTtcbiAgLyoqIFRoZSBzdmcncyBjbGllbnQgb3JpZ2luIGFuZCB0aGUgY2FtZXJhIGFmZmluZSwgY2FjaGVkIHdoaWxlIGEge0BsaW5rIHdpdGhPcmlnaW59IGJsb2NrIHJ1bnMuICovXG4gIHByaXZhdGUgb3JpZ2luOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYTogQWZmaW5lIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IE92ZXJsYXlWaWV3ZXIsXG4gICkge31cblxuICBzZXRXb3JsZFF1YW50dW0ocXVhbnR1bTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy53b3JsZFF1YW50dW0gPSBOdW1iZXIuaXNGaW5pdGUocXVhbnR1bSkgJiYgcXVhbnR1bSA+IDAgPyBxdWFudHVtIDogUElYRUxfV09STERfUVVBTlRVTTtcbiAgfVxuXG4gIC8qKiBQb2ludGVyIGNsaWVudCBjb29yZHMg4oaSIHdvcmxkIGNvb3Jkcywgc25hcHBlZCB0byB0aGUgd29ybGQgcXVhbnR1bSAoZm9yIHBsYWNpbmcgdmVydGljZXMpLiAqL1xuICB0b0ltYWdlKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgW3d4LCB3eV0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybiBbc25hcFRvV29ybGRHcmlkKHd4LCB0aGlzLndvcmxkUXVhbnR1bSksIHNuYXBUb1dvcmxkR3JpZCh3eSwgdGhpcy53b3JsZFF1YW50dW0pXTtcbiAgfVxuXG4gIC8qKiBQb2ludGVyIGNsaWVudCBjb29yZHMg4oaSIHdvcmxkIGNvb3JkcywgZXhhY3QgKGZvciBwaWNraW5nOiBzbmFwcGluZyBpcyBmb3IgcGxhY2luZykuICovXG4gIHRvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXb3JsZCB1bml0cyBzcGFubmVkIGJ5IG9uZSBzY3JlZW4gcGl4ZWwsIG1lYXN1cmVkIHRocm91Z2ggdGhlIHZpZXdlcidzIG93biB0cmFuc2Zvcm0uXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgdHJhbnNmb3JtIHJhdGhlciB0aGFuIGZyb20gdGhlIGNhbWVyYSwgc28gaXQgaG9sZHMgZm9yIGJvdGggdGhlIDJEIGFuZFxuICAgKiB0aGUgM0Qgc2NyZWVuLXNwYWNlIGFkYXB0ZXJzIHdpdGhvdXQgZWl0aGVyIGhhdmluZyB0byBleHBvc2UgYSB6b29tLiBGYWxscyBiYWNrIHRvIDFcbiAgICogaWYgdGhlIHRyYW5zZm9ybSBnaXZlcyBub3RoaW5nIHVzYWJsZSwgd2hpY2gga2VlcHMgdGhlIGVzdGFibGlzaGVkIHBpeGVsIGJlaGF2aW91clxuICAgKiByYXRoZXIgdGhhbiBjb2xsYXBzaW5nIHRoZSB0aHJlc2hvbGQgdG8gemVybyBhbmQgcmVjb3JkaW5nIGEgcG9pbnQgcGVyIGV2ZW50LlxuICAgKi9cbiAgd29ybGRQZXJDYW52YXNQaXhlbCgpOiBudW1iZXIge1xuICAgIGNvbnN0IFt4MF0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKDAsIDApO1xuICAgIGNvbnN0IFt4MV0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKDEsIDApO1xuICAgIGNvbnN0IHBlciA9IE1hdGguYWJzKHgxIC0geDApO1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGVyKSAmJiBwZXIgPiAwID8gcGVyIDogMTtcbiAgfVxuXG4gIC8qKiBSdW4gYGZuYCB3aXRoIHRoZSBzdmcncyBjbGllbnQgb3JpZ2luIGFuZCB0aGUgY2FtZXJhIGFmZmluZSByZWFkIG9uY2UgKG5lc3RlZCBjYWxscyByZXVzZSB0aGVtKS4gKi9cbiAgd2l0aE9yaWdpbjxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgIGlmICh0aGlzLm9yaWdpbikgcmV0dXJuIGZuKCk7XG4gICAgY29uc3QgciA9IHRoaXMuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMub3JpZ2luID0geyBsZWZ0OiByLmxlZnQsIHRvcDogci50b3AgfTtcbiAgICB0aGlzLmNhbWVyYSA9IHRoaXMudmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vcmlnaW4gPSBudWxsO1xuICAgICAgdGhpcy5jYW1lcmEgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGllbnQgcHgg4oaSIFNWRy1sb2NhbCBweC4gKi9cbiAgY2xpZW50VG9Mb2NhbChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IG8gPSB0aGlzLm9yaWdpbiA/PyB0aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gW2NsaWVudFggLSBvLmxlZnQsIGNsaWVudFkgLSBvLnRvcF07XG4gIH1cblxuICAvKiogV29ybGQgY29vcmRzIOKGkiBTVkctbG9jYWwgcHgsIHRocm91Z2ggdGhlIGNhbWVyYSBhZmZpbmU6IG5vIGxheW91dCByZWFkLiAqL1xuICB0b0xvY2FsKGltZ1g6IG51bWJlciwgaW1nWTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGFwcGx5QWZmaW5lKHRoaXMuYWZmaW5lKCksIGltZ1gsIGltZ1kpO1xuICB9XG5cbiAgLyoqIHtAbGluayB0b0xvY2FsfSBhcyB0aGUgc2hhcmVkIHJlZ2lvbiBnZW9tZXRyeSB0YWtlcyBpdC4gKi9cbiAgcmVhZG9ubHkgdG9TY3JlZW46IFRvU2NyZWVuID0gKHgsIHkpID0+IHRoaXMudG9Mb2NhbCh4LCB5KTtcblxuICAvKiogU2NyZWVuIGRpc3RhbmNlIChweCkgYmV0d2VlbiBhIGNsaWVudCBwb2ludCBhbmQgYSB3b3JsZCBwb2ludC4gKi9cbiAgc2NyZWVuRGlzdChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlciwgaW1nWDogbnVtYmVyLCBpbWdZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IFtseCwgbHldID0gdGhpcy50b0xvY2FsKGltZ1gsIGltZ1kpO1xuICAgIGNvbnN0IFtweCwgcHldID0gdGhpcy5jbGllbnRUb0xvY2FsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybiBNYXRoLmh5cG90KHB4IC0gbHgsIHB5IC0gbHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCDihpIgc3ZnLWxvY2FsIGFmZmluZSBmb3IgdGhlIGN1cnJlbnQgY2FtZXJhOiB0aGUgdmlld2VyJ3MgYGNhbnZhc1RyYW5zZm9ybWAsIHdoaWNoXG4gICAqIHJlYWRzIG5vIGxheW91dC4gVGhlIHN2ZyBhbmQgdGhlIGNhbnZhcyBzaGFyZSBhbiBvcmlnaW4gKHNlZSB7QGxpbmsgT3ZlcmxheVZpZXdlcn0pLlxuICAgKi9cbiAgYWZmaW5lKCk6IEFmZmluZSB7XG4gICAgcmV0dXJuIHRoaXMuY2FtZXJhID8/IHRoaXMudmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Rectangle } from '../../../models/region';
|
|
2
|
+
/** Apply the drag of `edit` to the pointer at world point `(x, y)`, through the store's edit ops. */
|
|
3
|
+
export function applyRegionEdit(store, edit, x, y) {
|
|
4
|
+
switch (edit.kind) {
|
|
5
|
+
case 'body': {
|
|
6
|
+
const [lx, ly] = edit.last;
|
|
7
|
+
store.moveRegion(edit.id, x - lx, y - ly);
|
|
8
|
+
edit.last = [x, y];
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
case 'corner': {
|
|
12
|
+
const [ax, ay] = edit.anchor;
|
|
13
|
+
const rect = new Rectangle();
|
|
14
|
+
rect.x = Math.min(ax, x);
|
|
15
|
+
rect.y = Math.min(ay, y);
|
|
16
|
+
rect.width = Math.abs(x - ax);
|
|
17
|
+
rect.height = Math.abs(y - ay);
|
|
18
|
+
store.updateBounds(edit.id, rect);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
case 'vertex':
|
|
22
|
+
if (edit.ring < 0)
|
|
23
|
+
store.moveVertex(edit.id, edit.index, x, y);
|
|
24
|
+
else
|
|
25
|
+
store.moveHoleVertex(edit.id, edit.ring, edit.index, x, y);
|
|
26
|
+
return;
|
|
27
|
+
case 'bezier':
|
|
28
|
+
if (edit.ring < 0)
|
|
29
|
+
store.moveBezierHandle(edit.id, edit.index, edit.side, x, y);
|
|
30
|
+
else
|
|
31
|
+
store.moveHoleBezierHandle(edit.id, edit.ring, edit.index, edit.side, x, y);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBV25ELHFHQUFxRztBQUNyRyxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWtCLEVBQUUsSUFBZ0IsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN4RixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssUUFBUTtZQUNYLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Z0JBQzFELEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU87UUFDVCxLQUFLLFFBQVE7WUFDWCxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztnQkFDM0UsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLE9BQU87SUFDWCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVIaXQgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBBIGxpdmUgZHJhZyBvZiB0aGUgc2VsZWN0L21vdmUgdG9vbHM6IHRoZSByZWdpb24ncyBib2R5LCBvciBvbmUgb2YgaXRzIGhhbmRsZXMgYXMgdGhlXG4gKiBzaGFyZWQgYGhpdEhhbmRsZWAgbmFtZXMgaXQgKGEgcmVjdGFuZ2xlIGNvcm5lciB3aXRoIGl0cyBmaXhlZCBvcHBvc2l0ZSBgYW5jaG9yYCwgb3IgYVxuICogdmVydGV4IC8gYsOpemllciBjb250cm9sIHBvaW50IG9uIGByaW5nYCAtMSBmb3IgdGhlIGV4dGVyaW9yLCBlbHNlIGEgaG9sZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZ2lvbkVkaXQgPSB7IGlkOiBudW1iZXI7IGxhc3Q6IFtudW1iZXIsIG51bWJlcl0gfSAmICh7IGtpbmQ6ICdib2R5JyB9IHwgSGFuZGxlSGl0KTtcblxuLyoqIEFwcGx5IHRoZSBkcmFnIG9mIGBlZGl0YCB0byB0aGUgcG9pbnRlciBhdCB3b3JsZCBwb2ludCBgKHgsIHkpYCwgdGhyb3VnaCB0aGUgc3RvcmUncyBlZGl0IG9wcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVJlZ2lvbkVkaXQoc3RvcmU6IFJlZ2lvblN0b3JlLCBlZGl0OiBSZWdpb25FZGl0LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICBzd2l0Y2ggKGVkaXQua2luZCkge1xuICAgIGNhc2UgJ2JvZHknOiB7XG4gICAgICBjb25zdCBbbHgsIGx5XSA9IGVkaXQubGFzdDtcbiAgICAgIHN0b3JlLm1vdmVSZWdpb24oZWRpdC5pZCwgeCAtIGx4LCB5IC0gbHkpO1xuICAgICAgZWRpdC5sYXN0ID0gW3gsIHldO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYXNlICdjb3JuZXInOiB7XG4gICAgICBjb25zdCBbYXgsIGF5XSA9IGVkaXQuYW5jaG9yO1xuICAgICAgY29uc3QgcmVjdCA9IG5ldyBSZWN0YW5nbGUoKTtcbiAgICAgIHJlY3QueCA9IE1hdGgubWluKGF4LCB4KTtcbiAgICAgIHJlY3QueSA9IE1hdGgubWluKGF5LCB5KTtcbiAgICAgIHJlY3Qud2lkdGggPSBNYXRoLmFicyh4IC0gYXgpO1xuICAgICAgcmVjdC5oZWlnaHQgPSBNYXRoLmFicyh5IC0gYXkpO1xuICAgICAgc3RvcmUudXBkYXRlQm91bmRzKGVkaXQuaWQsIHJlY3QpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYXNlICd2ZXJ0ZXgnOlxuICAgICAgaWYgKGVkaXQucmluZyA8IDApIHN0b3JlLm1vdmVWZXJ0ZXgoZWRpdC5pZCwgZWRpdC5pbmRleCwgeCwgeSk7XG4gICAgICBlbHNlIHN0b3JlLm1vdmVIb2xlVmVydGV4KGVkaXQuaWQsIGVkaXQucmluZywgZWRpdC5pbmRleCwgeCwgeSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGlmIChlZGl0LnJpbmcgPCAwKSBzdG9yZS5tb3ZlQmV6aWVySGFuZGxlKGVkaXQuaWQsIGVkaXQuaW5kZXgsIGVkaXQuc2lkZSwgeCwgeSk7XG4gICAgICBlbHNlIHN0b3JlLm1vdmVIb2xlQmV6aWVySGFuZGxlKGVkaXQuaWQsIGVkaXQucmluZywgZWRpdC5pbmRleCwgZWRpdC5zaWRlLCB4LCB5KTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { Polygon, Rectangle } from '../../../models/region';
|
|
2
|
+
import { regionBBox, ringHandles, ringOf } from '../../../region-overlay/region-geometry';
|
|
3
|
+
import { SvgRegionRenderer, svgEl } from '../../../region-overlay/svg-region-renderer';
|
|
4
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
5
|
+
/** Rendered handle size (screen px). */
|
|
6
|
+
export const HANDLE_SIZE = 7;
|
|
7
|
+
/**
|
|
8
|
+
* What the napari region overlay draws, over the shared {@link SvgRegionRenderer}: the regions
|
|
9
|
+
* in world coordinates (styled from the store's colours, labelled when labels are on), and in
|
|
10
|
+
* screen space the selected regions' grab handles (corners, vertices, bézier control points),
|
|
11
|
+
* the draft being drawn and the rubber-band marquee.
|
|
12
|
+
*/
|
|
13
|
+
export class NapariRegionSvgRenderer {
|
|
14
|
+
constructor(svg, store) {
|
|
15
|
+
this.svg = svg;
|
|
16
|
+
this.store = store;
|
|
17
|
+
/** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
|
|
18
|
+
this.marqueeEl = null;
|
|
19
|
+
this.renderer = new SvgRegionRenderer(svg, {
|
|
20
|
+
rectElement: 'rect',
|
|
21
|
+
styleShape: (el, region, selected) => this.style(el, this.strokeOf(region), selected),
|
|
22
|
+
decorate: (region, _i, _selected, layer) => this.drawLabel(region, layer),
|
|
23
|
+
skip: (region) => !!region.isProfile?.(),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** Follow the camera: one transform attribute plus the screen-space elements. */
|
|
27
|
+
setCamera(affine) {
|
|
28
|
+
this.renderer.setCamera(affine);
|
|
29
|
+
}
|
|
30
|
+
/** Rebuild the regions (world space) and their labels. */
|
|
31
|
+
render(regions, selected) {
|
|
32
|
+
this.renderer.render(regions, selected);
|
|
33
|
+
}
|
|
34
|
+
/** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
|
|
35
|
+
renderOverlay(regions, selected, draft) {
|
|
36
|
+
this.renderer.renderOverlay((layer) => {
|
|
37
|
+
for (const i of selected) {
|
|
38
|
+
const region = regions[i];
|
|
39
|
+
if (region && !region.isProfile?.())
|
|
40
|
+
this.drawHandles(region, layer);
|
|
41
|
+
}
|
|
42
|
+
this.drawDraft(draft, layer);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Show the marquee over svg-local corners `(lx, ly)`–`(rx, ry)`, creating it on first use. */
|
|
46
|
+
showMarquee(lx, ly, rx, ry) {
|
|
47
|
+
if (!this.marqueeEl || !this.marqueeEl.parentNode) {
|
|
48
|
+
this.marqueeEl = document.createElementNS(SVG_NS, 'rect');
|
|
49
|
+
this.marqueeEl.setAttribute('stroke', '#4da3ff');
|
|
50
|
+
this.marqueeEl.setAttribute('stroke-width', '1');
|
|
51
|
+
this.marqueeEl.setAttribute('stroke-dasharray', '4 3');
|
|
52
|
+
this.marqueeEl.setAttribute('fill', '#4da3ff');
|
|
53
|
+
this.marqueeEl.setAttribute('fill-opacity', '0.12');
|
|
54
|
+
this.marqueeEl.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
55
|
+
this.svg.appendChild(this.marqueeEl);
|
|
56
|
+
}
|
|
57
|
+
this.marqueeEl.setAttribute('x', `${lx}`);
|
|
58
|
+
this.marqueeEl.setAttribute('y', `${ly}`);
|
|
59
|
+
this.marqueeEl.setAttribute('width', `${Math.abs(rx - lx)}`);
|
|
60
|
+
this.marqueeEl.setAttribute('height', `${Math.abs(ry - ly)}`);
|
|
61
|
+
}
|
|
62
|
+
/** Remove the marquee element from the SVG. */
|
|
63
|
+
clearMarquee() {
|
|
64
|
+
if (this.marqueeEl?.parentNode)
|
|
65
|
+
this.marqueeEl.parentNode.removeChild(this.marqueeEl);
|
|
66
|
+
this.marqueeEl = null;
|
|
67
|
+
}
|
|
68
|
+
/** A region's outline colour. */
|
|
69
|
+
strokeOf(region) {
|
|
70
|
+
return region.color || this.store.getShapeColor() || '#00ffff';
|
|
71
|
+
}
|
|
72
|
+
/** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
|
|
73
|
+
drawLabel(region, layer) {
|
|
74
|
+
if (!this.store.getShowShapeLabel() || region.isProfile?.())
|
|
75
|
+
return;
|
|
76
|
+
const label = region.label;
|
|
77
|
+
const bb = label ? regionBBox(region) : null;
|
|
78
|
+
if (!label || !bb)
|
|
79
|
+
return;
|
|
80
|
+
const text = svgEl('text');
|
|
81
|
+
text.setAttribute('fill', '#fff');
|
|
82
|
+
text.setAttribute('stroke', '#000');
|
|
83
|
+
text.setAttribute('stroke-width', '3');
|
|
84
|
+
text.setAttribute('paint-order', 'stroke');
|
|
85
|
+
text.setAttribute('font', '12px sans-serif');
|
|
86
|
+
text.setAttribute('pointer-events', 'none');
|
|
87
|
+
text.textContent = label;
|
|
88
|
+
layer.at(text, bb.x0, bb.y0, { dy: -4 });
|
|
89
|
+
}
|
|
90
|
+
/** Draw grab handles for a selected region: rectangle corners or polygon vertices. */
|
|
91
|
+
drawHandles(region, layer) {
|
|
92
|
+
const b = region.bounds;
|
|
93
|
+
if (!b)
|
|
94
|
+
return;
|
|
95
|
+
const stroke = this.strokeOf(region);
|
|
96
|
+
const handle = (imgX, imgY) => {
|
|
97
|
+
const el = svgEl('rect');
|
|
98
|
+
el.setAttribute('width', `${HANDLE_SIZE}`);
|
|
99
|
+
el.setAttribute('height', `${HANDLE_SIZE}`);
|
|
100
|
+
el.setAttribute('fill', '#fff');
|
|
101
|
+
el.setAttribute('stroke', stroke);
|
|
102
|
+
el.setAttribute('stroke-width', '1.5');
|
|
103
|
+
layer.at(el, imgX, imgY, { dx: -HANDLE_SIZE / 2, dy: -HANDLE_SIZE / 2 });
|
|
104
|
+
};
|
|
105
|
+
if (b instanceof Rectangle) {
|
|
106
|
+
handle(b.x, b.y);
|
|
107
|
+
handle(b.x + b.width, b.y);
|
|
108
|
+
handle(b.x, b.y + b.height);
|
|
109
|
+
handle(b.x + b.width, b.y + b.height);
|
|
110
|
+
}
|
|
111
|
+
else if (b instanceof Polygon) {
|
|
112
|
+
for (let i = 0; i < b.npoints; i++)
|
|
113
|
+
handle(b.xpoints[i], b.ypoints[i]);
|
|
114
|
+
for (const ring of b.holes ?? [])
|
|
115
|
+
for (const [hx, hy] of ring)
|
|
116
|
+
handle(hx, hy);
|
|
117
|
+
// Bezier regions also expose their tangent control points (circles) joined to the anchor
|
|
118
|
+
// by a thin line, matching the OSD overlay's editable bezier handles. Stored handles when
|
|
119
|
+
// present, else the Catmull-Rom default the curve is drawn with.
|
|
120
|
+
if (b.bezier) {
|
|
121
|
+
for (let ring = -1; ring < (b.holes?.length ?? 0); ring++) {
|
|
122
|
+
const { xs, ys } = ringOf(b, ring);
|
|
123
|
+
ringHandles(b, ring).forEach((h, i) => {
|
|
124
|
+
if (h.hasOut)
|
|
125
|
+
this.drawBezierHandle(xs[i], ys[i], h.out, stroke, layer);
|
|
126
|
+
if (h.hasIn)
|
|
127
|
+
this.drawBezierHandle(xs[i], ys[i], h.in, stroke, layer);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Draw one bezier control point as a small circle connected to its anchor by a tangent line.
|
|
134
|
+
* `handle` is the control point's absolute position in image space. */
|
|
135
|
+
drawBezierHandle(ax, ay, handle, stroke, layer) {
|
|
136
|
+
if (handle[0] === ax && handle[1] === ay)
|
|
137
|
+
return;
|
|
138
|
+
const line = layer.line(ax, ay, handle[0], handle[1]);
|
|
139
|
+
line.setAttribute('stroke', stroke);
|
|
140
|
+
line.setAttribute('stroke-width', '1');
|
|
141
|
+
line.setAttribute('stroke-opacity', '0.7');
|
|
142
|
+
const dot = svgEl('circle');
|
|
143
|
+
dot.setAttribute('r', `${HANDLE_SIZE / 2}`);
|
|
144
|
+
dot.setAttribute('fill', stroke);
|
|
145
|
+
dot.setAttribute('stroke', '#fff');
|
|
146
|
+
dot.setAttribute('stroke-width', '1');
|
|
147
|
+
layer.at(dot, handle[0], handle[1], { x: 'cx', y: 'cy' });
|
|
148
|
+
}
|
|
149
|
+
style(el, stroke, isSelected) {
|
|
150
|
+
el.setAttribute('stroke', stroke);
|
|
151
|
+
el.setAttribute('stroke-width', isSelected ? '4' : '2');
|
|
152
|
+
el.setAttribute('fill', isSelected ? stroke : 'none');
|
|
153
|
+
el.setAttribute('fill-opacity', isSelected ? '0.35' : '0');
|
|
154
|
+
}
|
|
155
|
+
/** Draw the in-progress rectangle / path preview. */
|
|
156
|
+
drawDraft(draft, layer) {
|
|
157
|
+
if (draft.rect) {
|
|
158
|
+
const { x0, y0, x1, y1 } = draft.rect;
|
|
159
|
+
const el = svgEl('rect');
|
|
160
|
+
layer.place(el, (e, project) => {
|
|
161
|
+
const [lx, ly] = project(Math.min(x0, x1), Math.min(y0, y1));
|
|
162
|
+
const [rx, ry] = project(Math.max(x0, x1), Math.max(y0, y1));
|
|
163
|
+
e.setAttribute('x', `${lx}`);
|
|
164
|
+
e.setAttribute('y', `${ly}`);
|
|
165
|
+
e.setAttribute('width', `${Math.abs(rx - lx)}`);
|
|
166
|
+
e.setAttribute('height', `${Math.abs(ry - ly)}`);
|
|
167
|
+
});
|
|
168
|
+
this.styleDraft(el);
|
|
169
|
+
}
|
|
170
|
+
if (draft.path && draft.path.length) {
|
|
171
|
+
this.styleDraft(layer.poly('polyline', draft.path.map(([x, y]) => ({ x, y }))));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
styleDraft(el) {
|
|
175
|
+
el.setAttribute('stroke', this.store.getShapeColor() || '#00ffff');
|
|
176
|
+
el.setAttribute('stroke-width', '2');
|
|
177
|
+
el.setAttribute('stroke-dasharray', '4 3');
|
|
178
|
+
el.setAttribute('fill', 'none');
|
|
179
|
+
el.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXN2Zy1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3ZnLXJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUYsT0FBTyxFQUF1QixpQkFBaUIsRUFBRSxLQUFLLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUU1RyxNQUFNLE1BQU0sR0FBRyw0QkFBNEIsQ0FBQztBQUM1Qyx3Q0FBd0M7QUFDeEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQWdCN0I7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBS2xDLFlBQ21CLEdBQWtCLEVBQ2xCLEtBQWtCO1FBRGxCLFFBQUcsR0FBSCxHQUFHLENBQWU7UUFDbEIsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUxyQyxnR0FBZ0c7UUFDeEYsY0FBUyxHQUEwQixJQUFJLENBQUM7UUFNOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUN6QyxXQUFXLEVBQUUsTUFBTTtZQUNuQixVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUM7WUFDckYsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FB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SUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FDYixLQUFLLENBQUMsSUFBSSxDQUNSLFVBQVUsRUFDVixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDdkMsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsRUFBYztRQUMvQixFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLEVBQUUsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2x5Z29uLCBSZWN0YW5nbGUsIFJlZ2lvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IHJlZ2lvbkJCb3gsIHJpbmdIYW5kbGVzLCByaW5nT2YgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnknO1xuaW1wb3J0IHsgQWZmaW5lLCBTY3JlZW5MYXllciwgU3ZnUmVnaW9uUmVuZGVyZXIsIHN2Z0VsIH0gZnJvbSAnLi4vLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5cbmNvbnN0IFNWR19OUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4vKiogUmVuZGVyZWQgaGFuZGxlIHNpemUgKHNjcmVlbiBweCkuICovXG5leHBvcnQgY29uc3QgSEFORExFX1NJWkUgPSA3O1xuXG4vKiogQW4gYXhpcy1hbGlnbmVkIGJveCBmcm9tIGEgZHJhZydzIHN0YXJ0IHRvIGl0cyBjdXJyZW50IHBvaW50IChhbnkgb3JkZXIpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcmFnQm94IHtcbiAgeDA6IG51bWJlcjtcbiAgeTA6IG51bWJlcjtcbiAgeDE6IG51bWJlcjtcbiAgeTE6IG51bWJlcjtcbn1cblxuLyoqIEEgcmVnaW9uIGJlaW5nIGRyYXduOiBhIHJlY3RhbmdsZSBkcmFnLCBvciBhIGZyZWVoYW5kIC8gY2xpY2stcGxhY2VkIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lvbkRyYWZ0IHtcbiAgcmVjdDogRHJhZ0JveCB8IG51bGw7XG4gIHBhdGg6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBuYXBhcmkgcmVnaW9uIG92ZXJsYXkgZHJhd3MsIG92ZXIgdGhlIHNoYXJlZCB7QGxpbmsgU3ZnUmVnaW9uUmVuZGVyZXJ9OiB0aGUgcmVnaW9uc1xuICogaW4gd29ybGQgY29vcmRpbmF0ZXMgKHN0eWxlZCBmcm9tIHRoZSBzdG9yZSdzIGNvbG91cnMsIGxhYmVsbGVkIHdoZW4gbGFiZWxzIGFyZSBvbiksIGFuZCBpblxuICogc2NyZWVuIHNwYWNlIHRoZSBzZWxlY3RlZCByZWdpb25zJyBncmFiIGhhbmRsZXMgKGNvcm5lcnMsIHZlcnRpY2VzLCBiw6l6aWVyIGNvbnRyb2wgcG9pbnRzKSxcbiAqIHRoZSBkcmFmdCBiZWluZyBkcmF3biBhbmQgdGhlIHJ1YmJlci1iYW5kIG1hcnF1ZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlSZWdpb25TdmdSZW5kZXJlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFN2Z1JlZ2lvblJlbmRlcmVyO1xuICAvKiogRGVkaWNhdGVkIG1hcnF1ZWUgcmVjdCBlbGVtZW50LCB1cGRhdGVkIGRpcmVjdGx5IGR1cmluZyB0aGUgZHJhZyAobm8gZnVsbCByZWdpb24gcmVkcmF3KS4gKi9cbiAgcHJpdmF0ZSBtYXJxdWVlRWw6IFNWR1JlY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZTogUmVnaW9uU3RvcmUsXG4gICkge1xuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgU3ZnUmVnaW9uUmVuZGVyZXIoc3ZnLCB7XG4gICAgICByZWN0RWxlbWVudDogJ3JlY3QnLFxuICAgICAgc3R5bGVTaGFwZTogKGVsLCByZWdpb24sIHNlbGVjdGVkKSA9PiB0aGlzLnN0eWxlKGVsLCB0aGlzLnN0cm9rZU9mKHJlZ2lvbiksIHNlbGVjdGVkKSxcbiAgICAgIGRlY29yYXRlOiAocmVnaW9uLCBfaSwgX3NlbGVjdGVkLCBsYXllcikgPT4gdGhpcy5kcmF3TGFiZWwocmVnaW9uLCBsYXllciksXG4gICAgICBza2lwOiAocmVnaW9uKSA9PiAhIXJlZ2lvbi5pc1Byb2ZpbGU/LigpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEZvbGxvdyB0aGUgY2FtZXJhOiBvbmUgdHJhbnNmb3JtIGF0dHJpYnV0ZSBwbHVzIHRoZSBzY3JlZW4tc3BhY2UgZWxlbWVudHMuICovXG4gIHNldENhbWVyYShhZmZpbmU6IEFmZmluZSk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2FtZXJhKGFmZmluZSk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgcmVnaW9ucyAod29ybGQgc3BhY2UpIGFuZCB0aGVpciBsYWJlbHMuICovXG4gIHJlbmRlcihyZWdpb25zOiByZWFkb25seSBSZWdpb25bXSwgc2VsZWN0ZWQ6IHJlYWRvbmx5IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIocmVnaW9ucywgc2VsZWN0ZWQpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHNjcmVlbi1zcGFjZSBvdmVybGF5IG9ubHk6IHRoZSBzZWxlY3RlZCByZWdpb25zJyBoYW5kbGVzIGFuZCB0aGUgZHJhZnQuICovXG4gIHJlbmRlck92ZXJsYXkocmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sIHNlbGVjdGVkOiByZWFkb25seSBudW1iZXJbXSwgZHJhZnQ6IFJlZ2lvbkRyYWZ0KTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXJPdmVybGF5KChsYXllcikgPT4ge1xuICAgICAgZm9yIChjb25zdCBpIG9mIHNlbGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlZ2lvbnNbaV07XG4gICAgICAgIGlmIChyZWdpb24gJiYgIXJlZ2lvbi5pc1Byb2ZpbGU/LigpKSB0aGlzLmRyYXdIYW5kbGVzKHJlZ2lvbiwgbGF5ZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5kcmF3RHJhZnQoZHJhZnQsIGxheWVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBtYXJxdWVlIG92ZXIgc3ZnLWxvY2FsIGNvcm5lcnMgYChseCwgbHkpYOKAk2AocngsIHJ5KWAsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gKi9cbiAgc2hvd01hcnF1ZWUobHg6IG51bWJlciwgbHk6IG51bWJlciwgcng6IG51bWJlciwgcnk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXJxdWVlRWwgfHwgIXRoaXMubWFycXVlZUVsLnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMubWFycXVlZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgJ3JlY3QnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJyM0ZGEzZmYnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzEnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsICc0IDMnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjNGRhM2ZmJyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjEyJyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3ZlY3Rvci1lZmZlY3QnLCAnbm9uLXNjYWxpbmctc3Ryb2tlJyk7XG4gICAgICB0aGlzLnN2Zy5hcHBlbmRDaGlsZCh0aGlzLm1hcnF1ZWVFbCk7XG4gICAgfVxuICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgneCcsIGAke2x4fWApO1xuICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgneScsIGAke2x5fWApO1xuICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtNYXRoLmFicyhyeCAtIGx4KX1gKTtcbiAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke01hdGguYWJzKHJ5IC0gbHkpfWApO1xuICB9XG5cbiAgLyoqIFJlbW92ZSB0aGUgbWFycXVlZSBlbGVtZW50IGZyb20gdGhlIFNWRy4gKi9cbiAgY2xlYXJNYXJxdWVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcnF1ZWVFbD8ucGFyZW50Tm9kZSkgdGhpcy5tYXJxdWVlRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1hcnF1ZWVFbCk7XG4gICAgdGhpcy5tYXJxdWVlRWwgPSBudWxsO1xuICB9XG5cbiAgLyoqIEEgcmVnaW9uJ3Mgb3V0bGluZSBjb2xvdXIuICovXG4gIHByaXZhdGUgc3Ryb2tlT2YocmVnaW9uOiBSZWdpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiByZWdpb24uY29sb3IgfHwgdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCkgfHwgJyMwMGZmZmYnO1xuICB9XG5cbiAgLyoqIERyYXcgYSByZWdpb24ncyBjbGFzc2lmaWNhdGlvbiBsYWJlbCBhdCBpdHMgdG9wLWxlZnQsIHdoZW4gbGFiZWxzIGFyZSBlbmFibGVkIChtYXRjaGVzIE9TRCkuICovXG4gIHByaXZhdGUgZHJhd0xhYmVsKHJlZ2lvbjogUmVnaW9uLCBsYXllcjogU2NyZWVuTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSB8fCByZWdpb24uaXNQcm9maWxlPy4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IGxhYmVsID0gcmVnaW9uLmxhYmVsO1xuICAgIGNvbnN0IGJiID0gbGFiZWwgPyByZWdpb25CQm94KHJlZ2lvbikgOiBudWxsO1xuICAgIGlmICghbGFiZWwgfHwgIWJiKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IHN2Z0VsKCd0ZXh0Jyk7XG4gICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2ZmZicpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnIzAwMCcpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMycpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdwYWludC1vcmRlcicsICdzdHJva2UnKTtcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgnZm9udCcsICcxMnB4IHNhbnMtc2VyaWYnKTtcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgIHRleHQudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICBsYXllci5hdCh0ZXh0LCBiYi54MCwgYmIueTAsIHsgZHk6IC00IH0pO1xuICB9XG5cbiAgLyoqIERyYXcgZ3JhYiBoYW5kbGVzIGZvciBhIHNlbGVjdGVkIHJlZ2lvbjogcmVjdGFuZ2xlIGNvcm5lcnMgb3IgcG9seWdvbiB2ZXJ0aWNlcy4gKi9cbiAgcHJpdmF0ZSBkcmF3SGFuZGxlcyhyZWdpb246IFJlZ2lvbiwgbGF5ZXI6IFNjcmVlbkxheWVyKTogdm9pZCB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgaWYgKCFiKSByZXR1cm47XG4gICAgY29uc3Qgc3Ryb2tlID0gdGhpcy5zdHJva2VPZihyZWdpb24pO1xuICAgIGNvbnN0IGhhbmRsZSA9IChpbWdYOiBudW1iZXIsIGltZ1k6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZWwgPSBzdmdFbCgncmVjdCcpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke0hBTkRMRV9TSVpFfWApO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtIQU5ETEVfU0laRX1gKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjZmZmJyk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0cm9rZSk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxLjUnKTtcbiAgICAgIGxheWVyLmF0KGVsLCBpbWdYLCBpbWdZLCB7IGR4OiAtSEFORExFX1NJWkUgLyAyLCBkeTogLUhBTkRMRV9TSVpFIC8gMiB9KTtcbiAgICB9O1xuICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICBoYW5kbGUoYi54LCBiLnkpO1xuICAgICAgaGFuZGxlKGIueCArIGIud2lkdGgsIGIueSk7XG4gICAgICBoYW5kbGUoYi54LCBiLnkgKyBiLmhlaWdodCk7XG4gICAgICBoYW5kbGUoYi54ICsgYi53aWR0aCwgYi55ICsgYi5oZWlnaHQpO1xuICAgIH0gZWxzZSBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24pIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYi5ucG9pbnRzOyBpKyspIGhhbmRsZShiLnhwb2ludHNbaV0sIGIueXBvaW50c1tpXSk7XG4gICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgYi5ob2xlcyA/PyBbXSkgZm9yIChjb25zdCBbaHgsIGh5XSBvZiByaW5nKSBoYW5kbGUoaHgsIGh5KTtcbiAgICAgIC8vIEJlemllciByZWdpb25zIGFsc28gZXhwb3NlIHRoZWlyIHRhbmdlbnQgY29udHJvbCBwb2ludHMgKGNpcmNsZXMpIGpvaW5lZCB0byB0aGUgYW5jaG9yXG4gICAgICAvLyBieSBhIHRoaW4gbGluZSwgbWF0Y2hpbmcgdGhlIE9TRCBvdmVybGF5J3MgZWRpdGFibGUgYmV6aWVyIGhhbmRsZXMuIFN0b3JlZCBoYW5kbGVzIHdoZW5cbiAgICAgIC8vIHByZXNlbnQsIGVsc2UgdGhlIENhdG11bGwtUm9tIGRlZmF1bHQgdGhlIGN1cnZlIGlzIGRyYXduIHdpdGguXG4gICAgICBpZiAoYi5iZXppZXIpIHtcbiAgICAgICAgZm9yIChsZXQgcmluZyA9IC0xOyByaW5nIDwgKGIuaG9sZXM/Lmxlbmd0aCA/PyAwKTsgcmluZysrKSB7XG4gICAgICAgICAgY29uc3QgeyB4cywgeXMgfSA9IHJpbmdPZihiLCByaW5nKTtcbiAgICAgICAgICByaW5nSGFuZGxlcyhiLCByaW5nKS5mb3JFYWNoKChoLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaC5oYXNPdXQpIHRoaXMuZHJhd0JlemllckhhbmRsZSh4c1tpXSwgeXNbaV0sIGgub3V0LCBzdHJva2UsIGxheWVyKTtcbiAgICAgICAgICAgIGlmIChoLmhhc0luKSB0aGlzLmRyYXdCZXppZXJIYW5kbGUoeHNbaV0sIHlzW2ldLCBoLmluLCBzdHJva2UsIGxheWVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBEcmF3IG9uZSBiZXppZXIgY29udHJvbCBwb2ludCBhcyBhIHNtYWxsIGNpcmNsZSBjb25uZWN0ZWQgdG8gaXRzIGFuY2hvciBieSBhIHRhbmdlbnQgbGluZS5cbiAgICogIGBoYW5kbGVgIGlzIHRoZSBjb250cm9sIHBvaW50J3MgYWJzb2x1dGUgcG9zaXRpb24gaW4gaW1hZ2Ugc3BhY2UuICovXG4gIHByaXZhdGUgZHJhd0JlemllckhhbmRsZShcbiAgICBheDogbnVtYmVyLFxuICAgIGF5OiBudW1iZXIsXG4gICAgaGFuZGxlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHN0cm9rZTogc3RyaW5nLFxuICAgIGxheWVyOiBTY3JlZW5MYXllcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGhhbmRsZVswXSA9PT0gYXggJiYgaGFuZGxlWzFdID09PSBheSkgcmV0dXJuO1xuICAgIGNvbnN0IGxpbmUgPSBsYXllci5saW5lKGF4LCBheSwgaGFuZGxlWzBdLCBoYW5kbGVbMV0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2UnLCBzdHJva2UpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMScpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utb3BhY2l0eScsICcwLjcnKTtcbiAgICBjb25zdCBkb3QgPSBzdmdFbCgnY2lyY2xlJyk7XG4gICAgZG90LnNldEF0dHJpYnV0ZSgncicsIGAke0hBTkRMRV9TSVpFIC8gMn1gKTtcbiAgICBkb3Quc2V0QXR0cmlidXRlKCdmaWxsJywgc3Ryb2tlKTtcbiAgICBkb3Quc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnI2ZmZicpO1xuICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxJyk7XG4gICAgbGF5ZXIuYXQoZG90LCBoYW5kbGVbMF0sIGhhbmRsZVsxXSwgeyB4OiAnY3gnLCB5OiAnY3knIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHlsZShlbDogU1ZHRWxlbWVudCwgc3Ryb2tlOiBzdHJpbmcsIGlzU2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0cm9rZSk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBpc1NlbGVjdGVkID8gJzQnIDogJzInKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBpc1NlbGVjdGVkID8gc3Ryb2tlIDogJ25vbmUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsIGlzU2VsZWN0ZWQgPyAnMC4zNScgOiAnMCcpO1xuICB9XG5cbiAgLyoqIERyYXcgdGhlIGluLXByb2dyZXNzIHJlY3RhbmdsZSAvIHBhdGggcHJldmlldy4gKi9cbiAgcHJpdmF0ZSBkcmF3RHJhZnQoZHJhZnQ6IFJlZ2lvbkRyYWZ0LCBsYXllcjogU2NyZWVuTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAoZHJhZnQucmVjdCkge1xuICAgICAgY29uc3QgeyB4MCwgeTAsIHgxLCB5MSB9ID0gZHJhZnQucmVjdDtcbiAgICAgIGNvbnN0IGVsID0gc3ZnRWwoJ3JlY3QnKTtcbiAgICAgIGxheWVyLnBsYWNlKGVsLCAoZSwgcHJvamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBbbHgsIGx5XSA9IHByb2plY3QoTWF0aC5taW4oeDAsIHgxKSwgTWF0aC5taW4oeTAsIHkxKSk7XG4gICAgICAgIGNvbnN0IFtyeCwgcnldID0gcHJvamVjdChNYXRoLm1heCh4MCwgeDEpLCBNYXRoLm1heCh5MCwgeTEpKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLCBgJHtseH1gKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3knLCBgJHtseX1gKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYCR7TWF0aC5hYnMocnggLSBseCl9YCk7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtNYXRoLmFicyhyeSAtIGx5KX1gKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdHlsZURyYWZ0KGVsKTtcbiAgICB9XG4gICAgaWYgKGRyYWZ0LnBhdGggJiYgZHJhZnQucGF0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3R5bGVEcmFmdChcbiAgICAgICAgbGF5ZXIucG9seShcbiAgICAgICAgICAncG9seWxpbmUnLFxuICAgICAgICAgIGRyYWZ0LnBhdGgubWFwKChbeCwgeV0pID0+ICh7IHgsIHkgfSkpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0eWxlRHJhZnQoZWw6IFNWR0VsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpIHx8ICcjMDBmZmZmJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMicpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsICc0IDMnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgndmVjdG9yLWVmZmVjdCcsICdub24tc2NhbGluZy1zdHJva2UnKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isCategoricalColumn } from '../../../contracts/spatial-dataset.contract';
|
|
2
|
+
import { cellTypeColumnFor } from '../../../spatial/lod';
|
|
3
|
+
/**
|
|
4
|
+
* The categorical columns the cells, the transcripts and the hover all read: the cell-type
|
|
5
|
+
* column's codes, and which of its groups the user switched off. A failed request rejects;
|
|
6
|
+
* the caller decides whether that fails its group of the plan or degrades to "no types".
|
|
7
|
+
*/
|
|
8
|
+
export class CategoricalLookup {
|
|
9
|
+
constructor(port) {
|
|
10
|
+
this.port = port;
|
|
11
|
+
}
|
|
12
|
+
/** Codes of the column `name`, or null when it is not categorical. */
|
|
13
|
+
async codes(name) {
|
|
14
|
+
const column = await this.port.getColumn(name);
|
|
15
|
+
return isCategoricalColumn(column) ? { codes: column.codes, meta: column.meta } : null;
|
|
16
|
+
}
|
|
17
|
+
/** Codes of the group column that are switched off, or null when none are. */
|
|
18
|
+
async hiddenCodes(dataset, view) {
|
|
19
|
+
if (!view.hiddenGroups.length)
|
|
20
|
+
return null;
|
|
21
|
+
const name = cellTypeColumnFor(dataset, view);
|
|
22
|
+
const col = name ? await this.codes(name) : null;
|
|
23
|
+
if (!col || col.meta.kind !== 'categorical')
|
|
24
|
+
return null;
|
|
25
|
+
const off = new Set(view.hiddenGroups);
|
|
26
|
+
const hidden = Uint8Array.from(col.meta.categories, (c) => (off.has(c) ? 1 : 0));
|
|
27
|
+
return { codes: col.codes, hidden };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcmljYWwtbG9va3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL3NwYXRpYWwtdGlsZXMvY2F0ZWdvcmljYWwtbG9va3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBaUMsbUJBQW1CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNqSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWN6RDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUE2QixJQUFxQjtRQUFyQixTQUFJLEdBQUosSUFBSSxDQUFpQjtJQUFHLENBQUM7SUFFdEQsc0VBQXNFO0lBQ3RFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBWTtRQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pGLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUF1QixFQUFFLElBQXNCO1FBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IFNwYXRpYWxDb2x1bW4sIFNwYXRpYWxEYXRhc2V0LCBpc0NhdGVnb3JpY2FsQ29sdW1uIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvbG9kJztcblxuLyoqIEEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgcGVyLW9ic2VydmF0aW9uIGNvZGVzIGFuZCBpdHMgbWV0YWRhdGEgKGNhdGVnb3JpZXMsIGNvbG91cnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbENvZGVzIHtcbiAgY29kZXM6IFVpbnQxNkFycmF5O1xuICBtZXRhOiBTcGF0aWFsQ29sdW1uWydtZXRhJ107XG59XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gZ3JvdXAgY29kZXMsIGFuZCB3aGljaCBjb2RlcyBhcmUgc3dpdGNoZWQgb2ZmICgxKSBpbiB0aGUgZ3JvdXAgbGlzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlkZGVuQ29kZXMge1xuICBjb2RlczogVWludDE2QXJyYXk7XG4gIGhpZGRlbjogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBUaGUgY2F0ZWdvcmljYWwgY29sdW1ucyB0aGUgY2VsbHMsIHRoZSB0cmFuc2NyaXB0cyBhbmQgdGhlIGhvdmVyIGFsbCByZWFkOiB0aGUgY2VsbC10eXBlXG4gKiBjb2x1bW4ncyBjb2RlcywgYW5kIHdoaWNoIG9mIGl0cyBncm91cHMgdGhlIHVzZXIgc3dpdGNoZWQgb2ZmLiBBIGZhaWxlZCByZXF1ZXN0IHJlamVjdHM7XG4gKiB0aGUgY2FsbGVyIGRlY2lkZXMgd2hldGhlciB0aGF0IGZhaWxzIGl0cyBncm91cCBvZiB0aGUgcGxhbiBvciBkZWdyYWRlcyB0byBcIm5vIHR5cGVzXCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbExvb2t1cCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcG9ydDogU3BhdGlhbERhdGFQb3J0KSB7fVxuXG4gIC8qKiBDb2RlcyBvZiB0aGUgY29sdW1uIGBuYW1lYCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5vdCBjYXRlZ29yaWNhbC4gKi9cbiAgYXN5bmMgY29kZXMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxDYXRlZ29yaWNhbENvZGVzIHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHRoaXMucG9ydC5nZXRDb2x1bW4obmFtZSk7XG4gICAgcmV0dXJuIGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSA/IHsgY29kZXM6IGNvbHVtbi5jb2RlcywgbWV0YTogY29sdW1uLm1ldGEgfSA6IG51bGw7XG4gIH1cblxuICAvKiogQ29kZXMgb2YgdGhlIGdyb3VwIGNvbHVtbiB0aGF0IGFyZSBzd2l0Y2hlZCBvZmYsIG9yIG51bGwgd2hlbiBub25lIGFyZS4gKi9cbiAgYXN5bmMgaGlkZGVuQ29kZXMoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPEhpZGRlbkNvZGVzIHwgbnVsbD4ge1xuICAgIGlmICghdmlldy5oaWRkZW5Hcm91cHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBuYW1lID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgY29uc3QgY29sID0gbmFtZSA/IGF3YWl0IHRoaXMuY29kZXMobmFtZSkgOiBudWxsO1xuICAgIGlmICghY29sIHx8IGNvbC5tZXRhLmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy5oaWRkZW5Hcm91cHMpO1xuICAgIGNvbnN0IGhpZGRlbiA9IFVpbnQ4QXJyYXkuZnJvbShjb2wubWV0YS5jYXRlZ29yaWVzLCAoYykgPT4gKG9mZi5oYXMoYykgPyAxIDogMCkpO1xuICAgIHJldHVybiB7IGNvZGVzOiBjb2wuY29kZXMsIGhpZGRlbiB9O1xuICB9XG59XG4iXX0=
|