From ec7dc7ca5a6335915e6b7be8b586b4fdf4cdb9b1 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Mon, 14 May 2018 14:39:38 +0200 Subject: [PATCH] fix(windowLevelPresets) Apply W/L from Image by default when displaying a new image, unless a Custom W/L or W/L Preset has been applied. --- .../imageViewerViewport.js | 14 +++++++- .../ohif-viewerbase/client/lib/WLPresets.js | 36 +++++++++++-------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js b/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js index cba663bc8..5cb543392 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js +++ b/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js @@ -27,6 +27,8 @@ const allCornerstoneEvents = ['click', 'cornerstonetoolsmousedown', 'cornerstone * @param data {object} Object containing the study, series, and viewport element to be used */ const loadDisplaySetIntoViewport = (data, templateData) => { + const wlPresets = OHIF.viewerbase.wlPresets; + OHIF.log.info('imageViewerViewport loadDisplaySetIntoViewport'); // Make sure we have all the data required to render the series @@ -211,6 +213,9 @@ const loadDisplaySetIntoViewport = (data, templateData) => { cornerstone.resize(element, true); } + // Set/store W/L preset data to Default on first display + wlPresets.updateElementWLPresetData(element); + // Remove the data for this viewport from the ViewportLoading object // This will stop the loading percentage complete from being displayed. delete window.ViewportLoading[viewportIndex]; @@ -274,6 +279,7 @@ const loadDisplaySetIntoViewport = (data, templateData) => { // (e.g. following a change of window or zoom) const onImageRendered = (event) => { const eventData = event.detail; + const { viewport, element } = eventData; // Attention: Adding OHIF.log.info in this function may decrease the performance // since this callback function is called multiple times (eg: when a tool is @@ -288,10 +294,12 @@ const loadDisplaySetIntoViewport = (data, templateData) => { Session.set('CornerstoneImageRendered' + viewportIndex, Math.random()); // Save the current viewport into the OHIF.viewer.data global variable - const viewport = cornerstone.getViewport(element); layoutManager.viewportData[viewportIndex].viewport = viewport; OHIF.viewer.data.loadedSeriesData[viewportIndex].viewport = viewport; + // Update the W/L Preset data, if necessary + wlPresets.updateElementWLPresetData(element); + // Check if it has onImageRendered loadAndCacheImage callback if (typeof callbacks.onImageRendered === 'function') { callbacks.onImageRendered(event, eventData, viewportIndex, templateData); @@ -345,6 +353,10 @@ const loadDisplaySetIntoViewport = (data, templateData) => { OHIF.viewer.data.loadedSeriesData[viewportIndex].currentImageIdIndex = imageIdIndex; } + const wlPresetData = cornerstone.getElementData(element, 'wlPreset'); + const wlPresetDataName = wlPresetData && wlPresetData.name; + wlPresets.applyWLPreset(wlPresetDataName, element); + // Check if it has onNewImage loadAndCacheImage callback if (typeof callbacks.onNewImage === 'function') { callbacks.onNewImage(event, eventData, viewportIndex, templateData); diff --git a/Packages/ohif-viewerbase/client/lib/WLPresets.js b/Packages/ohif-viewerbase/client/lib/WLPresets.js index 551398c8e..5e8af1b03 100644 --- a/Packages/ohif-viewerbase/client/lib/WLPresets.js +++ b/Packages/ohif-viewerbase/client/lib/WLPresets.js @@ -6,8 +6,8 @@ import { OHIF } from 'meteor/ohif:core'; import { cornerstone } from 'meteor/ohif:cornerstone'; import { viewportUtils } from './viewportUtils'; -const WL_PRESET_CUSTOM = 'Custom'; -const WL_PRESET_DEFAULT = 'Default'; +const WL_PRESET_CUSTOM = 'WL_PRESET_CUSTOM'; +const WL_PRESET_DEFAULT = 'WL_PRESET_DEFAULT'; const WL_STORAGE_KEY = `WindowLevelPresetsDefinitions`; OHIF.viewer.defaultWLPresets = { @@ -59,29 +59,37 @@ class WindowLevelPresetsManager { this.storeFunction = storeFunction; } + /** + * Updates the enabledElement data for the Cornerstone element + * to reflect the current W/L preset which is applied. + * + * @param {HTMLElement} element + */ updateElementWLPresetData(element) { const wlPresetData = cornerstone.getElementData(element, 'wlPreset'); const enabledElement = cornerstone.getEnabledElement(element); const { viewport, image } = enabledElement; const { windowCenter, windowWidth } = viewport.voi; - let preset, presetName; + let presetName; if (windowWidth === image.windowWidth && windowCenter === image.windowCenter) { presetName = WL_PRESET_DEFAULT; } else { const WLPresets = OHIF.viewer.wlPresets; - for (let index in WLPresets) { - if (!WLPresets.hasOwnProperty(index)) continue; - const currentPreset = WLPresets[index]; - if (windowCenter === currentPreset.wc && windowWidth === currentPreset.ww) { - preset = currentPreset; - presetName = preset.id; - break; - } + + const currentPreset = Object.values(WLPresets).find(currentPreset => { + return (windowCenter === currentPreset.wc && + windowWidth === currentPreset.ww); + }); + + if (currentPreset) { + presetName = currentPreset.id; + } else { + presetName = WL_PRESET_CUSTOM; } } - wlPresetData.name = presetName || WL_PRESET_CUSTOM; + wlPresetData.name = presetName; wlPresetData.ww = windowWidth; wlPresetData.wc = windowCenter; @@ -95,7 +103,7 @@ class WindowLevelPresetsManager { /** * Set specified W/L preset on given element on fallback to default W/L preset if the specified preset is not valid. * @param {String} presetName The desired W/L preset to be applied - * @param {DOMElement} element An enabled viewport DOM Element. + * @param {HTMLElement} element An enabled viewport DOM Element. */ applyWLPreset(presetName, element) { const wlPresets = OHIF.viewer.wlPresets; @@ -124,8 +132,6 @@ class WindowLevelPresetsManager { // Update the viewport cornerstone.setViewport(element, viewport); - OHIF.log.info('WLPresets::Applying WL Preset: ' + presetName); - // Notify other components about W/L Preset changes Session.set('OHIFWlPresetApplied', presetName); }