2025-11-13 13:12:28 +01:00
|
|
|
import { Enums as csToolsEnums } from '@cornerstonejs/tools';
|
|
|
|
|
|
2025-05-16 19:33:57 +02:00
|
|
|
import {
|
2025-10-29 19:15:52 +01:00
|
|
|
setUpSelectedSegmentationsForViewportHandler,
|
2025-05-16 19:33:57 +02:00
|
|
|
setupSegmentationDataModifiedHandler,
|
|
|
|
|
setupSegmentationModifiedHandler,
|
|
|
|
|
} from './segmentationHandlers';
|
|
|
|
|
|
|
|
|
|
export const setUpSegmentationEventHandlers = ({ servicesManager, commandsManager }) => {
|
2026-02-19 02:31:43 +01:00
|
|
|
const { segmentationService, customizationService, displaySetService, viewportGridService } =
|
|
|
|
|
servicesManager.services;
|
2025-05-16 19:33:57 +02:00
|
|
|
|
|
|
|
|
const { unsubscribe: unsubscribeSegmentationDataModifiedHandler } =
|
|
|
|
|
setupSegmentationDataModifiedHandler({
|
|
|
|
|
segmentationService,
|
|
|
|
|
customizationService,
|
|
|
|
|
commandsManager,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { unsubscribe: unsubscribeSegmentationModifiedHandler } = setupSegmentationModifiedHandler({
|
|
|
|
|
segmentationService,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { unsubscribe: unsubscribeSegmentationCreated } = segmentationService.subscribe(
|
|
|
|
|
segmentationService.EVENTS.SEGMENTATION_ADDED,
|
|
|
|
|
evt => {
|
|
|
|
|
const { segmentationId } = evt;
|
|
|
|
|
const displaySet = displaySetService.getDisplaySetByUID(segmentationId);
|
|
|
|
|
if (displaySet) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const segmentation = segmentationService.getSegmentation(segmentationId);
|
2025-11-13 13:12:28 +01:00
|
|
|
const label = segmentation.label;
|
2025-10-29 19:15:52 +01:00
|
|
|
const imageIds =
|
|
|
|
|
segmentation.representationData?.Labelmap?.imageIds ??
|
|
|
|
|
segmentation.representationData?.Contour?.imageIds;
|
2025-05-16 19:33:57 +02:00
|
|
|
|
|
|
|
|
// Create a display set for the segmentation
|
|
|
|
|
const segmentationDisplaySet = {
|
|
|
|
|
displaySetInstanceUID: segmentationId,
|
|
|
|
|
SOPClassUID: '1.2.840.10008.5.1.4.1.1.66.4',
|
|
|
|
|
SOPClassHandlerId: '@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg',
|
|
|
|
|
SeriesDescription: label,
|
2025-11-13 13:12:28 +01:00
|
|
|
Modality: segmentation.representationData[csToolsEnums.SegmentationRepresentations.Contour]
|
|
|
|
|
? 'RTSTRUCT'
|
|
|
|
|
: 'SEG',
|
2025-05-16 19:33:57 +02:00
|
|
|
numImageFrames: imageIds.length,
|
|
|
|
|
imageIds,
|
|
|
|
|
isOverlayDisplaySet: true,
|
|
|
|
|
label,
|
|
|
|
|
madeInClient: true,
|
|
|
|
|
segmentationId: segmentationId,
|
|
|
|
|
isDerived: true,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
displaySetService.addDisplaySets(segmentationDisplaySet);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2026-02-19 02:31:43 +01:00
|
|
|
const { unsubscribe: unsubscribeSegmentationRemoved } = segmentationService.subscribe(
|
|
|
|
|
segmentationService.EVENTS.SEGMENTATION_REMOVED,
|
|
|
|
|
({ segmentationId }) => {
|
|
|
|
|
const displaySet = displaySetService.getDisplaySetByUID(segmentationId);
|
|
|
|
|
|
|
|
|
|
// Remove the display set layer from all viewports that have it
|
|
|
|
|
if (displaySet) {
|
|
|
|
|
const state = viewportGridService.getState();
|
|
|
|
|
const viewports = state.viewports;
|
|
|
|
|
|
|
|
|
|
// Find all viewports that contain this segmentation's display set as a layer
|
|
|
|
|
for (const [viewportId, viewport] of viewports.entries()) {
|
|
|
|
|
const displaySetInstanceUIDs = viewport.displaySetInstanceUIDs || [];
|
|
|
|
|
if (displaySetInstanceUIDs.includes(segmentationId)) {
|
|
|
|
|
// Remove the display set layer from this viewport
|
|
|
|
|
commandsManager.runCommand('removeDisplaySetLayer', {
|
|
|
|
|
viewportId,
|
|
|
|
|
displaySetInstanceUID: segmentationId,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Delete the display set from the service if it was made in client
|
|
|
|
|
if (displaySet.madeInClient) {
|
|
|
|
|
displaySetService.deleteDisplaySet(segmentationId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2025-10-29 19:15:52 +01:00
|
|
|
const { unsubscribeSelectedSegmentationsForViewportEvents } =
|
|
|
|
|
setUpSelectedSegmentationsForViewportHandler({
|
|
|
|
|
segmentationService,
|
|
|
|
|
});
|
|
|
|
|
|
2025-05-16 19:33:57 +02:00
|
|
|
const unsubscriptions = [
|
|
|
|
|
unsubscribeSegmentationDataModifiedHandler,
|
|
|
|
|
unsubscribeSegmentationModifiedHandler,
|
|
|
|
|
unsubscribeSegmentationCreated,
|
2026-02-19 02:31:43 +01:00
|
|
|
unsubscribeSegmentationRemoved,
|
2025-10-29 19:15:52 +01:00
|
|
|
...unsubscribeSelectedSegmentationsForViewportEvents,
|
2025-05-16 19:33:57 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return { unsubscriptions };
|
|
|
|
|
};
|