@cornerstonejs/core 1.4.1 → 1.4.3

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 (35) hide show
  1. package/dist/cjs/RenderingEngine/BaseVolumeViewport.d.ts +5 -6
  2. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js +24 -19
  3. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  4. package/dist/cjs/RenderingEngine/Viewport.d.ts +1 -1
  5. package/dist/cjs/RenderingEngine/Viewport.js.map +1 -1
  6. package/dist/cjs/RenderingEngine/VolumeViewport.d.ts +1 -3
  7. package/dist/cjs/RenderingEngine/VolumeViewport.js +0 -26
  8. package/dist/cjs/RenderingEngine/VolumeViewport.js.map +1 -1
  9. package/dist/cjs/RenderingEngine/VolumeViewport3D.d.ts +3 -0
  10. package/dist/cjs/RenderingEngine/VolumeViewport3D.js +6 -0
  11. package/dist/cjs/RenderingEngine/VolumeViewport3D.js.map +1 -1
  12. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js +7 -0
  13. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  14. package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +5 -6
  15. package/dist/esm/RenderingEngine/BaseVolumeViewport.js +24 -19
  16. package/dist/esm/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  17. package/dist/esm/RenderingEngine/Viewport.d.ts +1 -1
  18. package/dist/esm/RenderingEngine/Viewport.js.map +1 -1
  19. package/dist/esm/RenderingEngine/VolumeViewport.d.ts +1 -3
  20. package/dist/esm/RenderingEngine/VolumeViewport.js +0 -26
  21. package/dist/esm/RenderingEngine/VolumeViewport.js.map +1 -1
  22. package/dist/esm/RenderingEngine/VolumeViewport3D.d.ts +3 -0
  23. package/dist/esm/RenderingEngine/VolumeViewport3D.js +6 -0
  24. package/dist/esm/RenderingEngine/VolumeViewport3D.js.map +1 -1
  25. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js +7 -0
  26. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  27. package/dist/umd/index.js +1 -1
  28. package/dist/umd/index.js.map +1 -1
  29. package/package.json +2 -2
  30. package/src/RenderingEngine/BaseVolumeViewport.ts +49 -29
  31. package/src/RenderingEngine/Viewport.ts +1 -1
  32. package/src/RenderingEngine/VolumeViewport.ts +0 -47
  33. package/src/RenderingEngine/VolumeViewport3D.ts +18 -3
  34. package/src/RenderingEngine/helpers/createVolumeActor.ts +9 -0
  35. package/src/loaders/volumeLoader.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "description": "",
5
5
  "main": "dist/umd/index.js",
6
6
  "types": "dist/esm/index.d.ts",
@@ -44,5 +44,5 @@
44
44
  "type": "individual",
45
45
  "url": "https://ohif.org/donate"
46
46
  },
47
- "gitHead": "13e9e13e8445e84ac0ef70e4214c0c74b324cce3"
47
+ "gitHead": "41a6ff5abf9944db507ba2641b972fc5dd3e7a39"
48
48
  }
@@ -1,6 +1,7 @@
1
1
  import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';
2
2
  import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
3
3
  import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';
4
+ import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';
4
5
 
5
6
  import cache from '../cache';
6
7
  import {
@@ -50,7 +51,7 @@ import volumeNewImageEventDispatcher, {
50
51
  import Viewport from './Viewport';
51
52
  import type { vtkSlabCamera as vtkSlabCameraType } from './vtkClasses/vtkSlabCamera';
52
53
  import vtkSlabCamera from './vtkClasses/vtkSlabCamera';
53
- import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';
54
+ import transformWorldToIndex from '../utilities/transformWorldToIndex';
54
55
 
55
56
  /**
56
57
  * Abstract base class for volume viewports. VolumeViewports are used to render
@@ -1031,45 +1032,64 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
1031
1032
  );
1032
1033
  }
1033
1034
  }
1034
-
1035
1035
  /**
1036
- * Reset the camera for the volume viewport
1036
+ * Gets the largest slab thickness from all actors in the viewport.
1037
+ *
1038
+ * @returns slabThickness - The slab thickness.
1037
1039
  */
1038
- resetCamera(
1039
- resetPan?: boolean,
1040
- resetZoom?: boolean,
1041
- resetToCenter?: boolean
1042
- ): boolean {
1043
- return super.resetCamera(resetPan, resetZoom, resetToCenter);
1040
+ public getSlabThickness(): number {
1041
+ const actors = this.getActors();
1042
+ let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;
1043
+ actors.forEach((actor) => {
1044
+ if (actor.slabThickness > slabThickness) {
1045
+ slabThickness = actor.slabThickness;
1046
+ }
1047
+ });
1048
+
1049
+ return slabThickness;
1044
1050
  }
1051
+ /**
1052
+ * Given a point in world coordinates, return the intensity at that point
1053
+ * @param point - The point in world coordinates to get the intensity
1054
+ * from.
1055
+ * @returns The intensity value of the voxel at the given point.
1056
+ */
1057
+ public getIntensityFromWorld(point: Point3): number {
1058
+ const actorEntry = this.getDefaultActor();
1059
+ if (!actorIsA(actorEntry, 'vtkVolume')) {
1060
+ return;
1061
+ }
1045
1062
 
1046
- getCurrentImageIdIndex = (): number => {
1047
- throw new Error('Method not implemented.');
1048
- };
1063
+ const { actor, uid } = actorEntry;
1064
+ const imageData = actor.getMapper().getInputData();
1049
1065
 
1050
- getCurrentImageId = (): string => {
1051
- throw new Error('Method not implemented.');
1052
- };
1066
+ const volume = cache.getVolume(uid);
1067
+ const { dimensions } = volume;
1068
+
1069
+ const index = transformWorldToIndex(imageData, point);
1053
1070
 
1054
- getIntensityFromWorld(point: Point3): number {
1055
- throw new Error('Method not implemented.');
1071
+ const voxelIndex =
1072
+ index[2] * dimensions[0] * dimensions[1] +
1073
+ index[1] * dimensions[0] +
1074
+ index[0];
1075
+
1076
+ return volume.getScalarData()[voxelIndex];
1056
1077
  }
1057
1078
 
1058
- setBlendMode(
1079
+ abstract getCurrentImageIdIndex(): number;
1080
+
1081
+ abstract getCurrentImageId(): string;
1082
+
1083
+ abstract setBlendMode(
1059
1084
  blendMode: BlendModes,
1060
- filterActorUIDs?: string[],
1085
+ filterActorUIDs?: Array<string>,
1061
1086
  immediate?: boolean
1062
- ): void {
1063
- throw new Error('Method not implemented.');
1064
- }
1087
+ ): void;
1065
1088
 
1066
- setSlabThickness(slabThickness: number, filterActorUIDs?: string[]): void {
1067
- throw new Error('Method not implemented.');
1068
- }
1069
-
1070
- getSlabThickness(): number {
1071
- throw new Error('Method not implemented.');
1072
- }
1089
+ abstract setSlabThickness(
1090
+ slabThickness: number,
1091
+ filterActorUIDs?: Array<string>
1092
+ ): void;
1073
1093
  }
1074
1094
 
1075
1095
  export default BaseVolumeViewport;
@@ -621,7 +621,7 @@ class Viewport implements IViewport {
621
621
  * be detected for pan/zoom values)
622
622
  * @returns boolean
623
623
  */
624
- protected resetCamera(
624
+ public resetCamera(
625
625
  resetPan = true,
626
626
  resetZoom = true,
627
627
  resetToCenter = true,
@@ -13,7 +13,6 @@ import type {
13
13
  } from '../types';
14
14
  import type { ViewportInput } from '../types/IViewport';
15
15
  import { actorIsA, getClosestImageId } from '../utilities';
16
- import transformWorldToIndex from '../utilities/transformWorldToIndex';
17
16
  import BaseVolumeViewport from './BaseVolumeViewport';
18
17
 
19
18
  /**
@@ -182,34 +181,6 @@ class VolumeViewport extends BaseVolumeViewport {
182
181
  this.resetCamera();
183
182
  }
184
183
 
185
- /**
186
- * Given a point in world coordinates, return the intensity at that point
187
- * @param point - The point in world coordinates to get the intensity
188
- * from.
189
- * @returns The intensity value of the voxel at the given point.
190
- */
191
- public getIntensityFromWorld(point: Point3): number {
192
- const actorEntry = this.getDefaultActor();
193
- if (!actorIsA(actorEntry, 'vtkVolume')) {
194
- return;
195
- }
196
-
197
- const { actor, uid } = actorEntry;
198
- const imageData = actor.getMapper().getInputData();
199
-
200
- const volume = cache.getVolume(uid);
201
- const { dimensions } = volume;
202
-
203
- const index = transformWorldToIndex(imageData, point);
204
-
205
- const voxelIndex =
206
- index[2] * dimensions[0] * dimensions[1] +
207
- index[1] * dimensions[0] +
208
- index[0];
209
-
210
- return volume.getScalarData()[voxelIndex];
211
- }
212
-
213
184
  public setBlendMode(
214
185
  blendMode: BlendModes,
215
186
  filterActorUIDs = [],
@@ -294,7 +265,6 @@ class VolumeViewport extends BaseVolumeViewport {
294
265
  * filterActorUIDs are provided, all actors will be affected.
295
266
  *
296
267
  * @param slabThickness - The slab thickness to set.
297
- * @param blendMode - The blend mode to use when rendering the actors.
298
268
  * @param filterActorUIDs - Optional argument to filter the actors to apply
299
269
  * the slab thickness to (if not provided, all actors will be affected).
300
270
  */
@@ -318,23 +288,6 @@ class VolumeViewport extends BaseVolumeViewport {
318
288
  this.triggerCameraModifiedEventIfNecessary(currentCamera, currentCamera);
319
289
  }
320
290
 
321
- /**
322
- * Gets the largest slab thickness from all actors in the viewport.
323
- *
324
- * @returns slabThickness - The slab thickness.
325
- */
326
- public getSlabThickness(): number {
327
- const actors = this.getActors();
328
- let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;
329
- actors.forEach((actor) => {
330
- if (actor.slabThickness > slabThickness) {
331
- slabThickness = actor.slabThickness;
332
- }
333
- });
334
-
335
- return slabThickness;
336
- }
337
-
338
291
  /**
339
292
  * Uses the origin and focalPoint to calculate the slice index.
340
293
  * Todo: This only works if the imageIds are properly sorted
@@ -1,4 +1,4 @@
1
- import { OrientationAxis } from '../enums';
1
+ import { BlendModes, OrientationAxis } from '../enums';
2
2
  import type { ViewportInput } from '../types/IViewport';
3
3
  import BaseVolumeViewport from './BaseVolumeViewport';
4
4
 
@@ -38,13 +38,28 @@ class VolumeViewport3D extends BaseVolumeViewport {
38
38
 
39
39
  getRotation = (): number => 0;
40
40
 
41
- public getCurrentImageIdIndex = (): number | undefined => {
41
+ getCurrentImageIdIndex = (): number | undefined => {
42
42
  return undefined;
43
43
  };
44
44
 
45
- public getCurrentImageId = (): string => {
45
+ getCurrentImageId = (): string => {
46
46
  return null;
47
47
  };
48
+
49
+ setSlabThickness(
50
+ slabThickness: number,
51
+ filterActorUIDs?: Array<string>
52
+ ): void {
53
+ return null;
54
+ }
55
+
56
+ setBlendMode(
57
+ blendMode: BlendModes,
58
+ filterActorUIDs?: string[],
59
+ immediate?: boolean
60
+ ): void {
61
+ return null;
62
+ }
48
63
  }
49
64
 
50
65
  export default VolumeViewport3D;
@@ -57,6 +57,15 @@ async function createVolumeActor(
57
57
  const volumeActor = vtkVolume.newInstance();
58
58
  volumeActor.setMapper(volumeMapper);
59
59
 
60
+ const numberOfComponents = imageData
61
+ .getPointData()
62
+ .getScalars()
63
+ .getNumberOfComponents();
64
+
65
+ if (numberOfComponents === 3) {
66
+ volumeActor.getProperty().setIndependentComponents(false);
67
+ }
68
+
60
69
  // If the volume is composed of imageIds, we can apply a default VOI based
61
70
  // on either the metadata or the min/max of the middle slice. Example of other
62
71
  // types of volumes which might not be composed of imageIds would be e.g., nrrd, nifti
@@ -93,7 +93,7 @@ function createInternalVTKRepresentation(
93
93
  imageData.setDirection(direction);
94
94
  imageData.setOrigin(origin);
95
95
 
96
- // Add scalar datas to 3D or 4D volume
96
+ // Add scalar data to 3D or 4D volume
97
97
  if (volume.isDynamicVolume()) {
98
98
  const scalarDataArrays = (<Types.IDynamicImageVolume>(
99
99
  volume