@cornerstonejs/adapters 3.0.0-beta.5 → 3.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/esm/adapters/Cornerstone/Angle.js +61 -74
  2. package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +76 -76
  3. package/dist/esm/adapters/Cornerstone/Bidirectional.js +130 -146
  4. package/dist/esm/adapters/Cornerstone/CircleRoi.js +96 -95
  5. package/dist/esm/adapters/Cornerstone/CobbAngle.js +66 -79
  6. package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +152 -152
  7. package/dist/esm/adapters/Cornerstone/FreehandRoi.js +68 -69
  8. package/dist/esm/adapters/Cornerstone/Length.js +54 -63
  9. package/dist/esm/adapters/Cornerstone/MeasurementReport.js +221 -224
  10. package/dist/esm/adapters/Cornerstone/ParametricMap.js +88 -110
  11. package/dist/esm/adapters/Cornerstone/RectangleRoi.js +72 -78
  12. package/dist/esm/adapters/Cornerstone/Segmentation.js +7 -7
  13. package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +113 -104
  14. package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +434 -462
  15. package/dist/esm/adapters/Cornerstone/index.js +14 -14
  16. package/dist/esm/adapters/Cornerstone3D/Angle.d.ts +2 -5
  17. package/dist/esm/adapters/Cornerstone3D/Angle.js +89 -100
  18. package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +5 -11
  19. package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +106 -118
  20. package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.d.ts +43 -0
  21. package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.js +92 -0
  22. package/dist/esm/adapters/Cornerstone3D/Bidirectional.d.ts +2 -5
  23. package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +118 -133
  24. package/dist/esm/adapters/Cornerstone3D/CircleROI.d.ts +2 -7
  25. package/dist/esm/adapters/Cornerstone3D/CircleROI.js +85 -85
  26. package/dist/esm/adapters/Cornerstone3D/CobbAngle.d.ts +2 -5
  27. package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +93 -104
  28. package/dist/esm/adapters/Cornerstone3D/CodingScheme.js +5 -5
  29. package/dist/esm/adapters/Cornerstone3D/EllipticalROI.d.ts +2 -7
  30. package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +148 -149
  31. package/dist/esm/adapters/Cornerstone3D/KeyImage.d.ts +24 -0
  32. package/dist/esm/adapters/Cornerstone3D/KeyImage.js +49 -0
  33. package/dist/esm/adapters/Cornerstone3D/Length.d.ts +2 -10
  34. package/dist/esm/adapters/Cornerstone3D/Length.js +83 -93
  35. package/dist/esm/adapters/Cornerstone3D/MeasurementReport.d.ts +23 -4
  36. package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +259 -240
  37. package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +8 -4
  38. package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +3 -5
  39. package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +99 -115
  40. package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +4 -17
  41. package/dist/esm/adapters/Cornerstone3D/Probe.js +38 -79
  42. package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +60 -52
  43. package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +3 -1
  44. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.js +5 -5
  45. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +14 -10
  46. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +17 -11
  47. package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +3 -1
  48. package/dist/esm/adapters/Cornerstone3D/RectangleROI.d.ts +2 -5
  49. package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +73 -85
  50. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +15 -13
  51. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +15 -9
  52. package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +10 -10
  53. package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js +134 -151
  54. package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +2 -5
  55. package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +68 -84
  56. package/dist/esm/adapters/Cornerstone3D/index.d.ts +4 -0
  57. package/dist/esm/adapters/Cornerstone3D/index.js +21 -17
  58. package/dist/esm/adapters/VTKjs/Segmentation.js +66 -72
  59. package/dist/esm/adapters/VTKjs/index.js +2 -2
  60. package/dist/esm/adapters/helpers/checkIfPerpendicular.js +2 -2
  61. package/dist/esm/adapters/helpers/checkOrientation.js +8 -8
  62. package/dist/esm/adapters/helpers/codeMeaningEquals.js +2 -2
  63. package/dist/esm/adapters/helpers/compareArrays.js +4 -2
  64. package/dist/esm/adapters/helpers/downloadDICOMData.js +6 -4
  65. package/dist/esm/adapters/helpers/getDatasetsFromImages.js +20 -18
  66. package/dist/esm/adapters/helpers/graphicTypeEquals.js +2 -2
  67. package/dist/esm/adapters/helpers/toArray.js +1 -3
  68. package/dist/esm/adapters/index.d.ts +2 -0
  69. package/dist/esm/adapters/index.js +6 -5
  70. package/dist/esm/node_modules/@babel/runtime/helpers/esm/defineProperty.js +18 -0
  71. package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +14 -0
  72. package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +9 -0
  73. package/dist/esm/node_modules/@babel/runtime/helpers/esm/typeof.js +11 -0
  74. package/package.json +4 -4
  75. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +0 -493
  76. package/dist/esm/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.js +0 -18
@@ -1,277 +1,296 @@
1
- import { objectSpread2 as _objectSpread2, createClass as _createClass, classCallCheck as _classCallCheck } from '../../_virtual/_rollupPluginBabelHelpers.js';
1
+ import _defineProperty from '../../node_modules/@babel/runtime/helpers/esm/defineProperty.js';
2
2
  import { utilities, derivations, normalizers, data } from 'dcmjs';
3
3
  import CORNERSTONE_3D_TAG from './cornerstone3DTag.js';
4
4
  import { toArray } from '../helpers/toArray.js';
5
5
  import { codeMeaningEquals } from '../helpers/codeMeaningEquals.js';
6
- import '../helpers/downloadDICOMData.js';
6
+ import 'buffer';
7
7
  import CodingScheme from './CodingScheme.js';
8
8
 
9
9
  var _MeasurementReport;
10
- var TID1500 = utilities.TID1500,
11
- addAccessors = utilities.addAccessors;
12
- var StructuredReport = derivations.StructuredReport;
13
- var Normalizer = normalizers.Normalizer;
14
- var TID1500MeasurementReport = TID1500.TID1500MeasurementReport,
15
- TID1501MeasurementGroup = TID1500.TID1501MeasurementGroup;
16
- var DicomMetaDictionary = data.DicomMetaDictionary;
17
- var FINDING = {
10
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ const {
13
+ TID1500,
14
+ addAccessors
15
+ } = utilities;
16
+ const {
17
+ StructuredReport
18
+ } = derivations;
19
+ const {
20
+ Normalizer
21
+ } = normalizers;
22
+ const {
23
+ TID1500MeasurementReport,
24
+ TID1501MeasurementGroup
25
+ } = TID1500;
26
+ const {
27
+ DicomMetaDictionary
28
+ } = data;
29
+ const FINDING = {
18
30
  CodingSchemeDesignator: "DCM",
19
31
  CodeValue: "121071"
20
32
  };
21
- var FINDING_SITE = {
33
+ const FINDING_SITE = {
22
34
  CodingSchemeDesignator: "SCT",
23
35
  CodeValue: "363698007"
24
36
  };
25
- var FINDING_SITE_OLD = {
37
+ const FINDING_SITE_OLD = {
26
38
  CodingSchemeDesignator: "SRT",
27
39
  CodeValue: "G-C0E3"
28
40
  };
29
- var codeValueMatch = function codeValueMatch(group, code, oldCode) {
30
- var ConceptNameCodeSequence = group.ConceptNameCodeSequence;
31
- if (!ConceptNameCodeSequence) {
32
- return;
41
+ class MeasurementReport {
42
+ static getTID300ContentItem(tool, ReferencedSOPSequence, toolClass, worldToImageCoords) {
43
+ const args = toolClass.getTID300RepresentationArguments(tool, worldToImageCoords);
44
+ args.ReferencedSOPSequence = ReferencedSOPSequence;
45
+ const TID300Measurement = new toolClass.TID300Representation(args);
46
+ return TID300Measurement;
33
47
  }
34
- var CodingSchemeDesignator = ConceptNameCodeSequence.CodingSchemeDesignator,
35
- CodeValue = ConceptNameCodeSequence.CodeValue;
36
- return CodingSchemeDesignator == code.CodingSchemeDesignator && CodeValue == code.CodeValue || oldCode && CodingSchemeDesignator == oldCode.CodingSchemeDesignator && CodeValue == oldCode.CodeValue;
37
- };
38
- function getTID300ContentItem(tool, toolType, ReferencedSOPSequence, toolClass, worldToImageCoords) {
39
- var args = toolClass.getTID300RepresentationArguments(tool, worldToImageCoords);
40
- args.ReferencedSOPSequence = ReferencedSOPSequence;
41
- var TID300Measurement = new toolClass.TID300Representation(args);
42
- return TID300Measurement;
43
- }
44
- function getMeasurementGroup(toolType, toolData, ReferencedSOPSequence, worldToImageCoords) {
45
- var toolTypeData = toolData[toolType];
46
- var toolClass = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType];
47
- if (!toolTypeData || !toolTypeData.data || !toolTypeData.data.length || !toolClass) {
48
- return;
48
+ static getMeasurementGroup(toolType, toolData, ReferencedSOPSequence, worldToImageCoords) {
49
+ const toolTypeData = toolData[toolType];
50
+ const toolClass = this.measurementAdapterByToolType.get(toolType);
51
+ if (!toolTypeData || !toolTypeData.data || !toolTypeData.data.length || !toolClass) {
52
+ return;
53
+ }
54
+ const Measurements = toolTypeData.data.map(tool => {
55
+ return this.getTID300ContentItem(tool, ReferencedSOPSequence, toolClass, worldToImageCoords);
56
+ });
57
+ return new TID1501MeasurementGroup(Measurements);
49
58
  }
50
- var Measurements = toolTypeData.data.map(function (tool) {
51
- return getTID300ContentItem(tool, toolType, ReferencedSOPSequence, toolClass, worldToImageCoords);
52
- });
53
- return new TID1501MeasurementGroup(Measurements);
54
- }
55
- var MeasurementReport = /*#__PURE__*/function () {
56
- function MeasurementReport() {
57
- _classCallCheck(this, MeasurementReport);
59
+ static getCornerstoneLabelFromDefaultState(defaultState) {
60
+ const {
61
+ findingSites = [],
62
+ finding
63
+ } = defaultState;
64
+ const cornersoneFreeTextCodingValue = CodingScheme.codeValues.CORNERSTONEFREETEXT;
65
+ const freeTextLabel = findingSites.find(fs => fs.CodeValue === cornersoneFreeTextCodingValue);
66
+ if (freeTextLabel) {
67
+ return freeTextLabel.CodeMeaning;
68
+ }
69
+ if (finding && finding.CodeValue === cornersoneFreeTextCodingValue) {
70
+ return finding.CodeMeaning;
71
+ }
58
72
  }
59
- return _createClass(MeasurementReport, null, [{
60
- key: "getCornerstoneLabelFromDefaultState",
61
- value: function getCornerstoneLabelFromDefaultState(defaultState) {
62
- var _defaultState$finding = defaultState.findingSites,
63
- findingSites = _defaultState$finding === void 0 ? [] : _defaultState$finding,
64
- finding = defaultState.finding;
65
- var cornersoneFreeTextCodingValue = CodingScheme.codeValues.CORNERSTONEFREETEXT;
66
- var freeTextLabel = findingSites.find(function (fs) {
67
- return fs.CodeValue === cornersoneFreeTextCodingValue;
68
- });
69
- if (freeTextLabel) {
70
- return freeTextLabel.CodeMeaning;
71
- }
72
- if (finding && finding.CodeValue === cornersoneFreeTextCodingValue) {
73
- return finding.CodeMeaning;
73
+ static generateDatasetMeta() {
74
+ const fileMetaInformationVersionArray = new Uint8Array(2);
75
+ fileMetaInformationVersionArray[1] = 1;
76
+ const _meta = {
77
+ FileMetaInformationVersion: {
78
+ Value: [fileMetaInformationVersionArray.buffer],
79
+ vr: "OB"
80
+ },
81
+ TransferSyntaxUID: {
82
+ Value: ["1.2.840.10008.1.2.1"],
83
+ vr: "UI"
84
+ },
85
+ ImplementationClassUID: {
86
+ Value: [DicomMetaDictionary.uid()],
87
+ vr: "UI"
88
+ },
89
+ ImplementationVersionName: {
90
+ Value: ["dcmjs"],
91
+ vr: "SH"
74
92
  }
75
- }
76
- }, {
77
- key: "generateDatasetMeta",
78
- value: function generateDatasetMeta() {
79
- var fileMetaInformationVersionArray = new Uint8Array(2);
80
- fileMetaInformationVersionArray[1] = 1;
81
- var _meta = {
82
- FileMetaInformationVersion: {
83
- Value: [fileMetaInformationVersionArray.buffer],
84
- vr: "OB"
85
- },
86
- TransferSyntaxUID: {
87
- Value: ["1.2.840.10008.1.2.1"],
88
- vr: "UI"
89
- },
90
- ImplementationClassUID: {
91
- Value: [DicomMetaDictionary.uid()],
92
- vr: "UI"
93
+ };
94
+ return _meta;
95
+ }
96
+ static getSetupMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, toolType) {
97
+ const {
98
+ ContentSequence
99
+ } = MeasurementGroup;
100
+ const contentSequenceArr = toArray(ContentSequence);
101
+ const findingGroup = contentSequenceArr.find(group => this.codeValueMatch(group, FINDING));
102
+ const findingSiteGroups = contentSequenceArr.filter(group => this.codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)) || [];
103
+ const NUMGroup = contentSequenceArr.find(group => group.ValueType === "NUM");
104
+ const SCOORDGroup = toArray(NUMGroup.ContentSequence).find(group => group.ValueType === "SCOORD");
105
+ const {
106
+ ReferencedSOPSequence
107
+ } = SCOORDGroup.ContentSequence;
108
+ const {
109
+ ReferencedSOPInstanceUID,
110
+ ReferencedFrameNumber
111
+ } = ReferencedSOPSequence;
112
+ const referencedImageId = sopInstanceUIDToImageIdMap[ReferencedSOPInstanceUID];
113
+ const imagePlaneModule = metadata.get("imagePlaneModule", referencedImageId);
114
+ const finding = findingGroup ? addAccessors(findingGroup.ConceptCodeSequence) : undefined;
115
+ const findingSites = findingSiteGroups.map(fsg => {
116
+ return addAccessors(fsg.ConceptCodeSequence);
117
+ });
118
+ const defaultState = {
119
+ description: undefined,
120
+ sopInstanceUid: ReferencedSOPInstanceUID,
121
+ annotation: {
122
+ annotationUID: DicomMetaDictionary.uid(),
123
+ metadata: {
124
+ toolName: toolType,
125
+ referencedImageId,
126
+ FrameOfReferenceUID: imagePlaneModule.frameOfReferenceUID,
127
+ label: ""
93
128
  },
94
- ImplementationVersionName: {
95
- Value: ["dcmjs"],
96
- vr: "SH"
97
- }
98
- };
99
- return _meta;
129
+ data: undefined
130
+ },
131
+ finding,
132
+ findingSites
133
+ };
134
+ if (defaultState.finding) {
135
+ defaultState.description = defaultState.finding.CodeMeaning;
100
136
  }
101
- }, {
102
- key: "getSetupMeasurementData",
103
- value: function getSetupMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, toolType) {
104
- var ContentSequence = MeasurementGroup.ContentSequence;
105
- var contentSequenceArr = toArray(ContentSequence);
106
- var findingGroup = contentSequenceArr.find(function (group) {
107
- return codeValueMatch(group, FINDING);
108
- });
109
- var findingSiteGroups = contentSequenceArr.filter(function (group) {
110
- return codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD);
111
- }) || [];
112
- var NUMGroup = contentSequenceArr.find(function (group) {
113
- return group.ValueType === "NUM";
114
- });
115
- var SCOORDGroup = toArray(NUMGroup.ContentSequence).find(function (group) {
116
- return group.ValueType === "SCOORD";
117
- });
118
- var ReferencedSOPSequence = SCOORDGroup.ContentSequence.ReferencedSOPSequence;
119
- var ReferencedSOPInstanceUID = ReferencedSOPSequence.ReferencedSOPInstanceUID,
120
- ReferencedFrameNumber = ReferencedSOPSequence.ReferencedFrameNumber;
121
- var referencedImageId = sopInstanceUIDToImageIdMap[ReferencedSOPInstanceUID];
122
- var imagePlaneModule = metadata.get("imagePlaneModule", referencedImageId);
123
- var finding = findingGroup ? addAccessors(findingGroup.ConceptCodeSequence) : undefined;
124
- var findingSites = findingSiteGroups.map(function (fsg) {
125
- return addAccessors(fsg.ConceptCodeSequence);
126
- });
127
- var defaultState = {
128
- description: undefined,
129
- sopInstanceUid: ReferencedSOPInstanceUID,
130
- annotation: {
131
- annotationUID: DicomMetaDictionary.uid(),
132
- metadata: {
133
- toolName: toolType,
134
- referencedImageId: referencedImageId,
135
- FrameOfReferenceUID: imagePlaneModule.frameOfReferenceUID,
136
- label: ""
137
- },
138
- data: undefined
139
- },
140
- finding: finding,
141
- findingSites: findingSites
142
- };
143
- if (defaultState.finding) {
144
- defaultState.description = defaultState.finding.CodeMeaning;
137
+ defaultState.annotation.metadata.label = MeasurementReport.getCornerstoneLabelFromDefaultState(defaultState);
138
+ return {
139
+ defaultState,
140
+ NUMGroup,
141
+ SCOORDGroup,
142
+ ReferencedSOPSequence,
143
+ ReferencedSOPInstanceUID,
144
+ ReferencedFrameNumber
145
+ };
146
+ }
147
+ static generateReport(toolState, metadataProvider, worldToImageCoords, options) {
148
+ let allMeasurementGroups = [];
149
+ const sopInstanceUIDsToSeriesInstanceUIDMap = {};
150
+ const derivationSourceDatasets = [];
151
+ const _meta = MeasurementReport.generateDatasetMeta();
152
+ Object.keys(toolState).forEach(imageId => {
153
+ const sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
154
+ const instance = metadataProvider.get("instance", imageId);
155
+ const {
156
+ sopInstanceUID,
157
+ sopClassUID
158
+ } = sopCommonModule;
159
+ const {
160
+ SeriesInstanceUID: seriesInstanceUID
161
+ } = instance;
162
+ sopInstanceUIDsToSeriesInstanceUIDMap[sopInstanceUID] = seriesInstanceUID;
163
+ if (!derivationSourceDatasets.find(dsd => dsd.SeriesInstanceUID === seriesInstanceUID)) {
164
+ const derivationSourceDataset = MeasurementReport.generateDerivationSourceDataset(instance);
165
+ derivationSourceDatasets.push(derivationSourceDataset);
145
166
  }
146
- defaultState.annotation.metadata.label = MeasurementReport.getCornerstoneLabelFromDefaultState(defaultState);
147
- return {
148
- defaultState: defaultState,
149
- NUMGroup: NUMGroup,
150
- SCOORDGroup: SCOORDGroup,
151
- ReferencedSOPSequence: ReferencedSOPSequence,
152
- ReferencedSOPInstanceUID: ReferencedSOPInstanceUID,
153
- ReferencedFrameNumber: ReferencedFrameNumber
167
+ const frameNumber = metadataProvider.get("frameNumber", imageId);
168
+ const toolData = toolState[imageId];
169
+ const toolTypes = Object.keys(toolData);
170
+ const ReferencedSOPSequence = {
171
+ ReferencedSOPClassUID: sopClassUID,
172
+ ReferencedSOPInstanceUID: sopInstanceUID,
173
+ ReferencedFrameNumber: undefined
154
174
  };
155
- }
156
- }, {
157
- key: "generateReport",
158
- value: function generateReport(toolState, metadataProvider, worldToImageCoords, options) {
159
- var allMeasurementGroups = [];
160
- var sopInstanceUIDsToSeriesInstanceUIDMap = {};
161
- var derivationSourceDatasets = [];
162
- var _meta = MeasurementReport.generateDatasetMeta();
163
- Object.keys(toolState).forEach(function (imageId) {
164
- var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
165
- var instance = metadataProvider.get("instance", imageId);
166
- var sopInstanceUID = sopCommonModule.sopInstanceUID,
167
- sopClassUID = sopCommonModule.sopClassUID;
168
- var seriesInstanceUID = instance.SeriesInstanceUID;
169
- sopInstanceUIDsToSeriesInstanceUIDMap[sopInstanceUID] = seriesInstanceUID;
170
- if (!derivationSourceDatasets.find(function (dsd) {
171
- return dsd.SeriesInstanceUID === seriesInstanceUID;
172
- })) {
173
- var derivationSourceDataset = MeasurementReport.generateDerivationSourceDataset(instance);
174
- derivationSourceDatasets.push(derivationSourceDataset);
175
- }
176
- var frameNumber = metadataProvider.get("frameNumber", imageId);
177
- var toolData = toolState[imageId];
178
- var toolTypes = Object.keys(toolData);
179
- var ReferencedSOPSequence = {
180
- ReferencedSOPClassUID: sopClassUID,
181
- ReferencedSOPInstanceUID: sopInstanceUID,
182
- ReferencedFrameNumber: undefined
183
- };
184
- if (instance && instance.NumberOfFrames && instance.NumberOfFrames > 1 || Normalizer.isMultiframeSOPClassUID(sopClassUID)) {
185
- ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
175
+ if (instance && instance.NumberOfFrames && instance.NumberOfFrames > 1 || Normalizer.isMultiframeSOPClassUID(sopClassUID)) {
176
+ ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
177
+ }
178
+ const measurementGroups = [];
179
+ toolTypes.forEach(toolType => {
180
+ const group = this.getMeasurementGroup(toolType, toolData, ReferencedSOPSequence, worldToImageCoords);
181
+ if (group) {
182
+ measurementGroups.push(group);
186
183
  }
187
- var measurementGroups = [];
188
- toolTypes.forEach(function (toolType) {
189
- var group = getMeasurementGroup(toolType, toolData, ReferencedSOPSequence, worldToImageCoords);
190
- if (group) {
191
- measurementGroups.push(group);
192
- }
193
- });
194
- allMeasurementGroups = allMeasurementGroups.concat(measurementGroups);
195
184
  });
196
- var tid1500MeasurementReport = new TID1500MeasurementReport({
197
- TID1501MeasurementGroups: allMeasurementGroups
198
- }, options);
199
- var report = new StructuredReport(derivationSourceDatasets, options);
200
- var contentItem = tid1500MeasurementReport.contentItem(derivationSourceDatasets, _objectSpread2(_objectSpread2({}, options), {}, {
201
- sopInstanceUIDsToSeriesInstanceUIDMap: sopInstanceUIDsToSeriesInstanceUIDMap
202
- }));
203
- report.dataset = Object.assign(report.dataset, contentItem);
204
- report.dataset._meta = _meta;
205
- report.SpecificCharacterSet = "ISO_IR 192";
206
- return report;
185
+ allMeasurementGroups = allMeasurementGroups.concat(measurementGroups);
186
+ });
187
+ const tid1500MeasurementReport = new TID1500MeasurementReport({
188
+ TID1501MeasurementGroups: allMeasurementGroups
189
+ }, options);
190
+ const report = new StructuredReport(derivationSourceDatasets, options);
191
+ const contentItem = tid1500MeasurementReport.contentItem(derivationSourceDatasets, _objectSpread(_objectSpread({}, options), {}, {
192
+ sopInstanceUIDsToSeriesInstanceUIDMap
193
+ }));
194
+ report.dataset = Object.assign(report.dataset, contentItem);
195
+ report.dataset._meta = _meta;
196
+ report.SpecificCharacterSet = "ISO_IR 192";
197
+ return report;
198
+ }
199
+ static generateToolState(dataset, sopInstanceUIDToImageIdMap, imageToWorldCoords, metadata, hooks) {
200
+ if (dataset.ContentTemplateSequence.TemplateIdentifier !== "1500") {
201
+ throw new Error("This package can currently only interpret DICOM SR TID 1500");
207
202
  }
208
- }, {
209
- key: "generateToolState",
210
- value: function generateToolState(dataset, sopInstanceUIDToImageIdMap, imageToWorldCoords, metadata, hooks) {
211
- if (dataset.ContentTemplateSequence.TemplateIdentifier !== "1500") {
212
- throw new Error("This package can currently only interpret DICOM SR TID 1500");
213
- }
214
- var REPORT = "Imaging Measurements";
215
- var GROUP = "Measurement Group";
216
- var TRACKING_IDENTIFIER = "Tracking Identifier";
217
- var TRACKING_UNIQUE_IDENTIFIER = "Tracking Unique Identifier";
218
- var imagingMeasurementContent = toArray(dataset.ContentSequence).find(codeMeaningEquals(REPORT));
219
- var measurementGroups = toArray(imagingMeasurementContent.ContentSequence).filter(codeMeaningEquals(GROUP));
220
- var measurementData = {};
221
- var cornerstoneToolClasses = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;
222
- var registeredToolClasses = [];
223
- Object.keys(cornerstoneToolClasses).forEach(function (key) {
224
- registeredToolClasses.push(cornerstoneToolClasses[key]);
225
- measurementData[key] = [];
226
- });
227
- measurementGroups.forEach(function (measurementGroup) {
228
- try {
229
- var _hooks$getToolClass;
230
- var measurementGroupContentSequence = toArray(measurementGroup.ContentSequence);
231
- var TrackingIdentifierGroup = measurementGroupContentSequence.find(function (contentItem) {
232
- return contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER;
233
- });
234
- var TrackingIdentifierValue = TrackingIdentifierGroup.TextValue;
235
- var TrackingUniqueIdentifierGroup = measurementGroupContentSequence.find(function (contentItem) {
236
- return contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_UNIQUE_IDENTIFIER;
237
- });
238
- var TrackingUniqueIdentifierValue = TrackingUniqueIdentifierGroup === null || TrackingUniqueIdentifierGroup === void 0 ? void 0 : TrackingUniqueIdentifierGroup.UID;
239
- var toolClass = (hooks === null || hooks === void 0 || (_hooks$getToolClass = hooks.getToolClass) === null || _hooks$getToolClass === void 0 ? void 0 : _hooks$getToolClass.call(hooks, measurementGroup, dataset, registeredToolClasses)) || registeredToolClasses.find(function (tc) {
240
- return tc.isValidCornerstoneTrackingIdentifier(TrackingIdentifierValue);
241
- });
242
- if (toolClass) {
243
- var measurement = toolClass.getMeasurementData(measurementGroup, sopInstanceUIDToImageIdMap, imageToWorldCoords, metadata);
244
- measurement.TrackingUniqueIdentifier = TrackingUniqueIdentifierValue;
245
- console.log("=== ".concat(toolClass.toolType, " ==="));
246
- console.log(measurement);
247
- measurementData[toolClass.toolType].push(measurement);
248
- }
249
- } catch (e) {
250
- console.warn("Unable to generate tool state for", measurementGroup, e);
203
+ const REPORT = "Imaging Measurements";
204
+ const GROUP = "Measurement Group";
205
+ const TRACKING_IDENTIFIER = "Tracking Identifier";
206
+ const TRACKING_UNIQUE_IDENTIFIER = "Tracking Unique Identifier";
207
+ const imagingMeasurementContent = toArray(dataset.ContentSequence).find(codeMeaningEquals(REPORT));
208
+ const measurementGroups = toArray(imagingMeasurementContent.ContentSequence).filter(codeMeaningEquals(GROUP));
209
+ const measurementData = {};
210
+ measurementGroups.forEach(measurementGroup => {
211
+ try {
212
+ var _hooks$getToolClass;
213
+ const measurementGroupContentSequence = toArray(measurementGroup.ContentSequence);
214
+ const trackingIdentifierGroup = measurementGroupContentSequence.find(contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER);
215
+ const {
216
+ TextValue: trackingIdentifierValue
217
+ } = trackingIdentifierGroup;
218
+ const trackingUniqueIdentifierGroup = measurementGroupContentSequence.find(contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_UNIQUE_IDENTIFIER);
219
+ const trackingUniqueIdentifierValue = trackingUniqueIdentifierGroup === null || trackingUniqueIdentifierGroup === void 0 ? void 0 : trackingUniqueIdentifierGroup.UID;
220
+ const toolAdapter = (hooks === null || hooks === void 0 || (_hooks$getToolClass = hooks.getToolClass) === null || _hooks$getToolClass === void 0 ? void 0 : _hooks$getToolClass.call(hooks, measurementGroup, dataset, this.measurementAdapterByToolType)) || this.getAdapterForTrackingIdentifier(trackingIdentifierValue);
221
+ if (toolAdapter) {
222
+ var _toolAdapter$toolType;
223
+ const measurement = toolAdapter.getMeasurementData(measurementGroup, sopInstanceUIDToImageIdMap, imageToWorldCoords, metadata, trackingIdentifierValue);
224
+ measurement.TrackingUniqueIdentifier = trackingUniqueIdentifierValue;
225
+ console.log("=== ".concat(toolAdapter.toolType, " ==="));
226
+ console.log(measurement);
227
+ measurementData[_toolAdapter$toolType = toolAdapter.toolType] || (measurementData[_toolAdapter$toolType] = []);
228
+ measurementData[toolAdapter.toolType].push(measurement);
251
229
  }
252
- });
253
- return measurementData;
230
+ } catch (e) {
231
+ console.warn("Unable to generate tool state for", measurementGroup, e);
232
+ }
233
+ });
234
+ return measurementData;
235
+ }
236
+ static registerTool(toolAdapter) {
237
+ let replace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
238
+ const registerName = toolAdapter.toolType;
239
+ if (this.measurementAdapterByToolType.has(registerName)) {
240
+ if (!replace) {
241
+ throw new Error("The registered tool name ".concat(registerName, " already exists in adapters, use a different toolType or use replace"));
242
+ }
243
+ if (typeof replace === "function") {
244
+ replace(this.measurementAdapterByToolType.get(registerName));
245
+ }
254
246
  }
255
- }, {
256
- key: "registerTool",
257
- value: function registerTool(toolClass) {
258
- MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[toolClass.utilityToolType] = toolClass;
259
- MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolClass.toolType] = toolClass;
260
- MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] = toolClass.utilityToolType;
247
+ this.measurementAdapterByToolType.set(toolAdapter.toolType, toolAdapter);
248
+ this.measurementAdapterByTrackingIdentifier.set(toolAdapter.trackingIdentifierTextValue, toolAdapter);
249
+ }
250
+ static registerTrackingIdentifier(toolClass) {
251
+ for (var _len = arguments.length, trackingIdentifiers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
252
+ trackingIdentifiers[_key - 1] = arguments[_key];
261
253
  }
262
- }]);
263
- }();
254
+ for (const identifier of trackingIdentifiers) {
255
+ this.measurementAdapterByTrackingIdentifier.set(identifier, toolClass);
256
+ }
257
+ }
258
+ static getAdapterForTrackingIdentifier(trackingIdentifier) {
259
+ const adapter = this.measurementAdapterByTrackingIdentifier.get(trackingIdentifier);
260
+ if (adapter) {
261
+ return adapter;
262
+ }
263
+ for (const adapterTest of [...this.measurementAdapterByToolType.values()]) {
264
+ if (adapterTest.isValidCornerstoneTrackingIdentifier(trackingIdentifier)) {
265
+ this.measurementAdapterByTrackingIdentifier.set(trackingIdentifier, adapterTest);
266
+ return adapterTest;
267
+ }
268
+ }
269
+ }
270
+ }
264
271
  _MeasurementReport = MeasurementReport;
265
272
  _MeasurementReport.CORNERSTONE_3D_TAG = CORNERSTONE_3D_TAG;
266
- _MeasurementReport.MEASUREMENT_BY_TOOLTYPE = {};
267
- _MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {};
268
- _MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {};
269
- _MeasurementReport.generateDerivationSourceDataset = function (instance) {
270
- var _vrMap = {
273
+ _MeasurementReport.measurementAdapterByToolType = new Map();
274
+ _MeasurementReport.measurementAdapterByTrackingIdentifier = new Map();
275
+ _MeasurementReport.codeValueMatch = (group, code, oldCode) => {
276
+ const {
277
+ ConceptNameCodeSequence
278
+ } = group;
279
+ if (!ConceptNameCodeSequence) {
280
+ return;
281
+ }
282
+ const {
283
+ CodingSchemeDesignator,
284
+ CodeValue
285
+ } = ConceptNameCodeSequence;
286
+ return CodingSchemeDesignator == code.CodingSchemeDesignator && CodeValue == code.CodeValue || oldCode && CodingSchemeDesignator == oldCode.CodingSchemeDesignator && CodeValue == oldCode.CodeValue;
287
+ };
288
+ _MeasurementReport.generateDerivationSourceDataset = instance => {
289
+ const _vrMap = {
271
290
  PixelData: "OW"
272
291
  };
273
- var _meta = _MeasurementReport.generateDatasetMeta();
274
- var derivationSourceDataset = _objectSpread2(_objectSpread2({}, instance), {}, {
292
+ const _meta = _MeasurementReport.generateDatasetMeta();
293
+ const derivationSourceDataset = _objectSpread(_objectSpread({}, instance), {}, {
275
294
  _meta: _meta,
276
295
  _vrMap: _vrMap
277
296
  });
@@ -1,10 +1,14 @@
1
1
  import { CornerstonePMAP } from '../../Cornerstone/index.js';
2
2
 
3
- var ParametricMap = CornerstonePMAP.ParametricMap;
4
- var generateToolStateCornerstone = ParametricMap.generateToolState;
3
+ const {
4
+ ParametricMap
5
+ } = CornerstonePMAP;
6
+ const {
7
+ generateToolState: generateToolStateCornerstone
8
+ } = ParametricMap;
5
9
  function generateToolState(imageIds, arrayBuffer, metadataProvider) {
6
- var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
7
- var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
10
+ let skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
11
+ let tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
8
12
  return generateToolStateCornerstone(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
9
13
  }
10
14
 
@@ -1,8 +1,6 @@
1
- declare class PlanarFreehandROI {
2
- static toolType: string;
3
- static utilityToolType: string;
4
- static TID300Representation: any;
5
- static isValidCornerstoneTrackingIdentifier: (TrackingIdentifier: any) => boolean;
1
+ import BaseAdapter3D from "./BaseAdapter3D";
2
+ declare class PlanarFreehandROI extends BaseAdapter3D {
3
+ static closedContourThreshold: number;
6
4
  static getMeasurementData(MeasurementGroup: any, sopInstanceUIDToImageIdMap: any, imageToWorldCoords: any, metadata: any): {
7
5
  description: any;
8
6
  sopInstanceUid: any;