@cornerstonejs/adapters 2.0.0-beta.2 → 2.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +493 -0
- package/dist/esm/adapters/Cornerstone/Angle.d.ts +45 -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 +65 -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 +36 -0
- package/dist/esm/adapters/Cornerstone/MeasurementReport.js +276 -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 +44 -0
- package/dist/esm/adapters/Cornerstone/Segmentation.js +79 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.d.ts +45 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +428 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.d.ts +54 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +1200 -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 +29 -0
- package/dist/esm/adapters/Cornerstone3D/Angle.js +110 -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 +146 -0
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +103 -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 +170 -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 -1
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +314 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +9 -2
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +129 -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 +90 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +250 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.d.ts +4 -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 +92 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +45 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +47 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +25 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/index.js +3 -0
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +36 -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 +20 -6
- package/dist/esm/adapters/Cornerstone3D/index.js +41 -0
- package/dist/esm/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.js +20 -0
- package/dist/esm/adapters/VTKjs/Segmentation.d.ts +41 -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/esm/adapters/enums/Events.js +13 -0
- package/dist/esm/adapters/enums/index.js +1 -0
- package/dist/esm/adapters/helpers/codeMeaningEquals.js +14 -0
- package/dist/{types → esm}/adapters/helpers/downloadDICOMData.d.ts +1 -1
- package/dist/esm/adapters/helpers/downloadDICOMData.js +31 -0
- package/dist/esm/adapters/helpers/graphicTypeEquals.js +12 -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 +62 -0
- package/dist/esm/adapters/index.js +20 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +5 -0
- package/dist/umd/adapters.umd.js +5738 -0
- package/dist/umd/adapters.umd.js.map +1 -0
- package/package.json +14 -10
- package/dist/adapters.es.js +0 -5194
- package/dist/adapters.es.js.map +0 -1
- package/dist/types/adapters/Cornerstone/index.d.ts +0 -16
- package/dist/types/adapters/VTKjs/index.d.ts +0 -4
- package/dist/types/adapters/index.d.ts +0 -43
- 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/CircleROI.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/RectangleROI.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.d.ts +0 -0
- /package/dist/{types → esm}/adapters/enums/Events.d.ts +0 -0
- /package/dist/{types → esm}/adapters/enums/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/helpers/codeMeaningEquals.d.ts +0 -0
- /package/dist/{types → esm}/adapters/helpers/graphicTypeEquals.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,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,44 @@
|
|
|
1
|
+
export default Segmentation;
|
|
2
|
+
declare namespace Segmentation {
|
|
3
|
+
export { generateSegmentation };
|
|
4
|
+
export { generateToolState };
|
|
5
|
+
export { fillSegmentation };
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
|
|
9
|
+
*
|
|
10
|
+
* @param {object[]} images An array of the cornerstone image objects.
|
|
11
|
+
* @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.
|
|
12
|
+
* For 3.X: the BrushData.
|
|
13
|
+
* @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.
|
|
14
|
+
* @returns {Object}
|
|
15
|
+
*/
|
|
16
|
+
declare function generateSegmentation(images: object[], labelmaps3DorBrushData: any | any[], options?: {
|
|
17
|
+
includeSliceSpacing: boolean;
|
|
18
|
+
}, cornerstoneToolsVersion?: number): any;
|
|
19
|
+
/**
|
|
20
|
+
* generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
|
|
21
|
+
* derive cornerstoneTools toolState and brush metadata.
|
|
22
|
+
*
|
|
23
|
+
* @param {string[]} imageIds An array of the imageIds.
|
|
24
|
+
* @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
|
|
25
|
+
* @param {*} metadataProvider
|
|
26
|
+
* @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.
|
|
27
|
+
* @param {number} tolerance - default value 1.e-3.
|
|
28
|
+
* @param {number} cornerstoneToolsVersion - default value 4.
|
|
29
|
+
*
|
|
30
|
+
* @returns {Object} The toolState and an object from which the
|
|
31
|
+
* segment metadata can be derived.
|
|
32
|
+
*/
|
|
33
|
+
declare function generateToolState(imageIds: string[], arrayBuffer: ArrayBuffer, metadataProvider: any, skipOverlapping?: bool, tolerance?: number, cornerstoneToolsVersion?: number): any;
|
|
34
|
+
/**
|
|
35
|
+
* fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.
|
|
36
|
+
*
|
|
37
|
+
* @param {object[]} segmentation An empty segmentation derived dataset.
|
|
38
|
+
* @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
|
|
39
|
+
* @param {Object} userOptions Options object to override default options.
|
|
40
|
+
* @returns {Blob} description
|
|
41
|
+
*/
|
|
42
|
+
declare function fillSegmentation(segmentation: object[], inputLabelmaps3D: any | any[], options?: {
|
|
43
|
+
includeSliceSpacing: boolean;
|
|
44
|
+
}, cornerstoneToolsVersion?: number): Blob;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import Segmentation$2 from './Segmentation_3X.js';
|
|
2
|
+
import Segmentation$1 from './Segmentation_4X.js';
|
|
3
|
+
|
|
4
|
+
var Segmentation = {
|
|
5
|
+
generateSegmentation: generateSegmentation,
|
|
6
|
+
generateToolState: generateToolState,
|
|
7
|
+
fillSegmentation: fillSegmentation
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
|
|
12
|
+
*
|
|
13
|
+
* @param {object[]} images An array of the cornerstone image objects.
|
|
14
|
+
* @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.
|
|
15
|
+
* For 3.X: the BrushData.
|
|
16
|
+
* @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.
|
|
17
|
+
* @returns {Object}
|
|
18
|
+
*/
|
|
19
|
+
function generateSegmentation(images, labelmaps3DorBrushData) {
|
|
20
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
21
|
+
includeSliceSpacing: true
|
|
22
|
+
};
|
|
23
|
+
var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
|
|
24
|
+
if (cornerstoneToolsVersion === 4) {
|
|
25
|
+
return Segmentation$1.generateSegmentation(images, labelmaps3DorBrushData, options);
|
|
26
|
+
}
|
|
27
|
+
if (cornerstoneToolsVersion === 3) {
|
|
28
|
+
return Segmentation$2.generateSegmentation(images, labelmaps3DorBrushData, options);
|
|
29
|
+
}
|
|
30
|
+
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
|
|
35
|
+
* derive cornerstoneTools toolState and brush metadata.
|
|
36
|
+
*
|
|
37
|
+
* @param {string[]} imageIds An array of the imageIds.
|
|
38
|
+
* @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
|
|
39
|
+
* @param {*} metadataProvider
|
|
40
|
+
* @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.
|
|
41
|
+
* @param {number} tolerance - default value 1.e-3.
|
|
42
|
+
* @param {number} cornerstoneToolsVersion - default value 4.
|
|
43
|
+
*
|
|
44
|
+
* @returns {Object} The toolState and an object from which the
|
|
45
|
+
* segment metadata can be derived.
|
|
46
|
+
*/
|
|
47
|
+
function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
48
|
+
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
49
|
+
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
50
|
+
var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
|
|
51
|
+
if (cornerstoneToolsVersion === 4) {
|
|
52
|
+
return Segmentation$1.generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
53
|
+
}
|
|
54
|
+
if (cornerstoneToolsVersion === 3) {
|
|
55
|
+
return Segmentation$2.generateToolState(imageIds, arrayBuffer, metadataProvider);
|
|
56
|
+
}
|
|
57
|
+
console.warn("No generateToolState adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.
|
|
62
|
+
*
|
|
63
|
+
* @param {object[]} segmentation An empty segmentation derived dataset.
|
|
64
|
+
* @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
|
|
65
|
+
* @param {Object} userOptions Options object to override default options.
|
|
66
|
+
* @returns {Blob} description
|
|
67
|
+
*/
|
|
68
|
+
function fillSegmentation(segmentation, inputLabelmaps3D) {
|
|
69
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
70
|
+
includeSliceSpacing: true
|
|
71
|
+
};
|
|
72
|
+
var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
|
|
73
|
+
if (cornerstoneToolsVersion === 4) {
|
|
74
|
+
return Segmentation$1.fillSegmentation(segmentation, inputLabelmaps3D, options);
|
|
75
|
+
}
|
|
76
|
+
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { Segmentation as default };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export default Segmentation;
|
|
2
|
+
export type BrushData = {
|
|
3
|
+
/**
|
|
4
|
+
* - The cornerstoneTools global toolState.
|
|
5
|
+
*/
|
|
6
|
+
toolState: any;
|
|
7
|
+
/**
|
|
8
|
+
* - The cornerstoneTools segment metadata that corresponds to the
|
|
9
|
+
* seriesInstanceUid.
|
|
10
|
+
*/
|
|
11
|
+
segments: any[];
|
|
12
|
+
};
|
|
13
|
+
declare namespace Segmentation {
|
|
14
|
+
export { generateSegmentation };
|
|
15
|
+
export { generateToolState };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @typedef {Object} BrushData
|
|
20
|
+
* @property {Object} toolState - The cornerstoneTools global toolState.
|
|
21
|
+
* @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
|
|
22
|
+
* seriesInstanceUid.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* generateSegmentation - Generates cornerstoneTools brush data, given a stack of
|
|
26
|
+
* imageIds, images and the cornerstoneTools brushData.
|
|
27
|
+
*
|
|
28
|
+
* @param {object[]} images An array of the cornerstone image objects.
|
|
29
|
+
* @param {BrushData} brushData and object containing the brushData.
|
|
30
|
+
* @returns {type} description
|
|
31
|
+
*/
|
|
32
|
+
declare function generateSegmentation(images: object[], brushData: BrushData, options?: {
|
|
33
|
+
includeSliceSpacing: boolean;
|
|
34
|
+
}): type;
|
|
35
|
+
/**
|
|
36
|
+
* generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
|
|
37
|
+
* derive cornerstoneTools toolState and brush metadata.
|
|
38
|
+
*
|
|
39
|
+
* @param {string[]} imageIds An array of the imageIds.
|
|
40
|
+
* @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
|
|
41
|
+
* @param {*} metadataProvider
|
|
42
|
+
* @returns {Object} The toolState and an object from which the
|
|
43
|
+
* segment metadata can be derived.
|
|
44
|
+
*/
|
|
45
|
+
declare function generateToolState(imageIds: string[], arrayBuffer: ArrayBuffer, metadataProvider: any): any;
|