@cornerstonejs/adapters 1.82.7 → 1.83.1
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/adapters.es.js +503 -154
- package/dist/adapters.es.js.map +1 -1
- package/dist/types/adapters/Cornerstone/ParametricMap.d.ts +7 -0
- package/dist/types/adapters/Cornerstone/index.d.ts +8 -1
- package/dist/types/adapters/Cornerstone3D/index.d.ts +4 -1
- package/dist/types/adapters/helpers/checkIfPerpendicular.d.ts +9 -0
- package/dist/types/adapters/helpers/checkOrientation.d.ts +1 -0
- package/dist/types/adapters/helpers/compareArrays.d.ts +9 -0
- package/dist/types/adapters/helpers/getDatasetsFromImages.d.ts +9 -0
- package/dist/types/adapters/index.d.ts +13 -1
- package/dist/types/index.d.ts +2 -2
- package/package.json +5 -5
package/dist/adapters.es.js
CHANGED
|
@@ -558,10 +558,10 @@ var index$1 = /*#__PURE__*/Object.freeze({
|
|
|
558
558
|
var TID1500$1 = utilities.TID1500,
|
|
559
559
|
addAccessors$1 = utilities.addAccessors;
|
|
560
560
|
var StructuredReport$1 = derivations.StructuredReport;
|
|
561
|
-
var Normalizer$
|
|
561
|
+
var Normalizer$6 = normalizers.Normalizer;
|
|
562
562
|
var TID1500MeasurementReport$1 = TID1500$1.TID1500MeasurementReport,
|
|
563
563
|
TID1501MeasurementGroup$1 = TID1500$1.TID1501MeasurementGroup;
|
|
564
|
-
var DicomMetaDictionary$
|
|
564
|
+
var DicomMetaDictionary$6 = data.DicomMetaDictionary;
|
|
565
565
|
var FINDING$2 = {
|
|
566
566
|
CodingSchemeDesignator: "DCM",
|
|
567
567
|
CodeValue: "121071"
|
|
@@ -690,7 +690,7 @@ var MeasurementReport$1 = /*#__PURE__*/function () {
|
|
|
690
690
|
ReferencedSOPClassUID: sopCommonModule.sopClassUID,
|
|
691
691
|
ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID
|
|
692
692
|
};
|
|
693
|
-
if (Normalizer$
|
|
693
|
+
if (Normalizer$6.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
|
|
694
694
|
ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
|
|
695
695
|
}
|
|
696
696
|
|
|
@@ -731,7 +731,7 @@ var MeasurementReport$1 = /*#__PURE__*/function () {
|
|
|
731
731
|
vr: "UI"
|
|
732
732
|
},
|
|
733
733
|
ImplementationClassUID: {
|
|
734
|
-
Value: [DicomMetaDictionary$
|
|
734
|
+
Value: [DicomMetaDictionary$6.uid()],
|
|
735
735
|
// TODO: could be git hash or other valid id
|
|
736
736
|
vr: "UI"
|
|
737
737
|
},
|
|
@@ -1787,6 +1787,44 @@ RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier
|
|
|
1787
1787
|
};
|
|
1788
1788
|
MeasurementReport$1.registerTool(RectangleRoi);
|
|
1789
1789
|
|
|
1790
|
+
var DicomMessage$3 = data.DicomMessage, DicomMetaDictionary$5 = data.DicomMetaDictionary;
|
|
1791
|
+
var Normalizer$5 = normalizers.Normalizer;
|
|
1792
|
+
/**
|
|
1793
|
+
* Convert an array of cornerstone images into datasets
|
|
1794
|
+
*
|
|
1795
|
+
* @param images - An array of the cornerstone image objects
|
|
1796
|
+
* @param isMultiframe - Whether the images are multiframe
|
|
1797
|
+
* @param options - Options object that may contain:
|
|
1798
|
+
* - SpecificCharacterSet: character set to be set to each dataset
|
|
1799
|
+
*/
|
|
1800
|
+
function getDatasetsFromImages(images, isMultiframe, options) {
|
|
1801
|
+
var datasets = [];
|
|
1802
|
+
if (isMultiframe) {
|
|
1803
|
+
var image = images[0];
|
|
1804
|
+
var arrayBuffer = image.data.byteArray.buffer;
|
|
1805
|
+
var dicomData = DicomMessage$3.readFile(arrayBuffer);
|
|
1806
|
+
var dataset = DicomMetaDictionary$5.naturalizeDataset(dicomData.dict);
|
|
1807
|
+
dataset._meta = DicomMetaDictionary$5.namifyDataset(dicomData.meta);
|
|
1808
|
+
datasets.push(dataset);
|
|
1809
|
+
}
|
|
1810
|
+
else {
|
|
1811
|
+
for (var i = 0; i < images.length; i++) {
|
|
1812
|
+
var image = images[i];
|
|
1813
|
+
var arrayBuffer = image.data.byteArray.buffer;
|
|
1814
|
+
var dicomData = DicomMessage$3.readFile(arrayBuffer);
|
|
1815
|
+
var dataset = DicomMetaDictionary$5.naturalizeDataset(dicomData.dict);
|
|
1816
|
+
dataset._meta = DicomMetaDictionary$5.namifyDataset(dicomData.meta);
|
|
1817
|
+
datasets.push(dataset);
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
if (options === null || options === void 0 ? void 0 : options.SpecificCharacterSet) {
|
|
1821
|
+
datasets.forEach(function (dataset) {
|
|
1822
|
+
return (dataset.SpecificCharacterSet = options.SpecificCharacterSet);
|
|
1823
|
+
});
|
|
1824
|
+
}
|
|
1825
|
+
return Normalizer$5.normalizeToDataset(datasets);
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1790
1828
|
var _utilities$orientatio$1 = utilities.orientation,
|
|
1791
1829
|
rotateDirectionCosinesInPlane$1 = _utilities$orientatio$1.rotateDirectionCosinesInPlane,
|
|
1792
1830
|
flipIOP$1 = _utilities$orientatio$1.flipImageOrientationPatient,
|
|
@@ -1794,13 +1832,13 @@ var _utilities$orientatio$1 = utilities.orientation,
|
|
|
1794
1832
|
rotateMatrix902D$1 = _utilities$orientatio$1.rotateMatrix902D;
|
|
1795
1833
|
var datasetToBlob = utilities.datasetToBlob,
|
|
1796
1834
|
BitArray$2 = utilities.BitArray,
|
|
1797
|
-
DicomMessage$
|
|
1798
|
-
DicomMetaDictionary$
|
|
1799
|
-
var Normalizer$
|
|
1835
|
+
DicomMessage$2 = utilities.DicomMessage,
|
|
1836
|
+
DicomMetaDictionary$4 = utilities.DicomMetaDictionary;
|
|
1837
|
+
var Normalizer$4 = normalizers.Normalizer;
|
|
1800
1838
|
var SegmentationDerivation$2 = derivations.Segmentation;
|
|
1801
1839
|
var Segmentation$5 = {
|
|
1802
1840
|
generateSegmentation: generateSegmentation$3,
|
|
1803
|
-
generateToolState: generateToolState$
|
|
1841
|
+
generateToolState: generateToolState$5
|
|
1804
1842
|
};
|
|
1805
1843
|
|
|
1806
1844
|
/**
|
|
@@ -1920,25 +1958,7 @@ function _getSegCount(seg, segments) {
|
|
|
1920
1958
|
* @returns {Object} The Seg derived dataSet.
|
|
1921
1959
|
*/
|
|
1922
1960
|
function _createSegFromImages$1(images, isMultiframe, options) {
|
|
1923
|
-
var
|
|
1924
|
-
if (isMultiframe) {
|
|
1925
|
-
var image = images[0];
|
|
1926
|
-
var arrayBuffer = image.data.byteArray.buffer;
|
|
1927
|
-
var dicomData = DicomMessage$1.readFile(arrayBuffer);
|
|
1928
|
-
var dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
|
|
1929
|
-
dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
|
|
1930
|
-
datasets.push(dataset);
|
|
1931
|
-
} else {
|
|
1932
|
-
for (var i = 0; i < images.length; i++) {
|
|
1933
|
-
var _image = images[i];
|
|
1934
|
-
var _arrayBuffer = _image.data.byteArray.buffer;
|
|
1935
|
-
var _dicomData = DicomMessage$1.readFile(_arrayBuffer);
|
|
1936
|
-
var _dataset = DicomMetaDictionary$3.naturalizeDataset(_dicomData.dict);
|
|
1937
|
-
_dataset._meta = DicomMetaDictionary$3.namifyDataset(_dicomData.meta);
|
|
1938
|
-
datasets.push(_dataset);
|
|
1939
|
-
}
|
|
1940
|
-
}
|
|
1941
|
-
var multiframe = Normalizer$3.normalizeToDataset(datasets);
|
|
1961
|
+
var multiframe = getDatasetsFromImages(images, isMultiframe);
|
|
1942
1962
|
return new SegmentationDerivation$2([multiframe], options);
|
|
1943
1963
|
}
|
|
1944
1964
|
|
|
@@ -1952,11 +1972,11 @@ function _createSegFromImages$1(images, isMultiframe, options) {
|
|
|
1952
1972
|
* @returns {Object} The toolState and an object from which the
|
|
1953
1973
|
* segment metadata can be derived.
|
|
1954
1974
|
*/
|
|
1955
|
-
function generateToolState$
|
|
1956
|
-
var dicomData = DicomMessage$
|
|
1957
|
-
var dataset = DicomMetaDictionary$
|
|
1958
|
-
dataset._meta = DicomMetaDictionary$
|
|
1959
|
-
var multiframe = Normalizer$
|
|
1975
|
+
function generateToolState$5(imageIds, arrayBuffer, metadataProvider) {
|
|
1976
|
+
var dicomData = DicomMessage$2.readFile(arrayBuffer);
|
|
1977
|
+
var dataset = DicomMetaDictionary$4.naturalizeDataset(dicomData.dict);
|
|
1978
|
+
dataset._meta = DicomMetaDictionary$4.namifyDataset(dicomData.meta);
|
|
1979
|
+
var multiframe = Normalizer$4.normalizeToDataset([dataset]);
|
|
1960
1980
|
var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
1961
1981
|
if (!imagePlaneModule) {
|
|
1962
1982
|
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
@@ -2071,7 +2091,7 @@ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixe
|
|
|
2071
2091
|
function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
|
|
2072
2092
|
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
2073
2093
|
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
2074
|
-
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$
|
|
2094
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$2(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
|
|
2075
2095
|
}
|
|
2076
2096
|
|
|
2077
2097
|
/**
|
|
@@ -2105,7 +2125,7 @@ function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds,
|
|
|
2105
2125
|
* from the cornerstone imageIds.
|
|
2106
2126
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
2107
2127
|
*/
|
|
2108
|
-
function getImageIdOfReferencedFrame$
|
|
2128
|
+
function getImageIdOfReferencedFrame$2(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
|
|
2109
2129
|
var imageId = imageIds.find(function (imageId) {
|
|
2110
2130
|
var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
|
|
2111
2131
|
if (!sopCommonModule) {
|
|
@@ -2210,6 +2230,70 @@ function getSegmentMetadata$1(multiframe) {
|
|
|
2210
2230
|
};
|
|
2211
2231
|
}
|
|
2212
2232
|
|
|
2233
|
+
/**
|
|
2234
|
+
* Returns true if iop1 and iop2 are perpendicular within a tolerance.
|
|
2235
|
+
*
|
|
2236
|
+
* @param iop1 - First ImageOrientationPatient
|
|
2237
|
+
* @param iop2 - Second ImageOrientationPatient
|
|
2238
|
+
* @param tolerance - Tolerance
|
|
2239
|
+
* @returns True if iop1 and iop2 are equal.
|
|
2240
|
+
*/
|
|
2241
|
+
function checkIfPerpendicular(iop1, iop2, tolerance) {
|
|
2242
|
+
var absDotColumnCosines = Math.abs(iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]);
|
|
2243
|
+
var absDotRowCosines = Math.abs(iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]);
|
|
2244
|
+
return ((absDotColumnCosines < tolerance ||
|
|
2245
|
+
Math.abs(absDotColumnCosines - 1) < tolerance) &&
|
|
2246
|
+
(absDotRowCosines < tolerance ||
|
|
2247
|
+
Math.abs(absDotRowCosines - 1) < tolerance));
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
var nearlyEqual = utilities.orientation.nearlyEqual;
|
|
2251
|
+
/**
|
|
2252
|
+
* Returns true if array1 and array2 are equal within a tolerance.
|
|
2253
|
+
*
|
|
2254
|
+
* @param array1 - First array
|
|
2255
|
+
* @param array2 - Second array
|
|
2256
|
+
* @param tolerance - Tolerance
|
|
2257
|
+
* @returns True if array1 and array2 are equal.
|
|
2258
|
+
*/
|
|
2259
|
+
function compareArrays(array1, array2, tolerance) {
|
|
2260
|
+
if (array1.length !== array2.length) {
|
|
2261
|
+
return false;
|
|
2262
|
+
}
|
|
2263
|
+
for (var i = 0; i < array1.length; ++i) {
|
|
2264
|
+
if (!nearlyEqual(array1[i], array2[i], tolerance)) {
|
|
2265
|
+
return false;
|
|
2266
|
+
}
|
|
2267
|
+
}
|
|
2268
|
+
return true;
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2271
|
+
function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
|
|
2272
|
+
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence, PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
|
|
2273
|
+
var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence
|
|
2274
|
+
? SharedFunctionalGroupsSequence.PlaneOrientationSequence
|
|
2275
|
+
.ImageOrientationPatient
|
|
2276
|
+
: undefined;
|
|
2277
|
+
// Check if in plane.
|
|
2278
|
+
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];
|
|
2279
|
+
var iop = sharedImageOrientationPatient ||
|
|
2280
|
+
PerFrameFunctionalGroups.PlaneOrientationSequence
|
|
2281
|
+
.ImageOrientationPatient;
|
|
2282
|
+
var inPlane = validOrientations.some(function (operation) {
|
|
2283
|
+
return compareArrays(iop, operation, tolerance);
|
|
2284
|
+
});
|
|
2285
|
+
if (inPlane) {
|
|
2286
|
+
return "Planar";
|
|
2287
|
+
}
|
|
2288
|
+
if (checkIfPerpendicular(iop, validOrientations[0], tolerance) &&
|
|
2289
|
+
sourceDataDimensions.includes(multiframe.Rows) &&
|
|
2290
|
+
sourceDataDimensions.includes(multiframe.Columns)) {
|
|
2291
|
+
// Perpendicular and fits on same grid.
|
|
2292
|
+
return "Perpendicular";
|
|
2293
|
+
}
|
|
2294
|
+
return "Oblique";
|
|
2295
|
+
}
|
|
2296
|
+
|
|
2213
2297
|
/**
|
|
2214
2298
|
* Cornerstone adapters events
|
|
2215
2299
|
*/
|
|
@@ -2231,12 +2315,11 @@ var _utilities$orientatio = utilities.orientation,
|
|
|
2231
2315
|
rotateDirectionCosinesInPlane = _utilities$orientatio.rotateDirectionCosinesInPlane,
|
|
2232
2316
|
flipIOP = _utilities$orientatio.flipImageOrientationPatient,
|
|
2233
2317
|
flipMatrix2D = _utilities$orientatio.flipMatrix2D,
|
|
2234
|
-
rotateMatrix902D = _utilities$orientatio.rotateMatrix902D
|
|
2235
|
-
nearlyEqual = _utilities$orientatio.nearlyEqual;
|
|
2318
|
+
rotateMatrix902D = _utilities$orientatio.rotateMatrix902D;
|
|
2236
2319
|
var BitArray$1 = data.BitArray,
|
|
2237
|
-
DicomMessage = data.DicomMessage,
|
|
2238
|
-
DicomMetaDictionary$
|
|
2239
|
-
var Normalizer$
|
|
2320
|
+
DicomMessage$1 = data.DicomMessage,
|
|
2321
|
+
DicomMetaDictionary$3 = data.DicomMetaDictionary;
|
|
2322
|
+
var Normalizer$3 = normalizers.Normalizer;
|
|
2240
2323
|
var SegmentationDerivation$1 = derivations.Segmentation;
|
|
2241
2324
|
var _utilities$compressio = utilities.compression,
|
|
2242
2325
|
encode = _utilities$compressio.encode,
|
|
@@ -2381,27 +2464,7 @@ function _getLabelmapsFromReferencedFrameIndicies(labelmap3D, referencedFrameInd
|
|
|
2381
2464
|
* @returns {Object} The Seg derived dataSet.
|
|
2382
2465
|
*/
|
|
2383
2466
|
function _createSegFromImages(images, isMultiframe, options) {
|
|
2384
|
-
var
|
|
2385
|
-
if (isMultiframe) {
|
|
2386
|
-
var image = images[0];
|
|
2387
|
-
var arrayBuffer = image.data.byteArray.buffer;
|
|
2388
|
-
var dicomData = DicomMessage.readFile(arrayBuffer);
|
|
2389
|
-
var dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
|
|
2390
|
-
dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
|
|
2391
|
-
dataset.SpecificCharacterSet = "ISO_IR 192";
|
|
2392
|
-
datasets.push(dataset);
|
|
2393
|
-
} else {
|
|
2394
|
-
for (var i = 0; i < images.length; i++) {
|
|
2395
|
-
var _image = images[i];
|
|
2396
|
-
var _arrayBuffer = _image.data.byteArray.buffer;
|
|
2397
|
-
var _dicomData = DicomMessage.readFile(_arrayBuffer);
|
|
2398
|
-
var _dataset = DicomMetaDictionary$2.naturalizeDataset(_dicomData.dict);
|
|
2399
|
-
_dataset._meta = DicomMetaDictionary$2.namifyDataset(_dicomData.meta);
|
|
2400
|
-
_dataset.SpecificCharacterSet = "ISO_IR 192";
|
|
2401
|
-
datasets.push(_dataset);
|
|
2402
|
-
}
|
|
2403
|
-
}
|
|
2404
|
-
var multiframe = Normalizer$2.normalizeToDataset(datasets);
|
|
2467
|
+
var multiframe = getDatasetsFromImages(images, isMultiframe);
|
|
2405
2468
|
return new SegmentationDerivation$1([multiframe], options);
|
|
2406
2469
|
}
|
|
2407
2470
|
|
|
@@ -2420,7 +2483,7 @@ function _createSegFromImages(images, isMultiframe, options) {
|
|
|
2420
2483
|
* @return {[][][]} 3D list containing the track of segments per frame for each labelMap
|
|
2421
2484
|
* (available only for the overlapping case).
|
|
2422
2485
|
*/
|
|
2423
|
-
function generateToolState$
|
|
2486
|
+
function generateToolState$4(_x, _x2, _x3, _x4) {
|
|
2424
2487
|
return _generateToolState.apply(this, arguments);
|
|
2425
2488
|
} // function insertPixelDataPerpendicular(
|
|
2426
2489
|
// segmentsOnFrame,
|
|
@@ -2580,10 +2643,10 @@ function _generateToolState() {
|
|
|
2580
2643
|
while (1) switch (_context.prev = _context.next) {
|
|
2581
2644
|
case 0:
|
|
2582
2645
|
_options$skipOverlapp = options.skipOverlapping, skipOverlapping = _options$skipOverlapp === void 0 ? false : _options$skipOverlapp, _options$tolerance = options.tolerance, tolerance = _options$tolerance === void 0 ? 1e-3 : _options$tolerance, _options$TypedArrayCo = options.TypedArrayConstructor, TypedArrayConstructor = _options$TypedArrayCo === void 0 ? Uint8Array : _options$TypedArrayCo, _options$maxBytesPerC = options.maxBytesPerChunk, maxBytesPerChunk = _options$maxBytesPerC === void 0 ? 199000000 : _options$maxBytesPerC, eventTarget = options.eventTarget, triggerEvent = options.triggerEvent;
|
|
2583
|
-
dicomData = DicomMessage.readFile(arrayBuffer);
|
|
2584
|
-
dataset = DicomMetaDictionary$
|
|
2585
|
-
dataset._meta = DicomMetaDictionary$
|
|
2586
|
-
multiframe = Normalizer$
|
|
2646
|
+
dicomData = DicomMessage$1.readFile(arrayBuffer);
|
|
2647
|
+
dataset = DicomMetaDictionary$3.naturalizeDataset(dicomData.dict);
|
|
2648
|
+
dataset._meta = DicomMetaDictionary$3.namifyDataset(dicomData.meta);
|
|
2649
|
+
multiframe = Normalizer$3.normalizeToDataset([dataset]);
|
|
2587
2650
|
imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
2588
2651
|
generalSeriesModule = metadataProvider.get("generalSeriesModule", imageIds[0]);
|
|
2589
2652
|
SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
|
|
@@ -2642,7 +2705,7 @@ function _generateToolState() {
|
|
|
2642
2705
|
if (overlapping) {
|
|
2643
2706
|
insertFunction = insertOverlappingPixelDataPlanar;
|
|
2644
2707
|
} else {
|
|
2645
|
-
insertFunction = insertPixelDataPlanar;
|
|
2708
|
+
insertFunction = insertPixelDataPlanar$1;
|
|
2646
2709
|
}
|
|
2647
2710
|
return _context.abrupt("break", 37);
|
|
2648
2711
|
case 35:
|
|
@@ -2710,7 +2773,7 @@ function _generateToolState() {
|
|
|
2710
2773
|
}));
|
|
2711
2774
|
return _generateToolState.apply(this, arguments);
|
|
2712
2775
|
}
|
|
2713
|
-
function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
2776
|
+
function findReferenceSourceImageId$1(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
2714
2777
|
var imageId = undefined;
|
|
2715
2778
|
if (!multiframe) {
|
|
2716
2779
|
return imageId;
|
|
@@ -2751,12 +2814,12 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
|
|
|
2751
2814
|
frameSourceImageSequence = SourceImageSequence[frameSegment];
|
|
2752
2815
|
}
|
|
2753
2816
|
if (frameSourceImageSequence) {
|
|
2754
|
-
imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
2817
|
+
imageId = getImageIdOfSourceImageBySourceImageSequence$1(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
2755
2818
|
}
|
|
2756
2819
|
if (imageId === undefined && ReferencedSeriesSequence) {
|
|
2757
2820
|
var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
|
|
2758
2821
|
var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
|
|
2759
|
-
imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
|
|
2822
|
+
imageId = getImageIdOfSourceImagebyGeometry$1(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
|
|
2760
2823
|
}
|
|
2761
2824
|
return imageId;
|
|
2762
2825
|
}
|
|
@@ -2793,7 +2856,7 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
|
|
|
2793
2856
|
console.warn("Could not retrieve the segment index for frame segment " + frameSegment + ", skipping this frame.");
|
|
2794
2857
|
return 0; // continue
|
|
2795
2858
|
}
|
|
2796
|
-
var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2859
|
+
var imageId = findReferenceSourceImageId$1(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2797
2860
|
if (!imageId) {
|
|
2798
2861
|
console.warn("Image not present in stack, can't import frame : " + frameSegment + ".");
|
|
2799
2862
|
return 0; // continue
|
|
@@ -2902,7 +2965,7 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
|
|
|
2902
2965
|
if (!alignedPixelDataI) {
|
|
2903
2966
|
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.");
|
|
2904
2967
|
}
|
|
2905
|
-
var imageId = findReferenceSourceImageId(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2968
|
+
var imageId = findReferenceSourceImageId$1(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2906
2969
|
if (!imageId) {
|
|
2907
2970
|
console.warn("Image not present in stack, can't import frame : " + _i2 + ".");
|
|
2908
2971
|
i = _i2;
|
|
@@ -2970,7 +3033,7 @@ var getSegmentIndex = function getSegmentIndex(multiframe, frame) {
|
|
|
2970
3033
|
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[frame];
|
|
2971
3034
|
return PerFrameFunctionalGroups && PerFrameFunctionalGroups.SegmentIdentificationSequence ? PerFrameFunctionalGroups.SegmentIdentificationSequence.ReferencedSegmentNumber : SharedFunctionalGroupsSequence.SegmentIdentificationSequence ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence.ReferencedSegmentNumber : undefined;
|
|
2972
3035
|
};
|
|
2973
|
-
function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
|
|
3036
|
+
function insertPixelDataPlanar$1(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
|
|
2974
3037
|
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
2975
3038
|
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
2976
3039
|
Rows = multiframe.Rows,
|
|
@@ -3005,7 +3068,7 @@ function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBu
|
|
|
3005
3068
|
if (!segmentsPixelIndices.has(segmentIndex)) {
|
|
3006
3069
|
segmentsPixelIndices.set(segmentIndex, {});
|
|
3007
3070
|
}
|
|
3008
|
-
var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
3071
|
+
var imageId = findReferenceSourceImageId$1(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
3009
3072
|
if (!imageId) {
|
|
3010
3073
|
console.warn("Image not present in stack, can't import frame : " + i + ".");
|
|
3011
3074
|
continue;
|
|
@@ -3061,41 +3124,6 @@ function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBu
|
|
|
3061
3124
|
processInChunks();
|
|
3062
3125
|
});
|
|
3063
3126
|
}
|
|
3064
|
-
function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
|
|
3065
|
-
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
3066
|
-
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
|
|
3067
|
-
var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
|
|
3068
|
-
|
|
3069
|
-
// Check if in plane.
|
|
3070
|
-
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];
|
|
3071
|
-
var iop = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
3072
|
-
var inPlane = validOrientations.some(function (operation) {
|
|
3073
|
-
return compareArrays(iop, operation, tolerance);
|
|
3074
|
-
});
|
|
3075
|
-
if (inPlane) {
|
|
3076
|
-
return "Planar";
|
|
3077
|
-
}
|
|
3078
|
-
if (checkIfPerpendicular(iop, validOrientations[0], tolerance) && sourceDataDimensions.includes(multiframe.Rows) && sourceDataDimensions.includes(multiframe.Columns)) {
|
|
3079
|
-
// Perpendicular and fits on same grid.
|
|
3080
|
-
return "Perpendicular";
|
|
3081
|
-
}
|
|
3082
|
-
return "Oblique";
|
|
3083
|
-
}
|
|
3084
|
-
|
|
3085
|
-
/**
|
|
3086
|
-
* checkIfPerpendicular - Returns true if iop1 and iop2 are perpendicular
|
|
3087
|
-
* within a tolerance.
|
|
3088
|
-
*
|
|
3089
|
-
* @param {Number[6]} iop1 An ImageOrientationPatient array.
|
|
3090
|
-
* @param {Number[6]} iop2 An ImageOrientationPatient array.
|
|
3091
|
-
* @param {Number} tolerance.
|
|
3092
|
-
* @return {Boolean} True if iop1 and iop2 are equal.
|
|
3093
|
-
*/
|
|
3094
|
-
function checkIfPerpendicular(iop1, iop2, tolerance) {
|
|
3095
|
-
var absDotColumnCosines = Math.abs(iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]);
|
|
3096
|
-
var absDotRowCosines = Math.abs(iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]);
|
|
3097
|
-
return (absDotColumnCosines < tolerance || Math.abs(absDotColumnCosines - 1) < tolerance) && (absDotRowCosines < tolerance || Math.abs(absDotRowCosines - 1) < tolerance);
|
|
3098
|
-
}
|
|
3099
3127
|
|
|
3100
3128
|
/**
|
|
3101
3129
|
* unpackPixelData - Unpacks bit packed pixelData if the Segmentation is BINARY.
|
|
@@ -3158,10 +3186,10 @@ function getUnpackedChunks(data, maxBytesPerChunk) {
|
|
|
3158
3186
|
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
|
|
3159
3187
|
* @return {String} The corresponding imageId.
|
|
3160
3188
|
*/
|
|
3161
|
-
function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
3189
|
+
function getImageIdOfSourceImageBySourceImageSequence$1(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
3162
3190
|
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
3163
3191
|
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
3164
|
-
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
3192
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
3165
3193
|
}
|
|
3166
3194
|
|
|
3167
3195
|
/**
|
|
@@ -3176,7 +3204,7 @@ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUI
|
|
|
3176
3204
|
*
|
|
3177
3205
|
* @return {String} The corresponding imageId.
|
|
3178
3206
|
*/
|
|
3179
|
-
function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
3207
|
+
function getImageIdOfSourceImagebyGeometry$1(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
3180
3208
|
if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
|
|
3181
3209
|
return undefined;
|
|
3182
3210
|
}
|
|
@@ -3201,7 +3229,7 @@ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfR
|
|
|
3201
3229
|
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
|
|
3202
3230
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
3203
3231
|
*/
|
|
3204
|
-
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
3232
|
+
function getImageIdOfReferencedFrame$1(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
3205
3233
|
var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
|
|
3206
3234
|
if (!imageId) {
|
|
3207
3235
|
return;
|
|
@@ -3283,27 +3311,6 @@ function alignPixelDataWithSourceData(pixelData2D, iop, orientations, tolerance)
|
|
|
3283
3311
|
return rotateMatrix902D(rotateMatrix902D(rotateMatrix902D(pixelData2D)));
|
|
3284
3312
|
}
|
|
3285
3313
|
}
|
|
3286
|
-
|
|
3287
|
-
/**
|
|
3288
|
-
* compareArrays - Returns true if array1 and array2 are equal
|
|
3289
|
-
* within a tolerance.
|
|
3290
|
-
*
|
|
3291
|
-
* @param {Number[]} array1 - An array.
|
|
3292
|
-
* @param {Number[]} array2 - An array.
|
|
3293
|
-
* @param {Number} tolerance.
|
|
3294
|
-
* @return {Boolean} True if array1 and array2 are equal.
|
|
3295
|
-
*/
|
|
3296
|
-
function compareArrays(array1, array2, tolerance) {
|
|
3297
|
-
if (array1.length != array2.length) {
|
|
3298
|
-
return false;
|
|
3299
|
-
}
|
|
3300
|
-
for (var i = 0; i < array1.length; ++i) {
|
|
3301
|
-
if (!nearlyEqual(array1[i], array2[i], tolerance)) {
|
|
3302
|
-
return false;
|
|
3303
|
-
}
|
|
3304
|
-
}
|
|
3305
|
-
return true;
|
|
3306
|
-
}
|
|
3307
3314
|
function getSegmentMetadata(multiframe, seriesInstanceUid) {
|
|
3308
3315
|
var segmentSequence = multiframe.SegmentSequence;
|
|
3309
3316
|
var data = [];
|
|
@@ -3417,13 +3424,13 @@ function calculateCentroid(imageIdIndexBufferIndex, multiframe) {
|
|
|
3417
3424
|
}
|
|
3418
3425
|
var Segmentation$4 = {
|
|
3419
3426
|
generateSegmentation: generateSegmentation$2,
|
|
3420
|
-
generateToolState: generateToolState$
|
|
3427
|
+
generateToolState: generateToolState$4,
|
|
3421
3428
|
fillSegmentation: fillSegmentation$1
|
|
3422
3429
|
};
|
|
3423
3430
|
|
|
3424
3431
|
var Segmentation$3 = {
|
|
3425
3432
|
generateSegmentation: generateSegmentation$1,
|
|
3426
|
-
generateToolState: generateToolState$
|
|
3433
|
+
generateToolState: generateToolState$3,
|
|
3427
3434
|
fillSegmentation: fillSegmentation
|
|
3428
3435
|
};
|
|
3429
3436
|
|
|
@@ -3464,7 +3471,7 @@ function generateSegmentation$1(images, labelmaps3DorBrushData) {
|
|
|
3464
3471
|
* @returns {Object} The toolState and an object from which the
|
|
3465
3472
|
* segment metadata can be derived.
|
|
3466
3473
|
*/
|
|
3467
|
-
function generateToolState$
|
|
3474
|
+
function generateToolState$3(imageIds, arrayBuffer, metadataProvider) {
|
|
3468
3475
|
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
3469
3476
|
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
3470
3477
|
var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
|
|
@@ -3496,22 +3503,6 @@ function fillSegmentation(segmentation, inputLabelmaps3D) {
|
|
|
3496
3503
|
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
3497
3504
|
}
|
|
3498
3505
|
|
|
3499
|
-
var CornerstoneSR = {
|
|
3500
|
-
Length: Length$1,
|
|
3501
|
-
FreehandRoi: FreehandRoi,
|
|
3502
|
-
Bidirectional: Bidirectional$1,
|
|
3503
|
-
EllipticalRoi: EllipticalRoi,
|
|
3504
|
-
CircleRoi: CircleRoi,
|
|
3505
|
-
ArrowAnnotate: ArrowAnnotate$1,
|
|
3506
|
-
MeasurementReport: MeasurementReport$1,
|
|
3507
|
-
CobbAngle: CobbAngle$1,
|
|
3508
|
-
Angle: Angle$1,
|
|
3509
|
-
RectangleRoi: RectangleRoi
|
|
3510
|
-
};
|
|
3511
|
-
var CornerstoneSEG = {
|
|
3512
|
-
Segmentation: Segmentation$3
|
|
3513
|
-
};
|
|
3514
|
-
|
|
3515
3506
|
/******************************************************************************
|
|
3516
3507
|
Copyright (c) Microsoft Corporation.
|
|
3517
3508
|
|
|
@@ -3538,6 +3529,121 @@ var __assign = function () {
|
|
|
3538
3529
|
};
|
|
3539
3530
|
return __assign.apply(this, arguments);
|
|
3540
3531
|
};
|
|
3532
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
3533
|
+
function adopt(value) {
|
|
3534
|
+
return value instanceof P ? value : new P(function (resolve) {
|
|
3535
|
+
resolve(value);
|
|
3536
|
+
});
|
|
3537
|
+
}
|
|
3538
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
3539
|
+
function fulfilled(value) {
|
|
3540
|
+
try {
|
|
3541
|
+
step(generator.next(value));
|
|
3542
|
+
} catch (e) {
|
|
3543
|
+
reject(e);
|
|
3544
|
+
}
|
|
3545
|
+
}
|
|
3546
|
+
function rejected(value) {
|
|
3547
|
+
try {
|
|
3548
|
+
step(generator["throw"](value));
|
|
3549
|
+
} catch (e) {
|
|
3550
|
+
reject(e);
|
|
3551
|
+
}
|
|
3552
|
+
}
|
|
3553
|
+
function step(result) {
|
|
3554
|
+
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
3555
|
+
}
|
|
3556
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
3557
|
+
});
|
|
3558
|
+
}
|
|
3559
|
+
function __generator(thisArg, body) {
|
|
3560
|
+
var _ = {
|
|
3561
|
+
label: 0,
|
|
3562
|
+
sent: function () {
|
|
3563
|
+
if (t[0] & 1) throw t[1];
|
|
3564
|
+
return t[1];
|
|
3565
|
+
},
|
|
3566
|
+
trys: [],
|
|
3567
|
+
ops: []
|
|
3568
|
+
},
|
|
3569
|
+
f,
|
|
3570
|
+
y,
|
|
3571
|
+
t,
|
|
3572
|
+
g;
|
|
3573
|
+
return g = {
|
|
3574
|
+
next: verb(0),
|
|
3575
|
+
"throw": verb(1),
|
|
3576
|
+
"return": verb(2)
|
|
3577
|
+
}, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
|
|
3578
|
+
return this;
|
|
3579
|
+
}), g;
|
|
3580
|
+
function verb(n) {
|
|
3581
|
+
return function (v) {
|
|
3582
|
+
return step([n, v]);
|
|
3583
|
+
};
|
|
3584
|
+
}
|
|
3585
|
+
function step(op) {
|
|
3586
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
3587
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
3588
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
3589
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
3590
|
+
switch (op[0]) {
|
|
3591
|
+
case 0:
|
|
3592
|
+
case 1:
|
|
3593
|
+
t = op;
|
|
3594
|
+
break;
|
|
3595
|
+
case 4:
|
|
3596
|
+
_.label++;
|
|
3597
|
+
return {
|
|
3598
|
+
value: op[1],
|
|
3599
|
+
done: false
|
|
3600
|
+
};
|
|
3601
|
+
case 5:
|
|
3602
|
+
_.label++;
|
|
3603
|
+
y = op[1];
|
|
3604
|
+
op = [0];
|
|
3605
|
+
continue;
|
|
3606
|
+
case 7:
|
|
3607
|
+
op = _.ops.pop();
|
|
3608
|
+
_.trys.pop();
|
|
3609
|
+
continue;
|
|
3610
|
+
default:
|
|
3611
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
3612
|
+
_ = 0;
|
|
3613
|
+
continue;
|
|
3614
|
+
}
|
|
3615
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
3616
|
+
_.label = op[1];
|
|
3617
|
+
break;
|
|
3618
|
+
}
|
|
3619
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
3620
|
+
_.label = t[1];
|
|
3621
|
+
t = op;
|
|
3622
|
+
break;
|
|
3623
|
+
}
|
|
3624
|
+
if (t && _.label < t[2]) {
|
|
3625
|
+
_.label = t[2];
|
|
3626
|
+
_.ops.push(op);
|
|
3627
|
+
break;
|
|
3628
|
+
}
|
|
3629
|
+
if (t[2]) _.ops.pop();
|
|
3630
|
+
_.trys.pop();
|
|
3631
|
+
continue;
|
|
3632
|
+
}
|
|
3633
|
+
op = body.call(thisArg, _);
|
|
3634
|
+
} catch (e) {
|
|
3635
|
+
op = [6, e];
|
|
3636
|
+
y = 0;
|
|
3637
|
+
} finally {
|
|
3638
|
+
f = t = 0;
|
|
3639
|
+
}
|
|
3640
|
+
if (op[0] & 5) throw op[1];
|
|
3641
|
+
return {
|
|
3642
|
+
value: op[0] ? op[1] : void 0,
|
|
3643
|
+
done: true
|
|
3644
|
+
};
|
|
3645
|
+
}
|
|
3646
|
+
}
|
|
3541
3647
|
function __spreadArray(to, from, pack) {
|
|
3542
3648
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3543
3649
|
if (ar || !(i in from)) {
|
|
@@ -3552,6 +3658,228 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
|
|
|
3552
3658
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
3553
3659
|
};
|
|
3554
3660
|
|
|
3661
|
+
var DicomMessage = data.DicomMessage, DicomMetaDictionary$2 = data.DicomMetaDictionary;
|
|
3662
|
+
var Normalizer$2 = normalizers.Normalizer;
|
|
3663
|
+
function generateToolState$2(imageIds, arrayBuffer, metadataProvider, tolerance) {
|
|
3664
|
+
if (tolerance === void 0) { tolerance = 1e-3; }
|
|
3665
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
3666
|
+
var dicomData, dataset, multiframe, imagePlaneModule, ImageOrientationPatient, validOrientations, pixelData, orientation, sopUIDImageIdIndexMap, orientationText, imageIdMaps;
|
|
3667
|
+
return __generator(this, function (_a) {
|
|
3668
|
+
switch (_a.label) {
|
|
3669
|
+
case 0:
|
|
3670
|
+
dicomData = DicomMessage.readFile(arrayBuffer);
|
|
3671
|
+
dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
|
|
3672
|
+
dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
|
|
3673
|
+
multiframe = Normalizer$2.normalizeToDataset([dataset]);
|
|
3674
|
+
imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
3675
|
+
if (!imagePlaneModule) {
|
|
3676
|
+
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
3677
|
+
}
|
|
3678
|
+
ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines)
|
|
3679
|
+
? __spreadArray(__spreadArray([], imagePlaneModule.rowCosines, true), imagePlaneModule.columnCosines, true) : [
|
|
3680
|
+
imagePlaneModule.rowCosines.x,
|
|
3681
|
+
imagePlaneModule.rowCosines.y,
|
|
3682
|
+
imagePlaneModule.rowCosines.z,
|
|
3683
|
+
imagePlaneModule.columnCosines.x,
|
|
3684
|
+
imagePlaneModule.columnCosines.y,
|
|
3685
|
+
imagePlaneModule.columnCosines.z
|
|
3686
|
+
];
|
|
3687
|
+
validOrientations = [ImageOrientationPatient];
|
|
3688
|
+
pixelData = getPixelData(multiframe);
|
|
3689
|
+
orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance);
|
|
3690
|
+
sopUIDImageIdIndexMap = imageIds.reduce(function (acc, imageId) {
|
|
3691
|
+
var sopInstanceUID = metadataProvider.get("generalImageModule", imageId).sopInstanceUID;
|
|
3692
|
+
acc[sopInstanceUID] = imageId;
|
|
3693
|
+
return acc;
|
|
3694
|
+
}, {});
|
|
3695
|
+
if (orientation !== "Planar") {
|
|
3696
|
+
orientationText = {
|
|
3697
|
+
Perpendicular: "orthogonal",
|
|
3698
|
+
Oblique: "oblique"
|
|
3699
|
+
};
|
|
3700
|
+
throw new Error("Parametric maps ".concat(orientationText[orientation], " to the acquisition plane of the source data are not yet supported."));
|
|
3701
|
+
}
|
|
3702
|
+
imageIdMaps = imageIds.reduce(function (acc, curr, index) {
|
|
3703
|
+
acc.indices[curr] = index;
|
|
3704
|
+
acc.metadata[curr] = metadataProvider.get("instance", curr);
|
|
3705
|
+
return acc;
|
|
3706
|
+
}, { indices: {}, metadata: {} });
|
|
3707
|
+
return [4 /*yield*/, insertPixelDataPlanar(pixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps)];
|
|
3708
|
+
case 1:
|
|
3709
|
+
_a.sent();
|
|
3710
|
+
return [2 /*return*/, { pixelData: pixelData }];
|
|
3711
|
+
}
|
|
3712
|
+
});
|
|
3713
|
+
});
|
|
3714
|
+
}
|
|
3715
|
+
function insertPixelDataPlanar(sourcePixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps) {
|
|
3716
|
+
var targetPixelData = new sourcePixelData.constructor(sourcePixelData.length);
|
|
3717
|
+
var PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, Rows = multiframe.Rows, Columns = multiframe.Columns;
|
|
3718
|
+
var sliceLength = Columns * Rows;
|
|
3719
|
+
var numSlices = PerFrameFunctionalGroupsSequence.length;
|
|
3720
|
+
for (var i = 0; i < numSlices; i++) {
|
|
3721
|
+
var sourceSliceDataView = new sourcePixelData.constructor(sourcePixelData.buffer, i * sliceLength, sliceLength);
|
|
3722
|
+
var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
3723
|
+
if (!imageId) {
|
|
3724
|
+
console.warn("Image not present in stack, can't import frame : " + i + ".");
|
|
3725
|
+
continue;
|
|
3726
|
+
}
|
|
3727
|
+
var sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
3728
|
+
if (Rows !== sourceImageMetadata.Rows ||
|
|
3729
|
+
Columns !== sourceImageMetadata.Columns) {
|
|
3730
|
+
throw new Error("Parametric map have different geometry dimensions (Rows and Columns) " +
|
|
3731
|
+
"respect to the source image reference frame. This is not yet supported.");
|
|
3732
|
+
}
|
|
3733
|
+
var imageIdIndex = imageIdMaps.indices[imageId];
|
|
3734
|
+
var byteOffset = sliceLength * imageIdIndex * targetPixelData.BYTES_PER_ELEMENT;
|
|
3735
|
+
var targetSliceDataView = new targetPixelData.constructor(targetPixelData.buffer, byteOffset, sliceLength);
|
|
3736
|
+
// Copy from source to target which works for parametric maps with same orientation.
|
|
3737
|
+
// TODO: Find a dataset with parametric map in a different orientation and add finish this implementation
|
|
3738
|
+
targetSliceDataView.set(sourceSliceDataView);
|
|
3739
|
+
}
|
|
3740
|
+
return targetPixelData;
|
|
3741
|
+
}
|
|
3742
|
+
function getPixelData(multiframe) {
|
|
3743
|
+
var _a;
|
|
3744
|
+
var TypedArrayClass;
|
|
3745
|
+
var data;
|
|
3746
|
+
if (multiframe.PixelData) {
|
|
3747
|
+
var validTypedArrays = multiframe.BitsAllocated === 16
|
|
3748
|
+
? [Uint16Array, Int16Array]
|
|
3749
|
+
: [Uint32Array, Int32Array];
|
|
3750
|
+
TypedArrayClass = validTypedArrays[(_a = multiframe.PixelRepresentation) !== null && _a !== void 0 ? _a : 0];
|
|
3751
|
+
data = multiframe.PixelData;
|
|
3752
|
+
}
|
|
3753
|
+
else if (multiframe.FloatPixelData) {
|
|
3754
|
+
TypedArrayClass = Float32Array;
|
|
3755
|
+
data = multiframe.FloatPixelData;
|
|
3756
|
+
}
|
|
3757
|
+
else if (multiframe.DoubleFloatPixelData) {
|
|
3758
|
+
TypedArrayClass = Float64Array;
|
|
3759
|
+
data = multiframe.DoubleFloatPixelData;
|
|
3760
|
+
}
|
|
3761
|
+
if (data === undefined) {
|
|
3762
|
+
log.error("This parametric map pixel data is undefined.");
|
|
3763
|
+
}
|
|
3764
|
+
if (Array.isArray(data)) {
|
|
3765
|
+
data = data[0];
|
|
3766
|
+
}
|
|
3767
|
+
return new TypedArrayClass(data);
|
|
3768
|
+
}
|
|
3769
|
+
function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
3770
|
+
var imageId = undefined;
|
|
3771
|
+
if (!multiframe) {
|
|
3772
|
+
return imageId;
|
|
3773
|
+
}
|
|
3774
|
+
var FrameOfReferenceUID = multiframe.FrameOfReferenceUID, PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, SourceImageSequence = multiframe.SourceImageSequence, ReferencedSeriesSequence = multiframe.ReferencedSeriesSequence;
|
|
3775
|
+
if (!PerFrameFunctionalGroupsSequence ||
|
|
3776
|
+
PerFrameFunctionalGroupsSequence.length === 0) {
|
|
3777
|
+
return imageId;
|
|
3778
|
+
}
|
|
3779
|
+
var PerFrameFunctionalGroup = PerFrameFunctionalGroupsSequence[frameSegment];
|
|
3780
|
+
if (!PerFrameFunctionalGroup) {
|
|
3781
|
+
return imageId;
|
|
3782
|
+
}
|
|
3783
|
+
var frameSourceImageSequence = undefined;
|
|
3784
|
+
if (PerFrameFunctionalGroup.DerivationImageSequence) {
|
|
3785
|
+
var DerivationImageSequence = PerFrameFunctionalGroup.DerivationImageSequence;
|
|
3786
|
+
if (Array.isArray(DerivationImageSequence)) {
|
|
3787
|
+
if (DerivationImageSequence.length !== 0) {
|
|
3788
|
+
DerivationImageSequence = DerivationImageSequence[0];
|
|
3789
|
+
}
|
|
3790
|
+
else {
|
|
3791
|
+
DerivationImageSequence = undefined;
|
|
3792
|
+
}
|
|
3793
|
+
}
|
|
3794
|
+
if (DerivationImageSequence) {
|
|
3795
|
+
frameSourceImageSequence =
|
|
3796
|
+
DerivationImageSequence.SourceImageSequence;
|
|
3797
|
+
if (Array.isArray(frameSourceImageSequence)) {
|
|
3798
|
+
if (frameSourceImageSequence.length !== 0) {
|
|
3799
|
+
frameSourceImageSequence = frameSourceImageSequence[0];
|
|
3800
|
+
}
|
|
3801
|
+
else {
|
|
3802
|
+
frameSourceImageSequence = undefined;
|
|
3803
|
+
}
|
|
3804
|
+
}
|
|
3805
|
+
}
|
|
3806
|
+
}
|
|
3807
|
+
else if (SourceImageSequence && SourceImageSequence.length !== 0) {
|
|
3808
|
+
console.warn("DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image.");
|
|
3809
|
+
frameSourceImageSequence = SourceImageSequence[frameSegment];
|
|
3810
|
+
}
|
|
3811
|
+
if (frameSourceImageSequence) {
|
|
3812
|
+
imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
3813
|
+
}
|
|
3814
|
+
if (imageId === undefined && ReferencedSeriesSequence) {
|
|
3815
|
+
var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence)
|
|
3816
|
+
? ReferencedSeriesSequence[0]
|
|
3817
|
+
: ReferencedSeriesSequence;
|
|
3818
|
+
var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
|
|
3819
|
+
imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
|
|
3820
|
+
}
|
|
3821
|
+
return imageId;
|
|
3822
|
+
}
|
|
3823
|
+
function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
3824
|
+
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID, ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
3825
|
+
return ReferencedFrameNumber
|
|
3826
|
+
? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap)
|
|
3827
|
+
: sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
3828
|
+
}
|
|
3829
|
+
function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
3830
|
+
if (ReferencedSeriesInstanceUID === undefined ||
|
|
3831
|
+
PerFrameFunctionalGroup.PlanePositionSequence === undefined ||
|
|
3832
|
+
PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined ||
|
|
3833
|
+
PerFrameFunctionalGroup.PlanePositionSequence[0]
|
|
3834
|
+
.ImagePositionPatient === undefined) {
|
|
3835
|
+
return undefined;
|
|
3836
|
+
}
|
|
3837
|
+
for (var imageIdsIndex = 0; imageIdsIndex < imageIds.length; ++imageIdsIndex) {
|
|
3838
|
+
var sourceImageMetadata = metadataProvider.get("instance", imageIds[imageIdsIndex]);
|
|
3839
|
+
if (sourceImageMetadata === undefined ||
|
|
3840
|
+
sourceImageMetadata.ImagePositionPatient === undefined ||
|
|
3841
|
+
sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID ||
|
|
3842
|
+
sourceImageMetadata.SeriesInstanceUID !==
|
|
3843
|
+
ReferencedSeriesInstanceUID) {
|
|
3844
|
+
continue;
|
|
3845
|
+
}
|
|
3846
|
+
if (compareArrays(PerFrameFunctionalGroup.PlanePositionSequence[0]
|
|
3847
|
+
.ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
|
|
3848
|
+
return imageIds[imageIdsIndex];
|
|
3849
|
+
}
|
|
3850
|
+
}
|
|
3851
|
+
}
|
|
3852
|
+
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
3853
|
+
var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
|
|
3854
|
+
if (!imageId) {
|
|
3855
|
+
return;
|
|
3856
|
+
}
|
|
3857
|
+
var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
|
|
3858
|
+
return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
|
|
3859
|
+
}
|
|
3860
|
+
var ParametricMapObj = {
|
|
3861
|
+
generateToolState: generateToolState$2
|
|
3862
|
+
};
|
|
3863
|
+
|
|
3864
|
+
var CornerstoneSR = {
|
|
3865
|
+
Length: Length$1,
|
|
3866
|
+
FreehandRoi: FreehandRoi,
|
|
3867
|
+
Bidirectional: Bidirectional$1,
|
|
3868
|
+
EllipticalRoi: EllipticalRoi,
|
|
3869
|
+
CircleRoi: CircleRoi,
|
|
3870
|
+
ArrowAnnotate: ArrowAnnotate$1,
|
|
3871
|
+
MeasurementReport: MeasurementReport$1,
|
|
3872
|
+
CobbAngle: CobbAngle$1,
|
|
3873
|
+
Angle: Angle$1,
|
|
3874
|
+
RectangleRoi: RectangleRoi
|
|
3875
|
+
};
|
|
3876
|
+
var CornerstoneSEG = {
|
|
3877
|
+
Segmentation: Segmentation$3
|
|
3878
|
+
};
|
|
3879
|
+
var CornerstonePMAP = {
|
|
3880
|
+
ParametricMap: ParametricMapObj
|
|
3881
|
+
};
|
|
3882
|
+
|
|
3555
3883
|
var CORNERSTONE_3D_TAG = "Cornerstone3DTools@^0.1.0";
|
|
3556
3884
|
|
|
3557
3885
|
// This is a custom coding scheme defined to store some annotations from Cornerstone.
|
|
@@ -5035,7 +5363,7 @@ var generateToolStateCornerstoneLegacy = Segmentation$2.generateToolState;
|
|
|
5035
5363
|
* list containing the track of segments per frame
|
|
5036
5364
|
* list containing the track of segments per frame for each labelMap (available only for the overlapping case).
|
|
5037
5365
|
*/
|
|
5038
|
-
function generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance) {
|
|
5366
|
+
function generateToolState$1(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance) {
|
|
5039
5367
|
if (skipOverlapping === void 0) { skipOverlapping = false; }
|
|
5040
5368
|
if (tolerance === void 0) { tolerance = 1e-3; }
|
|
5041
5369
|
return generateToolStateCornerstoneLegacy(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
@@ -5045,6 +5373,19 @@ var Segmentation$1 = /*#__PURE__*/Object.freeze({
|
|
|
5045
5373
|
__proto__: null,
|
|
5046
5374
|
generateLabelMaps2DFrom3D: generateLabelMaps2DFrom3D,
|
|
5047
5375
|
generateSegmentation: generateSegmentation,
|
|
5376
|
+
generateToolState: generateToolState$1
|
|
5377
|
+
});
|
|
5378
|
+
|
|
5379
|
+
var ParametricMap$1 = CornerstonePMAP.ParametricMap;
|
|
5380
|
+
var generateToolStateCornerstone = ParametricMap$1.generateToolState;
|
|
5381
|
+
function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
5382
|
+
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
5383
|
+
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
5384
|
+
return generateToolStateCornerstone(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
5385
|
+
}
|
|
5386
|
+
|
|
5387
|
+
var ParametricMap = /*#__PURE__*/Object.freeze({
|
|
5388
|
+
__proto__: null,
|
|
5048
5389
|
generateToolState: generateToolState
|
|
5049
5390
|
});
|
|
5050
5391
|
|
|
@@ -5379,6 +5720,9 @@ var Cornerstone3DSR = {
|
|
|
5379
5720
|
var Cornerstone3DSEG = {
|
|
5380
5721
|
Segmentation: Segmentation$1
|
|
5381
5722
|
};
|
|
5723
|
+
var Cornerstone3DPMAP = {
|
|
5724
|
+
ParametricMap: ParametricMap
|
|
5725
|
+
};
|
|
5382
5726
|
var Cornerstone3DRT = {
|
|
5383
5727
|
RTSS: RTSS
|
|
5384
5728
|
};
|
|
@@ -5578,9 +5922,14 @@ var adaptersSEG = {
|
|
|
5578
5922
|
Cornerstone3D: Cornerstone3DSEG,
|
|
5579
5923
|
VTKjs: VTKjsSEG
|
|
5580
5924
|
};
|
|
5925
|
+
var adaptersPMAP = {
|
|
5926
|
+
Cornerstone: CornerstonePMAP,
|
|
5927
|
+
Cornerstone3D: Cornerstone3DPMAP
|
|
5928
|
+
// VTKjs: VTKjsPMAP
|
|
5929
|
+
};
|
|
5581
5930
|
var adaptersRT = {
|
|
5582
5931
|
Cornerstone3D: Cornerstone3DRT
|
|
5583
5932
|
};
|
|
5584
5933
|
|
|
5585
|
-
export { index as Enums, adaptersRT, adaptersSEG, adaptersSR, index$1 as helpers };
|
|
5934
|
+
export { index as Enums, adaptersPMAP, adaptersRT, adaptersSEG, adaptersSR, index$1 as helpers };
|
|
5586
5935
|
//# sourceMappingURL=adapters.es.js.map
|