diff --git a/bun.lock b/bun.lock index 18c4b753f..72b2db206 100644 --- a/bun.lock +++ b/bun.lock @@ -52,7 +52,7 @@ }, "addOns/externals/devDependencies": { "name": "@externals/devDependencies", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "@kitware/vtk.js": "32.12.0", @@ -137,22 +137,22 @@ }, "addOns/externals/dicom-microscopy-viewer": { "name": "@externals/dicom-microscopy-viewer", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "dicom-microscopy-viewer": "0.48.6", }, }, "extensions/cornerstone": { "name": "@ohif/extension-cornerstone", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/ai": "4.5.20", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/labelmap-interpolation": "4.5.20", - "@cornerstonejs/polymorphic-segmentation": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/ai": "4.9.0", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/labelmap-interpolation": "4.9.0", + "@cornerstonejs/polymorphic-segmentation": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "@itk-wasm/morphological-contour-interpolation": "1.1.0", "@kitware/vtk.js": "32.12.0", "html2canvas": "1.4.1", @@ -169,9 +169,9 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.5.20", - "@ohif/core": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@cornerstonejs/dicom-image-loader": "4.9.0", + "@ohif/core": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -183,19 +183,19 @@ }, "extensions/cornerstone-dicom-pmap": { "name": "@ohif/extension-cornerstone-dicom-pmap", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/core": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/core": "4.9.0", "@kitware/vtk.js": "32.12.0", "react-color": "2.19.3", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -206,16 +206,16 @@ }, "extensions/cornerstone-dicom-rt": { "name": "@ohif/extension-cornerstone-dicom-rt", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "react-color": "2.19.3", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -226,19 +226,19 @@ }, "extensions/cornerstone-dicom-seg": { "name": "@ohif/extension-cornerstone-dicom-seg", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/core": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/core": "4.9.0", "@kitware/vtk.js": "32.12.0", "react-color": "2.19.3", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -249,19 +249,19 @@ }, "extensions/cornerstone-dicom-sr": { "name": "@ohif/extension-cornerstone-dicom-sr", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-measurement-tracking": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-measurement-tracking": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -271,19 +271,19 @@ }, "extensions/cornerstone-dynamic-volume": { "name": "@ohif/extension-cornerstone-dynamic-volume", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -293,7 +293,7 @@ }, "extensions/default": { "name": "@ohif/extension-default", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/calculate-suv": "1.1.0", @@ -301,8 +301,8 @@ "lodash.uniqby": "4.7.0", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", "dcmjs": "0.43.1", "dicomweb-client": "0.10.4", "prop-types": "15.8.1", @@ -316,7 +316,7 @@ }, "extensions/dicom-microscopy": { "name": "@ohif/extension-dicom-microscopy", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/codec-charls": "1.2.3", @@ -327,10 +327,10 @@ "mathjs": "12.4.3", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -341,14 +341,14 @@ }, "extensions/dicom-pdf": { "name": "@ohif/extension-dicom-pdf", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -358,14 +358,14 @@ }, "extensions/dicom-video": { "name": "@ohif/extension-dicom-video", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -375,20 +375,20 @@ }, "extensions/measurement-tracking": { "name": "@ohif/extension-measurement-tracking", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@ohif/ui": "3.12.0-beta.78", + "@ohif/ui": "3.12.0-beta.79", "@xstate/react": "3.2.2", "xstate": "4.38.3", }, "peerDependencies": { - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "classnames": "2.5.1", "dcmjs": "0.43.1", "lodash.debounce": "4.0.8", @@ -401,14 +401,14 @@ }, "extensions/test-extension": { "name": "@ohif/extension-test", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", "dcmjs": "0.43.1", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -418,7 +418,7 @@ }, "extensions/tmtv": { "name": "@ohif/extension-tmtv", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -435,16 +435,16 @@ }, "extensions/usAnnotation": { "name": "@ohif/extension-ultrasound-pleura-bline", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", - "@ohif/ui-next": "3.12.0-beta.78", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", + "@ohif/ui-next": "3.12.0-beta.79", }, "devDependencies": { "@babel/core": "7.28.0", @@ -487,7 +487,7 @@ }, "modes/basic": { "name": "@ohif/mode-basic", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", }, @@ -508,7 +508,7 @@ }, "modes/basic-dev-mode": { "name": "@ohif/mode-basic-dev-mode", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -518,17 +518,17 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/extension-dicom-pdf": "3.12.0-beta.78", - "@ohif/extension-dicom-video": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/extension-dicom-pdf": "3.12.0-beta.79", + "@ohif/extension-dicom-video": "3.12.0-beta.79", }, }, "modes/basic-test-mode": { "name": "@ohif/mode-test", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -538,19 +538,19 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/extension-dicom-pdf": "3.12.0-beta.78", - "@ohif/extension-dicom-video": "3.12.0-beta.78", - "@ohif/extension-measurement-tracking": "3.12.0-beta.78", - "@ohif/extension-test": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/extension-dicom-pdf": "3.12.0-beta.79", + "@ohif/extension-dicom-video": "3.12.0-beta.79", + "@ohif/extension-measurement-tracking": "3.12.0-beta.79", + "@ohif/extension-test": "3.12.0-beta.79", }, }, "modes/longitudinal": { "name": "@ohif/mode-longitudinal", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -560,32 +560,32 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/extension-dicom-pdf": "3.12.0-beta.78", - "@ohif/extension-dicom-video": "3.12.0-beta.78", - "@ohif/extension-measurement-tracking": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/extension-dicom-pdf": "3.12.0-beta.79", + "@ohif/extension-dicom-video": "3.12.0-beta.79", + "@ohif/extension-measurement-tracking": "3.12.0-beta.79", }, }, "modes/microscopy": { "name": "@ohif/mode-microscopy", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", }, "peerDependencies": { - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-dicom-microscopy": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-dicom-microscopy": "3.12.0-beta.79", }, }, "modes/preclinical-4d": { "name": "@ohif/mode-preclinical-4d", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", }, @@ -604,7 +604,7 @@ }, "modes/segmentation": { "name": "@ohif/mode-segmentation", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -648,7 +648,7 @@ }, "modes/tmtv": { "name": "@ohif/mode-tmtv", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -669,14 +669,14 @@ }, "modes/usAnnotation": { "name": "@ohif/mode-ultrasound-pleura-bline", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.78", - "@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.78", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.79", + "@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.79", "i18next": "17.3.1", }, "devDependencies": { @@ -708,34 +708,34 @@ }, "platform/app": { "name": "@ohif/app", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.5.20", + "@cornerstonejs/dicom-image-loader": "4.9.0", "@emotion/serialize": "1.3.3", - "@ohif/core": "3.12.0-beta.78", - "@ohif/extension-cornerstone": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.78", - "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.78", - "@ohif/extension-default": "3.12.0-beta.78", - "@ohif/extension-dicom-microscopy": "3.12.0-beta.78", - "@ohif/extension-dicom-pdf": "3.12.0-beta.78", - "@ohif/extension-dicom-video": "3.12.0-beta.78", - "@ohif/extension-test": "3.12.0-beta.78", - "@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.78", - "@ohif/i18n": "3.12.0-beta.78", - "@ohif/mode-basic-dev-mode": "3.12.0-beta.78", - "@ohif/mode-longitudinal": "3.12.0-beta.78", - "@ohif/mode-microscopy": "3.12.0-beta.78", - "@ohif/mode-test": "3.12.0-beta.78", - "@ohif/mode-ultrasound-pleura-bline": "3.12.0-beta.78", - "@ohif/ui": "3.12.0-beta.78", - "@ohif/ui-next": "3.12.0-beta.78", + "@ohif/core": "3.12.0-beta.79", + "@ohif/extension-cornerstone": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.79", + "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.79", + "@ohif/extension-default": "3.12.0-beta.79", + "@ohif/extension-dicom-microscopy": "3.12.0-beta.79", + "@ohif/extension-dicom-pdf": "3.12.0-beta.79", + "@ohif/extension-dicom-video": "3.12.0-beta.79", + "@ohif/extension-test": "3.12.0-beta.79", + "@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.79", + "@ohif/i18n": "3.12.0-beta.79", + "@ohif/mode-basic-dev-mode": "3.12.0-beta.79", + "@ohif/mode-longitudinal": "3.12.0-beta.79", + "@ohif/mode-microscopy": "3.12.0-beta.79", + "@ohif/mode-test": "3.12.0-beta.79", + "@ohif/mode-ultrasound-pleura-bline": "3.12.0-beta.79", + "@ohif/ui": "3.12.0-beta.79", + "@ohif/ui-next": "3.12.0-beta.79", "@svgr/webpack": "8.1.0", "@types/react": "18.3.23", "classnames": "2.5.1", @@ -787,7 +787,7 @@ }, "platform/cli": { "name": "@ohif/cli", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "bin": { "ohif-cli": "src/index.js", }, @@ -811,7 +811,7 @@ }, "platform/core": { "name": "@ohif/core", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "dcmjs": "0.43.1", @@ -836,16 +836,16 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/dicom-image-loader": "4.5.20", - "@ohif/ui": "3.12.0-beta.78", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/dicom-image-loader": "4.9.0", + "@ohif/ui": "3.12.0-beta.79", "cornerstone-math": "0.1.9", "dicom-parser": "1.8.21", }, }, "platform/i18n": { "name": "@ohif/i18n", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@babel/runtime": "7.28.2", "i18next-locize-backend": "2.2.2", @@ -870,7 +870,7 @@ }, "platform/ui": { "name": "@ohif/ui", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@testing-library/react": "13.4.0", "browser-detect": "0.2.28", @@ -921,7 +921,7 @@ }, "platform/ui-next": { "name": "@ohif/ui-next", - "version": "3.12.0-beta.78", + "version": "3.12.0-beta.79", "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-checkbox": "1.3.2", @@ -1228,9 +1228,9 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - "@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.5.20", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.5.20", "@cornerstonejs/tools": "4.5.20" } }, "sha512-VamRAnlWoNrb4dKx8UfZBgR3mssei88OMoSaNG9V6g+CZUfpMEuZrinTN7ksph0kZ6h8YgIdfDoSzweTpS7cNA=="], + "@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.9.0", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.9.0", "@cornerstonejs/tools": "4.9.0" } }, "sha512-wP5nZQobLe0JHfdftxqOm9901XPnDASDP40nEryKHI/t+8MMKq/XOI4zStkwdInimgaohHR9ppV8Ybuob7Zu4Q=="], - "@cornerstonejs/ai": ["@cornerstonejs/ai@4.5.20", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "gl-matrix": "3.4.3", "lodash.clonedeep": "4.5.0", "ndarray": "1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "4.5.20", "@cornerstonejs/tools": "4.5.20" } }, "sha512-M+MumfAzEX2U5r0QRifYvYqH3xBf2qaqPNaMprHuzPG0Xh8NR9E4KvpZWdW8Wn04quTBO8O/nJ+H9deGlY0idA=="], + "@cornerstonejs/ai": ["@cornerstonejs/ai@4.9.0", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.43.1", "gl-matrix": "3.4.3", "lodash.clonedeep": "4.5.0", "ndarray": "1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "4.9.0", "@cornerstonejs/tools": "4.9.0" } }, "sha512-eS036rfCJ4twK9LpyixUS2UgZ5IfR4A1gA959LyR9jyOY0ol24KeJyvXsZ9eSpbJO8VJ3tJVLwNVAKgjyosnwQ=="], "@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="], @@ -1242,15 +1242,15 @@ "@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="], - "@cornerstonejs/core": ["@cornerstonejs/core@4.5.20", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-AWI8GilT9JfCBJywnQwZ5xQZG4EQHujIb4J9VPqyJ/K0ShQ4b7l9kabZ30S6zkimeClntNVVa1Quas7gWPW2LQ=="], + "@cornerstonejs/core": ["@cornerstonejs/core@4.9.0", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-Gj8/nhogWg63r4vUSXD4QU8ffAB5AzUcAfNjPYBk7L6yzp42AwBMkuh2zetY1ZSJCgsCImIYpcvH/WLWpZa/9Q=="], - "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.5.20", "", { "dependencies": { "@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", "comlink": "4.4.2", "dicom-parser": "1.8.21", "jpeg-lossless-decoder-js": "2.1.2", "pako": "2.1.0", "uuid": "9.0.1" }, "peerDependencies": { "@cornerstonejs/core": "4.5.20" } }, "sha512-eH4q4ERBlJJsJL9gRWEmCVR96VIxAYV3XIEs9PbRqMs4cfW4AjcupmwuCIbTAVP93LIDXxqN8f2lQXCDjQugjQ=="], + "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.9.0", "", { "dependencies": { "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", "comlink": "4.4.2", "dicom-parser": "1.8.21", "jpeg-lossless-decoder-js": "2.1.2", "pako": "2.1.0", "uuid": "9.0.1" }, "peerDependencies": { "@cornerstonejs/core": "4.9.0" } }, "sha512-IKgpSjGPya/Nhntf6Cy09RafsO9sqDb4EwkoCC8cZ+QFCe4af6sNSIovJjOdREqIgB5iMEsTa8U1foe/slRwlA=="], - "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.5.20", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.5.20", "@cornerstonejs/tools": "4.5.20", "@kitware/vtk.js": "32.12.1" } }, "sha512-lbVKXloFJk1HFHtFKLSjbchilnE1bfnM/JYlr16HSvlgb1rPd7GPoZFfrn034oowNEfOLjqJ+C35EaaIjSOxxw=="], + "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.9.0", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.9.0", "@cornerstonejs/tools": "4.9.0", "@kitware/vtk.js": "32.12.1" } }, "sha512-LrWrXcLh9Gd4FE3hkq74bElGXJjF1izE9SFjvkYIHNUHGuIQiD2oYGlBFALXpjUb4i3B4hfVA0wz55z4Fz2vfg=="], - "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.5.20", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.5.20", "@cornerstonejs/tools": "4.5.20", "@kitware/vtk.js": "32.12.1" } }, "sha512-s4es71KDzsrMPchGm5B3lERIF/M+OHMtFZbXAzGcZ8KnZZkmX1j1G6vxakcW8IjXL4knkDuSkZxevFXWIKyMoA=="], + "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.9.0", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.9.0", "@cornerstonejs/tools": "4.9.0", "@kitware/vtk.js": "32.12.1" } }, "sha512-oONftUjfDTfa7ex6zqeUtuPqqeFAATH5dszxiKh4xtoY2AlBhNFjfbhFLdWTa4Y1Lfl9yOWNK1sNZAOA1BnUXQ=="], - "@cornerstonejs/tools": ["@cornerstonejs/tools@4.5.20", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.5.20", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", "d3-array": "3.2.4", "d3-interpolate": "3.0.1", "gl-matrix": "3.4.3" } }, "sha512-FY2sxm7vPiCI1Vm1JsHeIYMi45686V8/RkRa47XDt/035B/v36pr81pyE9nl/jb7FJiHfzSyDeROJ8YoPVe9qQ=="], + "@cornerstonejs/tools": ["@cornerstonejs/tools@4.9.0", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.9.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", "d3-array": "3.2.4", "d3-interpolate": "3.0.1", "gl-matrix": "3.4.3" } }, "sha512-cUd50Lc85T4OwTXPrBTUjyIKHHe5icxR5N8H6X3NQFfhTsCB11nZLt7530hL2oQZmAleg5u853XbAVzoaa9mjg=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], diff --git a/extensions/cornerstone-dicom-pmap/package.json b/extensions/cornerstone-dicom-pmap/package.json index 18e324574..4265e66af 100644 --- a/extensions/cornerstone-dicom-pmap/package.json +++ b/extensions/cornerstone-dicom-pmap/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/core": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/core": "4.9.0", "@kitware/vtk.js": "32.12.0", "react-color": "2.19.3" } diff --git a/extensions/cornerstone-dicom-seg/package.json b/extensions/cornerstone-dicom-seg/package.json index 6faaaef17..6290017c0 100644 --- a/extensions/cornerstone-dicom-seg/package.json +++ b/extensions/cornerstone-dicom-seg/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/core": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/core": "4.9.0", "@kitware/vtk.js": "32.12.0", "react-color": "2.19.3" } diff --git a/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts b/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts index 35a576f29..6fb56cad2 100644 --- a/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts +++ b/extensions/cornerstone-dicom-seg/src/getToolbarModule.ts @@ -1,4 +1,6 @@ +import { utilities as cstUtils } from '@cornerstonejs/tools'; import { useUIStateStore } from '@ohif/extension-default'; + import LogicalContourOperationsOptions from './components/LogicalContourOperationsOptions'; import SimplifyContourOptions from './components/SimplifyContourOptions'; import SmoothContoursOptions from './components/SmoothContoursOptions'; @@ -118,5 +120,23 @@ export function getToolbarModule({ servicesManager }: withAppTypes) { }; }, }, + { + name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius', + evaluate: ({ button, radiusOptionId }) => { + const toolGroupIds = toolGroupService.getToolGroupIds(); + if (!toolGroupIds?.length) { + return; + } + + for (const toolGroupId of toolGroupIds) { + const brushSize = cstUtils.segmentation.getBrushSizeForToolGroup(toolGroupId); + + if (brushSize) { + const option = toolbarService.getOptionById(button, radiusOptionId); + option.value = brushSize; + } + } + }, + }, ]; } diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index dbc55dd93..4ab057ad7 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,9 +46,9 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "classnames": "2.5.1" } } diff --git a/extensions/cornerstone-dynamic-volume/package.json b/extensions/cornerstone-dynamic-volume/package.json index 9b5ef7c32..b364f2ce6 100644 --- a/extensions/cornerstone-dynamic-volume/package.json +++ b/extensions/cornerstone-dynamic-volume/package.json @@ -42,8 +42,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "classnames": "2.5.1" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index 539d5e20d..24ee93af6 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -40,7 +40,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.5.20", + "@cornerstonejs/dicom-image-loader": "4.9.0", "@ohif/core": "3.12.0-beta.80", "@ohif/ui": "3.12.0-beta.80", "dcmjs": "0.43.1", @@ -53,12 +53,12 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.5.20", - "@cornerstonejs/ai": "4.5.20", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/labelmap-interpolation": "4.5.20", - "@cornerstonejs/polymorphic-segmentation": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/adapters": "4.9.0", + "@cornerstonejs/ai": "4.9.0", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/labelmap-interpolation": "4.9.0", + "@cornerstonejs/polymorphic-segmentation": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "@itk-wasm/morphological-contour-interpolation": "1.1.0", "@kitware/vtk.js": "32.12.0", "html2canvas": "1.4.1", diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 61c0679f7..7738fd1a8 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -120,6 +120,7 @@ function commandsModule({ }: OhifTypes.Extensions.ExtensionParams): OhifTypes.Extensions.CommandsModule { const { viewportGridService, + toolbarService, toolGroupService, cineService, uiDialogService, @@ -159,6 +160,25 @@ 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 actions = { jumpToMeasurementViewport: ({ annotationUID, measurement }) => { cornerstoneTools.annotation.selection.setAnnotationSelected(annotationUID, true); @@ -2025,17 +2045,11 @@ function commandsModule({ segmentAI.initViewport(viewport); } }, - setBrushSize: ({ value, toolNames }) => { + setBrushSize: ({ value }) => { const brushSize = Number(value); toolGroupService.getToolGroupIds()?.forEach(toolGroupId => { - if (toolNames?.length === 0) { - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize); - } else { - toolNames?.forEach(toolName => { - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize, toolName); - }); - } + segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize); }); }, setThresholdRange: ({ @@ -2064,26 +2078,10 @@ function commandsModule({ } }, increaseBrushSize: () => { - const toolGroupIds = toolGroupService.getToolGroupIds(); - if (!toolGroupIds?.length) { - return; - } - - for (const toolGroupId of toolGroupIds) { - const brushSize = segmentationUtils.getBrushSizeForToolGroup(toolGroupId); - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize + 3); - } + _handleBrushSizeAction('increase'); }, decreaseBrushSize: () => { - const toolGroupIds = toolGroupService.getToolGroupIds(); - if (!toolGroupIds?.length) { - return; - } - - for (const toolGroupId of toolGroupIds) { - const brushSize = segmentationUtils.getBrushSizeForToolGroup(toolGroupId); - segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize - 3); - } + _handleBrushSizeAction('decrease'); }, addNewSegment: () => { const { segmentationService } = servicesManager.services; diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 277274a69..007dee266 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "start": "yarn run dev" }, "peerDependencies": { - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "@ohif/core": "3.12.0-beta.80", "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.80", "@ohif/extension-default": "3.12.0-beta.80", diff --git a/extensions/usAnnotation/package.json b/extensions/usAnnotation/package.json index a64687bfb..8fbfc35ea 100644 --- a/extensions/usAnnotation/package.json +++ b/extensions/usAnnotation/package.json @@ -42,8 +42,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "@ohif/core": "3.12.0-beta.80", "@ohif/extension-cornerstone": "3.12.0-beta.80", "@ohif/extension-default": "3.12.0-beta.80", diff --git a/modes/segmentation/src/constants.ts b/modes/segmentation/src/constants.ts new file mode 100644 index 000000000..c8afca7e4 --- /dev/null +++ b/modes/segmentation/src/constants.ts @@ -0,0 +1,2 @@ +export const MIN_SEGMENTATION_DRAWING_RADIUS = 0.5; +export const MAX_SEGMENTATION_DRAWING_RADIUS = 99.5; diff --git a/modes/segmentation/src/initToolGroups.ts b/modes/segmentation/src/initToolGroups.ts index bef3b1d3e..23509a8c9 100644 --- a/modes/segmentation/src/initToolGroups.ts +++ b/modes/segmentation/src/initToolGroups.ts @@ -1,3 +1,5 @@ +import { MIN_SEGMENTATION_DRAWING_RADIUS, MAX_SEGMENTATION_DRAWING_RADIUS } from './constants'; + const colours = { 'viewport-0': 'rgb(200, 0, 0)', 'viewport-1': 'rgb(200, 200, 0)', @@ -32,6 +34,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'FILL_INSIDE_CIRCLE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -48,6 +52,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'ERASE_INSIDE_CIRCLE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -55,6 +61,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'FILL_INSIDE_SPHERE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -62,6 +70,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'ERASE_INSIDE_SPHERE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -69,6 +79,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_CIRCLE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -76,6 +88,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_SPHERE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -83,6 +97,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_CIRCLE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, threshold: { isDynamic: true, dynamicRadius: 3, @@ -100,6 +116,8 @@ function createTools({ utilityModule, commandsManager }) { parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_SPHERE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, threshold: { isDynamic: true, dynamicRadius: 3, diff --git a/modes/segmentation/src/toolbarButtons.ts b/modes/segmentation/src/toolbarButtons.ts index ced9497c7..69360f4a6 100644 --- a/modes/segmentation/src/toolbarButtons.ts +++ b/modes/segmentation/src/toolbarButtons.ts @@ -2,6 +2,8 @@ import type { Button } from '@ohif/core/types'; import { ViewportGridService } from '@ohif/core'; import i18n from 'i18next'; +import { MIN_SEGMENTATION_DRAWING_RADIUS, MAX_SEGMENTATION_DRAWING_RADIUS } from './constants'; + const setToolActiveToolbar = { commandName: 'setToolActiveToolbar', commandOptions: { @@ -651,6 +653,10 @@ const toolbarButtons: Button[] = [ toolNames: ['CircularBrush', 'SphereBrush'], disabledText: i18n.t('Buttons:Create new segmentation to enable this tool.'), }, + { + name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius', + radiusOptionId: 'brush-radius', + }, { name: 'evaluate.cornerstone.hasSegmentationOfType', segmentationRepresentationType: 'Labelmap', @@ -667,8 +673,9 @@ const toolbarButtons: Button[] = [ name: 'Radius (mm)', id: 'brush-radius', type: 'range', - min: 0.5, - max: 99.5, + explicitRunOnly: true, + min: MIN_SEGMENTATION_DRAWING_RADIUS, + max: MAX_SEGMENTATION_DRAWING_RADIUS, step: 0.5, value: 25, commands: [ @@ -894,6 +901,10 @@ const toolbarButtons: Button[] = [ name: 'evaluate.cornerstone.segmentation', toolNames: ['CircularEraser', 'SphereEraser'], }, + { + name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius', + radiusOptionId: 'eraser-radius', + }, { name: 'evaluate.cornerstone.hasSegmentationOfType', segmentationRepresentationType: 'Labelmap', @@ -904,8 +915,9 @@ const toolbarButtons: Button[] = [ name: 'Radius (mm)', id: 'eraser-radius', type: 'range', - min: 0.5, - max: 99.5, + explicitRunOnly: true, + min: MIN_SEGMENTATION_DRAWING_RADIUS, + max: MAX_SEGMENTATION_DRAWING_RADIUS, step: 0.5, value: 25, commands: { @@ -949,6 +961,10 @@ const toolbarButtons: Button[] = [ 'ThresholdSphereBrushDynamic', ], }, + { + name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius', + radiusOptionId: 'threshold-radius', + }, { name: 'evaluate.cornerstone.hasSegmentationOfType', segmentationRepresentationType: 'Labelmap', @@ -960,14 +976,14 @@ const toolbarButtons: Button[] = [ segmentationRepresentationType: 'Labelmap', }, }, - options: [ { name: 'Radius (mm)', id: 'threshold-radius', type: 'range', - min: 0.5, - max: 99.5, + explicitRunOnly: true, + min: MIN_SEGMENTATION_DRAWING_RADIUS, + max: MAX_SEGMENTATION_DRAWING_RADIUS, step: 0.5, value: 25, commands: { diff --git a/modes/tmtv/src/constants.ts b/modes/tmtv/src/constants.ts new file mode 100644 index 000000000..c8afca7e4 --- /dev/null +++ b/modes/tmtv/src/constants.ts @@ -0,0 +1,2 @@ +export const MIN_SEGMENTATION_DRAWING_RADIUS = 0.5; +export const MAX_SEGMENTATION_DRAWING_RADIUS = 99.5; diff --git a/modes/tmtv/src/initToolGroups.js b/modes/tmtv/src/initToolGroups.js index 4c959be00..f844839c3 100644 --- a/modes/tmtv/src/initToolGroups.js +++ b/modes/tmtv/src/initToolGroups.js @@ -1,3 +1,5 @@ +import { MIN_SEGMENTATION_DRAWING_RADIUS, MAX_SEGMENTATION_DRAWING_RADIUS } from './constants'; + export const toolGroupIds = { CT: 'ctToolGroup', PT: 'ptToolGroup', @@ -61,6 +63,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { parentTool: 'Brush', configuration: { activeStrategy: 'FILL_INSIDE_CIRCLE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -68,6 +72,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { parentTool: 'Brush', configuration: { activeStrategy: 'ERASE_INSIDE_CIRCLE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -75,6 +81,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { parentTool: 'Brush', configuration: { activeStrategy: 'FILL_INSIDE_SPHERE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -82,6 +90,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { parentTool: 'Brush', configuration: { activeStrategy: 'ERASE_INSIDE_SPHERE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -89,6 +99,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_CIRCLE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -96,6 +108,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { parentTool: 'Brush', configuration: { activeStrategy: 'THRESHOLD_INSIDE_SPHERE', + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, { @@ -110,6 +124,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { isDynamic: true, dynamicRadius: 3, }, + minRadius: MIN_SEGMENTATION_DRAWING_RADIUS, + maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS, }, }, ], diff --git a/modes/tmtv/src/toolbarButtons.ts b/modes/tmtv/src/toolbarButtons.ts index 2a5c740d9..f0a91200a 100644 --- a/modes/tmtv/src/toolbarButtons.ts +++ b/modes/tmtv/src/toolbarButtons.ts @@ -1,6 +1,8 @@ import { toolGroupIds } from './initToolGroups'; import i18n from 'i18next'; +import { MIN_SEGMENTATION_DRAWING_RADIUS, MAX_SEGMENTATION_DRAWING_RADIUS } from './constants'; + const setToolActiveToolbar = { commandName: 'setToolActiveToolbar', commandOptions: { @@ -205,18 +207,25 @@ const toolbarButtons = [ props: { icon: 'icon-tool-brush', label: i18n.t('Buttons:Brush'), - evaluate: { - name: 'evaluate.cornerstone.segmentation', - toolNames: ['CircularBrush', 'SphereBrush'], - disabledText: i18n.t('Buttons:Create new segmentation to enable this tool.'), - }, + evaluate: [ + { + name: 'evaluate.cornerstone.segmentation', + toolNames: ['CircularBrush', 'SphereBrush'], + disabledText: i18n.t('Buttons:Create new segmentation to enable this tool.'), + }, + { + name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius', + radiusOptionId: 'brush-radius', + }, + ], options: [ { name: 'Radius (mm)', id: 'brush-radius', type: 'range', - min: 0.5, - max: 99.5, + explicitRunOnly: true, + min: MIN_SEGMENTATION_DRAWING_RADIUS, + max: MAX_SEGMENTATION_DRAWING_RADIUS, step: 0.5, value: 25, commands: { @@ -244,17 +253,24 @@ const toolbarButtons = [ props: { icon: 'icon-tool-eraser', label: i18n.t('Buttons:Eraser'), - evaluate: { - name: 'evaluate.cornerstone.segmentation', - toolNames: ['CircularEraser', 'SphereEraser'], - }, + evaluate: [ + { + name: 'evaluate.cornerstone.segmentation', + toolNames: ['CircularEraser', 'SphereEraser'], + }, + { + name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius', + radiusOptionId: 'eraser-radius', + }, + ], options: [ { name: 'Radius (mm)', id: 'eraser-radius', type: 'range', - min: 0.5, - max: 99.5, + explicitRunOnly: true, + min: MIN_SEGMENTATION_DRAWING_RADIUS, + max: MAX_SEGMENTATION_DRAWING_RADIUS, step: 0.5, value: 25, commands: { @@ -282,17 +298,24 @@ const toolbarButtons = [ props: { icon: 'icon-tool-threshold', label: i18n.t('Buttons:Threshold Tool'), - evaluate: { - name: 'evaluate.cornerstone.segmentation', - toolNames: ['ThresholdCircularBrush', 'ThresholdSphereBrush'], - }, + evaluate: [ + { + name: 'evaluate.cornerstone.segmentation', + toolNames: ['ThresholdCircularBrush', 'ThresholdSphereBrush'], + }, + { + name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius', + radiusOptionId: 'threshold-radius', + }, + ], options: [ { name: 'Radius (mm)', id: 'threshold-radius', type: 'range', - min: 0.5, - max: 99.5, + explicitRunOnly: true, + min: MIN_SEGMENTATION_DRAWING_RADIUS, + max: MAX_SEGMENTATION_DRAWING_RADIUS, step: 0.5, value: 25, commands: { diff --git a/modes/usAnnotation/package.json b/modes/usAnnotation/package.json index cc4bdd604..9df85b147 100644 --- a/modes/usAnnotation/package.json +++ b/modes/usAnnotation/package.json @@ -34,8 +34,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/tools": "4.5.20", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/tools": "4.9.0", "@ohif/core": "3.12.0-beta.80", "@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.80", "@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.80", diff --git a/platform/app/package.json b/platform/app/package.json index 27be77d74..a9fa2da1b 100644 --- a/platform/app/package.json +++ b/platform/app/package.json @@ -53,7 +53,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.5.20", + "@cornerstonejs/dicom-image-loader": "4.9.0", "@emotion/serialize": "1.3.3", "@ohif/core": "3.12.0-beta.80", "@ohif/extension-cornerstone": "3.12.0-beta.80", diff --git a/platform/core/package.json b/platform/core/package.json index 87ee7aa92..3bc057963 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -37,8 +37,8 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/core": "4.5.20", - "@cornerstonejs/dicom-image-loader": "4.5.20", + "@cornerstonejs/core": "4.9.0", + "@cornerstonejs/dicom-image-loader": "4.9.0", "@ohif/ui": "3.12.0-beta.80", "cornerstone-math": "0.1.9", "dicom-parser": "1.8.21" diff --git a/platform/core/src/services/ToolBarService/ToolbarService.ts b/platform/core/src/services/ToolBarService/ToolbarService.ts index 515df0583..cb2d309ce 100644 --- a/platform/core/src/services/ToolBarService/ToolbarService.ts +++ b/platform/core/src/services/ToolBarService/ToolbarService.ts @@ -2,7 +2,7 @@ import { CommandsManager } from '../../classes'; import { ExtensionManager } from '../../extensions'; import { PubSubService } from '../_shared/pubSubServiceInterface'; import type { RunCommand } from '../../types/Command'; -import { Button, ButtonProps, EvaluateFunction, EvaluatePublic } from './types'; +import { Button, ButtonOptions, ButtonProps, EvaluateFunction, EvaluatePublic } from './types'; const EVENTS = { TOOL_BAR_MODIFIED: 'event::toolBarService:toolBarModified', @@ -592,7 +592,7 @@ export default class ToolbarService extends PubSubService { const { id: buttonId, props: componentProps } = btn; - const createEnhancedOptions = (options, itemId) => { + const createEnhancedOptions = (options: ButtonOptions[], itemId) => { const optionsToUse = Array.isArray(options) ? options : [options]; const toolProps = this.getButtonProps(itemId); @@ -833,4 +833,14 @@ export default class ToolbarService extends PubSubService { return { align: 'start', side: 'bottom' }; } } + + /** + * Retrieves an option by its ID from a button's options array. + * @param button - The button object. + * @param optionId - The ID of the option to retrieve. + * @returns The option with the specified ID. + */ + public getOptionById(button: Button, optionId: string) { + return button.props.options?.find(option => option.id === optionId); + } } diff --git a/platform/core/src/services/ToolBarService/types.ts b/platform/core/src/services/ToolBarService/types.ts index 317197cb5..9d7b4df8e 100644 --- a/platform/core/src/services/ToolBarService/types.ts +++ b/platform/core/src/services/ToolBarService/types.ts @@ -40,6 +40,7 @@ export type ButtonOptions = { max?: number; step?: number; value?: number | number[] | string; + values: Array<{ value: string; label: string }>; commands?: RunCommand; condition?: (props: Record) => boolean; children?: React.ReactNode | (() => React.ReactNode); @@ -50,6 +51,7 @@ export type ButtonOptions = { export type ButtonProps = { id: string; icon: string; + isActive?: boolean; label: string; tooltip?: string; commands?: RunCommand; diff --git a/platform/docs/versioned_docs/version-3.11/platform/services/data/ToolbarService.md b/platform/docs/versioned_docs/version-3.11/platform/services/data/ToolbarService.md index 704e4cd2b..e952e7308 100644 --- a/platform/docs/versioned_docs/version-3.11/platform/services/data/ToolbarService.md +++ b/platform/docs/versioned_docs/version-3.11/platform/services/data/ToolbarService.md @@ -34,8 +34,7 @@ The `ToolBarService` is a straightforward service designed to handle the toolbar - `setButtons`: sets the buttons defined in the service. It overrides all the previous buttons - - +- `getOptionById(button, optionId)`: from inside a given button, will search through its props and grab the one with the given optionId ## Button Definitions diff --git a/tests/SEGDrawingToolsResizing.spec.ts b/tests/SEGDrawingToolsResizing.spec.ts new file mode 100644 index 000000000..2ac1408b9 --- /dev/null +++ b/tests/SEGDrawingToolsResizing.spec.ts @@ -0,0 +1,95 @@ +import { test, expect } from 'playwright-test-coverage'; +import { Page } from '@playwright/test'; + +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; +import { press } from './utils/keyboardUtils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.12.2.1107.5.2.32.35162.30000015050317233592200000046'; + const mode = 'segmentation'; + await visitStudy(page, studyInstanceUID, mode, 2000); + + await page.getByTestId('panelSegmentationWithToolsLabelMap-btn').click(); + await page.getByTestId('addSegmentation').click(); + + await page.waitForTimeout(500); +}); + +async function performDrawingToolInteraction(page: Page, toolName: string) { + const brushRadiusInput = page.getByTestId(`${toolName}-radius`).locator('input'); + const viewportGrid = page.getByTestId('viewport-grid'); + const circle = viewportGrid.locator('svg.svg-layer circle').first(); + + await expect(brushRadiusInput).toHaveValue('25'); + await viewportGrid.click({ position: { x: 275, y: 300 } }); + let radius = parseFloat(await circle.getAttribute('r')); + expect(radius).toBeGreaterThanOrEqual(65); + expect(radius).toBeLessThanOrEqual(68); + + await page.waitForTimeout(500); + await press({ page, key: '[', nTimes: 2 }); + await expect(brushRadiusInput).toHaveValue('19'); + await viewportGrid.click({ position: { x: 500, y: 300 } }); + radius = parseFloat(await circle.getAttribute('r')); + expect(radius).toBeGreaterThanOrEqual(49); + expect(radius).toBeLessThanOrEqual(52); + + await page.waitForTimeout(500); + + await press({ page, key: ']', nTimes: 5 }); + await expect(brushRadiusInput).toHaveValue('34'); + await viewportGrid.click({ position: { x: 275, y: 500 } }); + radius = parseFloat(await circle.getAttribute('r')); + expect(radius).toBeGreaterThanOrEqual(87); + expect(radius).toBeLessThanOrEqual(90); + + await page.waitForTimeout(500); + + await brushRadiusInput.fill('42'); + await viewportGrid.click({ position: { x: 500, y: 500 } }); + radius = parseFloat(await circle.getAttribute('r')); + expect(radius).toBeGreaterThanOrEqual(108); + expect(radius).toBeLessThanOrEqual(111); + + await page.waitForTimeout(500); +} + +test('(shouldUpdateThis) should resize segmentation brush tool', async ({ page }) => { + await page.getByTestId('Brush-btn').click(); + + await performDrawingToolInteraction(page, 'brush'); + + await checkForScreenshot( + page, + page.getByTestId('viewport-grid'), + screenShotPaths.segDrawingToolsResizing.brushTool + ); +}); + +test('(shouldUpdateThis) should resize segmentation eraser tool', async ({ page }) => { + await page.getByTestId('Brush-btn').click(); + + await page.getByTestId('brush-radius').locator('input').fill('99.5'); + await page.getByTestId('viewport-grid').click({ position: { x: 400, y: 400 } }); + + await page.waitForTimeout(500); + + await page.getByTestId('Eraser-btn').click(); + await page.getByTestId('eraser-radius').locator('input').fill('25'); + + await page.waitForTimeout(500); + + await performDrawingToolInteraction(page, 'eraser'); + + await checkForScreenshot( + page, + page.getByTestId('viewport-grid'), + screenShotPaths.segDrawingToolsResizing.eraserTool + ); +}); + +test('(shouldUpdateThis) should resize segmentation threshold tool', async ({ page }) => { + await page.getByTestId('Threshold-btn').click(); + + await performDrawingToolInteraction(page, 'threshold'); +}); diff --git a/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/brushTool.png b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/brushTool.png new file mode 100644 index 000000000..6a53ee8e1 Binary files /dev/null and b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/brushTool.png differ diff --git a/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/eraserTool.png b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/eraserTool.png new file mode 100644 index 000000000..c1b0ee2f7 Binary files /dev/null and b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/eraserTool.png differ diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index 82b395e56..ef2f75a18 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -144,6 +144,10 @@ const screenShotPaths = { segDataOverlayNoHydrationPreMPR: 'segDataOverlayNoHydrationPreMpr.png', segDataOverlayNoHydrationPostMPR: 'segDataOverlayNoHydrationPostMpr.png', }, + segDrawingToolsResizing: { + brushTool: 'brushTool.png', + eraserTool: 'eraserTool.png', + }, mprThenRTOverlayNoHydration: { mprPreRTOverlayNoHydration: 'mprPreRTOverlayNoHydration.png', mprPostRTOverlayNoHydration: 'mprPostRTOverlayNoHydration.png', diff --git a/yarn.lock b/yarn.lock index cab4fa6a9..2cedc037c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1280,10 +1280,10 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cornerstonejs/adapters@4.5.20": - version "4.5.20" - resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.5.20.tgz#3ed39349f8843babf7fbe56b40eb7b0264894780" - integrity sha512-VamRAnlWoNrb4dKx8UfZBgR3mssei88OMoSaNG9V6g+CZUfpMEuZrinTN7ksph0kZ6h8YgIdfDoSzweTpS7cNA== +"@cornerstonejs/adapters@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.9.0.tgz#fb3b4eedb30c9df9dc16174cc387a845b8394685" + integrity sha512-wP5nZQobLe0JHfdftxqOm9901XPnDASDP40nEryKHI/t+8MMKq/XOI4zStkwdInimgaohHR9ppV8Ybuob7Zu4Q== dependencies: "@babel/runtime-corejs2" "7.26.10" buffer "6.0.3" @@ -1291,10 +1291,10 @@ gl-matrix "3.4.3" ndarray "1.0.19" -"@cornerstonejs/ai@4.5.20": - version "4.5.20" - resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.5.20.tgz#69fde3dc9a61f115cfa4cc2d0dcfa5841ed1113d" - integrity sha512-M+MumfAzEX2U5r0QRifYvYqH3xBf2qaqPNaMprHuzPG0Xh8NR9E4KvpZWdW8Wn04quTBO8O/nJ+H9deGlY0idA== +"@cornerstonejs/ai@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.9.0.tgz#60a3cded3bdd0b9c030b0173d71212b4c2012083" + integrity sha512-eS036rfCJ4twK9LpyixUS2UgZ5IfR4A1gA959LyR9jyOY0ol24KeJyvXsZ9eSpbJO8VJ3tJVLwNVAKgjyosnwQ== dependencies: "@babel/runtime-corejs2" "7.26.10" buffer "6.0.3" @@ -1320,7 +1320,7 @@ resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz#ae384b149d6655e3dd6e18b9891fab479ab5e144" integrity sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg== -"@cornerstonejs/codec-openjpeg@1.2.4", "@cornerstonejs/codec-openjpeg@1.3.0", "@cornerstonejs/codec-openjpeg@^1.2.4": +"@cornerstonejs/codec-openjpeg@1.3.0", "@cornerstonejs/codec-openjpeg@^1.2.4": version "1.3.0" resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.3.0.tgz#2e5973f3e207db3d6cf47e34f74010e2f6f0a0bf" integrity sha512-hP8WAZ63AcaDYmHbBVTY04x424AglXsRHrI6VBdW4eTiJ76f0heWrEodT9Sb3sNwazzYuyMOIZNndJPeVSeHcw== @@ -1330,24 +1330,24 @@ resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.7.tgz#784394d05d8cf735640e9c3baa206535ee8e0376" integrity sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w== -"@cornerstonejs/core@4.5.20": - version "4.5.20" - resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.5.20.tgz#02c89300bf32629ecc5e3deb9053f5ec4118f9f8" - integrity sha512-AWI8GilT9JfCBJywnQwZ5xQZG4EQHujIb4J9VPqyJ/K0ShQ4b7l9kabZ30S6zkimeClntNVVa1Quas7gWPW2LQ== +"@cornerstonejs/core@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.9.0.tgz#e3ffe1064a810e8fa7d6af0d5dd3a26be4d625c5" + integrity sha512-Gj8/nhogWg63r4vUSXD4QU8ffAB5AzUcAfNjPYBk7L6yzp42AwBMkuh2zetY1ZSJCgsCImIYpcvH/WLWpZa/9Q== dependencies: "@kitware/vtk.js" "32.12.1" comlink "4.4.2" gl-matrix "3.4.3" loglevel "1.9.2" -"@cornerstonejs/dicom-image-loader@4.5.20": - version "4.5.20" - resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.5.20.tgz#be0e640fc546512bda8d43bd6276a666f3de5dda" - integrity sha512-eH4q4ERBlJJsJL9gRWEmCVR96VIxAYV3XIEs9PbRqMs4cfW4AjcupmwuCIbTAVP93LIDXxqN8f2lQXCDjQugjQ== +"@cornerstonejs/dicom-image-loader@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.9.0.tgz#6745c9140b075ffeffddd90c5bbda2a9162c55b7" + integrity sha512-IKgpSjGPya/Nhntf6Cy09RafsO9sqDb4EwkoCC8cZ+QFCe4af6sNSIovJjOdREqIgB5iMEsTa8U1foe/slRwlA== dependencies: "@cornerstonejs/codec-charls" "1.2.3" "@cornerstonejs/codec-libjpeg-turbo-8bit" "1.2.2" - "@cornerstonejs/codec-openjpeg" "1.2.4" + "@cornerstonejs/codec-openjpeg" "1.3.0" "@cornerstonejs/codec-openjph" "2.4.7" comlink "4.4.2" dicom-parser "1.8.21" @@ -1355,25 +1355,25 @@ pako "2.1.0" uuid "9.0.1" -"@cornerstonejs/labelmap-interpolation@4.5.20": - version "4.5.20" - resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.5.20.tgz#e8962f04bc566175369a7cd78c685cc2c2df488b" - integrity sha512-lbVKXloFJk1HFHtFKLSjbchilnE1bfnM/JYlr16HSvlgb1rPd7GPoZFfrn034oowNEfOLjqJ+C35EaaIjSOxxw== +"@cornerstonejs/labelmap-interpolation@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.9.0.tgz#946625ae54934318130f683edd7bb0e40620ab8c" + integrity sha512-LrWrXcLh9Gd4FE3hkq74bElGXJjF1izE9SFjvkYIHNUHGuIQiD2oYGlBFALXpjUb4i3B4hfVA0wz55z4Fz2vfg== dependencies: "@itk-wasm/morphological-contour-interpolation" "1.1.0" itk-wasm "1.0.0-b.165" -"@cornerstonejs/polymorphic-segmentation@4.5.20": - version "4.5.20" - resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.5.20.tgz#8fb0eec12f51457c140f93343f94ba870d0fe10c" - integrity sha512-s4es71KDzsrMPchGm5B3lERIF/M+OHMtFZbXAzGcZ8KnZZkmX1j1G6vxakcW8IjXL4knkDuSkZxevFXWIKyMoA== +"@cornerstonejs/polymorphic-segmentation@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.9.0.tgz#805d651af4b69c1570dea0134179f75faaa9428c" + integrity sha512-oONftUjfDTfa7ex6zqeUtuPqqeFAATH5dszxiKh4xtoY2AlBhNFjfbhFLdWTa4Y1Lfl9yOWNK1sNZAOA1BnUXQ== dependencies: "@icr/polyseg-wasm" "0.4.0" -"@cornerstonejs/tools@4.5.20": - version "4.5.20" - resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.5.20.tgz#4e6f2d0dc2ecbee84b1d2d3108abaf9081b2c1f6" - integrity sha512-FY2sxm7vPiCI1Vm1JsHeIYMi45686V8/RkRa47XDt/035B/v36pr81pyE9nl/jb7FJiHfzSyDeROJ8YoPVe9qQ== +"@cornerstonejs/tools@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.9.0.tgz#276c84095789cd39afc223a42389c469de253720" + integrity sha512-cUd50Lc85T4OwTXPrBTUjyIKHHe5icxR5N8H6X3NQFfhTsCB11nZLt7530hL2oQZmAleg5u853XbAVzoaa9mjg== dependencies: "@types/offscreencanvas" "2019.7.3" comlink "4.4.2"