@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,471 @@
1
+ import {
2
+ getEnabledElement,
3
+ cache,
4
+ StackViewport,
5
+ metaData,
6
+ triggerEvent,
7
+ eventTarget,
8
+ utilities as csUtils,
9
+ } from '@cornerstonejs/core';
10
+ import type { Types } from '@cornerstonejs/core';
11
+
12
+ import { vec3 } from 'gl-matrix';
13
+ import { Events } from '../../enums';
14
+ import { addAnnotation, getAnnotations } from '../../stateManagement';
15
+ import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking';
16
+ import {
17
+ drawHandles as drawHandlesSvg,
18
+ drawRect as drawRectSvg,
19
+ } from '../../drawingSvg';
20
+ import { getViewportIdsWithToolToRender } from '../../utilities/viewportFilters';
21
+ import throttle from '../../utilities/throttle';
22
+ import { AnnotationModifiedEventDetail } from '../../types/EventTypes';
23
+ import { isAnnotationVisible } from '../../stateManagement/annotation/annotationVisibility';
24
+ import { hideElementCursor } from '../../cursors/elementCursor';
25
+ import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds';
26
+
27
+ import {
28
+ PublicToolProps,
29
+ ToolProps,
30
+ EventTypes,
31
+ SVGDrawingHelper,
32
+ } from '../../types';
33
+ import { RectangleROIStartEndThresholdAnnotation } from '../../types/ToolSpecificAnnotationTypes';
34
+ import RectangleROITool from '../annotation/RectangleROITool';
35
+ import { StyleSpecifier } from '../../types/AnnotationStyle';
36
+
37
+ const { transformWorldToIndex } = csUtils;
38
+
39
+ /**
40
+ * This tool is similar to the RectangleROIThresholdTool which
41
+ * only draws a rectangle on the image, and by using utility functions
42
+ * such as thresholdByRange and thresholdByROIStat it can be used to
43
+ * create a segmentation. The only difference is that it only acts on the
44
+ * acquisition plane and not the 3D volume, and accepts a start and end
45
+ * slice, and renders a dashed rectangle on the image between the start and end
46
+ * but a solid rectangle on start and end slice. Utility functions should be used
47
+ * to modify the start and end slice.
48
+ * // Todo: right now only the first slice has grabbable handles, need to make
49
+ * // it so that the handles are grabbable on all slices.
50
+ */
51
+ class RectangleROIStartEndThresholdTool extends RectangleROITool {
52
+ static toolName;
53
+ _throttledCalculateCachedStats: any;
54
+ editData: {
55
+ annotation: any;
56
+ viewportIdsToRender: string[];
57
+ handleIndex?: number;
58
+ newAnnotation?: boolean;
59
+ hasMoved?: boolean;
60
+ } | null;
61
+ isDrawing: boolean;
62
+ isHandleOutsideImage: boolean;
63
+
64
+ constructor(
65
+ toolProps: PublicToolProps = {},
66
+ defaultToolProps: ToolProps = {
67
+ configuration: {
68
+ numSlicesToPropagate: 10,
69
+ },
70
+ }
71
+ ) {
72
+ super(toolProps, defaultToolProps);
73
+
74
+ this._throttledCalculateCachedStats = throttle(
75
+ this._calculateCachedStatsTool,
76
+ 100,
77
+ { trailing: true }
78
+ );
79
+ }
80
+
81
+ /**
82
+ * Based on the current position of the mouse and the enabledElement it creates
83
+ * the edit data for the tool.
84
+ *
85
+ * @param evt - EventTypes.NormalizedMouseEventType
86
+ * @returns The annotation object.
87
+ *
88
+ */
89
+ addNewAnnotation = (evt: EventTypes.InteractionEventType) => {
90
+ const eventDetail = evt.detail;
91
+ const { currentPoints, element } = eventDetail;
92
+ const worldPos = currentPoints.world;
93
+
94
+ const enabledElement = getEnabledElement(element);
95
+ const { viewport, renderingEngine } = enabledElement;
96
+
97
+ this.isDrawing = true;
98
+
99
+ const camera = viewport.getCamera();
100
+ const { viewPlaneNormal, viewUp } = camera;
101
+
102
+ let referencedImageId, imageVolume, volumeId;
103
+ if (viewport instanceof StackViewport) {
104
+ throw new Error('Stack Viewport Not implemented');
105
+ } else {
106
+ const targetId = this.getTargetId(viewport);
107
+ volumeId = targetId.split('volumeId:')[1];
108
+ imageVolume = cache.getVolume(volumeId);
109
+ referencedImageId = csUtils.getClosestImageId(
110
+ imageVolume,
111
+ worldPos,
112
+ viewPlaneNormal,
113
+ viewUp
114
+ );
115
+ }
116
+
117
+ if (!referencedImageId) {
118
+ throw new Error('This tool does not work on non-acquisition planes');
119
+ }
120
+
121
+ const startIndex = viewport.getCurrentImageIdIndex();
122
+ const spacingInNormal = csUtils.getSpacingInNormalDirection(
123
+ imageVolume,
124
+ viewPlaneNormal
125
+ );
126
+
127
+ // We cannot simply add numSlicesToPropagate to startIndex because
128
+ // the order of imageIds can be from top to bottom or bottom to top and
129
+ // we want to make sure it is always propagated in the direction of the
130
+ // view and also to make sure we don't go out of bounds.
131
+ const endIndex = this._getEndSliceIndex(
132
+ imageVolume,
133
+ worldPos,
134
+ spacingInNormal,
135
+ viewPlaneNormal
136
+ );
137
+
138
+ const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
139
+
140
+ const annotation = {
141
+ highlighted: true,
142
+ invalidated: true,
143
+ metadata: {
144
+ viewPlaneNormal: <Types.Point3>[...viewPlaneNormal],
145
+ enabledElement,
146
+ viewUp: <Types.Point3>[...viewUp],
147
+ FrameOfReferenceUID,
148
+ referencedImageId,
149
+ toolName: this.getToolName(),
150
+ volumeId,
151
+ spacingInNormal,
152
+ },
153
+ data: {
154
+ label: '',
155
+ startSlice: startIndex,
156
+ endSlice: endIndex,
157
+ cachedStats: {
158
+ projectionPoints: [],
159
+ projectionPointsImageIds: [referencedImageId],
160
+ },
161
+ handles: {
162
+ // No need a textBox
163
+ textBox: {
164
+ hasMoved: false,
165
+ worldPosition: null,
166
+ worldBoundingBox: null,
167
+ },
168
+ points: [
169
+ <Types.Point3>[...worldPos],
170
+ <Types.Point3>[...worldPos],
171
+ <Types.Point3>[...worldPos],
172
+ <Types.Point3>[...worldPos],
173
+ ],
174
+ activeHandleIndex: null,
175
+ },
176
+ labelmapUID: null,
177
+ },
178
+ };
179
+
180
+ // update the projection points in 3D space, since we are projecting
181
+ // the points to the slice plane, we need to make sure the points are
182
+ // computed for later export
183
+ this._computeProjectionPoints(annotation, imageVolume);
184
+
185
+ addAnnotation(annotation, element);
186
+
187
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
188
+ element,
189
+ this.getToolName()
190
+ );
191
+
192
+ this.editData = {
193
+ annotation,
194
+ viewportIdsToRender,
195
+ handleIndex: 3,
196
+ newAnnotation: true,
197
+ hasMoved: false,
198
+ };
199
+ this._activateDraw(element);
200
+
201
+ hideElementCursor(element);
202
+
203
+ evt.preventDefault();
204
+
205
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
206
+
207
+ return annotation;
208
+ };
209
+
210
+ // Todo: make it work for planes other than acquisition planes
211
+ _computeProjectionPoints(
212
+ annotation: RectangleROIStartEndThresholdAnnotation,
213
+ imageVolume: Types.IImageVolume
214
+ ): void {
215
+ const { data, metadata } = annotation;
216
+ const { viewPlaneNormal, spacingInNormal } = metadata;
217
+ const { imageData } = imageVolume;
218
+ const { startSlice, endSlice } = data;
219
+ const { points } = data.handles;
220
+
221
+ const startIJK = transformWorldToIndex(imageData, points[0]);
222
+
223
+ if (startIJK[2] !== startSlice) {
224
+ throw new Error('Start slice does not match');
225
+ }
226
+
227
+ // substitute the end slice index 2 with startIJK index 2
228
+ const endIJK = vec3.fromValues(startIJK[0], startIJK[1], endSlice);
229
+
230
+ const startWorld = vec3.create();
231
+ imageData.indexToWorldVec3(startIJK, startWorld);
232
+
233
+ const endWorld = vec3.create();
234
+ imageData.indexToWorldVec3(endIJK, endWorld);
235
+
236
+ // distance between start and end slice in the world coordinate
237
+ const distance = vec3.distance(startWorld, endWorld);
238
+
239
+ // for each point inside points, navigate in the direction of the viewPlaneNormal
240
+ // with amount of spacingInNormal, and calculate the next slice until we reach the distance
241
+ const newProjectionPoints = [];
242
+ for (let dist = 0; dist < distance; dist += spacingInNormal) {
243
+ newProjectionPoints.push(
244
+ points.map((point) => {
245
+ const newPoint = vec3.create();
246
+ vec3.scaleAndAdd(newPoint, point, viewPlaneNormal, dist);
247
+ return Array.from(newPoint);
248
+ })
249
+ );
250
+ }
251
+
252
+ data.cachedStats.projectionPoints = newProjectionPoints;
253
+
254
+ // Find the imageIds for the projection points
255
+ const projectionPointsImageIds = [];
256
+ for (const RectanglePoints of newProjectionPoints) {
257
+ const imageId = csUtils.getClosestImageId(
258
+ imageVolume,
259
+ RectanglePoints[0],
260
+ viewPlaneNormal,
261
+ metadata.viewUp
262
+ );
263
+ projectionPointsImageIds.push(imageId);
264
+ }
265
+
266
+ data.cachedStats.projectionPointsImageIds = projectionPointsImageIds;
267
+ }
268
+
269
+ _calculateCachedStatsTool(annotation, enabledElement) {
270
+ const data = annotation.data;
271
+ const { viewportId, renderingEngineId, viewport } = enabledElement;
272
+
273
+ const { cachedStats } = data;
274
+ const volumeId = this.getTargetId(viewport);
275
+ const imageVolume = cache.getVolume(volumeId.split('volumeId:')[1]);
276
+
277
+ // Todo: this shouldn't be here, this is a performance issue
278
+ // Since we are extending the RectangleROI class, we need to
279
+ // bring the logic for handle to some cachedStats calculation
280
+ this._computeProjectionPoints(annotation, imageVolume);
281
+
282
+ annotation.invalidated = false;
283
+
284
+ // Dispatching annotation modified
285
+ const eventType = Events.ANNOTATION_MODIFIED;
286
+
287
+ const eventDetail: AnnotationModifiedEventDetail = {
288
+ annotation,
289
+ viewportId,
290
+ renderingEngineId,
291
+ };
292
+ triggerEvent(eventTarget, eventType, eventDetail);
293
+
294
+ return cachedStats;
295
+ }
296
+
297
+ /**
298
+ * it is used to draw the rectangleROIStartEnd annotation in each
299
+ * request animation frame.
300
+ *
301
+ * @param enabledElement - The Cornerstone's enabledElement.
302
+ * @param svgDrawingHelper - The svgDrawingHelper providing the context for drawing.
303
+ */
304
+ renderAnnotation = (
305
+ enabledElement: Types.IEnabledElement,
306
+ svgDrawingHelper: SVGDrawingHelper
307
+ ): boolean => {
308
+ let renderStatus = false;
309
+ const { viewport } = enabledElement;
310
+
311
+ const annotations = getAnnotations(this.getToolName(), viewport.element);
312
+
313
+ if (!annotations?.length) {
314
+ return renderStatus;
315
+ }
316
+
317
+ const sliceIndex = viewport.getCurrentImageIdIndex();
318
+
319
+ const styleSpecifier: StyleSpecifier = {
320
+ toolGroupId: this.toolGroupId,
321
+ toolName: this.getToolName(),
322
+ viewportId: enabledElement.viewport.id,
323
+ };
324
+
325
+ for (let i = 0; i < annotations.length; i++) {
326
+ const annotation = annotations[
327
+ i
328
+ ] as RectangleROIStartEndThresholdAnnotation;
329
+ const { annotationUID, data } = annotation;
330
+ const { startSlice, endSlice } = data;
331
+ const { points, activeHandleIndex } = data.handles;
332
+
333
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
334
+
335
+ styleSpecifier.annotationUID = annotationUID;
336
+
337
+ const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
338
+ const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
339
+ const color = this.getStyle('color', styleSpecifier, annotation);
340
+ // range of slices to render based on the start and end slice, like
341
+ // np.arange
342
+
343
+ // if indexIJK is outside the start/end slice, we don't render
344
+ if (
345
+ sliceIndex < Math.min(startSlice, endSlice) ||
346
+ sliceIndex > Math.max(startSlice, endSlice)
347
+ ) {
348
+ continue;
349
+ }
350
+
351
+ // WE HAVE TO CACHE STATS BEFORE FETCHING TEXT
352
+
353
+ if (annotation.invalidated) {
354
+ this._throttledCalculateCachedStats(annotation, enabledElement);
355
+ }
356
+
357
+ // if it is inside the start/end slice, but not exactly the first or
358
+ // last slice, we render the line in dash, but not the handles
359
+ let firstOrLastSlice = false;
360
+ if (sliceIndex === startSlice || sliceIndex === endSlice) {
361
+ firstOrLastSlice = true;
362
+ }
363
+
364
+ // If rendering engine has been destroyed while rendering
365
+ if (!viewport.getRenderingEngine()) {
366
+ console.warn('Rendering Engine has been destroyed');
367
+ return renderStatus;
368
+ }
369
+
370
+ let activeHandleCanvasCoords;
371
+
372
+ if (!isAnnotationVisible(annotationUID)) {
373
+ continue;
374
+ }
375
+
376
+ if (
377
+ !isAnnotationLocked(annotation) &&
378
+ !this.editData &&
379
+ activeHandleIndex !== null &&
380
+ firstOrLastSlice
381
+ ) {
382
+ // Not locked or creating and hovering over handle, so render handle.
383
+ activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
384
+ }
385
+
386
+ if (activeHandleCanvasCoords) {
387
+ const handleGroupUID = '0';
388
+
389
+ drawHandlesSvg(
390
+ svgDrawingHelper,
391
+ annotationUID,
392
+ handleGroupUID,
393
+ activeHandleCanvasCoords,
394
+ {
395
+ color,
396
+ }
397
+ );
398
+ }
399
+
400
+ let lineDashToUse = lineDash;
401
+
402
+ if (!firstOrLastSlice) {
403
+ lineDashToUse = 2;
404
+ }
405
+
406
+ const rectangleUID = '0';
407
+ drawRectSvg(
408
+ svgDrawingHelper,
409
+ annotationUID,
410
+ rectangleUID,
411
+ canvasCoordinates[0],
412
+ canvasCoordinates[3],
413
+ {
414
+ color,
415
+ lineDash: lineDashToUse,
416
+ lineWidth,
417
+ }
418
+ );
419
+
420
+ renderStatus = true;
421
+ }
422
+
423
+ return renderStatus;
424
+ };
425
+
426
+ _getEndSliceIndex(
427
+ imageVolume: Types.IImageVolume,
428
+ worldPos: Types.Point3,
429
+ spacingInNormal: number,
430
+ viewPlaneNormal: Types.Point3
431
+ ): number | undefined {
432
+ const numSlicesToPropagate = this.configuration.numSlicesToPropagate;
433
+
434
+ // get end position by moving from worldPos in the direction of viewplaneNormal
435
+ // with amount of numSlicesToPropagate * spacingInNormal
436
+ const endPos = vec3.create();
437
+ vec3.scaleAndAdd(
438
+ endPos,
439
+ worldPos,
440
+ viewPlaneNormal,
441
+ numSlicesToPropagate * spacingInNormal
442
+ );
443
+
444
+ const halfSpacingInNormalDirection = spacingInNormal / 2;
445
+ // Loop through imageIds of the imageVolume and find the one that is closest to endPos
446
+ const { imageIds } = imageVolume;
447
+ let imageIdIndex;
448
+ for (let i = 0; i < imageIds.length; i++) {
449
+ const imageId = imageIds[i];
450
+
451
+ const { imagePositionPatient } = metaData.get(
452
+ 'imagePlaneModule',
453
+ imageId
454
+ );
455
+
456
+ const dir = vec3.create();
457
+ vec3.sub(dir, endPos, imagePositionPatient);
458
+
459
+ const dot = vec3.dot(dir, viewPlaneNormal);
460
+
461
+ if (Math.abs(dot) < halfSpacingInNormalDirection) {
462
+ imageIdIndex = i;
463
+ }
464
+ }
465
+
466
+ return imageIdIndex;
467
+ }
468
+ }
469
+
470
+ RectangleROIStartEndThresholdTool.toolName = 'RectangleROIStartEndThreshold';
471
+ export default RectangleROIStartEndThresholdTool;