@cornerstonejs/adapters 2.0.0-beta.8 → 2.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/_virtual/_rollupPluginBabelHelpers.js +493 -0
- package/dist/esm/adapters/Cornerstone/Angle.d.ts +42 -0
- package/dist/esm/adapters/Cornerstone/Angle.js +93 -0
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.d.ts +49 -0
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +97 -0
- package/dist/esm/adapters/Cornerstone/Bidirectional.d.ts +89 -0
- package/dist/esm/adapters/Cornerstone/Bidirectional.js +170 -0
- package/dist/esm/adapters/Cornerstone/CircleRoi.d.ts +58 -0
- package/dist/esm/adapters/Cornerstone/CircleRoi.js +115 -0
- package/dist/esm/adapters/Cornerstone/CobbAngle.d.ts +49 -0
- package/dist/esm/adapters/Cornerstone/CobbAngle.js +98 -0
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.d.ts +57 -0
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +178 -0
- package/dist/esm/adapters/Cornerstone/FreehandRoi.d.ts +42 -0
- package/dist/esm/adapters/Cornerstone/FreehandRoi.js +89 -0
- package/dist/esm/adapters/Cornerstone/Length.d.ts +39 -0
- package/dist/esm/adapters/Cornerstone/Length.js +82 -0
- package/dist/esm/adapters/Cornerstone/MeasurementReport.d.ts +29 -0
- package/dist/esm/adapters/Cornerstone/MeasurementReport.js +276 -0
- package/dist/esm/adapters/Cornerstone/ParametricMap.d.ts +7 -0
- package/dist/esm/adapters/Cornerstone/ParametricMap.js +210 -0
- package/dist/esm/adapters/Cornerstone/RectangleRoi.d.ts +44 -0
- package/dist/esm/adapters/Cornerstone/RectangleRoi.js +97 -0
- package/dist/esm/adapters/Cornerstone/Segmentation.d.ts +7 -0
- package/dist/esm/adapters/Cornerstone/Segmentation.js +73 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.d.ts +13 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +411 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.d.ts +13 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +1152 -0
- package/dist/esm/adapters/Cornerstone/cornerstone4Tag.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone/cornerstone4Tag.js +3 -0
- package/dist/esm/adapters/Cornerstone/index.d.ts +34 -0
- package/dist/esm/adapters/Cornerstone/index.js +33 -0
- package/dist/esm/adapters/Cornerstone3D/Angle.js +109 -0
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +35 -0
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +123 -0
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +147 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/CircleROI.d.ts +0 -7
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +96 -0
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +113 -0
- package/dist/esm/adapters/Cornerstone3D/CodingScheme.d.ts +9 -0
- package/dist/esm/adapters/Cornerstone3D/CodingScheme.js +15 -0
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +160 -0
- package/dist/esm/adapters/Cornerstone3D/Length.d.ts +41 -0
- package/dist/esm/adapters/Cornerstone3D/Length.js +101 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/MeasurementReport.d.ts +1 -8
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +281 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.d.ts +3 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +11 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.d.ts +1 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.js +1 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +0 -2
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +126 -0
- package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +33 -0
- package/dist/esm/adapters/Cornerstone3D/Probe.js +87 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.d.ts +67 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +175 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +6 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.d.ts +13 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.js +22 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.d.ts +6 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.js +10 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.d.ts +4 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.js +9 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.d.ts +11 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +22 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.d.ts +4 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +27 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.d.ts +7 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +12 -0
- package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +94 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.d.ts +0 -6
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +34 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +29 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +9 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/index.js +3 -0
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +93 -0
- package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.js +3 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/index.d.ts +18 -6
- package/dist/esm/adapters/Cornerstone3D/index.js +45 -0
- package/dist/esm/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.js +18 -0
- package/dist/esm/adapters/VTKjs/Segmentation.d.ts +3 -0
- package/dist/esm/adapters/VTKjs/Segmentation.js +186 -0
- package/dist/esm/adapters/VTKjs/index.d.ts +5 -0
- package/dist/esm/adapters/VTKjs/index.js +7 -0
- package/dist/{types → esm}/adapters/enums/Events.d.ts +0 -6
- package/dist/esm/adapters/enums/Events.js +7 -0
- package/dist/esm/adapters/enums/index.js +1 -0
- package/dist/esm/adapters/helpers/checkIfPerpendicular.d.ts +1 -0
- package/dist/esm/adapters/helpers/checkIfPerpendicular.js +7 -0
- package/dist/esm/adapters/helpers/checkOrientation.d.ts +1 -0
- package/dist/esm/adapters/helpers/checkOrientation.js +22 -0
- package/dist/esm/adapters/helpers/codeMeaningEquals.d.ts +2 -0
- package/dist/esm/adapters/helpers/codeMeaningEquals.js +7 -0
- package/dist/esm/adapters/helpers/compareArrays.d.ts +1 -0
- package/dist/esm/adapters/helpers/compareArrays.js +16 -0
- package/dist/esm/adapters/helpers/downloadDICOMData.d.ts +5 -0
- package/dist/esm/adapters/helpers/downloadDICOMData.js +26 -0
- package/dist/esm/adapters/helpers/getDatasetsFromImages.d.ts +1 -0
- package/dist/esm/adapters/helpers/getDatasetsFromImages.js +33 -0
- package/dist/esm/adapters/helpers/graphicTypeEquals.d.ts +2 -0
- package/dist/esm/adapters/helpers/graphicTypeEquals.js +7 -0
- package/dist/esm/adapters/helpers/index.js +4 -0
- package/dist/esm/adapters/helpers/toArray.js +5 -0
- package/dist/esm/adapters/index.d.ts +66 -0
- package/dist/esm/adapters/index.js +24 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +5 -0
- package/dist/umd/adapters.umd.js +5769 -0
- package/dist/umd/adapters.umd.js.map +1 -0
- package/package.json +47 -11
- package/dist/adapters.es.js +0 -5585
- package/dist/adapters.es.js.map +0 -1
- package/dist/types/adapters/Cornerstone/index.d.ts +0 -16
- package/dist/types/adapters/Cornerstone3D/RTStruct/RTSS.d.ts +0 -26
- package/dist/types/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +0 -8
- package/dist/types/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +0 -16
- package/dist/types/adapters/VTKjs/index.d.ts +0 -4
- package/dist/types/adapters/helpers/codeMeaningEquals.d.ts +0 -9
- package/dist/types/adapters/helpers/downloadDICOMData.d.ts +0 -10
- package/dist/types/adapters/helpers/graphicTypeEquals.d.ts +0 -7
- package/dist/types/adapters/index.d.ts +0 -49
- package/dist/types/index.d.ts +0 -2
- /package/dist/{types → esm}/adapters/Cornerstone3D/Angle.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Bidirectional.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/CobbAngle.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/EllipticalROI.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/RTStruct/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/RectangleROI.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.d.ts +0 -0
- /package/dist/{types → esm}/adapters/enums/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/helpers/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/helpers/toArray.d.ts +0 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { createClass as _createClass, classCallCheck as _classCallCheck } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import { utilities, derivations, normalizers, data } from 'dcmjs';
|
|
3
|
+
import { toArray } from '../helpers/toArray.js';
|
|
4
|
+
import { codeMeaningEquals } from '../helpers/codeMeaningEquals.js';
|
|
5
|
+
import '../helpers/downloadDICOMData.js';
|
|
6
|
+
|
|
7
|
+
var TID1500 = utilities.TID1500,
|
|
8
|
+
addAccessors = utilities.addAccessors;
|
|
9
|
+
var StructuredReport = derivations.StructuredReport;
|
|
10
|
+
var Normalizer = normalizers.Normalizer;
|
|
11
|
+
var TID1500MeasurementReport = TID1500.TID1500MeasurementReport,
|
|
12
|
+
TID1501MeasurementGroup = TID1500.TID1501MeasurementGroup;
|
|
13
|
+
var DicomMetaDictionary = data.DicomMetaDictionary;
|
|
14
|
+
var FINDING = {
|
|
15
|
+
CodingSchemeDesignator: "DCM",
|
|
16
|
+
CodeValue: "121071"
|
|
17
|
+
};
|
|
18
|
+
var FINDING_SITE = {
|
|
19
|
+
CodingSchemeDesignator: "SCT",
|
|
20
|
+
CodeValue: "363698007"
|
|
21
|
+
};
|
|
22
|
+
var FINDING_SITE_OLD = {
|
|
23
|
+
CodingSchemeDesignator: "SRT",
|
|
24
|
+
CodeValue: "G-C0E3"
|
|
25
|
+
};
|
|
26
|
+
var codeValueMatch = function codeValueMatch(group, code, oldCode) {
|
|
27
|
+
var ConceptNameCodeSequence = group.ConceptNameCodeSequence;
|
|
28
|
+
if (!ConceptNameCodeSequence) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
var CodingSchemeDesignator = ConceptNameCodeSequence.CodingSchemeDesignator,
|
|
32
|
+
CodeValue = ConceptNameCodeSequence.CodeValue;
|
|
33
|
+
return CodingSchemeDesignator == code.CodingSchemeDesignator && CodeValue == code.CodeValue || oldCode && CodingSchemeDesignator == oldCode.CodingSchemeDesignator && CodeValue == oldCode.CodeValue;
|
|
34
|
+
};
|
|
35
|
+
function getTID300ContentItem(tool, toolType, ReferencedSOPSequence, toolClass) {
|
|
36
|
+
var args = toolClass.getTID300RepresentationArguments(tool);
|
|
37
|
+
args.ReferencedSOPSequence = ReferencedSOPSequence;
|
|
38
|
+
var TID300Measurement = new toolClass.TID300Representation(args);
|
|
39
|
+
return TID300Measurement;
|
|
40
|
+
}
|
|
41
|
+
function getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) {
|
|
42
|
+
var toolTypeData = toolData[toolType];
|
|
43
|
+
var toolClass = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType];
|
|
44
|
+
if (!toolTypeData || !toolTypeData.data || !toolTypeData.data.length || !toolClass) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Loop through the array of tool instances
|
|
49
|
+
// for this tool
|
|
50
|
+
var Measurements = toolTypeData.data.map(function (tool) {
|
|
51
|
+
return getTID300ContentItem(tool, toolType, ReferencedSOPSequence, toolClass);
|
|
52
|
+
});
|
|
53
|
+
return new TID1501MeasurementGroup(Measurements);
|
|
54
|
+
}
|
|
55
|
+
var MeasurementReport = /*#__PURE__*/function () {
|
|
56
|
+
function MeasurementReport() {
|
|
57
|
+
_classCallCheck(this, MeasurementReport);
|
|
58
|
+
}
|
|
59
|
+
return _createClass(MeasurementReport, null, [{
|
|
60
|
+
key: "getSetupMeasurementData",
|
|
61
|
+
value: function getSetupMeasurementData(MeasurementGroup) {
|
|
62
|
+
var ContentSequence = MeasurementGroup.ContentSequence;
|
|
63
|
+
var contentSequenceArr = toArray(ContentSequence);
|
|
64
|
+
var findingGroup = contentSequenceArr.find(function (group) {
|
|
65
|
+
return codeValueMatch(group, FINDING);
|
|
66
|
+
});
|
|
67
|
+
var findingSiteGroups = contentSequenceArr.filter(function (group) {
|
|
68
|
+
return codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD);
|
|
69
|
+
}) || [];
|
|
70
|
+
var NUMGroup = contentSequenceArr.find(function (group) {
|
|
71
|
+
return group.ValueType === "NUM";
|
|
72
|
+
});
|
|
73
|
+
var SCOORDGroup = toArray(NUMGroup.ContentSequence).find(function (group) {
|
|
74
|
+
return group.ValueType === "SCOORD";
|
|
75
|
+
});
|
|
76
|
+
var ReferencedSOPSequence = SCOORDGroup.ContentSequence.ReferencedSOPSequence;
|
|
77
|
+
var ReferencedSOPInstanceUID = ReferencedSOPSequence.ReferencedSOPInstanceUID,
|
|
78
|
+
ReferencedFrameNumber = ReferencedSOPSequence.ReferencedFrameNumber;
|
|
79
|
+
var defaultState = {
|
|
80
|
+
sopInstanceUid: ReferencedSOPInstanceUID,
|
|
81
|
+
frameIndex: ReferencedFrameNumber || 1,
|
|
82
|
+
complete: true,
|
|
83
|
+
finding: findingGroup ? addAccessors(findingGroup.ConceptCodeSequence) : undefined,
|
|
84
|
+
findingSites: findingSiteGroups.map(function (fsg) {
|
|
85
|
+
return addAccessors(fsg.ConceptCodeSequence);
|
|
86
|
+
})
|
|
87
|
+
};
|
|
88
|
+
if (defaultState.finding) {
|
|
89
|
+
defaultState.description = defaultState.finding.CodeMeaning;
|
|
90
|
+
}
|
|
91
|
+
var findingSite = defaultState.findingSites && defaultState.findingSites[0];
|
|
92
|
+
if (findingSite) {
|
|
93
|
+
defaultState.location = findingSite[0] && findingSite[0].CodeMeaning || findingSite.CodeMeaning;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
defaultState: defaultState,
|
|
97
|
+
findingGroup: findingGroup,
|
|
98
|
+
findingSiteGroups: findingSiteGroups,
|
|
99
|
+
NUMGroup: NUMGroup,
|
|
100
|
+
SCOORDGroup: SCOORDGroup,
|
|
101
|
+
ReferencedSOPSequence: ReferencedSOPSequence,
|
|
102
|
+
ReferencedSOPInstanceUID: ReferencedSOPInstanceUID,
|
|
103
|
+
ReferencedFrameNumber: ReferencedFrameNumber
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}, {
|
|
107
|
+
key: "generateReport",
|
|
108
|
+
value: function generateReport(toolState, metadataProvider, options) {
|
|
109
|
+
// ToolState for array of imageIDs to a Report
|
|
110
|
+
// Assume Cornerstone metadata provider has access to Study / Series / Sop Instance UID
|
|
111
|
+
|
|
112
|
+
var allMeasurementGroups = [];
|
|
113
|
+
var firstImageId = Object.keys(toolState)[0];
|
|
114
|
+
if (!firstImageId) {
|
|
115
|
+
throw new Error("No measurements provided.");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Patient ID
|
|
119
|
+
Warning - Missing attribute or value that would be needed to build DICOMDIR - Patient ID
|
|
120
|
+
Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Date
|
|
121
|
+
Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Time
|
|
122
|
+
Warning - Missing attribute or value that would be needed to build DICOMDIR - Study ID
|
|
123
|
+
*/
|
|
124
|
+
var generalSeriesModule = metadataProvider.get("generalSeriesModule", firstImageId);
|
|
125
|
+
|
|
126
|
+
//const sopCommonModule = metadataProvider.get('sopCommonModule', firstImageId);
|
|
127
|
+
|
|
128
|
+
// NOTE: We are getting the Series and Study UIDs from the first imageId of the toolState
|
|
129
|
+
// which means that if the toolState is for multiple series, the report will have the incorrect
|
|
130
|
+
// SeriesInstanceUIDs
|
|
131
|
+
var studyInstanceUID = generalSeriesModule.studyInstanceUID,
|
|
132
|
+
seriesInstanceUID = generalSeriesModule.seriesInstanceUID;
|
|
133
|
+
|
|
134
|
+
// Loop through each image in the toolData
|
|
135
|
+
Object.keys(toolState).forEach(function (imageId) {
|
|
136
|
+
var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
|
|
137
|
+
var frameNumber = metadataProvider.get("frameNumber", imageId);
|
|
138
|
+
var toolData = toolState[imageId];
|
|
139
|
+
var toolTypes = Object.keys(toolData);
|
|
140
|
+
var ReferencedSOPSequence = {
|
|
141
|
+
ReferencedSOPClassUID: sopCommonModule.sopClassUID,
|
|
142
|
+
ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID
|
|
143
|
+
};
|
|
144
|
+
if (Normalizer.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
|
|
145
|
+
ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Loop through each tool type for the image
|
|
149
|
+
var measurementGroups = [];
|
|
150
|
+
toolTypes.forEach(function (toolType) {
|
|
151
|
+
var group = getMeasurementGroup(toolType, toolData, ReferencedSOPSequence);
|
|
152
|
+
if (group) {
|
|
153
|
+
measurementGroups.push(group);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
allMeasurementGroups = allMeasurementGroups.concat(measurementGroups);
|
|
157
|
+
});
|
|
158
|
+
var _MeasurementReport = new TID1500MeasurementReport({
|
|
159
|
+
TID1501MeasurementGroups: allMeasurementGroups
|
|
160
|
+
}, options);
|
|
161
|
+
|
|
162
|
+
// TODO: what is the correct metaheader
|
|
163
|
+
// http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html
|
|
164
|
+
// TODO: move meta creation to happen in derivations.js
|
|
165
|
+
var fileMetaInformationVersionArray = new Uint8Array(2);
|
|
166
|
+
fileMetaInformationVersionArray[1] = 1;
|
|
167
|
+
var derivationSourceDataset = {
|
|
168
|
+
StudyInstanceUID: studyInstanceUID,
|
|
169
|
+
SeriesInstanceUID: seriesInstanceUID
|
|
170
|
+
//SOPInstanceUID: sopInstanceUID, // TODO: Necessary?
|
|
171
|
+
//SOPClassUID: sopClassUID,
|
|
172
|
+
};
|
|
173
|
+
var _meta = {
|
|
174
|
+
FileMetaInformationVersion: {
|
|
175
|
+
Value: [fileMetaInformationVersionArray.buffer],
|
|
176
|
+
vr: "OB"
|
|
177
|
+
},
|
|
178
|
+
//MediaStorageSOPClassUID
|
|
179
|
+
//MediaStorageSOPInstanceUID: sopCommonModule.sopInstanceUID,
|
|
180
|
+
TransferSyntaxUID: {
|
|
181
|
+
Value: ["1.2.840.10008.1.2.1"],
|
|
182
|
+
vr: "UI"
|
|
183
|
+
},
|
|
184
|
+
ImplementationClassUID: {
|
|
185
|
+
Value: [DicomMetaDictionary.uid()],
|
|
186
|
+
// TODO: could be git hash or other valid id
|
|
187
|
+
vr: "UI"
|
|
188
|
+
},
|
|
189
|
+
ImplementationVersionName: {
|
|
190
|
+
Value: ["dcmjs"],
|
|
191
|
+
vr: "SH"
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
var _vrMap = {
|
|
195
|
+
PixelData: "OW"
|
|
196
|
+
};
|
|
197
|
+
derivationSourceDataset._meta = _meta;
|
|
198
|
+
derivationSourceDataset._vrMap = _vrMap;
|
|
199
|
+
var report = new StructuredReport([derivationSourceDataset]);
|
|
200
|
+
var contentItem = _MeasurementReport.contentItem(derivationSourceDataset);
|
|
201
|
+
|
|
202
|
+
// Merge the derived dataset with the content from the Measurement Report
|
|
203
|
+
report.dataset = Object.assign(report.dataset, contentItem);
|
|
204
|
+
report.dataset._meta = _meta;
|
|
205
|
+
report.dataset.SpecificCharacterSet = "ISO_IR 192";
|
|
206
|
+
return report;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Generate Cornerstone tool state from dataset
|
|
211
|
+
* @param {object} dataset dataset
|
|
212
|
+
* @param {object} hooks
|
|
213
|
+
* @param {function} hooks.getToolClass Function to map dataset to a tool class
|
|
214
|
+
* @returns
|
|
215
|
+
*/
|
|
216
|
+
}, {
|
|
217
|
+
key: "generateToolState",
|
|
218
|
+
value: function generateToolState(dataset) {
|
|
219
|
+
var hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
220
|
+
// For now, bail out if the dataset is not a TID1500 SR with length measurements
|
|
221
|
+
if (dataset.ContentTemplateSequence.TemplateIdentifier !== "1500") {
|
|
222
|
+
throw new Error("This package can currently only interpret DICOM SR TID 1500");
|
|
223
|
+
}
|
|
224
|
+
var REPORT = "Imaging Measurements";
|
|
225
|
+
var GROUP = "Measurement Group";
|
|
226
|
+
var TRACKING_IDENTIFIER = "Tracking Identifier";
|
|
227
|
+
|
|
228
|
+
// Identify the Imaging Measurements
|
|
229
|
+
var imagingMeasurementContent = toArray(dataset.ContentSequence).find(codeMeaningEquals(REPORT));
|
|
230
|
+
|
|
231
|
+
// Retrieve the Measurements themselves
|
|
232
|
+
var measurementGroups = toArray(imagingMeasurementContent.ContentSequence).filter(codeMeaningEquals(GROUP));
|
|
233
|
+
|
|
234
|
+
// For each of the supported measurement types, compute the measurement data
|
|
235
|
+
var measurementData = {};
|
|
236
|
+
var cornerstoneToolClasses = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;
|
|
237
|
+
var registeredToolClasses = [];
|
|
238
|
+
Object.keys(cornerstoneToolClasses).forEach(function (key) {
|
|
239
|
+
registeredToolClasses.push(cornerstoneToolClasses[key]);
|
|
240
|
+
measurementData[key] = [];
|
|
241
|
+
});
|
|
242
|
+
measurementGroups.forEach(function (measurementGroup) {
|
|
243
|
+
var measurementGroupContentSequence = toArray(measurementGroup.ContentSequence);
|
|
244
|
+
var TrackingIdentifierGroup = measurementGroupContentSequence.find(function (contentItem) {
|
|
245
|
+
return contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER;
|
|
246
|
+
});
|
|
247
|
+
var TrackingIdentifierValue = TrackingIdentifierGroup.TextValue;
|
|
248
|
+
var toolClass = hooks.getToolClass ? hooks.getToolClass(measurementGroup, dataset, registeredToolClasses) : registeredToolClasses.find(function (tc) {
|
|
249
|
+
return tc.isValidCornerstoneTrackingIdentifier(TrackingIdentifierValue);
|
|
250
|
+
});
|
|
251
|
+
if (toolClass) {
|
|
252
|
+
var measurement = toolClass.getMeasurementData(measurementGroup);
|
|
253
|
+
console.log("=== ".concat(toolClass.toolType, " ==="));
|
|
254
|
+
console.log(measurement);
|
|
255
|
+
measurementData[toolClass.toolType].push(measurement);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// NOTE: There is no way of knowing the cornerstone imageIds as that could be anything.
|
|
260
|
+
// That is up to the consumer to derive from the SOPInstanceUIDs.
|
|
261
|
+
return measurementData;
|
|
262
|
+
}
|
|
263
|
+
}, {
|
|
264
|
+
key: "registerTool",
|
|
265
|
+
value: function registerTool(toolClass) {
|
|
266
|
+
MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[toolClass.utilityToolType] = toolClass;
|
|
267
|
+
MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolClass.toolType] = toolClass;
|
|
268
|
+
MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] = toolClass.utilityToolType;
|
|
269
|
+
}
|
|
270
|
+
}]);
|
|
271
|
+
}();
|
|
272
|
+
MeasurementReport.MEASUREMENT_BY_TOOLTYPE = {};
|
|
273
|
+
MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {};
|
|
274
|
+
MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {};
|
|
275
|
+
|
|
276
|
+
export { MeasurementReport as default };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
declare function generateToolState(imageIds: any, arrayBuffer: any, metadataProvider: any, tolerance?: number): Promise<{
|
|
2
|
+
pixelData: any;
|
|
3
|
+
}>;
|
|
4
|
+
declare const ParametricMapObj: {
|
|
5
|
+
generateToolState: typeof generateToolState;
|
|
6
|
+
};
|
|
7
|
+
export { ParametricMapObj as default, ParametricMapObj as ParametricMap };
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { asyncToGenerator as _asyncToGenerator, regeneratorRuntime as _regeneratorRuntime, toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import { data, normalizers, log } from 'dcmjs';
|
|
3
|
+
import checkOrientation from '../helpers/checkOrientation.js';
|
|
4
|
+
import compareArrays from '../helpers/compareArrays.js';
|
|
5
|
+
|
|
6
|
+
var DicomMessage = data.DicomMessage,
|
|
7
|
+
DicomMetaDictionary = data.DicomMetaDictionary;
|
|
8
|
+
var Normalizer = normalizers.Normalizer;
|
|
9
|
+
function generateToolState(_x, _x2, _x3) {
|
|
10
|
+
return _generateToolState.apply(this, arguments);
|
|
11
|
+
}
|
|
12
|
+
function _generateToolState() {
|
|
13
|
+
_generateToolState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(imageIds, arrayBuffer, metadataProvider) {
|
|
14
|
+
var tolerance,
|
|
15
|
+
dicomData,
|
|
16
|
+
dataset,
|
|
17
|
+
multiframe,
|
|
18
|
+
imagePlaneModule,
|
|
19
|
+
ImageOrientationPatient,
|
|
20
|
+
validOrientations,
|
|
21
|
+
pixelData,
|
|
22
|
+
orientation,
|
|
23
|
+
sopUIDImageIdIndexMap,
|
|
24
|
+
orientationText,
|
|
25
|
+
imageIdMaps,
|
|
26
|
+
_args = arguments;
|
|
27
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
28
|
+
while (1) switch (_context.prev = _context.next) {
|
|
29
|
+
case 0:
|
|
30
|
+
tolerance = _args.length > 3 && _args[3] !== undefined ? _args[3] : 1e-3;
|
|
31
|
+
dicomData = DicomMessage.readFile(arrayBuffer);
|
|
32
|
+
dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
|
33
|
+
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
34
|
+
multiframe = Normalizer.normalizeToDataset([dataset]);
|
|
35
|
+
imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
36
|
+
if (!imagePlaneModule) {
|
|
37
|
+
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
38
|
+
}
|
|
39
|
+
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];
|
|
40
|
+
validOrientations = [ImageOrientationPatient];
|
|
41
|
+
pixelData = getPixelData(multiframe);
|
|
42
|
+
orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance);
|
|
43
|
+
sopUIDImageIdIndexMap = imageIds.reduce(function (acc, imageId) {
|
|
44
|
+
var _metadataProvider$get = metadataProvider.get("generalImageModule", imageId),
|
|
45
|
+
sopInstanceUID = _metadataProvider$get.sopInstanceUID;
|
|
46
|
+
acc[sopInstanceUID] = imageId;
|
|
47
|
+
return acc;
|
|
48
|
+
}, {});
|
|
49
|
+
if (!(orientation !== "Planar")) {
|
|
50
|
+
_context.next = 15;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
orientationText = {
|
|
54
|
+
Perpendicular: "orthogonal",
|
|
55
|
+
Oblique: "oblique"
|
|
56
|
+
};
|
|
57
|
+
throw new Error("Parametric maps ".concat(orientationText[orientation], " to the acquisition plane of the source data are not yet supported."));
|
|
58
|
+
case 15:
|
|
59
|
+
imageIdMaps = imageIds.reduce(function (acc, curr, index) {
|
|
60
|
+
acc.indices[curr] = index;
|
|
61
|
+
acc.metadata[curr] = metadataProvider.get("instance", curr);
|
|
62
|
+
return acc;
|
|
63
|
+
}, {
|
|
64
|
+
indices: {},
|
|
65
|
+
metadata: {}
|
|
66
|
+
});
|
|
67
|
+
_context.next = 18;
|
|
68
|
+
return insertPixelDataPlanar(pixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps);
|
|
69
|
+
case 18:
|
|
70
|
+
return _context.abrupt("return", {
|
|
71
|
+
pixelData: pixelData
|
|
72
|
+
});
|
|
73
|
+
case 19:
|
|
74
|
+
case "end":
|
|
75
|
+
return _context.stop();
|
|
76
|
+
}
|
|
77
|
+
}, _callee);
|
|
78
|
+
}));
|
|
79
|
+
return _generateToolState.apply(this, arguments);
|
|
80
|
+
}
|
|
81
|
+
function insertPixelDataPlanar(sourcePixelData, multiframe, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap, imageIdMaps) {
|
|
82
|
+
var targetPixelData = new sourcePixelData.constructor(sourcePixelData.length);
|
|
83
|
+
var PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
84
|
+
Rows = multiframe.Rows,
|
|
85
|
+
Columns = multiframe.Columns;
|
|
86
|
+
var sliceLength = Columns * Rows;
|
|
87
|
+
var numSlices = PerFrameFunctionalGroupsSequence.length;
|
|
88
|
+
for (var i = 0; i < numSlices; i++) {
|
|
89
|
+
var sourceSliceDataView = new sourcePixelData.constructor(sourcePixelData.buffer, i * sliceLength, sliceLength);
|
|
90
|
+
var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
91
|
+
if (!imageId) {
|
|
92
|
+
console.warn("Image not present in stack, can't import frame : " + i + ".");
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
var sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
96
|
+
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
97
|
+
throw new Error("Parametric map have different geometry dimensions (Rows and Columns) " + "respect to the source image reference frame. This is not yet supported.");
|
|
98
|
+
}
|
|
99
|
+
var imageIdIndex = imageIdMaps.indices[imageId];
|
|
100
|
+
var byteOffset = sliceLength * imageIdIndex * targetPixelData.BYTES_PER_ELEMENT;
|
|
101
|
+
var targetSliceDataView = new targetPixelData.constructor(targetPixelData.buffer, byteOffset, sliceLength);
|
|
102
|
+
targetSliceDataView.set(sourceSliceDataView);
|
|
103
|
+
}
|
|
104
|
+
return targetPixelData;
|
|
105
|
+
}
|
|
106
|
+
function getPixelData(multiframe) {
|
|
107
|
+
var TypedArrayClass;
|
|
108
|
+
var data;
|
|
109
|
+
if (multiframe.PixelData) {
|
|
110
|
+
var _multiframe$PixelRepr;
|
|
111
|
+
var validTypedArrays = multiframe.BitsAllocated === 16 ? [Uint16Array, Int16Array] : [Uint32Array, Int32Array];
|
|
112
|
+
TypedArrayClass = validTypedArrays[(_multiframe$PixelRepr = multiframe.PixelRepresentation) !== null && _multiframe$PixelRepr !== void 0 ? _multiframe$PixelRepr : 0];
|
|
113
|
+
data = multiframe.PixelData;
|
|
114
|
+
} else if (multiframe.FloatPixelData) {
|
|
115
|
+
TypedArrayClass = Float32Array;
|
|
116
|
+
data = multiframe.FloatPixelData;
|
|
117
|
+
} else if (multiframe.DoubleFloatPixelData) {
|
|
118
|
+
TypedArrayClass = Float64Array;
|
|
119
|
+
data = multiframe.DoubleFloatPixelData;
|
|
120
|
+
}
|
|
121
|
+
if (data === undefined) {
|
|
122
|
+
log.error("This parametric map pixel data is undefined.");
|
|
123
|
+
}
|
|
124
|
+
if (Array.isArray(data)) {
|
|
125
|
+
data = data[0];
|
|
126
|
+
}
|
|
127
|
+
return new TypedArrayClass(data);
|
|
128
|
+
}
|
|
129
|
+
function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
130
|
+
var imageId = undefined;
|
|
131
|
+
if (!multiframe) {
|
|
132
|
+
return imageId;
|
|
133
|
+
}
|
|
134
|
+
var FrameOfReferenceUID = multiframe.FrameOfReferenceUID,
|
|
135
|
+
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
136
|
+
SourceImageSequence = multiframe.SourceImageSequence,
|
|
137
|
+
ReferencedSeriesSequence = multiframe.ReferencedSeriesSequence;
|
|
138
|
+
if (!PerFrameFunctionalGroupsSequence || PerFrameFunctionalGroupsSequence.length === 0) {
|
|
139
|
+
return imageId;
|
|
140
|
+
}
|
|
141
|
+
var PerFrameFunctionalGroup = PerFrameFunctionalGroupsSequence[frameSegment];
|
|
142
|
+
if (!PerFrameFunctionalGroup) {
|
|
143
|
+
return imageId;
|
|
144
|
+
}
|
|
145
|
+
var frameSourceImageSequence = undefined;
|
|
146
|
+
if (PerFrameFunctionalGroup.DerivationImageSequence) {
|
|
147
|
+
var DerivationImageSequence = PerFrameFunctionalGroup.DerivationImageSequence;
|
|
148
|
+
if (Array.isArray(DerivationImageSequence)) {
|
|
149
|
+
if (DerivationImageSequence.length !== 0) {
|
|
150
|
+
DerivationImageSequence = DerivationImageSequence[0];
|
|
151
|
+
} else {
|
|
152
|
+
DerivationImageSequence = undefined;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (DerivationImageSequence) {
|
|
156
|
+
frameSourceImageSequence = DerivationImageSequence.SourceImageSequence;
|
|
157
|
+
if (Array.isArray(frameSourceImageSequence)) {
|
|
158
|
+
if (frameSourceImageSequence.length !== 0) {
|
|
159
|
+
frameSourceImageSequence = frameSourceImageSequence[0];
|
|
160
|
+
} else {
|
|
161
|
+
frameSourceImageSequence = undefined;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
} else if (SourceImageSequence && SourceImageSequence.length !== 0) {
|
|
166
|
+
console.warn("DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image.");
|
|
167
|
+
frameSourceImageSequence = SourceImageSequence[frameSegment];
|
|
168
|
+
}
|
|
169
|
+
if (frameSourceImageSequence) {
|
|
170
|
+
imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
171
|
+
}
|
|
172
|
+
if (imageId === undefined && ReferencedSeriesSequence) {
|
|
173
|
+
var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
|
|
174
|
+
var ReferencedSeriesInstanceUID = referencedSeriesSequence.SeriesInstanceUID;
|
|
175
|
+
imageId = getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance);
|
|
176
|
+
}
|
|
177
|
+
return imageId;
|
|
178
|
+
}
|
|
179
|
+
function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
180
|
+
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
181
|
+
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
182
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
183
|
+
}
|
|
184
|
+
function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
185
|
+
if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
for (var imageIdsIndex = 0; imageIdsIndex < imageIds.length; ++imageIdsIndex) {
|
|
189
|
+
var sourceImageMetadata = metadataProvider.get("instance", imageIds[imageIdsIndex]);
|
|
190
|
+
if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (compareArrays(PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
|
|
194
|
+
return imageIds[imageIdsIndex];
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
199
|
+
var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
|
|
200
|
+
if (!imageId) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
|
|
204
|
+
return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
|
|
205
|
+
}
|
|
206
|
+
var ParametricMapObj = {
|
|
207
|
+
generateToolState: generateToolState
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
export { ParametricMapObj as ParametricMap, ParametricMapObj as default };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export default RectangleRoi;
|
|
2
|
+
declare class RectangleRoi {
|
|
3
|
+
static getMeasurementData(MeasurementGroup: any): {
|
|
4
|
+
toolType: string;
|
|
5
|
+
handles: {
|
|
6
|
+
start: {};
|
|
7
|
+
end: {};
|
|
8
|
+
textBox: {
|
|
9
|
+
active: boolean;
|
|
10
|
+
hasMoved: boolean;
|
|
11
|
+
movesIndependently: boolean;
|
|
12
|
+
drawnIndependently: boolean;
|
|
13
|
+
allowedOutsideImage: boolean;
|
|
14
|
+
hasBoundingBox: boolean;
|
|
15
|
+
};
|
|
16
|
+
initialRotation: number;
|
|
17
|
+
};
|
|
18
|
+
cachedStats: {
|
|
19
|
+
area: any;
|
|
20
|
+
};
|
|
21
|
+
color: any;
|
|
22
|
+
invalidated: boolean;
|
|
23
|
+
sopInstanceUid: any;
|
|
24
|
+
frameIndex: any;
|
|
25
|
+
complete: boolean;
|
|
26
|
+
finding: any;
|
|
27
|
+
findingSites: any[];
|
|
28
|
+
};
|
|
29
|
+
static getTID300RepresentationArguments(tool: any): {
|
|
30
|
+
points: any[];
|
|
31
|
+
area: any;
|
|
32
|
+
perimeter: any;
|
|
33
|
+
trackingIdentifierTextValue: string;
|
|
34
|
+
finding: any;
|
|
35
|
+
findingSites: any;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
declare namespace RectangleRoi {
|
|
39
|
+
export let toolType: string;
|
|
40
|
+
export let utilityToolType: string;
|
|
41
|
+
export { TID300Polyline as TID300Representation };
|
|
42
|
+
export function isValidCornerstoneTrackingIdentifier(TrackingIdentifier: any): boolean;
|
|
43
|
+
}
|
|
44
|
+
declare const TID300Polyline: any;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { slicedToArray as _slicedToArray, createClass as _createClass, objectSpread2 as _objectSpread2, classCallCheck as _classCallCheck } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import { utilities } from 'dcmjs';
|
|
3
|
+
import MeasurementReport from './MeasurementReport.js';
|
|
4
|
+
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
|
+
|
|
6
|
+
var TID300Polyline = utilities.TID300.Polyline;
|
|
7
|
+
var RectangleRoi = /*#__PURE__*/function () {
|
|
8
|
+
function RectangleRoi() {
|
|
9
|
+
_classCallCheck(this, RectangleRoi);
|
|
10
|
+
}
|
|
11
|
+
return _createClass(RectangleRoi, null, [{
|
|
12
|
+
key: "getMeasurementData",
|
|
13
|
+
value: function getMeasurementData(MeasurementGroup) {
|
|
14
|
+
var _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
15
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
16
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup,
|
|
17
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup;
|
|
18
|
+
var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
|
|
19
|
+
toolType: RectangleRoi.toolType,
|
|
20
|
+
handles: {
|
|
21
|
+
start: {},
|
|
22
|
+
end: {},
|
|
23
|
+
textBox: {
|
|
24
|
+
active: false,
|
|
25
|
+
hasMoved: false,
|
|
26
|
+
movesIndependently: false,
|
|
27
|
+
drawnIndependently: true,
|
|
28
|
+
allowedOutsideImage: true,
|
|
29
|
+
hasBoundingBox: true
|
|
30
|
+
},
|
|
31
|
+
initialRotation: 0
|
|
32
|
+
},
|
|
33
|
+
cachedStats: {
|
|
34
|
+
area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0
|
|
35
|
+
},
|
|
36
|
+
color: undefined,
|
|
37
|
+
invalidated: true
|
|
38
|
+
});
|
|
39
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 6);
|
|
40
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
41
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
42
|
+
_SCOORDGroup$GraphicD[2];
|
|
43
|
+
_SCOORDGroup$GraphicD[3];
|
|
44
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[4];
|
|
45
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[5];
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
}, {
|
|
49
|
+
key: "getTID300RepresentationArguments",
|
|
50
|
+
value: function getTID300RepresentationArguments(tool) {
|
|
51
|
+
var finding = tool.finding,
|
|
52
|
+
findingSites = tool.findingSites,
|
|
53
|
+
_tool$cachedStats = tool.cachedStats,
|
|
54
|
+
cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
|
|
55
|
+
handles = tool.handles;
|
|
56
|
+
var start = handles.start,
|
|
57
|
+
end = handles.end;
|
|
58
|
+
var points = [start, {
|
|
59
|
+
x: start.x,
|
|
60
|
+
y: end.y
|
|
61
|
+
}, end, {
|
|
62
|
+
x: end.x,
|
|
63
|
+
y: start.y
|
|
64
|
+
}];
|
|
65
|
+
var area = cachedStats.area,
|
|
66
|
+
perimeter = cachedStats.perimeter;
|
|
67
|
+
var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:RectangleRoi";
|
|
68
|
+
return {
|
|
69
|
+
points: points,
|
|
70
|
+
area: area,
|
|
71
|
+
perimeter: perimeter,
|
|
72
|
+
trackingIdentifierTextValue: trackingIdentifierTextValue,
|
|
73
|
+
finding: finding,
|
|
74
|
+
findingSites: findingSites || []
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}]);
|
|
78
|
+
}();
|
|
79
|
+
RectangleRoi.toolType = "RectangleRoi";
|
|
80
|
+
RectangleRoi.utilityToolType = "RectangleRoi";
|
|
81
|
+
RectangleRoi.TID300Representation = TID300Polyline;
|
|
82
|
+
RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
83
|
+
if (!TrackingIdentifier.includes(":")) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
|
|
87
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
88
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
89
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
90
|
+
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return toolType === RectangleRoi.toolType;
|
|
94
|
+
};
|
|
95
|
+
MeasurementReport.registerTool(RectangleRoi);
|
|
96
|
+
|
|
97
|
+
export { RectangleRoi as default };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function generateSegmentation(images: object[], labelmaps3DorBrushData: any | any[], options?: {
|
|
2
|
+
includeSliceSpacing: boolean;
|
|
3
|
+
}, cornerstoneToolsVersion?: number): any;
|
|
4
|
+
export function generateToolState(imageIds: string[], arrayBuffer: ArrayBuffer, metadataProvider: any, skipOverlapping?: boolean, tolerance?: number, cornerstoneToolsVersion?: number): any;
|
|
5
|
+
export function fillSegmentation(segmentation: object[], inputLabelmaps3D: any | any[], options?: {
|
|
6
|
+
includeSliceSpacing: boolean;
|
|
7
|
+
}, cornerstoneToolsVersion?: number): Blob;
|