fix(MetadataProvider): Correctly assign imageId for multiframe images and remove unused frame information retrieval method (#5965)

This commit is contained in:
Alireza authored and GitHub committed 2026-07-10 15:35:09 -04:00
1 parent 2c54616136
commit 1eee3e6119
7 files changed
+369 -43

No files matched your search

@@ -14,14 +14,13 @@ const DYNAMIC_VOLUME_LOADER_SCHEME = 'cornerstoneStreamingDynamicImageVolume';
const sopClassHandlerName = 'stack';
let appContext = {};
const getDynamicVolumeInfo = instances => {
const getDynamicVolumeInfo = imageIds => {
const { extensionManager } = appContext;
if (!extensionManager) {
throw new Error('extensionManager is not available');
}
const imageIds = instances.map(({ imageId }) => imageId);
const volumeLoaderUtility = extensionManager.getModuleEntry(
'@ohif/extension-cornerstone.utilityModule.volumeLoader'
);
@@ -34,8 +33,8 @@ const isMultiFrame = instance => {
return instance.NumberOfFrames > 1;
};
function getDisplaySetInfo(instances) {
const dynamicVolumeInfo = getDynamicVolumeInfo(instances);
function getDisplaySetInfo(instances, imageIds) {
const dynamicVolumeInfo = getDynamicVolumeInfo(imageIds);
const { isDynamicVolume, timePoints } = dynamicVolumeInfo;
let displaySetInfo;
@@ -82,12 +81,13 @@ const makeDisplaySet = (instances, index) => {
const imageSet = new ImageSet(instances);
const { extensionManager } = appContext;
const dataSource = extensionManager.getActiveDataSource()[0];
const imageIds = dataSource.getImageIdsForDisplaySet(imageSet);
const {
isDynamicVolume,
value: isReconstructable,
averageSpacingBetweenFrames,
dynamicVolumeInfo,
} = getDisplaySetInfo(instances);
} = getDisplaySetInfo(instances, imageIds);
const volumeLoaderSchema = isDynamicVolume
? DYNAMIC_VOLUME_LOADER_SCHEME
@@ -124,7 +124,6 @@ const makeDisplaySet = (instances, index) => {
FrameOfReferenceUID: instance.FrameOfReferenceUID,
});
const imageIds = dataSource.getImageIdsForDisplaySet(imageSet);
let imageId = imageIds[Math.floor(imageIds.length / 2)];
let thumbnailInstance = instances[Math.floor(instances.length / 2)];
if (isDynamicVolume) {
@@ -0,0 +1,74 @@
jest.mock('./getDisplaySetMessages', () => jest.fn(() => ({ addMessage: jest.fn() })));
jest.mock('./getDisplaySetsFromUnsupportedSeries', () => jest.fn());
import getSopClassHandlerModule from './getSopClassHandlerModule';
const makeInstance = () => ({
imageId: 'dicomfile:blob://local-multiframe',
url: 'dicomfile:blob://local-multiframe',
NumberOfFrames: 4,
Rows: 2,
Columns: 2,
PixelSpacing: [1, 1],
SliceThickness: 1,
ImageOrientationPatient: [1, 0, 0, 0, 1, 0],
ImagePositionPatient: [0, 0, 0],
FrameOfReferenceUID: 'frame-of-reference',
StudyInstanceUID: 'study',
SeriesInstanceUID: 'series',
SOPInstanceUID: 'sop',
SOPClassUID: '1.2.840.10008.5.1.4.1.1.2.1',
Modality: 'CT',
SeriesDescription: 'Local multiframe CT',
SeriesNumber: 1,
});
describe('getSopClassHandlerModule', () => {
it('checks dynamic volume grouping with generated multiframe imageIds', () => {
const frameImageIds = [
'dicomfile:blob://local-multiframe&frame=1',
'dicomfile:blob://local-multiframe&frame=2',
'dicomfile:blob://local-multiframe&frame=3',
'dicomfile:blob://local-multiframe&frame=4',
];
const getDynamicVolumeInfo = jest.fn(() => ({
isDynamicVolume: false,
timePoints: [frameImageIds],
splittingTag: null,
}));
const dataSource = {
getImageIdsForDisplaySet: jest.fn(() => frameImageIds),
retrieve: {
getGetThumbnailSrc: jest.fn(),
},
};
const customizationService = {
getCustomization: jest.fn(() => ({
sortFunctions: {},
defaultSortFunctionName: 'default',
})),
};
const appContext = {
appConfig: {},
extensionManager: {
getActiveDataSource: jest.fn(() => [dataSource]),
getModuleEntry: jest.fn(() => ({
exports: {
getDynamicVolumeInfo,
},
})),
},
servicesManager: {
services: {
customizationService,
},
},
};
const stackHandler = getSopClassHandlerModule(appContext)[0];
stackHandler.getDisplaySetsFromSeries([makeInstance()]);
expect(getDynamicVolumeInfo).toHaveBeenCalledWith(frameImageIds);
});
});