@cornerstonejs/adapters 5.0.0-beta.1 → 5.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/adapters/Cornerstone/Angle.js +23 -16
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +14 -19
- package/dist/esm/adapters/Cornerstone/Bidirectional.js +22 -27
- package/dist/esm/adapters/Cornerstone/CircleRoi.js +21 -27
- package/dist/esm/adapters/Cornerstone/CobbAngle.js +23 -16
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +20 -26
- package/dist/esm/adapters/Cornerstone/FreehandRoi.js +22 -26
- package/dist/esm/adapters/Cornerstone/Length.js +19 -16
- package/dist/esm/adapters/Cornerstone/MeasurementReport.js +20 -40
- package/dist/esm/adapters/Cornerstone/ParametricMap.js +27 -38
- package/dist/esm/adapters/Cornerstone/RectangleRoi.js +27 -26
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +19 -31
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +69 -90
- package/dist/esm/adapters/Cornerstone/index.d.ts +11 -11
- package/dist/esm/adapters/Cornerstone3D/Angle.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Angle.js +19 -26
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +24 -38
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.js +20 -31
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +27 -39
- package/dist/esm/adapters/Cornerstone3D/CircleROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +29 -37
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +27 -30
- package/dist/esm/adapters/Cornerstone3D/ControlPointPolyline.d.ts +5 -0
- package/dist/esm/adapters/Cornerstone3D/ControlPointPolyline.js +85 -0
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +27 -35
- package/dist/esm/adapters/Cornerstone3D/KeyImage.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/KeyImage.js +5 -11
- package/dist/esm/adapters/Cornerstone3D/LabelData.d.ts +3 -1
- package/dist/esm/adapters/Cornerstone3D/LabelData.js +41 -33
- package/dist/esm/adapters/Cornerstone3D/Length.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Length.js +21 -29
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.d.ts +2 -1
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +108 -120
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +2 -6
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +11 -1
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +58 -44
- package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Probe.js +21 -32
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +14 -30
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.d.ts +2 -2
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +7 -13
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +30 -32
- package/dist/esm/adapters/Cornerstone3D/Segmentation/compactMergeSegData.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Segmentation/compactMergeSegData.js +5 -9
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +2 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +6 -16
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +3 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/index.d.ts +4 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.d.ts +2 -2
- package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js +147 -179
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +15 -26
- package/dist/esm/adapters/Cornerstone3D/constants/index.d.ts +10 -0
- package/dist/esm/adapters/Cornerstone3D/constants/index.js +12 -2
- package/dist/esm/adapters/Cornerstone3D/metricHandler.js +57 -24
- package/dist/esm/adapters/Cornerstone3D/unitMapper.d.ts +5 -0
- package/dist/esm/adapters/Cornerstone3D/unitMapper.js +16 -0
- package/dist/esm/adapters/VTKjs/Segmentation.js +2 -4
- package/dist/esm/adapters/VTKjs/index.d.ts +1 -1
- package/dist/esm/adapters/enums/index.d.ts +1 -1
- package/dist/esm/adapters/helpers/checkOrientation.js +5 -7
- package/dist/esm/adapters/helpers/downloadDICOMData.js +1 -3
- package/dist/esm/adapters/helpers/getDatasetsFromImages.js +3 -7
- package/dist/esm/adapters/helpers/index.d.ts +9 -9
- package/dist/esm/adapters/helpers/scoordToWorld.d.ts +1 -1
- package/dist/esm/adapters/helpers/scoordToWorld.js +5 -13
- package/dist/esm/adapters/helpers/toPoint3.d.ts +1 -1
- package/dist/esm/adapters/helpers/toPoint3.js +1 -3
- package/dist/esm/adapters/helpers/toScoordType.d.ts +1 -1
- package/dist/esm/adapters/helpers/toScoordType.js +3 -7
- package/dist/esm/adapters/index.d.ts +4 -4
- package/dist/esm/adapters/index.js +3 -2
- package/dist/esm/utilities/createInstance.js +9 -8
- package/dist/esm/utilities/referencedMetadataProvider.d.ts +3 -4
- package/dist/esm/utilities/referencedMetadataProvider.js +8 -14
- package/dist/esm/version.d.ts +1 -1
- package/package.json +13 -9
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/defineProperty.js +0 -12
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +0 -14
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +0 -9
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/typeof.js +0 -11
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import { COMMENT_CODE, TEXT_ANNOTATION_POSITION } from './constants/index.js';
|
|
2
|
-
import
|
|
2
|
+
import '../helpers/downloadDICOMData.js';
|
|
3
3
|
import { toScoord } from '../helpers/toScoordType.js';
|
|
4
|
-
import '
|
|
4
|
+
import '../helpers/scoordToWorld.js';
|
|
5
|
+
import dcmjs from 'dcmjs';
|
|
5
6
|
|
|
6
|
-
const
|
|
7
|
-
sr
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
},
|
|
11
|
-
adapters: {
|
|
12
|
-
Cornerstone3D
|
|
13
|
-
}
|
|
14
|
-
} = dcmjs;
|
|
7
|
+
const _dcmjs$sr = dcmjs.sr,
|
|
8
|
+
valueTypes = _dcmjs$sr.valueTypes,
|
|
9
|
+
coding = _dcmjs$sr.coding,
|
|
10
|
+
Cornerstone3D = dcmjs.adapters.Cornerstone3D;
|
|
15
11
|
class LabelData {
|
|
16
12
|
constructor(tid300Item, annotation) {
|
|
17
13
|
this.tid300Item = tid300Item;
|
|
@@ -21,10 +17,10 @@ class LabelData {
|
|
|
21
17
|
contentItem() {
|
|
22
18
|
var _handles$textBox;
|
|
23
19
|
const contentEntries = this.tid300Item.contentItem();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
this.fixScoordRelationships(contentEntries);
|
|
21
|
+
const _this$annotation$data = this.annotation.data,
|
|
22
|
+
label = _this$annotation$data.label,
|
|
23
|
+
handles = _this$annotation$data.handles;
|
|
28
24
|
if (label) {
|
|
29
25
|
contentEntries.push(this.createQualitativeLabel(label));
|
|
30
26
|
this.filterCornerstoneFreeText(contentEntries);
|
|
@@ -34,10 +30,26 @@ class LabelData {
|
|
|
34
30
|
}
|
|
35
31
|
return contentEntries;
|
|
36
32
|
}
|
|
33
|
+
fixScoordRelationships(contentEntries) {
|
|
34
|
+
const INFERRED_FROM = valueTypes.RelationshipTypes.INFERRED_FROM;
|
|
35
|
+
for (const entry of contentEntries) {
|
|
36
|
+
const item = entry;
|
|
37
|
+
const contentSeq = item.ContentSequence;
|
|
38
|
+
const children = this.normalizeContentSequence(contentSeq);
|
|
39
|
+
for (const child of children) {
|
|
40
|
+
if ((child.ValueType === 'SCOORD' || child.ValueType === 'SCOORD3D') && (child.RelationshipType === 'CONTAINS' || child.RelationshipType === 'Contains')) {
|
|
41
|
+
child.RelationshipType = INFERRED_FROM;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
normalizeContentSequence(contentSeq) {
|
|
47
|
+
if (!contentSeq) return [];
|
|
48
|
+
if (Array.isArray(contentSeq)) return contentSeq;
|
|
49
|
+
return [contentSeq];
|
|
50
|
+
}
|
|
37
51
|
filterCornerstoneFreeText(contentEntries) {
|
|
38
|
-
const
|
|
39
|
-
codeValues
|
|
40
|
-
} = Cornerstone3D.CodeScheme;
|
|
52
|
+
const codeValues = Cornerstone3D.CodeScheme.codeValues;
|
|
41
53
|
const freeTextCodes = [codeValues.FREE_TEXT_CODE_VALUE, codeValues.CORNERSTONEFREETEXT];
|
|
42
54
|
for (let i = 0; i < contentEntries.length; i++) {
|
|
43
55
|
const group = contentEntries[i];
|
|
@@ -63,22 +75,18 @@ class LabelData {
|
|
|
63
75
|
});
|
|
64
76
|
}
|
|
65
77
|
createQualitativeLabelPosition(annotation) {
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
referencedImageId,
|
|
71
|
-
FrameOfReferenceUID: frameOfReferenceUID
|
|
72
|
-
} = annotation.metadata;
|
|
78
|
+
const textBox = annotation.data.handles.textBox;
|
|
79
|
+
const _annotation$metadata = annotation.metadata,
|
|
80
|
+
referencedImageId = _annotation$metadata.referencedImageId,
|
|
81
|
+
frameOfReferenceUID = _annotation$metadata.FrameOfReferenceUID;
|
|
73
82
|
const is3DMeasurement = !referencedImageId;
|
|
74
|
-
const {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}, textBox.worldPosition);
|
|
83
|
+
const _toScoord = toScoord({
|
|
84
|
+
is3DMeasurement,
|
|
85
|
+
referencedImageId
|
|
86
|
+
}, textBox.worldPosition),
|
|
87
|
+
x = _toScoord.x,
|
|
88
|
+
y = _toScoord.y,
|
|
89
|
+
z = _toScoord.z;
|
|
82
90
|
const graphicType = valueTypes.GraphicTypes.POINT;
|
|
83
91
|
const relationshipType = valueTypes.RelationshipTypes.CONTAINS;
|
|
84
92
|
const name = new coding.CodedConcept(TEXT_ANNOTATION_POSITION);
|
|
@@ -1,26 +1,24 @@
|
|
|
1
|
-
import _defineProperty from '
|
|
1
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
2
|
import { utilities } from 'dcmjs';
|
|
3
3
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
4
|
import BaseAdapter3D from './BaseAdapter3D.js';
|
|
5
|
+
import '../helpers/downloadDICOMData.js';
|
|
5
6
|
import { toScoord } from '../helpers/toScoordType.js';
|
|
6
|
-
import '
|
|
7
|
+
import '../helpers/scoordToWorld.js';
|
|
7
8
|
|
|
8
9
|
var _Length;
|
|
9
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; }
|
|
10
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; }
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
} = utilities.TID300;
|
|
14
|
-
const LENGTH = "Length";
|
|
12
|
+
const TID300Length = utilities.TID300.Length;
|
|
13
|
+
const LENGTH = 'Length';
|
|
15
14
|
class Length extends BaseAdapter3D {
|
|
16
15
|
static getMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata) {
|
|
17
|
-
const
|
|
18
|
-
state,
|
|
19
|
-
NUMGroup,
|
|
20
|
-
worldCoords,
|
|
21
|
-
referencedImageId,
|
|
22
|
-
ReferencedFrameNumber
|
|
23
|
-
} = MeasurementReport.getSetupMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, this.toolType);
|
|
16
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, this.toolType),
|
|
17
|
+
state = _MeasurementReport$ge.state,
|
|
18
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
19
|
+
worldCoords = _MeasurementReport$ge.worldCoords,
|
|
20
|
+
referencedImageId = _MeasurementReport$ge.referencedImageId,
|
|
21
|
+
ReferencedFrameNumber = _MeasurementReport$ge.ReferencedFrameNumber;
|
|
24
22
|
const cachedStats = referencedImageId ? {
|
|
25
23
|
["imageId:".concat(referencedImageId)]: {
|
|
26
24
|
length: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0,
|
|
@@ -39,28 +37,22 @@ class Length extends BaseAdapter3D {
|
|
|
39
37
|
}
|
|
40
38
|
static getTID300RepresentationArguments(tool) {
|
|
41
39
|
let is3DMeasurement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
handles
|
|
51
|
-
} = data;
|
|
52
|
-
const {
|
|
53
|
-
referencedImageId
|
|
54
|
-
} = metadata;
|
|
40
|
+
const data = tool.data,
|
|
41
|
+
finding = tool.finding,
|
|
42
|
+
findingSites = tool.findingSites,
|
|
43
|
+
metadata = tool.metadata;
|
|
44
|
+
const _data$cachedStats = data.cachedStats,
|
|
45
|
+
cachedStats = _data$cachedStats === void 0 ? {} : _data$cachedStats,
|
|
46
|
+
handles = data.handles;
|
|
47
|
+
const referencedImageId = metadata.referencedImageId;
|
|
55
48
|
const scoordProps = {
|
|
56
49
|
is3DMeasurement,
|
|
57
50
|
referencedImageId
|
|
58
51
|
};
|
|
59
52
|
const point1 = toScoord(scoordProps, handles.points[0]);
|
|
60
53
|
const point2 = toScoord(scoordProps, handles.points[1]);
|
|
61
|
-
const {
|
|
62
|
-
length
|
|
63
|
-
} = cachedStats["imageId:".concat(referencedImageId)] || {};
|
|
54
|
+
const _ref = cachedStats["imageId:".concat(referencedImageId)] || {},
|
|
55
|
+
distance = _ref.length;
|
|
64
56
|
return {
|
|
65
57
|
point1,
|
|
66
58
|
point2,
|
|
@@ -148,7 +148,7 @@ export default class MeasurementReport {
|
|
|
148
148
|
metadata: any;
|
|
149
149
|
toolType: any;
|
|
150
150
|
}): SpatialCoordinatesData;
|
|
151
|
-
static processSpatialCoordinatesGroup({ NUMGroup, sopInstanceUIDToImageIdMap, metadata, findingGroup, findingSiteGroups, commentGroup, commentPositionGroup, toolType, }: {
|
|
151
|
+
static processSpatialCoordinatesGroup({ NUMGroup, sopInstanceUIDToImageIdMap, metadata, findingGroup, findingSiteGroups, commentGroup, commentPositionGroup, controlPointsGroup, toolType, }: {
|
|
152
152
|
NUMGroup: any;
|
|
153
153
|
sopInstanceUIDToImageIdMap: any;
|
|
154
154
|
metadata: any;
|
|
@@ -156,6 +156,7 @@ export default class MeasurementReport {
|
|
|
156
156
|
findingSiteGroups: any;
|
|
157
157
|
commentGroup: any;
|
|
158
158
|
commentPositionGroup: any;
|
|
159
|
+
controlPointsGroup: any;
|
|
159
160
|
toolType: any;
|
|
160
161
|
}): {
|
|
161
162
|
defaultState: SpatialCoordinatesState;
|
|
@@ -1,40 +1,30 @@
|
|
|
1
|
-
import _defineProperty from '
|
|
2
|
-
import { utilities
|
|
3
|
-
import { utilities, cache
|
|
1
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
|
+
import { utilities, derivations, normalizers, data } from 'dcmjs';
|
|
3
|
+
import { Enums, utilities as utilities$1, cache } from '@cornerstonejs/core';
|
|
4
4
|
import CORNERSTONE_3D_TAG from './cornerstone3DTag.js';
|
|
5
5
|
import { toArray } from '../helpers/toArray.js';
|
|
6
6
|
import { codeMeaningEquals } from '../helpers/codeMeaningEquals.js';
|
|
7
|
+
import '../helpers/downloadDICOMData.js';
|
|
7
8
|
import { copyStudyTags } from '../helpers/copyStudyTags.js';
|
|
8
9
|
import { copySeriesTags } from '../helpers/copySeriesTags.js';
|
|
10
|
+
import '../helpers/toScoordType.js';
|
|
9
11
|
import { scoordToWorld } from '../helpers/scoordToWorld.js';
|
|
10
12
|
import { toPoint3 } from '../helpers/toPoint3.js';
|
|
11
13
|
import CodingScheme from './CodingScheme.js';
|
|
12
|
-
import { COMMENT_CODE, TEXT_ANNOTATION_POSITION, metaSRAnnotation, NO_IMAGE_ID } from './constants/index.js';
|
|
14
|
+
import { COMMENT_CODE, TEXT_ANNOTATION_POSITION, metaSRAnnotation, NO_IMAGE_ID, CONTROL_POINTS_CODE } from './constants/index.js';
|
|
13
15
|
import LabelData from './LabelData.js';
|
|
14
16
|
|
|
15
17
|
var _MeasurementReport;
|
|
16
18
|
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; }
|
|
17
19
|
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; }
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
StructuredReport
|
|
27
|
-
} = derivations;
|
|
28
|
-
const {
|
|
29
|
-
Normalizer
|
|
30
|
-
} = normalizers;
|
|
31
|
-
const {
|
|
32
|
-
TID1500MeasurementReport,
|
|
33
|
-
TID1501MeasurementGroup
|
|
34
|
-
} = TID1500;
|
|
35
|
-
const {
|
|
36
|
-
DicomMetaDictionary
|
|
37
|
-
} = data;
|
|
20
|
+
const MetadataModules = Enums.MetadataModules;
|
|
21
|
+
const TID1500 = utilities.TID1500,
|
|
22
|
+
addAccessors = utilities.addAccessors;
|
|
23
|
+
const StructuredReport = derivations.StructuredReport;
|
|
24
|
+
const Normalizer = normalizers.Normalizer;
|
|
25
|
+
const TID1500MeasurementReport = TID1500.TID1500MeasurementReport,
|
|
26
|
+
TID1501MeasurementGroup = TID1500.TID1501MeasurementGroup;
|
|
27
|
+
const DicomMetaDictionary = data.DicomMetaDictionary;
|
|
38
28
|
const FINDING = {
|
|
39
29
|
CodingSchemeDesignator: 'DCM',
|
|
40
30
|
CodeValue: '121071'
|
|
@@ -47,6 +37,10 @@ const COMMENT_POSITION = {
|
|
|
47
37
|
CodingSchemeDesignator: TEXT_ANNOTATION_POSITION.schemeDesignator,
|
|
48
38
|
CodeValue: TEXT_ANNOTATION_POSITION.value
|
|
49
39
|
};
|
|
40
|
+
const CONTROL_POINTS = {
|
|
41
|
+
CodingSchemeDesignator: CONTROL_POINTS_CODE.schemeDesignator,
|
|
42
|
+
CodeValue: CONTROL_POINTS_CODE.value
|
|
43
|
+
};
|
|
50
44
|
const FINDING_SITE = {
|
|
51
45
|
CodingSchemeDesignator: 'SCT',
|
|
52
46
|
CodeValue: '363698007'
|
|
@@ -55,6 +49,14 @@ const FINDING_SITE_OLD = {
|
|
|
55
49
|
CodingSchemeDesignator: 'SRT',
|
|
56
50
|
CodeValue: 'G-C0E3'
|
|
57
51
|
};
|
|
52
|
+
function isSecondaryScoordGroup(group) {
|
|
53
|
+
if (group.ValueType !== 'SCOORD' && group.ValueType !== 'SCOORD3D') {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const conceptNameCodeSequence = group.ConceptNameCodeSequence;
|
|
57
|
+
const conceptCode = Array.isArray(conceptNameCodeSequence) ? conceptNameCodeSequence[0] : conceptNameCodeSequence;
|
|
58
|
+
return !!conceptCode && conceptCode.CodingSchemeDesignator === CONTROL_POINTS.CodingSchemeDesignator && conceptCode.CodeValue === CONTROL_POINTS.CodeValue;
|
|
59
|
+
}
|
|
58
60
|
class MeasurementReport {
|
|
59
61
|
static getTID300ContentItem(tool, ReferencedSOPSequence, toolClass, is3DMeasurement) {
|
|
60
62
|
const args = toolClass.getTID300RepresentationArguments(tool, is3DMeasurement);
|
|
@@ -78,11 +80,10 @@ class MeasurementReport {
|
|
|
78
80
|
return new TID1501MeasurementGroup(Measurements);
|
|
79
81
|
}
|
|
80
82
|
static getCornerstoneLabelFromDefaultState(defaultState) {
|
|
81
|
-
const
|
|
82
|
-
findingSites = [],
|
|
83
|
-
finding,
|
|
84
|
-
commentGroup
|
|
85
|
-
} = defaultState;
|
|
83
|
+
const _defaultState$finding = defaultState.findingSites,
|
|
84
|
+
findingSites = _defaultState$finding === void 0 ? [] : _defaultState$finding,
|
|
85
|
+
finding = defaultState.finding,
|
|
86
|
+
commentGroup = defaultState.commentGroup;
|
|
86
87
|
if (commentGroup !== null && commentGroup !== void 0 && commentGroup.TextValue) {
|
|
87
88
|
return commentGroup.TextValue;
|
|
88
89
|
}
|
|
@@ -99,19 +100,14 @@ class MeasurementReport {
|
|
|
99
100
|
return metaSRAnnotation;
|
|
100
101
|
}
|
|
101
102
|
static processSCOORDGroup(_ref) {
|
|
102
|
-
let
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
} = SCOORDGroup.ContentSequence;
|
|
111
|
-
const {
|
|
112
|
-
ReferencedSOPInstanceUID,
|
|
113
|
-
ReferencedFrameNumber = 1
|
|
114
|
-
} = ReferencedSOPSequence;
|
|
103
|
+
let SCOORDGroup = _ref.SCOORDGroup,
|
|
104
|
+
toolType = _ref.toolType,
|
|
105
|
+
sopInstanceUIDToImageIdMap = _ref.sopInstanceUIDToImageIdMap,
|
|
106
|
+
metadata = _ref.metadata;
|
|
107
|
+
const ReferencedSOPSequence = SCOORDGroup.ContentSequence.ReferencedSOPSequence;
|
|
108
|
+
const ReferencedSOPInstanceUID = ReferencedSOPSequence.ReferencedSOPInstanceUID,
|
|
109
|
+
_ReferencedSOPSequenc = ReferencedSOPSequence.ReferencedFrameNumber,
|
|
110
|
+
ReferencedFrameNumber = _ReferencedSOPSequenc === void 0 ? 1 : _ReferencedSOPSequenc;
|
|
115
111
|
const referencedImageId = sopInstanceUIDToImageIdMap["".concat(ReferencedSOPInstanceUID, ":").concat(ReferencedFrameNumber)];
|
|
116
112
|
const imagePlaneModule = metadata.get('imagePlaneModule', referencedImageId);
|
|
117
113
|
const annotationUID = DicomMetaDictionary.uid();
|
|
@@ -146,10 +142,8 @@ class MeasurementReport {
|
|
|
146
142
|
};
|
|
147
143
|
}
|
|
148
144
|
static processSCOORD3DGroup(_ref2) {
|
|
149
|
-
let
|
|
150
|
-
|
|
151
|
-
toolType
|
|
152
|
-
} = _ref2;
|
|
145
|
+
let SCOORD3DGroup = _ref2.SCOORD3DGroup,
|
|
146
|
+
toolType = _ref2.toolType;
|
|
153
147
|
const annotationUID = DicomMetaDictionary.uid();
|
|
154
148
|
const toolData = {
|
|
155
149
|
SCOORD3DGroup,
|
|
@@ -175,19 +169,18 @@ class MeasurementReport {
|
|
|
175
169
|
}
|
|
176
170
|
}
|
|
177
171
|
};
|
|
178
|
-
utilities.updatePlaneRestriction(toPoint3(SCOORD3DGroup.GraphicData), toolData.state.annotation.metadata);
|
|
172
|
+
utilities$1.updatePlaneRestriction(toPoint3(SCOORD3DGroup.GraphicData), toolData.state.annotation.metadata);
|
|
179
173
|
return toolData;
|
|
180
174
|
}
|
|
181
175
|
static getSpatialCoordinatesState(_ref3) {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
sopInstanceUIDToImageIdMap,
|
|
185
|
-
metadata,
|
|
186
|
-
toolType
|
|
187
|
-
} = _ref3;
|
|
176
|
+
var _contentSequenceArr$f, _contentSequenceArr$f2;
|
|
177
|
+
let NUMGroup = _ref3.NUMGroup,
|
|
178
|
+
sopInstanceUIDToImageIdMap = _ref3.sopInstanceUIDToImageIdMap,
|
|
179
|
+
metadata = _ref3.metadata,
|
|
180
|
+
toolType = _ref3.toolType;
|
|
188
181
|
const contentSequenceArr = toArray(NUMGroup.ContentSequence);
|
|
189
|
-
const SCOORDGroup = contentSequenceArr.find(group => group.ValueType === 'SCOORD');
|
|
190
|
-
const SCOORD3DGroup = contentSequenceArr.find(group => group.ValueType === 'SCOORD3D');
|
|
182
|
+
const SCOORDGroup = (_contentSequenceArr$f = contentSequenceArr.find(group => group.ValueType === 'SCOORD' && !isSecondaryScoordGroup(group))) !== null && _contentSequenceArr$f !== void 0 ? _contentSequenceArr$f : contentSequenceArr.find(group => group.ValueType === 'SCOORD');
|
|
183
|
+
const SCOORD3DGroup = (_contentSequenceArr$f2 = contentSequenceArr.find(group => group.ValueType === 'SCOORD3D' && !isSecondaryScoordGroup(group))) !== null && _contentSequenceArr$f2 !== void 0 ? _contentSequenceArr$f2 : contentSequenceArr.find(group => group.ValueType === 'SCOORD3D');
|
|
191
184
|
const result = SCOORD3DGroup && this.processSCOORD3DGroup({
|
|
192
185
|
SCOORD3DGroup,
|
|
193
186
|
toolType
|
|
@@ -203,32 +196,30 @@ class MeasurementReport {
|
|
|
203
196
|
return result;
|
|
204
197
|
}
|
|
205
198
|
static processSpatialCoordinatesGroup(_ref4) {
|
|
206
|
-
let
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
toolType
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
toolType
|
|
231
|
-
});
|
|
199
|
+
let NUMGroup = _ref4.NUMGroup,
|
|
200
|
+
sopInstanceUIDToImageIdMap = _ref4.sopInstanceUIDToImageIdMap,
|
|
201
|
+
metadata = _ref4.metadata,
|
|
202
|
+
findingGroup = _ref4.findingGroup,
|
|
203
|
+
findingSiteGroups = _ref4.findingSiteGroups,
|
|
204
|
+
commentGroup = _ref4.commentGroup,
|
|
205
|
+
commentPositionGroup = _ref4.commentPositionGroup,
|
|
206
|
+
controlPointsGroup = _ref4.controlPointsGroup,
|
|
207
|
+
toolType = _ref4.toolType;
|
|
208
|
+
const _this$getSpatialCoord = this.getSpatialCoordinatesState({
|
|
209
|
+
NUMGroup,
|
|
210
|
+
sopInstanceUIDToImageIdMap,
|
|
211
|
+
metadata,
|
|
212
|
+
toolType
|
|
213
|
+
}),
|
|
214
|
+
state = _this$getSpatialCoord.state,
|
|
215
|
+
SCOORDGroup = _this$getSpatialCoord.SCOORDGroup,
|
|
216
|
+
ReferencedSOPSequence = _this$getSpatialCoord.ReferencedSOPSequence,
|
|
217
|
+
ReferencedSOPInstanceUID = _this$getSpatialCoord.ReferencedSOPInstanceUID,
|
|
218
|
+
ReferencedFrameNumber = _this$getSpatialCoord.ReferencedFrameNumber,
|
|
219
|
+
SCOORD3DGroup = _this$getSpatialCoord.SCOORD3DGroup,
|
|
220
|
+
FrameOfReferenceUID = _this$getSpatialCoord.FrameOfReferenceUID,
|
|
221
|
+
referencedImageId = _this$getSpatialCoord.referencedImageId,
|
|
222
|
+
textBoxPosition = _this$getSpatialCoord.textBoxPosition;
|
|
232
223
|
const finding = findingGroup ? addAccessors(findingGroup.ConceptCodeSequence) : undefined;
|
|
233
224
|
const findingSites = findingSiteGroups.map(fsg => {
|
|
234
225
|
return addAccessors(fsg.ConceptCodeSequence);
|
|
@@ -244,6 +235,13 @@ class MeasurementReport {
|
|
|
244
235
|
worldPosition: textBoxCoords[0]
|
|
245
236
|
};
|
|
246
237
|
}
|
|
238
|
+
if (controlPointsGroup) {
|
|
239
|
+
const controlPoints = scoordToWorld({
|
|
240
|
+
is3DMeasurement: !referencedImageId,
|
|
241
|
+
referencedImageId
|
|
242
|
+
}, controlPointsGroup);
|
|
243
|
+
state.annotation.data.handles.points = controlPoints;
|
|
244
|
+
}
|
|
247
245
|
state.finding = finding;
|
|
248
246
|
state.findingSites = findingSites;
|
|
249
247
|
state.commentGroup = commentGroup;
|
|
@@ -268,15 +266,18 @@ class MeasurementReport {
|
|
|
268
266
|
};
|
|
269
267
|
}
|
|
270
268
|
static getSetupMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, toolType) {
|
|
271
|
-
const
|
|
272
|
-
ContentSequence
|
|
273
|
-
} = MeasurementGroup;
|
|
269
|
+
const ContentSequence = MeasurementGroup.ContentSequence;
|
|
274
270
|
const contentSequenceArr = toArray(ContentSequence);
|
|
275
271
|
const findingGroup = contentSequenceArr.find(group => this.codeValueMatch(group, FINDING));
|
|
276
272
|
const commentGroup = contentSequenceArr.find(group => this.codeValueMatch(group, COMMENT));
|
|
277
273
|
const commentPositionGroup = contentSequenceArr.find(group => this.codeValueMatch(group, COMMENT_POSITION));
|
|
274
|
+
let controlPointsGroup = contentSequenceArr.find(group => this.codeValueMatch(group, CONTROL_POINTS));
|
|
275
|
+
const NUMGroupForLookup = contentSequenceArr.find(group => group.ValueType === 'NUM');
|
|
276
|
+
if (!controlPointsGroup && NUMGroupForLookup !== null && NUMGroupForLookup !== void 0 && NUMGroupForLookup.ContentSequence) {
|
|
277
|
+
controlPointsGroup = toArray(NUMGroupForLookup.ContentSequence).find(item => this.codeValueMatch(item, CONTROL_POINTS));
|
|
278
|
+
}
|
|
278
279
|
const findingSiteGroups = contentSequenceArr.filter(group => this.codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)) || [];
|
|
279
|
-
const NUMGroup =
|
|
280
|
+
const NUMGroup = NUMGroupForLookup || {
|
|
280
281
|
ContentSequence: contentSequenceArr.filter(group => group.ValueType === 'SCOORD' || group.ValueType === 'SCOORD3D')
|
|
281
282
|
};
|
|
282
283
|
const spatialGroup = this.processSpatialCoordinatesGroup({
|
|
@@ -287,11 +288,10 @@ class MeasurementReport {
|
|
|
287
288
|
findingSiteGroups,
|
|
288
289
|
commentGroup,
|
|
289
290
|
commentPositionGroup,
|
|
291
|
+
controlPointsGroup,
|
|
290
292
|
toolType
|
|
291
293
|
});
|
|
292
|
-
const
|
|
293
|
-
referencedImageId
|
|
294
|
-
} = spatialGroup.state.annotation.metadata;
|
|
294
|
+
const referencedImageId = spatialGroup.state.annotation.metadata.referencedImageId;
|
|
295
295
|
const is3DMeasurement = !!spatialGroup.SCOORD3DGroup;
|
|
296
296
|
const scoordArgs = {
|
|
297
297
|
referencedImageId,
|
|
@@ -307,27 +307,21 @@ class MeasurementReport {
|
|
|
307
307
|
});
|
|
308
308
|
}
|
|
309
309
|
static generateReferencedSOPSequence(_ref5) {
|
|
310
|
-
let
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
derivationSourceDatasets
|
|
317
|
-
} = _ref5;
|
|
310
|
+
let toolData = _ref5.toolData,
|
|
311
|
+
toolTypes = _ref5.toolTypes,
|
|
312
|
+
metadataProvider = _ref5.metadataProvider,
|
|
313
|
+
imageId = _ref5.imageId,
|
|
314
|
+
sopInstanceUIDsToSeriesInstanceUIDMap = _ref5.sopInstanceUIDsToSeriesInstanceUIDMap,
|
|
315
|
+
derivationSourceDatasets = _ref5.derivationSourceDatasets;
|
|
318
316
|
const effectiveImageId = imageId === NO_IMAGE_ID ? this.getImageIdFromVolume({
|
|
319
317
|
toolData,
|
|
320
318
|
toolTypes
|
|
321
319
|
}) : imageId;
|
|
322
320
|
const sopCommonModule = metadataProvider.get('sopCommonModule', effectiveImageId);
|
|
323
321
|
const instance = metadataProvider.get('instance', effectiveImageId);
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
} = sopCommonModule;
|
|
328
|
-
const {
|
|
329
|
-
SeriesInstanceUID: seriesInstanceUID
|
|
330
|
-
} = instance;
|
|
322
|
+
const sopInstanceUID = sopCommonModule.sopInstanceUID,
|
|
323
|
+
sopClassUID = sopCommonModule.sopClassUID;
|
|
324
|
+
const seriesInstanceUID = instance.SeriesInstanceUID;
|
|
331
325
|
sopInstanceUIDsToSeriesInstanceUIDMap[sopInstanceUID] = seriesInstanceUID;
|
|
332
326
|
if (!derivationSourceDatasets.find(dsd => dsd.SeriesInstanceUID === seriesInstanceUID)) {
|
|
333
327
|
const derivationSourceDataset = MeasurementReport.generateDerivationSourceDataset(instance);
|
|
@@ -346,10 +340,8 @@ class MeasurementReport {
|
|
|
346
340
|
}
|
|
347
341
|
static getImageIdFromVolume(_ref6) {
|
|
348
342
|
var _toolData$toolTypes$, _referenceToolData$me;
|
|
349
|
-
let
|
|
350
|
-
|
|
351
|
-
toolTypes
|
|
352
|
-
} = _ref6;
|
|
343
|
+
let toolData = _ref6.toolData,
|
|
344
|
+
toolTypes = _ref6.toolTypes;
|
|
353
345
|
const referenceToolData = toolData === null || toolData === void 0 || (_toolData$toolTypes$ = toolData[toolTypes === null || toolTypes === void 0 ? void 0 : toolTypes[0]]) === null || _toolData$toolTypes$ === void 0 || (_toolData$toolTypes$ = _toolData$toolTypes$.data) === null || _toolData$toolTypes$ === void 0 ? void 0 : _toolData$toolTypes$[0];
|
|
354
346
|
const volumeId = referenceToolData === null || referenceToolData === void 0 || (_referenceToolData$me = referenceToolData.metadata) === null || _referenceToolData$me === void 0 ? void 0 : _referenceToolData$me.volumeId;
|
|
355
347
|
const volume = cache.getVolume(volumeId);
|
|
@@ -420,9 +412,7 @@ class MeasurementReport {
|
|
|
420
412
|
const GROUP = 'Measurement Group';
|
|
421
413
|
const TRACKING_IDENTIFIER = 'Tracking Identifier';
|
|
422
414
|
const TRACKING_UNIQUE_IDENTIFIER = 'Tracking Unique Identifier';
|
|
423
|
-
const
|
|
424
|
-
imageId: predecessorImageId
|
|
425
|
-
} = dataset;
|
|
415
|
+
const predecessorImageId = dataset.imageId;
|
|
426
416
|
const imagingMeasurementContent = toArray(dataset.ContentSequence).find(codeMeaningEquals(REPORT));
|
|
427
417
|
const measurementGroups = toArray(imagingMeasurementContent.ContentSequence).filter(codeMeaningEquals(GROUP));
|
|
428
418
|
const measurementData = {};
|
|
@@ -431,9 +421,7 @@ class MeasurementReport {
|
|
|
431
421
|
var _hooks$getToolClass;
|
|
432
422
|
const measurementGroupContentSequence = toArray(measurementGroup.ContentSequence);
|
|
433
423
|
const trackingIdentifierGroup = measurementGroupContentSequence.find(contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER);
|
|
434
|
-
const
|
|
435
|
-
TextValue: trackingIdentifierValue
|
|
436
|
-
} = trackingIdentifierGroup;
|
|
424
|
+
const trackingIdentifierValue = trackingIdentifierGroup.TextValue;
|
|
437
425
|
const trackingUniqueIdentifierGroup = measurementGroupContentSequence.find(contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_UNIQUE_IDENTIFIER);
|
|
438
426
|
const trackingUniqueIdentifierValue = trackingUniqueIdentifierGroup === null || trackingUniqueIdentifierGroup === void 0 ? void 0 : trackingUniqueIdentifierGroup.UID;
|
|
439
427
|
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) || this.getAdapterForCodeType(measurementGroup);
|
|
@@ -523,16 +511,16 @@ _MeasurementReport.measurementAdapterByToolType = new Map();
|
|
|
523
511
|
_MeasurementReport.measurementAdaptersByType = new Map();
|
|
524
512
|
_MeasurementReport.measurementAdapterByTrackingIdentifier = new Map();
|
|
525
513
|
_MeasurementReport.codeValueMatch = (group, code, oldCode) => {
|
|
526
|
-
const
|
|
527
|
-
ConceptNameCodeSequence
|
|
528
|
-
} = group;
|
|
514
|
+
const ConceptNameCodeSequence = group.ConceptNameCodeSequence;
|
|
529
515
|
if (!ConceptNameCodeSequence) {
|
|
530
516
|
return;
|
|
531
517
|
}
|
|
532
|
-
const
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
}
|
|
518
|
+
const seq = Array.isArray(ConceptNameCodeSequence) ? ConceptNameCodeSequence[0] : ConceptNameCodeSequence;
|
|
519
|
+
if (!seq) {
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
const CodingSchemeDesignator = seq.CodingSchemeDesignator,
|
|
523
|
+
CodeValue = seq.CodeValue;
|
|
536
524
|
return CodingSchemeDesignator == code.CodingSchemeDesignator && CodeValue == code.CodeValue || oldCode && CodingSchemeDesignator == oldCode.CodingSchemeDesignator && CodeValue == oldCode.CodeValue;
|
|
537
525
|
};
|
|
538
526
|
_MeasurementReport.generateDerivationSourceDataset = instance => {
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { CornerstonePMAP } from '../../Cornerstone/index.js';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
} = CornerstonePMAP;
|
|
6
|
-
const {
|
|
7
|
-
generateToolState: generateToolStateCornerstone
|
|
8
|
-
} = ParametricMap;
|
|
3
|
+
const ParametricMap = CornerstonePMAP.ParametricMap;
|
|
4
|
+
const generateToolStateCornerstone = ParametricMap.generateToolState;
|
|
9
5
|
function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
10
6
|
let skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
11
7
|
let tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import BaseAdapter3D from
|
|
1
|
+
import BaseAdapter3D from './BaseAdapter3D';
|
|
2
2
|
declare class PlanarFreehandROI extends BaseAdapter3D {
|
|
3
3
|
static closedContourThreshold: number;
|
|
4
4
|
static getMeasurementData(MeasurementGroup: any, sopInstanceUIDToImageIdMap: any, metadata: any): {
|
|
@@ -20,6 +20,15 @@ declare class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
20
20
|
y: number;
|
|
21
21
|
z?: undefined;
|
|
22
22
|
})[];
|
|
23
|
+
controlPoints: ({
|
|
24
|
+
x: any;
|
|
25
|
+
y: any;
|
|
26
|
+
z: any;
|
|
27
|
+
} | {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
z?: undefined;
|
|
31
|
+
})[];
|
|
23
32
|
area: any;
|
|
24
33
|
areaUnit: any;
|
|
25
34
|
perimeter: any;
|
|
@@ -27,6 +36,7 @@ declare class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
27
36
|
mean: any;
|
|
28
37
|
max: any;
|
|
29
38
|
stdDev: any;
|
|
39
|
+
splineType: any;
|
|
30
40
|
trackingIdentifierTextValue: string;
|
|
31
41
|
finding: any;
|
|
32
42
|
findingSites: any;
|