Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 1x 13x 13x 13x 13x 13x 21x 13x 13x 13x 13x 13x 54x 88x 54x 33x 21x 21x 33x 33x 33x 36x 21x 21x 21x 13x | import type { InterpolationViewportData, Annotation, ContourSegmentationAnnotation, } from '../../../types'; import { getAnnotations } from '../../../stateManagement/annotation/annotationState'; const DEFAULT_CONTOUR_SEG_TOOLNAME = 'PlanarFreehandContourSegmentationTool'; export type FilterParam = { /** * Selects a parent value from the given annotation to get the comparison values from. * Was originally a key name, but this became too limited to match multiple levels * of selection, so was changed to a function returning the values. */ parentKey?: (annotation) => any; /** * The attribute to extract the value from the parent object, compared with * value to see if the filter matches. */ key: string; /** * The comparison value to compare against. If an array, will compare sub-values. */ value: unknown; }; /** * getInterpolationData - Gets the list of the slice locations of the 2D * polygons that make up the interpolated annotation, along with the annotations * which match the specified filterParams on that slice. * * @param viewportData - the annotation/viewport to start the interpolation from * @param filterParams - A selector for annotations for interpolation * @returns The list of interpolated locations in the stack */ export default function getInterpolationData( viewportData: InterpolationViewportData, filterParams = [] ): Map<number, Annotation[]> { const { viewport, sliceData, annotation } = viewportData; const interpolationDatas = new Map<number, Annotation[]>(); const { toolName, originalToolName } = annotation.metadata; const testToolName = originalToolName || toolName; // Get a copy of the annotations list by filtering it for only // items which are originally the right tool name const annotations = ( (getAnnotations( testToolName, viewport.element ) as ContourSegmentationAnnotation[]) || [] ).filter( (annotation) => !annotation.metadata.originalToolName || annotation.metadata.originalToolName === testToolName ); // Then add the default contour seg tool name which has the testTool name // to the segmentations list. Eif (testToolName !== DEFAULT_CONTOUR_SEG_TOOLNAME) { const modifiedAnnotations = getAnnotations( DEFAULT_CONTOUR_SEG_TOOLNAME, viewport.element ) as ContourSegmentationAnnotation[]; Iif (modifiedAnnotations?.length) { modifiedAnnotations.forEach((annotation) => { const { metadata } = annotation; if ( metadata.originalToolName === testToolName && metadata.originalToolName !== metadata.toolName ) { annotations.push(annotation); } }); } } Iif (!annotations?.length) { return interpolationDatas; } for (let i = 0; i < sliceData.numberOfSlices; i++) { const imageAnnotations = annotations.filter( (x) => x.metadata.sliceIndex === i ); if (!imageAnnotations?.length) { continue; } const filteredInterpolatedAnnotations = imageAnnotations.filter( (imageAnnotation) => { return filterParams.every((x) => { const parent = x.parentKey ? x.parentKey(imageAnnotation) : imageAnnotation; const value = parent?.[x.key]; if (Array.isArray(value)) { return value.every((item, index) => item === x.value[index]); } return value === x.value; }); } ); Eif (filteredInterpolatedAnnotations.length) { interpolationDatas.set(i, filteredInterpolatedAnnotations); } } return interpolationDatas; } |