@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,491 @@
|
|
|
1
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
2
|
+
import { utilities as csUtils } from '@cornerstonejs/core';
|
|
3
|
+
|
|
4
|
+
import CORNERSTONE_COLOR_LUT from '../../constants/COLOR_LUT';
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
SegmentationState,
|
|
8
|
+
ColorLUT,
|
|
9
|
+
Segmentation,
|
|
10
|
+
ToolGroupSpecificRepresentation,
|
|
11
|
+
SegmentationRepresentationConfig,
|
|
12
|
+
ToolGroupSpecificRepresentations,
|
|
13
|
+
RepresentationConfig,
|
|
14
|
+
SegmentSpecificRepresentationConfig,
|
|
15
|
+
} from '../../types/SegmentationStateTypes';
|
|
16
|
+
import getDefaultLabelmapConfig from '../../tools/displayTools/Labelmap/labelmapConfig';
|
|
17
|
+
import { SegmentationRepresentations } from '../../enums';
|
|
18
|
+
|
|
19
|
+
// Initialize the default configuration
|
|
20
|
+
// Note: when we get other representations, we should set their default representations too.
|
|
21
|
+
const defaultLabelmapConfig = getDefaultLabelmapConfig();
|
|
22
|
+
|
|
23
|
+
const newGlobalConfig: SegmentationRepresentationConfig = {
|
|
24
|
+
renderInactiveSegmentations: true,
|
|
25
|
+
representations: {
|
|
26
|
+
[SegmentationRepresentations.Labelmap]: defaultLabelmapConfig,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/* A default initial state for the segmentation manager. */
|
|
31
|
+
const initialDefaultState: SegmentationState = {
|
|
32
|
+
colorLUT: [],
|
|
33
|
+
segmentations: [],
|
|
34
|
+
globalConfig: newGlobalConfig,
|
|
35
|
+
toolGroups: {},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The SegmentationStateManager Class is responsible for managing the state of the
|
|
40
|
+
* segmentations. It stores the segmentations and toolGroup specific representations
|
|
41
|
+
* of the segmentation. It also stores a global config and a toolGroup specific
|
|
42
|
+
* config. Note that this is a singleton state manager.
|
|
43
|
+
*/
|
|
44
|
+
export default class SegmentationStateManager {
|
|
45
|
+
private state: SegmentationState;
|
|
46
|
+
public readonly uid: string;
|
|
47
|
+
|
|
48
|
+
constructor(uid?: string) {
|
|
49
|
+
if (!uid) {
|
|
50
|
+
uid = csUtils.uuidv4();
|
|
51
|
+
}
|
|
52
|
+
this.state = cloneDeep(initialDefaultState);
|
|
53
|
+
this.uid = uid;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* It returns a copy of the current state of the segmentation
|
|
58
|
+
* @returns A deep copy of the state.
|
|
59
|
+
*/
|
|
60
|
+
getState(): SegmentationState {
|
|
61
|
+
return this.state;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* It returns an array of toolGroupIds currently in the segmentation state.
|
|
66
|
+
* @returns An array of strings.
|
|
67
|
+
*/
|
|
68
|
+
getToolGroups(): string[] {
|
|
69
|
+
return Object.keys(this.state.toolGroups);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* It returns the colorLUT at the specified index.
|
|
74
|
+
* @param lutIndex - The index of the color LUT to retrieve.
|
|
75
|
+
* @returns A ColorLUT object.
|
|
76
|
+
*/
|
|
77
|
+
getColorLUT(lutIndex: number): ColorLUT | undefined {
|
|
78
|
+
return this.state.colorLUT[lutIndex];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Reset the state to the default state
|
|
83
|
+
*/
|
|
84
|
+
resetState(): void {
|
|
85
|
+
this.state = cloneDeep(initialDefaultState);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Given a segmentation Id, return the segmentation state
|
|
90
|
+
* @param segmentationId - The id of the segmentation to get the data for.
|
|
91
|
+
* @returns - The segmentation data
|
|
92
|
+
*/
|
|
93
|
+
getSegmentation(segmentationId: string): Segmentation | undefined {
|
|
94
|
+
return this.state.segmentations.find(
|
|
95
|
+
(segmentation) => segmentation.segmentationId === segmentationId
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* It adds a segmentation to the segmentations array.
|
|
101
|
+
* @param segmentation - Segmentation
|
|
102
|
+
*/
|
|
103
|
+
addSegmentation(segmentation: Segmentation): void {
|
|
104
|
+
this._initDefaultColorLUTIfNecessary();
|
|
105
|
+
|
|
106
|
+
// Check if the segmentation already exists with the segmentationId
|
|
107
|
+
if (this.getSegmentation(segmentation.segmentationId)) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
`Segmentation with id ${segmentation.segmentationId} already exists`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this.state.segmentations.push(segmentation);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Get the segmentation representations for a tool group
|
|
118
|
+
* @param toolGroupId - string
|
|
119
|
+
* @returns A list of segmentation representations.
|
|
120
|
+
*/
|
|
121
|
+
getSegmentationRepresentations(
|
|
122
|
+
toolGroupId: string
|
|
123
|
+
): ToolGroupSpecificRepresentations | undefined {
|
|
124
|
+
const toolGroupSegRepresentationsWithConfig =
|
|
125
|
+
this.state.toolGroups[toolGroupId];
|
|
126
|
+
|
|
127
|
+
if (!toolGroupSegRepresentationsWithConfig) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return toolGroupSegRepresentationsWithConfig.segmentationRepresentations;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Add a new segmentation representation to the toolGroup's segmentation representations.
|
|
136
|
+
* @param toolGroupId - The Id of the tool group .
|
|
137
|
+
* @param segmentationRepresentation - The segmentation representation to add.
|
|
138
|
+
*/
|
|
139
|
+
addSegmentationRepresentation(
|
|
140
|
+
toolGroupId: string,
|
|
141
|
+
segmentationRepresentation: ToolGroupSpecificRepresentation
|
|
142
|
+
): void {
|
|
143
|
+
// Initialize the default toolGroup state if not created yet
|
|
144
|
+
if (!this.state.toolGroups[toolGroupId]) {
|
|
145
|
+
this.state.toolGroups[toolGroupId] = {
|
|
146
|
+
segmentationRepresentations: [],
|
|
147
|
+
config: {} as SegmentationRepresentationConfig,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// local toolGroupSpecificSegmentationState
|
|
152
|
+
this.state.toolGroups[toolGroupId].segmentationRepresentations.push(
|
|
153
|
+
segmentationRepresentation
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
this._handleActiveSegmentation(toolGroupId, segmentationRepresentation);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Get the global config containing both representation config
|
|
161
|
+
* and render inactive segmentations config
|
|
162
|
+
* @returns The global config object.
|
|
163
|
+
*/
|
|
164
|
+
getGlobalConfig(): SegmentationRepresentationConfig {
|
|
165
|
+
return this.state.globalConfig;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* It sets the global segmentation config including both representation config
|
|
170
|
+
* and render inactive segmentations config
|
|
171
|
+
* @param config - The global configuration for the segmentations.
|
|
172
|
+
*/
|
|
173
|
+
setGlobalConfig(config: SegmentationRepresentationConfig): void {
|
|
174
|
+
this.state.globalConfig = config;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Given a toolGroupId and a segmentationRepresentationUID, return the segmentation
|
|
179
|
+
* representation for that tool group.
|
|
180
|
+
* @param toolGroupId - The Id of the tool group
|
|
181
|
+
* @param segmentationRepresentationUID - string
|
|
182
|
+
* @returns The segmentation representation.
|
|
183
|
+
*/
|
|
184
|
+
getSegmentationRepresentationByUID(
|
|
185
|
+
toolGroupId: string,
|
|
186
|
+
segmentationRepresentationUID: string
|
|
187
|
+
): ToolGroupSpecificRepresentation | undefined {
|
|
188
|
+
const toolGroupSegRepresentations =
|
|
189
|
+
this.getSegmentationRepresentations(toolGroupId);
|
|
190
|
+
|
|
191
|
+
const segmentationData = toolGroupSegRepresentations.find(
|
|
192
|
+
(representation) =>
|
|
193
|
+
representation.segmentationRepresentationUID ===
|
|
194
|
+
segmentationRepresentationUID
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
return segmentationData;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* It removes the segmentation from the segmentation state.
|
|
202
|
+
* @param segmentationId - The id of the segmentation to remove.
|
|
203
|
+
*/
|
|
204
|
+
removeSegmentation(segmentationId: string): void {
|
|
205
|
+
this.state.segmentations = this.state.segmentations.filter(
|
|
206
|
+
(segmentation) => segmentation.segmentationId !== segmentationId
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Remove a segmentation representation from the toolGroup
|
|
212
|
+
* @param toolGroupId - The Id of the tool group
|
|
213
|
+
* @param segmentationRepresentationUID - the uid of the segmentation representation to remove
|
|
214
|
+
* @param immediate - If true, the viewport will be updated immediately.
|
|
215
|
+
*/
|
|
216
|
+
removeSegmentationRepresentation(
|
|
217
|
+
toolGroupId: string,
|
|
218
|
+
segmentationRepresentationUID: string
|
|
219
|
+
): void {
|
|
220
|
+
const toolGroupSegmentationRepresentations =
|
|
221
|
+
this.getSegmentationRepresentations(toolGroupId);
|
|
222
|
+
|
|
223
|
+
if (
|
|
224
|
+
!toolGroupSegmentationRepresentations ||
|
|
225
|
+
!toolGroupSegmentationRepresentations.length
|
|
226
|
+
) {
|
|
227
|
+
throw new Error(
|
|
228
|
+
`No viewport specific segmentation state found for viewport ${toolGroupId}`
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const state =
|
|
233
|
+
toolGroupSegmentationRepresentations as ToolGroupSpecificRepresentations;
|
|
234
|
+
const index = state.findIndex(
|
|
235
|
+
(segData) =>
|
|
236
|
+
segData.segmentationRepresentationUID === segmentationRepresentationUID
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
if (index === -1) {
|
|
240
|
+
console.warn(
|
|
241
|
+
`No viewport specific segmentation state data found for viewport ${toolGroupId} and segmentation data UID ${segmentationRepresentationUID}`
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const removedSegmentationRepresentation =
|
|
246
|
+
toolGroupSegmentationRepresentations[index];
|
|
247
|
+
|
|
248
|
+
toolGroupSegmentationRepresentations.splice(index, 1);
|
|
249
|
+
|
|
250
|
+
this._handleActiveSegmentation(
|
|
251
|
+
toolGroupId,
|
|
252
|
+
removedSegmentationRepresentation
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Set the active segmentation data for a tool group
|
|
258
|
+
* @param toolGroupId - The Id of the tool group that owns the
|
|
259
|
+
* segmentation data.
|
|
260
|
+
* @param segmentationRepresentationUID - string
|
|
261
|
+
*/
|
|
262
|
+
setActiveSegmentationRepresentation(
|
|
263
|
+
toolGroupId: string,
|
|
264
|
+
segmentationRepresentationUID: string
|
|
265
|
+
): void {
|
|
266
|
+
const toolGroupSegmentations =
|
|
267
|
+
this.getSegmentationRepresentations(toolGroupId);
|
|
268
|
+
|
|
269
|
+
if (!toolGroupSegmentations || !toolGroupSegmentations.length) {
|
|
270
|
+
throw new Error(
|
|
271
|
+
`No segmentation data found for toolGroupId: ${toolGroupId}`
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const segmentationData = toolGroupSegmentations.find(
|
|
276
|
+
(segmentationData) =>
|
|
277
|
+
segmentationData.segmentationRepresentationUID ===
|
|
278
|
+
segmentationRepresentationUID
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
if (!segmentationData) {
|
|
282
|
+
throw new Error(
|
|
283
|
+
`No segmentation data found for segmentation data UID ${segmentationRepresentationUID}`
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
segmentationData.active = true;
|
|
288
|
+
this._handleActiveSegmentation(toolGroupId, segmentationData);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Given a tool group Id it returns the tool group specific representation config
|
|
293
|
+
*
|
|
294
|
+
* @param toolGroupId - The Id of the tool group
|
|
295
|
+
* @returns A SegmentationConfig object.
|
|
296
|
+
*/
|
|
297
|
+
getToolGroupSpecificConfig(
|
|
298
|
+
toolGroupId: string
|
|
299
|
+
): SegmentationRepresentationConfig | undefined {
|
|
300
|
+
const toolGroupStateWithConfig = this.state.toolGroups[toolGroupId];
|
|
301
|
+
|
|
302
|
+
if (!toolGroupStateWithConfig) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return toolGroupStateWithConfig.config;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
getSegmentationRepresentationSpecificConfig(
|
|
310
|
+
toolGroupId: string,
|
|
311
|
+
segmentationRepresentationUID: string
|
|
312
|
+
): RepresentationConfig {
|
|
313
|
+
const segmentationRepresentation = this.getSegmentationRepresentationByUID(
|
|
314
|
+
toolGroupId,
|
|
315
|
+
segmentationRepresentationUID
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
if (!segmentationRepresentation) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return segmentationRepresentation.segmentationRepresentationSpecificConfig;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
setSegmentationRepresentationSpecificConfig(
|
|
326
|
+
toolGroupId: string,
|
|
327
|
+
segmentationRepresentationUID: string,
|
|
328
|
+
config: RepresentationConfig
|
|
329
|
+
): void {
|
|
330
|
+
const segmentationRepresentation = this.getSegmentationRepresentationByUID(
|
|
331
|
+
toolGroupId,
|
|
332
|
+
segmentationRepresentationUID
|
|
333
|
+
);
|
|
334
|
+
|
|
335
|
+
if (!segmentationRepresentation) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
segmentationRepresentation.segmentationRepresentationSpecificConfig =
|
|
340
|
+
config;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
getSegmentSpecificConfig(
|
|
344
|
+
toolGroupId: string,
|
|
345
|
+
segmentationRepresentationUID: string,
|
|
346
|
+
segmentIndex: number
|
|
347
|
+
): RepresentationConfig {
|
|
348
|
+
const segmentationRepresentation = this.getSegmentationRepresentationByUID(
|
|
349
|
+
toolGroupId,
|
|
350
|
+
segmentationRepresentationUID
|
|
351
|
+
);
|
|
352
|
+
|
|
353
|
+
if (!segmentationRepresentation) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
return segmentationRepresentation.segmentSpecificConfig[segmentIndex];
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
setSegmentSpecificConfig(
|
|
361
|
+
toolGroupId: string,
|
|
362
|
+
segmentationRepresentationUID: string,
|
|
363
|
+
config: SegmentSpecificRepresentationConfig
|
|
364
|
+
): void {
|
|
365
|
+
const segmentationRepresentation = this.getSegmentationRepresentationByUID(
|
|
366
|
+
toolGroupId,
|
|
367
|
+
segmentationRepresentationUID
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
if (!segmentationRepresentation) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
segmentationRepresentation.segmentSpecificConfig = config;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Set the segmentation representations config for a given tool group. It will create a new
|
|
379
|
+
* tool group specific config if one does not exist.
|
|
380
|
+
*
|
|
381
|
+
* @param toolGroupId - The Id of the tool group that the segmentation
|
|
382
|
+
* belongs to.
|
|
383
|
+
* @param config - SegmentationConfig
|
|
384
|
+
*/
|
|
385
|
+
setSegmentationRepresentationConfig(
|
|
386
|
+
toolGroupId: string,
|
|
387
|
+
config: SegmentationRepresentationConfig
|
|
388
|
+
): void {
|
|
389
|
+
let toolGroupStateWithConfig = this.state.toolGroups[toolGroupId];
|
|
390
|
+
|
|
391
|
+
if (!toolGroupStateWithConfig) {
|
|
392
|
+
this.state.toolGroups[toolGroupId] = {
|
|
393
|
+
segmentationRepresentations: [],
|
|
394
|
+
config: {
|
|
395
|
+
renderInactiveSegmentations: true,
|
|
396
|
+
representations: {},
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
toolGroupStateWithConfig = this.state.toolGroups[toolGroupId];
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
toolGroupStateWithConfig.config = {
|
|
404
|
+
...toolGroupStateWithConfig.config,
|
|
405
|
+
...config,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* It adds a color LUT to the state.
|
|
411
|
+
* @param colorLUT - ColorLUT
|
|
412
|
+
* @param lutIndex - The index of the color LUT table to add.
|
|
413
|
+
*/
|
|
414
|
+
addColorLUT(colorLUT: ColorLUT, lutIndex: number): void {
|
|
415
|
+
if (this.state.colorLUT[lutIndex]) {
|
|
416
|
+
console.log('Color LUT table already exists, overwriting');
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
this.state.colorLUT[lutIndex] = colorLUT;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Removes a color LUT to the state.
|
|
424
|
+
* @param colorLUTIndex - The index of the color LUT table to remove.
|
|
425
|
+
*/
|
|
426
|
+
removeColorLUT(colorLUTIndex: number): void {
|
|
427
|
+
delete this.state.colorLUT[colorLUTIndex];
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* It handles the active segmentation representation based on the active status of the
|
|
432
|
+
* segmentation representation that was added or removed.
|
|
433
|
+
*
|
|
434
|
+
* @param toolGroupId - The Id of the tool group that the segmentation representation belongs to.
|
|
435
|
+
* @param recentlyAddedOrRemovedSegmentationRepresentation - ToolGroupSpecificSegmentationData
|
|
436
|
+
*/
|
|
437
|
+
_handleActiveSegmentation(
|
|
438
|
+
toolGroupId: string,
|
|
439
|
+
recentlyAddedOrRemovedSegmentationRepresentation: ToolGroupSpecificRepresentation
|
|
440
|
+
): void {
|
|
441
|
+
const segmentationRepresentations =
|
|
442
|
+
this.getSegmentationRepresentations(toolGroupId);
|
|
443
|
+
|
|
444
|
+
// 1. If there is no segmentation representations, return early
|
|
445
|
+
if (segmentationRepresentations.length === 0) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// 2. If there is only one segmentation representation, make that one active
|
|
450
|
+
if (segmentationRepresentations.length === 1) {
|
|
451
|
+
segmentationRepresentations[0].active = true;
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// 3. If removed Segmentation representation was active, make the first one active
|
|
456
|
+
const activeSegmentationRepresentations =
|
|
457
|
+
segmentationRepresentations.filter(
|
|
458
|
+
(representation) => representation.active
|
|
459
|
+
);
|
|
460
|
+
|
|
461
|
+
if (activeSegmentationRepresentations.length === 0) {
|
|
462
|
+
segmentationRepresentations[0].active = true;
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// 4. If the added segmentation representation is active, make other segmentation
|
|
467
|
+
// representations inactive
|
|
468
|
+
if (recentlyAddedOrRemovedSegmentationRepresentation.active) {
|
|
469
|
+
segmentationRepresentations.forEach((representation) => {
|
|
470
|
+
if (
|
|
471
|
+
representation.segmentationRepresentationUID !==
|
|
472
|
+
recentlyAddedOrRemovedSegmentationRepresentation.segmentationRepresentationUID
|
|
473
|
+
) {
|
|
474
|
+
representation.active = false;
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// 5. if added/removed segmentation is is inactive, do nothing
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
_initDefaultColorLUTIfNecessary() {
|
|
483
|
+
// if colorLUTTable is not specified or the default one is not found
|
|
484
|
+
if (this.state.colorLUT.length === 0 || !this.state.colorLUT[0]) {
|
|
485
|
+
this.addColorLUT(CORNERSTONE_COLOR_LUT as ColorLUT, 0);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const defaultSegmentationStateManager = new SegmentationStateManager('DEFAULT');
|
|
491
|
+
export { defaultSegmentationStateManager };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ToolGroupSpecificRepresentation } from '../../types/SegmentationStateTypes';
|
|
2
|
+
import { getDefaultSegmentationStateManager } from './segmentationState';
|
|
3
|
+
import { triggerSegmentationRepresentationModified } from './triggerSegmentationEvents';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Get the active segmentation representation for the tool group with
|
|
7
|
+
* the given toolGroupId.
|
|
8
|
+
* @param toolGroupId - The Id of the tool group
|
|
9
|
+
* @returns The active segmentation representation for the tool group.
|
|
10
|
+
*/
|
|
11
|
+
function getActiveSegmentationRepresentation(
|
|
12
|
+
toolGroupId: string
|
|
13
|
+
): ToolGroupSpecificRepresentation {
|
|
14
|
+
const segmentationStateManager = getDefaultSegmentationStateManager();
|
|
15
|
+
|
|
16
|
+
const toolGroupSegmentationRepresentations =
|
|
17
|
+
segmentationStateManager.getSegmentationRepresentations(toolGroupId);
|
|
18
|
+
|
|
19
|
+
if (!toolGroupSegmentationRepresentations) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const activeRepresentation = toolGroupSegmentationRepresentations.find(
|
|
24
|
+
(representation) => representation.active
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
return activeRepresentation;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Set the active segmentation for the given tool group for all its viewports
|
|
32
|
+
*
|
|
33
|
+
* @param toolGroupId - The Id of the tool group to set the active
|
|
34
|
+
* segmentation for.
|
|
35
|
+
* @param segmentationRepresentationUID - The id of the segmentation representation to set as
|
|
36
|
+
* active.
|
|
37
|
+
*/
|
|
38
|
+
function setActiveSegmentationRepresentation(
|
|
39
|
+
toolGroupId: string,
|
|
40
|
+
segmentationRepresentationUID: string
|
|
41
|
+
): void {
|
|
42
|
+
const segmentationStateManager = getDefaultSegmentationStateManager();
|
|
43
|
+
|
|
44
|
+
segmentationStateManager.setActiveSegmentationRepresentation(
|
|
45
|
+
toolGroupId,
|
|
46
|
+
segmentationRepresentationUID
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
triggerSegmentationRepresentationModified(
|
|
50
|
+
toolGroupId,
|
|
51
|
+
segmentationRepresentationUID
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
// get
|
|
57
|
+
getActiveSegmentationRepresentation,
|
|
58
|
+
// set
|
|
59
|
+
setActiveSegmentationRepresentation,
|
|
60
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import _cloneDeep from 'lodash.clonedeep';
|
|
2
|
+
import {
|
|
3
|
+
SegmentationRepresentationConfig,
|
|
4
|
+
RepresentationPublicInput,
|
|
5
|
+
} from '../../types/SegmentationStateTypes';
|
|
6
|
+
import Representations from '../../enums/SegmentationRepresentations';
|
|
7
|
+
import { getToolGroup } from '../../store/ToolGroupManager';
|
|
8
|
+
|
|
9
|
+
import { labelmapDisplay } from '../../tools/displayTools/Labelmap';
|
|
10
|
+
import { contourDisplay } from '../../tools/displayTools/Contour';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Set the specified segmentation representations on the viewports of the specified
|
|
14
|
+
* toolGroup. It accepts a second argument which is a toolGroup specific representation
|
|
15
|
+
* configuration.
|
|
16
|
+
*
|
|
17
|
+
* @param toolGroupId - The Id of the toolGroup to add the segmentation representations to
|
|
18
|
+
* @param representationInputArray - An array of segmentation representations to add to the toolGroup
|
|
19
|
+
* @param toolGroupSpecificRepresentationConfig - The toolGroup specific configuration
|
|
20
|
+
* for the segmentation representations
|
|
21
|
+
*/
|
|
22
|
+
async function addSegmentationRepresentations(
|
|
23
|
+
toolGroupId: string,
|
|
24
|
+
representationInputArray: RepresentationPublicInput[],
|
|
25
|
+
toolGroupSpecificRepresentationConfig?: SegmentationRepresentationConfig
|
|
26
|
+
): Promise<string[]> {
|
|
27
|
+
// Check if there exists a toolGroup with the toolGroupId
|
|
28
|
+
const toolGroup = getToolGroup(toolGroupId);
|
|
29
|
+
|
|
30
|
+
if (!toolGroup) {
|
|
31
|
+
throw new Error(`No tool group found for toolGroupId: ${toolGroupId}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const promises = representationInputArray.map((representationInput) => {
|
|
35
|
+
return _addSegmentationRepresentation(
|
|
36
|
+
toolGroupId,
|
|
37
|
+
representationInput,
|
|
38
|
+
toolGroupSpecificRepresentationConfig
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const segmentationRepresentationUIDs = await Promise.all(promises);
|
|
43
|
+
|
|
44
|
+
return segmentationRepresentationUIDs;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function _addSegmentationRepresentation(
|
|
48
|
+
toolGroupId: string,
|
|
49
|
+
representationInput: RepresentationPublicInput,
|
|
50
|
+
toolGroupSpecificRepresentationConfig?: SegmentationRepresentationConfig
|
|
51
|
+
): Promise<string> {
|
|
52
|
+
let segmentationRepresentationUID;
|
|
53
|
+
|
|
54
|
+
if (representationInput.type === Representations.Labelmap) {
|
|
55
|
+
segmentationRepresentationUID =
|
|
56
|
+
await labelmapDisplay.addSegmentationRepresentation(
|
|
57
|
+
toolGroupId,
|
|
58
|
+
representationInput,
|
|
59
|
+
toolGroupSpecificRepresentationConfig
|
|
60
|
+
);
|
|
61
|
+
} else if (representationInput.type === Representations.Contour) {
|
|
62
|
+
segmentationRepresentationUID =
|
|
63
|
+
await contourDisplay.addSegmentationRepresentation(
|
|
64
|
+
toolGroupId,
|
|
65
|
+
representationInput,
|
|
66
|
+
toolGroupSpecificRepresentationConfig
|
|
67
|
+
);
|
|
68
|
+
} else {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`The representation type ${representationInput.type} is not supported`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return segmentationRepresentationUID;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export default addSegmentationRepresentations;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import _cloneDeep from 'lodash.clonedeep';
|
|
2
|
+
import { SegmentationPublicInput } from '../../types/SegmentationStateTypes';
|
|
3
|
+
import { validateSegmentationInput } from './helpers';
|
|
4
|
+
import { addSegmentation as addSegmentationToState } from './segmentationState';
|
|
5
|
+
/**
|
|
6
|
+
* Adds the segmentation to the cornerstone3D segmentation state. It should be
|
|
7
|
+
* noted that segmentations are not added to any toolGroup's viewports. In order to
|
|
8
|
+
* do so, you should add a "representation" of the segmentation to the toolGroup
|
|
9
|
+
* using addSegmentationRepresentations helper. The reason for this is that there
|
|
10
|
+
* can be multiple representations of the same segmentation (e.g. Labelmap and
|
|
11
|
+
* Contour, etc. - Currently only Labelmap representations is supported).
|
|
12
|
+
* @param segmentationInputArray - The array of segmentation input, each of which
|
|
13
|
+
* defining the segmentationId and the main representation data for the segmentation.
|
|
14
|
+
*/
|
|
15
|
+
function addSegmentations(
|
|
16
|
+
segmentationInputArray: SegmentationPublicInput[]
|
|
17
|
+
): void {
|
|
18
|
+
validateSegmentationInput(segmentationInputArray);
|
|
19
|
+
|
|
20
|
+
segmentationInputArray.map((segInput) => {
|
|
21
|
+
const segmentationInput = _cloneDeep(segInput);
|
|
22
|
+
|
|
23
|
+
addSegmentationToState(segmentationInput);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default addSegmentations;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as color from './segmentationColor';
|
|
2
|
+
import * as visibility from './segmentationVisibility';
|
|
3
|
+
import {
|
|
4
|
+
getGlobalConfig,
|
|
5
|
+
getGlobalRepresentationConfig,
|
|
6
|
+
getToolGroupSpecificConfig,
|
|
7
|
+
setGlobalConfig,
|
|
8
|
+
setGlobalRepresentationConfig,
|
|
9
|
+
setToolGroupSpecificConfig,
|
|
10
|
+
setSegmentSpecificConfig,
|
|
11
|
+
getSegmentSpecificConfig,
|
|
12
|
+
setSegmentationRepresentationSpecificConfig,
|
|
13
|
+
getSegmentationRepresentationSpecificConfig,
|
|
14
|
+
} from './segmentationConfig';
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
color,
|
|
18
|
+
visibility,
|
|
19
|
+
getGlobalConfig,
|
|
20
|
+
getGlobalRepresentationConfig,
|
|
21
|
+
getToolGroupSpecificConfig,
|
|
22
|
+
setGlobalConfig,
|
|
23
|
+
setGlobalRepresentationConfig,
|
|
24
|
+
setToolGroupSpecificConfig,
|
|
25
|
+
setSegmentSpecificConfig,
|
|
26
|
+
getSegmentSpecificConfig,
|
|
27
|
+
setSegmentationRepresentationSpecificConfig,
|
|
28
|
+
getSegmentationRepresentationSpecificConfig,
|
|
29
|
+
};
|