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

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 (396) hide show
  1. package/dist/cjs/drawingSvg/getSvgDrawingHelper.js +1 -1
  2. package/dist/cjs/drawingSvg/getSvgDrawingHelper.js.map +1 -1
  3. package/dist/cjs/enums/Events.d.ts +1 -0
  4. package/dist/cjs/enums/Events.js +1 -0
  5. package/dist/cjs/enums/Events.js.map +1 -1
  6. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDown.js +6 -1
  7. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDown.js.map +1 -1
  8. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.d.ts +2 -0
  9. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js +41 -0
  10. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js.map +1 -0
  11. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.d.ts +3 -0
  12. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js +39 -0
  13. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -0
  14. package/dist/cjs/eventDispatchers/shared/getToolsWithModesForMouseEvent.d.ts +1 -1
  15. package/dist/cjs/eventDispatchers/shared/getToolsWithModesForTouchEvent.d.ts +1 -1
  16. package/dist/cjs/eventListeners/keyboard/keyDownListener.js +1 -2
  17. package/dist/cjs/eventListeners/keyboard/keyDownListener.js.map +1 -1
  18. package/dist/cjs/eventListeners/mouse/mouseDownListener.js +5 -1
  19. package/dist/cjs/eventListeners/mouse/mouseDownListener.js.map +1 -1
  20. package/dist/cjs/eventListeners/mouse/mouseMoveListener.js +5 -1
  21. package/dist/cjs/eventListeners/mouse/mouseMoveListener.js.map +1 -1
  22. package/dist/cjs/index.d.ts +2 -2
  23. package/dist/cjs/index.js +5 -2
  24. package/dist/cjs/index.js.map +1 -1
  25. package/dist/cjs/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js +4 -8
  26. package/dist/cjs/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js.map +1 -1
  27. package/dist/cjs/stateManagement/segmentation/SegmentationStateManager.js +2 -3
  28. package/dist/cjs/stateManagement/segmentation/SegmentationStateManager.js.map +1 -1
  29. package/dist/cjs/stateManagement/segmentation/addSegmentationRepresentations.js.map +1 -1
  30. package/dist/cjs/stateManagement/segmentation/addSegmentations.js +1 -5
  31. package/dist/cjs/stateManagement/segmentation/addSegmentations.js.map +1 -1
  32. package/dist/cjs/store/ToolGroupManager/ToolGroup.d.ts +2 -0
  33. package/dist/cjs/store/ToolGroupManager/ToolGroup.js +36 -2
  34. package/dist/cjs/store/ToolGroupManager/ToolGroup.js.map +1 -1
  35. package/dist/cjs/store/state.js +1 -5
  36. package/dist/cjs/store/state.js.map +1 -1
  37. package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js +1 -1
  38. package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
  39. package/dist/cjs/synchronizers/synchronizers/createVOISynchronizer.d.ts +1 -1
  40. package/dist/cjs/tools/AdvancedMagnifyTool.d.ts +36 -0
  41. package/dist/cjs/tools/AdvancedMagnifyTool.js +448 -0
  42. package/dist/cjs/tools/AdvancedMagnifyTool.js.map +1 -0
  43. package/dist/cjs/tools/AdvancedMagnifyViewport.d.ts +76 -0
  44. package/dist/cjs/tools/AdvancedMagnifyViewport.js +352 -0
  45. package/dist/cjs/tools/AdvancedMagnifyViewport.js.map +1 -0
  46. package/dist/cjs/tools/AdvancedMagnifyViewportManager.d.ts +36 -0
  47. package/dist/cjs/tools/AdvancedMagnifyViewportManager.js +133 -0
  48. package/dist/cjs/tools/AdvancedMagnifyViewportManager.js.map +1 -0
  49. package/dist/cjs/tools/MagnifyTool.js +2 -2
  50. package/dist/cjs/tools/MagnifyTool.js.map +1 -1
  51. package/dist/cjs/tools/OrientationMarkerTool.d.ts +88 -0
  52. package/dist/cjs/tools/OrientationMarkerTool.js +193 -0
  53. package/dist/cjs/tools/OrientationMarkerTool.js.map +1 -0
  54. package/dist/cjs/tools/OverlayGridTool.d.ts +31 -0
  55. package/dist/cjs/tools/OverlayGridTool.js +170 -0
  56. package/dist/cjs/tools/OverlayGridTool.js.map +1 -0
  57. package/dist/cjs/tools/ReferenceLinesTool.d.ts +3 -0
  58. package/dist/cjs/tools/ReferenceLinesTool.js +71 -2
  59. package/dist/cjs/tools/ReferenceLinesTool.js.map +1 -1
  60. package/dist/cjs/tools/annotation/AngleTool.js +2 -1
  61. package/dist/cjs/tools/annotation/AngleTool.js.map +1 -1
  62. package/dist/cjs/tools/annotation/BidirectionalTool.js +1 -1
  63. package/dist/cjs/tools/annotation/BidirectionalTool.js.map +1 -1
  64. package/dist/cjs/tools/annotation/CircleROITool.d.ts +1 -2
  65. package/dist/cjs/tools/annotation/CircleROITool.js +8 -8
  66. package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -1
  67. package/dist/cjs/tools/annotation/CobbAngleTool.d.ts +31 -5
  68. package/dist/cjs/tools/annotation/CobbAngleTool.js +268 -71
  69. package/dist/cjs/tools/annotation/CobbAngleTool.js.map +1 -1
  70. package/dist/cjs/tools/annotation/DragProbeTool.js +4 -3
  71. package/dist/cjs/tools/annotation/DragProbeTool.js.map +1 -1
  72. package/dist/cjs/tools/annotation/EllipticalROITool.d.ts +2 -3
  73. package/dist/cjs/tools/annotation/EllipticalROITool.js +20 -16
  74. package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
  75. package/dist/cjs/tools/annotation/LengthTool.js +1 -1
  76. package/dist/cjs/tools/annotation/LengthTool.js.map +1 -1
  77. package/dist/cjs/tools/annotation/PlanarFreehandROITool.d.ts +1 -2
  78. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js +22 -9
  79. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  80. package/dist/cjs/tools/annotation/ProbeTool.d.ts +1 -2
  81. package/dist/cjs/tools/annotation/ProbeTool.js +10 -9
  82. package/dist/cjs/tools/annotation/ProbeTool.js.map +1 -1
  83. package/dist/cjs/tools/annotation/RectangleROITool.d.ts +1 -1
  84. package/dist/cjs/tools/annotation/RectangleROITool.js +9 -9
  85. package/dist/cjs/tools/annotation/RectangleROITool.js.map +1 -1
  86. package/dist/cjs/tools/base/AnnotationDisplayTool.js +4 -0
  87. package/dist/cjs/tools/base/AnnotationDisplayTool.js.map +1 -1
  88. package/dist/cjs/tools/base/AnnotationTool.d.ts +1 -1
  89. package/dist/cjs/tools/base/AnnotationTool.js.map +1 -1
  90. package/dist/cjs/tools/displayTools/Contour/contourConfigCache.d.ts +1 -1
  91. package/dist/cjs/tools/displayTools/Contour/contourDisplay.js +3 -0
  92. package/dist/cjs/tools/displayTools/Contour/contourDisplay.js.map +1 -1
  93. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js +1 -1
  94. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  95. package/dist/cjs/tools/index.d.ts +4 -1
  96. package/dist/cjs/tools/index.js +7 -1
  97. package/dist/cjs/tools/index.js.map +1 -1
  98. package/dist/cjs/tools/segmentation/strategies/eraseCircle.d.ts +1 -1
  99. package/dist/cjs/tools/segmentation/strategies/eraseRectangle.d.ts +1 -1
  100. package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +1 -1
  101. package/dist/cjs/tools/segmentation/strategies/fillCircle.d.ts +1 -1
  102. package/dist/cjs/tools/segmentation/strategies/fillRectangle.d.ts +1 -1
  103. package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +1 -1
  104. package/dist/cjs/types/AnnotationGroupSelector.d.ts +1 -1
  105. package/dist/cjs/types/AnnotationStyle.d.ts +7 -7
  106. package/dist/cjs/types/AnnotationTypes.d.ts +4 -4
  107. package/dist/cjs/types/BoundsIJK.d.ts +1 -1
  108. package/dist/cjs/types/CINETypes.d.ts +2 -2
  109. package/dist/cjs/types/CalculatorTypes.d.ts +1 -1
  110. package/dist/cjs/types/ContourTypes.d.ts +3 -3
  111. package/dist/cjs/types/CursorTypes.d.ts +2 -2
  112. package/dist/cjs/types/EventTypes.d.ts +88 -80
  113. package/dist/cjs/types/FloodFillTypes.d.ts +5 -5
  114. package/dist/cjs/types/IDistance.d.ts +1 -1
  115. package/dist/cjs/types/IPoints.d.ts +1 -1
  116. package/dist/cjs/types/ISetToolModeOptions.d.ts +5 -5
  117. package/dist/cjs/types/IToolClassReference.d.ts +1 -1
  118. package/dist/cjs/types/IToolGroup.d.ts +3 -0
  119. package/dist/cjs/types/ITouchPoints.d.ts +1 -1
  120. package/dist/cjs/types/InteractionTypes.d.ts +1 -1
  121. package/dist/cjs/types/InternalToolTypes.d.ts +3 -3
  122. package/dist/cjs/types/JumpToSliceOptions.d.ts +1 -1
  123. package/dist/cjs/types/LabelmapTypes.d.ts +3 -3
  124. package/dist/cjs/types/PlanarBoundingBox.d.ts +1 -1
  125. package/dist/cjs/types/SVGDrawingHelper.d.ts +1 -1
  126. package/dist/cjs/types/ScrollOptions.d.ts +1 -1
  127. package/dist/cjs/types/SegmentationStateTypes.d.ts +15 -15
  128. package/dist/cjs/types/ToolAction.d.ts +8 -0
  129. package/dist/cjs/types/ToolAction.js +3 -0
  130. package/dist/cjs/types/ToolAction.js.map +1 -0
  131. package/dist/cjs/types/ToolHandle.d.ts +3 -3
  132. package/dist/cjs/types/ToolProps.d.ts +4 -4
  133. package/dist/cjs/types/ToolSpecificAnnotationTypes.d.ts +55 -0
  134. package/dist/cjs/types/index.d.ts +2 -1
  135. package/dist/cjs/utilities/getModalityUnit.d.ts +1 -1
  136. package/dist/cjs/utilities/getModalityUnit.js +5 -2
  137. package/dist/cjs/utilities/getModalityUnit.js.map +1 -1
  138. package/dist/cjs/utilities/getToolsWithModesForElement.d.ts +1 -1
  139. package/dist/cjs/utilities/index.d.ts +2 -2
  140. package/dist/cjs/utilities/index.js +4 -3
  141. package/dist/cjs/utilities/index.js.map +1 -1
  142. package/dist/cjs/utilities/math/angle/angleBetweenLines.d.ts +3 -1
  143. package/dist/cjs/utilities/math/angle/angleBetweenLines.js +18 -1
  144. package/dist/cjs/utilities/math/angle/angleBetweenLines.js.map +1 -1
  145. package/dist/cjs/utilities/math/basic/BasicStatsCalculator.js.map +1 -1
  146. package/dist/cjs/utilities/math/circle/_types.d.ts +1 -1
  147. package/dist/cjs/utilities/math/ellipse/getCanvasEllipseCorners.d.ts +1 -1
  148. package/dist/cjs/utilities/math/ellipse/pointInEllipse.d.ts +1 -1
  149. package/dist/cjs/utilities/math/ellipse/pointInEllipsoidWithConstraint.d.ts +1 -1
  150. package/dist/cjs/utilities/math/polyline/planarFreehandROIInternalTypes.d.ts +3 -3
  151. package/dist/cjs/utilities/math/sphere/pointInSphere.d.ts +1 -1
  152. package/dist/cjs/utilities/pointInShapeCallback.d.ts +3 -3
  153. package/dist/cjs/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.d.ts +1 -1
  154. package/dist/cjs/utilities/segmentation/createLabelmapVolumeForViewport.d.ts +8 -8
  155. package/dist/cjs/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -2
  156. package/dist/cjs/utilities/segmentation/createLabelmapVolumeForViewport.js.map +1 -1
  157. package/dist/cjs/utilities/segmentation/rectangleROIThresholdVolumeByRange.d.ts +2 -2
  158. package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.d.ts +1 -1
  159. package/dist/cjs/utilities/segmentation/utilities.d.ts +1 -1
  160. package/dist/cjs/utilities/stackPrefetch/index.d.ts +3 -2
  161. package/dist/cjs/utilities/stackPrefetch/index.js +8 -6
  162. package/dist/cjs/utilities/stackPrefetch/index.js.map +1 -1
  163. package/dist/cjs/utilities/stackPrefetch/stackContextPrefetch.d.ts +16 -0
  164. package/dist/cjs/utilities/stackPrefetch/stackContextPrefetch.js +227 -0
  165. package/dist/cjs/utilities/stackPrefetch/stackContextPrefetch.js.map +1 -0
  166. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.d.ts +7 -1
  167. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js +23 -93
  168. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
  169. package/dist/cjs/utilities/stackPrefetch/stackPrefetchUtils.d.ts +14 -0
  170. package/dist/cjs/utilities/stackPrefetch/stackPrefetchUtils.js +85 -0
  171. package/dist/cjs/utilities/stackPrefetch/stackPrefetchUtils.js.map +1 -0
  172. package/dist/esm/drawingSvg/getSvgDrawingHelper.js +1 -1
  173. package/dist/esm/drawingSvg/getSvgDrawingHelper.js.map +1 -1
  174. package/dist/esm/enums/Events.d.ts +1 -0
  175. package/dist/esm/enums/Events.js +1 -0
  176. package/dist/esm/enums/Events.js.map +1 -1
  177. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDown.js +6 -1
  178. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDown.js.map +1 -1
  179. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.d.ts +2 -0
  180. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js +35 -0
  181. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js.map +1 -0
  182. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.d.ts +3 -0
  183. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js +32 -0
  184. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -0
  185. package/dist/esm/eventDispatchers/shared/getToolsWithModesForMouseEvent.d.ts +1 -1
  186. package/dist/esm/eventDispatchers/shared/getToolsWithModesForTouchEvent.d.ts +1 -1
  187. package/dist/esm/eventListeners/keyboard/keyDownListener.js +1 -2
  188. package/dist/esm/eventListeners/keyboard/keyDownListener.js.map +1 -1
  189. package/dist/esm/eventListeners/mouse/mouseDownListener.js +5 -1
  190. package/dist/esm/eventListeners/mouse/mouseDownListener.js.map +1 -1
  191. package/dist/esm/eventListeners/mouse/mouseMoveListener.js +5 -1
  192. package/dist/esm/eventListeners/mouse/mouseMoveListener.js.map +1 -1
  193. package/dist/esm/index.d.ts +2 -2
  194. package/dist/esm/index.js +2 -2
  195. package/dist/esm/index.js.map +1 -1
  196. package/dist/esm/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js +4 -5
  197. package/dist/esm/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js.map +1 -1
  198. package/dist/esm/stateManagement/segmentation/SegmentationStateManager.js +2 -3
  199. package/dist/esm/stateManagement/segmentation/SegmentationStateManager.js.map +1 -1
  200. package/dist/esm/stateManagement/segmentation/addSegmentationRepresentations.js.map +1 -1
  201. package/dist/esm/stateManagement/segmentation/addSegmentations.js +1 -2
  202. package/dist/esm/stateManagement/segmentation/addSegmentations.js.map +1 -1
  203. package/dist/esm/store/ToolGroupManager/ToolGroup.d.ts +2 -0
  204. package/dist/esm/store/ToolGroupManager/ToolGroup.js +36 -3
  205. package/dist/esm/store/ToolGroupManager/ToolGroup.js.map +1 -1
  206. package/dist/esm/store/state.js +9 -2
  207. package/dist/esm/store/state.js.map +1 -1
  208. package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js +1 -1
  209. package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
  210. package/dist/esm/synchronizers/synchronizers/createVOISynchronizer.d.ts +1 -1
  211. package/dist/esm/tools/AdvancedMagnifyTool.d.ts +36 -0
  212. package/dist/esm/tools/AdvancedMagnifyTool.js +440 -0
  213. package/dist/esm/tools/AdvancedMagnifyTool.js.map +1 -0
  214. package/dist/esm/tools/AdvancedMagnifyViewport.d.ts +76 -0
  215. package/dist/esm/tools/AdvancedMagnifyViewport.js +346 -0
  216. package/dist/esm/tools/AdvancedMagnifyViewport.js.map +1 -0
  217. package/dist/esm/tools/AdvancedMagnifyViewportManager.d.ts +36 -0
  218. package/dist/esm/tools/AdvancedMagnifyViewportManager.js +128 -0
  219. package/dist/esm/tools/AdvancedMagnifyViewportManager.js.map +1 -0
  220. package/dist/esm/tools/MagnifyTool.js +2 -2
  221. package/dist/esm/tools/MagnifyTool.js.map +1 -1
  222. package/dist/esm/tools/OrientationMarkerTool.d.ts +88 -0
  223. package/dist/esm/tools/OrientationMarkerTool.js +185 -0
  224. package/dist/esm/tools/OrientationMarkerTool.js.map +1 -0
  225. package/dist/esm/tools/OverlayGridTool.d.ts +31 -0
  226. package/dist/esm/tools/OverlayGridTool.js +165 -0
  227. package/dist/esm/tools/OverlayGridTool.js.map +1 -0
  228. package/dist/esm/tools/ReferenceLinesTool.d.ts +3 -0
  229. package/dist/esm/tools/ReferenceLinesTool.js +71 -2
  230. package/dist/esm/tools/ReferenceLinesTool.js.map +1 -1
  231. package/dist/esm/tools/annotation/AngleTool.js +2 -1
  232. package/dist/esm/tools/annotation/AngleTool.js.map +1 -1
  233. package/dist/esm/tools/annotation/BidirectionalTool.js +1 -1
  234. package/dist/esm/tools/annotation/BidirectionalTool.js.map +1 -1
  235. package/dist/esm/tools/annotation/CircleROITool.d.ts +1 -2
  236. package/dist/esm/tools/annotation/CircleROITool.js +8 -8
  237. package/dist/esm/tools/annotation/CircleROITool.js.map +1 -1
  238. package/dist/esm/tools/annotation/CobbAngleTool.d.ts +31 -5
  239. package/dist/esm/tools/annotation/CobbAngleTool.js +275 -72
  240. package/dist/esm/tools/annotation/CobbAngleTool.js.map +1 -1
  241. package/dist/esm/tools/annotation/DragProbeTool.js +4 -3
  242. package/dist/esm/tools/annotation/DragProbeTool.js.map +1 -1
  243. package/dist/esm/tools/annotation/EllipticalROITool.d.ts +2 -3
  244. package/dist/esm/tools/annotation/EllipticalROITool.js +20 -16
  245. package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
  246. package/dist/esm/tools/annotation/LengthTool.js +1 -1
  247. package/dist/esm/tools/annotation/LengthTool.js.map +1 -1
  248. package/dist/esm/tools/annotation/PlanarFreehandROITool.d.ts +1 -2
  249. package/dist/esm/tools/annotation/PlanarFreehandROITool.js +22 -9
  250. package/dist/esm/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  251. package/dist/esm/tools/annotation/ProbeTool.d.ts +1 -2
  252. package/dist/esm/tools/annotation/ProbeTool.js +10 -9
  253. package/dist/esm/tools/annotation/ProbeTool.js.map +1 -1
  254. package/dist/esm/tools/annotation/RectangleROITool.d.ts +1 -1
  255. package/dist/esm/tools/annotation/RectangleROITool.js +9 -9
  256. package/dist/esm/tools/annotation/RectangleROITool.js.map +1 -1
  257. package/dist/esm/tools/base/AnnotationDisplayTool.js +3 -0
  258. package/dist/esm/tools/base/AnnotationDisplayTool.js.map +1 -1
  259. package/dist/esm/tools/base/AnnotationTool.d.ts +1 -1
  260. package/dist/esm/tools/base/AnnotationTool.js.map +1 -1
  261. package/dist/esm/tools/displayTools/Contour/contourConfigCache.d.ts +1 -1
  262. package/dist/esm/tools/displayTools/Contour/contourDisplay.js +4 -1
  263. package/dist/esm/tools/displayTools/Contour/contourDisplay.js.map +1 -1
  264. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +1 -1
  265. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  266. package/dist/esm/tools/index.d.ts +4 -1
  267. package/dist/esm/tools/index.js +4 -1
  268. package/dist/esm/tools/index.js.map +1 -1
  269. package/dist/esm/tools/segmentation/strategies/eraseCircle.d.ts +1 -1
  270. package/dist/esm/tools/segmentation/strategies/eraseRectangle.d.ts +1 -1
  271. package/dist/esm/tools/segmentation/strategies/eraseSphere.d.ts +1 -1
  272. package/dist/esm/tools/segmentation/strategies/fillCircle.d.ts +1 -1
  273. package/dist/esm/tools/segmentation/strategies/fillRectangle.d.ts +1 -1
  274. package/dist/esm/tools/segmentation/strategies/fillSphere.d.ts +1 -1
  275. package/dist/esm/types/AnnotationGroupSelector.d.ts +1 -1
  276. package/dist/esm/types/AnnotationStyle.d.ts +7 -7
  277. package/dist/esm/types/AnnotationTypes.d.ts +4 -4
  278. package/dist/esm/types/BoundsIJK.d.ts +1 -1
  279. package/dist/esm/types/CINETypes.d.ts +2 -2
  280. package/dist/esm/types/CalculatorTypes.d.ts +1 -1
  281. package/dist/esm/types/ContourTypes.d.ts +3 -3
  282. package/dist/esm/types/CursorTypes.d.ts +2 -2
  283. package/dist/esm/types/EventTypes.d.ts +88 -80
  284. package/dist/esm/types/FloodFillTypes.d.ts +5 -5
  285. package/dist/esm/types/IDistance.d.ts +1 -1
  286. package/dist/esm/types/IPoints.d.ts +1 -1
  287. package/dist/esm/types/ISetToolModeOptions.d.ts +5 -5
  288. package/dist/esm/types/IToolClassReference.d.ts +1 -1
  289. package/dist/esm/types/IToolGroup.d.ts +3 -0
  290. package/dist/esm/types/ITouchPoints.d.ts +1 -1
  291. package/dist/esm/types/InteractionTypes.d.ts +1 -1
  292. package/dist/esm/types/InternalToolTypes.d.ts +3 -3
  293. package/dist/esm/types/JumpToSliceOptions.d.ts +1 -1
  294. package/dist/esm/types/LabelmapTypes.d.ts +3 -3
  295. package/dist/esm/types/PlanarBoundingBox.d.ts +1 -1
  296. package/dist/esm/types/SVGDrawingHelper.d.ts +1 -1
  297. package/dist/esm/types/ScrollOptions.d.ts +1 -1
  298. package/dist/esm/types/SegmentationStateTypes.d.ts +15 -15
  299. package/dist/esm/types/ToolAction.d.ts +8 -0
  300. package/dist/esm/types/ToolAction.js +2 -0
  301. package/dist/esm/types/ToolAction.js.map +1 -0
  302. package/dist/esm/types/ToolHandle.d.ts +3 -3
  303. package/dist/esm/types/ToolProps.d.ts +4 -4
  304. package/dist/esm/types/ToolSpecificAnnotationTypes.d.ts +55 -0
  305. package/dist/esm/types/index.d.ts +2 -1
  306. package/dist/esm/utilities/getModalityUnit.d.ts +1 -1
  307. package/dist/esm/utilities/getModalityUnit.js +5 -2
  308. package/dist/esm/utilities/getModalityUnit.js.map +1 -1
  309. package/dist/esm/utilities/getToolsWithModesForElement.d.ts +1 -1
  310. package/dist/esm/utilities/index.d.ts +2 -2
  311. package/dist/esm/utilities/index.js +2 -2
  312. package/dist/esm/utilities/index.js.map +1 -1
  313. package/dist/esm/utilities/math/angle/angleBetweenLines.d.ts +3 -1
  314. package/dist/esm/utilities/math/angle/angleBetweenLines.js +19 -2
  315. package/dist/esm/utilities/math/angle/angleBetweenLines.js.map +1 -1
  316. package/dist/esm/utilities/math/basic/BasicStatsCalculator.js.map +1 -1
  317. package/dist/esm/utilities/math/circle/_types.d.ts +1 -1
  318. package/dist/esm/utilities/math/ellipse/getCanvasEllipseCorners.d.ts +1 -1
  319. package/dist/esm/utilities/math/ellipse/pointInEllipse.d.ts +1 -1
  320. package/dist/esm/utilities/math/ellipse/pointInEllipsoidWithConstraint.d.ts +1 -1
  321. package/dist/esm/utilities/math/polyline/planarFreehandROIInternalTypes.d.ts +3 -3
  322. package/dist/esm/utilities/math/sphere/pointInSphere.d.ts +1 -1
  323. package/dist/esm/utilities/pointInShapeCallback.d.ts +3 -3
  324. package/dist/esm/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.d.ts +1 -1
  325. package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.d.ts +8 -8
  326. package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -2
  327. package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js.map +1 -1
  328. package/dist/esm/utilities/segmentation/rectangleROIThresholdVolumeByRange.d.ts +2 -2
  329. package/dist/esm/utilities/segmentation/thresholdVolumeByRange.d.ts +1 -1
  330. package/dist/esm/utilities/segmentation/utilities.d.ts +1 -1
  331. package/dist/esm/utilities/stackPrefetch/index.d.ts +3 -2
  332. package/dist/esm/utilities/stackPrefetch/index.js +3 -2
  333. package/dist/esm/utilities/stackPrefetch/index.js.map +1 -1
  334. package/dist/esm/utilities/stackPrefetch/stackContextPrefetch.d.ts +16 -0
  335. package/dist/esm/utilities/stackPrefetch/stackContextPrefetch.js +220 -0
  336. package/dist/esm/utilities/stackPrefetch/stackContextPrefetch.js.map +1 -0
  337. package/dist/esm/utilities/stackPrefetch/stackPrefetch.d.ts +7 -1
  338. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +12 -79
  339. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
  340. package/dist/esm/utilities/stackPrefetch/stackPrefetchUtils.d.ts +14 -0
  341. package/dist/esm/utilities/stackPrefetch/stackPrefetchUtils.js +77 -0
  342. package/dist/esm/utilities/stackPrefetch/stackPrefetchUtils.js.map +1 -0
  343. package/dist/umd/index.js +1 -1
  344. package/dist/umd/index.js.map +1 -1
  345. package/package.json +3 -3
  346. package/src/drawingSvg/getSvgDrawingHelper.ts +4 -1
  347. package/src/enums/Events.ts +9 -0
  348. package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +11 -2
  349. package/src/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.ts +72 -0
  350. package/src/eventDispatchers/shared/getToolsWithActionsForMouseEvent.ts +66 -0
  351. package/src/eventListeners/keyboard/keyDownListener.ts +1 -2
  352. package/src/eventListeners/mouse/mouseDownListener.ts +7 -1
  353. package/src/eventListeners/mouse/mouseMoveListener.ts +7 -1
  354. package/src/index.ts +6 -0
  355. package/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +4 -5
  356. package/src/stateManagement/segmentation/SegmentationStateManager.ts +2 -3
  357. package/src/stateManagement/segmentation/addSegmentationRepresentations.ts +0 -1
  358. package/src/stateManagement/segmentation/addSegmentations.ts +1 -2
  359. package/src/store/ToolGroupManager/ToolGroup.ts +80 -4
  360. package/src/store/state.ts +9 -3
  361. package/src/synchronizers/callbacks/stackImageSyncCallback.ts +1 -1
  362. package/src/tools/AdvancedMagnifyTool.ts +725 -0
  363. package/src/tools/AdvancedMagnifyViewport.ts +624 -0
  364. package/src/tools/AdvancedMagnifyViewportManager.ts +291 -0
  365. package/src/tools/MagnifyTool.ts +2 -2
  366. package/src/tools/OrientationMarkerTool.ts +235 -0
  367. package/src/tools/OverlayGridTool.ts +357 -0
  368. package/src/tools/ReferenceLinesTool.ts +131 -3
  369. package/src/tools/annotation/AngleTool.ts +4 -1
  370. package/src/tools/annotation/BidirectionalTool.ts +1 -1
  371. package/src/tools/annotation/CircleROITool.ts +13 -20
  372. package/src/tools/annotation/CobbAngleTool.ts +422 -99
  373. package/src/tools/annotation/DragProbeTool.ts +6 -13
  374. package/src/tools/annotation/EllipticalROITool.ts +28 -29
  375. package/src/tools/annotation/LengthTool.ts +1 -1
  376. package/src/tools/annotation/PlanarFreehandROITool.ts +35 -20
  377. package/src/tools/annotation/ProbeTool.ts +17 -30
  378. package/src/tools/annotation/RectangleROITool.ts +15 -19
  379. package/src/tools/base/AnnotationDisplayTool.ts +4 -0
  380. package/src/tools/base/AnnotationTool.ts +2 -1
  381. package/src/tools/displayTools/Contour/contourDisplay.ts +8 -0
  382. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +1 -1
  383. package/src/tools/index.ts +6 -0
  384. package/src/types/EventTypes.ts +23 -0
  385. package/src/types/IToolGroup.ts +7 -0
  386. package/src/types/ToolAction.ts +54 -0
  387. package/src/types/ToolSpecificAnnotationTypes.ts +58 -0
  388. package/src/types/index.ts +2 -0
  389. package/src/utilities/getModalityUnit.ts +8 -2
  390. package/src/utilities/index.ts +2 -1
  391. package/src/utilities/math/angle/angleBetweenLines.ts +39 -9
  392. package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +9 -10
  393. package/src/utilities/stackPrefetch/index.ts +3 -7
  394. package/src/utilities/stackPrefetch/stackContextPrefetch.ts +380 -0
  395. package/src/utilities/stackPrefetch/stackPrefetch.ts +29 -151
  396. package/src/utilities/stackPrefetch/stackPrefetchUtils.ts +114 -0
@@ -0,0 +1,725 @@
1
+ import { AnnotationTool } from './base';
2
+
3
+ import {
4
+ getEnabledElement,
5
+ eventTarget,
6
+ triggerEvent,
7
+ utilities as csUtils,
8
+ } from '@cornerstonejs/core';
9
+ import type { Types } from '@cornerstonejs/core';
10
+
11
+ import {
12
+ addAnnotation,
13
+ getAnnotations,
14
+ } from '../stateManagement/annotation/annotationState';
15
+ import { isAnnotationLocked } from '../stateManagement/annotation/annotationLocking';
16
+ import { isAnnotationVisible } from '../stateManagement/annotation/annotationVisibility';
17
+ import {
18
+ drawCircle as drawCircleSvg,
19
+ drawHandles as drawHandlesSvg,
20
+ } from '../drawingSvg';
21
+ import { state } from '../store';
22
+ import { Events, MouseBindings, KeyboardBindings } from '../enums';
23
+ import { getViewportIdsWithToolToRender } from '../utilities/viewportFilters';
24
+ import {
25
+ resetElementCursor,
26
+ hideElementCursor,
27
+ } from '../cursors/elementCursor';
28
+ import {
29
+ EventTypes,
30
+ ToolHandle,
31
+ PublicToolProps,
32
+ ToolProps,
33
+ SVGDrawingHelper,
34
+ } from '../types';
35
+ import { AdvancedMagnifyAnnotation } from '../types/ToolSpecificAnnotationTypes';
36
+
37
+ import { AnnotationCompletedEventDetail } from '../types/EventTypes';
38
+ import triggerAnnotationRenderForViewportIds from '../utilities/triggerAnnotationRenderForViewportIds';
39
+ import { StyleSpecifier } from '../types/AnnotationStyle';
40
+ import { getCanvasCircleRadius } from '../utilities/math/circle';
41
+ import AdvancedMagnifyViewportManager from './AdvancedMagnifyViewportManager';
42
+ import type { AutoPanCallbackData } from './AdvancedMagnifyViewport';
43
+
44
+ class AdvancedMagnifyTool extends AnnotationTool {
45
+ static toolName;
46
+
47
+ magnifyViewportManager: AdvancedMagnifyViewportManager;
48
+ touchDragCallback: any;
49
+ mouseDragCallback: any;
50
+ editData: {
51
+ annotation: any;
52
+ viewportIdsToRender: Array<string>;
53
+ handleIndex?: number;
54
+ newAnnotation?: boolean;
55
+ hasMoved?: boolean;
56
+ } | null;
57
+ isDrawing: boolean;
58
+
59
+ constructor(
60
+ toolProps: PublicToolProps = {},
61
+ defaultToolProps: ToolProps = {
62
+ supportedInteractionTypes: ['Mouse', 'Touch'],
63
+ configuration: {
64
+ shadow: true,
65
+ magnifyingGlass: {
66
+ radius: 125, // px
67
+ zoomFactor: 2.5,
68
+ zoomFactorList: [2.5, 3, 3.5, 4, 4.5, 5],
69
+ autoPan: {
70
+ enabled: true,
71
+ padding: 10, // px
72
+ },
73
+ },
74
+ actions: [
75
+ {
76
+ method: 'showZoomFactorsList',
77
+ bindings: [
78
+ {
79
+ mouseButton: MouseBindings.Secondary,
80
+ modifierKey: KeyboardBindings.Shift,
81
+ },
82
+ ],
83
+ },
84
+ ],
85
+ },
86
+ }
87
+ ) {
88
+ super(toolProps, defaultToolProps);
89
+ this.magnifyViewportManager = AdvancedMagnifyViewportManager.getInstance();
90
+ }
91
+
92
+ /**
93
+ * Based on the current position of the mouse and the current imageId to create
94
+ * a CircleROI Annotation and stores it in the annotationManager
95
+ *
96
+ * @param evt - EventTypes.NormalizedMouseEventType
97
+ * @returns The annotation object.
98
+ *
99
+ */
100
+ addNewAnnotation = (
101
+ evt: EventTypes.InteractionEventType
102
+ ): AdvancedMagnifyAnnotation => {
103
+ const eventDetail = evt.detail;
104
+ const { currentPoints, element } = eventDetail;
105
+ const enabledElement = getEnabledElement(element);
106
+ const { viewport, renderingEngine } = enabledElement;
107
+ const worldPos = currentPoints.world;
108
+ const canvasPos = currentPoints.canvas;
109
+ const { magnifyingGlass: config } = this.configuration;
110
+ const { radius, zoomFactor, autoPan } = config;
111
+
112
+ const worldHandlesPoints = this._getWorldHandlesPoints(
113
+ viewport,
114
+ canvasPos,
115
+ radius
116
+ );
117
+
118
+ const camera = viewport.getCamera();
119
+ const { viewPlaneNormal, viewUp } = camera;
120
+
121
+ const referencedImageId = this.getReferencedImageId(
122
+ viewport,
123
+ worldPos,
124
+ viewPlaneNormal,
125
+ viewUp
126
+ );
127
+
128
+ const annotationUID = csUtils.uuidv4();
129
+ const magnifyViewportId = csUtils.uuidv4();
130
+ const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
131
+
132
+ const annotation: AdvancedMagnifyAnnotation = {
133
+ annotationUID,
134
+ highlighted: true,
135
+ invalidated: true,
136
+ metadata: {
137
+ toolName: this.getToolName(),
138
+ viewPlaneNormal: <Types.Point3>[...viewPlaneNormal],
139
+ viewUp: <Types.Point3>[...viewUp],
140
+ FrameOfReferenceUID,
141
+ referencedImageId,
142
+ },
143
+ data: {
144
+ sourceViewportId: viewport.id,
145
+ magnifyViewportId,
146
+ zoomFactor,
147
+ handles: {
148
+ points: worldHandlesPoints,
149
+ activeHandleIndex: null,
150
+ },
151
+ },
152
+ };
153
+
154
+ this.magnifyViewportManager.createViewport(annotation, {
155
+ magnifyViewportId,
156
+ sourceEnabledElement: enabledElement,
157
+ position: canvasPos,
158
+ radius,
159
+ zoomFactor,
160
+ autoPan: {
161
+ enabled: autoPan.enabled,
162
+ padding: autoPan.padding,
163
+ callback: (data: AutoPanCallbackData) => {
164
+ const annotationPoints = annotation.data.handles.points;
165
+ const { world: worldDelta } = data.delta;
166
+
167
+ for (let i = 0, len = annotationPoints.length; i < len; i++) {
168
+ annotationPoints[i][0] += worldDelta[0];
169
+ annotationPoints[i][1] += worldDelta[1];
170
+ annotationPoints[i][2] += worldDelta[2];
171
+ }
172
+ },
173
+ },
174
+ });
175
+
176
+ addAnnotation(annotation, element);
177
+
178
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
179
+ element,
180
+ this.getToolName()
181
+ );
182
+
183
+ evt.preventDefault();
184
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
185
+
186
+ return annotation;
187
+ };
188
+
189
+ /**
190
+ * It returns if the canvas point is near the provided annotation in the provided
191
+ * element or not. A proximity is passed to the function to determine the
192
+ * proximity of the point to the annotation in number of pixels.
193
+ *
194
+ * @param element - HTML Element
195
+ * @param annotation - Annotation
196
+ * @param canvasCoords - Canvas coordinates
197
+ * @param proximity - Proximity to tool to consider
198
+ * @returns Boolean, whether the canvas point is near tool
199
+ */
200
+ public isPointNearTool = (
201
+ element: HTMLDivElement,
202
+ annotation: AdvancedMagnifyAnnotation,
203
+ canvasCoords: Types.Point2,
204
+ proximity: number
205
+ ): boolean => {
206
+ const enabledElement = getEnabledElement(element);
207
+ const { viewport } = enabledElement;
208
+
209
+ const { data } = annotation;
210
+ const { points } = data.handles;
211
+
212
+ // For some reason Typescript doesn't understand this, so we need to be
213
+ // more specific about the type
214
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p)) as [
215
+ Types.Point2,
216
+ Types.Point2,
217
+ Types.Point2,
218
+ Types.Point2
219
+ ];
220
+
221
+ const canvasTop = canvasCoordinates[0];
222
+ const canvasBottom = canvasCoordinates[2];
223
+ const canvasLeft = canvasCoordinates[3];
224
+ const radius = Math.abs(canvasBottom[1] - canvasTop[1]) * 0.5;
225
+ const center = [
226
+ canvasLeft[0] + radius,
227
+ canvasTop[1] + radius,
228
+ ] as Types.Point2;
229
+ const radiusPoint = getCanvasCircleRadius([center, canvasCoords]);
230
+
231
+ if (Math.abs(radiusPoint - radius) < proximity * 1.5) {
232
+ return true;
233
+ }
234
+
235
+ return false;
236
+ };
237
+
238
+ toolSelectedCallback = (
239
+ evt: EventTypes.InteractionEventType,
240
+ annotation: AdvancedMagnifyAnnotation
241
+ ): void => {
242
+ const eventDetail = evt.detail;
243
+ const { element } = eventDetail;
244
+
245
+ annotation.highlighted = true;
246
+
247
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
248
+ element,
249
+ this.getToolName()
250
+ );
251
+
252
+ this.editData = {
253
+ annotation,
254
+ viewportIdsToRender,
255
+ };
256
+
257
+ hideElementCursor(element);
258
+
259
+ this._activateModify(element);
260
+
261
+ const enabledElement = getEnabledElement(element);
262
+ const { renderingEngine } = enabledElement;
263
+
264
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
265
+
266
+ evt.preventDefault();
267
+ };
268
+
269
+ handleSelectedCallback = (
270
+ evt: EventTypes.InteractionEventType,
271
+ annotation: AdvancedMagnifyAnnotation,
272
+ handle: ToolHandle
273
+ ): void => {
274
+ const eventDetail = evt.detail;
275
+ const { element } = eventDetail;
276
+ const { data } = annotation;
277
+
278
+ annotation.highlighted = true;
279
+
280
+ const { points } = data.handles;
281
+ const handleIndex = points.findIndex((p) => p === handle);
282
+
283
+ // Find viewports to render on drag.
284
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
285
+ element,
286
+ this.getToolName()
287
+ );
288
+
289
+ this.editData = {
290
+ annotation,
291
+ viewportIdsToRender,
292
+ handleIndex,
293
+ };
294
+ this._activateModify(element);
295
+
296
+ hideElementCursor(element);
297
+
298
+ const enabledElement = getEnabledElement(element);
299
+ const { renderingEngine } = enabledElement;
300
+
301
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
302
+
303
+ evt.preventDefault();
304
+ };
305
+
306
+ _endCallback = (evt: EventTypes.InteractionEventType): void => {
307
+ const eventDetail = evt.detail;
308
+ const { element } = eventDetail;
309
+
310
+ const { annotation, viewportIdsToRender, newAnnotation } = this.editData;
311
+ const { data } = annotation;
312
+
313
+ data.handles.activeHandleIndex = null;
314
+
315
+ this._deactivateModify(element);
316
+
317
+ resetElementCursor(element);
318
+
319
+ const enabledElement = getEnabledElement(element);
320
+ const { renderingEngine } = enabledElement;
321
+
322
+ this.editData = null;
323
+ this.isDrawing = false;
324
+
325
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
326
+
327
+ if (newAnnotation) {
328
+ const eventType = Events.ANNOTATION_COMPLETED;
329
+
330
+ const eventDetail: AnnotationCompletedEventDetail = {
331
+ annotation,
332
+ };
333
+
334
+ triggerEvent(eventTarget, eventType, eventDetail);
335
+ }
336
+ };
337
+
338
+ _dragDrawCallback = (evt: EventTypes.InteractionEventType): void => {
339
+ this.isDrawing = true;
340
+ const eventDetail = evt.detail;
341
+ const { element, deltaPoints } = eventDetail;
342
+ const worldPosDelta = deltaPoints?.world ?? [0, 0, 0];
343
+ const enabledElement = getEnabledElement(element);
344
+ const { renderingEngine } = enabledElement;
345
+
346
+ const { annotation, viewportIdsToRender } = this.editData;
347
+ const { points } = annotation.data.handles;
348
+
349
+ points.forEach((point) => {
350
+ point[0] += worldPosDelta[0];
351
+ point[1] += worldPosDelta[1];
352
+ point[2] += worldPosDelta[2];
353
+ });
354
+
355
+ annotation.invalidated = true;
356
+ this.editData.hasMoved = true;
357
+
358
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
359
+ };
360
+
361
+ _dragModifyCallback = (evt: EventTypes.InteractionEventType): void => {
362
+ this.isDrawing = true;
363
+ const eventDetail = evt.detail;
364
+ const { element } = eventDetail;
365
+
366
+ const { annotation, viewportIdsToRender, handleIndex } = this.editData;
367
+ const { data } = annotation;
368
+
369
+ if (handleIndex === undefined) {
370
+ // Moving tool
371
+ const { deltaPoints } = eventDetail;
372
+ const worldPosDelta = deltaPoints.world;
373
+
374
+ const points = data.handles.points;
375
+
376
+ points.forEach((point) => {
377
+ point[0] += worldPosDelta[0];
378
+ point[1] += worldPosDelta[1];
379
+ point[2] += worldPosDelta[2];
380
+ });
381
+ annotation.invalidated = true;
382
+ } else {
383
+ this._dragHandle(evt);
384
+ annotation.invalidated = true;
385
+ }
386
+
387
+ const enabledElement = getEnabledElement(element);
388
+ const { renderingEngine } = enabledElement;
389
+
390
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
391
+ };
392
+
393
+ _dragHandle = (evt: EventTypes.InteractionEventType): void => {
394
+ const eventDetail = evt.detail;
395
+ const { element } = eventDetail;
396
+ const enabledElement = getEnabledElement(element);
397
+ const { viewport } = enabledElement;
398
+ const { worldToCanvas } = viewport;
399
+
400
+ const { annotation } = this.editData;
401
+ const { data } = annotation;
402
+ const { points } = data.handles;
403
+
404
+ const canvasCoordinates = points.map((p) => worldToCanvas(p));
405
+ const canvasTop = canvasCoordinates[0];
406
+ const canvasBottom = canvasCoordinates[2];
407
+ const canvasLeft = canvasCoordinates[3];
408
+ const radius = Math.abs(canvasBottom[1] - canvasTop[1]) * 0.5;
409
+ const canvasCenter: Types.Point2 = [
410
+ canvasLeft[0] + radius,
411
+ canvasTop[1] + radius,
412
+ ];
413
+
414
+ const { currentPoints } = eventDetail;
415
+ const currentCanvasPoints = currentPoints.canvas;
416
+
417
+ const newRadius = getCanvasCircleRadius([
418
+ canvasCenter,
419
+ currentCanvasPoints,
420
+ ]);
421
+ const newWorldHandlesPoints = this._getWorldHandlesPoints(
422
+ viewport,
423
+ canvasCenter,
424
+ newRadius
425
+ );
426
+
427
+ points[0] = newWorldHandlesPoints[0];
428
+ points[1] = newWorldHandlesPoints[1];
429
+ points[2] = newWorldHandlesPoints[2];
430
+ points[3] = newWorldHandlesPoints[3];
431
+ };
432
+
433
+ cancel = (element: HTMLDivElement) => {
434
+ // If it is mid-draw or mid-modify
435
+ if (!this.isDrawing) {
436
+ return;
437
+ }
438
+
439
+ this.isDrawing = false;
440
+ this._deactivateModify(element);
441
+ resetElementCursor(element);
442
+
443
+ const { annotation, viewportIdsToRender, newAnnotation } = this.editData;
444
+ const { data } = annotation;
445
+
446
+ annotation.highlighted = false;
447
+ data.handles.activeHandleIndex = null;
448
+
449
+ const enabledElement = getEnabledElement(element);
450
+ const { renderingEngine } = enabledElement;
451
+
452
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
453
+
454
+ if (newAnnotation) {
455
+ const eventType = Events.ANNOTATION_COMPLETED;
456
+
457
+ const eventDetail: AnnotationCompletedEventDetail = {
458
+ annotation,
459
+ };
460
+
461
+ triggerEvent(eventTarget, eventType, eventDetail);
462
+ }
463
+
464
+ this.editData = null;
465
+ return annotation.annotationUID;
466
+ };
467
+
468
+ _activateModify = (element) => {
469
+ state.isInteractingWithTool = true;
470
+
471
+ element.addEventListener(Events.MOUSE_UP, this._endCallback);
472
+ element.addEventListener(Events.MOUSE_DRAG, this._dragModifyCallback);
473
+ element.addEventListener(Events.MOUSE_CLICK, this._endCallback);
474
+
475
+ element.addEventListener(Events.TOUCH_END, this._endCallback);
476
+ element.addEventListener(Events.TOUCH_DRAG, this._dragModifyCallback);
477
+ element.addEventListener(Events.TOUCH_TAP, this._endCallback);
478
+ };
479
+
480
+ _deactivateModify = (element) => {
481
+ state.isInteractingWithTool = false;
482
+
483
+ element.removeEventListener(Events.MOUSE_UP, this._endCallback);
484
+ element.removeEventListener(Events.MOUSE_DRAG, this._dragModifyCallback);
485
+ element.removeEventListener(Events.MOUSE_CLICK, this._endCallback);
486
+
487
+ element.removeEventListener(Events.TOUCH_END, this._endCallback);
488
+ element.removeEventListener(Events.TOUCH_DRAG, this._dragModifyCallback);
489
+ element.removeEventListener(Events.TOUCH_TAP, this._endCallback);
490
+ };
491
+
492
+ /**
493
+ * it is used to draw the circleROI annotation in each
494
+ * request animation frame. It calculates the updated cached statistics if
495
+ * data is invalidated and cache it.
496
+ *
497
+ * @param enabledElement - The Cornerstone's enabledElement.
498
+ * @param svgDrawingHelper - The svgDrawingHelper providing the context for drawing.
499
+ */
500
+ renderAnnotation = (
501
+ enabledElement: Types.IEnabledElement,
502
+ svgDrawingHelper: SVGDrawingHelper
503
+ ): boolean => {
504
+ let renderStatus = false;
505
+ const { viewport } = enabledElement;
506
+ const { element } = viewport;
507
+
508
+ let annotations = getAnnotations(this.getToolName(), element);
509
+
510
+ if (!annotations?.length) {
511
+ return renderStatus;
512
+ }
513
+
514
+ annotations = this.filterInteractableAnnotationsForElement(
515
+ element,
516
+ annotations
517
+ );
518
+
519
+ annotations = annotations?.filter(
520
+ (annotation) =>
521
+ (<AdvancedMagnifyAnnotation>annotation).data.sourceViewportId ===
522
+ viewport.id
523
+ );
524
+
525
+ if (!annotations?.length) {
526
+ return renderStatus;
527
+ }
528
+
529
+ const styleSpecifier: StyleSpecifier = {
530
+ toolGroupId: this.toolGroupId,
531
+ toolName: this.getToolName(),
532
+ viewportId: enabledElement.viewport.id,
533
+ };
534
+
535
+ for (let i = 0; i < annotations.length; i++) {
536
+ const annotation = annotations[i] as AdvancedMagnifyAnnotation;
537
+ const { annotationUID, data } = annotation;
538
+ const { magnifyViewportId, zoomFactor, handles } = data;
539
+ const { points, activeHandleIndex } = handles;
540
+
541
+ styleSpecifier.annotationUID = annotationUID;
542
+
543
+ const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
544
+ const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
545
+ const color = this.getStyle('color', styleSpecifier, annotation);
546
+
547
+ const canvasCoordinates = points.map((p) =>
548
+ viewport.worldToCanvas(p)
549
+ ) as Types.Point2[];
550
+ const canvasTop = canvasCoordinates[0];
551
+ const canvasBottom = canvasCoordinates[2];
552
+ const canvasLeft = canvasCoordinates[3];
553
+ const radius = Math.abs(canvasBottom[1] - canvasTop[1]) * 0.5;
554
+ const center = [
555
+ canvasLeft[0] + radius,
556
+ canvasTop[1] + radius,
557
+ ] as Types.Point2;
558
+
559
+ // If rendering engine has been destroyed while rendering
560
+ if (!viewport.getRenderingEngine()) {
561
+ console.warn('Rendering Engine has been destroyed');
562
+ return renderStatus;
563
+ }
564
+
565
+ let activeHandleCanvasCoords;
566
+
567
+ if (!isAnnotationVisible(annotationUID)) {
568
+ continue;
569
+ }
570
+
571
+ if (
572
+ !isAnnotationLocked(annotation) &&
573
+ !this.editData &&
574
+ activeHandleIndex !== null
575
+ ) {
576
+ // Not locked or creating and hovering over handle, so render handle.
577
+ activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
578
+ }
579
+
580
+ if (activeHandleCanvasCoords) {
581
+ const handleGroupUID = '0';
582
+ drawHandlesSvg(
583
+ svgDrawingHelper,
584
+ annotationUID,
585
+ handleGroupUID,
586
+ activeHandleCanvasCoords,
587
+ {
588
+ color,
589
+ }
590
+ );
591
+ }
592
+
593
+ const dataId = `${annotationUID}-advancedMagnify`;
594
+ const circleUID = '0';
595
+ drawCircleSvg(
596
+ svgDrawingHelper,
597
+ annotationUID,
598
+ circleUID,
599
+ center,
600
+ radius,
601
+ {
602
+ color,
603
+ lineDash,
604
+ lineWidth,
605
+ },
606
+ dataId
607
+ );
608
+
609
+ const magnifyViewport =
610
+ this.magnifyViewportManager.getViewport(magnifyViewportId);
611
+
612
+ magnifyViewport.position = center;
613
+ magnifyViewport.radius = radius;
614
+ magnifyViewport.zoomFactor = zoomFactor;
615
+ magnifyViewport.update();
616
+
617
+ renderStatus = true;
618
+ }
619
+
620
+ return renderStatus;
621
+ };
622
+
623
+ // Basic dropdown component that allows the user to select a different zoom factor.
624
+ // configurations.actions may be changed to use a customized dropdown.
625
+ public showZoomFactorsList(
626
+ evt: EventTypes.InteractionEventType,
627
+ annotation: AdvancedMagnifyAnnotation
628
+ ) {
629
+ const { element, currentPoints } = evt.detail;
630
+ const enabledElement = getEnabledElement(element);
631
+ const { viewport } = enabledElement;
632
+ const { canvas: canvasPoint } = currentPoints;
633
+ const viewportElement = element.querySelector(':scope .viewport-element');
634
+ const currentZoomFactor = annotation.data.zoomFactor;
635
+ const remove = () => dropdown.parentElement.removeChild(dropdown);
636
+
637
+ const dropdown = this._getZoomFactorsListDropdown(
638
+ currentZoomFactor,
639
+ (newZoomFactor) => {
640
+ if (newZoomFactor !== undefined) {
641
+ annotation.data.zoomFactor = Number.parseFloat(newZoomFactor);
642
+ annotation.invalidated = true;
643
+ }
644
+
645
+ remove();
646
+ viewport.render();
647
+ }
648
+ );
649
+
650
+ Object.assign(dropdown.style, {
651
+ left: `${canvasPoint[0]}px`,
652
+ top: `${canvasPoint[1]}px`,
653
+ });
654
+
655
+ viewportElement.appendChild(dropdown);
656
+ dropdown.focus();
657
+ }
658
+
659
+ private _getZoomFactorsListDropdown(currentZoomFactor, onChangeCallback) {
660
+ const { zoomFactorList } = this.configuration.magnifyingGlass;
661
+ const dropdown = document.createElement('select');
662
+
663
+ dropdown.size = 5;
664
+ Object.assign(dropdown.style, {
665
+ width: '50px',
666
+ position: 'absolute',
667
+ });
668
+
669
+ ['mousedown', 'mouseup', 'mousemove', 'click'].forEach((eventName) => {
670
+ dropdown.addEventListener(eventName, (evt) => evt.stopPropagation());
671
+ });
672
+
673
+ dropdown.addEventListener('change', (evt) => {
674
+ evt.stopPropagation();
675
+ onChangeCallback(dropdown.value);
676
+ });
677
+
678
+ dropdown.addEventListener('keydown', (evt) => {
679
+ const shouldCancel =
680
+ (evt.keyCode ?? evt.which === 27) ||
681
+ evt.key?.toLowerCase() === 'escape';
682
+
683
+ if (shouldCancel) {
684
+ evt.stopPropagation();
685
+ onChangeCallback();
686
+ }
687
+ });
688
+
689
+ zoomFactorList.forEach((zoomFactor) => {
690
+ const option = document.createElement('option');
691
+
692
+ option.label = zoomFactor;
693
+ option.title = `Zoom factor ${zoomFactor.toFixed(1)}`;
694
+ option.value = zoomFactor;
695
+ option.defaultSelected = zoomFactor === currentZoomFactor;
696
+
697
+ dropdown.add(option);
698
+ });
699
+
700
+ return dropdown;
701
+ }
702
+
703
+ private _getWorldHandlesPoints = (
704
+ viewport,
705
+ canvasCenterPos,
706
+ canvasRadius
707
+ ): Types.Point3[] => {
708
+ const canvasHandlesPoints = [
709
+ [canvasCenterPos[0], canvasCenterPos[1] - canvasRadius], // top
710
+ [canvasCenterPos[0] + canvasRadius, canvasCenterPos[1]], // right
711
+ [canvasCenterPos[0], canvasCenterPos[1] + canvasRadius], // bottom
712
+ [canvasCenterPos[0] - canvasRadius, canvasCenterPos[1]], // left
713
+ ];
714
+
715
+ const worldHandlesPoints = canvasHandlesPoints.map((p) =>
716
+ viewport.canvasToWorld(p)
717
+ ) as Types.Point3[];
718
+
719
+ return worldHandlesPoints;
720
+ };
721
+ }
722
+
723
+ AdvancedMagnifyTool.toolName = 'AdvancedMagnify';
724
+
725
+ export { AdvancedMagnifyTool as default };