@cornerstonejs/tools 1.32.2 → 1.33.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/eventListeners/index.d.ts +2 -2
- package/dist/cjs/eventListeners/index.js +2 -1
- package/dist/cjs/eventListeners/index.js.map +1 -1
- package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.d.ts +5 -0
- package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.js +143 -0
- package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.js.map +1 -0
- package/dist/cjs/eventListeners/segmentation/index.d.ts +2 -1
- package/dist/cjs/eventListeners/segmentation/index.js +3 -1
- package/dist/cjs/eventListeners/segmentation/index.js.map +1 -1
- package/dist/cjs/eventListeners/segmentation/segmentationDataModifiedEventListener.js +31 -5
- package/dist/cjs/eventListeners/segmentation/segmentationDataModifiedEventListener.js.map +1 -1
- package/dist/cjs/store/addEnabledElement.js +1 -0
- package/dist/cjs/store/addEnabledElement.js.map +1 -1
- package/dist/cjs/store/removeEnabledElement.js +2 -0
- package/dist/cjs/store/removeEnabledElement.js.map +1 -1
- package/dist/cjs/tools/StackScrollToolMouseWheelTool.d.ts +1 -0
- package/dist/cjs/tools/StackScrollToolMouseWheelTool.js +2 -0
- package/dist/cjs/tools/StackScrollToolMouseWheelTool.js.map +1 -1
- package/dist/cjs/tools/annotation/CircleROITool.js +3 -1
- package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -1
- package/dist/cjs/tools/annotation/EllipticalROITool.js +1 -1
- package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -1
- package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.js +23 -10
- package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.d.ts +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js +36 -22
- package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/validateRepresentationData.js +6 -5
- package/dist/cjs/tools/displayTools/Labelmap/validateRepresentationData.js.map +1 -1
- package/dist/cjs/tools/segmentation/BrushTool.js +40 -45
- package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/CircleScissorsTool.d.ts +4 -2
- package/dist/cjs/tools/segmentation/CircleScissorsTool.js +18 -17
- package/dist/cjs/tools/segmentation/CircleScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/PaintFillTool.js +28 -5
- package/dist/cjs/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/RectangleScissorsTool.d.ts +3 -1
- package/dist/cjs/tools/segmentation/RectangleScissorsTool.js +15 -16
- package/dist/cjs/tools/segmentation/RectangleScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/SphereScissorsTool.d.ts +4 -2
- package/dist/cjs/tools/segmentation/SphereScissorsTool.js +20 -20
- package/dist/cjs/tools/segmentation/SphereScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseCircle.d.ts +2 -10
- package/dist/cjs/tools/segmentation/strategies/eraseCircle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseRectangle.d.ts +4 -8
- package/dist/cjs/tools/segmentation/strategies/eraseRectangle.js +4 -20
- package/dist/cjs/tools/segmentation/strategies/eraseRectangle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +2 -10
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillCircle.d.ts +3 -11
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js +57 -32
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.d.ts +2 -7
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.js +16 -8
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +2 -10
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js +31 -17
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.d.ts +9 -0
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js +43 -0
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -0
- 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/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts +5 -0
- package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.js +13 -0
- package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.js.map +1 -0
- package/dist/cjs/types/LabelmapToolOperationData.d.ts +14 -0
- package/dist/cjs/types/LabelmapToolOperationData.js +3 -0
- package/dist/cjs/types/LabelmapToolOperationData.js.map +1 -0
- package/dist/cjs/types/LabelmapTypes.d.ts +5 -1
- package/dist/cjs/types/ScrollOptions.d.ts +1 -0
- package/dist/cjs/types/index.d.ts +2 -1
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.d.ts +7 -9
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.js +19 -11
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.js.map +1 -1
- package/dist/cjs/utilities/scroll.d.ts +1 -1
- package/dist/cjs/utilities/scroll.js +5 -4
- package/dist/cjs/utilities/scroll.js.map +1 -1
- package/dist/esm/eventListeners/index.js +2 -2
- package/dist/esm/eventListeners/index.js.map +1 -1
- package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js +115 -0
- package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js.map +1 -0
- package/dist/esm/eventListeners/segmentation/index.js +2 -1
- package/dist/esm/eventListeners/segmentation/index.js.map +1 -1
- package/dist/esm/eventListeners/segmentation/segmentationDataModifiedEventListener.js +32 -6
- package/dist/esm/eventListeners/segmentation/segmentationDataModifiedEventListener.js.map +1 -1
- package/dist/esm/store/addEnabledElement.js +2 -1
- package/dist/esm/store/addEnabledElement.js.map +1 -1
- package/dist/esm/store/removeEnabledElement.js +2 -0
- package/dist/esm/store/removeEnabledElement.js.map +1 -1
- package/dist/esm/tools/StackScrollToolMouseWheelTool.js +2 -0
- package/dist/esm/tools/StackScrollToolMouseWheelTool.js.map +1 -1
- package/dist/esm/tools/annotation/CircleROITool.js +4 -2
- package/dist/esm/tools/annotation/CircleROITool.js.map +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js +24 -11
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +36 -22
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/validateRepresentationData.js +6 -5
- package/dist/esm/tools/displayTools/Labelmap/validateRepresentationData.js.map +1 -1
- package/dist/esm/tools/segmentation/BrushTool.js +38 -29
- package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/esm/tools/segmentation/CircleScissorsTool.js +27 -15
- package/dist/esm/tools/segmentation/CircleScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/PaintFillTool.js +28 -5
- package/dist/esm/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/esm/tools/segmentation/RectangleScissorsTool.js +26 -17
- package/dist/esm/tools/segmentation/RectangleScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/SphereScissorsTool.js +28 -17
- package/dist/esm/tools/segmentation/SphereScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseCircle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseRectangle.js +4 -20
- package/dist/esm/tools/segmentation/strategies/eraseRectangle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillCircle.js +56 -31
- package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillRectangle.js +16 -8
- package/dist/esm/tools/segmentation/strategies/fillRectangle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillSphere.js +32 -18
- package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +40 -0
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -0
- 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/tools/segmentation/strategies/utils/stackVolumeCheck.js +9 -0
- package/dist/esm/tools/segmentation/strategies/utils/stackVolumeCheck.js.map +1 -0
- package/dist/esm/types/LabelmapToolOperationData.js +2 -0
- package/dist/esm/types/LabelmapToolOperationData.js.map +1 -0
- package/dist/esm/utilities/math/ellipse/pointInEllipse.js +19 -11
- package/dist/esm/utilities/math/ellipse/pointInEllipse.js.map +1 -1
- package/dist/esm/utilities/scroll.js +5 -4
- package/dist/esm/utilities/scroll.js.map +1 -1
- package/dist/types/eventListeners/index.d.ts +2 -2
- package/dist/types/eventListeners/index.d.ts.map +1 -1
- package/dist/types/eventListeners/segmentation/imageChangeEventListener.d.ts +6 -0
- package/dist/types/eventListeners/segmentation/imageChangeEventListener.d.ts.map +1 -0
- package/dist/types/eventListeners/segmentation/index.d.ts +2 -1
- package/dist/types/eventListeners/segmentation/index.d.ts.map +1 -1
- package/dist/types/eventListeners/segmentation/segmentationDataModifiedEventListener.d.ts.map +1 -1
- package/dist/types/store/addEnabledElement.d.ts.map +1 -1
- package/dist/types/store/removeEnabledElement.d.ts.map +1 -1
- package/dist/types/tools/StackScrollToolMouseWheelTool.d.ts +1 -0
- package/dist/types/tools/StackScrollToolMouseWheelTool.d.ts.map +1 -1
- package/dist/types/tools/annotation/CircleROITool.d.ts.map +1 -1
- package/dist/types/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -1
- package/dist/types/tools/displayTools/Labelmap/addLabelmapToElement.d.ts.map +1 -1
- package/dist/types/tools/displayTools/Labelmap/labelmapDisplay.d.ts +1 -1
- package/dist/types/tools/displayTools/Labelmap/labelmapDisplay.d.ts.map +1 -1
- package/dist/types/tools/displayTools/Labelmap/validateRepresentationData.d.ts.map +1 -1
- package/dist/types/tools/segmentation/BrushTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/CircleScissorsTool.d.ts +4 -2
- package/dist/types/tools/segmentation/CircleScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/PaintFillTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/RectangleScissorsTool.d.ts +3 -1
- package/dist/types/tools/segmentation/RectangleScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/SphereScissorsTool.d.ts +4 -2
- package/dist/types/tools/segmentation/SphereScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts +2 -10
- package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/eraseRectangle.d.ts +4 -8
- package/dist/types/tools/segmentation/strategies/eraseRectangle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts +2 -10
- package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillCircle.d.ts +3 -11
- package/dist/types/tools/segmentation/strategies/fillCircle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts +2 -7
- package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillSphere.d.ts +2 -10
- package/dist/types/tools/segmentation/strategies/fillSphere.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts +10 -0
- package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts.map +1 -0
- 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/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts +6 -0
- package/dist/types/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts.map +1 -0
- package/dist/types/types/LabelmapToolOperationData.d.ts +15 -0
- package/dist/types/types/LabelmapToolOperationData.d.ts.map +1 -0
- package/dist/types/types/LabelmapTypes.d.ts +5 -1
- package/dist/types/types/LabelmapTypes.d.ts.map +1 -1
- package/dist/types/types/ScrollOptions.d.ts +1 -0
- package/dist/types/types/ScrollOptions.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/pointInEllipse.d.ts +7 -9
- package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts.map +1 -1
- package/dist/types/utilities/scroll.d.ts +1 -1
- package/dist/types/utilities/scroll.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/eventListeners/index.ts +2 -0
- package/src/eventListeners/segmentation/imageChangeEventListener.ts +215 -0
- package/src/eventListeners/segmentation/index.ts +2 -0
- package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +70 -9
- package/src/store/addEnabledElement.ts +2 -0
- package/src/store/removeEnabledElement.ts +3 -0
- package/src/tools/StackScrollToolMouseWheelTool.ts +2 -0
- package/src/tools/annotation/CircleROITool.ts +5 -5
- package/src/tools/annotation/EllipticalROITool.ts +1 -1
- package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +51 -22
- package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +65 -35
- package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +17 -11
- package/src/tools/segmentation/BrushTool.ts +78 -39
- package/src/tools/segmentation/CircleScissorsTool.ts +46 -29
- package/src/tools/segmentation/PaintFillTool.ts +45 -8
- package/src/tools/segmentation/RectangleScissorsTool.ts +41 -31
- package/src/tools/segmentation/SphereScissorsTool.ts +46 -28
- package/src/tools/segmentation/strategies/eraseCircle.ts +3 -11
- package/src/tools/segmentation/strategies/eraseRectangle.ts +13 -42
- package/src/tools/segmentation/strategies/eraseSphere.ts +2 -10
- package/src/tools/segmentation/strategies/fillCircle.ts +93 -61
- package/src/tools/segmentation/strategies/fillRectangle.ts +31 -22
- package/src/tools/segmentation/strategies/fillSphere.ts +51 -41
- package/src/tools/segmentation/strategies/utils/getStrategyData.ts +58 -0
- package/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +3 -2
- package/src/tools/segmentation/strategies/utils/stackVolumeCheck.ts +33 -0
- package/src/types/LabelmapToolOperationData.ts +27 -0
- package/src/types/LabelmapTypes.ts +16 -1
- package/src/types/ScrollOptions.ts +1 -0
- package/src/types/index.ts +8 -0
- package/src/utilities/math/ellipse/pointInEllipse.ts +43 -22
- package/src/utilities/scroll.ts +7 -4
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import type { Types } from '@cornerstonejs/core';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
points: any;
|
|
6
|
-
volume: Types.IImageVolume;
|
|
7
|
-
segmentIndex: number;
|
|
8
|
-
segmentsLocked: number[];
|
|
9
|
-
viewPlaneNormal: number[];
|
|
10
|
-
viewUp: number[];
|
|
11
|
-
strategySpecificConfiguration: any;
|
|
12
|
-
constraintFn: () => boolean;
|
|
2
|
+
import { LabelmapToolOperationData } from '../../../types';
|
|
3
|
+
declare type OperationData = LabelmapToolOperationData & {
|
|
4
|
+
points: [Types.Point3, Types.Point3, Types.Point3, Types.Point3];
|
|
13
5
|
};
|
|
14
6
|
export declare function fillInsideCircle(enabledElement: Types.IEnabledElement, operationData: OperationData): void;
|
|
15
7
|
export declare function thresholdInsideCircle(enabledElement: Types.IEnabledElement, operationData: OperationData): void;
|
|
@@ -6,37 +6,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.fillOutsideCircle = exports.thresholdInsideCircle = exports.fillInsideCircle = void 0;
|
|
7
7
|
const gl_matrix_1 = require("gl-matrix");
|
|
8
8
|
const core_1 = require("@cornerstonejs/core");
|
|
9
|
+
const core_2 = require("@cornerstonejs/core");
|
|
9
10
|
const ellipse_1 = require("../../../utilities/math/ellipse");
|
|
10
11
|
const boundingBox_1 = require("../../../utilities/boundingBox");
|
|
11
12
|
const triggerSegmentationEvents_1 = require("../../../stateManagement/segmentation/triggerSegmentationEvents");
|
|
12
13
|
const utilities_1 = require("../../../utilities");
|
|
13
14
|
const isWithinThreshold_1 = __importDefault(require("./utils/isWithinThreshold"));
|
|
14
|
-
const
|
|
15
|
+
const getStrategyData_1 = require("./utils/getStrategyData");
|
|
16
|
+
const stackVolumeCheck_1 = require("./utils/stackVolumeCheck");
|
|
17
|
+
const { transformWorldToIndex } = core_2.utilities;
|
|
15
18
|
function fillCircle(enabledElement, operationData, threshold = false) {
|
|
16
|
-
const {
|
|
17
|
-
const { imageData, dimensions } = segmentationVolume;
|
|
18
|
-
const scalarData = segmentationVolume.getScalarData();
|
|
19
|
+
const { points, segmentsLocked, segmentIndex, segmentationId, strategySpecificConfiguration, } = operationData;
|
|
19
20
|
const { viewport } = enabledElement;
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
|
|
28
|
-
const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
|
|
29
|
-
const ellipsoidCornersIJK = [
|
|
30
|
-
transformWorldToIndex(imageData, topLeftWorld),
|
|
31
|
-
transformWorldToIndex(imageData, bottomRightWorld),
|
|
32
|
-
];
|
|
33
|
-
const boundsIJK = (0, boundingBox_1.getBoundingBoxAroundShape)(ellipsoidCornersIJK, dimensions);
|
|
34
|
-
const ellipseObj = {
|
|
35
|
-
center: center,
|
|
36
|
-
xRadius: Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2,
|
|
37
|
-
yRadius: Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2,
|
|
38
|
-
zRadius: Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2,
|
|
39
|
-
};
|
|
21
|
+
const data = (0, getStrategyData_1.getStrategyData)({ operationData, viewport });
|
|
22
|
+
if (!data) {
|
|
23
|
+
console.warn('No data found for fillCircle');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const { imageScalarData, segmentationImageData, segmentationScalarData } = data;
|
|
27
|
+
const { ellipseObj, boundsIJK } = getEllipse(viewport, segmentationImageData, points);
|
|
40
28
|
const modifiedSlicesToUse = new Set();
|
|
41
29
|
let callback;
|
|
42
30
|
if (threshold) {
|
|
@@ -44,8 +32,8 @@ function fillCircle(enabledElement, operationData, threshold = false) {
|
|
|
44
32
|
if (segmentsLocked.includes(value)) {
|
|
45
33
|
return;
|
|
46
34
|
}
|
|
47
|
-
if ((0, isWithinThreshold_1.default)(index,
|
|
48
|
-
|
|
35
|
+
if ((0, isWithinThreshold_1.default)(index, imageScalarData, strategySpecificConfiguration)) {
|
|
36
|
+
segmentationScalarData[index] = segmentIndex;
|
|
49
37
|
modifiedSlicesToUse.add(pointIJK[2]);
|
|
50
38
|
}
|
|
51
39
|
};
|
|
@@ -55,11 +43,13 @@ function fillCircle(enabledElement, operationData, threshold = false) {
|
|
|
55
43
|
if (segmentsLocked.includes(value)) {
|
|
56
44
|
return;
|
|
57
45
|
}
|
|
58
|
-
|
|
46
|
+
segmentationScalarData[index] = segmentIndex;
|
|
59
47
|
modifiedSlicesToUse.add(pointIJK[2]);
|
|
60
48
|
};
|
|
61
49
|
}
|
|
62
|
-
(0, utilities_1.pointInShapeCallback)(
|
|
50
|
+
(0, utilities_1.pointInShapeCallback)(segmentationImageData, (pointLPS) => (0, ellipse_1.pointInEllipse)(ellipseObj, pointLPS, {
|
|
51
|
+
fast: true,
|
|
52
|
+
}), callback, boundsIJK);
|
|
63
53
|
const arrayOfSlices = Array.from(modifiedSlicesToUse);
|
|
64
54
|
(0, triggerSegmentationEvents_1.triggerSegmentationDataModified)(segmentationId, arrayOfSlices);
|
|
65
55
|
}
|
|
@@ -68,10 +58,14 @@ function fillInsideCircle(enabledElement, operationData) {
|
|
|
68
58
|
}
|
|
69
59
|
exports.fillInsideCircle = fillInsideCircle;
|
|
70
60
|
function thresholdInsideCircle(enabledElement, operationData) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
61
|
+
if ((0, stackVolumeCheck_1.isVolumeSegmentation)(operationData)) {
|
|
62
|
+
const { referencedVolumeId, volumeId } = operationData;
|
|
63
|
+
const imageVolume = core_1.cache.getVolume(referencedVolumeId);
|
|
64
|
+
const segmentation = core_1.cache.getVolume(volumeId);
|
|
65
|
+
if (!core_2.utilities.isEqual(segmentation.dimensions, imageVolume.dimensions) ||
|
|
66
|
+
!core_2.utilities.isEqual(segmentation.direction, imageVolume.direction)) {
|
|
67
|
+
throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
|
|
68
|
+
}
|
|
75
69
|
}
|
|
76
70
|
fillCircle(enabledElement, operationData, true);
|
|
77
71
|
}
|
|
@@ -80,4 +74,35 @@ function fillOutsideCircle(enabledElement, operationData) {
|
|
|
80
74
|
throw new Error('Not yet implemented');
|
|
81
75
|
}
|
|
82
76
|
exports.fillOutsideCircle = fillOutsideCircle;
|
|
77
|
+
function getCenter(points) {
|
|
78
|
+
const center = gl_matrix_1.vec3.fromValues(0, 0, 0);
|
|
79
|
+
points.forEach((point) => {
|
|
80
|
+
gl_matrix_1.vec3.add(center, center, point);
|
|
81
|
+
});
|
|
82
|
+
gl_matrix_1.vec3.scale(center, center, 1 / points.length);
|
|
83
|
+
return center;
|
|
84
|
+
}
|
|
85
|
+
function getEllipse(viewport, imageData, points) {
|
|
86
|
+
const center = getCenter(points);
|
|
87
|
+
const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
|
|
88
|
+
const dimensions = imageData.getDimensions();
|
|
89
|
+
const [topLeftCanvas, bottomRightCanvas] = (0, ellipse_1.getCanvasEllipseCorners)(canvasCoordinates);
|
|
90
|
+
const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
|
|
91
|
+
const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
|
|
92
|
+
const ellipsoidCornersIJK = [
|
|
93
|
+
transformWorldToIndex(imageData, topLeftWorld),
|
|
94
|
+
transformWorldToIndex(imageData, bottomRightWorld),
|
|
95
|
+
];
|
|
96
|
+
const boundsIJK = (0, boundingBox_1.getBoundingBoxAroundShape)(ellipsoidCornersIJK, dimensions);
|
|
97
|
+
if (boundsIJK.every(([min, max]) => min !== max)) {
|
|
98
|
+
throw new Error('Oblique segmentation tools are not supported yet');
|
|
99
|
+
}
|
|
100
|
+
const ellipseObj = {
|
|
101
|
+
center: center,
|
|
102
|
+
xRadius: Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2,
|
|
103
|
+
yRadius: Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2,
|
|
104
|
+
zRadius: Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2,
|
|
105
|
+
};
|
|
106
|
+
return { ellipseObj, boundsIJK };
|
|
107
|
+
}
|
|
83
108
|
//# sourceMappingURL=fillCircle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillCircle.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAiC;AAEjC,8CAA2D;AAE3D,6DAGyC;AACzC,gEAA2E;AAC3E,+GAAkH;AAClH,kDAA0D;AAC1D,kFAA0D;AAE1D,MAAM,EAAE,qBAAqB,EAAE,GAAG,gBAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"fillCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillCircle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import { ImageVolume } from '@cornerstonejs/core';
|
|
2
1
|
import type { Types } from '@cornerstonejs/core';
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { LabelmapToolOperationData } from '../../../types';
|
|
3
|
+
declare type OperationData = LabelmapToolOperationData & {
|
|
5
4
|
points: [Types.Point3, Types.Point3, Types.Point3, Types.Point3];
|
|
6
|
-
volume: ImageVolume;
|
|
7
|
-
constraintFn: (x: [number, number, number]) => boolean;
|
|
8
|
-
segmentIndex: number;
|
|
9
|
-
segmentsLocked: number[];
|
|
10
5
|
};
|
|
11
6
|
export declare function fillInsideRectangle(enabledElement: Types.IEnabledElement, operationData: OperationData): void;
|
|
12
7
|
export declare function fillOutsideRectangle(enabledElement: Types.IEnabledElement, operationData: OperationData): void;
|
|
@@ -5,34 +5,42 @@ const core_1 = require("@cornerstonejs/core");
|
|
|
5
5
|
const boundingBox_1 = require("../../../utilities/boundingBox");
|
|
6
6
|
const utilities_1 = require("../../../utilities");
|
|
7
7
|
const triggerSegmentationEvents_1 = require("../../../stateManagement/segmentation/triggerSegmentationEvents");
|
|
8
|
+
const getStrategyData_1 = require("./utils/getStrategyData");
|
|
8
9
|
const { transformWorldToIndex } = core_1.utilities;
|
|
9
10
|
function fillRectangle(enabledElement, operationData, inside = true) {
|
|
10
|
-
const {
|
|
11
|
-
const
|
|
12
|
-
|
|
11
|
+
const { points, segmentsLocked, segmentIndex, segmentationId, constraintFn } = operationData;
|
|
12
|
+
const strategyData = (0, getStrategyData_1.getStrategyData)({
|
|
13
|
+
operationData,
|
|
14
|
+
viewport: enabledElement.viewport,
|
|
15
|
+
});
|
|
16
|
+
if (!strategyData) {
|
|
17
|
+
console.warn('No data found for fillRectangle');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const { segmentationImageData, segmentationScalarData } = strategyData;
|
|
13
21
|
let rectangleCornersIJK = points.map((world) => {
|
|
14
|
-
return transformWorldToIndex(
|
|
22
|
+
return transformWorldToIndex(segmentationImageData, world);
|
|
15
23
|
});
|
|
16
24
|
rectangleCornersIJK = rectangleCornersIJK.map((point) => {
|
|
17
25
|
return point.map((coord) => {
|
|
18
26
|
return Math.round(coord);
|
|
19
27
|
});
|
|
20
28
|
});
|
|
21
|
-
const boundsIJK = (0, boundingBox_1.getBoundingBoxAroundShape)(rectangleCornersIJK,
|
|
29
|
+
const boundsIJK = (0, boundingBox_1.getBoundingBoxAroundShape)(rectangleCornersIJK, segmentationImageData.getDimensions());
|
|
22
30
|
const pointInRectangle = () => true;
|
|
23
31
|
const callback = ({ value, index, pointIJK }) => {
|
|
24
32
|
if (segmentsLocked.includes(value)) {
|
|
25
33
|
return;
|
|
26
34
|
}
|
|
27
35
|
if (!constraintFn) {
|
|
28
|
-
|
|
36
|
+
segmentationScalarData[index] = segmentIndex;
|
|
29
37
|
return;
|
|
30
38
|
}
|
|
31
39
|
if (constraintFn(pointIJK)) {
|
|
32
|
-
|
|
40
|
+
segmentationScalarData[index] = segmentIndex;
|
|
33
41
|
}
|
|
34
42
|
};
|
|
35
|
-
(0, utilities_1.pointInShapeCallback)(
|
|
43
|
+
(0, utilities_1.pointInShapeCallback)(segmentationImageData, pointInRectangle, callback, boundsIJK);
|
|
36
44
|
(0, triggerSegmentationEvents_1.triggerSegmentationDataModified)(segmentationId);
|
|
37
45
|
}
|
|
38
46
|
function fillInsideRectangle(enabledElement, operationData) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillRectangle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillRectangle.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"fillRectangle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillRectangle.ts"],"names":[],"mappings":";;;AAAA,8CAA2D;AAG3D,gEAA2E;AAC3E,kDAA0D;AAC1D,+GAAkH;AAElH,6DAA0D;AAE1D,MAAM,EAAE,qBAAqB,EAAE,GAAG,gBAAO,CAAC;AAe1C,SAAS,aAAa,CACpB,cAAqC,EACrC,aAA4B,EAC5B,MAAM,GAAG,IAAI;IAEb,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,GAC1E,aAAa,CAAC;IAEhB,MAAM,YAAY,GAAG,IAAA,iCAAe,EAAC;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,IAAA,uCAAyB,EACzC,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,QAAQ,EAAE,EAAE,EAAE;QAC9C,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAClC,OAAO;SACR;QAED,IAAI,CAAC,YAAY,EAAE;YACjB,sBAAsB,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;YAC7C,OAAO;SACR;QAED,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE;YAC1B,sBAAsB,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;SAC9C;IACH,CAAC,CAAC;IAEF,IAAA,gCAAoB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,SAAS,CACV,CAAC;IAEF,IAAA,2DAA+B,EAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AASD,SAAgB,mBAAmB,CACjC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AALD,kDAKC;AASD,SAAgB,oBAAoB,CAClC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AALD,oDAKC"}
|
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import type { Types } from '@cornerstonejs/core';
|
|
2
|
-
|
|
2
|
+
import { LabelmapToolOperationData } from '../../../types';
|
|
3
|
+
declare type OperationData = LabelmapToolOperationData & {
|
|
3
4
|
points: [Types.Point3, Types.Point3, Types.Point3, Types.Point3];
|
|
4
|
-
volume: Types.IImageVolume;
|
|
5
|
-
imageVolume: Types.IImageVolume;
|
|
6
|
-
segmentIndex: number;
|
|
7
|
-
segmentationId: string;
|
|
8
|
-
segmentsLocked: number[];
|
|
9
|
-
viewPlaneNormal: Types.Point3;
|
|
10
|
-
viewUp: Types.Point3;
|
|
11
|
-
strategySpecificConfiguration: any;
|
|
12
|
-
constraintFn: () => boolean;
|
|
13
5
|
};
|
|
14
6
|
export declare function fillInsideSphere(enabledElement: Types.IEnabledElement, operationData: OperationData): void;
|
|
15
7
|
export declare function thresholdInsideSphere(enabledElement: Types.IEnabledElement, operationData: OperationData): void;
|
|
@@ -8,20 +8,26 @@ const core_1 = require("@cornerstonejs/core");
|
|
|
8
8
|
const triggerSegmentationEvents_1 = require("../../../stateManagement/segmentation/triggerSegmentationEvents");
|
|
9
9
|
const utilities_1 = require("../../../utilities");
|
|
10
10
|
const isWithinThreshold_1 = __importDefault(require("./utils/isWithinThreshold"));
|
|
11
|
+
const getStrategyData_1 = require("./utils/getStrategyData");
|
|
12
|
+
const stackVolumeCheck_1 = require("./utils/stackVolumeCheck");
|
|
11
13
|
function fillSphere(enabledElement, operationData, _inside = true, threshold = false) {
|
|
12
14
|
const { viewport } = enabledElement;
|
|
13
|
-
const {
|
|
14
|
-
const {
|
|
15
|
-
|
|
15
|
+
const { segmentsLocked, segmentIndex, strategySpecificConfiguration, points, } = operationData;
|
|
16
|
+
const strategyData = (0, getStrategyData_1.getStrategyData)({ operationData, viewport });
|
|
17
|
+
if (!strategyData) {
|
|
18
|
+
console.warn('No data found for fillSphere');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const { imageScalarData, segmentationImageData, segmentationScalarData } = strategyData;
|
|
16
22
|
const scalarIndex = [];
|
|
17
23
|
let callback;
|
|
18
24
|
if (threshold) {
|
|
19
|
-
callback = ({ value, index
|
|
25
|
+
callback = ({ value, index }) => {
|
|
20
26
|
if (segmentsLocked.includes(value)) {
|
|
21
27
|
return;
|
|
22
28
|
}
|
|
23
|
-
if ((0, isWithinThreshold_1.default)(index,
|
|
24
|
-
|
|
29
|
+
if ((0, isWithinThreshold_1.default)(index, imageScalarData, strategySpecificConfiguration)) {
|
|
30
|
+
segmentationScalarData[index] = segmentIndex;
|
|
25
31
|
scalarIndex.push(index);
|
|
26
32
|
}
|
|
27
33
|
};
|
|
@@ -31,26 +37,34 @@ function fillSphere(enabledElement, operationData, _inside = true, threshold = f
|
|
|
31
37
|
if (segmentsLocked.includes(value)) {
|
|
32
38
|
return;
|
|
33
39
|
}
|
|
34
|
-
|
|
40
|
+
segmentationScalarData[index] = segmentIndex;
|
|
35
41
|
scalarIndex.push(index);
|
|
36
42
|
};
|
|
37
43
|
}
|
|
38
|
-
(0, utilities_1.pointInSurroundingSphereCallback)(
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
(0, utilities_1.pointInSurroundingSphereCallback)(segmentationImageData, [points[0], points[1]], callback, viewport);
|
|
45
|
+
const dimensions = segmentationImageData.getDimensions();
|
|
46
|
+
let sliceArray;
|
|
47
|
+
if ((0, stackVolumeCheck_1.isVolumeSegmentation)(operationData)) {
|
|
48
|
+
const zMultiple = dimensions[0] * dimensions[1];
|
|
49
|
+
const minSlice = Math.floor(scalarIndex[0] / zMultiple);
|
|
50
|
+
const maxSlice = Math.floor(scalarIndex[scalarIndex.length - 1] / zMultiple);
|
|
51
|
+
sliceArray = Array.from({ length: maxSlice - minSlice + 1 }, (v, k) => k + minSlice);
|
|
52
|
+
(0, triggerSegmentationEvents_1.triggerSegmentationDataModified)(operationData.volumeId, sliceArray);
|
|
53
|
+
}
|
|
44
54
|
}
|
|
45
55
|
function fillInsideSphere(enabledElement, operationData) {
|
|
46
56
|
fillSphere(enabledElement, operationData, true);
|
|
47
57
|
}
|
|
48
58
|
exports.fillInsideSphere = fillInsideSphere;
|
|
49
59
|
function thresholdInsideSphere(enabledElement, operationData) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
60
|
+
if ((0, stackVolumeCheck_1.isVolumeSegmentation)(operationData)) {
|
|
61
|
+
const { referencedVolumeId, volumeId } = operationData;
|
|
62
|
+
const imageVolume = core_1.cache.getVolume(referencedVolumeId);
|
|
63
|
+
const segmentation = core_1.cache.getVolume(volumeId);
|
|
64
|
+
if (!core_1.utilities.isEqual(segmentation.dimensions, imageVolume.dimensions) ||
|
|
65
|
+
!core_1.utilities.isEqual(segmentation.direction, imageVolume.direction)) {
|
|
66
|
+
throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
|
|
67
|
+
}
|
|
54
68
|
}
|
|
55
69
|
fillSphere(enabledElement, operationData, true, true);
|
|
56
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillSphere.ts"],"names":[],"mappings":";;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"fillSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillSphere.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStrategyData = void 0;
|
|
4
|
+
const core_1 = require("@cornerstonejs/core");
|
|
5
|
+
const stackVolumeCheck_1 = require("./stackVolumeCheck");
|
|
6
|
+
function getStrategyData({ operationData, viewport }) {
|
|
7
|
+
let segmentationImageData, segmentationScalarData, imageScalarData;
|
|
8
|
+
if ((0, stackVolumeCheck_1.isVolumeSegmentation)(operationData)) {
|
|
9
|
+
const { volumeId, referencedVolumeId } = operationData;
|
|
10
|
+
const segmentationVolume = core_1.cache.getVolume(volumeId);
|
|
11
|
+
const imageVolume = core_1.cache.getVolume(referencedVolumeId);
|
|
12
|
+
if (!segmentationVolume || !imageVolume) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
({ imageData: segmentationImageData } = segmentationVolume);
|
|
16
|
+
segmentationScalarData = segmentationVolume.getScalarData();
|
|
17
|
+
imageScalarData = imageVolume.getScalarData();
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
const { imageIdReferenceMap, segmentationRepresentationUID } = operationData;
|
|
21
|
+
if (!imageIdReferenceMap) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const currentImageId = viewport.getCurrentImageId();
|
|
25
|
+
if (!currentImageId) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const actor = viewport.getActor(segmentationRepresentationUID);
|
|
29
|
+
segmentationImageData = actor.actor.getMapper().getInputData();
|
|
30
|
+
const currentSegmentationImageId = imageIdReferenceMap.get(currentImageId);
|
|
31
|
+
const segmentationImage = core_1.cache.getImage(currentSegmentationImageId);
|
|
32
|
+
segmentationScalarData = segmentationImage.getPixelData();
|
|
33
|
+
const image = core_1.cache.getImage(currentImageId);
|
|
34
|
+
imageScalarData = image.getPixelData();
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
segmentationImageData,
|
|
38
|
+
segmentationScalarData,
|
|
39
|
+
imageScalarData,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
exports.getStrategyData = getStrategyData;
|
|
43
|
+
//# sourceMappingURL=getStrategyData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getStrategyData.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/getStrategyData.ts"],"names":[],"mappings":";;;AAAA,8CAA4C;AAC5C,yDAA0D;AAG1D,SAAS,eAAe,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE;IAClD,IAAI,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACnE,IAAI,IAAA,uCAAoB,EAAC,aAAa,CAAC,EAAE;QACvC,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,aAAa,CAAC;QAEvD,MAAM,kBAAkB,GAAG,YAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,YAAK,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;KAC/C;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,YAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACrE,sBAAsB,GAAG,iBAAiB,CAAC,YAAY,EAAE,CAAC;QAE1D,MAAM,KAAK,GAAG,YAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAK7C,eAAe,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;KACxC;IAED,OAAO;QACL,qBAAqB;QACrB,sBAAsB;QACtB,eAAe;KAChB,CAAC;AACJ,CAAC;AAEQ,0CAAe"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
declare function isWithinThreshold(index: number,
|
|
1
|
+
import { TypedArray } from '@kitware/vtk.js/types';
|
|
2
|
+
declare function isWithinThreshold(index: number, imageScalarData: TypedArray, strategySpecificConfiguration: any): boolean;
|
|
3
3
|
export default isWithinThreshold;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
function isWithinThreshold(index,
|
|
3
|
+
function isWithinThreshold(index, imageScalarData, strategySpecificConfiguration) {
|
|
4
4
|
const { THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration;
|
|
5
|
-
const voxelValue =
|
|
5
|
+
const voxelValue = imageScalarData[index];
|
|
6
6
|
const { threshold } = THRESHOLD_INSIDE_CIRCLE;
|
|
7
7
|
return threshold[0] <= voxelValue && voxelValue <= threshold[1];
|
|
8
8
|
}
|
|
@@ -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":";;AAGA,SAAS,iBAAiB,CACxB,KAAa,EACb,eAA2B,EAC3B,6BAAkC;IAElC,MAAM,EAAE,uBAAuB,EAAE,GAAG,6BAA6B,CAAC;IAElE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,EAAE,SAAS,EAAE,GAAG,uBAAuB,CAAC;IAE9C,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,IAAI,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LabelmapSegmentationData, LabelmapSegmentationDataStack, LabelmapSegmentationDataVolume } from '../../../../types/LabelmapTypes';
|
|
2
|
+
import { LabelmapToolOperationData, LabelmapToolOperationDataStack, LabelmapToolOperationDataVolume } from '../../../../types';
|
|
3
|
+
declare function isStackSegmentation(operationData: LabelmapToolOperationData | LabelmapSegmentationData): operationData is LabelmapToolOperationDataStack | LabelmapSegmentationDataStack;
|
|
4
|
+
declare function isVolumeSegmentation(operationData: LabelmapToolOperationData | LabelmapSegmentationData): operationData is LabelmapToolOperationDataVolume | LabelmapSegmentationDataVolume;
|
|
5
|
+
export { isStackSegmentation, isVolumeSegmentation };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isVolumeSegmentation = exports.isStackSegmentation = void 0;
|
|
4
|
+
function isStackSegmentation(operationData) {
|
|
5
|
+
return (operationData.imageIdReferenceMap !==
|
|
6
|
+
undefined);
|
|
7
|
+
}
|
|
8
|
+
exports.isStackSegmentation = isStackSegmentation;
|
|
9
|
+
function isVolumeSegmentation(operationData) {
|
|
10
|
+
return (operationData.volumeId !== undefined);
|
|
11
|
+
}
|
|
12
|
+
exports.isVolumeSegmentation = isVolumeSegmentation;
|
|
13
|
+
//# sourceMappingURL=stackVolumeCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackVolumeCheck.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/stackVolumeCheck.ts"],"names":[],"mappings":";;;AAWA,SAAS,mBAAmB,CAC1B,aAAmE;IAInE,OAAO,CACJ,aAAgD,CAAC,mBAAmB;QACrE,SAAS,CACV,CAAC;AACJ,CAAC;AAYQ,kDAAmB;AAV5B,SAAS,oBAAoB,CAC3B,aAAmE;IAInE,OAAO,CACJ,aAAiD,CAAC,QAAQ,KAAK,SAAS,CAC1E,CAAC;AACJ,CAAC;AAE6B,oDAAoB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LabelmapSegmentationDataStack, LabelmapSegmentationDataVolume } from './LabelmapTypes';
|
|
2
|
+
declare type LabelmapToolOperationData = {
|
|
3
|
+
segmentationId: string;
|
|
4
|
+
segmentIndex: number;
|
|
5
|
+
segmentsLocked: number[];
|
|
6
|
+
viewPlaneNormal: number[];
|
|
7
|
+
viewUp: number[];
|
|
8
|
+
strategySpecificConfiguration: any;
|
|
9
|
+
constraintFn: (pointIJK: number) => boolean;
|
|
10
|
+
segmentationRepresentationUID: string;
|
|
11
|
+
};
|
|
12
|
+
declare type LabelmapToolOperationDataStack = LabelmapToolOperationData & LabelmapSegmentationDataStack;
|
|
13
|
+
declare type LabelmapToolOperationDataVolume = LabelmapToolOperationData & LabelmapSegmentationDataVolume;
|
|
14
|
+
export { LabelmapToolOperationData, LabelmapToolOperationDataStack, LabelmapToolOperationDataVolume, };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LabelmapToolOperationData.js","sourceRoot":"","sources":["../../../src/types/LabelmapToolOperationData.ts"],"names":[],"mappings":""}
|
|
@@ -15,7 +15,11 @@ export declare type LabelmapRenderingConfig = {
|
|
|
15
15
|
cfun?: vtkColorTransferFunction;
|
|
16
16
|
ofun?: vtkPiecewiseFunction;
|
|
17
17
|
};
|
|
18
|
-
export declare type
|
|
18
|
+
export declare type LabelmapSegmentationDataVolume = {
|
|
19
19
|
volumeId: string;
|
|
20
20
|
referencedVolumeId?: string;
|
|
21
21
|
};
|
|
22
|
+
export declare type LabelmapSegmentationDataStack = {
|
|
23
|
+
imageIdReferenceMap: Map<string, string>;
|
|
24
|
+
};
|
|
25
|
+
export declare type LabelmapSegmentationData = LabelmapSegmentationDataVolume | LabelmapSegmentationDataStack;
|
|
@@ -28,4 +28,5 @@ import type { ContourSegmentationData } from './ContourTypes';
|
|
|
28
28
|
import type IAnnotationManager from './IAnnotationManager';
|
|
29
29
|
import type AnnotationGroupSelector from './AnnotationGroupSelector';
|
|
30
30
|
import type { Statistics } from './CalculatorTypes';
|
|
31
|
-
|
|
31
|
+
import { LabelmapToolOperationData, LabelmapToolOperationDataStack, LabelmapToolOperationDataVolume } from './LabelmapToolOperationData';
|
|
32
|
+
export type { Annotation, Annotations, IAnnotationManager, GroupSpecificAnnotations, AnnotationState, AnnotationStyle, ToolSpecificAnnotationTypes, JumpToSliceOptions, AnnotationGroupSelector, PlanarBoundingBox, ToolProps, PublicToolProps, ToolConfiguration, EventTypes, IPoints, ITouchPoints, IDistance, IToolBinding, SetToolBindingsType, ToolOptionsType, InteractionTypes, ToolAction, IToolGroup, IToolClassReference, ISynchronizerEventHandler, ToolHandle, AnnotationHandle, TextBoxHandle, Segmentation, SegmentationState, SegmentationRepresentationData, SegmentationRepresentationConfig, RepresentationConfig, ToolGroupSpecificRepresentationState, ToolGroupSpecificContourRepresentation, ToolGroupSpecificLabelmapRepresentation, ToolGroupSpecificRepresentation, RepresentationPublicInput, Color, ColorLUT, LabelmapTypes, SVGCursorDescriptor, SVGPoint, ScrollOptions, CINETypes, BoundsIJK, SVGDrawingHelper, FloodFillResult, FloodFillGetter, FloodFillOptions, ContourSegmentationData, Statistics, LabelmapToolOperationData, LabelmapToolOperationDataStack, LabelmapToolOperationDataVolume, };
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
};
|
|
9
|
-
export default function pointInEllipse(ellipse: Ellipse, pointLPS: vec3): boolean;
|
|
1
|
+
interface Inverts {
|
|
2
|
+
invXRadiusSq?: number;
|
|
3
|
+
invYRadiusSq?: number;
|
|
4
|
+
invZRadiusSq?: number;
|
|
5
|
+
fast?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export default function pointInEllipse(ellipse: any, pointLPS: any, inverts?: Inverts): boolean;
|
|
10
8
|
export {};
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
function pointInEllipse(ellipse, pointLPS) {
|
|
4
|
-
const { center
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
function pointInEllipse(ellipse, pointLPS, inverts = {}) {
|
|
4
|
+
const { center, xRadius, yRadius, zRadius } = ellipse;
|
|
5
|
+
if (inverts.invXRadiusSq === undefined ||
|
|
6
|
+
inverts.invYRadiusSq === undefined ||
|
|
7
|
+
inverts.invZRadiusSq === undefined) {
|
|
8
|
+
inverts.invXRadiusSq = xRadius !== 0 ? 1 / Math.pow(xRadius, 2) : 0;
|
|
9
|
+
inverts.invYRadiusSq = yRadius !== 0 ? 1 / Math.pow(yRadius, 2) : 0;
|
|
10
|
+
inverts.invZRadiusSq = zRadius !== 0 ? 1 / Math.pow(zRadius, 2) : 0;
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
let inside = 0;
|
|
13
|
+
const dx = pointLPS[0] - center[0];
|
|
14
|
+
inside += dx * dx * inverts.invXRadiusSq;
|
|
15
|
+
if (inside > 1) {
|
|
16
|
+
return false;
|
|
13
17
|
}
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
const dy = pointLPS[1] - center[1];
|
|
19
|
+
inside += dy * dy * inverts.invYRadiusSq;
|
|
20
|
+
if (inside > 1) {
|
|
21
|
+
return false;
|
|
16
22
|
}
|
|
23
|
+
const dz = pointLPS[2] - center[2];
|
|
24
|
+
inside += dz * dz * inverts.invZRadiusSq;
|
|
17
25
|
return inside <= 1;
|
|
18
26
|
}
|
|
19
27
|
exports.default = pointInEllipse;
|