* fix: A couple of changes to enable cs3d integration build * Bun update * fix: Crosshairs tests due to order changes * Fix a race in DicomTagBrowser.spec.ts and update the comparison for the screenshot for seg hydration. * Fix sorting issues by using consistent sort * fix: Inconsistency in scoord loader. Will need an update to screenshot * Fix crosshairs stability issues and random order issues in Scoord * Update the comparison image * Update navigate image * fix: Axios issue * Update to current CS3D
162 lines
5.7 KiB
TypeScript
162 lines
5.7 KiB
TypeScript
import { DicomMetadataStore, log, utils, Enums } from '@ohif/core';
|
|
import getStudies from './studiesList';
|
|
import isSeriesFilterUsed from '../../utils/isSeriesFilterUsed';
|
|
|
|
const { getSplitParam } = utils;
|
|
|
|
/**
|
|
* Initialize the route.
|
|
*
|
|
* @param props.servicesManager to read services from
|
|
* @param props.studyInstanceUIDs for a list of studies to read
|
|
* @param props.dataSource to read the data from
|
|
* @param props.filters filters from query params to read the data from
|
|
* @returns array of subscriptions to cancel
|
|
*/
|
|
export async function defaultRouteInit(
|
|
{
|
|
servicesManager,
|
|
studyInstanceUIDs,
|
|
dataSource,
|
|
filters,
|
|
}: withAppTypes & { studyInstanceUIDs?: string[] },
|
|
hangingProtocolId,
|
|
stageIndex
|
|
) {
|
|
const { displaySetService, hangingProtocolService, uiNotificationService, customizationService } =
|
|
servicesManager.services;
|
|
/**
|
|
* Function to apply the hanging protocol when the minimum number of display sets were
|
|
* received or all display sets retrieval were completed
|
|
* @returns
|
|
*/
|
|
function applyHangingProtocol() {
|
|
const displaySets = displaySetService.getActiveDisplaySets();
|
|
// The display sets are not necessarily in load order, even though the
|
|
// series got started in load order, so re-sort them before hanging
|
|
const sortCriteria = customizationService.getCustomization('sortingCriteria') as (
|
|
a,
|
|
b
|
|
) => number;
|
|
|
|
if (!displaySets || !displaySets.length) {
|
|
return;
|
|
}
|
|
const sortedDisplaySets = [...displaySets].sort(sortCriteria);
|
|
|
|
// Gets the studies list to use
|
|
const studies = getStudies(studyInstanceUIDs, sortedDisplaySets);
|
|
|
|
// study being displayed, and is thus the "active" study.
|
|
const activeStudy = studies[0];
|
|
|
|
// run the hanging protocol matching on the displaySets with the predefined
|
|
// hanging protocol in the mode configuration
|
|
hangingProtocolService.run({ studies, activeStudy, displaySets: sortedDisplaySets }, hangingProtocolId, {
|
|
stageIndex,
|
|
});
|
|
}
|
|
|
|
const unsubscriptions = [];
|
|
const issuedWarningSeries = [];
|
|
const { unsubscribe: instanceAddedUnsubscribe } = DicomMetadataStore.subscribe(
|
|
DicomMetadataStore.EVENTS.INSTANCES_ADDED,
|
|
function ({ StudyInstanceUID, SeriesInstanceUID, madeInClient = false }) {
|
|
const seriesMetadata = DicomMetadataStore.getSeries(StudyInstanceUID, SeriesInstanceUID);
|
|
|
|
// checks if the series filter was used, if it exists
|
|
const seriesInstanceUIDs = filters?.seriesInstanceUID;
|
|
if (
|
|
seriesInstanceUIDs?.length &&
|
|
!isSeriesFilterUsed(seriesMetadata.instances, filters) &&
|
|
!issuedWarningSeries.includes(seriesInstanceUIDs[0])
|
|
) {
|
|
// stores the series instance filter so it shows only once the warning
|
|
issuedWarningSeries.push(seriesInstanceUIDs[0]);
|
|
uiNotificationService.show({
|
|
title: 'Series filter',
|
|
message: `Each of the series in filter: ${seriesInstanceUIDs} are not part of the current study. The entire study is being displayed`,
|
|
type: 'error',
|
|
duration: 7000,
|
|
});
|
|
}
|
|
|
|
displaySetService.makeDisplaySets(seriesMetadata.instances, { madeInClient });
|
|
}
|
|
);
|
|
|
|
unsubscriptions.push(instanceAddedUnsubscribe);
|
|
|
|
log.time(Enums.TimingEnum.STUDY_TO_DISPLAY_SETS);
|
|
log.time(Enums.TimingEnum.STUDY_TO_FIRST_IMAGE);
|
|
|
|
const allRetrieves = studyInstanceUIDs.map(StudyInstanceUID =>
|
|
dataSource.retrieve.series.metadata({
|
|
StudyInstanceUID,
|
|
filters,
|
|
returnPromises: true,
|
|
sortCriteria: customizationService.getCustomization('sortingCriteria'),
|
|
})
|
|
);
|
|
|
|
// log the error if this fails, otherwise it's so difficult to tell what went wrong...
|
|
allRetrieves.forEach(retrieve => {
|
|
retrieve.catch(error => {
|
|
console.error(error);
|
|
});
|
|
});
|
|
|
|
// is displaysets from URL and has initialSOPInstanceUID or initialSeriesInstanceUID
|
|
// then we need to wait for all display sets to be retrieved before applying the hanging protocol
|
|
const params = new URLSearchParams(window.location.search);
|
|
|
|
const initialSeriesInstanceUID = getSplitParam('initialseriesinstanceuid', params);
|
|
const initialSOPInstanceUID = getSplitParam('initialsopinstanceuid', params);
|
|
|
|
let displaySetFromUrl = false;
|
|
if (initialSeriesInstanceUID || initialSOPInstanceUID) {
|
|
displaySetFromUrl = true;
|
|
}
|
|
|
|
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);
|
|
|
|
const allPromises = [];
|
|
const remainingPromises = [];
|
|
|
|
function startRemainingPromises(remainingPromises) {
|
|
remainingPromises.forEach(p => p.forEach(p => p.start()));
|
|
}
|
|
|
|
promises.forEach(promise => {
|
|
const retrieveSeriesMetadataPromise = promise.value;
|
|
if (!Array.isArray(retrieveSeriesMetadataPromise)) {
|
|
return;
|
|
}
|
|
|
|
if (displaySetFromUrl) {
|
|
const requiredSeriesPromises = retrieveSeriesMetadataPromise.map(promise =>
|
|
promise.start()
|
|
);
|
|
allPromises.push(Promise.allSettled(requiredSeriesPromises));
|
|
} else {
|
|
const { requiredSeries, remaining } = hangingProtocolService.filterSeriesRequiredForRun(
|
|
hangingProtocolId,
|
|
retrieveSeriesMetadataPromise
|
|
);
|
|
const requiredSeriesPromises = requiredSeries.map(promise => promise.start());
|
|
allPromises.push(Promise.allSettled(requiredSeriesPromises));
|
|
remainingPromises.push(remaining);
|
|
}
|
|
});
|
|
|
|
await Promise.allSettled(allPromises).then(applyHangingProtocol);
|
|
startRemainingPromises(remainingPromises);
|
|
applyHangingProtocol();
|
|
});
|
|
|
|
return unsubscriptions;
|
|
}
|