@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.
- package/dist/esm/RenderingEngine/StackViewport.d.ts +3 -1
- package/dist/esm/RenderingEngine/StackViewport.js +67 -55
- package/dist/esm/RenderingEngine/VideoViewport.d.ts +2 -1
- package/dist/esm/RenderingEngine/VideoViewport.js +31 -14
- package/dist/esm/RenderingEngine/Viewport.d.ts +1 -1
- package/dist/esm/RenderingEngine/Viewport.js +2 -2
- package/dist/esm/types/IViewport.d.ts +13 -6
- package/dist/esm/utilities/FrameRange.d.ts +9 -0
- package/dist/esm/utilities/FrameRange.js +36 -0
- package/dist/esm/utilities/VoxelManager.js +1 -0
- package/dist/esm/utilities/index.d.ts +2 -1
- package/dist/esm/utilities/index.js +2 -1
- package/dist/esm/utilities/pointInShapeCallback.d.ts +2 -1
- package/dist/esm/utilities/pointInShapeCallback.js +9 -7
- package/package.json +2 -2
|
@@ -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[
|
|
252
|
+
this.getCurrentImageId = (index = this.getCurrentImageIdIndex()) => {
|
|
253
|
+
return this.imageIds[index];
|
|
250
254
|
};
|
|
251
255
|
this.hasImageId = (imageId) => {
|
|
252
|
-
return this.
|
|
256
|
+
return this.imageKeyToIndexMap.has(imageId);
|
|
253
257
|
};
|
|
254
258
|
this.hasImageURI = (imageURI) => {
|
|
255
|
-
|
|
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
|
-
|
|
1714
|
+
const testIndex = this.getCurrentImageIdIndex();
|
|
1715
|
+
const currentImageId = this.imageIds[testIndex];
|
|
1716
|
+
if (!currentImageId || !viewRef) {
|
|
1713
1717
|
return false;
|
|
1714
1718
|
}
|
|
1715
|
-
const { referencedImageId,
|
|
1716
|
-
if (
|
|
1717
|
-
|
|
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
|
-
|
|
1735
|
-
|
|
1736
|
-
imageURI = imageIdToURI(currentImageId);
|
|
1743
|
+
if (!super.isReferenceViewable(viewRef, options)) {
|
|
1744
|
+
return false;
|
|
1737
1745
|
}
|
|
1738
|
-
|
|
1739
|
-
|
|
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.
|
|
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
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
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
|
|
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',
|
|
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
|
|
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 (
|
|
615
|
-
|
|
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
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
9
|
-
sliceIndex?: 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
|
|
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
|
|
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
|
+
}
|
|
@@ -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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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.
|
|
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": "
|
|
85
|
+
"gitHead": "bbe715cbc6c3e791783196b5016a1bdec47f46be"
|
|
86
86
|
}
|