@cornerstonejs/adapters 3.0.0-beta.5 → 3.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 +61 -74
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +76 -76
- package/dist/esm/adapters/Cornerstone/Bidirectional.js +130 -146
- package/dist/esm/adapters/Cornerstone/CircleRoi.js +96 -95
- package/dist/esm/adapters/Cornerstone/CobbAngle.js +66 -79
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +152 -152
- package/dist/esm/adapters/Cornerstone/FreehandRoi.js +68 -69
- package/dist/esm/adapters/Cornerstone/Length.js +54 -63
- package/dist/esm/adapters/Cornerstone/MeasurementReport.js +221 -224
- package/dist/esm/adapters/Cornerstone/ParametricMap.js +88 -110
- package/dist/esm/adapters/Cornerstone/RectangleRoi.js +72 -78
- package/dist/esm/adapters/Cornerstone/Segmentation.js +7 -7
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +113 -104
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +434 -462
- package/dist/esm/adapters/Cornerstone/index.js +14 -14
- package/dist/esm/adapters/Cornerstone3D/Angle.d.ts +2 -5
- package/dist/esm/adapters/Cornerstone3D/Angle.js +89 -100
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +5 -11
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +106 -118
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.d.ts +43 -0
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.js +92 -0
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.d.ts +2 -5
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +118 -133
- package/dist/esm/adapters/Cornerstone3D/CircleROI.d.ts +2 -7
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +85 -85
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.d.ts +2 -5
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +93 -104
- package/dist/esm/adapters/Cornerstone3D/CodingScheme.js +5 -5
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.d.ts +2 -7
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +148 -149
- package/dist/esm/adapters/Cornerstone3D/KeyImage.d.ts +24 -0
- package/dist/esm/adapters/Cornerstone3D/KeyImage.js +49 -0
- package/dist/esm/adapters/Cornerstone3D/Length.d.ts +2 -10
- package/dist/esm/adapters/Cornerstone3D/Length.js +83 -93
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.d.ts +23 -4
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +259 -240
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +8 -4
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +3 -5
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +99 -115
- package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +4 -17
- package/dist/esm/adapters/Cornerstone3D/Probe.js +38 -79
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +60 -52
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +3 -1
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.js +5 -5
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +14 -10
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +17 -11
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +3 -1
- package/dist/esm/adapters/Cornerstone3D/RectangleROI.d.ts +2 -5
- package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +73 -85
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +15 -13
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +15 -9
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +10 -10
- package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js +134 -151
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +2 -5
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +68 -84
- package/dist/esm/adapters/Cornerstone3D/index.d.ts +4 -0
- package/dist/esm/adapters/Cornerstone3D/index.js +21 -17
- package/dist/esm/adapters/VTKjs/Segmentation.js +66 -72
- package/dist/esm/adapters/VTKjs/index.js +2 -2
- package/dist/esm/adapters/helpers/checkIfPerpendicular.js +2 -2
- package/dist/esm/adapters/helpers/checkOrientation.js +8 -8
- package/dist/esm/adapters/helpers/codeMeaningEquals.js +2 -2
- package/dist/esm/adapters/helpers/compareArrays.js +4 -2
- package/dist/esm/adapters/helpers/downloadDICOMData.js +6 -4
- package/dist/esm/adapters/helpers/getDatasetsFromImages.js +20 -18
- package/dist/esm/adapters/helpers/graphicTypeEquals.js +2 -2
- package/dist/esm/adapters/helpers/toArray.js +1 -3
- package/dist/esm/adapters/index.d.ts +2 -0
- package/dist/esm/adapters/index.js +6 -5
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/defineProperty.js +18 -0
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +14 -0
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +9 -0
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/typeof.js +11 -0
- package/package.json +4 -4
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +0 -493
- package/dist/esm/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.js +0 -18
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { utilities, normalizers, derivations, log } from 'dcmjs';
|
|
1
|
+
import { utilities, log, normalizers, derivations } from 'dcmjs';
|
|
3
2
|
import ndarray from 'ndarray';
|
|
4
3
|
import getDatasetsFromImages from '../helpers/getDatasetsFromImages.js';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
rotateDirectionCosinesInPlane
|
|
8
|
-
flipIOP
|
|
9
|
-
flipMatrix2D
|
|
10
|
-
rotateMatrix902D
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
const {
|
|
6
|
+
rotateDirectionCosinesInPlane,
|
|
7
|
+
flipImageOrientationPatient: flipIOP,
|
|
8
|
+
flipMatrix2D,
|
|
9
|
+
rotateMatrix902D
|
|
10
|
+
} = utilities.orientation;
|
|
11
|
+
const {
|
|
12
|
+
datasetToBlob,
|
|
13
|
+
BitArray,
|
|
14
|
+
DicomMessage,
|
|
15
|
+
DicomMetaDictionary
|
|
16
|
+
} = utilities;
|
|
17
|
+
const {
|
|
18
|
+
Normalizer
|
|
19
|
+
} = normalizers;
|
|
20
|
+
const {
|
|
21
|
+
Segmentation: SegmentationDerivation
|
|
22
|
+
} = derivations;
|
|
23
|
+
const Segmentation = {
|
|
24
|
+
generateSegmentation,
|
|
25
|
+
generateToolState
|
|
20
26
|
};
|
|
21
27
|
|
|
22
28
|
/**
|
|
@@ -36,58 +42,61 @@ var Segmentation = {
|
|
|
36
42
|
* @returns {type} description
|
|
37
43
|
*/
|
|
38
44
|
function generateSegmentation(images, brushData) {
|
|
39
|
-
|
|
45
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
40
46
|
includeSliceSpacing: true
|
|
41
47
|
};
|
|
42
|
-
|
|
43
|
-
|
|
48
|
+
const {
|
|
49
|
+
toolState,
|
|
50
|
+
segments
|
|
51
|
+
} = brushData;
|
|
44
52
|
|
|
45
53
|
// Calculate the dimensions of the data cube.
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
const image0 = images[0];
|
|
55
|
+
const dims = {
|
|
48
56
|
x: image0.columns,
|
|
49
57
|
y: image0.rows,
|
|
50
58
|
z: images.length
|
|
51
59
|
};
|
|
52
60
|
dims.xy = dims.x * dims.y;
|
|
53
|
-
|
|
61
|
+
const numSegments = _getSegCount(seg, segments);
|
|
54
62
|
if (!numSegments) {
|
|
55
63
|
throw new Error("No segments to export!");
|
|
56
64
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
referencedFramesPerSegment
|
|
61
|
-
segmentIndicies
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
const isMultiframe = image0.imageId.includes("?frame");
|
|
66
|
+
const seg = _createSegFromImages(images, isMultiframe, options);
|
|
67
|
+
const {
|
|
68
|
+
referencedFramesPerSegment,
|
|
69
|
+
segmentIndicies
|
|
70
|
+
} = _getNumberOfFramesPerSegment(toolState, images, segments);
|
|
71
|
+
let NumberOfFrames = 0;
|
|
72
|
+
for (let i = 0; i < referencedFramesPerSegment.length; i++) {
|
|
64
73
|
NumberOfFrames += referencedFramesPerSegment[i].length;
|
|
65
74
|
}
|
|
66
75
|
seg.setNumberOfFrames(NumberOfFrames);
|
|
67
|
-
for (
|
|
68
|
-
|
|
69
|
-
|
|
76
|
+
for (let i = 0; i < segmentIndicies.length; i++) {
|
|
77
|
+
const segmentIndex = segmentIndicies[i];
|
|
78
|
+
const referencedFrameIndicies = referencedFramesPerSegment[i];
|
|
70
79
|
|
|
71
80
|
// Frame numbers start from 1.
|
|
72
|
-
|
|
81
|
+
const referencedFrameNumbers = referencedFrameIndicies.map(element => {
|
|
73
82
|
return element + 1;
|
|
74
83
|
});
|
|
75
|
-
|
|
84
|
+
const segment = segments[segmentIndex];
|
|
76
85
|
seg.addSegment(segment, _extractCornerstoneToolsPixelData(segmentIndex, referencedFrameIndicies, toolState, images, dims), referencedFrameNumbers);
|
|
77
86
|
}
|
|
78
87
|
seg.bitPackPixelData();
|
|
79
|
-
|
|
88
|
+
const segBlob = datasetToBlob(seg.dataset);
|
|
80
89
|
return segBlob;
|
|
81
90
|
}
|
|
82
91
|
function _extractCornerstoneToolsPixelData(segmentIndex, referencedFrames, toolState, images, dims) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
for (
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
for (
|
|
92
|
+
const pixelData = new Uint8Array(dims.xy * referencedFrames.length);
|
|
93
|
+
let pixelDataIndex = 0;
|
|
94
|
+
for (let i = 0; i < referencedFrames.length; i++) {
|
|
95
|
+
const frame = referencedFrames[i];
|
|
96
|
+
const imageId = images[frame].imageId;
|
|
97
|
+
const imageIdSpecificToolState = toolState[imageId];
|
|
98
|
+
const brushPixelData = imageIdSpecificToolState.brush.data[segmentIndex].pixelData;
|
|
99
|
+
for (let p = 0; p < brushPixelData.length; p++) {
|
|
91
100
|
pixelData[pixelDataIndex] = brushPixelData[p];
|
|
92
101
|
pixelDataIndex++;
|
|
93
102
|
}
|
|
@@ -95,32 +104,32 @@ function _extractCornerstoneToolsPixelData(segmentIndex, referencedFrames, toolS
|
|
|
95
104
|
return pixelData;
|
|
96
105
|
}
|
|
97
106
|
function _getNumberOfFramesPerSegment(toolState, images, segments) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
for (
|
|
107
|
+
const segmentIndicies = [];
|
|
108
|
+
const referencedFramesPerSegment = [];
|
|
109
|
+
for (let i = 0; i < segments.length; i++) {
|
|
101
110
|
if (segments[i]) {
|
|
102
111
|
segmentIndicies.push(i);
|
|
103
112
|
referencedFramesPerSegment.push([]);
|
|
104
113
|
}
|
|
105
114
|
}
|
|
106
|
-
for (
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
for (
|
|
110
|
-
|
|
115
|
+
for (let z = 0; z < images.length; z++) {
|
|
116
|
+
const imageId = images[z].imageId;
|
|
117
|
+
const imageIdSpecificToolState = toolState[imageId];
|
|
118
|
+
for (let i = 0; i < segmentIndicies.length; i++) {
|
|
119
|
+
const segIdx = segmentIndicies[i];
|
|
111
120
|
if (imageIdSpecificToolState && imageIdSpecificToolState.brush && imageIdSpecificToolState.brush.data && imageIdSpecificToolState.brush.data[segIdx] && imageIdSpecificToolState.brush.data[segIdx].pixelData) {
|
|
112
|
-
referencedFramesPerSegment[
|
|
121
|
+
referencedFramesPerSegment[i].push(z);
|
|
113
122
|
}
|
|
114
123
|
}
|
|
115
124
|
}
|
|
116
125
|
return {
|
|
117
|
-
referencedFramesPerSegment
|
|
118
|
-
segmentIndicies
|
|
126
|
+
referencedFramesPerSegment,
|
|
127
|
+
segmentIndicies
|
|
119
128
|
};
|
|
120
129
|
}
|
|
121
130
|
function _getSegCount(seg, segments) {
|
|
122
|
-
|
|
123
|
-
for (
|
|
131
|
+
let numSegments = 0;
|
|
132
|
+
for (let i = 0; i < segments.length; i++) {
|
|
124
133
|
if (segments[i]) {
|
|
125
134
|
numSegments++;
|
|
126
135
|
}
|
|
@@ -136,7 +145,7 @@ function _getSegCount(seg, segments) {
|
|
|
136
145
|
* @returns {Object} The Seg derived dataSet.
|
|
137
146
|
*/
|
|
138
147
|
function _createSegFromImages(images, isMultiframe, options) {
|
|
139
|
-
|
|
148
|
+
const multiframe = getDatasetsFromImages(images, isMultiframe);
|
|
140
149
|
return new SegmentationDerivation([multiframe], options);
|
|
141
150
|
}
|
|
142
151
|
|
|
@@ -151,52 +160,52 @@ function _createSegFromImages(images, isMultiframe, options) {
|
|
|
151
160
|
* segment metadata can be derived.
|
|
152
161
|
*/
|
|
153
162
|
function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
154
|
-
|
|
155
|
-
|
|
163
|
+
const dicomData = DicomMessage.readFile(arrayBuffer);
|
|
164
|
+
const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
|
156
165
|
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
157
|
-
|
|
158
|
-
|
|
166
|
+
const multiframe = Normalizer.normalizeToDataset([dataset]);
|
|
167
|
+
const imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
159
168
|
if (!imagePlaneModule) {
|
|
160
169
|
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
161
170
|
}
|
|
162
|
-
|
|
171
|
+
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];
|
|
163
172
|
|
|
164
173
|
// Get IOP from ref series, compute supported orientations:
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
for (
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
174
|
+
const validOrientations = getValidOrientations(ImageOrientationPatient);
|
|
175
|
+
const SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence;
|
|
176
|
+
const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
|
|
177
|
+
const sliceLength = multiframe.Columns * multiframe.Rows;
|
|
178
|
+
const segMetadata = getSegmentMetadata(multiframe);
|
|
179
|
+
const pixelData = unpackPixelData(multiframe);
|
|
180
|
+
const PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
|
|
181
|
+
const toolState = {};
|
|
182
|
+
let inPlane = true;
|
|
183
|
+
for (let i = 0; i < PerFrameFunctionalGroupsSequence.length; i++) {
|
|
184
|
+
const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];
|
|
185
|
+
const ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
186
|
+
const pixelDataI2D = ndarray(new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength), [multiframe.Rows, multiframe.Columns]);
|
|
187
|
+
const alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations);
|
|
179
188
|
if (!alignedPixelDataI) {
|
|
180
189
|
console.warn("This segmentation object is not in-plane with the source data. Bailing out of IO. It'd be better to render this with vtkjs. ");
|
|
181
190
|
inPlane = false;
|
|
182
191
|
break;
|
|
183
192
|
}
|
|
184
|
-
|
|
185
|
-
|
|
193
|
+
const segmentIndex = PerFrameFunctionalGroups.SegmentIdentificationSequence.ReferencedSegmentNumber - 1;
|
|
194
|
+
let SourceImageSequence;
|
|
186
195
|
if (SharedFunctionalGroupsSequence.DerivationImageSequence && SharedFunctionalGroupsSequence.DerivationImageSequence.SourceImageSequence) {
|
|
187
196
|
SourceImageSequence = SharedFunctionalGroupsSequence.DerivationImageSequence.SourceImageSequence[i];
|
|
188
197
|
} else {
|
|
189
198
|
SourceImageSequence = PerFrameFunctionalGroups.DerivationImageSequence.SourceImageSequence;
|
|
190
199
|
}
|
|
191
|
-
|
|
200
|
+
const imageId = getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider);
|
|
192
201
|
addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, alignedPixelDataI);
|
|
193
202
|
}
|
|
194
203
|
if (!inPlane) {
|
|
195
204
|
return;
|
|
196
205
|
}
|
|
197
206
|
return {
|
|
198
|
-
toolState
|
|
199
|
-
segMetadata
|
|
207
|
+
toolState,
|
|
208
|
+
segMetadata
|
|
200
209
|
};
|
|
201
210
|
}
|
|
202
211
|
|
|
@@ -207,15 +216,13 @@ function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
|
207
216
|
* @return {Uint8Array} The unpacked pixelData.
|
|
208
217
|
*/
|
|
209
218
|
function unpackPixelData(multiframe) {
|
|
210
|
-
|
|
219
|
+
const segType = multiframe.SegmentationType;
|
|
211
220
|
if (segType === "BINARY") {
|
|
212
221
|
return BitArray.unpack(multiframe.PixelData);
|
|
213
222
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
return element !== 0 && element !== max;
|
|
218
|
-
}) === undefined;
|
|
223
|
+
const pixelData = new Uint8Array(multiframe.PixelData);
|
|
224
|
+
const max = multiframe.MaximumFractionalValue;
|
|
225
|
+
const onlyMaxAndZero = pixelData.find(element => element !== 0 && element !== max) === undefined;
|
|
219
226
|
if (!onlyMaxAndZero) {
|
|
220
227
|
log.warn("This is a fractional segmentation, which is not currently supported.");
|
|
221
228
|
return;
|
|
@@ -245,10 +252,10 @@ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixe
|
|
|
245
252
|
toolState[imageId].brush.data = [];
|
|
246
253
|
}
|
|
247
254
|
toolState[imageId].brush.data[segmentIndex] = {};
|
|
248
|
-
|
|
255
|
+
const brushDataI = toolState[imageId].brush.data[segmentIndex];
|
|
249
256
|
brushDataI.pixelData = new Uint8Array(pixelData2D.data.length);
|
|
250
|
-
|
|
251
|
-
for (
|
|
257
|
+
const cToolsPixelData = brushDataI.pixelData;
|
|
258
|
+
for (let p = 0; p < cToolsPixelData.length; p++) {
|
|
252
259
|
if (pixelData2D.data[p]) {
|
|
253
260
|
cToolsPixelData[p] = 1;
|
|
254
261
|
} else {
|
|
@@ -267,8 +274,10 @@ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixe
|
|
|
267
274
|
* @return {String} The corresponding imageId.
|
|
268
275
|
*/
|
|
269
276
|
function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
|
|
270
|
-
|
|
271
|
-
|
|
277
|
+
const {
|
|
278
|
+
ReferencedSOPInstanceUID,
|
|
279
|
+
ReferencedFrameNumber
|
|
280
|
+
} = SourceImageSequence;
|
|
272
281
|
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
|
|
273
282
|
}
|
|
274
283
|
|
|
@@ -283,8 +292,8 @@ function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider
|
|
|
283
292
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
284
293
|
*/
|
|
285
294
|
function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds, metadataProvider) {
|
|
286
|
-
return imageIds.find(
|
|
287
|
-
|
|
295
|
+
return imageIds.find(imageId => {
|
|
296
|
+
const sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
|
|
288
297
|
if (!sopCommonModule) {
|
|
289
298
|
return;
|
|
290
299
|
}
|
|
@@ -304,12 +313,12 @@ function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds,
|
|
|
304
313
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
305
314
|
*/
|
|
306
315
|
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
|
|
307
|
-
|
|
308
|
-
|
|
316
|
+
const imageId = imageIds.find(imageId => {
|
|
317
|
+
const sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
|
|
309
318
|
if (!sopCommonModule) {
|
|
310
319
|
return;
|
|
311
320
|
}
|
|
312
|
-
|
|
321
|
+
const imageIdFrameNumber = Number(imageId.split("frame=")[1]);
|
|
313
322
|
return (
|
|
314
323
|
//frameNumber is zero indexed for cornerstoneDICOMImageLoader image Ids.
|
|
315
324
|
sopCommonModule.sopInstanceUID === sopInstanceUid && imageIdFrameNumber === frameNumber - 1
|
|
@@ -325,7 +334,7 @@ function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, imageIds, meta
|
|
|
325
334
|
* @return An array of valid orientations.
|
|
326
335
|
*/
|
|
327
336
|
function getValidOrientations(iop) {
|
|
328
|
-
|
|
337
|
+
const orientations = [];
|
|
329
338
|
|
|
330
339
|
// [0, 1, 2]: 0, 0hf, 0vf
|
|
331
340
|
// [3, 4, 5]: 90, 90hf, 90vf
|
|
@@ -334,7 +343,7 @@ function getValidOrientations(iop) {
|
|
|
334
343
|
orientations[0] = iop;
|
|
335
344
|
orientations[1] = flipIOP.h(iop);
|
|
336
345
|
orientations[2] = flipIOP.v(iop);
|
|
337
|
-
|
|
346
|
+
const iop90 = rotateDirectionCosinesInPlane(iop, Math.PI / 2);
|
|
338
347
|
orientations[3] = iop90;
|
|
339
348
|
orientations[4] = flipIOP.h(iop90);
|
|
340
349
|
orientations[5] = flipIOP.v(iop90);
|
|
@@ -378,7 +387,7 @@ function alignPixelDataWithSourceData(pixelData2D, iop, orientations) {
|
|
|
378
387
|
return rotateMatrix902D(rotateMatrix902D(rotateMatrix902D(pixelData2D)));
|
|
379
388
|
}
|
|
380
389
|
}
|
|
381
|
-
|
|
390
|
+
const dx = 1e-5;
|
|
382
391
|
|
|
383
392
|
/**
|
|
384
393
|
* compareIOP - Returns true if iop1 and iop2 are equal
|
|
@@ -392,10 +401,10 @@ function compareIOP(iop1, iop2) {
|
|
|
392
401
|
return Math.abs(iop1[0] - iop2[0]) < dx && Math.abs(iop1[1] - iop2[1]) < dx && Math.abs(iop1[2] - iop2[2]) < dx && Math.abs(iop1[3] - iop2[3]) < dx && Math.abs(iop1[4] - iop2[4]) < dx && Math.abs(iop1[5] - iop2[5]) < dx;
|
|
393
402
|
}
|
|
394
403
|
function getSegmentMetadata(multiframe) {
|
|
395
|
-
|
|
396
|
-
|
|
404
|
+
const data = [];
|
|
405
|
+
const segmentSequence = multiframe.SegmentSequence;
|
|
397
406
|
if (Array.isArray(segmentSequence)) {
|
|
398
|
-
for (
|
|
407
|
+
for (let segIdx = 0; segIdx < segmentSequence.length; segIdx++) {
|
|
399
408
|
data.push(segmentSequence[segIdx]);
|
|
400
409
|
}
|
|
401
410
|
} else {
|
|
@@ -404,7 +413,7 @@ function getSegmentMetadata(multiframe) {
|
|
|
404
413
|
}
|
|
405
414
|
return {
|
|
406
415
|
seriesInstanceUid: multiframe.ReferencedSeriesSequence.SeriesInstanceUID,
|
|
407
|
-
data
|
|
416
|
+
data
|
|
408
417
|
};
|
|
409
418
|
}
|
|
410
419
|
|