@cornerstonejs/core 2.0.0-beta.1 → 2.0.0-beta.3
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/cjs/RenderingEngine/BaseVolumeViewport.d.ts +4 -1
- package/dist/cjs/RenderingEngine/BaseVolumeViewport.js +28 -2
- package/dist/cjs/RenderingEngine/BaseVolumeViewport.js.map +1 -1
- package/dist/cjs/RenderingEngine/RenderingEngine.js.map +1 -1
- package/dist/cjs/RenderingEngine/StackViewport.d.ts +1 -0
- package/dist/cjs/RenderingEngine/StackViewport.js +17 -8
- package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
- package/dist/cjs/RenderingEngine/VolumeViewport.d.ts +2 -0
- package/dist/cjs/RenderingEngine/VolumeViewport.js +30 -0
- package/dist/cjs/RenderingEngine/VolumeViewport.js.map +1 -1
- package/dist/cjs/RenderingEngine/VolumeViewport3D.d.ts +1 -0
- package/dist/cjs/RenderingEngine/VolumeViewport3D.js +3 -0
- package/dist/cjs/RenderingEngine/VolumeViewport3D.js.map +1 -1
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js +3 -1
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js.map +1 -1
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js +3 -2
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js.map +1 -1
- package/dist/cjs/RenderingEngine/helpers/setVolumesForViewports.js.map +1 -1
- package/dist/cjs/Settings.js +4 -2
- package/dist/cjs/Settings.js.map +1 -1
- package/dist/cjs/cache/cache.d.ts +3 -1
- package/dist/cjs/cache/cache.js +12 -7
- package/dist/cjs/cache/cache.js.map +1 -1
- package/dist/cjs/cache/classes/ImageVolume.js +2 -3
- package/dist/cjs/cache/classes/ImageVolume.js.map +1 -1
- package/dist/cjs/init.d.ts +1 -1
- package/dist/cjs/init.js +1 -1
- package/dist/cjs/init.js.map +1 -1
- package/dist/cjs/loaders/volumeLoader.d.ts +1 -1
- package/dist/cjs/loaders/volumeLoader.js.map +1 -1
- package/dist/cjs/requestPool/requestPoolManager.js +1 -1
- package/dist/cjs/requestPool/requestPoolManager.js.map +1 -1
- package/dist/cjs/types/AffineMatrix.d.ts +27 -0
- package/dist/cjs/types/AffineMatrix.js +3 -0
- package/dist/cjs/types/AffineMatrix.js.map +1 -0
- package/dist/cjs/types/IImage.d.ts +3 -0
- package/dist/cjs/types/IVolumeViewport.d.ts +2 -0
- package/dist/cjs/types/Mat3.d.ts +1 -11
- package/dist/cjs/types/ViewportProperties.d.ts +2 -1
- package/dist/cjs/types/index.d.ts +2 -1
- package/dist/cjs/utilities/calculateViewportsSpatialRegistration.js +9 -14
- package/dist/cjs/utilities/calculateViewportsSpatialRegistration.js.map +1 -1
- package/dist/cjs/utilities/getClosestStackImageIndexForPoint.js +12 -6
- package/dist/cjs/utilities/getClosestStackImageIndexForPoint.js.map +1 -1
- package/dist/cjs/utilities/getRuntimeId.js +2 -1
- package/dist/cjs/utilities/getRuntimeId.js.map +1 -1
- package/dist/cjs/utilities/windowLevel.js +4 -4
- package/dist/cjs/utilities/windowLevel.js.map +1 -1
- package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +4 -1
- package/dist/esm/RenderingEngine/BaseVolumeViewport.js +28 -2
- package/dist/esm/RenderingEngine/BaseVolumeViewport.js.map +1 -1
- package/dist/esm/RenderingEngine/RenderingEngine.js.map +1 -1
- package/dist/esm/RenderingEngine/StackViewport.d.ts +1 -0
- package/dist/esm/RenderingEngine/StackViewport.js +17 -8
- package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
- package/dist/esm/RenderingEngine/VolumeViewport.d.ts +2 -0
- package/dist/esm/RenderingEngine/VolumeViewport.js +32 -2
- package/dist/esm/RenderingEngine/VolumeViewport.js.map +1 -1
- package/dist/esm/RenderingEngine/VolumeViewport3D.d.ts +1 -0
- package/dist/esm/RenderingEngine/VolumeViewport3D.js +3 -0
- package/dist/esm/RenderingEngine/VolumeViewport3D.js.map +1 -1
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js +3 -1
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js.map +1 -1
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js +3 -2
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js.map +1 -1
- package/dist/esm/RenderingEngine/helpers/setVolumesForViewports.js.map +1 -1
- package/dist/esm/Settings.js +4 -2
- package/dist/esm/Settings.js.map +1 -1
- package/dist/esm/cache/cache.d.ts +3 -1
- package/dist/esm/cache/cache.js +12 -7
- package/dist/esm/cache/cache.js.map +1 -1
- package/dist/esm/cache/classes/ImageVolume.js +2 -3
- package/dist/esm/cache/classes/ImageVolume.js.map +1 -1
- package/dist/esm/init.d.ts +1 -1
- package/dist/esm/init.js +1 -1
- package/dist/esm/init.js.map +1 -1
- package/dist/esm/loaders/volumeLoader.d.ts +1 -1
- package/dist/esm/loaders/volumeLoader.js.map +1 -1
- package/dist/esm/requestPool/requestPoolManager.js +1 -1
- package/dist/esm/requestPool/requestPoolManager.js.map +1 -1
- package/dist/esm/types/AffineMatrix.d.ts +27 -0
- package/dist/esm/types/AffineMatrix.js +2 -0
- package/dist/esm/types/AffineMatrix.js.map +1 -0
- package/dist/esm/types/IImage.d.ts +3 -0
- package/dist/esm/types/IVolumeViewport.d.ts +2 -0
- package/dist/esm/types/Mat3.d.ts +1 -11
- package/dist/esm/types/ViewportProperties.d.ts +2 -1
- package/dist/esm/types/index.d.ts +2 -1
- package/dist/esm/utilities/calculateViewportsSpatialRegistration.js +9 -14
- package/dist/esm/utilities/calculateViewportsSpatialRegistration.js.map +1 -1
- package/dist/esm/utilities/getClosestStackImageIndexForPoint.js +12 -6
- package/dist/esm/utilities/getClosestStackImageIndexForPoint.js.map +1 -1
- package/dist/esm/utilities/getRuntimeId.js +2 -1
- package/dist/esm/utilities/getRuntimeId.js.map +1 -1
- package/dist/esm/utilities/windowLevel.js +4 -4
- package/dist/esm/utilities/windowLevel.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +2 -2
- package/src/RenderingEngine/BaseVolumeViewport.ts +55 -1
- package/src/RenderingEngine/RenderingEngine.ts +1 -0
- package/src/RenderingEngine/StackViewport.ts +25 -9
- package/src/RenderingEngine/Viewport.ts +1 -1
- package/src/RenderingEngine/VolumeViewport.ts +53 -2
- package/src/RenderingEngine/VolumeViewport3D.ts +4 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.ts +9 -1
- package/src/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.ts +5 -3
- package/src/RenderingEngine/helpers/setVolumesForViewports.ts +3 -1
- package/src/Settings.ts +6 -2
- package/src/cache/cache.ts +33 -18
- package/src/cache/classes/ImageVolume.ts +3 -3
- package/src/init.ts +1 -1
- package/src/loaders/volumeLoader.ts +2 -2
- package/src/requestPool/requestPoolManager.ts +1 -1
- package/src/types/AffineMatrix.ts +8 -0
- package/src/types/IImage.ts +4 -0
- package/src/types/IVolumeViewport.ts +8 -0
- package/src/types/Mat3.ts +3 -11
- package/src/types/ViewportProperties.ts +3 -1
- package/src/types/index.ts +2 -0
- package/src/utilities/calculateViewportsSpatialRegistration.ts +21 -28
- package/src/utilities/getClosestStackImageIndexForPoint.ts +18 -6
- package/src/utilities/getRuntimeId.ts +3 -1
- package/src/utilities/windowLevel.ts +13 -4
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { vec3, mat4 } from 'gl-matrix';
|
|
2
2
|
import { IStackViewport } from '../types';
|
|
3
|
-
import { StackViewport } from '../RenderingEngine';
|
|
4
3
|
import spatialRegistrationMetadataProvider from './spatialRegistrationMetadataProvider';
|
|
5
4
|
import { metaData } from '..';
|
|
6
|
-
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Defines the allowed difference as a percent between the unit normals before
|
|
8
|
+
* two planes are considered not coplanar. Since this value is small compared
|
|
9
|
+
* to the unit lenght, this value is approximately the angular difference, measured
|
|
10
|
+
* in radians. That is, allow about a 3 degrees variation.
|
|
11
|
+
*/
|
|
12
|
+
const ALLOWED_DELTA = 0.05;
|
|
7
13
|
|
|
8
14
|
/**
|
|
9
15
|
* It calculates the registration matrix between two viewports (currently only
|
|
@@ -21,40 +27,28 @@ function calculateViewportsSpatialRegistration(
|
|
|
21
27
|
viewport1: IStackViewport,
|
|
22
28
|
viewport2: IStackViewport
|
|
23
29
|
): void {
|
|
24
|
-
if (
|
|
25
|
-
!(viewport1 instanceof StackViewport) ||
|
|
26
|
-
!(viewport2 instanceof StackViewport)
|
|
27
|
-
) {
|
|
28
|
-
throw new Error(
|
|
29
|
-
'calculateViewportsSpatialRegistration: Both viewports must be StackViewports, volume viewports are not supported yet'
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const isSameFrameOfReference =
|
|
34
|
-
viewport1.getFrameOfReferenceUID() === viewport2.getFrameOfReferenceUID();
|
|
35
|
-
|
|
36
|
-
if (isSameFrameOfReference) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
30
|
const imageId1 = viewport1.getCurrentImageId();
|
|
41
31
|
const imageId2 = viewport2.getCurrentImageId();
|
|
42
32
|
|
|
43
33
|
const imagePlaneModule1 = metaData.get('imagePlaneModule', imageId1);
|
|
44
34
|
const imagePlaneModule2 = metaData.get('imagePlaneModule', imageId2);
|
|
45
35
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
)
|
|
36
|
+
if (!imagePlaneModule1 || !imagePlaneModule2) {
|
|
37
|
+
console.log('Viewport spatial registration requires image plane module');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const { imageOrientationPatient: iop2 } = imagePlaneModule2;
|
|
41
|
+
const isSameImagePlane = imagePlaneModule1.imageOrientationPatient.every(
|
|
42
|
+
(v, i) => Math.abs(v - iop2[i]) < ALLOWED_DELTA
|
|
43
|
+
);
|
|
53
44
|
|
|
54
45
|
if (!isSameImagePlane) {
|
|
55
|
-
|
|
56
|
-
'Viewport spatial registration only supported for same orientation (hence translation only) for now'
|
|
46
|
+
console.log(
|
|
47
|
+
'Viewport spatial registration only supported for same orientation (hence translation only) for now',
|
|
48
|
+
imagePlaneModule1?.imageOrientationPatient,
|
|
49
|
+
imagePlaneModule2?.imageOrientationPatient
|
|
57
50
|
);
|
|
51
|
+
return;
|
|
58
52
|
}
|
|
59
53
|
|
|
60
54
|
const imagePositionPatient1 = imagePlaneModule1.imagePositionPatient;
|
|
@@ -67,7 +61,6 @@ function calculateViewportsSpatialRegistration(
|
|
|
67
61
|
);
|
|
68
62
|
|
|
69
63
|
const mat = mat4.fromTranslation(mat4.create(), translation);
|
|
70
|
-
|
|
71
64
|
spatialRegistrationMetadataProvider.add([viewport1.id, viewport2.id], mat);
|
|
72
65
|
}
|
|
73
66
|
|
|
@@ -29,11 +29,15 @@ export function calculateMinimalDistanceForStackViewport(
|
|
|
29
29
|
const imageIds = viewport.getImageIds();
|
|
30
30
|
const currentImageIdIndex = viewport.getCurrentImageIdIndex();
|
|
31
31
|
|
|
32
|
-
if (imageIds.length === 0)
|
|
32
|
+
if (imageIds.length === 0) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
33
35
|
|
|
34
36
|
const getDistance = (imageId: string): null | number => {
|
|
35
37
|
const planeMetadata = getPlaneMetadata(imageId);
|
|
36
|
-
if (!planeMetadata)
|
|
38
|
+
if (!planeMetadata) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
37
41
|
const plane = planar.planeEquation(
|
|
38
42
|
planeMetadata.planeNormal,
|
|
39
43
|
planeMetadata.imagePositionPatient
|
|
@@ -53,22 +57,30 @@ export function calculateMinimalDistanceForStackViewport(
|
|
|
53
57
|
for (let i = 0; i < higherImageIds.length; i++) {
|
|
54
58
|
const id = higherImageIds[i];
|
|
55
59
|
const distance = getDistance(id);
|
|
56
|
-
if (distance === null)
|
|
60
|
+
if (distance === null) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
57
63
|
if (distance <= closestStack.distance) {
|
|
58
64
|
closestStack.distance = distance;
|
|
59
65
|
closestStack.index = i + currentImageIdIndex + 1;
|
|
60
|
-
} else
|
|
66
|
+
} else {
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
61
69
|
}
|
|
62
70
|
//check lower indices
|
|
63
71
|
const lowerImageIds = imageIds.slice(0, currentImageIdIndex);
|
|
64
72
|
for (let i = lowerImageIds.length - 1; i >= 0; i--) {
|
|
65
73
|
const id = lowerImageIds[i];
|
|
66
74
|
const distance = getDistance(id);
|
|
67
|
-
if (distance === null || distance === closestStack.distance)
|
|
75
|
+
if (distance === null || distance === closestStack.distance) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
68
78
|
if (distance < closestStack.distance) {
|
|
69
79
|
closestStack.distance = distance;
|
|
70
80
|
closestStack.index = i;
|
|
71
|
-
} else
|
|
81
|
+
} else {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
72
84
|
}
|
|
73
85
|
return closestStack.distance === Infinity ? null : closestStack;
|
|
74
86
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Given a low and high window level, return the window width and window center
|
|
3
|
+
* Formulas from note 4 in
|
|
4
|
+
* https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1
|
|
5
|
+
* extended to allow for low/high swapping
|
|
3
6
|
* @param low - The low window level.
|
|
4
7
|
* @param high - The high window level.
|
|
5
8
|
* @returns a JavaScript object with two properties: windowWidth and windowCenter.
|
|
@@ -11,14 +14,20 @@ function toWindowLevel(
|
|
|
11
14
|
windowWidth: number;
|
|
12
15
|
windowCenter: number;
|
|
13
16
|
} {
|
|
14
|
-
|
|
15
|
-
const
|
|
17
|
+
// Allow for swapping high/low
|
|
18
|
+
const windowWidth = Math.abs(high - low) + 1;
|
|
19
|
+
const windowCenter = (low + high + 1) / 2;
|
|
16
20
|
|
|
17
21
|
return { windowWidth, windowCenter };
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
/**
|
|
21
25
|
* Given a window width and center, return the lower and upper bounds of the window
|
|
26
|
+
* The formulas for the calculation are specified in
|
|
27
|
+
* https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1
|
|
28
|
+
* if (x <= c - 0.5 - (w-1) /2), then y = ymin
|
|
29
|
+
* else if (x > c - 0.5 + (w-1) /2), then y = ymax
|
|
30
|
+
* else y = ((x - (c - 0.5)) / (w-1) + 0.5) * (ymax- ymin) + ymin
|
|
22
31
|
* @param windowWidth - the width of the window in HU
|
|
23
32
|
* @param windowCenter - The center of the window.
|
|
24
33
|
* @returns a JavaScript object with two properties: lower and upper.
|
|
@@ -30,8 +39,8 @@ function toLowHighRange(
|
|
|
30
39
|
lower: number;
|
|
31
40
|
upper: number;
|
|
32
41
|
} {
|
|
33
|
-
const lower = windowCenter - windowWidth / 2
|
|
34
|
-
const upper = windowCenter + windowWidth / 2
|
|
42
|
+
const lower = windowCenter - 0.5 - (windowWidth - 1) / 2;
|
|
43
|
+
const upper = windowCenter - 0.5 + (windowWidth - 1) / 2;
|
|
35
44
|
|
|
36
45
|
return { lower, upper };
|
|
37
46
|
}
|