@cornerstonejs/core 0.12.1 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/RenderingEngine/RenderingEngine.js +21 -11
- package/dist/cjs/RenderingEngine/RenderingEngine.js.map +1 -1
- package/dist/cjs/RenderingEngine/StackViewport.d.ts +2 -1
- package/dist/cjs/RenderingEngine/StackViewport.js +167 -68
- package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
- package/dist/cjs/RenderingEngine/Viewport.d.ts +1 -0
- package/dist/cjs/RenderingEngine/Viewport.js +12 -3
- package/dist/cjs/RenderingEngine/Viewport.js.map +1 -1
- package/dist/cjs/RenderingEngine/VolumeViewport.js +16 -2
- package/dist/cjs/RenderingEngine/VolumeViewport.js.map +1 -1
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/drawImageSync.js +0 -1
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/drawImageSync.js.map +1 -1
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/correctShift.d.ts +7 -0
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js +19 -0
- package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js.map +1 -0
- package/dist/cjs/RenderingEngine/helpers/createVolumeActor.d.ts +1 -1
- package/dist/cjs/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js +1 -2
- package/dist/cjs/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js.map +1 -1
- package/dist/cjs/cache/classes/ImageVolume.d.ts +1 -0
- package/dist/cjs/cache/classes/ImageVolume.js.map +1 -1
- package/dist/cjs/enums/BlendModes.d.ts +4 -4
- package/dist/cjs/enums/BlendModes.js +4 -4
- package/dist/cjs/enums/BlendModes.js.map +1 -1
- package/dist/cjs/types/CPUFallbackViewport.d.ts +2 -0
- package/dist/cjs/types/CPUIImageData.d.ts +1 -0
- package/dist/cjs/types/IActor.d.ts +3 -1
- package/dist/cjs/types/ICamera.d.ts +1 -0
- package/dist/cjs/types/IImageData.d.ts +1 -0
- package/dist/cjs/types/IImageVolume.d.ts +1 -0
- package/dist/cjs/types/StackViewportProperties.d.ts +1 -0
- package/dist/cjs/utilities/index.d.ts +2 -1
- package/dist/cjs/utilities/index.js +3 -1
- package/dist/cjs/utilities/index.js.map +1 -1
- package/dist/cjs/utilities/isImageActor.d.ts +4 -0
- package/dist/cjs/utilities/isImageActor.js +13 -0
- package/dist/cjs/utilities/isImageActor.js.map +1 -0
- package/dist/esm/RenderingEngine/RenderingEngine.js +21 -11
- package/dist/esm/RenderingEngine/RenderingEngine.js.map +1 -1
- package/dist/esm/RenderingEngine/StackViewport.d.ts +2 -1
- package/dist/esm/RenderingEngine/StackViewport.js +171 -68
- package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
- package/dist/esm/RenderingEngine/Viewport.d.ts +1 -0
- package/dist/esm/RenderingEngine/Viewport.js +12 -4
- package/dist/esm/RenderingEngine/Viewport.js.map +1 -1
- package/dist/esm/RenderingEngine/VolumeViewport.js +16 -2
- package/dist/esm/RenderingEngine/VolumeViewport.js.map +1 -1
- package/dist/esm/RenderingEngine/helpers/cpuFallback/drawImageSync.js +0 -1
- package/dist/esm/RenderingEngine/helpers/cpuFallback/drawImageSync.js.map +1 -1
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/correctShift.d.ts +7 -0
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js +16 -0
- package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js.map +1 -0
- package/dist/esm/RenderingEngine/helpers/createVolumeActor.d.ts +1 -1
- package/dist/esm/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js +1 -2
- package/dist/esm/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js.map +1 -1
- package/dist/esm/cache/classes/ImageVolume.d.ts +1 -0
- package/dist/esm/cache/classes/ImageVolume.js.map +1 -1
- package/dist/esm/enums/BlendModes.d.ts +4 -4
- package/dist/esm/enums/BlendModes.js +4 -4
- package/dist/esm/enums/BlendModes.js.map +1 -1
- package/dist/esm/types/CPUFallbackViewport.d.ts +2 -0
- package/dist/esm/types/CPUIImageData.d.ts +1 -0
- package/dist/esm/types/IActor.d.ts +3 -1
- package/dist/esm/types/ICamera.d.ts +1 -0
- package/dist/esm/types/IImageData.d.ts +1 -0
- package/dist/esm/types/IImageVolume.d.ts +1 -0
- package/dist/esm/types/StackViewportProperties.d.ts +1 -0
- package/dist/esm/utilities/index.d.ts +2 -1
- package/dist/esm/utilities/index.js +2 -1
- package/dist/esm/utilities/index.js.map +1 -1
- package/dist/esm/utilities/isImageActor.d.ts +4 -0
- package/dist/esm/utilities/isImageActor.js +10 -0
- package/dist/esm/utilities/isImageActor.js.map +1 -0
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
|
|
2
2
|
import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
|
|
3
|
-
import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';
|
|
4
|
-
import vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper';
|
|
5
3
|
import _cloneDeep from 'lodash.clonedeep';
|
|
6
4
|
import vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';
|
|
7
5
|
import { vec2, vec3, mat4 } from 'gl-matrix';
|
|
6
|
+
import vtkImageMapper from '@kitware/vtk.js/Rendering/Core/ImageMapper';
|
|
7
|
+
import vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice';
|
|
8
|
+
import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
|
|
8
9
|
import * as metaData from '../metaData';
|
|
9
10
|
import Viewport from './Viewport';
|
|
10
11
|
import eventTarget from '../eventTarget';
|
|
11
12
|
import Events from '../enums/Events';
|
|
12
|
-
import { triggerEvent, isEqual, invertRgbTransferFunction, windowLevel as windowLevelUtil, imageIdToURI, } from '../utilities';
|
|
13
|
+
import { triggerEvent, isEqual, invertRgbTransferFunction, windowLevel as windowLevelUtil, imageIdToURI, isImageActor, } from '../utilities';
|
|
13
14
|
import drawImageSync from './helpers/cpuFallback/drawImageSync';
|
|
14
15
|
import { getColormap } from './helpers/cpuFallback/colors/index';
|
|
15
16
|
import { loadAndCacheImage } from '../imageLoader';
|
|
@@ -26,6 +27,7 @@ import { getShouldUseCPURendering } from '../init';
|
|
|
26
27
|
import RequestType from '../enums/RequestType';
|
|
27
28
|
import getScalingParameters from '../utilities/getScalingParameters';
|
|
28
29
|
import cache from '../cache';
|
|
30
|
+
import correctShift from './helpers/cpuFallback/rendering/correctShift';
|
|
29
31
|
const EPSILON = 1;
|
|
30
32
|
class StackViewport extends Viewport {
|
|
31
33
|
constructor(props) {
|
|
@@ -58,18 +60,10 @@ class StackViewport extends Viewport {
|
|
|
58
60
|
return imagePlaneModule.frameOfReferenceUID;
|
|
59
61
|
};
|
|
60
62
|
this.createActorMapper = (imageData) => {
|
|
61
|
-
const mapper =
|
|
63
|
+
const mapper = vtkImageMapper.newInstance();
|
|
62
64
|
mapper.setInputData(imageData);
|
|
63
|
-
const actor =
|
|
65
|
+
const actor = vtkImageSlice.newInstance();
|
|
64
66
|
actor.setMapper(mapper);
|
|
65
|
-
const [xSize, ySize, zSize] = imageData.getDimensions();
|
|
66
|
-
const [xSpacing, ySpacing, zSpacing] = imageData.getSpacing();
|
|
67
|
-
const vSize = vec3.length([
|
|
68
|
-
xSize * xSpacing,
|
|
69
|
-
ySize * ySpacing,
|
|
70
|
-
zSize * zSpacing,
|
|
71
|
-
]);
|
|
72
|
-
mapper.setSampleDistance(vSize / mapper.getMaximumSamplesPerRay());
|
|
73
67
|
if (imageData.getPointData().getNumberOfComponents() > 1) {
|
|
74
68
|
actor.getProperty().setIndependentComponents(false);
|
|
75
69
|
}
|
|
@@ -122,17 +116,34 @@ class StackViewport extends Viewport {
|
|
|
122
116
|
};
|
|
123
117
|
this.canvasToWorldGPU = (canvasPos) => {
|
|
124
118
|
const renderer = this.getRenderer();
|
|
119
|
+
const vtkCamera = this.getVtkActiveCamera();
|
|
120
|
+
const crange = vtkCamera.getClippingRange();
|
|
121
|
+
const distance = vtkCamera.getDistance();
|
|
122
|
+
vtkCamera.setClippingRange(distance, distance + 0.1);
|
|
125
123
|
const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow;
|
|
126
124
|
const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
|
|
127
125
|
const size = openGLRenderWindow.getSize();
|
|
128
|
-
const
|
|
126
|
+
const devicePixelRatio = window.devicePixelRatio || 1;
|
|
127
|
+
const canvasPosWithDPR = [
|
|
128
|
+
canvasPos[0] * devicePixelRatio,
|
|
129
|
+
canvasPos[1] * devicePixelRatio,
|
|
130
|
+
];
|
|
131
|
+
const displayCoord = [
|
|
132
|
+
canvasPosWithDPR[0] + this.sx,
|
|
133
|
+
canvasPosWithDPR[1] + this.sy,
|
|
134
|
+
];
|
|
129
135
|
displayCoord[1] = size[1] - displayCoord[1];
|
|
130
136
|
let worldCoord = openGLRenderWindow.displayToWorld(displayCoord[0], displayCoord[1], 0, renderer);
|
|
137
|
+
vtkCamera.setClippingRange(crange[0], crange[1]);
|
|
131
138
|
worldCoord = this.applyFlipTx(worldCoord);
|
|
132
139
|
return worldCoord;
|
|
133
140
|
};
|
|
134
141
|
this.worldToCanvasGPU = (worldPos) => {
|
|
135
142
|
const renderer = this.getRenderer();
|
|
143
|
+
const vtkCamera = this.getVtkActiveCamera();
|
|
144
|
+
const crange = vtkCamera.getClippingRange();
|
|
145
|
+
const distance = vtkCamera.getDistance();
|
|
146
|
+
vtkCamera.setClippingRange(distance, distance + 0.1);
|
|
136
147
|
const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow;
|
|
137
148
|
const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
|
|
138
149
|
const size = openGLRenderWindow.getSize();
|
|
@@ -142,7 +153,13 @@ class StackViewport extends Viewport {
|
|
|
142
153
|
displayCoord[0] - this.sx,
|
|
143
154
|
displayCoord[1] - this.sy,
|
|
144
155
|
];
|
|
145
|
-
|
|
156
|
+
vtkCamera.setClippingRange(crange[0], crange[1]);
|
|
157
|
+
const devicePixelRatio = window.devicePixelRatio || 1;
|
|
158
|
+
const canvasCoordWithDPR = [
|
|
159
|
+
canvasCoord[0] / devicePixelRatio,
|
|
160
|
+
canvasCoord[1] / devicePixelRatio,
|
|
161
|
+
];
|
|
162
|
+
return canvasCoordWithDPR;
|
|
146
163
|
};
|
|
147
164
|
this.getCurrentImageIdIndex = () => {
|
|
148
165
|
return this.currentImageIdIndex;
|
|
@@ -239,7 +256,7 @@ class StackViewport extends Viewport {
|
|
|
239
256
|
return;
|
|
240
257
|
}
|
|
241
258
|
const { actor } = defaultActor;
|
|
242
|
-
if (!actor
|
|
259
|
+
if (!isImageActor(actor)) {
|
|
243
260
|
return;
|
|
244
261
|
}
|
|
245
262
|
const vtkImageData = actor.getMapper().getInputData();
|
|
@@ -252,6 +269,7 @@ class StackViewport extends Viewport {
|
|
|
252
269
|
imageData: actor.getMapper().getInputData(),
|
|
253
270
|
metadata: { Modality: this.modality },
|
|
254
271
|
scaling: this.scaling,
|
|
272
|
+
hasPixelSpacing: this.hasPixelSpacing,
|
|
255
273
|
};
|
|
256
274
|
}
|
|
257
275
|
getImageDataCPU() {
|
|
@@ -283,6 +301,7 @@ class StackViewport extends Viewport {
|
|
|
283
301
|
},
|
|
284
302
|
},
|
|
285
303
|
scalarData: this.cpuImagePixelData,
|
|
304
|
+
hasPixelSpacing: this.hasPixelSpacing,
|
|
286
305
|
};
|
|
287
306
|
}
|
|
288
307
|
buildMetadata(imageId) {
|
|
@@ -305,6 +324,7 @@ class StackViewport extends Viewport {
|
|
|
305
324
|
}
|
|
306
325
|
this.modality = modality;
|
|
307
326
|
let imagePlaneModule = metaData.get('imagePlaneModule', imageId);
|
|
327
|
+
imagePlaneModule = this._getImagePlaneModule(imagePlaneModule);
|
|
308
328
|
if (!this.useCPURendering) {
|
|
309
329
|
imagePlaneModule = this.calibrateIfNecessary(imageId, imagePlaneModule);
|
|
310
330
|
}
|
|
@@ -366,9 +386,9 @@ class StackViewport extends Viewport {
|
|
|
366
386
|
};
|
|
367
387
|
return imagePlaneModule;
|
|
368
388
|
}
|
|
369
|
-
setProperties({ voiRange, invert, interpolationType, rotation, } = {}) {
|
|
389
|
+
setProperties({ voiRange, invert, interpolationType, rotation, } = {}, suppressEvents = false) {
|
|
370
390
|
if (typeof voiRange !== 'undefined' || !this.voiApplied) {
|
|
371
|
-
this.setVOI(voiRange);
|
|
391
|
+
this.setVOI(voiRange, suppressEvents);
|
|
372
392
|
}
|
|
373
393
|
if (typeof invert !== 'undefined') {
|
|
374
394
|
this.setInvertColor(invert);
|
|
@@ -417,12 +437,13 @@ class StackViewport extends Viewport {
|
|
|
417
437
|
});
|
|
418
438
|
}
|
|
419
439
|
_setPropertiesFromCache() {
|
|
440
|
+
const suppressEvents = true;
|
|
420
441
|
this.setProperties({
|
|
421
442
|
voiRange: this.voiRange,
|
|
422
443
|
rotation: this.rotation,
|
|
423
444
|
interpolationType: this.interpolationType,
|
|
424
445
|
invert: this.invert,
|
|
425
|
-
});
|
|
446
|
+
}, suppressEvents);
|
|
426
447
|
}
|
|
427
448
|
getCameraCPU() {
|
|
428
449
|
const { metadata, viewport } = this._cpuFallbackEnabledElement;
|
|
@@ -433,45 +454,69 @@ class StackViewport extends Viewport {
|
|
|
433
454
|
const rotationMatrix = mat4.fromRotation(mat4.create(), (this.rotation * Math.PI) / 180, viewPlaneNormal);
|
|
434
455
|
viewUp = vec3.transformMat4(vec3.create(), viewUp, rotationMatrix);
|
|
435
456
|
}
|
|
457
|
+
const canvasCenter = [
|
|
458
|
+
this.element.clientWidth / 2,
|
|
459
|
+
this.element.clientHeight / 2,
|
|
460
|
+
];
|
|
461
|
+
const canvasCenterWorld = this.canvasToWorld(canvasCenter);
|
|
462
|
+
const topLeftWorld = this.canvasToWorld([0, 0]);
|
|
463
|
+
const bottomLeftWorld = this.canvasToWorld([0, this.element.clientHeight]);
|
|
464
|
+
const parallelScale = vec3.distance(topLeftWorld, bottomLeftWorld) / 2;
|
|
436
465
|
return {
|
|
437
466
|
parallelProjection: true,
|
|
438
|
-
focalPoint:
|
|
467
|
+
focalPoint: canvasCenterWorld,
|
|
439
468
|
position: [0, 0, 0],
|
|
440
|
-
parallelScale
|
|
469
|
+
parallelScale,
|
|
470
|
+
scale: viewport.scale,
|
|
441
471
|
viewPlaneNormal: [
|
|
442
472
|
viewPlaneNormal[0],
|
|
443
473
|
viewPlaneNormal[1],
|
|
444
474
|
viewPlaneNormal[2],
|
|
445
475
|
],
|
|
446
476
|
viewUp: [viewUp[0], viewUp[1], viewUp[2]],
|
|
477
|
+
flipHorizontal: this.flipHorizontal,
|
|
478
|
+
flipVertical: this.flipVertical,
|
|
447
479
|
};
|
|
448
480
|
}
|
|
449
481
|
setCameraCPU(cameraInterface) {
|
|
450
|
-
const { viewport } = this._cpuFallbackEnabledElement;
|
|
482
|
+
const { viewport, image } = this._cpuFallbackEnabledElement;
|
|
451
483
|
const previousCamera = this.getCameraCPU();
|
|
452
|
-
const { focalPoint, viewUp, parallelScale, flipHorizontal, flipVertical } = cameraInterface;
|
|
484
|
+
const { focalPoint, viewUp, parallelScale, scale, flipHorizontal, flipVertical, } = cameraInterface;
|
|
485
|
+
const { clientHeight } = this.element;
|
|
453
486
|
if (focalPoint) {
|
|
454
|
-
const focalPointCanvas = this.worldToCanvasCPU(
|
|
455
|
-
const
|
|
456
|
-
const
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
487
|
+
const focalPointCanvas = this.worldToCanvasCPU(focalPoint);
|
|
488
|
+
const focalPointPixel = canvasToPixel(this._cpuFallbackEnabledElement, focalPointCanvas);
|
|
489
|
+
const prevFocalPointCanvas = this.worldToCanvasCPU(previousCamera.focalPoint);
|
|
490
|
+
const prevFocalPointPixel = canvasToPixel(this._cpuFallbackEnabledElement, prevFocalPointCanvas);
|
|
491
|
+
const deltaPixel = vec2.create();
|
|
492
|
+
vec2.subtract(deltaPixel, vec2.fromValues(focalPointPixel[0], focalPointPixel[1]), vec2.fromValues(prevFocalPointPixel[0], prevFocalPointPixel[1]));
|
|
493
|
+
const shift = correctShift({ x: deltaPixel[0], y: deltaPixel[1] }, viewport);
|
|
494
|
+
viewport.translation.x -= shift.x;
|
|
495
|
+
viewport.translation.y -= shift.y;
|
|
496
|
+
}
|
|
497
|
+
if (parallelScale) {
|
|
498
|
+
const { rowPixelSpacing } = image;
|
|
499
|
+
const scale = (clientHeight * rowPixelSpacing * 0.5) / parallelScale;
|
|
500
|
+
viewport.scale = scale;
|
|
501
|
+
viewport.parallelScale = parallelScale;
|
|
502
|
+
}
|
|
503
|
+
if (scale) {
|
|
504
|
+
const { rowPixelSpacing } = image;
|
|
505
|
+
viewport.scale = scale;
|
|
506
|
+
viewport.parallelScale = (clientHeight * rowPixelSpacing * 0.5) / scale;
|
|
507
|
+
}
|
|
508
|
+
if (flipHorizontal !== undefined || flipVertical !== undefined) {
|
|
466
509
|
this.setFlipCPU({ flipHorizontal, flipVertical });
|
|
467
510
|
}
|
|
511
|
+
this._cpuFallbackEnabledElement.transform = calculateTransform(this._cpuFallbackEnabledElement);
|
|
468
512
|
const updatedCamera = {
|
|
469
513
|
...previousCamera,
|
|
470
514
|
focalPoint,
|
|
471
515
|
viewUp,
|
|
472
|
-
parallelScale,
|
|
473
516
|
flipHorizontal,
|
|
474
517
|
flipVertical,
|
|
518
|
+
parallelScale: viewport.parallelScale,
|
|
519
|
+
scale: viewport.scale,
|
|
475
520
|
};
|
|
476
521
|
const eventDetail = {
|
|
477
522
|
previousCamera,
|
|
@@ -490,12 +535,12 @@ class StackViewport extends Viewport {
|
|
|
490
535
|
viewport.vflip = flipVertical;
|
|
491
536
|
this.flipVertical = viewport.vflip;
|
|
492
537
|
}
|
|
493
|
-
setVOI(voiRange) {
|
|
538
|
+
setVOI(voiRange, suppressEvents) {
|
|
494
539
|
if (this.useCPURendering) {
|
|
495
|
-
this.setVOICPU(voiRange);
|
|
540
|
+
this.setVOICPU(voiRange, suppressEvents);
|
|
496
541
|
return;
|
|
497
542
|
}
|
|
498
|
-
this.setVOIGPU(voiRange);
|
|
543
|
+
this.setVOIGPU(voiRange, suppressEvents);
|
|
499
544
|
}
|
|
500
545
|
setRotation(rotationCache, rotation) {
|
|
501
546
|
const previousCamera = this.getCamera();
|
|
@@ -548,7 +593,7 @@ class StackViewport extends Viewport {
|
|
|
548
593
|
return;
|
|
549
594
|
}
|
|
550
595
|
const { actor } = defaultActor;
|
|
551
|
-
if (!actor
|
|
596
|
+
if (!isImageActor(actor)) {
|
|
552
597
|
return;
|
|
553
598
|
}
|
|
554
599
|
const volumeProperty = actor.getProperty();
|
|
@@ -579,17 +624,27 @@ class StackViewport extends Viewport {
|
|
|
579
624
|
return;
|
|
580
625
|
}
|
|
581
626
|
const { actor } = defaultActor;
|
|
582
|
-
if (!actor
|
|
627
|
+
if (!isImageActor(actor)) {
|
|
583
628
|
return;
|
|
584
629
|
}
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
630
|
+
if (actor.isA('vtkVolume')) {
|
|
631
|
+
const volumeActor = actor;
|
|
632
|
+
const tfunc = volumeActor.getProperty().getRGBTransferFunction(0);
|
|
633
|
+
if ((!this.invert && invert) || (this.invert && !invert)) {
|
|
634
|
+
invertRgbTransferFunction(tfunc);
|
|
635
|
+
}
|
|
636
|
+
this.invert = invert;
|
|
637
|
+
}
|
|
638
|
+
else if (actor.isA('vtkImageSlice')) {
|
|
639
|
+
const imageSliceActor = actor;
|
|
640
|
+
const tfunc = imageSliceActor.getProperty().getRGBTransferFunction(0);
|
|
641
|
+
if ((!this.invert && invert) || (this.invert && !invert)) {
|
|
642
|
+
invertRgbTransferFunction(tfunc);
|
|
643
|
+
}
|
|
644
|
+
this.invert = invert;
|
|
589
645
|
}
|
|
590
|
-
this.invert = invert;
|
|
591
646
|
}
|
|
592
|
-
setVOICPU(voiRange) {
|
|
647
|
+
setVOICPU(voiRange, suppressEvents) {
|
|
593
648
|
const { viewport, image } = this._cpuFallbackEnabledElement;
|
|
594
649
|
if (!viewport || !image) {
|
|
595
650
|
return;
|
|
@@ -623,36 +678,38 @@ class StackViewport extends Viewport {
|
|
|
623
678
|
viewportId: this.id,
|
|
624
679
|
range: voiRange,
|
|
625
680
|
};
|
|
626
|
-
|
|
681
|
+
if (!suppressEvents) {
|
|
682
|
+
triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);
|
|
683
|
+
}
|
|
627
684
|
}
|
|
628
|
-
setVOIGPU(voiRange) {
|
|
685
|
+
setVOIGPU(voiRange, suppressEvents) {
|
|
629
686
|
const defaultActor = this.getDefaultActor();
|
|
630
687
|
if (!defaultActor) {
|
|
631
688
|
return;
|
|
632
689
|
}
|
|
633
690
|
const { actor } = defaultActor;
|
|
634
|
-
if (!actor
|
|
691
|
+
if (!isImageActor(actor)) {
|
|
635
692
|
return;
|
|
636
693
|
}
|
|
637
|
-
const
|
|
638
|
-
|
|
639
|
-
if (typeof
|
|
640
|
-
const imageData =
|
|
694
|
+
const imageActor = actor;
|
|
695
|
+
let voiRangeToUse = voiRange;
|
|
696
|
+
if (typeof voiRangeToUse === 'undefined') {
|
|
697
|
+
const imageData = imageActor.getMapper().getInputData();
|
|
641
698
|
const range = imageData.getPointData().getScalars().getRange();
|
|
642
|
-
|
|
643
|
-
voiRange = { lower: range[0], upper: range[1] };
|
|
644
|
-
}
|
|
645
|
-
else {
|
|
646
|
-
const { lower, upper } = voiRange;
|
|
647
|
-
tfunc.setRange(lower, upper);
|
|
699
|
+
voiRangeToUse = { lower: range[0], upper: range[1] };
|
|
648
700
|
}
|
|
701
|
+
const { windowWidth, windowCenter } = windowLevelUtil.toWindowLevel(voiRangeToUse.lower, voiRangeToUse.upper);
|
|
702
|
+
imageActor.getProperty().setColorWindow(windowWidth);
|
|
703
|
+
imageActor.getProperty().setColorLevel(windowCenter);
|
|
649
704
|
this.voiApplied = true;
|
|
650
|
-
this.voiRange =
|
|
705
|
+
this.voiRange = voiRangeToUse;
|
|
651
706
|
const eventDetail = {
|
|
652
707
|
viewportId: this.id,
|
|
653
|
-
range:
|
|
708
|
+
range: voiRangeToUse,
|
|
654
709
|
};
|
|
655
|
-
|
|
710
|
+
if (!suppressEvents) {
|
|
711
|
+
triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);
|
|
712
|
+
}
|
|
656
713
|
}
|
|
657
714
|
_addScalingToViewport(imageIdScalingFactor) {
|
|
658
715
|
if (!this.scaling.PET) {
|
|
@@ -784,8 +841,8 @@ class StackViewport extends Viewport {
|
|
|
784
841
|
if (!imageData) {
|
|
785
842
|
return false;
|
|
786
843
|
}
|
|
787
|
-
const [xSpacing, ySpacing
|
|
788
|
-
const [xVoxels, yVoxels
|
|
844
|
+
const [xSpacing, ySpacing] = imageData.getSpacing();
|
|
845
|
+
const [xVoxels, yVoxels] = imageData.getDimensions();
|
|
789
846
|
const imagePlaneModule = metaData.get('imagePlaneModule', image.imageId);
|
|
790
847
|
const direction = imageData.getDirection();
|
|
791
848
|
const rowCosines = direction.slice(0, 3);
|
|
@@ -988,9 +1045,6 @@ class StackViewport extends Viewport {
|
|
|
988
1045
|
const previousCameraProps = _cloneDeep(this.getCamera());
|
|
989
1046
|
if (sameImageData && !this.stackInvalidated) {
|
|
990
1047
|
this._updateVTKImageDataFromCornerstoneImage(image);
|
|
991
|
-
const direction = this._imageData.getDirection();
|
|
992
|
-
const { viewPlaneNormal, viewUp } = this._getCameraOrientation(direction);
|
|
993
|
-
this.setCameraNoEvent({ viewUp, viewPlaneNormal });
|
|
994
1048
|
const cameraProps = this.getCamera();
|
|
995
1049
|
this.panCache[0] = this.cameraPosOnRender[0] - cameraProps.position[0];
|
|
996
1050
|
this.panCache[1] = this.cameraPosOnRender[1] - cameraProps.position[1];
|
|
@@ -1034,6 +1088,18 @@ class StackViewport extends Viewport {
|
|
|
1034
1088
|
}
|
|
1035
1089
|
this.initialVOIRange = voiRange;
|
|
1036
1090
|
this.setProperties({ voiRange });
|
|
1091
|
+
const cfun = vtkColorTransferFunction.newInstance();
|
|
1092
|
+
let lower = 0;
|
|
1093
|
+
let upper = 1024;
|
|
1094
|
+
if (voiRange &&
|
|
1095
|
+
voiRange.lower !== undefined &&
|
|
1096
|
+
voiRange.upper !== undefined) {
|
|
1097
|
+
lower = voiRange.lower;
|
|
1098
|
+
upper = voiRange.upper;
|
|
1099
|
+
}
|
|
1100
|
+
cfun.addRGBPoint(lower, 0.0, 0.0, 0.0);
|
|
1101
|
+
cfun.addRGBPoint(upper, 1.0, 1.0, 1.0);
|
|
1102
|
+
actor.getProperty().setRGBTransferFunction(0, cfun);
|
|
1037
1103
|
const { position } = this.getCamera();
|
|
1038
1104
|
this.cameraPosOnRender = position;
|
|
1039
1105
|
this.stackInvalidated = false;
|
|
@@ -1046,6 +1112,7 @@ class StackViewport extends Viewport {
|
|
|
1046
1112
|
throw new Error(`ImageIdIndex provided ${imageIdIndex} is invalid, the stack only has ${this.imageIds.length} elements`);
|
|
1047
1113
|
}
|
|
1048
1114
|
this.currentImageIdIndex = imageIdIndex;
|
|
1115
|
+
this.hasPixelSpacing = true;
|
|
1049
1116
|
const imageId = await this._loadAndDisplayImage(this.imageIds[imageIdIndex], imageIdIndex);
|
|
1050
1117
|
return imageId;
|
|
1051
1118
|
}
|
|
@@ -1066,6 +1133,14 @@ class StackViewport extends Viewport {
|
|
|
1066
1133
|
return;
|
|
1067
1134
|
}
|
|
1068
1135
|
resetCamera(this._cpuFallbackEnabledElement, resetPan, resetZoom);
|
|
1136
|
+
const { scale } = this._cpuFallbackEnabledElement.viewport;
|
|
1137
|
+
const { clientWidth, clientHeight } = this.element;
|
|
1138
|
+
const center = [clientWidth / 2, clientHeight / 2];
|
|
1139
|
+
const centerWorld = this.canvasToWorldCPU(center);
|
|
1140
|
+
this.setCameraCPU({
|
|
1141
|
+
focalPoint: centerWorld,
|
|
1142
|
+
scale,
|
|
1143
|
+
});
|
|
1069
1144
|
}
|
|
1070
1145
|
resetCameraGPU(resetPan, resetZoom) {
|
|
1071
1146
|
return super.resetCamera(resetPan, resetZoom);
|
|
@@ -1263,6 +1338,34 @@ class StackViewport extends Viewport {
|
|
|
1263
1338
|
unsetColormapGPU() {
|
|
1264
1339
|
throw new Error('unsetColormapGPU not implemented.');
|
|
1265
1340
|
}
|
|
1341
|
+
_getImagePlaneModule(imagePlaneModule) {
|
|
1342
|
+
const newImagePlaneModule = {
|
|
1343
|
+
...imagePlaneModule,
|
|
1344
|
+
};
|
|
1345
|
+
if (!newImagePlaneModule.columnPixelSpacing) {
|
|
1346
|
+
newImagePlaneModule.columnPixelSpacing = 1;
|
|
1347
|
+
this.hasPixelSpacing = false;
|
|
1348
|
+
}
|
|
1349
|
+
if (!newImagePlaneModule.rowPixelSpacing) {
|
|
1350
|
+
newImagePlaneModule.rowPixelSpacing = 1;
|
|
1351
|
+
this.hasPixelSpacing = false;
|
|
1352
|
+
}
|
|
1353
|
+
if (!newImagePlaneModule.columnCosines) {
|
|
1354
|
+
newImagePlaneModule.columnCosines = [0, 1, 0];
|
|
1355
|
+
}
|
|
1356
|
+
if (!newImagePlaneModule.rowCosines) {
|
|
1357
|
+
newImagePlaneModule.rowCosines = [1, 0, 0];
|
|
1358
|
+
}
|
|
1359
|
+
if (!newImagePlaneModule.imagePositionPatient) {
|
|
1360
|
+
newImagePlaneModule.imagePositionPatient = [0, 0, 0];
|
|
1361
|
+
}
|
|
1362
|
+
if (!newImagePlaneModule.imageOrientationPatient) {
|
|
1363
|
+
newImagePlaneModule.imageOrientationPatient = new Float32Array([
|
|
1364
|
+
1, 0, 0, 0, 1, 0,
|
|
1365
|
+
]);
|
|
1366
|
+
}
|
|
1367
|
+
return newImagePlaneModule;
|
|
1368
|
+
}
|
|
1266
1369
|
}
|
|
1267
1370
|
export default StackViewport;
|
|
1268
1371
|
//# sourceMappingURL=StackViewport.js.map
|