All files / packages/core/src/RenderingEngine VolumeViewport3D.ts

37.14% Statements 13/35
26.31% Branches 5/19
33.33% Functions 3/9
35.29% Lines 12/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127                                        1x   1x   1x   1x       1x 1x                 2x 2x 2x     6x   1x       1x                                                                                                                                                      
import { BlendModes, OrientationAxis, Events } from '../enums';
import { RENDERING_DEFAULTS } from '../constants';
import cache from '../cache';
import setDefaultVolumeVOI from './helpers/setDefaultVolumeVOI';
import { triggerEvent, isImageActor } from '../utilities';
import { setTransferFunctionNodes } from '../utilities/transferFunctionUtils';
import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';
import type { ViewportInput } from '../types/IViewport';
import type { ImageActor } from '../types/IActor';
import BaseVolumeViewport from './BaseVolumeViewport';
 
/**
 * An object representing a 3-dimensional volume viewport. VolumeViewport3Ds are used to render
 * 3D volumes in their entirety, and not just load a single slice at a time.
 *
 * For setting volumes on viewports you need to use {@link addVolumesToViewports}
 * which will add volumes to the specified viewports.
 */
class VolumeViewport3D extends BaseVolumeViewport {
  constructor(props: ViewportInput) {
    super(props);
 
    const { parallelProjection, orientation } = this.options;
 
    const activeCamera = this.getVtkActiveCamera();
 
    Iif (parallelProjection != null) {
      activeCamera.setParallelProjection(parallelProjection);
    }
 
    Eif (orientation && orientation !== OrientationAxis.ACQUISITION) {
      this.applyViewOrientation(orientation);
    }
  }
 
  public resetCamera(
    resetPan = true,
    resetZoom = true,
    resetToCenter = true
  ): boolean {
    super.resetCamera(resetPan, resetZoom, resetToCenter);
    this.resetVolumeViewportClippingRange();
    return;
  }
 
  getRotation = (): number => 0;
 
  getCurrentImageIdIndex = (): number | undefined => {
    return undefined;
  };
 
  getCurrentImageId = (): string => {
    return null;
  };
 
  setSlabThickness(
    slabThickness: number,
    filterActorUIDs?: Array<string>
  ): void {
    return null;
  }
 
  setBlendMode(
    blendMode: BlendModes,
    filterActorUIDs?: string[],
    immediate?: boolean
  ): void {
    return null;
  }
 
  /**
   * Resets the properties of the volume to their default values.
   *
   * @param [volumeId] - The id of the volume to reset. If not provided, the default volume will be reset.
   */
  resetProperties(volumeId?: string): void {
    const volumeActor = volumeId
      ? this.getActor(volumeId)
      : this.getDefaultActor();
 
    if (!volumeActor) {
      throw new Error(`No actor found for the given volumeId: ${volumeId}`);
    }
 
    // if a custom slabThickness was set, we need to reset it
    if (volumeActor.slabThickness) {
      volumeActor.slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;
      this.viewportProperties.slabThickness = undefined;
      this.updateClippingPlanesForActors(this.getCamera());
    }
 
    const imageVolume = cache.getVolume(volumeActor.uid);
 
    if (!imageVolume) {
      throw new Error(
        `imageVolume with id: ${volumeActor.uid} does not exist in cache`
      );
    }
 
    setDefaultVolumeVOI(volumeActor.actor as vtkVolume, imageVolume, false);
 
    if (isImageActor(volumeActor)) {
      const transferFunction = (volumeActor.actor as ImageActor)
        .getProperty()
        .getRGBTransferFunction(0);
 
      setTransferFunctionNodes(
        transferFunction,
        this.initialTransferFunctionNodes
      );
    }
 
    this.setCamera(this.initialCamera);
    triggerEvent(
      this.element,
      Events.VOI_MODIFIED,
      super.getVOIModifiedEventDetail(volumeId)
    );
  }
 
  resetSlabThickness(): void {
    return null;
  }
}
 
export default VolumeViewport3D;