@cornerstonejs/tools 1.36.3 → 1.37.1
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/drawEllipse.js +1 -1
- package/dist/cjs/drawingSvg/drawEllipse.js.map +1 -1
- package/dist/cjs/drawingSvg/drawEllipseByCoordinates.js +2 -3
- package/dist/cjs/drawingSvg/drawEllipseByCoordinates.js.map +1 -1
- package/dist/cjs/enums/StrategyCallbacks.d.ts +13 -0
- package/dist/cjs/enums/StrategyCallbacks.js +17 -0
- package/dist/cjs/enums/StrategyCallbacks.js.map +1 -0
- package/dist/cjs/enums/index.d.ts +2 -1
- package/dist/cjs/enums/index.js +3 -1
- package/dist/cjs/enums/index.js.map +1 -1
- package/dist/cjs/eventDispatchers/keyboardEventHandlers/keyDown.js +17 -7
- package/dist/cjs/eventDispatchers/keyboardEventHandlers/keyDown.js.map +1 -1
- package/dist/cjs/eventDispatchers/shared/getActiveToolForKeyboardEvent.js +4 -1
- package/dist/cjs/eventDispatchers/shared/getActiveToolForKeyboardEvent.js.map +1 -1
- package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.d.ts +3 -0
- package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js +33 -0
- package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js.map +1 -0
- package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -1
- package/dist/cjs/stateManagement/segmentation/config/segmentationColor.js +8 -1
- package/dist/cjs/stateManagement/segmentation/config/segmentationColor.js.map +1 -1
- package/dist/cjs/tools/annotation/EllipticalROITool.js +1 -2
- package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/cjs/tools/base/AnnotationTool.js.map +1 -1
- package/dist/cjs/tools/base/BaseTool.d.ts +2 -0
- package/dist/cjs/tools/base/BaseTool.js +7 -1
- package/dist/cjs/tools/base/BaseTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/BrushTool.d.ts +45 -3
- package/dist/cjs/tools/segmentation/BrushTool.js +197 -71
- package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/CircleScissorsTool.js +3 -1
- package/dist/cjs/tools/segmentation/CircleScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/SphereScissorsTool.js +3 -0
- package/dist/cjs/tools/segmentation/SphereScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/BrushStrategy.d.ts +87 -0
- package/dist/cjs/tools/segmentation/strategies/BrushStrategy.js +137 -0
- package/dist/cjs/tools/segmentation/strategies/BrushStrategy.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/determineSegmentIndex.d.ts +6 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/determineSegmentIndex.js +53 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/determineSegmentIndex.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/dynamicThreshold.d.ts +6 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/dynamicThreshold.js +41 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/dynamicThreshold.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/erase.d.ts +5 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/erase.js +12 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/erase.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/index.d.ts +35 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/index.js +24 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/index.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/islandRemoval.d.ts +5 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/islandRemoval.js +129 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/islandRemoval.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/preview.d.ts +8 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/preview.js +84 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/preview.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/regionFill.d.ts +5 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/regionFill.js +27 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/regionFill.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/setValue.d.ts +8 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/setValue.js +33 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/setValue.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/threshold.d.ts +5 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/threshold.js +24 -0
- package/dist/cjs/tools/segmentation/strategies/compositions/threshold.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/eraseCircle.d.ts +2 -7
- package/dist/cjs/tools/segmentation/strategies/eraseCircle.js +7 -4
- package/dist/cjs/tools/segmentation/strategies/eraseCircle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +2 -7
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.js +7 -6
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillCircle.d.ts +13 -8
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js +68 -90
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.js +3 -9
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +6 -9
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js +53 -64
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.d.ts +3 -0
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js +6 -0
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
- package/dist/cjs/types/BoundsIJK.d.ts +1 -1
- package/dist/cjs/types/FloodFillTypes.d.ts +4 -4
- package/dist/cjs/types/LabelmapToolOperationData.d.ts +7 -2
- package/dist/cjs/types/index.d.ts +2 -1
- package/dist/cjs/utilities/math/ellipse/getCanvasEllipseCorners.d.ts +2 -3
- package/dist/cjs/utilities/math/ellipse/index.d.ts +2 -2
- package/dist/cjs/utilities/math/ellipse/index.js +26 -2
- package/dist/cjs/utilities/math/ellipse/index.js.map +1 -1
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.d.ts +4 -1
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.js +30 -17
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.js.map +1 -1
- package/dist/cjs/utilities/math/sphere/pointInSphere.d.ts +1 -0
- package/dist/cjs/utilities/math/sphere/pointInSphere.js +2 -1
- package/dist/cjs/utilities/math/sphere/pointInSphere.js.map +1 -1
- package/dist/cjs/utilities/segmentation/brushThresholdForToolGroup.d.ts +1 -1
- package/dist/cjs/utilities/segmentation/brushThresholdForToolGroup.js +5 -5
- package/dist/cjs/utilities/segmentation/brushThresholdForToolGroup.js.map +1 -1
- package/dist/esm/drawingSvg/drawEllipse.js +1 -1
- package/dist/esm/drawingSvg/drawEllipse.js.map +1 -1
- package/dist/esm/drawingSvg/drawEllipseByCoordinates.js +2 -3
- package/dist/esm/drawingSvg/drawEllipseByCoordinates.js.map +1 -1
- package/dist/esm/enums/StrategyCallbacks.js +15 -0
- package/dist/esm/enums/StrategyCallbacks.js.map +1 -0
- package/dist/esm/enums/index.js +2 -1
- package/dist/esm/enums/index.js.map +1 -1
- package/dist/esm/eventDispatchers/keyboardEventHandlers/keyDown.js +17 -7
- package/dist/esm/eventDispatchers/keyboardEventHandlers/keyDown.js.map +1 -1
- package/dist/esm/eventDispatchers/shared/getActiveToolForKeyboardEvent.js +4 -1
- package/dist/esm/eventDispatchers/shared/getActiveToolForKeyboardEvent.js.map +1 -1
- package/dist/esm/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js +29 -0
- package/dist/esm/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js.map +1 -0
- package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -1
- package/dist/esm/stateManagement/segmentation/config/segmentationColor.js +8 -1
- package/dist/esm/stateManagement/segmentation/config/segmentationColor.js.map +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js +1 -2
- package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/esm/tools/base/AnnotationTool.js.map +1 -1
- package/dist/esm/tools/base/BaseTool.js +5 -1
- package/dist/esm/tools/base/BaseTool.js.map +1 -1
- package/dist/esm/tools/segmentation/BrushTool.js +208 -87
- package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/esm/tools/segmentation/CircleScissorsTool.js +3 -0
- package/dist/esm/tools/segmentation/CircleScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/SphereScissorsTool.js +3 -0
- package/dist/esm/tools/segmentation/SphereScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/BrushStrategy.js +136 -0
- package/dist/esm/tools/segmentation/strategies/BrushStrategy.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js +48 -0
- package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js +35 -0
- package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/erase.js +7 -0
- package/dist/esm/tools/segmentation/strategies/compositions/erase.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/index.js +19 -0
- package/dist/esm/tools/segmentation/strategies/compositions/index.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/islandRemoval.js +124 -0
- package/dist/esm/tools/segmentation/strategies/compositions/islandRemoval.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/preview.js +77 -0
- package/dist/esm/tools/segmentation/strategies/compositions/preview.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/regionFill.js +21 -0
- package/dist/esm/tools/segmentation/strategies/compositions/regionFill.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/setValue.js +28 -0
- package/dist/esm/tools/segmentation/strategies/compositions/setValue.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/compositions/threshold.js +19 -0
- package/dist/esm/tools/segmentation/strategies/compositions/threshold.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/eraseCircle.js +6 -8
- package/dist/esm/tools/segmentation/strategies/eraseCircle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseSphere.js +6 -7
- package/dist/esm/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillCircle.js +64 -88
- package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillRectangle.js +3 -9
- package/dist/esm/tools/segmentation/strategies/fillRectangle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillSphere.js +53 -64
- package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +7 -1
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
- package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
- package/dist/esm/utilities/math/ellipse/index.js +2 -2
- package/dist/esm/utilities/math/ellipse/index.js.map +1 -1
- package/dist/esm/utilities/math/ellipse/pointInEllipse.js +28 -16
- package/dist/esm/utilities/math/ellipse/pointInEllipse.js.map +1 -1
- package/dist/esm/utilities/math/sphere/pointInSphere.js +2 -1
- package/dist/esm/utilities/math/sphere/pointInSphere.js.map +1 -1
- package/dist/esm/utilities/segmentation/brushThresholdForToolGroup.js +11 -5
- package/dist/esm/utilities/segmentation/brushThresholdForToolGroup.js.map +1 -1
- package/dist/types/drawingSvg/drawEllipseByCoordinates.d.ts.map +1 -1
- package/dist/types/enums/StrategyCallbacks.d.ts +14 -0
- package/dist/types/enums/StrategyCallbacks.d.ts.map +1 -0
- package/dist/types/enums/index.d.ts +2 -1
- package/dist/types/eventDispatchers/keyboardEventHandlers/keyDown.d.ts.map +1 -1
- package/dist/types/eventDispatchers/shared/getActiveToolForKeyboardEvent.d.ts.map +1 -1
- package/dist/types/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.d.ts +4 -0
- package/dist/types/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.d.ts.map +1 -0
- package/dist/types/eventDispatchers/shared/getToolsWithActionsForMouseEvent.d.ts.map +1 -1
- package/dist/types/stateManagement/segmentation/config/segmentationColor.d.ts.map +1 -1
- package/dist/types/tools/annotation/EllipticalROITool.d.ts.map +1 -1
- package/dist/types/tools/base/AnnotationTool.d.ts.map +1 -1
- package/dist/types/tools/base/BaseTool.d.ts +2 -0
- package/dist/types/tools/base/BaseTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/BrushTool.d.ts +45 -3
- package/dist/types/tools/segmentation/BrushTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/CircleScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/SphereScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/BrushStrategy.d.ts +88 -0
- package/dist/types/tools/segmentation/strategies/BrushStrategy.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/determineSegmentIndex.d.ts +7 -0
- package/dist/types/tools/segmentation/strategies/compositions/determineSegmentIndex.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/dynamicThreshold.d.ts +7 -0
- package/dist/types/tools/segmentation/strategies/compositions/dynamicThreshold.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/erase.d.ts +6 -0
- package/dist/types/tools/segmentation/strategies/compositions/erase.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/index.d.ts +36 -0
- package/dist/types/tools/segmentation/strategies/compositions/index.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/islandRemoval.d.ts +6 -0
- package/dist/types/tools/segmentation/strategies/compositions/islandRemoval.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/preview.d.ts +9 -0
- package/dist/types/tools/segmentation/strategies/compositions/preview.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/regionFill.d.ts +6 -0
- package/dist/types/tools/segmentation/strategies/compositions/regionFill.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/setValue.d.ts +9 -0
- package/dist/types/tools/segmentation/strategies/compositions/setValue.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/compositions/threshold.d.ts +6 -0
- package/dist/types/tools/segmentation/strategies/compositions/threshold.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts +2 -7
- package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts +2 -7
- package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillCircle.d.ts +13 -8
- package/dist/types/tools/segmentation/strategies/fillCircle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillSphere.d.ts +6 -9
- package/dist/types/tools/segmentation/strategies/fillSphere.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts +3 -0
- package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
- package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts.map +1 -1
- package/dist/types/types/BoundsIJK.d.ts +1 -1
- package/dist/types/types/BoundsIJK.d.ts.map +1 -1
- package/dist/types/types/FloodFillTypes.d.ts +4 -4
- package/dist/types/types/FloodFillTypes.d.ts.map +1 -1
- package/dist/types/types/LabelmapToolOperationData.d.ts +7 -2
- package/dist/types/types/LabelmapToolOperationData.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +2 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/utilities/math/ellipse/getCanvasEllipseCorners.d.ts +2 -3
- package/dist/types/utilities/math/ellipse/getCanvasEllipseCorners.d.ts.map +1 -1
- package/dist/types/utilities/math/ellipse/index.d.ts +2 -2
- package/dist/types/utilities/math/ellipse/index.d.ts.map +1 -1
- package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts +4 -1
- package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts.map +1 -1
- package/dist/types/utilities/math/sphere/pointInSphere.d.ts +1 -0
- package/dist/types/utilities/math/sphere/pointInSphere.d.ts.map +1 -1
- package/dist/types/utilities/segmentation/brushThresholdForToolGroup.d.ts +1 -1
- package/dist/types/utilities/segmentation/brushThresholdForToolGroup.d.ts.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/drawEllipse.ts +8 -8
- package/src/drawingSvg/drawEllipseByCoordinates.ts +4 -4
- package/src/enums/StrategyCallbacks.ts +52 -0
- package/src/enums/index.js +2 -0
- package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +22 -11
- package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +6 -2
- package/src/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.ts +53 -0
- package/src/eventDispatchers/shared/getToolsWithActionsForMouseEvent.ts +0 -2
- package/src/stateManagement/segmentation/config/segmentationColor.ts +8 -1
- package/src/tools/annotation/EllipticalROITool.ts +1 -3
- package/src/tools/base/AnnotationTool.ts +0 -1
- package/src/tools/base/BaseTool.ts +32 -2
- package/src/tools/segmentation/BrushTool.ts +298 -68
- package/src/tools/segmentation/CircleScissorsTool.ts +3 -1
- package/src/tools/segmentation/SphereScissorsTool.ts +3 -0
- package/src/tools/segmentation/strategies/BrushStrategy.ts +364 -0
- package/src/tools/segmentation/strategies/compositions/determineSegmentIndex.ts +86 -0
- package/src/tools/segmentation/strategies/compositions/dynamicThreshold.ts +58 -0
- package/src/tools/segmentation/strategies/compositions/erase.ts +11 -0
- package/src/tools/segmentation/strategies/compositions/index.ts +19 -0
- package/src/tools/segmentation/strategies/compositions/islandRemoval.ts +179 -0
- package/src/tools/segmentation/strategies/compositions/preview.ts +138 -0
- package/src/tools/segmentation/strategies/compositions/regionFill.ts +45 -0
- package/src/tools/segmentation/strategies/compositions/setValue.ts +50 -0
- package/src/tools/segmentation/strategies/compositions/threshold.ts +35 -0
- package/src/tools/segmentation/strategies/eraseCircle.ts +10 -19
- package/src/tools/segmentation/strategies/eraseSphere.ts +10 -18
- package/src/tools/segmentation/strategies/fillCircle.ts +141 -164
- package/src/tools/segmentation/strategies/fillRectangle.ts +3 -13
- package/src/tools/segmentation/strategies/fillSphere.ts +105 -120
- package/src/tools/segmentation/strategies/utils/getStrategyData.ts +15 -1
- package/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +5 -5
- package/src/types/BoundsIJK.ts +1 -1
- package/src/types/FloodFillTypes.ts +4 -4
- package/src/types/LabelmapToolOperationData.ts +20 -1
- package/src/types/index.ts +2 -0
- package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +2 -2
- package/src/utilities/math/ellipse/index.ts +2 -2
- package/src/utilities/math/ellipse/pointInEllipse.ts +52 -18
- package/src/utilities/math/sphere/pointInSphere.ts +10 -2
- package/src/utilities/segmentation/brushThresholdForToolGroup.ts +12 -5
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { cache, utilities as csUtils } from '@cornerstonejs/core';
|
|
2
|
+
import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents';
|
|
3
|
+
import compositions from './compositions';
|
|
4
|
+
import { getStrategyData } from './utils/getStrategyData';
|
|
5
|
+
import { isVolumeSegmentation } from './utils/stackVolumeCheck';
|
|
6
|
+
import { StrategyCallbacks } from '../../../enums';
|
|
7
|
+
const { VoxelManager } = csUtils;
|
|
8
|
+
export default class BrushStrategy {
|
|
9
|
+
constructor(name, ...initializers) {
|
|
10
|
+
this._initialize = [];
|
|
11
|
+
this._fill = [];
|
|
12
|
+
this._onInteractionStart = [];
|
|
13
|
+
this.fill = (enabledElement, operationData) => {
|
|
14
|
+
const initializedData = this.initialize(enabledElement, operationData);
|
|
15
|
+
const { strategySpecificConfiguration = {}, centerIJK } = initializedData;
|
|
16
|
+
if (csUtils.isEqual(centerIJK, strategySpecificConfiguration.centerIJK)) {
|
|
17
|
+
return operationData.preview;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
strategySpecificConfiguration.centerIJK = centerIJK;
|
|
21
|
+
}
|
|
22
|
+
this._fill.forEach((func) => func(initializedData));
|
|
23
|
+
const { segmentationVoxelManager, previewVoxelManager, previewSegmentIndex, } = initializedData;
|
|
24
|
+
triggerSegmentationDataModified(initializedData.segmentationId, segmentationVoxelManager.getArrayOfSlices());
|
|
25
|
+
if (!previewSegmentIndex || !previewVoxelManager.modifiedSlices.size) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return initializedData.preview || initializedData;
|
|
29
|
+
};
|
|
30
|
+
this.onInteractionStart = (enabledElement, operationData) => {
|
|
31
|
+
const { preview } = operationData;
|
|
32
|
+
if (preview?.isPreviewFromHover) {
|
|
33
|
+
preview.isPreviewFromHover = false;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const initializedData = this.initialize(enabledElement, operationData);
|
|
37
|
+
this._onInteractionStart.forEach((func) => func.call(this, initializedData));
|
|
38
|
+
};
|
|
39
|
+
this.configurationName = name;
|
|
40
|
+
this.compositions = initializers;
|
|
41
|
+
initializers.forEach((initializer) => {
|
|
42
|
+
const result = typeof initializer === 'function' ? initializer() : initializer;
|
|
43
|
+
if (!result) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const key in result) {
|
|
47
|
+
if (!BrushStrategy.childFunctions[key]) {
|
|
48
|
+
throw new Error(`Didn't find ${key} as a brush strategy`);
|
|
49
|
+
}
|
|
50
|
+
BrushStrategy.childFunctions[key](this, result[key]);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
this.strategyFunction = (enabledElement, operationData) => this.fill(enabledElement, operationData);
|
|
54
|
+
for (const key of Object.keys(BrushStrategy.childFunctions)) {
|
|
55
|
+
this.strategyFunction[key] = this[key];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
static { this.COMPOSITIONS = compositions; }
|
|
59
|
+
static { this.childFunctions = {
|
|
60
|
+
[StrategyCallbacks.OnInteractionStart]: addListMethod(StrategyCallbacks.OnInteractionStart, StrategyCallbacks.Initialize),
|
|
61
|
+
[StrategyCallbacks.OnInteractionEnd]: addListMethod(StrategyCallbacks.OnInteractionEnd, StrategyCallbacks.Initialize),
|
|
62
|
+
[StrategyCallbacks.Fill]: addListMethod(StrategyCallbacks.Fill),
|
|
63
|
+
[StrategyCallbacks.Initialize]: addListMethod(StrategyCallbacks.Initialize),
|
|
64
|
+
[StrategyCallbacks.CreateIsInThreshold]: addSingletonMethod(StrategyCallbacks.CreateIsInThreshold),
|
|
65
|
+
[StrategyCallbacks.AcceptPreview]: addListMethod(StrategyCallbacks.AcceptPreview, StrategyCallbacks.Initialize),
|
|
66
|
+
[StrategyCallbacks.RejectPreview]: addListMethod(StrategyCallbacks.RejectPreview, StrategyCallbacks.Initialize),
|
|
67
|
+
[StrategyCallbacks.INTERNAL_setValue]: addSingletonMethod(StrategyCallbacks.INTERNAL_setValue),
|
|
68
|
+
[StrategyCallbacks.Preview]: addSingletonMethod(StrategyCallbacks.Preview, false),
|
|
69
|
+
compositions: null,
|
|
70
|
+
}; }
|
|
71
|
+
initialize(enabledElement, operationData) {
|
|
72
|
+
const { viewport } = enabledElement;
|
|
73
|
+
const data = getStrategyData({ operationData, viewport });
|
|
74
|
+
if (!data) {
|
|
75
|
+
console.warn('No data found for BrushStrategy');
|
|
76
|
+
return operationData.preview;
|
|
77
|
+
}
|
|
78
|
+
if (isVolumeSegmentation(operationData)) {
|
|
79
|
+
const { referencedVolumeId, volumeId } = operationData;
|
|
80
|
+
const imageVolume = cache.getVolume(referencedVolumeId);
|
|
81
|
+
const segmentation = cache.getVolume(volumeId);
|
|
82
|
+
if (!csUtils.isEqual(segmentation.dimensions, imageVolume.dimensions) ||
|
|
83
|
+
!csUtils.isEqual(segmentation.direction, imageVolume.direction)) {
|
|
84
|
+
throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const { imageVoxelManager, segmentationVoxelManager, segmentationImageData, } = data;
|
|
88
|
+
const previewVoxelManager = operationData.preview?.previewVoxelManager ||
|
|
89
|
+
VoxelManager.createHistoryVoxelManager(segmentationVoxelManager);
|
|
90
|
+
const previewEnabled = !!operationData.previewColors;
|
|
91
|
+
const previewSegmentIndex = previewEnabled ? 255 : undefined;
|
|
92
|
+
const initializedData = {
|
|
93
|
+
previewSegmentIndex,
|
|
94
|
+
...operationData,
|
|
95
|
+
enabledElement,
|
|
96
|
+
imageVoxelManager,
|
|
97
|
+
segmentationVoxelManager,
|
|
98
|
+
segmentationImageData,
|
|
99
|
+
previewVoxelManager,
|
|
100
|
+
viewport,
|
|
101
|
+
centerWorld: null,
|
|
102
|
+
brushStrategy: this,
|
|
103
|
+
};
|
|
104
|
+
this._initialize.forEach((func) => func(initializedData));
|
|
105
|
+
return initializedData;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function addListMethod(name, createInitialized) {
|
|
109
|
+
const listName = `_${name}`;
|
|
110
|
+
return (brushStrategy, func) => {
|
|
111
|
+
brushStrategy[listName] ||= [];
|
|
112
|
+
brushStrategy[listName].push(func);
|
|
113
|
+
brushStrategy[name] ||= createInitialized
|
|
114
|
+
? (enabledElement, operationData) => {
|
|
115
|
+
const initializedData = brushStrategy[createInitialized](enabledElement, operationData);
|
|
116
|
+
brushStrategy[listName].forEach((func) => func.call(brushStrategy, initializedData));
|
|
117
|
+
}
|
|
118
|
+
: (operationData) => {
|
|
119
|
+
brushStrategy[listName].forEach((func) => func.call(brushStrategy, operationData));
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function addSingletonMethod(name, isInitialized = true) {
|
|
124
|
+
return (brushStrategy, func) => {
|
|
125
|
+
if (brushStrategy[name]) {
|
|
126
|
+
throw new Error(`The singleton method ${name} already exists`);
|
|
127
|
+
}
|
|
128
|
+
brushStrategy[name] = isInitialized
|
|
129
|
+
? func
|
|
130
|
+
: (enabledElement, operationData) => {
|
|
131
|
+
operationData.enabledElement = enabledElement;
|
|
132
|
+
return func.call(brushStrategy, operationData);
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=BrushStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrushStrategy.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/BrushStrategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,iEAAiE,CAAC;AAClH,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMnD,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;AAyDjC,MAAM,CAAC,OAAO,OAAO,aAAa;IAkDhC,YAAY,IAAI,EAAE,GAAG,YAA2B;QALtC,gBAAW,GAAG,EAAE,CAAC;QACjB,UAAK,GAAG,EAAE,CAAC;QAEX,wBAAmB,GAAG,EAAE,CAAC;QA+B5B,SAAI,GAAG,CACZ,cAAqC,EACrC,aAA2C,EAC3C,EAAE;YACF,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;YAEvE,MAAM,EAAE,6BAA6B,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;YAG1E,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC,SAAS,CAAC,EAAE;gBACvE,OAAO,aAAa,CAAC,OAAO,CAAC;aAC9B;iBAAM;gBACL,6BAA6B,CAAC,SAAS,GAAG,SAAS,CAAC;aACrD;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YAEpD,MAAM,EACJ,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,GACpB,GAAG,eAAe,CAAC;YAEpB,+BAA+B,CAC7B,eAAe,CAAC,cAAc,EAC9B,wBAAwB,CAAC,gBAAgB,EAAE,CAC5C,CAAC;YAGF,IAAI,CAAC,mBAAmB,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,EAAE;gBACpE,OAAO,IAAI,CAAC;aACb;YAED,OAAO,eAAe,CAAC,OAAO,IAAI,eAAe,CAAC;QACpD,CAAC,CAAC;QAkEK,uBAAkB,GAAG,CAC1B,cAAqC,EACrC,aAA2C,EAC3C,EAAE;YACF,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;YAGlC,IAAI,OAAO,EAAE,kBAAkB,EAAE;gBAC/B,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBACnC,OAAO;aACR;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;YACvE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CACjC,CAAC;QACJ,CAAC,CAAC;QA/IA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACnC,MAAM,MAAM,GACV,OAAO,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAClE,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO;aACR;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;gBACxB,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBACtC,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,sBAAsB,CAAC,CAAC;iBAC3D;gBACD,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;aACtD;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE,CACxD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAE3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;YAC3D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SACxC;IACH,CAAC;IAnED,SAAc,iBAAY,GAAG,YAAY,CAAC,EAAA;IAE1C,SAAiB,mBAAc,GAAG;QAChC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,aAAa,CACnD,iBAAiB,CAAC,kBAAkB,EACpC,iBAAiB,CAAC,UAAU,CAC7B;QACD,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,aAAa,CACjD,iBAAiB,CAAC,gBAAgB,EAClC,iBAAiB,CAAC,UAAU,CAC7B;QACD,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC/D,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC;QAC3E,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,CACzD,iBAAiB,CAAC,mBAAmB,CACtC;QACD,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,aAAa,CAC9C,iBAAiB,CAAC,aAAa,EAC/B,iBAAiB,CAAC,UAAU,CAC7B;QACD,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,aAAa,CAC9C,iBAAiB,CAAC,aAAa,EAC/B,iBAAiB,CAAC,UAAU,CAC7B;QACD,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,kBAAkB,CACvD,iBAAiB,CAAC,iBAAiB,CACpC;QACD,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAC7C,iBAAiB,CAAC,OAAO,EACzB,KAAK,CACN;QAGD,YAAY,EAAE,IAAI;KACnB,CAAC,EAAA;IA4EQ,UAAU,CAClB,cAAqC,EACrC,aAA2C;QAE3C,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,OAAO,aAAa,CAAC,OAAO,CAAC;SAC9B;QAED,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE;YACvC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GACpC,aAAgD,CAAC;YAEnD,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE/C,IACE,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;gBACjE,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,EAC/D;gBACA,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;aACH;SACF;QAED,MAAM,EACJ,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,GACtB,GAAG,IAAI,CAAC;QACT,MAAM,mBAAmB,GACvB,aAAa,CAAC,OAAO,EAAE,mBAAmB;YAC1C,YAAY,CAAC,yBAAyB,CAAC,wBAAwB,CAAC,CAAC;QACnE,MAAM,cAAc,GAAG,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC;QACrD,MAAM,mBAAmB,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7D,MAAM,eAAe,GAA6B;YAChD,mBAAmB;YACnB,GAAG,aAAa;YAChB,cAAc;YACd,iBAAiB;YACjB,wBAAwB;YACxB,qBAAqB;YACrB,mBAAmB;YACnB,QAAQ;YAER,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,IAAI;SACpB,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QAE1D,OAAO,eAAe,CAAC;IACzB,CAAC;;AAiFH,SAAS,aAAa,CAAC,IAAY,EAAE,iBAA0B;IAC7D,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IAC5B,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE;QAC7B,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC,KAAK,iBAAiB;YACvC,CAAC,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;gBAChC,MAAM,eAAe,GAAG,aAAa,CAAC,iBAAiB,CAAC,CACtD,cAAc,EACd,aAAa,CACd,CAAC;gBACF,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAC1C,CAAC;YACJ,CAAC;YACH,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE;gBAChB,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CACxC,CAAC;YACJ,CAAC,CAAC;IACR,CAAC,CAAC;AACJ,CAAC;AAKD,SAAS,kBAAkB,CAAC,IAAY,EAAE,aAAa,GAAG,IAAI;IAC5D,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE;QAC7B,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,iBAAiB,CAAC,CAAC;SAChE;QACD,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa;YACjC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;gBAGhC,aAAa,CAAC,cAAc,GAAG,cAAc,CAAC;gBAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YACjD,CAAC,CAAC;IACR,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import pointInShapeCallback from '../../../../utilities/pointInShapeCallback';
|
|
2
|
+
import StrategyCallbacks from '../../../../enums/StrategyCallbacks';
|
|
3
|
+
export default {
|
|
4
|
+
[StrategyCallbacks.Initialize]: (operationData) => {
|
|
5
|
+
const { strategySpecificConfiguration } = operationData;
|
|
6
|
+
if (!strategySpecificConfiguration) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const { centerSegmentIndex } = strategySpecificConfiguration;
|
|
10
|
+
if (centerSegmentIndex) {
|
|
11
|
+
operationData.segmentIndex = centerSegmentIndex.segmentIndex;
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
[StrategyCallbacks.OnInteractionStart]: (operationData) => {
|
|
15
|
+
const { segmentIndex, previewSegmentIndex, segmentationVoxelManager: segmentationVoxelManager, centerIJK, strategySpecificConfiguration, imageVoxelManager: imageVoxelManager, segmentationImageData, preview, } = operationData;
|
|
16
|
+
if (!strategySpecificConfiguration?.useCenterSegmentIndex) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
delete strategySpecificConfiguration.centerSegmentIndex;
|
|
20
|
+
let hasSegmentIndex = false;
|
|
21
|
+
let hasPreviewIndex = false;
|
|
22
|
+
const callback = ({ value }) => {
|
|
23
|
+
hasSegmentIndex ||= value === segmentIndex;
|
|
24
|
+
hasPreviewIndex ||= value === previewSegmentIndex;
|
|
25
|
+
};
|
|
26
|
+
pointInShapeCallback(segmentationImageData, imageVoxelManager.isInObject, callback, segmentationVoxelManager.boundsIJK);
|
|
27
|
+
if (!hasSegmentIndex && !hasPreviewIndex) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let existingValue = segmentationVoxelManager.getAtIJKPoint(centerIJK);
|
|
31
|
+
if (existingValue === previewSegmentIndex) {
|
|
32
|
+
if (preview) {
|
|
33
|
+
existingValue = preview.segmentIndex;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (hasPreviewIndex) {
|
|
40
|
+
existingValue = null;
|
|
41
|
+
}
|
|
42
|
+
operationData.segmentIndex = existingValue;
|
|
43
|
+
strategySpecificConfiguration.centerSegmentIndex = {
|
|
44
|
+
segmentIndex: existingValue,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=determineSegmentIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"determineSegmentIndex.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/determineSegmentIndex.ts"],"names":[],"mappings":"AACA,OAAO,oBAAoB,MAAM,4CAA4C,CAAC;AAC9E,OAAO,iBAAiB,MAAM,qCAAqC,CAAC;AAkBpE,eAAe;IACb,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,aAAuC,EAAE,EAAE;QAC1E,MAAM,EAAE,6BAA6B,EAAE,GAAG,aAAa,CAAC;QACxD,IAAI,CAAC,6BAA6B,EAAE;YAClC,OAAO;SACR;QACD,MAAM,EAAE,kBAAkB,EAAE,GAAG,6BAA6B,CAAC;QAC7D,IAAI,kBAAkB,EAAE;YACtB,aAAa,CAAC,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC;SAC9D;IACH,CAAC;IAED,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CACtC,aAAuC,EACvC,EAAE;QACF,MAAM,EACJ,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EAAE,wBAAwB,EAClD,SAAS,EACT,6BAA6B,EAC7B,iBAAiB,EAAE,iBAAiB,EACpC,qBAAqB,EACrB,OAAO,GACR,GAAG,aAAa,CAAC;QAClB,IAAI,CAAC,6BAA6B,EAAE,qBAAqB,EAAE;YACzD,OAAO;SACR;QAED,OAAO,6BAA6B,CAAC,kBAAkB,CAAC;QAExD,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YAC7B,eAAe,KAAK,KAAK,KAAK,YAAY,CAAC;YAC3C,eAAe,KAAK,KAAK,KAAK,mBAAmB,CAAC;QACpD,CAAC,CAAC;QAEF,oBAAoB,CAClB,qBAAgC,EAChC,iBAAiB,CAAC,UAAU,EAC5B,QAAQ,EACR,wBAAwB,CAAC,SAAS,CACnC,CAAC;QAEF,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,EAAE;YACxC,OAAO;SACR;QAED,IAAI,aAAa,GAAG,wBAAwB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACtE,IAAI,aAAa,KAAK,mBAAmB,EAAE;YACzC,IAAI,OAAO,EAAE;gBACX,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;aACtC;iBAAM;gBACL,OAAO;aACR;SACF;aAAM,IAAI,eAAe,EAAE;YAE1B,aAAa,GAAG,IAAI,CAAC;SACtB;QACD,aAAa,CAAC,YAAY,GAAG,aAAa,CAAC;QAC3C,6BAA6B,CAAC,kBAAkB,GAAG;YACjD,YAAY,EAAE,aAAa;SAC5B,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import StrategyCallbacks from '../../../../enums/StrategyCallbacks';
|
|
2
|
+
export default {
|
|
3
|
+
[StrategyCallbacks.Initialize]: (operationData) => {
|
|
4
|
+
const { centerIJK, strategySpecificConfiguration, segmentationVoxelManager: segmentationVoxelManager, imageVoxelManager: imageVoxelManager, segmentIndex, } = operationData;
|
|
5
|
+
const { THRESHOLD } = strategySpecificConfiguration;
|
|
6
|
+
if (!THRESHOLD?.isDynamic || !centerIJK || !segmentIndex) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const { boundsIJK } = segmentationVoxelManager;
|
|
10
|
+
const { threshold: oldThreshold, dynamicRadius = 0 } = THRESHOLD;
|
|
11
|
+
const useDelta = oldThreshold ? 0 : dynamicRadius;
|
|
12
|
+
const nestedBounds = boundsIJK.map((ijk, idx) => {
|
|
13
|
+
const [min, max] = ijk;
|
|
14
|
+
return [
|
|
15
|
+
Math.max(min, centerIJK[idx] - useDelta),
|
|
16
|
+
Math.min(max, centerIJK[idx] + useDelta),
|
|
17
|
+
];
|
|
18
|
+
});
|
|
19
|
+
const threshold = oldThreshold || [Infinity, -Infinity];
|
|
20
|
+
const callback = ({ value }) => {
|
|
21
|
+
threshold[0] = Math.min(value, threshold[0]);
|
|
22
|
+
threshold[1] = Math.max(value, threshold[1]);
|
|
23
|
+
};
|
|
24
|
+
imageVoxelManager.forEach(callback, { boundsIJK: nestedBounds });
|
|
25
|
+
operationData.strategySpecificConfiguration.THRESHOLD.threshold = threshold;
|
|
26
|
+
},
|
|
27
|
+
[StrategyCallbacks.OnInteractionStart]: (operationData) => {
|
|
28
|
+
const { strategySpecificConfiguration, preview } = operationData;
|
|
29
|
+
if (!strategySpecificConfiguration?.THRESHOLD?.isDynamic && !preview) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
strategySpecificConfiguration.THRESHOLD.threshold = null;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=dynamicThreshold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamicThreshold.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/dynamicThreshold.ts"],"names":[],"mappings":"AAEA,OAAO,iBAAiB,MAAM,qCAAqC,CAAC;AAUpE,eAAe;IACb,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,aAAuC,EAAE,EAAE;QAC1E,MAAM,EACJ,SAAS,EACT,6BAA6B,EAC7B,wBAAwB,EAAE,wBAAwB,EAClD,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,GACb,GAAG,aAAa,CAAC;QAClB,MAAM,EAAE,SAAS,EAAE,GAAG,6BAA6B,CAAC;QAEpD,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE;YACxD,OAAO;SACR;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,wBAAwB,CAAC;QAC/C,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;QACjE,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAClD,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC9C,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;YACvB,OAAO;gBACL,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;aACzC,CAAC;QACJ,CAAC,CAAc,CAAC;QAEhB,MAAM,SAAS,GAAG,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YAC7B,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC;QACF,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAEjE,aAAa,CAAC,6BAA6B,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9E,CAAC;IAED,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CACtC,aAAuC,EACvC,EAAE;QACF,MAAM,EAAE,6BAA6B,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;QACjE,IAAI,CAAC,6BAA6B,EAAE,SAAS,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE;YACpE,OAAO;SACR;QACD,6BAA6B,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;IAC3D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erase.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/erase.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,qCAAqC,CAAC;AAKpE,eAAe;IACb,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,aAAuC,EAAE,EAAE;QAC1E,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC;IACjC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import determineSegmentIndex from './determineSegmentIndex';
|
|
2
|
+
import dynamicThreshold from './dynamicThreshold';
|
|
3
|
+
import erase from './erase';
|
|
4
|
+
import islandRemoval from './islandRemoval';
|
|
5
|
+
import preview from './preview';
|
|
6
|
+
import regionFill from './regionFill';
|
|
7
|
+
import setValue from './setValue';
|
|
8
|
+
import threshold from './threshold';
|
|
9
|
+
export default {
|
|
10
|
+
determineSegmentIndex,
|
|
11
|
+
dynamicThreshold,
|
|
12
|
+
erase,
|
|
13
|
+
islandRemoval,
|
|
14
|
+
preview,
|
|
15
|
+
regionFill,
|
|
16
|
+
setValue,
|
|
17
|
+
threshold,
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/index.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,eAAe;IACb,qBAAqB;IACrB,gBAAgB;IAChB,KAAK;IACL,aAAa;IACb,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import floodFill from '../../../../utilities/segmentation/floodFill';
|
|
2
|
+
import { triggerSegmentationDataModified } from '../../../../stateManagement/segmentation/triggerSegmentationEvents';
|
|
3
|
+
import StrategyCallbacks from '../../../../enums/StrategyCallbacks';
|
|
4
|
+
export default {
|
|
5
|
+
[StrategyCallbacks.OnInteractionEnd]: (operationData) => {
|
|
6
|
+
const { previewVoxelManager: previewVoxelManager, segmentationVoxelManager: segmentationVoxelManager, strategySpecificConfiguration, previewSegmentIndex, segmentIndex, } = operationData;
|
|
7
|
+
if (!strategySpecificConfiguration.THRESHOLD || segmentIndex === null) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const clickedPoints = previewVoxelManager.getPoints();
|
|
11
|
+
if (!clickedPoints?.length) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (previewSegmentIndex === undefined) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const boundsIJK = previewVoxelManager
|
|
18
|
+
.getBoundsIJK()
|
|
19
|
+
.map((bound, i) => [
|
|
20
|
+
Math.min(bound[0], ...clickedPoints.map((point) => point[i])),
|
|
21
|
+
Math.max(bound[1], ...clickedPoints.map((point) => point[i])),
|
|
22
|
+
]);
|
|
23
|
+
if (boundsIJK.find((it) => it[0] < 0 || it[1] > 65535)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const floodedSet = new Set();
|
|
27
|
+
const getter = (i, j, k) => {
|
|
28
|
+
if (i < boundsIJK[0][0] ||
|
|
29
|
+
i > boundsIJK[0][1] ||
|
|
30
|
+
j < boundsIJK[1][0] ||
|
|
31
|
+
j > boundsIJK[1][1] ||
|
|
32
|
+
k < boundsIJK[2][0] ||
|
|
33
|
+
k > boundsIJK[2][1]) {
|
|
34
|
+
return -1;
|
|
35
|
+
}
|
|
36
|
+
const index = segmentationVoxelManager.toIndex([i, j, k]);
|
|
37
|
+
if (floodedSet.has(index)) {
|
|
38
|
+
return -2;
|
|
39
|
+
}
|
|
40
|
+
const oldVal = segmentationVoxelManager.getAtIndex(index);
|
|
41
|
+
const isIn = oldVal === previewSegmentIndex || oldVal === segmentIndex ? 1 : 0;
|
|
42
|
+
if (!isIn) {
|
|
43
|
+
segmentationVoxelManager.addPoint(index);
|
|
44
|
+
}
|
|
45
|
+
return isIn;
|
|
46
|
+
};
|
|
47
|
+
let floodedCount = 0;
|
|
48
|
+
const onFlood = (i, j, k) => {
|
|
49
|
+
const index = segmentationVoxelManager.toIndex([i, j, k]);
|
|
50
|
+
if (floodedSet.has(index)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
previewVoxelManager.setAtIJK(i, j, k, previewSegmentIndex);
|
|
54
|
+
floodedSet.add(index);
|
|
55
|
+
floodedCount++;
|
|
56
|
+
};
|
|
57
|
+
clickedPoints.forEach((clickedPoint, index) => {
|
|
58
|
+
if (getter(...clickedPoint) === 1) {
|
|
59
|
+
floodFill(getter, clickedPoint, {
|
|
60
|
+
onFlood,
|
|
61
|
+
diagonals: true,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
let clearedCount = 0;
|
|
66
|
+
let previewCount = 0;
|
|
67
|
+
const callback = ({ index, pointIJK, value: trackValue }) => {
|
|
68
|
+
const value = segmentationVoxelManager.getAtIndex(index);
|
|
69
|
+
if (floodedSet.has(index)) {
|
|
70
|
+
previewCount++;
|
|
71
|
+
const newValue = trackValue === segmentIndex ? segmentIndex : previewSegmentIndex;
|
|
72
|
+
previewVoxelManager.setAtIJKPoint(pointIJK, newValue);
|
|
73
|
+
}
|
|
74
|
+
else if (value === previewSegmentIndex) {
|
|
75
|
+
clearedCount++;
|
|
76
|
+
const newValue = trackValue ?? 0;
|
|
77
|
+
previewVoxelManager.setAtIJKPoint(pointIJK, newValue);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
previewVoxelManager.forEach(callback, {});
|
|
81
|
+
if (floodedCount - previewCount !== 0) {
|
|
82
|
+
console.warn('There were flooded=', floodedCount, 'cleared=', clearedCount, 'preview count=', previewCount, 'not handled', floodedCount - previewCount);
|
|
83
|
+
}
|
|
84
|
+
const islandMap = new Set(segmentationVoxelManager.points || []);
|
|
85
|
+
floodedSet.clear();
|
|
86
|
+
for (const index of islandMap.keys()) {
|
|
87
|
+
if (floodedSet.has(index)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
let isInternal = true;
|
|
91
|
+
const internalSet = new Set();
|
|
92
|
+
const onFloodInternal = (i, j, k) => {
|
|
93
|
+
const floodIndex = previewVoxelManager.toIndex([i, j, k]);
|
|
94
|
+
floodedSet.add(floodIndex);
|
|
95
|
+
if ((boundsIJK[0][0] !== boundsIJK[0][1] &&
|
|
96
|
+
(i === boundsIJK[0][0] || i === boundsIJK[0][1])) ||
|
|
97
|
+
(boundsIJK[1][0] !== boundsIJK[1][1] &&
|
|
98
|
+
(j === boundsIJK[1][0] || j === boundsIJK[1][1])) ||
|
|
99
|
+
(boundsIJK[2][0] !== boundsIJK[2][1] &&
|
|
100
|
+
(k === boundsIJK[2][0] || k === boundsIJK[2][1]))) {
|
|
101
|
+
isInternal = false;
|
|
102
|
+
}
|
|
103
|
+
if (isInternal) {
|
|
104
|
+
internalSet.add(floodIndex);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const pointIJK = previewVoxelManager.toIJK(index);
|
|
108
|
+
if (getter(...pointIJK) !== 0) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
floodFill(getter, pointIJK, {
|
|
112
|
+
onFlood: onFloodInternal,
|
|
113
|
+
diagonals: false,
|
|
114
|
+
});
|
|
115
|
+
if (isInternal) {
|
|
116
|
+
for (const index of internalSet) {
|
|
117
|
+
previewVoxelManager.setAtIndex(index, previewSegmentIndex);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
triggerSegmentationDataModified(operationData.segmentationId, previewVoxelManager.getArrayOfSlices());
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=islandRemoval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"islandRemoval.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/islandRemoval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { triggerSegmentationDataModified } from '../../../../stateManagement/segmentation/triggerSegmentationEvents';
|
|
2
|
+
import { config as segmentationConfig } from '../../../../stateManagement/segmentation';
|
|
3
|
+
import StrategyCallbacks from '../../../../enums/StrategyCallbacks';
|
|
4
|
+
export default {
|
|
5
|
+
[StrategyCallbacks.Preview]: function (operationData) {
|
|
6
|
+
const { previewColors, strategySpecificConfiguration, enabledElement } = operationData;
|
|
7
|
+
if (!previewColors || !strategySpecificConfiguration) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (operationData.preview) {
|
|
11
|
+
delete operationData.preview;
|
|
12
|
+
}
|
|
13
|
+
delete strategySpecificConfiguration.centerSegmentIndex;
|
|
14
|
+
this.onInteractionStart?.(enabledElement, operationData);
|
|
15
|
+
const preview = this.fill(enabledElement, operationData);
|
|
16
|
+
if (preview) {
|
|
17
|
+
preview.isPreviewFromHover = true;
|
|
18
|
+
operationData.preview = preview;
|
|
19
|
+
this.onInteractionEnd?.(enabledElement, operationData);
|
|
20
|
+
}
|
|
21
|
+
return preview;
|
|
22
|
+
},
|
|
23
|
+
[StrategyCallbacks.Initialize]: (operationData) => {
|
|
24
|
+
const { toolGroupId, segmentIndex, segmentationRepresentationUID, previewSegmentIndex, previewColors, preview, } = operationData;
|
|
25
|
+
if (previewColors === undefined) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (preview) {
|
|
29
|
+
preview.previewVoxelManager.sourceVoxelManager =
|
|
30
|
+
operationData.segmentationVoxelManager;
|
|
31
|
+
operationData.previewVoxelManager = preview.previewVoxelManager;
|
|
32
|
+
}
|
|
33
|
+
if (segmentIndex === null || !previewSegmentIndex) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const configColor = previewColors?.[segmentIndex];
|
|
37
|
+
const segmentColor = segmentationConfig.color.getColorForSegmentIndex(toolGroupId, segmentationRepresentationUID, segmentIndex);
|
|
38
|
+
if (!configColor && !segmentColor) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const previewColor = configColor || segmentColor.map((it) => it * 0.9);
|
|
42
|
+
segmentationConfig.color.setColorForSegmentIndex(toolGroupId, segmentationRepresentationUID, previewSegmentIndex, previewColor);
|
|
43
|
+
},
|
|
44
|
+
[StrategyCallbacks.AcceptPreview]: (operationData) => {
|
|
45
|
+
const { segmentationVoxelManager: segmentationVoxelManager, previewVoxelManager: previewVoxelManager, previewSegmentIndex, preview, } = operationData;
|
|
46
|
+
if (previewSegmentIndex === undefined) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const segmentIndex = preview?.segmentIndex ?? operationData.segmentIndex;
|
|
50
|
+
const tracking = previewVoxelManager;
|
|
51
|
+
if (!tracking || tracking.modifiedSlices.size === 0) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const callback = ({ index }) => {
|
|
55
|
+
const oldValue = segmentationVoxelManager.getAtIndex(index);
|
|
56
|
+
if (oldValue === previewSegmentIndex) {
|
|
57
|
+
segmentationVoxelManager.setAtIndex(index, segmentIndex);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
tracking.forEach(callback, {});
|
|
61
|
+
triggerSegmentationDataModified(operationData.segmentationId, tracking.getArrayOfSlices());
|
|
62
|
+
tracking.clear();
|
|
63
|
+
},
|
|
64
|
+
[StrategyCallbacks.RejectPreview]: (operationData) => {
|
|
65
|
+
const { previewVoxelManager: previewVoxelManager, segmentationVoxelManager: segmentationVoxelManager, } = operationData;
|
|
66
|
+
if (previewVoxelManager.modifiedSlices.size === 0) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const callback = ({ index, value }) => {
|
|
70
|
+
segmentationVoxelManager.setAtIndex(index, value);
|
|
71
|
+
};
|
|
72
|
+
previewVoxelManager.forEach(callback);
|
|
73
|
+
triggerSegmentationDataModified(operationData.segmentationId, previewVoxelManager.getArrayOfSlices());
|
|
74
|
+
previewVoxelManager.clear();
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import pointInShapeCallback from '../../../../utilities/pointInShapeCallback';
|
|
2
|
+
import StrategyCallbacks from '../../../../enums/StrategyCallbacks';
|
|
3
|
+
export default {
|
|
4
|
+
[StrategyCallbacks.Fill]: (operationData) => {
|
|
5
|
+
const { segmentsLocked, segmentationImageData, segmentationVoxelManager: segmentationVoxelManager, previewVoxelManager: previewVoxelManager, imageVoxelManager: imageVoxelManager, brushStrategy, centerIJK, } = operationData;
|
|
6
|
+
const isWithinThreshold = brushStrategy.createIsInThreshold?.(operationData);
|
|
7
|
+
const { setValue } = brushStrategy;
|
|
8
|
+
const callback = isWithinThreshold
|
|
9
|
+
? (data) => {
|
|
10
|
+
const { value, index } = data;
|
|
11
|
+
if (segmentsLocked.includes(value) || !isWithinThreshold(index)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
setValue(operationData, data);
|
|
15
|
+
}
|
|
16
|
+
: (data) => setValue(operationData, data);
|
|
17
|
+
pointInShapeCallback(segmentationImageData, imageVoxelManager.isInObject, callback, segmentationVoxelManager.boundsIJK);
|
|
18
|
+
previewVoxelManager.addPoint(centerIJK);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=regionFill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regionFill.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/regionFill.ts"],"names":[],"mappings":"AACA,OAAO,oBAAoB,MAAM,4CAA4C,CAAC;AAC9E,OAAO,iBAAiB,MAAM,qCAAqC,CAAC;AAQpE,eAAe;IACb,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,aAAuC,EAAE,EAAE;QACpE,MAAM,EACJ,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EAAE,wBAAwB,EAClD,mBAAmB,EAAE,mBAAmB,EACxC,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EACb,SAAS,GACV,GAAG,aAAa,CAAC;QAClB,MAAM,iBAAiB,GACrB,aAAa,CAAC,mBAAmB,EAAE,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;QAEnC,MAAM,QAAQ,GAAG,iBAAiB;YAChC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;gBACP,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;gBAC9B,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;oBAC/D,OAAO;iBACR;gBACD,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAChC,CAAC;YACH,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAE5C,oBAAoB,CAClB,qBAAgC,EAChC,iBAAiB,CAAC,UAAU,EAC5B,QAAQ,EACR,wBAAwB,CAAC,SAAS,CACnC,CAAC;QAEF,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import StrategyCallbacks from '../../../../enums/StrategyCallbacks';
|
|
2
|
+
export default {
|
|
3
|
+
[StrategyCallbacks.INTERNAL_setValue]: (operationData, { value, index }) => {
|
|
4
|
+
const { segmentsLocked, segmentIndex, previewVoxelManager: previewVoxelManager, previewSegmentIndex, segmentationVoxelManager: segmentationVoxelManager, } = operationData;
|
|
5
|
+
const existingValue = segmentationVoxelManager.getAtIndex(index);
|
|
6
|
+
if (segmentIndex === null) {
|
|
7
|
+
const oldValue = previewVoxelManager.getAtIndex(index);
|
|
8
|
+
if (oldValue !== undefined) {
|
|
9
|
+
previewVoxelManager.setAtIndex(index, oldValue);
|
|
10
|
+
}
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (existingValue === segmentIndex || segmentsLocked.includes(value)) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (existingValue === previewSegmentIndex) {
|
|
17
|
+
if (previewVoxelManager.getAtIndex(index) === undefined) {
|
|
18
|
+
segmentationVoxelManager.setAtIndex(index, segmentIndex);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const useSegmentIndex = previewSegmentIndex ?? segmentIndex;
|
|
25
|
+
previewVoxelManager.setAtIndex(index, useSegmentIndex);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=setValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setValue.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/setValue.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,qCAAqC,CAAC;AASpE,eAAe;IACb,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CACrC,aAAuC,EACvC,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,EAAE;QACF,MAAM,EACJ,cAAc,EACd,YAAY,EACZ,mBAAmB,EAAE,mBAAmB,EACxC,mBAAmB,EACnB,wBAAwB,EAAE,wBAAwB,GACnD,GAAG,aAAa,CAAC;QAClB,MAAM,aAAa,GAAG,wBAAwB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,YAAY,KAAK,IAAI,EAAE;YACzB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvD,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,mBAAmB,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;aACjD;YACD,OAAO;SACR;QAED,IAAI,aAAa,KAAK,YAAY,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACpE,OAAO;SACR;QAED,IAAI,aAAa,KAAK,mBAAmB,EAAE;YACzC,IAAI,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;gBAEvD,wBAAwB,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;aAC1D;iBAAM;gBACL,OAAO;aACR;SACF;QAGD,MAAM,eAAe,GAAG,mBAAmB,IAAI,YAAY,CAAC;QAE5D,mBAAmB,CAAC,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import StrategyCallbacks from '../../../../enums/StrategyCallbacks';
|
|
2
|
+
export default {
|
|
3
|
+
[StrategyCallbacks.CreateIsInThreshold]: (operationData) => {
|
|
4
|
+
const { imageVoxelManager: imageVoxelManager, strategySpecificConfiguration, segmentIndex, } = operationData;
|
|
5
|
+
if (!strategySpecificConfiguration || !segmentIndex) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
return (index) => {
|
|
9
|
+
const { THRESHOLD, THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration;
|
|
10
|
+
const voxelValue = imageVoxelManager.getAtIndex(index);
|
|
11
|
+
const { threshold } = THRESHOLD || THRESHOLD_INSIDE_CIRCLE || {};
|
|
12
|
+
if (!threshold?.length) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return threshold[0] <= voxelValue && voxelValue <= threshold[1];
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=threshold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/compositions/threshold.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,qCAAqC,CAAC;AAOpE,eAAe;IACb,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,EAAE,CACvC,aAAuC,EACvC,EAAE;QACF,MAAM,EACJ,iBAAiB,EAAE,iBAAiB,EACpC,6BAA6B,EAC7B,YAAY,GACb,GAAG,aAAa,CAAC;QAClB,IAAI,CAAC,6BAA6B,IAAI,CAAC,YAAY,EAAE;YACnD,OAAO;SACR;QACD,OAAO,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,GAC1C,6BAA6B,CAAC;YAEhC,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAGvD,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,IAAI,uBAAuB,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE;gBACtB,OAAO,IAAI,CAAC;aACb;YACD,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,IAAI,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
fillInsideCircle(enabledElement, eraseOperationData);
|
|
8
|
-
}
|
|
1
|
+
import BrushStrategy from './BrushStrategy';
|
|
2
|
+
import { CIRCLE_STRATEGY } from './fillCircle';
|
|
3
|
+
import compositions from './compositions';
|
|
4
|
+
const ERASE_CIRCLE_STRATEGY = new BrushStrategy('EraseCircle', compositions.erase, ...CIRCLE_STRATEGY.compositions);
|
|
5
|
+
const eraseInsideCircle = ERASE_CIRCLE_STRATEGY.strategyFunction;
|
|
6
|
+
export { eraseInsideCircle };
|
|
9
7
|
//# sourceMappingURL=eraseCircle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eraseCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/eraseCircle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eraseCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/eraseCircle.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,MAAM,qBAAqB,GAAG,IAAI,aAAa,CAC7C,aAAa,EACb,YAAY,CAAC,KAAK,EAClB,GAAG,eAAe,CAAC,YAAY,CAChC,CAAC;AAEF,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
1
|
+
import BrushStrategy from './BrushStrategy';
|
|
2
|
+
import { SPHERE_STRATEGY } from './fillSphere';
|
|
3
|
+
import compositions from './compositions';
|
|
4
|
+
const ERASE_SPHERE_STRATEGY = new BrushStrategy('EraseSphere', compositions.erase, ...SPHERE_STRATEGY.compositions);
|
|
5
|
+
const eraseInsideSphere = ERASE_SPHERE_STRATEGY.strategyFunction;
|
|
6
|
+
export { eraseInsideSphere };
|
|
8
7
|
//# sourceMappingURL=eraseSphere.js.map
|