feat: Add WSI bulk data annotations support (ANN) (#4972)

Co-authored-by: Bill Wallace <wayfarer3130@gmail.com>
This commit is contained in:
Igor Octaviano 2025-08-20 08:13:30 -04:00 committed by GitHub
parent 0164ad5519
commit 2ed6818171
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 461 additions and 265 deletions

View File

@ -201,8 +201,6 @@ module.exports = (env, argv, { SRC_DIR, ENTRY }) => {
'@hooks': path.resolve(__dirname, '../platform/app/src/hooks'),
'@routes': path.resolve(__dirname, '../platform/app/src/routes'),
'@state': path.resolve(__dirname, '../platform/app/src/state'),
'dicom-microscopy-viewer':
'dicom-microscopy-viewer/dist/dynamic-import/dicomMicroscopyViewer.min.js',
},
// Which directories to search when resolving modules
modules: [

View File

@ -4,6 +4,6 @@
"version": "3.12.0-beta.7",
"license": "MIT",
"dependencies": {
"dicom-microscopy-viewer": "^0.46.1"
"dicom-microscopy-viewer": "^0.48.6"
}
}

352
bun.lock
View File

@ -41,7 +41,7 @@
},
"addOns/externals/devDependencies": {
"name": "@externals/devDependencies",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@kitware/vtk.js": "32.12.0",
@ -126,22 +126,22 @@
},
"addOns/externals/dicom-microscopy-viewer": {
"name": "@externals/dicom-microscopy-viewer",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"dicom-microscopy-viewer": "^0.46.1",
"dicom-microscopy-viewer": "^0.48.6",
},
},
"extensions/cornerstone": {
"name": "@ohif/extension-cornerstone",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/ai": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/labelmap-interpolation": "^3.32.5",
"@cornerstonejs/polymorphic-segmentation": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/ai": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/labelmap-interpolation": "^3.32.12",
"@cornerstonejs/polymorphic-segmentation": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1",
@ -158,9 +158,9 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.32.5",
"@ohif/core": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@cornerstonejs/dicom-image-loader": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"dcmjs": "0.43.1",
"dicom-parser": "^1.8.21",
"hammerjs": "^2.0.8",
@ -172,19 +172,19 @@
},
"extensions/cornerstone-dicom-pmap": {
"name": "@ohif/extension-cornerstone-dicom-pmap",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -195,16 +195,16 @@
},
"extensions/cornerstone-dicom-rt": {
"name": "@ohif/extension-cornerstone-dicom-rt",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"react-color": "^2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -215,19 +215,19 @@
},
"extensions/cornerstone-dicom-seg": {
"name": "@ohif/extension-cornerstone-dicom-seg",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -238,19 +238,19 @@
},
"extensions/cornerstone-dicom-sr": {
"name": "@ohif/extension-cornerstone-dicom-sr",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-measurement-tracking": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-measurement-tracking": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"dcmjs": "0.43.1",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -260,19 +260,19 @@
},
"extensions/cornerstone-dynamic-volume": {
"name": "@ohif/extension-cornerstone-dynamic-volume",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"dcmjs": "0.43.1",
"dicom-parser": "^1.8.21",
"hammerjs": "^2.0.8",
@ -282,7 +282,7 @@
},
"extensions/default": {
"name": "@ohif/extension-default",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/calculate-suv": "^1.1.0",
@ -290,8 +290,8 @@
"lodash.uniqby": "^4.7.0",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"dcmjs": "0.43.1",
"dicomweb-client": "^0.10.4",
"prop-types": "^15.6.2",
@ -305,7 +305,7 @@
},
"extensions/dicom-microscopy": {
"name": "@ohif/extension-dicom-microscopy",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/codec-charls": "^1.2.3",
@ -316,10 +316,10 @@
"mathjs": "^12.4.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -330,14 +330,14 @@
},
"extensions/dicom-pdf": {
"name": "@ohif/extension-dicom-pdf",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"dcmjs": "0.43.1",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -347,14 +347,14 @@
},
"extensions/dicom-video": {
"name": "@ohif/extension-dicom-video",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"dcmjs": "0.43.1",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -364,20 +364,20 @@
},
"extensions/measurement-tracking": {
"name": "@ohif/extension-measurement-tracking",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/ui": "3.12.0-beta.7",
"@xstate/react": "^3.2.2",
"xstate": "^4.10.0",
},
"peerDependencies": {
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"classnames": "^2.3.2",
"dcmjs": "0.43.1",
"lodash.debounce": "^4.0.8",
@ -390,14 +390,14 @@
},
"extensions/test-extension": {
"name": "@ohif/extension-test",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"dcmjs": "0.43.1",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -407,7 +407,7 @@
},
"extensions/tmtv": {
"name": "@ohif/extension-tmtv",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
@ -424,16 +424,16 @@
},
"extensions/usAnnotation": {
"name": "@ohif/extension-ultrasound-pleura-bline",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/ui-next": "3.11.0-beta.114",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"@ohif/ui-next": "3.12.0-beta.7",
},
"devDependencies": {
"@babel/core": "7.28.0",
@ -476,7 +476,7 @@
},
"modes/basic-dev-mode": {
"name": "@ohif/mode-basic-dev-mode",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -486,17 +486,17 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/extension-dicom-pdf": "3.11.0-beta.114",
"@ohif/extension-dicom-video": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/extension-dicom-pdf": "3.12.0-beta.7",
"@ohif/extension-dicom-video": "3.12.0-beta.7",
},
},
"modes/basic-test-mode": {
"name": "@ohif/mode-test",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -506,19 +506,19 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/extension-dicom-pdf": "3.11.0-beta.114",
"@ohif/extension-dicom-video": "3.11.0-beta.114",
"@ohif/extension-measurement-tracking": "3.11.0-beta.114",
"@ohif/extension-test": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/extension-dicom-pdf": "3.12.0-beta.7",
"@ohif/extension-dicom-video": "3.12.0-beta.7",
"@ohif/extension-measurement-tracking": "3.12.0-beta.7",
"@ohif/extension-test": "3.12.0-beta.7",
},
},
"modes/longitudinal": {
"name": "@ohif/mode-longitudinal",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -528,32 +528,32 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/extension-dicom-pdf": "3.11.0-beta.114",
"@ohif/extension-dicom-video": "3.11.0-beta.114",
"@ohif/extension-measurement-tracking": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/extension-dicom-pdf": "3.12.0-beta.7",
"@ohif/extension-dicom-video": "3.12.0-beta.7",
"@ohif/extension-measurement-tracking": "3.12.0-beta.7",
},
},
"modes/microscopy": {
"name": "@ohif/mode-microscopy",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-dicom-microscopy": "3.12.0-beta.7",
},
},
"modes/preclinical-4d": {
"name": "@ohif/mode-preclinical-4d",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
},
@ -572,7 +572,7 @@
},
"modes/segmentation": {
"name": "@ohif/mode-segmentation",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -616,7 +616,7 @@
},
"modes/tmtv": {
"name": "@ohif/mode-tmtv",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -637,14 +637,14 @@
},
"modes/usAnnotation": {
"name": "@ohif/mode-ultrasound-pleura-bline",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.114",
"@ohif/extension-ultrasound-pleura-bline": "3.11.0-beta.114",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.7",
"i18next": "^17.0.3",
},
"devDependencies": {
@ -676,34 +676,34 @@
},
"platform/app": {
"name": "@ohif/app",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"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",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.32.5",
"@cornerstonejs/dicom-image-loader": "^3.32.12",
"@emotion/serialize": "^1.1.3",
"@ohif/core": "3.11.0-beta.114",
"@ohif/extension-cornerstone": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.114",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.114",
"@ohif/extension-default": "3.11.0-beta.114",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.114",
"@ohif/extension-dicom-pdf": "3.11.0-beta.114",
"@ohif/extension-dicom-video": "3.11.0-beta.114",
"@ohif/extension-test": "3.11.0-beta.114",
"@ohif/extension-ultrasound-pleura-bline": "3.11.0-beta.114",
"@ohif/i18n": "3.11.0-beta.114",
"@ohif/mode-basic-dev-mode": "3.11.0-beta.114",
"@ohif/mode-longitudinal": "3.11.0-beta.114",
"@ohif/mode-microscopy": "3.11.0-beta.114",
"@ohif/mode-test": "3.11.0-beta.114",
"@ohif/mode-ultrasound-pleura-bline": "3.11.0-beta.114",
"@ohif/ui": "3.11.0-beta.114",
"@ohif/ui-next": "3.11.0-beta.114",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-rt": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-seg": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",
"@ohif/extension-dicom-microscopy": "3.12.0-beta.7",
"@ohif/extension-dicom-pdf": "3.12.0-beta.7",
"@ohif/extension-dicom-video": "3.12.0-beta.7",
"@ohif/extension-test": "3.12.0-beta.7",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.7",
"@ohif/i18n": "3.12.0-beta.7",
"@ohif/mode-basic-dev-mode": "3.12.0-beta.7",
"@ohif/mode-longitudinal": "3.12.0-beta.7",
"@ohif/mode-microscopy": "3.12.0-beta.7",
"@ohif/mode-test": "3.12.0-beta.7",
"@ohif/mode-ultrasound-pleura-bline": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"@ohif/ui-next": "3.12.0-beta.7",
"@svgr/webpack": "^8.1.0",
"@types/react": "^18.3.3",
"classnames": "^2.3.2",
@ -744,7 +744,7 @@
},
"platform/cli": {
"name": "@ohif/cli",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"bin": {
"ohif-cli": "src/index.js",
},
@ -768,7 +768,7 @@
},
"platform/core": {
"name": "@ohif/core",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"dcmjs": "0.43.1",
@ -793,16 +793,16 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/dicom-image-loader": "^3.32.5",
"@ohif/ui": "3.11.0-beta.114",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/dicom-image-loader": "^3.32.12",
"@ohif/ui": "3.12.0-beta.7",
"cornerstone-math": "0.1.9",
"dicom-parser": "^1.8.21",
},
},
"platform/i18n": {
"name": "@ohif/i18n",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next-locize-backend": "^2.0.0",
@ -827,7 +827,7 @@
},
"platform/ui": {
"name": "@ohif/ui",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@testing-library/react": "^13.1.0",
"browser-detect": "^0.2.28",
@ -887,7 +887,7 @@
},
"platform/ui-next": {
"name": "@ohif/ui-next",
"version": "3.11.0-beta.114",
"version": "3.12.0-beta.7",
"dependencies": {
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-checkbox": "^1.1.1",
@ -1200,9 +1200,9 @@
"@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.32.5", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.43.1", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5", "@cornerstonejs/tools": "^3.32.5" } }, "sha512-tpd+sHjE54VOqme83HZ9XqGKztjikrwbrWR4M3e8X+fuR6LJ+qNQ6+YkPdfThzu0KxN+q8mO5aSvGyJo82rRnA=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.32.12", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.43.1", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.12", "@cornerstonejs/tools": "^3.32.12" } }, "sha512-dC33XemAmrSQF4qWtyBSjM7m+ecqgZ6QPjO3Mt8Z7zqU9PVzz5CUKUQaRzatByASnRNYweePrZkcvDCcdpBKaQ=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@3.32.5", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "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": "^3.32.5", "@cornerstonejs/tools": "^3.32.5" } }, "sha512-j7paST1ounIAvJYS9/qqOsjknjdFcfcNdwCKiwB5KpobL2/BmYNl4kEZNdYXZPhFfQPQvgpW71OedxkDdwaJ2A=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@3.32.12", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "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": "^3.32.12", "@cornerstonejs/tools": "^3.32.12" } }, "sha512-F8Vq1oVO/uabmsNIAUXxth9rZ5GtVAj3jZfexZpJiMiB02jKx83LzKuF4kWdPFDbVIi64JLboKGLYBAXjFbcxg=="],
"@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="],
@ -1214,15 +1214,15 @@
"@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="],
"@cornerstonejs/core": ["@cornerstonejs/core@3.32.5", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-6m/ODfSyM+8/ZigD2wM2wl8yjxmDx9DTen/R5nxCHUe4sqK97PKjfmcN5OK9cOCzwlzqQBZTFow1Ra6UAfkKCA=="],
"@cornerstonejs/core": ["@cornerstonejs/core@3.32.12", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-JU3NyRHrPEMuKnH0pNmFyVroY+uafa9o2wml7/QgXgByJRKrK9ocBEZP0pE4U0YeNqwfV+UJIEUPMjHhBkWClg=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.32.5", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5" } }, "sha512-fOUkphjdzTG8Flw0XV4bGUEZtbASeE2/Y+HssKr4PiwiDvGcVvVQF7RxyKkvabP3OsZIAaBOhPB8ghKEEXDp2w=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.32.12", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.12" } }, "sha512-8tsL+IFz6H5VNho+tsjWge8g10brDqp0l3WMjUZ+uNSccc/o4ARrVsDvDFSzRQyMRh5aVp8YCGu4Rotd/p2ryg=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.32.5", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5", "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1" } }, "sha512-+E476+jgAAOGUVUcdMD0D2K5/yHfc3rCVCgApfZ9H5mOaEavVHPjGxomFkE5twnBfQIBKgTos3968anl21ziAw=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.32.12", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.12", "@cornerstonejs/tools": "^3.32.12", "@kitware/vtk.js": "32.12.1" } }, "sha512-tNrxKuwI6bU77EKJO9sV/vem0WhNTveprPvewxtwbq3r10ekP1TcOHzoxGQFOM+v+n6DzZo5u9MMki6kviz1lQ=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.32.5", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5", "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1" } }, "sha512-MyG1ULFhOEdc8ud+5NJhVUmlBis61K3IWod1UYxZM4VdY7kivbdPbWXaynhnYTUg5OeXGPsETLWdLw/5E32mag=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.32.12", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.12", "@cornerstonejs/tools": "^3.32.12", "@kitware/vtk.js": "32.12.1" } }, "sha512-W7eeYDCd5CwJdQexamM8f9tSFx9Tcy6Z19r2z0Ioodw+vHK7+okqNPv72KfZPa7QHNBC7E+VH9CzbFmZqywp7w=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@3.32.5", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-h1UWy/u8Cz1QPsMvbNF+rRGwaEdRnGwCbOSZQwLzYOuvaV+rvGAI6l+Xbhe9zUgzE1lSbBigiQjdGHiNtnVWPQ=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@3.32.12", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.12", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-IRzEeDhlZyTrLixvryLHMayvZN2xUc708SO6Rm7qa+2QWtSMzB/c5tLLyW6koux4EEVeP5CYKk3jelgbFbj9fQ=="],
"@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
@ -1448,14 +1448,6 @@
"@lerna/create": ["@lerna/create@7.4.2", "", { "dependencies": { "@lerna/child-process": "7.4.2", "@npmcli/run-script": "6.0.2", "@nx/devkit": ">=16.5.1 < 17", "@octokit/plugin-enterprise-rest": "6.0.1", "@octokit/rest": "19.0.11", "byte-size": "8.1.1", "chalk": "4.1.0", "clone-deep": "4.0.1", "cmd-shim": "6.0.1", "columnify": "1.6.0", "conventional-changelog-core": "5.0.1", "conventional-recommended-bump": "7.0.1", "cosmiconfig": "^8.2.0", "dedent": "0.7.0", "execa": "5.0.0", "fs-extra": "^11.1.1", "get-stream": "6.0.0", "git-url-parse": "13.1.0", "glob-parent": "5.1.2", "globby": "11.1.0", "graceful-fs": "4.2.11", "has-unicode": "2.0.1", "ini": "^1.3.8", "init-package-json": "5.0.0", "inquirer": "^8.2.4", "is-ci": "3.0.1", "is-stream": "2.0.0", "js-yaml": "4.1.0", "libnpmpublish": "7.3.0", "load-json-file": "6.2.0", "lodash": "^4.17.21", "make-dir": "4.0.0", "minimatch": "3.0.5", "multimatch": "5.0.0", "node-fetch": "2.6.7", "npm-package-arg": "8.1.1", "npm-packlist": "5.1.1", "npm-registry-fetch": "^14.0.5", "npmlog": "^6.0.2", "nx": ">=16.5.1 < 17", "p-map": "4.0.0", "p-map-series": "2.1.0", "p-queue": "6.6.2", "p-reduce": "^2.1.0", "pacote": "^15.2.0", "pify": "5.0.0", "read-cmd-shim": "4.0.0", "read-package-json": "6.0.4", "resolve-from": "5.0.0", "rimraf": "^4.4.1", "semver": "^7.3.4", "signal-exit": "3.0.7", "slash": "^3.0.0", "ssri": "^9.0.1", "strong-log-transformer": "2.1.0", "tar": "6.1.11", "temp-dir": "1.0.0", "upath": "2.0.1", "uuid": "^9.0.0", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "5.0.0", "write-file-atomic": "5.0.1", "write-pkg": "4.0.0", "yargs": "16.2.0", "yargs-parser": "20.2.4" } }, "sha512-1wplFbQ52K8E/unnqB0Tq39Z4e+NEoNrpovEnl6GpsTUrC6WDp8+w0Le2uCBV0hXyemxChduCkLz4/y1H1wTeg=="],
"@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="],
"@mapbox/mapbox-gl-style-spec": ["@mapbox/mapbox-gl-style-spec@13.28.0", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/unitbezier": "^0.0.0", "csscolorparser": "~1.0.2", "json-stringify-pretty-compact": "^2.0.0", "minimist": "^1.2.6", "rw": "^1.3.3", "sort-object": "^0.3.2" }, "bin": { "gl-style-format": "bin/gl-style-format.js", "gl-style-migrate": "bin/gl-style-migrate.js", "gl-style-validate": "bin/gl-style-validate.js", "gl-style-composite": "bin/gl-style-composite.js" } }, "sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg=="],
"@mapbox/point-geometry": ["@mapbox/point-geometry@0.1.0", "", {}, "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="],
"@mapbox/unitbezier": ["@mapbox/unitbezier@0.0.0", "", {}, "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA=="],
"@mdx-js/react": ["@mdx-js/react@2.3.0", "", { "dependencies": { "@types/mdx": "^2.0.0", "@types/react": ">=16" }, "peerDependencies": { "react": ">=16" } }, "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g=="],
"@microsoft/tsdoc": ["@microsoft/tsdoc@0.14.2", "", {}, "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug=="],
@ -2124,6 +2116,8 @@
"@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="],
"@types/rbush": ["@types/rbush@4.0.0", "", {}, "sha512-+N+2H39P8X+Hy1I5mC6awlTX54k3FhiUmvt7HWzGJZvF+syUAAxP/stwppS8JE84YHqFgRMv6fCy31202CMFxQ=="],
"@types/react": ["@types/react@18.3.23", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w=="],
"@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="],
@ -2778,8 +2772,6 @@
"css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
"csscolorparser": ["csscolorparser@1.0.3", "", {}, "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w=="],
"cssdb": ["cssdb@7.11.2", "", {}, "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A=="],
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
@ -2954,7 +2946,7 @@
"detective": ["detective@5.2.1", "", { "dependencies": { "acorn-node": "^1.8.2", "defined": "^1.0.0", "minimist": "^1.2.6" }, "bin": { "detective": "bin/detective.js" } }, "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw=="],
"dicom-microscopy-viewer": ["dicom-microscopy-viewer@0.46.1", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "colormap": "^2.3", "dcmjs": "^0.29.8", "dicomicc": "^0.1", "dicomweb-client": "^0.8.4", "image-type": "^4.1", "mathjs": "^11.2", "ol": "^7.1", "uuid": "^9.0" } }, "sha512-QLozX/iM6ZA0TxheHQnTNiLg+RbSVlxYKMNG9qdqV5oNbEDOf+z4/8mDqnAQ8wjlQXE2MbUDX8JRa0LmO9mDTg=="],
"dicom-microscopy-viewer": ["dicom-microscopy-viewer@0.48.6", "", { "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.5", "colormap": "^2.3", "dcmjs": "^0.41.0", "dicomicc": "^0.1", "dicomweb-client": "^0.10.3", "image-type": "^4.1", "mathjs": "^11.2", "ol": "^10.4.0", "uuid": "^9.0" } }, "sha512-cTQ14qE3zqzlH0QOIhxbrIOsLVNCV6/i9qDrIiOnmD3I1R2W6cwRN4iMgQ0c6zas/9+o645Tu37FA6BqQ3fIlg=="],
"dicom-parser": ["dicom-parser@1.8.21", "", {}, "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w=="],
@ -3022,7 +3014,7 @@
"duplexify": ["duplexify@3.7.1", "", { "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="],
"earcut": ["earcut@2.2.4", "", {}, "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="],
"earcut": ["earcut@3.0.2", "", {}, "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ=="],
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
@ -3834,8 +3826,6 @@
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
"json-stringify-pretty-compact": ["json-stringify-pretty-compact@2.0.0", "", {}, "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ=="],
"json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="],
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
@ -3990,8 +3980,6 @@
"map-or-similar": ["map-or-similar@1.5.0", "", {}, "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg=="],
"mapbox-to-css-font": ["mapbox-to-css-font@2.4.5", "", {}, "sha512-VJ6nB8emkO9VODI0Fk+TQ/0zKBTqmf/Pkt8Xv0kHstoc0iXRajA00DAid4Kc3K5xeFIOoiZrVxijEzj0GLVO2w=="],
"markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
"markdown-to-jsx": ["markdown-to-jsx@7.7.12", "", { "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-Y5xNBqoaTooSLkmlg2P0fdbh53gp4MqW7zhvcweGCPUWvWI5BecWRYI8vPlzT8D7OULxsQg2qoRW9EsJlBWasQ=="],
@ -4292,9 +4280,7 @@
"oidc-client-ts": ["oidc-client-ts@3.3.0", "", { "dependencies": { "jwt-decode": "^4.0.0" } }, "sha512-t13S540ZwFOEZKLYHJwSfITugupW4uYLwuQSSXyKH/wHwZ+7FvgHE7gnNJh1YQIZ1Yd1hKSRjqeXGSUtS0r9JA=="],
"ol": ["ol@7.5.2", "", { "dependencies": { "earcut": "^2.2.3", "geotiff": "^2.0.7", "ol-mapbox-style": "^10.1.0", "pbf": "3.2.1", "rbush": "^3.0.1" } }, "sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ=="],
"ol-mapbox-style": ["ol-mapbox-style@10.7.0", "", { "dependencies": { "@mapbox/mapbox-gl-style-spec": "^13.23.1", "mapbox-to-css-font": "^2.4.1", "ol": "^7.3.0" } }, "sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw=="],
"ol": ["ol@10.6.1", "", { "dependencies": { "@types/rbush": "4.0.0", "earcut": "^3.0.0", "geotiff": "^2.1.3", "pbf": "4.0.1", "rbush": "^4.0.0" } }, "sha512-xp174YOwPeLj7c7/8TCIEHQ4d41tgTDDhdv6SqNdySsql5/MaFJEJkjlsYcvOPt7xA6vrum/QG4UdJ0iCGT1cg=="],
"on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
@ -4404,7 +4390,7 @@
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
"pbf": ["pbf@3.2.1", "", { "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ=="],
"pbf": ["pbf@4.0.1", "", { "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA=="],
"pbkdf2": ["pbkdf2@3.1.3", "", { "dependencies": { "create-hash": "~1.1.3", "create-hmac": "^1.1.7", "ripemd160": "=2.0.1", "safe-buffer": "^5.2.1", "sha.js": "^2.4.11", "to-buffer": "^1.2.0" } }, "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA=="],
@ -4672,7 +4658,7 @@
"quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="],
"quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="],
"quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="],
"rabin-rs": ["rabin-rs@2.1.0", "", {}, "sha512-5y72gAXPzIBsAMHcpxZP8eMDuDT98qMP1BqSDHRbHkJJXEgWIN1lA47LxUqzsK6jknOJtgfkQr9v+7qMlFDm6g=="],
@ -4690,7 +4676,7 @@
"raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="],
"rbush": ["rbush@3.0.1", "", { "dependencies": { "quickselect": "^2.0.0" } }, "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w=="],
"rbush": ["rbush@4.0.1", "", { "dependencies": { "quickselect": "^3.0.0" } }, "sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ=="],
"rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="],
@ -4878,8 +4864,6 @@
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
"rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="],
"rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
"sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="],
@ -4986,14 +4970,8 @@
"sonner": ["sonner@1.7.4", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw=="],
"sort-asc": ["sort-asc@0.1.0", "", {}, "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw=="],
"sort-desc": ["sort-desc@0.1.1", "", {}, "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw=="],
"sort-keys": ["sort-keys@1.1.2", "", { "dependencies": { "is-plain-obj": "^1.0.0" } }, "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg=="],
"sort-object": ["sort-object@0.3.2", "", { "dependencies": { "sort-asc": "^0.1.0", "sort-desc": "^0.1.1" } }, "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA=="],
"source-list-map": ["source-list-map@2.0.1", "", {}, "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="],
"source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
@ -6046,8 +6024,6 @@
"detect-package-manager/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
"dicom-microscopy-viewer/dicomweb-client": ["dicomweb-client@0.8.4", "", {}, "sha512-/6oY3/Fg9JyAlbTWuJOYbVqici3+nlZt43+Z/Y47RNiqLc028JcxNlY28u4VQqksxfB59f1hhNbsqsHyDT4vhw=="],
"dicom-microscopy-viewer/mathjs": ["mathjs@11.12.0", "", { "dependencies": { "@babel/runtime": "^7.23.2", "complex.js": "^2.1.1", "decimal.js": "^10.4.3", "escape-latex": "^1.2.0", "fraction.js": "4.3.4", "javascript-natural-sort": "^0.7.1", "seedrandom": "^3.0.5", "tiny-emitter": "^2.1.0", "typed-function": "^4.1.1" }, "bin": { "mathjs": "bin/cli.js" } }, "sha512-UGhVw8rS1AyedyI55DGz9q1qZ0p98kyKPyc9vherBkoueLntPfKtPBh14x+V4cdUWK0NZV2TBwqRFlvadscSuw=="],
"diffie-hellman/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="],

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3"
}

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3"
}

View File

@ -46,9 +46,9 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"classnames": "^2.3.2"
}
}

View File

@ -42,8 +42,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"classnames": "^2.3.2"
}
}

View File

@ -38,7 +38,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.32.5",
"@cornerstonejs/dicom-image-loader": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/ui": "3.12.0-beta.7",
"dcmjs": "0.43.1",
@ -51,12 +51,12 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.32.5",
"@cornerstonejs/ai": "^3.32.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/labelmap-interpolation": "^3.32.5",
"@cornerstonejs/polymorphic-segmentation": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/adapters": "^3.32.12",
"@cornerstonejs/ai": "^3.32.12",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/labelmap-interpolation": "^3.32.12",
"@cornerstonejs/polymorphic-segmentation": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1",

View File

@ -55,6 +55,10 @@ export default async function init({
extensionManager,
appConfig,
}: withAppTypes): Promise<void> {
// Use a public library path of PUBLIC_URL plus the component name
// This safely separates components that are loaded as-is.
window.PUBLIC_LIB_URL ||= './${component}/';
// Note: this should run first before initializing the cornerstone
// DO NOT CHANGE THE ORDER
@ -195,7 +199,6 @@ export default async function init({
commandsManager.runCommand('jumpToMeasurementViewport', { measurement, annotationUID, evt });
});
// When a custom image load is performed, update the relevant viewports
hangingProtocolService.subscribe(
hangingProtocolService.EVENTS.CUSTOM_IMAGE_LOAD_PERFORMED,

View File

@ -0,0 +1,113 @@
import OHIF, { DicomMetadataStore } from '@ohif/core';
import loadAnnotation from './utils/loadAnnotation';
import getSourceDisplaySet from './utils/getSourceDisplaySet';
const { utils } = OHIF;
const SOP_CLASS_UIDS = {
MICROSCOPY_BULK_SIMPLE_ANNOTATION: '1.2.840.10008.5.1.4.1.1.91.1',
};
const SOPClassHandlerId =
'@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopyANNSopClassHandler';
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
// If the series has no instances, stop here
if (!instances || !instances.length) {
throw new Error('No instances were provided');
}
const { displaySetService, microscopyService } = servicesManager.services;
// Sort instances by date/time in ascending order (oldest first)
const sortedInstances = [...instances].sort((a, b) => {
const dateA = `${a.ContentDate}${a.ContentTime}`;
const dateB = `${b.ContentDate}${b.ContentTime}`;
return dateA.localeCompare(dateB);
});
// Get the most recent instance (last in the sorted array)
const instance = sortedInstances[sortedInstances.length - 1];
const naturalizedDataset = DicomMetadataStore.getSeries(
instance.StudyInstanceUID,
instance.SeriesInstanceUID
).instances[0];
const {
SeriesDescription,
ContentDate,
ContentTime,
SeriesNumber,
StudyInstanceUID,
SeriesInstanceUID,
SOPInstanceUID,
SOPClassUID,
} = instance;
const displaySet = {
isOverlayDisplaySet: true,
plugin: 'microscopy',
Modality: 'ANN',
thumbnailSrc: null,
altImageText: 'Microscopy Annotation',
displaySetInstanceUID: utils.uuidv4(),
SOPInstanceUID,
SeriesInstanceUID,
StudyInstanceUID,
SOPClassHandlerId,
SOPClassUID,
SeriesDescription,
// Map the content date/time to the series date/time, these are only used for filtering.
SeriesDate: ContentDate,
SeriesTime: ContentTime,
SeriesNumber,
instance,
metadata: naturalizedDataset,
isDerived: true,
isLoading: false,
isLoaded: false,
loadError: false,
};
displaySet.load = function () {
return loadAnnotation({
microscopyService,
displaySet,
extensionManager,
servicesManager,
}).catch(error => {
displaySet.isLoaded = false;
displaySet.loadError = true;
throw new Error(error);
});
};
displaySet.getSourceDisplaySet = function () {
let allDisplaySets = [];
const studyMetadata = DicomMetadataStore.getStudy(StudyInstanceUID);
studyMetadata.series.forEach(series => {
const displaySets = displaySetService.getDisplaySetsForSeries(series.SeriesInstanceUID);
allDisplaySets = allDisplaySets.concat(displaySets);
});
const ds = getSourceDisplaySet(allDisplaySets, displaySet);
return ds;
};
return [displaySet];
}
export default function getDicomMicroscopyANNSopClassHandler({
servicesManager,
extensionManager,
}) {
const getDisplaySetsFromSeries = instances => {
return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);
};
return {
name: 'DicomMicroscopyANNSopClassHandler',
sopClassUids: [SOP_CLASS_UIDS.MICROSCOPY_BULK_SIMPLE_ANNOTATION],
getDisplaySetsFromSeries,
};
}

View File

@ -62,6 +62,7 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
} = instance;
const displaySet = {
isOverlayDisplaySet: true,
plugin: 'microscopy',
Modality: 'SR',
altImageText: 'Microscopy SR',

View File

@ -172,7 +172,7 @@ function DicomMicroscopyViewport({
microscopyService.clearAnnotations();
let smDisplaySet = displaySet;
if (displaySet.Modality === 'SR') {
if (displaySet.isOverlayDisplaySet) {
// for SR displaySet, let's load the actual image displaySet
smDisplaySet = displaySet.getSourceDisplaySet();
}
@ -180,7 +180,7 @@ function DicomMicroscopyViewport({
await loadViewer(smDisplaySet.others);
if (displaySet.Modality === 'SR') {
if (displaySet.isOverlayDisplaySet && !displaySet.isLoaded && !displaySet.isLoading) {
displaySet.load(smDisplaySet);
}
},
@ -205,8 +205,8 @@ function DicomMicroscopyViewport({
microscopyService.clearAnnotations();
// loading SR
if (displaySet.Modality === 'SR') {
// loading SR - only if not already loaded and not currently loading
if (displaySet.isOverlayDisplaySet && !displaySet.isLoaded && !displaySet.isLoading) {
const referencedDisplaySet = displaySet.getSourceDisplaySet();
displaySet.load(referencedDisplaySet);
}

View File

@ -7,6 +7,7 @@ import { Types } from '@ohif/core';
import { useViewportGrid } from '@ohif/ui-next';
import getDicomMicroscopySRSopClassHandler from './DicomMicroscopySRSopClassHandler';
import getDicomMicroscopyANNSopClassHandler from './DicomMicroscopyANNSopClassHandler';
import MicroscopyService from './services/MicroscopyService';
import { useResizeDetector } from 'react-resize-detector';
import debounce from 'lodash.debounce';
@ -43,7 +44,7 @@ const extension: Types.Extensions.Extension = {
* {name, component} object. Example of a viewport module is the CornerstoneViewport
* that is provided by the Cornerstone extension in OHIF.
*/
getViewportModule({ servicesManager, extensionManager, commandsManager }) {
getViewportModule({ servicesManager }) {
/**
*
* @param props {*}
@ -150,7 +151,10 @@ const extension: Types.Extensions.Extension = {
* Examples include the default sop class handler provided by the default extension
*/
getSopClassHandlerModule(params) {
return [getDicomMicroscopySRSopClassHandler(params)];
return [
getDicomMicroscopySRSopClassHandler(params),
getDicomMicroscopyANNSopClassHandler(params),
];
},
getPanelModule,

View File

@ -22,7 +22,7 @@ export default class MicroscopyService extends PubSubService {
return {
name: 'microscopyService',
altName: 'MicroscopyService',
create: (props) => {
create: props => {
return new MicroscopyService(props);
},
};
@ -71,7 +71,7 @@ export default class MicroscopyService extends PubSubService {
}
public importDicomMicroscopyViewer(): Promise<any> {
return this.peerImport("dicom-microscopy-viewer");
return this.peerImport('dicom-microscopy-viewer');
}
/**
@ -260,6 +260,11 @@ export default class MicroscopyService extends PubSubService {
return Array.from(this.managedViewers).filter(filter);
}
getManagedViewersForViewport(viewportId) {
const filter = managedViewer => managedViewer.viewportId === viewportId;
return Array.from(this.managedViewers).filter(filter);
}
/**
* Restores the created annotations for the viewer being added
*
@ -290,6 +295,13 @@ export default class MicroscopyService extends PubSubService {
* @returns {ViewerManager} managed viewer
*/
addViewer(viewer, viewportId, container, studyInstanceUID, seriesInstanceUID) {
// Check if a viewer already exists for this viewportId
const existingViewer = Array.from(this.managedViewers).find(mv => mv.viewportId === viewportId);
if (existingViewer) {
// If a viewer exists, remove it first
this.removeViewer(existingViewer.viewer);
}
const managedViewer = new ViewerManager(
viewer,
viewportId,
@ -355,6 +367,10 @@ export default class MicroscopyService extends PubSubService {
}
});
if (recentDisplaySet.isLoading) {
return;
}
recentDisplaySet.isLoading = true;
recentDisplaySet.load(smDisplaySet);

View File

@ -9,6 +9,9 @@ const DCM_CODE_VALUES = {
SHORT_AXIS: 'G-A186',
LONG_AXIS: 'G-A185',
ELLIPSE_AREA: 'G-D7FE', // TODO: Remove this
ANNOTATION: '121071',
ANNOTATION_GROUP: '121072',
ANNOTATION_LABEL: '121073',
};
export default DCM_CODE_VALUES;

View File

@ -6,7 +6,15 @@
* @returns
*/
export default function getSourceDisplaySet(allDisplaySets, microscopySRDisplaySet) {
const { ReferencedFrameOfReferenceUID } = microscopySRDisplaySet;
const { ReferencedFrameOfReferenceUID, metadata } = microscopySRDisplaySet;
if (metadata.ReferencedSeriesSequence) {
const { ReferencedSeriesSequence } = metadata;
const referencedSeries = ReferencedSeriesSequence[0];
const { SeriesInstanceUID } = referencedSeries;
const displaySets = allDisplaySets.filter(ds => ds.SeriesInstanceUID === SeriesInstanceUID);
return displaySets[0];
}
const otherDisplaySets = allDisplaySets.filter(
ds => ds.displaySetInstanceUID !== microscopySRDisplaySet.displaySetInstanceUID

View File

@ -0,0 +1,95 @@
import getDicomWebClient from './dicomWebClient';
/**
* Loads and displays DICOM Microscopy Bulk Simple Annotations.
*
* This utility function:
* 1. Retrieves series metadata from a DICOMweb server using study and series instance UIDs
* 2. Converts metadata into MicroscopyBulkSimpleAnnotations objects
* 3. Adds annotations to the viewer in groups (identified by AnnotationGroupUID)
* 4. Applies a consistent yellow color ([255, 234, 0]) to all annotation groups
* 5. Makes the annotation groups visible in the viewer
*
* @param {Object} params - The parameters object
* @param {Object} params.microscopyService - Service for handling microscopy operations
* @param {Object} params.displaySet - The display set containing metadata
* @param {Object} params.extensionManager - Manager for extensions
* @param {Object} params.servicesManager - Manager for services
* @returns {Promise} A promise that resolves with the loaded display set
*/
export default function loadAnnotation({
microscopyService,
displaySet,
extensionManager,
servicesManager,
}) {
const { uiNotificationService } = servicesManager.services;
return new Promise(async (resolve, reject) => {
try {
displaySet.isLoading = true;
const { metadata } = displaySet;
const dicomMicroscopyModule = await microscopyService.importDicomMicroscopyViewer();
const client = getDicomWebClient({
extensionManager,
servicesManager,
});
const viewportId = servicesManager.services.viewportGridService.getActiveViewportId();
const managedViewers = microscopyService.getManagedViewersForViewport(viewportId);
const managedViewer = managedViewers[0];
client
.retrieveSeriesMetadata({
studyInstanceUID: metadata.StudyInstanceUID,
seriesInstanceUID: metadata.SeriesInstanceUID,
})
.then(async retrievedMetadata => {
const annotations = retrievedMetadata.map(
metadata =>
new dicomMicroscopyModule.metadata.MicroscopyBulkSimpleAnnotations({ metadata })
);
uiNotificationService.show({
message: 'Loading annotations...',
type: 'info',
});
await Promise.all(
annotations.map(async ann => {
try {
await managedViewer.viewer.addAnnotationGroups(ann);
ann.AnnotationGroupSequence.forEach(item => {
const annotationGroupUID = item.AnnotationGroupUID;
managedViewer.viewer.setAnnotationGroupStyle(annotationGroupUID, {
color: [255, 234, 0],
});
});
ann.AnnotationGroupSequence.forEach(item => {
const annotationGroupUID = item.AnnotationGroupUID;
managedViewer.viewer.showAnnotationGroup(annotationGroupUID);
});
} catch (error) {
console.error('failed to add annotation groups:', error);
uiNotificationService.show({
title: 'Error loading annotations',
message: error.message,
type: 'error',
});
}
})
);
displaySet.isLoaded = true;
displaySet.isLoading = false;
resolve(displaySet);
});
} catch (error) {
console.error('Error loading annotation:', error);
reject(error);
}
});
}

View File

@ -32,8 +32,8 @@
"start": "yarn run dev"
},
"peerDependencies": {
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",

View File

@ -24,7 +24,7 @@ export default function PanelStudyBrowserTracking({
const checkDirtyMeasurements = displaySetInstanceUID => {
const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
if (displaySet.Modality === 'SR') {
if (displaySet.Modality === 'SR' || displaySet.Modality === 'ANN') {
const activeViewportId = viewportGridService.getActiveViewportId();
sendTrackedMeasurementsEvent('CHECK_DIRTY', {
viewportId: activeViewportId,

View File

@ -42,8 +42,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",
"@ohif/extension-default": "3.12.0-beta.7",

View File

@ -103,6 +103,7 @@ function modeFactory({ modeConfiguration }) {
// Share the sop class handler with cornerstone version of it
'@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler',
'@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler',
'@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopyANNSopClassHandler',
],
},
{
@ -124,6 +125,7 @@ function modeFactory({ modeConfiguration }) {
sopClassHandlers: [
'@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler',
'@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler',
'@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopyANNSopClassHandler',
dicomvideo.sopClassHandler,
dicompdf.sopClassHandler,
],

View File

@ -34,8 +34,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/tools": "^3.32.5",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/tools": "^3.32.12",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone-dicom-sr": "3.12.0-beta.7",
"@ohif/extension-ultrasound-pleura-bline": "3.12.0-beta.7",

View File

@ -116,14 +116,6 @@ module.exports = (env, argv) => {
from: `${PUBLIC_DIR}/${APP_CONFIG}`,
to: `${DIST_DIR}/app-config.js`,
},
// Copy Dicom Microscopy Viewer build files
{
from: '../../../node_modules/dicom-microscopy-viewer/dist/dynamic-import',
to: DIST_DIR,
globOptions: {
ignore: ['**/*.min.js.map'],
},
},
],
}),
// Generate "index.html" w/ correct includes/imports
@ -138,15 +130,15 @@ module.exports = (env, argv) => {
...(IS_COVERAGE
? []
: [
new InjectManifest({
swDest: 'sw.js',
swSrc: path.join(SRC_DIR, 'service-worker.js'),
// Need to exclude the theme as it is updated independently
exclude: [/theme/],
// Cache large files for the manifests to avoid warning messages
maximumFileSizeToCacheInBytes: 1024 * 1024 * 50,
}),
]),
new InjectManifest({
swDest: 'sw.js',
swSrc: path.join(SRC_DIR, 'service-worker.js'),
// Need to exclude the theme as it is updated independently
exclude: [/theme/],
// Cache large files for the manifests to avoid warning messages
maximumFileSizeToCacheInBytes: 1024 * 1024 * 50,
}),
]),
],
// https://webpack.js.org/configuration/dev-server/
devServer: {
@ -163,12 +155,6 @@ module.exports = (env, argv) => {
proxy: [
{
'/dicomweb': 'http://localhost:5000',
'/dicom-microscopy-viewer': {
target: 'http://localhost:3000',
pathRewrite: {
'^/dicom-microscopy-viewer': `/${PUBLIC_URL}/dicom-microscopy-viewer`,
},
},
},
],
static: [

View File

@ -123,7 +123,7 @@ const createCopyPluginToDistForLink = (srcDir, distDir, plugins, folderName) =>
return exists
? {
from,
to: distDir,
to: `${distDir}${plugin.to || ''}`,
toType: 'dir',
}
: undefined;

View File

@ -53,7 +53,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.32.5",
"@cornerstonejs/dicom-image-loader": "^3.32.12",
"@emotion/serialize": "^1.1.3",
"@ohif/core": "3.12.0-beta.7",
"@ohif/extension-cornerstone": "3.12.0-beta.7",

View File

@ -104,9 +104,10 @@
},
{
"packageName": "dicom-microscopy-viewer",
"importPath": "/dicom-microscopy-viewer/dicomMicroscopyViewer.min.js",
"importPath": "dicom-microscopy-viewer/dicomMicroscopyViewer.min.js",
"globalName": "dicomMicroscopyViewer",
"directory": "./node_modules/dicom-microscopy-viewer/dist/dynamic-import"
"directory": "./node_modules/dicom-microscopy-viewer/dist/dynamic-import",
"to": "/dicom-microscopy-viewer/"
}
]
}

View File

@ -87,7 +87,7 @@ window.config = {
],
},
],
defaultDataSourceName: 'dicomweb',
defaultDataSourceName: 'ohif',
/* Dynamic config allows user to pass "configUrl" query string this allows to load config without recompiling application. The regex will ensure valid configuration source */
// dangerouslyUseDynamicConfig: {
// enabled: true,
@ -101,7 +101,7 @@ window.config = {
dataSources: [
{
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
sourceName: 'dicomweb',
sourceName: 'ohif',
configuration: {
friendlyName: 'AWS S3 Static wado server',
name: 'aws',

View File

@ -37,8 +37,8 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/core": "^3.32.5",
"@cornerstonejs/dicom-image-loader": "^3.32.5",
"@cornerstonejs/core": "^3.32.12",
"@cornerstonejs/dicom-image-loader": "^3.32.12",
"@ohif/ui": "3.12.0-beta.7",
"cornerstone-math": "0.1.9",
"dicom-parser": "^1.8.21"

View File

@ -94,8 +94,6 @@ export default defineConfig({
'@hooks': path.resolve(__dirname, './platform/app/src/hooks'),
'@routes': path.resolve(__dirname, './platform/app/src/routes'),
'@state': path.resolve(__dirname, './platform/app/src/state'),
'dicom-microscopy-viewer':
'dicom-microscopy-viewer/dist/dynamic-import/dicomMicroscopyViewer.min.js',
},
},
output: {
@ -125,14 +123,6 @@ export default defineConfig({
from: path.resolve(PUBLIC_DIR, APP_CONFIG),
to: 'app-config.js',
},
// Copy Dicom Microscopy Viewer files
{
from: path.resolve(__dirname, 'node_modules/dicom-microscopy-viewer/dist/dynamic-import'),
to: DIST_DIR,
globOptions: {
ignore: ['**/*.min.js.map'],
},
},
],
},
html: {