feat(4D): Add 4D dynamic volume rendering and new pre-clinical 4d pt/ct mode (#3664)

Co-authored-by: Alireza <ar.sedghi@gmail.com>
Co-authored-by: Neil <neil.a.macphee@gmail.com>
This commit is contained in:
authored and GitHub committed 2024-04-09 23:57:34 -04:00
1 parent dc0b183dd4
commit d57e8bc157
200 files changed
+9589 -2178

No files matched your search

@@ -110,7 +110,8 @@ describe('OHIF Cornerstone Toolbar', () => {
//Click on button and verify if icon is active on toolbar
cy.addLengthMeasurement();
cy.get('[data-cy="viewport-notification"]').as('notif').should('exist');
cy.get('[data-cy="viewport-notification"]').as('notif').should('be.visible');
// cy.get('[data-cy="viewport-notification"]').as('notif').should('be.visible');
cy.get('[data-cy="prompt-begin-tracking-yes-btn"]').as('yesBtn').click();
//Verify the measurement exists in the table
@@ -122,6 +122,8 @@ describe('OHIF Study List', function () {
'[data-cy="mode-basic-test-1.3.6.1.4.1.25403.345050719074.3824.20170125113417.1"]'
).click();
cy.get('[data-cy="return-to-work-list"]').click();
cy.wait(1000);
cy.get('@searchResult2').should($list => {
expect($list.length).to.be.eq(1);
expect($list).to.contain('PETCT');
+3 -2
View File
@@ -30,6 +30,7 @@
"dev": "cross-env NODE_ENV=development webpack serve --config .webpack/webpack.pwa.js",
"dev:no:cache": "cross-env NODE_ENV=development webpack serve --no-cache --config .webpack/webpack.pwa.js",
"dev:orthanc": "cross-env NODE_ENV=development PROXY_TARGET=/dicom-web PROXY_DOMAIN=http://localhost:8042 APP_CONFIG=config/docker_nginx-orthanc.js webpack serve --config .webpack/webpack.pwa.js",
"dev:orthanc:no:cache": "cross-env NODE_ENV=development PROXY_TARGET=/dicom-web PROXY_DOMAIN=http://localhost:8042 APP_CONFIG=config/docker_nginx-orthanc.js webpack serve --no-cache --config .webpack/webpack.pwa.js",
"dev:dcm4chee": "cross-env NODE_ENV=development APP_CONFIG=config/local_dcm4chee.js webpack serve --config .webpack/webpack.pwa.js",
"dev:static": "cross-env NODE_ENV=development APP_CONFIG=config/local_static.js webpack serve --config .webpack/webpack.pwa.js",
"dev:viewer": "yarn run dev",
@@ -53,7 +54,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.2",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^1.68.1",
"@cornerstonejs/dicom-image-loader": "^1.70.0",
"@emotion/serialize": "^1.1.3",
"@ohif/core": "3.8.0-beta.73",
"@ohif/extension-cornerstone": "3.8.0-beta.73",
@@ -98,7 +99,7 @@
"devDependencies": {
"@babel/plugin-proposal-private-methods": "^7.18.6",
"@percy/cypress": "^3.1.1",
"cypress": "13.6.2",
"cypress": "13.7.2",
"cypress-file-upload": "^3.5.3",
"glob": "^8.0.3",
"identity-obj-proxy": "3.0.x",
+8
View File
@@ -22,6 +22,11 @@
"default": false,
"version": "3.0.0"
},
{
"packageName": "@ohif/extension-cornerstone-dynamic-volume",
"default": false,
"version": "3.0.0"
},
{
"packageName": "@ohif/extension-dicom-microscopy",
"default": false,
@@ -66,6 +71,9 @@
{
"packageName": "@ohif/mode-microscopy"
},
{
"packageName": "@ohif/mode-preclinical-4d"
},
{
"packageName": "@ohif/mode-test",
"default": false,
@@ -29,6 +29,7 @@ window.config = {
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
enableStudyLazyLoad: true,
useBulkDataURI: false,
supportsFuzzyMatching: true,
supportsWildcard: true,
dicomUploadEnabled: true,
+2
View File
@@ -19,6 +19,7 @@ import {
errorHandler,
CustomizationService,
PanelService,
WorkflowStepsService,
// utils,
} from '@ohif/core';
@@ -68,6 +69,7 @@ async function appInit(appConfigOrFunc, defaultExtensions, defaultModes) {
CineService.REGISTRATION,
UserAuthenticationService.REGISTRATION,
PanelService.REGISTRATION,
WorkflowStepsService.REGISTRATION,
StateSyncService.REGISTRATION,
]);
+23 -3
View File
@@ -1,4 +1,4 @@
import React, { useEffect, useState, useRef, useContext, createContext } from 'react';
import React, { useEffect, useState, useRef } from 'react';
import { useParams, useLocation, useNavigate } from 'react-router';
import PropTypes from 'prop-types';
import { ServicesManager, utils } from '@ohif/core';
@@ -60,7 +60,7 @@ export default function ModeRoute({
locationRef.current = location;
}
const { displaySetService, hangingProtocolService, userAuthenticationService } = (
const { displaySetService, panelService, hangingProtocolService, userAuthenticationService } = (
servicesManager as ServicesManager
).services;
@@ -141,7 +141,17 @@ export default function ModeRoute({
servicesManager,
studyInstanceUIDs,
});
if (isMounted.current) {
const { leftPanels = [], rightPanels = [], ...layoutProps } = layoutData.props;
panelService.reset();
panelService.addPanels(panelService.PanelPosition.Left, leftPanels);
panelService.addPanels(panelService.PanelPosition.Right, rightPanels);
// layoutProps contains all props but leftPanels and rightPanels
layoutData.props = layoutProps;
layoutTemplateData.current = layoutData;
setRefresh(!refresh);
}
@@ -244,8 +254,10 @@ export default function ModeRoute({
}
}, {}) ?? {};
let unsubs;
if (route.init) {
return await route.init(
unsubs = await route.init(
{
servicesManager,
extensionManager,
@@ -273,6 +285,14 @@ export default function ModeRoute({
let unsubscriptions;
setupRouteInit().then(unsubs => {
unsubscriptions = unsubs;
// Some code may need to run after hanging protocol initialization
// (eg: workflowStepsService initialization on 4D mode)
mode?.onSetupRouteComplete?.({
servicesManager,
extensionManager,
commandsManager,
});
});
return () => {
@@ -15,7 +15,7 @@ const { sortingCriteria } = utils;
* @param props.filters filters from query params to read the data from
* @returns array of subscriptions to cancel
*/
export function defaultRouteInit(
export async function defaultRouteInit(
{ servicesManager, studyInstanceUIDs, dataSource, filters, appConfig },
hangingProtocolId
) {
@@ -95,7 +95,7 @@ export function defaultRouteInit(
});
});
Promise.allSettled(allRetrieves).then(promises => {
await Promise.allSettled(allRetrieves).then(async promises => {
log.timeEnd(Enums.TimingEnum.STUDY_TO_DISPLAY_SETS);
log.time(Enums.TimingEnum.DISPLAY_SETS_TO_FIRST_IMAGE);
log.time(Enums.TimingEnum.DISPLAY_SETS_TO_ALL_IMAGES);
@@ -120,7 +120,7 @@ export function defaultRouteInit(
}
});
Promise.allSettled(allPromises).then(applyHangingProtocol);
await Promise.allSettled(allPromises).then(applyHangingProtocol);
startRemainingPromises(remainingPromises);
applyHangingProtocol();
});