Show 1-based in stack position of measurement in measurements panel. (#1967)

This commit is contained in:
James Petts 2020-08-06 11:25:27 +01:00 committed by GitHub
parent 2ded8b7ee8
commit 8e6b3ac580
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 21 deletions

View File

@ -32,7 +32,11 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
measurementChangeTimestamp, measurementChangeTimestamp,
200 200
); );
const { MeasurementService, UIDialogService } = servicesManager.services; const {
MeasurementService,
UIDialogService,
DisplaySetService,
} = servicesManager.services;
const [ const [
trackedMeasurements, trackedMeasurements,
sendTrackedMeasurementsEvent, sendTrackedMeasurementsEvent,
@ -51,8 +55,12 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
trackedSeries.includes(m.referenceSeriesUID) trackedSeries.includes(m.referenceSeriesUID)
); );
const mappedMeasurements = filteredMeasurements.map((m, index) => const mappedMeasurements = filteredMeasurements.map(m =>
_mapMeasurementToDisplay(m, index, MeasurementService.VALUE_TYPES) _mapMeasurementToDisplay(
m,
MeasurementService.VALUE_TYPES,
DisplaySetService
)
); );
setDisplayMeasurements(mappedMeasurements); setDisplayMeasurements(mappedMeasurements);
// eslint-ignore-next-line // eslint-ignore-next-line
@ -295,27 +303,39 @@ PanelMeasurementTableTracking.propTypes = {
}; };
// TODO: This could be a MeasurementService mapper // TODO: This could be a MeasurementService mapper
function _mapMeasurementToDisplay(measurement, index, types) { function _mapMeasurementToDisplay(measurement, types, DisplaySetService) {
const { const { referenceStudyUID, referenceSeriesUID, SOPInstanceUID } = measurement;
id,
label, // TODO: We don't deal with multiframe well yet, would need to update
description, // This in OHIF-312 when we add FrameIndex to measurements.
// Reference IDs
referenceStudyUID,
referenceSeriesUID,
SOPInstanceUID,
} = measurement;
const instance = DicomMetadataStore.getInstance( const instance = DicomMetadataStore.getInstance(
referenceStudyUID, referenceStudyUID,
referenceSeriesUID, referenceSeriesUID,
SOPInstanceUID SOPInstanceUID
); );
const { PixelSpacing, SeriesNumber, InstanceNumber } = instance;
const displaySets = DisplaySetService.getDisplaySetsForSeries(
referenceSeriesUID
);
if (!displaySets[0] || !displaySets[0].images) {
throw new Error(
'The tracked measurements panel should only be tracking "stack" displaySets.'
);
}
const oneBasedImageIdIndex = _getOneBasedImageIdIndex(
displaySets,
SOPInstanceUID
);
const { PixelSpacing, SeriesNumber } = instance;
const displayText = _getDisplayText( const displayText = _getDisplayText(
measurement, measurement,
PixelSpacing, PixelSpacing,
SeriesNumber, SeriesNumber,
InstanceNumber, oneBasedImageIdIndex,
types types
); );
@ -328,6 +348,25 @@ function _mapMeasurementToDisplay(measurement, index, types) {
}; };
} }
/**
*
* @param {*} displaySets An array of displaySets relating to a given series.
* @param {*} SOPInstanceUID The SOPInstanceUID to find.
* @returns {number} The one-based imageIdIndex.
*/
function _getOneBasedImageIdIndex(displaySets, SOPInstanceUID) {
for (let ds = 0; ds < displaySets.length; ds++) {
const displaySet = displaySets[0];
const { images } = displaySet;
for (let i = 0; i < images.length; i++) {
if (images[i].SOPInstanceUID === SOPInstanceUID) {
return i + 1; // We want the instack position 1-based.
}
}
}
}
/** /**
* *
* @param {*} points * @param {*} points

View File

@ -10,7 +10,7 @@ const ViewportOverlay = ({
windowCenter, windowCenter,
imageIndex, imageIndex,
stackSize, stackSize,
activeTools activeTools,
}) => { }) => {
const topLeft = 'top-viewport left-viewport'; const topLeft = 'top-viewport left-viewport';
const topRight = 'top-viewport right-viewport-scrollbar'; const topRight = 'top-viewport right-viewport-scrollbar';
@ -25,7 +25,8 @@ const ViewportOverlay = ({
return null; return null;
} }
const generalImageModule = cornerstone.metaData.get('generalImageModule', imageId) || {}; const generalImageModule =
cornerstone.metaData.get('generalImageModule', imageId) || {};
const { instanceNumber } = generalImageModule; const { instanceNumber } = generalImageModule;
return ( return (
@ -40,7 +41,9 @@ const ViewportOverlay = ({
{isWwwcActive && ( {isWwwcActive && (
<div className="flex flex-row"> <div className="flex flex-row">
<span className="mr-1">W:</span> <span className="mr-1">W:</span>
<span className="ml-1 mr-2 font-thin">{windowWidth.toFixed(0)}</span> <span className="ml-1 mr-2 font-thin">
{windowWidth.toFixed(0)}
</span>
<span className="mr-1">L:</span> <span className="mr-1">L:</span>
<span className="ml-1 font-thin">{windowCenter.toFixed(0)}</span> <span className="ml-1 font-thin">{windowCenter.toFixed(0)}</span>
</div> </div>
@ -51,7 +54,7 @@ const ViewportOverlay = ({
<div className="flex flex-row"> <div className="flex flex-row">
<span className="mr-1">I:</span> <span className="mr-1">I:</span>
<span className="font-thin"> <span className="font-thin">
{`${instanceNumber} ${imageIndex}/${stackSize}`} {`${instanceNumber} (${imageIndex}/${stackSize})`}
</span> </span>
</div> </div>
)} )}
@ -69,11 +72,11 @@ ViewportOverlay.propTypes = {
imageId: PropTypes.string.isRequired, imageId: PropTypes.string.isRequired,
imageIndex: PropTypes.number.isRequired, imageIndex: PropTypes.number.isRequired,
stackSize: PropTypes.number.isRequired, stackSize: PropTypes.number.isRequired,
activeTools: PropTypes.arrayOf(PropTypes.string) activeTools: PropTypes.arrayOf(PropTypes.string),
}; };
ViewportOverlay.defaultProps = { ViewportOverlay.defaultProps = {
activeTools: [] activeTools: [],
}; };
export default ViewportOverlay; export default ViewportOverlay;