IDC2797: add linking and report UI for SR displaySets (#2834)

This commit is contained in:
Davide Punzo 2022-06-30 12:05:47 +02:00 committed by GitHub
parent 5150ed9427
commit 67b70eaa98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 91 additions and 56 deletions

View File

@ -45,7 +45,7 @@ class OHIFCornerstoneViewportOverlay extends PureComponent {
imageId: PropTypes.string.isRequired, imageId: PropTypes.string.isRequired,
imageIndex: PropTypes.number.isRequired, imageIndex: PropTypes.number.isRequired,
stackSize: PropTypes.number.isRequired, stackSize: PropTypes.number.isRequired,
inconsistencyWarnings: PropTypes.array.isRequired, inconsistencyWarnings: PropTypes.array,
SRLabels: PropTypes.array, SRLabels: PropTypes.array,
}; };

View File

@ -89,10 +89,10 @@ const DubugReportModal = ({
Object.keys(viewportSpecificData).forEach(viewportIndex => { Object.keys(viewportSpecificData).forEach(viewportIndex => {
const displaySet = viewportSpecificData[viewportIndex]; const displaySet = viewportSpecificData[viewportIndex];
const [ const [referencedDisplaySetsRef] = _getReferencedSeriesInstanceUIDsString(
referencedDisplaySetsRef, displaySet,
referencedDisplaySetsCount, 'SEG'
] = _getReferencedSeriesInstanceUIDsString(displaySet, 'SEG'); );
const [row, column] = _viewportIndexToViewportPosition( const [row, column] = _viewportIndexToViewportPosition(
viewportIndex, viewportIndex,
@ -106,10 +106,27 @@ const DubugReportModal = ({
Object.keys(viewportSpecificData).forEach(viewportIndex => { Object.keys(viewportSpecificData).forEach(viewportIndex => {
const displaySet = viewportSpecificData[viewportIndex]; const displaySet = viewportSpecificData[viewportIndex];
const [ const [referencedDisplaySetsRef] = _getReferencedSeriesInstanceUIDsString(
referencedDisplaySetsRef, displaySet,
referencedDisplaySetsCount, 'RTSTRUCT'
] = _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( const [row, column] = _viewportIndexToViewportPosition(
viewportIndex, viewportIndex,
@ -261,11 +278,15 @@ const getLayout = viewports => {
<tr> <tr>
<th>ReferencedSEGSeriesInstanceUIDs</th> <th>ReferencedSEGSeriesInstanceUIDs</th>
</tr> </tr>
{getReferencedSEGSeriesInstanceUIDsPerRow(viewports)} {getReferencedSeriesInstanceUIDsPerRow(viewports, 'SEG')}
<tr> <tr>
<th>ReferencedRTSTRUCTSeriesInstanceUIDs</th> <th>ReferencedRTSTRUCTSeriesInstanceUIDs</th>
</tr> </tr>
{getReferencedRTSTRUCTSeriesInstanceUIDsPerRow(viewports)} {getReferencedSeriesInstanceUIDsPerRow(viewports, 'RTSTRUCT')}
<tr>
<th>ReferencedSRSeriesInstanceUIDs</th>
</tr>
{getReferencedSeriesInstanceUIDsPerRow(viewports, 'SR')}
</React.Fragment> </React.Fragment>
); );
}; };
@ -351,7 +372,7 @@ const _getReferencedSeriesInstanceUIDsString = (displaySet, Modality) => {
return [referencedDisplaySetsRef, referencedDisplaySetsCount]; return [referencedDisplaySetsRef, referencedDisplaySetsCount];
}; };
const getReferencedSEGSeriesInstanceUIDsPerRow = viewports => { const getReferencedSeriesInstanceUIDsPerRow = (viewports, Modality) => {
const { viewportSpecificData, numColumns } = viewports; const { viewportSpecificData, numColumns } = viewports;
// NOTE viewportSpecificData is actually an object with numerical keys. // NOTE viewportSpecificData is actually an object with numerical keys.
@ -360,43 +381,7 @@ const getReferencedSEGSeriesInstanceUIDsPerRow = viewports => {
const [ const [
referencedDisplaySetsRef, referencedDisplaySetsRef,
referencedDisplaySetsCount, referencedDisplaySetsCount,
] = _getReferencedSeriesInstanceUIDsString(displaySet, 'SEG'); ] = _getReferencedSeriesInstanceUIDsString(displaySet, Modality);
const [row, column] = _viewportIndexToViewportPosition(
viewportIndex,
numColumns
);
if (referencedDisplaySetsCount > 1) {
return (
<tr>
<td>{`[${row},${column}]`}</td>
<td className="debug-overflowText-border">
{referencedDisplaySetsRef}
</td>
</tr>
);
} else {
return (
<tr>
<td>{`[${row},${column}]`}</td>
<td className="debug-overflowText">{referencedDisplaySetsRef}</td>
</tr>
);
}
});
};
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');
const [row, column] = _viewportIndexToViewportPosition( const [row, column] = _viewportIndexToViewportPosition(
viewportIndex, viewportIndex,

View File

@ -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 // TODO: Should probably use dcmjs for this
const SOP_CLASS_UIDS = { 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', 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', 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', 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); const sopClassUIDs = Object.values(SOP_CLASS_UIDS);
@ -32,7 +32,7 @@ const OHIFDicomHtmlSopClassHandler = {
SeriesTime, SeriesTime,
} = metadata; } = metadata;
return { const srDisplaySet = {
plugin: 'html', plugin: 'html',
Modality: 'SR', Modality: 'SR',
displaySetInstanceUID: utils.guid(), displaySetInstanceUID: utils.guid(),
@ -49,7 +49,15 @@ const OHIFDicomHtmlSopClassHandler = {
authorizationHeaders, authorizationHeaders,
sopClassUids: sopClassUIDs, sopClassUids: sopClassUIDs,
images: series._instances, images: series._instances,
isDerived: true,
referencedDisplaySets: [],
}; };
srDisplaySet.getSourceDisplaySet = function() {
return srDisplaySet.referencedDisplaySets;
};
return srDisplaySet;
}, },
}; };

View File

@ -139,6 +139,10 @@ const checkIfCanAddMeasurementsToDisplaySet = (
coord.ReferencedSOPSequence.ReferencedSOPInstanceUID coord.ReferencedSOPSequence.ReferencedSOPInstanceUID
); );
if (imageIndex > -1) { if (imageIndex > -1) {
if (!srDisplaySet.referencedDisplaySets.includes(imageDisplaySet)) {
srDisplaySet.referencedDisplaySets.push(imageDisplaySet);
}
const imageId = imageIds[imageIndex]; const imageId = imageIds[imageIndex];
const imageMetadata = images[imageIndex].getData().metadata; const imageMetadata = images[imageIndex].getData().metadata;

View File

@ -350,6 +350,19 @@ class StudyMetadata extends Metadata {
referencedSeriesInstanceUID referencedSeriesInstanceUID
); );
} else { } else {
const filteredReferencedDisplaySets = displaySet.referencedDisplaySets.filter(
referencedDisplaySet =>
referencedDisplaySet.SeriesInstanceUID ===
referencedSeriesInstanceUID
);
if (
filteredReferencedDisplaySets &&
filteredReferencedDisplaySets.length !== 0
) {
return true;
}
return false; return false;
} }
} }

View File

@ -48,7 +48,7 @@ const mapDispatchToProps = (dispatch, ownProps) => {
); );
document.dispatchEvent(selectionFired); document.dispatchEvent(selectionFired);
}); });
} else { } else if (Modality !== 'SR') {
displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata); displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata);
} }

View File

@ -262,7 +262,11 @@ class Viewer extends Component {
const { currentTimepointId } = this; const { currentTimepointId } = this;
this.timepointApi.retrieveTimepoints({ PatientID }); 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 ( if (
displaySet.Modality !== 'SEG' && displaySet.Modality !== 'SEG' &&
displaySet.Modality !== 'RTSTRUCT' && displaySet.Modality !== 'RTSTRUCT' &&
displaySet.Modality !== 'RTDOSE' displaySet.Modality !== 'RTDOSE' &&
displaySet.Modality !== 'SR'
) { ) {
active = activeDisplaySetInstanceUID === displaySetInstanceUID; 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) { } else if (displaySet.getSourceDisplaySet) {
if (displaySet.Modality === 'SEG') { if (displaySet.Modality === 'SEG') {
const { referencedDisplaySet } = displaySet.getSourceDisplaySet( const { referencedDisplaySet } = displaySet.getSourceDisplaySet(

View File

@ -173,7 +173,7 @@ class ViewerMain extends Component {
); );
document.dispatchEvent(selectionFired); document.dispatchEvent(selectionFired);
}); });
} else { } else if (Modality !== 'SR') {
displaySet = displaySet.getSourceDisplaySet(this.props.studies); displaySet = displaySet.getSourceDisplaySet(this.props.studies);
} }