@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,488 @@
1
+ import { getEnabledElement } from '@cornerstonejs/core';
2
+ import type { Types } from '@cornerstonejs/core';
3
+ import { state } from '../../../store';
4
+ import { Events } from '../../../enums';
5
+ import {
6
+ resetElementCursor,
7
+ hideElementCursor,
8
+ } from '../../../cursors/elementCursor';
9
+ import { EventTypes } from '../../../types';
10
+ import { polyline } from '../../../utilities/math';
11
+ import { vec3, vec2 } from 'gl-matrix';
12
+ import { PlanarFreehandROIAnnotation } from '../../../types/ToolSpecificAnnotationTypes';
13
+ import {
14
+ getInterpolatedPoints,
15
+ shouldInterpolate,
16
+ } from '../../../utilities/planarFreehandROITool/interpolatePoints';
17
+ import triggerAnnotationRenderForViewportIds from '../../../utilities/triggerAnnotationRenderForViewportIds';
18
+
19
+ const {
20
+ getSubPixelSpacingAndXYDirections,
21
+ addCanvasPointsToArray,
22
+ calculateAreaOfPoints,
23
+ } = polyline;
24
+
25
+ /**
26
+ * Activates the closed contour edit event loop.
27
+ */
28
+ function activateClosedContourEdit(
29
+ evt: EventTypes.InteractionEventType,
30
+ annotation: PlanarFreehandROIAnnotation,
31
+ viewportIdsToRender: string[]
32
+ ): void {
33
+ this.isEditingClosed = true;
34
+
35
+ const eventDetail = evt.detail;
36
+ const { currentPoints, element } = eventDetail;
37
+ const canvasPos = currentPoints.canvas;
38
+ const enabledElement = getEnabledElement(element);
39
+ const { viewport } = enabledElement;
40
+
41
+ const prevCanvasPoints = annotation.data.polyline.map(viewport.worldToCanvas);
42
+
43
+ const { spacing, xDir, yDir } = getSubPixelSpacingAndXYDirections(
44
+ viewport,
45
+ this.configuration.subPixelResolution
46
+ );
47
+
48
+ this.editData = {
49
+ prevCanvasPoints,
50
+ editCanvasPoints: [canvasPos],
51
+ startCrossingIndex: undefined,
52
+ editIndex: 0,
53
+ };
54
+
55
+ this.commonData = {
56
+ annotation,
57
+ viewportIdsToRender,
58
+ spacing,
59
+ xDir,
60
+ yDir,
61
+ };
62
+
63
+ state.isInteractingWithTool = true;
64
+
65
+ element.addEventListener(
66
+ Events.MOUSE_UP,
67
+ this.mouseUpClosedContourEditCallback
68
+ );
69
+ element.addEventListener(
70
+ Events.MOUSE_DRAG,
71
+ this.mouseDragClosedContourEditCallback
72
+ );
73
+ element.addEventListener(
74
+ Events.MOUSE_CLICK,
75
+ this.mouseUpClosedContourEditCallback
76
+ );
77
+
78
+ element.addEventListener(
79
+ Events.TOUCH_END,
80
+ this.mouseUpClosedContourEditCallback
81
+ );
82
+ element.addEventListener(
83
+ Events.TOUCH_DRAG,
84
+ this.mouseDragClosedContourEditCallback
85
+ );
86
+ element.addEventListener(
87
+ Events.TOUCH_TAP,
88
+ this.mouseUpClosedContourEditCallback
89
+ );
90
+
91
+ hideElementCursor(element);
92
+ }
93
+
94
+ /**
95
+ * Dectivates and cleans up the closed contour edit event loop.
96
+ */
97
+ function deactivateClosedContourEdit(element: HTMLDivElement): void {
98
+ state.isInteractingWithTool = false;
99
+
100
+ element.removeEventListener(
101
+ Events.MOUSE_UP,
102
+ this.mouseUpClosedContourEditCallback
103
+ );
104
+ element.removeEventListener(
105
+ Events.MOUSE_DRAG,
106
+ this.mouseDragClosedContourEditCallback
107
+ );
108
+ element.removeEventListener(
109
+ Events.MOUSE_CLICK,
110
+ this.mouseUpClosedContourEditCallback
111
+ );
112
+
113
+ element.removeEventListener(
114
+ Events.TOUCH_END,
115
+ this.mouseUpClosedContourEditCallback
116
+ );
117
+ element.removeEventListener(
118
+ Events.TOUCH_DRAG,
119
+ this.mouseDragClosedContourEditCallback
120
+ );
121
+ element.removeEventListener(
122
+ Events.TOUCH_TAP,
123
+ this.mouseUpClosedContourEditCallback
124
+ );
125
+
126
+ resetElementCursor(element);
127
+ }
128
+
129
+ /**
130
+ * Adds points to the edit line and calculates the preview of the edit to render.
131
+ * Checks if an edit needs to be completed by crossing of lines, or by editing in
132
+ * a way that requires a new edit to keep the contour a simple polygon.
133
+ */
134
+ function mouseDragClosedContourEditCallback(
135
+ evt: EventTypes.InteractionEventType
136
+ ): Types.Point2[] {
137
+ const eventDetail = evt.detail;
138
+ const { currentPoints, element } = eventDetail;
139
+ const worldPos = currentPoints.world;
140
+ const canvasPos = currentPoints.canvas;
141
+ const enabledElement = getEnabledElement(element);
142
+ const { renderingEngine, viewport } = enabledElement;
143
+
144
+ const { viewportIdsToRender, xDir, yDir, spacing } = this.commonData;
145
+ const { editIndex, editCanvasPoints, startCrossingIndex } = this.editData;
146
+
147
+ const lastCanvasPoint = editCanvasPoints[editCanvasPoints.length - 1];
148
+ const lastWorldPoint = viewport.canvasToWorld(lastCanvasPoint);
149
+
150
+ const worldPosDiff = vec3.create();
151
+
152
+ vec3.subtract(worldPosDiff, worldPos, lastWorldPoint);
153
+
154
+ const xDist = Math.abs(vec3.dot(worldPosDiff, xDir));
155
+ const yDist = Math.abs(vec3.dot(worldPosDiff, yDir));
156
+
157
+ // Check that we have moved at least one voxel in each direction.
158
+ if (xDist <= spacing[0] && yDist <= spacing[1]) {
159
+ // Haven't changed world point enough, don't render
160
+ return;
161
+ }
162
+
163
+ if (startCrossingIndex !== undefined) {
164
+ // Edge case: If the edit line itself crosses, remove part of that edit line so we don't
165
+ // Get isolated regions.
166
+ this.checkAndRemoveCrossesOnEditLine(evt);
167
+ }
168
+
169
+ const numPointsAdded = addCanvasPointsToArray(
170
+ element,
171
+ editCanvasPoints,
172
+ canvasPos,
173
+ this.commonData
174
+ );
175
+
176
+ const currentEditIndex = editIndex + numPointsAdded;
177
+
178
+ this.editData.editIndex = currentEditIndex;
179
+
180
+ if (startCrossingIndex === undefined && editCanvasPoints.length > 1) {
181
+ // If we haven't found the index of the first crossing yet,
182
+ // see if we can find it.
183
+ this.checkForFirstCrossing(evt, true);
184
+ }
185
+
186
+ this.editData.snapIndex = this.findSnapIndex();
187
+
188
+ if (this.editData.snapIndex === -1) {
189
+ // No point on the prevCanvasPoints for the editCanvasPoints line to
190
+ // snap to. Apply edit, and start a new edit as we've gone back on ourselves.
191
+ this.finishEditAndStartNewEdit(evt);
192
+ return;
193
+ }
194
+
195
+ this.editData.fusedCanvasPoints = this.fuseEditPointsWithClosedContour(evt);
196
+
197
+ if (
198
+ startCrossingIndex !== undefined &&
199
+ this.checkForSecondCrossing(evt, true)
200
+ ) {
201
+ // Crossed a second time, apply edit, and start a new edit from the crossing.
202
+ this.removePointsAfterSecondCrossing(true);
203
+ this.finishEditAndStartNewEdit(evt);
204
+ }
205
+
206
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
207
+ }
208
+
209
+ /**
210
+ * Finish the current edit, and start a new one.
211
+ */
212
+ function finishEditAndStartNewEdit(evt: EventTypes.InteractionEventType): void {
213
+ const eventDetail = evt.detail;
214
+ const { element } = eventDetail;
215
+ const enabledElement = getEnabledElement(element);
216
+ const { viewport, renderingEngine } = enabledElement;
217
+
218
+ const { annotation, viewportIdsToRender } = this.commonData;
219
+ const { fusedCanvasPoints, editCanvasPoints } = this.editData;
220
+
221
+ const worldPoints = fusedCanvasPoints.map((canvasPoint) =>
222
+ viewport.canvasToWorld(canvasPoint)
223
+ );
224
+
225
+ annotation.data.polyline = worldPoints;
226
+ annotation.data.isOpenContour = false;
227
+
228
+ this.triggerAnnotationModified(annotation, enabledElement);
229
+
230
+ const lastEditCanvasPoint = editCanvasPoints.pop();
231
+
232
+ this.editData = {
233
+ prevCanvasPoints: fusedCanvasPoints,
234
+ editCanvasPoints: [lastEditCanvasPoint],
235
+ startCrossingIndex: undefined,
236
+ editIndex: 0,
237
+ snapIndex: undefined,
238
+ };
239
+
240
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
241
+ }
242
+
243
+ /**
244
+ * This method combines the contour before editing (prevCanvasPoints) with
245
+ * the current edit (editCanvasPoints), to produce a renderable preview of the
246
+ * edit. Upon finishing the contour, the preview generated here is written back
247
+ * into the contour state.
248
+ *
249
+ * @privateRemarks In this method we combine a few tricks to find the optimal
250
+ * contour:
251
+ * - As the contour is closed, our edit might stradle the boundary between the
252
+ * last and 0th point of the contour, e.g. a small edit might go from e.g. index
253
+ * 960 to index 4. We therefore calculate two possible contours, and find the
254
+ * one with the biggest area, which will define the actual edit the user desired.
255
+ * - As the contour and the edit can be drawn with different chiralities, we find if
256
+ * the edit line aligns better with the intended cross points in its current order
257
+ * or reversed. We do this by minimising the distance between its ends and the
258
+ * intended crossing points.
259
+ */
260
+ function fuseEditPointsWithClosedContour(
261
+ evt: EventTypes.InteractionEventType
262
+ ): Types.Point2[] {
263
+ const { prevCanvasPoints, editCanvasPoints, startCrossingIndex, snapIndex } =
264
+ this.editData;
265
+
266
+ if (startCrossingIndex === undefined || snapIndex === undefined) {
267
+ return;
268
+ }
269
+
270
+ const eventDetail = evt.detail;
271
+ const { element } = eventDetail;
272
+
273
+ // Augment the editCanvasPoints array, between the end of edit and the snap index.
274
+ const augmentedEditCanvasPoints = [...editCanvasPoints];
275
+
276
+ addCanvasPointsToArray(
277
+ element,
278
+ augmentedEditCanvasPoints,
279
+ prevCanvasPoints[snapIndex],
280
+ this.commonData
281
+ );
282
+
283
+ if (augmentedEditCanvasPoints.length > editCanvasPoints.length) {
284
+ // If any points added, remove the last point, which will be a clone of the snapIndex
285
+ augmentedEditCanvasPoints.pop();
286
+ }
287
+
288
+ // Calculate the distances between the first and last edit points and the origin of the
289
+ // Contour with the snap point. These will be used to see which way around the edit array should be
290
+ // Placed within the preview.
291
+ let lowIndex;
292
+ let highIndex;
293
+
294
+ if (startCrossingIndex > snapIndex) {
295
+ lowIndex = snapIndex;
296
+ highIndex = startCrossingIndex;
297
+ } else {
298
+ lowIndex = startCrossingIndex;
299
+ highIndex = snapIndex;
300
+ }
301
+
302
+ const distanceBetweenLowAndFirstPoint = vec2.distance(
303
+ prevCanvasPoints[lowIndex],
304
+ augmentedEditCanvasPoints[0]
305
+ );
306
+
307
+ const distanceBetweenLowAndLastPoint = vec2.distance(
308
+ prevCanvasPoints[lowIndex],
309
+ augmentedEditCanvasPoints[augmentedEditCanvasPoints.length - 1]
310
+ );
311
+
312
+ const distanceBetweenHighAndFirstPoint = vec2.distance(
313
+ prevCanvasPoints[highIndex],
314
+ augmentedEditCanvasPoints[0]
315
+ );
316
+
317
+ const distanceBetweenHighAndLastPoint = vec2.distance(
318
+ prevCanvasPoints[highIndex],
319
+ augmentedEditCanvasPoints[augmentedEditCanvasPoints.length - 1]
320
+ );
321
+
322
+ // Generate two possible contours that could be intepreted from the edit:
323
+ //
324
+ // pointSet1 => 0 -> low -> edit -> high - max.
325
+ // pointSet2 => low -> high -> edit
326
+ //
327
+ // Depending on the placement of the edit and the origin, either of these could be the intended edit.
328
+ // We'll choose the one with the largest area, as edits are considered to be changes to the original area with
329
+ // A relative change of much less than unity.
330
+
331
+ // Point Set 1
332
+ const pointSet1 = [];
333
+
334
+ // Add points from the orignal contour origin up to the low index.
335
+ for (let i = 0; i < lowIndex; i++) {
336
+ const canvasPoint = prevCanvasPoints[i];
337
+
338
+ pointSet1.push([canvasPoint[0], canvasPoint[1]]);
339
+ }
340
+
341
+ // Check which orientation of the edit line minimizes the distance between the
342
+ // origial contour low/high points and the start/end nodes of the edit line.
343
+
344
+ let inPlaceDistance =
345
+ distanceBetweenLowAndFirstPoint + distanceBetweenHighAndLastPoint;
346
+
347
+ let reverseDistance =
348
+ distanceBetweenLowAndLastPoint + distanceBetweenHighAndFirstPoint;
349
+
350
+ if (inPlaceDistance < reverseDistance) {
351
+ for (let i = 0; i < augmentedEditCanvasPoints.length; i++) {
352
+ const canvasPoint = augmentedEditCanvasPoints[i];
353
+
354
+ pointSet1.push([canvasPoint[0], canvasPoint[1]]);
355
+ }
356
+ } else {
357
+ for (let i = augmentedEditCanvasPoints.length - 1; i >= 0; i--) {
358
+ const canvasPoint = augmentedEditCanvasPoints[i];
359
+
360
+ pointSet1.push([canvasPoint[0], canvasPoint[1]]);
361
+ }
362
+ }
363
+
364
+ // Add points from the orignal contour's high index up to to its end point.
365
+ for (let i = highIndex; i < prevCanvasPoints.length; i++) {
366
+ const canvasPoint = prevCanvasPoints[i];
367
+
368
+ pointSet1.push([canvasPoint[0], canvasPoint[1]]);
369
+ }
370
+
371
+ // Point Set 2
372
+ const pointSet2 = [];
373
+
374
+ for (let i = lowIndex; i < highIndex; i++) {
375
+ const canvasPoint = prevCanvasPoints[i];
376
+
377
+ pointSet2.push([canvasPoint[0], canvasPoint[1]]);
378
+ }
379
+
380
+ inPlaceDistance =
381
+ distanceBetweenHighAndFirstPoint + distanceBetweenLowAndLastPoint;
382
+
383
+ reverseDistance =
384
+ distanceBetweenHighAndLastPoint + distanceBetweenLowAndFirstPoint;
385
+
386
+ if (inPlaceDistance < reverseDistance) {
387
+ for (let i = 0; i < augmentedEditCanvasPoints.length; i++) {
388
+ const canvasPoint = augmentedEditCanvasPoints[i];
389
+
390
+ pointSet2.push([canvasPoint[0], canvasPoint[1]]);
391
+ }
392
+ } else {
393
+ for (let i = augmentedEditCanvasPoints.length - 1; i >= 0; i--) {
394
+ const canvasPoint = augmentedEditCanvasPoints[i];
395
+
396
+ pointSet2.push([canvasPoint[0], canvasPoint[1]]);
397
+ }
398
+ }
399
+
400
+ const areaPointSet1 = calculateAreaOfPoints(pointSet1);
401
+ const areaPointSet2 = calculateAreaOfPoints(pointSet2);
402
+
403
+ const pointsToRender: Types.Point2[] =
404
+ areaPointSet1 > areaPointSet2 ? pointSet1 : pointSet2;
405
+
406
+ return pointsToRender;
407
+ }
408
+
409
+ /**
410
+ * Completes the edit of the closed contour when the mouse button is released.
411
+ */
412
+ function mouseUpClosedContourEditCallback(
413
+ evt: EventTypes.InteractionEventType
414
+ ): void {
415
+ const eventDetail = evt.detail;
416
+ const { element } = eventDetail;
417
+
418
+ this.completeClosedContourEdit(element);
419
+ }
420
+
421
+ /**
422
+ * Completes the edit of the closed contour when the mouse button is released.
423
+ */
424
+ function completeClosedContourEdit(element: HTMLDivElement) {
425
+ const enabledElement = getEnabledElement(element);
426
+ const { viewport, renderingEngine } = enabledElement;
427
+
428
+ const { annotation, viewportIdsToRender } = this.commonData;
429
+ const { fusedCanvasPoints, prevCanvasPoints } = this.editData;
430
+
431
+ if (fusedCanvasPoints) {
432
+ const updatedPoints = shouldInterpolate(this.configuration)
433
+ ? getInterpolatedPoints(
434
+ this.configuration,
435
+ fusedCanvasPoints,
436
+ prevCanvasPoints
437
+ )
438
+ : fusedCanvasPoints;
439
+
440
+ const worldPoints = updatedPoints.map((canvasPoint) =>
441
+ viewport.canvasToWorld(canvasPoint)
442
+ );
443
+ annotation.data.polyline = worldPoints;
444
+ annotation.data.isOpenContour = false;
445
+
446
+ this.triggerAnnotationModified(annotation, enabledElement);
447
+ }
448
+
449
+ this.isEditingClosed = false;
450
+ this.editData = undefined;
451
+ this.commonData = undefined;
452
+
453
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
454
+
455
+ this.deactivateClosedContourEdit(element);
456
+ }
457
+
458
+ /**
459
+ * Completes the edit on a cancel method call during the closed
460
+ * contour edit loop.
461
+ */
462
+ function cancelClosedContourEdit(element: HTMLDivElement) {
463
+ this.completeClosedContourEdit(element);
464
+ }
465
+
466
+ /**
467
+ * Registers the closed contour edit loop to the tool instance.
468
+ */
469
+ function registerClosedContourEditLoop(toolInstance): void {
470
+ toolInstance.activateClosedContourEdit =
471
+ activateClosedContourEdit.bind(toolInstance);
472
+ toolInstance.deactivateClosedContourEdit =
473
+ deactivateClosedContourEdit.bind(toolInstance);
474
+ toolInstance.mouseDragClosedContourEditCallback =
475
+ mouseDragClosedContourEditCallback.bind(toolInstance);
476
+ toolInstance.mouseUpClosedContourEditCallback =
477
+ mouseUpClosedContourEditCallback.bind(toolInstance);
478
+ toolInstance.finishEditAndStartNewEdit =
479
+ finishEditAndStartNewEdit.bind(toolInstance);
480
+ toolInstance.fuseEditPointsWithClosedContour =
481
+ fuseEditPointsWithClosedContour.bind(toolInstance);
482
+ toolInstance.cancelClosedContourEdit =
483
+ cancelClosedContourEdit.bind(toolInstance);
484
+ toolInstance.completeClosedContourEdit =
485
+ completeClosedContourEdit.bind(toolInstance);
486
+ }
487
+
488
+ export default registerClosedContourEditLoop;