From 29216a2d9132a54bcd090fd0d215cbc50e299b81 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Tue, 2 Sep 2025 08:50:20 -0300 Subject: [PATCH 01/13] Add command to load derived display sets --- bun.lock | 221 +++++++++++++++---- extensions/cornerstone/src/commandsModule.ts | 45 ++++ 2 files changed, 217 insertions(+), 49 deletions(-) diff --git a/bun.lock b/bun.lock index 52ad7b53c06..1918fd7ee7c 100644 --- a/bun.lock +++ b/bun.lock @@ -53,7 +53,7 @@ }, "addOns/externals/devDependencies": { "name": "@externals/devDependencies", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "@kitware/vtk.js": "32.12.0", @@ -138,14 +138,14 @@ }, "addOns/externals/dicom-microscopy-viewer": { "name": "@externals/dicom-microscopy-viewer", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "dicom-microscopy-viewer": "0.46.1", }, }, "extensions/cornerstone": { "name": "@ohif/extension-cornerstone", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -166,13 +166,13 @@ "worker-loader": "3.0.8", }, "peerDependencies": { - "@cornerstonejs/codec-charls": "1.2.3", - "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", - "@cornerstonejs/codec-openjpeg": "1.2.4", - "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.5.13", - "@ohif/core": "3.11.1", - "@ohif/ui": "3.11.1", + "@cornerstonejs/codec-charls": "^1.2.3", + "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", + "@cornerstonejs/codec-openjpeg": "^1.2.4", + "@cornerstonejs/codec-openjph": "^2.4.5", + "@cornerstonejs/dicom-image-loader": "^4.0.0", + "@ohif/core": "3.12.0-beta.22", + "@ohif/ui": "3.12.0-beta.22", "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -184,7 +184,7 @@ }, "extensions/cornerstone-dicom-pmap": { "name": "@ohif/extension-cornerstone-dicom-pmap", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -207,7 +207,7 @@ }, "extensions/cornerstone-dicom-rt": { "name": "@ohif/extension-cornerstone-dicom-rt", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "react-color": "2.19.3", @@ -227,7 +227,7 @@ }, "extensions/cornerstone-dicom-seg": { "name": "@ohif/extension-cornerstone-dicom-seg", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -391,28 +391,151 @@ "react-i18next": "^12.2.2", "react-router": "^6.23.1", "react-router-dom": "^6.23.1", + }, + }, + "extensions/cornerstone-dicom-sr": { + "name": "@ohif/extension-cornerstone-dicom-sr", + "version": "3.12.0-beta.22", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@cornerstonejs/adapters": "^4.0.0", + "@cornerstonejs/core": "^4.0.0", + "@cornerstonejs/tools": "^4.0.0", + "classnames": "^2.3.2", + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.22", + "@ohif/extension-cornerstone": "3.12.0-beta.22", + "@ohif/extension-measurement-tracking": "3.12.0-beta.22", + "@ohif/ui": "3.12.0-beta.22", + "dcmjs": "0.43.1", + "dicom-parser": "^1.8.9", + "hammerjs": "^2.0.8", + "prop-types": "^15.6.2", + "react": "^18.3.1", + }, + }, + "extensions/cornerstone-dynamic-volume": { + "name": "@ohif/extension-cornerstone-dynamic-volume", + "version": "3.12.0-beta.22", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@cornerstonejs/core": "^4.0.0", + "@cornerstonejs/tools": "^4.0.0", + "classnames": "^2.3.2", + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.18", + "@ohif/extension-cornerstone": "3.12.0-beta.18", + "@ohif/extension-default": "3.12.0-beta.18", + "@ohif/i18n": "3.12.0-beta.18", + "@ohif/ui": "3.12.0-beta.18", + "dcmjs": "0.43.1", + "dicom-parser": "^1.8.21", + "hammerjs": "^2.0.8", + "prop-types": "^15.6.2", + "react": "^18.3.1", + }, + }, + "extensions/default": { + "name": "@ohif/extension-default", + "version": "3.12.0-beta.22", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@cornerstonejs/calculate-suv": "^1.1.0", + "lodash.get": "^4.4.2", + "lodash.uniqby": "^4.7.0", + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.22", + "@ohif/i18n": "3.12.0-beta.22", + "dcmjs": "0.43.1", + "dicomweb-client": "^0.10.4", + "prop-types": "^15.6.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-i18next": "^12.2.2", "react-window": "^1.8.9", "webpack": "5.89.0", "webpack-merge": "^5.7.3", }, }, + "extensions/dicom-microscopy": { + "name": "@ohif/extension-dicom-microscopy", + "version": "3.12.0-beta.22", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@cornerstonejs/codec-charls": "^1.2.3", + "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", + "@cornerstonejs/codec-openjpeg": "^1.2.4", + "colormap": "^2.3", + "lodash.debounce": "^4.0.8", + "mathjs": "^12.4.2", + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.18", + "@ohif/extension-default": "3.12.0-beta.18", + "@ohif/i18n": "3.12.0-beta.18", + "@ohif/ui": "3.12.0-beta.18", + "prop-types": "^15.6.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-i18next": "^10.11.0", + "react-router": "^6.23.1", + "react-router-dom": "^6.23.1", + }, + }, + "extensions/dicom-pdf": { + "name": "@ohif/extension-dicom-pdf", + "version": "3.12.0-beta.22", + "dependencies": { + "@babel/runtime": "^7.20.13", + "classnames": "^2.3.2", + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.18", + "@ohif/ui": "3.12.0-beta.18", + "dcmjs": "0.43.1", + "dicom-parser": "^1.8.9", + "hammerjs": "^2.0.8", + "prop-types": "^15.6.2", + "react": "^18.3.1", + }, + }, + "extensions/dicom-video": { + "name": "@ohif/extension-dicom-video", + "version": "3.12.0-beta.22", + "dependencies": { + "@babel/runtime": "^7.20.13", + "classnames": "^2.3.2", + }, + "peerDependencies": { + "@ohif/core": "3.12.0-beta.18", + "@ohif/ui": "3.12.0-beta.18", + "dcmjs": "0.43.1", + "dicom-parser": "^1.8.9", + "hammerjs": "^2.0.8", + "prop-types": "^15.6.2", + "react": "^18.3.1", + }, + }, "extensions/measurement-tracking": { "name": "@ohif/extension-measurement-tracking", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { - "@babel/runtime": "7.28.2", - "@ohif/ui": "3.11.1", - "@xstate/react": "3.2.2", - "xstate": "4.38.3", + "@babel/runtime": "^7.20.13", + "@ohif/ui": "3.12.0-beta.22", + "@xstate/react": "^3.2.2", + "xstate": "^4.10.0", }, "peerDependencies": { - "@cornerstonejs/core": "4.5.13", - "@cornerstonejs/tools": "4.5.13", - "@ohif/core": "3.11.1", - "@ohif/extension-cornerstone-dicom-sr": "3.11.1", - "@ohif/extension-default": "3.11.1", - "@ohif/ui": "3.11.1", - "classnames": "2.5.1", + "@cornerstonejs/core": "^4.0.0", + "@cornerstonejs/tools": "^4.0.0", + "@ohif/core": "3.12.0-beta.22", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.22", + "@ohif/extension-default": "3.12.0-beta.22", + "@ohif/ui": "3.12.0-beta.22", + "classnames": "^2.3.2", "dcmjs": "0.43.1", "lodash.debounce": "4.0.8", "prop-types": "15.8.1", @@ -424,7 +547,7 @@ }, "extensions/test-extension": { "name": "@ohif/extension-test", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -441,7 +564,7 @@ }, "extensions/tmtv": { "name": "@ohif/extension-tmtv", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -458,7 +581,7 @@ }, "extensions/usAnnotation": { "name": "@ohif/extension-ultrasound-pleura-bline", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/core": "4.5.13", @@ -510,7 +633,7 @@ }, "modes/basic-dev-mode": { "name": "@ohif/mode-basic-dev-mode", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -530,7 +653,7 @@ }, "modes/basic-test-mode": { "name": "@ohif/mode-test", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -552,7 +675,7 @@ }, "modes/longitudinal": { "name": "@ohif/mode-longitudinal", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -575,7 +698,7 @@ }, "modes/microscopy": { "name": "@ohif/mode-microscopy", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -587,7 +710,7 @@ }, "modes/preclinical-4d": { "name": "@ohif/mode-preclinical-4d", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", }, @@ -606,7 +729,7 @@ }, "modes/segmentation": { "name": "@ohif/mode-segmentation", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -650,7 +773,7 @@ }, "modes/tmtv": { "name": "@ohif/mode-tmtv", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -671,7 +794,7 @@ }, "modes/usAnnotation": { "name": "@ohif/mode-ultrasound-pleura-bline", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/core": "4.5.13", @@ -710,7 +833,7 @@ }, "platform/app": { "name": "@ohif/app", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/codec-charls": "1.2.3", @@ -789,7 +912,7 @@ }, "platform/cli": { "name": "@ohif/cli", - "version": "3.11.1", + "version": "3.12.0-beta.22", "bin": { "ohif-cli": "src/index.js", }, @@ -813,7 +936,7 @@ }, "platform/core": { "name": "@ohif/core", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "dcmjs": "0.43.1", @@ -834,20 +957,20 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@cornerstonejs/codec-charls": "1.2.3", - "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", - "@cornerstonejs/codec-openjpeg": "1.2.4", - "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/core": "4.5.13", - "@cornerstonejs/dicom-image-loader": "4.5.13", - "@ohif/ui": "3.11.1", + "@cornerstonejs/codec-charls": "^1.2.3", + "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", + "@cornerstonejs/codec-openjpeg": "^1.2.4", + "@cornerstonejs/codec-openjph": "^2.4.5", + "@cornerstonejs/core": "^4.0.0", + "@cornerstonejs/dicom-image-loader": "^4.0.0", + "@ohif/ui": "3.12.0-beta.22", "cornerstone-math": "0.1.9", "dicom-parser": "1.8.21", }, }, "platform/i18n": { "name": "@ohif/i18n", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@babel/runtime": "7.28.2", "i18next-locize-backend": "2.2.2", @@ -872,7 +995,7 @@ }, "platform/ui": { "name": "@ohif/ui", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@testing-library/react": "13.4.0", "browser-detect": "0.2.28", @@ -923,7 +1046,7 @@ }, "platform/ui-next": { "name": "@ohif/ui-next", - "version": "3.11.1", + "version": "3.12.0-beta.22", "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-checkbox": "1.3.2", diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index d702d7b7b2e..7210f2b0bb2 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -40,6 +40,9 @@ import { updateSegmentBidirectionalStats } from './utils/updateSegmentationStats import { generateSegmentationCSVReport } from './utils/generateSegmentationCSVReport'; import { getUpdatedViewportsForSegmentation } from './utils/hydrationUtils'; import { SegmentationRepresentations } from '@cornerstonejs/tools/enums'; +import { isMeasurementWithinViewport } from './utils/isMeasurementWithinViewport'; +import { getCenterExtent } from './utils/getCenterExtent'; +import { DisplaySet } from 'platform/core/src/types'; const { DefaultHistoryMemo } = csUtils.HistoryMemo; const toggleSyncFunctions = { @@ -146,6 +149,45 @@ function commandsModule({ } const actions = { + loadDerivedDisplaySetsForActiveViewport: () => { + const { displaySetService, userAuthenticationService } = servicesManager.services; + + const getDerivedSequences = (displaySetUID: string): DisplaySet[] => { + const currentDs = displaySetService.getDisplaySetByUID(displaySetUID); + const displaySetCache = displaySetService.getDisplaySetCache(); + return Array.from(displaySetCache.values()).filter( + (ds: any): ds is DisplaySet => + (ds?.referencedDisplaySetInstanceUID === displaySetUID || + ds.referencedSeriesInstanceUID === currentDs.SeriesInstanceUID) && + !ds?.isHydrated + ); + }; + + const activeViewportId = viewportGridService.getActiveViewportId(); + const displaySetInstanceUIDs = + viewportGridService.getDisplaySetsUIDsForViewport(activeViewportId); + + const derivedDisplayInstanceUIDs = getDerivedSequences(displaySetInstanceUIDs[0]).map( + ds => ds.displaySetInstanceUID + ); + + derivedDisplayInstanceUIDs.forEach(async displaySetInstanceUID => { + const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); + if (displaySet.Modality === 'SEG' || displaySet.Modality === 'RTSTRUCT') { + const headers = userAuthenticationService.getAuthorizationHeader(); + await displaySet.load({ headers }).catch(err => { + console.warn(`Failed to load display set ${displaySet.displaySetInstanceUID}:`, err); + }); + segmentationService.addSegmentationRepresentation(activeViewportId, { + segmentationId: displaySet.displaySetInstanceUID, + type: + displaySet.Modality === 'SEG' + ? Enums.SegmentationRepresentations.Labelmap + : Enums.SegmentationRepresentations.Contour, + }); + } + }); + }, jumpToMeasurementViewport: ({ annotationUID, measurement }) => { cornerstoneTools.annotation.selection.setAnnotationSelected(annotationUID, true); const { metadata } = measurement; @@ -2211,6 +2253,9 @@ function commandsModule({ }; const definitions = { + loadDerivedDisplaySetsForActiveViewport: { + commandFn: actions.loadDerivedDisplaySetsForActiveViewport, + }, // The command here is to show the viewer context menu, as being the // context menu showCornerstoneContextMenu: { From bb93ed57b1d62dffbb1980de63e454b0901c5748 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Thu, 4 Sep 2025 08:29:56 -0300 Subject: [PATCH 02/13] Update name --- extensions/cornerstone/src/commandsModule.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 7210f2b0bb2..c56d83fdbaf 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -149,7 +149,7 @@ function commandsModule({ } const actions = { - loadDerivedDisplaySetsForActiveViewport: () => { + loadSegmentationsForActiveViewport: () => { const { displaySetService, userAuthenticationService } = servicesManager.services; const getDerivedSequences = (displaySetUID: string): DisplaySet[] => { @@ -2253,8 +2253,8 @@ function commandsModule({ }; const definitions = { - loadDerivedDisplaySetsForActiveViewport: { - commandFn: actions.loadDerivedDisplaySetsForActiveViewport, + loadSegmentationsForActiveViewport: { + commandFn: actions.loadSegmentationsForActiveViewport, }, // The command here is to show the viewer context menu, as being the // context menu From ef874834c48e32c56e1a2a4d678fcc6dc83b1efb Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Tue, 21 Oct 2025 17:29:31 -0300 Subject: [PATCH 03/13] Refactor method --- extensions/cornerstone/src/commandsModule.ts | 97 ++++++++++++++------ 1 file changed, 69 insertions(+), 28 deletions(-) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index c56d83fdbaf..f2954f5c176 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -120,6 +120,7 @@ function commandsModule({ hangingProtocolService, syncGroupService, segmentationService, + userAuthenticationService, displaySetService, } = servicesManager.services as AppTypes.Services; @@ -148,45 +149,85 @@ function commandsModule({ }; } - const actions = { - loadSegmentationsForActiveViewport: () => { - const { displaySetService, userAuthenticationService } = servicesManager.services; - - const getDerivedSequences = (displaySetUID: string): DisplaySet[] => { - const currentDs = displaySetService.getDisplaySetByUID(displaySetUID); - const displaySetCache = displaySetService.getDisplaySetCache(); - return Array.from(displaySetCache.values()).filter( - (ds: any): ds is DisplaySet => - (ds?.referencedDisplaySetInstanceUID === displaySetUID || - ds.referencedSeriesInstanceUID === currentDs.SeriesInstanceUID) && - !ds?.isHydrated - ); - }; + /** + * Retrieves derived segmentations (SEG/RTSTRUCT) that are not yet hydrated + * for the given display set UID. + */ + function _getDerivedSegmentations(displaySetUID: string): DisplaySet[] { + const currentDisplaySet = displaySetService.getDisplaySetByUID(displaySetUID); + if (!currentDisplaySet) { + return []; + } + + const displaySetCache = displaySetService.getDisplaySetCache(); + const allDisplaySets = Array.from(displaySetCache.values()); + + return allDisplaySets.filter((ds): ds is DisplaySet => { + if (!ds?.isOverlayDisplaySet || ds?.isHydrated) { + return false; + } + + /** Check if this is a SEG or RTSTRUCT modality */ + const isSegmentationModality = ds.Modality === 'SEG' || ds.Modality === 'RTSTRUCT'; + if (!isSegmentationModality) { + return false; + } + /** Check if this derived display set references the current display set */ + const referencesDisplaySet = + ds.referencedDisplaySetInstanceUID === displaySetUID || + ds.SeriesInstanceUID === currentDisplaySet.SeriesInstanceUID; + + return referencesDisplaySet; + }); + } + + const actions = { + loadSegmentationsForActiveViewport: async () => { const activeViewportId = viewportGridService.getActiveViewportId(); + if (!activeViewportId) { + console.warn('No active viewport found'); + return; + } + const displaySetInstanceUIDs = viewportGridService.getDisplaySetsUIDsForViewport(activeViewportId); + if (!displaySetInstanceUIDs?.length) { + console.warn('No display sets found for active viewport'); + return; + } - const derivedDisplayInstanceUIDs = getDerivedSequences(displaySetInstanceUIDs[0]).map( - ds => ds.displaySetInstanceUID - ); + const primaryDisplaySetUID = displaySetInstanceUIDs[0]; + const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); + if (!derivedDisplaySets.length) { + return; + } + + const headers = userAuthenticationService.getAuthorizationHeader(); + + /** Load all segmentations in parallel for better performance */ + const loadPromises = derivedDisplaySets.map(async displaySet => { + try { + /** Load the display set */ + await displaySet.load({ headers }); + + /** Get the representation type */ + const representationType = + displaySet.Modality === 'SEG' + ? Enums.SegmentationRepresentations.Labelmap + : Enums.SegmentationRepresentations.Contour; - derivedDisplayInstanceUIDs.forEach(async displaySetInstanceUID => { - const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); - if (displaySet.Modality === 'SEG' || displaySet.Modality === 'RTSTRUCT') { - const headers = userAuthenticationService.getAuthorizationHeader(); - await displaySet.load({ headers }).catch(err => { - console.warn(`Failed to load display set ${displaySet.displaySetInstanceUID}:`, err); - }); segmentationService.addSegmentationRepresentation(activeViewportId, { segmentationId: displaySet.displaySetInstanceUID, - type: - displaySet.Modality === 'SEG' - ? Enums.SegmentationRepresentations.Labelmap - : Enums.SegmentationRepresentations.Contour, + type: representationType, }); + } catch (error) { + console.error(`Failed to load segmentation ${displaySet.displaySetInstanceUID}:`, error); + /** Continue with other segmentations even if one fails */ } }); + + await Promise.all(loadPromises); }, jumpToMeasurementViewport: ({ annotationUID, measurement }) => { cornerstoneTools.annotation.selection.setAnnotationSelected(annotationUID, true); From f13050093668f6fbe651a437bb0998cd4a41c6fd Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Tue, 21 Oct 2025 17:31:47 -0300 Subject: [PATCH 04/13] Add load to display set type --- platform/core/src/types/DisplaySet.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/platform/core/src/types/DisplaySet.ts b/platform/core/src/types/DisplaySet.ts index 7eee952ec94..c5ec90038a7 100644 --- a/platform/core/src/types/DisplaySet.ts +++ b/platform/core/src/types/DisplaySet.ts @@ -51,6 +51,13 @@ export type DisplaySet = { isHydrated?: boolean; isRehydratable?: boolean; + + /** + * Loads the display set. + * @param headers - The headers to use for the request. + * @returns A promise that resolves when the display set is loaded. + */ + load: ({ headers }: { headers?: unknown }) => Promise; }; export type DisplaySetSeriesMetadataInvalidatedEvent = { From 7d3d10d76fff5a6c8732511f65acfa674169d454 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Mon, 27 Oct 2025 07:38:59 -0300 Subject: [PATCH 05/13] Add sr command --- extensions/cornerstone/src/commandsModule.ts | 48 ++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index f2954f5c176..fb8494ad03e 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -183,7 +183,53 @@ function commandsModule({ } const actions = { + loadSRsForActiveViewport: async () => { + console.info('Loading SRs for active viewport...'); + + const activeViewportId = viewportGridService.getActiveViewportId(); + if (!activeViewportId) { + console.warn('No active viewport found'); + return; + } + + const displaySetInstanceUIDs = + viewportGridService.getDisplaySetsUIDsForViewport(activeViewportId); + if (!displaySetInstanceUIDs?.length) { + console.warn('No display sets found for active viewport'); + return; + } + + const primaryDisplaySetUID = displaySetInstanceUIDs[0]; + const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); + if (!derivedDisplaySets.length) { + console.warn('No derived SRs found for active viewport'); + return; + } + + const headers = userAuthenticationService.getAuthorizationHeader(); + + /** Load all segmentations in parallel for better performance */ + const loadPromises = derivedDisplaySets.map(async displaySet => { + try { + /** Load the display set */ + await displaySet.load({ headers }); + + /** Hydrate the SR */ + commandsManager.run('hydrateStructuredReport', { + displaySetInstanceUID: displaySet.displaySetInstanceUID, + }); + } catch (error) { + console.error(`Failed to load segmentation ${displaySet.displaySetInstanceUID}:`, error); + /** Continue with other segmentations even if one fails */ + } + }); + + await Promise.all(loadPromises); + console.info('SRs loaded for active viewport.'); + }, loadSegmentationsForActiveViewport: async () => { + console.info('Loading segmentations for active viewport...'); + const activeViewportId = viewportGridService.getActiveViewportId(); if (!activeViewportId) { console.warn('No active viewport found'); @@ -200,6 +246,7 @@ function commandsModule({ const primaryDisplaySetUID = displaySetInstanceUIDs[0]; const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); if (!derivedDisplaySets.length) { + console.warn('No derived segmentations found for active viewport'); return; } @@ -228,6 +275,7 @@ function commandsModule({ }); await Promise.all(loadPromises); + console.info('Segmentations loaded for active viewport.'); }, jumpToMeasurementViewport: ({ annotationUID, measurement }) => { cornerstoneTools.annotation.selection.setAnnotationSelected(annotationUID, true); From 871446f8a819ce3251c7058bf055e5f16bd35059 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Mon, 3 Nov 2025 11:42:30 -0300 Subject: [PATCH 06/13] Add action --- extensions/cornerstone/src/commandsModule.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index fb8494ad03e..a55152c9864 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -2342,6 +2342,9 @@ function commandsModule({ }; const definitions = { + loadSRsForActiveViewport: { + commandFn: actions.loadSRsForActiveViewport, + }, loadSegmentationsForActiveViewport: { commandFn: actions.loadSegmentationsForActiveViewport, }, From 82ce418655215ea4969af7e052cc292197aeb00b Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Mon, 1 Dec 2025 07:42:57 -0300 Subject: [PATCH 07/13] Simplify load commands --- extensions/cornerstone/src/commandsModule.ts | 134 ++++++++++--------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index a55152c9864..88c8869fb88 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -182,83 +182,84 @@ function commandsModule({ }); } - const actions = { - loadSRsForActiveViewport: async () => { - console.info('Loading SRs for active viewport...'); + function _handleBrushSizeAction(action: 'increase' | 'decrease') { + const toolGroupIds = toolGroupService.getToolGroupIds(); + if (!toolGroupIds?.length) { + return; + } - const activeViewportId = viewportGridService.getActiveViewportId(); - if (!activeViewportId) { - console.warn('No active viewport found'); - return; - } + for (const toolGroupId of toolGroupIds) { + const brushSize = segmentationUtils.getBrushSizeForToolGroup(toolGroupId); - const displaySetInstanceUIDs = - viewportGridService.getDisplaySetsUIDsForViewport(activeViewportId); - if (!displaySetInstanceUIDs?.length) { - console.warn('No display sets found for active viewport'); - return; - } + const newBrushSize = action === 'increase' ? brushSize + 3 : brushSize - 3; - const primaryDisplaySetUID = displaySetInstanceUIDs[0]; - const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); - if (!derivedDisplaySets.length) { - console.warn('No derived SRs found for active viewport'); - return; + if (brushSize) { + segmentationUtils.setBrushSizeForToolGroup(toolGroupId, newBrushSize); + + toolbarService.refreshToolbarState({ toolGroupId }); } + } + } - const headers = userAuthenticationService.getAuthorizationHeader(); + const loadDerivedDisplaySetsForActiveViewport = async ( + onLoadComplete: (displaySet: any, activeViewportId: string) => Promise | void + ): Promise => { + const activeViewportId = viewportGridService.getActiveViewportId(); + if (!activeViewportId) { + console.warn('No active viewport found'); + return false; + } - /** Load all segmentations in parallel for better performance */ - const loadPromises = derivedDisplaySets.map(async displaySet => { - try { - /** Load the display set */ - await displaySet.load({ headers }); + const displaySetInstanceUIDs = + viewportGridService.getDisplaySetsUIDsForViewport(activeViewportId); + if (!displaySetInstanceUIDs?.length) { + console.warn('No display sets found for active viewport'); + return false; + } - /** Hydrate the SR */ - commandsManager.run('hydrateStructuredReport', { - displaySetInstanceUID: displaySet.displaySetInstanceUID, - }); - } catch (error) { - console.error(`Failed to load segmentation ${displaySet.displaySetInstanceUID}:`, error); - /** Continue with other segmentations even if one fails */ - } - }); + const primaryDisplaySetUID = displaySetInstanceUIDs[0]; + const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); + if (!derivedDisplaySets.length) { + return false; + } - await Promise.all(loadPromises); - console.info('SRs loaded for active viewport.'); - }, - loadSegmentationsForActiveViewport: async () => { - console.info('Loading segmentations for active viewport...'); + const headers = userAuthenticationService.getAuthorizationHeader(); - const activeViewportId = viewportGridService.getActiveViewportId(); - if (!activeViewportId) { - console.warn('No active viewport found'); - return; + const loadPromises = derivedDisplaySets.map(async displaySet => { + try { + await displaySet.load({ headers }); + await onLoadComplete(displaySet, activeViewportId); + } catch (error) { + console.error(`Failed to load segmentation ${displaySet.displaySetInstanceUID}:`, error); } + }); - const displaySetInstanceUIDs = - viewportGridService.getDisplaySetsUIDsForViewport(activeViewportId); - if (!displaySetInstanceUIDs?.length) { - console.warn('No display sets found for active viewport'); - return; - } + await Promise.all(loadPromises); + return true; + }; - const primaryDisplaySetUID = displaySetInstanceUIDs[0]; - const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); - if (!derivedDisplaySets.length) { - console.warn('No derived segmentations found for active viewport'); + const actions = { + loadSRsForActiveViewport: async () => { + console.info('Loading SRs for active viewport...'); + + const loaded = await loadDerivedDisplaySetsForActiveViewport(async displaySet => { + commandsManager.run('hydrateStructuredReport', { + displaySetInstanceUID: displaySet.displaySetInstanceUID, + }); + }); + + if (!loaded) { + console.warn('No derived SRs found for active viewport'); return; } - const headers = userAuthenticationService.getAuthorizationHeader(); - - /** Load all segmentations in parallel for better performance */ - const loadPromises = derivedDisplaySets.map(async displaySet => { - try { - /** Load the display set */ - await displaySet.load({ headers }); + console.info('SRs loaded for active viewport.'); + }, + loadSegmentationsForActiveViewport: async () => { + console.info('Loading segmentations for active viewport...'); - /** Get the representation type */ + const loaded = await loadDerivedDisplaySetsForActiveViewport( + async (displaySet, activeViewportId) => { const representationType = displaySet.Modality === 'SEG' ? Enums.SegmentationRepresentations.Labelmap @@ -268,13 +269,14 @@ function commandsModule({ segmentationId: displaySet.displaySetInstanceUID, type: representationType, }); - } catch (error) { - console.error(`Failed to load segmentation ${displaySet.displaySetInstanceUID}:`, error); - /** Continue with other segmentations even if one fails */ } - }); + ); + + if (!loaded) { + console.warn('No derived segmentations found for active viewport'); + return; + } - await Promise.all(loadPromises); console.info('Segmentations loaded for active viewport.'); }, jumpToMeasurementViewport: ({ annotationUID, measurement }) => { From 1525fd3ad1d4a43c6fbab41e47e59e7680840266 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Thu, 18 Dec 2025 16:38:21 -0300 Subject: [PATCH 08/13] Add new callback --- extensions/cornerstone/src/commandsModule.ts | 64 ++++++++++++++++++- .../HangingProtocolService.ts | 21 +++++- platform/core/src/types/HangingProtocol.ts | 9 +++ .../platform/extensions/modules/hpModule.md | 15 +++++ .../platform/extensions/modules/hpModule.md | 15 +++++ 5 files changed, 119 insertions(+), 5 deletions(-) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 88c8869fb88..6c87527758d 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -124,6 +124,9 @@ function commandsModule({ displaySetService, } = servicesManager.services as AppTypes.Services; + let _protocolViewportDataInitSubscription: { unsubscribe: () => void } | null = null; + let _protocolViewportDataChangedSubscription: { unsubscribe: () => void } | null = null; + function _getActiveViewportEnabledElement() { return getActiveViewportEnabledElement(viewportGridService); } @@ -1439,16 +1442,62 @@ function commandsModule({ const command = protocol.callbacks.onViewportDataInitialized; const numPanes = protocol.stages?.[stageIndex]?.viewports.length ?? 1; let numPanesWithData = 0; - const { unsubscribe } = cornerstoneViewportService.subscribe(EVENT, evt => { + + actions.detachProtocolViewportDataListener?.(); + + const subscription = cornerstoneViewportService.subscribe(EVENT, () => { numPanesWithData++; if (numPanesWithData === numPanes) { - commandsManager.run(...command); + commandsManager.run(command); // Unsubscribe from the event - unsubscribe(EVENT); + subscription.unsubscribe(); + _protocolViewportDataInitSubscription = null; } }); + + _protocolViewportDataInitSubscription = subscription; + }, + + detachProtocolViewportDataListener: () => { + if (_protocolViewportDataInitSubscription) { + _protocolViewportDataInitSubscription.unsubscribe(); + _protocolViewportDataInitSubscription = null; + } + }, + + attachProtocolViewportDataChangedListener: ({ protocol, stageIndex }) => { + const EVENT = cornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED; + const command = protocol.callbacks.onViewportDataChanged; + + actions.detachProtocolViewportDataChangedListener?.(); + + const subscription = cornerstoneViewportService.subscribe( + EVENT, + (evt: { viewportId?: string; viewportData?: unknown }) => { + const viewportId = evt?.viewportId; + if (!viewportId) { + return; + } + + commandsManager.run(command, { + viewportId, + viewportData: evt.viewportData, + protocol, + stageIndex, + }); + } + ); + + _protocolViewportDataChangedSubscription = subscription; + }, + + detachProtocolViewportDataChangedListener: () => { + if (_protocolViewportDataChangedSubscription) { + _protocolViewportDataChangedSubscription.unsubscribe(); + _protocolViewportDataChangedSubscription = null; + } }, setViewportPreset: ({ viewportId, preset }) => { @@ -2509,6 +2558,15 @@ function commandsModule({ attachProtocolViewportDataListener: { commandFn: actions.attachProtocolViewportDataListener, }, + detachProtocolViewportDataListener: { + commandFn: actions.detachProtocolViewportDataListener, + }, + attachProtocolViewportDataChangedListener: { + commandFn: actions.attachProtocolViewportDataChangedListener, + }, + detachProtocolViewportDataChangedListener: { + commandFn: actions.detachProtocolViewportDataChangedListener, + }, setViewportPreset: { commandFn: actions.setViewportPreset, }, diff --git a/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts b/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts index fd85749acf1..474ee9f51ba 100644 --- a/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts +++ b/platform/core/src/services/HangingProtocolService/HangingProtocolService.ts @@ -430,7 +430,10 @@ export default class HangingProtocolService extends PubSubService { this.customAttributeRetrievalCallbacks ); - // Resets the full protocol status here. + this._commandsManager.run('detachProtocolViewportDataListener'); + this._commandsManager.run('detachProtocolViewportDataChangedListener'); + + // Resets the full protocol status here this.protocol = null; if (protocolId && typeof protocolId === 'string') { @@ -1032,6 +1035,10 @@ export default class HangingProtocolService extends PubSubService { try { if (!this.protocol || this.protocol.id !== protocol.id) { + + this._commandsManager.run('detachProtocolViewportDataListener'); + this._commandsManager.run('detachProtocolViewportDataChangedListener'); + this.stageIndex = options?.stageIndex || 0; //Reset load performed to false to re-fire loading strategy at new study opening this.customImageLoadPerformed = false; @@ -1212,8 +1219,18 @@ export default class HangingProtocolService extends PubSubService { const { columns: numCols, rows: numRows, layoutOptions = [] } = layoutProps; + this._commandsManager.run('detachProtocolViewportDataListener'); + this._commandsManager.run('detachProtocolViewportDataChangedListener'); + if (this.protocol?.callbacks?.onViewportDataInitialized) { - this._commandsManager.runCommand('attachProtocolViewportDataListener', { + this._commandsManager.run('attachProtocolViewportDataListener', { + protocol: this.protocol, + stageIndex: this.stageIndex, + }); + } + + if (this.protocol?.callbacks?.onViewportDataChanged) { + this._commandsManager.run('attachProtocolViewportDataChangedListener', { protocol: this.protocol, stageIndex: this.stageIndex, }); diff --git a/platform/core/src/types/HangingProtocol.ts b/platform/core/src/types/HangingProtocol.ts index 189fe0dcc08..c3e825e0bf9 100644 --- a/platform/core/src/types/HangingProtocol.ts +++ b/platform/core/src/types/HangingProtocol.ts @@ -293,6 +293,15 @@ export type ProtocolNotifications = { // and all viewport data includes a designated display set. This command // will run on every stage's initial layout. onViewportDataInitialized?: Command[]; + // This set of commands is executed whenever viewport data has changed for a + // given viewport. + // + // Commands will receive an options object containing: + // - viewportId + // - viewportData + // - protocol + // - stageIndex + onViewportDataChanged?: Command[]; // This set of commands is executed before the stage change is applied onStageChange?: Command[]; }; diff --git a/platform/docs/docs/platform/extensions/modules/hpModule.md b/platform/docs/docs/platform/extensions/modules/hpModule.md index 1fb26c3a6cb..3fb3f8a9ab1 100644 --- a/platform/docs/docs/platform/extensions/modules/hpModule.md +++ b/platform/docs/docs/platform/extensions/modules/hpModule.md @@ -600,6 +600,17 @@ The `onLayoutChange` callback is executed before the layout change is started. Y The `onViewportDataInitialized` callback is executed after the initial viewport grid data is set and all viewport data includes a designated display set. This callback runs during the initial layout setup for each stage. You can use it to perform actions or apply settings to the viewports at the start. +### `onViewportDataChanged` + +The `onViewportDataChanged` callback is executed whenever a viewport's data changes (for example, when a different display set is assigned to a viewport). This is useful for reacting to runtime changes like drag/drop swaps, layout tools that reassign data, etc. + +Commands in `onViewportDataChanged` will receive an options object including: + +- `viewportId` +- `viewportData` +- `protocol` +- `stageIndex` + Here is an example of how you can add these callbacks to your hanging protocol configuration: ```javascript @@ -620,7 +631,11 @@ const protocol = { onViewportDataInitialized: [ // Array of commands or actions to execute on viewport data initialization ], + onViewportDataChanged: [ + // Array of commands or actions to execute when viewport data changes + ], }, // protocolMatchingRules // the rest }; +``` diff --git a/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md b/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md index 8920ccc255a..d2c97fd224d 100644 --- a/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md +++ b/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md @@ -598,6 +598,17 @@ The `onLayoutChange` callback is executed before the layout change is started. Y The `onViewportDataInitialized` callback is executed after the initial viewport grid data is set and all viewport data includes a designated display set. This callback runs during the initial layout setup for each stage. You can use it to perform actions or apply settings to the viewports at the start. +### `onViewportDataChanged` + +The `onViewportDataChanged` callback is executed whenever a viewport's data changes (for example, when a different display set is assigned to a viewport). This is useful for reacting to runtime changes like drag/drop swaps, layout tools that reassign data, etc. + +Commands in `onViewportDataChanged` will receive an options object including: + +- `viewportId` +- `viewportData` +- `protocol` +- `stageIndex` + Here is an example of how you can add these callbacks to your hanging protocol configuration: ```javascript @@ -618,7 +629,11 @@ const protocol = { onViewportDataInitialized: [ // Array of commands or actions to execute on viewport data initialization ], + onViewportDataChanged: [ + // Array of commands or actions to execute when viewport data changes + ], }, // protocolMatchingRules // the rest }; +``` From 18f319060fa4ab36137d5b29fd9d34ebe9cb6c8c Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Thu, 18 Dec 2025 16:47:05 -0300 Subject: [PATCH 09/13] Add warn --- extensions/cornerstone/src/commandsModule.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 6c87527758d..3642e08959d 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -223,6 +223,7 @@ function commandsModule({ const primaryDisplaySetUID = displaySetInstanceUIDs[0]; const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); if (!derivedDisplaySets.length) { + console.warn('No derived segmentations found for active viewport!'); return false; } From 4ee7bf8c0aa6885dde13b72b2db6abcff6201222 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Fri, 19 Dec 2025 15:04:43 -0300 Subject: [PATCH 10/13] Revert changes --- .../platform/extensions/modules/hpModule.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md b/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md index d2c97fd224d..99dbe1f0c34 100644 --- a/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md +++ b/platform/docs/versioned_docs/version-3.10/platform/extensions/modules/hpModule.md @@ -598,17 +598,6 @@ The `onLayoutChange` callback is executed before the layout change is started. Y The `onViewportDataInitialized` callback is executed after the initial viewport grid data is set and all viewport data includes a designated display set. This callback runs during the initial layout setup for each stage. You can use it to perform actions or apply settings to the viewports at the start. -### `onViewportDataChanged` - -The `onViewportDataChanged` callback is executed whenever a viewport's data changes (for example, when a different display set is assigned to a viewport). This is useful for reacting to runtime changes like drag/drop swaps, layout tools that reassign data, etc. - -Commands in `onViewportDataChanged` will receive an options object including: - -- `viewportId` -- `viewportData` -- `protocol` -- `stageIndex` - Here is an example of how you can add these callbacks to your hanging protocol configuration: ```javascript @@ -629,9 +618,6 @@ const protocol = { onViewportDataInitialized: [ // Array of commands or actions to execute on viewport data initialization ], - onViewportDataChanged: [ - // Array of commands or actions to execute when viewport data changes - ], }, // protocolMatchingRules // the rest From 9756ce6c69d70bb741d9ff847299f8075733e3ea Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Mon, 19 Jan 2026 14:17:41 -0300 Subject: [PATCH 11/13] Revert bun --- bun.lock | 135 +++++++++++++++++++ extensions/cornerstone/src/commandsModule.ts | 2 - 2 files changed, 135 insertions(+), 2 deletions(-) diff --git a/bun.lock b/bun.lock index 1918fd7ee7c..144ccd7f1d0 100644 --- a/bun.lock +++ b/bun.lock @@ -53,7 +53,11 @@ }, "addOns/externals/devDependencies": { "name": "@externals/devDependencies", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@kitware/vtk.js": "32.12.0", @@ -138,14 +142,22 @@ }, "addOns/externals/dicom-microscopy-viewer": { "name": "@externals/dicom-microscopy-viewer", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "dicom-microscopy-viewer": "0.46.1", }, }, "extensions/cornerstone": { "name": "@ohif/extension-cornerstone", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -166,6 +178,15 @@ "worker-loader": "3.0.8", }, "peerDependencies": { +<<<<<<< HEAD + "@cornerstonejs/codec-charls": "1.2.3", + "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", + "@cornerstonejs/codec-openjpeg": "1.2.4", + "@cornerstonejs/codec-openjph": "2.4.7", + "@cornerstonejs/dicom-image-loader": "4.5.13", + "@ohif/core": "3.11.1", + "@ohif/ui": "3.11.1", +======= "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", @@ -173,6 +194,7 @@ "@cornerstonejs/dicom-image-loader": "^4.0.0", "@ohif/core": "3.12.0-beta.22", "@ohif/ui": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -184,7 +206,11 @@ }, "extensions/cornerstone-dicom-pmap": { "name": "@ohif/extension-cornerstone-dicom-pmap", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -207,7 +233,11 @@ }, "extensions/cornerstone-dicom-rt": { "name": "@ohif/extension-cornerstone-dicom-rt", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "react-color": "2.19.3", @@ -227,7 +257,11 @@ }, "extensions/cornerstone-dicom-seg": { "name": "@ohif/extension-cornerstone-dicom-seg", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -391,6 +425,8 @@ "react-i18next": "^12.2.2", "react-router": "^6.23.1", "react-router-dom": "^6.23.1", +<<<<<<< HEAD +======= }, }, "extensions/cornerstone-dicom-sr": { @@ -455,11 +491,31 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-i18next": "^12.2.2", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "react-window": "^1.8.9", "webpack": "5.89.0", "webpack-merge": "^5.7.3", }, }, +<<<<<<< HEAD + "extensions/measurement-tracking": { + "name": "@ohif/extension-measurement-tracking", + "version": "3.11.1", + "dependencies": { + "@babel/runtime": "7.28.2", + "@ohif/ui": "3.11.1", + "@xstate/react": "3.2.2", + "xstate": "4.38.3", + }, + "peerDependencies": { + "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/tools": "4.5.13", + "@ohif/core": "3.11.1", + "@ohif/extension-cornerstone-dicom-sr": "3.11.1", + "@ohif/extension-default": "3.11.1", + "@ohif/ui": "3.11.1", + "classnames": "2.5.1", +======= "extensions/dicom-microscopy": { "name": "@ohif/extension-dicom-microscopy", "version": "3.12.0-beta.22", @@ -536,6 +592,7 @@ "@ohif/extension-default": "3.12.0-beta.22", "@ohif/ui": "3.12.0-beta.22", "classnames": "^2.3.2", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dcmjs": "0.43.1", "lodash.debounce": "4.0.8", "prop-types": "15.8.1", @@ -547,7 +604,11 @@ }, "extensions/test-extension": { "name": "@ohif/extension-test", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -564,7 +625,11 @@ }, "extensions/tmtv": { "name": "@ohif/extension-tmtv", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -581,7 +646,11 @@ }, "extensions/usAnnotation": { "name": "@ohif/extension-ultrasound-pleura-bline", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/core": "4.5.13", @@ -633,7 +702,11 @@ }, "modes/basic-dev-mode": { "name": "@ohif/mode-basic-dev-mode", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -653,7 +726,11 @@ }, "modes/basic-test-mode": { "name": "@ohif/mode-test", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -675,7 +752,11 @@ }, "modes/longitudinal": { "name": "@ohif/mode-longitudinal", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -698,7 +779,11 @@ }, "modes/microscopy": { "name": "@ohif/mode-microscopy", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -710,7 +795,11 @@ }, "modes/preclinical-4d": { "name": "@ohif/mode-preclinical-4d", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", }, @@ -729,7 +818,11 @@ }, "modes/segmentation": { "name": "@ohif/mode-segmentation", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -773,7 +866,11 @@ }, "modes/tmtv": { "name": "@ohif/mode-tmtv", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -794,7 +891,11 @@ }, "modes/usAnnotation": { "name": "@ohif/mode-ultrasound-pleura-bline", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/core": "4.5.13", @@ -833,7 +934,11 @@ }, "platform/app": { "name": "@ohif/app", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/codec-charls": "1.2.3", @@ -912,7 +1017,11 @@ }, "platform/cli": { "name": "@ohif/cli", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "bin": { "ohif-cli": "src/index.js", }, @@ -936,7 +1045,11 @@ }, "platform/core": { "name": "@ohif/core", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "dcmjs": "0.43.1", @@ -957,6 +1070,15 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { +<<<<<<< HEAD + "@cornerstonejs/codec-charls": "1.2.3", + "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", + "@cornerstonejs/codec-openjpeg": "1.2.4", + "@cornerstonejs/codec-openjph": "2.4.7", + "@cornerstonejs/core": "4.5.13", + "@cornerstonejs/dicom-image-loader": "4.5.13", + "@ohif/ui": "3.11.1", +======= "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", @@ -964,13 +1086,18 @@ "@cornerstonejs/core": "^4.0.0", "@cornerstonejs/dicom-image-loader": "^4.0.0", "@ohif/ui": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "cornerstone-math": "0.1.9", "dicom-parser": "1.8.21", }, }, "platform/i18n": { "name": "@ohif/i18n", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next-locize-backend": "2.2.2", @@ -995,7 +1122,11 @@ }, "platform/ui": { "name": "@ohif/ui", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@testing-library/react": "13.4.0", "browser-detect": "0.2.28", @@ -1046,7 +1177,11 @@ }, "platform/ui-next": { "name": "@ohif/ui-next", +<<<<<<< HEAD + "version": "3.11.1", +======= "version": "3.12.0-beta.22", +>>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-checkbox": "1.3.2", diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 3642e08959d..ce6a1b8685b 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -40,8 +40,6 @@ import { updateSegmentBidirectionalStats } from './utils/updateSegmentationStats import { generateSegmentationCSVReport } from './utils/generateSegmentationCSVReport'; import { getUpdatedViewportsForSegmentation } from './utils/hydrationUtils'; import { SegmentationRepresentations } from '@cornerstonejs/tools/enums'; -import { isMeasurementWithinViewport } from './utils/isMeasurementWithinViewport'; -import { getCenterExtent } from './utils/getCenterExtent'; import { DisplaySet } from 'platform/core/src/types'; const { DefaultHistoryMemo } = csUtils.HistoryMemo; From 7ddc819961b29610f5151187f59468a23fdd204b Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Mon, 19 Jan 2026 14:18:22 -0300 Subject: [PATCH 12/13] Revert bun --- bun.lock | 258 ------------------------------------------------------- 1 file changed, 258 deletions(-) diff --git a/bun.lock b/bun.lock index 144ccd7f1d0..52ad7b53c06 100644 --- a/bun.lock +++ b/bun.lock @@ -53,11 +53,7 @@ }, "addOns/externals/devDependencies": { "name": "@externals/devDependencies", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@kitware/vtk.js": "32.12.0", @@ -142,22 +138,14 @@ }, "addOns/externals/dicom-microscopy-viewer": { "name": "@externals/dicom-microscopy-viewer", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "dicom-microscopy-viewer": "0.46.1", }, }, "extensions/cornerstone": { "name": "@ohif/extension-cornerstone", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -178,7 +166,6 @@ "worker-loader": "3.0.8", }, "peerDependencies": { -<<<<<<< HEAD "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.2.4", @@ -186,15 +173,6 @@ "@cornerstonejs/dicom-image-loader": "4.5.13", "@ohif/core": "3.11.1", "@ohif/ui": "3.11.1", -======= - "@cornerstonejs/codec-charls": "^1.2.3", - "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", - "@cornerstonejs/codec-openjpeg": "^1.2.4", - "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^4.0.0", - "@ohif/core": "3.12.0-beta.22", - "@ohif/ui": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -206,11 +184,7 @@ }, "extensions/cornerstone-dicom-pmap": { "name": "@ohif/extension-cornerstone-dicom-pmap", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -233,11 +207,7 @@ }, "extensions/cornerstone-dicom-rt": { "name": "@ohif/extension-cornerstone-dicom-rt", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "react-color": "2.19.3", @@ -257,11 +227,7 @@ }, "extensions/cornerstone-dicom-seg": { "name": "@ohif/extension-cornerstone-dicom-seg", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/adapters": "4.5.13", @@ -425,79 +391,11 @@ "react-i18next": "^12.2.2", "react-router": "^6.23.1", "react-router-dom": "^6.23.1", -<<<<<<< HEAD -======= - }, - }, - "extensions/cornerstone-dicom-sr": { - "name": "@ohif/extension-cornerstone-dicom-sr", - "version": "3.12.0-beta.22", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^4.0.0", - "@cornerstonejs/core": "^4.0.0", - "@cornerstonejs/tools": "^4.0.0", - "classnames": "^2.3.2", - }, - "peerDependencies": { - "@ohif/core": "3.12.0-beta.22", - "@ohif/extension-cornerstone": "3.12.0-beta.22", - "@ohif/extension-measurement-tracking": "3.12.0-beta.22", - "@ohif/ui": "3.12.0-beta.22", - "dcmjs": "0.43.1", - "dicom-parser": "^1.8.9", - "hammerjs": "^2.0.8", - "prop-types": "^15.6.2", - "react": "^18.3.1", - }, - }, - "extensions/cornerstone-dynamic-volume": { - "name": "@ohif/extension-cornerstone-dynamic-volume", - "version": "3.12.0-beta.22", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@cornerstonejs/core": "^4.0.0", - "@cornerstonejs/tools": "^4.0.0", - "classnames": "^2.3.2", - }, - "peerDependencies": { - "@ohif/core": "3.12.0-beta.18", - "@ohif/extension-cornerstone": "3.12.0-beta.18", - "@ohif/extension-default": "3.12.0-beta.18", - "@ohif/i18n": "3.12.0-beta.18", - "@ohif/ui": "3.12.0-beta.18", - "dcmjs": "0.43.1", - "dicom-parser": "^1.8.21", - "hammerjs": "^2.0.8", - "prop-types": "^15.6.2", - "react": "^18.3.1", - }, - }, - "extensions/default": { - "name": "@ohif/extension-default", - "version": "3.12.0-beta.22", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@cornerstonejs/calculate-suv": "^1.1.0", - "lodash.get": "^4.4.2", - "lodash.uniqby": "^4.7.0", - }, - "peerDependencies": { - "@ohif/core": "3.12.0-beta.22", - "@ohif/i18n": "3.12.0-beta.22", - "dcmjs": "0.43.1", - "dicomweb-client": "^0.10.4", - "prop-types": "^15.6.2", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-i18next": "^12.2.2", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "react-window": "^1.8.9", "webpack": "5.89.0", "webpack-merge": "^5.7.3", }, }, -<<<<<<< HEAD "extensions/measurement-tracking": { "name": "@ohif/extension-measurement-tracking", "version": "3.11.1", @@ -515,84 +413,6 @@ "@ohif/extension-default": "3.11.1", "@ohif/ui": "3.11.1", "classnames": "2.5.1", -======= - "extensions/dicom-microscopy": { - "name": "@ohif/extension-dicom-microscopy", - "version": "3.12.0-beta.22", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@cornerstonejs/codec-charls": "^1.2.3", - "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", - "@cornerstonejs/codec-openjpeg": "^1.2.4", - "colormap": "^2.3", - "lodash.debounce": "^4.0.8", - "mathjs": "^12.4.2", - }, - "peerDependencies": { - "@ohif/core": "3.12.0-beta.18", - "@ohif/extension-default": "3.12.0-beta.18", - "@ohif/i18n": "3.12.0-beta.18", - "@ohif/ui": "3.12.0-beta.18", - "prop-types": "^15.6.2", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-i18next": "^10.11.0", - "react-router": "^6.23.1", - "react-router-dom": "^6.23.1", - }, - }, - "extensions/dicom-pdf": { - "name": "@ohif/extension-dicom-pdf", - "version": "3.12.0-beta.22", - "dependencies": { - "@babel/runtime": "^7.20.13", - "classnames": "^2.3.2", - }, - "peerDependencies": { - "@ohif/core": "3.12.0-beta.18", - "@ohif/ui": "3.12.0-beta.18", - "dcmjs": "0.43.1", - "dicom-parser": "^1.8.9", - "hammerjs": "^2.0.8", - "prop-types": "^15.6.2", - "react": "^18.3.1", - }, - }, - "extensions/dicom-video": { - "name": "@ohif/extension-dicom-video", - "version": "3.12.0-beta.22", - "dependencies": { - "@babel/runtime": "^7.20.13", - "classnames": "^2.3.2", - }, - "peerDependencies": { - "@ohif/core": "3.12.0-beta.18", - "@ohif/ui": "3.12.0-beta.18", - "dcmjs": "0.43.1", - "dicom-parser": "^1.8.9", - "hammerjs": "^2.0.8", - "prop-types": "^15.6.2", - "react": "^18.3.1", - }, - }, - "extensions/measurement-tracking": { - "name": "@ohif/extension-measurement-tracking", - "version": "3.12.0-beta.22", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@ohif/ui": "3.12.0-beta.22", - "@xstate/react": "^3.2.2", - "xstate": "^4.10.0", - }, - "peerDependencies": { - "@cornerstonejs/core": "^4.0.0", - "@cornerstonejs/tools": "^4.0.0", - "@ohif/core": "3.12.0-beta.22", - "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.22", - "@ohif/extension-default": "3.12.0-beta.22", - "@ohif/ui": "3.12.0-beta.22", - "classnames": "^2.3.2", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dcmjs": "0.43.1", "lodash.debounce": "4.0.8", "prop-types": "15.8.1", @@ -604,11 +424,7 @@ }, "extensions/test-extension": { "name": "@ohif/extension-test", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -625,11 +441,7 @@ }, "extensions/tmtv": { "name": "@ohif/extension-tmtv", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -646,11 +458,7 @@ }, "extensions/usAnnotation": { "name": "@ohif/extension-ultrasound-pleura-bline", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/core": "4.5.13", @@ -702,11 +510,7 @@ }, "modes/basic-dev-mode": { "name": "@ohif/mode-basic-dev-mode", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -726,11 +530,7 @@ }, "modes/basic-test-mode": { "name": "@ohif/mode-test", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -752,11 +552,7 @@ }, "modes/longitudinal": { "name": "@ohif/mode-longitudinal", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -779,11 +575,7 @@ }, "modes/microscopy": { "name": "@ohif/mode-microscopy", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -795,11 +587,7 @@ }, "modes/preclinical-4d": { "name": "@ohif/mode-preclinical-4d", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", }, @@ -818,11 +606,7 @@ }, "modes/segmentation": { "name": "@ohif/mode-segmentation", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -866,11 +650,7 @@ }, "modes/tmtv": { "name": "@ohif/mode-tmtv", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -891,11 +671,7 @@ }, "modes/usAnnotation": { "name": "@ohif/mode-ultrasound-pleura-bline", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/core": "4.5.13", @@ -934,11 +710,7 @@ }, "platform/app": { "name": "@ohif/app", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/codec-charls": "1.2.3", @@ -1017,11 +789,7 @@ }, "platform/cli": { "name": "@ohif/cli", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "bin": { "ohif-cli": "src/index.js", }, @@ -1045,11 +813,7 @@ }, "platform/core": { "name": "@ohif/core", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "dcmjs": "0.43.1", @@ -1070,7 +834,6 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { -<<<<<<< HEAD "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.2.4", @@ -1078,26 +841,13 @@ "@cornerstonejs/core": "4.5.13", "@cornerstonejs/dicom-image-loader": "4.5.13", "@ohif/ui": "3.11.1", -======= - "@cornerstonejs/codec-charls": "^1.2.3", - "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", - "@cornerstonejs/codec-openjpeg": "^1.2.4", - "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/core": "^4.0.0", - "@cornerstonejs/dicom-image-loader": "^4.0.0", - "@ohif/ui": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "cornerstone-math": "0.1.9", "dicom-parser": "1.8.21", }, }, "platform/i18n": { "name": "@ohif/i18n", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@babel/runtime": "7.28.2", "i18next-locize-backend": "2.2.2", @@ -1122,11 +872,7 @@ }, "platform/ui": { "name": "@ohif/ui", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@testing-library/react": "13.4.0", "browser-detect": "0.2.28", @@ -1177,11 +923,7 @@ }, "platform/ui-next": { "name": "@ohif/ui-next", -<<<<<<< HEAD "version": "3.11.1", -======= - "version": "3.12.0-beta.22", ->>>>>>> 38a3756b62 (Add command to load derived display sets) "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-checkbox": "1.3.2", From 10142f77284afad45e082bd384a339c84715ab4f Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Mon, 19 Jan 2026 19:48:07 -0300 Subject: [PATCH 13/13] Revert unused changes --- extensions/cornerstone/src/commandsModule.ts | 55 +++---------------- .../default/src/getHangingProtocolModule.js | 3 + 2 files changed, 10 insertions(+), 48 deletions(-) diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index ce6a1b8685b..0c5c3e523dc 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -154,7 +154,7 @@ function commandsModule({ * Retrieves derived segmentations (SEG/RTSTRUCT) that are not yet hydrated * for the given display set UID. */ - function _getDerivedSegmentations(displaySetUID: string): DisplaySet[] { + function getDerivedData(modalities: string[], displaySetUID: string): DisplaySet[] { const currentDisplaySet = displaySetService.getDisplaySetByUID(displaySetUID); if (!currentDisplaySet) { return []; @@ -164,13 +164,8 @@ function commandsModule({ const allDisplaySets = Array.from(displaySetCache.values()); return allDisplaySets.filter((ds): ds is DisplaySet => { - if (!ds?.isOverlayDisplaySet || ds?.isHydrated) { - return false; - } - - /** Check if this is a SEG or RTSTRUCT modality */ - const isSegmentationModality = ds.Modality === 'SEG' || ds.Modality === 'RTSTRUCT'; - if (!isSegmentationModality) { + const isValidModality = modalities.includes(ds.Modality); + if (!isValidModality) { return false; } @@ -183,26 +178,8 @@ function commandsModule({ }); } - function _handleBrushSizeAction(action: 'increase' | 'decrease') { - const toolGroupIds = toolGroupService.getToolGroupIds(); - if (!toolGroupIds?.length) { - return; - } - - for (const toolGroupId of toolGroupIds) { - const brushSize = segmentationUtils.getBrushSizeForToolGroup(toolGroupId); - - const newBrushSize = action === 'increase' ? brushSize + 3 : brushSize - 3; - - if (brushSize) { - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, newBrushSize); - - toolbarService.refreshToolbarState({ toolGroupId }); - } - } - } - const loadDerivedDisplaySetsForActiveViewport = async ( + modalities: string[], onLoadComplete: (displaySet: any, activeViewportId: string) => Promise | void ): Promise => { const activeViewportId = viewportGridService.getActiveViewportId(); @@ -219,9 +196,9 @@ function commandsModule({ } const primaryDisplaySetUID = displaySetInstanceUIDs[0]; - const derivedDisplaySets = _getDerivedSegmentations(primaryDisplaySetUID); + const derivedDisplaySets = getDerivedData(modalities, primaryDisplaySetUID); if (!derivedDisplaySets.length) { - console.warn('No derived segmentations found for active viewport!'); + console.warn('No derived data found for active viewport!'); return false; } @@ -241,26 +218,11 @@ function commandsModule({ }; const actions = { - loadSRsForActiveViewport: async () => { - console.info('Loading SRs for active viewport...'); - - const loaded = await loadDerivedDisplaySetsForActiveViewport(async displaySet => { - commandsManager.run('hydrateStructuredReport', { - displaySetInstanceUID: displaySet.displaySetInstanceUID, - }); - }); - - if (!loaded) { - console.warn('No derived SRs found for active viewport'); - return; - } - - console.info('SRs loaded for active viewport.'); - }, loadSegmentationsForActiveViewport: async () => { console.info('Loading segmentations for active viewport...'); const loaded = await loadDerivedDisplaySetsForActiveViewport( + ['SEG', 'RTSTRUCT'], async (displaySet, activeViewportId) => { const representationType = displaySet.Modality === 'SEG' @@ -2392,9 +2354,6 @@ function commandsModule({ }; const definitions = { - loadSRsForActiveViewport: { - commandFn: actions.loadSRsForActiveViewport, - }, loadSegmentationsForActiveViewport: { commandFn: actions.loadSegmentationsForActiveViewport, }, diff --git a/extensions/default/src/getHangingProtocolModule.js b/extensions/default/src/getHangingProtocolModule.js index 4ccd6e271a3..132eb18833f 100644 --- a/extensions/default/src/getHangingProtocolModule.js +++ b/extensions/default/src/getHangingProtocolModule.js @@ -14,6 +14,9 @@ const defaultProtocol = { modifiedDate: '2023-04-01', availableTo: {}, editableBy: {}, + callbacks: { + onViewportDataChanged: ['loadSegmentationsForActiveViewport'], + }, protocolMatchingRules: [], toolGroupIds: ['default'], // -1 would be used to indicate active only, whereas other values are