From e41ba2bfdeba009f8cec69ddc5c1ede99170f752 Mon Sep 17 00:00:00 2001 From: Davide Punzo Date: Mon, 19 Apr 2021 14:53:38 +0200 Subject: [PATCH] IDC2361: fix seg combobox filling --- .../SegmentationPanel/SegmentationPanel.js | 2 +- .../src/getOHIFDicomSegSopClassHandler.js | 3 +- .../src/getSourceDisplaySet.js | 43 +++++++++++++++---- .../src/utils/setActiveLabelMap.js | 10 ++--- .../src/classes/metadata/StudyMetadata.js | 27 +++++++++--- .../utils/loadAndCacheDerivedDisplaySets.js | 4 +- .../viewer/src/connectedComponents/Viewer.js | 4 ++ 7 files changed, 68 insertions(+), 25 deletions(-) diff --git a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js index 25fdfd35b..512a7404d 100644 --- a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js +++ b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js @@ -298,7 +298,7 @@ const SegmentationPanel = ({ ); const filteredReferencedSegDisplaysets = referencedSegDisplaysets.filter( - (segDisplay => segDisplay.loadError !== true && segDisplay.isLoaded)); + (segDisplay => segDisplay.loadError !== true)); return filteredReferencedSegDisplaysets.map((displaySet, index) => { const { diff --git a/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js b/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js index 9142fc8a1..8dfc2c89c 100644 --- a/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js +++ b/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js @@ -55,6 +55,7 @@ export default function getSopClassHandlerModule({ servicesManager }) { referencedDisplaySetUID: null, // Assigned when loaded. labelmapIndex: null, // Assigned when loaded. isLoaded: false, + loadError: false, hasOverlapping: false, SeriesDate, SeriesTime, @@ -68,7 +69,6 @@ export default function getSopClassHandlerModule({ servicesManager }) { }; segDisplaySet.load = async function(referencedDisplaySet, studies) { - segDisplaySet.isLoading = true; segDisplaySet.isLoaded = true; const { StudyInstanceUID } = referencedDisplaySet; const segArrayBuffer = await DicomLoaderService.findDicomDataPromise( @@ -129,7 +129,6 @@ export default function getSopClassHandlerModule({ servicesManager }) { } }; - segDisplaySet.isLoading = false; return segDisplaySet; }, }; diff --git a/extensions/dicom-segmentation/src/getSourceDisplaySet.js b/extensions/dicom-segmentation/src/getSourceDisplaySet.js index c9612322a..5f6174467 100644 --- a/extensions/dicom-segmentation/src/getSourceDisplaySet.js +++ b/extensions/dicom-segmentation/src/getSourceDisplaySet.js @@ -36,14 +36,32 @@ const _getReferencedDisplaySet = (segDisplaySet, studies) => { referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map( ReferencedSeries => ReferencedSeries.SeriesInstanceUID ); - } else { - const { PerFrameFunctionalGroupsSequence } = metadata; + } + if (metadata.ReferencedImageSequence && + (!referencedSeriesInstanceUIDs || referencedSeriesInstanceUIDs.length === 0)) { + const referencedImageArray = _toArray(metadata.ReferencedImageSequence); + for (let i = 0; i < referencedImageArray.length; i++) { + const { ReferencedSOPInstanceUID } = referencedImageArray[i]; + + referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID( + otherDisplaySets, + ReferencedSOPInstanceUID + ); + + if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) { + break; + } + } + } + + if (!referencedSeriesInstanceUIDs || referencedSeriesInstanceUIDs.length === 0) { let SourceImageSequence; if (metadata.SourceImageSequence) { SourceImageSequence = metadata.SourceImageSequence; } else { + const { PerFrameFunctionalGroupsSequence } = metadata; const firstFunctionalGroups = _toArray( PerFrameFunctionalGroupsSequence )[0]; @@ -52,14 +70,23 @@ const _getReferencedDisplaySet = (segDisplaySet, studies) => { SourceImageSequence = DerivationImageSequence; } - const firstSourceImage = _toArray(SourceImageSequence)[0]; + const sourceImageArray = _toArray(SourceImageSequence); + for (let i = 0; i < sourceImageArray.length; i++) { + const { ReferencedSOPInstanceUID } = sourceImageArray[i]; - const { ReferencedSOPInstanceUID } = firstSourceImage; + referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID( + otherDisplaySets, + ReferencedSOPInstanceUID + ); - referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID( - otherDisplaySets, - ReferencedSOPInstanceUID - ); + if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) { + break; + } + } + } + + if (!referencedSeriesInstanceUIDs || referencedSeriesInstanceUIDs.length === 0) { + return undefined; } const referencedDisplaySet = otherDisplaySets.find(ds => diff --git a/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js b/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js index 3644d861a..992e08e9a 100644 --- a/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js +++ b/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js @@ -47,16 +47,11 @@ export default async function setActiveLabelmap( return labelmapIndex; } - if (displaySet.isLoading) { - return activeLabelmapIndex; - } - if (!displaySet.isLoaded) { try { await displaySet.load(referencedDisplaySet, studies); } catch (error) { displaySet.isLoaded = false; - displaySet.isLoading = false; displaySet.loadError = true; onDisplaySetLoadFailure(error); @@ -74,8 +69,11 @@ export default async function setActiveLabelmap( // This might have just been created, so need to use the non-cached value. state = cornerstoneTools.getModule('segmentation').state; + brushStackState = state.series[firstImageId]; - brushStackState.activeLabelmapIndex = labelmapIndex; + if (brushStackState) { + brushStackState.activeLabelmapIndex = labelmapIndex; + } refreshViewports(); callback(); diff --git a/platform/core/src/classes/metadata/StudyMetadata.js b/platform/core/src/classes/metadata/StudyMetadata.js index e05701f8a..e8b6d37e5 100644 --- a/platform/core/src/classes/metadata/StudyMetadata.js +++ b/platform/core/src/classes/metadata/StudyMetadata.js @@ -241,6 +241,7 @@ export class StudyMetadata extends Metadata { referencedFrameOfReferenceUID, } = filter; + let tempReferencedFrameOfReferenceUID = referencedFrameOfReferenceUID; let filteredDerivedDisplaySets = this._derivedDisplaySets; if (Modality) { @@ -249,8 +250,9 @@ export class StudyMetadata extends Metadata { ); } + let finalDerivedDisplaySets; if (referencedSeriesInstanceUID) { - filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter( + finalDerivedDisplaySets = filteredDerivedDisplaySets.filter( displaySet => { if (!displaySet.metadata.ReferencedSeriesSequence) { return false; @@ -270,15 +272,28 @@ export class StudyMetadata extends Metadata { ); } - if (referencedFrameOfReferenceUID) { - filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter( + if ((!finalDerivedDisplaySets || finalDerivedDisplaySets.length === 0) + && !tempReferencedFrameOfReferenceUID) { + const referencedDisplaySets = this._displaySets.filter( displaySet => - displaySet.ReferencedFrameOfReferenceUID === - referencedFrameOfReferenceUID + displaySet.SeriesInstanceUID === + referencedSeriesInstanceUID + ); + + if (referencedDisplaySets[0]) { + tempReferencedFrameOfReferenceUID = referencedDisplaySets[0].images[0]._study.FrameOfReferenceUID + } + } + + if (tempReferencedFrameOfReferenceUID) { + finalDerivedDisplaySets = filteredDerivedDisplaySets.filter( + displaySet => + displaySet.FrameOfReferenceUID === + tempReferencedFrameOfReferenceUID ); } - return filteredDerivedDisplaySets; + return finalDerivedDisplaySets; } /** diff --git a/platform/core/src/utils/loadAndCacheDerivedDisplaySets.js b/platform/core/src/utils/loadAndCacheDerivedDisplaySets.js index 1cfac4ee7..d655f15d6 100644 --- a/platform/core/src/utils/loadAndCacheDerivedDisplaySets.js +++ b/platform/core/src/utils/loadAndCacheDerivedDisplaySets.js @@ -106,11 +106,11 @@ async function loadAndCacheDerivedDisplaySets(referencedDisplaySet, studies, log } }); - recentDisplaySet.isLoading = true; - try { await recentDisplaySet.load(referencedDisplaySet, studies); } catch (error) { + recentDisplaySet.isLoaded = false; + recentDisplaySet.loadError = true; logger.error({ error, message: error.message }); snackbar.show({ title: 'Error loading derived display set:', diff --git a/platform/viewer/src/connectedComponents/Viewer.js b/platform/viewer/src/connectedComponents/Viewer.js index 06dc60a90..84093b92a 100644 --- a/platform/viewer/src/connectedComponents/Viewer.js +++ b/platform/viewer/src/connectedComponents/Viewer.js @@ -434,6 +434,10 @@ const _checkForSeriesInconsistencesWarnings = async function (displaySet, studie } const sourceDisplaySet = displaySet.getSourceDisplaySet(studies, false); + if (!sourceDisplaySet) { + return warningsList; + } + const imageIds = sourceDisplaySet.images.map(image => image.getImageId()); if (!imageIds || imageIds.length === 0) { return warningsList;