@cornerstonejs/core 2.15.5 → 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,7 @@ export interface ImageDataMetaData {
17
17
  }
18
18
  declare class StackViewport extends Viewport {
19
19
  private imageIds;
20
+ private imageKeyToIndexMap;
20
21
  private currentImageIdIndex;
21
22
  private targetImageIdIndex;
22
23
  private debouncedTimeout;
@@ -199,8 +200,9 @@ declare class StackViewport extends Viewport {
199
200
  setViewReference(viewRef: ViewReference): void;
200
201
  getViewReferenceId(specifier?: ViewReferenceSpecifier): string;
201
202
  getTargetImageIdIndex: () => number;
203
+ getSliceIndexForImage(reference: string | ViewReference): number;
202
204
  getImageIds: () => string[];
203
- getCurrentImageId: () => string;
205
+ getCurrentImageId: (index?: number) => string;
204
206
  hasImageId: (imageId: string) => boolean;
205
207
  hasImageURI: (imageURI: string) => boolean;
206
208
  private getCPUFallbackError;
@@ -43,6 +43,10 @@ const EPSILON = 1;
43
43
  class StackViewport extends Viewport {
44
44
  constructor(props) {
45
45
  super(props);
46
+ this.imageIds = [];
47
+ this.imageKeyToIndexMap = new Map();
48
+ this.currentImageIdIndex = 0;
49
+ this.targetImageIdIndex = 0;
46
50
  this.imagesLoader = this;
47
51
  this.globalDefaultProperties = {};
48
52
  this.perImageIdDefaultProperties = new Map();
@@ -245,20 +249,14 @@ class StackViewport extends Viewport {
245
249
  this.getImageIds = () => {
246
250
  return this.imageIds;
247
251
  };
248
- this.getCurrentImageId = () => {
249
- return this.imageIds[this.currentImageIdIndex];
252
+ this.getCurrentImageId = (index = this.getCurrentImageIdIndex()) => {
253
+ return this.imageIds[index];
250
254
  };
251
255
  this.hasImageId = (imageId) => {
252
- return this.imageIds.includes(imageId);
256
+ return this.imageKeyToIndexMap.has(imageId);
253
257
  };
254
258
  this.hasImageURI = (imageURI) => {
255
- const imageIds = this.imageIds;
256
- for (let i = 0; i < imageIds.length; i++) {
257
- if (imageIdToURI(imageIds[i]) === imageURI) {
258
- return true;
259
- }
260
- }
261
- return false;
259
+ return this.imageKeyToIndexMap.has(imageURI);
262
260
  };
263
261
  this.customRenderViewportToCanvas = () => {
264
262
  if (!this.useCPURendering) {
@@ -392,7 +390,6 @@ class StackViewport extends Viewport {
392
390
  const result = this.useCPURendering
393
391
  ? this._resetCPUFallbackElement()
394
392
  : this._resetGPUViewport();
395
- this.imageIds = [];
396
393
  this.currentImageIdIndex = 0;
397
394
  this.targetImageIdIndex = 0;
398
395
  this.resetCamera();
@@ -1164,6 +1161,11 @@ class StackViewport extends Viewport {
1164
1161
  async setStack(imageIds, currentImageIdIndex = 0) {
1165
1162
  this._throwIfDestroyed();
1166
1163
  this.imageIds = imageIds;
1164
+ this.imageKeyToIndexMap.clear();
1165
+ imageIds.forEach((imageId, index) => {
1166
+ this.imageKeyToIndexMap.set(imageId, index);
1167
+ this.imageKeyToIndexMap.set(imageIdToURI(imageId), index);
1168
+ });
1167
1169
  this.currentImageIdIndex = currentImageIdIndex;
1168
1170
  this.targetImageIdIndex = currentImageIdIndex;
1169
1171
  const imageRetrieveConfiguration = metaData.get(imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, imageIds[currentImageIdIndex], 'stack');
@@ -1709,36 +1711,40 @@ class StackViewport extends Viewport {
1709
1711
  };
1710
1712
  }
1711
1713
  isReferenceViewable(viewRef, options = {}) {
1712
- if (!super.isReferenceViewable(viewRef, options)) {
1714
+ const testIndex = this.getCurrentImageIdIndex();
1715
+ const currentImageId = this.imageIds[testIndex];
1716
+ if (!currentImageId || !viewRef) {
1713
1717
  return false;
1714
1718
  }
1715
- const { referencedImageId, sliceIndex } = viewRef;
1716
- if (viewRef.volumeId && !referencedImageId) {
1717
- return options.asVolume;
1718
- }
1719
- let testIndex = this.getCurrentImageIdIndex();
1720
- let currentImageId = this.imageIds[testIndex];
1721
- if (options.withNavigation && typeof sliceIndex === 'number') {
1722
- testIndex = sliceIndex;
1723
- currentImageId = this.imageIds[testIndex];
1724
- }
1725
- if (!currentImageId) {
1726
- return false;
1727
- }
1728
- if (options.asOverlay && referencedImageId) {
1729
- const matchedImageId = this.matchImagesForOverlay(currentImageId, referencedImageId);
1730
- if (matchedImageId) {
1719
+ const { referencedImageId, multiSliceReference } = viewRef;
1720
+ if (referencedImageId) {
1721
+ if (referencedImageId === currentImageId) {
1731
1722
  return true;
1732
1723
  }
1724
+ viewRef.referencedImageURI ||= imageIdToURI(referencedImageId);
1725
+ const { referencedImageURI: referencedImageURI } = viewRef;
1726
+ const foundSliceIndex = this.imageKeyToIndexMap.get(referencedImageURI);
1727
+ if (options.asOverlay) {
1728
+ const matchedImageId = this.matchImagesForOverlay(currentImageId, referencedImageId);
1729
+ if (matchedImageId) {
1730
+ return true;
1731
+ }
1732
+ }
1733
+ if (foundSliceIndex === undefined) {
1734
+ return false;
1735
+ }
1736
+ if (options.withNavigation) {
1737
+ return true;
1738
+ }
1739
+ const rangeEndSliceIndex = multiSliceReference &&
1740
+ this.imageKeyToIndexMap.get(multiSliceReference.referencedImageId);
1741
+ return testIndex <= rangeEndSliceIndex && testIndex >= foundSliceIndex;
1733
1742
  }
1734
- let { imageURI } = options;
1735
- if (!imageURI) {
1736
- imageURI = imageIdToURI(currentImageId);
1743
+ if (!super.isReferenceViewable(viewRef, options)) {
1744
+ return false;
1737
1745
  }
1738
- const referencedImageURI = imageIdToURI(referencedImageId);
1739
- const matches = referencedImageURI === imageURI;
1740
- if (matches) {
1741
- return matches;
1746
+ if (viewRef.volumeId) {
1747
+ return options.asVolume;
1742
1748
  }
1743
1749
  const { cameraFocalPoint } = viewRef;
1744
1750
  if (options.asNearbyProjection && cameraFocalPoint) {
@@ -1757,7 +1763,7 @@ class StackViewport extends Viewport {
1757
1763
  getViewReference(viewRefSpecifier = {}) {
1758
1764
  const { sliceIndex = this.getCurrentImageIdIndex() } = viewRefSpecifier;
1759
1765
  const reference = super.getViewReference(viewRefSpecifier);
1760
- const referencedImageId = this.imageIds[sliceIndex];
1766
+ const referencedImageId = this.getCurrentImageId(sliceIndex);
1761
1767
  if (!referencedImageId) {
1762
1768
  return;
1763
1769
  }
@@ -1772,32 +1778,38 @@ class StackViewport extends Viewport {
1772
1778
  return reference;
1773
1779
  }
1774
1780
  setViewReference(viewRef) {
1775
- if (!viewRef) {
1781
+ if (!viewRef?.referencedImageId) {
1782
+ if (viewRef?.sliceIndex !== undefined) {
1783
+ this.scroll(viewRef.sliceIndex - this.targetImageIdIndex);
1784
+ }
1776
1785
  return;
1777
1786
  }
1778
- const { referencedImageId, sliceIndex } = viewRef;
1779
- if (typeof sliceIndex === 'number' &&
1780
- referencedImageId &&
1781
- referencedImageId === this.imageIds[sliceIndex]) {
1782
- this.scroll(sliceIndex - this.targetImageIdIndex);
1783
- }
1784
- else {
1785
- const foundIndex = this.imageIds.indexOf(referencedImageId);
1786
- if (foundIndex !== -1) {
1787
- this.scroll(foundIndex - this.targetImageIdIndex);
1788
- }
1789
- else {
1790
- throw new Error('Unsupported - referenced image id not found');
1791
- }
1787
+ const { referencedImageId } = viewRef;
1788
+ viewRef.referencedImageURI ||= imageIdToURI(referencedImageId);
1789
+ const { referencedImageURI: referencedImageURI } = viewRef;
1790
+ const sliceIndex = this.imageKeyToIndexMap.get(referencedImageURI);
1791
+ if (sliceIndex === undefined) {
1792
+ console.error(`No image URI found for ${referencedImageURI}`);
1793
+ return;
1792
1794
  }
1795
+ this.scroll(sliceIndex - this.targetImageIdIndex);
1793
1796
  }
1794
1797
  getViewReferenceId(specifier = {}) {
1795
- const { sliceIndex: sliceIndex = this.currentImageIdIndex } = specifier;
1796
- if (Array.isArray(sliceIndex)) {
1797
- throw new Error('Use of slice ranges for stacks not supported');
1798
- }
1798
+ const { sliceIndex = this.currentImageIdIndex } = specifier;
1799
1799
  return `imageId:${this.imageIds[sliceIndex]}`;
1800
1800
  }
1801
+ getSliceIndexForImage(reference) {
1802
+ if (!reference) {
1803
+ return;
1804
+ }
1805
+ if (typeof reference === 'string') {
1806
+ return this.imageKeyToIndexMap.get(reference);
1807
+ }
1808
+ if (reference.referencedImageId) {
1809
+ return this.imageKeyToIndexMap.get(reference.referencedImageId);
1810
+ }
1811
+ return;
1812
+ }
1801
1813
  getCPUFallbackError(method) {
1802
1814
  return new Error(`method ${method} cannot be used during CPU Fallback mode`);
1803
1815
  }
@@ -72,6 +72,7 @@ declare class VideoViewport extends Viewport {
72
72
  };
73
73
  setFrameNumber(frame: number): Promise<void>;
74
74
  setFrameRange(frameRange: number[]): void;
75
+ getSliceIndexForImage(reference: string | ViewReference): number;
75
76
  getFrameRange(): [number, number];
76
77
  setProperties(props: VideoViewportProperties): void;
77
78
  setPlaybackRate(rate?: number): void;
@@ -88,7 +89,7 @@ declare class VideoViewport extends Viewport {
88
89
  setAverageWhite(averageWhite: [number, number, number]): void;
89
90
  protected setColorTransform(): void;
90
91
  setCamera(camera: ICamera): void;
91
- getCurrentImageId(): string;
92
+ getCurrentImageId(index?: number): string;
92
93
  getViewReferenceId(specifier?: ViewReferenceSpecifier): string;
93
94
  isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean;
94
95
  setViewReference(viewRef: ViewReference): void;
@@ -8,6 +8,7 @@ import { getOrCreateCanvas } from './helpers';
8
8
  import CanvasActor from './CanvasActor';
9
9
  import cache from '../cache/cache';
10
10
  import uuidv4 from '../utilities/uuidv4';
11
+ import FrameRange from '../utilities/FrameRange';
11
12
  import { pointInShapeCallback } from '../utilities/pointInShapeCallback';
12
13
  class VideoViewport extends Viewport {
13
14
  static { this.frameRangeExtractor = /(\/frames\/|[&?]frameNumber=)([^/&?]*)/i; }
@@ -383,6 +384,18 @@ class VideoViewport extends Viewport {
383
384
  }
384
385
  this.frameRange = [frameRange[0], frameRange[1]];
385
386
  }
387
+ getSliceIndexForImage(reference) {
388
+ if (!reference) {
389
+ return;
390
+ }
391
+ if (typeof reference === 'string') {
392
+ return FrameRange.imageIdToFrameStart(reference);
393
+ }
394
+ if (reference.referencedImageId) {
395
+ return FrameRange.imageIdToFrameStart(reference.referencedImageId);
396
+ }
397
+ return;
398
+ }
386
399
  getFrameRange() {
387
400
  return this.frameRange;
388
401
  }
@@ -579,10 +592,8 @@ class VideoViewport extends Viewport {
579
592
  this.renderFrame();
580
593
  }
581
594
  }
582
- getCurrentImageId() {
583
- const current = this.imageId.replace('/frames/1', this.isPlaying
584
- ? `/frames/${this.frameRange[0]}-${this.frameRange[1]}`
585
- : `/frames/${this.getFrameNumber()}`);
595
+ getCurrentImageId(index = this.getCurrentImageIdIndex()) {
596
+ const current = this.imageId.replace('/frames/1', `/frames/${index + 1}`);
586
597
  return current;
587
598
  }
588
599
  getViewReferenceId(specifier = {}) {
@@ -598,7 +609,7 @@ class VideoViewport extends Viewport {
598
609
  }
599
610
  isReferenceViewable(viewRef, options = {}) {
600
611
  let { imageURI } = options;
601
- const { referencedImageId, sliceIndex: sliceIndex } = viewRef;
612
+ const { referencedImageId, sliceIndex, multiSliceReference } = viewRef;
602
613
  if (!super.isReferenceViewable(viewRef)) {
603
614
  return false;
604
615
  }
@@ -611,8 +622,9 @@ class VideoViewport extends Viewport {
611
622
  return true;
612
623
  }
613
624
  const currentIndex = this.getSliceIndex();
614
- if (Array.isArray(sliceIndex)) {
615
- return currentIndex >= sliceIndex[0] && currentIndex <= sliceIndex[1];
625
+ if (multiSliceReference) {
626
+ const rangeEndSliceIndex = FrameRange.imageIdToFrameEnd(multiSliceReference.referencedImageId);
627
+ return currentIndex >= sliceIndex && currentIndex <= rangeEndSliceIndex;
616
628
  }
617
629
  if (sliceIndex !== undefined) {
618
630
  return currentIndex === sliceIndex;
@@ -640,16 +652,21 @@ class VideoViewport extends Viewport {
640
652
  }
641
653
  }
642
654
  getViewReference(viewRefSpecifier) {
643
- let sliceIndex = viewRefSpecifier?.sliceIndex;
644
- if (!sliceIndex) {
645
- sliceIndex = this.isPlaying
646
- ? [this.frameRange[0] - 1, this.frameRange[1] - 1]
647
- : this.getCurrentImageIdIndex();
648
- }
655
+ const sliceIndex = viewRefSpecifier?.sliceIndex ??
656
+ (this.isPlaying ? this.frameRange[0] : this.getCurrentImageIdIndex());
657
+ const rangeEndSliceIndex = viewRefSpecifier?.rangeEndSliceIndex ??
658
+ (this.isPlaying ? this.frameRange[1] - 1 : undefined);
659
+ const multiSliceReference = rangeEndSliceIndex > sliceIndex
660
+ ? {
661
+ sliceIndex: rangeEndSliceIndex,
662
+ referencedImageId: this.getCurrentImageId(rangeEndSliceIndex),
663
+ }
664
+ : undefined;
649
665
  return {
650
666
  ...super.getViewReference(viewRefSpecifier),
651
667
  referencedImageId: this.getViewReferenceId(viewRefSpecifier),
652
- sliceIndex: sliceIndex,
668
+ sliceIndex,
669
+ multiSliceReference,
653
670
  };
654
671
  }
655
672
  getFrameNumber() {
@@ -120,7 +120,7 @@ declare class Viewport {
120
120
  getClippingPlanesForActor(actorEntry?: ActorEntry): vtkPlane[];
121
121
  private _getWorldDistanceViewUpAndViewRight;
122
122
  getViewReference(viewRefSpecifier?: ViewReferenceSpecifier): ViewReference;
123
- isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean | unknown;
123
+ isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean;
124
124
  getViewPresentation(viewPresSel?: ViewPresentationSelector): ViewPresentation;
125
125
  setViewReference(viewRef: ViewReference): void;
126
126
  setViewPresentation(viewPres: ViewPresentation): void;
@@ -834,14 +834,14 @@ class Viewport {
834
834
  }
835
835
  return { widthWorld: maxX - minX, heightWorld: maxY - minY };
836
836
  }
837
- getViewReference(viewRefSpecifier = {}) {
837
+ getViewReference(viewRefSpecifier) {
838
838
  const { focalPoint: cameraFocalPoint, viewPlaneNormal, viewUp, } = this.getCamera();
839
839
  const target = {
840
840
  FrameOfReferenceUID: this.getFrameOfReferenceUID(),
841
841
  cameraFocalPoint,
842
842
  viewPlaneNormal,
843
843
  viewUp,
844
- sliceIndex: viewRefSpecifier.sliceIndex ?? this.getSliceIndex(),
844
+ sliceIndex: viewRefSpecifier?.sliceIndex ?? this.getSliceIndex(),
845
845
  };
846
846
  return target;
847
847
  }
@@ -5,12 +5,14 @@ import type ViewportType from '../enums/ViewportType';
5
5
  import type DisplayArea from './displayArea';
6
6
  import type { BoundsLPS } from './BoundsLPS';
7
7
  import type Viewport from '../RenderingEngine/Viewport';
8
- export interface ViewReferenceSpecifier {
9
- sliceIndex?: number | [number, number];
8
+ export type ViewReferenceSpecifier = {
9
+ sliceIndex?: number;
10
+ rangeEndSliceIndex?: number;
11
+ frameNumber?: number;
10
12
  forFrameOfReference?: boolean;
11
13
  points?: Point3[];
12
14
  volumeId?: string;
13
- }
15
+ };
14
16
  export interface ReferenceCompatibleOptions {
15
17
  withNavigation?: boolean;
16
18
  asVolume?: boolean;
@@ -19,16 +21,21 @@ export interface ReferenceCompatibleOptions {
19
21
  asNearbyProjection?: boolean;
20
22
  asOverlay?: boolean;
21
23
  }
22
- export interface ViewReference {
24
+ export type ReferencedImageRange = ViewReference & {
25
+ referencedImageId: string;
26
+ };
27
+ export type ViewReference = {
23
28
  FrameOfReferenceUID?: string;
24
29
  referencedImageId?: string;
30
+ referencedImageURI?: string;
31
+ multiSliceReference?: ReferencedImageRange;
25
32
  cameraFocalPoint?: Point3;
26
33
  viewPlaneNormal?: Point3;
27
34
  viewUp?: Point3;
28
- sliceIndex?: number | [number, number];
35
+ sliceIndex?: number;
29
36
  volumeId?: string;
30
37
  bounds?: BoundsLPS;
31
- }
38
+ };
32
39
  export interface ViewPresentation {
33
40
  slabThickness?: number;
34
41
  rotation?: number;
@@ -0,0 +1,9 @@
1
+ export type FramesRange = [number, number] | number;
2
+ export default class FrameRange {
3
+ protected static frameRangeExtractor: RegExp;
4
+ protected static imageIdToFrames(imageId: string): FramesRange;
5
+ static imageIdToFrameEnd(imageId: string): number;
6
+ static imageIdToFrameStart(imageId: string): number;
7
+ static framesToString(range: any): string;
8
+ protected static framesToImageId(imageId: string, range: FramesRange | string): string;
9
+ }
@@ -0,0 +1,36 @@
1
+ export default class FrameRange {
2
+ static { this.frameRangeExtractor = /(\/frames\/|[&?]frameNumber=)([^/&?]*)/i; }
3
+ static imageIdToFrames(imageId) {
4
+ const match = imageId.match(this.frameRangeExtractor);
5
+ if (!match || !match[2]) {
6
+ return null;
7
+ }
8
+ const range = match[2].split('-').map((it) => Number(it));
9
+ if (range.length === 1) {
10
+ return range[0];
11
+ }
12
+ return range;
13
+ }
14
+ static imageIdToFrameEnd(imageId) {
15
+ const range = this.imageIdToFrames(imageId);
16
+ return Array.isArray(range) ? range[1] : range;
17
+ }
18
+ static imageIdToFrameStart(imageId) {
19
+ const range = this.imageIdToFrames(imageId);
20
+ return Array.isArray(range) ? range[0] : range;
21
+ }
22
+ static framesToString(range) {
23
+ if (Array.isArray(range)) {
24
+ return `${range[0]}-${range[1]}`;
25
+ }
26
+ return String(range);
27
+ }
28
+ static framesToImageId(imageId, range) {
29
+ const match = imageId.match(this.frameRangeExtractor);
30
+ if (!match || !match[2]) {
31
+ return null;
32
+ }
33
+ const newRangeString = this.framesToString(range);
34
+ return imageId.replace(this.frameRangeExtractor, `${match[1]}${newRangeString}`);
35
+ }
36
+ }
@@ -71,6 +71,7 @@ export default class VoxelManager {
71
71
  ],
72
72
  pointInShapeFn: isInObject,
73
73
  callback,
74
+ returnPoints,
74
75
  });
75
76
  return pointsInShape;
76
77
  }
@@ -76,6 +76,7 @@ import * as transferFunctionUtils from './transferFunctionUtils';
76
76
  import * as color from './color';
77
77
  import { deepEqual } from './deepEqual';
78
78
  import type { IViewport } from '../types/IViewport';
79
+ import FrameRange from './FrameRange';
79
80
  import getDynamicVolumeInfo from './getDynamicVolumeInfo';
80
81
  import autoLoad from './autoLoad';
81
82
  import scaleArray from './scaleArray';
@@ -87,4 +88,4 @@ import clip from './clip';
87
88
  import createSubVolume from './createSubVolume';
88
89
  import getVolumeDirectionVectors from './getVolumeDirectionVectors';
89
90
  declare const getViewportModality: (viewport: IViewport, volumeId?: string) => string;
90
- export { eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isEqualAbs, isEqualNegative, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, };
91
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isEqualAbs, isEqualNegative, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, };
@@ -75,6 +75,7 @@ import * as colormap from './colormap';
75
75
  import * as transferFunctionUtils from './transferFunctionUtils';
76
76
  import * as color from './color';
77
77
  import { deepEqual } from './deepEqual';
78
+ import FrameRange from './FrameRange';
78
79
  import { _getViewportModality } from './getViewportModality';
79
80
  import cache from '../cache/cache';
80
81
  import getDynamicVolumeInfo from './getDynamicVolumeInfo';
@@ -88,4 +89,4 @@ import clip from './clip';
88
89
  import createSubVolume from './createSubVolume';
89
90
  import getVolumeDirectionVectors from './getVolumeDirectionVectors';
90
91
  const getViewportModality = (viewport, volumeId) => _getViewportModality(viewport, volumeId, cache.getVolume);
91
- export { eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isEqualAbs, isEqualNegative, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, };
92
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, planar, getMinMax, getRuntimeId, isEqual, isEqualAbs, isEqualNegative, isOpposite, getViewportModality, windowLevel, convertToGrayscale, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, };
@@ -29,10 +29,11 @@ export declare function iterateOverPointsInShape({ imageData, bounds, scalarData
29
29
  pointInShapeFn: any;
30
30
  callback: any;
31
31
  }): PointInShape[];
32
- export declare function iterateOverPointsInShapeVoxelManager({ voxelManager, bounds, imageData, pointInShapeFn, callback, }: {
32
+ export declare function iterateOverPointsInShapeVoxelManager({ voxelManager, bounds, imageData, pointInShapeFn, callback, returnPoints, }: {
33
33
  voxelManager: any;
34
34
  bounds: any;
35
35
  imageData: any;
36
36
  pointInShapeFn: any;
37
37
  callback: any;
38
+ returnPoints: any;
38
39
  }): PointInShape[];
@@ -73,7 +73,7 @@ export function iterateOverPointsInShape({ imageData, bounds, scalarData, pointI
73
73
  }
74
74
  return pointsInShape;
75
75
  }
76
- export function iterateOverPointsInShapeVoxelManager({ voxelManager, bounds, imageData, pointInShapeFn, callback, }) {
76
+ export function iterateOverPointsInShapeVoxelManager({ voxelManager, bounds, imageData, pointInShapeFn, callback, returnPoints, }) {
77
77
  const [[iMin, iMax], [jMin, jMax], [kMin, kMax]] = bounds;
78
78
  const indexToWorld = createPositionCallback(imageData);
79
79
  const pointIJK = [0, 0, 0];
@@ -88,12 +88,14 @@ export function iterateOverPointsInShapeVoxelManager({ voxelManager, bounds, ima
88
88
  if (pointInShapeFn(pointLPS, pointIJK)) {
89
89
  const index = voxelManager.toIndex(pointIJK);
90
90
  const value = voxelManager.getAtIndex(index);
91
- pointsInShape.push({
92
- value,
93
- index,
94
- pointIJK: [...pointIJK],
95
- pointLPS: pointLPS.slice(),
96
- });
91
+ if (returnPoints) {
92
+ pointsInShape.push({
93
+ value,
94
+ index,
95
+ pointIJK: [...pointIJK],
96
+ pointLPS: pointLPS.slice(),
97
+ });
98
+ }
97
99
  callback?.({ value, index, pointIJK, pointLPS });
98
100
  }
99
101
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "2.15.5",
3
+ "version": "2.16.1",
4
4
  "description": "Cornerstone3D Core",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/esm/index.d.ts",
@@ -82,5 +82,5 @@
82
82
  "type": "individual",
83
83
  "url": "https://ohif.org/donate"
84
84
  },
85
- "gitHead": "382df4deb7311b011fed61935d1cccf28a27c4b8"
85
+ "gitHead": "bbe715cbc6c3e791783196b5016a1bdec47f46be"
86
86
  }