@cornerstonejs/tools 1.32.3 → 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.
Files changed (206) hide show
  1. package/dist/cjs/eventListeners/index.d.ts +2 -2
  2. package/dist/cjs/eventListeners/index.js +2 -1
  3. package/dist/cjs/eventListeners/index.js.map +1 -1
  4. package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.d.ts +5 -0
  5. package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.js +143 -0
  6. package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.js.map +1 -0
  7. package/dist/cjs/eventListeners/segmentation/index.d.ts +2 -1
  8. package/dist/cjs/eventListeners/segmentation/index.js +3 -1
  9. package/dist/cjs/eventListeners/segmentation/index.js.map +1 -1
  10. package/dist/cjs/eventListeners/segmentation/segmentationDataModifiedEventListener.js +31 -5
  11. package/dist/cjs/eventListeners/segmentation/segmentationDataModifiedEventListener.js.map +1 -1
  12. package/dist/cjs/store/addEnabledElement.js +1 -0
  13. package/dist/cjs/store/addEnabledElement.js.map +1 -1
  14. package/dist/cjs/store/removeEnabledElement.js +2 -0
  15. package/dist/cjs/store/removeEnabledElement.js.map +1 -1
  16. package/dist/cjs/tools/annotation/CircleROITool.js +3 -1
  17. package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -1
  18. package/dist/cjs/tools/annotation/EllipticalROITool.js +1 -1
  19. package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
  20. package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -1
  21. package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.js +23 -10
  22. package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.js.map +1 -1
  23. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.d.ts +1 -1
  24. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js +36 -22
  25. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  26. package/dist/cjs/tools/displayTools/Labelmap/validateRepresentationData.js +6 -5
  27. package/dist/cjs/tools/displayTools/Labelmap/validateRepresentationData.js.map +1 -1
  28. package/dist/cjs/tools/segmentation/BrushTool.js +40 -45
  29. package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
  30. package/dist/cjs/tools/segmentation/CircleScissorsTool.d.ts +4 -2
  31. package/dist/cjs/tools/segmentation/CircleScissorsTool.js +18 -17
  32. package/dist/cjs/tools/segmentation/CircleScissorsTool.js.map +1 -1
  33. package/dist/cjs/tools/segmentation/PaintFillTool.js +28 -5
  34. package/dist/cjs/tools/segmentation/PaintFillTool.js.map +1 -1
  35. package/dist/cjs/tools/segmentation/RectangleScissorsTool.d.ts +3 -1
  36. package/dist/cjs/tools/segmentation/RectangleScissorsTool.js +15 -16
  37. package/dist/cjs/tools/segmentation/RectangleScissorsTool.js.map +1 -1
  38. package/dist/cjs/tools/segmentation/SphereScissorsTool.d.ts +4 -2
  39. package/dist/cjs/tools/segmentation/SphereScissorsTool.js +20 -20
  40. package/dist/cjs/tools/segmentation/SphereScissorsTool.js.map +1 -1
  41. package/dist/cjs/tools/segmentation/strategies/eraseCircle.d.ts +2 -10
  42. package/dist/cjs/tools/segmentation/strategies/eraseCircle.js.map +1 -1
  43. package/dist/cjs/tools/segmentation/strategies/eraseRectangle.d.ts +4 -8
  44. package/dist/cjs/tools/segmentation/strategies/eraseRectangle.js +4 -20
  45. package/dist/cjs/tools/segmentation/strategies/eraseRectangle.js.map +1 -1
  46. package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +2 -10
  47. package/dist/cjs/tools/segmentation/strategies/eraseSphere.js.map +1 -1
  48. package/dist/cjs/tools/segmentation/strategies/fillCircle.d.ts +3 -11
  49. package/dist/cjs/tools/segmentation/strategies/fillCircle.js +57 -32
  50. package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
  51. package/dist/cjs/tools/segmentation/strategies/fillRectangle.d.ts +2 -7
  52. package/dist/cjs/tools/segmentation/strategies/fillRectangle.js +16 -8
  53. package/dist/cjs/tools/segmentation/strategies/fillRectangle.js.map +1 -1
  54. package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +2 -10
  55. package/dist/cjs/tools/segmentation/strategies/fillSphere.js +31 -17
  56. package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
  57. package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.d.ts +9 -0
  58. package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js +43 -0
  59. package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -0
  60. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
  61. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
  62. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
  63. package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts +5 -0
  64. package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.js +13 -0
  65. package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.js.map +1 -0
  66. package/dist/cjs/types/LabelmapToolOperationData.d.ts +14 -0
  67. package/dist/cjs/types/LabelmapToolOperationData.js +3 -0
  68. package/dist/cjs/types/LabelmapToolOperationData.js.map +1 -0
  69. package/dist/cjs/types/LabelmapTypes.d.ts +5 -1
  70. package/dist/cjs/types/index.d.ts +2 -1
  71. package/dist/cjs/utilities/math/ellipse/pointInEllipse.d.ts +7 -9
  72. package/dist/cjs/utilities/math/ellipse/pointInEllipse.js +19 -11
  73. package/dist/cjs/utilities/math/ellipse/pointInEllipse.js.map +1 -1
  74. package/dist/esm/eventListeners/index.js +2 -2
  75. package/dist/esm/eventListeners/index.js.map +1 -1
  76. package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js +115 -0
  77. package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js.map +1 -0
  78. package/dist/esm/eventListeners/segmentation/index.js +2 -1
  79. package/dist/esm/eventListeners/segmentation/index.js.map +1 -1
  80. package/dist/esm/eventListeners/segmentation/segmentationDataModifiedEventListener.js +32 -6
  81. package/dist/esm/eventListeners/segmentation/segmentationDataModifiedEventListener.js.map +1 -1
  82. package/dist/esm/store/addEnabledElement.js +2 -1
  83. package/dist/esm/store/addEnabledElement.js.map +1 -1
  84. package/dist/esm/store/removeEnabledElement.js +2 -0
  85. package/dist/esm/store/removeEnabledElement.js.map +1 -1
  86. package/dist/esm/tools/annotation/CircleROITool.js +4 -2
  87. package/dist/esm/tools/annotation/CircleROITool.js.map +1 -1
  88. package/dist/esm/tools/annotation/EllipticalROITool.js +1 -1
  89. package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
  90. package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js +24 -11
  91. package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js.map +1 -1
  92. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +36 -22
  93. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  94. package/dist/esm/tools/displayTools/Labelmap/validateRepresentationData.js +6 -5
  95. package/dist/esm/tools/displayTools/Labelmap/validateRepresentationData.js.map +1 -1
  96. package/dist/esm/tools/segmentation/BrushTool.js +38 -29
  97. package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
  98. package/dist/esm/tools/segmentation/CircleScissorsTool.js +27 -15
  99. package/dist/esm/tools/segmentation/CircleScissorsTool.js.map +1 -1
  100. package/dist/esm/tools/segmentation/PaintFillTool.js +28 -5
  101. package/dist/esm/tools/segmentation/PaintFillTool.js.map +1 -1
  102. package/dist/esm/tools/segmentation/RectangleScissorsTool.js +26 -17
  103. package/dist/esm/tools/segmentation/RectangleScissorsTool.js.map +1 -1
  104. package/dist/esm/tools/segmentation/SphereScissorsTool.js +28 -17
  105. package/dist/esm/tools/segmentation/SphereScissorsTool.js.map +1 -1
  106. package/dist/esm/tools/segmentation/strategies/eraseCircle.js.map +1 -1
  107. package/dist/esm/tools/segmentation/strategies/eraseRectangle.js +4 -20
  108. package/dist/esm/tools/segmentation/strategies/eraseRectangle.js.map +1 -1
  109. package/dist/esm/tools/segmentation/strategies/eraseSphere.js.map +1 -1
  110. package/dist/esm/tools/segmentation/strategies/fillCircle.js +56 -31
  111. package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
  112. package/dist/esm/tools/segmentation/strategies/fillRectangle.js +16 -8
  113. package/dist/esm/tools/segmentation/strategies/fillRectangle.js.map +1 -1
  114. package/dist/esm/tools/segmentation/strategies/fillSphere.js +32 -18
  115. package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
  116. package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +40 -0
  117. package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -0
  118. package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
  119. package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
  120. package/dist/esm/tools/segmentation/strategies/utils/stackVolumeCheck.js +9 -0
  121. package/dist/esm/tools/segmentation/strategies/utils/stackVolumeCheck.js.map +1 -0
  122. package/dist/esm/types/LabelmapToolOperationData.js +2 -0
  123. package/dist/esm/types/LabelmapToolOperationData.js.map +1 -0
  124. package/dist/esm/utilities/math/ellipse/pointInEllipse.js +19 -11
  125. package/dist/esm/utilities/math/ellipse/pointInEllipse.js.map +1 -1
  126. package/dist/types/eventListeners/index.d.ts +2 -2
  127. package/dist/types/eventListeners/index.d.ts.map +1 -1
  128. package/dist/types/eventListeners/segmentation/imageChangeEventListener.d.ts +6 -0
  129. package/dist/types/eventListeners/segmentation/imageChangeEventListener.d.ts.map +1 -0
  130. package/dist/types/eventListeners/segmentation/index.d.ts +2 -1
  131. package/dist/types/eventListeners/segmentation/index.d.ts.map +1 -1
  132. package/dist/types/eventListeners/segmentation/segmentationDataModifiedEventListener.d.ts.map +1 -1
  133. package/dist/types/store/addEnabledElement.d.ts.map +1 -1
  134. package/dist/types/store/removeEnabledElement.d.ts.map +1 -1
  135. package/dist/types/tools/annotation/CircleROITool.d.ts.map +1 -1
  136. package/dist/types/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -1
  137. package/dist/types/tools/displayTools/Labelmap/addLabelmapToElement.d.ts.map +1 -1
  138. package/dist/types/tools/displayTools/Labelmap/labelmapDisplay.d.ts +1 -1
  139. package/dist/types/tools/displayTools/Labelmap/labelmapDisplay.d.ts.map +1 -1
  140. package/dist/types/tools/displayTools/Labelmap/validateRepresentationData.d.ts.map +1 -1
  141. package/dist/types/tools/segmentation/BrushTool.d.ts.map +1 -1
  142. package/dist/types/tools/segmentation/CircleScissorsTool.d.ts +4 -2
  143. package/dist/types/tools/segmentation/CircleScissorsTool.d.ts.map +1 -1
  144. package/dist/types/tools/segmentation/PaintFillTool.d.ts.map +1 -1
  145. package/dist/types/tools/segmentation/RectangleScissorsTool.d.ts +3 -1
  146. package/dist/types/tools/segmentation/RectangleScissorsTool.d.ts.map +1 -1
  147. package/dist/types/tools/segmentation/SphereScissorsTool.d.ts +4 -2
  148. package/dist/types/tools/segmentation/SphereScissorsTool.d.ts.map +1 -1
  149. package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts +2 -10
  150. package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts.map +1 -1
  151. package/dist/types/tools/segmentation/strategies/eraseRectangle.d.ts +4 -8
  152. package/dist/types/tools/segmentation/strategies/eraseRectangle.d.ts.map +1 -1
  153. package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts +2 -10
  154. package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts.map +1 -1
  155. package/dist/types/tools/segmentation/strategies/fillCircle.d.ts +3 -11
  156. package/dist/types/tools/segmentation/strategies/fillCircle.d.ts.map +1 -1
  157. package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts +2 -7
  158. package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts.map +1 -1
  159. package/dist/types/tools/segmentation/strategies/fillSphere.d.ts +2 -10
  160. package/dist/types/tools/segmentation/strategies/fillSphere.d.ts.map +1 -1
  161. package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts +10 -0
  162. package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts.map +1 -0
  163. package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
  164. package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts.map +1 -1
  165. package/dist/types/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts +6 -0
  166. package/dist/types/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts.map +1 -0
  167. package/dist/types/types/LabelmapToolOperationData.d.ts +15 -0
  168. package/dist/types/types/LabelmapToolOperationData.d.ts.map +1 -0
  169. package/dist/types/types/LabelmapTypes.d.ts +5 -1
  170. package/dist/types/types/LabelmapTypes.d.ts.map +1 -1
  171. package/dist/types/types/index.d.ts +2 -1
  172. package/dist/types/types/index.d.ts.map +1 -1
  173. package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts +7 -9
  174. package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts.map +1 -1
  175. package/dist/umd/index.js +1 -1
  176. package/dist/umd/index.js.map +1 -1
  177. package/package.json +3 -3
  178. package/src/eventListeners/index.ts +2 -0
  179. package/src/eventListeners/segmentation/imageChangeEventListener.ts +215 -0
  180. package/src/eventListeners/segmentation/index.ts +2 -0
  181. package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +70 -9
  182. package/src/store/addEnabledElement.ts +2 -0
  183. package/src/store/removeEnabledElement.ts +3 -0
  184. package/src/tools/annotation/CircleROITool.ts +5 -5
  185. package/src/tools/annotation/EllipticalROITool.ts +1 -1
  186. package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +51 -22
  187. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +65 -35
  188. package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +17 -11
  189. package/src/tools/segmentation/BrushTool.ts +78 -39
  190. package/src/tools/segmentation/CircleScissorsTool.ts +46 -29
  191. package/src/tools/segmentation/PaintFillTool.ts +45 -8
  192. package/src/tools/segmentation/RectangleScissorsTool.ts +41 -31
  193. package/src/tools/segmentation/SphereScissorsTool.ts +46 -28
  194. package/src/tools/segmentation/strategies/eraseCircle.ts +3 -11
  195. package/src/tools/segmentation/strategies/eraseRectangle.ts +13 -42
  196. package/src/tools/segmentation/strategies/eraseSphere.ts +2 -10
  197. package/src/tools/segmentation/strategies/fillCircle.ts +93 -61
  198. package/src/tools/segmentation/strategies/fillRectangle.ts +31 -22
  199. package/src/tools/segmentation/strategies/fillSphere.ts +51 -41
  200. package/src/tools/segmentation/strategies/utils/getStrategyData.ts +58 -0
  201. package/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +3 -2
  202. package/src/tools/segmentation/strategies/utils/stackVolumeCheck.ts +33 -0
  203. package/src/types/LabelmapToolOperationData.ts +27 -0
  204. package/src/types/LabelmapTypes.ts +16 -1
  205. package/src/types/index.ts +8 -0
  206. package/src/utilities/math/ellipse/pointInEllipse.ts +43 -22
@@ -1,15 +1,7 @@
1
1
  import type { Types } from '@cornerstonejs/core';
2
- declare type OperationData = {
3
- segmentationId: string;
4
- imageVolume: Types.IImageVolume;
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 { transformWorldToIndex } = core_1.utilities;
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 { volume: segmentationVolume, imageVolume, points, segmentsLocked, segmentIndex, segmentationId, strategySpecificConfiguration, } = operationData;
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 center = gl_matrix_1.vec3.fromValues(0, 0, 0);
21
- points.forEach((point) => {
22
- gl_matrix_1.vec3.add(center, center, point);
23
- });
24
- gl_matrix_1.vec3.scale(center, center, 1 / points.length);
25
- const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
26
- const [topLeftCanvas, bottomRightCanvas] = (0, ellipse_1.getCanvasEllipseCorners)(canvasCoordinates);
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, imageVolume, strategySpecificConfiguration)) {
48
- scalarData[index] = segmentIndex;
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
- scalarData[index] = segmentIndex;
46
+ segmentationScalarData[index] = segmentIndex;
59
47
  modifiedSlicesToUse.add(pointIJK[2]);
60
48
  };
61
49
  }
62
- (0, utilities_1.pointInShapeCallback)(imageData, (pointLPS, pointIJK) => (0, ellipse_1.pointInEllipse)(ellipseObj, pointLPS), callback, boundsIJK);
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
- const { volume, imageVolume } = operationData;
72
- if (!core_1.utilities.isEqual(volume.dimensions, imageVolume.dimensions) ||
73
- !core_1.utilities.isEqual(volume.direction, imageVolume.direction)) {
74
- throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
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":"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"}
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
- declare type OperationData = {
4
- segmentationId: string;
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 { volume: segmentation, points, segmentsLocked, segmentIndex, segmentationId, constraintFn, } = operationData;
11
- const { imageData, dimensions } = segmentation;
12
- const scalarData = segmentation.getScalarData();
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(imageData, world);
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, dimensions);
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
- scalarData[index] = segmentIndex;
36
+ segmentationScalarData[index] = segmentIndex;
29
37
  return;
30
38
  }
31
39
  if (constraintFn(pointIJK)) {
32
- scalarData[index] = segmentIndex;
40
+ segmentationScalarData[index] = segmentIndex;
33
41
  }
34
42
  };
35
- (0, utilities_1.pointInShapeCallback)(imageData, pointInRectangle, callback, boundsIJK);
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,8CAAwE;AAGxE,gEAA2E;AAC3E,kDAA0D;AAC1D,+GAAkH;AAElH,MAAM,EAAE,qBAAqB,EAAE,GAAG,gBAAO,CAAC;AAoB1C,SAAS,aAAa,CACpB,cAAqC,EACrC,aAA4B,EAC5B,MAAM,GAAG,IAAI;IAEb,MAAM,EACJ,MAAM,EAAE,YAAY,EACpB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,cAAc,EACd,YAAY,GACb,GAAG,aAAa,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC;IAC/C,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAEhD,IAAI,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,OAAO,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjD,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,EAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAG7E,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,UAAU,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;YACjC,OAAO;SACR;QAED,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE;YAC1B,UAAU,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;SAClC;IACH,CAAC,CAAC;IAEF,IAAA,gCAAoB,EAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEvE,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
+ {"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
- declare type OperationData = {
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 { volume: segmentation, segmentsLocked, segmentIndex, imageVolume, strategySpecificConfiguration, segmentationId, points, } = operationData;
14
- const { imageData, dimensions } = segmentation;
15
- const scalarData = segmentation.getScalarData();
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, pointIJK }) => {
25
+ callback = ({ value, index }) => {
20
26
  if (segmentsLocked.includes(value)) {
21
27
  return;
22
28
  }
23
- if ((0, isWithinThreshold_1.default)(index, imageVolume, strategySpecificConfiguration)) {
24
- scalarData[index] = segmentIndex;
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
- scalarData[index] = segmentIndex;
40
+ segmentationScalarData[index] = segmentIndex;
35
41
  scalarIndex.push(index);
36
42
  };
37
43
  }
38
- (0, utilities_1.pointInSurroundingSphereCallback)(imageData, [points[0], points[1]], callback, viewport);
39
- const zMultiple = dimensions[0] * dimensions[1];
40
- const minSlice = Math.floor(scalarIndex[0] / zMultiple);
41
- const maxSlice = Math.floor(scalarIndex[scalarIndex.length - 1] / zMultiple);
42
- const sliceArray = Array.from({ length: maxSlice - minSlice + 1 }, (v, k) => k + minSlice);
43
- (0, triggerSegmentationEvents_1.triggerSegmentationDataModified)(segmentationId, sliceArray);
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
- const { volume, imageVolume } = operationData;
51
- if (!core_1.utilities.isEqual(volume.dimensions, imageVolume.dimensions) ||
52
- !core_1.utilities.isEqual(volume.direction, imageVolume.direction)) {
53
- throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
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":"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"}
1
+ {"version":3,"file":"fillSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillSphere.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ declare function getStrategyData({ operationData, viewport }: {
2
+ operationData: any;
3
+ viewport: any;
4
+ }): {
5
+ segmentationImageData: any;
6
+ segmentationScalarData: any;
7
+ imageScalarData: any;
8
+ };
9
+ export { getStrategyData };
@@ -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 { Types } from '@cornerstonejs/core';
2
- declare function isWithinThreshold(index: number, imageVolume: Types.IImageVolume, strategySpecificConfiguration: any): boolean;
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, imageVolume, strategySpecificConfiguration) {
3
+ function isWithinThreshold(index, imageScalarData, strategySpecificConfiguration) {
4
4
  const { THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration;
5
- const voxelValue = imageVolume.getScalarData()[index];
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":";;AAEA,SAAS,iBAAiB,CACxB,KAAa,EACb,WAA+B,EAC/B,6BAAkC;IAElC,MAAM,EAAE,uBAAuB,EAAE,GAAG,6BAA6B,CAAC;IAElE,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IACtD,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"}
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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=LabelmapToolOperationData.js.map
@@ -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 LabelmapSegmentationData = {
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
- 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, };
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
- import type { Types } from '@cornerstonejs/core';
2
- import { vec3 } from 'gl-matrix';
3
- declare type Ellipse = {
4
- center: Types.Point3;
5
- xRadius: number;
6
- yRadius: number;
7
- zRadius: number;
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: circleCenterWorld, xRadius, yRadius, zRadius } = ellipse;
5
- const [x, y, z] = pointLPS;
6
- const [x0, y0, z0] = circleCenterWorld;
7
- let inside = 0;
8
- if (xRadius !== 0) {
9
- inside += ((x - x0) * (x - x0)) / (xRadius * xRadius);
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
- if (yRadius !== 0) {
12
- inside += ((y - y0) * (y - y0)) / (yRadius * yRadius);
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
- if (zRadius !== 0) {
15
- inside += ((z - z0) * (z - z0)) / (zRadius * zRadius);
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;