Show 1-based in stack position of measurement in measurements panel. (#1967)
This commit is contained in:
parent
2ded8b7ee8
commit
8e6b3ac580
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user