From e41ba2bfdeba009f8cec69ddc5c1ede99170f752 Mon Sep 17 00:00:00 2001 From: Davide Punzo Date: Mon, 19 Apr 2021 14:53:38 +0200 Subject: [PATCH 1/3] 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 25fdfd35b14..512a7404d60 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 9142fc8a198..8dfc2c89cf1 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 c9612322a37..5f61744676a 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 3644d861abb..992e08e9afc 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 e05701f8a69..e8b6d37e5d3 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.SeriesInstanceUID === + referencedSeriesInstanceUID + ); + + if (referencedDisplaySets[0]) { + tempReferencedFrameOfReferenceUID = referencedDisplaySets[0].images[0]._study.FrameOfReferenceUID + } + } + + if (tempReferencedFrameOfReferenceUID) { + finalDerivedDisplaySets = filteredDerivedDisplaySets.filter( displaySet => - displaySet.ReferencedFrameOfReferenceUID === - referencedFrameOfReferenceUID + displaySet.FrameOfReferenceUID === + tempReferencedFrameOfReferenceUID ); } - return filteredDerivedDisplaySets; + return finalDerivedDisplaySets; } /** diff --git a/platform/core/src/utils/loadAndCacheDerivedDisplaySets.js b/platform/core/src/utils/loadAndCacheDerivedDisplaySets.js index 1cfac4ee74c..d655f15d624 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 06dc60a9020..84093b92a0c 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; From e421bc7df9872b1aaf47c34744f1c776c8a62e09 Mon Sep 17 00:00:00 2001 From: Davide Punzo Date: Tue, 20 Apr 2021 16:28:38 +0200 Subject: [PATCH 2/3] update --- .../SegmentationPanel/SegmentationPanel.js | 22 +- .../src/getSourceDisplaySet.js | 115 +-------- .../src/utils/setActiveLabelMap.js | 5 +- .../src/classes/metadata/StudyMetadata.js | 223 +++++++++++++++--- .../ConnectedStudyBrowser.js | 15 +- .../viewer/src/connectedComponents/Viewer.js | 6 +- .../src/connectedComponents/ViewerMain.js | 8 +- 7 files changed, 236 insertions(+), 158 deletions(-) diff --git a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js index 512a7404d60..f9aae847064 100644 --- a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js +++ b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js @@ -155,7 +155,9 @@ const SegmentationPanel = ({ const brushStackState = getBrushStackState(); brushStackState.activeLabelmapIndex = newLabelmapIndex; - setState(state => ({ ...state, selectedSegmentation })); + if (selectedSegmentation) { + setState(state => ({ ...state, selectedSegmentation })); + } refreshViewports(); @@ -189,10 +191,9 @@ const SegmentationPanel = ({ 'extensiondicomsegmentationsegloaded', refreshSegmentations ); - document.addEventListener( - 'extensiondicomsegmentationsegloadingfailed', - cleanSegmentationComboBox + 'extensiondicomsegmentationsegselected', + updateSegmentationComboBox ); /* @@ -213,8 +214,8 @@ const SegmentationPanel = ({ refreshSegmentations ); document.removeEventListener( - 'extensiondicomsegmentationsegloadingfailed', - cleanSegmentationComboBox + 'extensiondicomsegmentationsegselected', + updateSegmentationComboBox ); cornerstoneTools.store.state.enabledElements.forEach(enabledElement => enabledElement.removeEventListener( @@ -225,6 +226,15 @@ const SegmentationPanel = ({ }; }, [activeIndex, viewports]); + const updateSegmentationComboBox = (e) => { + const index = e.detail.activatedLabelmapIndex; + if (index !== -1) { + setState(state => ({ ...state, selectedSegmentation: index })); + } else { + cleanSegmentationComboBox(); + } + } + const cleanSegmentationComboBox = () => { setState(state => ({ ...state, diff --git a/extensions/dicom-segmentation/src/getSourceDisplaySet.js b/extensions/dicom-segmentation/src/getSourceDisplaySet.js index 5f61744676a..afa423f0c8c 100644 --- a/extensions/dicom-segmentation/src/getSourceDisplaySet.js +++ b/extensions/dicom-segmentation/src/getSourceDisplaySet.js @@ -1,117 +1,16 @@ import setActiveLabelmap from './utils/setActiveLabelMap'; -import { classes } from '@ohif/core'; - -const { ImageSet } = classes; +import { getReferencedDisplaySet } from '../../../platform/core/src/classes/metadata/StudyMetadata.js'; export default function getSourceDisplaySet(studies, segDisplaySet, activateLabelMap = true, onDisplaySetLoadFailureHandler) { - const referencedDisplaySet = _getReferencedDisplaySet(segDisplaySet, studies); + const referencedDisplaySet = getReferencedDisplaySet(segDisplaySet, studies); + let activatedLabelmapPromise; if (activateLabelMap) { - setActiveLabelmap(referencedDisplaySet, studies, segDisplaySet, undefined, onDisplaySetLoadFailureHandler); - } - - return referencedDisplaySet; -} - -const _getReferencedDisplaySet = (segDisplaySet, studies) => { - let allDisplaySets = []; - - studies.forEach(study => { - allDisplaySets = allDisplaySets.concat(study.displaySets); - }); - - const otherDisplaySets = allDisplaySets.filter( - ds => ds.displaySetInstanceUID !== segDisplaySet.displaySetInstanceUID - ); - - const { metadata } = segDisplaySet; - - let referencedSeriesInstanceUIDs; - - if (metadata.ReferencedSeriesSequence) { - const ReferencedSeriesSequence = _toArray( - metadata.ReferencedSeriesSequence - ); - - referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map( - ReferencedSeries => ReferencedSeries.SeriesInstanceUID - ); - } - - 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]; - const { DerivationImageSequence } = firstFunctionalGroups; - - SourceImageSequence = DerivationImageSequence; - } - - const sourceImageArray = _toArray(SourceImageSequence); - for (let i = 0; i < sourceImageArray.length; i++) { - const { ReferencedSOPInstanceUID } = sourceImageArray[i]; - - referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID( - otherDisplaySets, - ReferencedSOPInstanceUID - ); - - if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) { - break; - } - } + activatedLabelmapPromise = setActiveLabelmap(referencedDisplaySet, studies, segDisplaySet, undefined, onDisplaySetLoadFailureHandler); } - if (!referencedSeriesInstanceUIDs || referencedSeriesInstanceUIDs.length === 0) { - return undefined; + return { + referencedDisplaySet : referencedDisplaySet, + activatedLabelmapPromise : activatedLabelmapPromise } - - const referencedDisplaySet = otherDisplaySets.find(ds => - referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID) - ); - - return referencedDisplaySet; -}; - -const _findReferencedSeriesInstanceUIDsFromSOPInstanceUID = ( - displaySets, - SOPInstanceUID -) => { - const imageSets = displaySets.filter(ds => ds instanceof ImageSet); - - for (let i = 0; i < imageSets.length; i++) { - const { images } = imageSets[i]; - for (let j = 0; j < images.length; j++) { - if (images[j].SOPInstanceUID === SOPInstanceUID) { - return [images[j].getData().metadata.SeriesInstanceUID]; - } - } - } -}; - -function _toArray(arrayOrObject) { - return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject]; } diff --git a/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js b/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js index 992e08e9afc..1bda8d2e281 100644 --- a/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js +++ b/extensions/dicom-segmentation/src/utils/setActiveLabelMap.js @@ -55,10 +55,7 @@ export default async function setActiveLabelmap( displaySet.loadError = true; onDisplaySetLoadFailure(error); - const event = new CustomEvent('extensiondicomsegmentationsegloadingfailed'); - document.dispatchEvent(event); - - return activeLabelmapIndex; + return -1; } } diff --git a/platform/core/src/classes/metadata/StudyMetadata.js b/platform/core/src/classes/metadata/StudyMetadata.js index e8b6d37e5d3..2e6531f9ad1 100644 --- a/platform/core/src/classes/metadata/StudyMetadata.js +++ b/platform/core/src/classes/metadata/StudyMetadata.js @@ -13,7 +13,7 @@ import { isDisplaySetReconstructable, isSpacingUniform } from '../../utils/isDis import errorHandler from '../../errorHandler'; import isLowPriorityModality from '../../utils/isLowPriorityModality'; -export class StudyMetadata extends Metadata { +class StudyMetadata extends Metadata { constructor(data, uid) { super(data, uid); // Initialize Private Properties @@ -241,7 +241,6 @@ export class StudyMetadata extends Metadata { referencedFrameOfReferenceUID, } = filter; - let tempReferencedFrameOfReferenceUID = referencedFrameOfReferenceUID; let filteredDerivedDisplaySets = this._derivedDisplaySets; if (Modality) { @@ -250,50 +249,23 @@ export class StudyMetadata extends Metadata { ); } - let finalDerivedDisplaySets; if (referencedSeriesInstanceUID) { - finalDerivedDisplaySets = filteredDerivedDisplaySets.filter( + filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter( displaySet => { - if (!displaySet.metadata.ReferencedSeriesSequence) { - return false; - } - - const ReferencedSeriesSequence = Array.isArray( - displaySet.metadata.ReferencedSeriesSequence - ) - ? displaySet.metadata.ReferencedSeriesSequence - : [displaySet.metadata.ReferencedSeriesSequence]; - - return ReferencedSeriesSequence.some( - ReferencedSeries => - ReferencedSeries.SeriesInstanceUID === referencedSeriesInstanceUID - ); + return getReferencedDisplaySet(displaySet, [this]).SeriesInstanceUID === referencedSeriesInstanceUID; } ); } - if ((!finalDerivedDisplaySets || finalDerivedDisplaySets.length === 0) - && !tempReferencedFrameOfReferenceUID) { - const referencedDisplaySets = this._displaySets.filter( - displaySet => - displaySet.SeriesInstanceUID === - referencedSeriesInstanceUID - ); - - if (referencedDisplaySets[0]) { - tempReferencedFrameOfReferenceUID = referencedDisplaySets[0].images[0]._study.FrameOfReferenceUID - } - } - - if (tempReferencedFrameOfReferenceUID) { - finalDerivedDisplaySets = filteredDerivedDisplaySets.filter( + if (referencedFrameOfReferenceUID) { + filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter( displaySet => displaySet.FrameOfReferenceUID === - tempReferencedFrameOfReferenceUID + referencedFrameOfReferenceUID ); } - return finalDerivedDisplaySets; + return filteredDerivedDisplaySets; } /** @@ -931,3 +903,184 @@ function _getDisplaySetFromSopClassModule( } return displaySet; } + +/** + * Returns the source display set of the derivated display set. + * @param {object} derivatedDisplaySet + * @param {array[StudyMetadata]} studies + * @return {object} source display set. + */ +function getReferencedDisplaySet(derivatedDisplaySet, studies) { + let allDisplaySets = []; + + studies.forEach(study => { + allDisplaySets = allDisplaySets.concat(study.displaySets); + }); + + const otherDisplaySets = allDisplaySets.filter( + ds => ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID + ); + + const { metadata } = derivatedDisplaySet; + + let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence + (metadata, otherDisplaySets); + + let noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs || + referencedSeriesInstanceUIDs.length === 0; + if (noReferencedSeriesAvailable) { + referencedSeriesInstanceUIDs = + _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence + (metadata); + } + + noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs || + referencedSeriesInstanceUIDs.length === 0; + if (noReferencedSeriesAvailable) { + referencedSeriesInstanceUIDs = + _findReferencedSeriesInstanceUIDsFromReferencedImageSequence + (metadata, otherDisplaySets); + } + + const referencedSeriesAvailable = referencedSeriesInstanceUIDs && + referencedSeriesInstanceUIDs.length !== 0; + if (referencedSeriesAvailable) { + const referencedDisplaySet = otherDisplaySets.find(ds => + referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID) + ); + ; + return referencedDisplaySet; + } +}; + +/** + * Returns the referenced series instance UIDs by searching the information in the + * ReferencedSeriesSequence. + * @param {object} derivatedDisplaySet.metadata + * @return {array[string]} referenced series instance UIDs. + */ +function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence ( + metadata, +) { + if (!metadata.ReferencedSeriesSequence) { + return; + } + + let referencedSeriesInstanceUIDs; + const ReferencedSeriesSequence = _toArray( + metadata.ReferencedSeriesSequence + ); + + referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map( + ReferencedSeries => ReferencedSeries.SeriesInstanceUID + ); + + return referencedSeriesInstanceUIDs; +}; + +/** + * Returns the referenced series instance UIDs by searching the information in the + * ReferencedImageSequence. + * @param {object} derivatedDisplaySet.metadata + * @param {array[object]} displaysets + * @return {array[string]} referenced series instance UIDs. + */ +function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence ( + metadata, + displaySets +) { + if (!metadata.ReferencedImageSequence) { + return; + } + + let referencedSeriesInstanceUIDs; + const referencedImageArray = _toArray(metadata.ReferencedImageSequence); + for (let i = 0; i < referencedImageArray.length; i++) { + const { ReferencedSOPInstanceUID } = referencedImageArray[i]; + + referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID( + displaySets, + ReferencedSOPInstanceUID + ); + + if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) { + break; + } + } + + return referencedSeriesInstanceUIDs; +}; + +/** + * Returns the referenced series instance UIDs by searching the information in the + * SourceImageSequence. + * @param {object} derivatedDisplaySet.metadata + * @param {array[object]} displaysets + * @return {array[string]} referenced series instance UIDs. + */ +function _findReferencedSeriesInstanceUIDsFromSourceImageSequence ( + metadata, + displaySets +) { + let SourceImageSequence; + + if (metadata.SourceImageSequence) { + SourceImageSequence = metadata.SourceImageSequence; + } else { + const { PerFrameFunctionalGroupsSequence } = metadata; + const firstFunctionalGroups = _toArray( + PerFrameFunctionalGroupsSequence + )[0]; + const { DerivationImageSequence } = firstFunctionalGroups; + SourceImageSequence = DerivationImageSequence; + } + + if (!SourceImageSequence) { + return; + } + + const sourceImageArray = _toArray(SourceImageSequence); + + let referencedSeriesInstanceUIDs; + for (let i = 0; i < sourceImageArray.length; i++) { + const { ReferencedSOPInstanceUID } = sourceImageArray[i]; + referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID( + displaySets, + ReferencedSOPInstanceUID + ); + if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) { + break; + } + } + + return referencedSeriesInstanceUIDs; +}; + +/** + * Returns the referenced series instance UIDs by searching the information in the + * SOPInstanceUID of the displaySets. + * @param {array[object]} displaysets + * @param {string} SOPInstanceUID + * @return {array[string]} referenced series instance UIDs. + */ +function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID ( + displaySets, + SOPInstanceUID +) { + const imageSets = displaySets.filter(ds => ds instanceof ImageSet); + + for (let i = 0; i < imageSets.length; i++) { + const { images } = imageSets[i]; + for (let j = 0; j < images.length; j++) { + if (images[j].SOPInstanceUID === SOPInstanceUID) { + return [images[j].getData().metadata.SeriesInstanceUID]; + } + } + } +}; + +function _toArray(arrayOrObject) { + return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject]; +} + +export {StudyMetadata, getReferencedDisplaySet}; diff --git a/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js b/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js index 519103c293c..22efaeb125e 100644 --- a/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js +++ b/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js @@ -61,7 +61,20 @@ const mapDispatchToProps = (dispatch, ownProps) => { }); }; - displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata, true, onDisplaySetLoadFailureHandler); + const {referencedDisplaySet, activatedLabelmapPromise} = displaySet.getSourceDisplaySet( + ownProps.studyMetadata, + true, + onDisplaySetLoadFailureHandler + ); + displaySet = referencedDisplaySet; + + activatedLabelmapPromise.then((activatedLabelmapIndex) => { + const selectionFired = new CustomEvent("extensiondicomsegmentationsegselected", { + "detail": {"activatedLabelmapIndex":activatedLabelmapIndex} + }); + document.dispatchEvent(selectionFired); + }); + } else { displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata); } diff --git a/platform/viewer/src/connectedComponents/Viewer.js b/platform/viewer/src/connectedComponents/Viewer.js index 84093b92a0c..d22fa872107 100644 --- a/platform/viewer/src/connectedComponents/Viewer.js +++ b/platform/viewer/src/connectedComponents/Viewer.js @@ -433,12 +433,12 @@ const _checkForSeriesInconsistencesWarnings = async function (displaySet, studie return warningsList; } - const sourceDisplaySet = displaySet.getSourceDisplaySet(studies, false); - if (!sourceDisplaySet) { + const { referencedDisplaySet } = displaySet.getSourceDisplaySet(studies, false); + if (!referencedDisplaySet) { return warningsList; } - const imageIds = sourceDisplaySet.images.map(image => image.getImageId()); + const imageIds = referencedDisplaySet.images.map(image => image.getImageId()); if (!imageIds || imageIds.length === 0) { return warningsList; } diff --git a/platform/viewer/src/connectedComponents/ViewerMain.js b/platform/viewer/src/connectedComponents/ViewerMain.js index 04c5e736a63..978b4d52935 100644 --- a/platform/viewer/src/connectedComponents/ViewerMain.js +++ b/platform/viewer/src/connectedComponents/ViewerMain.js @@ -153,7 +153,13 @@ class ViewerMain extends Component { }); }; - displaySet = displaySet.getSourceDisplaySet(this.props.studies, true, onDisplaySetLoadFailureHandler); + const {referencedDisplaySet} = displaySet.getSourceDisplaySet( + this.props.studies, + true, + onDisplaySetLoadFailureHandler + ); + displaySet = referencedDisplaySet; + } else { displaySet = displaySet.getSourceDisplaySet(this.props.studies); } From 21a5d1bfc439acd87da850a07b9c1ffe137f18be Mon Sep 17 00:00:00 2001 From: Davide Punzo Date: Wed, 21 Apr 2021 10:35:27 +0200 Subject: [PATCH 3/3] update --- .../src/components/SegmentationPanel/SegmentationPanel.js | 1 + .../dicom-segmentation/src/components/SegmentationSelect.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js index f9aae847064..02ece632fae 100644 --- a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js +++ b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js @@ -243,6 +243,7 @@ const SegmentationPanel = ({ labelMapList: [], segmentList: [], isDisabled: true, + selectedSegmentation: -1, })); } diff --git a/extensions/dicom-segmentation/src/components/SegmentationSelect.js b/extensions/dicom-segmentation/src/components/SegmentationSelect.js index 52b2ca8f043..4d988d99a6c 100644 --- a/extensions/dicom-segmentation/src/components/SegmentationSelect.js +++ b/extensions/dicom-segmentation/src/components/SegmentationSelect.js @@ -3,7 +3,7 @@ import Select from 'react-select'; const SegmentationSelect = ({ value, formatOptionLabel, options }) => (