import SUPPORTED_TOOLS from './constants/supportedTools'; import { getIsLocked } from './utils/getIsLocked'; import getSOPInstanceAttributes from './utils/getSOPInstanceAttributes'; import { getIsVisible } from './utils/getIsVisible'; const Length = { toAnnotation: measurement => {}, /** * Maps cornerstone annotation event data to measurement service format. * * @param {Object} cornerstone Cornerstone event data * @return {Measurement} Measurement instance */ toMeasurement: ( csToolsEventDetail, displaySetService, cornerstoneViewportService, getValueTypeFromToolType, customizationService ) => { const { annotation } = csToolsEventDetail; const { metadata, data, annotationUID } = annotation; const isLocked = getIsLocked(annotationUID); const isVisible = getIsVisible(annotationUID); if (!metadata || !data) { console.warn('Length tool: Missing metadata or data'); return null; } const { toolName, referencedImageId, FrameOfReferenceUID } = metadata; const validToolType = SUPPORTED_TOOLS.includes(toolName); if (!validToolType) { throw new Error('Tool not supported'); } const { SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID } = getSOPInstanceAttributes( referencedImageId, displaySetService, annotation ); let displaySet; if (SOPInstanceUID) { displaySet = displaySetService.getDisplaySetForSOPInstanceUID( SOPInstanceUID, SeriesInstanceUID ); } else { displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0]; } const { points, textBox } = data.handles; const mappedAnnotations = getMappedAnnotations(annotation, displaySetService); const displayText = getDisplayText(mappedAnnotations, displaySet); return { uid: annotationUID, SOPInstanceUID, FrameOfReferenceUID, points, textBox, isLocked, isVisible, metadata, referenceSeriesUID: SeriesInstanceUID, referenceStudyUID: StudyInstanceUID, referencedImageId, frameNumber: mappedAnnotations[0]?.frameNumber || 1, toolName: metadata.toolName, displaySetInstanceUID: displaySet.displaySetInstanceUID, label: data.text, displayText: displayText, data: data.cachedStats, type: getValueTypeFromToolType(toolName), getReport: () => { throw new Error('Not implemented'); }, }; }, }; function getMappedAnnotations(annotation, displaySetService) { const { metadata, data } = annotation; const { text } = data; const { referencedImageId } = metadata; const annotations = []; const { SOPInstanceUID, SeriesInstanceUID, frameNumber } = getSOPInstanceAttributes( referencedImageId, displaySetService, annotation ); const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0]; const { SeriesNumber } = displaySet; annotations.push({ SeriesInstanceUID, SOPInstanceUID, SeriesNumber, frameNumber, text, }); return annotations; } function getDisplayText(mappedAnnotations, displaySet) { const displayText = { primary: [], secondary: [], }; if (!mappedAnnotations || !mappedAnnotations.length) { return displayText; } const { SeriesNumber, SOPInstanceUID, frameNumber, text } = mappedAnnotations[0]; const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID); let InstanceNumber; if (instance) { InstanceNumber = instance.InstanceNumber; } const instanceText = InstanceNumber ? ` I: ${InstanceNumber}` : ''; const frameText = displaySet.isMultiFrame ? ` F: ${frameNumber}` : ''; // Add the annotation text to the primary array if (text) { displayText.primary.push(text); } // Add the series information to the secondary array displayText.secondary.push(`S: ${SeriesNumber}${instanceText}${frameText}`); return displayText; } export default Length;