@cornerstonejs/tools 0.56.2 → 0.56.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -4
- package/src/constants/COLOR_LUT.ts +262 -0
- package/src/constants/index.ts +3 -0
- package/src/cursors/ImageMouseCursor.ts +39 -0
- package/src/cursors/MouseCursor.ts +114 -0
- package/src/cursors/SVGCursorDescriptor.ts +462 -0
- package/src/cursors/SVGMouseCursor.ts +145 -0
- package/src/cursors/elementCursor.ts +69 -0
- package/src/cursors/index.ts +24 -0
- package/src/cursors/setCursorForElement.ts +33 -0
- package/src/drawingSvg/_getHash.ts +9 -0
- package/src/drawingSvg/_setAttributesIfNecessary.ts +13 -0
- package/src/drawingSvg/_setNewAttributesIfValid.ts +10 -0
- package/src/drawingSvg/clearByToolType.ts +26 -0
- package/src/drawingSvg/draw.ts +16 -0
- package/src/drawingSvg/drawArrow.ts +82 -0
- package/src/drawingSvg/drawCircle.ts +62 -0
- package/src/drawingSvg/drawEllipse.ts +71 -0
- package/src/drawingSvg/drawHandles.ts +87 -0
- package/src/drawingSvg/drawLine.ts +70 -0
- package/src/drawingSvg/drawLink.ts +76 -0
- package/src/drawingSvg/drawLinkedTextBox.ts +64 -0
- package/src/drawingSvg/drawPolyline.ts +80 -0
- package/src/drawingSvg/drawRect.ts +70 -0
- package/src/drawingSvg/drawTextBox.ts +213 -0
- package/src/drawingSvg/getSvgDrawingHelper.ts +98 -0
- package/src/drawingSvg/index.ts +23 -0
- package/src/enums/AnnotationStyleStates.ts +22 -0
- package/src/enums/Events.ts +242 -0
- package/src/enums/SegmentationRepresentations.ts +12 -0
- package/src/enums/ToolBindings.ts +37 -0
- package/src/enums/ToolModes.ts +31 -0
- package/src/enums/Touch.ts +8 -0
- package/src/enums/index.js +16 -0
- package/src/eventDispatchers/annotationModifiedEventDispatcher.ts +41 -0
- package/src/eventDispatchers/cameraModifiedEventDispatcher.ts +41 -0
- package/src/eventDispatchers/imageRenderedEventDispatcher.ts +37 -0
- package/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts +50 -0
- package/src/eventDispatchers/index.js +15 -0
- package/src/eventDispatchers/keyboardEventHandlers/index.js +4 -0
- package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +29 -0
- package/src/eventDispatchers/keyboardEventHandlers/keyUp.ts +33 -0
- package/src/eventDispatchers/keyboardToolEventDispatcher.ts +28 -0
- package/src/eventDispatchers/mouseEventHandlers/index.js +19 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseClick.ts +13 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDoubleClick.ts +13 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +196 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDownActivate.ts +35 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDrag.ts +25 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseMove.ts +70 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseUp.ts +9 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseWheel.ts +13 -0
- package/src/eventDispatchers/mouseToolEventDispatcher.ts +64 -0
- package/src/eventDispatchers/shared/customCallbackHandler.ts +73 -0
- package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +58 -0
- package/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts +61 -0
- package/src/eventDispatchers/shared/getActiveToolForTouchEvent.ts +64 -0
- package/src/eventDispatchers/shared/getMouseModifier.ts +30 -0
- package/src/eventDispatchers/shared/getToolsWithModesForMouseEvent.ts +56 -0
- package/src/eventDispatchers/shared/getToolsWithModesForTouchEvent.ts +54 -0
- package/src/eventDispatchers/touchEventHandlers/index.js +15 -0
- package/src/eventDispatchers/touchEventHandlers/touchDrag.ts +23 -0
- package/src/eventDispatchers/touchEventHandlers/touchEnd.ts +9 -0
- package/src/eventDispatchers/touchEventHandlers/touchPress.ts +13 -0
- package/src/eventDispatchers/touchEventHandlers/touchStart.ts +174 -0
- package/src/eventDispatchers/touchEventHandlers/touchStartActivate.ts +36 -0
- package/src/eventDispatchers/touchEventHandlers/touchTap.ts +9 -0
- package/src/eventDispatchers/touchToolEventDispatcher.ts +51 -0
- package/src/eventListeners/annotations/annotationModifiedListener.ts +22 -0
- package/src/eventListeners/annotations/annotationSelectionListener.ts +29 -0
- package/src/eventListeners/annotations/index.ts +4 -0
- package/src/eventListeners/index.ts +28 -0
- package/src/eventListeners/keyboard/index.ts +16 -0
- package/src/eventListeners/keyboard/keyDownListener.ts +99 -0
- package/src/eventListeners/mouse/getMouseEventPoints.ts +66 -0
- package/src/eventListeners/mouse/index.ts +55 -0
- package/src/eventListeners/mouse/mouseDoubleClickListener.ts +55 -0
- package/src/eventListeners/mouse/mouseDownListener.ts +519 -0
- package/src/eventListeners/mouse/mouseMoveListener.ts +33 -0
- package/src/eventListeners/segmentation/index.ts +11 -0
- package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +61 -0
- package/src/eventListeners/segmentation/segmentationModifiedEventListener.ts +32 -0
- package/src/eventListeners/segmentation/segmentationRepresentationModifiedEventListener.ts +15 -0
- package/src/eventListeners/segmentation/segmentationRepresentationRemovedEventListener.ts +16 -0
- package/src/eventListeners/touch/getTouchEventPoints.ts +75 -0
- package/src/eventListeners/touch/index.ts +37 -0
- package/src/eventListeners/touch/preventGhostClick.js +72 -0
- package/src/eventListeners/touch/touchStartListener.ts +499 -0
- package/src/eventListeners/wheel/index.ts +27 -0
- package/src/eventListeners/wheel/normalizeWheel.ts +69 -0
- package/src/eventListeners/wheel/wheelListener.ts +51 -0
- package/src/index.ts +133 -0
- package/src/init.ts +187 -0
- package/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +399 -0
- package/src/stateManagement/annotation/annotationLocking.ts +178 -0
- package/src/stateManagement/annotation/annotationSelection.ts +163 -0
- package/src/stateManagement/annotation/annotationState.ts +180 -0
- package/src/stateManagement/annotation/annotationVisibility.ts +156 -0
- package/src/stateManagement/annotation/config/ToolStyle.ts +265 -0
- package/src/stateManagement/annotation/config/getFont.ts +36 -0
- package/src/stateManagement/annotation/config/getState.ts +26 -0
- package/src/stateManagement/annotation/config/helpers.ts +55 -0
- package/src/stateManagement/annotation/config/index.ts +5 -0
- package/src/stateManagement/annotation/helpers/state.ts +83 -0
- package/src/stateManagement/annotation/index.ts +15 -0
- package/src/stateManagement/index.js +40 -0
- package/src/stateManagement/segmentation/SegmentationStateManager.ts +491 -0
- package/src/stateManagement/segmentation/activeSegmentation.ts +60 -0
- package/src/stateManagement/segmentation/addSegmentationRepresentations.ts +77 -0
- package/src/stateManagement/segmentation/addSegmentations.ts +27 -0
- package/src/stateManagement/segmentation/config/index.ts +29 -0
- package/src/stateManagement/segmentation/config/segmentationColor.ts +132 -0
- package/src/stateManagement/segmentation/config/segmentationConfig.ts +195 -0
- package/src/stateManagement/segmentation/config/segmentationVisibility.ts +171 -0
- package/src/stateManagement/segmentation/helpers/index.ts +3 -0
- package/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +35 -0
- package/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts +41 -0
- package/src/stateManagement/segmentation/index.ts +22 -0
- package/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts +85 -0
- package/src/stateManagement/segmentation/segmentIndex.ts +38 -0
- package/src/stateManagement/segmentation/segmentLocking.ts +72 -0
- package/src/stateManagement/segmentation/segmentationState.ts +429 -0
- package/src/stateManagement/segmentation/triggerSegmentationEvents.ts +157 -0
- package/src/store/SynchronizerManager/Synchronizer.ts +344 -0
- package/src/store/SynchronizerManager/createSynchronizer.ts +41 -0
- package/src/store/SynchronizerManager/destroy.ts +14 -0
- package/src/store/SynchronizerManager/destroySynchronizer.ts +25 -0
- package/src/store/SynchronizerManager/getAllSynchronizers.ts +12 -0
- package/src/store/SynchronizerManager/getSynchronizer.ts +13 -0
- package/src/store/SynchronizerManager/getSynchronizersForViewport.ts +44 -0
- package/src/store/SynchronizerManager/index.js +15 -0
- package/src/store/ToolGroupManager/ToolGroup.ts +679 -0
- package/src/store/ToolGroupManager/createToolGroup.ts +33 -0
- package/src/store/ToolGroupManager/destroy.ts +24 -0
- package/src/store/ToolGroupManager/destroyToolGroup.ts +26 -0
- package/src/store/ToolGroupManager/getAllToolGroups.ts +12 -0
- package/src/store/ToolGroupManager/getToolGroup.ts +14 -0
- package/src/store/ToolGroupManager/getToolGroupForViewport.ts +44 -0
- package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +33 -0
- package/src/store/ToolGroupManager/index.ts +17 -0
- package/src/store/addEnabledElement.ts +137 -0
- package/src/store/addTool.ts +56 -0
- package/src/store/cancelActiveManipulations.ts +30 -0
- package/src/store/filterMoveableAnnotationTools.ts +61 -0
- package/src/store/filterToolsWithAnnotationsForElement.ts +51 -0
- package/src/store/filterToolsWithMoveableHandles.ts +51 -0
- package/src/store/index.ts +29 -0
- package/src/store/removeEnabledElement.ts +132 -0
- package/src/store/state.ts +57 -0
- package/src/store/svgNodeCache.ts +7 -0
- package/src/synchronizers/callbacks/areViewportsCoplanar .ts +12 -0
- package/src/synchronizers/callbacks/cameraSyncCallback.ts +33 -0
- package/src/synchronizers/callbacks/stackImageSyncCallback.ts +157 -0
- package/src/synchronizers/callbacks/voiSyncCallback.ts +51 -0
- package/src/synchronizers/callbacks/zoomPanSyncCallback.ts +43 -0
- package/src/synchronizers/index.ts +11 -0
- package/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/createStackImageSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/createVOISynchronizer.ts +24 -0
- package/src/synchronizers/synchronizers/createZoomPanSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/index.ts +11 -0
- package/src/tools/CrosshairsTool.ts +2693 -0
- package/src/tools/MIPJumpToClickTool.ts +99 -0
- package/src/tools/MagnifyTool.ts +319 -0
- package/src/tools/PanTool.ts +58 -0
- package/src/tools/PlanarRotateTool.ts +77 -0
- package/src/tools/ReferenceCursors.ts +466 -0
- package/src/tools/ReferenceLinesTool.ts +279 -0
- package/src/tools/ScaleOverlayTool.ts +685 -0
- package/src/tools/StackScrollTool.ts +97 -0
- package/src/tools/StackScrollToolMouseWheelTool.ts +58 -0
- package/src/tools/TrackballRotateTool.ts +141 -0
- package/src/tools/VolumeRotateMouseWheelTool.ts +86 -0
- package/src/tools/WindowLevelTool.ts +260 -0
- package/src/tools/ZoomTool.ts +293 -0
- package/src/tools/annotation/AngleTool.ts +835 -0
- package/src/tools/annotation/ArrowAnnotateTool.ts +820 -0
- package/src/tools/annotation/BidirectionalTool.ts +1350 -0
- package/src/tools/annotation/CircleROITool.ts +1070 -0
- package/src/tools/annotation/CobbAngleTool.ts +815 -0
- package/src/tools/annotation/DragProbeTool.ts +213 -0
- package/src/tools/annotation/EllipticalROITool.ts +1223 -0
- package/src/tools/annotation/LengthTool.ts +861 -0
- package/src/tools/annotation/PlanarFreehandROITool.ts +636 -0
- package/src/tools/annotation/ProbeTool.ts +681 -0
- package/src/tools/annotation/RectangleROITool.ts +1028 -0
- package/src/tools/annotation/planarFreehandROITool/closedContourEditLoop.ts +488 -0
- package/src/tools/annotation/planarFreehandROITool/drawLoop.ts +462 -0
- package/src/tools/annotation/planarFreehandROITool/editLoopCommon.ts +331 -0
- package/src/tools/annotation/planarFreehandROITool/findOpenUShapedContourVectorToPeak.ts +74 -0
- package/src/tools/annotation/planarFreehandROITool/openContourEditLoop.ts +612 -0
- package/src/tools/annotation/planarFreehandROITool/openContourEndEditLoop.ts +74 -0
- package/src/tools/annotation/planarFreehandROITool/renderMethods.ts +407 -0
- package/src/tools/base/AnnotationDisplayTool.ts +228 -0
- package/src/tools/base/AnnotationTool.ts +307 -0
- package/src/tools/base/BaseTool.ts +215 -0
- package/src/tools/base/index.ts +4 -0
- package/src/tools/displayTools/Contour/addContourToElement.ts +135 -0
- package/src/tools/displayTools/Contour/contourDisplay.ts +252 -0
- package/src/tools/displayTools/Contour/index.ts +3 -0
- package/src/tools/displayTools/Contour/removeContourFromElement.ts +35 -0
- package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +57 -0
- package/src/tools/displayTools/Labelmap/index.ts +4 -0
- package/src/tools/displayTools/Labelmap/labelmapConfig.ts +37 -0
- package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +461 -0
- package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +27 -0
- package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +30 -0
- package/src/tools/displayTools/SegmentationDisplayTool.ts +198 -0
- package/src/tools/index.ts +84 -0
- package/src/tools/segmentation/BrushTool.ts +474 -0
- package/src/tools/segmentation/CircleScissorsTool.ts +365 -0
- package/src/tools/segmentation/PaintFillTool.ts +370 -0
- package/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts +471 -0
- package/src/tools/segmentation/RectangleROIThresholdTool.ts +281 -0
- package/src/tools/segmentation/RectangleScissorsTool.ts +382 -0
- package/src/tools/segmentation/SphereScissorsTool.ts +368 -0
- package/src/tools/segmentation/strategies/eraseCircle.ts +30 -0
- package/src/tools/segmentation/strategies/eraseRectangle.ts +81 -0
- package/src/tools/segmentation/strategies/eraseSphere.ts +27 -0
- package/src/tools/segmentation/strategies/fillCircle.ts +185 -0
- package/src/tools/segmentation/strategies/fillRectangle.ts +110 -0
- package/src/tools/segmentation/strategies/fillSphere.ts +88 -0
- package/src/tools/segmentation/strategies/index.ts +9 -0
- package/src/types/AnnotationGroupSelector.ts +7 -0
- package/src/types/AnnotationStyle.ts +42 -0
- package/src/types/AnnotationTypes.ts +109 -0
- package/src/types/BoundsIJK.ts +5 -0
- package/src/types/CINETypes.ts +32 -0
- package/src/types/ContourTypes.ts +26 -0
- package/src/types/CursorTypes.ts +12 -0
- package/src/types/EventTypes.ts +657 -0
- package/src/types/FloodFillTypes.ts +19 -0
- package/src/types/IAnnotationManager.ts +89 -0
- package/src/types/IDistance.ts +16 -0
- package/src/types/IPoints.ts +18 -0
- package/src/types/ISetToolModeOptions.ts +29 -0
- package/src/types/ISynchronizerEventHandler.ts +11 -0
- package/src/types/IToolClassReference.ts +5 -0
- package/src/types/IToolGroup.ts +72 -0
- package/src/types/ITouchPoints.ts +14 -0
- package/src/types/InteractionTypes.ts +6 -0
- package/src/types/InternalToolTypes.ts +19 -0
- package/src/types/JumpToSliceOptions.ts +7 -0
- package/src/types/LabelmapTypes.ts +41 -0
- package/src/types/PlanarBoundingBox.ts +8 -0
- package/src/types/SVGDrawingHelper.ts +10 -0
- package/src/types/ScrollOptions.ts +9 -0
- package/src/types/SegmentationStateTypes.ts +248 -0
- package/src/types/ToolHandle.ts +26 -0
- package/src/types/ToolProps.ts +16 -0
- package/src/types/ToolSpecificAnnotationTypes.ts +311 -0
- package/src/types/index.ts +115 -0
- package/src/utilities/boundingBox/extend2DBoundingBoxInViewAxis.ts +29 -0
- package/src/utilities/boundingBox/getBoundingBoxAroundShape.ts +57 -0
- package/src/utilities/boundingBox/index.ts +4 -0
- package/src/utilities/calibrateImageSpacing.ts +46 -0
- package/src/utilities/cine/events.ts +9 -0
- package/src/utilities/cine/index.ts +5 -0
- package/src/utilities/cine/playClip.ts +435 -0
- package/src/utilities/cine/state.ts +18 -0
- package/src/utilities/clip.js +30 -0
- package/src/utilities/debounce.js +217 -0
- package/src/utilities/drawing/getTextBoxCoordsCanvas.ts +45 -0
- package/src/utilities/drawing/index.ts +3 -0
- package/src/utilities/dynamicVolume/getDataInTime.ts +110 -0
- package/src/utilities/dynamicVolume/index.ts +2 -0
- package/src/utilities/getAnnotationNearPoint.ts +130 -0
- package/src/utilities/getModalityUnit.ts +11 -0
- package/src/utilities/getToolsWithModesForElement.ts +52 -0
- package/src/utilities/index.ts +68 -0
- package/src/utilities/isObject.js +29 -0
- package/src/utilities/math/angle/angleBetweenLines.ts +29 -0
- package/src/utilities/math/circle/_types.ts +6 -0
- package/src/utilities/math/circle/getCanvasCircleCorners.ts +23 -0
- package/src/utilities/math/circle/getCanvasCircleRadius.ts +16 -0
- package/src/utilities/math/circle/index.ts +4 -0
- package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +26 -0
- package/src/utilities/math/ellipse/index.ts +4 -0
- package/src/utilities/math/ellipse/pointInEllipse.ts +38 -0
- package/src/utilities/math/ellipse/pointInEllipsoidWithConstraint.ts +35 -0
- package/src/utilities/math/index.ts +8 -0
- package/src/utilities/math/line/distanceToPoint.ts +24 -0
- package/src/utilities/math/line/distanceToPointSquared.ts +44 -0
- package/src/utilities/math/line/index.ts +5 -0
- package/src/utilities/math/line/intersectLine.ts +92 -0
- package/src/utilities/math/midPoint.ts +24 -0
- package/src/utilities/math/point/distanceToPoint.ts +22 -0
- package/src/utilities/math/point/index.ts +3 -0
- package/src/utilities/math/polyline/addCanvasPointsToArray.ts +62 -0
- package/src/utilities/math/polyline/calculateAreaOfPoints.ts +23 -0
- package/src/utilities/math/polyline/getIntersectionWithPolyline.ts +182 -0
- package/src/utilities/math/polyline/getSubPixelSpacingAndXYDirections.ts +99 -0
- package/src/utilities/math/polyline/index.ts +19 -0
- package/src/utilities/math/polyline/planarFreehandROIInternalTypes.ts +36 -0
- package/src/utilities/math/polyline/pointCanProjectOnLine.ts +57 -0
- package/src/utilities/math/polyline/pointsAreWithinCloseContourProximity.ts +15 -0
- package/src/utilities/math/rectangle/distanceToPoint.ts +82 -0
- package/src/utilities/math/rectangle/index.ts +3 -0
- package/src/utilities/math/sphere/index.ts +3 -0
- package/src/utilities/math/sphere/pointInSphere.ts +31 -0
- package/src/utilities/math/vec2/findClosestPoint.ts +40 -0
- package/src/utilities/math/vec2/index.ts +4 -0
- package/src/utilities/math/vec2/liangBarksyClip.ts +84 -0
- package/src/utilities/orientation/getOrientationStringLPS.ts +52 -0
- package/src/utilities/orientation/index.ts +4 -0
- package/src/utilities/orientation/invertOrientationStringLPS.ts +21 -0
- package/src/utilities/planar/filterAnnotationsForDisplay.ts +68 -0
- package/src/utilities/planar/filterAnnotationsWithinSlice.ts +85 -0
- package/src/utilities/planar/getPointInLineOfSightWithCriteria.ts +104 -0
- package/src/utilities/planar/getWorldWidthAndHeightFromCorners.ts +51 -0
- package/src/utilities/planar/getWorldWidthAndHeightFromTwoPoints.ts +51 -0
- package/src/utilities/planar/index.ts +18 -0
- package/src/utilities/planarFreehandROITool/index.ts +7 -0
- package/src/utilities/planarFreehandROITool/interpolateAnnotation.ts +87 -0
- package/src/utilities/planarFreehandROITool/interpolatePoints.ts +214 -0
- package/src/utilities/planarFreehandROITool/interpolation/algorithms/bspline.ts +55 -0
- package/src/utilities/planarFreehandROITool/interpolation/interpolateSegmentPoints.ts +90 -0
- package/src/utilities/pointInShapeCallback.ts +138 -0
- package/src/utilities/pointInSurroundingSphereCallback.ts +188 -0
- package/src/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.ts +76 -0
- package/src/utilities/rectangleROITool/index.ts +3 -0
- package/src/utilities/scroll.ts +62 -0
- package/src/utilities/segmentation/brushSizeForToolGroup.ts +72 -0
- package/src/utilities/segmentation/brushThresholdForToolGroup.ts +65 -0
- package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +74 -0
- package/src/utilities/segmentation/createMergedLabelmapForIndex.ts +65 -0
- package/src/utilities/segmentation/floodFill.ts +194 -0
- package/src/utilities/segmentation/getDefaultRepresentationConfig.ts +20 -0
- package/src/utilities/segmentation/index.ts +33 -0
- package/src/utilities/segmentation/isValidRepresentationConfig.ts +22 -0
- package/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts +91 -0
- package/src/utilities/segmentation/thresholdSegmentationByRange.ts +129 -0
- package/src/utilities/segmentation/thresholdVolumeByRange.ts +150 -0
- package/src/utilities/segmentation/triggerSegmentationRender.ts +206 -0
- package/src/utilities/segmentation/utilities.ts +116 -0
- package/src/utilities/stackPrefetch/index.ts +8 -0
- package/src/utilities/stackPrefetch/stackPrefetch.ts +405 -0
- package/src/utilities/stackPrefetch/state.ts +17 -0
- package/src/utilities/throttle.js +69 -0
- package/src/utilities/touch/index.ts +246 -0
- package/src/utilities/triggerAnnotationRender.ts +237 -0
- package/src/utilities/triggerAnnotationRenderForViewportIds.ts +18 -0
- package/src/utilities/viewport/index.ts +5 -0
- package/src/utilities/viewport/isViewportPreScaled.ts +24 -0
- package/src/utilities/viewport/jumpToSlice.ts +73 -0
- package/src/utilities/viewport/jumpToWorld.ts +58 -0
- package/src/utilities/viewportFilters/filterViewportsWithFrameOfReferenceUID.ts +28 -0
- package/src/utilities/viewportFilters/filterViewportsWithParallelNormals.ts +26 -0
- package/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts +15 -0
- package/src/utilities/viewportFilters/filterViewportsWithToolEnabled.ts +72 -0
- package/src/utilities/viewportFilters/getViewportIdsWithToolToRender.ts +45 -0
- package/src/utilities/viewportFilters/index.ts +11 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { getEnabledElement } from '@cornerstonejs/core';
|
|
2
|
+
import type { Types } from '@cornerstonejs/core';
|
|
3
|
+
import { state } from '../../../store';
|
|
4
|
+
import { Events } from '../../../enums';
|
|
5
|
+
import {
|
|
6
|
+
resetElementCursor,
|
|
7
|
+
hideElementCursor,
|
|
8
|
+
} from '../../../cursors/elementCursor';
|
|
9
|
+
import { EventTypes } from '../../../types';
|
|
10
|
+
import { polyline } from '../../../utilities/math';
|
|
11
|
+
import { vec3, vec2 } from 'gl-matrix';
|
|
12
|
+
import { PlanarFreehandROIAnnotation } from '../../../types/ToolSpecificAnnotationTypes';
|
|
13
|
+
import {
|
|
14
|
+
getInterpolatedPoints,
|
|
15
|
+
shouldInterpolate,
|
|
16
|
+
} from '../../../utilities/planarFreehandROITool/interpolatePoints';
|
|
17
|
+
import triggerAnnotationRenderForViewportIds from '../../../utilities/triggerAnnotationRenderForViewportIds';
|
|
18
|
+
|
|
19
|
+
const {
|
|
20
|
+
getSubPixelSpacingAndXYDirections,
|
|
21
|
+
addCanvasPointsToArray,
|
|
22
|
+
calculateAreaOfPoints,
|
|
23
|
+
} = polyline;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Activates the closed contour edit event loop.
|
|
27
|
+
*/
|
|
28
|
+
function activateClosedContourEdit(
|
|
29
|
+
evt: EventTypes.InteractionEventType,
|
|
30
|
+
annotation: PlanarFreehandROIAnnotation,
|
|
31
|
+
viewportIdsToRender: string[]
|
|
32
|
+
): void {
|
|
33
|
+
this.isEditingClosed = true;
|
|
34
|
+
|
|
35
|
+
const eventDetail = evt.detail;
|
|
36
|
+
const { currentPoints, element } = eventDetail;
|
|
37
|
+
const canvasPos = currentPoints.canvas;
|
|
38
|
+
const enabledElement = getEnabledElement(element);
|
|
39
|
+
const { viewport } = enabledElement;
|
|
40
|
+
|
|
41
|
+
const prevCanvasPoints = annotation.data.polyline.map(viewport.worldToCanvas);
|
|
42
|
+
|
|
43
|
+
const { spacing, xDir, yDir } = getSubPixelSpacingAndXYDirections(
|
|
44
|
+
viewport,
|
|
45
|
+
this.configuration.subPixelResolution
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
this.editData = {
|
|
49
|
+
prevCanvasPoints,
|
|
50
|
+
editCanvasPoints: [canvasPos],
|
|
51
|
+
startCrossingIndex: undefined,
|
|
52
|
+
editIndex: 0,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
this.commonData = {
|
|
56
|
+
annotation,
|
|
57
|
+
viewportIdsToRender,
|
|
58
|
+
spacing,
|
|
59
|
+
xDir,
|
|
60
|
+
yDir,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
state.isInteractingWithTool = true;
|
|
64
|
+
|
|
65
|
+
element.addEventListener(
|
|
66
|
+
Events.MOUSE_UP,
|
|
67
|
+
this.mouseUpClosedContourEditCallback
|
|
68
|
+
);
|
|
69
|
+
element.addEventListener(
|
|
70
|
+
Events.MOUSE_DRAG,
|
|
71
|
+
this.mouseDragClosedContourEditCallback
|
|
72
|
+
);
|
|
73
|
+
element.addEventListener(
|
|
74
|
+
Events.MOUSE_CLICK,
|
|
75
|
+
this.mouseUpClosedContourEditCallback
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
element.addEventListener(
|
|
79
|
+
Events.TOUCH_END,
|
|
80
|
+
this.mouseUpClosedContourEditCallback
|
|
81
|
+
);
|
|
82
|
+
element.addEventListener(
|
|
83
|
+
Events.TOUCH_DRAG,
|
|
84
|
+
this.mouseDragClosedContourEditCallback
|
|
85
|
+
);
|
|
86
|
+
element.addEventListener(
|
|
87
|
+
Events.TOUCH_TAP,
|
|
88
|
+
this.mouseUpClosedContourEditCallback
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
hideElementCursor(element);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Dectivates and cleans up the closed contour edit event loop.
|
|
96
|
+
*/
|
|
97
|
+
function deactivateClosedContourEdit(element: HTMLDivElement): void {
|
|
98
|
+
state.isInteractingWithTool = false;
|
|
99
|
+
|
|
100
|
+
element.removeEventListener(
|
|
101
|
+
Events.MOUSE_UP,
|
|
102
|
+
this.mouseUpClosedContourEditCallback
|
|
103
|
+
);
|
|
104
|
+
element.removeEventListener(
|
|
105
|
+
Events.MOUSE_DRAG,
|
|
106
|
+
this.mouseDragClosedContourEditCallback
|
|
107
|
+
);
|
|
108
|
+
element.removeEventListener(
|
|
109
|
+
Events.MOUSE_CLICK,
|
|
110
|
+
this.mouseUpClosedContourEditCallback
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
element.removeEventListener(
|
|
114
|
+
Events.TOUCH_END,
|
|
115
|
+
this.mouseUpClosedContourEditCallback
|
|
116
|
+
);
|
|
117
|
+
element.removeEventListener(
|
|
118
|
+
Events.TOUCH_DRAG,
|
|
119
|
+
this.mouseDragClosedContourEditCallback
|
|
120
|
+
);
|
|
121
|
+
element.removeEventListener(
|
|
122
|
+
Events.TOUCH_TAP,
|
|
123
|
+
this.mouseUpClosedContourEditCallback
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
resetElementCursor(element);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Adds points to the edit line and calculates the preview of the edit to render.
|
|
131
|
+
* Checks if an edit needs to be completed by crossing of lines, or by editing in
|
|
132
|
+
* a way that requires a new edit to keep the contour a simple polygon.
|
|
133
|
+
*/
|
|
134
|
+
function mouseDragClosedContourEditCallback(
|
|
135
|
+
evt: EventTypes.InteractionEventType
|
|
136
|
+
): Types.Point2[] {
|
|
137
|
+
const eventDetail = evt.detail;
|
|
138
|
+
const { currentPoints, element } = eventDetail;
|
|
139
|
+
const worldPos = currentPoints.world;
|
|
140
|
+
const canvasPos = currentPoints.canvas;
|
|
141
|
+
const enabledElement = getEnabledElement(element);
|
|
142
|
+
const { renderingEngine, viewport } = enabledElement;
|
|
143
|
+
|
|
144
|
+
const { viewportIdsToRender, xDir, yDir, spacing } = this.commonData;
|
|
145
|
+
const { editIndex, editCanvasPoints, startCrossingIndex } = this.editData;
|
|
146
|
+
|
|
147
|
+
const lastCanvasPoint = editCanvasPoints[editCanvasPoints.length - 1];
|
|
148
|
+
const lastWorldPoint = viewport.canvasToWorld(lastCanvasPoint);
|
|
149
|
+
|
|
150
|
+
const worldPosDiff = vec3.create();
|
|
151
|
+
|
|
152
|
+
vec3.subtract(worldPosDiff, worldPos, lastWorldPoint);
|
|
153
|
+
|
|
154
|
+
const xDist = Math.abs(vec3.dot(worldPosDiff, xDir));
|
|
155
|
+
const yDist = Math.abs(vec3.dot(worldPosDiff, yDir));
|
|
156
|
+
|
|
157
|
+
// Check that we have moved at least one voxel in each direction.
|
|
158
|
+
if (xDist <= spacing[0] && yDist <= spacing[1]) {
|
|
159
|
+
// Haven't changed world point enough, don't render
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (startCrossingIndex !== undefined) {
|
|
164
|
+
// Edge case: If the edit line itself crosses, remove part of that edit line so we don't
|
|
165
|
+
// Get isolated regions.
|
|
166
|
+
this.checkAndRemoveCrossesOnEditLine(evt);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const numPointsAdded = addCanvasPointsToArray(
|
|
170
|
+
element,
|
|
171
|
+
editCanvasPoints,
|
|
172
|
+
canvasPos,
|
|
173
|
+
this.commonData
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
const currentEditIndex = editIndex + numPointsAdded;
|
|
177
|
+
|
|
178
|
+
this.editData.editIndex = currentEditIndex;
|
|
179
|
+
|
|
180
|
+
if (startCrossingIndex === undefined && editCanvasPoints.length > 1) {
|
|
181
|
+
// If we haven't found the index of the first crossing yet,
|
|
182
|
+
// see if we can find it.
|
|
183
|
+
this.checkForFirstCrossing(evt, true);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
this.editData.snapIndex = this.findSnapIndex();
|
|
187
|
+
|
|
188
|
+
if (this.editData.snapIndex === -1) {
|
|
189
|
+
// No point on the prevCanvasPoints for the editCanvasPoints line to
|
|
190
|
+
// snap to. Apply edit, and start a new edit as we've gone back on ourselves.
|
|
191
|
+
this.finishEditAndStartNewEdit(evt);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
this.editData.fusedCanvasPoints = this.fuseEditPointsWithClosedContour(evt);
|
|
196
|
+
|
|
197
|
+
if (
|
|
198
|
+
startCrossingIndex !== undefined &&
|
|
199
|
+
this.checkForSecondCrossing(evt, true)
|
|
200
|
+
) {
|
|
201
|
+
// Crossed a second time, apply edit, and start a new edit from the crossing.
|
|
202
|
+
this.removePointsAfterSecondCrossing(true);
|
|
203
|
+
this.finishEditAndStartNewEdit(evt);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Finish the current edit, and start a new one.
|
|
211
|
+
*/
|
|
212
|
+
function finishEditAndStartNewEdit(evt: EventTypes.InteractionEventType): void {
|
|
213
|
+
const eventDetail = evt.detail;
|
|
214
|
+
const { element } = eventDetail;
|
|
215
|
+
const enabledElement = getEnabledElement(element);
|
|
216
|
+
const { viewport, renderingEngine } = enabledElement;
|
|
217
|
+
|
|
218
|
+
const { annotation, viewportIdsToRender } = this.commonData;
|
|
219
|
+
const { fusedCanvasPoints, editCanvasPoints } = this.editData;
|
|
220
|
+
|
|
221
|
+
const worldPoints = fusedCanvasPoints.map((canvasPoint) =>
|
|
222
|
+
viewport.canvasToWorld(canvasPoint)
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
annotation.data.polyline = worldPoints;
|
|
226
|
+
annotation.data.isOpenContour = false;
|
|
227
|
+
|
|
228
|
+
this.triggerAnnotationModified(annotation, enabledElement);
|
|
229
|
+
|
|
230
|
+
const lastEditCanvasPoint = editCanvasPoints.pop();
|
|
231
|
+
|
|
232
|
+
this.editData = {
|
|
233
|
+
prevCanvasPoints: fusedCanvasPoints,
|
|
234
|
+
editCanvasPoints: [lastEditCanvasPoint],
|
|
235
|
+
startCrossingIndex: undefined,
|
|
236
|
+
editIndex: 0,
|
|
237
|
+
snapIndex: undefined,
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* This method combines the contour before editing (prevCanvasPoints) with
|
|
245
|
+
* the current edit (editCanvasPoints), to produce a renderable preview of the
|
|
246
|
+
* edit. Upon finishing the contour, the preview generated here is written back
|
|
247
|
+
* into the contour state.
|
|
248
|
+
*
|
|
249
|
+
* @privateRemarks In this method we combine a few tricks to find the optimal
|
|
250
|
+
* contour:
|
|
251
|
+
* - As the contour is closed, our edit might stradle the boundary between the
|
|
252
|
+
* last and 0th point of the contour, e.g. a small edit might go from e.g. index
|
|
253
|
+
* 960 to index 4. We therefore calculate two possible contours, and find the
|
|
254
|
+
* one with the biggest area, which will define the actual edit the user desired.
|
|
255
|
+
* - As the contour and the edit can be drawn with different chiralities, we find if
|
|
256
|
+
* the edit line aligns better with the intended cross points in its current order
|
|
257
|
+
* or reversed. We do this by minimising the distance between its ends and the
|
|
258
|
+
* intended crossing points.
|
|
259
|
+
*/
|
|
260
|
+
function fuseEditPointsWithClosedContour(
|
|
261
|
+
evt: EventTypes.InteractionEventType
|
|
262
|
+
): Types.Point2[] {
|
|
263
|
+
const { prevCanvasPoints, editCanvasPoints, startCrossingIndex, snapIndex } =
|
|
264
|
+
this.editData;
|
|
265
|
+
|
|
266
|
+
if (startCrossingIndex === undefined || snapIndex === undefined) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const eventDetail = evt.detail;
|
|
271
|
+
const { element } = eventDetail;
|
|
272
|
+
|
|
273
|
+
// Augment the editCanvasPoints array, between the end of edit and the snap index.
|
|
274
|
+
const augmentedEditCanvasPoints = [...editCanvasPoints];
|
|
275
|
+
|
|
276
|
+
addCanvasPointsToArray(
|
|
277
|
+
element,
|
|
278
|
+
augmentedEditCanvasPoints,
|
|
279
|
+
prevCanvasPoints[snapIndex],
|
|
280
|
+
this.commonData
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
if (augmentedEditCanvasPoints.length > editCanvasPoints.length) {
|
|
284
|
+
// If any points added, remove the last point, which will be a clone of the snapIndex
|
|
285
|
+
augmentedEditCanvasPoints.pop();
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Calculate the distances between the first and last edit points and the origin of the
|
|
289
|
+
// Contour with the snap point. These will be used to see which way around the edit array should be
|
|
290
|
+
// Placed within the preview.
|
|
291
|
+
let lowIndex;
|
|
292
|
+
let highIndex;
|
|
293
|
+
|
|
294
|
+
if (startCrossingIndex > snapIndex) {
|
|
295
|
+
lowIndex = snapIndex;
|
|
296
|
+
highIndex = startCrossingIndex;
|
|
297
|
+
} else {
|
|
298
|
+
lowIndex = startCrossingIndex;
|
|
299
|
+
highIndex = snapIndex;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const distanceBetweenLowAndFirstPoint = vec2.distance(
|
|
303
|
+
prevCanvasPoints[lowIndex],
|
|
304
|
+
augmentedEditCanvasPoints[0]
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
const distanceBetweenLowAndLastPoint = vec2.distance(
|
|
308
|
+
prevCanvasPoints[lowIndex],
|
|
309
|
+
augmentedEditCanvasPoints[augmentedEditCanvasPoints.length - 1]
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
const distanceBetweenHighAndFirstPoint = vec2.distance(
|
|
313
|
+
prevCanvasPoints[highIndex],
|
|
314
|
+
augmentedEditCanvasPoints[0]
|
|
315
|
+
);
|
|
316
|
+
|
|
317
|
+
const distanceBetweenHighAndLastPoint = vec2.distance(
|
|
318
|
+
prevCanvasPoints[highIndex],
|
|
319
|
+
augmentedEditCanvasPoints[augmentedEditCanvasPoints.length - 1]
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
// Generate two possible contours that could be intepreted from the edit:
|
|
323
|
+
//
|
|
324
|
+
// pointSet1 => 0 -> low -> edit -> high - max.
|
|
325
|
+
// pointSet2 => low -> high -> edit
|
|
326
|
+
//
|
|
327
|
+
// Depending on the placement of the edit and the origin, either of these could be the intended edit.
|
|
328
|
+
// We'll choose the one with the largest area, as edits are considered to be changes to the original area with
|
|
329
|
+
// A relative change of much less than unity.
|
|
330
|
+
|
|
331
|
+
// Point Set 1
|
|
332
|
+
const pointSet1 = [];
|
|
333
|
+
|
|
334
|
+
// Add points from the orignal contour origin up to the low index.
|
|
335
|
+
for (let i = 0; i < lowIndex; i++) {
|
|
336
|
+
const canvasPoint = prevCanvasPoints[i];
|
|
337
|
+
|
|
338
|
+
pointSet1.push([canvasPoint[0], canvasPoint[1]]);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Check which orientation of the edit line minimizes the distance between the
|
|
342
|
+
// origial contour low/high points and the start/end nodes of the edit line.
|
|
343
|
+
|
|
344
|
+
let inPlaceDistance =
|
|
345
|
+
distanceBetweenLowAndFirstPoint + distanceBetweenHighAndLastPoint;
|
|
346
|
+
|
|
347
|
+
let reverseDistance =
|
|
348
|
+
distanceBetweenLowAndLastPoint + distanceBetweenHighAndFirstPoint;
|
|
349
|
+
|
|
350
|
+
if (inPlaceDistance < reverseDistance) {
|
|
351
|
+
for (let i = 0; i < augmentedEditCanvasPoints.length; i++) {
|
|
352
|
+
const canvasPoint = augmentedEditCanvasPoints[i];
|
|
353
|
+
|
|
354
|
+
pointSet1.push([canvasPoint[0], canvasPoint[1]]);
|
|
355
|
+
}
|
|
356
|
+
} else {
|
|
357
|
+
for (let i = augmentedEditCanvasPoints.length - 1; i >= 0; i--) {
|
|
358
|
+
const canvasPoint = augmentedEditCanvasPoints[i];
|
|
359
|
+
|
|
360
|
+
pointSet1.push([canvasPoint[0], canvasPoint[1]]);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Add points from the orignal contour's high index up to to its end point.
|
|
365
|
+
for (let i = highIndex; i < prevCanvasPoints.length; i++) {
|
|
366
|
+
const canvasPoint = prevCanvasPoints[i];
|
|
367
|
+
|
|
368
|
+
pointSet1.push([canvasPoint[0], canvasPoint[1]]);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Point Set 2
|
|
372
|
+
const pointSet2 = [];
|
|
373
|
+
|
|
374
|
+
for (let i = lowIndex; i < highIndex; i++) {
|
|
375
|
+
const canvasPoint = prevCanvasPoints[i];
|
|
376
|
+
|
|
377
|
+
pointSet2.push([canvasPoint[0], canvasPoint[1]]);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
inPlaceDistance =
|
|
381
|
+
distanceBetweenHighAndFirstPoint + distanceBetweenLowAndLastPoint;
|
|
382
|
+
|
|
383
|
+
reverseDistance =
|
|
384
|
+
distanceBetweenHighAndLastPoint + distanceBetweenLowAndFirstPoint;
|
|
385
|
+
|
|
386
|
+
if (inPlaceDistance < reverseDistance) {
|
|
387
|
+
for (let i = 0; i < augmentedEditCanvasPoints.length; i++) {
|
|
388
|
+
const canvasPoint = augmentedEditCanvasPoints[i];
|
|
389
|
+
|
|
390
|
+
pointSet2.push([canvasPoint[0], canvasPoint[1]]);
|
|
391
|
+
}
|
|
392
|
+
} else {
|
|
393
|
+
for (let i = augmentedEditCanvasPoints.length - 1; i >= 0; i--) {
|
|
394
|
+
const canvasPoint = augmentedEditCanvasPoints[i];
|
|
395
|
+
|
|
396
|
+
pointSet2.push([canvasPoint[0], canvasPoint[1]]);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const areaPointSet1 = calculateAreaOfPoints(pointSet1);
|
|
401
|
+
const areaPointSet2 = calculateAreaOfPoints(pointSet2);
|
|
402
|
+
|
|
403
|
+
const pointsToRender: Types.Point2[] =
|
|
404
|
+
areaPointSet1 > areaPointSet2 ? pointSet1 : pointSet2;
|
|
405
|
+
|
|
406
|
+
return pointsToRender;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Completes the edit of the closed contour when the mouse button is released.
|
|
411
|
+
*/
|
|
412
|
+
function mouseUpClosedContourEditCallback(
|
|
413
|
+
evt: EventTypes.InteractionEventType
|
|
414
|
+
): void {
|
|
415
|
+
const eventDetail = evt.detail;
|
|
416
|
+
const { element } = eventDetail;
|
|
417
|
+
|
|
418
|
+
this.completeClosedContourEdit(element);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Completes the edit of the closed contour when the mouse button is released.
|
|
423
|
+
*/
|
|
424
|
+
function completeClosedContourEdit(element: HTMLDivElement) {
|
|
425
|
+
const enabledElement = getEnabledElement(element);
|
|
426
|
+
const { viewport, renderingEngine } = enabledElement;
|
|
427
|
+
|
|
428
|
+
const { annotation, viewportIdsToRender } = this.commonData;
|
|
429
|
+
const { fusedCanvasPoints, prevCanvasPoints } = this.editData;
|
|
430
|
+
|
|
431
|
+
if (fusedCanvasPoints) {
|
|
432
|
+
const updatedPoints = shouldInterpolate(this.configuration)
|
|
433
|
+
? getInterpolatedPoints(
|
|
434
|
+
this.configuration,
|
|
435
|
+
fusedCanvasPoints,
|
|
436
|
+
prevCanvasPoints
|
|
437
|
+
)
|
|
438
|
+
: fusedCanvasPoints;
|
|
439
|
+
|
|
440
|
+
const worldPoints = updatedPoints.map((canvasPoint) =>
|
|
441
|
+
viewport.canvasToWorld(canvasPoint)
|
|
442
|
+
);
|
|
443
|
+
annotation.data.polyline = worldPoints;
|
|
444
|
+
annotation.data.isOpenContour = false;
|
|
445
|
+
|
|
446
|
+
this.triggerAnnotationModified(annotation, enabledElement);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
this.isEditingClosed = false;
|
|
450
|
+
this.editData = undefined;
|
|
451
|
+
this.commonData = undefined;
|
|
452
|
+
|
|
453
|
+
triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
|
|
454
|
+
|
|
455
|
+
this.deactivateClosedContourEdit(element);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Completes the edit on a cancel method call during the closed
|
|
460
|
+
* contour edit loop.
|
|
461
|
+
*/
|
|
462
|
+
function cancelClosedContourEdit(element: HTMLDivElement) {
|
|
463
|
+
this.completeClosedContourEdit(element);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Registers the closed contour edit loop to the tool instance.
|
|
468
|
+
*/
|
|
469
|
+
function registerClosedContourEditLoop(toolInstance): void {
|
|
470
|
+
toolInstance.activateClosedContourEdit =
|
|
471
|
+
activateClosedContourEdit.bind(toolInstance);
|
|
472
|
+
toolInstance.deactivateClosedContourEdit =
|
|
473
|
+
deactivateClosedContourEdit.bind(toolInstance);
|
|
474
|
+
toolInstance.mouseDragClosedContourEditCallback =
|
|
475
|
+
mouseDragClosedContourEditCallback.bind(toolInstance);
|
|
476
|
+
toolInstance.mouseUpClosedContourEditCallback =
|
|
477
|
+
mouseUpClosedContourEditCallback.bind(toolInstance);
|
|
478
|
+
toolInstance.finishEditAndStartNewEdit =
|
|
479
|
+
finishEditAndStartNewEdit.bind(toolInstance);
|
|
480
|
+
toolInstance.fuseEditPointsWithClosedContour =
|
|
481
|
+
fuseEditPointsWithClosedContour.bind(toolInstance);
|
|
482
|
+
toolInstance.cancelClosedContourEdit =
|
|
483
|
+
cancelClosedContourEdit.bind(toolInstance);
|
|
484
|
+
toolInstance.completeClosedContourEdit =
|
|
485
|
+
completeClosedContourEdit.bind(toolInstance);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
export default registerClosedContourEditLoop;
|