@cornerstonejs/tools 1.36.2 → 1.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/dist/cjs/drawingSvg/drawEllipse.js +1 -1
  2. package/dist/cjs/drawingSvg/drawEllipse.js.map +1 -1
  3. package/dist/cjs/drawingSvg/drawEllipseByCoordinates.js +2 -3
  4. package/dist/cjs/drawingSvg/drawEllipseByCoordinates.js.map +1 -1
  5. package/dist/cjs/enums/StrategyCallbacks.d.ts +13 -0
  6. package/dist/cjs/enums/StrategyCallbacks.js +17 -0
  7. package/dist/cjs/enums/StrategyCallbacks.js.map +1 -0
  8. package/dist/cjs/enums/index.d.ts +2 -1
  9. package/dist/cjs/enums/index.js +3 -1
  10. package/dist/cjs/enums/index.js.map +1 -1
  11. package/dist/cjs/eventDispatchers/keyboardEventHandlers/keyDown.js +17 -7
  12. package/dist/cjs/eventDispatchers/keyboardEventHandlers/keyDown.js.map +1 -1
  13. package/dist/cjs/eventDispatchers/shared/getActiveToolForKeyboardEvent.js +4 -1
  14. package/dist/cjs/eventDispatchers/shared/getActiveToolForKeyboardEvent.js.map +1 -1
  15. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.d.ts +3 -0
  16. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js +33 -0
  17. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js.map +1 -0
  18. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -1
  19. package/dist/cjs/stateManagement/segmentation/config/segmentationColor.js +8 -1
  20. package/dist/cjs/stateManagement/segmentation/config/segmentationColor.js.map +1 -1
  21. package/dist/cjs/tools/annotation/EllipticalROITool.js +1 -2
  22. package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
  23. package/dist/cjs/tools/base/AnnotationTool.js.map +1 -1
  24. package/dist/cjs/tools/base/BaseTool.d.ts +2 -0
  25. package/dist/cjs/tools/base/BaseTool.js +7 -1
  26. package/dist/cjs/tools/base/BaseTool.js.map +1 -1
  27. package/dist/cjs/tools/segmentation/BrushTool.d.ts +45 -3
  28. package/dist/cjs/tools/segmentation/BrushTool.js +197 -71
  29. package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
  30. package/dist/cjs/tools/segmentation/CircleScissorsTool.js +3 -1
  31. package/dist/cjs/tools/segmentation/CircleScissorsTool.js.map +1 -1
  32. package/dist/cjs/tools/segmentation/SphereScissorsTool.js +3 -0
  33. package/dist/cjs/tools/segmentation/SphereScissorsTool.js.map +1 -1
  34. package/dist/cjs/tools/segmentation/strategies/BrushStrategy.d.ts +87 -0
  35. package/dist/cjs/tools/segmentation/strategies/BrushStrategy.js +137 -0
  36. package/dist/cjs/tools/segmentation/strategies/BrushStrategy.js.map +1 -0
  37. package/dist/cjs/tools/segmentation/strategies/compositions/determineSegmentIndex.d.ts +6 -0
  38. package/dist/cjs/tools/segmentation/strategies/compositions/determineSegmentIndex.js +53 -0
  39. package/dist/cjs/tools/segmentation/strategies/compositions/determineSegmentIndex.js.map +1 -0
  40. package/dist/cjs/tools/segmentation/strategies/compositions/dynamicThreshold.d.ts +6 -0
  41. package/dist/cjs/tools/segmentation/strategies/compositions/dynamicThreshold.js +41 -0
  42. package/dist/cjs/tools/segmentation/strategies/compositions/dynamicThreshold.js.map +1 -0
  43. package/dist/cjs/tools/segmentation/strategies/compositions/erase.d.ts +5 -0
  44. package/dist/cjs/tools/segmentation/strategies/compositions/erase.js +12 -0
  45. package/dist/cjs/tools/segmentation/strategies/compositions/erase.js.map +1 -0
  46. package/dist/cjs/tools/segmentation/strategies/compositions/index.d.ts +35 -0
  47. package/dist/cjs/tools/segmentation/strategies/compositions/index.js +24 -0
  48. package/dist/cjs/tools/segmentation/strategies/compositions/index.js.map +1 -0
  49. package/dist/cjs/tools/segmentation/strategies/compositions/islandRemoval.d.ts +5 -0
  50. package/dist/cjs/tools/segmentation/strategies/compositions/islandRemoval.js +129 -0
  51. package/dist/cjs/tools/segmentation/strategies/compositions/islandRemoval.js.map +1 -0
  52. package/dist/cjs/tools/segmentation/strategies/compositions/preview.d.ts +8 -0
  53. package/dist/cjs/tools/segmentation/strategies/compositions/preview.js +84 -0
  54. package/dist/cjs/tools/segmentation/strategies/compositions/preview.js.map +1 -0
  55. package/dist/cjs/tools/segmentation/strategies/compositions/regionFill.d.ts +5 -0
  56. package/dist/cjs/tools/segmentation/strategies/compositions/regionFill.js +27 -0
  57. package/dist/cjs/tools/segmentation/strategies/compositions/regionFill.js.map +1 -0
  58. package/dist/cjs/tools/segmentation/strategies/compositions/setValue.d.ts +8 -0
  59. package/dist/cjs/tools/segmentation/strategies/compositions/setValue.js +33 -0
  60. package/dist/cjs/tools/segmentation/strategies/compositions/setValue.js.map +1 -0
  61. package/dist/cjs/tools/segmentation/strategies/compositions/threshold.d.ts +5 -0
  62. package/dist/cjs/tools/segmentation/strategies/compositions/threshold.js +24 -0
  63. package/dist/cjs/tools/segmentation/strategies/compositions/threshold.js.map +1 -0
  64. package/dist/cjs/tools/segmentation/strategies/eraseCircle.d.ts +2 -7
  65. package/dist/cjs/tools/segmentation/strategies/eraseCircle.js +7 -4
  66. package/dist/cjs/tools/segmentation/strategies/eraseCircle.js.map +1 -1
  67. package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +2 -7
  68. package/dist/cjs/tools/segmentation/strategies/eraseSphere.js +7 -6
  69. package/dist/cjs/tools/segmentation/strategies/eraseSphere.js.map +1 -1
  70. package/dist/cjs/tools/segmentation/strategies/fillCircle.d.ts +13 -8
  71. package/dist/cjs/tools/segmentation/strategies/fillCircle.js +68 -90
  72. package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
  73. package/dist/cjs/tools/segmentation/strategies/fillRectangle.js +3 -9
  74. package/dist/cjs/tools/segmentation/strategies/fillRectangle.js.map +1 -1
  75. package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +6 -9
  76. package/dist/cjs/tools/segmentation/strategies/fillSphere.js +53 -64
  77. package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
  78. package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.d.ts +3 -0
  79. package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js +6 -0
  80. package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -1
  81. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
  82. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
  83. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
  84. package/dist/cjs/types/BoundsIJK.d.ts +1 -1
  85. package/dist/cjs/types/FloodFillTypes.d.ts +4 -4
  86. package/dist/cjs/types/LabelmapToolOperationData.d.ts +7 -2
  87. package/dist/cjs/types/index.d.ts +2 -1
  88. package/dist/cjs/utilities/math/ellipse/getCanvasEllipseCorners.d.ts +2 -3
  89. package/dist/cjs/utilities/math/ellipse/index.d.ts +2 -2
  90. package/dist/cjs/utilities/math/ellipse/index.js +26 -2
  91. package/dist/cjs/utilities/math/ellipse/index.js.map +1 -1
  92. package/dist/cjs/utilities/math/ellipse/pointInEllipse.d.ts +4 -1
  93. package/dist/cjs/utilities/math/ellipse/pointInEllipse.js +30 -17
  94. package/dist/cjs/utilities/math/ellipse/pointInEllipse.js.map +1 -1
  95. package/dist/cjs/utilities/math/sphere/pointInSphere.d.ts +1 -0
  96. package/dist/cjs/utilities/math/sphere/pointInSphere.js +2 -1
  97. package/dist/cjs/utilities/math/sphere/pointInSphere.js.map +1 -1
  98. package/dist/cjs/utilities/segmentation/brushThresholdForToolGroup.d.ts +1 -1
  99. package/dist/cjs/utilities/segmentation/brushThresholdForToolGroup.js +5 -5
  100. package/dist/cjs/utilities/segmentation/brushThresholdForToolGroup.js.map +1 -1
  101. package/dist/esm/drawingSvg/drawEllipse.js +1 -1
  102. package/dist/esm/drawingSvg/drawEllipse.js.map +1 -1
  103. package/dist/esm/drawingSvg/drawEllipseByCoordinates.js +2 -3
  104. package/dist/esm/drawingSvg/drawEllipseByCoordinates.js.map +1 -1
  105. package/dist/esm/enums/StrategyCallbacks.js +15 -0
  106. package/dist/esm/enums/StrategyCallbacks.js.map +1 -0
  107. package/dist/esm/enums/index.js +2 -1
  108. package/dist/esm/enums/index.js.map +1 -1
  109. package/dist/esm/eventDispatchers/keyboardEventHandlers/keyDown.js +17 -7
  110. package/dist/esm/eventDispatchers/keyboardEventHandlers/keyDown.js.map +1 -1
  111. package/dist/esm/eventDispatchers/shared/getActiveToolForKeyboardEvent.js +4 -1
  112. package/dist/esm/eventDispatchers/shared/getActiveToolForKeyboardEvent.js.map +1 -1
  113. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js +29 -0
  114. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.js.map +1 -0
  115. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -1
  116. package/dist/esm/stateManagement/segmentation/config/segmentationColor.js +8 -1
  117. package/dist/esm/stateManagement/segmentation/config/segmentationColor.js.map +1 -1
  118. package/dist/esm/tools/annotation/EllipticalROITool.js +1 -2
  119. package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
  120. package/dist/esm/tools/base/AnnotationTool.js.map +1 -1
  121. package/dist/esm/tools/base/BaseTool.js +5 -1
  122. package/dist/esm/tools/base/BaseTool.js.map +1 -1
  123. package/dist/esm/tools/segmentation/BrushTool.js +208 -87
  124. package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
  125. package/dist/esm/tools/segmentation/CircleScissorsTool.js +3 -0
  126. package/dist/esm/tools/segmentation/CircleScissorsTool.js.map +1 -1
  127. package/dist/esm/tools/segmentation/SphereScissorsTool.js +3 -0
  128. package/dist/esm/tools/segmentation/SphereScissorsTool.js.map +1 -1
  129. package/dist/esm/tools/segmentation/strategies/BrushStrategy.js +136 -0
  130. package/dist/esm/tools/segmentation/strategies/BrushStrategy.js.map +1 -0
  131. package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js +48 -0
  132. package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js.map +1 -0
  133. package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js +35 -0
  134. package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js.map +1 -0
  135. package/dist/esm/tools/segmentation/strategies/compositions/erase.js +7 -0
  136. package/dist/esm/tools/segmentation/strategies/compositions/erase.js.map +1 -0
  137. package/dist/esm/tools/segmentation/strategies/compositions/index.js +19 -0
  138. package/dist/esm/tools/segmentation/strategies/compositions/index.js.map +1 -0
  139. package/dist/esm/tools/segmentation/strategies/compositions/islandRemoval.js +124 -0
  140. package/dist/esm/tools/segmentation/strategies/compositions/islandRemoval.js.map +1 -0
  141. package/dist/esm/tools/segmentation/strategies/compositions/preview.js +77 -0
  142. package/dist/esm/tools/segmentation/strategies/compositions/preview.js.map +1 -0
  143. package/dist/esm/tools/segmentation/strategies/compositions/regionFill.js +21 -0
  144. package/dist/esm/tools/segmentation/strategies/compositions/regionFill.js.map +1 -0
  145. package/dist/esm/tools/segmentation/strategies/compositions/setValue.js +28 -0
  146. package/dist/esm/tools/segmentation/strategies/compositions/setValue.js.map +1 -0
  147. package/dist/esm/tools/segmentation/strategies/compositions/threshold.js +19 -0
  148. package/dist/esm/tools/segmentation/strategies/compositions/threshold.js.map +1 -0
  149. package/dist/esm/tools/segmentation/strategies/eraseCircle.js +6 -8
  150. package/dist/esm/tools/segmentation/strategies/eraseCircle.js.map +1 -1
  151. package/dist/esm/tools/segmentation/strategies/eraseSphere.js +6 -7
  152. package/dist/esm/tools/segmentation/strategies/eraseSphere.js.map +1 -1
  153. package/dist/esm/tools/segmentation/strategies/fillCircle.js +64 -88
  154. package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
  155. package/dist/esm/tools/segmentation/strategies/fillRectangle.js +3 -9
  156. package/dist/esm/tools/segmentation/strategies/fillRectangle.js.map +1 -1
  157. package/dist/esm/tools/segmentation/strategies/fillSphere.js +53 -64
  158. package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
  159. package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +7 -1
  160. package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -1
  161. package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
  162. package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
  163. package/dist/esm/utilities/math/ellipse/index.js +2 -2
  164. package/dist/esm/utilities/math/ellipse/index.js.map +1 -1
  165. package/dist/esm/utilities/math/ellipse/pointInEllipse.js +28 -16
  166. package/dist/esm/utilities/math/ellipse/pointInEllipse.js.map +1 -1
  167. package/dist/esm/utilities/math/sphere/pointInSphere.js +2 -1
  168. package/dist/esm/utilities/math/sphere/pointInSphere.js.map +1 -1
  169. package/dist/esm/utilities/segmentation/brushThresholdForToolGroup.js +11 -5
  170. package/dist/esm/utilities/segmentation/brushThresholdForToolGroup.js.map +1 -1
  171. package/dist/types/drawingSvg/drawEllipseByCoordinates.d.ts.map +1 -1
  172. package/dist/types/enums/StrategyCallbacks.d.ts +14 -0
  173. package/dist/types/enums/StrategyCallbacks.d.ts.map +1 -0
  174. package/dist/types/enums/index.d.ts +2 -1
  175. package/dist/types/eventDispatchers/keyboardEventHandlers/keyDown.d.ts.map +1 -1
  176. package/dist/types/eventDispatchers/shared/getActiveToolForKeyboardEvent.d.ts.map +1 -1
  177. package/dist/types/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.d.ts +4 -0
  178. package/dist/types/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.d.ts.map +1 -0
  179. package/dist/types/eventDispatchers/shared/getToolsWithActionsForMouseEvent.d.ts.map +1 -1
  180. package/dist/types/stateManagement/segmentation/config/segmentationColor.d.ts.map +1 -1
  181. package/dist/types/tools/annotation/EllipticalROITool.d.ts.map +1 -1
  182. package/dist/types/tools/base/AnnotationTool.d.ts.map +1 -1
  183. package/dist/types/tools/base/BaseTool.d.ts +2 -0
  184. package/dist/types/tools/base/BaseTool.d.ts.map +1 -1
  185. package/dist/types/tools/segmentation/BrushTool.d.ts +45 -3
  186. package/dist/types/tools/segmentation/BrushTool.d.ts.map +1 -1
  187. package/dist/types/tools/segmentation/CircleScissorsTool.d.ts.map +1 -1
  188. package/dist/types/tools/segmentation/SphereScissorsTool.d.ts.map +1 -1
  189. package/dist/types/tools/segmentation/strategies/BrushStrategy.d.ts +88 -0
  190. package/dist/types/tools/segmentation/strategies/BrushStrategy.d.ts.map +1 -0
  191. package/dist/types/tools/segmentation/strategies/compositions/determineSegmentIndex.d.ts +7 -0
  192. package/dist/types/tools/segmentation/strategies/compositions/determineSegmentIndex.d.ts.map +1 -0
  193. package/dist/types/tools/segmentation/strategies/compositions/dynamicThreshold.d.ts +7 -0
  194. package/dist/types/tools/segmentation/strategies/compositions/dynamicThreshold.d.ts.map +1 -0
  195. package/dist/types/tools/segmentation/strategies/compositions/erase.d.ts +6 -0
  196. package/dist/types/tools/segmentation/strategies/compositions/erase.d.ts.map +1 -0
  197. package/dist/types/tools/segmentation/strategies/compositions/index.d.ts +36 -0
  198. package/dist/types/tools/segmentation/strategies/compositions/index.d.ts.map +1 -0
  199. package/dist/types/tools/segmentation/strategies/compositions/islandRemoval.d.ts +6 -0
  200. package/dist/types/tools/segmentation/strategies/compositions/islandRemoval.d.ts.map +1 -0
  201. package/dist/types/tools/segmentation/strategies/compositions/preview.d.ts +9 -0
  202. package/dist/types/tools/segmentation/strategies/compositions/preview.d.ts.map +1 -0
  203. package/dist/types/tools/segmentation/strategies/compositions/regionFill.d.ts +6 -0
  204. package/dist/types/tools/segmentation/strategies/compositions/regionFill.d.ts.map +1 -0
  205. package/dist/types/tools/segmentation/strategies/compositions/setValue.d.ts +9 -0
  206. package/dist/types/tools/segmentation/strategies/compositions/setValue.d.ts.map +1 -0
  207. package/dist/types/tools/segmentation/strategies/compositions/threshold.d.ts +6 -0
  208. package/dist/types/tools/segmentation/strategies/compositions/threshold.d.ts.map +1 -0
  209. package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts +2 -7
  210. package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts.map +1 -1
  211. package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts +2 -7
  212. package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts.map +1 -1
  213. package/dist/types/tools/segmentation/strategies/fillCircle.d.ts +13 -8
  214. package/dist/types/tools/segmentation/strategies/fillCircle.d.ts.map +1 -1
  215. package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts.map +1 -1
  216. package/dist/types/tools/segmentation/strategies/fillSphere.d.ts +6 -9
  217. package/dist/types/tools/segmentation/strategies/fillSphere.d.ts.map +1 -1
  218. package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts +3 -0
  219. package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts.map +1 -1
  220. package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
  221. package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts.map +1 -1
  222. package/dist/types/types/BoundsIJK.d.ts +1 -1
  223. package/dist/types/types/BoundsIJK.d.ts.map +1 -1
  224. package/dist/types/types/FloodFillTypes.d.ts +4 -4
  225. package/dist/types/types/FloodFillTypes.d.ts.map +1 -1
  226. package/dist/types/types/LabelmapToolOperationData.d.ts +7 -2
  227. package/dist/types/types/LabelmapToolOperationData.d.ts.map +1 -1
  228. package/dist/types/types/index.d.ts +2 -1
  229. package/dist/types/types/index.d.ts.map +1 -1
  230. package/dist/types/utilities/math/ellipse/getCanvasEllipseCorners.d.ts +2 -3
  231. package/dist/types/utilities/math/ellipse/getCanvasEllipseCorners.d.ts.map +1 -1
  232. package/dist/types/utilities/math/ellipse/index.d.ts +2 -2
  233. package/dist/types/utilities/math/ellipse/index.d.ts.map +1 -1
  234. package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts +4 -1
  235. package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts.map +1 -1
  236. package/dist/types/utilities/math/sphere/pointInSphere.d.ts +1 -0
  237. package/dist/types/utilities/math/sphere/pointInSphere.d.ts.map +1 -1
  238. package/dist/types/utilities/segmentation/brushThresholdForToolGroup.d.ts +1 -1
  239. package/dist/types/utilities/segmentation/brushThresholdForToolGroup.d.ts.map +1 -1
  240. package/dist/umd/index.js +1 -1
  241. package/dist/umd/index.js.map +1 -1
  242. package/package.json +3 -3
  243. package/src/drawingSvg/drawEllipse.ts +8 -8
  244. package/src/drawingSvg/drawEllipseByCoordinates.ts +4 -4
  245. package/src/enums/StrategyCallbacks.ts +52 -0
  246. package/src/enums/index.js +2 -0
  247. package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +22 -11
  248. package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +6 -2
  249. package/src/eventDispatchers/shared/getToolsWithActionsForKeyboardEvents.ts +53 -0
  250. package/src/eventDispatchers/shared/getToolsWithActionsForMouseEvent.ts +0 -2
  251. package/src/stateManagement/segmentation/config/segmentationColor.ts +8 -1
  252. package/src/tools/annotation/EllipticalROITool.ts +1 -3
  253. package/src/tools/base/AnnotationTool.ts +0 -1
  254. package/src/tools/base/BaseTool.ts +32 -2
  255. package/src/tools/segmentation/BrushTool.ts +298 -68
  256. package/src/tools/segmentation/CircleScissorsTool.ts +3 -1
  257. package/src/tools/segmentation/SphereScissorsTool.ts +3 -0
  258. package/src/tools/segmentation/strategies/BrushStrategy.ts +364 -0
  259. package/src/tools/segmentation/strategies/compositions/determineSegmentIndex.ts +86 -0
  260. package/src/tools/segmentation/strategies/compositions/dynamicThreshold.ts +58 -0
  261. package/src/tools/segmentation/strategies/compositions/erase.ts +11 -0
  262. package/src/tools/segmentation/strategies/compositions/index.ts +19 -0
  263. package/src/tools/segmentation/strategies/compositions/islandRemoval.ts +179 -0
  264. package/src/tools/segmentation/strategies/compositions/preview.ts +138 -0
  265. package/src/tools/segmentation/strategies/compositions/regionFill.ts +45 -0
  266. package/src/tools/segmentation/strategies/compositions/setValue.ts +50 -0
  267. package/src/tools/segmentation/strategies/compositions/threshold.ts +35 -0
  268. package/src/tools/segmentation/strategies/eraseCircle.ts +10 -19
  269. package/src/tools/segmentation/strategies/eraseSphere.ts +10 -18
  270. package/src/tools/segmentation/strategies/fillCircle.ts +141 -164
  271. package/src/tools/segmentation/strategies/fillRectangle.ts +3 -13
  272. package/src/tools/segmentation/strategies/fillSphere.ts +105 -120
  273. package/src/tools/segmentation/strategies/utils/getStrategyData.ts +15 -1
  274. package/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +5 -5
  275. package/src/types/BoundsIJK.ts +1 -1
  276. package/src/types/FloodFillTypes.ts +4 -4
  277. package/src/types/LabelmapToolOperationData.ts +20 -1
  278. package/src/types/index.ts +2 -0
  279. package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +2 -2
  280. package/src/utilities/math/ellipse/index.ts +2 -2
  281. package/src/utilities/math/ellipse/pointInEllipse.ts +52 -18
  282. package/src/utilities/math/sphere/pointInSphere.ts +10 -2
  283. package/src/utilities/segmentation/brushThresholdForToolGroup.ts +12 -5
@@ -1 +1 @@
1
- {"version":3,"file":"eraseSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/eraseSphere.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAOhD,MAAM,UAAU,iBAAiB,CAC/B,cAAqC,EACrC,aAA4B;IAI5B,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE;QAC1D,YAAY,EAAE,CAAC;KAChB,CAAC,CAAC;IAEH,gBAAgB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"eraseSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/eraseSphere.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,MAAM,qBAAqB,GAAG,IAAI,aAAa,CAC7C,aAAa,EACb,YAAY,CAAC,KAAK,EAClB,GAAG,eAAe,CAAC,YAAY,CAChC,CAAC;AAEF,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1,99 +1,75 @@
1
1
  import { vec3 } from 'gl-matrix';
2
- import { cache } from '@cornerstonejs/core';
3
2
  import { utilities as csUtils } from '@cornerstonejs/core';
4
- import { getCanvasEllipseCorners, pointInEllipse, } from '../../../utilities/math/ellipse';
3
+ import { getCanvasEllipseCorners, precalculatePointInEllipse, } from '../../../utilities/math/ellipse';
4
+ import pointInSphere from '../../../utilities/math/sphere/pointInSphere';
5
5
  import { getBoundingBoxAroundShape } from '../../../utilities/boundingBox';
6
- import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents';
7
- import { pointInShapeCallback } from '../../../utilities';
8
- import isWithinThreshold from './utils/isWithinThreshold';
9
- import { getStrategyData } from './utils/getStrategyData';
10
- import { isVolumeSegmentation } from './utils/stackVolumeCheck';
6
+ import BrushStrategy from './BrushStrategy';
7
+ import { StrategyCallbacks } from '../../../enums';
8
+ import compositions from './compositions';
11
9
  const { transformWorldToIndex } = csUtils;
12
- function fillCircle(enabledElement, operationData, threshold = false) {
13
- const { points, segmentsLocked, segmentIndex, segmentationId, strategySpecificConfiguration, } = operationData;
14
- const { viewport } = enabledElement;
15
- const data = getStrategyData({ operationData, viewport });
16
- if (!data) {
17
- console.warn('No data found for fillCircle');
18
- return;
19
- }
20
- const { imageScalarData, segmentationImageData, segmentationScalarData } = data;
21
- const { ellipseObj, boundsIJK } = getEllipse(viewport, segmentationImageData, points);
22
- const modifiedSlicesToUse = new Set();
23
- let callback;
24
- if (threshold) {
25
- callback = ({ value, index, pointIJK }) => {
26
- if (segmentsLocked.includes(value)) {
27
- return;
28
- }
29
- if (isWithinThreshold(index, imageScalarData, strategySpecificConfiguration)) {
30
- segmentationScalarData[index] = segmentIndex;
31
- modifiedSlicesToUse.add(pointIJK[2]);
32
- }
33
- };
34
- }
35
- else {
36
- callback = ({ value, index, pointIJK }) => {
37
- if (segmentsLocked.includes(value)) {
38
- return;
39
- }
40
- segmentationScalarData[index] = segmentIndex;
41
- modifiedSlicesToUse.add(pointIJK[2]);
42
- };
43
- }
44
- pointInShapeCallback(segmentationImageData, (pointLPS) => pointInEllipse(ellipseObj, pointLPS, {
45
- fast: true,
46
- }), callback, boundsIJK);
47
- const arrayOfSlices = Array.from(modifiedSlicesToUse);
48
- triggerSegmentationDataModified(segmentationId, arrayOfSlices);
49
- }
50
- export function fillInsideCircle(enabledElement, operationData) {
51
- fillCircle(enabledElement, operationData, false);
52
- }
53
- export function thresholdInsideCircle(enabledElement, operationData) {
54
- if (isVolumeSegmentation(operationData)) {
55
- const { referencedVolumeId, volumeId } = operationData;
56
- const imageVolume = cache.getVolume(referencedVolumeId);
57
- const segmentation = cache.getVolume(volumeId);
58
- if (!csUtils.isEqual(segmentation.dimensions, imageVolume.dimensions) ||
59
- !csUtils.isEqual(segmentation.direction, imageVolume.direction)) {
60
- throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
10
+ const EPSILON = 1e-4;
11
+ const nearOrZero = (testValue, nearValue) => Math.abs(testValue) < EPSILON || Math.abs(testValue - nearValue) < EPSILON;
12
+ const initializeCircle = {
13
+ [StrategyCallbacks.Initialize]: (operationData) => {
14
+ const { points, imageVoxelManager: imageVoxelManager, viewport, segmentationImageData, segmentationVoxelManager: segmentationVoxelManager, } = operationData;
15
+ if (!points) {
16
+ return;
61
17
  }
62
- }
63
- fillCircle(enabledElement, operationData, true);
64
- }
65
- export function fillOutsideCircle(enabledElement, operationData) {
66
- throw new Error('Not yet implemented');
67
- }
68
- function getCenter(points) {
69
- const center = vec3.fromValues(0, 0, 0);
70
- points.forEach((point) => {
71
- vec3.add(center, center, point);
72
- });
73
- vec3.scale(center, center, 1 / points.length);
74
- return center;
75
- }
76
- function getEllipse(viewport, imageData, points) {
77
- const center = getCenter(points);
78
- const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
79
- const dimensions = imageData.getDimensions();
80
- const [topLeftCanvas, bottomRightCanvas] = getCanvasEllipseCorners(canvasCoordinates);
81
- const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
82
- const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
83
- const ellipsoidCornersIJK = [
84
- transformWorldToIndex(imageData, topLeftWorld),
85
- transformWorldToIndex(imageData, bottomRightWorld),
86
- ];
87
- const boundsIJK = getBoundingBoxAroundShape(ellipsoidCornersIJK, dimensions);
88
- if (boundsIJK.every(([min, max]) => min !== max)) {
89
- throw new Error('Oblique segmentation tools are not supported yet');
18
+ const center = vec3.fromValues(0, 0, 0);
19
+ points.forEach((point) => {
20
+ vec3.add(center, center, point);
21
+ });
22
+ vec3.scale(center, center, 1 / points.length);
23
+ operationData.centerWorld = center;
24
+ operationData.centerIJK = transformWorldToIndex(segmentationImageData, center);
25
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
26
+ const [topLeftCanvas, bottomRightCanvas] = getCanvasEllipseCorners(canvasCoordinates);
27
+ const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
28
+ const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
29
+ const ellipsoidCornersIJK = [
30
+ transformWorldToIndex(segmentationImageData, topLeftWorld),
31
+ (transformWorldToIndex(segmentationImageData, bottomRightWorld)),
32
+ ];
33
+ segmentationVoxelManager.boundsIJK = getBoundingBoxAroundShape(ellipsoidCornersIJK, segmentationVoxelManager.dimensions);
34
+ imageVoxelManager.isInObject = createPointInEllipse({
35
+ topLeftWorld,
36
+ bottomRightWorld,
37
+ center,
38
+ });
39
+ },
40
+ };
41
+ function createPointInEllipse(worldInfo) {
42
+ const { topLeftWorld, bottomRightWorld, center } = worldInfo;
43
+ const xRadius = Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2;
44
+ const yRadius = Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2;
45
+ const zRadius = Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2;
46
+ const radius = Math.max(xRadius, yRadius, zRadius);
47
+ if (nearOrZero(xRadius, radius) &&
48
+ nearOrZero(yRadius, radius) &&
49
+ nearOrZero(zRadius, radius)) {
50
+ const sphereObj = {
51
+ center,
52
+ radius,
53
+ radius2: radius * radius,
54
+ };
55
+ return (pointLPS) => pointInSphere(sphereObj, pointLPS);
90
56
  }
91
57
  const ellipseObj = {
92
58
  center: center,
93
- xRadius: Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2,
94
- yRadius: Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2,
95
- zRadius: Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2,
59
+ xRadius,
60
+ yRadius,
61
+ zRadius,
96
62
  };
97
- return { ellipseObj, boundsIJK };
63
+ const inverts = precalculatePointInEllipse(ellipseObj);
64
+ const { precalculated } = inverts;
65
+ return precalculated;
66
+ }
67
+ const CIRCLE_STRATEGY = new BrushStrategy('Circle', compositions.regionFill, compositions.setValue, initializeCircle, compositions.determineSegmentIndex, compositions.preview);
68
+ const CIRCLE_THRESHOLD_STRATEGY = new BrushStrategy('CircleThreshold', compositions.regionFill, compositions.setValue, initializeCircle, compositions.determineSegmentIndex, compositions.dynamicThreshold, compositions.threshold, compositions.preview, compositions.islandRemoval);
69
+ const fillInsideCircle = CIRCLE_STRATEGY.strategyFunction;
70
+ const thresholdInsideCircle = CIRCLE_THRESHOLD_STRATEGY.strategyFunction;
71
+ export function fillOutsideCircle() {
72
+ throw new Error('Not yet implemented');
98
73
  }
74
+ export { CIRCLE_STRATEGY, CIRCLE_THRESHOLD_STRATEGY, fillInsideCircle, thresholdInsideCircle, createPointInEllipse as createEllipseInPoint, };
99
75
  //# sourceMappingURL=fillCircle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fillCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillCircle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fillCircle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillCircle.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { triggerSegmentationDataModified } from '../../../stateManagement/segmen
5
5
  import { getStrategyData } from './utils/getStrategyData';
6
6
  const { transformWorldToIndex } = csUtils;
7
7
  function fillRectangle(enabledElement, operationData, inside = true) {
8
- const { points, segmentsLocked, segmentIndex, segmentationId, constraintFn } = operationData;
8
+ const { points, segmentsLocked, segmentIndex, segmentationId } = operationData;
9
9
  const strategyData = getStrategyData({
10
10
  operationData,
11
11
  viewport: enabledElement.viewport,
@@ -25,17 +25,11 @@ function fillRectangle(enabledElement, operationData, inside = true) {
25
25
  });
26
26
  const boundsIJK = getBoundingBoxAroundShape(rectangleCornersIJK, segmentationImageData.getDimensions());
27
27
  const pointInRectangle = () => true;
28
- const callback = ({ value, index, pointIJK }) => {
28
+ const callback = ({ value, index }) => {
29
29
  if (segmentsLocked.includes(value)) {
30
30
  return;
31
31
  }
32
- if (!constraintFn) {
33
- segmentationScalarData[index] = segmentIndex;
34
- return;
35
- }
36
- if (constraintFn(pointIJK)) {
37
- segmentationScalarData[index] = segmentIndex;
38
- }
32
+ segmentationScalarData[index] = segmentIndex;
39
33
  };
40
34
  pointInShapeCallback(segmentationImageData, pointInRectangle, callback, boundsIJK);
41
35
  triggerSegmentationDataModified(segmentationId);
@@ -1 +1 @@
1
- {"version":3,"file":"fillRectangle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillRectangle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iEAAiE,CAAC;AAElH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;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,eAAe,CAAC;QACnC,aAAa;QACb,QAAQ,EAAE,cAAc,CAAC,QAAQ;KAClC,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAChD,OAAO;KACR;IAED,MAAM,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,GAAG,YAAY,CAAC;IAEvE,IAAI,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,OAAO,qBAAqB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAGH,mBAAmB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACtD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,yBAAyB,CACzC,mBAAmB,EACnB,qBAAqB,CAAC,aAAa,EAAE,CACtC,CAAC;IAGF,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;IAEpC,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,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,oBAAoB,CAClB,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,SAAS,CACV,CAAC;IAEF,+BAA+B,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AASD,MAAM,UAAU,mBAAmB,CACjC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AASD,MAAM,UAAU,oBAAoB,CAClC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"fillRectangle.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillRectangle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iEAAiE,CAAC;AAElH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;AAc1C,SAAS,aAAa,CACpB,cAAqC,EACrC,aAA4B,EAC5B,MAAM,GAAG,IAAI;IAEb,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,GAC5D,aAAa,CAAC;IAEhB,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,aAAa;QACb,QAAQ,EAAE,cAAc,CAAC,QAAQ;KAClC,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAChD,OAAO;KACR;IAED,MAAM,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,GAAG,YAAY,CAAC;IAEvE,IAAI,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,OAAO,qBAAqB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAGH,mBAAmB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACtD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,yBAAyB,CACzC,mBAAmB,EACnB,qBAAqB,CAAC,aAAa,EAAE,CACtC,CAAC;IAGF,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;IAEpC,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACpC,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAClC,OAAO;SACR;QAED,sBAAsB,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;IAC/C,CAAC,CAAC;IAEF,oBAAoB,CAClB,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,SAAS,CACV,CAAC;IAEF,+BAA+B,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AAQD,MAAM,UAAU,mBAAmB,CACjC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAClC,cAAqC,EACrC,aAA4B;IAE5B,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC"}
@@ -1,67 +1,56 @@
1
- import { cache, utilities as csUtils } from '@cornerstonejs/core';
2
- import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents';
3
- import { pointInSurroundingSphereCallback } from '../../../utilities';
4
- import isWithinThreshold from './utils/isWithinThreshold';
5
- import { getStrategyData } from './utils/getStrategyData';
6
- import { isVolumeSegmentation } from './utils/stackVolumeCheck';
7
- function fillSphere(enabledElement, operationData, _inside = true, threshold = false) {
8
- const { viewport } = enabledElement;
9
- const { segmentsLocked, segmentIndex, strategySpecificConfiguration, points, } = operationData;
10
- const strategyData = getStrategyData({ operationData, viewport });
11
- if (!strategyData) {
12
- console.warn('No data found for fillSphere');
13
- return;
14
- }
15
- const { imageScalarData, segmentationImageData, segmentationScalarData } = strategyData;
16
- const scalarIndex = [];
17
- let callback;
18
- if (threshold) {
19
- callback = ({ value, index }) => {
20
- if (segmentsLocked.includes(value)) {
21
- return;
22
- }
23
- if (isWithinThreshold(index, imageScalarData, strategySpecificConfiguration)) {
24
- segmentationScalarData[index] = segmentIndex;
25
- scalarIndex.push(index);
26
- }
27
- };
28
- }
29
- else {
30
- callback = ({ index, value }) => {
31
- if (segmentsLocked.includes(value)) {
32
- return;
33
- }
34
- segmentationScalarData[index] = segmentIndex;
35
- scalarIndex.push(index);
36
- };
37
- }
38
- pointInSurroundingSphereCallback(segmentationImageData, [points[0], points[1]], callback, viewport);
39
- const dimensions = segmentationImageData.getDimensions();
40
- let sliceArray;
41
- if (isVolumeSegmentation(operationData)) {
42
- const zMultiple = dimensions[0] * dimensions[1];
43
- const minSlice = Math.floor(scalarIndex[0] / zMultiple);
44
- const maxSlice = Math.floor(scalarIndex[scalarIndex.length - 1] / zMultiple);
45
- sliceArray = Array.from({ length: maxSlice - minSlice + 1 }, (v, k) => k + minSlice);
46
- triggerSegmentationDataModified(operationData.volumeId, sliceArray);
47
- }
48
- }
49
- export function fillInsideSphere(enabledElement, operationData) {
50
- fillSphere(enabledElement, operationData, true);
51
- }
52
- export function thresholdInsideSphere(enabledElement, operationData) {
53
- if (isVolumeSegmentation(operationData)) {
54
- const { referencedVolumeId, volumeId } = operationData;
55
- const imageVolume = cache.getVolume(referencedVolumeId);
56
- const segmentation = cache.getVolume(volumeId);
57
- if (!csUtils.isEqual(segmentation.dimensions, imageVolume.dimensions) ||
58
- !csUtils.isEqual(segmentation.direction, imageVolume.direction)) {
59
- throw new Error('Only source data the same dimensions/size/orientation as the segmentation currently supported.');
1
+ import { utilities as csUtils } from '@cornerstonejs/core';
2
+ import { vec3 } from 'gl-matrix';
3
+ import { getCanvasEllipseCorners } from '../../../utilities/math/ellipse';
4
+ import { getBoundingBoxAroundShape } from '../../../utilities/boundingBox';
5
+ import BrushStrategy from './BrushStrategy';
6
+ import compositions from './compositions';
7
+ import StrategyCallbacks from '../../../enums/StrategyCallbacks';
8
+ import { createEllipseInPoint } from './fillCircle';
9
+ const { transformWorldToIndex } = csUtils;
10
+ const sphereComposition = {
11
+ [StrategyCallbacks.Initialize]: (operationData) => {
12
+ const { points, imageVoxelManager: imageVoxelManager, viewport, segmentationImageData, segmentationVoxelManager: segmentationVoxelManager, } = operationData;
13
+ if (!points) {
14
+ return;
60
15
  }
61
- }
62
- fillSphere(enabledElement, operationData, true, true);
63
- }
64
- export function fillOutsideSphere(enabledElement, operationData) {
65
- fillSphere(enabledElement, operationData, false);
16
+ const center = vec3.fromValues(0, 0, 0);
17
+ points.forEach((point) => {
18
+ vec3.add(center, center, point);
19
+ });
20
+ vec3.scale(center, center, 1 / points.length);
21
+ operationData.centerWorld = center;
22
+ operationData.centerIJK = transformWorldToIndex(segmentationImageData, center);
23
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
24
+ const [topLeftCanvas, bottomRightCanvas] = getCanvasEllipseCorners(canvasCoordinates);
25
+ const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
26
+ const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
27
+ const diameters = topLeftWorld.map((left, index) => Math.abs(bottomRightWorld[index] - left));
28
+ const radius = Math.max(...diameters) / 2;
29
+ topLeftWorld.forEach((left, index) => {
30
+ const right = bottomRightWorld[index];
31
+ if (left === right) {
32
+ topLeftWorld[index] = left - radius;
33
+ bottomRightWorld[index] = left + radius;
34
+ }
35
+ });
36
+ const ellipsoidCornersIJK = [
37
+ transformWorldToIndex(segmentationImageData, topLeftWorld),
38
+ (transformWorldToIndex(segmentationImageData, bottomRightWorld)),
39
+ ];
40
+ segmentationVoxelManager.boundsIJK = getBoundingBoxAroundShape(ellipsoidCornersIJK, segmentationVoxelManager.dimensions);
41
+ imageVoxelManager.isInObject = createEllipseInPoint({
42
+ topLeftWorld,
43
+ bottomRightWorld,
44
+ center,
45
+ });
46
+ },
47
+ };
48
+ const SPHERE_STRATEGY = new BrushStrategy('Sphere', compositions.regionFill, compositions.setValue, sphereComposition, compositions.determineSegmentIndex, compositions.preview);
49
+ const fillInsideSphere = SPHERE_STRATEGY.strategyFunction;
50
+ const SPHERE_THRESHOLD_STRATEGY = new BrushStrategy('SphereThreshold', ...SPHERE_STRATEGY.compositions, compositions.dynamicThreshold, compositions.threshold, compositions.islandRemoval);
51
+ const thresholdInsideSphere = SPHERE_THRESHOLD_STRATEGY.strategyFunction;
52
+ export function fillOutsideSphere() {
53
+ throw new Error('fill outside sphere not implemented');
66
54
  }
55
+ export { fillInsideSphere, thresholdInsideSphere, SPHERE_STRATEGY };
67
56
  //# sourceMappingURL=fillSphere.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fillSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillSphere.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fillSphere.js","sourceRoot":"","sources":["../../../../../src/tools/segmentation/strategies/fillSphere.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
- import { cache } from '@cornerstonejs/core';
1
+ import { cache, utilities } from '@cornerstonejs/core';
2
2
  import { isVolumeSegmentation } from './stackVolumeCheck';
3
+ const { VoxelManager } = utilities;
3
4
  function getStrategyData({ operationData, viewport }) {
4
5
  let segmentationImageData, segmentationScalarData, imageScalarData;
6
+ let dimensions;
5
7
  if (isVolumeSegmentation(operationData)) {
6
8
  const { volumeId, referencedVolumeId } = operationData;
7
9
  const segmentationVolume = cache.getVolume(volumeId);
@@ -12,6 +14,7 @@ function getStrategyData({ operationData, viewport }) {
12
14
  ({ imageData: segmentationImageData } = segmentationVolume);
13
15
  segmentationScalarData = segmentationVolume.getScalarData();
14
16
  imageScalarData = imageVolume.getScalarData();
17
+ dimensions = imageVolume.dimensions;
15
18
  }
16
19
  else {
17
20
  const { imageIdReferenceMap, segmentationRepresentationUID } = operationData;
@@ -29,11 +32,14 @@ function getStrategyData({ operationData, viewport }) {
29
32
  segmentationScalarData = segmentationImage.getPixelData();
30
33
  const image = cache.getImage(currentImageId);
31
34
  imageScalarData = image.getPixelData();
35
+ dimensions = [image.columns, image.rows, 1];
32
36
  }
33
37
  return {
34
38
  segmentationImageData,
35
39
  segmentationScalarData,
40
+ segmentationVoxelManager: VoxelManager.createVolumeVoxelManager(dimensions, segmentationScalarData),
36
41
  imageScalarData,
42
+ imageVoxelManager: VoxelManager.createVolumeVoxelManager(dimensions, imageScalarData),
37
43
  };
38
44
  }
39
45
  export { getStrategyData };
@@ -1 +1 @@
1
- {"version":3,"file":"getStrategyData.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/getStrategyData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,SAAS,eAAe,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE;IAClD,IAAI,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACnE,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE;QACvC,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,aAAa,CAAC;QAEvD,MAAM,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAExD,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,EAAE;YACvC,OAAO;SACR;QAED,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,kBAAkB,CAAC,CAAC;QAC5D,sBAAsB,GAAG,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAC5D,eAAe,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;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,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACrE,sBAAsB,GAAG,iBAAiB,CAAC,YAAY,EAAE,CAAC;QAE1D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAK7C,eAAe,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;KACxC;IAED,OAAO;QACL,qBAAqB;QACrB,sBAAsB;QACtB,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"getStrategyData.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/getStrategyData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;AAEnC,SAAS,eAAe,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE;IAClD,IAAI,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,CAAC;IACnE,IAAI,UAAwB,CAAC;IAC7B,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE;QACvC,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,aAAa,CAAC;QAEvD,MAAM,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAExD,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,EAAE;YACvC,OAAO;SACR;QAED,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,kBAAkB,CAAC,CAAC;QAC5D,sBAAsB,GAAG,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAC5D,eAAe,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;QAC9C,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;KACrC;SAAM;QACL,MAAM,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,GAC1D,aAA+C,CAAC;QAElD,IAAI,CAAC,mBAAmB,EAAE;YACxB,OAAO;SACR;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QACpD,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAKD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;QAC/D,qBAAqB,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE,CAAC;QAC/D,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE3E,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACrE,sBAAsB,GAAG,iBAAiB,CAAC,YAAY,EAAE,CAAC;QAE1D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAK7C,eAAe,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACvC,UAAU,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;KAC7C;IAED,OAAO;QACL,qBAAqB;QACrB,sBAAsB;QACtB,wBAAwB,EAAE,YAAY,CAAC,wBAAwB,CAC7D,UAAU,EACV,sBAAsB,CACvB;QACD,eAAe;QACf,iBAAiB,EAAE,YAAY,CAAC,wBAAwB,CACtD,UAAU,EACV,eAAe,CAChB;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  function isWithinThreshold(index, imageScalarData, strategySpecificConfiguration) {
2
- const { THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration;
2
+ const { THRESHOLD, THRESHOLD_INSIDE_CIRCLE } = strategySpecificConfiguration;
3
3
  const voxelValue = imageScalarData[index];
4
- const { threshold } = THRESHOLD_INSIDE_CIRCLE;
4
+ const { threshold } = THRESHOLD || THRESHOLD_INSIDE_CIRCLE;
5
5
  return threshold[0] <= voxelValue && voxelValue <= threshold[1];
6
6
  }
7
7
  export default isWithinThreshold;
@@ -1 +1 @@
1
- {"version":3,"file":"isWithinThreshold.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/isWithinThreshold.ts"],"names":[],"mappings":"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,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"isWithinThreshold.js","sourceRoot":"","sources":["../../../../../../src/tools/segmentation/strategies/utils/isWithinThreshold.ts"],"names":[],"mappings":"AAEA,SAAS,iBAAiB,CACxB,KAAa,EACb,eAAuC,EACvC,6BAAkC;IAElC,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,GAAG,6BAA6B,CAAC;IAE7E,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAG1C,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,IAAI,uBAAuB,CAAC;IAC3D,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,IAAI,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,eAAe,iBAAiB,CAAC"}
@@ -1,4 +1,4 @@
1
- import pointInEllipse from './pointInEllipse';
1
+ import pointInEllipse, { precalculatePointInEllipse } from './pointInEllipse';
2
2
  import getCanvasEllipseCorners from './getCanvasEllipseCorners';
3
- export { pointInEllipse, getCanvasEllipseCorners };
3
+ export { pointInEllipse, precalculatePointInEllipse, getCanvasEllipseCorners };
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,uBAAuB,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,EAAE,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,uBAAuB,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,CAAC"}
@@ -1,5 +1,11 @@
1
1
  export default function pointInEllipse(ellipse, pointLPS, inverts = {}) {
2
- const { center, xRadius, yRadius, zRadius } = ellipse;
2
+ if (!inverts.precalculated) {
3
+ precalculatePointInEllipse(ellipse, inverts);
4
+ }
5
+ return inverts.precalculated(pointLPS);
6
+ }
7
+ const precalculatePointInEllipse = (ellipse, inverts = {}) => {
8
+ const { xRadius, yRadius, zRadius } = ellipse;
3
9
  if (inverts.invXRadiusSq === undefined ||
4
10
  inverts.invYRadiusSq === undefined ||
5
11
  inverts.invZRadiusSq === undefined) {
@@ -7,19 +13,25 @@ export default function pointInEllipse(ellipse, pointLPS, inverts = {}) {
7
13
  inverts.invYRadiusSq = yRadius !== 0 ? 1 / yRadius ** 2 : 0;
8
14
  inverts.invZRadiusSq = zRadius !== 0 ? 1 / zRadius ** 2 : 0;
9
15
  }
10
- let inside = 0;
11
- const dx = pointLPS[0] - center[0];
12
- inside += dx * dx * inverts.invXRadiusSq;
13
- if (inside > 1) {
14
- return false;
15
- }
16
- const dy = pointLPS[1] - center[1];
17
- inside += dy * dy * inverts.invYRadiusSq;
18
- if (inside > 1) {
19
- return false;
20
- }
21
- const dz = pointLPS[2] - center[2];
22
- inside += dz * dz * inverts.invZRadiusSq;
23
- return inside <= 1;
24
- }
16
+ const { invXRadiusSq, invYRadiusSq, invZRadiusSq } = inverts;
17
+ const { center } = ellipse;
18
+ const [centerL, centerP, centerS] = center;
19
+ inverts.precalculated = (pointLPS) => {
20
+ const dx = pointLPS[0] - centerL;
21
+ let inside = dx * dx * invXRadiusSq;
22
+ if (inside > 1) {
23
+ return false;
24
+ }
25
+ const dy = pointLPS[1] - centerP;
26
+ inside += dy * dy * invYRadiusSq;
27
+ if (inside > 1) {
28
+ return false;
29
+ }
30
+ const dz = pointLPS[2] - centerS;
31
+ inside += dz * dz * invZRadiusSq;
32
+ return inside <= 1;
33
+ };
34
+ return inverts;
35
+ };
36
+ export { precalculatePointInEllipse };
25
37
  //# sourceMappingURL=pointInEllipse.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointInEllipse.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/pointInEllipse.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EACP,QAAQ,EACR,UAAmB,EAAE;IAErB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAItD,IACE,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,CAAC,YAAY,KAAK,SAAS,EAClC;QACA,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC7D;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IAGf,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IACzC,IAAI,MAAM,GAAG,CAAC,EAAE;QACd,OAAO,KAAK,CAAC;KACd;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IACzC,IAAI,MAAM,GAAG,CAAC,EAAE;QACd,OAAO,KAAK,CAAC;KACd;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAGzC,OAAO,MAAM,IAAI,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"pointInEllipse.js","sourceRoot":"","sources":["../../../../../src/utilities/math/ellipse/pointInEllipse.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,EACP,QAAQ,EACR,UAAmB,EAAE;IAErB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;QAC1B,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAC9C;IACD,OAAO,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAcD,MAAM,0BAA0B,GAAG,CAAC,OAAO,EAAE,UAAmB,EAAE,EAAE,EAAE;IACpE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAI9C,IACE,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,CAAC,YAAY,KAAK,SAAS,EAClC;QACA,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC7D;IAED,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IAE3C,OAAO,CAAC,aAAa,GAAG,CAAC,QAAQ,EAAE,EAAE;QAEnC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjC,IAAI,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QACpC,IAAI,MAAM,GAAG,CAAC,EAAE;YACd,OAAO,KAAK,CAAC;SACd;QAED,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QACjC,IAAI,MAAM,GAAG,CAAC,EAAE;YACd,OAAO,KAAK,CAAC;SACd;QAED,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QAGjC,OAAO,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
@@ -1,8 +1,9 @@
1
1
  export default function pointInSphere(sphere, pointLPS) {
2
2
  const { center, radius } = sphere;
3
+ const radius2 = sphere.radius2 || radius * radius;
3
4
  return ((pointLPS[0] - center[0]) * (pointLPS[0] - center[0]) +
4
5
  (pointLPS[1] - center[1]) * (pointLPS[1] - center[1]) +
5
6
  (pointLPS[2] - center[2]) * (pointLPS[2] - center[2]) <=
6
- radius ** 2);
7
+ radius2);
7
8
  }
8
9
  //# sourceMappingURL=pointInSphere.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointInSphere.js","sourceRoot":"","sources":["../../../../../src/utilities/math/sphere/pointInSphere.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAc,EAAE,QAAc;IAClE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAElC,OAAO,CACL,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,CACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"pointInSphere.js","sourceRoot":"","sources":["../../../../../src/utilities/math/sphere/pointInSphere.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAc,EAAE,QAAc;IAClE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,GAAG,MAAM,CAAC;IAElD,OAAO,CACL,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -2,15 +2,21 @@ import { getToolGroup } from '../../store/ToolGroupManager';
2
2
  import triggerAnnotationRenderForViewportIds from '../triggerAnnotationRenderForViewportIds';
3
3
  import { getRenderingEngine } from '@cornerstonejs/core';
4
4
  import getBrushToolInstances from './utilities';
5
- export function setBrushThresholdForToolGroup(toolGroupId, threshold) {
5
+ export function setBrushThresholdForToolGroup(toolGroupId, threshold, otherArgs = { isDynamic: false }) {
6
6
  const toolGroup = getToolGroup(toolGroupId);
7
7
  if (toolGroup === undefined) {
8
8
  return;
9
9
  }
10
10
  const brushBasedToolInstances = getBrushToolInstances(toolGroupId);
11
+ const configuration = {
12
+ ...otherArgs,
13
+ ...(threshold !== undefined && { threshold }),
14
+ };
11
15
  brushBasedToolInstances.forEach((tool) => {
12
- tool.configuration.strategySpecificConfiguration.THRESHOLD_INSIDE_CIRCLE.threshold =
13
- threshold;
16
+ tool.configuration.strategySpecificConfiguration.THRESHOLD = {
17
+ ...tool.configuration.strategySpecificConfiguration.THRESHOLD,
18
+ ...configuration,
19
+ };
14
20
  });
15
21
  const viewportsInfo = toolGroup.getViewportsInfo();
16
22
  if (!viewportsInfo.length) {
@@ -35,7 +41,7 @@ export function getBrushThresholdForToolGroup(toolGroupId) {
35
41
  if (!brushToolInstance) {
36
42
  return;
37
43
  }
38
- return brushToolInstance.configuration.strategySpecificConfiguration
39
- .THRESHOLD_INSIDE_CIRCLE.threshold;
44
+ return brushToolInstance.configuration.strategySpecificConfiguration.THRESHOLD
45
+ .threshold;
40
46
  }
41
47
  //# sourceMappingURL=brushThresholdForToolGroup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brushThresholdForToolGroup.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/brushThresholdForToolGroup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,qCAAqC,MAAM,0CAA0C,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,qBAAqB,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,6BAA6B,CAC3C,WAAmB,EACnB,SAAuB;IAEvB,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,OAAO;KACR;IAED,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAEnE,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,uBAAuB,CAAC,SAAS;YAChF,SAAS,CAAC;IACd,CAAC,CAAC,CAAC;IAGH,MAAM,aAAa,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;IAEnD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;QACzB,OAAO;KACR;IAED,MAAM,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAI/C,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IAE/C,MAAM,eAAe,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAE9D,qCAAqC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,WAAmB;IAC/D,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,OAAO;KACR;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,cAAc,CAAC;IAE/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE;QACtC,OAAO;KACR;IAED,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC,iBAAiB,EAAE;QACtB,OAAO;KACR;IAGD,OAAO,iBAAiB,CAAC,aAAa,CAAC,6BAA6B;SACjE,uBAAuB,CAAC,SAAS,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"brushThresholdForToolGroup.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/brushThresholdForToolGroup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,qCAAqC,MAAM,0CAA0C,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,qBAAqB,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,6BAA6B,CAC3C,WAAmB,EACnB,SAAuB,EACvB,YAAqC,EAAE,SAAS,EAAE,KAAK,EAAE;IAEzD,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,OAAO;KACR;IAED,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG;QACpB,GAAG,SAAS;QACZ,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;KAC9C,CAAC;IAEF,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,SAAS,GAAG;YAC3D,GAAG,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,SAAS;YAC7D,GAAG,aAAa;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAGH,MAAM,aAAa,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;IAEnD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;QACzB,OAAO;KACR;IAED,MAAM,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAI/C,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IAE/C,MAAM,eAAe,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAE9D,qCAAqC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,WAAmB;IAC/D,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,EAAE;QAC3B,OAAO;KACR;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,cAAc,CAAC;IAE/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE;QACtC,OAAO;KACR;IAED,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC,iBAAiB,EAAE;QACtB,OAAO;KACR;IAGD,OAAO,iBAAiB,CAAC,aAAa,CAAC,6BAA6B,CAAC,SAAS;SAC3E,SAAS,CAAC;AACf,CAAC"}