@cornerstonejs/tools 0.56.2 → 0.56.4
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,331 @@
|
|
|
1
|
+
import { Types } from '@cornerstonejs/core';
|
|
2
|
+
import { vec2 } from 'gl-matrix';
|
|
3
|
+
import { polyline } from '../../../utilities/math';
|
|
4
|
+
import { EventTypes } from '../../../types';
|
|
5
|
+
|
|
6
|
+
const { addCanvasPointsToArray, getFirstIntersectionWithPolyline } = polyline;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Check if the `editCanvasPoints` have crossed the `prevCanvasPoints` during
|
|
10
|
+
* an edit.
|
|
11
|
+
*
|
|
12
|
+
* @privateRemarks The following tricks are required to make the UX smooth and
|
|
13
|
+
* the editing not very picky on exactly where you click:
|
|
14
|
+
* - If we don't cross after 2 points, but projecting the line backwards the
|
|
15
|
+
* proximity distance means we cross, extend the line back.
|
|
16
|
+
* - If we travel the full proximity in canvas points but don't cross a line, we
|
|
17
|
+
* are likely drawing along the line, which is intuitive to the user. At this point
|
|
18
|
+
* snap the start of the edit to the closest place on the `prevCanvasPoints`,
|
|
19
|
+
* so that the edit can be executed in-line.
|
|
20
|
+
*/
|
|
21
|
+
function checkForFirstCrossing(
|
|
22
|
+
evt: EventTypes.InteractionEventType,
|
|
23
|
+
isClosedContour: boolean
|
|
24
|
+
): void {
|
|
25
|
+
const eventDetail = evt.detail;
|
|
26
|
+
const { element, currentPoints, lastPoints } = eventDetail;
|
|
27
|
+
const canvasPos = currentPoints.canvas;
|
|
28
|
+
const lastCanvasPoint = lastPoints.canvas;
|
|
29
|
+
const { editCanvasPoints, prevCanvasPoints } = this.editData;
|
|
30
|
+
|
|
31
|
+
const crossedLineSegment = getFirstIntersectionWithPolyline(
|
|
32
|
+
prevCanvasPoints,
|
|
33
|
+
canvasPos,
|
|
34
|
+
lastCanvasPoint,
|
|
35
|
+
isClosedContour
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
if (crossedLineSegment) {
|
|
39
|
+
this.editData.startCrossingIndex = crossedLineSegment[0];
|
|
40
|
+
|
|
41
|
+
// On the first crossing, remove the first lines prior to the crossing
|
|
42
|
+
this.removePointsUpUntilFirstCrossing(isClosedContour);
|
|
43
|
+
// prevent continue if there are not the minimum of points for this op.
|
|
44
|
+
} else if (prevCanvasPoints.length >= 2) {
|
|
45
|
+
if (
|
|
46
|
+
editCanvasPoints.length >
|
|
47
|
+
this.configuration.checkCanvasEditFallbackProximity
|
|
48
|
+
) {
|
|
49
|
+
// At this point, likely we are drawing along the line, we are past the proximity for grabbing.
|
|
50
|
+
// Search for nearest line segment to the start of the edit.
|
|
51
|
+
// Set the crossing index to the lower index of the segment.
|
|
52
|
+
|
|
53
|
+
const firstEditCanvasPoint = editCanvasPoints[0];
|
|
54
|
+
|
|
55
|
+
const distanceIndexPairs = [];
|
|
56
|
+
|
|
57
|
+
for (let i = 0; i < prevCanvasPoints.length; i++) {
|
|
58
|
+
const prevCanvasPoint = prevCanvasPoints[i];
|
|
59
|
+
const distance = vec2.distance(prevCanvasPoint, firstEditCanvasPoint);
|
|
60
|
+
|
|
61
|
+
distanceIndexPairs.push({ distance, index: i });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
distanceIndexPairs.sort((a, b) => a.distance - b.distance);
|
|
65
|
+
|
|
66
|
+
const twoClosestDistanceIndexPairs = [
|
|
67
|
+
distanceIndexPairs[0],
|
|
68
|
+
distanceIndexPairs[1],
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
const lowestIndex = Math.min(
|
|
72
|
+
twoClosestDistanceIndexPairs[0].index,
|
|
73
|
+
twoClosestDistanceIndexPairs[1].index
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
this.editData.startCrossingIndex = lowestIndex;
|
|
77
|
+
} else {
|
|
78
|
+
// Check if extending a line back 6 (Proximity) canvas pixels would cross a line.
|
|
79
|
+
|
|
80
|
+
// Extend point back 6 canvas pixels from first point.
|
|
81
|
+
const dir = vec2.create();
|
|
82
|
+
|
|
83
|
+
vec2.subtract(dir, editCanvasPoints[1], editCanvasPoints[0]);
|
|
84
|
+
vec2.normalize(dir, dir);
|
|
85
|
+
|
|
86
|
+
const proximity = 6;
|
|
87
|
+
|
|
88
|
+
const extendedPoint: Types.Point2 = [
|
|
89
|
+
editCanvasPoints[0][0] - dir[0] * proximity,
|
|
90
|
+
editCanvasPoints[0][1] - dir[1] * proximity,
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
const crossedLineSegmentFromExtendedPoint =
|
|
94
|
+
getFirstIntersectionWithPolyline(
|
|
95
|
+
prevCanvasPoints,
|
|
96
|
+
extendedPoint,
|
|
97
|
+
editCanvasPoints[0],
|
|
98
|
+
isClosedContour
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
if (crossedLineSegmentFromExtendedPoint) {
|
|
102
|
+
// Add points.
|
|
103
|
+
const pointsToPrepend = [extendedPoint];
|
|
104
|
+
|
|
105
|
+
addCanvasPointsToArray(
|
|
106
|
+
element,
|
|
107
|
+
pointsToPrepend,
|
|
108
|
+
editCanvasPoints[0],
|
|
109
|
+
this.commonData
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
editCanvasPoints.unshift(...pointsToPrepend);
|
|
113
|
+
|
|
114
|
+
this.removePointsUpUntilFirstCrossing(isClosedContour);
|
|
115
|
+
|
|
116
|
+
this.editData.editIndex = editCanvasPoints.length - 1;
|
|
117
|
+
this.editData.startCrossingIndex =
|
|
118
|
+
crossedLineSegmentFromExtendedPoint[0];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Removes the points from the `editCanvasPoints` up until the first crossing of
|
|
126
|
+
* the `prevCanvasPoints`. This is so we can just insert this line segment
|
|
127
|
+
* into the contour.
|
|
128
|
+
*/
|
|
129
|
+
function removePointsUpUntilFirstCrossing(isClosedContour: boolean): void {
|
|
130
|
+
const { editCanvasPoints, prevCanvasPoints } = this.editData;
|
|
131
|
+
let numPointsToRemove = 0;
|
|
132
|
+
|
|
133
|
+
for (let i = 0; i < editCanvasPoints.length - 1; i++) {
|
|
134
|
+
const firstLine = [editCanvasPoints[i], editCanvasPoints[i + 1]];
|
|
135
|
+
|
|
136
|
+
const didCrossLine = !!getFirstIntersectionWithPolyline(
|
|
137
|
+
prevCanvasPoints,
|
|
138
|
+
firstLine[0],
|
|
139
|
+
firstLine[1],
|
|
140
|
+
isClosedContour
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// Remove last element
|
|
144
|
+
numPointsToRemove++;
|
|
145
|
+
|
|
146
|
+
if (didCrossLine) {
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Remove the points
|
|
152
|
+
editCanvasPoints.splice(0, numPointsToRemove);
|
|
153
|
+
|
|
154
|
+
this.editData.editIndex = editCanvasPoints.length - 1;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Returns `true` if the `editCanvasPoints` crosses the `prevCanvasPoints` a
|
|
159
|
+
* second time.
|
|
160
|
+
*/
|
|
161
|
+
function checkForSecondCrossing(
|
|
162
|
+
evt: EventTypes.InteractionEventType,
|
|
163
|
+
isClosedContour: boolean
|
|
164
|
+
): boolean {
|
|
165
|
+
const eventDetail = evt.detail;
|
|
166
|
+
const { currentPoints, lastPoints } = eventDetail;
|
|
167
|
+
const canvasPos = currentPoints.canvas;
|
|
168
|
+
const lastCanvasPoint = lastPoints.canvas;
|
|
169
|
+
const { prevCanvasPoints } = this.editData;
|
|
170
|
+
|
|
171
|
+
// Note this method is looking for the first corssing found of
|
|
172
|
+
// *the lines given* to it. The parameters given to it are specified to search
|
|
173
|
+
// for the second crossing of the prevCanvasPoints, by checking if the last
|
|
174
|
+
// mouse drag crossed these. This class method is only called if the edit loop
|
|
175
|
+
// has already has a crossing earlier in the edit.
|
|
176
|
+
const crossedLineSegment = getFirstIntersectionWithPolyline(
|
|
177
|
+
prevCanvasPoints,
|
|
178
|
+
canvasPos,
|
|
179
|
+
lastCanvasPoint,
|
|
180
|
+
isClosedContour
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
if (!crossedLineSegment) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Removes the points from the `editCanvasPoints` after the second crossing of
|
|
192
|
+
* the `prevCanvasPoints`. This is so we can just insert this line segment
|
|
193
|
+
* into the contour.
|
|
194
|
+
*/
|
|
195
|
+
function removePointsAfterSecondCrossing(isClosedContour: boolean): void {
|
|
196
|
+
const { prevCanvasPoints, editCanvasPoints } = this.editData;
|
|
197
|
+
|
|
198
|
+
// Remove points after the crossing
|
|
199
|
+
for (let i = editCanvasPoints.length - 1; i > 0; i--) {
|
|
200
|
+
const lastLine = [editCanvasPoints[i], editCanvasPoints[i - 1]];
|
|
201
|
+
|
|
202
|
+
const didCrossLine = !!getFirstIntersectionWithPolyline(
|
|
203
|
+
prevCanvasPoints,
|
|
204
|
+
lastLine[0],
|
|
205
|
+
lastLine[1],
|
|
206
|
+
isClosedContour
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
// Remove last element
|
|
210
|
+
editCanvasPoints.pop();
|
|
211
|
+
|
|
212
|
+
if (didCrossLine) {
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* During an edit, finds the index on the `prevCanvasPoints` that the
|
|
220
|
+
* `editCanvasPoints` should snap to to create one continuous contour.
|
|
221
|
+
*
|
|
222
|
+
* Returns the index, but returns -1 if there is no index on the
|
|
223
|
+
* `prevCanvasPoints` that can be snapped to with causing a crossing of the
|
|
224
|
+
* `editCanvasPoints`.
|
|
225
|
+
*/
|
|
226
|
+
function findSnapIndex(): number {
|
|
227
|
+
const { editCanvasPoints, prevCanvasPoints, startCrossingIndex } =
|
|
228
|
+
this.editData;
|
|
229
|
+
|
|
230
|
+
if (
|
|
231
|
+
startCrossingIndex === undefined // Haven't crossed line yet
|
|
232
|
+
) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const lastEditCanvasPoint = editCanvasPoints[editCanvasPoints.length - 1];
|
|
237
|
+
|
|
238
|
+
const distanceIndexPairs = [];
|
|
239
|
+
|
|
240
|
+
for (let i = 0; i < prevCanvasPoints.length; i++) {
|
|
241
|
+
const prevCanvasPoint = prevCanvasPoints[i];
|
|
242
|
+
const distance = vec2.distance(prevCanvasPoint, lastEditCanvasPoint);
|
|
243
|
+
|
|
244
|
+
distanceIndexPairs.push({ distance, index: i });
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
distanceIndexPairs.sort((a, b) => a.distance - b.distance);
|
|
248
|
+
|
|
249
|
+
// Search through from shortest distance and check which snap line doesn't
|
|
250
|
+
// Cross the edit line, in most cases the snap index will just be the first one.
|
|
251
|
+
const editCanvasPointsLessLastOne = editCanvasPoints.slice(0, -1);
|
|
252
|
+
|
|
253
|
+
for (let i = 0; i < distanceIndexPairs.length; i++) {
|
|
254
|
+
const { index } = distanceIndexPairs[i];
|
|
255
|
+
const snapCanvasPosition = prevCanvasPoints[index];
|
|
256
|
+
const lastEditCanvasPoint = editCanvasPoints[editCanvasPoints.length - 1];
|
|
257
|
+
|
|
258
|
+
const crossedLineSegment = getFirstIntersectionWithPolyline(
|
|
259
|
+
editCanvasPointsLessLastOne,
|
|
260
|
+
snapCanvasPosition,
|
|
261
|
+
lastEditCanvasPoint,
|
|
262
|
+
false // The edit line is not a closed contour
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
if (!crossedLineSegment) {
|
|
266
|
+
return index;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// If all of the lines caused a crossing, this means we should start a new edit.
|
|
271
|
+
// Use -1 to signify this.
|
|
272
|
+
return -1;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Checks if the `editCanvasPoints` cross themselves. If they do, remove the
|
|
277
|
+
* region after the cross index, these removes isolated "island" loops that the
|
|
278
|
+
* user can draw which make closed contours no longer simple polygons, or open
|
|
279
|
+
* contours twisted.
|
|
280
|
+
*/
|
|
281
|
+
function checkAndRemoveCrossesOnEditLine(
|
|
282
|
+
evt: EventTypes.InteractionEventType
|
|
283
|
+
): number | undefined {
|
|
284
|
+
const eventDetail = evt.detail;
|
|
285
|
+
const { currentPoints, lastPoints } = eventDetail;
|
|
286
|
+
const canvasPos = currentPoints.canvas;
|
|
287
|
+
const lastCanvasPoint = lastPoints.canvas;
|
|
288
|
+
|
|
289
|
+
const { editCanvasPoints } = this.editData;
|
|
290
|
+
|
|
291
|
+
const editCanvasPointsLessLastOne = editCanvasPoints.slice(0, -2);
|
|
292
|
+
|
|
293
|
+
const crossedLineSegment = getFirstIntersectionWithPolyline(
|
|
294
|
+
editCanvasPointsLessLastOne,
|
|
295
|
+
canvasPos,
|
|
296
|
+
lastCanvasPoint,
|
|
297
|
+
false
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
if (!crossedLineSegment) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// We have found a crossing, remove points after the crossing, cutting off
|
|
305
|
+
// the "island" loop drawn.
|
|
306
|
+
|
|
307
|
+
const editIndexCrossed = crossedLineSegment[0];
|
|
308
|
+
const numPointsToRemove = editCanvasPoints.length - editIndexCrossed;
|
|
309
|
+
|
|
310
|
+
for (let i = 0; i < numPointsToRemove; i++) {
|
|
311
|
+
editCanvasPoints.pop();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Registers the contour drawing loop to the tool instance.
|
|
317
|
+
*/
|
|
318
|
+
function registerEditLoopCommon(toolInstance) {
|
|
319
|
+
toolInstance.checkForFirstCrossing = checkForFirstCrossing.bind(toolInstance);
|
|
320
|
+
toolInstance.removePointsUpUntilFirstCrossing =
|
|
321
|
+
removePointsUpUntilFirstCrossing.bind(toolInstance);
|
|
322
|
+
toolInstance.checkForSecondCrossing =
|
|
323
|
+
checkForSecondCrossing.bind(toolInstance);
|
|
324
|
+
toolInstance.findSnapIndex = findSnapIndex.bind(toolInstance);
|
|
325
|
+
toolInstance.removePointsAfterSecondCrossing =
|
|
326
|
+
removePointsAfterSecondCrossing.bind(toolInstance);
|
|
327
|
+
toolInstance.checkAndRemoveCrossesOnEditLine =
|
|
328
|
+
checkAndRemoveCrossesOnEditLine.bind(toolInstance);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export default registerEditLoopCommon;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
import { PlanarFreehandROIAnnotation } from '../../../types/ToolSpecificAnnotationTypes';
|
|
3
|
+
import { vec2 } from 'gl-matrix';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Finds the length of the longest line from the midpoint of the line
|
|
7
|
+
* that joins the start and end of the open contour, to the surface of the
|
|
8
|
+
* open contour.
|
|
9
|
+
*/
|
|
10
|
+
export default function findOpenUShapedContourVectorToPeak(
|
|
11
|
+
canvasPoints: Types.Point2[],
|
|
12
|
+
viewport: Types.IStackViewport | Types.IVolumeViewport
|
|
13
|
+
): Types.Point3[] {
|
|
14
|
+
// Find chord from first to last point.
|
|
15
|
+
const first = canvasPoints[0];
|
|
16
|
+
const last = canvasPoints[canvasPoints.length - 1];
|
|
17
|
+
|
|
18
|
+
const firstToLastUnitVector = vec2.create();
|
|
19
|
+
|
|
20
|
+
vec2.set(firstToLastUnitVector, last[0] - first[0], last[1] - first[1]);
|
|
21
|
+
vec2.normalize(firstToLastUnitVector, firstToLastUnitVector);
|
|
22
|
+
|
|
23
|
+
// Get the two possible normal vector to this vector
|
|
24
|
+
// Note: Use the identity that the perpendicular line must have a gradient of
|
|
25
|
+
// 1 / gradient of the line.
|
|
26
|
+
|
|
27
|
+
const normalVector1 = vec2.create();
|
|
28
|
+
const normalVector2 = vec2.create();
|
|
29
|
+
|
|
30
|
+
vec2.set(normalVector1, -firstToLastUnitVector[1], firstToLastUnitVector[0]);
|
|
31
|
+
vec2.set(normalVector2, firstToLastUnitVector[1], -firstToLastUnitVector[0]);
|
|
32
|
+
|
|
33
|
+
// Find the center of the chord.
|
|
34
|
+
const centerOfFirstToLast: Types.Point2 = [
|
|
35
|
+
(first[0] + last[0]) / 2,
|
|
36
|
+
(first[1] + last[1]) / 2,
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
// Get furthest point.
|
|
40
|
+
|
|
41
|
+
const furthest = {
|
|
42
|
+
dist: 0,
|
|
43
|
+
index: null,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
for (let i = 0; i < canvasPoints.length; i++) {
|
|
47
|
+
const canvasPoint = canvasPoints[i];
|
|
48
|
+
|
|
49
|
+
const distance = vec2.dist(canvasPoint, <vec2>centerOfFirstToLast);
|
|
50
|
+
|
|
51
|
+
if (distance > furthest.dist) {
|
|
52
|
+
furthest.dist = distance;
|
|
53
|
+
furthest.index = i;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const toFurthest: [Types.Point2, Types.Point2] = [
|
|
58
|
+
canvasPoints[furthest.index],
|
|
59
|
+
centerOfFirstToLast,
|
|
60
|
+
];
|
|
61
|
+
const toFurthestWorld = toFurthest.map(viewport.canvasToWorld);
|
|
62
|
+
|
|
63
|
+
return toFurthestWorld;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function findOpenUShapedContourVectorToPeakOnRender(
|
|
67
|
+
enabledElement: Types.IEnabledElement,
|
|
68
|
+
annotation: PlanarFreehandROIAnnotation
|
|
69
|
+
): Types.Point3[] {
|
|
70
|
+
const { viewport } = enabledElement;
|
|
71
|
+
const canvasPoints = annotation.data.polyline.map(viewport.worldToCanvas);
|
|
72
|
+
|
|
73
|
+
return findOpenUShapedContourVectorToPeak(canvasPoints, viewport);
|
|
74
|
+
}
|