@cornerstonejs/tools 2.0.0-beta.1 → 2.0.0-beta.2
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/dist/cjs/drawingSvg/drawCircle.js +9 -5
- package/dist/cjs/drawingSvg/drawCircle.js.map +1 -1
- package/dist/cjs/drawingSvg/drawEllipse.js +4 -4
- package/dist/cjs/drawingSvg/drawEllipse.js.map +1 -1
- package/dist/cjs/drawingSvg/drawHandles.js +4 -4
- package/dist/cjs/drawingSvg/drawHandles.js.map +1 -1
- package/dist/cjs/drawingSvg/drawLine.js +4 -4
- package/dist/cjs/drawingSvg/drawLine.js.map +1 -1
- package/dist/cjs/drawingSvg/drawPolyline.js +4 -4
- package/dist/cjs/drawingSvg/drawPolyline.js.map +1 -1
- package/dist/cjs/drawingSvg/drawRect.js +4 -4
- package/dist/cjs/drawingSvg/drawRect.js.map +1 -1
- package/dist/cjs/drawingSvg/drawTextBox.js +4 -4
- package/dist/cjs/drawingSvg/drawTextBox.js.map +1 -1
- package/dist/cjs/drawingSvg/index.d.ts +3 -1
- package/dist/cjs/drawingSvg/index.js +5 -1
- package/dist/cjs/drawingSvg/index.js.map +1 -1
- package/dist/cjs/drawingSvg/setAttributesIfNecessary.d.ts +2 -0
- package/dist/cjs/drawingSvg/{_setAttributesIfNecessary.js → setAttributesIfNecessary.js} +5 -5
- package/dist/cjs/drawingSvg/setAttributesIfNecessary.js.map +1 -0
- package/dist/cjs/drawingSvg/setNewAttributesIfValid.d.ts +2 -0
- package/dist/cjs/drawingSvg/{_setNewAttributesIfValid.js → setNewAttributesIfValid.js} +5 -5
- package/dist/cjs/drawingSvg/setNewAttributesIfValid.js.map +1 -0
- package/dist/cjs/enums/Events.d.ts +1 -0
- package/dist/cjs/enums/Events.js +1 -0
- package/dist/cjs/enums/Events.js.map +1 -1
- package/dist/cjs/eventDispatchers/shared/getMouseModifier.js +10 -5
- package/dist/cjs/eventDispatchers/shared/getMouseModifier.js.map +1 -1
- package/dist/cjs/eventListeners/keyboard/keyDownListener.js +8 -0
- package/dist/cjs/eventListeners/keyboard/keyDownListener.js.map +1 -1
- package/dist/cjs/eventListeners/mouse/mouseDownListener.js +2 -1
- package/dist/cjs/eventListeners/mouse/mouseDownListener.js.map +1 -1
- package/dist/cjs/eventListeners/touch/touchStartListener.js +10 -5
- package/dist/cjs/eventListeners/touch/touchStartListener.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/stateManagement/annotation/config/ToolStyle.js +1 -0
- package/dist/cjs/stateManagement/annotation/config/ToolStyle.js.map +1 -1
- package/dist/cjs/stateManagement/annotation/config/getState.js +6 -3
- package/dist/cjs/stateManagement/annotation/config/getState.js.map +1 -1
- package/dist/cjs/stateManagement/annotation/config/helpers.js +4 -2
- package/dist/cjs/stateManagement/annotation/config/helpers.js.map +1 -1
- package/dist/cjs/store/SynchronizerManager/Synchronizer.js +10 -2
- package/dist/cjs/store/SynchronizerManager/Synchronizer.js.map +1 -1
- package/dist/cjs/store/ToolGroupManager/ToolGroup.d.ts +3 -3
- package/dist/cjs/store/ToolGroupManager/ToolGroup.js +9 -2
- package/dist/cjs/store/ToolGroupManager/ToolGroup.js.map +1 -1
- package/dist/cjs/store/ToolGroupManager/getToolGroupsWithToolName.js +2 -1
- package/dist/cjs/store/ToolGroupManager/getToolGroupsWithToolName.js.map +1 -1
- package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js +25 -22
- package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
- package/dist/cjs/synchronizers/callbacks/voiSyncCallback.js +1 -1
- package/dist/cjs/synchronizers/callbacks/voiSyncCallback.js.map +1 -1
- package/dist/cjs/tools/MIPJumpToClickTool.js +4 -2
- package/dist/cjs/tools/MIPJumpToClickTool.js.map +1 -1
- package/dist/cjs/tools/PlanarRotateTool.js +2 -1
- package/dist/cjs/tools/PlanarRotateTool.js.map +1 -1
- package/dist/cjs/tools/ReferenceCursors.js +58 -29
- package/dist/cjs/tools/ReferenceCursors.js.map +1 -1
- package/dist/cjs/tools/ScaleOverlayTool.js +2 -1
- package/dist/cjs/tools/ScaleOverlayTool.js.map +1 -1
- package/dist/cjs/tools/annotation/AngleTool.d.ts +0 -1
- package/dist/cjs/tools/annotation/AngleTool.js +31 -14
- package/dist/cjs/tools/annotation/AngleTool.js.map +1 -1
- package/dist/cjs/tools/annotation/ArrowAnnotateTool.js +15 -1
- package/dist/cjs/tools/annotation/ArrowAnnotateTool.js.map +1 -1
- package/dist/cjs/tools/annotation/BidirectionalTool.d.ts +0 -1
- package/dist/cjs/tools/annotation/BidirectionalTool.js +29 -14
- package/dist/cjs/tools/annotation/BidirectionalTool.js.map +1 -1
- package/dist/cjs/tools/annotation/CircleROITool.d.ts +0 -1
- package/dist/cjs/tools/annotation/CircleROITool.js +56 -53
- package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -1
- package/dist/cjs/tools/annotation/CobbAngleTool.d.ts +0 -1
- package/dist/cjs/tools/annotation/CobbAngleTool.js +26 -11
- package/dist/cjs/tools/annotation/CobbAngleTool.js.map +1 -1
- package/dist/cjs/tools/annotation/DragProbeTool.js +13 -1
- package/dist/cjs/tools/annotation/DragProbeTool.js.map +1 -1
- package/dist/cjs/tools/annotation/EllipticalROITool.d.ts +0 -1
- package/dist/cjs/tools/annotation/EllipticalROITool.js +48 -46
- package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/cjs/tools/annotation/LengthTool.d.ts +0 -1
- package/dist/cjs/tools/annotation/LengthTool.js +26 -11
- package/dist/cjs/tools/annotation/LengthTool.js.map +1 -1
- package/dist/cjs/tools/annotation/PlanarFreehandROITool.d.ts +0 -1
- package/dist/cjs/tools/annotation/PlanarFreehandROITool.js +50 -51
- package/dist/cjs/tools/annotation/PlanarFreehandROITool.js.map +1 -1
- package/dist/cjs/tools/annotation/ProbeTool.d.ts +0 -1
- package/dist/cjs/tools/annotation/ProbeTool.js +18 -13
- package/dist/cjs/tools/annotation/ProbeTool.js.map +1 -1
- package/dist/cjs/tools/annotation/RectangleROITool.d.ts +0 -1
- package/dist/cjs/tools/annotation/RectangleROITool.js +46 -48
- package/dist/cjs/tools/annotation/RectangleROITool.js.map +1 -1
- package/dist/cjs/tools/base/AnnotationTool.d.ts +2 -1
- package/dist/cjs/tools/base/AnnotationTool.js +27 -16
- package/dist/cjs/tools/base/AnnotationTool.js.map +1 -1
- package/dist/cjs/tools/base/index.d.ts +2 -1
- package/dist/cjs/tools/base/index.js +3 -1
- package/dist/cjs/tools/base/index.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/removeLabelmapFromElement.js +3 -0
- package/dist/cjs/tools/displayTools/Labelmap/removeLabelmapFromElement.js.map +1 -1
- package/dist/cjs/tools/displayTools/SegmentationDisplayTool.js +5 -6
- package/dist/cjs/tools/displayTools/SegmentationDisplayTool.js.map +1 -1
- package/dist/cjs/tools/index.d.ts +2 -2
- package/dist/cjs/tools/index.js +2 -1
- package/dist/cjs/tools/index.js.map +1 -1
- package/dist/cjs/tools/segmentation/BrushTool.js +24 -17
- package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/PaintFillTool.js +4 -2
- package/dist/cjs/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +2 -0
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js +5 -7
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +3 -0
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js +38 -10
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +3 -0
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js +10 -0
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -0
- package/dist/cjs/types/CINETypes.d.ts +2 -0
- package/dist/cjs/types/CalculatorTypes.d.ts +6 -0
- package/dist/cjs/types/CalculatorTypes.js +3 -0
- package/dist/cjs/types/CalculatorTypes.js.map +1 -0
- package/dist/cjs/types/EventTypes.d.ts +8 -1
- package/dist/cjs/types/ISetToolModeOptions.d.ts +2 -2
- package/dist/cjs/types/IToolGroup.d.ts +3 -2
- package/dist/cjs/types/ToolProps.d.ts +5 -1
- package/dist/cjs/types/index.d.ts +3 -2
- package/dist/cjs/utilities/cine/playClip.js +13 -3
- package/dist/cjs/utilities/cine/playClip.js.map +1 -1
- package/dist/cjs/utilities/dynamicVolume/getDataInTime.js +7 -4
- package/dist/cjs/utilities/dynamicVolume/getDataInTime.js.map +1 -1
- package/dist/cjs/utilities/getCalibratedUnits.js +10 -5
- package/dist/cjs/utilities/getCalibratedUnits.js.map +1 -1
- package/dist/cjs/utilities/math/basic/BasicStatsCalculator.d.ts +14 -0
- package/dist/cjs/utilities/math/basic/BasicStatsCalculator.js +44 -0
- package/dist/cjs/utilities/math/basic/BasicStatsCalculator.js.map +1 -0
- package/dist/cjs/utilities/math/basic/Calculator.d.ts +8 -0
- package/dist/cjs/utilities/math/basic/Calculator.js +6 -0
- package/dist/cjs/utilities/math/basic/Calculator.js.map +1 -0
- package/dist/cjs/utilities/math/basic/index.d.ts +3 -0
- package/dist/cjs/utilities/math/basic/index.js +11 -0
- package/dist/cjs/utilities/math/basic/index.js.map +1 -0
- package/dist/cjs/utilities/math/index.d.ts +2 -1
- package/dist/cjs/utilities/math/index.js +3 -1
- package/dist/cjs/utilities/math/index.js.map +1 -1
- package/dist/cjs/utilities/math/midPoint.js +2 -1
- package/dist/cjs/utilities/math/midPoint.js.map +1 -1
- package/dist/cjs/utilities/math/polyline/pointInPolyline.js +2 -1
- package/dist/cjs/utilities/math/polyline/pointInPolyline.js.map +1 -1
- package/dist/cjs/utilities/math/vec2/liangBarksyClip.d.ts +1 -1
- package/dist/cjs/utilities/math/vec2/liangBarksyClip.js +10 -5
- package/dist/cjs/utilities/math/vec2/liangBarksyClip.js.map +1 -1
- package/dist/cjs/utilities/pointInShapeCallback.d.ts +7 -1
- package/dist/cjs/utilities/pointInShapeCallback.js +6 -1
- package/dist/cjs/utilities/pointInShapeCallback.js.map +1 -1
- package/dist/cjs/utilities/roundNumber.js +4 -2
- package/dist/cjs/utilities/roundNumber.js.map +1 -1
- package/dist/cjs/utilities/segmentation/brushSizeForToolGroup.d.ts +2 -2
- package/dist/cjs/utilities/segmentation/brushSizeForToolGroup.js +4 -4
- package/dist/cjs/utilities/segmentation/brushSizeForToolGroup.js.map +1 -1
- package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js +2 -1
- package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
- package/dist/cjs/utilities/segmentation/utilities.d.ts +1 -2
- package/dist/cjs/utilities/segmentation/utilities.js +4 -1
- package/dist/cjs/utilities/segmentation/utilities.js.map +1 -1
- package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js +4 -4
- package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
- package/dist/esm/drawingSvg/drawCircle.js +9 -5
- package/dist/esm/drawingSvg/drawCircle.js.map +1 -1
- package/dist/esm/drawingSvg/drawEllipse.js +4 -4
- package/dist/esm/drawingSvg/drawEllipse.js.map +1 -1
- package/dist/esm/drawingSvg/drawHandles.js +4 -4
- package/dist/esm/drawingSvg/drawHandles.js.map +1 -1
- package/dist/esm/drawingSvg/drawLine.js +4 -4
- package/dist/esm/drawingSvg/drawLine.js.map +1 -1
- package/dist/esm/drawingSvg/drawPolyline.js +4 -4
- package/dist/esm/drawingSvg/drawPolyline.js.map +1 -1
- package/dist/esm/drawingSvg/drawRect.js +4 -4
- package/dist/esm/drawingSvg/drawRect.js.map +1 -1
- package/dist/esm/drawingSvg/drawTextBox.js +4 -4
- package/dist/esm/drawingSvg/drawTextBox.js.map +1 -1
- package/dist/esm/drawingSvg/index.d.ts +3 -1
- package/dist/esm/drawingSvg/index.js +3 -1
- package/dist/esm/drawingSvg/index.js.map +1 -1
- package/dist/esm/drawingSvg/setAttributesIfNecessary.d.ts +2 -0
- package/dist/esm/drawingSvg/{_setAttributesIfNecessary.js → setAttributesIfNecessary.js} +3 -3
- package/dist/esm/drawingSvg/setAttributesIfNecessary.js.map +1 -0
- package/dist/esm/drawingSvg/setNewAttributesIfValid.d.ts +2 -0
- package/dist/esm/drawingSvg/{_setNewAttributesIfValid.js → setNewAttributesIfValid.js} +3 -3
- package/dist/esm/drawingSvg/setNewAttributesIfValid.js.map +1 -0
- package/dist/esm/enums/Events.d.ts +1 -0
- package/dist/esm/enums/Events.js +1 -0
- package/dist/esm/enums/Events.js.map +1 -1
- package/dist/esm/eventDispatchers/shared/getMouseModifier.js +10 -5
- package/dist/esm/eventDispatchers/shared/getMouseModifier.js.map +1 -1
- package/dist/esm/eventListeners/keyboard/keyDownListener.js +8 -0
- package/dist/esm/eventListeners/keyboard/keyDownListener.js.map +1 -1
- package/dist/esm/eventListeners/mouse/mouseDownListener.js +2 -1
- package/dist/esm/eventListeners/mouse/mouseDownListener.js.map +1 -1
- package/dist/esm/eventListeners/touch/touchStartListener.js +10 -5
- package/dist/esm/eventListeners/touch/touchStartListener.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/stateManagement/annotation/config/ToolStyle.js +1 -0
- package/dist/esm/stateManagement/annotation/config/ToolStyle.js.map +1 -1
- package/dist/esm/stateManagement/annotation/config/getState.js +6 -3
- package/dist/esm/stateManagement/annotation/config/getState.js.map +1 -1
- package/dist/esm/stateManagement/annotation/config/helpers.js +4 -2
- package/dist/esm/stateManagement/annotation/config/helpers.js.map +1 -1
- package/dist/esm/store/SynchronizerManager/Synchronizer.js +10 -2
- package/dist/esm/store/SynchronizerManager/Synchronizer.js.map +1 -1
- package/dist/esm/store/ToolGroupManager/ToolGroup.d.ts +3 -3
- package/dist/esm/store/ToolGroupManager/ToolGroup.js +10 -3
- package/dist/esm/store/ToolGroupManager/ToolGroup.js.map +1 -1
- package/dist/esm/store/ToolGroupManager/getToolGroupsWithToolName.js +2 -1
- package/dist/esm/store/ToolGroupManager/getToolGroupsWithToolName.js.map +1 -1
- package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js +26 -23
- package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
- package/dist/esm/synchronizers/callbacks/voiSyncCallback.js +1 -1
- package/dist/esm/synchronizers/callbacks/voiSyncCallback.js.map +1 -1
- package/dist/esm/tools/MIPJumpToClickTool.js +4 -2
- package/dist/esm/tools/MIPJumpToClickTool.js.map +1 -1
- package/dist/esm/tools/PlanarRotateTool.js +2 -1
- package/dist/esm/tools/PlanarRotateTool.js.map +1 -1
- package/dist/esm/tools/ReferenceCursors.js +58 -29
- package/dist/esm/tools/ReferenceCursors.js.map +1 -1
- package/dist/esm/tools/ScaleOverlayTool.js +2 -1
- package/dist/esm/tools/ScaleOverlayTool.js.map +1 -1
- package/dist/esm/tools/annotation/AngleTool.d.ts +0 -1
- package/dist/esm/tools/annotation/AngleTool.js +31 -14
- package/dist/esm/tools/annotation/AngleTool.js.map +1 -1
- package/dist/esm/tools/annotation/ArrowAnnotateTool.js +15 -1
- package/dist/esm/tools/annotation/ArrowAnnotateTool.js.map +1 -1
- package/dist/esm/tools/annotation/BidirectionalTool.d.ts +0 -1
- package/dist/esm/tools/annotation/BidirectionalTool.js +29 -14
- package/dist/esm/tools/annotation/BidirectionalTool.js.map +1 -1
- package/dist/esm/tools/annotation/CircleROITool.d.ts +0 -1
- package/dist/esm/tools/annotation/CircleROITool.js +55 -53
- package/dist/esm/tools/annotation/CircleROITool.js.map +1 -1
- package/dist/esm/tools/annotation/CobbAngleTool.d.ts +0 -1
- package/dist/esm/tools/annotation/CobbAngleTool.js +26 -11
- package/dist/esm/tools/annotation/CobbAngleTool.js.map +1 -1
- package/dist/esm/tools/annotation/DragProbeTool.js +13 -1
- package/dist/esm/tools/annotation/DragProbeTool.js.map +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.d.ts +0 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js +47 -46
- package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/esm/tools/annotation/LengthTool.d.ts +0 -1
- package/dist/esm/tools/annotation/LengthTool.js +26 -11
- package/dist/esm/tools/annotation/LengthTool.js.map +1 -1
- package/dist/esm/tools/annotation/PlanarFreehandROITool.d.ts +0 -1
- package/dist/esm/tools/annotation/PlanarFreehandROITool.js +49 -51
- package/dist/esm/tools/annotation/PlanarFreehandROITool.js.map +1 -1
- package/dist/esm/tools/annotation/ProbeTool.d.ts +0 -1
- package/dist/esm/tools/annotation/ProbeTool.js +18 -13
- package/dist/esm/tools/annotation/ProbeTool.js.map +1 -1
- package/dist/esm/tools/annotation/RectangleROITool.d.ts +0 -1
- package/dist/esm/tools/annotation/RectangleROITool.js +45 -48
- package/dist/esm/tools/annotation/RectangleROITool.js.map +1 -1
- package/dist/esm/tools/base/AnnotationTool.d.ts +2 -1
- package/dist/esm/tools/base/AnnotationTool.js +26 -16
- package/dist/esm/tools/base/AnnotationTool.js.map +1 -1
- package/dist/esm/tools/base/index.d.ts +2 -1
- package/dist/esm/tools/base/index.js +2 -1
- package/dist/esm/tools/base/index.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js +4 -1
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js.map +1 -1
- package/dist/esm/tools/displayTools/SegmentationDisplayTool.js +5 -6
- package/dist/esm/tools/displayTools/SegmentationDisplayTool.js.map +1 -1
- package/dist/esm/tools/index.d.ts +2 -2
- package/dist/esm/tools/index.js +2 -2
- package/dist/esm/tools/index.js.map +1 -1
- package/dist/esm/tools/segmentation/BrushTool.js +25 -18
- package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/esm/tools/segmentation/PaintFillTool.js +4 -2
- package/dist/esm/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseSphere.d.ts +2 -0
- package/dist/esm/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillCircle.js +1 -6
- package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillSphere.d.ts +3 -0
- package/dist/esm/tools/segmentation/strategies/fillSphere.js +33 -9
- package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +3 -0
- package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js +8 -0
- package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -0
- package/dist/esm/types/CINETypes.d.ts +2 -0
- package/dist/esm/types/CalculatorTypes.d.ts +6 -0
- package/dist/esm/types/CalculatorTypes.js +2 -0
- package/dist/esm/types/CalculatorTypes.js.map +1 -0
- package/dist/esm/types/EventTypes.d.ts +8 -1
- package/dist/esm/types/ISetToolModeOptions.d.ts +2 -2
- package/dist/esm/types/IToolGroup.d.ts +3 -2
- package/dist/esm/types/ToolProps.d.ts +5 -1
- package/dist/esm/types/index.d.ts +3 -2
- package/dist/esm/utilities/cine/playClip.js +13 -4
- package/dist/esm/utilities/cine/playClip.js.map +1 -1
- package/dist/esm/utilities/dynamicVolume/getDataInTime.js +7 -4
- package/dist/esm/utilities/dynamicVolume/getDataInTime.js.map +1 -1
- package/dist/esm/utilities/getCalibratedUnits.js +10 -5
- package/dist/esm/utilities/getCalibratedUnits.js.map +1 -1
- package/dist/esm/utilities/math/basic/BasicStatsCalculator.d.ts +14 -0
- package/dist/esm/utilities/math/basic/BasicStatsCalculator.js +36 -0
- package/dist/esm/utilities/math/basic/BasicStatsCalculator.js.map +1 -0
- package/dist/esm/utilities/math/basic/Calculator.d.ts +8 -0
- package/dist/esm/utilities/math/basic/Calculator.js +4 -0
- package/dist/esm/utilities/math/basic/Calculator.js.map +1 -0
- package/dist/esm/utilities/math/basic/index.d.ts +3 -0
- package/dist/esm/utilities/math/basic/index.js +4 -0
- package/dist/esm/utilities/math/basic/index.js.map +1 -0
- package/dist/esm/utilities/math/index.d.ts +2 -1
- package/dist/esm/utilities/math/index.js +2 -1
- package/dist/esm/utilities/math/index.js.map +1 -1
- package/dist/esm/utilities/math/midPoint.js +2 -1
- package/dist/esm/utilities/math/midPoint.js.map +1 -1
- package/dist/esm/utilities/math/polyline/pointInPolyline.js +2 -1
- package/dist/esm/utilities/math/polyline/pointInPolyline.js.map +1 -1
- package/dist/esm/utilities/math/vec2/liangBarksyClip.d.ts +1 -1
- package/dist/esm/utilities/math/vec2/liangBarksyClip.js +10 -5
- package/dist/esm/utilities/math/vec2/liangBarksyClip.js.map +1 -1
- package/dist/esm/utilities/pointInShapeCallback.d.ts +7 -1
- package/dist/esm/utilities/pointInShapeCallback.js +6 -1
- package/dist/esm/utilities/pointInShapeCallback.js.map +1 -1
- package/dist/esm/utilities/roundNumber.js +4 -2
- package/dist/esm/utilities/roundNumber.js.map +1 -1
- package/dist/esm/utilities/segmentation/brushSizeForToolGroup.d.ts +2 -2
- package/dist/esm/utilities/segmentation/brushSizeForToolGroup.js +4 -4
- package/dist/esm/utilities/segmentation/brushSizeForToolGroup.js.map +1 -1
- package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js +2 -1
- package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
- package/dist/esm/utilities/segmentation/utilities.d.ts +1 -2
- package/dist/esm/utilities/segmentation/utilities.js +4 -1
- package/dist/esm/utilities/segmentation/utilities.js.map +1 -1
- package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +4 -4
- package/dist/esm/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +3 -3
- package/src/drawingSvg/drawCircle.ts +17 -5
- package/src/drawingSvg/drawEllipse.ts +4 -4
- package/src/drawingSvg/drawHandles.ts +4 -4
- package/src/drawingSvg/drawLine.ts +4 -4
- package/src/drawingSvg/drawPolyline.ts +4 -4
- package/src/drawingSvg/drawRect.ts +4 -4
- package/src/drawingSvg/drawTextBox.ts +4 -4
- package/src/drawingSvg/index.ts +4 -0
- package/src/drawingSvg/{_setAttributesIfNecessary.ts → setAttributesIfNecessary.ts} +2 -2
- package/src/drawingSvg/{_setNewAttributesIfValid.ts → setNewAttributesIfValid.ts} +2 -2
- package/src/enums/Events.ts +13 -0
- package/src/eventDispatchers/shared/getMouseModifier.ts +15 -5
- package/src/eventListeners/keyboard/keyDownListener.ts +13 -0
- package/src/eventListeners/mouse/mouseDownListener.ts +3 -1
- package/src/eventListeners/touch/touchStartListener.ts +15 -5
- package/src/index.ts +2 -0
- package/src/stateManagement/annotation/config/ToolStyle.ts +1 -0
- package/src/stateManagement/annotation/config/getState.ts +7 -3
- package/src/stateManagement/annotation/config/helpers.ts +6 -2
- package/src/store/SynchronizerManager/Synchronizer.ts +16 -8
- package/src/store/ToolGroupManager/ToolGroup.ts +21 -5
- package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +3 -1
- package/src/synchronizers/callbacks/stackImageSyncCallback.ts +63 -68
- package/src/synchronizers/callbacks/voiSyncCallback.ts +1 -1
- package/src/tools/MIPJumpToClickTool.ts +6 -2
- package/src/tools/PlanarRotateTool.ts +3 -1
- package/src/tools/ReferenceCursors.ts +85 -29
- package/src/tools/ScaleOverlayTool.ts +3 -1
- package/src/tools/annotation/AngleTool.ts +38 -19
- package/src/tools/annotation/ArrowAnnotateTool.ts +16 -1
- package/src/tools/annotation/BidirectionalTool.ts +37 -23
- package/src/tools/annotation/CircleROITool.ts +83 -89
- package/src/tools/annotation/CobbAngleTool.ts +31 -16
- package/src/tools/annotation/DragProbeTool.ts +19 -1
- package/src/tools/annotation/EllipticalROITool.ts +63 -71
- package/src/tools/annotation/LengthTool.ts +32 -17
- package/src/tools/annotation/PlanarFreehandROITool.ts +56 -59
- package/src/tools/annotation/ProbeTool.ts +26 -19
- package/src/tools/annotation/RectangleROITool.ts +67 -75
- package/src/tools/base/AnnotationTool.ts +39 -17
- package/src/tools/base/index.ts +2 -1
- package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +3 -0
- package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +6 -1
- package/src/tools/displayTools/SegmentationDisplayTool.ts +12 -18
- package/src/tools/index.ts +2 -1
- package/src/tools/segmentation/BrushTool.ts +42 -19
- package/src/tools/segmentation/PaintFillTool.ts +10 -3
- package/src/tools/segmentation/strategies/eraseSphere.ts +2 -0
- package/src/tools/segmentation/strategies/fillCircle.ts +1 -13
- package/src/tools/segmentation/strategies/fillSphere.ts +56 -8
- package/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +16 -0
- package/src/types/CINETypes.ts +8 -2
- package/src/types/CalculatorTypes.ts +7 -0
- package/src/types/EventTypes.ts +20 -0
- package/src/types/ISetToolModeOptions.ts +2 -2
- package/src/types/IToolGroup.ts +6 -3
- package/src/types/ToolProps.ts +7 -1
- package/src/types/index.ts +9 -1
- package/src/utilities/cine/playClip.ts +20 -3
- package/src/utilities/dynamicVolume/getDataInTime.ts +9 -6
- package/src/utilities/getCalibratedUnits.ts +15 -5
- package/src/utilities/math/basic/BasicStatsCalculator.ts +60 -0
- package/src/utilities/math/basic/Calculator.ts +8 -0
- package/src/utilities/math/basic/index.ts +4 -0
- package/src/utilities/math/index.ts +10 -1
- package/src/utilities/math/midPoint.ts +3 -1
- package/src/utilities/math/polyline/pointInPolyline.ts +3 -1
- package/src/utilities/math/vec2/liangBarksyClip.ts +15 -5
- package/src/utilities/pointInShapeCallback.ts +15 -3
- package/src/utilities/roundNumber.ts +6 -2
- package/src/utilities/segmentation/brushSizeForToolGroup.ts +22 -4
- package/src/utilities/segmentation/thresholdVolumeByRange.ts +3 -1
- package/src/utilities/segmentation/utilities.ts +8 -1
- package/src/utilities/stackPrefetch/stackPrefetch.ts +10 -4
- package/dist/cjs/drawingSvg/_setAttributesIfNecessary.d.ts +0 -2
- package/dist/cjs/drawingSvg/_setAttributesIfNecessary.js.map +0 -1
- package/dist/cjs/drawingSvg/_setNewAttributesIfValid.d.ts +0 -2
- package/dist/cjs/drawingSvg/_setNewAttributesIfValid.js.map +0 -1
- package/dist/esm/drawingSvg/_setAttributesIfNecessary.d.ts +0 -2
- package/dist/esm/drawingSvg/_setAttributesIfNecessary.js.map +0 -1
- package/dist/esm/drawingSvg/_setNewAttributesIfValid.d.ts +0 -2
- package/dist/esm/drawingSvg/_setNewAttributesIfValid.js.map +0 -1
|
@@ -113,6 +113,7 @@ class LengthTool extends AnnotationTool {
|
|
|
113
113
|
supportedInteractionTypes: ['Mouse', 'Touch'],
|
|
114
114
|
configuration: {
|
|
115
115
|
preventHandleOutsideImage: false,
|
|
116
|
+
getTextLines: defaultGetTextLines,
|
|
116
117
|
},
|
|
117
118
|
}
|
|
118
119
|
) {
|
|
@@ -731,7 +732,22 @@ class LengthTool extends AnnotationTool {
|
|
|
731
732
|
return renderStatus;
|
|
732
733
|
}
|
|
733
734
|
|
|
734
|
-
const
|
|
735
|
+
const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
|
|
736
|
+
if (!options.visibility) {
|
|
737
|
+
data.handles.textBox = {
|
|
738
|
+
hasMoved: false,
|
|
739
|
+
worldPosition: <Types.Point3>[0, 0, 0],
|
|
740
|
+
worldBoundingBox: {
|
|
741
|
+
topLeft: <Types.Point3>[0, 0, 0],
|
|
742
|
+
topRight: <Types.Point3>[0, 0, 0],
|
|
743
|
+
bottomLeft: <Types.Point3>[0, 0, 0],
|
|
744
|
+
bottomRight: <Types.Point3>[0, 0, 0],
|
|
745
|
+
},
|
|
746
|
+
};
|
|
747
|
+
continue;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
const textLines = this.configuration.getTextLines(data, targetId);
|
|
735
751
|
|
|
736
752
|
// Need to update to sync with annotation while unlinked/not moved
|
|
737
753
|
if (!data.handles.textBox.hasMoved) {
|
|
@@ -754,7 +770,7 @@ class LengthTool extends AnnotationTool {
|
|
|
754
770
|
textBoxPosition,
|
|
755
771
|
canvasCoordinates,
|
|
756
772
|
{},
|
|
757
|
-
|
|
773
|
+
options
|
|
758
774
|
);
|
|
759
775
|
|
|
760
776
|
const { x: left, y: top, width, height } = boundingBox;
|
|
@@ -770,21 +786,6 @@ class LengthTool extends AnnotationTool {
|
|
|
770
786
|
return renderStatus;
|
|
771
787
|
};
|
|
772
788
|
|
|
773
|
-
// text line for the current active length annotation
|
|
774
|
-
_getTextLines(data, targetId) {
|
|
775
|
-
const cachedVolumeStats = data.cachedStats[targetId];
|
|
776
|
-
const { length, unit } = cachedVolumeStats;
|
|
777
|
-
|
|
778
|
-
// Can be null on load
|
|
779
|
-
if (length === undefined || length === null || isNaN(length)) {
|
|
780
|
-
return;
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
const textLines = [`${roundNumber(length)} ${unit}`];
|
|
784
|
-
|
|
785
|
-
return textLines;
|
|
786
|
-
}
|
|
787
|
-
|
|
788
789
|
_calculateLength(pos1, pos2) {
|
|
789
790
|
const dx = pos1[0] - pos2[0];
|
|
790
791
|
const dy = pos1[1] - pos2[1];
|
|
@@ -862,5 +863,19 @@ class LengthTool extends AnnotationTool {
|
|
|
862
863
|
}
|
|
863
864
|
}
|
|
864
865
|
|
|
866
|
+
function defaultGetTextLines(data, targetId): string[] {
|
|
867
|
+
const cachedVolumeStats = data.cachedStats[targetId];
|
|
868
|
+
const { length, unit } = cachedVolumeStats;
|
|
869
|
+
|
|
870
|
+
// Can be null on load
|
|
871
|
+
if (length === undefined || length === null || isNaN(length)) {
|
|
872
|
+
return;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
const textLines = [`${roundNumber(length)} ${unit}`];
|
|
876
|
+
|
|
877
|
+
return textLines;
|
|
878
|
+
}
|
|
879
|
+
|
|
865
880
|
LengthTool.toolName = 'Length';
|
|
866
881
|
export default LengthTool;
|
|
@@ -59,6 +59,7 @@ import {
|
|
|
59
59
|
ModalityUnitOptions,
|
|
60
60
|
getModalityUnit,
|
|
61
61
|
} from '../../utilities/getModalityUnit';
|
|
62
|
+
import { BasicStatsCalculator } from '../../utilities/math/basic';
|
|
62
63
|
|
|
63
64
|
const { pointCanProjectOnLine } = polyline;
|
|
64
65
|
const { EPSILON } = CONSTANTS;
|
|
@@ -124,6 +125,7 @@ const PARALLEL_THRESHOLD = 1 - EPSILON;
|
|
|
124
125
|
*
|
|
125
126
|
* Read more in the Docs section of the website.
|
|
126
127
|
*/
|
|
128
|
+
|
|
127
129
|
class PlanarFreehandROITool extends AnnotationTool {
|
|
128
130
|
static toolName;
|
|
129
131
|
|
|
@@ -215,6 +217,8 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
215
217
|
knotsRatioPercentageOnEdit: 40,
|
|
216
218
|
},
|
|
217
219
|
calculateStats: false,
|
|
220
|
+
getTextLines: defaultGetTextLines,
|
|
221
|
+
statsCalculator: BasicStatsCalculator,
|
|
218
222
|
},
|
|
219
223
|
}
|
|
220
224
|
) {
|
|
@@ -662,15 +666,18 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
662
666
|
renderStatus = true;
|
|
663
667
|
}
|
|
664
668
|
|
|
665
|
-
if (!this.configuration.calculateStats)
|
|
669
|
+
if (!this.configuration.calculateStats) {
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
666
672
|
|
|
667
673
|
annotations.forEach((annotation) => {
|
|
668
674
|
const activeAnnotationUID = this.commonData?.annotation.annotationUID;
|
|
669
675
|
if (
|
|
670
676
|
annotation.annotationUID === activeAnnotationUID &&
|
|
671
677
|
!this.commonData?.movingTextBox
|
|
672
|
-
)
|
|
678
|
+
) {
|
|
673
679
|
return;
|
|
680
|
+
}
|
|
674
681
|
|
|
675
682
|
const modalityUnitOptions = {
|
|
676
683
|
isPreScaled: isViewportPreScaled(viewport, targetId),
|
|
@@ -802,25 +809,10 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
802
809
|
const worldPosEnd = imageData.indexToWorld([iMax, jMax, kMax]);
|
|
803
810
|
const canvasPosEnd = viewport.worldToCanvas(worldPosEnd);
|
|
804
811
|
|
|
805
|
-
let count = 0;
|
|
806
|
-
let sum = 0;
|
|
807
|
-
let sumSquares = 0;
|
|
808
|
-
let max = -Infinity;
|
|
809
|
-
|
|
810
|
-
const statCalculator = ({ value: newValue }) => {
|
|
811
|
-
if (newValue > max) {
|
|
812
|
-
max = newValue;
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
sum += newValue;
|
|
816
|
-
sumSquares += newValue ** 2;
|
|
817
|
-
count += 1;
|
|
818
|
-
};
|
|
819
|
-
|
|
820
812
|
let curRow = 0;
|
|
821
813
|
let intersections = [];
|
|
822
814
|
let intersectionCounter = 0;
|
|
823
|
-
pointInShapeCallback(
|
|
815
|
+
const pointsInShape = pointInShapeCallback(
|
|
824
816
|
imageData,
|
|
825
817
|
(pointLPS, pointIJK) => {
|
|
826
818
|
let result = true;
|
|
@@ -854,28 +846,26 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
854
846
|
}
|
|
855
847
|
return result;
|
|
856
848
|
},
|
|
857
|
-
|
|
849
|
+
this.configuration.statsCalculator.statsCallback,
|
|
858
850
|
boundsIJK
|
|
859
851
|
);
|
|
860
852
|
|
|
861
|
-
const mean = sum / count;
|
|
862
|
-
|
|
863
|
-
// https://www.strchr.com/standard_deviation_in_one_pass?allcomments=1
|
|
864
|
-
let stdDev = sumSquares / count - mean ** 2;
|
|
865
|
-
stdDev = Math.sqrt(stdDev);
|
|
866
|
-
|
|
867
853
|
const modalityUnit = getModalityUnit(
|
|
868
854
|
metadata.Modality,
|
|
869
855
|
annotation.metadata.referencedImageId,
|
|
870
856
|
modalityUnitOptions
|
|
871
857
|
);
|
|
872
858
|
|
|
859
|
+
const stats = this.configuration.statsCalculator.getStatistics();
|
|
860
|
+
|
|
873
861
|
cachedStats[targetId] = {
|
|
874
862
|
Modality: metadata.Modality,
|
|
875
863
|
area,
|
|
876
|
-
mean,
|
|
877
|
-
max,
|
|
878
|
-
stdDev,
|
|
864
|
+
mean: stats[1]?.value,
|
|
865
|
+
max: stats[0]?.value,
|
|
866
|
+
stdDev: stats[3]?.value,
|
|
867
|
+
statsArray: stats,
|
|
868
|
+
pointsInShape: pointsInShape,
|
|
879
869
|
areaUnit: getCalibratedAreaUnits(null, image),
|
|
880
870
|
modalityUnit,
|
|
881
871
|
};
|
|
@@ -892,8 +882,21 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
892
882
|
const data = annotation.data;
|
|
893
883
|
const targetId = this.getTargetId(viewport);
|
|
894
884
|
|
|
895
|
-
const
|
|
896
|
-
|
|
885
|
+
const styleSpecifier: AnnotationStyle.StyleSpecifier = {
|
|
886
|
+
toolGroupId: this.toolGroupId,
|
|
887
|
+
toolName: this.getToolName(),
|
|
888
|
+
viewportId: enabledElement.viewport.id,
|
|
889
|
+
};
|
|
890
|
+
|
|
891
|
+
const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
|
|
892
|
+
if (!options.visibility) {
|
|
893
|
+
return;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
const textLines = this.configuration.getTextLines(data, targetId);
|
|
897
|
+
if (!textLines || textLines.length === 0) {
|
|
898
|
+
return;
|
|
899
|
+
}
|
|
897
900
|
|
|
898
901
|
const canvasCoordinates = data.polyline.map((p) =>
|
|
899
902
|
viewport.worldToCanvas(p)
|
|
@@ -909,12 +912,6 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
909
912
|
data.handles.textBox.worldPosition
|
|
910
913
|
);
|
|
911
914
|
|
|
912
|
-
const styleSpecifier: AnnotationStyle.StyleSpecifier = {
|
|
913
|
-
toolGroupId: this.toolGroupId,
|
|
914
|
-
toolName: this.getToolName(),
|
|
915
|
-
viewportId: enabledElement.viewport.id,
|
|
916
|
-
};
|
|
917
|
-
|
|
918
915
|
const textBoxUID = '1';
|
|
919
916
|
const boundingBox = drawLinkedTextBox(
|
|
920
917
|
svgDrawingHelper,
|
|
@@ -924,7 +921,7 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
924
921
|
textBoxPosition,
|
|
925
922
|
canvasCoordinates,
|
|
926
923
|
{},
|
|
927
|
-
|
|
924
|
+
options
|
|
928
925
|
);
|
|
929
926
|
|
|
930
927
|
const { x: left, y: top, width, height } = boundingBox;
|
|
@@ -936,35 +933,35 @@ class PlanarFreehandROITool extends AnnotationTool {
|
|
|
936
933
|
bottomRight: viewport.canvasToWorld([left + width, top + height]),
|
|
937
934
|
};
|
|
938
935
|
};
|
|
936
|
+
}
|
|
939
937
|
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
938
|
+
function defaultGetTextLines(data, targetId): string[] {
|
|
939
|
+
const cachedVolumeStats = data.cachedStats[targetId];
|
|
940
|
+
const { area, mean, stdDev, max, isEmptyArea, areaUnit, modalityUnit } =
|
|
941
|
+
cachedVolumeStats;
|
|
944
942
|
|
|
945
|
-
|
|
943
|
+
const textLines: string[] = [];
|
|
946
944
|
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
945
|
+
if (area) {
|
|
946
|
+
const areaLine = isEmptyArea
|
|
947
|
+
? `Area: Oblique not supported`
|
|
948
|
+
: `Area: ${roundNumber(area)} ${areaUnit}`;
|
|
949
|
+
textLines.push(areaLine);
|
|
950
|
+
}
|
|
953
951
|
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
952
|
+
if (mean) {
|
|
953
|
+
textLines.push(`Mean: ${roundNumber(mean)} ${modalityUnit}`);
|
|
954
|
+
}
|
|
957
955
|
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
956
|
+
if (max) {
|
|
957
|
+
textLines.push(`Max: ${roundNumber(max)} ${modalityUnit}`);
|
|
958
|
+
}
|
|
961
959
|
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
960
|
+
if (stdDev) {
|
|
961
|
+
textLines.push(`Std Dev: ${roundNumber(stdDev)} ${modalityUnit}`);
|
|
962
|
+
}
|
|
965
963
|
|
|
966
|
-
|
|
967
|
-
};
|
|
964
|
+
return textLines;
|
|
968
965
|
}
|
|
969
966
|
|
|
970
967
|
PlanarFreehandROITool.toolName = 'PlanarFreehandROI';
|
|
@@ -94,6 +94,7 @@ const { transformWorldToIndex } = csUtils;
|
|
|
94
94
|
* Read more in the Docs section of the website.
|
|
95
95
|
*
|
|
96
96
|
*/
|
|
97
|
+
|
|
97
98
|
class ProbeTool extends AnnotationTool {
|
|
98
99
|
static toolName;
|
|
99
100
|
|
|
@@ -118,6 +119,7 @@ class ProbeTool extends AnnotationTool {
|
|
|
118
119
|
configuration: {
|
|
119
120
|
shadow: true,
|
|
120
121
|
preventHandleOutsideImage: false,
|
|
122
|
+
getTextLines: defaultGetTextLines,
|
|
121
123
|
},
|
|
122
124
|
}
|
|
123
125
|
) {
|
|
@@ -525,7 +527,12 @@ class ProbeTool extends AnnotationTool {
|
|
|
525
527
|
|
|
526
528
|
renderStatus = true;
|
|
527
529
|
|
|
528
|
-
const
|
|
530
|
+
const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
|
|
531
|
+
if (!options.visibility) {
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
const textLines = this.configuration.getTextLines(data, targetId);
|
|
529
536
|
if (textLines) {
|
|
530
537
|
const textCanvasCoordinates = [
|
|
531
538
|
canvasCoordinates[0] + 6,
|
|
@@ -539,7 +546,7 @@ class ProbeTool extends AnnotationTool {
|
|
|
539
546
|
textUID,
|
|
540
547
|
textLines,
|
|
541
548
|
[textCanvasCoordinates[0], textCanvasCoordinates[1]],
|
|
542
|
-
|
|
549
|
+
options
|
|
543
550
|
);
|
|
544
551
|
}
|
|
545
552
|
}
|
|
@@ -547,23 +554,6 @@ class ProbeTool extends AnnotationTool {
|
|
|
547
554
|
return renderStatus;
|
|
548
555
|
};
|
|
549
556
|
|
|
550
|
-
_getTextLines(data, targetId: string): string[] | undefined {
|
|
551
|
-
const cachedVolumeStats = data.cachedStats[targetId];
|
|
552
|
-
const { index, value, modalityUnit } = cachedVolumeStats;
|
|
553
|
-
|
|
554
|
-
if (value === undefined) {
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
const textLines = [];
|
|
559
|
-
|
|
560
|
-
textLines.push(`(${index[0]}, ${index[1]}, ${index[2]})`);
|
|
561
|
-
|
|
562
|
-
textLines.push(`${value.toFixed(2)} ${modalityUnit}`);
|
|
563
|
-
|
|
564
|
-
return textLines;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
557
|
_calculateCachedStats(
|
|
568
558
|
annotation,
|
|
569
559
|
renderingEngine,
|
|
@@ -662,5 +652,22 @@ class ProbeTool extends AnnotationTool {
|
|
|
662
652
|
}
|
|
663
653
|
}
|
|
664
654
|
|
|
655
|
+
function defaultGetTextLines(data, targetId): string[] {
|
|
656
|
+
const cachedVolumeStats = data.cachedStats[targetId];
|
|
657
|
+
const { index, value, modalityUnit } = cachedVolumeStats;
|
|
658
|
+
|
|
659
|
+
if (value === undefined) {
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
const textLines = [];
|
|
664
|
+
|
|
665
|
+
textLines.push(`(${index[0]}, ${index[1]}, ${index[2]})`);
|
|
666
|
+
|
|
667
|
+
textLines.push(`${value.toFixed(2)} ${modalityUnit}`);
|
|
668
|
+
|
|
669
|
+
return textLines;
|
|
670
|
+
}
|
|
671
|
+
|
|
665
672
|
ProbeTool.toolName = 'Probe';
|
|
666
673
|
export default ProbeTool;
|
|
@@ -56,6 +56,8 @@ import {
|
|
|
56
56
|
import { StyleSpecifier } from '../../types/AnnotationStyle';
|
|
57
57
|
import { getModalityUnit } from '../../utilities/getModalityUnit';
|
|
58
58
|
import { isViewportPreScaled } from '../../utilities/viewport/isViewportPreScaled';
|
|
59
|
+
import { pointInShapeCallback } from '../../utilities/';
|
|
60
|
+
import { BasicStatsCalculator } from '../../utilities/math/basic';
|
|
59
61
|
|
|
60
62
|
const { transformWorldToIndex } = csUtils;
|
|
61
63
|
|
|
@@ -97,6 +99,7 @@ const { transformWorldToIndex } = csUtils;
|
|
|
97
99
|
*
|
|
98
100
|
* Read more in the Docs section of the website.
|
|
99
101
|
*/
|
|
102
|
+
|
|
100
103
|
class RectangleROITool extends AnnotationTool {
|
|
101
104
|
static toolName;
|
|
102
105
|
|
|
@@ -119,6 +122,8 @@ class RectangleROITool extends AnnotationTool {
|
|
|
119
122
|
configuration: {
|
|
120
123
|
shadow: true,
|
|
121
124
|
preventHandleOutsideImage: false,
|
|
125
|
+
getTextLines: defaultGetTextLines,
|
|
126
|
+
statsCalculator: BasicStatsCalculator,
|
|
122
127
|
},
|
|
123
128
|
}
|
|
124
129
|
) {
|
|
@@ -786,7 +791,22 @@ class RectangleROITool extends AnnotationTool {
|
|
|
786
791
|
|
|
787
792
|
renderStatus = true;
|
|
788
793
|
|
|
789
|
-
const
|
|
794
|
+
const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
|
|
795
|
+
if (!options.visibility) {
|
|
796
|
+
data.handles.textBox = {
|
|
797
|
+
hasMoved: false,
|
|
798
|
+
worldPosition: <Types.Point3>[0, 0, 0],
|
|
799
|
+
worldBoundingBox: {
|
|
800
|
+
topLeft: <Types.Point3>[0, 0, 0],
|
|
801
|
+
topRight: <Types.Point3>[0, 0, 0],
|
|
802
|
+
bottomLeft: <Types.Point3>[0, 0, 0],
|
|
803
|
+
bottomRight: <Types.Point3>[0, 0, 0],
|
|
804
|
+
},
|
|
805
|
+
};
|
|
806
|
+
continue;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
const textLines = this.configuration.getTextLines(data, targetId);
|
|
790
810
|
if (!textLines || textLines.length === 0) {
|
|
791
811
|
continue;
|
|
792
812
|
}
|
|
@@ -811,7 +831,7 @@ class RectangleROITool extends AnnotationTool {
|
|
|
811
831
|
textBoxPosition,
|
|
812
832
|
canvasCoordinates,
|
|
813
833
|
{},
|
|
814
|
-
|
|
834
|
+
options
|
|
815
835
|
);
|
|
816
836
|
|
|
817
837
|
const { x: left, y: top, width, height } = boundingBox;
|
|
@@ -845,33 +865,6 @@ class RectangleROITool extends AnnotationTool {
|
|
|
845
865
|
};
|
|
846
866
|
};
|
|
847
867
|
|
|
848
|
-
/**
|
|
849
|
-
* _getTextLines - Returns the Area, mean and std deviation of the area of the
|
|
850
|
-
* target volume enclosed by the rectangle.
|
|
851
|
-
*
|
|
852
|
-
* @param data - The annotation tool-specific data.
|
|
853
|
-
* @param targetId - The volumeId of the volume to display the stats for.
|
|
854
|
-
* @param isPreScaled - Whether the viewport is pre-scaled or not.
|
|
855
|
-
*/
|
|
856
|
-
_getTextLines = (data, targetId: string): string[] | undefined => {
|
|
857
|
-
const cachedVolumeStats = data.cachedStats[targetId];
|
|
858
|
-
const { area, mean, max, stdDev, areaUnit, modalityUnit } =
|
|
859
|
-
cachedVolumeStats;
|
|
860
|
-
|
|
861
|
-
if (mean === undefined) {
|
|
862
|
-
return;
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
const textLines: string[] = [];
|
|
866
|
-
|
|
867
|
-
textLines.push(`Area: ${roundNumber(area)} ${areaUnit}`);
|
|
868
|
-
textLines.push(`Mean: ${roundNumber(mean)} ${modalityUnit}`);
|
|
869
|
-
textLines.push(`Max: ${roundNumber(max)} ${modalityUnit}`);
|
|
870
|
-
textLines.push(`Std Dev: ${roundNumber(stdDev)} ${modalityUnit}`);
|
|
871
|
-
|
|
872
|
-
return textLines;
|
|
873
|
-
};
|
|
874
|
-
|
|
875
868
|
/**
|
|
876
869
|
* _calculateCachedStats - For each volume in the frame of reference that a
|
|
877
870
|
* tool instance in particular viewport defines as its target volume, find the
|
|
@@ -945,6 +938,12 @@ class RectangleROITool extends AnnotationTool {
|
|
|
945
938
|
const kMin = Math.min(worldPos1Index[2], worldPos2Index[2]);
|
|
946
939
|
const kMax = Math.max(worldPos1Index[2], worldPos2Index[2]);
|
|
947
940
|
|
|
941
|
+
const boundsIJK = [
|
|
942
|
+
[iMin, iMax],
|
|
943
|
+
[jMin, jMax],
|
|
944
|
+
[kMin, kMax],
|
|
945
|
+
] as [Types.Point2, Types.Point2, Types.Point2];
|
|
946
|
+
|
|
948
947
|
const { worldWidth, worldHeight } = getWorldWidthAndHeightFromCorners(
|
|
949
948
|
viewPlaneNormal,
|
|
950
949
|
viewUp,
|
|
@@ -955,61 +954,29 @@ class RectangleROITool extends AnnotationTool {
|
|
|
955
954
|
|
|
956
955
|
const area = Math.abs(worldWidth * worldHeight) / (scale * scale);
|
|
957
956
|
|
|
958
|
-
let count = 0;
|
|
959
|
-
let mean = 0;
|
|
960
|
-
let stdDev = 0;
|
|
961
|
-
let max = -Infinity;
|
|
962
|
-
|
|
963
|
-
const yMultiple = dimensions[0];
|
|
964
|
-
const zMultiple = dimensions[0] * dimensions[1];
|
|
965
|
-
|
|
966
|
-
//Todo: this can be replaced by pointInShapeCallback....
|
|
967
|
-
// This is a triple loop, but one of these 3 values will be constant
|
|
968
|
-
// In the planar view.
|
|
969
|
-
for (let k = kMin; k <= kMax; k++) {
|
|
970
|
-
for (let j = jMin; j <= jMax; j++) {
|
|
971
|
-
for (let i = iMin; i <= iMax; i++) {
|
|
972
|
-
const value = scalarData[k * zMultiple + j * yMultiple + i];
|
|
973
|
-
|
|
974
|
-
if (value > max) {
|
|
975
|
-
max = value;
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
count++;
|
|
979
|
-
mean += value;
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
mean /= count;
|
|
985
|
-
|
|
986
|
-
for (let k = kMin; k <= kMax; k++) {
|
|
987
|
-
for (let j = jMin; j <= jMax; j++) {
|
|
988
|
-
for (let i = iMin; i <= iMax; i++) {
|
|
989
|
-
const value = scalarData[k * zMultiple + j * yMultiple + i];
|
|
990
|
-
|
|
991
|
-
const valueMinusMean = value - mean;
|
|
992
|
-
|
|
993
|
-
stdDev += valueMinusMean * valueMinusMean;
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
stdDev /= count;
|
|
999
|
-
stdDev = Math.sqrt(stdDev);
|
|
1000
|
-
|
|
1001
957
|
const modalityUnit = getModalityUnit(
|
|
1002
958
|
metadata.Modality,
|
|
1003
959
|
annotation.metadata.referencedImageId,
|
|
1004
960
|
modalityUnitOptions
|
|
1005
961
|
);
|
|
1006
962
|
|
|
963
|
+
const pointsInShape = pointInShapeCallback(
|
|
964
|
+
imageData,
|
|
965
|
+
() => true,
|
|
966
|
+
this.configuration.statsCalculator.statsCallback,
|
|
967
|
+
boundsIJK
|
|
968
|
+
);
|
|
969
|
+
|
|
970
|
+
const stats = this.configuration.statsCalculator.getStatistics();
|
|
971
|
+
|
|
1007
972
|
cachedStats[targetId] = {
|
|
1008
973
|
Modality: metadata.Modality,
|
|
1009
974
|
area,
|
|
1010
|
-
mean,
|
|
1011
|
-
stdDev,
|
|
1012
|
-
max,
|
|
975
|
+
mean: stats[1]?.value,
|
|
976
|
+
stdDev: stats[2]?.value,
|
|
977
|
+
max: stats[0]?.value,
|
|
978
|
+
statsArray: stats,
|
|
979
|
+
pointsInShape: pointsInShape,
|
|
1013
980
|
areaUnit: getCalibratedAreaUnits(null, image),
|
|
1014
981
|
modalityUnit,
|
|
1015
982
|
};
|
|
@@ -1044,5 +1011,30 @@ class RectangleROITool extends AnnotationTool {
|
|
|
1044
1011
|
};
|
|
1045
1012
|
}
|
|
1046
1013
|
|
|
1014
|
+
/**
|
|
1015
|
+
* _getTextLines - Returns the Area, mean and std deviation of the area of the
|
|
1016
|
+
* target volume enclosed by the rectangle.
|
|
1017
|
+
*
|
|
1018
|
+
* @param data - The annotation tool-specific data.
|
|
1019
|
+
* @param targetId - The volumeId of the volume to display the stats for.
|
|
1020
|
+
*/
|
|
1021
|
+
function defaultGetTextLines(data, targetId: string): string[] {
|
|
1022
|
+
const cachedVolumeStats = data.cachedStats[targetId];
|
|
1023
|
+
const { area, mean, max, stdDev, areaUnit, modalityUnit } = cachedVolumeStats;
|
|
1024
|
+
|
|
1025
|
+
if (mean === undefined) {
|
|
1026
|
+
return;
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
const textLines: string[] = [];
|
|
1030
|
+
|
|
1031
|
+
textLines.push(`Area: ${roundNumber(area)} ${areaUnit}`);
|
|
1032
|
+
textLines.push(`Mean: ${roundNumber(mean)} ${modalityUnit}`);
|
|
1033
|
+
textLines.push(`Max: ${roundNumber(max)} ${modalityUnit}`);
|
|
1034
|
+
textLines.push(`Std Dev: ${roundNumber(stdDev)} ${modalityUnit}`);
|
|
1035
|
+
|
|
1036
|
+
return textLines;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1047
1039
|
RectangleROITool.toolName = 'RectangleROI';
|
|
1048
1040
|
export default RectangleROITool;
|
|
@@ -18,10 +18,12 @@ import {
|
|
|
18
18
|
EventTypes,
|
|
19
19
|
ToolHandle,
|
|
20
20
|
InteractionTypes,
|
|
21
|
+
ToolProps,
|
|
22
|
+
PublicToolProps,
|
|
21
23
|
} from '../../types';
|
|
22
24
|
import { StyleSpecifier } from '../../types/AnnotationStyle';
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
/**-q
|
|
25
27
|
* Abstract class for tools which create and display annotations on the
|
|
26
28
|
* cornerstone3D canvas. In addition, it provides a base class for segmentation
|
|
27
29
|
* tools that require drawing an annotation before running the segmentation strategy
|
|
@@ -37,6 +39,19 @@ abstract class AnnotationTool extends AnnotationDisplayTool {
|
|
|
37
39
|
// Abstract Methods - Must be implemented.
|
|
38
40
|
// ===================================================================
|
|
39
41
|
|
|
42
|
+
constructor(toolProps: PublicToolProps, defaultToolProps: ToolProps) {
|
|
43
|
+
super(toolProps, defaultToolProps);
|
|
44
|
+
|
|
45
|
+
if (toolProps.configuration?.getTextLines) {
|
|
46
|
+
this.configuration.getTextLines = toolProps.configuration.getTextLines;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (toolProps.configuration?.statsCalculator) {
|
|
50
|
+
this.configuration.statsCalculator =
|
|
51
|
+
toolProps.configuration.statsCalculator;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
40
55
|
/**
|
|
41
56
|
* @abstract addNewAnnotation Creates a new annotation based on the clicked mouse position
|
|
42
57
|
*
|
|
@@ -185,24 +200,26 @@ abstract class AnnotationTool extends AnnotationDisplayTool {
|
|
|
185
200
|
|
|
186
201
|
const { data } = annotation;
|
|
187
202
|
const { points, textBox } = data.handles;
|
|
188
|
-
const { worldBoundingBox } = textBox;
|
|
189
203
|
|
|
190
|
-
if (
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
204
|
+
if (textBox) {
|
|
205
|
+
const { worldBoundingBox } = textBox;
|
|
206
|
+
if (worldBoundingBox) {
|
|
207
|
+
const canvasBoundingBox = {
|
|
208
|
+
topLeft: viewport.worldToCanvas(worldBoundingBox.topLeft),
|
|
209
|
+
topRight: viewport.worldToCanvas(worldBoundingBox.topRight),
|
|
210
|
+
bottomLeft: viewport.worldToCanvas(worldBoundingBox.bottomLeft),
|
|
211
|
+
bottomRight: viewport.worldToCanvas(worldBoundingBox.bottomRight),
|
|
212
|
+
};
|
|
197
213
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
214
|
+
if (
|
|
215
|
+
canvasCoords[0] >= canvasBoundingBox.topLeft[0] &&
|
|
216
|
+
canvasCoords[0] <= canvasBoundingBox.bottomRight[0] &&
|
|
217
|
+
canvasCoords[1] >= canvasBoundingBox.topLeft[1] &&
|
|
218
|
+
canvasCoords[1] <= canvasBoundingBox.bottomRight[1]
|
|
219
|
+
) {
|
|
220
|
+
data.handles.activeHandleIndex = null;
|
|
221
|
+
return textBox;
|
|
222
|
+
}
|
|
206
223
|
}
|
|
207
224
|
}
|
|
208
225
|
|
|
@@ -240,6 +257,11 @@ abstract class AnnotationTool extends AnnotationDisplayTool {
|
|
|
240
257
|
// for the textBox.
|
|
241
258
|
|
|
242
259
|
return {
|
|
260
|
+
visibility: this.getStyle(
|
|
261
|
+
'textBoxVisibility',
|
|
262
|
+
specifications,
|
|
263
|
+
annotation
|
|
264
|
+
),
|
|
243
265
|
fontFamily: this.getStyle(
|
|
244
266
|
'textBoxFontFamily',
|
|
245
267
|
specifications,
|
package/src/tools/base/index.ts
CHANGED
|
@@ -276,6 +276,9 @@ function _setLabelmapColorAndOpacity(
|
|
|
276
276
|
isActiveLabelmap
|
|
277
277
|
);
|
|
278
278
|
|
|
279
|
+
// Todo: the below loop probably can be optimized so that we don't hit it
|
|
280
|
+
// unless a config has changed. Right now we get into the following loop
|
|
281
|
+
// even for brush drawing which does not makes sense
|
|
279
282
|
for (let i = 0; i < numColors; i++) {
|
|
280
283
|
const segmentIndex = i;
|
|
281
284
|
const segmentColor = colorLUT[segmentIndex];
|