@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.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 +34 -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/image.contract.mjs +1 -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/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- 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/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -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 +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -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 +270 -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 +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -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 +194 -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 +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- 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 +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -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/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -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 +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -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/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- 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 +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- 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 +120 -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 +121 -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 +84 -119
- 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 +123 -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/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -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-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.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/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -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/image.contract.d.ts +4 -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 +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -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 +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -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 +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -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 +91 -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 +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -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 +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- 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 +83 -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 +25 -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 +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -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/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -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 +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -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 +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- 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 +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -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 +62 -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 +51 -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 +55 -84
- 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 +46 -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/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -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/assets/slice.svg +23 -0
- 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,108 @@
|
|
|
1
|
+
import { OnDestroy } from '@angular/core';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { IIntensityControls, IntensityProfile } from '../contracts/visualizer.contract';
|
|
5
|
+
import { IImageInfo } from '../contracts/image.contract';
|
|
6
|
+
import { TileAccessPort } from '../contracts/ports/tile-access.port';
|
|
7
|
+
import { ImageStatePort } from '../contracts/ports/image-state.port';
|
|
8
|
+
import { Region } from '../models/region';
|
|
9
|
+
import { RegionStore } from '../store/region-store.service';
|
|
10
|
+
import { ProfileLine } from './intensity-profile';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
/** The pixels the profiles are sampled from, and the image they belong to. */
|
|
13
|
+
export interface IntensityFrames {
|
|
14
|
+
/** Per-z-plane pixel matrices (grayscale numbers or `[r, g, b]` cells). */
|
|
15
|
+
frames: any[];
|
|
16
|
+
/** [xRatio, yRatio]: image units per frame pixel. */
|
|
17
|
+
ratios: number[];
|
|
18
|
+
/** Image coordinate of the frames' pixel (0,0); [0,0] unless a zoom crop. */
|
|
19
|
+
origin?: [number, number];
|
|
20
|
+
}
|
|
21
|
+
/** The image the frames come from: its extent (for line placement) and its
|
|
22
|
+
* metadata (pixel size, grayscale). */
|
|
23
|
+
export interface IntensityImage {
|
|
24
|
+
imageInfo: IImageInfo;
|
|
25
|
+
/** [x0, x1, y0, y1] in image units. */
|
|
26
|
+
extent: number[];
|
|
27
|
+
/** The displayed z-plane, when the frames hold a stack. */
|
|
28
|
+
frameIndex?: () => number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Intensity profiles along line ROIs (PlotType.LINE), for every backend.
|
|
32
|
+
*
|
|
33
|
+
* Profile lines are ordinary RegionStore regions tagged `kind: 'profile'`; any
|
|
34
|
+
* region change re-samples and re-emits every line's profile. The service owns
|
|
35
|
+
* its OWN sampling frames — a backend's tool readback never doubles as the
|
|
36
|
+
* profile source (OSD-PLOTLY-2) — filled by Plotly when it renders or high-def
|
|
37
|
+
* zooms, and fetched here for the other backends: the displayed slice
|
|
38
|
+
* ({@link ensureIntensitySampling}) and, on zoom/pan, a display-resolution
|
|
39
|
+
* crop of the visible region ({@link refreshIntensitySamplingForRoi}). Every
|
|
40
|
+
* sampling write supersedes the async ones before it.
|
|
41
|
+
*
|
|
42
|
+
* Per viewer: listed in `provideVisualization()` with the RegionStore it
|
|
43
|
+
* listens to.
|
|
44
|
+
*/
|
|
45
|
+
export declare class IntensityProfileService implements IIntensityControls, OnDestroy {
|
|
46
|
+
private readonly http;
|
|
47
|
+
private readonly tiles;
|
|
48
|
+
private readonly regionStore;
|
|
49
|
+
private frames;
|
|
50
|
+
private image;
|
|
51
|
+
/** The last visible image-pixel rect a backend reported (new lines go there). */
|
|
52
|
+
private lastVisibleRoi;
|
|
53
|
+
/** Palette cursor (never reset on delete, so colours keep cycling). */
|
|
54
|
+
private colorSeq;
|
|
55
|
+
/** Bumped by every sampling write request: an async fetch lands only if no
|
|
56
|
+
* newer one was requested meanwhile. */
|
|
57
|
+
private gen;
|
|
58
|
+
/** The element whose parent sizes a crop request (the viewer's plot div). */
|
|
59
|
+
private elementId;
|
|
60
|
+
/** The host's selected file, so a crop for a previous file is dropped. */
|
|
61
|
+
private fileName;
|
|
62
|
+
private readonly profiles$;
|
|
63
|
+
private readonly subs;
|
|
64
|
+
private readonly utils;
|
|
65
|
+
constructor(http: HttpClient, tiles: TileAccessPort, state: ImageStatePort, regionStore: RegionStore);
|
|
66
|
+
ngOnDestroy(): void;
|
|
67
|
+
/** Every profile line's profile, re-emitted whenever one is added, moved or removed. */
|
|
68
|
+
getIntensityProfile$(): Observable<IntensityProfile[]>;
|
|
69
|
+
/** The element (by id) whose size a crop request is made for. */
|
|
70
|
+
setSamplingElement(id: string): void;
|
|
71
|
+
/** Supersede every sampling fetch in flight; returns the new generation. */
|
|
72
|
+
supersede(): number;
|
|
73
|
+
/** Whether `gen` (from {@link supersede}) is still the latest sampling request. */
|
|
74
|
+
isCurrent(gen: number): boolean;
|
|
75
|
+
/** Sample from these frames from now on — of `image`, or of the image already set. */
|
|
76
|
+
setFrames(frames: IntensityFrames, image?: IntensityImage): void;
|
|
77
|
+
/**
|
|
78
|
+
* Fetch the displayed slice's preview for sampling (the same pixels a heatmap
|
|
79
|
+
* would sample), for a backend that has no frames of its own (OpenSeadragon,
|
|
80
|
+
* napari-js). Re-emits the profiles once loaded.
|
|
81
|
+
*/
|
|
82
|
+
ensureIntensitySampling(imageInfo: IImageInfo, zIndex: number): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Re-fetch the given image-pixel ROI at the display resolution and sample from
|
|
85
|
+
* it, so the profile reflects the data at the current zoom level. Also
|
|
86
|
+
* remembers the ROI, so a new line is placed inside it.
|
|
87
|
+
*/
|
|
88
|
+
refreshIntensitySamplingForRoi(x: number, y: number, width: number, height: number, zIndex: number): void;
|
|
89
|
+
/**
|
|
90
|
+
* Add another profile line: a horizontal open 2-point polyline in the next
|
|
91
|
+
* palette colour, placed by {@link placeProfileLine}, added to the shared
|
|
92
|
+
* store so every backend renders and drags it (and excluded from the Regions
|
|
93
|
+
* tab and exports by its kind). Null until an image extent is known.
|
|
94
|
+
*/
|
|
95
|
+
addProfileLine(): Region | null;
|
|
96
|
+
/** Recompute and broadcast every profile line's profile (tagged with the
|
|
97
|
+
* line's id and colour, so the inset trace matches its line). */
|
|
98
|
+
emitProfiles(): void;
|
|
99
|
+
/** Sample the active frame along `line` (see sampleLine). */
|
|
100
|
+
computeIntensityProfile(line: ProfileLine): IntensityProfile;
|
|
101
|
+
/** The profile-line regions in the store. */
|
|
102
|
+
private profileRegions;
|
|
103
|
+
/** Fetch one slice through HttpClient (auth interceptors apply) and decode it. */
|
|
104
|
+
private loadSlice;
|
|
105
|
+
private toMatrix;
|
|
106
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<IntensityProfileService, never>;
|
|
107
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<IntensityProfileService>;
|
|
108
|
+
}
|
|
@@ -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[];
|
|
@@ -26,6 +38,13 @@ export interface PresetSet {
|
|
|
26
38
|
autoPromote: boolean;
|
|
27
39
|
/** Label matching against `Region.label` (default `'exact'`). */
|
|
28
40
|
matchMode: MatchMode;
|
|
41
|
+
/**
|
|
42
|
+
* Class colours that imported GeoJSON carried for classes with no preset, keyed by the
|
|
43
|
+
* match mode's key (see `presetKey`). They come before the fallback palette, so an imported
|
|
44
|
+
* file keeps its own colours. Session-only: never persisted, and absent from a set a caller
|
|
45
|
+
* saves or exports.
|
|
46
|
+
*/
|
|
47
|
+
importedColors?: Readonly<Record<string, string>>;
|
|
29
48
|
}
|
|
30
49
|
/**
|
|
31
50
|
* Fallback palette for classes not present in the preset set — reasonably distinct hues.
|
|
@@ -37,3 +56,9 @@ export declare const DEFAULT_FALLBACK_PALETTE: string[];
|
|
|
37
56
|
export declare function defaultPresetSet(): PresetSet;
|
|
38
57
|
/** True when the set has no usable classes (e.g. the server returned an empty/blank record). */
|
|
39
58
|
export declare function isEmptyPresetSet(set: PresetSet | null | undefined): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Validate an untrusted value (e.g. an imported JSON file) as a preset set.
|
|
61
|
+
* Returns a clean copy — only well-formed `{ name, color }` classes, defaults
|
|
62
|
+
* for missing optional fields — or null when it has no usable classes.
|
|
63
|
+
*/
|
|
64
|
+
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,45 @@
|
|
|
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[];
|
|
41
|
+
/**
|
|
42
|
+
* The open polylines a region traces (a polyline, or a multi-polygon's open parts), as interleaved
|
|
43
|
+
* `x, y` image px; a bézier polyline as its flattened curve. Closed shapes yield nothing.
|
|
44
|
+
*/
|
|
45
|
+
export declare function regionPolylines(region: Region): Float64Array[];
|
|
@@ -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,57 @@
|
|
|
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
|
+
/** A feature's `classification`: QuPath's `{name, color}`, or a bare name. */
|
|
9
|
+
type Classification = string | {
|
|
10
|
+
name?: string;
|
|
11
|
+
color?: number[];
|
|
12
|
+
};
|
|
13
|
+
/** The parts of a GeoJSON feature the reader looks at, JIT's bezier extras
|
|
14
|
+
* included. Parsed from a file, so nothing here is guaranteed. */
|
|
15
|
+
export interface GeoJsonFeature {
|
|
16
|
+
id?: string | number;
|
|
17
|
+
geometry: {
|
|
18
|
+
type?: string;
|
|
19
|
+
coordinates?: unknown;
|
|
20
|
+
plane?: {
|
|
21
|
+
z?: number;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
properties?: {
|
|
25
|
+
id?: string | number;
|
|
26
|
+
classification?: Classification;
|
|
27
|
+
isBezier?: boolean;
|
|
28
|
+
bezierAnchors?: number[][];
|
|
29
|
+
bezierHandlesIn?: number[][];
|
|
30
|
+
bezierHandlesOut?: number[][];
|
|
31
|
+
holes?: number[][][];
|
|
32
|
+
holeHandlesIn?: number[][][];
|
|
33
|
+
holeHandlesOut?: number[][][];
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* One GeoJSON feature as the region `shape<idx>`. Throws on a feature without coordinates.
|
|
38
|
+
* The feature's id becomes {@link Region.sourceId} (or `sourceId`, when given: a region source's
|
|
39
|
+
* id for the feature) and its other properties {@link Region.properties}.
|
|
40
|
+
*/
|
|
41
|
+
export declare function regionFromGeoJsonFeature(feature: GeoJsonFeature, idx: number, sourceId?: string): Region;
|
|
42
|
+
/**
|
|
43
|
+
* Serialise regions as a GeoJSON FeatureCollection string (QuPath-compatible),
|
|
44
|
+
* leaving out intensity-profile lines.
|
|
45
|
+
*/
|
|
46
|
+
export declare function regionsToGeoJson(rois: readonly Region[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* A region as a GeoJSON feature; null for a region without bounds. Its {@link Region.sourceId}
|
|
49
|
+
* is the feature's `id` and its {@link Region.properties} come along beside the classification.
|
|
50
|
+
*/
|
|
51
|
+
export declare function featureFromRegion(roi: Region): object | null;
|
|
52
|
+
/**
|
|
53
|
+
* Download a GeoJSON string as `<baseName without extension>.geojson`
|
|
54
|
+
* (`rois.geojson` without a base name).
|
|
55
|
+
*/
|
|
56
|
+
export declare function downloadGeoJson(jsonString: string, baseName?: string): void;
|
|
57
|
+
export {};
|
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;
|
|
@@ -24,6 +35,25 @@ export declare class Region {
|
|
|
24
35
|
* through the store, so the marker has to travel with the data.
|
|
25
36
|
*/
|
|
26
37
|
source?: string;
|
|
38
|
+
/**
|
|
39
|
+
* The id of the GeoJSON feature this region was read from (the feature's `id`, else
|
|
40
|
+
* `properties.id`; for a tiled region source, else its position in the file). Written back
|
|
41
|
+
* as the feature's `id` on export, so a region keeps its identity through a save. A region
|
|
42
|
+
* taken out of a region source for editing carries it, and the source stops drawing that
|
|
43
|
+
* feature while it does.
|
|
44
|
+
*/
|
|
45
|
+
sourceId?: string;
|
|
46
|
+
/**
|
|
47
|
+
* A region source feature's area (image px²) while it stands in for the feature in the Region
|
|
48
|
+
* Editor's table: such a row has no geometry until the feature is taken.
|
|
49
|
+
*/
|
|
50
|
+
sourceArea?: number;
|
|
51
|
+
/**
|
|
52
|
+
* The feature's other GeoJSON properties (everything but the ones SIV reads and writes:
|
|
53
|
+
* `classification`, `id` and the bézier fields), carried through untouched so a save keeps
|
|
54
|
+
* them, e.g. an atlas structure's acronym and id.
|
|
55
|
+
*/
|
|
56
|
+
properties?: Readonly<Record<string, unknown>>;
|
|
27
57
|
color?: string;
|
|
28
58
|
label?: string;
|
|
29
59
|
/** True when the user set this region's colour explicitly (Region Editor Color
|
|
@@ -37,6 +67,7 @@ export declare class Region {
|
|
|
37
67
|
* or a region drawn without a slice context (jit-ui#93). */
|
|
38
68
|
z: number;
|
|
39
69
|
shapeColor?: string | undefined;
|
|
70
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
40
71
|
bytesPerPixel: number;
|
|
41
72
|
/**
|
|
42
73
|
* resolution is the resolution at which the region
|
|
@@ -49,13 +80,19 @@ export declare class Region {
|
|
|
49
80
|
* at resolution = 0
|
|
50
81
|
*/
|
|
51
82
|
resolution: number;
|
|
83
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
52
84
|
cropped: boolean;
|
|
85
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
53
86
|
tileNumber: number;
|
|
54
87
|
tileCoordinates: number[] | null;
|
|
55
88
|
/** True for intensity-profile line ROIs (the intensity tool's lines). These are
|
|
56
89
|
* NOT annotation regions: they never appear in the Region Editor and editor
|
|
57
90
|
* operations (select/save/delete) must never touch them. */
|
|
58
91
|
isProfile(): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* A debug string: the rectangle's box, or the polygon's SVG path.
|
|
94
|
+
* @deprecated Unused by the library; will be removed in the next minor release.
|
|
95
|
+
*/
|
|
59
96
|
toString(): string;
|
|
60
97
|
/**
|
|
61
98
|
* Returns a ShapeSelection object that can be used to
|
|
@@ -67,12 +104,23 @@ export declare class Region {
|
|
|
67
104
|
isRectangle(bnds: any): bnds is Rectangle;
|
|
68
105
|
isPolygon(bnds: any): bnds is Polygon;
|
|
69
106
|
}
|
|
107
|
+
/** An axis-aligned box in image-pixel coordinates: (`x`, `y`) is the top-left
|
|
108
|
+
* (minimum) corner, `width`/`height` extend right/down. */
|
|
70
109
|
export declare class Rectangle {
|
|
71
110
|
x: number;
|
|
72
111
|
y: number;
|
|
73
112
|
width: number;
|
|
74
113
|
height: number;
|
|
75
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* A polygon or open polyline in image-pixel coordinates, optionally with holes
|
|
117
|
+
* and smoothed into a bézier curve.
|
|
118
|
+
*
|
|
119
|
+
* The vertices are stored twice and must agree: as the parallel `xpoints` /
|
|
120
|
+
* `ypoints` arrays (length `npoints`; the Java/JIT wire shape) and as
|
|
121
|
+
* `coordinates` `[x, y]` pairs (what GeoJSON export reads). The ring is
|
|
122
|
+
* implicitly closed — the first vertex is not repeated at the end.
|
|
123
|
+
*/
|
|
76
124
|
export declare class Polygon {
|
|
77
125
|
npoints: number;
|
|
78
126
|
xpoints: number[];
|
|
@@ -132,6 +180,13 @@ export declare class MultiPolygon {
|
|
|
132
180
|
/** One or more disjoint closed polygons (each may have holes). */
|
|
133
181
|
polygons: Polygon[];
|
|
134
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* A region's geometry as a host may supply it: a {@link Rectangle} or
|
|
185
|
+
* {@link Polygon} instance, or a plain object with the same fields (e.g. parsed
|
|
186
|
+
* JSON, possibly with only some of them). Image-pixel coordinates. Plain objects
|
|
187
|
+
* become class instances via {@link hydrateBounds} when they enter the store;
|
|
188
|
+
* {@link Region.bounds} itself is always an instance (or a {@link MultiPolygon}).
|
|
189
|
+
*/
|
|
135
190
|
export type Bounds = Rectangle | Polygon | {
|
|
136
191
|
x?: number;
|
|
137
192
|
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
|