@cornerstonejs/adapters 2.0.0-beta.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +493 -0
- package/dist/esm/adapters/Cornerstone/Angle.d.ts +42 -0
- package/dist/esm/adapters/Cornerstone/Angle.js +93 -0
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.d.ts +49 -0
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +97 -0
- package/dist/esm/adapters/Cornerstone/Bidirectional.d.ts +89 -0
- package/dist/esm/adapters/Cornerstone/Bidirectional.js +170 -0
- package/dist/esm/adapters/Cornerstone/CircleRoi.d.ts +58 -0
- package/dist/esm/adapters/Cornerstone/CircleRoi.js +115 -0
- package/dist/esm/adapters/Cornerstone/CobbAngle.d.ts +49 -0
- package/dist/esm/adapters/Cornerstone/CobbAngle.js +98 -0
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.d.ts +57 -0
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +178 -0
- package/dist/esm/adapters/Cornerstone/FreehandRoi.d.ts +42 -0
- package/dist/esm/adapters/Cornerstone/FreehandRoi.js +89 -0
- package/dist/esm/adapters/Cornerstone/Length.d.ts +39 -0
- package/dist/esm/adapters/Cornerstone/Length.js +82 -0
- package/dist/esm/adapters/Cornerstone/MeasurementReport.d.ts +29 -0
- package/dist/esm/adapters/Cornerstone/MeasurementReport.js +276 -0
- package/dist/esm/adapters/Cornerstone/ParametricMap.d.ts +7 -0
- package/dist/esm/adapters/Cornerstone/ParametricMap.js +210 -0
- package/dist/esm/adapters/Cornerstone/RectangleRoi.d.ts +44 -0
- package/dist/esm/adapters/Cornerstone/RectangleRoi.js +97 -0
- package/dist/esm/adapters/Cornerstone/Segmentation.d.ts +7 -0
- package/dist/esm/adapters/Cornerstone/Segmentation.js +73 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.d.ts +13 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +411 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.d.ts +13 -0
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +1152 -0
- package/dist/esm/adapters/Cornerstone/cornerstone4Tag.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone/cornerstone4Tag.js +3 -0
- package/dist/esm/adapters/Cornerstone/index.d.ts +34 -0
- package/dist/esm/adapters/Cornerstone/index.js +33 -0
- package/dist/esm/adapters/Cornerstone3D/Angle.js +109 -0
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +35 -0
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +123 -0
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +147 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/CircleROI.d.ts +0 -7
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +96 -0
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +113 -0
- package/dist/esm/adapters/Cornerstone3D/CodingScheme.d.ts +9 -0
- package/dist/esm/adapters/Cornerstone3D/CodingScheme.js +15 -0
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +160 -0
- package/dist/esm/adapters/Cornerstone3D/Length.d.ts +41 -0
- package/dist/esm/adapters/Cornerstone3D/Length.js +101 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/MeasurementReport.d.ts +1 -8
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +281 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.d.ts +3 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +11 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.d.ts +1 -0
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/index.js +1 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +0 -2
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +126 -0
- package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +33 -0
- package/dist/esm/adapters/Cornerstone3D/Probe.js +87 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.d.ts +67 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +175 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +6 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.d.ts +13 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.js +22 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.d.ts +6 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.js +10 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.d.ts +4 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.js +9 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.d.ts +11 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +22 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.d.ts +4 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +27 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.d.ts +7 -0
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +12 -0
- package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +94 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.d.ts +0 -6
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +34 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +29 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +9 -0
- package/dist/esm/adapters/Cornerstone3D/Segmentation/index.js +3 -0
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +93 -0
- package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.d.ts +2 -0
- package/dist/esm/adapters/Cornerstone3D/cornerstone3DTag.js +3 -0
- package/dist/{types → esm}/adapters/Cornerstone3D/index.d.ts +18 -6
- package/dist/esm/adapters/Cornerstone3D/index.js +45 -0
- package/dist/esm/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.js +18 -0
- package/dist/esm/adapters/VTKjs/Segmentation.d.ts +3 -0
- package/dist/esm/adapters/VTKjs/Segmentation.js +186 -0
- package/dist/esm/adapters/VTKjs/index.d.ts +5 -0
- package/dist/esm/adapters/VTKjs/index.js +7 -0
- package/dist/{types → esm}/adapters/enums/Events.d.ts +0 -6
- package/dist/esm/adapters/enums/Events.js +7 -0
- package/dist/esm/adapters/enums/index.js +1 -0
- package/dist/esm/adapters/helpers/checkIfPerpendicular.d.ts +1 -0
- package/dist/esm/adapters/helpers/checkIfPerpendicular.js +7 -0
- package/dist/esm/adapters/helpers/checkOrientation.d.ts +1 -0
- package/dist/esm/adapters/helpers/checkOrientation.js +22 -0
- package/dist/esm/adapters/helpers/codeMeaningEquals.d.ts +2 -0
- package/dist/esm/adapters/helpers/codeMeaningEquals.js +7 -0
- package/dist/esm/adapters/helpers/compareArrays.d.ts +1 -0
- package/dist/esm/adapters/helpers/compareArrays.js +16 -0
- package/dist/esm/adapters/helpers/downloadDICOMData.d.ts +5 -0
- package/dist/esm/adapters/helpers/downloadDICOMData.js +26 -0
- package/dist/esm/adapters/helpers/getDatasetsFromImages.d.ts +1 -0
- package/dist/esm/adapters/helpers/getDatasetsFromImages.js +33 -0
- package/dist/esm/adapters/helpers/graphicTypeEquals.d.ts +2 -0
- package/dist/esm/adapters/helpers/graphicTypeEquals.js +7 -0
- package/dist/esm/adapters/helpers/index.js +4 -0
- package/dist/esm/adapters/helpers/toArray.js +5 -0
- package/dist/esm/adapters/index.d.ts +66 -0
- package/dist/esm/adapters/index.js +24 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +5 -0
- package/dist/umd/adapters.umd.js +5769 -0
- package/dist/umd/adapters.umd.js.map +1 -0
- package/package.json +47 -11
- package/dist/adapters.es.js +0 -5623
- package/dist/adapters.es.js.map +0 -1
- package/dist/types/adapters/Cornerstone/index.d.ts +0 -16
- package/dist/types/adapters/Cornerstone3D/RTStruct/RTSS.d.ts +0 -26
- package/dist/types/adapters/Cornerstone3D/Segmentation/generateSegmentation.d.ts +0 -8
- package/dist/types/adapters/Cornerstone3D/Segmentation/generateToolState.d.ts +0 -16
- package/dist/types/adapters/VTKjs/index.d.ts +0 -4
- package/dist/types/adapters/helpers/codeMeaningEquals.d.ts +0 -9
- package/dist/types/adapters/helpers/downloadDICOMData.d.ts +0 -10
- package/dist/types/adapters/helpers/graphicTypeEquals.d.ts +0 -7
- package/dist/types/adapters/index.d.ts +0 -49
- package/dist/types/index.d.ts +0 -2
- /package/dist/{types → esm}/adapters/Cornerstone3D/Angle.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Bidirectional.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/CobbAngle.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/EllipticalROI.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/RTStruct/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/RectangleROI.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/Segmentation/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +0 -0
- /package/dist/{types → esm}/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.d.ts +0 -0
- /package/dist/{types → esm}/adapters/enums/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/helpers/index.d.ts +0 -0
- /package/dist/{types → esm}/adapters/helpers/toArray.d.ts +0 -0
|
@@ -1,34 +1,46 @@
|
|
|
1
1
|
import MeasurementReport from "./MeasurementReport";
|
|
2
|
+
import ArrowAnnotate from "./ArrowAnnotate";
|
|
2
3
|
import Bidirectional from "./Bidirectional";
|
|
3
4
|
import Angle from "./Angle";
|
|
4
5
|
import CobbAngle from "./CobbAngle";
|
|
5
6
|
import CircleROI from "./CircleROI";
|
|
6
7
|
import EllipticalROI from "./EllipticalROI";
|
|
7
8
|
import RectangleROI from "./RectangleROI";
|
|
9
|
+
import Length from "./Length";
|
|
8
10
|
import PlanarFreehandROI from "./PlanarFreehandROI";
|
|
11
|
+
import Probe from "./Probe";
|
|
9
12
|
import UltrasoundDirectional from "./UltrasoundDirectional";
|
|
10
13
|
import * as Segmentation from "./Segmentation";
|
|
14
|
+
import * as ParametricMap from "./ParametricMap";
|
|
11
15
|
import * as RTSS from "./RTStruct";
|
|
12
16
|
declare const Cornerstone3DSR: {
|
|
13
17
|
Bidirectional: typeof Bidirectional;
|
|
14
18
|
CobbAngle: typeof CobbAngle;
|
|
15
19
|
Angle: typeof Angle;
|
|
16
|
-
Length:
|
|
20
|
+
Length: typeof Length;
|
|
17
21
|
CircleROI: typeof CircleROI;
|
|
18
22
|
EllipticalROI: typeof EllipticalROI;
|
|
19
23
|
RectangleROI: typeof RectangleROI;
|
|
20
|
-
ArrowAnnotate:
|
|
21
|
-
Probe:
|
|
24
|
+
ArrowAnnotate: typeof ArrowAnnotate;
|
|
25
|
+
Probe: typeof Probe;
|
|
22
26
|
PlanarFreehandROI: typeof PlanarFreehandROI;
|
|
23
27
|
UltrasoundDirectional: typeof UltrasoundDirectional;
|
|
24
28
|
MeasurementReport: typeof MeasurementReport;
|
|
25
|
-
CodeScheme:
|
|
26
|
-
|
|
29
|
+
CodeScheme: {
|
|
30
|
+
CodingSchemeDesignator: string;
|
|
31
|
+
codeValues: {
|
|
32
|
+
CORNERSTONEFREETEXT: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
CORNERSTONE_3D_TAG: string;
|
|
27
36
|
};
|
|
28
37
|
declare const Cornerstone3DSEG: {
|
|
29
38
|
Segmentation: typeof Segmentation;
|
|
30
39
|
};
|
|
40
|
+
declare const Cornerstone3DPMAP: {
|
|
41
|
+
ParametricMap: typeof ParametricMap;
|
|
42
|
+
};
|
|
31
43
|
declare const Cornerstone3DRT: {
|
|
32
44
|
RTSS: typeof RTSS;
|
|
33
45
|
};
|
|
34
|
-
export { Cornerstone3DSR, Cornerstone3DSEG, Cornerstone3DRT };
|
|
46
|
+
export { Cornerstone3DSR, Cornerstone3DSEG, Cornerstone3DPMAP, Cornerstone3DRT };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import MeasurementReport from './MeasurementReport.js';
|
|
2
|
+
import CodingScheme from './CodingScheme.js';
|
|
3
|
+
import CORNERSTONE_3D_TAG from './cornerstone3DTag.js';
|
|
4
|
+
import ArrowAnnotate from './ArrowAnnotate.js';
|
|
5
|
+
import Bidirectional from './Bidirectional.js';
|
|
6
|
+
import Angle from './Angle.js';
|
|
7
|
+
import CobbAngle from './CobbAngle.js';
|
|
8
|
+
import CircleROI from './CircleROI.js';
|
|
9
|
+
import EllipticalROI from './EllipticalROI.js';
|
|
10
|
+
import RectangleROI from './RectangleROI.js';
|
|
11
|
+
import Length from './Length.js';
|
|
12
|
+
import PlanarFreehandROI from './PlanarFreehandROI.js';
|
|
13
|
+
import Probe from './Probe.js';
|
|
14
|
+
import UltrasoundDirectional from './UltrasoundDirectional.js';
|
|
15
|
+
import * as index from './Segmentation/index.js';
|
|
16
|
+
import * as index$1 from './ParametricMap/index.js';
|
|
17
|
+
import * as index$2 from './RTStruct/index.js';
|
|
18
|
+
|
|
19
|
+
var Cornerstone3DSR = {
|
|
20
|
+
Bidirectional: Bidirectional,
|
|
21
|
+
CobbAngle: CobbAngle,
|
|
22
|
+
Angle: Angle,
|
|
23
|
+
Length: Length,
|
|
24
|
+
CircleROI: CircleROI,
|
|
25
|
+
EllipticalROI: EllipticalROI,
|
|
26
|
+
RectangleROI: RectangleROI,
|
|
27
|
+
ArrowAnnotate: ArrowAnnotate,
|
|
28
|
+
Probe: Probe,
|
|
29
|
+
PlanarFreehandROI: PlanarFreehandROI,
|
|
30
|
+
UltrasoundDirectional: UltrasoundDirectional,
|
|
31
|
+
MeasurementReport: MeasurementReport,
|
|
32
|
+
CodeScheme: CodingScheme,
|
|
33
|
+
CORNERSTONE_3D_TAG: CORNERSTONE_3D_TAG
|
|
34
|
+
};
|
|
35
|
+
var Cornerstone3DSEG = {
|
|
36
|
+
Segmentation: index
|
|
37
|
+
};
|
|
38
|
+
var Cornerstone3DPMAP = {
|
|
39
|
+
ParametricMap: index$1
|
|
40
|
+
};
|
|
41
|
+
var Cornerstone3DRT = {
|
|
42
|
+
RTSS: index$2
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export { Cornerstone3DPMAP, Cornerstone3DRT, Cornerstone3DSEG, Cornerstone3DSR };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { slicedToArray as _slicedToArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import CORNERSTONE_3D_TAG from './cornerstone3DTag.js';
|
|
3
|
+
|
|
4
|
+
function isValidCornerstoneTrackingIdentifier(trackingIdentifier) {
|
|
5
|
+
if (!trackingIdentifier.includes(":")) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
var _trackingIdentifier$s = trackingIdentifier.split(":"),
|
|
9
|
+
_trackingIdentifier$s2 = _slicedToArray(_trackingIdentifier$s, 2),
|
|
10
|
+
cornerstone3DTag = _trackingIdentifier$s2[0],
|
|
11
|
+
toolType = _trackingIdentifier$s2[1];
|
|
12
|
+
if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return toolType.toLowerCase() === this.toolType.toLowerCase();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { isValidCornerstoneTrackingIdentifier as default };
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { createClass as _createClass, classCallCheck as _classCallCheck } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import { data } from 'dcmjs';
|
|
3
|
+
|
|
4
|
+
var Colors = data.Colors,
|
|
5
|
+
BitArray = data.BitArray;
|
|
6
|
+
|
|
7
|
+
// TODO: Is there a better name for this? RGBAInt?
|
|
8
|
+
// Should we move it to Colors.js
|
|
9
|
+
function dicomlab2RGBA(cielab) {
|
|
10
|
+
var rgba = Colors.dicomlab2RGB(cielab).map(function (x) {
|
|
11
|
+
return Math.round(x * 255);
|
|
12
|
+
});
|
|
13
|
+
rgba.push(255);
|
|
14
|
+
return rgba;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// TODO: Copied these functions in from VTK Math so we don't need a dependency.
|
|
18
|
+
// I guess we should put them somewhere
|
|
19
|
+
// https://github.com/Kitware/vtk-js/blob/master/Sources/Common/Core/Math/index.js
|
|
20
|
+
function cross(x, y, out) {
|
|
21
|
+
var Zx = x[1] * y[2] - x[2] * y[1];
|
|
22
|
+
var Zy = x[2] * y[0] - x[0] * y[2];
|
|
23
|
+
var Zz = x[0] * y[1] - x[1] * y[0];
|
|
24
|
+
out[0] = Zx;
|
|
25
|
+
out[1] = Zy;
|
|
26
|
+
out[2] = Zz;
|
|
27
|
+
}
|
|
28
|
+
function norm(x) {
|
|
29
|
+
var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
|
|
30
|
+
switch (n) {
|
|
31
|
+
case 1:
|
|
32
|
+
return Math.abs(x);
|
|
33
|
+
case 2:
|
|
34
|
+
return Math.sqrt(x[0] * x[0] + x[1] * x[1]);
|
|
35
|
+
case 3:
|
|
36
|
+
return Math.sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
|
|
37
|
+
default:
|
|
38
|
+
{
|
|
39
|
+
var sum = 0;
|
|
40
|
+
for (var i = 0; i < n; i++) {
|
|
41
|
+
sum += x[i] * x[i];
|
|
42
|
+
}
|
|
43
|
+
return Math.sqrt(sum);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function normalize(x) {
|
|
48
|
+
var den = norm(x);
|
|
49
|
+
if (den !== 0.0) {
|
|
50
|
+
x[0] /= den;
|
|
51
|
+
x[1] /= den;
|
|
52
|
+
x[2] /= den;
|
|
53
|
+
}
|
|
54
|
+
return den;
|
|
55
|
+
}
|
|
56
|
+
function subtract(a, b, out) {
|
|
57
|
+
out[0] = a[0] - b[0];
|
|
58
|
+
out[1] = a[1] - b[1];
|
|
59
|
+
out[2] = a[2] - b[2];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// TODO: This is a useful utility on its own. We should move it somewhere?
|
|
63
|
+
// dcmjs.adapters.vtk.Multiframe? dcmjs.utils?
|
|
64
|
+
function geometryFromFunctionalGroups(dataset, PerFrameFunctionalGroups) {
|
|
65
|
+
var geometry = {};
|
|
66
|
+
var pixelMeasures = dataset.SharedFunctionalGroupsSequence.PixelMeasuresSequence;
|
|
67
|
+
var planeOrientation = dataset.SharedFunctionalGroupsSequence.PlaneOrientationSequence;
|
|
68
|
+
|
|
69
|
+
// Find the origin of the volume from the PerFrameFunctionalGroups' ImagePositionPatient values
|
|
70
|
+
//
|
|
71
|
+
// TODO: assumes sorted frames. This should read the ImagePositionPatient from each frame and
|
|
72
|
+
// sort them to obtain the first and last position along the acquisition axis.
|
|
73
|
+
var firstFunctionalGroup = PerFrameFunctionalGroups[0];
|
|
74
|
+
var lastFunctionalGroup = PerFrameFunctionalGroups[PerFrameFunctionalGroups.length - 1];
|
|
75
|
+
var firstPosition = firstFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(Number);
|
|
76
|
+
var lastPosition = lastFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(Number);
|
|
77
|
+
geometry.origin = firstPosition;
|
|
78
|
+
|
|
79
|
+
// NB: DICOM PixelSpacing is defined as Row then Column,
|
|
80
|
+
// unlike ImageOrientationPatient
|
|
81
|
+
geometry.spacing = [pixelMeasures.PixelSpacing[1], pixelMeasures.PixelSpacing[0], pixelMeasures.SpacingBetweenSlices].map(Number);
|
|
82
|
+
geometry.dimensions = [dataset.Columns, dataset.Rows, PerFrameFunctionalGroups.length].map(Number);
|
|
83
|
+
var orientation = planeOrientation.ImageOrientationPatient.map(Number);
|
|
84
|
+
var columnStepToPatient = orientation.slice(0, 3);
|
|
85
|
+
var rowStepToPatient = orientation.slice(3, 6);
|
|
86
|
+
geometry.planeNormal = [];
|
|
87
|
+
cross(columnStepToPatient, rowStepToPatient, geometry.planeNormal);
|
|
88
|
+
geometry.sliceStep = [];
|
|
89
|
+
subtract(lastPosition, firstPosition, geometry.sliceStep);
|
|
90
|
+
normalize(geometry.sliceStep);
|
|
91
|
+
geometry.direction = columnStepToPatient.concat(rowStepToPatient).concat(geometry.sliceStep);
|
|
92
|
+
return geometry;
|
|
93
|
+
}
|
|
94
|
+
var Segmentation = /*#__PURE__*/function () {
|
|
95
|
+
function Segmentation() {
|
|
96
|
+
_classCallCheck(this, Segmentation);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Produces an array of Segments from an input DICOM Segmentation dataset
|
|
101
|
+
*
|
|
102
|
+
* Segments are returned with Geometry values that can be used to create
|
|
103
|
+
* VTK Image Data objects.
|
|
104
|
+
*
|
|
105
|
+
* @example Example usage to create VTK Volume actors from each segment:
|
|
106
|
+
*
|
|
107
|
+
* const actors = [];
|
|
108
|
+
* const segments = generateToolState(dataset);
|
|
109
|
+
* segments.forEach(segment => {
|
|
110
|
+
* // now make actors using the segment information
|
|
111
|
+
* const scalarArray = vtk.Common.Core.vtkDataArray.newInstance({
|
|
112
|
+
* name: "Scalars",
|
|
113
|
+
* numberOfComponents: 1,
|
|
114
|
+
* values: segment.pixelData,
|
|
115
|
+
* });
|
|
116
|
+
*
|
|
117
|
+
* const imageData = vtk.Common.DataModel.vtkImageData.newInstance();
|
|
118
|
+
* imageData.getPointData().setScalars(scalarArray);
|
|
119
|
+
* imageData.setDimensions(geometry.dimensions);
|
|
120
|
+
* imageData.setSpacing(geometry.spacing);
|
|
121
|
+
* imageData.setOrigin(geometry.origin);
|
|
122
|
+
* imageData.setDirection(geometry.direction);
|
|
123
|
+
*
|
|
124
|
+
* const mapper = vtk.Rendering.Core.vtkVolumeMapper.newInstance();
|
|
125
|
+
* mapper.setInputData(imageData);
|
|
126
|
+
* mapper.setSampleDistance(2.);
|
|
127
|
+
*
|
|
128
|
+
* const actor = vtk.Rendering.Core.vtkVolume.newInstance();
|
|
129
|
+
* actor.setMapper(mapper);
|
|
130
|
+
*
|
|
131
|
+
* actors.push(actor);
|
|
132
|
+
* });
|
|
133
|
+
*
|
|
134
|
+
* @param dataset
|
|
135
|
+
* @return {{}}
|
|
136
|
+
*/
|
|
137
|
+
return _createClass(Segmentation, null, [{
|
|
138
|
+
key: "generateSegments",
|
|
139
|
+
value: function generateSegments(dataset) {
|
|
140
|
+
if (dataset.SegmentSequence.constructor.name !== "Array") {
|
|
141
|
+
dataset.SegmentSequence = [dataset.SegmentSequence];
|
|
142
|
+
}
|
|
143
|
+
dataset.SegmentSequence.forEach(function (segment) {
|
|
144
|
+
// TODO: other interesting fields could be extracted from the segment
|
|
145
|
+
// TODO: Read SegmentsOverlay field
|
|
146
|
+
// http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.8.20.2.html
|
|
147
|
+
|
|
148
|
+
// TODO: Looks like vtkColor only wants RGB in 0-1 values.
|
|
149
|
+
// Why was this example converting to RGBA with 0-255 values?
|
|
150
|
+
var color = dicomlab2RGBA(segment.RecommendedDisplayCIELabValue);
|
|
151
|
+
segments[segment.SegmentNumber] = {
|
|
152
|
+
color: color,
|
|
153
|
+
functionalGroups: [],
|
|
154
|
+
offset: null,
|
|
155
|
+
size: null,
|
|
156
|
+
pixelData: null
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// make a list of functional groups per segment
|
|
161
|
+
dataset.PerFrameFunctionalGroupsSequence.forEach(function (functionalGroup) {
|
|
162
|
+
var segmentNumber = functionalGroup.SegmentIdentificationSequence.ReferencedSegmentNumber;
|
|
163
|
+
segments[segmentNumber].functionalGroups.push(functionalGroup);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// determine per-segment index into the pixel data
|
|
167
|
+
// TODO: only handles one-bit-per pixel
|
|
168
|
+
var frameSize = Math.ceil(dataset.Rows * dataset.Columns / 8);
|
|
169
|
+
var nextOffset = 0;
|
|
170
|
+
Object.keys(segments).forEach(function (segmentNumber) {
|
|
171
|
+
var segment = segments[segmentNumber];
|
|
172
|
+
segment.numberOfFrames = segment.functionalGroups.length;
|
|
173
|
+
segment.size = segment.numberOfFrames * frameSize;
|
|
174
|
+
segment.offset = nextOffset;
|
|
175
|
+
nextOffset = segment.offset + segment.size;
|
|
176
|
+
var packedSegment = dataset.PixelData.slice(segment.offset, nextOffset);
|
|
177
|
+
segment.pixelData = BitArray.unpack(packedSegment);
|
|
178
|
+
var geometry = geometryFromFunctionalGroups(dataset, segment.functionalGroups);
|
|
179
|
+
segment.geometry = geometry;
|
|
180
|
+
});
|
|
181
|
+
return segments;
|
|
182
|
+
}
|
|
183
|
+
}]);
|
|
184
|
+
}();
|
|
185
|
+
|
|
186
|
+
export { Segmentation as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Events } from './Events.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function checkIfPerpendicular(iop1: number[], iop2: number[], tolerance: number): boolean;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
function checkIfPerpendicular(iop1, iop2, tolerance) {
|
|
2
|
+
var absDotColumnCosines = Math.abs(iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]);
|
|
3
|
+
var absDotRowCosines = Math.abs(iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]);
|
|
4
|
+
return (absDotColumnCosines < tolerance || Math.abs(absDotColumnCosines - 1) < tolerance) && (absDotRowCosines < tolerance || Math.abs(absDotRowCosines - 1) < tolerance);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export { checkIfPerpendicular as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function checkOrientation(multiframe: any, validOrientations: any, sourceDataDimensions: any, tolerance: any): "Planar" | "Perpendicular" | "Oblique";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import checkIfPerpendicular from './checkIfPerpendicular.js';
|
|
2
|
+
import compareArrays from './compareArrays.js';
|
|
3
|
+
|
|
4
|
+
function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
|
|
5
|
+
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
6
|
+
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence;
|
|
7
|
+
var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
|
|
8
|
+
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];
|
|
9
|
+
var iop = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
10
|
+
var inPlane = validOrientations.some(function (operation) {
|
|
11
|
+
return compareArrays(iop, operation, tolerance);
|
|
12
|
+
});
|
|
13
|
+
if (inPlane) {
|
|
14
|
+
return "Planar";
|
|
15
|
+
}
|
|
16
|
+
if (checkIfPerpendicular(iop, validOrientations[0], tolerance) && sourceDataDimensions.includes(multiframe.Rows) && sourceDataDimensions.includes(multiframe.Columns)) {
|
|
17
|
+
return "Perpendicular";
|
|
18
|
+
}
|
|
19
|
+
return "Oblique";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { checkOrientation as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function compareArrays(array1: number[], array2: number[], tolerance: number): boolean;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { utilities } from 'dcmjs';
|
|
2
|
+
|
|
3
|
+
var nearlyEqual = utilities.orientation.nearlyEqual;
|
|
4
|
+
function compareArrays(array1, array2, tolerance) {
|
|
5
|
+
if (array1.length !== array2.length) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
for (var i = 0; i < array1.length; ++i) {
|
|
9
|
+
if (!nearlyEqual(array1[i], array2[i], tolerance)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { compareArrays as default };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { data } from 'dcmjs';
|
|
2
|
+
import { Buffer } from 'buffer';
|
|
3
|
+
|
|
4
|
+
var datasetToDict = data.datasetToDict;
|
|
5
|
+
function downloadDICOMData(bufferOrDataset, filename) {
|
|
6
|
+
var blob;
|
|
7
|
+
if (bufferOrDataset instanceof ArrayBuffer) {
|
|
8
|
+
blob = new Blob([bufferOrDataset], {
|
|
9
|
+
type: "application/dicom"
|
|
10
|
+
});
|
|
11
|
+
} else {
|
|
12
|
+
if (!bufferOrDataset._meta) {
|
|
13
|
+
throw new Error("Dataset must have a _meta property");
|
|
14
|
+
}
|
|
15
|
+
var buffer = Buffer.from(datasetToDict(bufferOrDataset).write());
|
|
16
|
+
blob = new Blob([buffer], {
|
|
17
|
+
type: "application/dicom"
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
var link = document.createElement("a");
|
|
21
|
+
link.href = window.URL.createObjectURL(blob);
|
|
22
|
+
link.download = filename;
|
|
23
|
+
link.click();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { downloadDICOMData };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function getDatasetsFromImages(images: any, isMultiframe: any, options?: any): any;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { data, normalizers } from 'dcmjs';
|
|
2
|
+
|
|
3
|
+
var DicomMessage = data.DicomMessage,
|
|
4
|
+
DicomMetaDictionary = data.DicomMetaDictionary;
|
|
5
|
+
var Normalizer = normalizers.Normalizer;
|
|
6
|
+
function getDatasetsFromImages(images, isMultiframe, options) {
|
|
7
|
+
var datasets = [];
|
|
8
|
+
if (isMultiframe) {
|
|
9
|
+
var image = images[0];
|
|
10
|
+
var arrayBuffer = image.data.byteArray.buffer;
|
|
11
|
+
var dicomData = DicomMessage.readFile(arrayBuffer);
|
|
12
|
+
var dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
|
13
|
+
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
14
|
+
datasets.push(dataset);
|
|
15
|
+
} else {
|
|
16
|
+
for (var i = 0; i < images.length; i++) {
|
|
17
|
+
var _image = images[i];
|
|
18
|
+
var _arrayBuffer = _image.data.byteArray.buffer;
|
|
19
|
+
var _dicomData = DicomMessage.readFile(_arrayBuffer);
|
|
20
|
+
var _dataset = DicomMetaDictionary.naturalizeDataset(_dicomData.dict);
|
|
21
|
+
_dataset._meta = DicomMetaDictionary.namifyDataset(_dicomData.meta);
|
|
22
|
+
datasets.push(_dataset);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (options !== null && options !== void 0 && options.SpecificCharacterSet) {
|
|
26
|
+
datasets.forEach(function (dataset) {
|
|
27
|
+
return dataset.SpecificCharacterSet = options.SpecificCharacterSet;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return Normalizer.normalizeToDataset(datasets);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { getDatasetsFromImages as default };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as Enums from "./enums";
|
|
2
|
+
import * as helpers from "./helpers";
|
|
3
|
+
declare const adaptersSR: {
|
|
4
|
+
Cornerstone: {
|
|
5
|
+
Length: typeof import("./Cornerstone/Length").default;
|
|
6
|
+
FreehandRoi: typeof import("./Cornerstone/FreehandRoi").default;
|
|
7
|
+
Bidirectional: typeof import("./Cornerstone/Bidirectional").default;
|
|
8
|
+
EllipticalRoi: typeof import("./Cornerstone/EllipticalRoi").default;
|
|
9
|
+
CircleRoi: typeof import("./Cornerstone/CircleRoi").default;
|
|
10
|
+
ArrowAnnotate: typeof import("./Cornerstone/ArrowAnnotate").default;
|
|
11
|
+
MeasurementReport: typeof import("./Cornerstone/MeasurementReport").default;
|
|
12
|
+
CobbAngle: typeof import("./Cornerstone/CobbAngle").default;
|
|
13
|
+
Angle: typeof import("./Cornerstone/Angle").default;
|
|
14
|
+
RectangleRoi: typeof import("./Cornerstone/RectangleRoi").default;
|
|
15
|
+
};
|
|
16
|
+
Cornerstone3D: {
|
|
17
|
+
Bidirectional: typeof import("./Cornerstone3D/Bidirectional").default;
|
|
18
|
+
CobbAngle: typeof import("./Cornerstone3D/CobbAngle").default;
|
|
19
|
+
Angle: typeof import("./Cornerstone3D/Angle").default;
|
|
20
|
+
Length: typeof import("./Cornerstone3D/Length").default;
|
|
21
|
+
CircleROI: typeof import("./Cornerstone3D/CircleROI").default;
|
|
22
|
+
EllipticalROI: typeof import("./Cornerstone3D/EllipticalROI").default;
|
|
23
|
+
RectangleROI: typeof import("./Cornerstone3D/RectangleROI").default;
|
|
24
|
+
ArrowAnnotate: typeof import("./Cornerstone3D/ArrowAnnotate").default;
|
|
25
|
+
Probe: typeof import("./Cornerstone3D/Probe").default;
|
|
26
|
+
PlanarFreehandROI: typeof import("./Cornerstone3D/PlanarFreehandROI").default;
|
|
27
|
+
UltrasoundDirectional: typeof import("./Cornerstone3D/UltrasoundDirectional").default;
|
|
28
|
+
MeasurementReport: typeof import("./Cornerstone3D/MeasurementReport").default;
|
|
29
|
+
CodeScheme: {
|
|
30
|
+
CodingSchemeDesignator: string;
|
|
31
|
+
codeValues: {
|
|
32
|
+
CORNERSTONEFREETEXT: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
CORNERSTONE_3D_TAG: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
declare const adaptersSEG: {
|
|
39
|
+
Cornerstone: {
|
|
40
|
+
Segmentation: typeof import("./Cornerstone/Segmentation");
|
|
41
|
+
};
|
|
42
|
+
Cornerstone3D: {
|
|
43
|
+
Segmentation: typeof import("./Cornerstone3D/Segmentation");
|
|
44
|
+
};
|
|
45
|
+
VTKjs: {
|
|
46
|
+
Segmentation: typeof import("./VTKjs/Segmentation").default;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
declare const adaptersPMAP: {
|
|
50
|
+
Cornerstone: {
|
|
51
|
+
ParametricMap: {
|
|
52
|
+
generateToolState: (imageIds: any, arrayBuffer: any, metadataProvider: any, tolerance?: number) => Promise<{
|
|
53
|
+
pixelData: any;
|
|
54
|
+
}>;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
Cornerstone3D: {
|
|
58
|
+
ParametricMap: typeof import("./Cornerstone3D/ParametricMap");
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
declare const adaptersRT: {
|
|
62
|
+
Cornerstone3D: {
|
|
63
|
+
RTSS: typeof import("./Cornerstone3D/RTStruct");
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
export { adaptersSR, adaptersSEG, adaptersPMAP, adaptersRT, Enums, helpers };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CornerstoneSR, CornerstoneSEG, CornerstonePMAP } from './Cornerstone/index.js';
|
|
2
|
+
import { Cornerstone3DSR, Cornerstone3DSEG, Cornerstone3DPMAP, Cornerstone3DRT } from './Cornerstone3D/index.js';
|
|
3
|
+
import { VTKjsSEG } from './VTKjs/index.js';
|
|
4
|
+
import './enums/Events.js';
|
|
5
|
+
import './helpers/downloadDICOMData.js';
|
|
6
|
+
|
|
7
|
+
var adaptersSR = {
|
|
8
|
+
Cornerstone: CornerstoneSR,
|
|
9
|
+
Cornerstone3D: Cornerstone3DSR
|
|
10
|
+
};
|
|
11
|
+
var adaptersSEG = {
|
|
12
|
+
Cornerstone: CornerstoneSEG,
|
|
13
|
+
Cornerstone3D: Cornerstone3DSEG,
|
|
14
|
+
VTKjs: VTKjsSEG
|
|
15
|
+
};
|
|
16
|
+
var adaptersPMAP = {
|
|
17
|
+
Cornerstone: CornerstonePMAP,
|
|
18
|
+
Cornerstone3D: Cornerstone3DPMAP
|
|
19
|
+
};
|
|
20
|
+
var adaptersRT = {
|
|
21
|
+
Cornerstone3D: Cornerstone3DRT
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { adaptersPMAP, adaptersRT, adaptersSEG, adaptersSR };
|