fix(Measurement tracking): Side panel study browser can now be closed and measurements are still tracked (#3530)
This commit is contained in:
parent
913264d289
commit
c3cd265430
@ -25,7 +25,6 @@ function PanelStudyBrowserTracking({
|
|||||||
dataSource,
|
dataSource,
|
||||||
}) {
|
}) {
|
||||||
const {
|
const {
|
||||||
measurementService,
|
|
||||||
displaySetService,
|
displaySetService,
|
||||||
uiDialogService,
|
uiDialogService,
|
||||||
hangingProtocolService,
|
hangingProtocolService,
|
||||||
@ -39,7 +38,7 @@ function PanelStudyBrowserTracking({
|
|||||||
// Tabs --> Studies --> DisplaySets --> Thumbnails
|
// Tabs --> Studies --> DisplaySets --> Thumbnails
|
||||||
const { StudyInstanceUIDs } = useImageViewer();
|
const { StudyInstanceUIDs } = useImageViewer();
|
||||||
const [
|
const [
|
||||||
{ activeViewportIndex, viewports, numCols, numRows },
|
{ activeViewportIndex, viewports },
|
||||||
viewportGridService,
|
viewportGridService,
|
||||||
] = useViewportGrid();
|
] = useViewportGrid();
|
||||||
const [
|
const [
|
||||||
@ -80,36 +79,6 @@ function PanelStudyBrowserTracking({
|
|||||||
const activeViewportDisplaySetInstanceUIDs =
|
const activeViewportDisplaySetInstanceUIDs =
|
||||||
viewports[activeViewportIndex]?.displaySetInstanceUIDs;
|
viewports[activeViewportIndex]?.displaySetInstanceUIDs;
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const added = measurementService.EVENTS.MEASUREMENT_ADDED;
|
|
||||||
const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED;
|
|
||||||
const subscriptions = [];
|
|
||||||
|
|
||||||
[added, addedRaw].forEach(evt => {
|
|
||||||
subscriptions.push(
|
|
||||||
measurementService.subscribe(evt, ({ source, measurement }) => {
|
|
||||||
const {
|
|
||||||
referenceSeriesUID: SeriesInstanceUID,
|
|
||||||
referenceStudyUID: StudyInstanceUID,
|
|
||||||
} = measurement;
|
|
||||||
|
|
||||||
sendTrackedMeasurementsEvent('SET_DIRTY', { SeriesInstanceUID });
|
|
||||||
sendTrackedMeasurementsEvent('TRACK_SERIES', {
|
|
||||||
viewportIndex: activeViewportIndex,
|
|
||||||
StudyInstanceUID,
|
|
||||||
SeriesInstanceUID,
|
|
||||||
});
|
|
||||||
}).unsubscribe
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
subscriptions.forEach(unsub => {
|
|
||||||
unsub();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}, [measurementService, activeViewportIndex, sendTrackedMeasurementsEvent]);
|
|
||||||
|
|
||||||
const { trackedSeries } = trackedMeasurements.context;
|
const { trackedSeries } = trackedMeasurements.context;
|
||||||
|
|
||||||
// ~~ studyDisplayList
|
// ~~ studyDisplayList
|
||||||
|
|||||||
@ -27,12 +27,17 @@ function TrackedCornerstoneViewport(props) {
|
|||||||
const {
|
const {
|
||||||
measurementService,
|
measurementService,
|
||||||
cornerstoneViewportService,
|
cornerstoneViewportService,
|
||||||
|
viewportGridService,
|
||||||
} = servicesManager.services;
|
} = servicesManager.services;
|
||||||
|
|
||||||
// Todo: handling more than one displaySet on the same viewport
|
// Todo: handling more than one displaySet on the same viewport
|
||||||
const displaySet = displaySets[0];
|
const displaySet = displaySets[0];
|
||||||
|
|
||||||
const [trackedMeasurements] = useTrackedMeasurements();
|
const [
|
||||||
|
trackedMeasurements,
|
||||||
|
sendTrackedMeasurementsEvent,
|
||||||
|
] = useTrackedMeasurements();
|
||||||
|
|
||||||
const [isTracked, setIsTracked] = useState(false);
|
const [isTracked, setIsTracked] = useState(false);
|
||||||
const [trackedMeasurementUID, setTrackedMeasurementUID] = useState(null);
|
const [trackedMeasurementUID, setTrackedMeasurementUID] = useState(null);
|
||||||
const [viewportElem, setViewportElem] = useState(null);
|
const [viewportElem, setViewportElem] = useState(null);
|
||||||
@ -149,6 +154,55 @@ function TrackedCornerstoneViewport(props) {
|
|||||||
};
|
};
|
||||||
}, [isTracked]);
|
}, [isTracked]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The effect for listening to measurement service measurement added events
|
||||||
|
* and in turn firing an event to update the measurement tracking state machine.
|
||||||
|
* The TrackedCornerstoneViewport is the best place for this because when
|
||||||
|
* a measurement is added, at least one TrackedCornerstoneViewport will be in
|
||||||
|
* the DOM and thus can react to the events fired.
|
||||||
|
*/
|
||||||
|
useEffect(() => {
|
||||||
|
const added = measurementService.EVENTS.MEASUREMENT_ADDED;
|
||||||
|
const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED;
|
||||||
|
const subscriptions = [];
|
||||||
|
|
||||||
|
[added, addedRaw].forEach(evt => {
|
||||||
|
subscriptions.push(
|
||||||
|
measurementService.subscribe(evt, ({ source, measurement }) => {
|
||||||
|
const { activeViewportIndex } = viewportGridService.getState();
|
||||||
|
|
||||||
|
// Each TrackedCornerstoneViewport receives the MeasurementService's events.
|
||||||
|
// Only send the tracked measurements event for the active viewport to avoid
|
||||||
|
// sending it more than once.
|
||||||
|
if (viewportIndex === activeViewportIndex) {
|
||||||
|
const {
|
||||||
|
referenceStudyUID: StudyInstanceUID,
|
||||||
|
referenceSeriesUID: SeriesInstanceUID,
|
||||||
|
} = measurement;
|
||||||
|
|
||||||
|
sendTrackedMeasurementsEvent('SET_DIRTY', { SeriesInstanceUID });
|
||||||
|
sendTrackedMeasurementsEvent('TRACK_SERIES', {
|
||||||
|
viewportIndex,
|
||||||
|
StudyInstanceUID,
|
||||||
|
SeriesInstanceUID,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).unsubscribe
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
subscriptions.forEach(unsub => {
|
||||||
|
unsub();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}, [
|
||||||
|
measurementService,
|
||||||
|
sendTrackedMeasurementsEvent,
|
||||||
|
viewportIndex,
|
||||||
|
viewportGridService,
|
||||||
|
]);
|
||||||
|
|
||||||
function switchMeasurement(direction) {
|
function switchMeasurement(direction) {
|
||||||
const newTrackedMeasurementUID = _getNextMeasurementUID(
|
const newTrackedMeasurementUID = _getNextMeasurementUID(
|
||||||
direction,
|
direction,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user