@cornerstonejs/tools 1.42.1 → 1.43.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 (205) hide show
  1. package/dist/cjs/index.d.ts +2 -2
  2. package/dist/cjs/index.js +2 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/stateManagement/segmentation/activeSegmentation.d.ts +2 -1
  5. package/dist/cjs/stateManagement/segmentation/activeSegmentation.js +10 -1
  6. package/dist/cjs/stateManagement/segmentation/activeSegmentation.js.map +1 -1
  7. package/dist/cjs/stateManagement/segmentation/segmentIndex.js +5 -0
  8. package/dist/cjs/stateManagement/segmentation/segmentIndex.js.map +1 -1
  9. package/dist/cjs/tools/displayTools/Labelmap/labelmapConfig.js +2 -0
  10. package/dist/cjs/tools/displayTools/Labelmap/labelmapConfig.js.map +1 -1
  11. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js +10 -4
  12. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  13. package/dist/cjs/tools/index.d.ts +2 -1
  14. package/dist/cjs/tools/index.js +3 -1
  15. package/dist/cjs/tools/index.js.map +1 -1
  16. package/dist/cjs/tools/segmentation/BrushTool.d.ts +1 -0
  17. package/dist/cjs/tools/segmentation/BrushTool.js +32 -15
  18. package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
  19. package/dist/cjs/tools/segmentation/CircleScissorsTool.js +5 -0
  20. package/dist/cjs/tools/segmentation/CircleScissorsTool.js.map +1 -1
  21. package/dist/cjs/tools/segmentation/RectangleScissorsTool.js +5 -0
  22. package/dist/cjs/tools/segmentation/RectangleScissorsTool.js.map +1 -1
  23. package/dist/cjs/tools/segmentation/SegmentSelectTool.d.ts +15 -0
  24. package/dist/cjs/tools/segmentation/SegmentSelectTool.js +105 -0
  25. package/dist/cjs/tools/segmentation/SegmentSelectTool.js.map +1 -0
  26. package/dist/cjs/tools/segmentation/SphereScissorsTool.js +5 -0
  27. package/dist/cjs/tools/segmentation/SphereScissorsTool.js.map +1 -1
  28. package/dist/cjs/tools/segmentation/strategies/BrushStrategy.d.ts +2 -1
  29. package/dist/cjs/tools/segmentation/strategies/BrushStrategy.js.map +1 -1
  30. package/dist/cjs/tools/segmentation/strategies/fillCircle.js +8 -9
  31. package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
  32. package/dist/cjs/tools/segmentation/strategies/fillRectangle.js +30 -3
  33. package/dist/cjs/tools/segmentation/strategies/fillRectangle.js.map +1 -1
  34. package/dist/cjs/tools/segmentation/strategies/fillSphere.js +3 -20
  35. package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
  36. package/dist/cjs/types/LabelmapTypes.d.ts +1 -0
  37. package/dist/cjs/utilities/boundingBox/getBoundingBoxAroundShape.d.ts +4 -2
  38. package/dist/cjs/utilities/boundingBox/getBoundingBoxAroundShape.js +45 -23
  39. package/dist/cjs/utilities/boundingBox/getBoundingBoxAroundShape.js.map +1 -1
  40. package/dist/cjs/utilities/boundingBox/index.d.ts +2 -2
  41. package/dist/cjs/utilities/boundingBox/index.js +5 -3
  42. package/dist/cjs/utilities/boundingBox/index.js.map +1 -1
  43. package/dist/cjs/utilities/getSphereBoundsInfo.d.ts +11 -0
  44. package/dist/cjs/utilities/getSphereBoundsInfo.js +45 -0
  45. package/dist/cjs/utilities/getSphereBoundsInfo.js.map +1 -0
  46. package/dist/cjs/utilities/index.d.ts +2 -2
  47. package/dist/cjs/utilities/index.js +3 -3
  48. package/dist/cjs/utilities/index.js.map +1 -1
  49. package/dist/cjs/utilities/pointInShapeCallback.d.ts +1 -1
  50. package/dist/cjs/utilities/pointInShapeCallback.js +1 -1
  51. package/dist/cjs/utilities/pointInShapeCallback.js.map +1 -1
  52. package/dist/cjs/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.js +2 -2
  53. package/dist/cjs/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.js.map +1 -1
  54. package/dist/cjs/utilities/rectangleROITool/index.d.ts +2 -1
  55. package/dist/cjs/utilities/rectangleROITool/index.js +3 -1
  56. package/dist/cjs/utilities/rectangleROITool/index.js.map +1 -1
  57. package/dist/cjs/utilities/rectangleROITool/isAxisAlignedRectangle.d.ts +2 -0
  58. package/dist/cjs/utilities/rectangleROITool/isAxisAlignedRectangle.js +26 -0
  59. package/dist/cjs/utilities/rectangleROITool/isAxisAlignedRectangle.js.map +1 -0
  60. package/dist/cjs/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -1
  61. package/dist/cjs/utilities/segmentation/createLabelmapVolumeForViewport.js.map +1 -1
  62. package/dist/cjs/utilities/segmentation/index.d.ts +2 -1
  63. package/dist/cjs/utilities/segmentation/index.js +3 -1
  64. package/dist/cjs/utilities/segmentation/index.js.map +1 -1
  65. package/dist/cjs/utilities/segmentation/invalidateBrushCursor.d.ts +1 -0
  66. package/dist/cjs/utilities/segmentation/invalidateBrushCursor.js +31 -0
  67. package/dist/cjs/utilities/segmentation/invalidateBrushCursor.js.map +1 -0
  68. package/dist/cjs/utilities/segmentation/utilities.d.ts +1 -1
  69. package/dist/cjs/utilities/segmentation/utilities.js +2 -2
  70. package/dist/cjs/utilities/segmentation/utilities.js.map +1 -1
  71. package/dist/esm/index.js +2 -2
  72. package/dist/esm/index.js.map +1 -1
  73. package/dist/esm/stateManagement/segmentation/activeSegmentation.js +10 -2
  74. package/dist/esm/stateManagement/segmentation/activeSegmentation.js.map +1 -1
  75. package/dist/esm/stateManagement/segmentation/segmentIndex.js +6 -1
  76. package/dist/esm/stateManagement/segmentation/segmentIndex.js.map +1 -1
  77. package/dist/esm/tools/displayTools/Labelmap/labelmapConfig.js +2 -0
  78. package/dist/esm/tools/displayTools/Labelmap/labelmapConfig.js.map +1 -1
  79. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +11 -5
  80. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  81. package/dist/esm/tools/index.js +2 -1
  82. package/dist/esm/tools/index.js.map +1 -1
  83. package/dist/esm/tools/segmentation/BrushTool.js +31 -15
  84. package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
  85. package/dist/esm/tools/segmentation/CircleScissorsTool.js +5 -0
  86. package/dist/esm/tools/segmentation/CircleScissorsTool.js.map +1 -1
  87. package/dist/esm/tools/segmentation/RectangleScissorsTool.js +5 -0
  88. package/dist/esm/tools/segmentation/RectangleScissorsTool.js.map +1 -1
  89. package/dist/esm/tools/segmentation/SegmentSelectTool.js +100 -0
  90. package/dist/esm/tools/segmentation/SegmentSelectTool.js.map +1 -0
  91. package/dist/esm/tools/segmentation/SphereScissorsTool.js +5 -0
  92. package/dist/esm/tools/segmentation/SphereScissorsTool.js.map +1 -1
  93. package/dist/esm/tools/segmentation/strategies/BrushStrategy.js.map +1 -1
  94. package/dist/esm/tools/segmentation/strategies/fillCircle.js +8 -9
  95. package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
  96. package/dist/esm/tools/segmentation/strategies/fillRectangle.js +32 -5
  97. package/dist/esm/tools/segmentation/strategies/fillRectangle.js.map +1 -1
  98. package/dist/esm/tools/segmentation/strategies/fillSphere.js +3 -20
  99. package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
  100. package/dist/esm/utilities/boundingBox/getBoundingBoxAroundShape.js +40 -23
  101. package/dist/esm/utilities/boundingBox/getBoundingBoxAroundShape.js.map +1 -1
  102. package/dist/esm/utilities/boundingBox/index.js +2 -2
  103. package/dist/esm/utilities/boundingBox/index.js.map +1 -1
  104. package/dist/esm/utilities/getSphereBoundsInfo.js +42 -0
  105. package/dist/esm/utilities/getSphereBoundsInfo.js.map +1 -0
  106. package/dist/esm/utilities/index.js +2 -2
  107. package/dist/esm/utilities/index.js.map +1 -1
  108. package/dist/esm/utilities/pointInShapeCallback.js +1 -1
  109. package/dist/esm/utilities/pointInShapeCallback.js.map +1 -1
  110. package/dist/esm/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.js +2 -2
  111. package/dist/esm/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.js.map +1 -1
  112. package/dist/esm/utilities/rectangleROITool/index.js +2 -1
  113. package/dist/esm/utilities/rectangleROITool/index.js.map +1 -1
  114. package/dist/esm/utilities/rectangleROITool/isAxisAlignedRectangle.js +23 -0
  115. package/dist/esm/utilities/rectangleROITool/isAxisAlignedRectangle.js.map +1 -0
  116. package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -1
  117. package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js.map +1 -1
  118. package/dist/esm/utilities/segmentation/index.js +2 -1
  119. package/dist/esm/utilities/segmentation/index.js.map +1 -1
  120. package/dist/esm/utilities/segmentation/invalidateBrushCursor.js +24 -0
  121. package/dist/esm/utilities/segmentation/invalidateBrushCursor.js.map +1 -0
  122. package/dist/esm/utilities/segmentation/utilities.js +2 -2
  123. package/dist/esm/utilities/segmentation/utilities.js.map +1 -1
  124. package/dist/types/index.d.ts +2 -2
  125. package/dist/types/index.d.ts.map +1 -1
  126. package/dist/types/stateManagement/segmentation/activeSegmentation.d.ts +2 -1
  127. package/dist/types/stateManagement/segmentation/activeSegmentation.d.ts.map +1 -1
  128. package/dist/types/stateManagement/segmentation/segmentIndex.d.ts.map +1 -1
  129. package/dist/types/tools/displayTools/Labelmap/labelmapConfig.d.ts.map +1 -1
  130. package/dist/types/tools/displayTools/Labelmap/labelmapDisplay.d.ts.map +1 -1
  131. package/dist/types/tools/index.d.ts +2 -1
  132. package/dist/types/tools/index.d.ts.map +1 -1
  133. package/dist/types/tools/segmentation/BrushTool.d.ts +1 -0
  134. package/dist/types/tools/segmentation/BrushTool.d.ts.map +1 -1
  135. package/dist/types/tools/segmentation/CircleScissorsTool.d.ts.map +1 -1
  136. package/dist/types/tools/segmentation/RectangleScissorsTool.d.ts.map +1 -1
  137. package/dist/types/tools/segmentation/SegmentSelectTool.d.ts +16 -0
  138. package/dist/types/tools/segmentation/SegmentSelectTool.d.ts.map +1 -0
  139. package/dist/types/tools/segmentation/SphereScissorsTool.d.ts.map +1 -1
  140. package/dist/types/tools/segmentation/strategies/BrushStrategy.d.ts +2 -1
  141. package/dist/types/tools/segmentation/strategies/BrushStrategy.d.ts.map +1 -1
  142. package/dist/types/tools/segmentation/strategies/fillCircle.d.ts.map +1 -1
  143. package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts.map +1 -1
  144. package/dist/types/tools/segmentation/strategies/fillSphere.d.ts.map +1 -1
  145. package/dist/types/types/LabelmapTypes.d.ts +1 -0
  146. package/dist/types/types/LabelmapTypes.d.ts.map +1 -1
  147. package/dist/types/utilities/boundingBox/getBoundingBoxAroundShape.d.ts +4 -2
  148. package/dist/types/utilities/boundingBox/getBoundingBoxAroundShape.d.ts.map +1 -1
  149. package/dist/types/utilities/boundingBox/index.d.ts +2 -2
  150. package/dist/types/utilities/boundingBox/index.d.ts.map +1 -1
  151. package/dist/types/utilities/getSphereBoundsInfo.d.ts +12 -0
  152. package/dist/types/utilities/getSphereBoundsInfo.d.ts.map +1 -0
  153. package/dist/types/utilities/index.d.ts +2 -2
  154. package/dist/types/utilities/index.d.ts.map +1 -1
  155. package/dist/types/utilities/pointInShapeCallback.d.ts +1 -1
  156. package/dist/types/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.d.ts.map +1 -1
  157. package/dist/types/utilities/rectangleROITool/index.d.ts +2 -1
  158. package/dist/types/utilities/rectangleROITool/index.d.ts.map +1 -1
  159. package/dist/types/utilities/rectangleROITool/isAxisAlignedRectangle.d.ts +3 -0
  160. package/dist/types/utilities/rectangleROITool/isAxisAlignedRectangle.d.ts.map +1 -0
  161. package/dist/types/utilities/segmentation/index.d.ts +2 -1
  162. package/dist/types/utilities/segmentation/index.d.ts.map +1 -1
  163. package/dist/types/utilities/segmentation/invalidateBrushCursor.d.ts +2 -0
  164. package/dist/types/utilities/segmentation/invalidateBrushCursor.d.ts.map +1 -0
  165. package/dist/types/utilities/segmentation/utilities.d.ts +1 -1
  166. package/dist/types/utilities/segmentation/utilities.d.ts.map +1 -1
  167. package/dist/umd/index.js +1 -1
  168. package/dist/umd/index.js.map +1 -1
  169. package/package.json +4 -4
  170. package/src/index.ts +2 -0
  171. package/src/stateManagement/segmentation/activeSegmentation.ts +24 -1
  172. package/src/stateManagement/segmentation/segmentIndex.ts +15 -2
  173. package/src/tools/displayTools/Labelmap/labelmapConfig.ts +2 -0
  174. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +23 -12
  175. package/src/tools/index.ts +2 -0
  176. package/src/tools/segmentation/BrushTool.ts +53 -26
  177. package/src/tools/segmentation/CircleScissorsTool.ts +9 -0
  178. package/src/tools/segmentation/RectangleScissorsTool.ts +10 -1
  179. package/src/tools/segmentation/SegmentSelectTool.ts +182 -0
  180. package/src/tools/segmentation/SphereScissorsTool.ts +9 -0
  181. package/src/tools/segmentation/strategies/BrushStrategy.ts +2 -1
  182. package/src/tools/segmentation/strategies/fillCircle.ts +15 -14
  183. package/src/tools/segmentation/strategies/fillRectangle.ts +51 -6
  184. package/src/tools/segmentation/strategies/fillSphere.ts +10 -38
  185. package/src/types/LabelmapTypes.ts +5 -2
  186. package/src/utilities/boundingBox/getBoundingBoxAroundShape.ts +88 -37
  187. package/src/utilities/boundingBox/index.ts +11 -2
  188. package/src/utilities/{pointInSurroundingSphereCallback.ts → getSphereBoundsInfo.ts} +39 -82
  189. package/src/utilities/index.ts +2 -2
  190. package/src/utilities/math/ellipse/pointInEllipse.ts +1 -1
  191. package/src/utilities/pointInShapeCallback.ts +2 -2
  192. package/src/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.ts +5 -2
  193. package/src/utilities/rectangleROITool/index.ts +2 -1
  194. package/src/utilities/rectangleROITool/isAxisAlignedRectangle.ts +53 -0
  195. package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +1 -1
  196. package/src/utilities/segmentation/index.ts +2 -0
  197. package/src/utilities/segmentation/invalidateBrushCursor.ts +48 -0
  198. package/src/utilities/segmentation/utilities.ts +5 -2
  199. package/dist/cjs/utilities/pointInSurroundingSphereCallback.d.ts +0 -4
  200. package/dist/cjs/utilities/pointInSurroundingSphereCallback.js +0 -70
  201. package/dist/cjs/utilities/pointInSurroundingSphereCallback.js.map +0 -1
  202. package/dist/esm/utilities/pointInSurroundingSphereCallback.js +0 -64
  203. package/dist/esm/utilities/pointInSurroundingSphereCallback.js.map +0 -1
  204. package/dist/types/utilities/pointInSurroundingSphereCallback.d.ts +0 -5
  205. package/dist/types/utilities/pointInSurroundingSphereCallback.d.ts.map +0 -1
@@ -0,0 +1,53 @@
1
+ import { vec3 } from 'gl-matrix';
2
+ import { utilities as csUtils } from '@cornerstonejs/core';
3
+
4
+ const { isEqual } = csUtils;
5
+
6
+ const iAxis = vec3.fromValues(1, 0, 0);
7
+ const jAxis = vec3.fromValues(0, 1, 0);
8
+ const kAxis = vec3.fromValues(0, 0, 1);
9
+
10
+ const axisList = [iAxis, jAxis, kAxis];
11
+
12
+ /**
13
+ * Determines whether a given rectangle in a 3D space (defined by its corner
14
+ * points in IJK coordinates) is aligned with the IJK axes.
15
+ * @param rectangleCornersIJK - The corner points of the rectangle in IJK coordinates
16
+ * @returns True if the rectangle is aligned with the IJK axes, false otherwise
17
+ */
18
+ function isAxisAlignedRectangle(rectangleCornersIJK) {
19
+ const rectangleVec1 = vec3.subtract(
20
+ vec3.create(),
21
+ rectangleCornersIJK[0],
22
+ rectangleCornersIJK[1]
23
+ );
24
+
25
+ const rectangleVec2 = vec3.subtract(
26
+ vec3.create(),
27
+ rectangleCornersIJK[0],
28
+ rectangleCornersIJK[2]
29
+ );
30
+
31
+ // Calculate the angles with IJK axes for both vectors
32
+ const anglesVec1 = calculateAnglesWithAxes(rectangleVec1, axisList);
33
+ const anglesVec2 = calculateAnglesWithAxes(rectangleVec2, axisList);
34
+
35
+ // Check if all angles are aligned (0, 90, 180, or 270 degrees)
36
+ // we could do csUtils.isEqual(angle % 90, 0) but this is more explicit for reading
37
+ const isAligned = [...anglesVec1, ...anglesVec2].every(
38
+ (angle) =>
39
+ isEqual(angle, 0) ||
40
+ isEqual(angle, 90) ||
41
+ isEqual(angle, 180) ||
42
+ isEqual(angle, 270)
43
+ );
44
+
45
+ return isAligned;
46
+ }
47
+
48
+ // Function to calculate angle with IJK axes
49
+ function calculateAnglesWithAxes(vec, axes) {
50
+ return axes.map((axis) => (vec3.angle(vec, axis) * 180) / Math.PI);
51
+ }
52
+
53
+ export { isAxisAlignedRectangle };
@@ -65,7 +65,7 @@ export default async function createLabelmapVolumeForViewport(input: {
65
65
  } else {
66
66
  // create a labelmap from a reference volume
67
67
  const { uid: volumeId } = viewport.getDefaultActor();
68
- await volumeLoader.createAndCacheDerivedVolume(volumeId, {
68
+ await volumeLoader.createAndCacheDerivedSegmentationVolume(volumeId, {
69
69
  volumeId: segmentationId,
70
70
  });
71
71
  }
@@ -19,6 +19,7 @@ import { createImageIdReferenceMap } from './createImageIdReferenceMap';
19
19
  import contourAndFindLargestBidirectional from './contourAndFindLargestBidirectional';
20
20
  import createBidirectionalToolData from './createBidirectionalToolData';
21
21
  import segmentContourAction from './segmentContourAction';
22
+ import { invalidateBrushCursor } from './invalidateBrushCursor';
22
23
 
23
24
  export {
24
25
  thresholdVolumeByRange,
@@ -38,4 +39,5 @@ export {
38
39
  contourAndFindLargestBidirectional,
39
40
  createBidirectionalToolData,
40
41
  segmentContourAction,
42
+ invalidateBrushCursor,
41
43
  };
@@ -0,0 +1,48 @@
1
+ import { getToolGroup } from '../../store/ToolGroupManager';
2
+ import BrushTool from '../../tools/segmentation/BrushTool';
3
+ import triggerAnnotationRenderForViewportIds from '../triggerAnnotationRenderForViewportIds';
4
+ import { getRenderingEngine } from '@cornerstonejs/core';
5
+ import getBrushToolInstances from './utilities';
6
+
7
+ /**
8
+ * Invalidates the brush cursor for a specific tool group.
9
+ * This function triggers the update of the brush being rendered.
10
+ * It also triggers an annotation render for any viewports on the tool group.
11
+ *
12
+ * @param toolGroupId - The ID of the tool group.
13
+ */
14
+ export function invalidateBrushCursor(toolGroupId: string): void {
15
+ const toolGroup = getToolGroup(toolGroupId);
16
+
17
+ if (toolGroup === undefined) {
18
+ return;
19
+ }
20
+
21
+ const brushBasedToolInstances = getBrushToolInstances(toolGroupId);
22
+
23
+ brushBasedToolInstances.forEach((tool: BrushTool) => {
24
+ // Invalidate the brush being rendered so it can update.
25
+ tool.invalidateBrushCursor();
26
+ });
27
+
28
+ // Trigger an annotation render for any viewports on the toolgroup
29
+ const viewportsInfo = toolGroup.getViewportsInfo();
30
+
31
+ const viewportsInfoArray = Object.keys(viewportsInfo).map(
32
+ (key) => viewportsInfo[key]
33
+ );
34
+
35
+ if (!viewportsInfoArray.length) {
36
+ return;
37
+ }
38
+
39
+ const { renderingEngineId } = viewportsInfoArray[0];
40
+
41
+ // Use helper to get array of viewportIds, or we just end up doing this mapping
42
+ // ourselves here.
43
+ const viewportIds = toolGroup.getViewportIds();
44
+
45
+ const renderingEngine = getRenderingEngine(renderingEngineId);
46
+
47
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIds);
48
+ }
@@ -2,7 +2,7 @@ import { Types } from '@cornerstonejs/core';
2
2
  import { utilities as csUtils } from '@cornerstonejs/core';
3
3
  import { getToolGroup } from '../../store/ToolGroupManager';
4
4
  import BrushTool from '../../tools/segmentation/BrushTool';
5
- import getBoundingBoxAroundShape from '../boundingBox/getBoundingBoxAroundShape';
5
+ import { getBoundingBoxAroundShapeIJK } from '../boundingBox/getBoundingBoxAroundShape';
6
6
 
7
7
  export type ThresholdInformation = {
8
8
  volume: Types.IImageVolume;
@@ -67,7 +67,10 @@ export function getVoxelOverlap(
67
67
  const voxelCornersIJK = voxelCornersWorld.map(
68
68
  (world) => csUtils.transformWorldToIndex(imageData, world) as Types.Point3
69
69
  );
70
- const overlapBounds = getBoundingBoxAroundShape(voxelCornersIJK, dimensions);
70
+ const overlapBounds = getBoundingBoxAroundShapeIJK(
71
+ voxelCornersIJK,
72
+ dimensions
73
+ );
71
74
 
72
75
  return overlapBounds;
73
76
  }
@@ -1,4 +0,0 @@
1
- import type { Types } from '@cornerstonejs/core';
2
- import type { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData';
3
- import { PointInShapeCallback } from './pointInShapeCallback';
4
- export default function pointInSurroundingSphereCallback(imageData: vtkImageData, circlePoints: [Types.Point3, Types.Point3], callback: PointInShapeCallback, viewport?: Types.IVolumeViewport): void;
@@ -1,70 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const core_1 = require("@cornerstonejs/core");
7
- const gl_matrix_1 = require("gl-matrix");
8
- const sphere_1 = require("./math/sphere");
9
- const pointInShapeCallback_1 = __importDefault(require("./pointInShapeCallback"));
10
- const boundingBox_1 = require("./boundingBox");
11
- const { transformWorldToIndex } = core_1.utilities;
12
- function pointInSurroundingSphereCallback(imageData, circlePoints, callback, viewport) {
13
- const { boundsIJK, centerWorld, radiusWorld } = _getBounds(circlePoints, imageData, viewport);
14
- const sphereObj = {
15
- center: centerWorld,
16
- radius: radiusWorld,
17
- };
18
- (0, pointInShapeCallback_1.default)(imageData, (pointLPS) => (0, sphere_1.pointInSphere)(sphereObj, pointLPS), callback, boundsIJK);
19
- }
20
- exports.default = pointInSurroundingSphereCallback;
21
- function _getBounds(circlePoints, imageData, viewport) {
22
- const [bottom, top] = circlePoints;
23
- const centerWorld = gl_matrix_1.vec3.fromValues((bottom[0] + top[0]) / 2, (bottom[1] + top[1]) / 2, (bottom[2] + top[2]) / 2);
24
- const radiusWorld = gl_matrix_1.vec3.distance(bottom, top) / 2;
25
- let boundsIJK;
26
- if (!viewport) {
27
- const centerIJK = transformWorldToIndex(imageData, centerWorld);
28
- const spacings = imageData.getSpacing();
29
- const minSpacing = Math.min(...spacings);
30
- const maxRadiusIJK = Math.ceil(radiusWorld / minSpacing);
31
- boundsIJK = [
32
- [centerIJK[0] - maxRadiusIJK, centerIJK[0] + maxRadiusIJK],
33
- [centerIJK[1] - maxRadiusIJK, centerIJK[1] + maxRadiusIJK],
34
- [centerIJK[2] - maxRadiusIJK, centerIJK[2] + maxRadiusIJK],
35
- ];
36
- return {
37
- boundsIJK,
38
- centerWorld: centerWorld,
39
- radiusWorld,
40
- };
41
- }
42
- boundsIJK = _computeBoundsIJKWithCamera(imageData, viewport, circlePoints, centerWorld, radiusWorld);
43
- return {
44
- boundsIJK,
45
- centerWorld: centerWorld,
46
- radiusWorld,
47
- };
48
- }
49
- function _computeBoundsIJKWithCamera(imageData, viewport, circlePoints, centerWorld, radiusWorld) {
50
- const [bottom, top] = circlePoints;
51
- const dimensions = imageData.getDimensions();
52
- const camera = viewport.getCamera();
53
- const viewUp = gl_matrix_1.vec3.fromValues(camera.viewUp[0], camera.viewUp[1], camera.viewUp[2]);
54
- const viewPlaneNormal = gl_matrix_1.vec3.fromValues(camera.viewPlaneNormal[0], camera.viewPlaneNormal[1], camera.viewPlaneNormal[2]);
55
- const viewRight = gl_matrix_1.vec3.create();
56
- gl_matrix_1.vec3.cross(viewRight, viewUp, viewPlaneNormal);
57
- const topLeftWorld = gl_matrix_1.vec3.create();
58
- const bottomRightWorld = gl_matrix_1.vec3.create();
59
- gl_matrix_1.vec3.scaleAndAdd(topLeftWorld, top, viewPlaneNormal, radiusWorld);
60
- gl_matrix_1.vec3.scaleAndAdd(bottomRightWorld, bottom, viewPlaneNormal, -radiusWorld);
61
- gl_matrix_1.vec3.scaleAndAdd(topLeftWorld, topLeftWorld, viewRight, -radiusWorld);
62
- gl_matrix_1.vec3.scaleAndAdd(bottomRightWorld, bottomRightWorld, viewRight, radiusWorld);
63
- const sphereCornersIJK = [
64
- transformWorldToIndex(imageData, topLeftWorld),
65
- (transformWorldToIndex(imageData, bottomRightWorld)),
66
- ];
67
- const boundsIJK = (0, boundingBox_1.getBoundingBoxAroundShape)(sphereCornersIJK, dimensions);
68
- return boundsIJK;
69
- }
70
- //# sourceMappingURL=pointInSurroundingSphereCallback.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pointInSurroundingSphereCallback.js","sourceRoot":"","sources":["../../../src/utilities/pointInSurroundingSphereCallback.ts"],"names":[],"mappings":"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"}
@@ -1,64 +0,0 @@
1
- import { utilities as csUtils } from '@cornerstonejs/core';
2
- import { vec3 } from 'gl-matrix';
3
- import { pointInSphere } from './math/sphere';
4
- import pointInShapeCallback from './pointInShapeCallback';
5
- import { getBoundingBoxAroundShape } from './boundingBox';
6
- const { transformWorldToIndex } = csUtils;
7
- export default function pointInSurroundingSphereCallback(imageData, circlePoints, callback, viewport) {
8
- const { boundsIJK, centerWorld, radiusWorld } = _getBounds(circlePoints, imageData, viewport);
9
- const sphereObj = {
10
- center: centerWorld,
11
- radius: radiusWorld,
12
- };
13
- pointInShapeCallback(imageData, (pointLPS) => pointInSphere(sphereObj, pointLPS), callback, boundsIJK);
14
- }
15
- function _getBounds(circlePoints, imageData, viewport) {
16
- const [bottom, top] = circlePoints;
17
- const centerWorld = vec3.fromValues((bottom[0] + top[0]) / 2, (bottom[1] + top[1]) / 2, (bottom[2] + top[2]) / 2);
18
- const radiusWorld = vec3.distance(bottom, top) / 2;
19
- let boundsIJK;
20
- if (!viewport) {
21
- const centerIJK = transformWorldToIndex(imageData, centerWorld);
22
- const spacings = imageData.getSpacing();
23
- const minSpacing = Math.min(...spacings);
24
- const maxRadiusIJK = Math.ceil(radiusWorld / minSpacing);
25
- boundsIJK = [
26
- [centerIJK[0] - maxRadiusIJK, centerIJK[0] + maxRadiusIJK],
27
- [centerIJK[1] - maxRadiusIJK, centerIJK[1] + maxRadiusIJK],
28
- [centerIJK[2] - maxRadiusIJK, centerIJK[2] + maxRadiusIJK],
29
- ];
30
- return {
31
- boundsIJK,
32
- centerWorld: centerWorld,
33
- radiusWorld,
34
- };
35
- }
36
- boundsIJK = _computeBoundsIJKWithCamera(imageData, viewport, circlePoints, centerWorld, radiusWorld);
37
- return {
38
- boundsIJK,
39
- centerWorld: centerWorld,
40
- radiusWorld,
41
- };
42
- }
43
- function _computeBoundsIJKWithCamera(imageData, viewport, circlePoints, centerWorld, radiusWorld) {
44
- const [bottom, top] = circlePoints;
45
- const dimensions = imageData.getDimensions();
46
- const camera = viewport.getCamera();
47
- const viewUp = vec3.fromValues(camera.viewUp[0], camera.viewUp[1], camera.viewUp[2]);
48
- const viewPlaneNormal = vec3.fromValues(camera.viewPlaneNormal[0], camera.viewPlaneNormal[1], camera.viewPlaneNormal[2]);
49
- const viewRight = vec3.create();
50
- vec3.cross(viewRight, viewUp, viewPlaneNormal);
51
- const topLeftWorld = vec3.create();
52
- const bottomRightWorld = vec3.create();
53
- vec3.scaleAndAdd(topLeftWorld, top, viewPlaneNormal, radiusWorld);
54
- vec3.scaleAndAdd(bottomRightWorld, bottom, viewPlaneNormal, -radiusWorld);
55
- vec3.scaleAndAdd(topLeftWorld, topLeftWorld, viewRight, -radiusWorld);
56
- vec3.scaleAndAdd(bottomRightWorld, bottomRightWorld, viewRight, radiusWorld);
57
- const sphereCornersIJK = [
58
- transformWorldToIndex(imageData, topLeftWorld),
59
- (transformWorldToIndex(imageData, bottomRightWorld)),
60
- ];
61
- const boundsIJK = getBoundingBoxAroundShape(sphereCornersIJK, dimensions);
62
- return boundsIJK;
63
- }
64
- //# sourceMappingURL=pointInSurroundingSphereCallback.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pointInSurroundingSphereCallback.js","sourceRoot":"","sources":["../../../src/utilities/pointInSurroundingSphereCallback.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { Types } from '@cornerstonejs/core';
2
- import type { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData';
3
- import { PointInShapeCallback } from './pointInShapeCallback';
4
- export default function pointInSurroundingSphereCallback(imageData: vtkImageData, circlePoints: [Types.Point3, Types.Point3], callback: PointInShapeCallback, viewport?: Types.IVolumeViewport): void;
5
- //# sourceMappingURL=pointInSurroundingSphereCallback.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pointInSurroundingSphereCallback.d.ts","sourceRoot":"","sources":["../../../src/utilities/pointInSurroundingSphereCallback.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAG/E,OAA6B,EAC3B,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAqBhC,MAAM,CAAC,OAAO,UAAU,gCAAgC,CACtD,SAAS,EAAE,YAAY,EACvB,YAAY,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAC1C,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,eAAe,GAC/B,IAAI,CAsBN"}