@cornerstonejs/tools 0.56.2 → 0.56.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,331 @@
1
+ import { Types } from '@cornerstonejs/core';
2
+ import { vec2 } from 'gl-matrix';
3
+ import { polyline } from '../../../utilities/math';
4
+ import { EventTypes } from '../../../types';
5
+
6
+ const { addCanvasPointsToArray, getFirstIntersectionWithPolyline } = polyline;
7
+
8
+ /**
9
+ * Check if the `editCanvasPoints` have crossed the `prevCanvasPoints` during
10
+ * an edit.
11
+ *
12
+ * @privateRemarks The following tricks are required to make the UX smooth and
13
+ * the editing not very picky on exactly where you click:
14
+ * - If we don't cross after 2 points, but projecting the line backwards the
15
+ * proximity distance means we cross, extend the line back.
16
+ * - If we travel the full proximity in canvas points but don't cross a line, we
17
+ * are likely drawing along the line, which is intuitive to the user. At this point
18
+ * snap the start of the edit to the closest place on the `prevCanvasPoints`,
19
+ * so that the edit can be executed in-line.
20
+ */
21
+ function checkForFirstCrossing(
22
+ evt: EventTypes.InteractionEventType,
23
+ isClosedContour: boolean
24
+ ): void {
25
+ const eventDetail = evt.detail;
26
+ const { element, currentPoints, lastPoints } = eventDetail;
27
+ const canvasPos = currentPoints.canvas;
28
+ const lastCanvasPoint = lastPoints.canvas;
29
+ const { editCanvasPoints, prevCanvasPoints } = this.editData;
30
+
31
+ const crossedLineSegment = getFirstIntersectionWithPolyline(
32
+ prevCanvasPoints,
33
+ canvasPos,
34
+ lastCanvasPoint,
35
+ isClosedContour
36
+ );
37
+
38
+ if (crossedLineSegment) {
39
+ this.editData.startCrossingIndex = crossedLineSegment[0];
40
+
41
+ // On the first crossing, remove the first lines prior to the crossing
42
+ this.removePointsUpUntilFirstCrossing(isClosedContour);
43
+ // prevent continue if there are not the minimum of points for this op.
44
+ } else if (prevCanvasPoints.length >= 2) {
45
+ if (
46
+ editCanvasPoints.length >
47
+ this.configuration.checkCanvasEditFallbackProximity
48
+ ) {
49
+ // At this point, likely we are drawing along the line, we are past the proximity for grabbing.
50
+ // Search for nearest line segment to the start of the edit.
51
+ // Set the crossing index to the lower index of the segment.
52
+
53
+ const firstEditCanvasPoint = editCanvasPoints[0];
54
+
55
+ const distanceIndexPairs = [];
56
+
57
+ for (let i = 0; i < prevCanvasPoints.length; i++) {
58
+ const prevCanvasPoint = prevCanvasPoints[i];
59
+ const distance = vec2.distance(prevCanvasPoint, firstEditCanvasPoint);
60
+
61
+ distanceIndexPairs.push({ distance, index: i });
62
+ }
63
+
64
+ distanceIndexPairs.sort((a, b) => a.distance - b.distance);
65
+
66
+ const twoClosestDistanceIndexPairs = [
67
+ distanceIndexPairs[0],
68
+ distanceIndexPairs[1],
69
+ ];
70
+
71
+ const lowestIndex = Math.min(
72
+ twoClosestDistanceIndexPairs[0].index,
73
+ twoClosestDistanceIndexPairs[1].index
74
+ );
75
+
76
+ this.editData.startCrossingIndex = lowestIndex;
77
+ } else {
78
+ // Check if extending a line back 6 (Proximity) canvas pixels would cross a line.
79
+
80
+ // Extend point back 6 canvas pixels from first point.
81
+ const dir = vec2.create();
82
+
83
+ vec2.subtract(dir, editCanvasPoints[1], editCanvasPoints[0]);
84
+ vec2.normalize(dir, dir);
85
+
86
+ const proximity = 6;
87
+
88
+ const extendedPoint: Types.Point2 = [
89
+ editCanvasPoints[0][0] - dir[0] * proximity,
90
+ editCanvasPoints[0][1] - dir[1] * proximity,
91
+ ];
92
+
93
+ const crossedLineSegmentFromExtendedPoint =
94
+ getFirstIntersectionWithPolyline(
95
+ prevCanvasPoints,
96
+ extendedPoint,
97
+ editCanvasPoints[0],
98
+ isClosedContour
99
+ );
100
+
101
+ if (crossedLineSegmentFromExtendedPoint) {
102
+ // Add points.
103
+ const pointsToPrepend = [extendedPoint];
104
+
105
+ addCanvasPointsToArray(
106
+ element,
107
+ pointsToPrepend,
108
+ editCanvasPoints[0],
109
+ this.commonData
110
+ );
111
+
112
+ editCanvasPoints.unshift(...pointsToPrepend);
113
+
114
+ this.removePointsUpUntilFirstCrossing(isClosedContour);
115
+
116
+ this.editData.editIndex = editCanvasPoints.length - 1;
117
+ this.editData.startCrossingIndex =
118
+ crossedLineSegmentFromExtendedPoint[0];
119
+ }
120
+ }
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Removes the points from the `editCanvasPoints` up until the first crossing of
126
+ * the `prevCanvasPoints`. This is so we can just insert this line segment
127
+ * into the contour.
128
+ */
129
+ function removePointsUpUntilFirstCrossing(isClosedContour: boolean): void {
130
+ const { editCanvasPoints, prevCanvasPoints } = this.editData;
131
+ let numPointsToRemove = 0;
132
+
133
+ for (let i = 0; i < editCanvasPoints.length - 1; i++) {
134
+ const firstLine = [editCanvasPoints[i], editCanvasPoints[i + 1]];
135
+
136
+ const didCrossLine = !!getFirstIntersectionWithPolyline(
137
+ prevCanvasPoints,
138
+ firstLine[0],
139
+ firstLine[1],
140
+ isClosedContour
141
+ );
142
+
143
+ // Remove last element
144
+ numPointsToRemove++;
145
+
146
+ if (didCrossLine) {
147
+ break;
148
+ }
149
+ }
150
+
151
+ // Remove the points
152
+ editCanvasPoints.splice(0, numPointsToRemove);
153
+
154
+ this.editData.editIndex = editCanvasPoints.length - 1;
155
+ }
156
+
157
+ /**
158
+ * Returns `true` if the `editCanvasPoints` crosses the `prevCanvasPoints` a
159
+ * second time.
160
+ */
161
+ function checkForSecondCrossing(
162
+ evt: EventTypes.InteractionEventType,
163
+ isClosedContour: boolean
164
+ ): boolean {
165
+ const eventDetail = evt.detail;
166
+ const { currentPoints, lastPoints } = eventDetail;
167
+ const canvasPos = currentPoints.canvas;
168
+ const lastCanvasPoint = lastPoints.canvas;
169
+ const { prevCanvasPoints } = this.editData;
170
+
171
+ // Note this method is looking for the first corssing found of
172
+ // *the lines given* to it. The parameters given to it are specified to search
173
+ // for the second crossing of the prevCanvasPoints, by checking if the last
174
+ // mouse drag crossed these. This class method is only called if the edit loop
175
+ // has already has a crossing earlier in the edit.
176
+ const crossedLineSegment = getFirstIntersectionWithPolyline(
177
+ prevCanvasPoints,
178
+ canvasPos,
179
+ lastCanvasPoint,
180
+ isClosedContour
181
+ );
182
+
183
+ if (!crossedLineSegment) {
184
+ return false;
185
+ }
186
+
187
+ return true;
188
+ }
189
+
190
+ /**
191
+ * Removes the points from the `editCanvasPoints` after the second crossing of
192
+ * the `prevCanvasPoints`. This is so we can just insert this line segment
193
+ * into the contour.
194
+ */
195
+ function removePointsAfterSecondCrossing(isClosedContour: boolean): void {
196
+ const { prevCanvasPoints, editCanvasPoints } = this.editData;
197
+
198
+ // Remove points after the crossing
199
+ for (let i = editCanvasPoints.length - 1; i > 0; i--) {
200
+ const lastLine = [editCanvasPoints[i], editCanvasPoints[i - 1]];
201
+
202
+ const didCrossLine = !!getFirstIntersectionWithPolyline(
203
+ prevCanvasPoints,
204
+ lastLine[0],
205
+ lastLine[1],
206
+ isClosedContour
207
+ );
208
+
209
+ // Remove last element
210
+ editCanvasPoints.pop();
211
+
212
+ if (didCrossLine) {
213
+ break;
214
+ }
215
+ }
216
+ }
217
+
218
+ /**
219
+ * During an edit, finds the index on the `prevCanvasPoints` that the
220
+ * `editCanvasPoints` should snap to to create one continuous contour.
221
+ *
222
+ * Returns the index, but returns -1 if there is no index on the
223
+ * `prevCanvasPoints` that can be snapped to with causing a crossing of the
224
+ * `editCanvasPoints`.
225
+ */
226
+ function findSnapIndex(): number {
227
+ const { editCanvasPoints, prevCanvasPoints, startCrossingIndex } =
228
+ this.editData;
229
+
230
+ if (
231
+ startCrossingIndex === undefined // Haven't crossed line yet
232
+ ) {
233
+ return;
234
+ }
235
+
236
+ const lastEditCanvasPoint = editCanvasPoints[editCanvasPoints.length - 1];
237
+
238
+ const distanceIndexPairs = [];
239
+
240
+ for (let i = 0; i < prevCanvasPoints.length; i++) {
241
+ const prevCanvasPoint = prevCanvasPoints[i];
242
+ const distance = vec2.distance(prevCanvasPoint, lastEditCanvasPoint);
243
+
244
+ distanceIndexPairs.push({ distance, index: i });
245
+ }
246
+
247
+ distanceIndexPairs.sort((a, b) => a.distance - b.distance);
248
+
249
+ // Search through from shortest distance and check which snap line doesn't
250
+ // Cross the edit line, in most cases the snap index will just be the first one.
251
+ const editCanvasPointsLessLastOne = editCanvasPoints.slice(0, -1);
252
+
253
+ for (let i = 0; i < distanceIndexPairs.length; i++) {
254
+ const { index } = distanceIndexPairs[i];
255
+ const snapCanvasPosition = prevCanvasPoints[index];
256
+ const lastEditCanvasPoint = editCanvasPoints[editCanvasPoints.length - 1];
257
+
258
+ const crossedLineSegment = getFirstIntersectionWithPolyline(
259
+ editCanvasPointsLessLastOne,
260
+ snapCanvasPosition,
261
+ lastEditCanvasPoint,
262
+ false // The edit line is not a closed contour
263
+ );
264
+
265
+ if (!crossedLineSegment) {
266
+ return index;
267
+ }
268
+ }
269
+
270
+ // If all of the lines caused a crossing, this means we should start a new edit.
271
+ // Use -1 to signify this.
272
+ return -1;
273
+ }
274
+
275
+ /**
276
+ * Checks if the `editCanvasPoints` cross themselves. If they do, remove the
277
+ * region after the cross index, these removes isolated "island" loops that the
278
+ * user can draw which make closed contours no longer simple polygons, or open
279
+ * contours twisted.
280
+ */
281
+ function checkAndRemoveCrossesOnEditLine(
282
+ evt: EventTypes.InteractionEventType
283
+ ): number | undefined {
284
+ const eventDetail = evt.detail;
285
+ const { currentPoints, lastPoints } = eventDetail;
286
+ const canvasPos = currentPoints.canvas;
287
+ const lastCanvasPoint = lastPoints.canvas;
288
+
289
+ const { editCanvasPoints } = this.editData;
290
+
291
+ const editCanvasPointsLessLastOne = editCanvasPoints.slice(0, -2);
292
+
293
+ const crossedLineSegment = getFirstIntersectionWithPolyline(
294
+ editCanvasPointsLessLastOne,
295
+ canvasPos,
296
+ lastCanvasPoint,
297
+ false
298
+ );
299
+
300
+ if (!crossedLineSegment) {
301
+ return;
302
+ }
303
+
304
+ // We have found a crossing, remove points after the crossing, cutting off
305
+ // the "island" loop drawn.
306
+
307
+ const editIndexCrossed = crossedLineSegment[0];
308
+ const numPointsToRemove = editCanvasPoints.length - editIndexCrossed;
309
+
310
+ for (let i = 0; i < numPointsToRemove; i++) {
311
+ editCanvasPoints.pop();
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Registers the contour drawing loop to the tool instance.
317
+ */
318
+ function registerEditLoopCommon(toolInstance) {
319
+ toolInstance.checkForFirstCrossing = checkForFirstCrossing.bind(toolInstance);
320
+ toolInstance.removePointsUpUntilFirstCrossing =
321
+ removePointsUpUntilFirstCrossing.bind(toolInstance);
322
+ toolInstance.checkForSecondCrossing =
323
+ checkForSecondCrossing.bind(toolInstance);
324
+ toolInstance.findSnapIndex = findSnapIndex.bind(toolInstance);
325
+ toolInstance.removePointsAfterSecondCrossing =
326
+ removePointsAfterSecondCrossing.bind(toolInstance);
327
+ toolInstance.checkAndRemoveCrossesOnEditLine =
328
+ checkAndRemoveCrossesOnEditLine.bind(toolInstance);
329
+ }
330
+
331
+ export default registerEditLoopCommon;
@@ -0,0 +1,74 @@
1
+ import type { Types } from '@cornerstonejs/core';
2
+ import { PlanarFreehandROIAnnotation } from '../../../types/ToolSpecificAnnotationTypes';
3
+ import { vec2 } from 'gl-matrix';
4
+
5
+ /**
6
+ * Finds the length of the longest line from the midpoint of the line
7
+ * that joins the start and end of the open contour, to the surface of the
8
+ * open contour.
9
+ */
10
+ export default function findOpenUShapedContourVectorToPeak(
11
+ canvasPoints: Types.Point2[],
12
+ viewport: Types.IStackViewport | Types.IVolumeViewport
13
+ ): Types.Point3[] {
14
+ // Find chord from first to last point.
15
+ const first = canvasPoints[0];
16
+ const last = canvasPoints[canvasPoints.length - 1];
17
+
18
+ const firstToLastUnitVector = vec2.create();
19
+
20
+ vec2.set(firstToLastUnitVector, last[0] - first[0], last[1] - first[1]);
21
+ vec2.normalize(firstToLastUnitVector, firstToLastUnitVector);
22
+
23
+ // Get the two possible normal vector to this vector
24
+ // Note: Use the identity that the perpendicular line must have a gradient of
25
+ // 1 / gradient of the line.
26
+
27
+ const normalVector1 = vec2.create();
28
+ const normalVector2 = vec2.create();
29
+
30
+ vec2.set(normalVector1, -firstToLastUnitVector[1], firstToLastUnitVector[0]);
31
+ vec2.set(normalVector2, firstToLastUnitVector[1], -firstToLastUnitVector[0]);
32
+
33
+ // Find the center of the chord.
34
+ const centerOfFirstToLast: Types.Point2 = [
35
+ (first[0] + last[0]) / 2,
36
+ (first[1] + last[1]) / 2,
37
+ ];
38
+
39
+ // Get furthest point.
40
+
41
+ const furthest = {
42
+ dist: 0,
43
+ index: null,
44
+ };
45
+
46
+ for (let i = 0; i < canvasPoints.length; i++) {
47
+ const canvasPoint = canvasPoints[i];
48
+
49
+ const distance = vec2.dist(canvasPoint, <vec2>centerOfFirstToLast);
50
+
51
+ if (distance > furthest.dist) {
52
+ furthest.dist = distance;
53
+ furthest.index = i;
54
+ }
55
+ }
56
+
57
+ const toFurthest: [Types.Point2, Types.Point2] = [
58
+ canvasPoints[furthest.index],
59
+ centerOfFirstToLast,
60
+ ];
61
+ const toFurthestWorld = toFurthest.map(viewport.canvasToWorld);
62
+
63
+ return toFurthestWorld;
64
+ }
65
+
66
+ export function findOpenUShapedContourVectorToPeakOnRender(
67
+ enabledElement: Types.IEnabledElement,
68
+ annotation: PlanarFreehandROIAnnotation
69
+ ): Types.Point3[] {
70
+ const { viewport } = enabledElement;
71
+ const canvasPoints = annotation.data.polyline.map(viewport.worldToCanvas);
72
+
73
+ return findOpenUShapedContourVectorToPeak(canvasPoints, viewport);
74
+ }