@cornerstonejs/tools 2.0.0-beta.1 → 2.0.0-beta.2

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 (425) hide show
  1. package/dist/cjs/drawingSvg/drawCircle.js +9 -5
  2. package/dist/cjs/drawingSvg/drawCircle.js.map +1 -1
  3. package/dist/cjs/drawingSvg/drawEllipse.js +4 -4
  4. package/dist/cjs/drawingSvg/drawEllipse.js.map +1 -1
  5. package/dist/cjs/drawingSvg/drawHandles.js +4 -4
  6. package/dist/cjs/drawingSvg/drawHandles.js.map +1 -1
  7. package/dist/cjs/drawingSvg/drawLine.js +4 -4
  8. package/dist/cjs/drawingSvg/drawLine.js.map +1 -1
  9. package/dist/cjs/drawingSvg/drawPolyline.js +4 -4
  10. package/dist/cjs/drawingSvg/drawPolyline.js.map +1 -1
  11. package/dist/cjs/drawingSvg/drawRect.js +4 -4
  12. package/dist/cjs/drawingSvg/drawRect.js.map +1 -1
  13. package/dist/cjs/drawingSvg/drawTextBox.js +4 -4
  14. package/dist/cjs/drawingSvg/drawTextBox.js.map +1 -1
  15. package/dist/cjs/drawingSvg/index.d.ts +3 -1
  16. package/dist/cjs/drawingSvg/index.js +5 -1
  17. package/dist/cjs/drawingSvg/index.js.map +1 -1
  18. package/dist/cjs/drawingSvg/setAttributesIfNecessary.d.ts +2 -0
  19. package/dist/cjs/drawingSvg/{_setAttributesIfNecessary.js → setAttributesIfNecessary.js} +5 -5
  20. package/dist/cjs/drawingSvg/setAttributesIfNecessary.js.map +1 -0
  21. package/dist/cjs/drawingSvg/setNewAttributesIfValid.d.ts +2 -0
  22. package/dist/cjs/drawingSvg/{_setNewAttributesIfValid.js → setNewAttributesIfValid.js} +5 -5
  23. package/dist/cjs/drawingSvg/setNewAttributesIfValid.js.map +1 -0
  24. package/dist/cjs/enums/Events.d.ts +1 -0
  25. package/dist/cjs/enums/Events.js +1 -0
  26. package/dist/cjs/enums/Events.js.map +1 -1
  27. package/dist/cjs/eventDispatchers/shared/getMouseModifier.js +10 -5
  28. package/dist/cjs/eventDispatchers/shared/getMouseModifier.js.map +1 -1
  29. package/dist/cjs/eventListeners/keyboard/keyDownListener.js +8 -0
  30. package/dist/cjs/eventListeners/keyboard/keyDownListener.js.map +1 -1
  31. package/dist/cjs/eventListeners/mouse/mouseDownListener.js +2 -1
  32. package/dist/cjs/eventListeners/mouse/mouseDownListener.js.map +1 -1
  33. package/dist/cjs/eventListeners/touch/touchStartListener.js +10 -5
  34. package/dist/cjs/eventListeners/touch/touchStartListener.js.map +1 -1
  35. package/dist/cjs/index.d.ts +2 -2
  36. package/dist/cjs/index.js +3 -2
  37. package/dist/cjs/index.js.map +1 -1
  38. package/dist/cjs/stateManagement/annotation/config/ToolStyle.js +1 -0
  39. package/dist/cjs/stateManagement/annotation/config/ToolStyle.js.map +1 -1
  40. package/dist/cjs/stateManagement/annotation/config/getState.js +6 -3
  41. package/dist/cjs/stateManagement/annotation/config/getState.js.map +1 -1
  42. package/dist/cjs/stateManagement/annotation/config/helpers.js +4 -2
  43. package/dist/cjs/stateManagement/annotation/config/helpers.js.map +1 -1
  44. package/dist/cjs/store/SynchronizerManager/Synchronizer.js +10 -2
  45. package/dist/cjs/store/SynchronizerManager/Synchronizer.js.map +1 -1
  46. package/dist/cjs/store/ToolGroupManager/ToolGroup.d.ts +3 -3
  47. package/dist/cjs/store/ToolGroupManager/ToolGroup.js +9 -2
  48. package/dist/cjs/store/ToolGroupManager/ToolGroup.js.map +1 -1
  49. package/dist/cjs/store/ToolGroupManager/getToolGroupsWithToolName.js +2 -1
  50. package/dist/cjs/store/ToolGroupManager/getToolGroupsWithToolName.js.map +1 -1
  51. package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js +25 -22
  52. package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
  53. package/dist/cjs/synchronizers/callbacks/voiSyncCallback.js +1 -1
  54. package/dist/cjs/synchronizers/callbacks/voiSyncCallback.js.map +1 -1
  55. package/dist/cjs/tools/MIPJumpToClickTool.js +4 -2
  56. package/dist/cjs/tools/MIPJumpToClickTool.js.map +1 -1
  57. package/dist/cjs/tools/PlanarRotateTool.js +2 -1
  58. package/dist/cjs/tools/PlanarRotateTool.js.map +1 -1
  59. package/dist/cjs/tools/ReferenceCursors.js +58 -29
  60. package/dist/cjs/tools/ReferenceCursors.js.map +1 -1
  61. package/dist/cjs/tools/ScaleOverlayTool.js +2 -1
  62. package/dist/cjs/tools/ScaleOverlayTool.js.map +1 -1
  63. package/dist/cjs/tools/annotation/AngleTool.d.ts +0 -1
  64. package/dist/cjs/tools/annotation/AngleTool.js +31 -14
  65. package/dist/cjs/tools/annotation/AngleTool.js.map +1 -1
  66. package/dist/cjs/tools/annotation/ArrowAnnotateTool.js +15 -1
  67. package/dist/cjs/tools/annotation/ArrowAnnotateTool.js.map +1 -1
  68. package/dist/cjs/tools/annotation/BidirectionalTool.d.ts +0 -1
  69. package/dist/cjs/tools/annotation/BidirectionalTool.js +29 -14
  70. package/dist/cjs/tools/annotation/BidirectionalTool.js.map +1 -1
  71. package/dist/cjs/tools/annotation/CircleROITool.d.ts +0 -1
  72. package/dist/cjs/tools/annotation/CircleROITool.js +56 -53
  73. package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -1
  74. package/dist/cjs/tools/annotation/CobbAngleTool.d.ts +0 -1
  75. package/dist/cjs/tools/annotation/CobbAngleTool.js +26 -11
  76. package/dist/cjs/tools/annotation/CobbAngleTool.js.map +1 -1
  77. package/dist/cjs/tools/annotation/DragProbeTool.js +13 -1
  78. package/dist/cjs/tools/annotation/DragProbeTool.js.map +1 -1
  79. package/dist/cjs/tools/annotation/EllipticalROITool.d.ts +0 -1
  80. package/dist/cjs/tools/annotation/EllipticalROITool.js +48 -46
  81. package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
  82. package/dist/cjs/tools/annotation/LengthTool.d.ts +0 -1
  83. package/dist/cjs/tools/annotation/LengthTool.js +26 -11
  84. package/dist/cjs/tools/annotation/LengthTool.js.map +1 -1
  85. package/dist/cjs/tools/annotation/PlanarFreehandROITool.d.ts +0 -1
  86. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js +50 -51
  87. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  88. package/dist/cjs/tools/annotation/ProbeTool.d.ts +0 -1
  89. package/dist/cjs/tools/annotation/ProbeTool.js +18 -13
  90. package/dist/cjs/tools/annotation/ProbeTool.js.map +1 -1
  91. package/dist/cjs/tools/annotation/RectangleROITool.d.ts +0 -1
  92. package/dist/cjs/tools/annotation/RectangleROITool.js +46 -48
  93. package/dist/cjs/tools/annotation/RectangleROITool.js.map +1 -1
  94. package/dist/cjs/tools/base/AnnotationTool.d.ts +2 -1
  95. package/dist/cjs/tools/base/AnnotationTool.js +27 -16
  96. package/dist/cjs/tools/base/AnnotationTool.js.map +1 -1
  97. package/dist/cjs/tools/base/index.d.ts +2 -1
  98. package/dist/cjs/tools/base/index.js +3 -1
  99. package/dist/cjs/tools/base/index.js.map +1 -1
  100. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  101. package/dist/cjs/tools/displayTools/Labelmap/removeLabelmapFromElement.js +3 -0
  102. package/dist/cjs/tools/displayTools/Labelmap/removeLabelmapFromElement.js.map +1 -1
  103. package/dist/cjs/tools/displayTools/SegmentationDisplayTool.js +5 -6
  104. package/dist/cjs/tools/displayTools/SegmentationDisplayTool.js.map +1 -1
  105. package/dist/cjs/tools/index.d.ts +2 -2
  106. package/dist/cjs/tools/index.js +2 -1
  107. package/dist/cjs/tools/index.js.map +1 -1
  108. package/dist/cjs/tools/segmentation/BrushTool.js +24 -17
  109. package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
  110. package/dist/cjs/tools/segmentation/PaintFillTool.js +4 -2
  111. package/dist/cjs/tools/segmentation/PaintFillTool.js.map +1 -1
  112. package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +2 -0
  113. package/dist/cjs/tools/segmentation/strategies/eraseSphere.js.map +1 -1
  114. package/dist/cjs/tools/segmentation/strategies/fillCircle.js +5 -7
  115. package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
  116. package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +3 -0
  117. package/dist/cjs/tools/segmentation/strategies/fillSphere.js +38 -10
  118. package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
  119. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +3 -0
  120. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js +10 -0
  121. package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -0
  122. package/dist/cjs/types/CINETypes.d.ts +2 -0
  123. package/dist/cjs/types/CalculatorTypes.d.ts +6 -0
  124. package/dist/cjs/types/CalculatorTypes.js +3 -0
  125. package/dist/cjs/types/CalculatorTypes.js.map +1 -0
  126. package/dist/cjs/types/EventTypes.d.ts +8 -1
  127. package/dist/cjs/types/ISetToolModeOptions.d.ts +2 -2
  128. package/dist/cjs/types/IToolGroup.d.ts +3 -2
  129. package/dist/cjs/types/ToolProps.d.ts +5 -1
  130. package/dist/cjs/types/index.d.ts +3 -2
  131. package/dist/cjs/utilities/cine/playClip.js +13 -3
  132. package/dist/cjs/utilities/cine/playClip.js.map +1 -1
  133. package/dist/cjs/utilities/dynamicVolume/getDataInTime.js +7 -4
  134. package/dist/cjs/utilities/dynamicVolume/getDataInTime.js.map +1 -1
  135. package/dist/cjs/utilities/getCalibratedUnits.js +10 -5
  136. package/dist/cjs/utilities/getCalibratedUnits.js.map +1 -1
  137. package/dist/cjs/utilities/math/basic/BasicStatsCalculator.d.ts +14 -0
  138. package/dist/cjs/utilities/math/basic/BasicStatsCalculator.js +44 -0
  139. package/dist/cjs/utilities/math/basic/BasicStatsCalculator.js.map +1 -0
  140. package/dist/cjs/utilities/math/basic/Calculator.d.ts +8 -0
  141. package/dist/cjs/utilities/math/basic/Calculator.js +6 -0
  142. package/dist/cjs/utilities/math/basic/Calculator.js.map +1 -0
  143. package/dist/cjs/utilities/math/basic/index.d.ts +3 -0
  144. package/dist/cjs/utilities/math/basic/index.js +11 -0
  145. package/dist/cjs/utilities/math/basic/index.js.map +1 -0
  146. package/dist/cjs/utilities/math/index.d.ts +2 -1
  147. package/dist/cjs/utilities/math/index.js +3 -1
  148. package/dist/cjs/utilities/math/index.js.map +1 -1
  149. package/dist/cjs/utilities/math/midPoint.js +2 -1
  150. package/dist/cjs/utilities/math/midPoint.js.map +1 -1
  151. package/dist/cjs/utilities/math/polyline/pointInPolyline.js +2 -1
  152. package/dist/cjs/utilities/math/polyline/pointInPolyline.js.map +1 -1
  153. package/dist/cjs/utilities/math/vec2/liangBarksyClip.d.ts +1 -1
  154. package/dist/cjs/utilities/math/vec2/liangBarksyClip.js +10 -5
  155. package/dist/cjs/utilities/math/vec2/liangBarksyClip.js.map +1 -1
  156. package/dist/cjs/utilities/pointInShapeCallback.d.ts +7 -1
  157. package/dist/cjs/utilities/pointInShapeCallback.js +6 -1
  158. package/dist/cjs/utilities/pointInShapeCallback.js.map +1 -1
  159. package/dist/cjs/utilities/roundNumber.js +4 -2
  160. package/dist/cjs/utilities/roundNumber.js.map +1 -1
  161. package/dist/cjs/utilities/segmentation/brushSizeForToolGroup.d.ts +2 -2
  162. package/dist/cjs/utilities/segmentation/brushSizeForToolGroup.js +4 -4
  163. package/dist/cjs/utilities/segmentation/brushSizeForToolGroup.js.map +1 -1
  164. package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js +2 -1
  165. package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
  166. package/dist/cjs/utilities/segmentation/utilities.d.ts +1 -2
  167. package/dist/cjs/utilities/segmentation/utilities.js +4 -1
  168. package/dist/cjs/utilities/segmentation/utilities.js.map +1 -1
  169. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js +4 -4
  170. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
  171. package/dist/esm/drawingSvg/drawCircle.js +9 -5
  172. package/dist/esm/drawingSvg/drawCircle.js.map +1 -1
  173. package/dist/esm/drawingSvg/drawEllipse.js +4 -4
  174. package/dist/esm/drawingSvg/drawEllipse.js.map +1 -1
  175. package/dist/esm/drawingSvg/drawHandles.js +4 -4
  176. package/dist/esm/drawingSvg/drawHandles.js.map +1 -1
  177. package/dist/esm/drawingSvg/drawLine.js +4 -4
  178. package/dist/esm/drawingSvg/drawLine.js.map +1 -1
  179. package/dist/esm/drawingSvg/drawPolyline.js +4 -4
  180. package/dist/esm/drawingSvg/drawPolyline.js.map +1 -1
  181. package/dist/esm/drawingSvg/drawRect.js +4 -4
  182. package/dist/esm/drawingSvg/drawRect.js.map +1 -1
  183. package/dist/esm/drawingSvg/drawTextBox.js +4 -4
  184. package/dist/esm/drawingSvg/drawTextBox.js.map +1 -1
  185. package/dist/esm/drawingSvg/index.d.ts +3 -1
  186. package/dist/esm/drawingSvg/index.js +3 -1
  187. package/dist/esm/drawingSvg/index.js.map +1 -1
  188. package/dist/esm/drawingSvg/setAttributesIfNecessary.d.ts +2 -0
  189. package/dist/esm/drawingSvg/{_setAttributesIfNecessary.js → setAttributesIfNecessary.js} +3 -3
  190. package/dist/esm/drawingSvg/setAttributesIfNecessary.js.map +1 -0
  191. package/dist/esm/drawingSvg/setNewAttributesIfValid.d.ts +2 -0
  192. package/dist/esm/drawingSvg/{_setNewAttributesIfValid.js → setNewAttributesIfValid.js} +3 -3
  193. package/dist/esm/drawingSvg/setNewAttributesIfValid.js.map +1 -0
  194. package/dist/esm/enums/Events.d.ts +1 -0
  195. package/dist/esm/enums/Events.js +1 -0
  196. package/dist/esm/enums/Events.js.map +1 -1
  197. package/dist/esm/eventDispatchers/shared/getMouseModifier.js +10 -5
  198. package/dist/esm/eventDispatchers/shared/getMouseModifier.js.map +1 -1
  199. package/dist/esm/eventListeners/keyboard/keyDownListener.js +8 -0
  200. package/dist/esm/eventListeners/keyboard/keyDownListener.js.map +1 -1
  201. package/dist/esm/eventListeners/mouse/mouseDownListener.js +2 -1
  202. package/dist/esm/eventListeners/mouse/mouseDownListener.js.map +1 -1
  203. package/dist/esm/eventListeners/touch/touchStartListener.js +10 -5
  204. package/dist/esm/eventListeners/touch/touchStartListener.js.map +1 -1
  205. package/dist/esm/index.d.ts +2 -2
  206. package/dist/esm/index.js +2 -2
  207. package/dist/esm/index.js.map +1 -1
  208. package/dist/esm/stateManagement/annotation/config/ToolStyle.js +1 -0
  209. package/dist/esm/stateManagement/annotation/config/ToolStyle.js.map +1 -1
  210. package/dist/esm/stateManagement/annotation/config/getState.js +6 -3
  211. package/dist/esm/stateManagement/annotation/config/getState.js.map +1 -1
  212. package/dist/esm/stateManagement/annotation/config/helpers.js +4 -2
  213. package/dist/esm/stateManagement/annotation/config/helpers.js.map +1 -1
  214. package/dist/esm/store/SynchronizerManager/Synchronizer.js +10 -2
  215. package/dist/esm/store/SynchronizerManager/Synchronizer.js.map +1 -1
  216. package/dist/esm/store/ToolGroupManager/ToolGroup.d.ts +3 -3
  217. package/dist/esm/store/ToolGroupManager/ToolGroup.js +10 -3
  218. package/dist/esm/store/ToolGroupManager/ToolGroup.js.map +1 -1
  219. package/dist/esm/store/ToolGroupManager/getToolGroupsWithToolName.js +2 -1
  220. package/dist/esm/store/ToolGroupManager/getToolGroupsWithToolName.js.map +1 -1
  221. package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js +26 -23
  222. package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
  223. package/dist/esm/synchronizers/callbacks/voiSyncCallback.js +1 -1
  224. package/dist/esm/synchronizers/callbacks/voiSyncCallback.js.map +1 -1
  225. package/dist/esm/tools/MIPJumpToClickTool.js +4 -2
  226. package/dist/esm/tools/MIPJumpToClickTool.js.map +1 -1
  227. package/dist/esm/tools/PlanarRotateTool.js +2 -1
  228. package/dist/esm/tools/PlanarRotateTool.js.map +1 -1
  229. package/dist/esm/tools/ReferenceCursors.js +58 -29
  230. package/dist/esm/tools/ReferenceCursors.js.map +1 -1
  231. package/dist/esm/tools/ScaleOverlayTool.js +2 -1
  232. package/dist/esm/tools/ScaleOverlayTool.js.map +1 -1
  233. package/dist/esm/tools/annotation/AngleTool.d.ts +0 -1
  234. package/dist/esm/tools/annotation/AngleTool.js +31 -14
  235. package/dist/esm/tools/annotation/AngleTool.js.map +1 -1
  236. package/dist/esm/tools/annotation/ArrowAnnotateTool.js +15 -1
  237. package/dist/esm/tools/annotation/ArrowAnnotateTool.js.map +1 -1
  238. package/dist/esm/tools/annotation/BidirectionalTool.d.ts +0 -1
  239. package/dist/esm/tools/annotation/BidirectionalTool.js +29 -14
  240. package/dist/esm/tools/annotation/BidirectionalTool.js.map +1 -1
  241. package/dist/esm/tools/annotation/CircleROITool.d.ts +0 -1
  242. package/dist/esm/tools/annotation/CircleROITool.js +55 -53
  243. package/dist/esm/tools/annotation/CircleROITool.js.map +1 -1
  244. package/dist/esm/tools/annotation/CobbAngleTool.d.ts +0 -1
  245. package/dist/esm/tools/annotation/CobbAngleTool.js +26 -11
  246. package/dist/esm/tools/annotation/CobbAngleTool.js.map +1 -1
  247. package/dist/esm/tools/annotation/DragProbeTool.js +13 -1
  248. package/dist/esm/tools/annotation/DragProbeTool.js.map +1 -1
  249. package/dist/esm/tools/annotation/EllipticalROITool.d.ts +0 -1
  250. package/dist/esm/tools/annotation/EllipticalROITool.js +47 -46
  251. package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
  252. package/dist/esm/tools/annotation/LengthTool.d.ts +0 -1
  253. package/dist/esm/tools/annotation/LengthTool.js +26 -11
  254. package/dist/esm/tools/annotation/LengthTool.js.map +1 -1
  255. package/dist/esm/tools/annotation/PlanarFreehandROITool.d.ts +0 -1
  256. package/dist/esm/tools/annotation/PlanarFreehandROITool.js +49 -51
  257. package/dist/esm/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  258. package/dist/esm/tools/annotation/ProbeTool.d.ts +0 -1
  259. package/dist/esm/tools/annotation/ProbeTool.js +18 -13
  260. package/dist/esm/tools/annotation/ProbeTool.js.map +1 -1
  261. package/dist/esm/tools/annotation/RectangleROITool.d.ts +0 -1
  262. package/dist/esm/tools/annotation/RectangleROITool.js +45 -48
  263. package/dist/esm/tools/annotation/RectangleROITool.js.map +1 -1
  264. package/dist/esm/tools/base/AnnotationTool.d.ts +2 -1
  265. package/dist/esm/tools/base/AnnotationTool.js +26 -16
  266. package/dist/esm/tools/base/AnnotationTool.js.map +1 -1
  267. package/dist/esm/tools/base/index.d.ts +2 -1
  268. package/dist/esm/tools/base/index.js +2 -1
  269. package/dist/esm/tools/base/index.js.map +1 -1
  270. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  271. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js +4 -1
  272. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js.map +1 -1
  273. package/dist/esm/tools/displayTools/SegmentationDisplayTool.js +5 -6
  274. package/dist/esm/tools/displayTools/SegmentationDisplayTool.js.map +1 -1
  275. package/dist/esm/tools/index.d.ts +2 -2
  276. package/dist/esm/tools/index.js +2 -2
  277. package/dist/esm/tools/index.js.map +1 -1
  278. package/dist/esm/tools/segmentation/BrushTool.js +25 -18
  279. package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
  280. package/dist/esm/tools/segmentation/PaintFillTool.js +4 -2
  281. package/dist/esm/tools/segmentation/PaintFillTool.js.map +1 -1
  282. package/dist/esm/tools/segmentation/strategies/eraseSphere.d.ts +2 -0
  283. package/dist/esm/tools/segmentation/strategies/eraseSphere.js.map +1 -1
  284. package/dist/esm/tools/segmentation/strategies/fillCircle.js +1 -6
  285. package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
  286. package/dist/esm/tools/segmentation/strategies/fillSphere.d.ts +3 -0
  287. package/dist/esm/tools/segmentation/strategies/fillSphere.js +33 -9
  288. package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
  289. package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +3 -0
  290. package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js +8 -0
  291. package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -0
  292. package/dist/esm/types/CINETypes.d.ts +2 -0
  293. package/dist/esm/types/CalculatorTypes.d.ts +6 -0
  294. package/dist/esm/types/CalculatorTypes.js +2 -0
  295. package/dist/esm/types/CalculatorTypes.js.map +1 -0
  296. package/dist/esm/types/EventTypes.d.ts +8 -1
  297. package/dist/esm/types/ISetToolModeOptions.d.ts +2 -2
  298. package/dist/esm/types/IToolGroup.d.ts +3 -2
  299. package/dist/esm/types/ToolProps.d.ts +5 -1
  300. package/dist/esm/types/index.d.ts +3 -2
  301. package/dist/esm/utilities/cine/playClip.js +13 -4
  302. package/dist/esm/utilities/cine/playClip.js.map +1 -1
  303. package/dist/esm/utilities/dynamicVolume/getDataInTime.js +7 -4
  304. package/dist/esm/utilities/dynamicVolume/getDataInTime.js.map +1 -1
  305. package/dist/esm/utilities/getCalibratedUnits.js +10 -5
  306. package/dist/esm/utilities/getCalibratedUnits.js.map +1 -1
  307. package/dist/esm/utilities/math/basic/BasicStatsCalculator.d.ts +14 -0
  308. package/dist/esm/utilities/math/basic/BasicStatsCalculator.js +36 -0
  309. package/dist/esm/utilities/math/basic/BasicStatsCalculator.js.map +1 -0
  310. package/dist/esm/utilities/math/basic/Calculator.d.ts +8 -0
  311. package/dist/esm/utilities/math/basic/Calculator.js +4 -0
  312. package/dist/esm/utilities/math/basic/Calculator.js.map +1 -0
  313. package/dist/esm/utilities/math/basic/index.d.ts +3 -0
  314. package/dist/esm/utilities/math/basic/index.js +4 -0
  315. package/dist/esm/utilities/math/basic/index.js.map +1 -0
  316. package/dist/esm/utilities/math/index.d.ts +2 -1
  317. package/dist/esm/utilities/math/index.js +2 -1
  318. package/dist/esm/utilities/math/index.js.map +1 -1
  319. package/dist/esm/utilities/math/midPoint.js +2 -1
  320. package/dist/esm/utilities/math/midPoint.js.map +1 -1
  321. package/dist/esm/utilities/math/polyline/pointInPolyline.js +2 -1
  322. package/dist/esm/utilities/math/polyline/pointInPolyline.js.map +1 -1
  323. package/dist/esm/utilities/math/vec2/liangBarksyClip.d.ts +1 -1
  324. package/dist/esm/utilities/math/vec2/liangBarksyClip.js +10 -5
  325. package/dist/esm/utilities/math/vec2/liangBarksyClip.js.map +1 -1
  326. package/dist/esm/utilities/pointInShapeCallback.d.ts +7 -1
  327. package/dist/esm/utilities/pointInShapeCallback.js +6 -1
  328. package/dist/esm/utilities/pointInShapeCallback.js.map +1 -1
  329. package/dist/esm/utilities/roundNumber.js +4 -2
  330. package/dist/esm/utilities/roundNumber.js.map +1 -1
  331. package/dist/esm/utilities/segmentation/brushSizeForToolGroup.d.ts +2 -2
  332. package/dist/esm/utilities/segmentation/brushSizeForToolGroup.js +4 -4
  333. package/dist/esm/utilities/segmentation/brushSizeForToolGroup.js.map +1 -1
  334. package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js +2 -1
  335. package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
  336. package/dist/esm/utilities/segmentation/utilities.d.ts +1 -2
  337. package/dist/esm/utilities/segmentation/utilities.js +4 -1
  338. package/dist/esm/utilities/segmentation/utilities.js.map +1 -1
  339. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +4 -4
  340. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
  341. package/dist/umd/index.js +1 -1
  342. package/dist/umd/index.js.map +1 -1
  343. package/package.json +3 -3
  344. package/src/drawingSvg/drawCircle.ts +17 -5
  345. package/src/drawingSvg/drawEllipse.ts +4 -4
  346. package/src/drawingSvg/drawHandles.ts +4 -4
  347. package/src/drawingSvg/drawLine.ts +4 -4
  348. package/src/drawingSvg/drawPolyline.ts +4 -4
  349. package/src/drawingSvg/drawRect.ts +4 -4
  350. package/src/drawingSvg/drawTextBox.ts +4 -4
  351. package/src/drawingSvg/index.ts +4 -0
  352. package/src/drawingSvg/{_setAttributesIfNecessary.ts → setAttributesIfNecessary.ts} +2 -2
  353. package/src/drawingSvg/{_setNewAttributesIfValid.ts → setNewAttributesIfValid.ts} +2 -2
  354. package/src/enums/Events.ts +13 -0
  355. package/src/eventDispatchers/shared/getMouseModifier.ts +15 -5
  356. package/src/eventListeners/keyboard/keyDownListener.ts +13 -0
  357. package/src/eventListeners/mouse/mouseDownListener.ts +3 -1
  358. package/src/eventListeners/touch/touchStartListener.ts +15 -5
  359. package/src/index.ts +2 -0
  360. package/src/stateManagement/annotation/config/ToolStyle.ts +1 -0
  361. package/src/stateManagement/annotation/config/getState.ts +7 -3
  362. package/src/stateManagement/annotation/config/helpers.ts +6 -2
  363. package/src/store/SynchronizerManager/Synchronizer.ts +16 -8
  364. package/src/store/ToolGroupManager/ToolGroup.ts +21 -5
  365. package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +3 -1
  366. package/src/synchronizers/callbacks/stackImageSyncCallback.ts +63 -68
  367. package/src/synchronizers/callbacks/voiSyncCallback.ts +1 -1
  368. package/src/tools/MIPJumpToClickTool.ts +6 -2
  369. package/src/tools/PlanarRotateTool.ts +3 -1
  370. package/src/tools/ReferenceCursors.ts +85 -29
  371. package/src/tools/ScaleOverlayTool.ts +3 -1
  372. package/src/tools/annotation/AngleTool.ts +38 -19
  373. package/src/tools/annotation/ArrowAnnotateTool.ts +16 -1
  374. package/src/tools/annotation/BidirectionalTool.ts +37 -23
  375. package/src/tools/annotation/CircleROITool.ts +83 -89
  376. package/src/tools/annotation/CobbAngleTool.ts +31 -16
  377. package/src/tools/annotation/DragProbeTool.ts +19 -1
  378. package/src/tools/annotation/EllipticalROITool.ts +63 -71
  379. package/src/tools/annotation/LengthTool.ts +32 -17
  380. package/src/tools/annotation/PlanarFreehandROITool.ts +56 -59
  381. package/src/tools/annotation/ProbeTool.ts +26 -19
  382. package/src/tools/annotation/RectangleROITool.ts +67 -75
  383. package/src/tools/base/AnnotationTool.ts +39 -17
  384. package/src/tools/base/index.ts +2 -1
  385. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +3 -0
  386. package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +6 -1
  387. package/src/tools/displayTools/SegmentationDisplayTool.ts +12 -18
  388. package/src/tools/index.ts +2 -1
  389. package/src/tools/segmentation/BrushTool.ts +42 -19
  390. package/src/tools/segmentation/PaintFillTool.ts +10 -3
  391. package/src/tools/segmentation/strategies/eraseSphere.ts +2 -0
  392. package/src/tools/segmentation/strategies/fillCircle.ts +1 -13
  393. package/src/tools/segmentation/strategies/fillSphere.ts +56 -8
  394. package/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +16 -0
  395. package/src/types/CINETypes.ts +8 -2
  396. package/src/types/CalculatorTypes.ts +7 -0
  397. package/src/types/EventTypes.ts +20 -0
  398. package/src/types/ISetToolModeOptions.ts +2 -2
  399. package/src/types/IToolGroup.ts +6 -3
  400. package/src/types/ToolProps.ts +7 -1
  401. package/src/types/index.ts +9 -1
  402. package/src/utilities/cine/playClip.ts +20 -3
  403. package/src/utilities/dynamicVolume/getDataInTime.ts +9 -6
  404. package/src/utilities/getCalibratedUnits.ts +15 -5
  405. package/src/utilities/math/basic/BasicStatsCalculator.ts +60 -0
  406. package/src/utilities/math/basic/Calculator.ts +8 -0
  407. package/src/utilities/math/basic/index.ts +4 -0
  408. package/src/utilities/math/index.ts +10 -1
  409. package/src/utilities/math/midPoint.ts +3 -1
  410. package/src/utilities/math/polyline/pointInPolyline.ts +3 -1
  411. package/src/utilities/math/vec2/liangBarksyClip.ts +15 -5
  412. package/src/utilities/pointInShapeCallback.ts +15 -3
  413. package/src/utilities/roundNumber.ts +6 -2
  414. package/src/utilities/segmentation/brushSizeForToolGroup.ts +22 -4
  415. package/src/utilities/segmentation/thresholdVolumeByRange.ts +3 -1
  416. package/src/utilities/segmentation/utilities.ts +8 -1
  417. package/src/utilities/stackPrefetch/stackPrefetch.ts +10 -4
  418. package/dist/cjs/drawingSvg/_setAttributesIfNecessary.d.ts +0 -2
  419. package/dist/cjs/drawingSvg/_setAttributesIfNecessary.js.map +0 -1
  420. package/dist/cjs/drawingSvg/_setNewAttributesIfValid.d.ts +0 -2
  421. package/dist/cjs/drawingSvg/_setNewAttributesIfValid.js.map +0 -1
  422. package/dist/esm/drawingSvg/_setAttributesIfNecessary.d.ts +0 -2
  423. package/dist/esm/drawingSvg/_setAttributesIfNecessary.js.map +0 -1
  424. package/dist/esm/drawingSvg/_setNewAttributesIfValid.d.ts +0 -2
  425. package/dist/esm/drawingSvg/_setNewAttributesIfValid.js.map +0 -1
@@ -113,6 +113,7 @@ class LengthTool extends AnnotationTool {
113
113
  supportedInteractionTypes: ['Mouse', 'Touch'],
114
114
  configuration: {
115
115
  preventHandleOutsideImage: false,
116
+ getTextLines: defaultGetTextLines,
116
117
  },
117
118
  }
118
119
  ) {
@@ -731,7 +732,22 @@ class LengthTool extends AnnotationTool {
731
732
  return renderStatus;
732
733
  }
733
734
 
734
- const textLines = this._getTextLines(data, targetId);
735
+ const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
736
+ if (!options.visibility) {
737
+ data.handles.textBox = {
738
+ hasMoved: false,
739
+ worldPosition: <Types.Point3>[0, 0, 0],
740
+ worldBoundingBox: {
741
+ topLeft: <Types.Point3>[0, 0, 0],
742
+ topRight: <Types.Point3>[0, 0, 0],
743
+ bottomLeft: <Types.Point3>[0, 0, 0],
744
+ bottomRight: <Types.Point3>[0, 0, 0],
745
+ },
746
+ };
747
+ continue;
748
+ }
749
+
750
+ const textLines = this.configuration.getTextLines(data, targetId);
735
751
 
736
752
  // Need to update to sync with annotation while unlinked/not moved
737
753
  if (!data.handles.textBox.hasMoved) {
@@ -754,7 +770,7 @@ class LengthTool extends AnnotationTool {
754
770
  textBoxPosition,
755
771
  canvasCoordinates,
756
772
  {},
757
- this.getLinkedTextBoxStyle(styleSpecifier, annotation)
773
+ options
758
774
  );
759
775
 
760
776
  const { x: left, y: top, width, height } = boundingBox;
@@ -770,21 +786,6 @@ class LengthTool extends AnnotationTool {
770
786
  return renderStatus;
771
787
  };
772
788
 
773
- // text line for the current active length annotation
774
- _getTextLines(data, targetId) {
775
- const cachedVolumeStats = data.cachedStats[targetId];
776
- const { length, unit } = cachedVolumeStats;
777
-
778
- // Can be null on load
779
- if (length === undefined || length === null || isNaN(length)) {
780
- return;
781
- }
782
-
783
- const textLines = [`${roundNumber(length)} ${unit}`];
784
-
785
- return textLines;
786
- }
787
-
788
789
  _calculateLength(pos1, pos2) {
789
790
  const dx = pos1[0] - pos2[0];
790
791
  const dy = pos1[1] - pos2[1];
@@ -862,5 +863,19 @@ class LengthTool extends AnnotationTool {
862
863
  }
863
864
  }
864
865
 
866
+ function defaultGetTextLines(data, targetId): string[] {
867
+ const cachedVolumeStats = data.cachedStats[targetId];
868
+ const { length, unit } = cachedVolumeStats;
869
+
870
+ // Can be null on load
871
+ if (length === undefined || length === null || isNaN(length)) {
872
+ return;
873
+ }
874
+
875
+ const textLines = [`${roundNumber(length)} ${unit}`];
876
+
877
+ return textLines;
878
+ }
879
+
865
880
  LengthTool.toolName = 'Length';
866
881
  export default LengthTool;
@@ -59,6 +59,7 @@ import {
59
59
  ModalityUnitOptions,
60
60
  getModalityUnit,
61
61
  } from '../../utilities/getModalityUnit';
62
+ import { BasicStatsCalculator } from '../../utilities/math/basic';
62
63
 
63
64
  const { pointCanProjectOnLine } = polyline;
64
65
  const { EPSILON } = CONSTANTS;
@@ -124,6 +125,7 @@ const PARALLEL_THRESHOLD = 1 - EPSILON;
124
125
  *
125
126
  * Read more in the Docs section of the website.
126
127
  */
128
+
127
129
  class PlanarFreehandROITool extends AnnotationTool {
128
130
  static toolName;
129
131
 
@@ -215,6 +217,8 @@ class PlanarFreehandROITool extends AnnotationTool {
215
217
  knotsRatioPercentageOnEdit: 40,
216
218
  },
217
219
  calculateStats: false,
220
+ getTextLines: defaultGetTextLines,
221
+ statsCalculator: BasicStatsCalculator,
218
222
  },
219
223
  }
220
224
  ) {
@@ -662,15 +666,18 @@ class PlanarFreehandROITool extends AnnotationTool {
662
666
  renderStatus = true;
663
667
  }
664
668
 
665
- if (!this.configuration.calculateStats) return;
669
+ if (!this.configuration.calculateStats) {
670
+ return;
671
+ }
666
672
 
667
673
  annotations.forEach((annotation) => {
668
674
  const activeAnnotationUID = this.commonData?.annotation.annotationUID;
669
675
  if (
670
676
  annotation.annotationUID === activeAnnotationUID &&
671
677
  !this.commonData?.movingTextBox
672
- )
678
+ ) {
673
679
  return;
680
+ }
674
681
 
675
682
  const modalityUnitOptions = {
676
683
  isPreScaled: isViewportPreScaled(viewport, targetId),
@@ -802,25 +809,10 @@ class PlanarFreehandROITool extends AnnotationTool {
802
809
  const worldPosEnd = imageData.indexToWorld([iMax, jMax, kMax]);
803
810
  const canvasPosEnd = viewport.worldToCanvas(worldPosEnd);
804
811
 
805
- let count = 0;
806
- let sum = 0;
807
- let sumSquares = 0;
808
- let max = -Infinity;
809
-
810
- const statCalculator = ({ value: newValue }) => {
811
- if (newValue > max) {
812
- max = newValue;
813
- }
814
-
815
- sum += newValue;
816
- sumSquares += newValue ** 2;
817
- count += 1;
818
- };
819
-
820
812
  let curRow = 0;
821
813
  let intersections = [];
822
814
  let intersectionCounter = 0;
823
- pointInShapeCallback(
815
+ const pointsInShape = pointInShapeCallback(
824
816
  imageData,
825
817
  (pointLPS, pointIJK) => {
826
818
  let result = true;
@@ -854,28 +846,26 @@ class PlanarFreehandROITool extends AnnotationTool {
854
846
  }
855
847
  return result;
856
848
  },
857
- statCalculator,
849
+ this.configuration.statsCalculator.statsCallback,
858
850
  boundsIJK
859
851
  );
860
852
 
861
- const mean = sum / count;
862
-
863
- // https://www.strchr.com/standard_deviation_in_one_pass?allcomments=1
864
- let stdDev = sumSquares / count - mean ** 2;
865
- stdDev = Math.sqrt(stdDev);
866
-
867
853
  const modalityUnit = getModalityUnit(
868
854
  metadata.Modality,
869
855
  annotation.metadata.referencedImageId,
870
856
  modalityUnitOptions
871
857
  );
872
858
 
859
+ const stats = this.configuration.statsCalculator.getStatistics();
860
+
873
861
  cachedStats[targetId] = {
874
862
  Modality: metadata.Modality,
875
863
  area,
876
- mean,
877
- max,
878
- stdDev,
864
+ mean: stats[1]?.value,
865
+ max: stats[0]?.value,
866
+ stdDev: stats[3]?.value,
867
+ statsArray: stats,
868
+ pointsInShape: pointsInShape,
879
869
  areaUnit: getCalibratedAreaUnits(null, image),
880
870
  modalityUnit,
881
871
  };
@@ -892,8 +882,21 @@ class PlanarFreehandROITool extends AnnotationTool {
892
882
  const data = annotation.data;
893
883
  const targetId = this.getTargetId(viewport);
894
884
 
895
- const textLines = this._getTextLines(data, targetId);
896
- if (!textLines || textLines.length === 0) return;
885
+ const styleSpecifier: AnnotationStyle.StyleSpecifier = {
886
+ toolGroupId: this.toolGroupId,
887
+ toolName: this.getToolName(),
888
+ viewportId: enabledElement.viewport.id,
889
+ };
890
+
891
+ const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
892
+ if (!options.visibility) {
893
+ return;
894
+ }
895
+
896
+ const textLines = this.configuration.getTextLines(data, targetId);
897
+ if (!textLines || textLines.length === 0) {
898
+ return;
899
+ }
897
900
 
898
901
  const canvasCoordinates = data.polyline.map((p) =>
899
902
  viewport.worldToCanvas(p)
@@ -909,12 +912,6 @@ class PlanarFreehandROITool extends AnnotationTool {
909
912
  data.handles.textBox.worldPosition
910
913
  );
911
914
 
912
- const styleSpecifier: AnnotationStyle.StyleSpecifier = {
913
- toolGroupId: this.toolGroupId,
914
- toolName: this.getToolName(),
915
- viewportId: enabledElement.viewport.id,
916
- };
917
-
918
915
  const textBoxUID = '1';
919
916
  const boundingBox = drawLinkedTextBox(
920
917
  svgDrawingHelper,
@@ -924,7 +921,7 @@ class PlanarFreehandROITool extends AnnotationTool {
924
921
  textBoxPosition,
925
922
  canvasCoordinates,
926
923
  {},
927
- this.getLinkedTextBoxStyle(styleSpecifier, annotation)
924
+ options
928
925
  );
929
926
 
930
927
  const { x: left, y: top, width, height } = boundingBox;
@@ -936,35 +933,35 @@ class PlanarFreehandROITool extends AnnotationTool {
936
933
  bottomRight: viewport.canvasToWorld([left + width, top + height]),
937
934
  };
938
935
  };
936
+ }
939
937
 
940
- _getTextLines = (data, targetId: string): string[] => {
941
- const cachedVolumeStats = data.cachedStats[targetId];
942
- const { area, mean, stdDev, max, isEmptyArea, areaUnit, modalityUnit } =
943
- cachedVolumeStats;
938
+ function defaultGetTextLines(data, targetId): string[] {
939
+ const cachedVolumeStats = data.cachedStats[targetId];
940
+ const { area, mean, stdDev, max, isEmptyArea, areaUnit, modalityUnit } =
941
+ cachedVolumeStats;
944
942
 
945
- const textLines: string[] = [];
943
+ const textLines: string[] = [];
946
944
 
947
- if (area) {
948
- const areaLine = isEmptyArea
949
- ? `Area: Oblique not supported`
950
- : `Area: ${roundNumber(area)} ${areaUnit}`;
951
- textLines.push(areaLine);
952
- }
945
+ if (area) {
946
+ const areaLine = isEmptyArea
947
+ ? `Area: Oblique not supported`
948
+ : `Area: ${roundNumber(area)} ${areaUnit}`;
949
+ textLines.push(areaLine);
950
+ }
953
951
 
954
- if (mean) {
955
- textLines.push(`Mean: ${roundNumber(mean)} ${modalityUnit}`);
956
- }
952
+ if (mean) {
953
+ textLines.push(`Mean: ${roundNumber(mean)} ${modalityUnit}`);
954
+ }
957
955
 
958
- if (max) {
959
- textLines.push(`Max: ${roundNumber(max)} ${modalityUnit}`);
960
- }
956
+ if (max) {
957
+ textLines.push(`Max: ${roundNumber(max)} ${modalityUnit}`);
958
+ }
961
959
 
962
- if (stdDev) {
963
- textLines.push(`Std Dev: ${roundNumber(stdDev)} ${modalityUnit}`);
964
- }
960
+ if (stdDev) {
961
+ textLines.push(`Std Dev: ${roundNumber(stdDev)} ${modalityUnit}`);
962
+ }
965
963
 
966
- return textLines;
967
- };
964
+ return textLines;
968
965
  }
969
966
 
970
967
  PlanarFreehandROITool.toolName = 'PlanarFreehandROI';
@@ -94,6 +94,7 @@ const { transformWorldToIndex } = csUtils;
94
94
  * Read more in the Docs section of the website.
95
95
  *
96
96
  */
97
+
97
98
  class ProbeTool extends AnnotationTool {
98
99
  static toolName;
99
100
 
@@ -118,6 +119,7 @@ class ProbeTool extends AnnotationTool {
118
119
  configuration: {
119
120
  shadow: true,
120
121
  preventHandleOutsideImage: false,
122
+ getTextLines: defaultGetTextLines,
121
123
  },
122
124
  }
123
125
  ) {
@@ -525,7 +527,12 @@ class ProbeTool extends AnnotationTool {
525
527
 
526
528
  renderStatus = true;
527
529
 
528
- const textLines = this._getTextLines(data, targetId);
530
+ const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
531
+ if (!options.visibility) {
532
+ continue;
533
+ }
534
+
535
+ const textLines = this.configuration.getTextLines(data, targetId);
529
536
  if (textLines) {
530
537
  const textCanvasCoordinates = [
531
538
  canvasCoordinates[0] + 6,
@@ -539,7 +546,7 @@ class ProbeTool extends AnnotationTool {
539
546
  textUID,
540
547
  textLines,
541
548
  [textCanvasCoordinates[0], textCanvasCoordinates[1]],
542
- this.getLinkedTextBoxStyle(styleSpecifier, annotation)
549
+ options
543
550
  );
544
551
  }
545
552
  }
@@ -547,23 +554,6 @@ class ProbeTool extends AnnotationTool {
547
554
  return renderStatus;
548
555
  };
549
556
 
550
- _getTextLines(data, targetId: string): string[] | undefined {
551
- const cachedVolumeStats = data.cachedStats[targetId];
552
- const { index, value, modalityUnit } = cachedVolumeStats;
553
-
554
- if (value === undefined) {
555
- return;
556
- }
557
-
558
- const textLines = [];
559
-
560
- textLines.push(`(${index[0]}, ${index[1]}, ${index[2]})`);
561
-
562
- textLines.push(`${value.toFixed(2)} ${modalityUnit}`);
563
-
564
- return textLines;
565
- }
566
-
567
557
  _calculateCachedStats(
568
558
  annotation,
569
559
  renderingEngine,
@@ -662,5 +652,22 @@ class ProbeTool extends AnnotationTool {
662
652
  }
663
653
  }
664
654
 
655
+ function defaultGetTextLines(data, targetId): string[] {
656
+ const cachedVolumeStats = data.cachedStats[targetId];
657
+ const { index, value, modalityUnit } = cachedVolumeStats;
658
+
659
+ if (value === undefined) {
660
+ return;
661
+ }
662
+
663
+ const textLines = [];
664
+
665
+ textLines.push(`(${index[0]}, ${index[1]}, ${index[2]})`);
666
+
667
+ textLines.push(`${value.toFixed(2)} ${modalityUnit}`);
668
+
669
+ return textLines;
670
+ }
671
+
665
672
  ProbeTool.toolName = 'Probe';
666
673
  export default ProbeTool;
@@ -56,6 +56,8 @@ import {
56
56
  import { StyleSpecifier } from '../../types/AnnotationStyle';
57
57
  import { getModalityUnit } from '../../utilities/getModalityUnit';
58
58
  import { isViewportPreScaled } from '../../utilities/viewport/isViewportPreScaled';
59
+ import { pointInShapeCallback } from '../../utilities/';
60
+ import { BasicStatsCalculator } from '../../utilities/math/basic';
59
61
 
60
62
  const { transformWorldToIndex } = csUtils;
61
63
 
@@ -97,6 +99,7 @@ const { transformWorldToIndex } = csUtils;
97
99
  *
98
100
  * Read more in the Docs section of the website.
99
101
  */
102
+
100
103
  class RectangleROITool extends AnnotationTool {
101
104
  static toolName;
102
105
 
@@ -119,6 +122,8 @@ class RectangleROITool extends AnnotationTool {
119
122
  configuration: {
120
123
  shadow: true,
121
124
  preventHandleOutsideImage: false,
125
+ getTextLines: defaultGetTextLines,
126
+ statsCalculator: BasicStatsCalculator,
122
127
  },
123
128
  }
124
129
  ) {
@@ -786,7 +791,22 @@ class RectangleROITool extends AnnotationTool {
786
791
 
787
792
  renderStatus = true;
788
793
 
789
- const textLines = this._getTextLines(data, targetId);
794
+ const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
795
+ if (!options.visibility) {
796
+ data.handles.textBox = {
797
+ hasMoved: false,
798
+ worldPosition: <Types.Point3>[0, 0, 0],
799
+ worldBoundingBox: {
800
+ topLeft: <Types.Point3>[0, 0, 0],
801
+ topRight: <Types.Point3>[0, 0, 0],
802
+ bottomLeft: <Types.Point3>[0, 0, 0],
803
+ bottomRight: <Types.Point3>[0, 0, 0],
804
+ },
805
+ };
806
+ continue;
807
+ }
808
+
809
+ const textLines = this.configuration.getTextLines(data, targetId);
790
810
  if (!textLines || textLines.length === 0) {
791
811
  continue;
792
812
  }
@@ -811,7 +831,7 @@ class RectangleROITool extends AnnotationTool {
811
831
  textBoxPosition,
812
832
  canvasCoordinates,
813
833
  {},
814
- this.getLinkedTextBoxStyle(styleSpecifier, annotation)
834
+ options
815
835
  );
816
836
 
817
837
  const { x: left, y: top, width, height } = boundingBox;
@@ -845,33 +865,6 @@ class RectangleROITool extends AnnotationTool {
845
865
  };
846
866
  };
847
867
 
848
- /**
849
- * _getTextLines - Returns the Area, mean and std deviation of the area of the
850
- * target volume enclosed by the rectangle.
851
- *
852
- * @param data - The annotation tool-specific data.
853
- * @param targetId - The volumeId of the volume to display the stats for.
854
- * @param isPreScaled - Whether the viewport is pre-scaled or not.
855
- */
856
- _getTextLines = (data, targetId: string): string[] | undefined => {
857
- const cachedVolumeStats = data.cachedStats[targetId];
858
- const { area, mean, max, stdDev, areaUnit, modalityUnit } =
859
- cachedVolumeStats;
860
-
861
- if (mean === undefined) {
862
- return;
863
- }
864
-
865
- const textLines: string[] = [];
866
-
867
- textLines.push(`Area: ${roundNumber(area)} ${areaUnit}`);
868
- textLines.push(`Mean: ${roundNumber(mean)} ${modalityUnit}`);
869
- textLines.push(`Max: ${roundNumber(max)} ${modalityUnit}`);
870
- textLines.push(`Std Dev: ${roundNumber(stdDev)} ${modalityUnit}`);
871
-
872
- return textLines;
873
- };
874
-
875
868
  /**
876
869
  * _calculateCachedStats - For each volume in the frame of reference that a
877
870
  * tool instance in particular viewport defines as its target volume, find the
@@ -945,6 +938,12 @@ class RectangleROITool extends AnnotationTool {
945
938
  const kMin = Math.min(worldPos1Index[2], worldPos2Index[2]);
946
939
  const kMax = Math.max(worldPos1Index[2], worldPos2Index[2]);
947
940
 
941
+ const boundsIJK = [
942
+ [iMin, iMax],
943
+ [jMin, jMax],
944
+ [kMin, kMax],
945
+ ] as [Types.Point2, Types.Point2, Types.Point2];
946
+
948
947
  const { worldWidth, worldHeight } = getWorldWidthAndHeightFromCorners(
949
948
  viewPlaneNormal,
950
949
  viewUp,
@@ -955,61 +954,29 @@ class RectangleROITool extends AnnotationTool {
955
954
 
956
955
  const area = Math.abs(worldWidth * worldHeight) / (scale * scale);
957
956
 
958
- let count = 0;
959
- let mean = 0;
960
- let stdDev = 0;
961
- let max = -Infinity;
962
-
963
- const yMultiple = dimensions[0];
964
- const zMultiple = dimensions[0] * dimensions[1];
965
-
966
- //Todo: this can be replaced by pointInShapeCallback....
967
- // This is a triple loop, but one of these 3 values will be constant
968
- // In the planar view.
969
- for (let k = kMin; k <= kMax; k++) {
970
- for (let j = jMin; j <= jMax; j++) {
971
- for (let i = iMin; i <= iMax; i++) {
972
- const value = scalarData[k * zMultiple + j * yMultiple + i];
973
-
974
- if (value > max) {
975
- max = value;
976
- }
977
-
978
- count++;
979
- mean += value;
980
- }
981
- }
982
- }
983
-
984
- mean /= count;
985
-
986
- for (let k = kMin; k <= kMax; k++) {
987
- for (let j = jMin; j <= jMax; j++) {
988
- for (let i = iMin; i <= iMax; i++) {
989
- const value = scalarData[k * zMultiple + j * yMultiple + i];
990
-
991
- const valueMinusMean = value - mean;
992
-
993
- stdDev += valueMinusMean * valueMinusMean;
994
- }
995
- }
996
- }
997
-
998
- stdDev /= count;
999
- stdDev = Math.sqrt(stdDev);
1000
-
1001
957
  const modalityUnit = getModalityUnit(
1002
958
  metadata.Modality,
1003
959
  annotation.metadata.referencedImageId,
1004
960
  modalityUnitOptions
1005
961
  );
1006
962
 
963
+ const pointsInShape = pointInShapeCallback(
964
+ imageData,
965
+ () => true,
966
+ this.configuration.statsCalculator.statsCallback,
967
+ boundsIJK
968
+ );
969
+
970
+ const stats = this.configuration.statsCalculator.getStatistics();
971
+
1007
972
  cachedStats[targetId] = {
1008
973
  Modality: metadata.Modality,
1009
974
  area,
1010
- mean,
1011
- stdDev,
1012
- max,
975
+ mean: stats[1]?.value,
976
+ stdDev: stats[2]?.value,
977
+ max: stats[0]?.value,
978
+ statsArray: stats,
979
+ pointsInShape: pointsInShape,
1013
980
  areaUnit: getCalibratedAreaUnits(null, image),
1014
981
  modalityUnit,
1015
982
  };
@@ -1044,5 +1011,30 @@ class RectangleROITool extends AnnotationTool {
1044
1011
  };
1045
1012
  }
1046
1013
 
1014
+ /**
1015
+ * _getTextLines - Returns the Area, mean and std deviation of the area of the
1016
+ * target volume enclosed by the rectangle.
1017
+ *
1018
+ * @param data - The annotation tool-specific data.
1019
+ * @param targetId - The volumeId of the volume to display the stats for.
1020
+ */
1021
+ function defaultGetTextLines(data, targetId: string): string[] {
1022
+ const cachedVolumeStats = data.cachedStats[targetId];
1023
+ const { area, mean, max, stdDev, areaUnit, modalityUnit } = cachedVolumeStats;
1024
+
1025
+ if (mean === undefined) {
1026
+ return;
1027
+ }
1028
+
1029
+ const textLines: string[] = [];
1030
+
1031
+ textLines.push(`Area: ${roundNumber(area)} ${areaUnit}`);
1032
+ textLines.push(`Mean: ${roundNumber(mean)} ${modalityUnit}`);
1033
+ textLines.push(`Max: ${roundNumber(max)} ${modalityUnit}`);
1034
+ textLines.push(`Std Dev: ${roundNumber(stdDev)} ${modalityUnit}`);
1035
+
1036
+ return textLines;
1037
+ }
1038
+
1047
1039
  RectangleROITool.toolName = 'RectangleROI';
1048
1040
  export default RectangleROITool;
@@ -18,10 +18,12 @@ import {
18
18
  EventTypes,
19
19
  ToolHandle,
20
20
  InteractionTypes,
21
+ ToolProps,
22
+ PublicToolProps,
21
23
  } from '../../types';
22
24
  import { StyleSpecifier } from '../../types/AnnotationStyle';
23
25
 
24
- /**
26
+ /**-q
25
27
  * Abstract class for tools which create and display annotations on the
26
28
  * cornerstone3D canvas. In addition, it provides a base class for segmentation
27
29
  * tools that require drawing an annotation before running the segmentation strategy
@@ -37,6 +39,19 @@ abstract class AnnotationTool extends AnnotationDisplayTool {
37
39
  // Abstract Methods - Must be implemented.
38
40
  // ===================================================================
39
41
 
42
+ constructor(toolProps: PublicToolProps, defaultToolProps: ToolProps) {
43
+ super(toolProps, defaultToolProps);
44
+
45
+ if (toolProps.configuration?.getTextLines) {
46
+ this.configuration.getTextLines = toolProps.configuration.getTextLines;
47
+ }
48
+
49
+ if (toolProps.configuration?.statsCalculator) {
50
+ this.configuration.statsCalculator =
51
+ toolProps.configuration.statsCalculator;
52
+ }
53
+ }
54
+
40
55
  /**
41
56
  * @abstract addNewAnnotation Creates a new annotation based on the clicked mouse position
42
57
  *
@@ -185,24 +200,26 @@ abstract class AnnotationTool extends AnnotationDisplayTool {
185
200
 
186
201
  const { data } = annotation;
187
202
  const { points, textBox } = data.handles;
188
- const { worldBoundingBox } = textBox;
189
203
 
190
- if (worldBoundingBox) {
191
- const canvasBoundingBox = {
192
- topLeft: viewport.worldToCanvas(worldBoundingBox.topLeft),
193
- topRight: viewport.worldToCanvas(worldBoundingBox.topRight),
194
- bottomLeft: viewport.worldToCanvas(worldBoundingBox.bottomLeft),
195
- bottomRight: viewport.worldToCanvas(worldBoundingBox.bottomRight),
196
- };
204
+ if (textBox) {
205
+ const { worldBoundingBox } = textBox;
206
+ if (worldBoundingBox) {
207
+ const canvasBoundingBox = {
208
+ topLeft: viewport.worldToCanvas(worldBoundingBox.topLeft),
209
+ topRight: viewport.worldToCanvas(worldBoundingBox.topRight),
210
+ bottomLeft: viewport.worldToCanvas(worldBoundingBox.bottomLeft),
211
+ bottomRight: viewport.worldToCanvas(worldBoundingBox.bottomRight),
212
+ };
197
213
 
198
- if (
199
- canvasCoords[0] >= canvasBoundingBox.topLeft[0] &&
200
- canvasCoords[0] <= canvasBoundingBox.bottomRight[0] &&
201
- canvasCoords[1] >= canvasBoundingBox.topLeft[1] &&
202
- canvasCoords[1] <= canvasBoundingBox.bottomRight[1]
203
- ) {
204
- data.handles.activeHandleIndex = null;
205
- return textBox;
214
+ if (
215
+ canvasCoords[0] >= canvasBoundingBox.topLeft[0] &&
216
+ canvasCoords[0] <= canvasBoundingBox.bottomRight[0] &&
217
+ canvasCoords[1] >= canvasBoundingBox.topLeft[1] &&
218
+ canvasCoords[1] <= canvasBoundingBox.bottomRight[1]
219
+ ) {
220
+ data.handles.activeHandleIndex = null;
221
+ return textBox;
222
+ }
206
223
  }
207
224
  }
208
225
 
@@ -240,6 +257,11 @@ abstract class AnnotationTool extends AnnotationDisplayTool {
240
257
  // for the textBox.
241
258
 
242
259
  return {
260
+ visibility: this.getStyle(
261
+ 'textBoxVisibility',
262
+ specifications,
263
+ annotation
264
+ ),
243
265
  fontFamily: this.getStyle(
244
266
  'textBoxFontFamily',
245
267
  specifications,
@@ -1,4 +1,5 @@
1
1
  import BaseTool from './BaseTool';
2
2
  import AnnotationTool from './AnnotationTool';
3
+ import AnnotationDisplayTool from './AnnotationDisplayTool';
3
4
 
4
- export { BaseTool, AnnotationTool };
5
+ export { BaseTool, AnnotationTool, AnnotationDisplayTool };
@@ -276,6 +276,9 @@ function _setLabelmapColorAndOpacity(
276
276
  isActiveLabelmap
277
277
  );
278
278
 
279
+ // Todo: the below loop probably can be optimized so that we don't hit it
280
+ // unless a config has changed. Right now we get into the following loop
281
+ // even for brush drawing which does not makes sense
279
282
  for (let i = 0; i < numColors; i++) {
280
283
  const segmentIndex = i;
281
284
  const segmentColor = colorLUT[segmentIndex];