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,
|
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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user