fix: Call load if necessary before rehydration prompt. Jump to first measurement on rehydration (OHIF-369) (#2184)

This commit is contained in:
Erik Ziegler authored and GitHub committed 2020-11-25 13:35:43 +01:00
1 parent 2f4cba28a5
commit e0a31caebf
9 files changed
+59 -49

No files matched your search

@@ -122,9 +122,7 @@ function _load(displaySet, servicesManager, extensionManager) {
);
displaySet.isHydrated = false;
displaySet.isRehydratable = isRehydratable(displaySet, mappings)
? true
: false;
displaySet.isRehydratable = isRehydratable(displaySet, mappings);
displaySet.isLoaded = true;
// Check currently added displaySets and add measurements if the sources exist.
@@ -3,7 +3,7 @@ import { adapters } from 'dcmjs';
const cornerstoneAdapters = adapters.Cornerstone;
/**
* Checks if the given `displySet`can be rehydrated into the `MeasurementService`.
* Checks if the given `displaySet`can be rehydrated into the `MeasurementService`.
*
* @param {object} displaySet The SR `displaySet` to check.
* @param {object[]} mappings The CornerstoneTools 4 mappings to the `MeasurementService`.
@@ -205,6 +205,8 @@ function OHIFCornerstoneSRViewport({
setTrackingUniqueIdentifiersForElement(targetElement);
setElement(targetElement);
// TODO: Enabled Element appears to be incorrect here, it should be called
// 'element' since it is the DOM element, not the enabledElement object
const OHIFCornerstoneEnabledElementEvent = new CustomEvent(
'ohif-cornerstone-enabled-element-event',
{
@@ -3,7 +3,7 @@ import cornerstoneTools from 'cornerstone-tools';
const { globalImageIdSpecificToolStateManager } = cornerstoneTools;
export default function setMeasurementActive(measurement) {
export default function setCornerstoneMeasurementActive(measurement) {
const { id } = measurement;
const toolState = globalImageIdSpecificToolStateManager.saveToolState();
@@ -18,6 +18,8 @@ const TrackedMeasurementsContext = React.createContext();
TrackedMeasurementsContext.displayName = 'TrackedMeasurementsContext';
const useTrackedMeasurements = () => useContext(TrackedMeasurementsContext);
const SR_SOPCLASSHANDLERID = "org.ohif.dicom-sr.sopClassHandlerModule.dicom-sr";
/**
*
* @param {*} param0
@@ -31,21 +33,19 @@ function TrackedMeasurementsContextProvider(
const machineOptions = Object.assign({}, defaultOptions);
machineOptions.actions = Object.assign({}, machineOptions.actions, {
showSeriesInActiveViewport: (ctx, evt) => {
const { DisplaySetService } = servicesManager.services;
const displaySetsForHydratedSeries = DisplaySetService.getDisplaySetsForSeries(
ctx.trackedSeries[0]
jumpToFirstMeasurementInActiveViewport: (ctx, evt) => {
const { DisplaySetService, MeasurementService } = servicesManager.services;
const { trackedStudy, trackedSeries } = ctx;
const measurements = MeasurementService.getMeasurements();
const trackedMeasurements = measurements.filter(
m =>
trackedStudy === m.referenceStudyUID &&
trackedSeries.includes(m.referenceSeriesUID)
);
if (displaySetsForHydratedSeries.length > 0) {
const firstDisplaySetInstanceUID =
displaySetsForHydratedSeries[0].displaySetInstanceUID;
const id = trackedMeasurements[0].id;
viewportGridService.setDisplaysetForViewport({
viewportIndex: evt.data.viewportIndex,
displaySetInstanceUID: firstDisplaySetInstanceUID,
});
}
MeasurementService.jumpToMeasurement(viewportGrid.activeViewportIndex, id);
},
showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => {
if (evt.data.createdDisplaySetInstanceUIDs.length > 0) {
@@ -136,11 +136,29 @@ function TrackedMeasurementsContextProvider(
activeViewport.displaySetInstanceUID
);
// If this is an SR produced by our SR SOPClassHandler,
// and it hasn't been loaded yet, do that now so we
// can check if it can be rehydrated or not.
//
// Note: This happens:
// - If the viewport is not currently an OHIFCornerstoneSRViewport
// - If the displaySet has never been hung
//
// Otherwise, the displaySet will be loaded by the useEffect handler
// listening to displaySet changes inside OHIFCornerstoneSRViewport.
// The issue here is that this handler in TrackedMeasurementsContext
// ends up occurring before the Viewport is created, so the displaySet
// is not loaded yet, and isRehydratable is undefined unless we call load().
if (displaySet.SOPClassHandlerId === SR_SOPCLASSHANDLERID &&
!displaySet.isLoaded &&
displaySet.load) {
displaySet.load();
}
// Magic string
// load function added by our sopClassHandler module
if (
displaySet.SOPClassHandlerId ===
'org.ohif.dicom-sr.sopClassHandlerModule.dicom-sr' &&
displaySet.SOPClassHandlerId === SR_SOPCLASSHANDLERID &&
displaySet.isRehydratable === true
) {
console.log('sending event...', trackedMeasurements);
@@ -211,7 +211,7 @@ const machineConfiguration = {
target: 'tracking',
actions: [
'setTrackedStudyAndMultipleSeries',
'showSeriesInActiveViewport',
'jumpToFirstMeasurementInActiveViewport',
'setIsDirtyToClean',
],
cond: 'shouldHydrateStructuredReport',
@@ -248,8 +248,8 @@ const defaultOptions = {
clearAllMeasurements: (ctx, evt) => {
console.log('clearAllMeasurements: not implemented');
},
showSeriesInActiveViewport: (ctx, evt) => {
console.warn('showSeriesInActiveViewport: not implemented');
jumpToFirstMeasurementInActiveViewport: (ctx, evt) => {
console.warn('jumpToFirstMeasurementInActiveViewport: not implemented');
},
showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => {
console.warn(
@@ -78,7 +78,7 @@ function TrackedCornerstoneViewport({
}, [viewportIndex]);
useEffect(() => {
const unsubcribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents(
const unsubscribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents(
MeasurementService,
DisplaySetService,
element,
@@ -95,7 +95,7 @@ function TrackedCornerstoneViewport({
);
return () => {
unsubcribeFromJumpToMeasurementEvents();
unsubscribeFromJumpToMeasurementEvents();
};
}, [element, displaySet]);
@@ -605,19 +605,20 @@ function _jumpToMeasurement(
if (targetElement !== null) {
const enabledElement = cornerstone.getEnabledElement(targetElement);
if (enabledElement.image) {
// Wait for the image to update or we get a race condition when the element has only just been enabled.
const scrollToHandler = evt => {
scrollToIndex(targetElement, imageIndex);
targetElement.removeEventListener(
'cornerstoneimagerendered',
scrollToHandler
);
};
targetElement.addEventListener(
// Wait for the image to update or we get a race condition when the element has only just been enabled.
const scrollToHandler = evt => {
scrollToIndex(targetElement, imageIndex);
targetElement.removeEventListener(
'cornerstoneimagerendered',
scrollToHandler
);
};
targetElement.addEventListener(
'cornerstoneimagerendered',
scrollToHandler
);
if (enabledElement.image) {
cornerstone.updateImage(targetElement);
}