fix(hydration): Maintain the same slice that the user was on pre hydration in post hydration for SR and SEG. (#4200)

This commit is contained in:
Ibrahim 2024-06-05 10:07:53 -04:00 committed by GitHub
parent ddc7559e16
commit 430330f7e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 60 additions and 10 deletions

View File

@ -48,6 +48,7 @@ const commandsModule = ({
displaySetService,
viewportGridService,
toolGroupService,
cornerstoneViewportService,
} = servicesManager.services;
const actions = {
@ -210,6 +211,8 @@ const commandsModule = ({
const referencedDisplaySet = displaySetService.getDisplaySetByUID(
displaySet.referencedDisplaySetInstanceUID
);
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
const initialSliceIndex = viewport.getSliceIndex();
updateViewportsForSegmentationRendering({
viewportId,
@ -229,6 +232,7 @@ const commandsModule = ({
segmentation.description = `S${referencedDisplaySet.SeriesNumber}: ${referencedDisplaySet.SeriesDescription}`;
return segmentationId;
},
initialSliceIndex,
});
},
/**

View File

@ -11,6 +11,7 @@ import { Enums, cache } from '@cornerstonejs/core';
* @param params.loadFn - Function to load the segmentation data.
* @param params.servicesManager - The services manager.
* @param params.displaySet - the display set.
* @param params.initialSliceIndex - The initial slice index.
*
* @returns Returns true upon successful update of viewports for segmentation rendering.
*/
@ -19,11 +20,13 @@ async function updateViewportsForSegmentationRendering({
loadFn,
servicesManager,
displaySet,
initialSliceIndex = null,
}: {
viewportId: string;
loadFn: () => Promise<string>;
servicesManager: AppTypes.ServicesManager;
displaySet?: any;
initialSliceIndex?: number;
}) {
const { cornerstoneViewportService, segmentationService, viewportGridService } =
servicesManager.services;
@ -61,6 +64,14 @@ async function updateViewportsForSegmentationRendering({
};
const viewportId = viewport.viewportId;
// maintain the prehydration slice on the target viewport only
if (viewportId === targetViewportId) {
viewport.viewportOptions.initialImageOptions = {
index: initialSliceIndex,
useOnce: true,
};
}
const csViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
const prevCamera = csViewport.getCamera();

View File

@ -1,5 +1,5 @@
import { PubSubService } from '@ohif/core';
import * as OhifTypes from '@ohif/core/types';
import { Types as OhifTypes } from '@ohif/core';
import {
RenderingEngine,
StackViewport,
@ -617,11 +617,9 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
imageIds?: string[]
): number {
const initialImageOptions = viewportInfo.getInitialImageOptions();
if (!initialImageOptions) {
return;
}
const { index, preset } = initialImageOptions;
const viewportType = viewportInfo.getViewportType();

View File

@ -16,6 +16,7 @@ import { SyncGroup } from '../SyncGroupService/SyncGroupService';
export type InitialImageOptions = {
index?: number;
preset?: JumpPresets;
useOnce?: boolean;
};
export type ViewportOptions = {

View File

@ -120,10 +120,10 @@ function getHangingProtocolModule() {
name: hpMammography.id,
protocol: hpMammography,
},
// {
// name: hpScale.id,
// protocol: hpScale,
// },
{
name: hpScale.id,
protocol: hpScale,
},
];
}

View File

@ -31,7 +31,12 @@ function TrackedMeasurementsContextProvider(
const [viewportGrid, viewportGridService] = useViewportGrid();
const { activeViewportId, viewports } = viewportGrid;
const { measurementService, displaySetService, customizationService } = servicesManager.services;
const {
measurementService,
displaySetService,
customizationService,
cornerstoneViewportService,
} = servicesManager.services;
const machineOptions = Object.assign({}, defaultOptions);
machineOptions.actions = Object.assign({}, machineOptions.actions, {
@ -81,6 +86,29 @@ function TrackedMeasurementsContextProvider(
},
});
},
jumpToSameImageInActiveViewport: (ctx, evt) => {
const { trackedStudy, trackedSeries, activeViewportId } = ctx;
const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter(
m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)
);
const trackedMeasurement = trackedMeasurements[0];
const referencedDisplaySetUID = trackedMeasurement.displaySetInstanceUID;
const viewport = cornerstoneViewportService.getCornerstoneViewport(activeViewportId);
const imageIndex = viewport.getCurrentImageIdIndex();
viewportGridService.setDisplaySetsForViewport({
viewportId: activeViewportId,
displaySetInstanceUIDs: [referencedDisplaySetUID],
viewportOptions: {
initialImageOptions: {
index: imageIndex,
},
},
});
},
showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => {
if (evt.data.createdDisplaySetInstanceUIDs.length > 0) {
const StructuredReportDisplaySetInstanceUID = evt.data.createdDisplaySetInstanceUIDs[0];

View File

@ -250,7 +250,7 @@ const machineConfiguration = {
target: 'tracking',
actions: [
'setTrackedStudyAndMultipleSeries',
'jumpToFirstMeasurementInActiveViewport',
'jumpToSameImageInActiveViewport',
'setIsDirtyToClean',
],
cond: 'shouldHydrateStructuredReport',
@ -274,7 +274,7 @@ const machineConfiguration = {
target: 'tracking',
actions: [
'setTrackedStudyAndMultipleSeries',
'jumpToFirstMeasurementInActiveViewport',
'jumpToSameImageInActiveViewport',
'setIsDirtyToClean',
],
},

View File

@ -160,6 +160,14 @@ export function ViewportGridProvider({ children, service }) {
const previousViewport = viewports.get(viewportId);
// remove options that were meant for one time usage
if (previousViewport?.viewportOptions?.initialImageOptions) {
const { useOnce } = previousViewport.viewportOptions.initialImageOptions;
if (useOnce) {
previousViewport.viewportOptions.initialImageOptions = null;
}
}
// Use the newly provide viewportOptions and display set options
// when provided, and otherwise fall back to the previous ones.
// That allows for easy updates of just the display set.