diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 864201457..58b6de9e5 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -6,6 +6,7 @@ import { Enums as CoreEnums, Types as CoreTypes, BaseVolumeViewport, + getRenderingEngines, } from '@cornerstonejs/core'; import { ToolGroupManager, @@ -1882,6 +1883,31 @@ function commandsModule({ const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); viewportInfo.setOrientation(orientation); }, + triggerCreateAnnotationMemo: ({ + annotation, + FrameOfReferenceUID, + options, + }: { + annotation: ToolTypes.Annotation; + FrameOfReferenceUID: string; + options: { newAnnotation?: boolean; deleting?: boolean }; + }): void => { + const { newAnnotation, deleting } = options; + const renderingEngines = getRenderingEngines(); + const viewports = renderingEngines.flatMap(re => re.getViewports()); + const validViewport = viewports.find( + vp => vp.getFrameOfReferenceUID() === FrameOfReferenceUID + ); + + if (!validViewport) { + return; + } + + cornerstoneTools.AnnotationTool.createAnnotationMemo(validViewport.element, annotation, { + newAnnotation, + deleting, + }); + }, }; const definitions = { @@ -2165,6 +2191,7 @@ function commandsModule({ setViewportOrientation: actions.setViewportOrientation, hydrateSecondaryDisplaySet: actions.hydrateSecondaryDisplaySet, getVolumeIdForDisplaySet: actions.getVolumeIdForDisplaySet, + triggerCreateAnnotationMemo: actions.triggerCreateAnnotationMemo, }; return { diff --git a/extensions/cornerstone/src/init.tsx b/extensions/cornerstone/src/init.tsx index 4b73e8cd9..397ba63c7 100644 --- a/extensions/cornerstone/src/init.tsx +++ b/extensions/cornerstone/src/init.tsx @@ -179,7 +179,11 @@ export default async function init({ initWADOImageLoader(userAuthenticationService, appConfig, extensionManager); /* Measurement Service */ - this.measurementServiceSource = connectToolsToMeasurementService(servicesManager); + this.measurementServiceSource = connectToolsToMeasurementService({ + servicesManager, + commandsManager, + extensionManager, + }); initCineService(servicesManager); initStudyPrefetcherService(servicesManager); diff --git a/extensions/cornerstone/src/initMeasurementService.ts b/extensions/cornerstone/src/initMeasurementService.ts index cec8cb106..fdb4c9427 100644 --- a/extensions/cornerstone/src/initMeasurementService.ts +++ b/extensions/cornerstone/src/initMeasurementService.ts @@ -188,13 +188,20 @@ const initMeasurementService = ( return csTools3DVer1MeasurementSource; }; -const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesManager) => { +const connectToolsToMeasurementService = ({ + commandsManager, + servicesManager, + extensionManager, +}: { + commandsManager: AppTypes.CommandsManager; + servicesManager: AppTypes.ServicesManager; + extensionManager: AppTypes.ExtensionManager; +}) => { const { measurementService, displaySetService, cornerstoneViewportService, customizationService, - viewportGridService, } = servicesManager.services; const csTools3DVer1MeasurementSource = initMeasurementService( measurementService, @@ -202,11 +209,7 @@ const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesMana cornerstoneViewportService, customizationService ); - connectMeasurementServiceToTools( - measurementService, - cornerstoneViewportService, - viewportGridService - ); + connectMeasurementServiceToTools({ servicesManager, commandsManager, extensionManager }); const { annotationToMeasurement, remove } = csTools3DVer1MeasurementSource; // @@ -332,11 +335,13 @@ const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesMana return csTools3DVer1MeasurementSource; }; -const connectMeasurementServiceToTools = ( - measurementService, - cornerstoneViewportService, - viewportGridService -) => { +const connectMeasurementServiceToTools = ({ + servicesManager, + commandsManager, + extensionManager, +}) => { + const { measurementService, cornerstoneViewportService, viewportGridService } = + servicesManager.services; const { MEASUREMENT_REMOVED, MEASUREMENTS_CLEARED, MEASUREMENT_UPDATED, RAW_MEASUREMENT_ADDED } = measurementService.EVENTS; @@ -350,7 +355,13 @@ const connectMeasurementServiceToTools = ( if (source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) { continue; } + const removedAnnotation = annotation.state.getAnnotation(uid); removeAnnotation(uid); + commandsManager.run('triggerCreateAnnotationMemo', { + annotation: removedAnnotation, + FrameOfReferenceUID: removedAnnotation.metadata.FrameOfReferenceUID, + options: { deleting: true }, + }); } // trigger a render @@ -441,7 +452,7 @@ const connectMeasurementServiceToTools = ( * This is not the read-only annotation rendered by the SR viewport. */ const annotationManager = annotation.state.getAnnotationManager(); - annotationManager.addAnnotation({ + const newAnnotation = { annotationUID: measurement.uid, highlighted: false, isLocked: false, @@ -463,6 +474,12 @@ const connectMeasurementServiceToTools = ( label: data.annotation.data.label, frameNumber, }, + }; + annotationManager.addAnnotation(newAnnotation); + commandsManager.run('triggerCreateAnnotationMemo', { + annotation: newAnnotation, + FrameOfReferenceUID: newAnnotation.metadata.FrameOfReferenceUID, + options: { newAnnotation: true }, }); } ); @@ -473,7 +490,13 @@ const connectMeasurementServiceToTools = ( if (source?.name && source.name !== CORNERSTONE_3D_TOOLS_SOURCE_NAME) { return; } + const removedAnnotation = annotation.state.getAnnotation(removedMeasurementId); removeAnnotation(removedMeasurementId); + commandsManager.run('triggerCreateAnnotationMemo', { + annotation: removedAnnotation, + FrameOfReferenceUID: removedAnnotation.metadata.FrameOfReferenceUID, + options: { deleting: true }, + }); const renderingEngine = cornerstoneViewportService.getRenderingEngine(); // Note: We could do a better job by triggering the render on the // viewport itself, but the removeAnnotation does not include that info... diff --git a/platform/docs/docs/migration-guide/3p10-to-3p11/other.md b/platform/docs/docs/migration-guide/3p10-to-3p11/other.md new file mode 100644 index 000000000..73a77bfa3 --- /dev/null +++ b/platform/docs/docs/migration-guide/3p10-to-3p11/other.md @@ -0,0 +1,27 @@ +--- +sidebar_position: 2 +sidebar_label: Other Changes +summary: Migration guide for OHIF 3.11 additional changes +--- + + +**Key Changes:** + +* **`connectToolsToMeasurementService` parameters:** The `connectToolsToMeasurementService` function from the `@ohif/cornerstone-extensions` now take different arguments. + +**Migration Steps:** + +1. **Update `connectToolsToMeasurementService` Method Calls:** + * Now the connectToolsToMeasurementService receives all service object arguments (servicesManager, commandsManager and extensionManager). + + ```diff + // Before + - connectToolsToMeasurementService(servicesManager); + + // After + + connectToolsToMeasurementService({ + + servicesManager, + + commandsManager, + + extensionsManager + + }); + ```