@cornerstonejs/tools 0.56.2 → 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 (352) hide show
  1. package/package.json +5 -4
  2. package/src/constants/COLOR_LUT.ts +262 -0
  3. package/src/constants/index.ts +3 -0
  4. package/src/cursors/ImageMouseCursor.ts +39 -0
  5. package/src/cursors/MouseCursor.ts +114 -0
  6. package/src/cursors/SVGCursorDescriptor.ts +462 -0
  7. package/src/cursors/SVGMouseCursor.ts +145 -0
  8. package/src/cursors/elementCursor.ts +69 -0
  9. package/src/cursors/index.ts +24 -0
  10. package/src/cursors/setCursorForElement.ts +33 -0
  11. package/src/drawingSvg/_getHash.ts +9 -0
  12. package/src/drawingSvg/_setAttributesIfNecessary.ts +13 -0
  13. package/src/drawingSvg/_setNewAttributesIfValid.ts +10 -0
  14. package/src/drawingSvg/clearByToolType.ts +26 -0
  15. package/src/drawingSvg/draw.ts +16 -0
  16. package/src/drawingSvg/drawArrow.ts +82 -0
  17. package/src/drawingSvg/drawCircle.ts +62 -0
  18. package/src/drawingSvg/drawEllipse.ts +71 -0
  19. package/src/drawingSvg/drawHandles.ts +87 -0
  20. package/src/drawingSvg/drawLine.ts +70 -0
  21. package/src/drawingSvg/drawLink.ts +76 -0
  22. package/src/drawingSvg/drawLinkedTextBox.ts +64 -0
  23. package/src/drawingSvg/drawPolyline.ts +80 -0
  24. package/src/drawingSvg/drawRect.ts +70 -0
  25. package/src/drawingSvg/drawTextBox.ts +213 -0
  26. package/src/drawingSvg/getSvgDrawingHelper.ts +98 -0
  27. package/src/drawingSvg/index.ts +23 -0
  28. package/src/enums/AnnotationStyleStates.ts +22 -0
  29. package/src/enums/Events.ts +242 -0
  30. package/src/enums/SegmentationRepresentations.ts +12 -0
  31. package/src/enums/ToolBindings.ts +37 -0
  32. package/src/enums/ToolModes.ts +31 -0
  33. package/src/enums/Touch.ts +8 -0
  34. package/src/enums/index.js +16 -0
  35. package/src/eventDispatchers/annotationModifiedEventDispatcher.ts +41 -0
  36. package/src/eventDispatchers/cameraModifiedEventDispatcher.ts +41 -0
  37. package/src/eventDispatchers/imageRenderedEventDispatcher.ts +37 -0
  38. package/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts +50 -0
  39. package/src/eventDispatchers/index.js +15 -0
  40. package/src/eventDispatchers/keyboardEventHandlers/index.js +4 -0
  41. package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +29 -0
  42. package/src/eventDispatchers/keyboardEventHandlers/keyUp.ts +33 -0
  43. package/src/eventDispatchers/keyboardToolEventDispatcher.ts +28 -0
  44. package/src/eventDispatchers/mouseEventHandlers/index.js +19 -0
  45. package/src/eventDispatchers/mouseEventHandlers/mouseClick.ts +13 -0
  46. package/src/eventDispatchers/mouseEventHandlers/mouseDoubleClick.ts +13 -0
  47. package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +196 -0
  48. package/src/eventDispatchers/mouseEventHandlers/mouseDownActivate.ts +35 -0
  49. package/src/eventDispatchers/mouseEventHandlers/mouseDrag.ts +25 -0
  50. package/src/eventDispatchers/mouseEventHandlers/mouseMove.ts +70 -0
  51. package/src/eventDispatchers/mouseEventHandlers/mouseUp.ts +9 -0
  52. package/src/eventDispatchers/mouseEventHandlers/mouseWheel.ts +13 -0
  53. package/src/eventDispatchers/mouseToolEventDispatcher.ts +64 -0
  54. package/src/eventDispatchers/shared/customCallbackHandler.ts +73 -0
  55. package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +58 -0
  56. package/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts +61 -0
  57. package/src/eventDispatchers/shared/getActiveToolForTouchEvent.ts +64 -0
  58. package/src/eventDispatchers/shared/getMouseModifier.ts +30 -0
  59. package/src/eventDispatchers/shared/getToolsWithModesForMouseEvent.ts +56 -0
  60. package/src/eventDispatchers/shared/getToolsWithModesForTouchEvent.ts +54 -0
  61. package/src/eventDispatchers/touchEventHandlers/index.js +15 -0
  62. package/src/eventDispatchers/touchEventHandlers/touchDrag.ts +23 -0
  63. package/src/eventDispatchers/touchEventHandlers/touchEnd.ts +9 -0
  64. package/src/eventDispatchers/touchEventHandlers/touchPress.ts +13 -0
  65. package/src/eventDispatchers/touchEventHandlers/touchStart.ts +174 -0
  66. package/src/eventDispatchers/touchEventHandlers/touchStartActivate.ts +36 -0
  67. package/src/eventDispatchers/touchEventHandlers/touchTap.ts +9 -0
  68. package/src/eventDispatchers/touchToolEventDispatcher.ts +51 -0
  69. package/src/eventListeners/annotations/annotationModifiedListener.ts +22 -0
  70. package/src/eventListeners/annotations/annotationSelectionListener.ts +29 -0
  71. package/src/eventListeners/annotations/index.ts +4 -0
  72. package/src/eventListeners/index.ts +28 -0
  73. package/src/eventListeners/keyboard/index.ts +16 -0
  74. package/src/eventListeners/keyboard/keyDownListener.ts +99 -0
  75. package/src/eventListeners/mouse/getMouseEventPoints.ts +66 -0
  76. package/src/eventListeners/mouse/index.ts +55 -0
  77. package/src/eventListeners/mouse/mouseDoubleClickListener.ts +55 -0
  78. package/src/eventListeners/mouse/mouseDownListener.ts +519 -0
  79. package/src/eventListeners/mouse/mouseMoveListener.ts +33 -0
  80. package/src/eventListeners/segmentation/index.ts +11 -0
  81. package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +61 -0
  82. package/src/eventListeners/segmentation/segmentationModifiedEventListener.ts +32 -0
  83. package/src/eventListeners/segmentation/segmentationRepresentationModifiedEventListener.ts +15 -0
  84. package/src/eventListeners/segmentation/segmentationRepresentationRemovedEventListener.ts +16 -0
  85. package/src/eventListeners/touch/getTouchEventPoints.ts +75 -0
  86. package/src/eventListeners/touch/index.ts +37 -0
  87. package/src/eventListeners/touch/preventGhostClick.js +72 -0
  88. package/src/eventListeners/touch/touchStartListener.ts +499 -0
  89. package/src/eventListeners/wheel/index.ts +27 -0
  90. package/src/eventListeners/wheel/normalizeWheel.ts +69 -0
  91. package/src/eventListeners/wheel/wheelListener.ts +51 -0
  92. package/src/index.ts +133 -0
  93. package/src/init.ts +187 -0
  94. package/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +399 -0
  95. package/src/stateManagement/annotation/annotationLocking.ts +178 -0
  96. package/src/stateManagement/annotation/annotationSelection.ts +163 -0
  97. package/src/stateManagement/annotation/annotationState.ts +180 -0
  98. package/src/stateManagement/annotation/annotationVisibility.ts +156 -0
  99. package/src/stateManagement/annotation/config/ToolStyle.ts +265 -0
  100. package/src/stateManagement/annotation/config/getFont.ts +36 -0
  101. package/src/stateManagement/annotation/config/getState.ts +26 -0
  102. package/src/stateManagement/annotation/config/helpers.ts +55 -0
  103. package/src/stateManagement/annotation/config/index.ts +5 -0
  104. package/src/stateManagement/annotation/helpers/state.ts +83 -0
  105. package/src/stateManagement/annotation/index.ts +15 -0
  106. package/src/stateManagement/index.js +40 -0
  107. package/src/stateManagement/segmentation/SegmentationStateManager.ts +491 -0
  108. package/src/stateManagement/segmentation/activeSegmentation.ts +60 -0
  109. package/src/stateManagement/segmentation/addSegmentationRepresentations.ts +77 -0
  110. package/src/stateManagement/segmentation/addSegmentations.ts +27 -0
  111. package/src/stateManagement/segmentation/config/index.ts +29 -0
  112. package/src/stateManagement/segmentation/config/segmentationColor.ts +132 -0
  113. package/src/stateManagement/segmentation/config/segmentationConfig.ts +195 -0
  114. package/src/stateManagement/segmentation/config/segmentationVisibility.ts +171 -0
  115. package/src/stateManagement/segmentation/helpers/index.ts +3 -0
  116. package/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +35 -0
  117. package/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts +41 -0
  118. package/src/stateManagement/segmentation/index.ts +22 -0
  119. package/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts +85 -0
  120. package/src/stateManagement/segmentation/segmentIndex.ts +38 -0
  121. package/src/stateManagement/segmentation/segmentLocking.ts +72 -0
  122. package/src/stateManagement/segmentation/segmentationState.ts +429 -0
  123. package/src/stateManagement/segmentation/triggerSegmentationEvents.ts +157 -0
  124. package/src/store/SynchronizerManager/Synchronizer.ts +344 -0
  125. package/src/store/SynchronizerManager/createSynchronizer.ts +41 -0
  126. package/src/store/SynchronizerManager/destroy.ts +14 -0
  127. package/src/store/SynchronizerManager/destroySynchronizer.ts +25 -0
  128. package/src/store/SynchronizerManager/getAllSynchronizers.ts +12 -0
  129. package/src/store/SynchronizerManager/getSynchronizer.ts +13 -0
  130. package/src/store/SynchronizerManager/getSynchronizersForViewport.ts +44 -0
  131. package/src/store/SynchronizerManager/index.js +15 -0
  132. package/src/store/ToolGroupManager/ToolGroup.ts +679 -0
  133. package/src/store/ToolGroupManager/createToolGroup.ts +33 -0
  134. package/src/store/ToolGroupManager/destroy.ts +24 -0
  135. package/src/store/ToolGroupManager/destroyToolGroup.ts +26 -0
  136. package/src/store/ToolGroupManager/getAllToolGroups.ts +12 -0
  137. package/src/store/ToolGroupManager/getToolGroup.ts +14 -0
  138. package/src/store/ToolGroupManager/getToolGroupForViewport.ts +44 -0
  139. package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +33 -0
  140. package/src/store/ToolGroupManager/index.ts +17 -0
  141. package/src/store/addEnabledElement.ts +137 -0
  142. package/src/store/addTool.ts +56 -0
  143. package/src/store/cancelActiveManipulations.ts +30 -0
  144. package/src/store/filterMoveableAnnotationTools.ts +61 -0
  145. package/src/store/filterToolsWithAnnotationsForElement.ts +51 -0
  146. package/src/store/filterToolsWithMoveableHandles.ts +51 -0
  147. package/src/store/index.ts +29 -0
  148. package/src/store/removeEnabledElement.ts +132 -0
  149. package/src/store/state.ts +57 -0
  150. package/src/store/svgNodeCache.ts +7 -0
  151. package/src/synchronizers/callbacks/areViewportsCoplanar .ts +12 -0
  152. package/src/synchronizers/callbacks/cameraSyncCallback.ts +33 -0
  153. package/src/synchronizers/callbacks/stackImageSyncCallback.ts +157 -0
  154. package/src/synchronizers/callbacks/voiSyncCallback.ts +51 -0
  155. package/src/synchronizers/callbacks/zoomPanSyncCallback.ts +43 -0
  156. package/src/synchronizers/index.ts +11 -0
  157. package/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts +25 -0
  158. package/src/synchronizers/synchronizers/createStackImageSynchronizer.ts +25 -0
  159. package/src/synchronizers/synchronizers/createVOISynchronizer.ts +24 -0
  160. package/src/synchronizers/synchronizers/createZoomPanSynchronizer.ts +25 -0
  161. package/src/synchronizers/synchronizers/index.ts +11 -0
  162. package/src/tools/CrosshairsTool.ts +2693 -0
  163. package/src/tools/MIPJumpToClickTool.ts +99 -0
  164. package/src/tools/MagnifyTool.ts +319 -0
  165. package/src/tools/PanTool.ts +58 -0
  166. package/src/tools/PlanarRotateTool.ts +77 -0
  167. package/src/tools/ReferenceCursors.ts +466 -0
  168. package/src/tools/ReferenceLinesTool.ts +279 -0
  169. package/src/tools/ScaleOverlayTool.ts +685 -0
  170. package/src/tools/StackScrollTool.ts +97 -0
  171. package/src/tools/StackScrollToolMouseWheelTool.ts +58 -0
  172. package/src/tools/TrackballRotateTool.ts +141 -0
  173. package/src/tools/VolumeRotateMouseWheelTool.ts +86 -0
  174. package/src/tools/WindowLevelTool.ts +260 -0
  175. package/src/tools/ZoomTool.ts +293 -0
  176. package/src/tools/annotation/AngleTool.ts +835 -0
  177. package/src/tools/annotation/ArrowAnnotateTool.ts +820 -0
  178. package/src/tools/annotation/BidirectionalTool.ts +1350 -0
  179. package/src/tools/annotation/CircleROITool.ts +1070 -0
  180. package/src/tools/annotation/CobbAngleTool.ts +815 -0
  181. package/src/tools/annotation/DragProbeTool.ts +213 -0
  182. package/src/tools/annotation/EllipticalROITool.ts +1223 -0
  183. package/src/tools/annotation/LengthTool.ts +861 -0
  184. package/src/tools/annotation/PlanarFreehandROITool.ts +636 -0
  185. package/src/tools/annotation/ProbeTool.ts +681 -0
  186. package/src/tools/annotation/RectangleROITool.ts +1028 -0
  187. package/src/tools/annotation/planarFreehandROITool/closedContourEditLoop.ts +488 -0
  188. package/src/tools/annotation/planarFreehandROITool/drawLoop.ts +462 -0
  189. package/src/tools/annotation/planarFreehandROITool/editLoopCommon.ts +331 -0
  190. package/src/tools/annotation/planarFreehandROITool/findOpenUShapedContourVectorToPeak.ts +74 -0
  191. package/src/tools/annotation/planarFreehandROITool/openContourEditLoop.ts +612 -0
  192. package/src/tools/annotation/planarFreehandROITool/openContourEndEditLoop.ts +74 -0
  193. package/src/tools/annotation/planarFreehandROITool/renderMethods.ts +407 -0
  194. package/src/tools/base/AnnotationDisplayTool.ts +228 -0
  195. package/src/tools/base/AnnotationTool.ts +307 -0
  196. package/src/tools/base/BaseTool.ts +215 -0
  197. package/src/tools/base/index.ts +4 -0
  198. package/src/tools/displayTools/Contour/addContourToElement.ts +135 -0
  199. package/src/tools/displayTools/Contour/contourDisplay.ts +252 -0
  200. package/src/tools/displayTools/Contour/index.ts +3 -0
  201. package/src/tools/displayTools/Contour/removeContourFromElement.ts +35 -0
  202. package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +57 -0
  203. package/src/tools/displayTools/Labelmap/index.ts +4 -0
  204. package/src/tools/displayTools/Labelmap/labelmapConfig.ts +37 -0
  205. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +461 -0
  206. package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +27 -0
  207. package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +30 -0
  208. package/src/tools/displayTools/SegmentationDisplayTool.ts +198 -0
  209. package/src/tools/index.ts +84 -0
  210. package/src/tools/segmentation/BrushTool.ts +474 -0
  211. package/src/tools/segmentation/CircleScissorsTool.ts +365 -0
  212. package/src/tools/segmentation/PaintFillTool.ts +370 -0
  213. package/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts +471 -0
  214. package/src/tools/segmentation/RectangleROIThresholdTool.ts +281 -0
  215. package/src/tools/segmentation/RectangleScissorsTool.ts +382 -0
  216. package/src/tools/segmentation/SphereScissorsTool.ts +368 -0
  217. package/src/tools/segmentation/strategies/eraseCircle.ts +30 -0
  218. package/src/tools/segmentation/strategies/eraseRectangle.ts +81 -0
  219. package/src/tools/segmentation/strategies/eraseSphere.ts +27 -0
  220. package/src/tools/segmentation/strategies/fillCircle.ts +185 -0
  221. package/src/tools/segmentation/strategies/fillRectangle.ts +110 -0
  222. package/src/tools/segmentation/strategies/fillSphere.ts +88 -0
  223. package/src/tools/segmentation/strategies/index.ts +9 -0
  224. package/src/types/AnnotationGroupSelector.ts +7 -0
  225. package/src/types/AnnotationStyle.ts +42 -0
  226. package/src/types/AnnotationTypes.ts +109 -0
  227. package/src/types/BoundsIJK.ts +5 -0
  228. package/src/types/CINETypes.ts +32 -0
  229. package/src/types/ContourTypes.ts +26 -0
  230. package/src/types/CursorTypes.ts +12 -0
  231. package/src/types/EventTypes.ts +657 -0
  232. package/src/types/FloodFillTypes.ts +19 -0
  233. package/src/types/IAnnotationManager.ts +89 -0
  234. package/src/types/IDistance.ts +16 -0
  235. package/src/types/IPoints.ts +18 -0
  236. package/src/types/ISetToolModeOptions.ts +29 -0
  237. package/src/types/ISynchronizerEventHandler.ts +11 -0
  238. package/src/types/IToolClassReference.ts +5 -0
  239. package/src/types/IToolGroup.ts +72 -0
  240. package/src/types/ITouchPoints.ts +14 -0
  241. package/src/types/InteractionTypes.ts +6 -0
  242. package/src/types/InternalToolTypes.ts +19 -0
  243. package/src/types/JumpToSliceOptions.ts +7 -0
  244. package/src/types/LabelmapTypes.ts +41 -0
  245. package/src/types/PlanarBoundingBox.ts +8 -0
  246. package/src/types/SVGDrawingHelper.ts +10 -0
  247. package/src/types/ScrollOptions.ts +9 -0
  248. package/src/types/SegmentationStateTypes.ts +248 -0
  249. package/src/types/ToolHandle.ts +26 -0
  250. package/src/types/ToolProps.ts +16 -0
  251. package/src/types/ToolSpecificAnnotationTypes.ts +311 -0
  252. package/src/types/index.ts +115 -0
  253. package/src/utilities/boundingBox/extend2DBoundingBoxInViewAxis.ts +29 -0
  254. package/src/utilities/boundingBox/getBoundingBoxAroundShape.ts +57 -0
  255. package/src/utilities/boundingBox/index.ts +4 -0
  256. package/src/utilities/calibrateImageSpacing.ts +46 -0
  257. package/src/utilities/cine/events.ts +9 -0
  258. package/src/utilities/cine/index.ts +5 -0
  259. package/src/utilities/cine/playClip.ts +435 -0
  260. package/src/utilities/cine/state.ts +18 -0
  261. package/src/utilities/clip.js +30 -0
  262. package/src/utilities/debounce.js +217 -0
  263. package/src/utilities/drawing/getTextBoxCoordsCanvas.ts +45 -0
  264. package/src/utilities/drawing/index.ts +3 -0
  265. package/src/utilities/dynamicVolume/getDataInTime.ts +110 -0
  266. package/src/utilities/dynamicVolume/index.ts +2 -0
  267. package/src/utilities/getAnnotationNearPoint.ts +130 -0
  268. package/src/utilities/getModalityUnit.ts +11 -0
  269. package/src/utilities/getToolsWithModesForElement.ts +52 -0
  270. package/src/utilities/index.ts +68 -0
  271. package/src/utilities/isObject.js +29 -0
  272. package/src/utilities/math/angle/angleBetweenLines.ts +29 -0
  273. package/src/utilities/math/circle/_types.ts +6 -0
  274. package/src/utilities/math/circle/getCanvasCircleCorners.ts +23 -0
  275. package/src/utilities/math/circle/getCanvasCircleRadius.ts +16 -0
  276. package/src/utilities/math/circle/index.ts +4 -0
  277. package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +26 -0
  278. package/src/utilities/math/ellipse/index.ts +4 -0
  279. package/src/utilities/math/ellipse/pointInEllipse.ts +38 -0
  280. package/src/utilities/math/ellipse/pointInEllipsoidWithConstraint.ts +35 -0
  281. package/src/utilities/math/index.ts +8 -0
  282. package/src/utilities/math/line/distanceToPoint.ts +24 -0
  283. package/src/utilities/math/line/distanceToPointSquared.ts +44 -0
  284. package/src/utilities/math/line/index.ts +5 -0
  285. package/src/utilities/math/line/intersectLine.ts +92 -0
  286. package/src/utilities/math/midPoint.ts +24 -0
  287. package/src/utilities/math/point/distanceToPoint.ts +22 -0
  288. package/src/utilities/math/point/index.ts +3 -0
  289. package/src/utilities/math/polyline/addCanvasPointsToArray.ts +62 -0
  290. package/src/utilities/math/polyline/calculateAreaOfPoints.ts +23 -0
  291. package/src/utilities/math/polyline/getIntersectionWithPolyline.ts +182 -0
  292. package/src/utilities/math/polyline/getSubPixelSpacingAndXYDirections.ts +99 -0
  293. package/src/utilities/math/polyline/index.ts +19 -0
  294. package/src/utilities/math/polyline/planarFreehandROIInternalTypes.ts +36 -0
  295. package/src/utilities/math/polyline/pointCanProjectOnLine.ts +57 -0
  296. package/src/utilities/math/polyline/pointsAreWithinCloseContourProximity.ts +15 -0
  297. package/src/utilities/math/rectangle/distanceToPoint.ts +82 -0
  298. package/src/utilities/math/rectangle/index.ts +3 -0
  299. package/src/utilities/math/sphere/index.ts +3 -0
  300. package/src/utilities/math/sphere/pointInSphere.ts +31 -0
  301. package/src/utilities/math/vec2/findClosestPoint.ts +40 -0
  302. package/src/utilities/math/vec2/index.ts +4 -0
  303. package/src/utilities/math/vec2/liangBarksyClip.ts +84 -0
  304. package/src/utilities/orientation/getOrientationStringLPS.ts +52 -0
  305. package/src/utilities/orientation/index.ts +4 -0
  306. package/src/utilities/orientation/invertOrientationStringLPS.ts +21 -0
  307. package/src/utilities/planar/filterAnnotationsForDisplay.ts +68 -0
  308. package/src/utilities/planar/filterAnnotationsWithinSlice.ts +85 -0
  309. package/src/utilities/planar/getPointInLineOfSightWithCriteria.ts +104 -0
  310. package/src/utilities/planar/getWorldWidthAndHeightFromCorners.ts +51 -0
  311. package/src/utilities/planar/getWorldWidthAndHeightFromTwoPoints.ts +51 -0
  312. package/src/utilities/planar/index.ts +18 -0
  313. package/src/utilities/planarFreehandROITool/index.ts +7 -0
  314. package/src/utilities/planarFreehandROITool/interpolateAnnotation.ts +87 -0
  315. package/src/utilities/planarFreehandROITool/interpolatePoints.ts +214 -0
  316. package/src/utilities/planarFreehandROITool/interpolation/algorithms/bspline.ts +55 -0
  317. package/src/utilities/planarFreehandROITool/interpolation/interpolateSegmentPoints.ts +90 -0
  318. package/src/utilities/pointInShapeCallback.ts +138 -0
  319. package/src/utilities/pointInSurroundingSphereCallback.ts +188 -0
  320. package/src/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.ts +76 -0
  321. package/src/utilities/rectangleROITool/index.ts +3 -0
  322. package/src/utilities/scroll.ts +62 -0
  323. package/src/utilities/segmentation/brushSizeForToolGroup.ts +72 -0
  324. package/src/utilities/segmentation/brushThresholdForToolGroup.ts +65 -0
  325. package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +74 -0
  326. package/src/utilities/segmentation/createMergedLabelmapForIndex.ts +65 -0
  327. package/src/utilities/segmentation/floodFill.ts +194 -0
  328. package/src/utilities/segmentation/getDefaultRepresentationConfig.ts +20 -0
  329. package/src/utilities/segmentation/index.ts +33 -0
  330. package/src/utilities/segmentation/isValidRepresentationConfig.ts +22 -0
  331. package/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts +91 -0
  332. package/src/utilities/segmentation/thresholdSegmentationByRange.ts +129 -0
  333. package/src/utilities/segmentation/thresholdVolumeByRange.ts +150 -0
  334. package/src/utilities/segmentation/triggerSegmentationRender.ts +206 -0
  335. package/src/utilities/segmentation/utilities.ts +116 -0
  336. package/src/utilities/stackPrefetch/index.ts +8 -0
  337. package/src/utilities/stackPrefetch/stackPrefetch.ts +405 -0
  338. package/src/utilities/stackPrefetch/state.ts +17 -0
  339. package/src/utilities/throttle.js +69 -0
  340. package/src/utilities/touch/index.ts +246 -0
  341. package/src/utilities/triggerAnnotationRender.ts +237 -0
  342. package/src/utilities/triggerAnnotationRenderForViewportIds.ts +18 -0
  343. package/src/utilities/viewport/index.ts +5 -0
  344. package/src/utilities/viewport/isViewportPreScaled.ts +24 -0
  345. package/src/utilities/viewport/jumpToSlice.ts +73 -0
  346. package/src/utilities/viewport/jumpToWorld.ts +58 -0
  347. package/src/utilities/viewportFilters/filterViewportsWithFrameOfReferenceUID.ts +28 -0
  348. package/src/utilities/viewportFilters/filterViewportsWithParallelNormals.ts +26 -0
  349. package/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts +15 -0
  350. package/src/utilities/viewportFilters/filterViewportsWithToolEnabled.ts +72 -0
  351. package/src/utilities/viewportFilters/getViewportIdsWithToolToRender.ts +45 -0
  352. package/src/utilities/viewportFilters/index.ts +11 -0
@@ -0,0 +1,462 @@
1
+ import { getEnabledElement } from '@cornerstonejs/core';
2
+ import type { Types } from '@cornerstonejs/core';
3
+ import {
4
+ resetElementCursor,
5
+ hideElementCursor,
6
+ } from '../../../cursors/elementCursor';
7
+ import { Events } from '../../../enums';
8
+ import { EventTypes } from '../../../types';
9
+ import { state } from '../../../store';
10
+ import { vec3 } from 'gl-matrix';
11
+ import {
12
+ shouldInterpolate,
13
+ getInterpolatedPoints,
14
+ } from '../../../utilities/planarFreehandROITool/interpolatePoints';
15
+ import triggerAnnotationRenderForViewportIds from '../../../utilities/triggerAnnotationRenderForViewportIds';
16
+ import { PlanarFreehandROIAnnotation } from '../../../types/ToolSpecificAnnotationTypes';
17
+ import findOpenUShapedContourVectorToPeak from './findOpenUShapedContourVectorToPeak';
18
+ import { polyline } from '../../../utilities/math';
19
+ import { removeAnnotation } from '../../../stateManagement/annotation/annotationState';
20
+
21
+ const {
22
+ addCanvasPointsToArray,
23
+ pointsAreWithinCloseContourProximity,
24
+ getFirstIntersectionWithPolyline,
25
+ getSubPixelSpacingAndXYDirections,
26
+ } = polyline;
27
+
28
+ /**
29
+ * Activates the contour drawing event loop.
30
+ */
31
+ function activateDraw(
32
+ evt: EventTypes.InteractionEventType,
33
+ annotation: PlanarFreehandROIAnnotation,
34
+ viewportIdsToRender: string[]
35
+ ): void {
36
+ this.isDrawing = true;
37
+
38
+ const eventDetail = evt.detail;
39
+ const { currentPoints, element } = eventDetail;
40
+ const canvasPos = currentPoints.canvas;
41
+ const enabledElement = getEnabledElement(element);
42
+ const { viewport } = enabledElement;
43
+
44
+ const { spacing, xDir, yDir } = getSubPixelSpacingAndXYDirections(
45
+ viewport,
46
+ this.configuration.subPixelResolution
47
+ );
48
+
49
+ this.drawData = {
50
+ canvasPoints: [canvasPos],
51
+ polylineIndex: 0,
52
+ };
53
+
54
+ this.commonData = {
55
+ annotation,
56
+ viewportIdsToRender,
57
+ spacing,
58
+ xDir,
59
+ yDir,
60
+ };
61
+
62
+ state.isInteractingWithTool = true;
63
+
64
+ element.addEventListener(Events.MOUSE_UP, this.mouseUpDrawCallback);
65
+ element.addEventListener(Events.MOUSE_DRAG, this.mouseDragDrawCallback);
66
+ element.addEventListener(Events.MOUSE_CLICK, this.mouseUpDrawCallback);
67
+ element.addEventListener(Events.TOUCH_END, this.mouseUpDrawCallback);
68
+ element.addEventListener(Events.TOUCH_DRAG, this.mouseDragDrawCallback);
69
+ element.addEventListener(Events.TOUCH_TAP, this.mouseUpDrawCallback);
70
+
71
+ hideElementCursor(element);
72
+ }
73
+ /**
74
+ * Dectivates and cleans up the contour drawing event loop.
75
+ */
76
+ function deactivateDraw(element: HTMLDivElement): void {
77
+ state.isInteractingWithTool = false;
78
+
79
+ element.removeEventListener(Events.MOUSE_UP, this.mouseUpDrawCallback);
80
+ element.removeEventListener(Events.MOUSE_DRAG, this.mouseDragDrawCallback);
81
+ element.removeEventListener(Events.MOUSE_CLICK, this.mouseUpDrawCallback);
82
+ element.removeEventListener(Events.TOUCH_END, this.mouseUpDrawCallback);
83
+ element.removeEventListener(Events.TOUCH_DRAG, this.mouseDragDrawCallback);
84
+ element.removeEventListener(Events.TOUCH_TAP, this.mouseUpDrawCallback);
85
+
86
+ resetElementCursor(element);
87
+ }
88
+
89
+ /**
90
+ * Adds points to a set of preview canvas points of the contour being created.
91
+ * Checks if crossing of lines means early completion and editing needs to be started.
92
+ */
93
+ function mouseDragDrawCallback(evt: EventTypes.InteractionEventType): void {
94
+ const eventDetail = evt.detail;
95
+ const { currentPoints, element } = eventDetail;
96
+ const worldPos = currentPoints.world;
97
+ const canvasPos = currentPoints.canvas;
98
+ const enabledElement = getEnabledElement(element);
99
+ const { renderingEngine, viewport } = enabledElement;
100
+
101
+ const { viewportIdsToRender, xDir, yDir, spacing } = this.commonData;
102
+ const { polylineIndex, canvasPoints } = this.drawData;
103
+
104
+ const lastCanvasPoint = canvasPoints[canvasPoints.length - 1];
105
+ const lastWorldPoint = viewport.canvasToWorld(lastCanvasPoint);
106
+
107
+ const worldPosDiff = vec3.create();
108
+
109
+ vec3.subtract(worldPosDiff, worldPos, lastWorldPoint);
110
+
111
+ const xDist = Math.abs(vec3.dot(worldPosDiff, xDir));
112
+ const yDist = Math.abs(vec3.dot(worldPosDiff, yDir));
113
+
114
+ // Check that we have moved at least one voxel in each direction.
115
+ if (xDist <= spacing[0] && yDist <= spacing[1]) {
116
+ // Haven't changed world point enough, don't render
117
+ return;
118
+ }
119
+
120
+ const crossingIndex = this.findCrossingIndexDuringCreate(evt);
121
+
122
+ if (crossingIndex !== undefined) {
123
+ // If we have crossed our drawing line, create a closed contour and then
124
+ // start an edit.
125
+ this.applyCreateOnCross(evt, crossingIndex);
126
+ } else {
127
+ const numPointsAdded = addCanvasPointsToArray(
128
+ element,
129
+ canvasPoints,
130
+ canvasPos,
131
+ this.commonData
132
+ );
133
+
134
+ this.drawData.polylineIndex = polylineIndex + numPointsAdded;
135
+ }
136
+
137
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
138
+ }
139
+
140
+ /**
141
+ * Completes the contour on mouse up. If the `allowOpenContours` configuration
142
+ * option is `true`, checks if we should create an open or closed contour.
143
+ * If the `allowOpenContours` configuration option is `false`, always creates a
144
+ * closed contour.
145
+ */
146
+ function mouseUpDrawCallback(evt: EventTypes.InteractionEventType): void {
147
+ const { allowOpenContours } = this.configuration;
148
+ const { canvasPoints } = this.drawData;
149
+ const firstPoint = canvasPoints[0];
150
+ const lastPoint = canvasPoints[canvasPoints.length - 1];
151
+ const eventDetail = evt.detail;
152
+ const { element } = eventDetail;
153
+
154
+ if (
155
+ allowOpenContours &&
156
+ !pointsAreWithinCloseContourProximity(
157
+ firstPoint,
158
+ lastPoint,
159
+ this.configuration.closeContourProximity
160
+ )
161
+ ) {
162
+ this.completeDrawOpenContour(element);
163
+ } else {
164
+ this.completeDrawClosedContour(element);
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Completes the contour being drawn, creating a closed contour annotation. It will return true if contour is completed or false in case contour drawing is halted.
170
+ */
171
+ function completeDrawClosedContour(element: HTMLDivElement): boolean {
172
+ this.removeCrossedLinesOnCompleteDraw();
173
+ const { canvasPoints } = this.drawData;
174
+
175
+ // check and halt if necessary the drawing process, last chance to complete drawing and fire events.
176
+ if (this.haltDrawing(element, canvasPoints)) {
177
+ return false;
178
+ }
179
+
180
+ const { annotation, viewportIdsToRender } = this.commonData;
181
+ const enabledElement = getEnabledElement(element);
182
+ const { viewport, renderingEngine } = enabledElement;
183
+
184
+ // Convert annotation to world coordinates
185
+ addCanvasPointsToArray(
186
+ element,
187
+ canvasPoints,
188
+ canvasPoints[0],
189
+ this.commonData
190
+ );
191
+ // Remove last point which will be a duplicate now.
192
+ canvasPoints.pop();
193
+
194
+ const updatedPoints = shouldInterpolate(this.configuration)
195
+ ? getInterpolatedPoints(this.configuration, canvasPoints)
196
+ : canvasPoints;
197
+
198
+ // Note: -> This is pretty expensive and may not scale well with hundreds of
199
+ // contours. A future optimisation if we use this for segmentation is to re-do
200
+ // this rendering with the GPU rather than SVG.
201
+ const worldPoints = updatedPoints.map((canvasPoint) =>
202
+ viewport.canvasToWorld(canvasPoint)
203
+ );
204
+
205
+ annotation.data.polyline = worldPoints;
206
+ annotation.data.isOpenContour = false;
207
+
208
+ this.triggerAnnotationCompleted(annotation);
209
+
210
+ this.isDrawing = false;
211
+ this.drawData = undefined;
212
+ this.commonData = undefined;
213
+
214
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
215
+
216
+ this.deactivateDraw(element);
217
+
218
+ return true;
219
+ }
220
+
221
+ /**
222
+ * If lines are crossed during the draw loop, remove the points drawn over the
223
+ * crossing.
224
+ */
225
+ function removeCrossedLinesOnCompleteDraw(): void {
226
+ const { canvasPoints } = this.drawData;
227
+ const numPoints = canvasPoints.length;
228
+
229
+ const endToStart = [canvasPoints[0], canvasPoints[numPoints - 1]];
230
+ const canvasPointsMinusEnds = canvasPoints.slice(0, -1).slice(1);
231
+
232
+ const lineSegment = getFirstIntersectionWithPolyline(
233
+ canvasPointsMinusEnds,
234
+ endToStart[0],
235
+ endToStart[1],
236
+ false
237
+ );
238
+
239
+ if (lineSegment) {
240
+ const indexToRemoveUpTo = lineSegment[1];
241
+
242
+ this.drawData.canvasPoints = canvasPoints.splice(0, indexToRemoveUpTo);
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Completes the contour being drawn, creating an open contour annotation. It will return true if contour is completed or false in case contour drawing is halted.
248
+ */
249
+ function completeDrawOpenContour(element: HTMLDivElement): boolean {
250
+ const { canvasPoints } = this.drawData;
251
+
252
+ // check and halt if necessary the drawing process, last chance to complete drawing and fire events.
253
+ if (this.haltDrawing(element, canvasPoints)) {
254
+ return false;
255
+ }
256
+
257
+ const { annotation, viewportIdsToRender } = this.commonData;
258
+ const enabledElement = getEnabledElement(element);
259
+ const { viewport, renderingEngine } = enabledElement;
260
+
261
+ const updatedPoints = shouldInterpolate(this.configuration)
262
+ ? getInterpolatedPoints(this.configuration, canvasPoints)
263
+ : canvasPoints;
264
+
265
+ // Note: -> This is pretty expensive and may not scale well with hundreds of
266
+ // contours. A future optimisation if we use this for segmentation is to re-do
267
+ // this rendering with the GPU rather than SVG.
268
+ const worldPoints = updatedPoints.map((canvasPoint) =>
269
+ viewport.canvasToWorld(canvasPoint)
270
+ );
271
+
272
+ annotation.data.polyline = worldPoints;
273
+ annotation.data.isOpenContour = true;
274
+
275
+ // Add the first and last points to the list of handles. These means they
276
+ // will render handles on mouse hover.
277
+ annotation.data.handles.points = [
278
+ worldPoints[0],
279
+ worldPoints[worldPoints.length - 1],
280
+ ];
281
+
282
+ // If the annotation is an open U-shaped annotation, find the annotation vector.
283
+ if (annotation.data.isOpenUShapeContour) {
284
+ annotation.data.openUShapeContourVectorToPeak =
285
+ findOpenUShapedContourVectorToPeak(canvasPoints, viewport);
286
+ }
287
+
288
+ this.triggerAnnotationCompleted(annotation);
289
+
290
+ this.isDrawing = false;
291
+ this.drawData = undefined;
292
+ this.commonData = undefined;
293
+
294
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
295
+
296
+ this.deactivateDraw(element);
297
+
298
+ return true;
299
+ }
300
+
301
+ /**
302
+ * Searches for a crossing of the contour during create. If found, returns the
303
+ * index of the point just before the lines cross.
304
+ */
305
+ function findCrossingIndexDuringCreate(
306
+ evt: EventTypes.InteractionEventType
307
+ ): number | undefined {
308
+ // Note as we super sample the added points, we need to check the whole last mouse move, not the points
309
+ const eventDetail = evt.detail;
310
+ const { currentPoints, lastPoints } = eventDetail;
311
+ const canvasPos = currentPoints.canvas;
312
+ const lastCanvasPoint = lastPoints.canvas;
313
+
314
+ const { canvasPoints } = this.drawData;
315
+ const pointsLessLastOne = canvasPoints.slice(0, -1);
316
+
317
+ const lineSegment = getFirstIntersectionWithPolyline(
318
+ pointsLessLastOne,
319
+ canvasPos,
320
+ lastCanvasPoint,
321
+ false
322
+ );
323
+
324
+ if (lineSegment === undefined) {
325
+ return;
326
+ }
327
+
328
+ const crossingIndex = lineSegment[0];
329
+
330
+ return crossingIndex;
331
+ }
332
+
333
+ /**
334
+ * On crossing of the draw line, create a closed contour, and then start an edit
335
+ * since this occurs during a mouse drag.
336
+ */
337
+ function applyCreateOnCross(
338
+ evt: EventTypes.InteractionEventType,
339
+ crossingIndex: number
340
+ ): void {
341
+ const eventDetail = evt.detail;
342
+ const { element } = eventDetail;
343
+ const { canvasPoints } = this.drawData;
344
+ const { annotation, viewportIdsToRender } = this.commonData;
345
+
346
+ // Add points between the end point and crossing point
347
+ addCanvasPointsToArray(
348
+ element,
349
+ canvasPoints,
350
+ canvasPoints[crossingIndex],
351
+ this.commonData
352
+ );
353
+ // Remove last point which will be a duplicate now.
354
+ canvasPoints.pop();
355
+
356
+ // Remove points up to just before the crossing index
357
+ for (let i = 0; i < crossingIndex; i++) {
358
+ canvasPoints.shift();
359
+ }
360
+
361
+ if (this.completeDrawClosedContour(element)) {
362
+ // pos complete operation
363
+ this.activateClosedContourEdit(evt, annotation, viewportIdsToRender);
364
+ }
365
+ }
366
+
367
+ /**
368
+ * Completes the contour on a cancel method call during the draw loop.
369
+ */
370
+ function cancelDrawing(element: HTMLElement) {
371
+ const { allowOpenContours } = this.configuration;
372
+ const { canvasPoints } = this.drawData;
373
+ const firstPoint = canvasPoints[0];
374
+ const lastPoint = canvasPoints[canvasPoints.length - 1];
375
+
376
+ if (
377
+ allowOpenContours &&
378
+ !pointsAreWithinCloseContourProximity(
379
+ firstPoint,
380
+ lastPoint,
381
+ this.configuration.closeContourProximity
382
+ )
383
+ ) {
384
+ this.completeDrawOpenContour(element);
385
+ } else {
386
+ this.completeDrawClosedContour(element);
387
+ }
388
+ }
389
+
390
+ /**
391
+ * Tell whether a drawing should be halted or not. It will be true when canvas points is less than the minimum required.
392
+ */
393
+ function shouldHaltDrawing(
394
+ canvasPoints: any,
395
+ subPixelResolution: number
396
+ ): boolean {
397
+ const minPoints = Math.max(
398
+ /**
399
+ * The number of points to span 3 voxels in length, this is a realistically
400
+ * smallest open contour one could reasonably define (2 voxels should probably be a line).
401
+ */
402
+ subPixelResolution * 3,
403
+ /**
404
+ * Minimum 3 points, there are other annotations for one point (probe)
405
+ * or 2 points (line), so this comes only from a mistake in practice.
406
+ */
407
+ 3
408
+ );
409
+ return canvasPoints.length < minPoints;
410
+ }
411
+
412
+ /**
413
+ * Check and halt a drawing for a given event. It returns true in case drawing is halted, otherswise false.
414
+ */
415
+ function haltDrawing(element: HTMLDivElement, canvasPoints: any): boolean {
416
+ const { subPixelResolution } = this.configuration;
417
+
418
+ if (shouldHaltDrawing(canvasPoints, subPixelResolution)) {
419
+ // Remove annotation instead of completing it.
420
+ const { annotation, viewportIdsToRender } = this.commonData;
421
+ const enabledElement = getEnabledElement(element);
422
+ const { renderingEngine } = enabledElement;
423
+
424
+ removeAnnotation(annotation.annotationUID);
425
+
426
+ this.isDrawing = false;
427
+ this.drawData = undefined;
428
+ this.commonData = undefined;
429
+
430
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
431
+
432
+ this.deactivateDraw(element);
433
+
434
+ return true;
435
+ }
436
+
437
+ return false;
438
+ }
439
+
440
+ /**
441
+ * Registers the contour drawing loop to the tool instance.
442
+ */
443
+ function registerDrawLoop(toolInstance): void {
444
+ toolInstance.activateDraw = activateDraw.bind(toolInstance);
445
+ toolInstance.deactivateDraw = deactivateDraw.bind(toolInstance);
446
+
447
+ toolInstance.applyCreateOnCross = applyCreateOnCross.bind(toolInstance);
448
+ toolInstance.findCrossingIndexDuringCreate =
449
+ findCrossingIndexDuringCreate.bind(toolInstance);
450
+ toolInstance.completeDrawOpenContour =
451
+ completeDrawOpenContour.bind(toolInstance);
452
+ toolInstance.removeCrossedLinesOnCompleteDraw =
453
+ removeCrossedLinesOnCompleteDraw.bind(toolInstance);
454
+ toolInstance.mouseDragDrawCallback = mouseDragDrawCallback.bind(toolInstance);
455
+ toolInstance.mouseUpDrawCallback = mouseUpDrawCallback.bind(toolInstance);
456
+ toolInstance.completeDrawClosedContour =
457
+ completeDrawClosedContour.bind(toolInstance);
458
+ toolInstance.cancelDrawing = cancelDrawing.bind(toolInstance);
459
+ toolInstance.haltDrawing = haltDrawing.bind(toolInstance);
460
+ }
461
+
462
+ export default registerDrawLoop;