@cornerstonejs/tools 1.36.3 → 1.37.0
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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eraseSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/eraseSphere.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eraseSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/eraseSphere.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,99 +1,75 @@
|
|
|
1
1
|
import { vec3 } from 'gl-matrix';
|
|
2
|
-
import { cache } from '@cornerstonejs/core';
|
|
3
2
|
import { utilities as csUtils } from '@cornerstonejs/core';
|
|
4
|
-
import { getCanvasEllipseCorners,
|
|
3
|
+
import { getCanvasEllipseCorners, precalculatePointInEllipse, } from '../../../utilities/math/ellipse';
|
|
4
|
+
import pointInSphere from '../../../utilities/math/sphere/pointInSphere';
|
|
5
5
|
import { getBoundingBoxAroundShape } from '../../../utilities/boundingBox';
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import { getStrategyData } from './utils/getStrategyData';
|
|
10
|
-
import { isVolumeSegmentation } from './utils/stackVolumeCheck';
|
|
6
|
+
import BrushStrategy from './BrushStrategy';
|
|
7
|
+
import { StrategyCallbacks } from '../../../enums';
|
|
8
|
+
import compositions from './compositions';
|
|
11
9
|
const { transformWorldToIndex } = csUtils;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
const { imageScalarData, segmentationImageData, segmentationScalarData } = data;
|
|
21
|
-
const { ellipseObj, boundsIJK } = getEllipse(viewport, segmentationImageData, points);
|
|
22
|
-
const modifiedSlicesToUse = new Set();
|
|
23
|
-
let callback;
|
|
24
|
-
if (threshold) {
|
|
25
|
-
callback = ({ value, index, pointIJK }) => {
|
|
26
|
-
if (segmentsLocked.includes(value)) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
if (isWithinThreshold(index, imageScalarData, strategySpecificConfiguration)) {
|
|
30
|
-
segmentationScalarData[index] = segmentIndex;
|
|
31
|
-
modifiedSlicesToUse.add(pointIJK[2]);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
callback = ({ value, index, pointIJK }) => {
|
|
37
|
-
if (segmentsLocked.includes(value)) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
segmentationScalarData[index] = segmentIndex;
|
|
41
|
-
modifiedSlicesToUse.add(pointIJK[2]);
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
pointInShapeCallback(segmentationImageData, (pointLPS) => pointInEllipse(ellipseObj, pointLPS, {
|
|
45
|
-
fast: true,
|
|
46
|
-
}), callback, boundsIJK);
|
|
47
|
-
const arrayOfSlices = Array.from(modifiedSlicesToUse);
|
|
48
|
-
triggerSegmentationDataModified(segmentationId, arrayOfSlices);
|
|
49
|
-
}
|
|
50
|
-
export function fillInsideCircle(enabledElement, operationData) {
|
|
51
|
-
fillCircle(enabledElement, operationData, false);
|
|
52
|
-
}
|
|
53
|
-
export function thresholdInsideCircle(enabledElement, operationData) {
|
|
54
|
-
if (isVolumeSegmentation(operationData)) {
|
|
55
|
-
const { referencedVolumeId, volumeId } = operationData;
|
|
56
|
-
const imageVolume = cache.getVolume(referencedVolumeId);
|
|
57
|
-
const segmentation = cache.getVolume(volumeId);
|
|
58
|
-
if (!csUtils.isEqual(segmentation.dimensions, imageVolume.dimensions) ||
|
|
59
|
-
!csUtils.isEqual(segmentation.direction, imageVolume.direction)) {
|
|
60
|
-
throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
|
|
10
|
+
const EPSILON = 1e-4;
|
|
11
|
+
const nearOrZero = (testValue, nearValue) => Math.abs(testValue) < EPSILON || Math.abs(testValue - nearValue) < EPSILON;
|
|
12
|
+
const initializeCircle = {
|
|
13
|
+
[StrategyCallbacks.Initialize]: (operationData) => {
|
|
14
|
+
const { points, imageVoxelManager: imageVoxelManager, viewport, segmentationImageData, segmentationVoxelManager: segmentationVoxelManager, } = operationData;
|
|
15
|
+
if (!points) {
|
|
16
|
+
return;
|
|
61
17
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
18
|
+
const center = vec3.fromValues(0, 0, 0);
|
|
19
|
+
points.forEach((point) => {
|
|
20
|
+
vec3.add(center, center, point);
|
|
21
|
+
});
|
|
22
|
+
vec3.scale(center, center, 1 / points.length);
|
|
23
|
+
operationData.centerWorld = center;
|
|
24
|
+
operationData.centerIJK = transformWorldToIndex(segmentationImageData, center);
|
|
25
|
+
const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
|
|
26
|
+
const [topLeftCanvas, bottomRightCanvas] = getCanvasEllipseCorners(canvasCoordinates);
|
|
27
|
+
const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
|
|
28
|
+
const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
|
|
29
|
+
const ellipsoidCornersIJK = [
|
|
30
|
+
transformWorldToIndex(segmentationImageData, topLeftWorld),
|
|
31
|
+
(transformWorldToIndex(segmentationImageData, bottomRightWorld)),
|
|
32
|
+
];
|
|
33
|
+
segmentationVoxelManager.boundsIJK = getBoundingBoxAroundShape(ellipsoidCornersIJK, segmentationVoxelManager.dimensions);
|
|
34
|
+
imageVoxelManager.isInObject = createPointInEllipse({
|
|
35
|
+
topLeftWorld,
|
|
36
|
+
bottomRightWorld,
|
|
37
|
+
center,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
function createPointInEllipse(worldInfo) {
|
|
42
|
+
const { topLeftWorld, bottomRightWorld, center } = worldInfo;
|
|
43
|
+
const xRadius = Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2;
|
|
44
|
+
const yRadius = Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2;
|
|
45
|
+
const zRadius = Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2;
|
|
46
|
+
const radius = Math.max(xRadius, yRadius, zRadius);
|
|
47
|
+
if (nearOrZero(xRadius, radius) &&
|
|
48
|
+
nearOrZero(yRadius, radius) &&
|
|
49
|
+
nearOrZero(zRadius, radius)) {
|
|
50
|
+
const sphereObj = {
|
|
51
|
+
center,
|
|
52
|
+
radius,
|
|
53
|
+
radius2: radius * radius,
|
|
54
|
+
};
|
|
55
|
+
return (pointLPS) => pointInSphere(sphereObj, pointLPS);
|
|
90
56
|
}
|
|
91
57
|
const ellipseObj = {
|
|
92
58
|
center: center,
|
|
93
|
-
xRadius
|
|
94
|
-
yRadius
|
|
95
|
-
zRadius
|
|
59
|
+
xRadius,
|
|
60
|
+
yRadius,
|
|
61
|
+
zRadius,
|
|
96
62
|
};
|
|
97
|
-
|
|
63
|
+
const inverts = precalculatePointInEllipse(ellipseObj);
|
|
64
|
+
const { precalculated } = inverts;
|
|
65
|
+
return precalculated;
|
|
66
|
+
}
|
|
67
|
+
const CIRCLE_STRATEGY = new BrushStrategy('Circle', compositions.regionFill, compositions.setValue, initializeCircle, compositions.determineSegmentIndex, compositions.preview);
|
|
68
|
+
const CIRCLE_THRESHOLD_STRATEGY = new BrushStrategy('CircleThreshold', compositions.regionFill, compositions.setValue, initializeCircle, compositions.determineSegmentIndex, compositions.dynamicThreshold, compositions.threshold, compositions.preview, compositions.islandRemoval);
|
|
69
|
+
const fillInsideCircle = CIRCLE_STRATEGY.strategyFunction;
|
|
70
|
+
const thresholdInsideCircle = CIRCLE_THRESHOLD_STRATEGY.strategyFunction;
|
|
71
|
+
export function fillOutsideCircle() {
|
|
72
|
+
throw new Error('Not yet implemented');
|
|
98
73
|
}
|
|
74
|
+
export { CIRCLE_STRATEGY, CIRCLE_THRESHOLD_STRATEGY, fillInsideCircle, thresholdInsideCircle, createPointInEllipse as createEllipseInPoint, };
|
|
99
75
|
//# sourceMappingURL=fillCircle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillCircle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"fillCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillCircle.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { triggerSegmentationDataModified } from '../../../stateManagement/segmen
|
|
|
5
5
|
import { getStrategyData } from './utils/getStrategyData';
|
|
6
6
|
const { transformWorldToIndex } = csUtils;
|
|
7
7
|
function fillRectangle(enabledElement, operationData, inside = true) {
|
|
8
|
-
const { points, segmentsLocked, segmentIndex, segmentationId
|
|
8
|
+
const { points, segmentsLocked, segmentIndex, segmentationId } = operationData;
|
|
9
9
|
const strategyData = getStrategyData({
|
|
10
10
|
operationData,
|
|
11
11
|
viewport: enabledElement.viewport,
|
|
@@ -25,17 +25,11 @@ function fillRectangle(enabledElement, operationData, inside = true) {
|
|
|
25
25
|
});
|
|
26
26
|
const boundsIJK = getBoundingBoxAroundShape(rectangleCornersIJK, segmentationImageData.getDimensions());
|
|
27
27
|
const pointInRectangle = () => true;
|
|
28
|
-
const callback = ({ value, index
|
|
28
|
+
const callback = ({ value, index }) => {
|
|
29
29
|
if (segmentsLocked.includes(value)) {
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
segmentationScalarData[index] = segmentIndex;
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
if (constraintFn(pointIJK)) {
|
|
37
|
-
segmentationScalarData[index] = segmentIndex;
|
|
38
|
-
}
|
|
32
|
+
segmentationScalarData[index] = segmentIndex;
|
|
39
33
|
};
|
|
40
34
|
pointInShapeCallback(segmentationImageData, pointInRectangle, callback, boundsIJK);
|
|
41
35
|
triggerSegmentationDataModified(segmentationId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillRectangle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillRectangle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iEAAiE,CAAC;AAElH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"fillRectangle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillRectangle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iEAAiE,CAAC;AAElH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;AAc1C,SAAS,aAAa,CACpB,cAAqC,EACrC,aAA4B,EAC5B,MAAM,GAAG,IAAI;IAEb,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,GAC5D,aAAa,CAAC;IAEhB,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,aAAa;QACb,QAAQ,EAAE,cAAc,CAAC,QAAQ;KAClC,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAChD,OAAO;KACR;IAED,MAAM,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,GAAG,YAAY,CAAC;IAEvE,IAAI,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,OAAO,qBAAqB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAGH,mBAAmB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACtD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,yBAAyB,CACzC,mBAAmB,EACnB,qBAAqB,CAAC,aAAa,EAAE,CACtC,CAAC;IAGF,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;IAEpC,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACpC,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAClC,OAAO;SACR;QAED,sBAAsB,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;IAC/C,CAAC,CAAC;IAEF,oBAAoB,CAClB,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,SAAS,CACV,CAAC;IAEF,+BAA+B,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AAQD,MAAM,UAAU,mBAAmB,CACjC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAClC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -1,67 +1,56 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const { imageScalarData, segmentationImageData, segmentationScalarData } = strategyData;
|
|
16
|
-
const scalarIndex = [];
|
|
17
|
-
let callback;
|
|
18
|
-
if (threshold) {
|
|
19
|
-
callback = ({ value, index }) => {
|
|
20
|
-
if (segmentsLocked.includes(value)) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
if (isWithinThreshold(index, imageScalarData, strategySpecificConfiguration)) {
|
|
24
|
-
segmentationScalarData[index] = segmentIndex;
|
|
25
|
-
scalarIndex.push(index);
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
callback = ({ index, value }) => {
|
|
31
|
-
if (segmentsLocked.includes(value)) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
segmentationScalarData[index] = segmentIndex;
|
|
35
|
-
scalarIndex.push(index);
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
pointInSurroundingSphereCallback(segmentationImageData, [points[0], points[1]], callback, viewport);
|
|
39
|
-
const dimensions = segmentationImageData.getDimensions();
|
|
40
|
-
let sliceArray;
|
|
41
|
-
if (isVolumeSegmentation(operationData)) {
|
|
42
|
-
const zMultiple = dimensions[0] * dimensions[1];
|
|
43
|
-
const minSlice = Math.floor(scalarIndex[0] / zMultiple);
|
|
44
|
-
const maxSlice = Math.floor(scalarIndex[scalarIndex.length - 1] / zMultiple);
|
|
45
|
-
sliceArray = Array.from({ length: maxSlice - minSlice + 1 }, (v, k) => k + minSlice);
|
|
46
|
-
triggerSegmentationDataModified(operationData.volumeId, sliceArray);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
export function fillInsideSphere(enabledElement, operationData) {
|
|
50
|
-
fillSphere(enabledElement, operationData, true);
|
|
51
|
-
}
|
|
52
|
-
export function thresholdInsideSphere(enabledElement, operationData) {
|
|
53
|
-
if (isVolumeSegmentation(operationData)) {
|
|
54
|
-
const { referencedVolumeId, volumeId } = operationData;
|
|
55
|
-
const imageVolume = cache.getVolume(referencedVolumeId);
|
|
56
|
-
const segmentation = cache.getVolume(volumeId);
|
|
57
|
-
if (!csUtils.isEqual(segmentation.dimensions, imageVolume.dimensions) ||
|
|
58
|
-
!csUtils.isEqual(segmentation.direction, imageVolume.direction)) {
|
|
59
|
-
throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
|
|
1
|
+
import { utilities as csUtils } from '@cornerstonejs/core';
|
|
2
|
+
import { vec3 } from 'gl-matrix';
|
|
3
|
+
import { getCanvasEllipseCorners } from '../../../utilities/math/ellipse';
|
|
4
|
+
import { getBoundingBoxAroundShape } from '../../../utilities/boundingBox';
|
|
5
|
+
import BrushStrategy from './BrushStrategy';
|
|
6
|
+
import compositions from './compositions';
|
|
7
|
+
import StrategyCallbacks from '../../../enums/StrategyCallbacks';
|
|
8
|
+
import { createEllipseInPoint } from './fillCircle';
|
|
9
|
+
const { transformWorldToIndex } = csUtils;
|
|
10
|
+
const sphereComposition = {
|
|
11
|
+
[StrategyCallbacks.Initialize]: (operationData) => {
|
|
12
|
+
const { points, imageVoxelManager: imageVoxelManager, viewport, segmentationImageData, segmentationVoxelManager: segmentationVoxelManager, } = operationData;
|
|
13
|
+
if (!points) {
|
|
14
|
+
return;
|
|
60
15
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
16
|
+
const center = vec3.fromValues(0, 0, 0);
|
|
17
|
+
points.forEach((point) => {
|
|
18
|
+
vec3.add(center, center, point);
|
|
19
|
+
});
|
|
20
|
+
vec3.scale(center, center, 1 / points.length);
|
|
21
|
+
operationData.centerWorld = center;
|
|
22
|
+
operationData.centerIJK = transformWorldToIndex(segmentationImageData, center);
|
|
23
|
+
const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
|
|
24
|
+
const [topLeftCanvas, bottomRightCanvas] = getCanvasEllipseCorners(canvasCoordinates);
|
|
25
|
+
const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
|
|
26
|
+
const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
|
|
27
|
+
const diameters = topLeftWorld.map((left, index) => Math.abs(bottomRightWorld[index] - left));
|
|
28
|
+
const radius = Math.max(...diameters) / 2;
|
|
29
|
+
topLeftWorld.forEach((left, index) => {
|
|
30
|
+
const right = bottomRightWorld[index];
|
|
31
|
+
if (left === right) {
|
|
32
|
+
topLeftWorld[index] = left - radius;
|
|
33
|
+
bottomRightWorld[index] = left + radius;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const ellipsoidCornersIJK = [
|
|
37
|
+
transformWorldToIndex(segmentationImageData, topLeftWorld),
|
|
38
|
+
(transformWorldToIndex(segmentationImageData, bottomRightWorld)),
|
|
39
|
+
];
|
|
40
|
+
segmentationVoxelManager.boundsIJK = getBoundingBoxAroundShape(ellipsoidCornersIJK, segmentationVoxelManager.dimensions);
|
|
41
|
+
imageVoxelManager.isInObject = createEllipseInPoint({
|
|
42
|
+
topLeftWorld,
|
|
43
|
+
bottomRightWorld,
|
|
44
|
+
center,
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const SPHERE_STRATEGY = new BrushStrategy('Sphere', compositions.regionFill, compositions.setValue, sphereComposition, compositions.determineSegmentIndex, compositions.preview);
|
|
49
|
+
const fillInsideSphere = SPHERE_STRATEGY.strategyFunction;
|
|
50
|
+
const SPHERE_THRESHOLD_STRATEGY = new BrushStrategy('SphereThreshold', ...SPHERE_STRATEGY.compositions, compositions.dynamicThreshold, compositions.threshold, compositions.islandRemoval);
|
|
51
|
+
const thresholdInsideSphere = SPHERE_THRESHOLD_STRATEGY.strategyFunction;
|
|
52
|
+
export function fillOutsideSphere() {
|
|
53
|
+
throw new Error('fill outside sphere not implemented');
|
|
66
54
|
}
|
|
55
|
+
export { fillInsideSphere, thresholdInsideSphere, SPHERE_STRATEGY };
|
|
67
56
|
//# sourceMappingURL=fillSphere.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillSphere.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fillSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillSphere.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { cache } from '@cornerstonejs/core';
|
|
1
|
+
import { cache, utilities } from '@cornerstonejs/core';
|
|
2
2
|
import { isVolumeSegmentation } from './stackVolumeCheck';
|
|
3
|
+
const { VoxelManager } = utilities;
|
|
3
4
|
function getStrategyData({ operationData, viewport }) {
|
|
4
5
|
let segmentationImageData, segmentationScalarData, imageScalarData;
|
|
6
|
+
let dimensions;
|
|
5
7
|
if (isVolumeSegmentation(operationData)) {
|
|
6
8
|
const { volumeId, referencedVolumeId } = operationData;
|
|
7
9
|
const segmentationVolume = cache.getVolume(volumeId);
|
|
@@ -12,6 +14,7 @@ function getStrategyData({ operationData, viewport }) {
|
|
|
12
14
|
({ imageData: segmentationImageData } = segmentationVolume);
|
|
13
15
|
segmentationScalarData = segmentationVolume.getScalarData();
|
|
14
16
|
imageScalarData = imageVolume.getScalarData();
|
|
17
|
+
dimensions = imageVolume.dimensions;
|
|
15
18
|
}
|
|
16
19
|
else {
|
|
17
20
|
const { imageIdReferenceMap, segmentationRepresentationUID } = operationData;
|
|
@@ -29,11 +32,14 @@ function getStrategyData({ operationData, viewport }) {
|
|
|
29
32
|
segmentationScalarData = segmentationImage.getPixelData();
|
|
30
33
|
const image = cache.getImage(currentImageId);
|
|
31
34
|
imageScalarData = image.getPixelData();
|
|
35
|
+
dimensions = [image.columns, image.rows, 1];
|
|
32
36
|
}
|
|
33
37
|
return {
|
|
34
38
|
segmentationImageData,
|
|
35
39
|
segmentationScalarData,
|
|
40
|
+
segmentationVoxelManager: VoxelManager.createVolumeVoxelManager(dimensions, segmentationScalarData),
|
|
36
41
|
imageScalarData,
|
|
42
|
+
imageVoxelManager: VoxelManager.createVolumeVoxelManager(dimensions, imageScalarData),
|
|
37
43
|
};
|
|
38
44
|
}
|
|
39
45
|
export { getStrategyData };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStrategyData.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/getStrategyData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"getStrategyData.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/getStrategyData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;AAEnC,SAAS,eAAe,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE;IAClD,IAAI,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACnE,IAAI,UAAwB,CAAC;IAC7B,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE;QACvC,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,aAAa,CAAC;QAEvD,MAAM,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAExD,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,EAAE;YACvC,OAAO;SACR;QAED,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,kBAAkB,CAAC,CAAC;QAC5D,sBAAsB,GAAG,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAC5D,eAAe,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;QAC9C,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;KACrC;SAAM;QACL,MAAM,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,GAC1D,aAA+C,CAAC;QAElD,IAAI,CAAC,mBAAmB,EAAE;YACxB,OAAO;SACR;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QACpD,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAKD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;QAC/D,qBAAqB,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE,CAAC;QAC/D,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE3E,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACrE,sBAAsB,GAAG,iBAAiB,CAAC,YAAY,EAAE,CAAC;QAE1D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAK7C,eAAe,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACvC,UAAU,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;KAC7C;IAED,OAAO;QACL,qBAAqB;QACrB,sBAAsB;QACtB,wBAAwB,EAAE,YAAY,CAAC,wBAAwB,CAC7D,UAAU,EACV,sBAAsB,CACvB;QACD,eAAe;QACf,iBAAiB,EAAE,YAAY,CAAC,wBAAwB,CACtD,UAAU,EACV,eAAe,CAChB;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
function isWithinThreshold(index, imageScalarData, strategySpecificConfiguration) {
|
|
2
|
-
const { THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration;
|
|
2
|
+
const { THRESHOLD, THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration;
|
|
3
3
|
const voxelValue = imageScalarData[index];
|
|
4
|
-
const { threshold } = THRESHOLD_INSIDE_CIRCLE;
|
|
4
|
+
const { threshold } = THRESHOLD || THRESHOLD_INSIDE_CIRCLE;
|
|
5
5
|
return threshold[0] <= voxelValue && voxelValue <= threshold[1];
|
|
6
6
|
}
|
|
7
7
|
export default isWithinThreshold;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isWithinThreshold.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/isWithinThreshold.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isWithinThreshold.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/isWithinThreshold.ts"],"names":[],"mappings":"AAEA,SAAS,iBAAiB,CACxB,KAAa,EACb,eAAuC,EACvC,6BAAkC;IAElC,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,GAAG,6BAA6B,CAAC;IAE7E,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAG1C,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,IAAI,uBAAuB,CAAC;IAC3D,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,IAAI,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import pointInEllipse from './pointInEllipse';
|
|
1
|
+
import pointInEllipse, { precalculatePointInEllipse } from './pointInEllipse';
|
|
2
2
|
import getCanvasEllipseCorners from './getCanvasEllipseCorners';
|
|
3
|
-
export { pointInEllipse, getCanvasEllipseCorners };
|
|
3
|
+
export { pointInEllipse, precalculatePointInEllipse, getCanvasEllipseCorners };
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,EAAE,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,uBAAuB,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export default function pointInEllipse(ellipse, pointLPS, inverts = {}) {
|
|
2
|
-
|
|
2
|
+
if (!inverts.precalculated) {
|
|
3
|
+
precalculatePointInEllipse(ellipse, inverts);
|
|
4
|
+
}
|
|
5
|
+
return inverts.precalculated(pointLPS);
|
|
6
|
+
}
|
|
7
|
+
const precalculatePointInEllipse = (ellipse, inverts = {}) => {
|
|
8
|
+
const { xRadius, yRadius, zRadius } = ellipse;
|
|
3
9
|
if (inverts.invXRadiusSq === undefined ||
|
|
4
10
|
inverts.invYRadiusSq === undefined ||
|
|
5
11
|
inverts.invZRadiusSq === undefined) {
|
|
@@ -7,19 +13,25 @@ export default function pointInEllipse(ellipse, pointLPS, inverts = {}) {
|
|
|
7
13
|
inverts.invYRadiusSq = yRadius !== 0 ? 1 / yRadius ** 2 : 0;
|
|
8
14
|
inverts.invZRadiusSq = zRadius !== 0 ? 1 / zRadius ** 2 : 0;
|
|
9
15
|
}
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
const { invXRadiusSq, invYRadiusSq, invZRadiusSq } = inverts;
|
|
17
|
+
const { center } = ellipse;
|
|
18
|
+
const [centerL, centerP, centerS] = center;
|
|
19
|
+
inverts.precalculated = (pointLPS) => {
|
|
20
|
+
const dx = pointLPS[0] - centerL;
|
|
21
|
+
let inside = dx * dx * invXRadiusSq;
|
|
22
|
+
if (inside > 1) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const dy = pointLPS[1] - centerP;
|
|
26
|
+
inside += dy * dy * invYRadiusSq;
|
|
27
|
+
if (inside > 1) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const dz = pointLPS[2] - centerS;
|
|
31
|
+
inside += dz * dz * invZRadiusSq;
|
|
32
|
+
return inside <= 1;
|
|
33
|
+
};
|
|
34
|
+
return inverts;
|
|
35
|
+
};
|
|
36
|
+
export { precalculatePointInEllipse };
|
|
25
37
|
//# sourceMappingURL=pointInEllipse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointInEllipse.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/pointInEllipse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pointInEllipse.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/pointInEllipse.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EACP,QAAQ,EACR,UAAmB,EAAE;IAErB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;QAC1B,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAC9C;IACD,OAAO,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAcD,MAAM,0BAA0B,GAAG,CAAC,OAAO,EAAE,UAAmB,EAAE,EAAE,EAAE;IACpE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAI9C,IACE,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,CAAC,YAAY,KAAK,SAAS,EAClC;QACA,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC7D;IAED,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IAE3C,OAAO,CAAC,aAAa,GAAG,CAAC,QAAQ,EAAE,EAAE;QAEnC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjC,IAAI,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QACpC,IAAI,MAAM,GAAG,CAAC,EAAE;YACd,OAAO,KAAK,CAAC;SACd;QAED,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QACjC,IAAI,MAAM,GAAG,CAAC,EAAE;YACd,OAAO,KAAK,CAAC;SACd;QAED,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QAGjC,OAAO,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export default function pointInSphere(sphere, pointLPS) {
|
|
2
2
|
const { center, radius } = sphere;
|
|
3
|
+
const radius2 = sphere.radius2 || radius * radius;
|
|
3
4
|
return ((pointLPS[0] - center[0]) * (pointLPS[0] - center[0]) +
|
|
4
5
|
(pointLPS[1] - center[1]) * (pointLPS[1] - center[1]) +
|
|
5
6
|
(pointLPS[2] - center[2]) * (pointLPS[2] - center[2]) <=
|
|
6
|
-
|
|
7
|
+
radius2);
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=pointInSphere.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointInSphere.js","sourceRoot":"","sources":["../../../../../src/utilities/math/sphere/pointInSphere.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pointInSphere.js","sourceRoot":"","sources":["../../../../../src/utilities/math/sphere/pointInSphere.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAc,EAAE,QAAc;IAClE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,GAAG,MAAM,CAAC;IAElD,OAAO,CACL,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -2,15 +2,21 @@ import { getToolGroup } from '../../store/ToolGroupManager';
|
|
|
2
2
|
import triggerAnnotationRenderForViewportIds from '../triggerAnnotationRenderForViewportIds';
|
|
3
3
|
import { getRenderingEngine } from '@cornerstonejs/core';
|
|
4
4
|
import getBrushToolInstances from './utilities';
|
|
5
|
-
export function setBrushThresholdForToolGroup(toolGroupId, threshold) {
|
|
5
|
+
export function setBrushThresholdForToolGroup(toolGroupId, threshold, otherArgs = { isDynamic: false }) {
|
|
6
6
|
const toolGroup = getToolGroup(toolGroupId);
|
|
7
7
|
if (toolGroup === undefined) {
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
10
|
const brushBasedToolInstances = getBrushToolInstances(toolGroupId);
|
|
11
|
+
const configuration = {
|
|
12
|
+
...otherArgs,
|
|
13
|
+
...(threshold !== undefined && { threshold }),
|
|
14
|
+
};
|
|
11
15
|
brushBasedToolInstances.forEach((tool) => {
|
|
12
|
-
tool.configuration.strategySpecificConfiguration.
|
|
13
|
-
|
|
16
|
+
tool.configuration.strategySpecificConfiguration.THRESHOLD = {
|
|
17
|
+
...tool.configuration.strategySpecificConfiguration.THRESHOLD,
|
|
18
|
+
...configuration,
|
|
19
|
+
};
|
|
14
20
|
});
|
|
15
21
|
const viewportsInfo = toolGroup.getViewportsInfo();
|
|
16
22
|
if (!viewportsInfo.length) {
|
|
@@ -35,7 +41,7 @@ export function getBrushThresholdForToolGroup(toolGroupId) {
|
|
|
35
41
|
if (!brushToolInstance) {
|
|
36
42
|
return;
|
|
37
43
|
}
|
|
38
|
-
return brushToolInstance.configuration.strategySpecificConfiguration
|
|
39
|
-
.
|
|
44
|
+
return brushToolInstance.configuration.strategySpecificConfiguration.THRESHOLD
|
|
45
|
+
.threshold;
|
|
40
46
|
}
|
|
41
47
|
//# sourceMappingURL=brushThresholdForToolGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brushThresholdForToolGroup.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/brushThresholdForToolGroup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,qCAAqC,MAAM,0CAA0C,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,qBAAqB,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,6BAA6B,CAC3C,WAAmB,EACnB,SAAuB;
|
|
1
|
+
{"version":3,"file":"brushThresholdForToolGroup.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/brushThresholdForToolGroup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,qCAAqC,MAAM,0CAA0C,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,qBAAqB,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,6BAA6B,CAC3C,WAAmB,EACnB,SAAuB,EACvB,YAAqC,EAAE,SAAS,EAAE,KAAK,EAAE;IAEzD,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,OAAO;KACR;IAED,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG;QACpB,GAAG,SAAS;QACZ,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;KAC9C,CAAC;IAEF,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,SAAS,GAAG;YAC3D,GAAG,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,SAAS;YAC7D,GAAG,aAAa;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAGH,MAAM,aAAa,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;IAEnD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;QACzB,OAAO;KACR;IAED,MAAM,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAI/C,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IAE/C,MAAM,eAAe,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAE9D,qCAAqC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,WAAmB;IAC/D,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,OAAO;KACR;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,cAAc,CAAC;IAE/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE;QACtC,OAAO;KACR;IAED,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC,iBAAiB,EAAE;QACtB,OAAO;KACR;IAGD,OAAO,iBAAiB,CAAC,aAAa,CAAC,6BAA6B,CAAC,SAAS;SAC3E,SAAS,CAAC;AACf,CAAC"}
|