@cornerstonejs/adapters 0.2.0 → 0.3.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.
Files changed (44) hide show
  1. package/dist/@cornerstonejs/adapters.es.js +3472 -28871
  2. package/dist/@cornerstonejs/adapters.es.js.map +1 -1
  3. package/dist/@cornerstonejs/dts/adapters/Cornerstone3D/Angle.d.ts +44 -0
  4. package/dist/@cornerstonejs/dts/adapters/Cornerstone3D/Bidirectional.d.ts +49 -0
  5. package/dist/@cornerstonejs/dts/adapters/Cornerstone3D/CobbAngle.d.ts +44 -0
  6. package/dist/@cornerstonejs/dts/adapters/Cornerstone3D/MeasurementReport.d.ts +53 -0
  7. package/dist/@cornerstonejs/dts/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +30 -0
  8. package/dist/@cornerstonejs/dts/adapters/Cornerstone3D/RectangleROI.d.ts +30 -0
  9. package/dist/@cornerstonejs/dts/adapters/Cornerstone3D/index.d.ts +21 -0
  10. package/dist/@cornerstonejs/dts/index.d.ts +3 -0
  11. package/package.json +10 -35
  12. package/src/{index.js → index.ts} +0 -0
  13. package/dist/@cornerstonejs/adapters.js +0 -30195
  14. package/dist/@cornerstonejs/adapters.js.map +0 -1
  15. package/src/adapters/Cornerstone/Angle.js +0 -92
  16. package/src/adapters/Cornerstone/ArrowAnnotate.js +0 -106
  17. package/src/adapters/Cornerstone/Bidirectional.js +0 -187
  18. package/src/adapters/Cornerstone/CircleRoi.js +0 -109
  19. package/src/adapters/Cornerstone/CobbAngle.js +0 -96
  20. package/src/adapters/Cornerstone/EllipticalRoi.js +0 -149
  21. package/src/adapters/Cornerstone/FreehandRoi.js +0 -82
  22. package/src/adapters/Cornerstone/Length.js +0 -80
  23. package/src/adapters/Cornerstone/MeasurementReport.js +0 -352
  24. package/src/adapters/Cornerstone/RectangleRoi.js +0 -92
  25. package/src/adapters/Cornerstone/Segmentation.js +0 -118
  26. package/src/adapters/Cornerstone/Segmentation_3X.js +0 -632
  27. package/src/adapters/Cornerstone/Segmentation_4X.js +0 -1543
  28. package/src/adapters/Cornerstone/cornerstone4Tag.js +0 -1
  29. package/src/adapters/Cornerstone/index.js +0 -27
  30. package/src/adapters/Cornerstone3D/ArrowAnnotate.js +0 -155
  31. package/src/adapters/Cornerstone3D/Bidirectional.js +0 -196
  32. package/src/adapters/Cornerstone3D/CobbAngle.js +0 -125
  33. package/src/adapters/Cornerstone3D/CodingScheme.js +0 -16
  34. package/src/adapters/Cornerstone3D/EllipticalROI.js +0 -204
  35. package/src/adapters/Cornerstone3D/Length.js +0 -113
  36. package/src/adapters/Cornerstone3D/MeasurementReport.js +0 -445
  37. package/src/adapters/Cornerstone3D/PlanarFreehandROI.js +0 -137
  38. package/src/adapters/Cornerstone3D/Probe.js +0 -106
  39. package/src/adapters/Cornerstone3D/cornerstone3DTag.js +0 -1
  40. package/src/adapters/Cornerstone3D/index.js +0 -26
  41. package/src/adapters/VTKjs/Segmentation.js +0 -223
  42. package/src/adapters/VTKjs/index.js +0 -7
  43. package/src/adapters/helpers.js +0 -19
  44. package/src/adapters/index.js +0 -11
@@ -1,26 +0,0 @@
1
- import MeasurementReport from "./MeasurementReport";
2
- import CodeScheme from "./CodingScheme";
3
- import CORNERSTONE_3D_TAG from "./cornerstone3DTag";
4
-
5
- import ArrowAnnotate from "./ArrowAnnotate";
6
- import Bidirectional from "./Bidirectional";
7
- import CobbAngle from "./CobbAngle";
8
- import EllipticalROI from "./EllipticalROI";
9
- import Length from "./Length";
10
- import PlanarFreehandROI from "./PlanarFreehandROI";
11
- import Probe from "./Probe";
12
-
13
- const Cornerstone3D = {
14
- Bidirectional,
15
- CobbAngle,
16
- Length,
17
- EllipticalROI,
18
- ArrowAnnotate,
19
- Probe,
20
- PlanarFreehandROI,
21
- MeasurementReport,
22
- CodeScheme,
23
- CORNERSTONE_3D_TAG
24
- };
25
-
26
- export default Cornerstone3D;
@@ -1,223 +0,0 @@
1
- import {data} from 'dcmjs';
2
-
3
- const {Colors, BitArray} = data;
4
-
5
- // TODO: Is there a better name for this? RGBAInt?
6
- // Should we move it to Colors.js
7
- function dicomlab2RGBA(cielab) {
8
- const rgba = Colors.dicomlab2RGB(cielab).map(x => Math.round(x * 255));
9
- rgba.push(255);
10
-
11
- return rgba;
12
- }
13
-
14
- // TODO: Copied these functions in from VTK Math so we don't need a dependency.
15
- // I guess we should put them somewhere
16
- // https://github.com/Kitware/vtk-js/blob/master/Sources/Common/Core/Math/index.js
17
- function cross(x, y, out) {
18
- const Zx = x[1] * y[2] - x[2] * y[1];
19
- const Zy = x[2] * y[0] - x[0] * y[2];
20
- const Zz = x[0] * y[1] - x[1] * y[0];
21
- out[0] = Zx;
22
- out[1] = Zy;
23
- out[2] = Zz;
24
- }
25
-
26
- function norm(x, n = 3) {
27
- switch (n) {
28
- case 1:
29
- return Math.abs(x);
30
- case 2:
31
- return Math.sqrt(x[0] * x[0] + x[1] * x[1]);
32
- case 3:
33
- return Math.sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
34
- default: {
35
- let sum = 0;
36
- for (let i = 0; i < n; i++) {
37
- sum += x[i] * x[i];
38
- }
39
- return Math.sqrt(sum);
40
- }
41
- }
42
- }
43
-
44
- function normalize(x) {
45
- const den = norm(x);
46
- if (den !== 0.0) {
47
- x[0] /= den;
48
- x[1] /= den;
49
- x[2] /= den;
50
- }
51
- return den;
52
- }
53
-
54
- function subtract(a, b, out) {
55
- out[0] = a[0] - b[0];
56
- out[1] = a[1] - b[1];
57
- out[2] = a[2] - b[2];
58
- }
59
-
60
- // TODO: This is a useful utility on its own. We should move it somewhere?
61
- // dcmjs.adapters.vtk.Multiframe? dcmjs.utils?
62
- function geometryFromFunctionalGroups(dataset, PerFrameFunctionalGroups) {
63
- const geometry = {};
64
- const pixelMeasures =
65
- dataset.SharedFunctionalGroupsSequence.PixelMeasuresSequence;
66
- const planeOrientation =
67
- 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
- const firstFunctionalGroup = PerFrameFunctionalGroups[0];
74
- const lastFunctionalGroup =
75
- PerFrameFunctionalGroups[PerFrameFunctionalGroups.length - 1];
76
- const firstPosition =
77
- firstFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(
78
- Number
79
- );
80
- const lastPosition =
81
- lastFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(
82
- Number
83
- );
84
-
85
- geometry.origin = firstPosition;
86
-
87
- // NB: DICOM PixelSpacing is defined as Row then Column,
88
- // unlike ImageOrientationPatient
89
- geometry.spacing = [
90
- pixelMeasures.PixelSpacing[1],
91
- pixelMeasures.PixelSpacing[0],
92
- pixelMeasures.SpacingBetweenSlices
93
- ].map(Number);
94
-
95
- geometry.dimensions = [
96
- dataset.Columns,
97
- dataset.Rows,
98
- PerFrameFunctionalGroups.length
99
- ].map(Number);
100
-
101
- const orientation = planeOrientation.ImageOrientationPatient.map(Number);
102
- const columnStepToPatient = orientation.slice(0, 3);
103
- const rowStepToPatient = orientation.slice(3, 6);
104
-
105
- geometry.planeNormal = [];
106
-
107
- cross(columnStepToPatient, rowStepToPatient, geometry.planeNormal);
108
-
109
- geometry.sliceStep = [];
110
- subtract(lastPosition, firstPosition, geometry.sliceStep);
111
- normalize(geometry.sliceStep);
112
- geometry.direction = columnStepToPatient
113
- .concat(rowStepToPatient)
114
- .concat(geometry.sliceStep);
115
-
116
- return geometry;
117
- }
118
-
119
- export default class Segmentation {
120
- constructor() {}
121
-
122
- /**
123
- * Produces an array of Segments from an input DICOM Segmentation dataset
124
- *
125
- * Segments are returned with Geometry values that can be used to create
126
- * VTK Image Data objects.
127
- *
128
- * @example Example usage to create VTK Volume actors from each segment:
129
- *
130
- * const actors = [];
131
- * const segments = generateToolState(dataset);
132
- * segments.forEach(segment => {
133
- * // now make actors using the segment information
134
- * const scalarArray = vtk.Common.Core.vtkDataArray.newInstance({
135
- * name: "Scalars",
136
- * numberOfComponents: 1,
137
- * values: segment.pixelData,
138
- * });
139
- *
140
- * const imageData = vtk.Common.DataModel.vtkImageData.newInstance();
141
- * imageData.getPointData().setScalars(scalarArray);
142
- * imageData.setDimensions(geometry.dimensions);
143
- * imageData.setSpacing(geometry.spacing);
144
- * imageData.setOrigin(geometry.origin);
145
- * imageData.setDirection(geometry.direction);
146
- *
147
- * const mapper = vtk.Rendering.Core.vtkVolumeMapper.newInstance();
148
- * mapper.setInputData(imageData);
149
- * mapper.setSampleDistance(2.);
150
- *
151
- * const actor = vtk.Rendering.Core.vtkVolume.newInstance();
152
- * actor.setMapper(mapper);
153
- *
154
- * actors.push(actor);
155
- * });
156
- *
157
- * @param dataset
158
- * @return {{}}
159
- */
160
- static generateSegments(dataset) {
161
- if (dataset.SegmentSequence.constructor.name !== "Array") {
162
- dataset.SegmentSequence = [dataset.SegmentSequence];
163
- }
164
-
165
- dataset.SegmentSequence.forEach(segment => {
166
- // TODO: other interesting fields could be extracted from the segment
167
- // TODO: Read SegmentsOverlay field
168
- // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.8.20.2.html
169
-
170
- // TODO: Looks like vtkColor only wants RGB in 0-1 values.
171
- // Why was this example converting to RGBA with 0-255 values?
172
- const color = dicomlab2RGBA(segment.RecommendedDisplayCIELabValue);
173
-
174
- segments[segment.SegmentNumber] = {
175
- color,
176
- functionalGroups: [],
177
- offset: null,
178
- size: null,
179
- pixelData: null
180
- };
181
- });
182
-
183
- // make a list of functional groups per segment
184
- dataset.PerFrameFunctionalGroupsSequence.forEach(functionalGroup => {
185
- const segmentNumber =
186
- functionalGroup.SegmentIdentificationSequence
187
- .ReferencedSegmentNumber;
188
-
189
- segments[segmentNumber].functionalGroups.push(functionalGroup);
190
- });
191
-
192
- // determine per-segment index into the pixel data
193
- // TODO: only handles one-bit-per pixel
194
- const frameSize = Math.ceil((dataset.Rows * dataset.Columns) / 8);
195
- let nextOffset = 0;
196
-
197
- Object.keys(segments).forEach(segmentNumber => {
198
- const segment = segments[segmentNumber];
199
-
200
- segment.numberOfFrames = segment.functionalGroups.length;
201
- segment.size = segment.numberOfFrames * frameSize;
202
- segment.offset = nextOffset;
203
-
204
- nextOffset = segment.offset + segment.size;
205
-
206
- const packedSegment = dataset.PixelData.slice(
207
- segment.offset,
208
- nextOffset
209
- );
210
-
211
- segment.pixelData = BitArray.unpack(packedSegment);
212
-
213
- const geometry = geometryFromFunctionalGroups(
214
- dataset,
215
- segment.functionalGroups
216
- );
217
-
218
- segment.geometry = geometry;
219
- });
220
-
221
- return segments;
222
- }
223
- }
@@ -1,7 +0,0 @@
1
- import Segmentation from "./Segmentation.js";
2
-
3
- const VTKjs = {
4
- Segmentation
5
- };
6
-
7
- export default VTKjs;
@@ -1,19 +0,0 @@
1
- const toArray = function (x) {
2
- return Array.isArray(x) ? x : [x];
3
- };
4
-
5
- const codeMeaningEquals = codeMeaningName => {
6
- return contentItem => {
7
- return (
8
- contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName
9
- );
10
- };
11
- };
12
-
13
- const graphicTypeEquals = graphicType => {
14
- return contentItem => {
15
- return contentItem && contentItem.GraphicType === graphicType;
16
- };
17
- };
18
-
19
- export { toArray, codeMeaningEquals, graphicTypeEquals };
@@ -1,11 +0,0 @@
1
- import Cornerstone from "./Cornerstone";
2
- import Cornerstone3D from "./Cornerstone3D";
3
- import VTKjs from "./VTKjs";
4
-
5
- const adapters = {
6
- Cornerstone,
7
- Cornerstone3D,
8
- VTKjs,
9
- };
10
-
11
- export default adapters;