@cornerstonejs/core 0.8.0 → 0.10.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 (167) hide show
  1. package/dist/cjs/RenderingEngine/RenderingEngine.js +4 -1
  2. package/dist/cjs/RenderingEngine/RenderingEngine.js.map +1 -1
  3. package/dist/cjs/RenderingEngine/StackViewport.d.ts +1 -1
  4. package/dist/cjs/RenderingEngine/StackViewport.js +17 -23
  5. package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
  6. package/dist/cjs/RenderingEngine/Viewport.d.ts +8 -2
  7. package/dist/cjs/RenderingEngine/Viewport.js +54 -33
  8. package/dist/cjs/RenderingEngine/Viewport.js.map +1 -1
  9. package/dist/cjs/RenderingEngine/VolumeViewport.d.ts +4 -2
  10. package/dist/cjs/RenderingEngine/VolumeViewport.js +120 -46
  11. package/dist/cjs/RenderingEngine/VolumeViewport.js.map +1 -1
  12. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/generateLut.js +19 -5
  13. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/generateLut.js.map +1 -1
  14. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js +2 -1
  15. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js.map +1 -1
  16. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.d.ts +1 -1
  17. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js +31 -3
  18. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  19. package/dist/cjs/RenderingEngine/helpers/index.d.ts +2 -1
  20. package/dist/cjs/RenderingEngine/helpers/index.js +3 -1
  21. package/dist/cjs/RenderingEngine/helpers/index.js.map +1 -1
  22. package/dist/cjs/RenderingEngine/helpers/setDefaultVolumeVOI.d.ts +3 -0
  23. package/dist/cjs/RenderingEngine/helpers/setDefaultVolumeVOI.js +163 -0
  24. package/dist/cjs/RenderingEngine/helpers/setDefaultVolumeVOI.js.map +1 -0
  25. package/dist/cjs/RenderingEngine/helpers/volumeNewImageEventDispatcher.d.ts +4 -0
  26. package/dist/cjs/RenderingEngine/helpers/volumeNewImageEventDispatcher.js +42 -0
  27. package/dist/cjs/RenderingEngine/helpers/volumeNewImageEventDispatcher.js.map +1 -0
  28. package/dist/cjs/RenderingEngine/vtkClasses/vtkSlabCamera.d.ts +0 -24
  29. package/dist/cjs/RenderingEngine/vtkClasses/vtkSlabCamera.js +4 -14
  30. package/dist/cjs/RenderingEngine/vtkClasses/vtkSlabCamera.js.map +1 -1
  31. package/dist/cjs/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js +1 -14
  32. package/dist/cjs/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js.map +1 -1
  33. package/dist/cjs/Settings.js +1 -0
  34. package/dist/cjs/Settings.js.map +1 -1
  35. package/dist/cjs/cache/classes/ImageVolume.d.ts +1 -0
  36. package/dist/cjs/cache/classes/ImageVolume.js +1 -0
  37. package/dist/cjs/cache/classes/ImageVolume.js.map +1 -1
  38. package/dist/cjs/constants/index.d.ts +2 -1
  39. package/dist/cjs/constants/index.js +3 -1
  40. package/dist/cjs/constants/index.js.map +1 -1
  41. package/dist/cjs/constants/rendering.d.ts +2 -0
  42. package/dist/cjs/constants/rendering.js +5 -0
  43. package/dist/cjs/constants/rendering.js.map +1 -0
  44. package/dist/cjs/enums/BlendModes.js +1 -1
  45. package/dist/cjs/enums/BlendModes.js.map +1 -1
  46. package/dist/cjs/enums/Events.d.ts +1 -0
  47. package/dist/cjs/enums/Events.js +1 -0
  48. package/dist/cjs/enums/Events.js.map +1 -1
  49. package/dist/cjs/types/ActorSliceRange.d.ts +11 -0
  50. package/dist/cjs/types/ActorSliceRange.js +3 -0
  51. package/dist/cjs/types/ActorSliceRange.js.map +1 -0
  52. package/dist/cjs/types/EventTypes.d.ts +10 -1
  53. package/dist/cjs/types/IActor.d.ts +1 -0
  54. package/dist/cjs/types/ICamera.d.ts +0 -3
  55. package/dist/cjs/types/IImageVolume.d.ts +1 -0
  56. package/dist/cjs/types/IStackViewport.d.ts +1 -1
  57. package/dist/cjs/types/IViewport.d.ts +2 -0
  58. package/dist/cjs/types/IVolumeInput.d.ts +1 -0
  59. package/dist/cjs/types/IVolumeViewport.d.ts +3 -2
  60. package/dist/cjs/types/ImageSliceData.d.ts +5 -0
  61. package/dist/cjs/types/ImageSliceData.js +3 -0
  62. package/dist/cjs/types/ImageSliceData.js.map +1 -0
  63. package/dist/cjs/types/Metadata.d.ts +1 -0
  64. package/dist/cjs/types/index.d.ts +3 -1
  65. package/dist/cjs/utilities/getImageSliceDataForVolumeViewport.d.ts +3 -0
  66. package/dist/cjs/utilities/getImageSliceDataForVolumeViewport.js +37 -0
  67. package/dist/cjs/utilities/getImageSliceDataForVolumeViewport.js.map +1 -0
  68. package/dist/cjs/utilities/getScalingParameters.d.ts +2 -0
  69. package/dist/cjs/utilities/getScalingParameters.js +41 -0
  70. package/dist/cjs/utilities/getScalingParameters.js.map +1 -0
  71. package/dist/cjs/utilities/getSliceRange.d.ts +2 -0
  72. package/dist/cjs/utilities/getSliceRange.js +39 -0
  73. package/dist/cjs/utilities/getSliceRange.js.map +1 -0
  74. package/dist/cjs/utilities/getTargetVolumeAndSpacingInNormalDir.js +1 -1
  75. package/dist/cjs/utilities/index.d.ts +6 -2
  76. package/dist/cjs/utilities/index.js +9 -1
  77. package/dist/cjs/utilities/index.js.map +1 -1
  78. package/dist/cjs/utilities/loadImageToCanvas.js +2 -9
  79. package/dist/cjs/utilities/loadImageToCanvas.js.map +1 -1
  80. package/dist/cjs/utilities/snapFocalPointToSlice.d.ts +5 -0
  81. package/dist/cjs/utilities/snapFocalPointToSlice.js +41 -0
  82. package/dist/cjs/utilities/snapFocalPointToSlice.js.map +1 -0
  83. package/dist/esm/RenderingEngine/RenderingEngine.js +4 -1
  84. package/dist/esm/RenderingEngine/RenderingEngine.js.map +1 -1
  85. package/dist/esm/RenderingEngine/StackViewport.d.ts +1 -1
  86. package/dist/esm/RenderingEngine/StackViewport.js +17 -23
  87. package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
  88. package/dist/esm/RenderingEngine/Viewport.d.ts +8 -2
  89. package/dist/esm/RenderingEngine/Viewport.js +54 -33
  90. package/dist/esm/RenderingEngine/Viewport.js.map +1 -1
  91. package/dist/esm/RenderingEngine/VolumeViewport.d.ts +4 -2
  92. package/dist/esm/RenderingEngine/VolumeViewport.js +101 -46
  93. package/dist/esm/RenderingEngine/VolumeViewport.js.map +1 -1
  94. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/generateLut.js +19 -5
  95. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/generateLut.js.map +1 -1
  96. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js +2 -1
  97. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.js.map +1 -1
  98. package/dist/esm/RenderingEngine/helpers/createVolumeActor.d.ts +1 -1
  99. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js +31 -3
  100. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  101. package/dist/esm/RenderingEngine/helpers/index.d.ts +2 -1
  102. package/dist/esm/RenderingEngine/helpers/index.js +2 -1
  103. package/dist/esm/RenderingEngine/helpers/index.js.map +1 -1
  104. package/dist/esm/RenderingEngine/helpers/setDefaultVolumeVOI.d.ts +3 -0
  105. package/dist/esm/RenderingEngine/helpers/setDefaultVolumeVOI.js +132 -0
  106. package/dist/esm/RenderingEngine/helpers/setDefaultVolumeVOI.js.map +1 -0
  107. package/dist/esm/RenderingEngine/helpers/volumeNewImageEventDispatcher.d.ts +4 -0
  108. package/dist/esm/RenderingEngine/helpers/volumeNewImageEventDispatcher.js +35 -0
  109. package/dist/esm/RenderingEngine/helpers/volumeNewImageEventDispatcher.js.map +1 -0
  110. package/dist/esm/RenderingEngine/vtkClasses/vtkSlabCamera.d.ts +0 -24
  111. package/dist/esm/RenderingEngine/vtkClasses/vtkSlabCamera.js +4 -14
  112. package/dist/esm/RenderingEngine/vtkClasses/vtkSlabCamera.js.map +1 -1
  113. package/dist/esm/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js +1 -14
  114. package/dist/esm/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js.map +1 -1
  115. package/dist/esm/Settings.js +1 -0
  116. package/dist/esm/Settings.js.map +1 -1
  117. package/dist/esm/cache/classes/ImageVolume.d.ts +1 -0
  118. package/dist/esm/cache/classes/ImageVolume.js +1 -0
  119. package/dist/esm/cache/classes/ImageVolume.js.map +1 -1
  120. package/dist/esm/constants/index.d.ts +2 -1
  121. package/dist/esm/constants/index.js +2 -1
  122. package/dist/esm/constants/index.js.map +1 -1
  123. package/dist/esm/constants/rendering.d.ts +2 -0
  124. package/dist/esm/constants/rendering.js +3 -0
  125. package/dist/esm/constants/rendering.js.map +1 -0
  126. package/dist/esm/enums/BlendModes.js +1 -1
  127. package/dist/esm/enums/BlendModes.js.map +1 -1
  128. package/dist/esm/enums/Events.d.ts +1 -0
  129. package/dist/esm/enums/Events.js +1 -0
  130. package/dist/esm/enums/Events.js.map +1 -1
  131. package/dist/esm/types/ActorSliceRange.d.ts +11 -0
  132. package/dist/esm/types/ActorSliceRange.js +2 -0
  133. package/dist/esm/types/ActorSliceRange.js.map +1 -0
  134. package/dist/esm/types/EventTypes.d.ts +10 -1
  135. package/dist/esm/types/IActor.d.ts +1 -0
  136. package/dist/esm/types/ICamera.d.ts +0 -3
  137. package/dist/esm/types/IImageVolume.d.ts +1 -0
  138. package/dist/esm/types/IStackViewport.d.ts +1 -1
  139. package/dist/esm/types/IViewport.d.ts +2 -0
  140. package/dist/esm/types/IVolumeInput.d.ts +1 -0
  141. package/dist/esm/types/IVolumeViewport.d.ts +3 -2
  142. package/dist/esm/types/ImageSliceData.d.ts +5 -0
  143. package/dist/esm/types/ImageSliceData.js +2 -0
  144. package/dist/esm/types/ImageSliceData.js.map +1 -0
  145. package/dist/esm/types/Metadata.d.ts +1 -0
  146. package/dist/esm/types/index.d.ts +3 -1
  147. package/dist/esm/utilities/getImageSliceDataForVolumeViewport.d.ts +3 -0
  148. package/dist/esm/utilities/getImageSliceDataForVolumeViewport.js +32 -0
  149. package/dist/esm/utilities/getImageSliceDataForVolumeViewport.js.map +1 -0
  150. package/dist/esm/utilities/getScalingParameters.d.ts +2 -0
  151. package/dist/esm/utilities/getScalingParameters.js +22 -0
  152. package/dist/esm/utilities/getScalingParameters.js.map +1 -0
  153. package/dist/esm/utilities/getSliceRange.d.ts +2 -0
  154. package/dist/esm/utilities/getSliceRange.js +33 -0
  155. package/dist/esm/utilities/getSliceRange.js.map +1 -0
  156. package/dist/esm/utilities/getTargetVolumeAndSpacingInNormalDir.js +1 -1
  157. package/dist/esm/utilities/index.d.ts +6 -2
  158. package/dist/esm/utilities/index.js +6 -2
  159. package/dist/esm/utilities/index.js.map +1 -1
  160. package/dist/esm/utilities/loadImageToCanvas.js +2 -9
  161. package/dist/esm/utilities/loadImageToCanvas.js.map +1 -1
  162. package/dist/esm/utilities/snapFocalPointToSlice.d.ts +5 -0
  163. package/dist/esm/utilities/snapFocalPointToSlice.js +38 -0
  164. package/dist/esm/utilities/snapFocalPointToSlice.js.map +1 -0
  165. package/dist/umd/index.js +1 -1
  166. package/dist/umd/index.js.map +1 -1
  167. package/package.json +2 -3
@@ -3,10 +3,15 @@ import cache from '../cache';
3
3
  import ViewportType from '../enums/ViewportType';
4
4
  import Viewport from './Viewport';
5
5
  import { createVolumeActor } from './helpers';
6
+ import volumeNewImageEventDispatcher, { resetVolumeNewImageState, } from './helpers/volumeNewImageEventDispatcher';
6
7
  import { loadVolume } from '../volumeLoader';
8
+ import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';
7
9
  import vtkSlabCamera from './vtkClasses/vtkSlabCamera';
8
10
  import { getShouldUseCPURendering } from '../init';
9
11
  import transformWorldToIndex from '../utilities/transformWorldToIndex';
12
+ import { MINIMUM_SLAB_THICKNESS } from '../constants';
13
+ import { Events } from '../enums';
14
+ import eventTarget from '../eventTarget';
10
15
  const EPSILON = 1e-3;
11
16
  class VolumeViewport extends Viewport {
12
17
  constructor(props) {
@@ -16,9 +21,6 @@ class VolumeViewport extends Viewport {
16
21
  return this._FrameOfReferenceUID;
17
22
  };
18
23
  this.canvasToWorld = (canvasPos) => {
19
- const vtkCamera = this.getVtkActiveCamera();
20
- const slabThicknessActive = vtkCamera.getSlabThicknessActive();
21
- vtkCamera.setSlabThicknessActive(false);
22
24
  const renderer = this.getRenderer();
23
25
  const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow;
24
26
  const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
@@ -26,14 +28,10 @@ class VolumeViewport extends Viewport {
26
28
  const displayCoord = [canvasPos[0] + this.sx, canvasPos[1] + this.sy];
27
29
  displayCoord[1] = size[1] - displayCoord[1];
28
30
  let worldCoord = openGLRenderWindow.displayToWorld(displayCoord[0], displayCoord[1], 0, renderer);
29
- vtkCamera.setSlabThicknessActive(slabThicknessActive);
30
31
  worldCoord = this.applyFlipTx(worldCoord);
31
32
  return worldCoord;
32
33
  };
33
34
  this.worldToCanvas = (worldPos) => {
34
- const vtkCamera = this.getVtkActiveCamera();
35
- const slabThicknessActive = vtkCamera.getSlabThicknessActive();
36
- vtkCamera.setSlabThicknessActive(false);
37
35
  const renderer = this.getRenderer();
38
36
  const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow;
39
37
  const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
@@ -44,7 +42,6 @@ class VolumeViewport extends Viewport {
44
42
  displayCoord[0] - this.sx,
45
43
  displayCoord[1] - this.sy,
46
44
  ];
47
- vtkCamera.setSlabThicknessActive(slabThicknessActive);
48
45
  return canvasCoord;
49
46
  };
50
47
  this.getCurrentImageIdIndex = () => {
@@ -96,15 +93,36 @@ class VolumeViewport extends Viewport {
96
93
  default:
97
94
  throw new Error(`Unrecognized viewport type: ${this.type}`);
98
95
  }
96
+ this.initializeVolumeNewImageEventDispatcher();
99
97
  const { sliceNormal, viewUp } = this.defaultOptions.orientation;
100
98
  camera.setDirectionOfProjection(-sliceNormal[0], -sliceNormal[1], -sliceNormal[2]);
101
99
  camera.setViewUpFrom(viewUp);
102
- camera.setFreezeFocalPoint(true);
103
100
  this.resetCamera();
104
101
  }
105
102
  static get useCustomRenderingPipeline() {
106
103
  return false;
107
104
  }
105
+ initializeVolumeNewImageEventDispatcher() {
106
+ function volumeNewImageHandler(cameraEvent) {
107
+ const viewportImageData = this.getImageData();
108
+ if (!viewportImageData) {
109
+ return;
110
+ }
111
+ volumeNewImageEventDispatcher(cameraEvent);
112
+ }
113
+ function volumeNewImageCleanUp(evt) {
114
+ const { viewportId } = evt.detail;
115
+ if (viewportId !== this.id) {
116
+ return;
117
+ }
118
+ eventTarget.removeEventListener(Events.ELEMENT_DISABLED, volumeNewImageCleanUp);
119
+ resetVolumeNewImageState(viewportId);
120
+ this.element.removeEventListener(Events.CAMERA_MODIFIED, volumeNewImageHandler);
121
+ }
122
+ this.element.removeEventListener(Events.CAMERA_MODIFIED, volumeNewImageHandler.bind(this));
123
+ this.element.addEventListener(Events.CAMERA_MODIFIED, volumeNewImageHandler.bind(this));
124
+ eventTarget.addEventListener(Events.ELEMENT_DISABLED, volumeNewImageCleanUp.bind(this));
125
+ }
108
126
  async setVolumes(volumeInputArray, immediate = false) {
109
127
  const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);
110
128
  if (!firstImageVolume) {
@@ -113,20 +131,17 @@ class VolumeViewport extends Viewport {
113
131
  const FrameOfReferenceUID = firstImageVolume.metadata.FrameOfReferenceUID;
114
132
  await this._isValidVolumeInputArray(volumeInputArray, FrameOfReferenceUID);
115
133
  this._FrameOfReferenceUID = FrameOfReferenceUID;
116
- const slabThicknessValues = [];
117
134
  const volumeActors = [];
118
135
  for (let i = 0; i < volumeInputArray.length; i++) {
119
- const { volumeId, slabThickness, actorUID } = volumeInputArray[i];
120
- const volumeActor = await createVolumeActor(volumeInputArray[i]);
136
+ const { volumeId, actorUID, slabThickness, slabThicknessEnabled } = volumeInputArray[i];
137
+ const volumeActor = await createVolumeActor(volumeInputArray[i], this.element, this.id);
121
138
  const uid = actorUID || volumeId;
122
- volumeActors.push({ uid, volumeActor, slabThickness });
123
- if (slabThickness !== undefined &&
124
- !slabThicknessValues.includes(slabThickness)) {
125
- slabThicknessValues.push(slabThickness);
126
- }
127
- }
128
- if (slabThicknessValues.length > 1) {
129
- console.warn('Currently slab thickness for intensity projections is tied to the camera, not per volume, using the largest of the two volumes for this viewport.');
139
+ volumeActors.push({
140
+ uid,
141
+ volumeActor,
142
+ slabThickness,
143
+ slabThicknessEnabled,
144
+ });
130
145
  }
131
146
  this._setVolumeActors(volumeActors);
132
147
  if (immediate) {
@@ -137,13 +152,18 @@ class VolumeViewport extends Viewport {
137
152
  const volumeActors = [];
138
153
  await this._isValidVolumeInputArray(volumeInputArray, this._FrameOfReferenceUID);
139
154
  for (let i = 0; i < volumeInputArray.length; i++) {
140
- const { volumeId, visibility, actorUID } = volumeInputArray[i];
141
- const volumeActor = await createVolumeActor(volumeInputArray[i]);
155
+ const { volumeId, visibility, actorUID, slabThickness, slabThicknessEnabled, } = volumeInputArray[i];
156
+ const volumeActor = await createVolumeActor(volumeInputArray[i], this.element, this.id);
142
157
  if (visibility === false) {
143
158
  volumeActor.setVisibility(false);
144
159
  }
145
160
  const uid = actorUID || volumeId;
146
- volumeActors.push({ uid, volumeActor });
161
+ volumeActors.push({
162
+ uid,
163
+ volumeActor,
164
+ slabThickness,
165
+ slabThicknessEnabled,
166
+ });
147
167
  }
148
168
  this.addActors(volumeActors);
149
169
  if (immediate) {
@@ -190,15 +210,68 @@ class VolumeViewport extends Viewport {
190
210
  super.flip(flipDirection);
191
211
  }
192
212
  resetCamera(resetPan = true, resetZoom = true) {
193
- return super.resetCamera(resetPan, resetZoom);
213
+ const distance = super.resetCamera(resetPan, resetZoom);
214
+ const activeCamera = this.getVtkActiveCamera();
215
+ activeCamera.setClippingRange(0.01, distance * 2);
216
+ const viewPlaneNormal = activeCamera.getViewPlaneNormal();
217
+ const focalPoint = activeCamera.getFocalPoint();
218
+ const actors = this.getActors();
219
+ actors.forEach((actor) => {
220
+ const mapper = actor.volumeActor.getMapper();
221
+ const vtkPlanes = mapper.getClippingPlanes();
222
+ if (vtkPlanes.length === 0) {
223
+ const clipPlane1 = vtkPlane.newInstance();
224
+ const clipPlane2 = vtkPlane.newInstance();
225
+ const newVtkPlanes = [clipPlane1, clipPlane2];
226
+ let slabThickness = MINIMUM_SLAB_THICKNESS;
227
+ if (actor.slabThicknessEnabled !== false && actor.slabThickness) {
228
+ slabThickness = actor.slabThickness;
229
+ }
230
+ this.setOrientationOfClippingPlanes(newVtkPlanes, slabThickness, viewPlaneNormal, focalPoint);
231
+ mapper.addClippingPlane(clipPlane1);
232
+ mapper.addClippingPlane(clipPlane2);
233
+ }
234
+ });
235
+ return distance;
194
236
  }
195
- setSlabThickness(slabThickness) {
196
- this.setCamera({
197
- slabThickness,
237
+ setSlabThicknessForAllVolumeActors(slabThickness) {
238
+ const actors = this.getActors();
239
+ let updateClippingPlanes = false;
240
+ actors.forEach((actor) => {
241
+ if (actor.slabThicknessEnabled === false) {
242
+ return;
243
+ }
244
+ actor.slabThickness = slabThickness;
245
+ updateClippingPlanes = true;
198
246
  });
247
+ if (updateClippingPlanes === false) {
248
+ return;
249
+ }
250
+ const currentCamera = this.getCamera();
251
+ this.updateActorsClippingPlanesOnCameraModified(currentCamera);
252
+ this.checkAndTriggerCameraModifiedEvent(currentCamera, currentCamera);
253
+ }
254
+ setSlabThicknessForVolumeActor(actorUID, slabThickness) {
255
+ const actor = this.getActor(actorUID);
256
+ if (actor.slabThicknessEnabled === false) {
257
+ return;
258
+ }
259
+ actor.slabThickness = slabThickness;
260
+ const currentCamera = this.getCamera();
261
+ this.updateActorsClippingPlanesOnCameraModified(currentCamera);
262
+ this.checkAndTriggerCameraModifiedEvent(currentCamera, currentCamera);
199
263
  }
200
264
  getSlabThickness() {
201
- const { slabThickness } = this.getCamera();
265
+ const actors = this.getActors();
266
+ let slabThickness = MINIMUM_SLAB_THICKNESS;
267
+ actors.forEach((actor) => {
268
+ if (actor.slabThicknessEnabled === false) {
269
+ return;
270
+ }
271
+ if (actor.slabThickness > slabThickness) {
272
+ slabThickness = actor.slabThickness;
273
+ }
274
+ });
202
275
  return slabThickness;
203
276
  }
204
277
  getImageData() {
@@ -220,25 +293,7 @@ class VolumeViewport extends Viewport {
220
293
  };
221
294
  }
222
295
  _setVolumeActors(volumeActorEntries) {
223
- const renderer = this.getRenderer();
224
296
  this.setActors(volumeActorEntries);
225
- let slabThickness = null;
226
- if (this.type === ViewportType.ORTHOGRAPHIC) {
227
- volumeActorEntries.forEach((va) => {
228
- if (va.slabThickness && va.slabThickness > slabThickness) {
229
- slabThickness = va.slabThickness;
230
- }
231
- });
232
- this.resetCamera();
233
- const activeCamera = renderer.getActiveCamera();
234
- activeCamera.setSlabThickness(slabThickness);
235
- activeCamera.setFreezeFocalPoint(true);
236
- }
237
- else {
238
- renderer.resetCamera();
239
- const activeCamera = renderer.getActiveCamera();
240
- activeCamera.setFreezeFocalPoint(true);
241
- }
242
297
  }
243
298
  }
244
299
  export default VolumeViewport;
@@ -1 +1 @@
1
- {"version":3,"file":"VolumeViewport.js","sourceRoot":"","sources":["../../../src/RenderingEngine/VolumeViewport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VolumeViewport.js","sourceRoot":"","sources":["../../../src/RenderingEngine/VolumeViewport.ts"],"names":[],"mappings":"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"}
@@ -12,14 +12,28 @@ export default function (image, windowWidth, windowCenter, invert, modalityLUT,
12
12
  const lut = image.cachedLut.lutArray;
13
13
  const mlutfn = getModalityLut(image.slope, image.intercept, modalityLUT);
14
14
  const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);
15
- if (invert === true) {
16
- for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
17
- lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));
15
+ if (image.isPreScaled) {
16
+ if (invert === true) {
17
+ for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
18
+ lut[storedValue + -offset] = 255 - vlutfn(storedValue);
19
+ }
20
+ }
21
+ else {
22
+ for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
23
+ lut[storedValue + -offset] = vlutfn(storedValue);
24
+ }
18
25
  }
19
26
  }
20
27
  else {
21
- for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
22
- lut[storedValue + -offset] = vlutfn(mlutfn(storedValue));
28
+ if (invert === true) {
29
+ for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
30
+ lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));
31
+ }
32
+ }
33
+ else {
34
+ for (let storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
35
+ lut[storedValue + -offset] = vlutfn(mlutfn(storedValue));
36
+ }
23
37
  }
24
38
  }
25
39
  return lut;
@@ -1 +1 @@
1
- {"version":3,"file":"generateLut.js","sourceRoot":"","sources":["../../../../../../src/RenderingEngine/helpers/cpuFallback/rendering/generateLut.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,SAAS,MAAM,aAAa,CAAC;AAgBpC,MAAM,CAAC,OAAO,WACZ,KAAa,EACb,WAAmB,EACnB,YAAoB,EACpB,MAAe,EACf,WAA2B,EAC3B,MAAsB;IAEtB,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;QACjC,MAAM,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,CAAC,CAAC;QAE1C,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;KAC1D;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;IAErC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAE5D,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,KACE,IAAI,WAAW,GAAG,aAAa,EAC/B,WAAW,IAAI,aAAa,EAC5B,WAAW,EAAE,EACb;YACA,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;SAChE;KACF;SAAM;QACL,KACE,IAAI,WAAW,GAAG,aAAa,EAC/B,WAAW,IAAI,aAAa,EAC5B,WAAW,EAAE,EACb;YACA,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;SAC1D;KACF;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"generateLut.js","sourceRoot":"","sources":["../../../../../../src/RenderingEngine/helpers/cpuFallback/rendering/generateLut.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,SAAS,MAAM,aAAa,CAAC;AAgBpC,MAAM,CAAC,OAAO,WACZ,KAAa,EACb,WAAmB,EACnB,YAAoB,EACpB,MAAe,EACf,WAA2B,EAC3B,MAAsB;IAEtB,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;QACjC,MAAM,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,CAAC,CAAC;QAE1C,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;KAC1D;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;IAErC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAE5D,IAAI,KAAK,CAAC,WAAW,EAAE;QAGrB,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,KACE,IAAI,WAAW,GAAG,aAAa,EAC/B,WAAW,IAAI,aAAa,EAC5B,WAAW,EAAE,EACb;gBACA,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;aACxD;SACF;aAAM;YACL,KACE,IAAI,WAAW,GAAG,aAAa,EAC/B,WAAW,IAAI,aAAa,EAC5B,WAAW,EAAE,EACb;gBACA,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;aAClD;SACF;KACF;SAAM;QACL,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,KACE,IAAI,WAAW,GAAG,aAAa,EAC/B,WAAW,IAAI,aAAa,EAC5B,WAAW,EAAE,EACb;gBACA,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;aAChE;SACF;aAAM;YACL,KACE,IAAI,WAAW,GAAG,aAAa,EAC/B,WAAW,IAAI,aAAa,EAC5B,WAAW,EAAE,EACb;gBACA,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;aAC1D;SACF;KACF;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -15,7 +15,8 @@ export default function (canvas, image, modality, colormap) {
15
15
  windowCenter: 2.5,
16
16
  };
17
17
  }
18
- else if (image.windowWidth && image.windowCenter) {
18
+ else if (image.windowWidth !== undefined &&
19
+ image.windowCenter !== undefined) {
19
20
  voi = {
20
21
  windowWidth: Array.isArray(image.windowWidth)
21
22
  ? image.windowWidth[0]
@@ -1 +1 @@
1
- {"version":3,"file":"getDefaultViewport.js","sourceRoot":"","sources":["../../../../../../src/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAclD,MAAM,CAAC,OAAO,WACZ,MAAyB,EACzB,KAAa,EACb,QAAiB,EACjB,QAA8B;IAE9B,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;KACH;IAED,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,OAAO,cAAc,EAAE,CAAC;KACzB;IAGD,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAE7D,IAAI,GAAG,CAAC;IAER,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE;QAC1C,GAAG,GAAG;YACJ,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,GAAG;SAClB,CAAC;KACH;SAAM,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE;QAClD,GAAG,GAAG;YACJ,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC3C,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,KAAK,CAAC,WAAW;YACrB,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC7C,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;gBACvB,CAAC,CAAC,KAAK,CAAC,YAAY;SACvB,CAAC;KACH;IAED,OAAO;QACL,KAAK;QACL,WAAW,EAAE;YACX,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL;QACD,GAAG;QACH,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,gBAAgB,EAAE,KAAK;QACvB,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ;QACR,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;QAC5D,aAAa,EAAE;YACb,IAAI,EAAE;gBACJ,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC;aACL;YACD,IAAI,EAAE;gBACJ,CAAC,EAAE,KAAK,CAAC,OAAO;gBAChB,CAAC,EAAE,KAAK,CAAC,IAAI;aACd;YACD,eAAe,EACb,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe;YACjE,kBAAkB,EAChB,KAAK,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB;YACvE,oBAAoB,EAAE,MAAM;SAC7B;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"getDefaultViewport.js","sourceRoot":"","sources":["../../../../../../src/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAclD,MAAM,CAAC,OAAO,WACZ,MAAyB,EACzB,KAAa,EACb,QAAiB,EACjB,QAA8B;IAE9B,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;KACH;IAED,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,OAAO,cAAc,EAAE,CAAC;KACzB;IAGD,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAE7D,IAAI,GAAG,CAAC;IAER,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE;QAC1C,GAAG,GAAG;YACJ,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,GAAG;SAClB,CAAC;KACH;SAAM,IACL,KAAK,CAAC,WAAW,KAAK,SAAS;QAC/B,KAAK,CAAC,YAAY,KAAK,SAAS,EAChC;QACA,GAAG,GAAG;YACJ,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC3C,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,KAAK,CAAC,WAAW;YACrB,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC7C,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;gBACvB,CAAC,CAAC,KAAK,CAAC,YAAY;SACvB,CAAC;KACH;IAED,OAAO;QACL,KAAK;QACL,WAAW,EAAE;YACX,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL;QACD,GAAG;QACH,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,gBAAgB,EAAE,KAAK;QACvB,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ;QACR,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;QAC5D,aAAa,EAAE;YACb,IAAI,EAAE;gBACJ,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC;aACL;YACD,IAAI,EAAE;gBACJ,CAAC,EAAE,KAAK,CAAC,OAAO;gBAChB,CAAC,EAAE,KAAK,CAAC,IAAI;aACd;YACD,eAAe,EACb,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe;YACjE,kBAAkB,EAChB,KAAK,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB;YACvE,oBAAoB,EAAE,MAAM;SAC7B;KACF,CAAC;AACJ,CAAC"}
@@ -8,5 +8,5 @@ interface createVolumeActorInterface {
8
8
  }) => void;
9
9
  blendMode?: BlendModes;
10
10
  }
11
- declare function createVolumeActor(props: createVolumeActorInterface): Promise<VolumeActor>;
11
+ declare function createVolumeActor(props: createVolumeActorInterface, element: HTMLDivElement, viewportId: string): Promise<VolumeActor>;
12
12
  export default createVolumeActor;
@@ -1,7 +1,10 @@
1
1
  import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';
2
2
  import { loadVolume } from '../../volumeLoader';
3
3
  import createVolumeMapper from './createVolumeMapper';
4
- async function createVolumeActor(props) {
4
+ import { triggerEvent } from '../../utilities';
5
+ import { Events } from '../../enums';
6
+ import setDefaultVolumeVOI from './setDefaultVolumeVOI';
7
+ async function createVolumeActor(props, element, viewportId) {
5
8
  const { volumeId, callback, blendMode } = props;
6
9
  const imageVolume = await loadVolume(volumeId);
7
10
  if (!imageVolume) {
@@ -14,10 +17,35 @@ async function createVolumeActor(props) {
14
17
  }
15
18
  const volumeActor = vtkVolume.newInstance();
16
19
  volumeActor.setMapper(volumeMapper);
17
- if (callback) {
18
- callback({ volumeActor, volumeId });
20
+ if (imageVolume.imageIds) {
21
+ setDefaultVolumeVOI(volumeActor, imageVolume).then(() => {
22
+ if (callback) {
23
+ callback({ volumeActor, volumeId });
24
+ }
25
+ triggerVOIModified(element, viewportId, volumeActor);
26
+ });
27
+ }
28
+ else {
29
+ if (callback) {
30
+ callback({ volumeActor, volumeId });
31
+ }
32
+ triggerVOIModified(element, viewportId, volumeActor);
19
33
  }
20
34
  return volumeActor;
21
35
  }
36
+ function triggerVOIModified(element, viewportId, volumeActor) {
37
+ const voiRange = volumeActor
38
+ .getProperty()
39
+ .getRGBTransferFunction(0)
40
+ .getRange();
41
+ const voiModifiedEventDetail = {
42
+ viewportId,
43
+ range: {
44
+ lower: voiRange[0],
45
+ upper: voiRange[1],
46
+ },
47
+ };
48
+ triggerEvent(element, Events.VOI_MODIFIED, voiModifiedEventDetail);
49
+ }
22
50
  export default createVolumeActor;
23
51
  //# sourceMappingURL=createVolumeActor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createVolumeActor.js","sourceRoot":"","sources":["../../../../src/RenderingEngine/helpers/createVolumeActor.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAiBtD,KAAK,UAAU,iBAAiB,CAC9B,KAAiC;IAEjC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEhD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,WAAW,EAAE;QAChB,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,CAAC,QAAQ,iBAAiB,CAC9D,CAAC;KACH;IAED,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAAC;IAEpD,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAErE,IAAI,SAAS,EAAE;QACb,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;KACtC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAC5C,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEpC,IAAI,QAAQ,EAAE;QACZ,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;KACrC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"createVolumeActor.js","sourceRoot":"","sources":["../../../../src/RenderingEngine/helpers/createVolumeActor.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,uCAAuC,CAAC;AAI9D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AAgBxD,KAAK,UAAU,iBAAiB,CAC9B,KAAiC,EACjC,OAAuB,EACvB,UAAkB;IAElB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEhD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,WAAW,EAAE;QAChB,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,CAAC,QAAQ,iBAAiB,CAC9D,CAAC;KACH;IAED,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAAC;IAEpD,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAErE,IAAI,SAAS,EAAE;QACb,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;KACtC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAC5C,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAMpC,IAAI,WAAW,CAAC,QAAQ,EAAE;QACxB,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACtD,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;aACrC;YACD,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;KACJ;SAAM;QACL,IAAI,QAAQ,EAAE;YACZ,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;SACrC;QAED,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;KACtD;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAuB,EACvB,UAAkB,EAClB,WAAwB;IAExB,MAAM,QAAQ,GAAG,WAAW;SACzB,WAAW,EAAE;SACb,sBAAsB,CAAC,CAAC,CAAC;SACzB,QAAQ,EAAE,CAAC;IAEd,MAAM,sBAAsB,GAA2B;QACrD,UAAU;QACV,KAAK,EAAE;YACL,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;SACnB;KACF,CAAC;IAEF,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;AACrE,CAAC;AAED,eAAe,iBAAiB,CAAC"}
@@ -3,4 +3,5 @@ import createVolumeMapper from './createVolumeMapper';
3
3
  import getOrCreateCanvas from './getOrCreateCanvas';
4
4
  import setVolumesForViewports from './setVolumesForViewports';
5
5
  import addVolumesToViewports from './addVolumesToViewports';
6
- export { createVolumeActor, createVolumeMapper, getOrCreateCanvas, setVolumesForViewports, addVolumesToViewports, };
6
+ import volumeNewImageEventDispatcher from './volumeNewImageEventDispatcher';
7
+ export { createVolumeActor, createVolumeMapper, getOrCreateCanvas, setVolumesForViewports, addVolumesToViewports, volumeNewImageEventDispatcher, };
@@ -3,5 +3,6 @@ import createVolumeMapper from './createVolumeMapper';
3
3
  import getOrCreateCanvas from './getOrCreateCanvas';
4
4
  import setVolumesForViewports from './setVolumesForViewports';
5
5
  import addVolumesToViewports from './addVolumesToViewports';
6
- export { createVolumeActor, createVolumeMapper, getOrCreateCanvas, setVolumesForViewports, addVolumesToViewports, };
6
+ import volumeNewImageEventDispatcher from './volumeNewImageEventDispatcher';
7
+ export { createVolumeActor, createVolumeMapper, getOrCreateCanvas, setVolumesForViewports, addVolumesToViewports, volumeNewImageEventDispatcher, };
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/RenderingEngine/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/RenderingEngine/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,6BAA6B,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,GAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { VolumeActor, IImageVolume } from '../../types';
2
+ declare function setDefaultVolumeVOI(volumeActor: VolumeActor, imageVolume: IImageVolume): Promise<void>;
3
+ export default setDefaultVolumeVOI;
@@ -0,0 +1,132 @@
1
+ import { loadAndCacheImage } from '../../imageLoader';
2
+ import * as metaData from '../../metaData';
3
+ import { getMinMax, windowLevel } from '../../utilities';
4
+ import { RequestType } from '../../enums';
5
+ const PRIORITY = 0;
6
+ const REQUEST_TYPE = RequestType.Prefetch;
7
+ async function setDefaultVolumeVOI(volumeActor, imageVolume) {
8
+ let voi = getVOIFromMetadata(imageVolume);
9
+ if (!voi) {
10
+ voi = await getVOIFromMinMax(imageVolume);
11
+ }
12
+ if (!voi || voi.lower === undefined || voi.upper === undefined) {
13
+ throw new Error('Could not get VOI from metadata, nor from the min max of the image middle slice');
14
+ }
15
+ voi = handlePreScaledVolume(imageVolume, voi);
16
+ const { lower, upper } = voi;
17
+ volumeActor
18
+ .getProperty()
19
+ .getRGBTransferFunction(0)
20
+ .setMappingRange(lower, upper);
21
+ }
22
+ function handlePreScaledVolume(imageVolume, voi) {
23
+ const imageIds = imageVolume.imageIds;
24
+ const imageIdIndex = Math.floor(imageIds.length / 2);
25
+ const imageId = imageIds[imageIdIndex];
26
+ const generalSeriesModule = metaData.get('generalSeriesModule', imageId) || {};
27
+ if (generalSeriesModule.modality === 'PT' && imageVolume.isPrescaled) {
28
+ return {
29
+ lower: 0,
30
+ upper: 5,
31
+ };
32
+ }
33
+ return voi;
34
+ }
35
+ function getVOIFromMetadata(imageVolume) {
36
+ const { imageIds } = imageVolume;
37
+ const imageIdIndex = Math.floor(imageIds.length / 2);
38
+ const imageId = imageIds[imageIdIndex];
39
+ const voiLutModule = metaData.get('voiLutModule', imageId);
40
+ if (voiLutModule && voiLutModule.windowWidth && voiLutModule.windowCenter) {
41
+ const { windowWidth, windowCenter } = voiLutModule;
42
+ const voi = {
43
+ windowWidth: Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,
44
+ windowCenter: Array.isArray(windowCenter)
45
+ ? windowCenter[0]
46
+ : windowCenter,
47
+ };
48
+ const { lower, upper } = windowLevel.toLowHighRange(Number(voi.windowWidth), Number(voi.windowCenter));
49
+ return {
50
+ lower,
51
+ upper,
52
+ };
53
+ }
54
+ }
55
+ async function getVOIFromMinMax(imageVolume) {
56
+ const { scalarData, imageIds } = imageVolume;
57
+ const imageIdIndex = Math.floor(imageIds.length / 2);
58
+ const imageId = imageVolume.imageIds[imageIdIndex];
59
+ const generalSeriesModule = metaData.get('generalSeriesModule', imageId) || {};
60
+ const { modality } = generalSeriesModule;
61
+ const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};
62
+ const numImages = imageIds.length;
63
+ const bytesPerImage = scalarData.byteLength / numImages;
64
+ const voxelsPerImage = scalarData.length / numImages;
65
+ const bytePerPixel = scalarData.BYTES_PER_ELEMENT;
66
+ let type;
67
+ if (scalarData instanceof Uint8Array) {
68
+ type = 'Uint8Array';
69
+ }
70
+ else if (scalarData instanceof Float32Array) {
71
+ type = 'Float32Array';
72
+ }
73
+ else {
74
+ throw new Error('Unsupported array type');
75
+ }
76
+ const scalingParameters = {
77
+ rescaleSlope: modalityLutModule.rescaleSlope,
78
+ rescaleIntercept: modalityLutModule.rescaleIntercept,
79
+ modality,
80
+ };
81
+ let scalingParametersToUse;
82
+ if (modality === 'PT') {
83
+ const suvFactor = metaData.get('scalingModule', imageId);
84
+ if (suvFactor) {
85
+ scalingParametersToUse = {
86
+ ...scalingParameters,
87
+ suvbw: suvFactor.suvbw,
88
+ };
89
+ }
90
+ }
91
+ const byteOffset = imageIdIndex * bytesPerImage;
92
+ const options = {
93
+ targetBuffer: {
94
+ arrayBuffer: scalarData.buffer,
95
+ offset: byteOffset,
96
+ length: voxelsPerImage,
97
+ type,
98
+ },
99
+ priority: PRIORITY,
100
+ requestType: REQUEST_TYPE,
101
+ preScale: {
102
+ scalingParameters: scalingParametersToUse,
103
+ },
104
+ };
105
+ const image = await loadAndCacheImage(imageId, options);
106
+ let imageScalarData;
107
+ if (!image) {
108
+ imageScalarData = _getImageScalarDataFromImageVolume(imageVolume, byteOffset, bytePerPixel, voxelsPerImage);
109
+ }
110
+ else {
111
+ imageScalarData = image.getPixelData();
112
+ }
113
+ const { min, max } = getMinMax(imageScalarData);
114
+ return {
115
+ lower: min,
116
+ upper: max,
117
+ };
118
+ }
119
+ function _getImageScalarDataFromImageVolume(imageVolume, byteOffset, bytePerPixel, voxelsPerImage) {
120
+ const { scalarData } = imageVolume;
121
+ const { volumeBuffer } = scalarData;
122
+ if (scalarData.BYTES_PER_ELEMENT !== bytePerPixel) {
123
+ byteOffset *= scalarData.BYTES_PER_ELEMENT / bytePerPixel;
124
+ }
125
+ const TypedArray = scalarData.constructor;
126
+ const imageScalarData = new TypedArray(voxelsPerImage);
127
+ const volumeBufferView = new TypedArray(volumeBuffer, byteOffset, voxelsPerImage);
128
+ imageScalarData.set(volumeBufferView);
129
+ return imageScalarData;
130
+ }
131
+ export default setDefaultVolumeVOI;
132
+ //# sourceMappingURL=setDefaultVolumeVOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setDefaultVolumeVOI.js","sourceRoot":"","sources":["../../../../src/RenderingEngine/helpers/setDefaultVolumeVOI.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC;AAW1C,KAAK,UAAU,mBAAmB,CAChC,WAAwB,EACxB,WAAyB;IAEzB,IAAI,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC,GAAG,EAAE;QACR,GAAG,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;KAC3C;IAED,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE;QAC9D,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;KACH;IAED,GAAG,GAAG,qBAAqB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAE7B,WAAW;SACR,WAAW,EAAE;SACb,sBAAsB,CAAC,CAAC,CAAC;SACzB,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAyB,EAAE,GAAa;IACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvC,MAAM,mBAAmB,GACvB,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAQrD,IAAI,mBAAmB,CAAC,QAAQ,KAAK,IAAI,IAAI,WAAW,CAAC,WAAW,EAAE;QACpE,OAAO;YACL,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;SACT,CAAC;KACH;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AASD,SAAS,kBAAkB,CAAC,WAAyB;IACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE3D,IAAI,YAAY,IAAI,YAAY,CAAC,WAAW,IAAI,YAAY,CAAC,YAAY,EAAE;QACzE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC;QAEnD,MAAM,GAAG,GAAG;YACV,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;YACtE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;gBACvC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;gBACjB,CAAC,CAAC,YAAY;SACjB,CAAC;QAEF,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,cAAc,CACjD,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EACvB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CACzB,CAAC;QAEF,OAAO;YACL,KAAK;YACL,KAAK;SACN,CAAC;KACH;AACH,CAAC;AASD,KAAK,UAAU,gBAAgB,CAAC,WAAyB;IACvD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IAG7C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,mBAAmB,GACvB,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC;IACzC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAE3E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;IAClC,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC;IACxD,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;IACrD,MAAM,YAAY,GAAG,UAAU,CAAC,iBAAiB,CAAC;IAElD,IAAI,IAAI,CAAC;IAET,IAAI,UAAU,YAAY,UAAU,EAAE;QACpC,IAAI,GAAG,YAAY,CAAC;KACrB;SAAM,IAAI,UAAU,YAAY,YAAY,EAAE;QAC7C,IAAI,GAAG,cAAc,CAAC;KACvB;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;KAC3C;IAED,MAAM,iBAAiB,GAAsB;QAC3C,YAAY,EAAE,iBAAiB,CAAC,YAAY;QAC5C,gBAAgB,EAAE,iBAAiB,CAAC,gBAAgB;QACpD,QAAQ;KACT,CAAC;IAEF,IAAI,sBAAsB,CAAC;IAC3B,IAAI,QAAQ,KAAK,IAAI,EAAE;QACrB,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAEzD,IAAI,SAAS,EAAE;YACb,sBAAsB,GAAG;gBACvB,GAAG,iBAAiB;gBACpB,KAAK,EAAE,SAAS,CAAC,KAAK;aACvB,CAAC;SACH;KACF;IAED,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;IAEhD,MAAM,OAAO,GAAG;QACd,YAAY,EAAE;YACZ,WAAW,EAAE,UAAU,CAAC,MAAM;YAC9B,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,cAAc;YACtB,IAAI;SACL;QACD,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE;YACR,iBAAiB,EAAE,sBAAsB;SAC1C;KACF,CAAC;IAUF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAExD,IAAI,eAAe,CAAC;IACpB,IAAI,CAAC,KAAK,EAAE;QACV,eAAe,GAAG,kCAAkC,CAClD,WAAW,EACX,UAAU,EACV,YAAY,EACZ,cAAc,CACf,CAAC;KACH;SAAM;QACL,eAAe,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;KACxC;IAGD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC;IAEhD,OAAO;QACL,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,GAAG;KACX,CAAC;AACJ,CAAC;AAED,SAAS,kCAAkC,CACzC,WAAW,EACX,UAAU,EACV,YAAY,EACZ,cAAc;IAEd,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IACnC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;IACpC,IAAI,UAAU,CAAC,iBAAiB,KAAK,YAAY,EAAE;QACjD,UAAU,IAAI,UAAU,CAAC,iBAAiB,GAAG,YAAY,CAAC;KAC3D;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC;IAEvD,MAAM,gBAAgB,GAAG,IAAI,UAAU,CACrC,YAAY,EACZ,UAAU,EACV,cAAc,CACf,CAAC;IAEF,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAEtC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { EventTypes } from '../../types';
2
+ export declare function resetVolumeNewImageState(viewportId: string): void;
3
+ declare function volumeNewImageEventDispatcher(cameraEvent: EventTypes.CameraModifiedEvent): void;
4
+ export default volumeNewImageEventDispatcher;
@@ -0,0 +1,35 @@
1
+ import { getImageSliceDataForVolumeViewport, triggerEvent, } from '../../utilities';
2
+ import { Events } from '../../enums';
3
+ import { getRenderingEngine } from '../getRenderingEngine';
4
+ import VolumeViewport from '../VolumeViewport';
5
+ const state = {};
6
+ export function resetVolumeNewImageState(viewportId) {
7
+ if (state[viewportId]) {
8
+ delete state[viewportId];
9
+ }
10
+ }
11
+ function volumeNewImageEventDispatcher(cameraEvent) {
12
+ const { renderingEngineId, viewportId } = cameraEvent.detail;
13
+ const renderingEngine = getRenderingEngine(renderingEngineId);
14
+ const viewport = renderingEngine.getViewport(viewportId);
15
+ if (!(viewport instanceof VolumeViewport)) {
16
+ throw new Error(`volumeNewImageEventDispatcher: viewport is not a VolumeViewport`);
17
+ }
18
+ if (!state[viewport.id]) {
19
+ state[viewport.id] = 0;
20
+ }
21
+ const { numberOfSlices, imageIndex } = getImageSliceDataForVolumeViewport(viewport);
22
+ if (state[viewport.id] === imageIndex) {
23
+ return;
24
+ }
25
+ state[viewport.id] = imageIndex;
26
+ const eventDetail = {
27
+ imageIndex,
28
+ viewportId,
29
+ renderingEngineId,
30
+ numberOfSlices,
31
+ };
32
+ triggerEvent(viewport.element, Events.VOLUME_NEW_IMAGE, eventDetail);
33
+ }
34
+ export default volumeNewImageEventDispatcher;
35
+ //# sourceMappingURL=volumeNewImageEventDispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumeNewImageEventDispatcher.js","sourceRoot":"","sources":["../../../../src/RenderingEngine/helpers/volumeNewImageEventDispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAK/C,MAAM,KAAK,GAAqB,EAAE,CAAC;AAEnC,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;QACrB,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;KAC1B;AACH,CAAC;AAYD,SAAS,6BAA6B,CACpC,WAA2C;IAE3C,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;IAC7D,MAAM,eAAe,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAEzD,IAAI,CAAC,CAAC,QAAQ,YAAY,cAAc,CAAC,EAAE;QACzC,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;KACH;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACvB,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;KACxB;IAED,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAClC,kCAAkC,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,UAAU,EAAE;QACrC,OAAO;KACR;IAED,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;IAEhC,MAAM,WAAW,GAAyC;QACxD,UAAU;QACV,UAAU;QACV,iBAAiB;QACjB,cAAc;KACf,CAAC;IAEF,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AACvE,CAAC;AAED,eAAe,6BAA6B,CAAC"}