@cornerstonejs/adapters 4.19.0 → 4.19.2
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/Cornerstone3D/ControlPointPolyline.d.ts +5 -0
- package/dist/esm/adapters/Cornerstone3D/ControlPointPolyline.js +92 -0
- package/dist/esm/adapters/Cornerstone3D/LabelData.d.ts +3 -1
- package/dist/esm/adapters/Cornerstone3D/LabelData.js +19 -0
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.d.ts +2 -1
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +36 -5
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +11 -1
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +32 -9
- package/dist/esm/adapters/Cornerstone3D/constants/index.d.ts +10 -0
- package/dist/esm/adapters/Cornerstone3D/constants/index.js +11 -1
- package/dist/esm/version.d.ts +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { utilities, sr } from 'dcmjs';
|
|
2
|
+
import { CONTROL_POINTS_CODE, SPLINE_TYPE_CODE } from './constants/index.js';
|
|
3
|
+
|
|
4
|
+
const {
|
|
5
|
+
valueTypes
|
|
6
|
+
} = sr;
|
|
7
|
+
const {
|
|
8
|
+
Polyline: TID300Polyline
|
|
9
|
+
} = utilities.TID300;
|
|
10
|
+
class ControlPointPolyline extends TID300Polyline {
|
|
11
|
+
contentItem() {
|
|
12
|
+
const contentEntries = super.contentItem();
|
|
13
|
+
const self = this;
|
|
14
|
+
const {
|
|
15
|
+
controlPoints,
|
|
16
|
+
use3DSpatialCoordinates,
|
|
17
|
+
ReferencedSOPSequence,
|
|
18
|
+
ReferencedFrameOfReferenceUID,
|
|
19
|
+
use3DSpatialCoordinates: is3DMeasurement
|
|
20
|
+
} = self.props;
|
|
21
|
+
if (!(controlPoints !== null && controlPoints !== void 0 && controlPoints.length)) {
|
|
22
|
+
return contentEntries;
|
|
23
|
+
}
|
|
24
|
+
const GraphicData = self.flattenPoints({
|
|
25
|
+
points: controlPoints,
|
|
26
|
+
use3DSpatialCoordinates
|
|
27
|
+
});
|
|
28
|
+
const GraphicType = valueTypes.GraphicTypes.MULTIPOINT;
|
|
29
|
+
const scoordPlain = is3DMeasurement ? {
|
|
30
|
+
RelationshipType: valueTypes.RelationshipTypes.CONTAINS,
|
|
31
|
+
ValueType: 'SCOORD3D',
|
|
32
|
+
ConceptNameCodeSequence: [{
|
|
33
|
+
CodeValue: CONTROL_POINTS_CODE.value,
|
|
34
|
+
CodingSchemeDesignator: CONTROL_POINTS_CODE.schemeDesignator,
|
|
35
|
+
CodeMeaning: CONTROL_POINTS_CODE.meaning
|
|
36
|
+
}],
|
|
37
|
+
GraphicType,
|
|
38
|
+
GraphicData,
|
|
39
|
+
ReferencedFrameOfReferenceUID,
|
|
40
|
+
ContentSequence: [{
|
|
41
|
+
RelationshipType: valueTypes.RelationshipTypes.SELECTED_FROM,
|
|
42
|
+
ValueType: valueTypes.ValueTypes.IMAGE,
|
|
43
|
+
ReferencedSOPSequence
|
|
44
|
+
}]
|
|
45
|
+
} : {
|
|
46
|
+
RelationshipType: valueTypes.RelationshipTypes.CONTAINS,
|
|
47
|
+
ValueType: 'SCOORD',
|
|
48
|
+
ConceptNameCodeSequence: [{
|
|
49
|
+
CodeValue: CONTROL_POINTS_CODE.value,
|
|
50
|
+
CodingSchemeDesignator: CONTROL_POINTS_CODE.schemeDesignator,
|
|
51
|
+
CodeMeaning: CONTROL_POINTS_CODE.meaning
|
|
52
|
+
}],
|
|
53
|
+
GraphicType,
|
|
54
|
+
GraphicData,
|
|
55
|
+
ContentSequence: [{
|
|
56
|
+
RelationshipType: valueTypes.RelationshipTypes.SELECTED_FROM,
|
|
57
|
+
ValueType: valueTypes.ValueTypes.IMAGE,
|
|
58
|
+
ReferencedSOPSequence
|
|
59
|
+
}]
|
|
60
|
+
};
|
|
61
|
+
const {
|
|
62
|
+
splineType
|
|
63
|
+
} = self.props;
|
|
64
|
+
const entries = contentEntries;
|
|
65
|
+
const numEntry = entries.find(e => e.ValueType === 'NUM');
|
|
66
|
+
if (numEntry) {
|
|
67
|
+
const inner = numEntry.ContentSequence;
|
|
68
|
+
const innerArray = Array.isArray(inner) ? inner : inner ? [inner] : [];
|
|
69
|
+
numEntry.ContentSequence = [...innerArray, scoordPlain];
|
|
70
|
+
} else {
|
|
71
|
+
entries.push(scoordPlain);
|
|
72
|
+
}
|
|
73
|
+
if (splineType) {
|
|
74
|
+
const splineTypeObsContext = {
|
|
75
|
+
RelationshipType: valueTypes.RelationshipTypes.HAS_OBS_CONTEXT,
|
|
76
|
+
ValueType: 'TEXT',
|
|
77
|
+
ConceptNameCodeSequence: {
|
|
78
|
+
CodeValue: SPLINE_TYPE_CODE.value,
|
|
79
|
+
CodingSchemeDesignator: SPLINE_TYPE_CODE.schemeDesignator,
|
|
80
|
+
CodeMeaning: SPLINE_TYPE_CODE.meaning
|
|
81
|
+
},
|
|
82
|
+
TextValue: splineType
|
|
83
|
+
};
|
|
84
|
+
const hasObsContextIndex = entries.findIndex(e => e.RelationshipType === valueTypes.RelationshipTypes.HAS_OBS_CONTEXT);
|
|
85
|
+
const insertIndex = hasObsContextIndex >= 0 ? hasObsContextIndex + 2 : 2;
|
|
86
|
+
entries.splice(insertIndex, 0, splineTypeObsContext);
|
|
87
|
+
}
|
|
88
|
+
return entries;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export { ControlPointPolyline as default };
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import type { Types } from
|
|
1
|
+
import type { Types } from '@cornerstonejs/tools';
|
|
2
2
|
export default class LabelData {
|
|
3
3
|
protected tid300Item: any;
|
|
4
4
|
protected annotation: Types.Annotation;
|
|
5
5
|
ReferencedSOPSequence: any;
|
|
6
6
|
constructor(tid300Item: any, annotation: Types.Annotation);
|
|
7
7
|
contentItem(): any;
|
|
8
|
+
protected fixScoordRelationships(contentEntries: unknown[]): void;
|
|
9
|
+
protected normalizeContentSequence(contentSeq: unknown): Array<Record<string, unknown>>;
|
|
8
10
|
filterCornerstoneFreeText(contentEntries: any): void;
|
|
9
11
|
createQualitativeLabel(label: string): any;
|
|
10
12
|
createQualitativeLabelPosition(annotation: Types.Annotation): any;
|
|
@@ -21,6 +21,7 @@ class LabelData {
|
|
|
21
21
|
contentItem() {
|
|
22
22
|
var _handles$textBox;
|
|
23
23
|
const contentEntries = this.tid300Item.contentItem();
|
|
24
|
+
this.fixScoordRelationships(contentEntries);
|
|
24
25
|
const {
|
|
25
26
|
label,
|
|
26
27
|
handles
|
|
@@ -34,6 +35,24 @@ class LabelData {
|
|
|
34
35
|
}
|
|
35
36
|
return contentEntries;
|
|
36
37
|
}
|
|
38
|
+
fixScoordRelationships(contentEntries) {
|
|
39
|
+
const INFERRED_FROM = valueTypes.RelationshipTypes.INFERRED_FROM;
|
|
40
|
+
for (const entry of contentEntries) {
|
|
41
|
+
const item = entry;
|
|
42
|
+
const contentSeq = item.ContentSequence;
|
|
43
|
+
const children = this.normalizeContentSequence(contentSeq);
|
|
44
|
+
for (const child of children) {
|
|
45
|
+
if ((child.ValueType === 'SCOORD' || child.ValueType === 'SCOORD3D') && (child.RelationshipType === 'CONTAINS' || child.RelationshipType === 'Contains')) {
|
|
46
|
+
child.RelationshipType = INFERRED_FROM;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
normalizeContentSequence(contentSeq) {
|
|
52
|
+
if (!contentSeq) return [];
|
|
53
|
+
if (Array.isArray(contentSeq)) return contentSeq;
|
|
54
|
+
return [contentSeq];
|
|
55
|
+
}
|
|
37
56
|
filterCornerstoneFreeText(contentEntries) {
|
|
38
57
|
const {
|
|
39
58
|
codeValues
|
|
@@ -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;
|
|
@@ -9,7 +9,7 @@ import { copySeriesTags } from '../helpers/copySeriesTags.js';
|
|
|
9
9
|
import { scoordToWorld } from '../helpers/scoordToWorld.js';
|
|
10
10
|
import { toPoint3 } from '../helpers/toPoint3.js';
|
|
11
11
|
import CodingScheme from './CodingScheme.js';
|
|
12
|
-
import { COMMENT_CODE, TEXT_ANNOTATION_POSITION, metaSRAnnotation, NO_IMAGE_ID } from './constants/index.js';
|
|
12
|
+
import { COMMENT_CODE, TEXT_ANNOTATION_POSITION, metaSRAnnotation, NO_IMAGE_ID, CONTROL_POINTS_CODE } from './constants/index.js';
|
|
13
13
|
import LabelData from './LabelData.js';
|
|
14
14
|
|
|
15
15
|
var _MeasurementReport;
|
|
@@ -47,6 +47,10 @@ const COMMENT_POSITION = {
|
|
|
47
47
|
CodingSchemeDesignator: TEXT_ANNOTATION_POSITION.schemeDesignator,
|
|
48
48
|
CodeValue: TEXT_ANNOTATION_POSITION.value
|
|
49
49
|
};
|
|
50
|
+
const CONTROL_POINTS = {
|
|
51
|
+
CodingSchemeDesignator: CONTROL_POINTS_CODE.schemeDesignator,
|
|
52
|
+
CodeValue: CONTROL_POINTS_CODE.value
|
|
53
|
+
};
|
|
50
54
|
const FINDING_SITE = {
|
|
51
55
|
CodingSchemeDesignator: 'SCT',
|
|
52
56
|
CodeValue: '363698007'
|
|
@@ -55,6 +59,14 @@ const FINDING_SITE_OLD = {
|
|
|
55
59
|
CodingSchemeDesignator: 'SRT',
|
|
56
60
|
CodeValue: 'G-C0E3'
|
|
57
61
|
};
|
|
62
|
+
function isSecondaryScoordGroup(group) {
|
|
63
|
+
if (group.ValueType !== 'SCOORD' && group.ValueType !== 'SCOORD3D') {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const conceptNameCodeSequence = group.ConceptNameCodeSequence;
|
|
67
|
+
const conceptCode = Array.isArray(conceptNameCodeSequence) ? conceptNameCodeSequence[0] : conceptNameCodeSequence;
|
|
68
|
+
return !!conceptCode && conceptCode.CodingSchemeDesignator === CONTROL_POINTS.CodingSchemeDesignator && conceptCode.CodeValue === CONTROL_POINTS.CodeValue;
|
|
69
|
+
}
|
|
58
70
|
class MeasurementReport {
|
|
59
71
|
static getTID300ContentItem(tool, ReferencedSOPSequence, toolClass, is3DMeasurement) {
|
|
60
72
|
const args = toolClass.getTID300RepresentationArguments(tool, is3DMeasurement);
|
|
@@ -179,6 +191,7 @@ class MeasurementReport {
|
|
|
179
191
|
return toolData;
|
|
180
192
|
}
|
|
181
193
|
static getSpatialCoordinatesState(_ref3) {
|
|
194
|
+
var _contentSequenceArr$f, _contentSequenceArr$f2;
|
|
182
195
|
let {
|
|
183
196
|
NUMGroup,
|
|
184
197
|
sopInstanceUIDToImageIdMap,
|
|
@@ -186,8 +199,8 @@ class MeasurementReport {
|
|
|
186
199
|
toolType
|
|
187
200
|
} = _ref3;
|
|
188
201
|
const contentSequenceArr = toArray(NUMGroup.ContentSequence);
|
|
189
|
-
const SCOORDGroup = contentSequenceArr.find(group => group.ValueType === 'SCOORD');
|
|
190
|
-
const SCOORD3DGroup = contentSequenceArr.find(group => group.ValueType === 'SCOORD3D');
|
|
202
|
+
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');
|
|
203
|
+
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
204
|
const result = SCOORD3DGroup && this.processSCOORD3DGroup({
|
|
192
205
|
SCOORD3DGroup,
|
|
193
206
|
toolType
|
|
@@ -211,6 +224,7 @@ class MeasurementReport {
|
|
|
211
224
|
findingSiteGroups,
|
|
212
225
|
commentGroup,
|
|
213
226
|
commentPositionGroup,
|
|
227
|
+
controlPointsGroup,
|
|
214
228
|
toolType
|
|
215
229
|
} = _ref4;
|
|
216
230
|
const {
|
|
@@ -244,6 +258,13 @@ class MeasurementReport {
|
|
|
244
258
|
worldPosition: textBoxCoords[0]
|
|
245
259
|
};
|
|
246
260
|
}
|
|
261
|
+
if (controlPointsGroup) {
|
|
262
|
+
const controlPoints = scoordToWorld({
|
|
263
|
+
is3DMeasurement: !referencedImageId,
|
|
264
|
+
referencedImageId
|
|
265
|
+
}, controlPointsGroup);
|
|
266
|
+
state.annotation.data.handles.points = controlPoints;
|
|
267
|
+
}
|
|
247
268
|
state.finding = finding;
|
|
248
269
|
state.findingSites = findingSites;
|
|
249
270
|
state.commentGroup = commentGroup;
|
|
@@ -275,8 +296,13 @@ class MeasurementReport {
|
|
|
275
296
|
const findingGroup = contentSequenceArr.find(group => this.codeValueMatch(group, FINDING));
|
|
276
297
|
const commentGroup = contentSequenceArr.find(group => this.codeValueMatch(group, COMMENT));
|
|
277
298
|
const commentPositionGroup = contentSequenceArr.find(group => this.codeValueMatch(group, COMMENT_POSITION));
|
|
299
|
+
let controlPointsGroup = contentSequenceArr.find(group => this.codeValueMatch(group, CONTROL_POINTS));
|
|
300
|
+
const NUMGroupForLookup = contentSequenceArr.find(group => group.ValueType === 'NUM');
|
|
301
|
+
if (!controlPointsGroup && NUMGroupForLookup !== null && NUMGroupForLookup !== void 0 && NUMGroupForLookup.ContentSequence) {
|
|
302
|
+
controlPointsGroup = toArray(NUMGroupForLookup.ContentSequence).find(item => this.codeValueMatch(item, CONTROL_POINTS));
|
|
303
|
+
}
|
|
278
304
|
const findingSiteGroups = contentSequenceArr.filter(group => this.codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)) || [];
|
|
279
|
-
const NUMGroup =
|
|
305
|
+
const NUMGroup = NUMGroupForLookup || {
|
|
280
306
|
ContentSequence: contentSequenceArr.filter(group => group.ValueType === 'SCOORD' || group.ValueType === 'SCOORD3D')
|
|
281
307
|
};
|
|
282
308
|
const spatialGroup = this.processSpatialCoordinatesGroup({
|
|
@@ -287,6 +313,7 @@ class MeasurementReport {
|
|
|
287
313
|
findingSiteGroups,
|
|
288
314
|
commentGroup,
|
|
289
315
|
commentPositionGroup,
|
|
316
|
+
controlPointsGroup,
|
|
290
317
|
toolType
|
|
291
318
|
});
|
|
292
319
|
const {
|
|
@@ -529,10 +556,14 @@ _MeasurementReport.codeValueMatch = (group, code, oldCode) => {
|
|
|
529
556
|
if (!ConceptNameCodeSequence) {
|
|
530
557
|
return;
|
|
531
558
|
}
|
|
559
|
+
const seq = Array.isArray(ConceptNameCodeSequence) ? ConceptNameCodeSequence[0] : ConceptNameCodeSequence;
|
|
560
|
+
if (!seq) {
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
532
563
|
const {
|
|
533
564
|
CodingSchemeDesignator,
|
|
534
565
|
CodeValue
|
|
535
|
-
} =
|
|
566
|
+
} = seq;
|
|
536
567
|
return CodingSchemeDesignator == code.CodingSchemeDesignator && CodeValue == code.CodeValue || oldCode && CodingSchemeDesignator == oldCode.CodingSchemeDesignator && CodeValue == oldCode.CodeValue;
|
|
537
568
|
};
|
|
538
569
|
_MeasurementReport.generateDerivationSourceDataset = instance => {
|
|
@@ -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;
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import _defineProperty from '../../node_modules/@babel/runtime/helpers/esm/defineProperty.js';
|
|
2
2
|
import MeasurementReport from './MeasurementReport.js';
|
|
3
|
-
import { utilities } from 'dcmjs';
|
|
4
3
|
import { vec3 } from 'gl-matrix';
|
|
5
4
|
import BaseAdapter3D from './BaseAdapter3D.js';
|
|
5
|
+
import { extractAllNUMGroups, restoreAdditionalMetrics } from './metricHandler.js';
|
|
6
|
+
import { toArray } from '../helpers/toArray.js';
|
|
7
|
+
import 'dcmjs';
|
|
6
8
|
import { toScoords } from '../helpers/toScoordType.js';
|
|
7
9
|
import '@cornerstonejs/core';
|
|
8
|
-
import
|
|
10
|
+
import ControlPointPolyline from './ControlPointPolyline.js';
|
|
11
|
+
import { SPLINE_TYPE_CODE } from './constants/index.js';
|
|
9
12
|
|
|
10
13
|
var _PlanarFreehandROI;
|
|
11
14
|
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; }
|
|
12
15
|
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; }
|
|
13
|
-
const {
|
|
14
|
-
Polyline: TID300Polyline
|
|
15
|
-
} = utilities.TID300;
|
|
16
16
|
class PlanarFreehandROI extends BaseAdapter3D {
|
|
17
17
|
static getMeasurementData(MeasurementGroup, sopInstanceUIDToImageIdMap, metadata) {
|
|
18
|
+
var _state$annotation$dat, _state$annotation$dat2, _numSeq$find;
|
|
18
19
|
const {
|
|
19
20
|
state,
|
|
20
21
|
NUMGroup,
|
|
@@ -28,13 +29,20 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
28
29
|
worldCoords.pop();
|
|
29
30
|
isOpenContour = false;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
if (isOpenContour) {
|
|
33
|
-
points
|
|
32
|
+
let points = (_state$annotation$dat = (_state$annotation$dat2 = state.annotation.data.handles) === null || _state$annotation$dat2 === void 0 ? void 0 : _state$annotation$dat2.points) !== null && _state$annotation$dat !== void 0 ? _state$annotation$dat : [];
|
|
33
|
+
if (isOpenContour && points.length === 0) {
|
|
34
|
+
points = [worldCoords[0], worldCoords[worldCoords.length - 1]];
|
|
34
35
|
}
|
|
35
36
|
const referencedSOPInstanceUID = state.sopInstanceUid;
|
|
36
37
|
const allNUMGroups = extractAllNUMGroups(MeasurementGroup, referencedSOPInstanceUID);
|
|
37
38
|
const measurementNUMGroups = allNUMGroups[referencedSOPInstanceUID] || {};
|
|
39
|
+
const SPLINE_TYPE = {
|
|
40
|
+
CodingSchemeDesignator: SPLINE_TYPE_CODE.schemeDesignator,
|
|
41
|
+
CodeValue: SPLINE_TYPE_CODE.value
|
|
42
|
+
};
|
|
43
|
+
const numSeq = NUMGroup ? toArray(NUMGroup.ContentSequence) : [];
|
|
44
|
+
const mgContentSeq = toArray(MeasurementGroup.ContentSequence);
|
|
45
|
+
const splineTypeItem = (_numSeq$find = numSeq.find(item => MeasurementReport.codeValueMatch(item, SPLINE_TYPE))) !== null && _numSeq$find !== void 0 ? _numSeq$find : mgContentSeq.find(item => MeasurementReport.codeValueMatch(item, SPLINE_TYPE));
|
|
38
46
|
state.annotation.data = _objectSpread(_objectSpread({}, state.annotation.data), {}, {
|
|
39
47
|
contour: {
|
|
40
48
|
polyline: worldCoords,
|
|
@@ -44,6 +52,10 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
44
52
|
points
|
|
45
53
|
}),
|
|
46
54
|
frameNumber: ReferencedFrameNumber
|
|
55
|
+
}, splineTypeItem && {
|
|
56
|
+
spline: {
|
|
57
|
+
type: splineTypeItem.TextValue
|
|
58
|
+
}
|
|
47
59
|
});
|
|
48
60
|
if (referencedImageId) {
|
|
49
61
|
state.annotation.data.cachedStats = {
|
|
@@ -55,6 +67,7 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
55
67
|
return state;
|
|
56
68
|
}
|
|
57
69
|
static getTID300RepresentationArguments(tool) {
|
|
70
|
+
var _handles$points, _data$spline;
|
|
58
71
|
let is3DMeasurement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
59
72
|
const {
|
|
60
73
|
data,
|
|
@@ -62,6 +75,9 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
62
75
|
findingSites,
|
|
63
76
|
metadata
|
|
64
77
|
} = tool;
|
|
78
|
+
const {
|
|
79
|
+
handles
|
|
80
|
+
} = data;
|
|
65
81
|
const {
|
|
66
82
|
polyline,
|
|
67
83
|
closed
|
|
@@ -79,6 +95,7 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
79
95
|
const firstPoint = points[0];
|
|
80
96
|
points.push(firstPoint);
|
|
81
97
|
}
|
|
98
|
+
const controlPoints = (handles === null || handles === void 0 || (_handles$points = handles.points) === null || _handles$points === void 0 ? void 0 : _handles$points.length) && toScoords(scoordProps, handles.points);
|
|
82
99
|
const {
|
|
83
100
|
area,
|
|
84
101
|
areaUnit,
|
|
@@ -91,6 +108,7 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
91
108
|
} = data.cachedStats["imageId:".concat(referencedImageId)] || {};
|
|
92
109
|
return {
|
|
93
110
|
points,
|
|
111
|
+
controlPoints,
|
|
94
112
|
area,
|
|
95
113
|
areaUnit,
|
|
96
114
|
perimeter: perimeter !== null && perimeter !== void 0 ? perimeter : length,
|
|
@@ -98,6 +116,7 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
98
116
|
mean,
|
|
99
117
|
max,
|
|
100
118
|
stdDev,
|
|
119
|
+
splineType: (_data$spline = data.spline) === null || _data$spline === void 0 ? void 0 : _data$spline.type,
|
|
101
120
|
trackingIdentifierTextValue: this.trackingIdentifierTextValue,
|
|
102
121
|
finding,
|
|
103
122
|
findingSites: findingSites || [],
|
|
@@ -108,6 +127,10 @@ class PlanarFreehandROI extends BaseAdapter3D {
|
|
|
108
127
|
}
|
|
109
128
|
_PlanarFreehandROI = PlanarFreehandROI;
|
|
110
129
|
_PlanarFreehandROI.closedContourThreshold = 1e-5;
|
|
111
|
-
|
|
130
|
+
(() => {
|
|
131
|
+
_PlanarFreehandROI.init('PlanarFreehandROI', ControlPointPolyline);
|
|
132
|
+
_PlanarFreehandROI.registerSubType(_PlanarFreehandROI, 'LivewireContour');
|
|
133
|
+
_PlanarFreehandROI.registerSubType(_PlanarFreehandROI, 'SplineROI');
|
|
134
|
+
})();
|
|
112
135
|
|
|
113
136
|
export { PlanarFreehandROI as default };
|
|
@@ -5,6 +5,16 @@ export declare const TEXT_ANNOTATION_POSITION: {
|
|
|
5
5
|
meaning: string;
|
|
6
6
|
value: string;
|
|
7
7
|
};
|
|
8
|
+
export declare const CONTROL_POINTS_CODE: {
|
|
9
|
+
schemeDesignator: string;
|
|
10
|
+
meaning: string;
|
|
11
|
+
value: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const SPLINE_TYPE_CODE: {
|
|
14
|
+
schemeDesignator: string;
|
|
15
|
+
meaning: string;
|
|
16
|
+
value: string;
|
|
17
|
+
};
|
|
8
18
|
export declare const COMMENT_CODE: {
|
|
9
19
|
schemeDesignator: string;
|
|
10
20
|
meaning: string;
|
|
@@ -9,6 +9,16 @@ const TEXT_ANNOTATION_POSITION = {
|
|
|
9
9
|
meaning: 'Text Annotation Position',
|
|
10
10
|
value: 'TextPosition'
|
|
11
11
|
};
|
|
12
|
+
const CONTROL_POINTS_CODE = {
|
|
13
|
+
schemeDesignator: CS3D_DESIGNATOR,
|
|
14
|
+
meaning: 'Control Points',
|
|
15
|
+
value: 'ControlPoints'
|
|
16
|
+
};
|
|
17
|
+
const SPLINE_TYPE_CODE = {
|
|
18
|
+
schemeDesignator: CS3D_DESIGNATOR,
|
|
19
|
+
meaning: 'Spline Type',
|
|
20
|
+
value: 'SplineType'
|
|
21
|
+
};
|
|
12
22
|
const COMMENT_CODE = {
|
|
13
23
|
schemeDesignator: 'DCM',
|
|
14
24
|
meaning: 'Comment',
|
|
@@ -47,4 +57,4 @@ const metaRTSSContour = _objectSpread(_objectSpread({}, metaSRAnnotation), {}, {
|
|
|
47
57
|
}
|
|
48
58
|
});
|
|
49
59
|
|
|
50
|
-
export { COMMENT_CODE, CS3D_DESIGNATOR, ImplementationClassRtssContours, ImplementationClassUidSRAnnotation, NO_IMAGE_ID, TEXT_ANNOTATION_POSITION, fileMetaInformationVersionArray1, fileMetaInformationVersionArray2, metaRTSSContour, metaSRAnnotation };
|
|
60
|
+
export { COMMENT_CODE, CONTROL_POINTS_CODE, CS3D_DESIGNATOR, ImplementationClassRtssContours, ImplementationClassUidSRAnnotation, NO_IMAGE_ID, SPLINE_TYPE_CODE, TEXT_ANNOTATION_POSITION, fileMetaInformationVersionArray1, fileMetaInformationVersionArray2, metaRTSSContour, metaSRAnnotation };
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "4.19.
|
|
1
|
+
export declare const version = "4.19.2";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/adapters",
|
|
3
|
-
"version": "4.19.
|
|
3
|
+
"version": "4.19.2",
|
|
4
4
|
"description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/esm/index.d.ts",
|
|
@@ -89,8 +89,8 @@
|
|
|
89
89
|
"ndarray": "1.0.19"
|
|
90
90
|
},
|
|
91
91
|
"peerDependencies": {
|
|
92
|
-
"@cornerstonejs/core": "4.19.
|
|
93
|
-
"@cornerstonejs/tools": "4.19.
|
|
92
|
+
"@cornerstonejs/core": "4.19.2",
|
|
93
|
+
"@cornerstonejs/tools": "4.19.2"
|
|
94
94
|
},
|
|
95
|
-
"gitHead": "
|
|
95
|
+
"gitHead": "24fbe17243ee637b75910de981b8d839c2c063b8"
|
|
96
96
|
}
|