From 84a097212babc0f98198b9ced1def9743973a5a8 Mon Sep 17 00:00:00 2001 From: Danny Brown Date: Mon, 11 Nov 2019 04:38:36 -0500 Subject: [PATCH] fix: mpr2d vtkjs viewport does not render if range is set to `NaN` values (#1157) * chore: fix proptypes declaration * fix: seperate helper method to calculate our initial range * chore: remove unused import * chore: update studies propType from object to array --- extensions/vtk/src/OHIFVTKViewport.js | 70 +++++++++++++++++++++------ extensions/vtk/src/commandsModule.js | 1 - 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/extensions/vtk/src/OHIFVTKViewport.js b/extensions/vtk/src/OHIFVTKViewport.js index e2c48a49a..8926bdcf9 100644 --- a/extensions/vtk/src/OHIFVTKViewport.js +++ b/extensions/vtk/src/OHIFVTKViewport.js @@ -65,8 +65,16 @@ class OHIFVTKViewport extends Component { }; static propTypes = { - studies: PropTypes.object, - displaySet: PropTypes.object, + viewportData: PropTypes.shape({ + studies: PropTypes.array, + displaySet: PropTypes.shape({ + studyInstanceUid: PropTypes.string, + displaySetInstanceUid: PropTypes.string, + sopClassUids: PropTypes.arrayOf(PropTypes.string), + sopInstanceUid: PropTypes.string, + frameIndex: PropTypes.number, + }), + }), viewportIndex: PropTypes.number, children: PropTypes.node, }; @@ -175,6 +183,19 @@ class OHIFVTKViewport extends Component { } }; + /** + * + * + * @param {object} imageDataObject + * @param {object} imageDataObject.vtkImageData + * @param {object} imageDataObject.imageMetaData0 + * @param {number} [imageDataObject.imageMetaData0.windowWidth] - The volume's initial windowWidth + * @param {number} [imageDataObject.imageMetaData0.windowCenter] - The volume's initial windowCenter + * @param {string} imageDataObject.imageMetaData0.modality - CT, MR, PT, etc + * @param {string} displaySetInstanceUid + * @returns vtkVolumeActor + * @memberof OHIFVTKViewport + */ getOrCreateVolume(imageDataObject, displaySetInstanceUid) { if (volumeCache[displaySetInstanceUid]) { return volumeCache[displaySetInstanceUid]; @@ -183,18 +204,11 @@ class OHIFVTKViewport extends Component { const { vtkImageData, imageMetaData0 } = imageDataObject; const { windowWidth, windowCenter, modality } = imageMetaData0; - let lower; - let upper; - - if (modality === 'PT') { - // For PET just set the range to 0-5 SUV - lower = 0; - upper = 5; - } else { - lower = windowCenter - windowWidth / 2.0; - upper = windowCenter + windowWidth / 2.0; - } - + const { lower, upper } = _getRangeFromWindowLevels( + windowWidth, + windowCenter, + modality + ); const volumeActor = vtkVolume.newInstance(); const volumeMapper = vtkVolumeMapper.newInstance(); @@ -379,4 +393,32 @@ class OHIFVTKViewport extends Component { } } +/** + * Takes window levels and converts them to a range (lower/upper) + * for use with VTK RGBTransferFunction + * + * @private + * @param {number} [width] - the width of our window + * @param {number} [center] - the center of our window + * @param {string} [modality] - 'PT', 'CT', etc. + * @returns { lower, upper } - range + */ +function _getRangeFromWindowLevels(width, center, modality = undefined) { + const levelsAreNotNumbers = isNaN(center) || isNaN(width); + + if (levelsAreNotNumbers) { + return { lower: 0, upper: 512 }; + } + + // For PET just set the range to 0-5 SUV + if (modality === 'PT') { + return { lower: 0, upper: 5 }; + } + + return { + lower: center - width / 2.0, + upper: center + width / 2.0, + }; +} + export default OHIFVTKViewport; diff --git a/extensions/vtk/src/commandsModule.js b/extensions/vtk/src/commandsModule.js index de21e0dd3..d9dff5d99 100644 --- a/extensions/vtk/src/commandsModule.js +++ b/extensions/vtk/src/commandsModule.js @@ -1,7 +1,6 @@ import { vtkInteractorStyleMPRCrosshairs, vtkInteractorStyleMPRWindowLevel, - vtkInteractorStyleMPRSlice, vtkInteractorStyleMPRRotate, vtkSVGCrosshairsWidget, } from 'react-vtkjs-viewport';