diff --git a/extensions/cornerstone/src/components/OHIFCornerstoneViewportOverlay.js b/extensions/cornerstone/src/components/OHIFCornerstoneViewportOverlay.js index 72a945625..d344efec3 100644 --- a/extensions/cornerstone/src/components/OHIFCornerstoneViewportOverlay.js +++ b/extensions/cornerstone/src/components/OHIFCornerstoneViewportOverlay.js @@ -45,7 +45,7 @@ class OHIFCornerstoneViewportOverlay extends PureComponent { imageId: PropTypes.string.isRequired, imageIndex: PropTypes.number.isRequired, stackSize: PropTypes.number.isRequired, - inconsistencyWarnings: PropTypes.array.isRequired, + inconsistencyWarnings: PropTypes.array, SRLabels: PropTypes.array, }; diff --git a/extensions/debugging/src/DebugReportModal.js b/extensions/debugging/src/DebugReportModal.js index c8acec293..2727f4fdd 100644 --- a/extensions/debugging/src/DebugReportModal.js +++ b/extensions/debugging/src/DebugReportModal.js @@ -89,10 +89,10 @@ const DubugReportModal = ({ Object.keys(viewportSpecificData).forEach(viewportIndex => { const displaySet = viewportSpecificData[viewportIndex]; - const [ - referencedDisplaySetsRef, - referencedDisplaySetsCount, - ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'SEG'); + const [referencedDisplaySetsRef] = _getReferencedSeriesInstanceUIDsString( + displaySet, + 'SEG' + ); const [row, column] = _viewportIndexToViewportPosition( viewportIndex, @@ -106,10 +106,27 @@ const DubugReportModal = ({ Object.keys(viewportSpecificData).forEach(viewportIndex => { const displaySet = viewportSpecificData[viewportIndex]; - const [ - referencedDisplaySetsRef, - referencedDisplaySetsCount, - ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'RTSTRUCT'); + const [referencedDisplaySetsRef] = _getReferencedSeriesInstanceUIDsString( + displaySet, + 'RTSTRUCT' + ); + + const [row, column] = _viewportIndexToViewportPosition( + viewportIndex, + numColumns + ); + + body += `[${row},${column}]\t${referencedDisplaySetsRef}\n`; + }); + + body += '== ReferencedSRSeriesInstanceUIDs ==\n'; + + Object.keys(viewportSpecificData).forEach(viewportIndex => { + const displaySet = viewportSpecificData[viewportIndex]; + const [referencedDisplaySetsRef] = _getReferencedSeriesInstanceUIDsString( + displaySet, + 'SR' + ); const [row, column] = _viewportIndexToViewportPosition( viewportIndex, @@ -261,11 +278,15 @@ const getLayout = viewports => { ReferencedSEGSeriesInstanceUIDs - {getReferencedSEGSeriesInstanceUIDsPerRow(viewports)} + {getReferencedSeriesInstanceUIDsPerRow(viewports, 'SEG')} ReferencedRTSTRUCTSeriesInstanceUIDs - {getReferencedRTSTRUCTSeriesInstanceUIDsPerRow(viewports)} + {getReferencedSeriesInstanceUIDsPerRow(viewports, 'RTSTRUCT')} + + ReferencedSRSeriesInstanceUIDs + + {getReferencedSeriesInstanceUIDsPerRow(viewports, 'SR')} ); }; @@ -351,7 +372,7 @@ const _getReferencedSeriesInstanceUIDsString = (displaySet, Modality) => { return [referencedDisplaySetsRef, referencedDisplaySetsCount]; }; -const getReferencedSEGSeriesInstanceUIDsPerRow = viewports => { +const getReferencedSeriesInstanceUIDsPerRow = (viewports, Modality) => { const { viewportSpecificData, numColumns } = viewports; // NOTE viewportSpecificData is actually an object with numerical keys. @@ -360,43 +381,7 @@ const getReferencedSEGSeriesInstanceUIDsPerRow = viewports => { const [ referencedDisplaySetsRef, referencedDisplaySetsCount, - ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'SEG'); - - const [row, column] = _viewportIndexToViewportPosition( - viewportIndex, - numColumns - ); - - if (referencedDisplaySetsCount > 1) { - return ( - - {`[${row},${column}]`} - - {referencedDisplaySetsRef} - - - ); - } else { - return ( - - {`[${row},${column}]`} - {referencedDisplaySetsRef} - - ); - } - }); -}; - -const getReferencedRTSTRUCTSeriesInstanceUIDsPerRow = viewports => { - const { viewportSpecificData, numColumns } = viewports; - - // NOTE viewportSpecificData is actually an object with numerical keys. - return Object.keys(viewportSpecificData).map(viewportIndex => { - const displaySet = viewportSpecificData[viewportIndex]; - const [ - referencedDisplaySetsRef, - referencedDisplaySetsCount, - ] = _getReferencedSeriesInstanceUIDsString(displaySet, 'RTSTRUCT'); + ] = _getReferencedSeriesInstanceUIDsString(displaySet, Modality); const [row, column] = _viewportIndexToViewportPosition( viewportIndex, diff --git a/extensions/dicom-html/src/OHIFDicomHtmlSopClassHandler.js b/extensions/dicom-html/src/OHIFDicomHtmlSopClassHandler.js index 5a1844f67..06634dc4e 100644 --- a/extensions/dicom-html/src/OHIFDicomHtmlSopClassHandler.js +++ b/extensions/dicom-html/src/OHIFDicomHtmlSopClassHandler.js @@ -1,4 +1,4 @@ -import { MODULE_TYPES, utils } from '@ohif/core'; +import { MODULE_TYPES, utils, metadata } from '@ohif/core'; // TODO: Should probably use dcmjs for this const SOP_CLASS_UIDS = { @@ -10,7 +10,7 @@ const SOP_CLASS_UIDS = { MAMMOGRAPHY_CAD_SR: '1.2.840.10008.5.1.4.1.1.88.50', CHEST_CAD_SR: '1.2.840.10008.5.1.4.1.1.88.65', X_RAY_RADIATION_DOSE_SR: '1.2.840.10008.5.1.4.1.1.88.67', - ACQUISITION_CONTEXT_SR_STORAGE: '1.2.840.10008.5.1.4.1.1.88.71' + ACQUISITION_CONTEXT_SR_STORAGE: '1.2.840.10008.5.1.4.1.1.88.71', }; const sopClassUIDs = Object.values(SOP_CLASS_UIDS); @@ -32,7 +32,7 @@ const OHIFDicomHtmlSopClassHandler = { SeriesTime, } = metadata; - return { + const srDisplaySet = { plugin: 'html', Modality: 'SR', displaySetInstanceUID: utils.guid(), @@ -49,7 +49,15 @@ const OHIFDicomHtmlSopClassHandler = { authorizationHeaders, sopClassUids: sopClassUIDs, images: series._instances, + isDerived: true, + referencedDisplaySets: [], }; + + srDisplaySet.getSourceDisplaySet = function() { + return srDisplaySet.referencedDisplaySets; + }; + + return srDisplaySet; }, }; diff --git a/platform/core/src/DICOMSR/SCOORD3D/parseSCOORD3D.js b/platform/core/src/DICOMSR/SCOORD3D/parseSCOORD3D.js index ab5a44152..c4c96fe52 100644 --- a/platform/core/src/DICOMSR/SCOORD3D/parseSCOORD3D.js +++ b/platform/core/src/DICOMSR/SCOORD3D/parseSCOORD3D.js @@ -139,6 +139,10 @@ const checkIfCanAddMeasurementsToDisplaySet = ( coord.ReferencedSOPSequence.ReferencedSOPInstanceUID ); if (imageIndex > -1) { + if (!srDisplaySet.referencedDisplaySets.includes(imageDisplaySet)) { + srDisplaySet.referencedDisplaySets.push(imageDisplaySet); + } + const imageId = imageIds[imageIndex]; const imageMetadata = images[imageIndex].getData().metadata; diff --git a/platform/core/src/classes/metadata/StudyMetadata.js b/platform/core/src/classes/metadata/StudyMetadata.js index f99651937..ad881b18a 100644 --- a/platform/core/src/classes/metadata/StudyMetadata.js +++ b/platform/core/src/classes/metadata/StudyMetadata.js @@ -350,6 +350,19 @@ class StudyMetadata extends Metadata { referencedSeriesInstanceUID ); } else { + const filteredReferencedDisplaySets = displaySet.referencedDisplaySets.filter( + referencedDisplaySet => + referencedDisplaySet.SeriesInstanceUID === + referencedSeriesInstanceUID + ); + + if ( + filteredReferencedDisplaySets && + filteredReferencedDisplaySets.length !== 0 + ) { + return true; + } + return false; } } diff --git a/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js b/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js index 06d2cc04f..6e3f3c150 100644 --- a/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js +++ b/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js @@ -48,7 +48,7 @@ const mapDispatchToProps = (dispatch, ownProps) => { ); document.dispatchEvent(selectionFired); }); - } else { + } else if (Modality !== 'SR') { displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata); } diff --git a/platform/viewer/src/connectedComponents/Viewer.js b/platform/viewer/src/connectedComponents/Viewer.js index 41cfaf5e3..2a22568e9 100644 --- a/platform/viewer/src/connectedComponents/Viewer.js +++ b/platform/viewer/src/connectedComponents/Viewer.js @@ -262,7 +262,11 @@ class Viewer extends Component { const { currentTimepointId } = this; this.timepointApi.retrieveTimepoints({ PatientID }); - this.measurementApi.retrieveMeasurements(PatientID, [currentTimepointId]); + this.measurementApi + .retrieveMeasurements(PatientID, [currentTimepointId]) + .then(() => { + this._updateThumbnails(); + }); } } @@ -608,9 +612,30 @@ const _isDisplaySetActive = function( if ( displaySet.Modality !== 'SEG' && displaySet.Modality !== 'RTSTRUCT' && - displaySet.Modality !== 'RTDOSE' + displaySet.Modality !== 'RTDOSE' && + displaySet.Modality !== 'SR' ) { active = activeDisplaySetInstanceUID === displaySetInstanceUID; + } else if (displaySet.Modality === 'SR') { + active = activeDisplaySetInstanceUID === displaySetInstanceUID; + + if (!active && displaySet.getSourceDisplaySet) { + const referencedDisplaySet = displaySet.getSourceDisplaySet( + studies, + false + ); + if (referencedDisplaySet && referencedDisplaySet.length !== 0) { + for (let i = 0; i < referencedDisplaySet.length; i++) { + if ( + referencedDisplaySet[i].displaySetInstanceUID === + activeDisplaySetInstanceUID + ) { + active = true; + break; + } + } + } + } } else if (displaySet.getSourceDisplaySet) { if (displaySet.Modality === 'SEG') { const { referencedDisplaySet } = displaySet.getSourceDisplaySet( diff --git a/platform/viewer/src/connectedComponents/ViewerMain.js b/platform/viewer/src/connectedComponents/ViewerMain.js index 6b0a7b8b9..d53881bdf 100644 --- a/platform/viewer/src/connectedComponents/ViewerMain.js +++ b/platform/viewer/src/connectedComponents/ViewerMain.js @@ -173,7 +173,7 @@ class ViewerMain extends Component { ); document.dispatchEvent(selectionFired); }); - } else { + } else if (Modality !== 'SR') { displaySet = displaySet.getSourceDisplaySet(this.props.studies); }