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 | import { Types } from '@cornerstonejs/core';
import { PlanarFreehandROITool } from '../../tools';
import { ToolGroupManager } from '../../store';
import { PlanarFreehandROIAnnotation } from '../../types/ToolSpecificAnnotationTypes';
import interpolateSegmentPoints from './interpolation/interpolateSegmentPoints';
function shouldPreventInterpolation(
enabledElement: Types.IEnabledElement,
annotation: PlanarFreehandROIAnnotation,
knotsRatioPercentage: number
): boolean {
if (!annotation?.data?.polyline || knotsRatioPercentage <= 0) {
return true;
}
if (!enabledElement.viewport) {
return true;
}
const { renderingEngineId, viewportId, FrameOfReferenceUID } = enabledElement;
const toolGroup = ToolGroupManager.getToolGroupForViewport(
viewportId,
renderingEngineId
);
if (annotation.metadata.FrameOfReferenceUID !== FrameOfReferenceUID) {
return true;
}
if (!toolGroup) {
return true;
}
const toolInstance = toolGroup.getToolInstance(annotation.metadata.toolName);
// strategy to prevent non PlanarFreehandTool
if (!(toolInstance instanceof PlanarFreehandROITool)) {
return true;
}
return (
toolInstance.isDrawing ||
toolInstance.isEditingOpen ||
toolInstance.isEditingClosed
);
}
/**
* Interpolates a given annotation from a given enabledElement.
* It mutates annotation param.
* The param knotsRatioPercentage defines the percentage of points to be considered as knots on the interpolation process.
* Interpolation will be skipped in case: annotation is not present in enabledElement (or there is no toolGroup associated with it), related tool is being modified.
*/
export default function interpolateAnnotation(
enabledElement: Types.IEnabledElement,
annotation: PlanarFreehandROIAnnotation,
knotsRatioPercentage: number
): boolean {
// prevent running while there is any tool annotation being modified
if (
shouldPreventInterpolation(enabledElement, annotation, knotsRatioPercentage)
) {
return false;
}
const { viewport } = enabledElement;
// use only 2 dimensions on interpolation (what visually matters),
// otherwise a 3d interpolation might have a totally different output as it consider one more dimension.
const canvasPoints = annotation.data.polyline.map(viewport.worldToCanvas);
const interpolatedCanvasPoints = <Types.Point2[]>(
interpolateSegmentPoints(
canvasPoints,
0,
canvasPoints.length,
knotsRatioPercentage
)
);
if (interpolatedCanvasPoints === canvasPoints) {
return false;
}
annotation.data.polyline = interpolatedCanvasPoints.map(
viewport.canvasToWorld
);
return true;
}
|