@jax-data-science/sci-image-visualizer 0.8.3 → 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 +358 -4218
- 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 -34467
- 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 -883
- 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,58 @@
|
|
|
1
|
+
import { ChangeDetectorRef, DestroyRef, NgZone, OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import { IImageInfo } from '../contracts/image.contract';
|
|
3
|
+
import { IVisualizer } from '../contracts/visualizer.contract';
|
|
4
|
+
import { Region } from '../models/region';
|
|
5
|
+
import { FloatingPos } from '../visualizer/floating-drag.directive';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* The floating, draggable intensity-profile inset: shown while any intensity line
|
|
9
|
+
* exists, charting one trace per line as lines are added, moved or removed.
|
|
10
|
+
*
|
|
11
|
+
* Owns the profile and viewport-change subscriptions, the window-resize reflow, the
|
|
12
|
+
* drag and the per-instance chart div id it is given. The chart itself is drawn by the
|
|
13
|
+
* backend (`IVisualizer.renderIntensityInset`) so this never reaches a charting
|
|
14
|
+
* library. Fixed to the viewport, outside the plot div, so it is not clipped to the
|
|
15
|
+
* canvas.
|
|
16
|
+
*
|
|
17
|
+
* OnPush, with its view state in signals: the profile stream may fire outside the zone.
|
|
18
|
+
*/
|
|
19
|
+
export declare class IntensityInsetComponent implements OnInit, OnDestroy {
|
|
20
|
+
private readonly visualizer;
|
|
21
|
+
private readonly cdr;
|
|
22
|
+
private readonly zone;
|
|
23
|
+
private readonly destroyRef;
|
|
24
|
+
/** Id of the chart div — unique per viewer: the backend resolves it by id. */
|
|
25
|
+
divId: string;
|
|
26
|
+
/** Id of the viewer's plot div: the inset parks near its top-right corner. */
|
|
27
|
+
plotDivName: string;
|
|
28
|
+
/** The displayed slice, re-sampled at when the view settles. */
|
|
29
|
+
zIndex: number;
|
|
30
|
+
/** The Image view (OSD), whose line sampling is fed from preview frames. */
|
|
31
|
+
imageView: boolean;
|
|
32
|
+
/** The image shown (the Image view samples its lines from it). */
|
|
33
|
+
imageInfo: IImageInfo | undefined;
|
|
34
|
+
/** True whenever any intensity-profile line exists (whatever the plot type). */
|
|
35
|
+
protected readonly hasProfiles: import("@angular/core").WritableSignal<boolean>;
|
|
36
|
+
protected readonly pos: import("@angular/core").WritableSignal<FloatingPos>;
|
|
37
|
+
/** Where a header drag starts from. */
|
|
38
|
+
protected readonly dragOrigin: () => FloatingPos;
|
|
39
|
+
private profiles;
|
|
40
|
+
private readonly onResize;
|
|
41
|
+
constructor(visualizer: IVisualizer, cdr: ChangeDetectorRef, zone: NgZone, destroyRef: DestroyRef);
|
|
42
|
+
ngOnInit(): void;
|
|
43
|
+
/** Removes the window resize listener; the streams end through `takeUntilDestroyed`. */
|
|
44
|
+
ngOnDestroy(): void;
|
|
45
|
+
/** The canvas was resized: reflow the chart a tick later, once the panel has settled. */
|
|
46
|
+
reflow(): void;
|
|
47
|
+
/** A slice was committed: keep the lines sampled from it (Image view). */
|
|
48
|
+
sliceCommitted(z: number): void;
|
|
49
|
+
/**
|
|
50
|
+
* Add another line ROI (next bright colour) and select it on the active backend so
|
|
51
|
+
* it is ready to move or delete. The first line parks the inset near the plot's
|
|
52
|
+
* top-right. Resolves the new line, or null when no image extent is known yet.
|
|
53
|
+
*/
|
|
54
|
+
addProfileLine(): Promise<Region | null>;
|
|
55
|
+
private render;
|
|
56
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<IntensityInsetComponent, never>;
|
|
57
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<IntensityInsetComponent, "viz-intensity-inset", never, { "divId": { "alias": "divId"; "required": false; }; "plotDivName": { "alias": "plotDivName"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "imageView": { "alias": "imageView"; "required": false; }; "imageInfo": { "alias": "imageInfo"; "required": false; }; }, {}, never, never, true, never>;
|
|
58
|
+
}
|
package/lib/models/bezier.d.ts
CHANGED
|
@@ -52,8 +52,3 @@ export declare function resolveHandles(xs: number[], ys: number[], closed: boole
|
|
|
52
52
|
* closed ring returns to its first point.
|
|
53
53
|
*/
|
|
54
54
|
export declare function bezierCurveFromHandles(xs: number[], ys: number[], handles: AnchorHandle[], closed: boolean): CurvePoints;
|
|
55
|
-
/**
|
|
56
|
-
* Flatten the smooth Catmull-Rom bezier through the anchors (no custom handles).
|
|
57
|
-
* Falls back to the anchors when there are too few to form a curve.
|
|
58
|
-
*/
|
|
59
|
-
export declare function bezierCurve(xs: number[], ys: number[], closed: boolean): CurvePoints;
|
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* The `PresetSet` is the per-user, server-persisted source of truth for region colours;
|
|
6
6
|
* see `class-color.util.ts` for the deterministic colour-resolution engine.
|
|
7
7
|
*/
|
|
8
|
+
/** Where a preset class came from: added by the user, one of the built-in
|
|
9
|
+
* defaults, or auto-promoted from an unknown region label. */
|
|
8
10
|
export type PresetSource = 'user' | 'default' | 'auto';
|
|
11
|
+
/** One annotation class and its colour: regions whose `label` matches
|
|
12
|
+
* `name` (per the set's {@link MatchMode}) draw in `color` unless their colour
|
|
13
|
+
* was overridden by hand. */
|
|
9
14
|
export interface ClassPreset {
|
|
10
15
|
/** The class name — matched against `Region.label`. */
|
|
11
16
|
name: string;
|
|
@@ -16,7 +21,14 @@ export interface ClassPreset {
|
|
|
16
21
|
/** Provenance; `'auto'` = added by opt-in fallback promotion. */
|
|
17
22
|
source?: PresetSource;
|
|
18
23
|
}
|
|
24
|
+
/** How a region label is matched to a preset name: `'exact'` compares the
|
|
25
|
+
* strings as is; `'normalized'` trims and lower-cases both first. */
|
|
19
26
|
export type MatchMode = 'exact' | 'normalized';
|
|
27
|
+
/**
|
|
28
|
+
* The per-user class-colour configuration (server-persisted through the
|
|
29
|
+
* preferences port): the preset classes, the palette for labels outside them,
|
|
30
|
+
* and the matching rules. Resolved into region colours by `class-color.util.ts`.
|
|
31
|
+
*/
|
|
20
32
|
export interface PresetSet {
|
|
21
33
|
/** Ordered list of preset classes. */
|
|
22
34
|
classes: ClassPreset[];
|
|
@@ -37,3 +49,9 @@ export declare const DEFAULT_FALLBACK_PALETTE: string[];
|
|
|
37
49
|
export declare function defaultPresetSet(): PresetSet;
|
|
38
50
|
/** True when the set has no usable classes (e.g. the server returned an empty/blank record). */
|
|
39
51
|
export declare function isEmptyPresetSet(set: PresetSet | null | undefined): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Validate an untrusted value (e.g. an imported JSON file) as a preset set.
|
|
54
|
+
* Returns a clean copy — only well-formed `{ name, color }` classes, defaults
|
|
55
|
+
* for missing optional fields — or null when it has no usable classes.
|
|
56
|
+
*/
|
|
57
|
+
export declare function parsePresetSet(value: unknown): PresetSet | null;
|
package/lib/models/geometry.d.ts
CHANGED
|
@@ -1,66 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure
|
|
2
|
+
* Pure SVG-path helpers (build and parse a vertex ring as a Plotly path).
|
|
3
3
|
*
|
|
4
|
-
* No DOM access, no service state, no `this
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* share. If a helper grows a `this.shapes` reference, it doesn't belong here.
|
|
4
|
+
* No DOM access, no service state, no `this`. Mask and ring geometry (the
|
|
5
|
+
* rasterizer, mask set operations, point-in-ring, simplification, contour
|
|
6
|
+
* tracing) lives in `src/lib/geometry/`.
|
|
8
7
|
*/
|
|
9
|
-
/** A bbox-relative binary mask (1 = filled, 0 = empty). */
|
|
10
|
-
export interface BBoxMask {
|
|
11
|
-
bx: number;
|
|
12
|
-
by: number;
|
|
13
|
-
bw: number;
|
|
14
|
-
bh: number;
|
|
15
|
-
mask: Uint8Array;
|
|
16
|
-
}
|
|
17
8
|
/** Parsed single-subpath polygon vertices. */
|
|
18
9
|
export interface PolygonVertices {
|
|
19
10
|
xpoints: number[];
|
|
20
11
|
ypoints: number[];
|
|
21
12
|
}
|
|
22
13
|
/**
|
|
23
|
-
*
|
|
14
|
+
* Split a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays, plus
|
|
15
|
+
* whether it is closed (ends in `Z`). No validation: a coordinate that doesn't
|
|
16
|
+
* parse comes back as NaN. See {@link parseSvgPathPolygon} for the checked form.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseSvgPath(path: string): PolygonVertices & {
|
|
19
|
+
closed: boolean;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Parse a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays.
|
|
24
23
|
*
|
|
25
24
|
* Returns null for paths we can't safely round-trip (multi-subpath, curves,
|
|
26
|
-
* fewer than three vertices).
|
|
27
|
-
* that Plotly's drawclosedpath produces, both of which are single-subpath
|
|
28
|
-
* polygons.
|
|
25
|
+
* non-numeric coordinates, fewer than three vertices).
|
|
29
26
|
*/
|
|
30
27
|
export declare function parseSvgPathPolygon(path: string): PolygonVertices | null;
|
|
31
|
-
/**
|
|
32
|
-
* Build a closed SVG path string `M x,y L x,y L ... Z` from vertex arrays.
|
|
33
|
-
* Returns '' for fewer than three vertices (degenerate).
|
|
34
|
-
*/
|
|
35
|
-
export declare function polygonToSvgPath(xpoints: number[], ypoints: number[]): string;
|
|
36
28
|
/**
|
|
37
29
|
* Build an SVG path string from vertex arrays. Closed polygons end with `Z`,
|
|
38
30
|
* open polylines do not. Returns '' for fewer than two vertices (degenerate).
|
|
39
31
|
*/
|
|
40
32
|
export declare function verticesToSvgPath(xs: number[], ys: number[], closed: boolean): string;
|
|
41
|
-
/**
|
|
42
|
-
* Compare two Plotly shape objects for "same region" — used by the wand to
|
|
43
|
-
* avoid appending duplicates when the user pushes the same find result more
|
|
44
|
-
* than once. Polygons compare by SVG path string, rectangles compare by
|
|
45
|
-
* (x0, y0, x1, y1).
|
|
46
|
-
*/
|
|
47
|
-
export declare function shapesEqual(a: any, b: any): boolean;
|
|
48
|
-
/** Returns true if the two bbox-relative masks share at least one set pixel. */
|
|
49
|
-
export declare function masksOverlap(a: BBoxMask, b: BBoxMask): boolean;
|
|
50
|
-
/**
|
|
51
|
-
* Allocate a fresh accumulator covering both masks and OR them in. The
|
|
52
|
-
* resulting mask's bbox is the smallest rectangle containing both inputs.
|
|
53
|
-
*/
|
|
54
|
-
export declare function unionMasks(a: BBoxMask, b: BBoxMask): BBoxMask;
|
|
55
|
-
/**
|
|
56
|
-
* Simplify a closed ring with the Douglas–Peucker algorithm (jit-ui#85):
|
|
57
|
-
* drop every vertex that lies within `epsilon` pixels (the "altitude
|
|
58
|
-
* threshold") of the line between its kept neighbours. Anchored at vertex 0
|
|
59
|
-
* (the ring is closed by appending it). Rings of ≤ 3 vertices, or a
|
|
60
|
-
* non-positive epsilon, are returned unchanged. Output keeps the closed-ring
|
|
61
|
-
* convention (no repeated closing point).
|
|
62
|
-
*/
|
|
63
|
-
export declare function simplifyRing(xs: number[], ys: number[], epsilon: number): {
|
|
64
|
-
xs: number[];
|
|
65
|
-
ys: number[];
|
|
66
|
-
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy-on-write polygon edits (review RT-13, RegionStore split "polygon-edit").
|
|
3
|
+
*
|
|
4
|
+
* Every function takes a polygon and returns a NEW {@link Polygon} with the
|
|
5
|
+
* edit applied — or null when the edit does not apply (an index out of range,
|
|
6
|
+
* a vertex delete that would degenerate the ring, …), so a caller can skip its
|
|
7
|
+
* undo step. The input is never mutated: arrays the edit does not touch are
|
|
8
|
+
* shared with it (structural sharing), arrays it does touch are copied. That
|
|
9
|
+
* is what lets `RegionStore` keep shallow undo snapshots instead of deep
|
|
10
|
+
* clones: an instance in a snapshot is never changed after the fact.
|
|
11
|
+
*
|
|
12
|
+
* Pure: no DOM, no store. Coordinates are image pixels; bézier handle offsets
|
|
13
|
+
* are relative to their anchor, as on {@link Polygon}.
|
|
14
|
+
*/
|
|
15
|
+
import { MultiPolygon, Polygon, Rectangle } from './region';
|
|
16
|
+
/** Move exterior vertex `index` to (x, y). Null when `index` is out of range. */
|
|
17
|
+
export declare function moveVertex(p: Polygon, index: number, x: number, y: number): Polygon | null;
|
|
18
|
+
/**
|
|
19
|
+
* Insert a vertex at (x, y) after `segIndex` (the start vertex of the edge),
|
|
20
|
+
* clamped to the ring. A bézier polygon with stored handles gives the new
|
|
21
|
+
* vertex smooth handles from its neighbours and keeps the others' (possibly
|
|
22
|
+
* hand-edited) handles.
|
|
23
|
+
*/
|
|
24
|
+
export declare function addVertex(p: Polygon, segIndex: number, x: number, y: number): Polygon;
|
|
25
|
+
/**
|
|
26
|
+
* Delete exterior vertex `index`. Null when out of range, or when it would
|
|
27
|
+
* leave fewer than 3 vertices (2 for an open polyline).
|
|
28
|
+
*/
|
|
29
|
+
export declare function deleteVertex(p: Polygon, index: number): Polygon | null;
|
|
30
|
+
/** Move vertex `index` of hole `holeIndex` to (x, y). Null when either is out of range. */
|
|
31
|
+
export declare function moveHoleVertex(p: Polygon, holeIndex: number, index: number, x: number, y: number): Polygon | null;
|
|
32
|
+
/**
|
|
33
|
+
* Insert a vertex at (x, y) on hole `holeIndex`, after `segIndex`. A bézier
|
|
34
|
+
* polygon re-seeds its hole handles so they stay parallel to the rings. Null
|
|
35
|
+
* for an out-of-range hole.
|
|
36
|
+
*/
|
|
37
|
+
export declare function addHoleVertex(p: Polygon, holeIndex: number, segIndex: number, x: number, y: number): Polygon | null;
|
|
38
|
+
/**
|
|
39
|
+
* Delete vertex `index` of hole `holeIndex`. Taking a ring below 3 vertices
|
|
40
|
+
* drops the whole hole (it would bound no area). Null when out of range.
|
|
41
|
+
*/
|
|
42
|
+
export declare function deleteHoleVertex(p: Polygon, holeIndex: number, index: number): Polygon | null;
|
|
43
|
+
/**
|
|
44
|
+
* Per-hole bézier handles seeded from the Catmull-Rom default, parallel to
|
|
45
|
+
* `holes` (both undefined without holes).
|
|
46
|
+
*/
|
|
47
|
+
export declare function seededHoleHandles(holes: number[][][] | undefined): Pick<Polygon, 'holeHandlesIn' | 'holeHandlesOut'>;
|
|
48
|
+
/**
|
|
49
|
+
* Turn bézier on — seeding editable handles (holes included) from the smooth
|
|
50
|
+
* default — or off, dropping every handle. The anchors never move. Null when
|
|
51
|
+
* the polygon is already in that state.
|
|
52
|
+
*/
|
|
53
|
+
export declare function setBezier(p: Polygon, bezier: boolean): Polygon | null;
|
|
54
|
+
/**
|
|
55
|
+
* Move the `side` control point of exterior vertex `index` to the absolute
|
|
56
|
+
* point (x, y). Handles missing from a bézier polygon are seeded from the
|
|
57
|
+
* default first. Null for a non-bézier polygon or an out-of-range index.
|
|
58
|
+
*/
|
|
59
|
+
export declare function moveBezierHandle(p: Polygon, index: number, side: 'in' | 'out', x: number, y: number): Polygon | null;
|
|
60
|
+
/**
|
|
61
|
+
* Move the `side` control point of vertex `index` on hole `holeIndex` to the
|
|
62
|
+
* absolute point (x, y), seeding the hole handles first when missing. Null for
|
|
63
|
+
* a non-bézier polygon or an out-of-range hole/index.
|
|
64
|
+
*/
|
|
65
|
+
export declare function moveHoleBezierHandle(p: Polygon, holeIndex: number, index: number, side: 'in' | 'out', x: number, y: number): Polygon | null;
|
|
66
|
+
/**
|
|
67
|
+
* A polygon moved by (dx, dy): its vertices and holes (bézier offsets are
|
|
68
|
+
* relative, so they carry over). `round` snaps the moved coordinates.
|
|
69
|
+
*/
|
|
70
|
+
export declare function translatePolygon(p: Polygon, dx: number, dy: number, round?: (v: number) => number): Polygon;
|
|
71
|
+
/** Any region geometry moved by (dx, dy) (see {@link translatePolygon}). */
|
|
72
|
+
export declare function translateBounds(b: Rectangle | Polygon | MultiPolygon, dx: number, dy: number, round?: (v: number) => number): Rectangle | Polygon | MultiPolygon;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { MultiPolygon, Polygon, Rectangle, Region } from './region';
|
|
2
|
+
/**
|
|
3
|
+
* Polygon / Region construction and cloning in one place, so callers stop
|
|
4
|
+
* hand-filling `npoints`, `xpoints`, `ypoints`, `coordinates` and `closed`
|
|
5
|
+
* (three redundant views of one ring that every mutator must keep in sync).
|
|
6
|
+
*/
|
|
7
|
+
/** Options for {@link makePolygon}. */
|
|
8
|
+
export interface MakePolygonOptions {
|
|
9
|
+
/** false for an open polyline; default true. */
|
|
10
|
+
closed?: boolean;
|
|
11
|
+
/** Interior rings; omitted when absent or empty. */
|
|
12
|
+
holes?: number[][][];
|
|
13
|
+
bezier?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** A Polygon over the given vertex arrays (taken by reference). */
|
|
16
|
+
export declare function makePolygon(xs: number[], ys: number[], opts?: MakePolygonOptions): Polygon;
|
|
17
|
+
/** The four corners of a rectangle as a closed ring (clockwise from top-left). */
|
|
18
|
+
export declare function rectToRing(r: Pick<Rectangle, 'x' | 'y' | 'width' | 'height'>): {
|
|
19
|
+
xs: number[];
|
|
20
|
+
ys: number[];
|
|
21
|
+
};
|
|
22
|
+
/** A deep copy of a polygon: vertices, holes and every bézier handle. */
|
|
23
|
+
export declare function clonePolygon(p: Polygon): Polygon;
|
|
24
|
+
/** A deep copy of any region geometry. */
|
|
25
|
+
export declare function cloneBounds(bounds: Rectangle | Polygon | MultiPolygon): Rectangle | Polygon | MultiPolygon;
|
|
26
|
+
/**
|
|
27
|
+
* A copy of `existing` (id, name, label, colour, colour override, source,
|
|
28
|
+
* file name, kind, z, …) with new geometry and optional extra fields. Use it
|
|
29
|
+
* whenever a tool edits a region's shape, so the edit never drops metadata and
|
|
30
|
+
* never mutates the store's instance.
|
|
31
|
+
*/
|
|
32
|
+
export declare function replaceBounds(existing: Region, bounds: Region['bounds'], patch?: Partial<Region>): Region;
|
|
33
|
+
/**
|
|
34
|
+
* The closed polygons a region covers, for image-processing consumers (crop,
|
|
35
|
+
* segmentation requests): a rectangle's four corners, a closed polygon with its
|
|
36
|
+
* holes (a bézier region as its flattened curve), one polygon per part of a
|
|
37
|
+
* multi-polygon. Open polylines cover no area and yield nothing. Coordinates
|
|
38
|
+
* are rounded to whole pixels.
|
|
39
|
+
*/
|
|
40
|
+
export declare function regionPolygons(region: Region): Polygon[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Polygon, Region } from './region';
|
|
2
|
+
/**
|
|
3
|
+
* Copy-on-write region copies and geometry equality (RT-13). Stored regions
|
|
4
|
+
* are shared with the undo history, so a change is always a copy; these
|
|
5
|
+
* helpers return the input unchanged when the patch would not change it.
|
|
6
|
+
* (Deep geometry copies are `cloneBounds` / `clonePolygon` in `polygon-factory`.)
|
|
7
|
+
*/
|
|
8
|
+
/** A shallow copy of `r` with `patch` applied; `r` itself is never changed. */
|
|
9
|
+
export declare function withRegionPatch(r: Region, patch: Partial<Region>): Region;
|
|
10
|
+
/** `r` tagged with slice `z`: itself when it already is, else a copy. */
|
|
11
|
+
export declare function withRegionZ(r: Region, z: number): Region;
|
|
12
|
+
/**
|
|
13
|
+
* True when two regions have the same geometry: equal rectangles, or polygons
|
|
14
|
+
* (each part of a multi-polygon, in order) with the same vertices, open/closed
|
|
15
|
+
* state and holes. Bézier handles, labels and colours are not compared. Mixed
|
|
16
|
+
* kinds are never equal.
|
|
17
|
+
*/
|
|
18
|
+
export declare function regionsEqual(a: Region, b: Region): boolean;
|
|
19
|
+
/** Same vertices, open/closed state and holes (see {@link regionsEqual}). */
|
|
20
|
+
export declare function polygonsEqual(pa: Polygon, pb: Polygon): boolean;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Region } from './region';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a GeoJSON FeatureCollection string (QuPath-compatible) into regions.
|
|
4
|
+
* Throws on invalid JSON, a missing `features` key, or a feature without
|
|
5
|
+
* coordinates.
|
|
6
|
+
*/
|
|
7
|
+
export declare function regionsFromGeoJson(geoJsonStr: string): Region[];
|
|
8
|
+
/**
|
|
9
|
+
* Serialise regions as a GeoJSON FeatureCollection string (QuPath-compatible),
|
|
10
|
+
* leaving out intensity-profile lines.
|
|
11
|
+
*/
|
|
12
|
+
export declare function regionsToGeoJson(rois: readonly Region[]): string;
|
|
13
|
+
/**
|
|
14
|
+
* Download a GeoJSON string as `<baseName without extension>.geojson`
|
|
15
|
+
* (`rois.geojson` without a base name).
|
|
16
|
+
*/
|
|
17
|
+
export declare function downloadGeoJson(jsonString: string, baseName?: string): void;
|
package/lib/models/region.d.ts
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { ShapeSelection } from './shape';
|
|
2
|
+
/**
|
|
3
|
+
* One annotation region — the backend-neutral model every renderer (Plotly,
|
|
4
|
+
* OpenSeadragon, napari-js), the RegionStore, the Region Editor and the
|
|
5
|
+
* GeoJSON/QuPath import/export share.
|
|
6
|
+
*
|
|
7
|
+
* Geometry lives in {@link bounds}, in full-resolution image-pixel
|
|
8
|
+
* coordinates (x right, y down) of slice {@link z}. A region with no bounds
|
|
9
|
+
* (`null`/absent) is kept but draws nowhere. Regions that arrive as JSON are
|
|
10
|
+
* rebuilt into class instances by {@link hydrateBounds} on their way into the
|
|
11
|
+
* store, so `bounds instanceof Rectangle` etc. can be relied on downstream.
|
|
12
|
+
*/
|
|
2
13
|
export declare class Region {
|
|
3
|
-
/** Stable, unique identity for selection and equality. Minted by
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
14
|
+
/** Stable, unique identity for selection and equality. Minted by the
|
|
15
|
+
* RegionStore when a region first enters it. Never derived from array
|
|
16
|
+
* index — name collisions across delete/add cycles must not break PrimeNG
|
|
17
|
+
* row selection. */
|
|
7
18
|
id: number;
|
|
8
19
|
name: string;
|
|
9
20
|
bounds?: Rectangle | Polygon | MultiPolygon | null;
|
|
@@ -37,6 +48,7 @@ export declare class Region {
|
|
|
37
48
|
* or a region drawn without a slice context (jit-ui#93). */
|
|
38
49
|
z: number;
|
|
39
50
|
shapeColor?: string | undefined;
|
|
51
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
40
52
|
bytesPerPixel: number;
|
|
41
53
|
/**
|
|
42
54
|
* resolution is the resolution at which the region
|
|
@@ -49,13 +61,19 @@ export declare class Region {
|
|
|
49
61
|
* at resolution = 0
|
|
50
62
|
*/
|
|
51
63
|
resolution: number;
|
|
64
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
52
65
|
cropped: boolean;
|
|
66
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
53
67
|
tileNumber: number;
|
|
54
68
|
tileCoordinates: number[] | null;
|
|
55
69
|
/** True for intensity-profile line ROIs (the intensity tool's lines). These are
|
|
56
70
|
* NOT annotation regions: they never appear in the Region Editor and editor
|
|
57
71
|
* operations (select/save/delete) must never touch them. */
|
|
58
72
|
isProfile(): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* A debug string: the rectangle's box, or the polygon's SVG path.
|
|
75
|
+
* @deprecated Unused by the library; will be removed in the next minor release.
|
|
76
|
+
*/
|
|
59
77
|
toString(): string;
|
|
60
78
|
/**
|
|
61
79
|
* Returns a ShapeSelection object that can be used to
|
|
@@ -67,12 +85,23 @@ export declare class Region {
|
|
|
67
85
|
isRectangle(bnds: any): bnds is Rectangle;
|
|
68
86
|
isPolygon(bnds: any): bnds is Polygon;
|
|
69
87
|
}
|
|
88
|
+
/** An axis-aligned box in image-pixel coordinates: (`x`, `y`) is the top-left
|
|
89
|
+
* (minimum) corner, `width`/`height` extend right/down. */
|
|
70
90
|
export declare class Rectangle {
|
|
71
91
|
x: number;
|
|
72
92
|
y: number;
|
|
73
93
|
width: number;
|
|
74
94
|
height: number;
|
|
75
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* A polygon or open polyline in image-pixel coordinates, optionally with holes
|
|
98
|
+
* and smoothed into a bézier curve.
|
|
99
|
+
*
|
|
100
|
+
* The vertices are stored twice and must agree: as the parallel `xpoints` /
|
|
101
|
+
* `ypoints` arrays (length `npoints`; the Java/JIT wire shape) and as
|
|
102
|
+
* `coordinates` `[x, y]` pairs (what GeoJSON export reads). The ring is
|
|
103
|
+
* implicitly closed — the first vertex is not repeated at the end.
|
|
104
|
+
*/
|
|
76
105
|
export declare class Polygon {
|
|
77
106
|
npoints: number;
|
|
78
107
|
xpoints: number[];
|
|
@@ -132,6 +161,13 @@ export declare class MultiPolygon {
|
|
|
132
161
|
/** One or more disjoint closed polygons (each may have holes). */
|
|
133
162
|
polygons: Polygon[];
|
|
134
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* A region's geometry as a host may supply it: a {@link Rectangle} or
|
|
166
|
+
* {@link Polygon} instance, or a plain object with the same fields (e.g. parsed
|
|
167
|
+
* JSON, possibly with only some of them). Image-pixel coordinates. Plain objects
|
|
168
|
+
* become class instances via {@link hydrateBounds} when they enter the store;
|
|
169
|
+
* {@link Region.bounds} itself is always an instance (or a {@link MultiPolygon}).
|
|
170
|
+
*/
|
|
135
171
|
export type Bounds = Rectangle | Polygon | {
|
|
136
172
|
x?: number;
|
|
137
173
|
y?: number;
|
package/lib/models/shape.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { Region } from './region';
|
|
2
2
|
import { Datum, Font, Shape, ShapeLabel, ShapeLine, XAxisName, YAxisName } from 'plotly.js-dist-min';
|
|
3
|
+
/**
|
|
4
|
+
* A {@link Region} projected to a Plotly layout shape (`rect` or SVG `path`),
|
|
5
|
+
* carrying the region's identity, class label and file name along so it
|
|
6
|
+
* round-trips through Plotly's relayout. Coordinates are the plot's data
|
|
7
|
+
* coordinates, which are the region's image pixels. Built by
|
|
8
|
+
* {@link Region.getShape}; {@link getRegion} converts back (only `rect` and
|
|
9
|
+
* `path` shapes — anything else throws).
|
|
10
|
+
*/
|
|
3
11
|
export declare class ShapeSelection implements Shape {
|
|
4
12
|
/** Stable, unique identity carried alongside the shape so it round-trips
|
|
5
13
|
* through Plotly's relayout untouched. Plotly preserves unknown
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Injector, NgZone, Type } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { Message } from 'primeng/api';
|
|
4
|
+
import { IImageInfo } from '../contracts/image.contract';
|
|
5
|
+
import { PlotType, PlotTypeId } from '../contracts/plot-type';
|
|
6
|
+
import { PlotModeTools, PlotTypeContribution } from '../contracts/plot-type-contribution.contract';
|
|
7
|
+
import { ToolbarContribution, ToolbarDialogToolContribution } from '../contracts/toolbar-tool.contract';
|
|
8
|
+
import { IVisualizer } from '../contracts/visualizer.contract';
|
|
9
|
+
import { PlotModeController } from './plot-mode-controller';
|
|
10
|
+
/** The live contributed mode's side panel, as the template renders it. */
|
|
11
|
+
export interface PlotModePanelView {
|
|
12
|
+
title: string;
|
|
13
|
+
/** An Angular component panel, with its own injector… */
|
|
14
|
+
component: Type<unknown> | null;
|
|
15
|
+
injector: Injector | null;
|
|
16
|
+
/** …or a plain host element a `mount` panel rendered into. */
|
|
17
|
+
host: HTMLElement | null;
|
|
18
|
+
}
|
|
19
|
+
/** The open dialog tool's dialog, as the template renders it. */
|
|
20
|
+
export interface ToolDialogView {
|
|
21
|
+
title: string;
|
|
22
|
+
width: string;
|
|
23
|
+
host: HTMLElement;
|
|
24
|
+
}
|
|
25
|
+
/** What the contributions need from the viewer that hosts them. */
|
|
26
|
+
export interface ContributionViewer {
|
|
27
|
+
readonly visualizer: IVisualizer;
|
|
28
|
+
readonly zone: NgZone;
|
|
29
|
+
/** The toolbar tools a contribution may arm (`PlotModeContext.tools`). */
|
|
30
|
+
readonly tools: PlotModeTools;
|
|
31
|
+
/** Parent of a component panel's injector. */
|
|
32
|
+
readonly injector?: Injector;
|
|
33
|
+
imageInfo$(): Observable<IImageInfo | null>;
|
|
34
|
+
/** The selector's id (a built-in type or a contributed mode). */
|
|
35
|
+
selectedId(): PlotTypeId;
|
|
36
|
+
/** The built-in type being rendered. */
|
|
37
|
+
renderedType(): PlotType;
|
|
38
|
+
/** A contributed mode could not start: select its base type, already on screen. */
|
|
39
|
+
selectBase(type: PlotType): void;
|
|
40
|
+
notify(message: Message): void;
|
|
41
|
+
detectChanges(): void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Hosts the library's two kinds of contributed sessions over the viewer:
|
|
45
|
+
* - **plot modes** (`PLOT_TYPE_CONTRIBUTIONS`): a selector entry riding on a built-in
|
|
46
|
+
* base type, with an optional side panel;
|
|
47
|
+
* - **dialog tools** (`TOOLBAR_TOOLS`, `kind: 'dialog'`): a floating dialog over the
|
|
48
|
+
* Image view, whose body the tool mounts once the dialog is in the document.
|
|
49
|
+
*
|
|
50
|
+
* Both run through a {@link PlotModeController} (one live session each, isolated from
|
|
51
|
+
* a failing contribution). A session is bound to the base view it drew over, so it
|
|
52
|
+
* ends before anything else draws ({@link endSessions}) and restarts once the next
|
|
53
|
+
* render has landed ({@link activate}).
|
|
54
|
+
*/
|
|
55
|
+
export declare class ContributionHost {
|
|
56
|
+
private readonly viewer;
|
|
57
|
+
readonly plotModes: PlotModeController;
|
|
58
|
+
readonly toolDialogs: PlotModeController;
|
|
59
|
+
/** Dialog tools, sorted; their buttons show in the Image view only. */
|
|
60
|
+
readonly dialogTools: ToolbarDialogToolContribution[];
|
|
61
|
+
/** The live mode's panel; null while no contributed session is live. */
|
|
62
|
+
plotModePanel: PlotModePanelView | null;
|
|
63
|
+
/** The open dialog tool's live dialog. */
|
|
64
|
+
toolDialog: ToolDialogView | null;
|
|
65
|
+
/** The dialog tool the user has open (its session may be between renders). */
|
|
66
|
+
openDialogToolId: string | null;
|
|
67
|
+
private destroying;
|
|
68
|
+
/** The live dialog body's teardown, and a pending wait for its host to connect. */
|
|
69
|
+
private toolDialogTeardown;
|
|
70
|
+
private toolDialogFrame;
|
|
71
|
+
constructor(plotTypeContributions: readonly PlotTypeContribution[] | null | undefined, toolContributions: readonly ToolbarContribution[] | null | undefined, viewer: ContributionViewer);
|
|
72
|
+
/** End both sessions: the view they drew over is about to go. An open dialog tool
|
|
73
|
+
* stays open and restarts on the next {@link activate}. */
|
|
74
|
+
endSessions(): void;
|
|
75
|
+
/** A render landed: start the selected mode's session and the open dialog tool's. */
|
|
76
|
+
activate(): void;
|
|
77
|
+
/** The viewer is being destroyed: end both sessions without touching its view. */
|
|
78
|
+
destroy(): void;
|
|
79
|
+
/** The toolbar button: open the tool's dialog, or close it if it is open. */
|
|
80
|
+
toggleDialogTool(id: string): void;
|
|
81
|
+
/** Close the open dialog tool: its body is torn down, then its session ends. */
|
|
82
|
+
closeDialogTool(): void;
|
|
83
|
+
/** Attach a `mount` panel's host element once the panel dialog renders its slot. */
|
|
84
|
+
attachPanelSlot(slot: HTMLElement | undefined): void;
|
|
85
|
+
/** Attach the open dialog tool's host element once its dialog renders its slot. */
|
|
86
|
+
attachToolDialogSlot(slot: HTMLElement | undefined): void;
|
|
87
|
+
/**
|
|
88
|
+
* Start the selected contributed mode's session, once its base view has plotted.
|
|
89
|
+
* No-op for a built-in type, or when the base on screen is not the one the mode
|
|
90
|
+
* rides on. A backend that cannot provide a viewport for it (e.g. OSD fell back to
|
|
91
|
+
* Plotly) counts as a failed activation.
|
|
92
|
+
*/
|
|
93
|
+
private activateSelectedPlotMode;
|
|
94
|
+
/** Start (or restart, after a re-render) the open dialog tool's session. */
|
|
95
|
+
private activateOpenDialogTool;
|
|
96
|
+
/** A session's context over the backend on screen, or null when it has no viewport. */
|
|
97
|
+
private context;
|
|
98
|
+
/** Render the live mode's panel. Activation can resolve outside Angular (an OSD
|
|
99
|
+
* callback, a contribution's own promise), hence the zone re-entry. */
|
|
100
|
+
private showPlotModePanel;
|
|
101
|
+
/** Drop the panel (destroying a component panel) before the session ends. */
|
|
102
|
+
private hidePlotModePanel;
|
|
103
|
+
/** A contributed mode could not start. Its base type is already on screen — the base
|
|
104
|
+
* plotted first — so just select it: nothing needs to re-plot. */
|
|
105
|
+
private fallBackFromPlotMode;
|
|
106
|
+
/**
|
|
107
|
+
* The dialog-tool session is live: render the dialog, then mount the tool's body
|
|
108
|
+
* once the host element is in the document, so `mount()` can measure it and start
|
|
109
|
+
* widgets that need a connected element.
|
|
110
|
+
*/
|
|
111
|
+
private showToolDialog;
|
|
112
|
+
/**
|
|
113
|
+
* Mount `tool`'s body into `host` once it is connected (the dialog may attach it a
|
|
114
|
+
* frame later, when it moves itself to `<body>`). If it never connects within
|
|
115
|
+
* {@link TOOL_DIALOG_ATTACH_FRAMES} it is mounted anyway, with a warning, rather than
|
|
116
|
+
* leaving an empty dialog. A throwing `mount()` fails the session like a failed start.
|
|
117
|
+
*/
|
|
118
|
+
private mountToolDialogBody;
|
|
119
|
+
/** The dialog-tool session is about to end: tear the body down first, then drop the dialog. */
|
|
120
|
+
private hideToolDialog;
|
|
121
|
+
/** A dialog tool could not start: close it and say so. */
|
|
122
|
+
private dialogToolFailed;
|
|
123
|
+
/** Run change detection; returns what it threw (logged), or null. */
|
|
124
|
+
private detectChangesSafely;
|
|
125
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ViewerCapabilities } from '../contracts/capabilities.contract';
|
|
2
|
+
import { IImageInfo } from '../contracts/image.contract';
|
|
3
|
+
import { PlotTypeDescriptor, PlotTypeId } from '../contracts/plot-type';
|
|
4
|
+
import { ContributedPlotTypeDescriptor, PlotTypeOption } from '../contracts/plot-type-contribution.contract';
|
|
5
|
+
/** What a spatial-omics dataset on offer contributes to the plot-type gates. */
|
|
6
|
+
export interface SpatialGates {
|
|
7
|
+
/** A dataset is published on `SPATIAL_DATA_PORT`. */
|
|
8
|
+
hasDataset: boolean;
|
|
9
|
+
/** Its observations carry a z, so it can be drawn as a 3D cloud. */
|
|
10
|
+
has3d: boolean;
|
|
11
|
+
/** It brings pixels of its own: a tissue image it registers onto, or a volume
|
|
12
|
+
* published as a z-stack image. */
|
|
13
|
+
hasPixels: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Everything {@link computePlotTypeMenu} gates on. */
|
|
16
|
+
export interface PlotTypeMenuInput {
|
|
17
|
+
/** The built-in types the backend advertises. */
|
|
18
|
+
descriptors: PlotTypeDescriptor[];
|
|
19
|
+
/** Contributed plot modes (`PLOT_TYPE_CONTRIBUTIONS`). */
|
|
20
|
+
contributions: ContributedPlotTypeDescriptor[];
|
|
21
|
+
caps: ViewerCapabilities;
|
|
22
|
+
imageInfo: IImageInfo | undefined;
|
|
23
|
+
spatial: SpatialGates;
|
|
24
|
+
/** Offer every backend's type under its full label, not just the curated set. */
|
|
25
|
+
testMode: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** The selector's entries: {@link builtIn} then the contributed modes. */
|
|
28
|
+
export interface PlotTypeMenu {
|
|
29
|
+
builtIn: PlotTypeDescriptor[];
|
|
30
|
+
menu: PlotTypeOption[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Plot types offered in the selector for the current image:
|
|
34
|
+
* - Outside **test mode**, only the curated default set (descriptors with a
|
|
35
|
+
* `productionLabel`) is offered, shown under suffix-free names — Image,
|
|
36
|
+
* Heatmap, Contour and the napari Surface / Volume / Isosurface. Test mode
|
|
37
|
+
* exposes every backend's type under its full (backend-suffixed) label.
|
|
38
|
+
* - 3D types hidden when the backend can't render a 3D scene.
|
|
39
|
+
* - stack-only types (volume, isosurface) hidden unless the file is a stack —
|
|
40
|
+
* a volume needs multiple z-slices.
|
|
41
|
+
* - scalar-intensity types (contour, surface, isosurface) hidden for RGB
|
|
42
|
+
* images — they map a single intensity per pixel. Image and Heatmap render
|
|
43
|
+
* any image. A multichannel image's bands are each scalar, so it passes.
|
|
44
|
+
* - spatial-omics types hidden until a `SpatialDataset` is published on
|
|
45
|
+
* `SPATIAL_DATA_PORT` — the mode has nothing to draw without observations,
|
|
46
|
+
* exactly as a volume has nothing to draw without a stack.
|
|
47
|
+
* - image-sourced types hidden while a dataset that brings no pixels is up.
|
|
48
|
+
*
|
|
49
|
+
* Contributed modes come after every built-in one, under the same label rule and
|
|
50
|
+
* their own stack/grayscale/spatial gates; a mode also needs whatever its base view
|
|
51
|
+
* needs, so the base type's gates apply too.
|
|
52
|
+
*/
|
|
53
|
+
export declare function computePlotTypeMenu(input: PlotTypeMenuInput): PlotTypeMenu;
|
|
54
|
+
/**
|
|
55
|
+
* The type to fall back to when `selected` is no longer offered — Image when it is
|
|
56
|
+
* on offer, else the first type still offered — or null when `selected` is still
|
|
57
|
+
* offered (or nothing is). With no image loaded the pixel modes are gone, and falling
|
|
58
|
+
* back to Image would select a mode the selector does not list and nothing can draw.
|
|
59
|
+
*/
|
|
60
|
+
export declare function reconcilePlotType(menu: PlotTypeOption[], selected: PlotTypeId): PlotTypeId | null;
|