@cornerstonejs/adapters 4.21.2 → 4.21.4
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/adapters/Cornerstone/ParametricMap.js +13 -13
- package/dist/esm/adapters/Cornerstone/index.d.ts +11 -11
- package/dist/esm/adapters/Cornerstone3D/Angle.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Angle.js +1 -1
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +2 -2
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.js +8 -8
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +5 -5
- package/dist/esm/adapters/Cornerstone3D/CircleROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +1 -1
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +1 -1
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +1 -1
- package/dist/esm/adapters/Cornerstone3D/KeyImage.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/KeyImage.js +2 -2
- package/dist/esm/adapters/Cornerstone3D/Length.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Length.js +1 -1
- package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Probe.js +4 -4
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.d.ts +2 -2
- package/dist/esm/adapters/Cornerstone3D/Segmentation/compactMergeSegData.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Segmentation/index.d.ts +4 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.d.ts +2 -2
- package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js +23 -23
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +2 -2
- package/dist/esm/adapters/Cornerstone3D/metricHandler.js +15 -15
- package/dist/esm/adapters/VTKjs/index.d.ts +1 -1
- package/dist/esm/adapters/enums/index.d.ts +1 -1
- package/dist/esm/adapters/helpers/checkOrientation.js +3 -3
- package/dist/esm/adapters/helpers/index.d.ts +9 -9
- package/dist/esm/adapters/helpers/scoordToWorld.d.ts +1 -1
- package/dist/esm/adapters/helpers/toPoint3.d.ts +1 -1
- package/dist/esm/adapters/helpers/toScoordType.d.ts +1 -1
- package/dist/esm/adapters/index.d.ts +4 -4
- package/dist/esm/version.d.ts +1 -1
- package/package.json +7 -7
|
@@ -15,9 +15,9 @@ async function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
|
15
15
|
const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
|
16
16
|
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
17
17
|
const multiframe = Normalizer.normalizeToDataset([dataset]);
|
|
18
|
-
const imagePlaneModule = metadataProvider.get(
|
|
18
|
+
const imagePlaneModule = metadataProvider.get('imagePlaneModule', imageIds[0]);
|
|
19
19
|
if (!imagePlaneModule) {
|
|
20
|
-
console.warn(
|
|
20
|
+
console.warn('Insufficient metadata, imagePlaneModule missing.');
|
|
21
21
|
}
|
|
22
22
|
const ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [...imagePlaneModule.rowCosines, ...imagePlaneModule.columnCosines] : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z];
|
|
23
23
|
const validOrientations = [ImageOrientationPatient];
|
|
@@ -26,20 +26,20 @@ async function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
|
26
26
|
const sopUIDImageIdIndexMap = imageIds.reduce((acc, imageId) => {
|
|
27
27
|
const {
|
|
28
28
|
sopInstanceUID
|
|
29
|
-
} = metadataProvider.get(
|
|
29
|
+
} = metadataProvider.get('generalImageModule', imageId);
|
|
30
30
|
acc[sopInstanceUID] = imageId;
|
|
31
31
|
return acc;
|
|
32
32
|
}, {});
|
|
33
|
-
if (orientation !==
|
|
33
|
+
if (orientation !== 'Planar') {
|
|
34
34
|
const orientationText = {
|
|
35
|
-
Perpendicular:
|
|
36
|
-
Oblique:
|
|
35
|
+
Perpendicular: 'orthogonal',
|
|
36
|
+
Oblique: 'oblique'
|
|
37
37
|
};
|
|
38
38
|
throw new Error("Parametric maps ".concat(orientationText[orientation], " to the acquisition plane of the source data are not yet supported."));
|
|
39
39
|
}
|
|
40
40
|
const imageIdMaps = imageIds.reduce((acc, curr, index) => {
|
|
41
41
|
acc.indices[curr] = index;
|
|
42
|
-
acc.metadata[curr] = metadataProvider.get(
|
|
42
|
+
acc.metadata[curr] = metadataProvider.get('instance', curr);
|
|
43
43
|
return acc;
|
|
44
44
|
}, {
|
|
45
45
|
indices: {},
|
|
@@ -63,12 +63,12 @@ function insertPixelDataPlanar(sourcePixelData, multiframe, imageIds, metadataPr
|
|
|
63
63
|
const sourceSliceDataView = new sourcePixelData.constructor(sourcePixelData.buffer, i * sliceLength, sliceLength);
|
|
64
64
|
const imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
65
65
|
if (!imageId) {
|
|
66
|
-
console.warn("Image not present in stack, can't import frame : " + i +
|
|
66
|
+
console.warn("Image not present in stack, can't import frame : " + i + '.');
|
|
67
67
|
continue;
|
|
68
68
|
}
|
|
69
69
|
const sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
70
70
|
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
71
|
-
throw new Error(
|
|
71
|
+
throw new Error('Parametric map have different geometry dimensions (Rows and Columns) ' + 'respect to the source image reference frame. This is not yet supported.');
|
|
72
72
|
}
|
|
73
73
|
const imageIdIndex = imageIdMaps.indices[imageId];
|
|
74
74
|
const byteOffset = sliceLength * imageIdIndex * targetPixelData.BYTES_PER_ELEMENT;
|
|
@@ -93,7 +93,7 @@ function getPixelData(multiframe) {
|
|
|
93
93
|
data = multiframe.DoubleFloatPixelData;
|
|
94
94
|
}
|
|
95
95
|
if (data === undefined) {
|
|
96
|
-
log.error(
|
|
96
|
+
log.error('This parametric map pixel data is undefined.');
|
|
97
97
|
}
|
|
98
98
|
if (Array.isArray(data)) {
|
|
99
99
|
data = data[0];
|
|
@@ -139,7 +139,7 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
|
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
} else if (SourceImageSequence && SourceImageSequence.length !== 0) {
|
|
142
|
-
console.warn(
|
|
142
|
+
console.warn('DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image.');
|
|
143
143
|
frameSourceImageSequence = SourceImageSequence[frameSegment];
|
|
144
144
|
}
|
|
145
145
|
if (frameSourceImageSequence) {
|
|
@@ -164,7 +164,7 @@ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfR
|
|
|
164
164
|
return undefined;
|
|
165
165
|
}
|
|
166
166
|
for (let imageIdsIndex = 0; imageIdsIndex < imageIds.length; ++imageIdsIndex) {
|
|
167
|
-
const sourceImageMetadata = metadataProvider.get(
|
|
167
|
+
const sourceImageMetadata = metadataProvider.get('instance', imageIds[imageIdsIndex]);
|
|
168
168
|
if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
|
|
169
169
|
continue;
|
|
170
170
|
}
|
|
@@ -178,7 +178,7 @@ function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdI
|
|
|
178
178
|
if (!imageId) {
|
|
179
179
|
return;
|
|
180
180
|
}
|
|
181
|
-
const imageIdFrameNumber = Number(imageId.split(
|
|
181
|
+
const imageIdFrameNumber = Number(imageId.split('frame=')[1]);
|
|
182
182
|
return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
|
|
183
183
|
}
|
|
184
184
|
const ParametricMapObj = {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import MeasurementReport from
|
|
2
|
-
import Length from
|
|
3
|
-
import FreehandRoi from
|
|
4
|
-
import Bidirectional from
|
|
5
|
-
import EllipticalRoi from
|
|
6
|
-
import CircleRoi from
|
|
7
|
-
import ArrowAnnotate from
|
|
8
|
-
import CobbAngle from
|
|
9
|
-
import Angle from
|
|
10
|
-
import RectangleRoi from
|
|
11
|
-
import * as Segmentation from
|
|
1
|
+
import MeasurementReport from './MeasurementReport';
|
|
2
|
+
import Length from './Length';
|
|
3
|
+
import FreehandRoi from './FreehandRoi';
|
|
4
|
+
import Bidirectional from './Bidirectional';
|
|
5
|
+
import EllipticalRoi from './EllipticalRoi';
|
|
6
|
+
import CircleRoi from './CircleRoi';
|
|
7
|
+
import ArrowAnnotate from './ArrowAnnotate';
|
|
8
|
+
import CobbAngle from './CobbAngle';
|
|
9
|
+
import Angle from './Angle';
|
|
10
|
+
import RectangleRoi from './RectangleRoi';
|
|
11
|
+
import * as Segmentation from './Segmentation';
|
|
12
12
|
declare const CornerstoneSR: {
|
|
13
13
|
Length: typeof Length;
|
|
14
14
|
FreehandRoi: typeof FreehandRoi;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import BaseAdapter3D from
|
|
1
|
+
import BaseAdapter3D from './BaseAdapter3D';
|
|
2
2
|
declare class ArrowAnnotate extends BaseAdapter3D {
|
|
3
3
|
static getMeasurementData(MeasurementGroup: any, sopInstanceUIDToImageIdMap: any, metadata: any, _trackingIdentifier: any): {
|
|
4
4
|
description?: string;
|
|
@@ -25,7 +25,7 @@ class ArrowAnnotate extends BaseAdapter3D {
|
|
|
25
25
|
} = MeasurementReport.getSetupMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, this.toolType);
|
|
26
26
|
const text = state.annotation.data.label;
|
|
27
27
|
if (worldCoords.length === 1 && SCOORDGroup) {
|
|
28
|
-
const imagePixelModule = metadata.get(
|
|
28
|
+
const imagePixelModule = metadata.get('imagePixelModule', referencedImageId);
|
|
29
29
|
let xOffset = 10;
|
|
30
30
|
let yOffset = 10;
|
|
31
31
|
if (imagePixelModule) {
|
|
@@ -90,7 +90,7 @@ class ArrowAnnotate extends BaseAdapter3D {
|
|
|
90
90
|
}
|
|
91
91
|
_ArrowAnnotate = ArrowAnnotate;
|
|
92
92
|
(() => {
|
|
93
|
-
_ArrowAnnotate.init(
|
|
93
|
+
_ArrowAnnotate.init('ArrowAnnotate', TID300ArrowAnnotate);
|
|
94
94
|
_ArrowAnnotate.registerLegacy();
|
|
95
95
|
})();
|
|
96
96
|
|
|
@@ -6,25 +6,25 @@ import '@cornerstonejs/core';
|
|
|
6
6
|
|
|
7
7
|
class BaseAdapter3D {
|
|
8
8
|
static registerType() {
|
|
9
|
-
let code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] :
|
|
10
|
-
let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] :
|
|
9
|
+
let code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
10
|
+
let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
11
11
|
let count = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
12
12
|
let key = code;
|
|
13
13
|
if (type) {
|
|
14
|
-
key = "".concat(key).concat(key.length ?
|
|
14
|
+
key = "".concat(key).concat(key.length ? '-' : '').concat(type);
|
|
15
15
|
}
|
|
16
16
|
if (count) {
|
|
17
|
-
key = "".concat(key).concat(key.length ?
|
|
17
|
+
key = "".concat(key).concat(key.length ? '-' : '').concat(count);
|
|
18
18
|
}
|
|
19
19
|
MeasurementReport.registerAdapterTypes(this, key);
|
|
20
20
|
}
|
|
21
21
|
static getPointsCount(graphicItem) {
|
|
22
|
-
const is3DMeasurement = graphicItem.ValueType ===
|
|
22
|
+
const is3DMeasurement = graphicItem.ValueType === 'SCOORD3D';
|
|
23
23
|
const pointSize = is3DMeasurement ? 3 : 2;
|
|
24
24
|
return graphicItem.GraphicData.length / pointSize;
|
|
25
25
|
}
|
|
26
26
|
static getGraphicItems(measurementGroup, filter) {
|
|
27
|
-
const items = measurementGroup.ContentSequence.filter(group => group.ValueType ===
|
|
27
|
+
const items = measurementGroup.ContentSequence.filter(group => group.ValueType === 'SCOORD' || group.ValueType === 'SCOORD3D');
|
|
28
28
|
return filter ? items.filter(filter) : items;
|
|
29
29
|
}
|
|
30
30
|
static getGraphicItem(measurementGroup) {
|
|
@@ -82,7 +82,7 @@ class BaseAdapter3D {
|
|
|
82
82
|
if (this.trackingIdentifiers.has(trackingIdentifier)) {
|
|
83
83
|
return true;
|
|
84
84
|
}
|
|
85
|
-
if (!trackingIdentifier.includes(
|
|
85
|
+
if (!trackingIdentifier.includes(':')) {
|
|
86
86
|
return false;
|
|
87
87
|
}
|
|
88
88
|
return trackingIdentifier.startsWith(this.trackingIdentifierTextValue);
|
|
@@ -95,7 +95,7 @@ class BaseAdapter3D {
|
|
|
95
95
|
state.annotation.data = {
|
|
96
96
|
cachedStats: {},
|
|
97
97
|
frameNumber: ReferencedFrameNumber,
|
|
98
|
-
seriesLevel: (trackingIdentifier === null || trackingIdentifier === void 0 ? void 0 : trackingIdentifier.indexOf(
|
|
98
|
+
seriesLevel: (trackingIdentifier === null || trackingIdentifier === void 0 ? void 0 : trackingIdentifier.indexOf(':Series')) > 0
|
|
99
99
|
};
|
|
100
100
|
return state;
|
|
101
101
|
}
|
|
@@ -12,8 +12,8 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
12
12
|
const {
|
|
13
13
|
Bidirectional: TID300Bidirectional
|
|
14
14
|
} = utilities.TID300;
|
|
15
|
-
const LONG_AXIS =
|
|
16
|
-
const SHORT_AXIS =
|
|
15
|
+
const LONG_AXIS = 'Long Axis';
|
|
16
|
+
const SHORT_AXIS = 'Short Axis';
|
|
17
17
|
class Bidirectional extends BaseAdapter3D {
|
|
18
18
|
static getMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata) {
|
|
19
19
|
const {
|
|
@@ -27,8 +27,8 @@ class Bidirectional extends BaseAdapter3D {
|
|
|
27
27
|
} = MeasurementGroup;
|
|
28
28
|
const longAxisNUMGroup = toArray(ContentSequence).find(group => group.ConceptNameCodeSequence.CodeMeaning === LONG_AXIS);
|
|
29
29
|
const shortAxisNUMGroup = toArray(ContentSequence).find(group => group.ConceptNameCodeSequence.CodeMeaning === SHORT_AXIS);
|
|
30
|
-
const longAxisScoordGroup = toArray(longAxisNUMGroup.ContentSequence).find(group => group.ValueType ===
|
|
31
|
-
const shortAxisScoordGroup = toArray(shortAxisNUMGroup.ContentSequence).find(group => group.ValueType ===
|
|
30
|
+
const longAxisScoordGroup = toArray(longAxisNUMGroup.ContentSequence).find(group => group.ValueType === 'SCOORD3D' || group.ValueType === 'SCOORD');
|
|
31
|
+
const shortAxisScoordGroup = toArray(shortAxisNUMGroup.ContentSequence).find(group => group.ValueType === 'SCOORD3D' || group.ValueType === 'SCOORD');
|
|
32
32
|
const worldCoords = [];
|
|
33
33
|
worldCoords.push(...scoordToWorld(scoordArgs, longAxisScoordGroup));
|
|
34
34
|
worldCoords.push(...scoordToWorld(scoordArgs, shortAxisScoordGroup));
|
|
@@ -116,7 +116,7 @@ class Bidirectional extends BaseAdapter3D {
|
|
|
116
116
|
}
|
|
117
117
|
_Bidirectional = Bidirectional;
|
|
118
118
|
(() => {
|
|
119
|
-
_Bidirectional.init(
|
|
119
|
+
_Bidirectional.init('Bidirectional', TID300Bidirectional);
|
|
120
120
|
_Bidirectional.registerLegacy();
|
|
121
121
|
})();
|
|
122
122
|
|
|
@@ -11,7 +11,7 @@ class KeyImage extends Probe {
|
|
|
11
11
|
const {
|
|
12
12
|
data
|
|
13
13
|
} = baseData.annotation;
|
|
14
|
-
data.isPoint = trackingIdentifier.indexOf(
|
|
14
|
+
data.isPoint = trackingIdentifier.indexOf('Point') !== -1;
|
|
15
15
|
return baseData;
|
|
16
16
|
}
|
|
17
17
|
static getTID300RepresentationArguments(tool) {
|
|
@@ -39,7 +39,7 @@ class KeyImage extends Probe {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
_KeyImage = KeyImage;
|
|
42
|
-
_KeyImage.init(
|
|
42
|
+
_KeyImage.init('KeyImage', TID300Point, {
|
|
43
43
|
parentType: Probe.toolType
|
|
44
44
|
});
|
|
45
45
|
_KeyImage.trackingSeriesIdentifier = "".concat(_KeyImage.trackingIdentifierTextValue, ":Series");
|
|
@@ -11,7 +11,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
11
11
|
const {
|
|
12
12
|
Length: TID300Length
|
|
13
13
|
} = utilities.TID300;
|
|
14
|
-
const LENGTH =
|
|
14
|
+
const LENGTH = 'Length';
|
|
15
15
|
class Length extends BaseAdapter3D {
|
|
16
16
|
static getMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata) {
|
|
17
17
|
const {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import BaseAdapter3D from
|
|
1
|
+
import BaseAdapter3D from './BaseAdapter3D';
|
|
2
2
|
declare class Probe extends BaseAdapter3D {
|
|
3
3
|
static isValidMeasurement(measurement: any): boolean;
|
|
4
4
|
static getMeasurementData(MeasurementGroup: any, sopInstanceUIDToImageIdMap: any, metadata: any, _trackingIdentifier: any): {
|
|
@@ -14,7 +14,7 @@ const {
|
|
|
14
14
|
class Probe extends BaseAdapter3D {
|
|
15
15
|
static isValidMeasurement(measurement) {
|
|
16
16
|
const graphicItem = this.getGraphicItem(measurement);
|
|
17
|
-
return this.getGraphicType(graphicItem) ===
|
|
17
|
+
return this.getGraphicType(graphicItem) === 'POINT' && this.getPointsCount(graphicItem) <= 2;
|
|
18
18
|
}
|
|
19
19
|
static getMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, _trackingIdentifier) {
|
|
20
20
|
var _NUMGroup$MeasuredVal, _NUMGroup$MeasuredVal2;
|
|
@@ -75,10 +75,10 @@ class Probe extends BaseAdapter3D {
|
|
|
75
75
|
}
|
|
76
76
|
_Probe = Probe;
|
|
77
77
|
(() => {
|
|
78
|
-
_Probe.init(
|
|
78
|
+
_Probe.init('Probe', TID300Point);
|
|
79
79
|
_Probe.registerLegacy();
|
|
80
|
-
_Probe.registerType(
|
|
81
|
-
_Probe.registerType(
|
|
80
|
+
_Probe.registerType('DCM:111030', 'POINT', 1);
|
|
81
|
+
_Probe.registerType('DCM:111030', 'POINT', 2);
|
|
82
82
|
})();
|
|
83
83
|
|
|
84
84
|
export { Probe as default };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { utilities } from
|
|
2
|
-
export * from
|
|
1
|
+
import { utilities } from '@cornerstonejs/tools';
|
|
2
|
+
export * from './RTSS';
|
|
3
3
|
declare const generateContourSetsFromLabelmap: typeof utilities.contours.generateContourSetsFromLabelmap;
|
|
4
4
|
export { generateContourSetsFromLabelmap };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const compactMergeSegmentDataWithoutInformationLoss: ({ arrayOfSegmentData, newSegmentData }: {
|
|
1
|
+
export declare const compactMergeSegmentDataWithoutInformationLoss: ({ arrayOfSegmentData, newSegmentData, }: {
|
|
2
2
|
arrayOfSegmentData: any;
|
|
3
3
|
newSegmentData: any;
|
|
4
4
|
}) => void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { generateSegmentation } from
|
|
2
|
-
import { generateLabelMaps2DFrom3D } from
|
|
3
|
-
import { generateToolState, createFromDICOMSegBuffer } from
|
|
4
|
-
export { generateLabelMaps2DFrom3D, generateSegmentation, generateToolState, createFromDICOMSegBuffer };
|
|
1
|
+
import { generateSegmentation } from './generateSegmentation';
|
|
2
|
+
import { generateLabelMaps2DFrom3D } from './generateLabelMaps2DFrom3D';
|
|
3
|
+
import { generateToolState, createFromDICOMSegBuffer } from './generateToolState';
|
|
4
|
+
export { generateLabelMaps2DFrom3D, generateSegmentation, generateToolState, createFromDICOMSegBuffer, };
|
|
@@ -8,7 +8,7 @@ declare function createLabelmapsFromBufferInternal(referencedImageIds: any, arra
|
|
|
8
8
|
centroids: Map<any, any>;
|
|
9
9
|
overlappingSegments: any;
|
|
10
10
|
}>;
|
|
11
|
-
export declare function insertPixelDataPlanar({ segmentsOnFrame, labelMapImages, pixelDataChunks, multiframe, referencedImageIds, validOrientations, metadataProvider, tolerance, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps }: {
|
|
11
|
+
export declare function insertPixelDataPlanar({ segmentsOnFrame, labelMapImages, pixelDataChunks, multiframe, referencedImageIds, validOrientations, metadataProvider, tolerance, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, }: {
|
|
12
12
|
segmentsOnFrame: any;
|
|
13
13
|
labelMapImages: any;
|
|
14
14
|
pixelDataChunks: any;
|
|
@@ -21,7 +21,7 @@ export declare function insertPixelDataPlanar({ segmentsOnFrame, labelMapImages,
|
|
|
21
21
|
sopUIDImageIdIndexMap: any;
|
|
22
22
|
imageIdMaps: any;
|
|
23
23
|
}): Promise<unknown>;
|
|
24
|
-
export declare function insertOverlappingPixelDataPlanar({ segmentsOnFrame, labelMapImages, pixelDataChunks, multiframe, referencedImageIds, validOrientations, metadataProvider, tolerance, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps }: {
|
|
24
|
+
export declare function insertOverlappingPixelDataPlanar({ segmentsOnFrame, labelMapImages, pixelDataChunks, multiframe, referencedImageIds, validOrientations, metadataProvider, tolerance, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, }: {
|
|
25
25
|
segmentsOnFrame: any;
|
|
26
26
|
labelMapImages: any;
|
|
27
27
|
pixelDataChunks: any;
|
|
@@ -68,11 +68,11 @@ async function createLabelmapsFromBufferInternal(referencedImageIds, arrayBuffer
|
|
|
68
68
|
const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
|
69
69
|
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
70
70
|
const multiframe = Normalizer.normalizeToDataset([dataset]);
|
|
71
|
-
const imagePlaneModule = metadataProvider.get(
|
|
72
|
-
const generalSeriesModule = metadataProvider.get(
|
|
71
|
+
const imagePlaneModule = metadataProvider.get('imagePlaneModule', referencedImageIds[0]);
|
|
72
|
+
const generalSeriesModule = metadataProvider.get('generalSeriesModule', referencedImageIds[0]);
|
|
73
73
|
const SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
|
|
74
74
|
if (!imagePlaneModule) {
|
|
75
|
-
console.warn(
|
|
75
|
+
console.warn('Insufficient metadata, imagePlaneModule missing.');
|
|
76
76
|
}
|
|
77
77
|
const ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [...imagePlaneModule.rowCosines, ...imagePlaneModule.columnCosines] : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z];
|
|
78
78
|
const validOrientations = getValidOrientations(ImageOrientationPatient);
|
|
@@ -80,11 +80,11 @@ async function createLabelmapsFromBufferInternal(referencedImageIds, arrayBuffer
|
|
|
80
80
|
const TransferSyntaxUID = multiframe._meta.TransferSyntaxUID.Value[0];
|
|
81
81
|
let pixelData;
|
|
82
82
|
let pixelDataChunks;
|
|
83
|
-
if (TransferSyntaxUID ===
|
|
83
|
+
if (TransferSyntaxUID === '1.2.840.10008.1.2.5') {
|
|
84
84
|
const rleEncodedFrames = Array.isArray(multiframe.PixelData) ? multiframe.PixelData : [multiframe.PixelData];
|
|
85
85
|
pixelData = decode(rleEncodedFrames, multiframe.Rows, multiframe.Columns);
|
|
86
86
|
if (multiframe.BitsStored === 1) {
|
|
87
|
-
console.warn(
|
|
87
|
+
console.warn('No implementation for rle + bit packing.');
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
90
|
pixelDataChunks = [pixelData];
|
|
@@ -93,26 +93,26 @@ async function createLabelmapsFromBufferInternal(referencedImageIds, arrayBuffer
|
|
|
93
93
|
maxBytesPerChunk
|
|
94
94
|
});
|
|
95
95
|
if (!pixelDataChunks) {
|
|
96
|
-
throw new Error(
|
|
96
|
+
throw new Error('Fractional segmentations are not yet supported');
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
const orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, referencedImageIds.length], tolerance);
|
|
100
100
|
const sopUIDImageIdIndexMap = referencedImageIds.reduce((acc, imageId) => {
|
|
101
101
|
const {
|
|
102
102
|
sopInstanceUID
|
|
103
|
-
} = metadataProvider.get(
|
|
103
|
+
} = metadataProvider.get('generalImageModule', imageId);
|
|
104
104
|
acc[sopInstanceUID] = imageId;
|
|
105
105
|
return acc;
|
|
106
106
|
}, {});
|
|
107
107
|
let insertFunction;
|
|
108
108
|
switch (orientation) {
|
|
109
|
-
case
|
|
109
|
+
case 'Planar':
|
|
110
110
|
insertFunction = insertPixelDataPlanar;
|
|
111
111
|
break;
|
|
112
|
-
case
|
|
113
|
-
throw new Error(
|
|
114
|
-
case
|
|
115
|
-
throw new Error(
|
|
112
|
+
case 'Perpendicular':
|
|
113
|
+
throw new Error('Segmentations orthogonal to the acquisition plane of the source data are not yet supported.');
|
|
114
|
+
case 'Oblique':
|
|
115
|
+
throw new Error('Segmentations oblique to the acquisition plane of the source data are not yet supported.');
|
|
116
116
|
}
|
|
117
117
|
const segmentsOnFrame = [];
|
|
118
118
|
const imageIdMaps = {
|
|
@@ -123,7 +123,7 @@ async function createLabelmapsFromBufferInternal(referencedImageIds, arrayBuffer
|
|
|
123
123
|
for (let i = 0; i < referencedImageIds.length; i++) {
|
|
124
124
|
const referenceImageId = referencedImageIds[i];
|
|
125
125
|
imageIdMaps.indices[referenceImageId] = i;
|
|
126
|
-
imageIdMaps.metadata[referenceImageId] = metadataProvider.get(
|
|
126
|
+
imageIdMaps.metadata[referenceImageId] = metadataProvider.get('instance', referenceImageId);
|
|
127
127
|
const labelMapImage = imageLoader.createAndCacheDerivedLabelmapImage(referenceImageId);
|
|
128
128
|
labelMapImages.push(labelMapImage);
|
|
129
129
|
}
|
|
@@ -198,23 +198,23 @@ function insertPixelDataPlanar(_ref4) {
|
|
|
198
198
|
const pixelDataI2D = ndarray(view, [Rows, Columns]);
|
|
199
199
|
const alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
|
|
200
200
|
if (!alignedPixelDataI) {
|
|
201
|
-
throw new Error(
|
|
201
|
+
throw new Error('Individual SEG frames are out of plane with respect to the first SEG frame. ' + 'This is not yet supported. Aborting segmentation loading.');
|
|
202
202
|
}
|
|
203
203
|
const segmentIndex = getSegmentIndex(multiframe, i);
|
|
204
204
|
if (segmentIndex === undefined) {
|
|
205
|
-
throw new Error(
|
|
205
|
+
throw new Error('Could not retrieve the segment index. Aborting segmentation loading.');
|
|
206
206
|
}
|
|
207
207
|
if (!segmentsPixelIndices.has(segmentIndex)) {
|
|
208
208
|
segmentsPixelIndices.set(segmentIndex, {});
|
|
209
209
|
}
|
|
210
210
|
const imageId = findReferenceSourceImageId(multiframe, i, referencedImageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
211
211
|
if (!imageId) {
|
|
212
|
-
console.warn("Image not present in stack, can't import frame : " + i +
|
|
212
|
+
console.warn("Image not present in stack, can't import frame : " + i + '.');
|
|
213
213
|
return;
|
|
214
214
|
}
|
|
215
215
|
const sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
216
216
|
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
217
|
-
throw new Error(
|
|
217
|
+
throw new Error('Individual SEG frames have different geometry dimensions (Rows and Columns) ' + 'respect to the source image reference frame. This is not yet supported. ' + 'Aborting segmentation loading. ');
|
|
218
218
|
}
|
|
219
219
|
const imageIdIndex = imageIdMaps.indices[imageId];
|
|
220
220
|
const labelmapImage = labelMapImages[imageIdIndex];
|
|
@@ -283,7 +283,7 @@ function insertPixelDataPlanar(_ref4) {
|
|
|
283
283
|
const pixelDataI2D = ndarray(view, [Rows, Columns]);
|
|
284
284
|
const alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
|
|
285
285
|
if (!alignedPixelDataI) {
|
|
286
|
-
throw new Error(
|
|
286
|
+
throw new Error('Individual Labelmap SEG frames are out of plane with respect to the first SEG frame. ' + 'This is not yet supported. Aborting segmentation loading.');
|
|
287
287
|
}
|
|
288
288
|
const imageId = findReferenceSourceImageId(multiframe, i, referencedImageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
289
289
|
if (!imageId) {
|
|
@@ -292,7 +292,7 @@ function insertPixelDataPlanar(_ref4) {
|
|
|
292
292
|
}
|
|
293
293
|
const sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
294
294
|
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
295
|
-
throw new Error(
|
|
295
|
+
throw new Error('Individual Labelmap SEG frames have different geometry dimensions (Rows and Columns) ' + 'respect to the source image reference frame. This is not yet supported. ' + 'Aborting segmentation loading. ');
|
|
296
296
|
}
|
|
297
297
|
const imageIdIndex = imageIdMaps.indices[imageId];
|
|
298
298
|
const labelmapImage = labelMapImages[imageIdIndex];
|
|
@@ -334,7 +334,7 @@ function insertPixelDataPlanar(_ref4) {
|
|
|
334
334
|
});
|
|
335
335
|
}
|
|
336
336
|
};
|
|
337
|
-
if (multiframe.SegmentationType ===
|
|
337
|
+
if (multiframe.SegmentationType === 'LABELMAP') {
|
|
338
338
|
processLabelmapChunk(0);
|
|
339
339
|
} else {
|
|
340
340
|
processChunk(0);
|
|
@@ -358,7 +358,7 @@ const getAlignedPixelData = _ref5 => {
|
|
|
358
358
|
const pixelDataI2D = ndarray(view, [Rows, Columns]);
|
|
359
359
|
const alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
|
|
360
360
|
if (!alignedPixelDataI) {
|
|
361
|
-
throw new Error(
|
|
361
|
+
throw new Error('Individual SEG frames are out of plane with respect to the first SEG frame. ' + 'This is not yet supported. Aborting segmentation loading.');
|
|
362
362
|
}
|
|
363
363
|
return alignedPixelDataI;
|
|
364
364
|
};
|
|
@@ -369,9 +369,9 @@ const checkImageDimensions = _ref6 => {
|
|
|
369
369
|
Rows,
|
|
370
370
|
Columns
|
|
371
371
|
} = _ref6;
|
|
372
|
-
const sourceImageMetadata = metadataProvider.get(
|
|
372
|
+
const sourceImageMetadata = metadataProvider.get('instance', imageId);
|
|
373
373
|
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
374
|
-
throw new Error(
|
|
374
|
+
throw new Error('Individual SEG frames have different geometry dimensions (Rows and Columns) ' + 'respect to the source image reference frame. This is not yet supported. ' + 'Aborting segmentation loading. ');
|
|
375
375
|
}
|
|
376
376
|
};
|
|
377
377
|
const getArrayOfLabelMapImagesWithSegmentData = _ref7 => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import BaseAdapter3D from
|
|
1
|
+
import BaseAdapter3D from './BaseAdapter3D';
|
|
2
2
|
declare class UltrasoundDirectional extends BaseAdapter3D {
|
|
3
3
|
static getMeasurementData(measurementGroup: any, sopInstanceUIDToImageIdMap: any, metadata: any): {
|
|
4
4
|
description?: string;
|
|
@@ -42,7 +42,7 @@ class UltrasoundDirectional extends BaseAdapter3D {
|
|
|
42
42
|
referencedImageId
|
|
43
43
|
} = metadata;
|
|
44
44
|
if (!referencedImageId) {
|
|
45
|
-
throw new Error(
|
|
45
|
+
throw new Error('UltrasoundDirectionalTool.getTID300RepresentationArguments: referencedImageId is not defined');
|
|
46
46
|
}
|
|
47
47
|
const start = worldToImageCoords(referencedImageId, handles.points[0]);
|
|
48
48
|
const end = worldToImageCoords(referencedImageId, handles.points[1]);
|
|
@@ -64,6 +64,6 @@ class UltrasoundDirectional extends BaseAdapter3D {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
_UltrasoundDirectional = UltrasoundDirectional;
|
|
67
|
-
_UltrasoundDirectional.init(
|
|
67
|
+
_UltrasoundDirectional.init('UltrasoundDirectionalTool', TID300Length);
|
|
68
68
|
|
|
69
69
|
export { UltrasoundDirectional as default };
|
|
@@ -2,7 +2,7 @@ function extractAllNUMGroups(MeasurementGroup, referencedSOPInstanceUID) {
|
|
|
2
2
|
const numGroupsBySOPInstanceUID = {};
|
|
3
3
|
if (MeasurementGroup.ContentSequence) {
|
|
4
4
|
MeasurementGroup.ContentSequence.forEach(item => {
|
|
5
|
-
if (item.ValueType ===
|
|
5
|
+
if (item.ValueType === 'NUM' && item.ConceptNameCodeSequence) {
|
|
6
6
|
var _item$MeasuredValueSe, _item$MeasuredValueSe2;
|
|
7
7
|
const codeMeaning = item.ConceptNameCodeSequence.CodeMeaning;
|
|
8
8
|
const numericValue = (_item$MeasuredValueSe = item.MeasuredValueSequence) === null || _item$MeasuredValueSe === void 0 ? void 0 : _item$MeasuredValueSe.NumericValue;
|
|
@@ -13,7 +13,7 @@ function extractAllNUMGroups(MeasurementGroup, referencedSOPInstanceUID) {
|
|
|
13
13
|
}
|
|
14
14
|
numGroupsBySOPInstanceUID[referencedSOPInstanceUID][codeMeaning] = {
|
|
15
15
|
value: numericValue,
|
|
16
|
-
unit: unitCode ||
|
|
16
|
+
unit: unitCode || ''
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -23,22 +23,22 @@ function extractAllNUMGroups(MeasurementGroup, referencedSOPInstanceUID) {
|
|
|
23
23
|
}
|
|
24
24
|
function restoreAdditionalMetrics(numGroups) {
|
|
25
25
|
const additionalMetrics = {};
|
|
26
|
-
let modalityUnit =
|
|
26
|
+
let modalityUnit = '';
|
|
27
27
|
const metricMapping = {
|
|
28
|
-
Mean:
|
|
29
|
-
|
|
30
|
-
Maximum:
|
|
31
|
-
Minimum:
|
|
32
|
-
Area:
|
|
33
|
-
Radius:
|
|
34
|
-
Perimeter:
|
|
35
|
-
Length:
|
|
36
|
-
Width:
|
|
28
|
+
Mean: 'mean',
|
|
29
|
+
'Standard Deviation': 'stdDev',
|
|
30
|
+
Maximum: 'max',
|
|
31
|
+
Minimum: 'min',
|
|
32
|
+
Area: 'area',
|
|
33
|
+
Radius: 'radius',
|
|
34
|
+
Perimeter: 'perimeter',
|
|
35
|
+
Length: 'length',
|
|
36
|
+
Width: 'width'
|
|
37
37
|
};
|
|
38
38
|
const unitCategory = {
|
|
39
|
-
area:
|
|
40
|
-
radius:
|
|
41
|
-
width:
|
|
39
|
+
area: 'areaUnit',
|
|
40
|
+
radius: 'radiusUnit',
|
|
41
|
+
width: 'widthUnit'
|
|
42
42
|
};
|
|
43
43
|
for (const [codeMeaning, metricKey] of Object.entries(metricMapping)) {
|
|
44
44
|
const group = numGroups[codeMeaning];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from './Events';
|
|
@@ -11,12 +11,12 @@ function checkOrientation(multiframe, validOrientations, sourceDataDimensions, t
|
|
|
11
11
|
const iop = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
12
12
|
const inPlane = validOrientations.some(operation => utilities.isEqual(iop, operation, tolerance));
|
|
13
13
|
if (inPlane) {
|
|
14
|
-
return
|
|
14
|
+
return 'Planar';
|
|
15
15
|
}
|
|
16
16
|
if (checkIfPerpendicular(iop, validOrientations[0], tolerance) && sourceDataDimensions.includes(multiframe.Rows) && sourceDataDimensions.includes(multiframe.Columns)) {
|
|
17
|
-
return
|
|
17
|
+
return 'Perpendicular';
|
|
18
18
|
}
|
|
19
|
-
return
|
|
19
|
+
return 'Oblique';
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export { checkOrientation as default };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { toArray } from
|
|
2
|
-
import { codeMeaningEquals } from
|
|
3
|
-
import { graphicTypeEquals } from
|
|
4
|
-
import { downloadDICOMData } from
|
|
5
|
-
export { copyStudyTags } from
|
|
6
|
-
export { copySeriesTags } from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
9
|
-
export * from
|
|
1
|
+
import { toArray } from './toArray';
|
|
2
|
+
import { codeMeaningEquals } from './codeMeaningEquals';
|
|
3
|
+
import { graphicTypeEquals } from './graphicTypeEquals';
|
|
4
|
+
import { downloadDICOMData } from './downloadDICOMData';
|
|
5
|
+
export { copyStudyTags } from './copyStudyTags';
|
|
6
|
+
export { copySeriesTags } from './copySeriesTags';
|
|
7
|
+
export * from './toScoordType';
|
|
8
|
+
export * from './scoordToWorld';
|
|
9
|
+
export * from './toPoint3';
|
|
10
10
|
export { toArray, codeMeaningEquals, graphicTypeEquals, downloadDICOMData };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { NO_IMAGE_ID } from
|
|
2
|
-
import * as Enums from
|
|
3
|
-
import * as helpers from
|
|
1
|
+
import { NO_IMAGE_ID } from './Cornerstone3D/constants';
|
|
2
|
+
import * as Enums from './enums';
|
|
3
|
+
import * as helpers from './helpers';
|
|
4
4
|
declare const adaptersSR: {
|
|
5
5
|
Cornerstone: {
|
|
6
6
|
Length: typeof import("./Cornerstone/Length").default;
|
|
@@ -77,4 +77,4 @@ declare const adaptersRT: {
|
|
|
77
77
|
RTSS: typeof import("./Cornerstone3D/RTStruct");
|
|
78
78
|
};
|
|
79
79
|
};
|
|
80
|
-
export { adaptersSR, adaptersSEG, adaptersPMAP, adaptersRT, Enums, helpers, NO_IMAGE_ID };
|
|
80
|
+
export { adaptersSR, adaptersSEG, adaptersPMAP, adaptersRT, Enums, helpers, NO_IMAGE_ID, };
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "4.21.
|
|
1
|
+
export declare const version = "4.21.4";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/adapters",
|
|
3
|
-
"version": "4.21.
|
|
3
|
+
"version": "4.21.4",
|
|
4
4
|
"description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/esm/index.d.ts",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"build:all": "yarn build",
|
|
68
68
|
"api-check": "echo 'No API check for this package'",
|
|
69
69
|
"start": "rollup --watch -c rollup.config.mjs",
|
|
70
|
-
"format": "prettier --write
|
|
70
|
+
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\" \"test/**/*.{js,jsx,ts,tsx,json,css,md}\" \"examples/**/*.{js,jsx,ts,tsx,json,css,md}\" \"*.{js,mjs,json,md}\"",
|
|
71
71
|
"lint": "oxlint .",
|
|
72
72
|
"prebuild": "node ../../scripts/generate-version.js ./"
|
|
73
73
|
},
|
|
@@ -89,12 +89,12 @@
|
|
|
89
89
|
"ndarray": "1.0.19"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
|
-
"@cornerstonejs/core": "4.21.
|
|
93
|
-
"@cornerstonejs/tools": "4.21.
|
|
92
|
+
"@cornerstonejs/core": "4.21.4",
|
|
93
|
+
"@cornerstonejs/tools": "4.21.4"
|
|
94
94
|
},
|
|
95
95
|
"peerDependencies": {
|
|
96
|
-
"@cornerstonejs/core": "4.21.
|
|
97
|
-
"@cornerstonejs/tools": "4.21.
|
|
96
|
+
"@cornerstonejs/core": "4.21.4",
|
|
97
|
+
"@cornerstonejs/tools": "4.21.4"
|
|
98
98
|
},
|
|
99
|
-
"gitHead": "
|
|
99
|
+
"gitHead": "a75af5dc042023dcaefa71c27d9481f485da220f"
|
|
100
100
|
}
|