@cornerstonejs/core 2.0.0-beta.21 → 2.0.0-beta.23
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/BaseVolumeViewport.d.ts +1 -1
- package/dist/esm/RenderingEngine/BaseVolumeViewport.js +16 -6
- package/dist/esm/RenderingEngine/RenderingEngine.d.ts +1 -2
- package/dist/esm/RenderingEngine/RenderingEngine.js +2 -1
- package/dist/esm/RenderingEngine/StackViewport.d.ts +1 -3
- package/dist/esm/RenderingEngine/StackViewport.js +15 -8
- package/dist/esm/RenderingEngine/VideoViewport.js +2 -2
- package/dist/esm/RenderingEngine/Viewport.js +4 -1
- package/dist/esm/RenderingEngine/VolumeViewport.d.ts +1 -1
- package/dist/esm/RenderingEngine/VolumeViewport.js +8 -3
- package/dist/esm/RenderingEngine/WSIViewport.js +1 -1
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/renderPseudoColorImage.js +1 -1
- package/dist/esm/RenderingEngine/helpers/createVolumeActor.js +1 -1
- package/dist/esm/RenderingEngine/helpers/setDefaultVolumeVOI.js +3 -2
- package/dist/esm/RenderingEngine/helpers/volumeNewImageEventDispatcher.js +4 -4
- package/dist/esm/RenderingEngine/vtkClasses/vtkStreamingOpenGLTexture.js +1 -1
- package/dist/esm/cache/cache.js +2 -1
- package/dist/esm/cache/classes/BaseStreamingImageVolume.d.ts +85 -0
- package/dist/esm/cache/classes/BaseStreamingImageVolume.js +339 -0
- package/dist/esm/cache/classes/ImageVolume.js +2 -1
- package/dist/esm/cache/classes/StreamingDynamicImageVolume.d.ts +52 -0
- package/dist/esm/cache/classes/StreamingDynamicImageVolume.js +81 -0
- package/dist/esm/cache/classes/StreamingImageVolume.d.ts +8 -0
- package/dist/esm/cache/classes/StreamingImageVolume.js +21 -0
- package/dist/esm/cache/index.d.ts +4 -3
- package/dist/esm/cache/index.js +4 -3
- package/dist/esm/enums/Events.d.ts +2 -1
- package/dist/esm/enums/Events.js +1 -0
- package/dist/esm/index.d.ts +8 -3
- package/dist/esm/index.js +8 -3
- package/dist/esm/init.js +1 -1
- package/dist/esm/loaders/ProgressiveRetrieveImages.js +4 -2
- package/dist/esm/loaders/cornerstoneStreamingDynamicImageVolumeLoader.d.ts +10 -0
- package/dist/esm/loaders/cornerstoneStreamingDynamicImageVolumeLoader.js +58 -0
- package/dist/esm/loaders/cornerstoneStreamingImageVolumeLoader.d.ts +12 -0
- package/dist/esm/loaders/cornerstoneStreamingImageVolumeLoader.js +73 -0
- package/dist/esm/loaders/geometryLoader.js +1 -1
- package/dist/esm/loaders/imageLoader.js +6 -2
- package/dist/esm/loaders/volumeLoader.d.ts +1 -0
- package/dist/esm/loaders/volumeLoader.js +34 -5
- package/dist/esm/requestPool/requestPoolManager.js +1 -1
- package/dist/esm/types/CPUFallbackEnabledElement.d.ts +1 -39
- package/dist/esm/types/IImage.d.ts +37 -2
- package/dist/esm/types/ImageLoadRequests.d.ts +24 -0
- package/dist/esm/types/ImageLoadRequests.js +1 -0
- package/dist/esm/types/index.d.ts +3 -2
- package/dist/esm/utilities/VoxelManager.js +1 -1
- package/dist/esm/utilities/autoLoad.d.ts +2 -0
- package/dist/esm/utilities/autoLoad.js +28 -0
- package/dist/esm/utilities/calculateViewportsSpatialRegistration.js +3 -3
- package/dist/esm/utilities/convertVolumeToStackViewport.js +2 -1
- package/dist/esm/utilities/getClosestStackImageIndexForPoint.js +2 -2
- package/dist/esm/utilities/getDynamicVolumeInfo.d.ts +6 -0
- package/dist/esm/utilities/getDynamicVolumeInfo.js +7 -0
- package/dist/esm/utilities/getImageLegacy.js +1 -1
- package/dist/esm/utilities/getScalingParameters.js +4 -4
- package/dist/esm/utilities/getViewportImageIds.js +1 -1
- package/dist/esm/utilities/imageToWorldCoords.js +2 -2
- package/dist/esm/utilities/index.d.ts +5 -1
- package/dist/esm/utilities/index.js +6 -2
- package/dist/esm/utilities/isValidVolume.js +1 -1
- package/dist/esm/utilities/loadImageToCanvas.js +1 -1
- package/dist/esm/utilities/makeVolumeMetadata.js +5 -5
- package/dist/esm/utilities/scaleArray.d.ts +2 -0
- package/dist/esm/utilities/scaleArray.js +15 -0
- package/dist/esm/utilities/sortImageIdsAndGetSpacing.js +2 -1
- package/dist/esm/utilities/splitImageIdsBy4DTags.d.ts +5 -0
- package/dist/esm/utilities/splitImageIdsBy4DTags.js +161 -0
- package/dist/esm/utilities/worldToImageCoords.js +2 -2
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +3 -2
- package/dist/esm/utilities/isTypedArray.d.ts +0 -1
- package/dist/esm/utilities/isTypedArray.js +0 -11
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default function scaleArray(array, scalingParameters) {
|
|
2
|
+
const arrayLength = array.length;
|
|
3
|
+
const { rescaleSlope, rescaleIntercept, suvbw } = scalingParameters;
|
|
4
|
+
if (scalingParameters.modality === 'PT' && typeof suvbw === 'number') {
|
|
5
|
+
for (let i = 0; i < arrayLength; i++) {
|
|
6
|
+
array[i] = suvbw * (array[i] * rescaleSlope + rescaleIntercept);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
for (let i = 0; i < arrayLength; i++) {
|
|
11
|
+
array[i] = array[i] * rescaleSlope + rescaleIntercept;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return array;
|
|
15
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { vec3 } from 'gl-matrix';
|
|
2
|
-
import
|
|
2
|
+
import * as metaData from '../metaData';
|
|
3
|
+
import { getConfiguration } from '../init';
|
|
3
4
|
export default function sortImageIdsAndGetSpacing(imageIds, scanAxisNormal) {
|
|
4
5
|
const { imagePositionPatient: referenceImagePositionPatient, imageOrientationPatient, } = metaData.get('imagePlaneModule', imageIds[0]);
|
|
5
6
|
if (!scanAxisNormal) {
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import * as metaData from '../metaData';
|
|
2
|
+
const groupBy = (array, key) => {
|
|
3
|
+
return array.reduce((rv, x) => {
|
|
4
|
+
(rv[x[key]] = rv[x[key]] || []).push(x);
|
|
5
|
+
return rv;
|
|
6
|
+
}, {});
|
|
7
|
+
};
|
|
8
|
+
function getIPPGroups(imageIds) {
|
|
9
|
+
const ippMetadata = imageIds.map((imageId) => {
|
|
10
|
+
const { imagePositionPatient } = metaData.get('imagePlaneModule', imageId) || {};
|
|
11
|
+
return { imageId, imagePositionPatient };
|
|
12
|
+
});
|
|
13
|
+
if (!ippMetadata.every((item) => item.imagePositionPatient)) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const positionGroups = groupBy(ippMetadata, 'imagePositionPatient');
|
|
17
|
+
const positions = Object.keys(positionGroups);
|
|
18
|
+
const frame_count = positionGroups[positions[0]].length;
|
|
19
|
+
if (frame_count === 1) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const frame_count_equal = positions.every((k) => positionGroups[k].length === frame_count);
|
|
23
|
+
if (!frame_count_equal) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return positionGroups;
|
|
27
|
+
}
|
|
28
|
+
function test4DTag(IPPGroups, value_getter) {
|
|
29
|
+
const frame_groups = {};
|
|
30
|
+
let first_frame_value_set = [];
|
|
31
|
+
const positions = Object.keys(IPPGroups);
|
|
32
|
+
for (let i = 0; i < positions.length; i++) {
|
|
33
|
+
const frame_value_set = new Set();
|
|
34
|
+
const frames = IPPGroups[positions[i]];
|
|
35
|
+
for (let j = 0; j < frames.length; j++) {
|
|
36
|
+
const frame_value = value_getter(frames[j].imageId) || 0;
|
|
37
|
+
frame_groups[frame_value] = frame_groups[frame_value] || [];
|
|
38
|
+
frame_groups[frame_value].push({ imageId: frames[j].imageId });
|
|
39
|
+
frame_value_set.add(frame_value);
|
|
40
|
+
if (frame_value_set.size - 1 < j) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (i == 0) {
|
|
45
|
+
first_frame_value_set = Array.from(frame_value_set);
|
|
46
|
+
}
|
|
47
|
+
else if (!setEquals(first_frame_value_set, frame_value_set)) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return frame_groups;
|
|
52
|
+
}
|
|
53
|
+
function getTagValue(imageId, tag) {
|
|
54
|
+
const value = metaData.get(tag, imageId);
|
|
55
|
+
try {
|
|
56
|
+
return parseFloat(value);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function getPhilipsPrivateBValue(imageId) {
|
|
63
|
+
const value = metaData.get('20011003', imageId);
|
|
64
|
+
try {
|
|
65
|
+
const { InlineBinary } = value;
|
|
66
|
+
if (InlineBinary) {
|
|
67
|
+
const value_bytes = atob(InlineBinary);
|
|
68
|
+
const ary_buf = new ArrayBuffer(value_bytes.length);
|
|
69
|
+
const dv = new DataView(ary_buf);
|
|
70
|
+
for (let i = 0; i < value_bytes.length; i++) {
|
|
71
|
+
dv.setUint8(i, value_bytes.charCodeAt(i));
|
|
72
|
+
}
|
|
73
|
+
return new Float32Array(ary_buf)[0];
|
|
74
|
+
}
|
|
75
|
+
return parseFloat(value);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function getSiemensPrivateBValue(imageId) {
|
|
82
|
+
let value = metaData.get('0019100c', imageId) || metaData.get('0019100C', imageId);
|
|
83
|
+
try {
|
|
84
|
+
const { InlineBinary } = value;
|
|
85
|
+
if (InlineBinary) {
|
|
86
|
+
value = atob(InlineBinary);
|
|
87
|
+
}
|
|
88
|
+
return parseFloat(value);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function getGEPrivateBValue(imageId) {
|
|
95
|
+
let value = metaData.get('00431039', imageId);
|
|
96
|
+
try {
|
|
97
|
+
const { InlineBinary } = value;
|
|
98
|
+
if (InlineBinary) {
|
|
99
|
+
value = atob(InlineBinary).split('//');
|
|
100
|
+
}
|
|
101
|
+
return parseFloat(value[0]) % 100000;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function setEquals(set_a, set_b) {
|
|
108
|
+
if (set_a.length != set_b.size) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
for (let i = 0; i < set_a.length; i++) {
|
|
112
|
+
if (!set_b.has(set_a[i])) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
function getPetFrameReferenceTime(imageId) {
|
|
119
|
+
const moduleInfo = metaData.get('petImageModule', imageId);
|
|
120
|
+
return moduleInfo ? moduleInfo['frameReferenceTime'] : 0;
|
|
121
|
+
}
|
|
122
|
+
function splitImageIdsBy4DTags(imageIds) {
|
|
123
|
+
const positionGroups = getIPPGroups(imageIds);
|
|
124
|
+
if (!positionGroups) {
|
|
125
|
+
return { imageIdGroups: [imageIds], splittingTag: null };
|
|
126
|
+
}
|
|
127
|
+
const tags = [
|
|
128
|
+
'TemporalPositionIdentifier',
|
|
129
|
+
'DiffusionBValue',
|
|
130
|
+
'TriggerTime',
|
|
131
|
+
'EchoTime',
|
|
132
|
+
'EchoNumber',
|
|
133
|
+
'PhilipsPrivateBValue',
|
|
134
|
+
'SiemensPrivateBValue',
|
|
135
|
+
'GEPrivateBValue',
|
|
136
|
+
'PetFrameReferenceTime',
|
|
137
|
+
];
|
|
138
|
+
const fncList2 = [
|
|
139
|
+
(imageId) => getTagValue(imageId, tags[0]),
|
|
140
|
+
(imageId) => getTagValue(imageId, tags[1]),
|
|
141
|
+
(imageId) => getTagValue(imageId, tags[2]),
|
|
142
|
+
(imageId) => getTagValue(imageId, tags[3]),
|
|
143
|
+
(imageId) => getTagValue(imageId, tags[4]),
|
|
144
|
+
getPhilipsPrivateBValue,
|
|
145
|
+
getSiemensPrivateBValue,
|
|
146
|
+
getGEPrivateBValue,
|
|
147
|
+
getPetFrameReferenceTime,
|
|
148
|
+
];
|
|
149
|
+
for (let i = 0; i < fncList2.length; i++) {
|
|
150
|
+
const frame_groups = test4DTag(positionGroups, fncList2[i]);
|
|
151
|
+
if (frame_groups) {
|
|
152
|
+
const sortedKeys = Object.keys(frame_groups)
|
|
153
|
+
.map(Number.parseFloat)
|
|
154
|
+
.sort((a, b) => a - b);
|
|
155
|
+
const imageIdGroups = sortedKeys.map((key) => frame_groups[key].map((item) => item.imageId));
|
|
156
|
+
return { imageIdGroups, splittingTag: tags[i] };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return { imageIdGroups: [imageIds], splittingTag: null };
|
|
160
|
+
}
|
|
161
|
+
export default splitImageIdsBy4DTags;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { vec3 } from 'gl-matrix';
|
|
2
|
-
import {
|
|
2
|
+
import { get } from '../metaData';
|
|
3
3
|
function worldToImageCoords(imageId, worldCoords) {
|
|
4
|
-
const imagePlaneModule =
|
|
4
|
+
const imagePlaneModule = get('imagePlaneModule', imageId);
|
|
5
5
|
if (!imagePlaneModule) {
|
|
6
6
|
throw new Error(`No imagePlaneModule found for imageId: ${imageId}`);
|
|
7
7
|
}
|