@cornerstonejs/tools 0.56.1 → 0.56.3

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 (360) hide show
  1. package/dist/cjs/tools/CrosshairsTool.d.ts +1 -0
  2. package/dist/cjs/tools/CrosshairsTool.js +4 -1
  3. package/dist/cjs/tools/CrosshairsTool.js.map +1 -1
  4. package/dist/esm/tools/CrosshairsTool.d.ts +1 -0
  5. package/dist/esm/tools/CrosshairsTool.js +4 -1
  6. package/dist/esm/tools/CrosshairsTool.js.map +1 -1
  7. package/dist/umd/index.js +1 -1
  8. package/dist/umd/index.js.map +1 -1
  9. package/package.json +5 -4
  10. package/src/constants/COLOR_LUT.ts +262 -0
  11. package/src/constants/index.ts +3 -0
  12. package/src/cursors/ImageMouseCursor.ts +39 -0
  13. package/src/cursors/MouseCursor.ts +114 -0
  14. package/src/cursors/SVGCursorDescriptor.ts +462 -0
  15. package/src/cursors/SVGMouseCursor.ts +145 -0
  16. package/src/cursors/elementCursor.ts +69 -0
  17. package/src/cursors/index.ts +24 -0
  18. package/src/cursors/setCursorForElement.ts +33 -0
  19. package/src/drawingSvg/_getHash.ts +9 -0
  20. package/src/drawingSvg/_setAttributesIfNecessary.ts +13 -0
  21. package/src/drawingSvg/_setNewAttributesIfValid.ts +10 -0
  22. package/src/drawingSvg/clearByToolType.ts +26 -0
  23. package/src/drawingSvg/draw.ts +16 -0
  24. package/src/drawingSvg/drawArrow.ts +82 -0
  25. package/src/drawingSvg/drawCircle.ts +62 -0
  26. package/src/drawingSvg/drawEllipse.ts +71 -0
  27. package/src/drawingSvg/drawHandles.ts +87 -0
  28. package/src/drawingSvg/drawLine.ts +70 -0
  29. package/src/drawingSvg/drawLink.ts +76 -0
  30. package/src/drawingSvg/drawLinkedTextBox.ts +64 -0
  31. package/src/drawingSvg/drawPolyline.ts +80 -0
  32. package/src/drawingSvg/drawRect.ts +70 -0
  33. package/src/drawingSvg/drawTextBox.ts +213 -0
  34. package/src/drawingSvg/getSvgDrawingHelper.ts +98 -0
  35. package/src/drawingSvg/index.ts +23 -0
  36. package/src/enums/AnnotationStyleStates.ts +22 -0
  37. package/src/enums/Events.ts +242 -0
  38. package/src/enums/SegmentationRepresentations.ts +12 -0
  39. package/src/enums/ToolBindings.ts +37 -0
  40. package/src/enums/ToolModes.ts +31 -0
  41. package/src/enums/Touch.ts +8 -0
  42. package/src/enums/index.js +16 -0
  43. package/src/eventDispatchers/annotationModifiedEventDispatcher.ts +41 -0
  44. package/src/eventDispatchers/cameraModifiedEventDispatcher.ts +41 -0
  45. package/src/eventDispatchers/imageRenderedEventDispatcher.ts +37 -0
  46. package/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts +50 -0
  47. package/src/eventDispatchers/index.js +15 -0
  48. package/src/eventDispatchers/keyboardEventHandlers/index.js +4 -0
  49. package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +29 -0
  50. package/src/eventDispatchers/keyboardEventHandlers/keyUp.ts +33 -0
  51. package/src/eventDispatchers/keyboardToolEventDispatcher.ts +28 -0
  52. package/src/eventDispatchers/mouseEventHandlers/index.js +19 -0
  53. package/src/eventDispatchers/mouseEventHandlers/mouseClick.ts +13 -0
  54. package/src/eventDispatchers/mouseEventHandlers/mouseDoubleClick.ts +13 -0
  55. package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +196 -0
  56. package/src/eventDispatchers/mouseEventHandlers/mouseDownActivate.ts +35 -0
  57. package/src/eventDispatchers/mouseEventHandlers/mouseDrag.ts +25 -0
  58. package/src/eventDispatchers/mouseEventHandlers/mouseMove.ts +70 -0
  59. package/src/eventDispatchers/mouseEventHandlers/mouseUp.ts +9 -0
  60. package/src/eventDispatchers/mouseEventHandlers/mouseWheel.ts +13 -0
  61. package/src/eventDispatchers/mouseToolEventDispatcher.ts +64 -0
  62. package/src/eventDispatchers/shared/customCallbackHandler.ts +73 -0
  63. package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +58 -0
  64. package/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts +61 -0
  65. package/src/eventDispatchers/shared/getActiveToolForTouchEvent.ts +64 -0
  66. package/src/eventDispatchers/shared/getMouseModifier.ts +30 -0
  67. package/src/eventDispatchers/shared/getToolsWithModesForMouseEvent.ts +56 -0
  68. package/src/eventDispatchers/shared/getToolsWithModesForTouchEvent.ts +54 -0
  69. package/src/eventDispatchers/touchEventHandlers/index.js +15 -0
  70. package/src/eventDispatchers/touchEventHandlers/touchDrag.ts +23 -0
  71. package/src/eventDispatchers/touchEventHandlers/touchEnd.ts +9 -0
  72. package/src/eventDispatchers/touchEventHandlers/touchPress.ts +13 -0
  73. package/src/eventDispatchers/touchEventHandlers/touchStart.ts +174 -0
  74. package/src/eventDispatchers/touchEventHandlers/touchStartActivate.ts +36 -0
  75. package/src/eventDispatchers/touchEventHandlers/touchTap.ts +9 -0
  76. package/src/eventDispatchers/touchToolEventDispatcher.ts +51 -0
  77. package/src/eventListeners/annotations/annotationModifiedListener.ts +22 -0
  78. package/src/eventListeners/annotations/annotationSelectionListener.ts +29 -0
  79. package/src/eventListeners/annotations/index.ts +4 -0
  80. package/src/eventListeners/index.ts +28 -0
  81. package/src/eventListeners/keyboard/index.ts +16 -0
  82. package/src/eventListeners/keyboard/keyDownListener.ts +99 -0
  83. package/src/eventListeners/mouse/getMouseEventPoints.ts +66 -0
  84. package/src/eventListeners/mouse/index.ts +55 -0
  85. package/src/eventListeners/mouse/mouseDoubleClickListener.ts +55 -0
  86. package/src/eventListeners/mouse/mouseDownListener.ts +519 -0
  87. package/src/eventListeners/mouse/mouseMoveListener.ts +33 -0
  88. package/src/eventListeners/segmentation/index.ts +11 -0
  89. package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +61 -0
  90. package/src/eventListeners/segmentation/segmentationModifiedEventListener.ts +32 -0
  91. package/src/eventListeners/segmentation/segmentationRepresentationModifiedEventListener.ts +15 -0
  92. package/src/eventListeners/segmentation/segmentationRepresentationRemovedEventListener.ts +16 -0
  93. package/src/eventListeners/touch/getTouchEventPoints.ts +75 -0
  94. package/src/eventListeners/touch/index.ts +37 -0
  95. package/src/eventListeners/touch/preventGhostClick.js +72 -0
  96. package/src/eventListeners/touch/touchStartListener.ts +499 -0
  97. package/src/eventListeners/wheel/index.ts +27 -0
  98. package/src/eventListeners/wheel/normalizeWheel.ts +69 -0
  99. package/src/eventListeners/wheel/wheelListener.ts +51 -0
  100. package/src/index.ts +133 -0
  101. package/src/init.ts +187 -0
  102. package/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +399 -0
  103. package/src/stateManagement/annotation/annotationLocking.ts +178 -0
  104. package/src/stateManagement/annotation/annotationSelection.ts +163 -0
  105. package/src/stateManagement/annotation/annotationState.ts +180 -0
  106. package/src/stateManagement/annotation/annotationVisibility.ts +156 -0
  107. package/src/stateManagement/annotation/config/ToolStyle.ts +265 -0
  108. package/src/stateManagement/annotation/config/getFont.ts +36 -0
  109. package/src/stateManagement/annotation/config/getState.ts +26 -0
  110. package/src/stateManagement/annotation/config/helpers.ts +55 -0
  111. package/src/stateManagement/annotation/config/index.ts +5 -0
  112. package/src/stateManagement/annotation/helpers/state.ts +83 -0
  113. package/src/stateManagement/annotation/index.ts +15 -0
  114. package/src/stateManagement/index.js +40 -0
  115. package/src/stateManagement/segmentation/SegmentationStateManager.ts +491 -0
  116. package/src/stateManagement/segmentation/activeSegmentation.ts +60 -0
  117. package/src/stateManagement/segmentation/addSegmentationRepresentations.ts +77 -0
  118. package/src/stateManagement/segmentation/addSegmentations.ts +27 -0
  119. package/src/stateManagement/segmentation/config/index.ts +29 -0
  120. package/src/stateManagement/segmentation/config/segmentationColor.ts +132 -0
  121. package/src/stateManagement/segmentation/config/segmentationConfig.ts +195 -0
  122. package/src/stateManagement/segmentation/config/segmentationVisibility.ts +171 -0
  123. package/src/stateManagement/segmentation/helpers/index.ts +3 -0
  124. package/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +35 -0
  125. package/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts +41 -0
  126. package/src/stateManagement/segmentation/index.ts +22 -0
  127. package/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts +85 -0
  128. package/src/stateManagement/segmentation/segmentIndex.ts +38 -0
  129. package/src/stateManagement/segmentation/segmentLocking.ts +72 -0
  130. package/src/stateManagement/segmentation/segmentationState.ts +429 -0
  131. package/src/stateManagement/segmentation/triggerSegmentationEvents.ts +157 -0
  132. package/src/store/SynchronizerManager/Synchronizer.ts +344 -0
  133. package/src/store/SynchronizerManager/createSynchronizer.ts +41 -0
  134. package/src/store/SynchronizerManager/destroy.ts +14 -0
  135. package/src/store/SynchronizerManager/destroySynchronizer.ts +25 -0
  136. package/src/store/SynchronizerManager/getAllSynchronizers.ts +12 -0
  137. package/src/store/SynchronizerManager/getSynchronizer.ts +13 -0
  138. package/src/store/SynchronizerManager/getSynchronizersForViewport.ts +44 -0
  139. package/src/store/SynchronizerManager/index.js +15 -0
  140. package/src/store/ToolGroupManager/ToolGroup.ts +679 -0
  141. package/src/store/ToolGroupManager/createToolGroup.ts +33 -0
  142. package/src/store/ToolGroupManager/destroy.ts +24 -0
  143. package/src/store/ToolGroupManager/destroyToolGroup.ts +26 -0
  144. package/src/store/ToolGroupManager/getAllToolGroups.ts +12 -0
  145. package/src/store/ToolGroupManager/getToolGroup.ts +14 -0
  146. package/src/store/ToolGroupManager/getToolGroupForViewport.ts +44 -0
  147. package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +33 -0
  148. package/src/store/ToolGroupManager/index.ts +17 -0
  149. package/src/store/addEnabledElement.ts +137 -0
  150. package/src/store/addTool.ts +56 -0
  151. package/src/store/cancelActiveManipulations.ts +30 -0
  152. package/src/store/filterMoveableAnnotationTools.ts +61 -0
  153. package/src/store/filterToolsWithAnnotationsForElement.ts +51 -0
  154. package/src/store/filterToolsWithMoveableHandles.ts +51 -0
  155. package/src/store/index.ts +29 -0
  156. package/src/store/removeEnabledElement.ts +132 -0
  157. package/src/store/state.ts +57 -0
  158. package/src/store/svgNodeCache.ts +7 -0
  159. package/src/synchronizers/callbacks/areViewportsCoplanar .ts +12 -0
  160. package/src/synchronizers/callbacks/cameraSyncCallback.ts +33 -0
  161. package/src/synchronizers/callbacks/stackImageSyncCallback.ts +157 -0
  162. package/src/synchronizers/callbacks/voiSyncCallback.ts +51 -0
  163. package/src/synchronizers/callbacks/zoomPanSyncCallback.ts +43 -0
  164. package/src/synchronizers/index.ts +11 -0
  165. package/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts +25 -0
  166. package/src/synchronizers/synchronizers/createStackImageSynchronizer.ts +25 -0
  167. package/src/synchronizers/synchronizers/createVOISynchronizer.ts +24 -0
  168. package/src/synchronizers/synchronizers/createZoomPanSynchronizer.ts +25 -0
  169. package/src/synchronizers/synchronizers/index.ts +11 -0
  170. package/src/tools/CrosshairsTool.ts +2693 -0
  171. package/src/tools/MIPJumpToClickTool.ts +99 -0
  172. package/src/tools/MagnifyTool.ts +319 -0
  173. package/src/tools/PanTool.ts +58 -0
  174. package/src/tools/PlanarRotateTool.ts +77 -0
  175. package/src/tools/ReferenceCursors.ts +466 -0
  176. package/src/tools/ReferenceLinesTool.ts +279 -0
  177. package/src/tools/ScaleOverlayTool.ts +685 -0
  178. package/src/tools/StackScrollTool.ts +97 -0
  179. package/src/tools/StackScrollToolMouseWheelTool.ts +58 -0
  180. package/src/tools/TrackballRotateTool.ts +141 -0
  181. package/src/tools/VolumeRotateMouseWheelTool.ts +86 -0
  182. package/src/tools/WindowLevelTool.ts +260 -0
  183. package/src/tools/ZoomTool.ts +293 -0
  184. package/src/tools/annotation/AngleTool.ts +835 -0
  185. package/src/tools/annotation/ArrowAnnotateTool.ts +820 -0
  186. package/src/tools/annotation/BidirectionalTool.ts +1350 -0
  187. package/src/tools/annotation/CircleROITool.ts +1070 -0
  188. package/src/tools/annotation/CobbAngleTool.ts +815 -0
  189. package/src/tools/annotation/DragProbeTool.ts +213 -0
  190. package/src/tools/annotation/EllipticalROITool.ts +1223 -0
  191. package/src/tools/annotation/LengthTool.ts +861 -0
  192. package/src/tools/annotation/PlanarFreehandROITool.ts +636 -0
  193. package/src/tools/annotation/ProbeTool.ts +681 -0
  194. package/src/tools/annotation/RectangleROITool.ts +1028 -0
  195. package/src/tools/annotation/planarFreehandROITool/closedContourEditLoop.ts +488 -0
  196. package/src/tools/annotation/planarFreehandROITool/drawLoop.ts +462 -0
  197. package/src/tools/annotation/planarFreehandROITool/editLoopCommon.ts +331 -0
  198. package/src/tools/annotation/planarFreehandROITool/findOpenUShapedContourVectorToPeak.ts +74 -0
  199. package/src/tools/annotation/planarFreehandROITool/openContourEditLoop.ts +612 -0
  200. package/src/tools/annotation/planarFreehandROITool/openContourEndEditLoop.ts +74 -0
  201. package/src/tools/annotation/planarFreehandROITool/renderMethods.ts +407 -0
  202. package/src/tools/base/AnnotationDisplayTool.ts +228 -0
  203. package/src/tools/base/AnnotationTool.ts +307 -0
  204. package/src/tools/base/BaseTool.ts +215 -0
  205. package/src/tools/base/index.ts +4 -0
  206. package/src/tools/displayTools/Contour/addContourToElement.ts +135 -0
  207. package/src/tools/displayTools/Contour/contourDisplay.ts +252 -0
  208. package/src/tools/displayTools/Contour/index.ts +3 -0
  209. package/src/tools/displayTools/Contour/removeContourFromElement.ts +35 -0
  210. package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +57 -0
  211. package/src/tools/displayTools/Labelmap/index.ts +4 -0
  212. package/src/tools/displayTools/Labelmap/labelmapConfig.ts +37 -0
  213. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +461 -0
  214. package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +27 -0
  215. package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +30 -0
  216. package/src/tools/displayTools/SegmentationDisplayTool.ts +198 -0
  217. package/src/tools/index.ts +84 -0
  218. package/src/tools/segmentation/BrushTool.ts +474 -0
  219. package/src/tools/segmentation/CircleScissorsTool.ts +365 -0
  220. package/src/tools/segmentation/PaintFillTool.ts +370 -0
  221. package/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts +471 -0
  222. package/src/tools/segmentation/RectangleROIThresholdTool.ts +281 -0
  223. package/src/tools/segmentation/RectangleScissorsTool.ts +382 -0
  224. package/src/tools/segmentation/SphereScissorsTool.ts +368 -0
  225. package/src/tools/segmentation/strategies/eraseCircle.ts +30 -0
  226. package/src/tools/segmentation/strategies/eraseRectangle.ts +81 -0
  227. package/src/tools/segmentation/strategies/eraseSphere.ts +27 -0
  228. package/src/tools/segmentation/strategies/fillCircle.ts +185 -0
  229. package/src/tools/segmentation/strategies/fillRectangle.ts +110 -0
  230. package/src/tools/segmentation/strategies/fillSphere.ts +88 -0
  231. package/src/tools/segmentation/strategies/index.ts +9 -0
  232. package/src/types/AnnotationGroupSelector.ts +7 -0
  233. package/src/types/AnnotationStyle.ts +42 -0
  234. package/src/types/AnnotationTypes.ts +109 -0
  235. package/src/types/BoundsIJK.ts +5 -0
  236. package/src/types/CINETypes.ts +32 -0
  237. package/src/types/ContourTypes.ts +26 -0
  238. package/src/types/CursorTypes.ts +12 -0
  239. package/src/types/EventTypes.ts +657 -0
  240. package/src/types/FloodFillTypes.ts +19 -0
  241. package/src/types/IAnnotationManager.ts +89 -0
  242. package/src/types/IDistance.ts +16 -0
  243. package/src/types/IPoints.ts +18 -0
  244. package/src/types/ISetToolModeOptions.ts +29 -0
  245. package/src/types/ISynchronizerEventHandler.ts +11 -0
  246. package/src/types/IToolClassReference.ts +5 -0
  247. package/src/types/IToolGroup.ts +72 -0
  248. package/src/types/ITouchPoints.ts +14 -0
  249. package/src/types/InteractionTypes.ts +6 -0
  250. package/src/types/InternalToolTypes.ts +19 -0
  251. package/src/types/JumpToSliceOptions.ts +7 -0
  252. package/src/types/LabelmapTypes.ts +41 -0
  253. package/src/types/PlanarBoundingBox.ts +8 -0
  254. package/src/types/SVGDrawingHelper.ts +10 -0
  255. package/src/types/ScrollOptions.ts +9 -0
  256. package/src/types/SegmentationStateTypes.ts +248 -0
  257. package/src/types/ToolHandle.ts +26 -0
  258. package/src/types/ToolProps.ts +16 -0
  259. package/src/types/ToolSpecificAnnotationTypes.ts +311 -0
  260. package/src/types/index.ts +115 -0
  261. package/src/utilities/boundingBox/extend2DBoundingBoxInViewAxis.ts +29 -0
  262. package/src/utilities/boundingBox/getBoundingBoxAroundShape.ts +57 -0
  263. package/src/utilities/boundingBox/index.ts +4 -0
  264. package/src/utilities/calibrateImageSpacing.ts +46 -0
  265. package/src/utilities/cine/events.ts +9 -0
  266. package/src/utilities/cine/index.ts +5 -0
  267. package/src/utilities/cine/playClip.ts +435 -0
  268. package/src/utilities/cine/state.ts +18 -0
  269. package/src/utilities/clip.js +30 -0
  270. package/src/utilities/debounce.js +217 -0
  271. package/src/utilities/drawing/getTextBoxCoordsCanvas.ts +45 -0
  272. package/src/utilities/drawing/index.ts +3 -0
  273. package/src/utilities/dynamicVolume/getDataInTime.ts +110 -0
  274. package/src/utilities/dynamicVolume/index.ts +2 -0
  275. package/src/utilities/getAnnotationNearPoint.ts +130 -0
  276. package/src/utilities/getModalityUnit.ts +11 -0
  277. package/src/utilities/getToolsWithModesForElement.ts +52 -0
  278. package/src/utilities/index.ts +68 -0
  279. package/src/utilities/isObject.js +29 -0
  280. package/src/utilities/math/angle/angleBetweenLines.ts +29 -0
  281. package/src/utilities/math/circle/_types.ts +6 -0
  282. package/src/utilities/math/circle/getCanvasCircleCorners.ts +23 -0
  283. package/src/utilities/math/circle/getCanvasCircleRadius.ts +16 -0
  284. package/src/utilities/math/circle/index.ts +4 -0
  285. package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +26 -0
  286. package/src/utilities/math/ellipse/index.ts +4 -0
  287. package/src/utilities/math/ellipse/pointInEllipse.ts +38 -0
  288. package/src/utilities/math/ellipse/pointInEllipsoidWithConstraint.ts +35 -0
  289. package/src/utilities/math/index.ts +8 -0
  290. package/src/utilities/math/line/distanceToPoint.ts +24 -0
  291. package/src/utilities/math/line/distanceToPointSquared.ts +44 -0
  292. package/src/utilities/math/line/index.ts +5 -0
  293. package/src/utilities/math/line/intersectLine.ts +92 -0
  294. package/src/utilities/math/midPoint.ts +24 -0
  295. package/src/utilities/math/point/distanceToPoint.ts +22 -0
  296. package/src/utilities/math/point/index.ts +3 -0
  297. package/src/utilities/math/polyline/addCanvasPointsToArray.ts +62 -0
  298. package/src/utilities/math/polyline/calculateAreaOfPoints.ts +23 -0
  299. package/src/utilities/math/polyline/getIntersectionWithPolyline.ts +182 -0
  300. package/src/utilities/math/polyline/getSubPixelSpacingAndXYDirections.ts +99 -0
  301. package/src/utilities/math/polyline/index.ts +19 -0
  302. package/src/utilities/math/polyline/planarFreehandROIInternalTypes.ts +36 -0
  303. package/src/utilities/math/polyline/pointCanProjectOnLine.ts +57 -0
  304. package/src/utilities/math/polyline/pointsAreWithinCloseContourProximity.ts +15 -0
  305. package/src/utilities/math/rectangle/distanceToPoint.ts +82 -0
  306. package/src/utilities/math/rectangle/index.ts +3 -0
  307. package/src/utilities/math/sphere/index.ts +3 -0
  308. package/src/utilities/math/sphere/pointInSphere.ts +31 -0
  309. package/src/utilities/math/vec2/findClosestPoint.ts +40 -0
  310. package/src/utilities/math/vec2/index.ts +4 -0
  311. package/src/utilities/math/vec2/liangBarksyClip.ts +84 -0
  312. package/src/utilities/orientation/getOrientationStringLPS.ts +52 -0
  313. package/src/utilities/orientation/index.ts +4 -0
  314. package/src/utilities/orientation/invertOrientationStringLPS.ts +21 -0
  315. package/src/utilities/planar/filterAnnotationsForDisplay.ts +68 -0
  316. package/src/utilities/planar/filterAnnotationsWithinSlice.ts +85 -0
  317. package/src/utilities/planar/getPointInLineOfSightWithCriteria.ts +104 -0
  318. package/src/utilities/planar/getWorldWidthAndHeightFromCorners.ts +51 -0
  319. package/src/utilities/planar/getWorldWidthAndHeightFromTwoPoints.ts +51 -0
  320. package/src/utilities/planar/index.ts +18 -0
  321. package/src/utilities/planarFreehandROITool/index.ts +7 -0
  322. package/src/utilities/planarFreehandROITool/interpolateAnnotation.ts +87 -0
  323. package/src/utilities/planarFreehandROITool/interpolatePoints.ts +214 -0
  324. package/src/utilities/planarFreehandROITool/interpolation/algorithms/bspline.ts +55 -0
  325. package/src/utilities/planarFreehandROITool/interpolation/interpolateSegmentPoints.ts +90 -0
  326. package/src/utilities/pointInShapeCallback.ts +138 -0
  327. package/src/utilities/pointInSurroundingSphereCallback.ts +188 -0
  328. package/src/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.ts +76 -0
  329. package/src/utilities/rectangleROITool/index.ts +3 -0
  330. package/src/utilities/scroll.ts +62 -0
  331. package/src/utilities/segmentation/brushSizeForToolGroup.ts +72 -0
  332. package/src/utilities/segmentation/brushThresholdForToolGroup.ts +65 -0
  333. package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +74 -0
  334. package/src/utilities/segmentation/createMergedLabelmapForIndex.ts +65 -0
  335. package/src/utilities/segmentation/floodFill.ts +194 -0
  336. package/src/utilities/segmentation/getDefaultRepresentationConfig.ts +20 -0
  337. package/src/utilities/segmentation/index.ts +33 -0
  338. package/src/utilities/segmentation/isValidRepresentationConfig.ts +22 -0
  339. package/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts +91 -0
  340. package/src/utilities/segmentation/thresholdSegmentationByRange.ts +129 -0
  341. package/src/utilities/segmentation/thresholdVolumeByRange.ts +150 -0
  342. package/src/utilities/segmentation/triggerSegmentationRender.ts +206 -0
  343. package/src/utilities/segmentation/utilities.ts +116 -0
  344. package/src/utilities/stackPrefetch/index.ts +8 -0
  345. package/src/utilities/stackPrefetch/stackPrefetch.ts +405 -0
  346. package/src/utilities/stackPrefetch/state.ts +17 -0
  347. package/src/utilities/throttle.js +69 -0
  348. package/src/utilities/touch/index.ts +246 -0
  349. package/src/utilities/triggerAnnotationRender.ts +237 -0
  350. package/src/utilities/triggerAnnotationRenderForViewportIds.ts +18 -0
  351. package/src/utilities/viewport/index.ts +5 -0
  352. package/src/utilities/viewport/isViewportPreScaled.ts +24 -0
  353. package/src/utilities/viewport/jumpToSlice.ts +73 -0
  354. package/src/utilities/viewport/jumpToWorld.ts +58 -0
  355. package/src/utilities/viewportFilters/filterViewportsWithFrameOfReferenceUID.ts +28 -0
  356. package/src/utilities/viewportFilters/filterViewportsWithParallelNormals.ts +26 -0
  357. package/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts +15 -0
  358. package/src/utilities/viewportFilters/filterViewportsWithToolEnabled.ts +72 -0
  359. package/src/utilities/viewportFilters/getViewportIdsWithToolToRender.ts +45 -0
  360. package/src/utilities/viewportFilters/index.ts +11 -0
@@ -0,0 +1,820 @@
1
+ import { Events } from '../../enums';
2
+ import {
3
+ getEnabledElement,
4
+ triggerEvent,
5
+ eventTarget,
6
+ utilities as csUtils,
7
+ } from '@cornerstonejs/core';
8
+ import type { Types } from '@cornerstonejs/core';
9
+
10
+ import { AnnotationTool } from '../base';
11
+ import {
12
+ addAnnotation,
13
+ getAnnotations,
14
+ removeAnnotation,
15
+ } from '../../stateManagement/annotation/annotationState';
16
+ import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking';
17
+ import * as lineSegment from '../../utilities/math/line';
18
+
19
+ import {
20
+ drawHandles as drawHandlesSvg,
21
+ drawArrow as drawArrowSvg,
22
+ drawLinkedTextBox as drawLinkedTextBoxSvg,
23
+ } from '../../drawingSvg';
24
+ import { state } from '../../store';
25
+ import { getViewportIdsWithToolToRender } from '../../utilities/viewportFilters';
26
+ import { getTextBoxCoordsCanvas } from '../../utilities/drawing';
27
+ import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds';
28
+ import { AnnotationCompletedEventDetail } from '../../types/EventTypes';
29
+
30
+ import {
31
+ resetElementCursor,
32
+ hideElementCursor,
33
+ } from '../../cursors/elementCursor';
34
+
35
+ import {
36
+ EventTypes,
37
+ ToolHandle,
38
+ TextBoxHandle,
39
+ PublicToolProps,
40
+ ToolProps,
41
+ InteractionTypes,
42
+ SVGDrawingHelper,
43
+ } from '../../types';
44
+ import { ArrowAnnotation } from '../../types/ToolSpecificAnnotationTypes';
45
+ import { StyleSpecifier } from '../../types/AnnotationStyle';
46
+
47
+ class ArrowAnnotateTool extends AnnotationTool {
48
+ static toolName;
49
+
50
+ public touchDragCallback: any;
51
+ public mouseDragCallback: any;
52
+ _throttledCalculateCachedStats: any;
53
+ editData: {
54
+ annotation: any;
55
+ viewportIdsToRender: string[];
56
+ handleIndex?: number;
57
+ movingTextBox?: boolean;
58
+ newAnnotation?: boolean;
59
+ hasMoved?: boolean;
60
+ } | null;
61
+ isDrawing: boolean;
62
+ isHandleOutsideImage: boolean;
63
+
64
+ constructor(
65
+ toolProps: PublicToolProps = {},
66
+ defaultToolProps: ToolProps = {
67
+ supportedInteractionTypes: ['Mouse', 'Touch'],
68
+ configuration: {
69
+ shadow: true,
70
+ getTextCallback,
71
+ changeTextCallback,
72
+ preventHandleOutsideImage: false,
73
+ arrowFirst: true,
74
+ },
75
+ }
76
+ ) {
77
+ super(toolProps, defaultToolProps);
78
+ }
79
+
80
+ /**
81
+ * Based on the current position of the mouse and the current imageId to create
82
+ * a Length Annotation and stores it in the annotationManager
83
+ *
84
+ * @param evt - EventTypes.NormalizedMouseEventType
85
+ * @returns The annotation object.
86
+ *
87
+ */
88
+ addNewAnnotation = (
89
+ evt: EventTypes.InteractionEventType
90
+ ): ArrowAnnotation => {
91
+ const eventDetail = evt.detail;
92
+ const { currentPoints, element } = eventDetail;
93
+ const worldPos = currentPoints.world;
94
+ const enabledElement = getEnabledElement(element);
95
+ const { viewport, renderingEngine } = enabledElement;
96
+
97
+ hideElementCursor(element);
98
+ this.isDrawing = true;
99
+
100
+ const camera = viewport.getCamera();
101
+ const { viewPlaneNormal, viewUp } = camera;
102
+
103
+ const referencedImageId = this.getReferencedImageId(
104
+ viewport,
105
+ worldPos,
106
+ viewPlaneNormal,
107
+ viewUp
108
+ );
109
+
110
+ const { arrowFirst } = this.configuration;
111
+ const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
112
+
113
+ const annotation = {
114
+ highlighted: true,
115
+ invalidated: true,
116
+ metadata: {
117
+ toolName: this.getToolName(),
118
+ viewPlaneNormal: <Types.Point3>[...viewPlaneNormal],
119
+ viewUp: <Types.Point3>[...viewUp],
120
+ FrameOfReferenceUID,
121
+ referencedImageId,
122
+ },
123
+ data: {
124
+ text: '',
125
+ handles: {
126
+ points: [<Types.Point3>[...worldPos], <Types.Point3>[...worldPos]],
127
+ activeHandleIndex: null,
128
+ arrowFirst,
129
+ textBox: {
130
+ hasMoved: false,
131
+ worldPosition: <Types.Point3>[0, 0, 0],
132
+ worldBoundingBox: {
133
+ topLeft: <Types.Point3>[0, 0, 0],
134
+ topRight: <Types.Point3>[0, 0, 0],
135
+ bottomLeft: <Types.Point3>[0, 0, 0],
136
+ bottomRight: <Types.Point3>[0, 0, 0],
137
+ },
138
+ },
139
+ },
140
+ label: '',
141
+ },
142
+ };
143
+
144
+ addAnnotation(annotation, element);
145
+
146
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
147
+ element,
148
+ this.getToolName()
149
+ );
150
+
151
+ this.editData = {
152
+ annotation,
153
+ viewportIdsToRender,
154
+ handleIndex: 1,
155
+ movingTextBox: false,
156
+ newAnnotation: true,
157
+ hasMoved: false,
158
+ };
159
+ this._activateDraw(element);
160
+
161
+ evt.preventDefault();
162
+
163
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
164
+
165
+ return annotation;
166
+ };
167
+
168
+ /**
169
+ * It returns if the canvas point is near the provided length annotation in the provided
170
+ * element or not. A proximity is passed to the function to determine the
171
+ * proximity of the point to the annotation in number of pixels.
172
+ *
173
+ * @param element - HTML Element
174
+ * @param annotation - Annotation
175
+ * @param canvasCoords - Canvas coordinates
176
+ * @param proximity - Proximity to tool to consider
177
+ * @returns Boolean, whether the canvas point is near tool
178
+ */
179
+ isPointNearTool = (
180
+ element: HTMLDivElement,
181
+ annotation: ArrowAnnotation,
182
+ canvasCoords: Types.Point2,
183
+ proximity: number
184
+ ): boolean => {
185
+ const enabledElement = getEnabledElement(element);
186
+ const { viewport } = enabledElement;
187
+ const { data } = annotation;
188
+ const [point1, point2] = data.handles.points;
189
+ const canvasPoint1 = viewport.worldToCanvas(point1);
190
+ const canvasPoint2 = viewport.worldToCanvas(point2);
191
+
192
+ const line = {
193
+ start: {
194
+ x: canvasPoint1[0],
195
+ y: canvasPoint1[1],
196
+ },
197
+ end: {
198
+ x: canvasPoint2[0],
199
+ y: canvasPoint2[1],
200
+ },
201
+ };
202
+
203
+ const distanceToPoint = lineSegment.distanceToPoint(
204
+ [line.start.x, line.start.y],
205
+ [line.end.x, line.end.y],
206
+ [canvasCoords[0], canvasCoords[1]]
207
+ );
208
+
209
+ if (distanceToPoint <= proximity) {
210
+ return true;
211
+ }
212
+
213
+ return false;
214
+ };
215
+
216
+ toolSelectedCallback = (
217
+ evt: EventTypes.InteractionEventType,
218
+ annotation: ArrowAnnotation
219
+ ): void => {
220
+ const eventDetail = evt.detail;
221
+ const { element } = eventDetail;
222
+
223
+ annotation.highlighted = true;
224
+
225
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
226
+ element,
227
+ this.getToolName()
228
+ );
229
+
230
+ this.editData = {
231
+ annotation,
232
+ viewportIdsToRender,
233
+ movingTextBox: false,
234
+ };
235
+
236
+ this._activateModify(element);
237
+
238
+ hideElementCursor(element);
239
+
240
+ const enabledElement = getEnabledElement(element);
241
+ const { renderingEngine } = enabledElement;
242
+
243
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
244
+
245
+ evt.preventDefault();
246
+ };
247
+
248
+ handleSelectedCallback(
249
+ evt: EventTypes.InteractionEventType,
250
+ annotation: ArrowAnnotation,
251
+ handle: ToolHandle
252
+ ): void {
253
+ const eventDetail = evt.detail;
254
+ const { element } = eventDetail;
255
+ const { data } = annotation;
256
+
257
+ annotation.highlighted = true;
258
+
259
+ let movingTextBox = false;
260
+ let handleIndex;
261
+
262
+ if ((handle as TextBoxHandle).worldPosition) {
263
+ movingTextBox = true;
264
+ } else {
265
+ handleIndex = data.handles.points.findIndex((p) => p === handle);
266
+ }
267
+
268
+ // Find viewports to render on drag.
269
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
270
+ element,
271
+ this.getToolName()
272
+ );
273
+
274
+ this.editData = {
275
+ annotation,
276
+ viewportIdsToRender,
277
+ handleIndex,
278
+ movingTextBox,
279
+ };
280
+ this._activateModify(element);
281
+
282
+ hideElementCursor(element);
283
+
284
+ const enabledElement = getEnabledElement(element);
285
+ const { renderingEngine } = enabledElement;
286
+
287
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
288
+
289
+ evt.preventDefault();
290
+ }
291
+
292
+ _endCallback = (evt: EventTypes.InteractionEventType): void => {
293
+ const eventDetail = evt.detail;
294
+ const { element } = eventDetail;
295
+
296
+ const { annotation, viewportIdsToRender, newAnnotation, hasMoved } =
297
+ this.editData;
298
+ const { data } = annotation;
299
+
300
+ if (newAnnotation && !hasMoved) {
301
+ // when user starts the drawing by click, and moving the mouse, instead
302
+ // of click and drag
303
+ return;
304
+ }
305
+
306
+ data.handles.activeHandleIndex = null;
307
+
308
+ this._deactivateModify(element);
309
+ this._deactivateDraw(element);
310
+ resetElementCursor(element);
311
+
312
+ const enabledElement = getEnabledElement(element);
313
+ const { renderingEngine } = enabledElement;
314
+
315
+ if (
316
+ this.isHandleOutsideImage &&
317
+ this.configuration.preventHandleOutsideImage
318
+ ) {
319
+ removeAnnotation(annotation.annotationUID);
320
+ }
321
+
322
+ if (newAnnotation) {
323
+ this.configuration.getTextCallback((text) => {
324
+ if (!text) {
325
+ removeAnnotation(annotation.annotationUID);
326
+ triggerAnnotationRenderForViewportIds(
327
+ renderingEngine,
328
+ viewportIdsToRender
329
+ );
330
+ this.editData = null;
331
+ this.isDrawing = false;
332
+ return;
333
+ }
334
+ annotation.data.text = text;
335
+
336
+ const eventType = Events.ANNOTATION_COMPLETED;
337
+
338
+ const eventDetail: AnnotationCompletedEventDetail = {
339
+ annotation,
340
+ };
341
+
342
+ triggerEvent(eventTarget, eventType, eventDetail);
343
+
344
+ triggerAnnotationRenderForViewportIds(
345
+ renderingEngine,
346
+ viewportIdsToRender
347
+ );
348
+ });
349
+ }
350
+
351
+ this.editData = null;
352
+ this.isDrawing = false;
353
+ };
354
+
355
+ _dragCallback = (evt: EventTypes.InteractionEventType): void => {
356
+ this.isDrawing = true;
357
+ const eventDetail = evt.detail;
358
+ const { element } = eventDetail;
359
+
360
+ const { annotation, viewportIdsToRender, handleIndex, movingTextBox } =
361
+ this.editData;
362
+ const { data } = annotation;
363
+
364
+ if (movingTextBox) {
365
+ // Drag mode - moving text box
366
+ const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail;
367
+ const worldPosDelta = deltaPoints.world;
368
+
369
+ const { textBox } = data.handles;
370
+ const { worldPosition } = textBox;
371
+
372
+ worldPosition[0] += worldPosDelta[0];
373
+ worldPosition[1] += worldPosDelta[1];
374
+ worldPosition[2] += worldPosDelta[2];
375
+
376
+ textBox.hasMoved = true;
377
+ } else if (handleIndex === undefined) {
378
+ // Drag mode - moving handle
379
+ const { deltaPoints } = eventDetail as EventTypes.MouseDragEventDetail;
380
+ const worldPosDelta = deltaPoints.world;
381
+
382
+ const points = data.handles.points;
383
+
384
+ points.forEach((point) => {
385
+ point[0] += worldPosDelta[0];
386
+ point[1] += worldPosDelta[1];
387
+ point[2] += worldPosDelta[2];
388
+ });
389
+ annotation.invalidated = true;
390
+ } else {
391
+ // Move mode - after double click, and mouse move to draw
392
+ const { currentPoints } = eventDetail;
393
+ const worldPos = currentPoints.world;
394
+
395
+ data.handles.points[handleIndex] = [...worldPos];
396
+ annotation.invalidated = true;
397
+ }
398
+
399
+ this.editData.hasMoved = true;
400
+
401
+ const enabledElement = getEnabledElement(element);
402
+ const { renderingEngine } = enabledElement;
403
+
404
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
405
+ };
406
+
407
+ touchTapCallback = (evt: EventTypes.TouchTapEventType) => {
408
+ if (evt.detail.taps == 2) {
409
+ this.doubleClickCallback(evt);
410
+ }
411
+ };
412
+
413
+ doubleClickCallback = (evt: EventTypes.TouchTapEventType): void => {
414
+ const eventDetail = evt.detail;
415
+ const { element } = eventDetail;
416
+ let annotations = getAnnotations(this.getToolName(), element);
417
+
418
+ annotations = this.filterInteractableAnnotationsForElement(
419
+ element,
420
+ annotations
421
+ );
422
+
423
+ if (!annotations?.length) {
424
+ return;
425
+ }
426
+
427
+ const clickedAnnotation = annotations.find((annotation) =>
428
+ this.isPointNearTool(
429
+ element,
430
+ annotation as ArrowAnnotation,
431
+ eventDetail.currentPoints.canvas,
432
+ 6 // Todo: get from configuration
433
+ )
434
+ );
435
+
436
+ if (!clickedAnnotation) {
437
+ return;
438
+ }
439
+
440
+ const annotation = clickedAnnotation as ArrowAnnotation;
441
+
442
+ this.configuration.changeTextCallback(
443
+ clickedAnnotation,
444
+ evt.detail,
445
+ this._doneChangingTextCallback.bind(this, element, annotation)
446
+ );
447
+
448
+ this.editData = null;
449
+ this.isDrawing = false;
450
+
451
+ // This double click was handled and the dialogue was displayed.
452
+ // No need for any other listener to handle it too - stopImmediatePropagation
453
+ // helps ensure this primarily so that no other listeners on the target element
454
+ // get called.
455
+ evt.stopImmediatePropagation();
456
+ evt.preventDefault();
457
+ };
458
+
459
+ _doneChangingTextCallback(element, annotation, updatedText): void {
460
+ annotation.data.text = updatedText;
461
+
462
+ const { renderingEngine, viewportId, renderingEngineId } =
463
+ getEnabledElement(element);
464
+
465
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
466
+ element,
467
+ this.getToolName()
468
+ );
469
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
470
+
471
+ // Dispatching annotation modified
472
+ const eventType = Events.ANNOTATION_MODIFIED;
473
+
474
+ triggerEvent(eventTarget, eventType, {
475
+ annotation,
476
+ viewportId,
477
+ renderingEngineId,
478
+ });
479
+ }
480
+
481
+ cancel = (element: HTMLDivElement) => {
482
+ // If it is mid-draw or mid-modify
483
+ if (this.isDrawing) {
484
+ this.isDrawing = false;
485
+ this._deactivateDraw(element);
486
+ this._deactivateModify(element);
487
+ resetElementCursor(element);
488
+
489
+ const { annotation, viewportIdsToRender, newAnnotation } = this.editData;
490
+ const { data } = annotation;
491
+
492
+ annotation.highlighted = false;
493
+ data.handles.activeHandleIndex = null;
494
+
495
+ const enabledElement = getEnabledElement(element);
496
+ const { renderingEngine } = enabledElement;
497
+
498
+ triggerAnnotationRenderForViewportIds(
499
+ renderingEngine,
500
+ viewportIdsToRender
501
+ );
502
+
503
+ if (newAnnotation) {
504
+ const eventType = Events.ANNOTATION_COMPLETED;
505
+
506
+ const eventDetail: AnnotationCompletedEventDetail = {
507
+ annotation,
508
+ };
509
+
510
+ triggerEvent(eventTarget, eventType, eventDetail);
511
+ }
512
+
513
+ this.editData = null;
514
+ return annotation.annotationUID;
515
+ }
516
+ };
517
+
518
+ _activateModify = (element: HTMLDivElement) => {
519
+ state.isInteractingWithTool = true;
520
+
521
+ element.addEventListener(
522
+ Events.MOUSE_UP,
523
+ this._endCallback as EventListener
524
+ );
525
+ element.addEventListener(
526
+ Events.MOUSE_DRAG,
527
+ this._dragCallback as EventListener
528
+ );
529
+ element.addEventListener(
530
+ Events.MOUSE_CLICK,
531
+ this._endCallback as EventListener
532
+ );
533
+
534
+ element.addEventListener(
535
+ Events.TOUCH_TAP,
536
+ this._endCallback as EventListener
537
+ );
538
+ element.addEventListener(
539
+ Events.TOUCH_END,
540
+ this._endCallback as EventListener
541
+ );
542
+ element.addEventListener(
543
+ Events.TOUCH_DRAG,
544
+ this._dragCallback as EventListener
545
+ );
546
+ };
547
+
548
+ _deactivateModify = (element: HTMLDivElement) => {
549
+ state.isInteractingWithTool = false;
550
+
551
+ element.removeEventListener(
552
+ Events.MOUSE_UP,
553
+ this._endCallback as EventListener
554
+ );
555
+ element.removeEventListener(
556
+ Events.MOUSE_DRAG,
557
+ this._dragCallback as EventListener
558
+ );
559
+ element.removeEventListener(
560
+ Events.MOUSE_CLICK,
561
+ this._endCallback as EventListener
562
+ );
563
+
564
+ element.removeEventListener(
565
+ Events.TOUCH_TAP,
566
+ this._endCallback as EventListener
567
+ );
568
+ element.removeEventListener(
569
+ Events.TOUCH_DRAG,
570
+ this._dragCallback as EventListener
571
+ );
572
+ element.removeEventListener(
573
+ Events.TOUCH_END,
574
+ this._endCallback as EventListener
575
+ );
576
+ };
577
+
578
+ _activateDraw = (element: HTMLDivElement) => {
579
+ state.isInteractingWithTool = true;
580
+
581
+ element.addEventListener(
582
+ Events.MOUSE_UP,
583
+ this._endCallback as EventListener
584
+ );
585
+ element.addEventListener(
586
+ Events.MOUSE_DRAG,
587
+ this._dragCallback as EventListener
588
+ );
589
+ element.addEventListener(
590
+ Events.MOUSE_MOVE,
591
+ this._dragCallback as EventListener
592
+ );
593
+ element.addEventListener(
594
+ Events.MOUSE_CLICK,
595
+ this._endCallback as EventListener
596
+ );
597
+
598
+ element.addEventListener(
599
+ Events.TOUCH_TAP,
600
+ this._endCallback as EventListener
601
+ );
602
+ element.addEventListener(
603
+ Events.TOUCH_END,
604
+ this._endCallback as EventListener
605
+ );
606
+ element.addEventListener(
607
+ Events.TOUCH_DRAG,
608
+ this._dragCallback as EventListener
609
+ );
610
+ };
611
+
612
+ _deactivateDraw = (element: HTMLDivElement) => {
613
+ state.isInteractingWithTool = false;
614
+
615
+ element.removeEventListener(
616
+ Events.MOUSE_UP,
617
+ this._endCallback as EventListener
618
+ );
619
+ element.removeEventListener(
620
+ Events.MOUSE_DRAG,
621
+ this._dragCallback as EventListener
622
+ );
623
+ element.removeEventListener(
624
+ Events.MOUSE_MOVE,
625
+ this._dragCallback as EventListener
626
+ );
627
+ element.removeEventListener(
628
+ Events.MOUSE_CLICK,
629
+ this._endCallback as EventListener
630
+ );
631
+
632
+ element.removeEventListener(
633
+ Events.TOUCH_TAP,
634
+ this._endCallback as EventListener
635
+ );
636
+ element.removeEventListener(
637
+ Events.TOUCH_END,
638
+ this._endCallback as EventListener
639
+ );
640
+ element.removeEventListener(
641
+ Events.TOUCH_DRAG,
642
+ this._dragCallback as EventListener
643
+ );
644
+ };
645
+
646
+ /**
647
+ * it is used to draw the length annotation in each
648
+ * request animation frame. It calculates the updated cached statistics if
649
+ * data is invalidated and cache it.
650
+ *
651
+ * @param enabledElement - The Cornerstone's enabledElement.
652
+ * @param svgDrawingHelper - The svgDrawingHelper providing the context for drawing.
653
+ */
654
+ renderAnnotation = (
655
+ enabledElement: Types.IEnabledElement,
656
+ svgDrawingHelper: SVGDrawingHelper
657
+ ): boolean => {
658
+ let renderStatus = false;
659
+ const { viewport } = enabledElement;
660
+ const { element } = viewport;
661
+
662
+ let annotations = getAnnotations(this.getToolName(), element);
663
+
664
+ // Todo: We don't need this anymore, filtering happens in triggerAnnotationRender
665
+ if (!annotations?.length) {
666
+ return renderStatus;
667
+ }
668
+
669
+ annotations = this.filterInteractableAnnotationsForElement(
670
+ element,
671
+ annotations
672
+ );
673
+
674
+ if (!annotations?.length) {
675
+ return renderStatus;
676
+ }
677
+
678
+ const styleSpecifier: StyleSpecifier = {
679
+ toolGroupId: this.toolGroupId,
680
+ toolName: this.getToolName(),
681
+ viewportId: enabledElement.viewport.id,
682
+ };
683
+
684
+ // Draw SVG
685
+ for (let i = 0; i < annotations.length; i++) {
686
+ const annotation = annotations[i] as ArrowAnnotation;
687
+ const { annotationUID, data } = annotation;
688
+ const { handles, text } = data;
689
+ const { points, activeHandleIndex } = handles;
690
+
691
+ styleSpecifier.annotationUID = annotationUID;
692
+
693
+ const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
694
+ const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
695
+ const color = this.getStyle('color', styleSpecifier, annotation);
696
+
697
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
698
+
699
+ let activeHandleCanvasCoords;
700
+
701
+ if (
702
+ !isAnnotationLocked(annotation) &&
703
+ !this.editData &&
704
+ activeHandleIndex !== null
705
+ ) {
706
+ // Not locked or creating and hovering over handle, so render handle.
707
+ activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
708
+ }
709
+
710
+ if (activeHandleCanvasCoords) {
711
+ const handleGroupUID = '0';
712
+
713
+ drawHandlesSvg(
714
+ svgDrawingHelper,
715
+ annotationUID,
716
+ handleGroupUID,
717
+ canvasCoordinates,
718
+ {
719
+ color,
720
+ lineWidth,
721
+ }
722
+ );
723
+ }
724
+
725
+ const arrowUID = '1';
726
+ if (this.configuration.arrowFirst) {
727
+ drawArrowSvg(
728
+ svgDrawingHelper,
729
+ annotationUID,
730
+ arrowUID,
731
+ canvasCoordinates[1],
732
+ canvasCoordinates[0],
733
+ {
734
+ color,
735
+ width: lineWidth,
736
+ lineDash: lineDash,
737
+ }
738
+ );
739
+ } else {
740
+ drawArrowSvg(
741
+ svgDrawingHelper,
742
+ annotationUID,
743
+ arrowUID,
744
+ canvasCoordinates[0],
745
+ canvasCoordinates[1],
746
+ {
747
+ color,
748
+ width: lineWidth,
749
+ lineDash: lineDash,
750
+ }
751
+ );
752
+ }
753
+
754
+ renderStatus = true;
755
+
756
+ // If rendering engine has been destroyed while rendering
757
+ if (!viewport.getRenderingEngine()) {
758
+ console.warn('Rendering Engine has been destroyed');
759
+ return renderStatus;
760
+ }
761
+
762
+ if (!text) {
763
+ continue;
764
+ }
765
+
766
+ // Need to update to sync w/ annotation while unlinked/not moved
767
+ if (!data.handles.textBox.hasMoved) {
768
+ const canvasTextBoxCoords = getTextBoxCoordsCanvas(canvasCoordinates);
769
+
770
+ data.handles.textBox.worldPosition =
771
+ viewport.canvasToWorld(canvasTextBoxCoords);
772
+ }
773
+
774
+ const textBoxPosition = viewport.worldToCanvas(
775
+ data.handles.textBox.worldPosition
776
+ );
777
+
778
+ const textBoxUID = '1';
779
+ const boundingBox = drawLinkedTextBoxSvg(
780
+ svgDrawingHelper,
781
+ annotationUID,
782
+ textBoxUID,
783
+ [text],
784
+ textBoxPosition,
785
+ canvasCoordinates,
786
+ {},
787
+ this.getLinkedTextBoxStyle(styleSpecifier, annotation)
788
+ );
789
+
790
+ const { x: left, y: top, width, height } = boundingBox;
791
+
792
+ data.handles.textBox.worldBoundingBox = {
793
+ topLeft: viewport.canvasToWorld([left, top]),
794
+ topRight: viewport.canvasToWorld([left + width, top]),
795
+ bottomLeft: viewport.canvasToWorld([left, top + height]),
796
+ bottomRight: viewport.canvasToWorld([left + width, top + height]),
797
+ };
798
+ }
799
+
800
+ return renderStatus;
801
+ };
802
+
803
+ _isInsideVolume(index1, index2, dimensions) {
804
+ return (
805
+ csUtils.indexWithinDimensions(index1, dimensions) &&
806
+ csUtils.indexWithinDimensions(index2, dimensions)
807
+ );
808
+ }
809
+ }
810
+
811
+ function getTextCallback(doneChangingTextCallback) {
812
+ return doneChangingTextCallback(prompt('Enter your annotation:'));
813
+ }
814
+
815
+ function changeTextCallback(data, eventData, doneChangingTextCallback) {
816
+ return doneChangingTextCallback(prompt('Enter your annotation:'));
817
+ }
818
+
819
+ ArrowAnnotateTool.toolName = 'ArrowAnnotate';
820
+ export default ArrowAnnotateTool;