diff --git a/extensions/dicom-segmentation/src/components/SegmentItem/SegmentItem.js b/extensions/dicom-segmentation/src/components/SegmentItem/SegmentItem.js index 677b10da9..e16dd90cd 100644 --- a/extensions/dicom-segmentation/src/components/SegmentItem/SegmentItem.js +++ b/extensions/dicom-segmentation/src/components/SegmentItem/SegmentItem.js @@ -24,6 +24,7 @@ const SegmentItem = ({ onClick, itemClass, color, + labelmap3D, visible, onVisibilityChange, }) => { @@ -39,7 +40,7 @@ const SegmentItem = ({ event.stopPropagation(); const newVisibility = !isVisible; setIsVisible(newVisibility); - onVisibilityChange(newVisibility, index); + onVisibilityChange(newVisibility, index, labelmap3D); }; return ( diff --git a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js index d143a3fdd..bf7ce2959 100644 --- a/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js +++ b/extensions/dicom-segmentation/src/components/SegmentationPanel/SegmentationPanel.js @@ -431,23 +431,43 @@ const SegmentationPanel = ({ return enabledElements[activeIndex].element; }; - const onSegmentVisibilityChangeHandler = (isVisible, segmentNumber) => { - /** Get all labelmaps with this segmentNumber (overlapping segments) */ - const { labelmaps3D } = getBrushStackState(); - const possibleLabelMaps3D = labelmaps3D.filter(({ labelmaps2D }) => { - return labelmaps2D.some(({ segmentsOnLabelmap }) => - segmentsOnLabelmap.includes(segmentNumber) - ); - }); - + const onSegmentVisibilityChangeHandler = ( + isVisible, + segmentNumber, + labelmap3D + ) => { let segmentsHidden = []; - possibleLabelMaps3D.forEach(labelmap3D => { - labelmap3D.segmentsHidden[segmentNumber] = !isVisible; + if (labelmap3D.metadata.hasOverlapping) { + /** Get all labelmaps with this segmentNumber and that + * are from the same series (overlapping segments) */ + const { labelmaps3D } = getBrushStackState(); - segmentsHidden = [ - ...new Set([...segmentsHidden, ...labelmap3D.segmentsHidden]), - ]; - }); + const sameSeriesLabelMaps3D = labelmaps3D.filter(({ metadata }) => { + return ( + labelmap3D.metadata.segmentationSeriesInstanceUID === + metadata.segmentationSeriesInstanceUID + ); + }); + + const possibleLabelMaps3D = sameSeriesLabelMaps3D.filter( + ({ labelmaps2D }) => { + return labelmaps2D.some(({ segmentsOnLabelmap }) => + segmentsOnLabelmap.includes(segmentNumber) + ); + } + ); + + possibleLabelMaps3D.forEach(labelmap3D => { + labelmap3D.segmentsHidden[segmentNumber] = !isVisible; + + segmentsHidden = [ + ...new Set([...segmentsHidden, ...labelmap3D.segmentsHidden]), + ]; + }); + } else { + labelmap3D.segmentsHidden[segmentNumber] = !isVisible; + segmentsHidden = [...labelmap3D.segmentsHidden]; + } setState(state => ({ ...state, segmentsHidden })); @@ -514,6 +534,7 @@ const SegmentationPanel = ({ label={segmentLabel} index={segmentNumber} color={color} + labelmap3D={labelmap3D} visible={!labelmap3D.segmentsHidden[segmentIndex]} onVisibilityChange={onSegmentVisibilityChangeHandler} /> diff --git a/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js b/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js index 8dfc2c89c..6602f25e7 100644 --- a/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js +++ b/extensions/dicom-segmentation/src/getOHIFDicomSegSopClassHandler.js @@ -64,8 +64,17 @@ export default function getSopClassHandlerModule({ servicesManager }) { metadata, }; - segDisplaySet.getSourceDisplaySet = function(studies, activateLabelMap = true, onDisplaySetLoadFailureHandler) { - return getSourceDisplaySet(studies, segDisplaySet, activateLabelMap, onDisplaySetLoadFailureHandler); + segDisplaySet.getSourceDisplaySet = function( + studies, + activateLabelMap = true, + onDisplaySetLoadFailureHandler + ) { + return getSourceDisplaySet( + studies, + segDisplaySet, + activateLabelMap, + onDisplaySetLoadFailureHandler + ); }; segDisplaySet.load = async function(referencedDisplaySet, studies) { @@ -98,6 +107,9 @@ export default function getSopClassHandlerModule({ servicesManager }) { if (labelmapBufferArray.length > 1) { let labelmapIndexes = []; for (let i = 0; i < labelmapBufferArray.length; ++i) { + segMetadata.segmentationSeriesInstanceUID = + segDisplaySet.SeriesInstanceUID; + segMetadata.hasOverlapping = true; labelmapIndexes.push( await loadSegmentation( imageIds, @@ -118,6 +130,9 @@ export default function getSopClassHandlerModule({ servicesManager }) { labelmapIndex = labelmapIndexes[0]; console.warn('Overlapping segments!'); } else { + segMetadata.segmentationSeriesInstanceUID = + segDisplaySet.SeriesInstanceUID; + segMetadata.hasOverlapping = false; labelmapIndex = await loadSegmentation( imageIds, segDisplaySet,