UNPKG

@cornerstonejs/core

Version:
70 lines (69 loc) 2.87 kB
import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane.js'; import vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice.js'; import { vtkSharedImageResliceMapper } from '../vtkClasses/index.js'; import { loadVolume } from '../../loaders/volumeLoader.js'; import triggerEvent from '../../utilities/triggerEvent.js'; import { Events } from '../../enums/index.js'; import setDefaultVolumeVOI from './setDefaultVolumeVOI.js'; async function createVolumeSliceActor(props, element, viewportId, suppressEvents = false) { const { volumeId, callback } = props; const imageVolume = await loadVolume(volumeId); if (!imageVolume) { throw new Error(`imageVolume with id: ${volumeId} does not exist`); } const { imageData, vtkOpenGLTexture } = imageVolume; const loadStatus = imageVolume.loadStatus; const slicePlane = vtkPlane.newInstance(); const mapper = vtkSharedImageResliceMapper.newInstance(); if (!loadStatus || loadStatus.loaded) { vtkOpenGLTexture.modified(); } mapper.setInputData(imageData); mapper.setSlicePlane(slicePlane); mapper.setSlabThickness(0); mapper.setScalarTexture?.(vtkOpenGLTexture); mapper.modified(); const actor = vtkImageSlice.newInstance(); actor.setMapper(mapper); const imageDataMetadata = imageData.get('numberOfComponents'); const numberOfComponents = imageDataMetadata?.numberOfComponents ?? 1; if (numberOfComponents > 1) { actor.getProperty().setIndependentComponents(false); } const imageProperty = actor.getProperty(); imageProperty.set({ viewportId }, true); await setDefaultVolumeVOI(actor, imageVolume); const defaultWindow = imageProperty.getColorWindow?.(); const defaultLevel = imageProperty.getColorLevel?.(); if (defaultWindow === 255 && defaultLevel === 127.5) { const scalarRange = imageVolume.voxelManager?.getRange?.(); if (scalarRange?.length === 2) { imageProperty.setColorWindow(scalarRange[1] - scalarRange[0]); imageProperty.setColorLevel((scalarRange[1] + scalarRange[0]) / 2); } } if (callback) { callback({ volumeActor: actor, volumeId }); } if (!suppressEvents) { triggerVOIModified(element, viewportId, actor, volumeId); } return { actor, slicePlane }; } function triggerVOIModified(element, viewportId, actor, volumeId) { const transferFunction = actor.getProperty().getRGBTransferFunction(0); if (!transferFunction) { return; } const voiRange = transferFunction.getRange(); const voiModifiedEventDetail = { viewportId, range: { lower: voiRange[0], upper: voiRange[1], }, volumeId, }; triggerEvent(element, Events.VOI_MODIFIED, voiModifiedEventDetail); } export default createVolumeSliceActor;