IDC2797: add linking and report UI for SR displaySets (#2834)
This commit is contained in:
parent
5150ed9427
commit
67b70eaa98
@ -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,
|
||||
};
|
||||
|
||||
|
||||
@ -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 => {
|
||||
<tr>
|
||||
<th>ReferencedSEGSeriesInstanceUIDs</th>
|
||||
</tr>
|
||||
{getReferencedSEGSeriesInstanceUIDsPerRow(viewports)}
|
||||
{getReferencedSeriesInstanceUIDsPerRow(viewports, 'SEG')}
|
||||
<tr>
|
||||
<th>ReferencedRTSTRUCTSeriesInstanceUIDs</th>
|
||||
</tr>
|
||||
{getReferencedRTSTRUCTSeriesInstanceUIDsPerRow(viewports)}
|
||||
{getReferencedSeriesInstanceUIDsPerRow(viewports, 'RTSTRUCT')}
|
||||
<tr>
|
||||
<th>ReferencedSRSeriesInstanceUIDs</th>
|
||||
</tr>
|
||||
{getReferencedSeriesInstanceUIDsPerRow(viewports, 'SR')}
|
||||
</React.Fragment>
|
||||
);
|
||||
};
|
||||
@ -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 (
|
||||
<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');
|
||||
] = _getReferencedSeriesInstanceUIDsString(displaySet, Modality);
|
||||
|
||||
const [row, column] = _viewportIndexToViewportPosition(
|
||||
viewportIndex,
|
||||
|
||||
@ -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;
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -48,7 +48,7 @@ const mapDispatchToProps = (dispatch, ownProps) => {
|
||||
);
|
||||
document.dispatchEvent(selectionFired);
|
||||
});
|
||||
} else {
|
||||
} else if (Modality !== 'SR') {
|
||||
displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata);
|
||||
}
|
||||
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -173,7 +173,7 @@ class ViewerMain extends Component {
|
||||
);
|
||||
document.dispatchEvent(selectionFired);
|
||||
});
|
||||
} else {
|
||||
} else if (Modality !== 'SR') {
|
||||
displaySet = displaySet.getSourceDisplaySet(this.props.studies);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user