@cornerstonejs/adapters 5.0.0-beta.1 → 5.0.0
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/Angle.js +23 -16
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +14 -19
- package/dist/esm/adapters/Cornerstone/Bidirectional.js +22 -27
- package/dist/esm/adapters/Cornerstone/CircleRoi.js +21 -27
- package/dist/esm/adapters/Cornerstone/CobbAngle.js +23 -16
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +20 -26
- package/dist/esm/adapters/Cornerstone/FreehandRoi.js +22 -26
- package/dist/esm/adapters/Cornerstone/Length.js +19 -16
- package/dist/esm/adapters/Cornerstone/MeasurementReport.js +20 -40
- package/dist/esm/adapters/Cornerstone/ParametricMap.js +27 -38
- package/dist/esm/adapters/Cornerstone/RectangleRoi.js +27 -26
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +19 -31
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +69 -90
- 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 +19 -26
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +24 -38
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.js +20 -31
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +27 -39
- package/dist/esm/adapters/Cornerstone3D/CircleROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +29 -37
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +27 -30
- package/dist/esm/adapters/Cornerstone3D/ControlPointPolyline.d.ts +5 -0
- package/dist/esm/adapters/Cornerstone3D/ControlPointPolyline.js +85 -0
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +27 -35
- package/dist/esm/adapters/Cornerstone3D/KeyImage.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/KeyImage.js +5 -11
- package/dist/esm/adapters/Cornerstone3D/LabelData.d.ts +3 -1
- package/dist/esm/adapters/Cornerstone3D/LabelData.js +41 -33
- package/dist/esm/adapters/Cornerstone3D/Length.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Length.js +21 -29
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.d.ts +2 -1
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +108 -120
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +2 -6
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +11 -1
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +58 -44
- package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Probe.js +21 -32
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +14 -30
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.d.ts +2 -2
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +7 -13
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +30 -32
- package/dist/esm/adapters/Cornerstone3D/Segmentation/compactMergeSegData.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Segmentation/compactMergeSegData.js +5 -9
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +2 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +6 -16
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +3 -4
- 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 +147 -179
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +15 -26
- package/dist/esm/adapters/Cornerstone3D/constants/index.d.ts +10 -0
- package/dist/esm/adapters/Cornerstone3D/constants/index.js +12 -2
- package/dist/esm/adapters/Cornerstone3D/metricHandler.js +57 -24
- package/dist/esm/adapters/Cornerstone3D/unitMapper.d.ts +5 -0
- package/dist/esm/adapters/Cornerstone3D/unitMapper.js +16 -0
- package/dist/esm/adapters/VTKjs/Segmentation.js +2 -4
- 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 +5 -7
- package/dist/esm/adapters/helpers/downloadDICOMData.js +1 -3
- package/dist/esm/adapters/helpers/getDatasetsFromImages.js +3 -7
- 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/scoordToWorld.js +5 -13
- package/dist/esm/adapters/helpers/toPoint3.d.ts +1 -1
- package/dist/esm/adapters/helpers/toPoint3.js +1 -3
- package/dist/esm/adapters/helpers/toScoordType.d.ts +1 -1
- package/dist/esm/adapters/helpers/toScoordType.js +3 -7
- package/dist/esm/adapters/index.d.ts +4 -4
- package/dist/esm/adapters/index.js +3 -2
- package/dist/esm/utilities/createInstance.js +9 -8
- package/dist/esm/utilities/referencedMetadataProvider.d.ts +3 -4
- package/dist/esm/utilities/referencedMetadataProvider.js +8 -14
- package/dist/esm/version.d.ts +1 -1
- package/package.json +13 -9
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/defineProperty.js +0 -12
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +0 -14
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +0 -9
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/typeof.js +0 -11
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
import { utilities, derivations, normalizers, data } from 'dcmjs';
|
|
2
2
|
import { toArray } from '../helpers/toArray.js';
|
|
3
3
|
import { codeMeaningEquals } from '../helpers/codeMeaningEquals.js';
|
|
4
|
-
import '
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} = normalizers;
|
|
16
|
-
const {
|
|
17
|
-
TID1500MeasurementReport,
|
|
18
|
-
TID1501MeasurementGroup
|
|
19
|
-
} = TID1500;
|
|
20
|
-
const {
|
|
21
|
-
DicomMetaDictionary
|
|
22
|
-
} = data;
|
|
4
|
+
import '../helpers/downloadDICOMData.js';
|
|
5
|
+
import '../helpers/toScoordType.js';
|
|
6
|
+
import '../helpers/scoordToWorld.js';
|
|
7
|
+
|
|
8
|
+
const TID1500 = utilities.TID1500,
|
|
9
|
+
addAccessors = utilities.addAccessors;
|
|
10
|
+
const StructuredReport = derivations.StructuredReport;
|
|
11
|
+
const Normalizer = normalizers.Normalizer;
|
|
12
|
+
const TID1500MeasurementReport = TID1500.TID1500MeasurementReport,
|
|
13
|
+
TID1501MeasurementGroup = TID1500.TID1501MeasurementGroup;
|
|
14
|
+
const DicomMetaDictionary = data.DicomMetaDictionary;
|
|
23
15
|
const FINDING = {
|
|
24
16
|
CodingSchemeDesignator: 'DCM',
|
|
25
17
|
CodeValue: '121071'
|
|
@@ -33,16 +25,12 @@ const FINDING_SITE_OLD = {
|
|
|
33
25
|
CodeValue: 'G-C0E3'
|
|
34
26
|
};
|
|
35
27
|
const codeValueMatch = (group, code, oldCode) => {
|
|
36
|
-
const
|
|
37
|
-
ConceptNameCodeSequence
|
|
38
|
-
} = group;
|
|
28
|
+
const ConceptNameCodeSequence = group.ConceptNameCodeSequence;
|
|
39
29
|
if (!ConceptNameCodeSequence) {
|
|
40
30
|
return;
|
|
41
31
|
}
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
CodeValue
|
|
45
|
-
} = ConceptNameCodeSequence;
|
|
32
|
+
const CodingSchemeDesignator = ConceptNameCodeSequence.CodingSchemeDesignator,
|
|
33
|
+
CodeValue = ConceptNameCodeSequence.CodeValue;
|
|
46
34
|
return CodingSchemeDesignator == code.CodingSchemeDesignator && CodeValue == code.CodeValue || oldCode && CodingSchemeDesignator == oldCode.CodingSchemeDesignator && CodeValue == oldCode.CodeValue;
|
|
47
35
|
};
|
|
48
36
|
function getTID300ContentItem(tool, ReferencedSOPSequence, adapterClass) {
|
|
@@ -68,21 +56,15 @@ function getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) {
|
|
|
68
56
|
}
|
|
69
57
|
class MeasurementReport {
|
|
70
58
|
static getSetupMeasurementData(MeasurementGroup) {
|
|
71
|
-
const
|
|
72
|
-
ContentSequence
|
|
73
|
-
} = MeasurementGroup;
|
|
59
|
+
const ContentSequence = MeasurementGroup.ContentSequence;
|
|
74
60
|
const contentSequenceArr = toArray(ContentSequence);
|
|
75
61
|
const findingGroup = contentSequenceArr.find(group => codeValueMatch(group, FINDING));
|
|
76
62
|
const findingSiteGroups = contentSequenceArr.filter(group => codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)) || [];
|
|
77
63
|
const NUMGroup = contentSequenceArr.find(group => group.ValueType === 'NUM');
|
|
78
64
|
const SCOORDGroup = toArray(NUMGroup.ContentSequence).find(group => group.ValueType === 'SCOORD');
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const {
|
|
83
|
-
ReferencedSOPInstanceUID,
|
|
84
|
-
ReferencedFrameNumber
|
|
85
|
-
} = ReferencedSOPSequence;
|
|
65
|
+
const ReferencedSOPSequence = SCOORDGroup.ContentSequence.ReferencedSOPSequence;
|
|
66
|
+
const ReferencedSOPInstanceUID = ReferencedSOPSequence.ReferencedSOPInstanceUID,
|
|
67
|
+
ReferencedFrameNumber = ReferencedSOPSequence.ReferencedFrameNumber;
|
|
86
68
|
const defaultState = {
|
|
87
69
|
sopInstanceUid: ReferencedSOPInstanceUID,
|
|
88
70
|
frameIndex: ReferencedFrameNumber || 1,
|
|
@@ -133,10 +115,8 @@ class MeasurementReport {
|
|
|
133
115
|
// NOTE: We are getting the Series and Study UIDs from the first imageId of the toolState
|
|
134
116
|
// which means that if the toolState is for multiple series, the report will have the incorrect
|
|
135
117
|
// SeriesInstanceUIDs
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
seriesInstanceUID
|
|
139
|
-
} = generalSeriesModule;
|
|
118
|
+
const studyInstanceUID = generalSeriesModule.studyInstanceUID,
|
|
119
|
+
seriesInstanceUID = generalSeriesModule.seriesInstanceUID;
|
|
140
120
|
|
|
141
121
|
// Loop through each image in the toolData
|
|
142
122
|
Object.keys(toolState).forEach(imageId => {
|
|
@@ -1,45 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { data, normalizers, log } from 'dcmjs';
|
|
2
2
|
import checkOrientation from '../helpers/checkOrientation.js';
|
|
3
3
|
import { utilities } from '@cornerstonejs/core';
|
|
4
4
|
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} = data;
|
|
9
|
-
const {
|
|
10
|
-
Normalizer
|
|
11
|
-
} = normalizers;
|
|
5
|
+
const DicomMessage = data.DicomMessage,
|
|
6
|
+
DicomMetaDictionary = data.DicomMetaDictionary;
|
|
7
|
+
const Normalizer = normalizers.Normalizer;
|
|
12
8
|
async function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
13
9
|
let tolerance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1e-3;
|
|
14
10
|
const dicomData = DicomMessage.readFile(arrayBuffer);
|
|
15
11
|
const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
|
16
12
|
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
17
13
|
const multiframe = Normalizer.normalizeToDataset([dataset]);
|
|
18
|
-
const imagePlaneModule = metadataProvider.get(
|
|
14
|
+
const imagePlaneModule = metadataProvider.get('imagePlaneModule', imageIds[0]);
|
|
19
15
|
if (!imagePlaneModule) {
|
|
20
|
-
console.warn(
|
|
16
|
+
console.warn('Insufficient metadata, imagePlaneModule missing.');
|
|
21
17
|
}
|
|
22
18
|
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
19
|
const validOrientations = [ImageOrientationPatient];
|
|
24
20
|
const pixelData = getPixelData(multiframe);
|
|
25
21
|
const orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance);
|
|
26
22
|
const sopUIDImageIdIndexMap = imageIds.reduce((acc, imageId) => {
|
|
27
|
-
const
|
|
28
|
-
sopInstanceUID
|
|
29
|
-
} = metadataProvider.get("generalImageModule", imageId);
|
|
23
|
+
const _metadataProvider$get = metadataProvider.get('generalImageModule', imageId),
|
|
24
|
+
sopInstanceUID = _metadataProvider$get.sopInstanceUID;
|
|
30
25
|
acc[sopInstanceUID] = imageId;
|
|
31
26
|
return acc;
|
|
32
27
|
}, {});
|
|
33
|
-
if (orientation !==
|
|
28
|
+
if (orientation !== 'Planar') {
|
|
34
29
|
const orientationText = {
|
|
35
|
-
Perpendicular:
|
|
36
|
-
Oblique:
|
|
30
|
+
Perpendicular: 'orthogonal',
|
|
31
|
+
Oblique: 'oblique'
|
|
37
32
|
};
|
|
38
33
|
throw new Error("Parametric maps ".concat(orientationText[orientation], " to the acquisition plane of the source data are not yet supported."));
|
|
39
34
|
}
|
|
40
35
|
const imageIdMaps = imageIds.reduce((acc, curr, index) => {
|
|
41
36
|
acc.indices[curr] = index;
|
|
42
|
-
acc.metadata[curr] = metadataProvider.get(
|
|
37
|
+
acc.metadata[curr] = metadataProvider.get('instance', curr);
|
|
43
38
|
return acc;
|
|
44
39
|
}, {
|
|
45
40
|
indices: {},
|
|
@@ -52,23 +47,21 @@ async function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
|
52
47
|
}
|
|
53
48
|
function insertPixelDataPlanar(sourcePixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps) {
|
|
54
49
|
const targetPixelData = new sourcePixelData.constructor(sourcePixelData.length);
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Columns
|
|
59
|
-
} = multiframe;
|
|
50
|
+
const PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
51
|
+
Rows = multiframe.Rows,
|
|
52
|
+
Columns = multiframe.Columns;
|
|
60
53
|
const sliceLength = Columns * Rows;
|
|
61
54
|
const numSlices = PerFrameFunctionalGroupsSequence.length;
|
|
62
55
|
for (let i = 0; i < numSlices; i++) {
|
|
63
56
|
const sourceSliceDataView = new sourcePixelData.constructor(sourcePixelData.buffer, i * sliceLength, sliceLength);
|
|
64
57
|
const imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
65
58
|
if (!imageId) {
|
|
66
|
-
console.warn("Image not present in stack, can't import frame : " + i +
|
|
59
|
+
console.warn("Image not present in stack, can't import frame : " + i + '.');
|
|
67
60
|
continue;
|
|
68
61
|
}
|
|
69
62
|
const sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
70
63
|
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
71
|
-
throw new Error(
|
|
64
|
+
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
65
|
}
|
|
73
66
|
const imageIdIndex = imageIdMaps.indices[imageId];
|
|
74
67
|
const byteOffset = sliceLength * imageIdIndex * targetPixelData.BYTES_PER_ELEMENT;
|
|
@@ -93,7 +86,7 @@ function getPixelData(multiframe) {
|
|
|
93
86
|
data = multiframe.DoubleFloatPixelData;
|
|
94
87
|
}
|
|
95
88
|
if (data === undefined) {
|
|
96
|
-
log.error(
|
|
89
|
+
log.error('This parametric map pixel data is undefined.');
|
|
97
90
|
}
|
|
98
91
|
if (Array.isArray(data)) {
|
|
99
92
|
data = data[0];
|
|
@@ -105,12 +98,10 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
|
|
|
105
98
|
if (!multiframe) {
|
|
106
99
|
return imageId;
|
|
107
100
|
}
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
ReferencedSeriesSequence
|
|
113
|
-
} = multiframe;
|
|
101
|
+
const FrameOfReferenceUID = multiframe.FrameOfReferenceUID,
|
|
102
|
+
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
103
|
+
SourceImageSequence = multiframe.SourceImageSequence,
|
|
104
|
+
ReferencedSeriesSequence = multiframe.ReferencedSeriesSequence;
|
|
114
105
|
if (!PerFrameFunctionalGroupsSequence || PerFrameFunctionalGroupsSequence.length === 0) {
|
|
115
106
|
return imageId;
|
|
116
107
|
}
|
|
@@ -139,7 +130,7 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
|
|
|
139
130
|
}
|
|
140
131
|
}
|
|
141
132
|
} else if (SourceImageSequence && SourceImageSequence.length !== 0) {
|
|
142
|
-
console.warn(
|
|
133
|
+
console.warn('DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image.');
|
|
143
134
|
frameSourceImageSequence = SourceImageSequence[frameSegment];
|
|
144
135
|
}
|
|
145
136
|
if (frameSourceImageSequence) {
|
|
@@ -153,10 +144,8 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
|
|
|
153
144
|
return imageId;
|
|
154
145
|
}
|
|
155
146
|
function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
ReferencedFrameNumber
|
|
159
|
-
} = SourceImageSequence;
|
|
147
|
+
const ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
148
|
+
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
160
149
|
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
161
150
|
}
|
|
162
151
|
function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
@@ -164,7 +153,7 @@ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfR
|
|
|
164
153
|
return undefined;
|
|
165
154
|
}
|
|
166
155
|
for (let imageIdsIndex = 0; imageIdsIndex < imageIds.length; ++imageIdsIndex) {
|
|
167
|
-
const sourceImageMetadata = metadataProvider.get(
|
|
156
|
+
const sourceImageMetadata = metadataProvider.get('instance', imageIds[imageIdsIndex]);
|
|
168
157
|
if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
|
|
169
158
|
continue;
|
|
170
159
|
}
|
|
@@ -178,7 +167,7 @@ function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdI
|
|
|
178
167
|
if (!imageId) {
|
|
179
168
|
return;
|
|
180
169
|
}
|
|
181
|
-
const imageIdFrameNumber = Number(imageId.split(
|
|
170
|
+
const imageIdFrameNumber = Number(imageId.split('frame=')[1]);
|
|
182
171
|
return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
|
|
183
172
|
}
|
|
184
173
|
const ParametricMapObj = {
|
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
Polyline: TID300Polyline
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300Polyline = utilities.TID300.Polyline;
|
|
11
10
|
class RectangleRoi {
|
|
12
11
|
static getMeasurementData(MeasurementGroup) {
|
|
13
|
-
const
|
|
14
|
-
defaultState,
|
|
15
|
-
SCOORDGroup,
|
|
16
|
-
NUMGroup
|
|
17
|
-
} = MeasurementReport.getSetupMeasurementData(MeasurementGroup);
|
|
12
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
13
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
14
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup,
|
|
15
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup;
|
|
18
16
|
const state = _objectSpread(_objectSpread({}, defaultState), {}, {
|
|
19
17
|
toolType: RectangleRoi.toolType,
|
|
20
18
|
handles: {
|
|
@@ -36,21 +34,23 @@ class RectangleRoi {
|
|
|
36
34
|
color: undefined,
|
|
37
35
|
invalidated: true
|
|
38
36
|
});
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 6);
|
|
38
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
39
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
40
|
+
_SCOORDGroup$GraphicD[2];
|
|
41
|
+
_SCOORDGroup$GraphicD[3];
|
|
42
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[4];
|
|
43
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[5];
|
|
41
44
|
return state;
|
|
42
45
|
}
|
|
43
46
|
static getTID300RepresentationArguments(tool) {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
cachedStats = {},
|
|
48
|
-
handles
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
start,
|
|
52
|
-
end
|
|
53
|
-
} = handles;
|
|
47
|
+
const finding = tool.finding,
|
|
48
|
+
findingSites = tool.findingSites,
|
|
49
|
+
_tool$cachedStats = tool.cachedStats,
|
|
50
|
+
cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
|
|
51
|
+
handles = tool.handles;
|
|
52
|
+
const start = handles.start,
|
|
53
|
+
end = handles.end;
|
|
54
54
|
const points = [start, {
|
|
55
55
|
x: start.x,
|
|
56
56
|
y: end.y
|
|
@@ -58,10 +58,8 @@ class RectangleRoi {
|
|
|
58
58
|
x: end.x,
|
|
59
59
|
y: start.y
|
|
60
60
|
}];
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
perimeter
|
|
64
|
-
} = cachedStats;
|
|
61
|
+
const area = cachedStats.area,
|
|
62
|
+
perimeter = cachedStats.perimeter;
|
|
65
63
|
const trackingIdentifierTextValue = 'cornerstoneTools@^4.0.0:RectangleRoi';
|
|
66
64
|
return {
|
|
67
65
|
points,
|
|
@@ -80,7 +78,10 @@ RectangleRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
80
78
|
if (!TrackingIdentifier.includes(':')) {
|
|
81
79
|
return false;
|
|
82
80
|
}
|
|
83
|
-
const
|
|
81
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
82
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
83
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
84
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
84
85
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
85
86
|
return false;
|
|
86
87
|
}
|
|
@@ -1,25 +1,18 @@
|
|
|
1
|
-
import { utilities,
|
|
1
|
+
import { utilities, normalizers, derivations, log } from 'dcmjs';
|
|
2
2
|
import ndarray from 'ndarray';
|
|
3
3
|
import getDatasetsFromImages from '../helpers/getDatasetsFromImages.js';
|
|
4
4
|
|
|
5
|
-
const
|
|
6
|
-
rotateDirectionCosinesInPlane,
|
|
7
|
-
flipImageOrientationPatient
|
|
8
|
-
flipMatrix2D,
|
|
9
|
-
rotateMatrix902D
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
} = utilities;
|
|
17
|
-
const {
|
|
18
|
-
Normalizer
|
|
19
|
-
} = normalizers;
|
|
20
|
-
const {
|
|
21
|
-
Segmentation: SegmentationDerivation
|
|
22
|
-
} = derivations;
|
|
5
|
+
const _utilities$orientatio = utilities.orientation,
|
|
6
|
+
rotateDirectionCosinesInPlane = _utilities$orientatio.rotateDirectionCosinesInPlane,
|
|
7
|
+
flipIOP = _utilities$orientatio.flipImageOrientationPatient,
|
|
8
|
+
flipMatrix2D = _utilities$orientatio.flipMatrix2D,
|
|
9
|
+
rotateMatrix902D = _utilities$orientatio.rotateMatrix902D;
|
|
10
|
+
const datasetToBlob = utilities.datasetToBlob,
|
|
11
|
+
BitArray = utilities.BitArray,
|
|
12
|
+
DicomMessage = utilities.DicomMessage,
|
|
13
|
+
DicomMetaDictionary = utilities.DicomMetaDictionary;
|
|
14
|
+
const Normalizer = normalizers.Normalizer;
|
|
15
|
+
const SegmentationDerivation = derivations.Segmentation;
|
|
23
16
|
const Segmentation = {
|
|
24
17
|
generateSegmentation,
|
|
25
18
|
generateToolState
|
|
@@ -45,10 +38,8 @@ function generateSegmentation(images, brushData) {
|
|
|
45
38
|
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
46
39
|
includeSliceSpacing: true
|
|
47
40
|
};
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
segments
|
|
51
|
-
} = brushData;
|
|
41
|
+
const toolState = brushData.toolState,
|
|
42
|
+
segments = brushData.segments;
|
|
52
43
|
|
|
53
44
|
// Calculate the dimensions of the data cube.
|
|
54
45
|
const image0 = images[0];
|
|
@@ -64,10 +55,9 @@ function generateSegmentation(images, brushData) {
|
|
|
64
55
|
}
|
|
65
56
|
const isMultiframe = image0.imageId.includes('?frame');
|
|
66
57
|
const seg = _createSegFromImages(images, isMultiframe, options);
|
|
67
|
-
const
|
|
68
|
-
referencedFramesPerSegment,
|
|
69
|
-
segmentIndicies
|
|
70
|
-
} = _getNumberOfFramesPerSegment(toolState, images, segments);
|
|
58
|
+
const _getNumberOfFramesPer = _getNumberOfFramesPerSegment(toolState, images, segments),
|
|
59
|
+
referencedFramesPerSegment = _getNumberOfFramesPer.referencedFramesPerSegment,
|
|
60
|
+
segmentIndicies = _getNumberOfFramesPer.segmentIndicies;
|
|
71
61
|
let NumberOfFrames = 0;
|
|
72
62
|
for (let i = 0; i < referencedFramesPerSegment.length; i++) {
|
|
73
63
|
NumberOfFrames += referencedFramesPerSegment[i].length;
|
|
@@ -274,10 +264,8 @@ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixe
|
|
|
274
264
|
* @return {String} The corresponding imageId.
|
|
275
265
|
*/
|
|
276
266
|
function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
ReferencedFrameNumber
|
|
280
|
-
} = SourceImageSequence;
|
|
267
|
+
const ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
268
|
+
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
281
269
|
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
|
|
282
270
|
}
|
|
283
271
|
|