diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index c130b436f7..923385edaf 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,7 +46,7 @@ "@babel/runtime": "^7.20.13", "classnames": "^2.3.2", "@cornerstonejs/adapters": "^0.6.0", - "@cornerstonejs/core": "^0.38.0", - "@cornerstonejs/tools": "^0.58.0" + "@cornerstonejs/core": "^0.40.0", + "@cornerstonejs/tools": "^0.60.1" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index bb7b584803..2eab627007 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -29,7 +29,7 @@ "peerDependencies": { "@ohif/core": "^3.0.0", "@ohif/ui": "^2.0.0", - "cornerstone-wado-image-loader": "^4.10.2", + "cornerstone-wado-image-loader": "^4.13.0", "dcmjs": "^0.29.4", "dicom-parser": "^1.8.9", "hammerjs": "^2.0.8", @@ -44,9 +44,9 @@ "dependencies": { "@babel/runtime": "^7.20.13", "@cornerstonejs/adapters": "^0.6.0", - "@cornerstonejs/core": "^0.38.0", - "@cornerstonejs/streaming-image-volume-loader": "^0.15.13", - "@cornerstonejs/tools": "^0.58.0", + "@cornerstonejs/core": "^0.40.0", + "@cornerstonejs/streaming-image-volume-loader": "^0.16.0", + "@cornerstonejs/tools": "^0.60.1", "@kitware/vtk.js": "26.5.6", "html2canvas": "^1.4.1", "lodash.debounce": "4.0.8", diff --git a/extensions/cornerstone/src/init.tsx b/extensions/cornerstone/src/init.tsx index 479953b681..27ca02ee75 100644 --- a/extensions/cornerstone/src/init.tsx +++ b/extensions/cornerstone/src/init.tsx @@ -43,6 +43,14 @@ export default async function init({ // For debugging e2e tests that are failing on CI cornerstone.setUseCPURendering(Boolean(appConfig.useCPURendering)); + cornerstone.setConfiguration({ + ...cornerstone.getConfiguration(), + rendering: { + ...cornerstone.getConfiguration().rendering, + strictZSpacingForVolumeViewport: + appConfig.strictZSpacingForVolumeViewport, + }, + }); // For debugging large datasets const MAX_CACHE_SIZE_1GB = 1073741824; diff --git a/extensions/default/src/DicomLocalDataSource/index.js b/extensions/default/src/DicomLocalDataSource/index.js index fc6f366bbc..f10d427ba3 100644 --- a/extensions/default/src/DicomLocalDataSource/index.js +++ b/extensions/default/src/DicomLocalDataSource/index.js @@ -138,7 +138,9 @@ function createDicomLocalApi(dicomLocalConfig) { study.series.forEach(aSeries => { const { SeriesInstanceUID } = aSeries; - aSeries.instances.forEach(instance => { + const isMultiframe = aSeries.instances[0].NumberOfFrames > 1; + + aSeries.instances.forEach((instance, index) => { const { url: imageId, StudyInstanceUID, @@ -153,6 +155,7 @@ function createDicomLocalApi(dicomLocalConfig) { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID, + frameIndex: isMultiframe ? index : 1, }); }); @@ -185,7 +188,7 @@ function createDicomLocalApi(dicomLocalConfig) { displaySet.images.forEach(instance => { const NumberOfFrames = instance.NumberOfFrames; if (NumberOfFrames > 1) { - for (let i = 0; i < NumberOfFrames; i++) { + for (let i = 1; i <= NumberOfFrames; i++) { const imageId = this.getImageIdsForInstance({ instance, frame: i, diff --git a/extensions/default/src/DicomWebDataSource/index.js b/extensions/default/src/DicomWebDataSource/index.js index ccb61f620e..1af67936d4 100644 --- a/extensions/default/src/DicomWebDataSource/index.js +++ b/extensions/default/src/DicomWebDataSource/index.js @@ -104,7 +104,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { query: { studies: { mapParams: mapParams.bind(), - search: async function (origParams) { + search: async function(origParams) { const headers = userAuthenticationService.getAuthorizationHeader(); if (headers) { qidoDicomWebClient.headers = headers; @@ -129,7 +129,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) { }, series: { // mapParams: mapParams.bind(), - search: async function (studyInstanceUid) { + search: async function(studyInstanceUid) { const headers = userAuthenticationService.getAuthorizationHeader(); if (headers) { qidoDicomWebClient.headers = headers; diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 135b10e711..332d84253f 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "peerDependencies": { "@ohif/core": "^3.0.0", "classnames": "^2.3.2", - "@cornerstonejs/core": "^0.38.0", - "@cornerstonejs/tools": "^0.58.0", + "@cornerstonejs/core": "^0.40.0", + "@cornerstonejs/tools": "^0.60.1", "@ohif/extension-cornerstone-dicom-sr": "^3.0.0", "dcmjs": "^0.29.4", "lodash.debounce": "^4.17.21", diff --git a/platform/core/package.json b/platform/core/package.json index 2ccc18696c..42c9730657 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -31,7 +31,7 @@ }, "peerDependencies": { "cornerstone-math": "0.1.9", - "cornerstone-wado-image-loader": "^4.10.2", + "cornerstone-wado-image-loader": "^4.13.0", "dicom-parser": "^1.8.9", "@ohif/ui": "^2.0.0" }, diff --git a/platform/core/src/classes/MetadataProvider.js b/platform/core/src/classes/MetadataProvider.js index fc17ac2947..32f482e74c 100644 --- a/platform/core/src/classes/MetadataProvider.js +++ b/platform/core/src/classes/MetadataProvider.js @@ -412,6 +412,34 @@ class MetadataProvider { return metadata; } + /** + * Retrieves the frameNumber information, depending on the url style + * wadors /frames/1 + * wadouri &frame=1 + * @param {*} imageId + * @returns + */ + getFrameInformationFromURL(imageId) { + function getInformationFromURL(informationString, separator) { + let result = ''; + const splittedStr = imageId.split(informationString)[1]; + if (splittedStr.includes(separator)) { + result = splittedStr.split(separator)[0]; + } else { + result = splittedStr; + } + return result; + } + + if (imageId.includes('/frames')) { + return getInformationFromURL('/frames', '/'); + } + if (imageId.includes('&frame=')) { + return getInformationFromURL('&frame=', '&'); + } + return; + } + getUIDsFromImageID(imageId) { // TODO: adding csiv here is not really correct. Probably need to use // metadataProvider.addImageIdToUIDs(imageId, { @@ -445,7 +473,7 @@ class MetadataProvider { // check if the imageId starts with http:// or https:// using regex // Todo: handle non http imageIds let imageURI; - const urlRegex = /^(http|https):\/\//; + const urlRegex = /^(http|https|dicomfile):\/\//; if (urlRegex.test(imageId)) { imageURI = imageId; } else { @@ -453,7 +481,7 @@ class MetadataProvider { } const uids = this.imageURIToUIDs.get(imageURI); - const frameNumber = imageId.split(/\/frames\//)[1]; + let frameNumber = this.getFrameInformationFromURL(imageId) || '1'; if (uids && frameNumber !== undefined) { return { ...uids, frameNumber }; diff --git a/platform/core/src/services/DicomMetadataStore/DicomMetadataStore.ts b/platform/core/src/services/DicomMetadataStore/DicomMetadataStore.ts index bf1aab1b6e..f90dd2039a 100644 --- a/platform/core/src/services/DicomMetadataStore/DicomMetadataStore.ts +++ b/platform/core/src/services/DicomMetadataStore/DicomMetadataStore.ts @@ -84,9 +84,9 @@ function _getInstance(StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) { } function _getInstanceByImageId(imageId) { - for (let study of _model.studies) { - for (let series of study.series) { - for (let instance of series.instances) { + for (const study of _model.studies) { + for (const series of study.series) { + for (const instance of series.instances) { if (instance.imageId === imageId) { return instance; } @@ -236,7 +236,7 @@ const BaseImplementation = { addStudy(study) { const { StudyInstanceUID } = study; - let existingStudy = _model.studies.find( + const existingStudy = _model.studies.find( study => study.StudyInstanceUID === StudyInstanceUID ); diff --git a/platform/core/src/utils/combineFrameInstance.ts b/platform/core/src/utils/combineFrameInstance.ts index b5678a2d66..933437a246 100644 --- a/platform/core/src/utils/combineFrameInstance.ts +++ b/platform/core/src/utils/combineFrameInstance.ts @@ -30,12 +30,35 @@ const combineFrameInstance = (frame, instance) => { .map(it => it[0]) .filter(it => it !== undefined && typeof it === 'object'); - return Object.assign( - { frameNumber: frameNumber }, - instance, - ...Object.values(shared), - ...Object.values(perFrame) - ); + // this is to fix NM multiframe datasets with position and orientation + // information inside DetectorInformationSequence + if ( + !instance.ImageOrientationPatient && + instance.DetectorInformationSequence + ) { + instance.ImageOrientationPatient = + instance.DetectorInformationSequence[0].ImageOrientationPatient; + } + if ( + !instance.ImagePositionPatient && + instance.DetectorInformationSequence + ) { + instance.ImagePositionPatient = + instance.DetectorInformationSequence[0].ImagePositionPatient; + } + + const newInstance = Object.assign(instance, { frameNumber: frameNumber }); + + // merge the shared first then the per frame to override + [...shared, ...perFrame].forEach(item => { + Object.entries(item).forEach(([key, value]) => { + newInstance[key] = value; + }); + }); + + // Todo: we should cache this combined instance somewhere, maybe add it + // back to the dicomMetaStore so we don't have to do this again. + return newInstance; } else { return instance; } diff --git a/platform/core/src/utils/isDisplaySetReconstructable.js b/platform/core/src/utils/isDisplaySetReconstructable.js index 6ab7bf2fdf..373da994af 100644 --- a/platform/core/src/utils/isDisplaySetReconstructable.js +++ b/platform/core/src/utils/isDisplaySetReconstructable.js @@ -30,62 +30,98 @@ export default function isDisplaySetReconstructable(instances) { } // Can't reconstruct if all instances don't have the ImagePositionPatient. - if (!instances.every(instance => !!instance.ImagePositionPatient)) { + if ( + !isMultiframe && + !instances.every(instance => instance.ImagePositionPatient) + ) { return { value: false }; } const sortedInstances = sortInstancesByPosition(instances); - if (isMultiframe) { - return processMultiframe(sortedInstances[0]); - } else { - return processSingleframe(sortedInstances); - } + return isMultiframe + ? processMultiframe(sortedInstances[0]) + : processSingleframe(sortedInstances); } -function processMultiframe(multiFrameInstance) { - const { - PerFrameFunctionalGroupsSequence, - SharedFunctionalGroupsSequence, - } = multiFrameInstance; +function hasPixelMeasurements(multiFrameInstance) { + const perFrameSequence = + multiFrameInstance.PerFrameFunctionalGroupsSequence?.[0]; + const sharedSequence = multiFrameInstance.SharedFunctionalGroupsSequence; + + return ( + Boolean(perFrameSequence?.PixelMeasuresSequence) || + Boolean(sharedSequence?.PixelMeasuresSequence) || + Boolean( + multiFrameInstance.PixelSpacing && + (multiFrameInstance.SliceThickness || + multiFrameInstance.SpacingBetweenFrames) + ) + ); +} + +function hasOrientation(multiFrameInstance) { + const sharedSequence = multiFrameInstance.SharedFunctionalGroupsSequence; + const perFrameSequence = + multiFrameInstance.PerFrameFunctionalGroupsSequence?.[0]; + + return ( + Boolean(sharedSequence?.PlaneOrientationSequence) || + Boolean(perFrameSequence?.PlaneOrientationSequence) || + Boolean( + multiFrameInstance.ImageOrientationPatient || + multiFrameInstance.DetectorInformationSequence?.[0] + ?.ImageOrientationPatient + ) + ); +} + +function hasPosition(multiFrameInstance) { + const perFrameSequence = + multiFrameInstance.PerFrameFunctionalGroupsSequence?.[0]; + + return ( + Boolean(perFrameSequence?.PlanePositionSequence) || + Boolean(perFrameSequence?.CTPositionSequence) || + Boolean( + multiFrameInstance.ImagePositionPatient || + multiFrameInstance.DetectorInformationSequence?.[0] + ?.ImagePositionPatient + ) + ); +} +function isNMReconstructable(multiFrameInstance) { + const imageSubType = multiFrameInstance.ImageType?.[2]; + return imageSubType === 'RECON TOMO' || imageSubType === 'RECON GATED TOMO'; +} + +function processMultiframe(multiFrameInstance) { // If we don't have the PixelMeasuresSequence, then the pixel spacing and // slice thickness isn't specified or is changing and we can't reconstruct // the dataset. - if ( - !SharedFunctionalGroupsSequence || - !SharedFunctionalGroupsSequence[0].PixelMeasuresSequence - ) { + if (!hasPixelMeasurements(multiFrameInstance)) { return { value: false }; } - // Check that the orientation is either shared or with the allowed - // difference amount - const { - PlaneOrientationSequence: sharedOrientation, - } = SharedFunctionalGroupsSequence; - - if (!sharedOrientation) { - const { - PlaneOrientationSequence: firstOrientation, - } = PerFrameFunctionalGroupsSequence[0]; - - if (!firstOrientation) { - console.log('No orientation information'); - return { value: false }; - } - // TODO - check orientation consistency + if (!hasOrientation(multiFrameInstance)) { + console.log('No image orientation information, not reconstructable'); + return { value: false }; } - const frame0 = PerFrameFunctionalGroupsSequence[0]; - const firstPosition = - frame0.PlanePositionSequence || frame0.CTPositionSequence; - if (!firstPosition) { + if (!hasPosition(multiFrameInstance)) { console.log('No image position information, not reconstructable'); return { value: false }; } - // TODO - check spacing consistency + if ( + multiFrameInstance.Modality.includes('NM') && + !isNMReconstructable(multiFrameInstance) + ) { + return { value: false }; + } + + // TODO - check spacing consistency return { value: true }; } diff --git a/platform/viewer/package.json b/platform/viewer/package.json index bb15b5b1e8..60bbf2f42c 100644 --- a/platform/viewer/package.json +++ b/platform/viewer/package.json @@ -65,7 +65,7 @@ "config-point": "^0.4.8", "core-js": "^3.16.1", "cornerstone-math": "^0.1.9", - "cornerstone-wado-image-loader": "^4.10.2", + "cornerstone-wado-image-loader": "^4.13.0", "dcmjs": "^0.29.4", "detect-gpu": "^4.0.16", "dicom-parser": "^1.8.9", diff --git a/platform/viewer/public/config/aws.js b/platform/viewer/public/config/aws.js index 5a8fdaafcf..b6a2649cce 100644 --- a/platform/viewer/public/config/aws.js +++ b/platform/viewer/public/config/aws.js @@ -9,6 +9,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { diff --git a/platform/viewer/public/config/default.js b/platform/viewer/public/config/default.js index ab91173677..7b432830bd 100644 --- a/platform/viewer/public/config/default.js +++ b/platform/viewer/public/config/default.js @@ -15,6 +15,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, maxNumRequests: { interaction: 100, thumbnail: 75, @@ -34,10 +35,12 @@ window.config = { // wadoUriRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/wado', // qidoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs', // wadoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs', + // new server wadoUriRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb', qidoRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb', wadoRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb', + qidoSupportsIncludeField: false, supportsReject: false, imageRendering: 'wadors', diff --git a/platform/viewer/public/config/demo.js b/platform/viewer/public/config/demo.js index e7dccb1012..5c37f5b489 100644 --- a/platform/viewer/public/config/demo.js +++ b/platform/viewer/public/config/demo.js @@ -5,6 +5,7 @@ window.config = { // below flag is for performance reasons, but it might not work for all servers omitQuotationForMultipartRequest: true, showWarningMessageForCrossOrigin: true, + strictZSpacingForVolumeViewport: true, showCPUFallbackMessage: true, servers: { dicomWeb: [ diff --git a/platform/viewer/public/config/dicomweb-server.js b/platform/viewer/public/config/dicomweb-server.js index c7639df910..770d94af38 100644 --- a/platform/viewer/public/config/dicomweb-server.js +++ b/platform/viewer/public/config/dicomweb-server.js @@ -9,6 +9,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { @@ -29,6 +30,20 @@ window.config = { supportsWildcard: false, }, }, + { + friendlyName: 'dicom json', + namespace: '@ohif/extension-default.dataSourcesModule.dicomjson', + sourceName: 'dicomjson', + configuration: { + name: 'json', + }, + }, + { + friendlyName: 'dicom local', + namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal', + sourceName: 'dicomlocal', + configuration: {}, + }, ], defaultDataSourceName: 'dicomweb', }; diff --git a/platform/viewer/public/config/dicomweb_relative.js b/platform/viewer/public/config/dicomweb_relative.js index 08fdf81f7f..1e0111975a 100644 --- a/platform/viewer/public/config/dicomweb_relative.js +++ b/platform/viewer/public/config/dicomweb_relative.js @@ -10,6 +10,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { diff --git a/platform/viewer/public/config/docker_nginx-orthanc.js b/platform/viewer/public/config/docker_nginx-orthanc.js index 3ecf615595..d33fcfcb05 100644 --- a/platform/viewer/public/config/docker_nginx-orthanc.js +++ b/platform/viewer/public/config/docker_nginx-orthanc.js @@ -8,6 +8,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, dataSources: [ { friendlyName: 'Orthanc Server', @@ -23,6 +24,20 @@ window.config = { thumbnailRendering: 'wadors', }, }, + { + friendlyName: 'dicom json', + namespace: '@ohif/extension-default.dataSourcesModule.dicomjson', + sourceName: 'dicomjson', + configuration: { + name: 'json', + }, + }, + { + friendlyName: 'dicom local', + namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal', + sourceName: 'dicomlocal', + configuration: {}, + }, ], defaultDataSourceName: 'dicomweb', }; diff --git a/platform/viewer/public/config/docker_openresty-orthanc-keycloak.js b/platform/viewer/public/config/docker_openresty-orthanc-keycloak.js index d455815dab..07709a7ebe 100644 --- a/platform/viewer/public/config/docker_openresty-orthanc-keycloak.js +++ b/platform/viewer/public/config/docker_openresty-orthanc-keycloak.js @@ -6,6 +6,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, servers: { // This is an array, but we'll only use the first entry for now dicomWeb: [ diff --git a/platform/viewer/public/config/docker_openresty-orthanc.js b/platform/viewer/public/config/docker_openresty-orthanc.js index 986a613cd3..39cfebd68d 100644 --- a/platform/viewer/public/config/docker_openresty-orthanc.js +++ b/platform/viewer/public/config/docker_openresty-orthanc.js @@ -8,6 +8,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, dataSources: [ { friendlyName: 'Orthanc Server', @@ -23,6 +24,20 @@ window.config = { thumbnailRendering: 'wadors', }, }, + { + friendlyName: 'dicom json', + namespace: '@ohif/extension-default.dataSourcesModule.dicomjson', + sourceName: 'dicomjson', + configuration: { + name: 'json', + }, + }, + { + friendlyName: 'dicom local', + namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal', + sourceName: 'dicomlocal', + configuration: {}, + }, ], defaultDataSourceName: 'dicomweb', }; diff --git a/platform/viewer/public/config/e2e.js b/platform/viewer/public/config/e2e.js index 2c090b9e77..3ec6fa559a 100644 --- a/platform/viewer/public/config/e2e.js +++ b/platform/viewer/public/config/e2e.js @@ -8,6 +8,7 @@ window.config = { maxNumberOfWebWorkers: 3, showWarningMessageForCrossOrigin: false, showCPUFallbackMessage: false, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { diff --git a/platform/viewer/public/config/google.js b/platform/viewer/public/config/google.js index ef99259975..2c50a5ecca 100644 --- a/platform/viewer/public/config/google.js +++ b/platform/viewer/public/config/google.js @@ -6,6 +6,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, // This is an array, but we'll only use the first entry for now oidc: [ { diff --git a/platform/viewer/public/config/idc.js b/platform/viewer/public/config/idc.js index 202c31cf20..6056962bd7 100644 --- a/platform/viewer/public/config/idc.js +++ b/platform/viewer/public/config/idc.js @@ -6,6 +6,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, servers: { // This is an array, but we'll only use the first entry for now dicomWeb: [], diff --git a/platform/viewer/public/config/local_dcm4chee.js b/platform/viewer/public/config/local_dcm4chee.js index 853ef229e5..fca1f2a71d 100644 --- a/platform/viewer/public/config/local_dcm4chee.js +++ b/platform/viewer/public/config/local_dcm4chee.js @@ -8,6 +8,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, dataSources: [ { friendlyName: 'DCM4CHEE Server', @@ -27,6 +28,20 @@ window.config = { }, }, }, + { + friendlyName: 'dicom json', + namespace: '@ohif/extension-default.dataSourcesModule.dicomjson', + sourceName: 'dicomjson', + configuration: { + name: 'json', + }, + }, + { + friendlyName: 'dicom local', + namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal', + sourceName: 'dicomlocal', + configuration: {}, + }, ], studyListFunctionsEnabled: true, defaultDataSourceName: 'dicomweb', diff --git a/platform/viewer/public/config/local_orthanc.js b/platform/viewer/public/config/local_orthanc.js index 7b31a31232..5165cb7e58 100644 --- a/platform/viewer/public/config/local_orthanc.js +++ b/platform/viewer/public/config/local_orthanc.js @@ -8,6 +8,7 @@ window.config = { showLoadingIndicator: true, showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { diff --git a/platform/viewer/public/config/local_static.js b/platform/viewer/public/config/local_static.js index b4383dd24b..fde3c563c9 100644 --- a/platform/viewer/public/config/local_static.js +++ b/platform/viewer/public/config/local_static.js @@ -12,6 +12,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { diff --git a/platform/viewer/public/config/multiple.js b/platform/viewer/public/config/multiple.js index f456575af4..2aa6252dda 100644 --- a/platform/viewer/public/config/multiple.js +++ b/platform/viewer/public/config/multiple.js @@ -20,6 +20,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { diff --git a/platform/viewer/public/config/netlify.js b/platform/viewer/public/config/netlify.js index a312d5ce87..405c276e5e 100644 --- a/platform/viewer/public/config/netlify.js +++ b/platform/viewer/public/config/netlify.js @@ -9,6 +9,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, // filterQueryParam: false, dataSources: [ { diff --git a/platform/viewer/public/config/public_dicomweb.js b/platform/viewer/public/config/public_dicomweb.js index 7ceb9afbd8..7d310a330f 100644 --- a/platform/viewer/public/config/public_dicomweb.js +++ b/platform/viewer/public/config/public_dicomweb.js @@ -6,6 +6,7 @@ window.config = { showWarningMessageForCrossOrigin: true, showCPUFallbackMessage: true, showLoadingIndicator: true, + strictZSpacingForVolumeViewport: true, servers: { dicomWeb: [ { diff --git a/platform/viewer/src/routes/buildModeRoutes.tsx b/platform/viewer/src/routes/buildModeRoutes.tsx index 76a9f31982..e87eb186e9 100644 --- a/platform/viewer/src/routes/buildModeRoutes.tsx +++ b/platform/viewer/src/routes/buildModeRoutes.tsx @@ -31,11 +31,6 @@ export default function buildModeRoutes({ hotkeysManager, }) { const routes = []; - - // const dataSources = Object.keys(extensionManager.dataSourceMap).map(a => - // extensionManager.getDataSources(a) - // ); - const dataSourceNames = []; dataSources.forEach(dataSource => { @@ -61,7 +56,6 @@ export default function buildModeRoutes({ servicesManager={servicesManager} commandsManager={commandsManager} hotkeysManager={hotkeysManager} - commandsManager={commandsManager} /> ); @@ -86,7 +80,6 @@ export default function buildModeRoutes({ servicesManager={servicesManager} commandsManager={commandsManager} hotkeysManager={hotkeysManager} - commandsManager={commandsManager} /> ); diff --git a/yarn.lock b/yarn.lock index 53ac17d7fe..e5d1f8dde3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1443,28 +1443,28 @@ resolved "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.2.tgz#e96721d56f6ec96f7f95c16321d88cc8467d8d81" integrity sha512-lgdvBvvNezleY+4pIe2ceUsJzlZe/0PipdeubQ3vZZOz3xxtHHMR1XFCl4fgd8gosR8COHuD7h6q+MwgrwBsng== -"@cornerstonejs/core@^0.38.0": - version "0.38.0" - resolved "https://registry.npmjs.org/@cornerstonejs/core/-/core-0.38.0.tgz#6ee3341f38f78e98da85d2511ac16f25e9800f18" - integrity sha512-4/+qDEtGQRwV6AN5Ze4S6oOFiNH48oT5Mp/YQEzJHO+Zn9ceRHZ6ReTwccVUJ5QY2d5d89CoWJ2sKhdsLFZsNw== +"@cornerstonejs/core@^0.40.0": + version "0.40.0" + resolved "https://registry.npmjs.org/@cornerstonejs/core/-/core-0.40.0.tgz#5b6409277362b26c6ddb55b54025ecf26b304f84" + integrity sha512-tjUGFyXuRNRSybpKpd/mP4tKMshc48n/TIt9x5mXU+zqywBPGmojkXOj/v+pG02XopKLg5XPSI4LPysZNVscsg== dependencies: detect-gpu "^4.0.45" lodash.clonedeep "4.5.0" -"@cornerstonejs/streaming-image-volume-loader@^0.15.13": - version "0.15.13" - resolved "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.15.13.tgz#d4c6651f5edac0adbc2c4059b78945fb70c38eb5" - integrity sha512-o0e+vEr08GmMztjabPs7vHKYhofW0dQvSI8Dy7tb1wKEnf05Tis/5s9sCt6PORNHXweK+Cylja3xy8b469ZuVw== +"@cornerstonejs/streaming-image-volume-loader@^0.16.0": + version "0.16.0" + resolved "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.16.0.tgz#513f868c285963fd2f2dbf54ed7840a2dc05e33a" + integrity sha512-+bbQ6/FN7ryCDdsuyheIPeRa5MO8mTDUDZusNIU97Q8fdmw1hB+eiy9fNThdGfCENd/GPANNsXe6K5olUX7QhQ== dependencies: - "@cornerstonejs/core" "^0.38.0" + "@cornerstonejs/core" "^0.40.0" cornerstone-wado-image-loader "^4.10.2" -"@cornerstonejs/tools@^0.58.0": - version "0.58.0" - resolved "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-0.58.0.tgz#c9a2ba6a96491a565fe03a2ef1c1403bd70992e4" - integrity sha512-sVsX6WGLmHg5UUg7p9iwvwjb8AswUypO2jARyIVtpa3JM3dP16Y0uh1jTWJFG2xWLZgEXDXcFCIhw5nOSohy7A== +"@cornerstonejs/tools@^0.60.1": + version "0.60.1" + resolved "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-0.60.1.tgz#88cf32fe79c7fb714a99c1a63c25822233a4d231" + integrity sha512-0GsxN8INh8/1/uKH4pU1ZT8XLNn4Xi2GJug9CQBT6plfnppru//+P+xl+LEQbYVpsydD1iYoWzLe8ykPuIeQCA== dependencies: - "@cornerstonejs/core" "^0.38.0" + "@cornerstonejs/core" "^0.40.0" lodash.clonedeep "4.5.0" lodash.get "^4.4.2" @@ -8527,6 +8527,22 @@ cornerstone-wado-image-loader@^4.10.2: pako "^2.0.4" uuid "^9.0.0" +cornerstone-wado-image-loader@^4.13.0: + version "4.13.0" + resolved "https://registry.npmjs.org/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-4.13.0.tgz#277173973b1d5ec90a2d10557df1f667065953da" + integrity sha512-pv3Ic1wDXUopa3DuSJ/IVmnrdUzEsva8ARB5w/I2JPnH3GaO80yZB6TtCqP8BUf3bl33O15k7EsGSICd2KoeCw== + dependencies: + "@babel/eslint-parser" "^7.19.1" + "@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.2" + coverage-istanbul-loader "^3.0.5" + date-format "^4.0.14" + dicom-parser "^1.8.9" + pako "^2.0.4" + uuid "^9.0.0" + cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"