@cornerstonejs/adapters 2.0.0-beta.2 → 2.0.0-beta.21

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.
Files changed (118) hide show
  1. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +493 -0
  2. package/dist/esm/adapters/Cornerstone/Angle.d.ts +45 -0
  3. package/dist/esm/adapters/Cornerstone/Angle.js +93 -0
  4. package/dist/esm/adapters/Cornerstone/ArrowAnnotate.d.ts +49 -0
  5. package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +97 -0
  6. package/dist/esm/adapters/Cornerstone/Bidirectional.d.ts +89 -0
  7. package/dist/esm/adapters/Cornerstone/Bidirectional.js +170 -0
  8. package/dist/esm/adapters/Cornerstone/CircleRoi.d.ts +65 -0
  9. package/dist/esm/adapters/Cornerstone/CircleRoi.js +115 -0
  10. package/dist/esm/adapters/Cornerstone/CobbAngle.d.ts +49 -0
  11. package/dist/esm/adapters/Cornerstone/CobbAngle.js +98 -0
  12. package/dist/esm/adapters/Cornerstone/EllipticalRoi.d.ts +57 -0
  13. package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +178 -0
  14. package/dist/esm/adapters/Cornerstone/FreehandRoi.d.ts +42 -0
  15. package/dist/esm/adapters/Cornerstone/FreehandRoi.js +89 -0
  16. package/dist/esm/adapters/Cornerstone/Length.d.ts +39 -0
  17. package/dist/esm/adapters/Cornerstone/Length.js +82 -0
  18. package/dist/esm/adapters/Cornerstone/MeasurementReport.d.ts +36 -0
  19. package/dist/esm/adapters/Cornerstone/MeasurementReport.js +276 -0
  20. package/dist/esm/adapters/Cornerstone/RectangleRoi.d.ts +44 -0
  21. package/dist/esm/adapters/Cornerstone/RectangleRoi.js +97 -0
  22. package/dist/esm/adapters/Cornerstone/Segmentation.d.ts +44 -0
  23. package/dist/esm/adapters/Cornerstone/Segmentation.js +79 -0
  24. package/dist/esm/adapters/Cornerstone/Segmentation_3X.d.ts +45 -0
  25. package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +428 -0
  26. package/dist/esm/adapters/Cornerstone/Segmentation_4X.d.ts +54 -0
  27. package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +1200 -0
  28. package/dist/esm/adapters/Cornerstone/cornerstone4Tag.d.ts +2 -0
  29. package/dist/esm/adapters/Cornerstone/cornerstone4Tag.js +3 -0
  30. package/dist/esm/adapters/Cornerstone/index.d.ts +34 -0
  31. package/dist/esm/adapters/Cornerstone/index.js +29 -0
  32. package/dist/esm/adapters/Cornerstone3D/Angle.js +110 -0
  33. package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +35 -0
  34. package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +123 -0
  35. package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +146 -0
  36. package/dist/esm/adapters/Cornerstone3D/CircleROI.js +103 -0
  37. package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +113 -0
  38. package/dist/esm/adapters/Cornerstone3D/CodingScheme.d.ts +9 -0
  39. package/dist/esm/adapters/Cornerstone3D/CodingScheme.js +15 -0
  40. package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +170 -0
  41. package/dist/esm/adapters/Cornerstone3D/Length.d.ts +41 -0
  42. package/dist/esm/adapters/Cornerstone3D/Length.js +101 -0
  43. package/dist/{types → esm}/adapters/Cornerstone3D/MeasurementReport.d.ts +1 -1
  44. package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +314 -0
  45. package/dist/{types → esm}/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +9 -2
  46. package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +129 -0
  47. package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +33 -0
  48. package/dist/esm/adapters/Cornerstone3D/Probe.js +87 -0
  49. package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.d.ts +90 -0
  50. package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +250 -0
  51. package/dist/esm/adapters/Cornerstone3D/RTStruct/index.d.ts +4 -0
  52. package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +6 -0
  53. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.d.ts +13 -0
  54. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.js +22 -0
  55. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.d.ts +6 -0
  56. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.js +10 -0
  57. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.d.ts +4 -0
  58. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.js +9 -0
  59. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.d.ts +11 -0
  60. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +22 -0
  61. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.d.ts +4 -0
  62. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +27 -0
  63. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.d.ts +7 -0
  64. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +12 -0
  65. package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +92 -0
  66. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +45 -0
  67. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +47 -0
  68. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +25 -0
  69. package/dist/esm/adapters/Cornerstone3D/Segmentation/index.js +3 -0
  70. package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +36 -0
  71. package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +93 -0
  72. package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.d.ts +2 -0
  73. package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.js +3 -0
  74. package/dist/{types → esm}/adapters/Cornerstone3D/index.d.ts +20 -6
  75. package/dist/esm/adapters/Cornerstone3D/index.js +41 -0
  76. package/dist/esm/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.js +20 -0
  77. package/dist/esm/adapters/VTKjs/Segmentation.d.ts +41 -0
  78. package/dist/esm/adapters/VTKjs/Segmentation.js +186 -0
  79. package/dist/esm/adapters/VTKjs/index.d.ts +5 -0
  80. package/dist/esm/adapters/VTKjs/index.js +7 -0
  81. package/dist/esm/adapters/enums/Events.js +13 -0
  82. package/dist/esm/adapters/enums/index.js +1 -0
  83. package/dist/esm/adapters/helpers/codeMeaningEquals.js +14 -0
  84. package/dist/{types → esm}/adapters/helpers/downloadDICOMData.d.ts +1 -1
  85. package/dist/esm/adapters/helpers/downloadDICOMData.js +31 -0
  86. package/dist/esm/adapters/helpers/graphicTypeEquals.js +12 -0
  87. package/dist/esm/adapters/helpers/index.js +4 -0
  88. package/dist/esm/adapters/helpers/toArray.js +5 -0
  89. package/dist/esm/adapters/index.d.ts +62 -0
  90. package/dist/esm/adapters/index.js +20 -0
  91. package/dist/esm/index.d.ts +2 -0
  92. package/dist/esm/index.js +5 -0
  93. package/dist/umd/adapters.umd.js +5738 -0
  94. package/dist/umd/adapters.umd.js.map +1 -0
  95. package/package.json +14 -10
  96. package/dist/adapters.es.js +0 -5194
  97. package/dist/adapters.es.js.map +0 -1
  98. package/dist/types/adapters/Cornerstone/index.d.ts +0 -16
  99. package/dist/types/adapters/VTKjs/index.d.ts +0 -4
  100. package/dist/types/adapters/index.d.ts +0 -43
  101. package/dist/types/index.d.ts +0 -2
  102. /package/dist/{types → esm}/adapters/Cornerstone3D/Angle.d.ts +0 -0
  103. /package/dist/{types → esm}/adapters/Cornerstone3D/Bidirectional.d.ts +0 -0
  104. /package/dist/{types → esm}/adapters/Cornerstone3D/CircleROI.d.ts +0 -0
  105. /package/dist/{types → esm}/adapters/Cornerstone3D/CobbAngle.d.ts +0 -0
  106. /package/dist/{types → esm}/adapters/Cornerstone3D/EllipticalROI.d.ts +0 -0
  107. /package/dist/{types → esm}/adapters/Cornerstone3D/RectangleROI.d.ts +0 -0
  108. /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.d.ts +0 -0
  109. /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +0 -0
  110. /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +0 -0
  111. /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/index.d.ts +0 -0
  112. /package/dist/{types → esm}/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.d.ts +0 -0
  113. /package/dist/{types → esm}/adapters/enums/Events.d.ts +0 -0
  114. /package/dist/{types → esm}/adapters/enums/index.d.ts +0 -0
  115. /package/dist/{types → esm}/adapters/helpers/codeMeaningEquals.d.ts +0 -0
  116. /package/dist/{types → esm}/adapters/helpers/graphicTypeEquals.d.ts +0 -0
  117. /package/dist/{types → esm}/adapters/helpers/index.d.ts +0 -0
  118. /package/dist/{types → esm}/adapters/helpers/toArray.d.ts +0 -0
@@ -0,0 +1,428 @@
1
+ import { toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { utilities, normalizers, derivations, log } from 'dcmjs';
3
+ import ndarray from 'ndarray';
4
+
5
+ var _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
+ var datasetToBlob = utilities.datasetToBlob,
11
+ BitArray = utilities.BitArray,
12
+ DicomMessage = utilities.DicomMessage,
13
+ DicomMetaDictionary = utilities.DicomMetaDictionary;
14
+ var Normalizer = normalizers.Normalizer;
15
+ var SegmentationDerivation = derivations.Segmentation;
16
+ var Segmentation = {
17
+ generateSegmentation: generateSegmentation,
18
+ generateToolState: generateToolState
19
+ };
20
+
21
+ /**
22
+ *
23
+ * @typedef {Object} BrushData
24
+ * @property {Object} toolState - The cornerstoneTools global toolState.
25
+ * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
26
+ * seriesInstanceUid.
27
+ */
28
+
29
+ /**
30
+ * generateSegmentation - Generates cornerstoneTools brush data, given a stack of
31
+ * imageIds, images and the cornerstoneTools brushData.
32
+ *
33
+ * @param {object[]} images An array of the cornerstone image objects.
34
+ * @param {BrushData} brushData and object containing the brushData.
35
+ * @returns {type} description
36
+ */
37
+ function generateSegmentation(images, brushData) {
38
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
39
+ includeSliceSpacing: true
40
+ };
41
+ var toolState = brushData.toolState,
42
+ segments = brushData.segments;
43
+
44
+ // Calculate the dimensions of the data cube.
45
+ var image0 = images[0];
46
+ var dims = {
47
+ x: image0.columns,
48
+ y: image0.rows,
49
+ z: images.length
50
+ };
51
+ dims.xy = dims.x * dims.y;
52
+ var numSegments = _getSegCount(seg, segments);
53
+ if (!numSegments) {
54
+ throw new Error("No segments to export!");
55
+ }
56
+ var isMultiframe = image0.imageId.includes("?frame");
57
+ var seg = _createSegFromImages(images, isMultiframe, options);
58
+ var _getNumberOfFramesPer = _getNumberOfFramesPerSegment(toolState, images, segments),
59
+ referencedFramesPerSegment = _getNumberOfFramesPer.referencedFramesPerSegment,
60
+ segmentIndicies = _getNumberOfFramesPer.segmentIndicies;
61
+ var NumberOfFrames = 0;
62
+ for (var i = 0; i < referencedFramesPerSegment.length; i++) {
63
+ NumberOfFrames += referencedFramesPerSegment[i].length;
64
+ }
65
+ seg.setNumberOfFrames(NumberOfFrames);
66
+ for (var _i = 0; _i < segmentIndicies.length; _i++) {
67
+ var segmentIndex = segmentIndicies[_i];
68
+ var referencedFrameIndicies = referencedFramesPerSegment[_i];
69
+
70
+ // Frame numbers start from 1.
71
+ var referencedFrameNumbers = referencedFrameIndicies.map(function (element) {
72
+ return element + 1;
73
+ });
74
+ var segment = segments[segmentIndex];
75
+ seg.addSegment(segment, _extractCornerstoneToolsPixelData(segmentIndex, referencedFrameIndicies, toolState, images, dims), referencedFrameNumbers);
76
+ }
77
+ seg.bitPackPixelData();
78
+ var segBlob = datasetToBlob(seg.dataset);
79
+ return segBlob;
80
+ }
81
+ function _extractCornerstoneToolsPixelData(segmentIndex, referencedFrames, toolState, images, dims) {
82
+ var pixelData = new Uint8Array(dims.xy * referencedFrames.length);
83
+ var pixelDataIndex = 0;
84
+ for (var i = 0; i < referencedFrames.length; i++) {
85
+ var frame = referencedFrames[i];
86
+ var imageId = images[frame].imageId;
87
+ var imageIdSpecificToolState = toolState[imageId];
88
+ var brushPixelData = imageIdSpecificToolState.brush.data[segmentIndex].pixelData;
89
+ for (var p = 0; p < brushPixelData.length; p++) {
90
+ pixelData[pixelDataIndex] = brushPixelData[p];
91
+ pixelDataIndex++;
92
+ }
93
+ }
94
+ return pixelData;
95
+ }
96
+ function _getNumberOfFramesPerSegment(toolState, images, segments) {
97
+ var segmentIndicies = [];
98
+ var referencedFramesPerSegment = [];
99
+ for (var i = 0; i < segments.length; i++) {
100
+ if (segments[i]) {
101
+ segmentIndicies.push(i);
102
+ referencedFramesPerSegment.push([]);
103
+ }
104
+ }
105
+ for (var z = 0; z < images.length; z++) {
106
+ var imageId = images[z].imageId;
107
+ var imageIdSpecificToolState = toolState[imageId];
108
+ for (var _i2 = 0; _i2 < segmentIndicies.length; _i2++) {
109
+ var segIdx = segmentIndicies[_i2];
110
+ if (imageIdSpecificToolState && imageIdSpecificToolState.brush && imageIdSpecificToolState.brush.data && imageIdSpecificToolState.brush.data[segIdx] && imageIdSpecificToolState.brush.data[segIdx].pixelData) {
111
+ referencedFramesPerSegment[_i2].push(z);
112
+ }
113
+ }
114
+ }
115
+ return {
116
+ referencedFramesPerSegment: referencedFramesPerSegment,
117
+ segmentIndicies: segmentIndicies
118
+ };
119
+ }
120
+ function _getSegCount(seg, segments) {
121
+ var numSegments = 0;
122
+ for (var i = 0; i < segments.length; i++) {
123
+ if (segments[i]) {
124
+ numSegments++;
125
+ }
126
+ }
127
+ return numSegments;
128
+ }
129
+
130
+ /**
131
+ * _createSegFromImages - description
132
+ *
133
+ * @param {Object[]} images An array of the cornerstone image objects.
134
+ * @param {Boolean} isMultiframe Whether the images are multiframe.
135
+ * @returns {Object} The Seg derived dataSet.
136
+ */
137
+ function _createSegFromImages(images, isMultiframe, options) {
138
+ var datasets = [];
139
+ if (isMultiframe) {
140
+ var image = images[0];
141
+ var arrayBuffer = image.data.byteArray.buffer;
142
+ var dicomData = DicomMessage.readFile(arrayBuffer);
143
+ var dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
144
+ dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
145
+ datasets.push(dataset);
146
+ } else {
147
+ for (var i = 0; i < images.length; i++) {
148
+ var _image = images[i];
149
+ var _arrayBuffer = _image.data.byteArray.buffer;
150
+ var _dicomData = DicomMessage.readFile(_arrayBuffer);
151
+ var _dataset = DicomMetaDictionary.naturalizeDataset(_dicomData.dict);
152
+ _dataset._meta = DicomMetaDictionary.namifyDataset(_dicomData.meta);
153
+ datasets.push(_dataset);
154
+ }
155
+ }
156
+ var multiframe = Normalizer.normalizeToDataset(datasets);
157
+ return new SegmentationDerivation([multiframe], options);
158
+ }
159
+
160
+ /**
161
+ * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
162
+ * derive cornerstoneTools toolState and brush metadata.
163
+ *
164
+ * @param {string[]} imageIds An array of the imageIds.
165
+ * @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
166
+ * @param {*} metadataProvider
167
+ * @returns {Object} The toolState and an object from which the
168
+ * segment metadata can be derived.
169
+ */
170
+ function generateToolState(imageIds, arrayBuffer, metadataProvider) {
171
+ var dicomData = DicomMessage.readFile(arrayBuffer);
172
+ var dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
173
+ dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
174
+ var multiframe = Normalizer.normalizeToDataset([dataset]);
175
+ var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
176
+ if (!imagePlaneModule) {
177
+ console.warn("Insufficient metadata, imagePlaneModule missing.");
178
+ }
179
+ var ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [].concat(_toConsumableArray(imagePlaneModule.rowCosines), _toConsumableArray(imagePlaneModule.columnCosines)) : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z];
180
+
181
+ // Get IOP from ref series, compute supported orientations:
182
+ var validOrientations = getValidOrientations(ImageOrientationPatient);
183
+ var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence;
184
+ var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
185
+ var sliceLength = multiframe.Columns * multiframe.Rows;
186
+ var segMetadata = getSegmentMetadata(multiframe);
187
+ var pixelData = unpackPixelData(multiframe);
188
+ var PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
189
+ var toolState = {};
190
+ var inPlane = true;
191
+ for (var i = 0; i < PerFrameFunctionalGroupsSequence.length; i++) {
192
+ var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];
193
+ var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
194
+ var pixelDataI2D = ndarray(new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength), [multiframe.Rows, multiframe.Columns]);
195
+ var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations);
196
+ if (!alignedPixelDataI) {
197
+ 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. ");
198
+ inPlane = false;
199
+ break;
200
+ }
201
+ var segmentIndex = PerFrameFunctionalGroups.SegmentIdentificationSequence.ReferencedSegmentNumber - 1;
202
+ var SourceImageSequence = void 0;
203
+ if (SharedFunctionalGroupsSequence.DerivationImageSequence && SharedFunctionalGroupsSequence.DerivationImageSequence.SourceImageSequence) {
204
+ SourceImageSequence = SharedFunctionalGroupsSequence.DerivationImageSequence.SourceImageSequence[i];
205
+ } else {
206
+ SourceImageSequence = PerFrameFunctionalGroups.DerivationImageSequence.SourceImageSequence;
207
+ }
208
+ var imageId = getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider);
209
+ addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, alignedPixelDataI);
210
+ }
211
+ if (!inPlane) {
212
+ return;
213
+ }
214
+ return {
215
+ toolState: toolState,
216
+ segMetadata: segMetadata
217
+ };
218
+ }
219
+
220
+ /**
221
+ * unpackPixelData - Unpacks bitpacked pixelData if the Segmentation is BINARY.
222
+ *
223
+ * @param {Object} multiframe The multiframe dataset.
224
+ * @return {Uint8Array} The unpacked pixelData.
225
+ */
226
+ function unpackPixelData(multiframe) {
227
+ var segType = multiframe.SegmentationType;
228
+ if (segType === "BINARY") {
229
+ return BitArray.unpack(multiframe.PixelData);
230
+ }
231
+ var pixelData = new Uint8Array(multiframe.PixelData);
232
+ var max = multiframe.MaximumFractionalValue;
233
+ var onlyMaxAndZero = pixelData.find(function (element) {
234
+ return element !== 0 && element !== max;
235
+ }) === undefined;
236
+ if (!onlyMaxAndZero) {
237
+ log.warn("This is a fractional segmentation, which is not currently supported.");
238
+ return;
239
+ }
240
+ log.warn("This segmentation object is actually binary... processing as such.");
241
+ return pixelData;
242
+ }
243
+
244
+ /**
245
+ * addImageIdSpecificBrushToolState - Adds brush pixel data to cornerstoneTools
246
+ * formatted toolState object.
247
+ *
248
+ * @param {Object} toolState The toolState object to modify
249
+ * @param {String} imageId The imageId of the toolState to add the data.
250
+ * @param {Number} segmentIndex The index of the segment data being added.
251
+ * @param {Ndarray} pixelData2D The pixelData in Ndarry 2D format.
252
+ */
253
+ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixelData2D) {
254
+ if (!toolState[imageId]) {
255
+ toolState[imageId] = {};
256
+ toolState[imageId].brush = {};
257
+ toolState[imageId].brush.data = [];
258
+ } else if (!toolState[imageId].brush) {
259
+ toolState[imageId].brush = {};
260
+ toolState[imageId].brush.data = [];
261
+ } else if (!toolState[imageId].brush.data) {
262
+ toolState[imageId].brush.data = [];
263
+ }
264
+ toolState[imageId].brush.data[segmentIndex] = {};
265
+ var brushDataI = toolState[imageId].brush.data[segmentIndex];
266
+ brushDataI.pixelData = new Uint8Array(pixelData2D.data.length);
267
+ var cToolsPixelData = brushDataI.pixelData;
268
+ for (var p = 0; p < cToolsPixelData.length; p++) {
269
+ if (pixelData2D.data[p]) {
270
+ cToolsPixelData[p] = 1;
271
+ } else {
272
+ cToolsPixelData[p] = 0;
273
+ }
274
+ }
275
+ }
276
+
277
+ /**
278
+ * getImageIdOfSourceImage - Returns the Cornerstone imageId of the source image.
279
+ *
280
+ * @param {Object} SourceImageSequence Sequence describing the source image.
281
+ * @param {String[]} imageIds A list of imageIds.
282
+ * @param {Object} metadataProvider A Cornerstone metadataProvider to query
283
+ * metadata from imageIds.
284
+ * @return {String} The corresponding imageId.
285
+ */
286
+ function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
287
+ var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
288
+ ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
289
+ return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
290
+ }
291
+
292
+ /**
293
+ * getImageIdOfReferencedSingleFramedSOPInstance - Returns the imageId
294
+ * corresponding to the specified sopInstanceUid for single-frame images.
295
+ *
296
+ * @param {String} sopInstanceUid The sopInstanceUid of the desired image.
297
+ * @param {String[]} imageIds The list of imageIds.
298
+ * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids
299
+ * from the cornerstone imageIds.
300
+ * @return {String} The imageId that corresponds to the sopInstanceUid.
301
+ */
302
+ function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds, metadataProvider) {
303
+ return imageIds.find(function (imageId) {
304
+ var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
305
+ if (!sopCommonModule) {
306
+ return;
307
+ }
308
+ return sopCommonModule.sopInstanceUID === sopInstanceUid;
309
+ });
310
+ }
311
+
312
+ /**
313
+ * getImageIdOfReferencedFrame - Returns the imageId corresponding to the
314
+ * specified sopInstanceUid and frameNumber for multi-frame images.
315
+ *
316
+ * @param {String} sopInstanceUid The sopInstanceUid of the desired image.
317
+ * @param {Number} frameNumber The frame number.
318
+ * @param {String} imageIds The list of imageIds.
319
+ * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids
320
+ * from the cornerstone imageIds.
321
+ * @return {String} The imageId that corresponds to the sopInstanceUid.
322
+ */
323
+ function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
324
+ var imageId = imageIds.find(function (imageId) {
325
+ var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
326
+ if (!sopCommonModule) {
327
+ return;
328
+ }
329
+ var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
330
+ return (
331
+ //frameNumber is zero indexed for cornerstoneDICOMImageLoader image Ids.
332
+ sopCommonModule.sopInstanceUID === sopInstanceUid && imageIdFrameNumber === frameNumber - 1
333
+ );
334
+ });
335
+ return imageId;
336
+ }
337
+
338
+ /**
339
+ * getValidOrientations - returns an array of valid orientations.
340
+ *
341
+ * @param iop - The row (0..2) an column (3..5) direction cosines.
342
+ * @return An array of valid orientations.
343
+ */
344
+ function getValidOrientations(iop) {
345
+ var orientations = [];
346
+
347
+ // [0, 1, 2]: 0, 0hf, 0vf
348
+ // [3, 4, 5]: 90, 90hf, 90vf
349
+ // [6, 7]: 180, 270
350
+
351
+ orientations[0] = iop;
352
+ orientations[1] = flipIOP.h(iop);
353
+ orientations[2] = flipIOP.v(iop);
354
+ var iop90 = rotateDirectionCosinesInPlane(iop, Math.PI / 2);
355
+ orientations[3] = iop90;
356
+ orientations[4] = flipIOP.h(iop90);
357
+ orientations[5] = flipIOP.v(iop90);
358
+ orientations[6] = rotateDirectionCosinesInPlane(iop, Math.PI);
359
+ orientations[7] = rotateDirectionCosinesInPlane(iop, 1.5 * Math.PI);
360
+ return orientations;
361
+ }
362
+
363
+ /**
364
+ * alignPixelDataWithSourceData -
365
+ *
366
+ * @param pixelData2D - The data to align.
367
+ * @param iop - The orientation of the image slice.
368
+ * @param orientations - An array of valid imageOrientationPatient values.
369
+ * @return The aligned pixelData.
370
+ */
371
+ function alignPixelDataWithSourceData(pixelData2D, iop, orientations) {
372
+ if (compareIOP(iop, orientations[0])) {
373
+ //Same orientation.
374
+ return pixelData2D;
375
+ } else if (compareIOP(iop, orientations[1])) {
376
+ //Flipped vertically.
377
+ return flipMatrix2D.v(pixelData2D);
378
+ } else if (compareIOP(iop, orientations[2])) {
379
+ //Flipped horizontally.
380
+ return flipMatrix2D.h(pixelData2D);
381
+ } else if (compareIOP(iop, orientations[3])) {
382
+ //Rotated 90 degrees.
383
+ return rotateMatrix902D(pixelData2D);
384
+ } else if (compareIOP(iop, orientations[4])) {
385
+ //Rotated 90 degrees and fliped horizontally.
386
+ return flipMatrix2D.h(rotateMatrix902D(pixelData2D));
387
+ } else if (compareIOP(iop, orientations[5])) {
388
+ //Rotated 90 degrees and fliped vertically.
389
+ return flipMatrix2D.v(rotateMatrix902D(pixelData2D));
390
+ } else if (compareIOP(iop, orientations[6])) {
391
+ //Rotated 180 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.
392
+ return rotateMatrix902D(rotateMatrix902D(pixelData2D));
393
+ } else if (compareIOP(iop, orientations[7])) {
394
+ //Rotated 270 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.
395
+ return rotateMatrix902D(rotateMatrix902D(rotateMatrix902D(pixelData2D)));
396
+ }
397
+ }
398
+ var dx = 1e-5;
399
+
400
+ /**
401
+ * compareIOP - Returns true if iop1 and iop2 are equal
402
+ * within a tollerance, dx.
403
+ *
404
+ * @param iop1 - An ImageOrientationPatient array.
405
+ * @param iop2 - An ImageOrientationPatient array.
406
+ * @return True if iop1 and iop2 are equal.
407
+ */
408
+ function compareIOP(iop1, iop2) {
409
+ 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;
410
+ }
411
+ function getSegmentMetadata(multiframe) {
412
+ var data = [];
413
+ var segmentSequence = multiframe.SegmentSequence;
414
+ if (Array.isArray(segmentSequence)) {
415
+ for (var segIdx = 0; segIdx < segmentSequence.length; segIdx++) {
416
+ data.push(segmentSequence[segIdx]);
417
+ }
418
+ } else {
419
+ // Only one segment, will be stored as an object.
420
+ data.push(segmentSequence);
421
+ }
422
+ return {
423
+ seriesInstanceUid: multiframe.ReferencedSeriesSequence.SeriesInstanceUID,
424
+ data: data
425
+ };
426
+ }
427
+
428
+ export { Segmentation as default };
@@ -0,0 +1,54 @@
1
+ export default Segmentation;
2
+ export type BrushData = {
3
+ /**
4
+ * - The cornerstoneTools global toolState.
5
+ */
6
+ toolState: any;
7
+ /**
8
+ * - The cornerstoneTools segment metadata that corresponds to the
9
+ * seriesInstanceUid.
10
+ */
11
+ segments: any[];
12
+ };
13
+ declare namespace Segmentation {
14
+ export { generateSegmentation };
15
+ export { generateToolState };
16
+ export { fillSegmentation };
17
+ }
18
+ /**
19
+ * Fills a given segmentation object with data from the input labelmaps3D
20
+ *
21
+ * @param segmentation - The segmentation object to be filled.
22
+ * @param inputLabelmaps3D - An array of 3D labelmaps, or a single 3D labelmap.
23
+ * @param userOptions - Optional configuration settings. Will override the default options.
24
+ *
25
+ * @returns {object} The filled segmentation object.
26
+ */
27
+ export function fillSegmentation(segmentation: any, inputLabelmaps3D: any, userOptions?: {}): object;
28
+ /**
29
+ * generateSegmentation - Generates cornerstoneTools brush data, given a stack of
30
+ * imageIds, images and the cornerstoneTools brushData.
31
+ *
32
+ * @param {object[]} images An array of cornerstone images that contain the source
33
+ * data under `image.data.byteArray.buffer`.
34
+ * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
35
+ * @param {Object} userOptions Options to pass to the segmentation derivation and `fillSegmentation`.
36
+ * @returns {Blob}
37
+ */
38
+ export function generateSegmentation(images: object[], inputLabelmaps3D: any | any[], userOptions?: any): Blob;
39
+ /**
40
+ * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
41
+ * derive cornerstoneTools toolState and brush metadata.
42
+ *
43
+ * @param {string[]} imageIds - An array of the imageIds.
44
+ * @param {ArrayBuffer} arrayBuffer - The SEG arrayBuffer.
45
+ * @param {*} metadataProvider.
46
+ * @param {obj} options - Options object.
47
+ *
48
+ * @return {[]ArrayBuffer}a list of array buffer for each labelMap
49
+ * @return {Object} an object from which the segment metadata can be derived
50
+ * @return {[][][]} 2D list containing the track of segments per frame
51
+ * @return {[][][]} 3D list containing the track of segments per frame for each labelMap
52
+ * (available only for the overlapping case).
53
+ */
54
+ export function generateToolState(imageIds: string[], arrayBuffer: ArrayBuffer, metadataProvider: any, options: obj): [];