fix: Call load if necessary before rehydration prompt. Jump to first measurement on rehydration (OHIF-369) (#2184)
This commit is contained in:
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();
|
||||
|
||||
+32
-14
@@ -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);
|
||||
|
||||
+3
-3
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user