@cornerstonejs/tools 2.0.0-beta.2 → 2.0.0-beta.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 (265) hide show
  1. package/dist/cjs/drawingSvg/getSvgDrawingHelper.js +1 -1
  2. package/dist/cjs/drawingSvg/getSvgDrawingHelper.js.map +1 -1
  3. package/dist/cjs/enums/Events.d.ts +1 -0
  4. package/dist/cjs/enums/Events.js +1 -0
  5. package/dist/cjs/enums/Events.js.map +1 -1
  6. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDown.js +6 -1
  7. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDown.js.map +1 -1
  8. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.d.ts +2 -0
  9. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js +41 -0
  10. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js.map +1 -0
  11. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.d.ts +3 -0
  12. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js +39 -0
  13. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -0
  14. package/dist/cjs/eventListeners/mouse/mouseDownListener.js +5 -1
  15. package/dist/cjs/eventListeners/mouse/mouseDownListener.js.map +1 -1
  16. package/dist/cjs/eventListeners/mouse/mouseMoveListener.js +5 -1
  17. package/dist/cjs/eventListeners/mouse/mouseMoveListener.js.map +1 -1
  18. package/dist/cjs/index.d.ts +2 -2
  19. package/dist/cjs/index.js +5 -2
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/store/ToolGroupManager/ToolGroup.d.ts +2 -0
  22. package/dist/cjs/store/ToolGroupManager/ToolGroup.js +35 -0
  23. package/dist/cjs/store/ToolGroupManager/ToolGroup.js.map +1 -1
  24. package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js +1 -1
  25. package/dist/cjs/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
  26. package/dist/cjs/tools/AdvancedMagnifyTool.d.ts +36 -0
  27. package/dist/cjs/tools/AdvancedMagnifyTool.js +448 -0
  28. package/dist/cjs/tools/AdvancedMagnifyTool.js.map +1 -0
  29. package/dist/cjs/tools/AdvancedMagnifyViewport.d.ts +76 -0
  30. package/dist/cjs/tools/AdvancedMagnifyViewport.js +352 -0
  31. package/dist/cjs/tools/AdvancedMagnifyViewport.js.map +1 -0
  32. package/dist/cjs/tools/AdvancedMagnifyViewportManager.d.ts +36 -0
  33. package/dist/cjs/tools/AdvancedMagnifyViewportManager.js +133 -0
  34. package/dist/cjs/tools/AdvancedMagnifyViewportManager.js.map +1 -0
  35. package/dist/cjs/tools/MagnifyTool.js +2 -2
  36. package/dist/cjs/tools/MagnifyTool.js.map +1 -1
  37. package/dist/cjs/tools/OrientationMarkerTool.d.ts +88 -0
  38. package/dist/cjs/tools/OrientationMarkerTool.js +193 -0
  39. package/dist/cjs/tools/OrientationMarkerTool.js.map +1 -0
  40. package/dist/cjs/tools/OverlayGridTool.d.ts +31 -0
  41. package/dist/cjs/tools/OverlayGridTool.js +170 -0
  42. package/dist/cjs/tools/OverlayGridTool.js.map +1 -0
  43. package/dist/cjs/tools/ReferenceLinesTool.d.ts +3 -0
  44. package/dist/cjs/tools/ReferenceLinesTool.js +71 -2
  45. package/dist/cjs/tools/ReferenceLinesTool.js.map +1 -1
  46. package/dist/cjs/tools/annotation/AngleTool.js +2 -1
  47. package/dist/cjs/tools/annotation/AngleTool.js.map +1 -1
  48. package/dist/cjs/tools/annotation/BidirectionalTool.js +1 -1
  49. package/dist/cjs/tools/annotation/BidirectionalTool.js.map +1 -1
  50. package/dist/cjs/tools/annotation/CircleROITool.d.ts +1 -2
  51. package/dist/cjs/tools/annotation/CircleROITool.js +8 -8
  52. package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -1
  53. package/dist/cjs/tools/annotation/CobbAngleTool.d.ts +31 -5
  54. package/dist/cjs/tools/annotation/CobbAngleTool.js +268 -71
  55. package/dist/cjs/tools/annotation/CobbAngleTool.js.map +1 -1
  56. package/dist/cjs/tools/annotation/DragProbeTool.js +4 -3
  57. package/dist/cjs/tools/annotation/DragProbeTool.js.map +1 -1
  58. package/dist/cjs/tools/annotation/EllipticalROITool.d.ts +2 -3
  59. package/dist/cjs/tools/annotation/EllipticalROITool.js +20 -16
  60. package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
  61. package/dist/cjs/tools/annotation/LengthTool.js +1 -1
  62. package/dist/cjs/tools/annotation/LengthTool.js.map +1 -1
  63. package/dist/cjs/tools/annotation/PlanarFreehandROITool.d.ts +1 -2
  64. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js +22 -9
  65. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  66. package/dist/cjs/tools/annotation/ProbeTool.d.ts +1 -2
  67. package/dist/cjs/tools/annotation/ProbeTool.js +10 -9
  68. package/dist/cjs/tools/annotation/ProbeTool.js.map +1 -1
  69. package/dist/cjs/tools/annotation/RectangleROITool.d.ts +1 -1
  70. package/dist/cjs/tools/annotation/RectangleROITool.js +9 -9
  71. package/dist/cjs/tools/annotation/RectangleROITool.js.map +1 -1
  72. package/dist/cjs/tools/base/AnnotationDisplayTool.js +4 -0
  73. package/dist/cjs/tools/base/AnnotationDisplayTool.js.map +1 -1
  74. package/dist/cjs/tools/base/AnnotationTool.d.ts +1 -1
  75. package/dist/cjs/tools/base/AnnotationTool.js.map +1 -1
  76. package/dist/cjs/tools/displayTools/Contour/contourDisplay.js +3 -0
  77. package/dist/cjs/tools/displayTools/Contour/contourDisplay.js.map +1 -1
  78. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js +1 -1
  79. package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  80. package/dist/cjs/tools/index.d.ts +4 -1
  81. package/dist/cjs/tools/index.js +7 -1
  82. package/dist/cjs/tools/index.js.map +1 -1
  83. package/dist/cjs/types/EventTypes.d.ts +9 -1
  84. package/dist/cjs/types/IToolGroup.d.ts +3 -0
  85. package/dist/cjs/types/ToolAction.d.ts +8 -0
  86. package/dist/cjs/types/ToolAction.js +3 -0
  87. package/dist/cjs/types/ToolAction.js.map +1 -0
  88. package/dist/cjs/types/ToolSpecificAnnotationTypes.d.ts +55 -0
  89. package/dist/cjs/types/index.d.ts +2 -1
  90. package/dist/cjs/utilities/getModalityUnit.js +5 -2
  91. package/dist/cjs/utilities/getModalityUnit.js.map +1 -1
  92. package/dist/cjs/utilities/index.d.ts +2 -2
  93. package/dist/cjs/utilities/index.js +4 -3
  94. package/dist/cjs/utilities/index.js.map +1 -1
  95. package/dist/cjs/utilities/math/angle/angleBetweenLines.d.ts +3 -1
  96. package/dist/cjs/utilities/math/angle/angleBetweenLines.js +18 -1
  97. package/dist/cjs/utilities/math/angle/angleBetweenLines.js.map +1 -1
  98. package/dist/cjs/utilities/stackPrefetch/index.d.ts +3 -2
  99. package/dist/cjs/utilities/stackPrefetch/index.js +8 -6
  100. package/dist/cjs/utilities/stackPrefetch/index.js.map +1 -1
  101. package/dist/cjs/utilities/stackPrefetch/stackContextPrefetch.d.ts +16 -0
  102. package/dist/cjs/utilities/stackPrefetch/stackContextPrefetch.js +227 -0
  103. package/dist/cjs/utilities/stackPrefetch/stackContextPrefetch.js.map +1 -0
  104. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.d.ts +7 -1
  105. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js +23 -93
  106. package/dist/cjs/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
  107. package/dist/cjs/utilities/stackPrefetch/stackPrefetchUtils.d.ts +14 -0
  108. package/dist/cjs/utilities/stackPrefetch/stackPrefetchUtils.js +85 -0
  109. package/dist/cjs/utilities/stackPrefetch/stackPrefetchUtils.js.map +1 -0
  110. package/dist/esm/drawingSvg/getSvgDrawingHelper.js +1 -1
  111. package/dist/esm/drawingSvg/getSvgDrawingHelper.js.map +1 -1
  112. package/dist/esm/enums/Events.d.ts +1 -0
  113. package/dist/esm/enums/Events.js +1 -0
  114. package/dist/esm/enums/Events.js.map +1 -1
  115. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDown.js +6 -1
  116. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDown.js.map +1 -1
  117. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.d.ts +2 -0
  118. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js +35 -0
  119. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.js.map +1 -0
  120. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.d.ts +3 -0
  121. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js +32 -0
  122. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -0
  123. package/dist/esm/eventListeners/mouse/mouseDownListener.js +5 -1
  124. package/dist/esm/eventListeners/mouse/mouseDownListener.js.map +1 -1
  125. package/dist/esm/eventListeners/mouse/mouseMoveListener.js +5 -1
  126. package/dist/esm/eventListeners/mouse/mouseMoveListener.js.map +1 -1
  127. package/dist/esm/index.d.ts +2 -2
  128. package/dist/esm/index.js +2 -2
  129. package/dist/esm/index.js.map +1 -1
  130. package/dist/esm/store/ToolGroupManager/ToolGroup.d.ts +2 -0
  131. package/dist/esm/store/ToolGroupManager/ToolGroup.js +35 -1
  132. package/dist/esm/store/ToolGroupManager/ToolGroup.js.map +1 -1
  133. package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js +1 -1
  134. package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js.map +1 -1
  135. package/dist/esm/tools/AdvancedMagnifyTool.d.ts +36 -0
  136. package/dist/esm/tools/AdvancedMagnifyTool.js +440 -0
  137. package/dist/esm/tools/AdvancedMagnifyTool.js.map +1 -0
  138. package/dist/esm/tools/AdvancedMagnifyViewport.d.ts +76 -0
  139. package/dist/esm/tools/AdvancedMagnifyViewport.js +346 -0
  140. package/dist/esm/tools/AdvancedMagnifyViewport.js.map +1 -0
  141. package/dist/esm/tools/AdvancedMagnifyViewportManager.d.ts +36 -0
  142. package/dist/esm/tools/AdvancedMagnifyViewportManager.js +128 -0
  143. package/dist/esm/tools/AdvancedMagnifyViewportManager.js.map +1 -0
  144. package/dist/esm/tools/MagnifyTool.js +2 -2
  145. package/dist/esm/tools/MagnifyTool.js.map +1 -1
  146. package/dist/esm/tools/OrientationMarkerTool.d.ts +88 -0
  147. package/dist/esm/tools/OrientationMarkerTool.js +185 -0
  148. package/dist/esm/tools/OrientationMarkerTool.js.map +1 -0
  149. package/dist/esm/tools/OverlayGridTool.d.ts +31 -0
  150. package/dist/esm/tools/OverlayGridTool.js +165 -0
  151. package/dist/esm/tools/OverlayGridTool.js.map +1 -0
  152. package/dist/esm/tools/ReferenceLinesTool.d.ts +3 -0
  153. package/dist/esm/tools/ReferenceLinesTool.js +71 -2
  154. package/dist/esm/tools/ReferenceLinesTool.js.map +1 -1
  155. package/dist/esm/tools/annotation/AngleTool.js +2 -1
  156. package/dist/esm/tools/annotation/AngleTool.js.map +1 -1
  157. package/dist/esm/tools/annotation/BidirectionalTool.js +1 -1
  158. package/dist/esm/tools/annotation/BidirectionalTool.js.map +1 -1
  159. package/dist/esm/tools/annotation/CircleROITool.d.ts +1 -2
  160. package/dist/esm/tools/annotation/CircleROITool.js +8 -8
  161. package/dist/esm/tools/annotation/CircleROITool.js.map +1 -1
  162. package/dist/esm/tools/annotation/CobbAngleTool.d.ts +31 -5
  163. package/dist/esm/tools/annotation/CobbAngleTool.js +275 -72
  164. package/dist/esm/tools/annotation/CobbAngleTool.js.map +1 -1
  165. package/dist/esm/tools/annotation/DragProbeTool.js +4 -3
  166. package/dist/esm/tools/annotation/DragProbeTool.js.map +1 -1
  167. package/dist/esm/tools/annotation/EllipticalROITool.d.ts +2 -3
  168. package/dist/esm/tools/annotation/EllipticalROITool.js +20 -16
  169. package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
  170. package/dist/esm/tools/annotation/LengthTool.js +1 -1
  171. package/dist/esm/tools/annotation/LengthTool.js.map +1 -1
  172. package/dist/esm/tools/annotation/PlanarFreehandROITool.d.ts +1 -2
  173. package/dist/esm/tools/annotation/PlanarFreehandROITool.js +22 -9
  174. package/dist/esm/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  175. package/dist/esm/tools/annotation/ProbeTool.d.ts +1 -2
  176. package/dist/esm/tools/annotation/ProbeTool.js +10 -9
  177. package/dist/esm/tools/annotation/ProbeTool.js.map +1 -1
  178. package/dist/esm/tools/annotation/RectangleROITool.d.ts +1 -1
  179. package/dist/esm/tools/annotation/RectangleROITool.js +9 -9
  180. package/dist/esm/tools/annotation/RectangleROITool.js.map +1 -1
  181. package/dist/esm/tools/base/AnnotationDisplayTool.js +3 -0
  182. package/dist/esm/tools/base/AnnotationDisplayTool.js.map +1 -1
  183. package/dist/esm/tools/base/AnnotationTool.d.ts +1 -1
  184. package/dist/esm/tools/base/AnnotationTool.js.map +1 -1
  185. package/dist/esm/tools/displayTools/Contour/contourDisplay.js +4 -1
  186. package/dist/esm/tools/displayTools/Contour/contourDisplay.js.map +1 -1
  187. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +1 -1
  188. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
  189. package/dist/esm/tools/index.d.ts +4 -1
  190. package/dist/esm/tools/index.js +4 -1
  191. package/dist/esm/tools/index.js.map +1 -1
  192. package/dist/esm/types/EventTypes.d.ts +9 -1
  193. package/dist/esm/types/IToolGroup.d.ts +3 -0
  194. package/dist/esm/types/ToolAction.d.ts +8 -0
  195. package/dist/esm/types/ToolAction.js +2 -0
  196. package/dist/esm/types/ToolAction.js.map +1 -0
  197. package/dist/esm/types/ToolSpecificAnnotationTypes.d.ts +55 -0
  198. package/dist/esm/types/index.d.ts +2 -1
  199. package/dist/esm/utilities/getModalityUnit.js +5 -2
  200. package/dist/esm/utilities/getModalityUnit.js.map +1 -1
  201. package/dist/esm/utilities/index.d.ts +2 -2
  202. package/dist/esm/utilities/index.js +2 -2
  203. package/dist/esm/utilities/index.js.map +1 -1
  204. package/dist/esm/utilities/math/angle/angleBetweenLines.d.ts +3 -1
  205. package/dist/esm/utilities/math/angle/angleBetweenLines.js +19 -2
  206. package/dist/esm/utilities/math/angle/angleBetweenLines.js.map +1 -1
  207. package/dist/esm/utilities/stackPrefetch/index.d.ts +3 -2
  208. package/dist/esm/utilities/stackPrefetch/index.js +3 -2
  209. package/dist/esm/utilities/stackPrefetch/index.js.map +1 -1
  210. package/dist/esm/utilities/stackPrefetch/stackContextPrefetch.d.ts +16 -0
  211. package/dist/esm/utilities/stackPrefetch/stackContextPrefetch.js +220 -0
  212. package/dist/esm/utilities/stackPrefetch/stackContextPrefetch.js.map +1 -0
  213. package/dist/esm/utilities/stackPrefetch/stackPrefetch.d.ts +7 -1
  214. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +12 -79
  215. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js.map +1 -1
  216. package/dist/esm/utilities/stackPrefetch/stackPrefetchUtils.d.ts +14 -0
  217. package/dist/esm/utilities/stackPrefetch/stackPrefetchUtils.js +77 -0
  218. package/dist/esm/utilities/stackPrefetch/stackPrefetchUtils.js.map +1 -0
  219. package/dist/umd/index.js +1 -1
  220. package/dist/umd/index.js.map +1 -1
  221. package/package.json +3 -3
  222. package/src/drawingSvg/getSvgDrawingHelper.ts +4 -1
  223. package/src/enums/Events.ts +9 -0
  224. package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +11 -2
  225. package/src/eventDispatchers/mouseEventHandlers/mouseDownAnnotationAction.ts +72 -0
  226. package/src/eventDispatchers/shared/getToolsWithActionsForMouseEvent.ts +66 -0
  227. package/src/eventListeners/mouse/mouseDownListener.ts +7 -1
  228. package/src/eventListeners/mouse/mouseMoveListener.ts +7 -1
  229. package/src/index.ts +6 -0
  230. package/src/store/ToolGroupManager/ToolGroup.ts +79 -2
  231. package/src/synchronizers/callbacks/stackImageSyncCallback.ts +1 -1
  232. package/src/tools/AdvancedMagnifyTool.ts +725 -0
  233. package/src/tools/AdvancedMagnifyViewport.ts +624 -0
  234. package/src/tools/AdvancedMagnifyViewportManager.ts +291 -0
  235. package/src/tools/MagnifyTool.ts +2 -2
  236. package/src/tools/OrientationMarkerTool.ts +235 -0
  237. package/src/tools/OverlayGridTool.ts +357 -0
  238. package/src/tools/ReferenceLinesTool.ts +131 -3
  239. package/src/tools/annotation/AngleTool.ts +4 -1
  240. package/src/tools/annotation/BidirectionalTool.ts +1 -1
  241. package/src/tools/annotation/CircleROITool.ts +13 -20
  242. package/src/tools/annotation/CobbAngleTool.ts +422 -99
  243. package/src/tools/annotation/DragProbeTool.ts +6 -13
  244. package/src/tools/annotation/EllipticalROITool.ts +28 -29
  245. package/src/tools/annotation/LengthTool.ts +1 -1
  246. package/src/tools/annotation/PlanarFreehandROITool.ts +35 -20
  247. package/src/tools/annotation/ProbeTool.ts +17 -30
  248. package/src/tools/annotation/RectangleROITool.ts +15 -19
  249. package/src/tools/base/AnnotationDisplayTool.ts +4 -0
  250. package/src/tools/base/AnnotationTool.ts +2 -1
  251. package/src/tools/displayTools/Contour/contourDisplay.ts +8 -0
  252. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +1 -1
  253. package/src/tools/index.ts +6 -0
  254. package/src/types/EventTypes.ts +23 -0
  255. package/src/types/IToolGroup.ts +7 -0
  256. package/src/types/ToolAction.ts +54 -0
  257. package/src/types/ToolSpecificAnnotationTypes.ts +58 -0
  258. package/src/types/index.ts +2 -0
  259. package/src/utilities/getModalityUnit.ts +8 -2
  260. package/src/utilities/index.ts +2 -1
  261. package/src/utilities/math/angle/angleBetweenLines.ts +39 -9
  262. package/src/utilities/stackPrefetch/index.ts +3 -7
  263. package/src/utilities/stackPrefetch/stackContextPrefetch.ts +380 -0
  264. package/src/utilities/stackPrefetch/stackPrefetch.ts +29 -151
  265. package/src/utilities/stackPrefetch/stackPrefetchUtils.ts +114 -0
@@ -0,0 +1,357 @@
1
+ import { vec3 } from 'gl-matrix';
2
+ import {
3
+ metaData,
4
+ CONSTANTS,
5
+ getRenderingEngine,
6
+ utilities as csUtils,
7
+ } from '@cornerstonejs/core';
8
+ import type { Types } from '@cornerstonejs/core';
9
+
10
+ import {
11
+ addAnnotation,
12
+ getAnnotations,
13
+ } from '../stateManagement/annotation/annotationState';
14
+
15
+ import { getToolGroup } from '../store/ToolGroupManager';
16
+
17
+ import { drawLine as drawLineSvg } from '../drawingSvg';
18
+ import triggerAnnotationRenderForViewportIds from '../utilities/triggerAnnotationRenderForViewportIds';
19
+
20
+ import {
21
+ PublicToolProps,
22
+ ToolProps,
23
+ SVGDrawingHelper,
24
+ Annotation,
25
+ } from '../types';
26
+ import { StyleSpecifier } from '../types/AnnotationStyle';
27
+ import AnnotationDisplayTool from './base/AnnotationDisplayTool';
28
+
29
+ const { EPSILON } = CONSTANTS;
30
+
31
+ export interface OverlayGridAnnotation extends Annotation {
32
+ data: {
33
+ viewportData: Map<string, object>;
34
+ pointSets: Array<object>;
35
+ };
36
+ }
37
+
38
+ /**
39
+ * @public
40
+ */
41
+ class OverlayGridTool extends AnnotationDisplayTool {
42
+ static toolName;
43
+
44
+ public touchDragCallback: any;
45
+ public mouseDragCallback: any;
46
+ _throttledCalculateCachedStats: any;
47
+ isDrawing: boolean;
48
+ isHandleOutsideImage: boolean;
49
+
50
+ constructor(
51
+ toolProps: PublicToolProps = {},
52
+ defaultToolProps: ToolProps = {
53
+ supportedInteractionTypes: ['Mouse', 'Touch'],
54
+ configuration: {
55
+ sourceImageIds: [],
56
+ },
57
+ }
58
+ ) {
59
+ super(toolProps, defaultToolProps);
60
+ }
61
+
62
+ onSetToolEnabled = (): void => {
63
+ this._init();
64
+ };
65
+
66
+ onSetToolActive = (): void => {
67
+ this._init();
68
+ };
69
+
70
+ _init = (): void => {
71
+ const sourceImageIds = this.configuration.sourceImageIds;
72
+ if (!sourceImageIds?.length) {
73
+ console.warn(
74
+ 'OverlayGridTool: No sourceImageIds provided in configuration'
75
+ );
76
+ return;
77
+ }
78
+
79
+ const imagePlaneModule = metaData.get(
80
+ 'imagePlaneModule',
81
+ sourceImageIds[0]
82
+ );
83
+
84
+ if (!imagePlaneModule) {
85
+ console.warn(
86
+ 'OverlayGridTool: No imagePlaneModule found for sourceImageIds'
87
+ );
88
+ return;
89
+ }
90
+
91
+ const { frameOfReferenceUID } = imagePlaneModule;
92
+
93
+ const viewportsInfo = getToolGroup(this.toolGroupId).viewportsInfo;
94
+
95
+ if (!viewportsInfo?.length) {
96
+ console.warn('OverlayGridTool: No viewports found');
97
+ return;
98
+ }
99
+
100
+ const annotations = getAnnotations(this.getToolName(), frameOfReferenceUID);
101
+
102
+ if (!annotations?.length) {
103
+ const pointSets = sourceImageIds.map((id) => {
104
+ // check if pointSets for the imageId was calculated. If not calculate and store
105
+ return this.calculateImageIdPointSets(id);
106
+ });
107
+
108
+ const newAnnotation: OverlayGridAnnotation = {
109
+ highlighted: true,
110
+ invalidated: true,
111
+ metadata: {
112
+ toolName: this.getToolName(),
113
+ FrameOfReferenceUID: frameOfReferenceUID,
114
+ referencedImageId: null,
115
+ },
116
+ data: {
117
+ viewportData: new Map(),
118
+ pointSets,
119
+ },
120
+ };
121
+
122
+ addAnnotation(newAnnotation, frameOfReferenceUID);
123
+ }
124
+
125
+ triggerAnnotationRenderForViewportIds(
126
+ getRenderingEngine(viewportsInfo[0].renderingEngineId),
127
+ viewportsInfo.map(({ viewportId }) => viewportId)
128
+ );
129
+ };
130
+
131
+ /**
132
+ * Calculates the point sets based on the image corners relative to an imageId
133
+ * @param imageId - The imageId to calculate the point sets for
134
+ * @returns
135
+ */
136
+ calculateImageIdPointSets = (imageId: string) => {
137
+ const {
138
+ imagePositionPatient,
139
+ rows,
140
+ columns,
141
+ rowCosines,
142
+ columnCosines,
143
+ rowPixelSpacing,
144
+ columnPixelSpacing,
145
+ } = metaData.get('imagePlaneModule', imageId);
146
+
147
+ // top left world, top right world, bottom right world, bottom left world
148
+ const topLeft = <Types.Point3>[...imagePositionPatient];
149
+ const topRight = <Types.Point3>[...imagePositionPatient];
150
+ const bottomLeft = <Types.Point3>[...imagePositionPatient];
151
+ const bottomRight = <Types.Point3>[...imagePositionPatient];
152
+
153
+ vec3.scaleAndAdd(
154
+ topRight,
155
+ imagePositionPatient,
156
+ columnCosines,
157
+ columns * columnPixelSpacing
158
+ );
159
+ vec3.scaleAndAdd(
160
+ bottomLeft,
161
+ imagePositionPatient,
162
+ rowCosines,
163
+ rows * rowPixelSpacing
164
+ );
165
+
166
+ vec3.scaleAndAdd(
167
+ bottomRight,
168
+ bottomLeft,
169
+ columnCosines,
170
+ columns * columnPixelSpacing
171
+ );
172
+
173
+ // check if the topLeft and bottomLeft line is parallel to the viewUp
174
+ const pointSet1 = [topLeft, bottomLeft, topRight, bottomRight];
175
+ const pointSet2 = [topLeft, topRight, bottomLeft, bottomRight];
176
+
177
+ return { pointSet1, pointSet2 };
178
+ };
179
+
180
+ /**
181
+ * it is used to draw the length annotation in each
182
+ * request animation frame. It calculates the updated cached statistics if
183
+ * data is invalidated and cache it.
184
+ *
185
+ * @param enabledElement - The Cornerstone's enabledElement.
186
+ * @param svgDrawingHelper - The svgDrawingHelper providing the context for drawing.
187
+ */
188
+ renderAnnotation = (
189
+ enabledElement: Types.IEnabledElement,
190
+ svgDrawingHelper: SVGDrawingHelper
191
+ ): boolean => {
192
+ const sourceImageIds = this.configuration.sourceImageIds;
193
+
194
+ let renderStatus = false;
195
+ if (!sourceImageIds?.length) {
196
+ return renderStatus;
197
+ }
198
+
199
+ const { viewport: targetViewport, FrameOfReferenceUID } = enabledElement;
200
+ const targetImageIds = targetViewport.getImageIds();
201
+ if (targetImageIds.length < 2) {
202
+ return renderStatus;
203
+ }
204
+
205
+ const annotations = getAnnotations(this.getToolName(), FrameOfReferenceUID);
206
+ if (!annotations?.length) {
207
+ return renderStatus;
208
+ }
209
+ const annotation = annotations[0];
210
+ const { annotationUID } = annotation;
211
+
212
+ const { focalPoint, viewPlaneNormal } = targetViewport.getCamera();
213
+
214
+ const styleSpecifier: StyleSpecifier = {
215
+ toolGroupId: this.toolGroupId,
216
+ toolName: this.getToolName(),
217
+ viewportId: enabledElement.viewport.id,
218
+ };
219
+ const imageIdNormal = <Types.Point3>(
220
+ this.getImageIdNormal(sourceImageIds[0])
221
+ );
222
+
223
+ if (this.isParallel(viewPlaneNormal, imageIdNormal)) {
224
+ // If the source and target viewports are parallel, we don't need to render
225
+ return renderStatus;
226
+ }
227
+
228
+ const targetViewportPlane = csUtils.planar.planeEquation(
229
+ viewPlaneNormal,
230
+ focalPoint
231
+ );
232
+
233
+ const pointSets = annotation.data.pointSets;
234
+ const viewportData = annotation.data.viewportData;
235
+ for (let i = 0; i < sourceImageIds.length; i++) {
236
+ // check if pointSets for the imageId was calculated. If not calculate and store
237
+ const { pointSet1, pointSet2 } = pointSets[i];
238
+
239
+ const targetData =
240
+ viewportData.get(targetViewport.id) ||
241
+ this.initializeViewportData(viewportData, targetViewport.id);
242
+
243
+ // check if pointSetToUse was calculated. If not calculate and store
244
+ if (!targetData.pointSetsToUse[i]) {
245
+ let pointSetToUse = pointSet1;
246
+
247
+ let topBottomVec = vec3.subtract(
248
+ vec3.create(),
249
+ pointSet1[0],
250
+ pointSet1[1]
251
+ );
252
+ topBottomVec = vec3.normalize(
253
+ vec3.create(),
254
+ topBottomVec
255
+ ) as Types.Point3;
256
+
257
+ // check if it is perpendicular to the viewPlaneNormal which means
258
+ // the line does not intersect the viewPlaneNormal
259
+ if (this.isPerpendicular(topBottomVec, viewPlaneNormal)) {
260
+ // 'use pointSet2';
261
+ pointSetToUse = pointSet2;
262
+ }
263
+
264
+ targetData.pointSetsToUse[i] = pointSetToUse;
265
+
266
+ targetData.lineStartsWorld[i] = csUtils.planar.linePlaneIntersection(
267
+ pointSetToUse[0],
268
+ pointSetToUse[1],
269
+ targetViewportPlane
270
+ );
271
+
272
+ targetData.lineEndsWorld[i] = csUtils.planar.linePlaneIntersection(
273
+ pointSetToUse[2],
274
+ pointSetToUse[3],
275
+ targetViewportPlane
276
+ );
277
+ }
278
+
279
+ const lineStartWorld = targetData.lineStartsWorld[i];
280
+ const lineEndWorld = targetData.lineEndsWorld[i];
281
+
282
+ styleSpecifier.annotationUID = annotationUID;
283
+ const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
284
+ const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
285
+ const color = this.getStyle('color', styleSpecifier, annotation);
286
+ const shadow = this.getStyle('shadow', styleSpecifier, annotation);
287
+
288
+ const canvasCoordinates = [lineStartWorld, lineEndWorld].map((world) =>
289
+ targetViewport.worldToCanvas(world)
290
+ );
291
+
292
+ const dataId = `${annotationUID}-line`;
293
+ const lineUID = `${i}`;
294
+ drawLineSvg(
295
+ svgDrawingHelper,
296
+ annotationUID,
297
+ lineUID,
298
+ canvasCoordinates[0],
299
+ canvasCoordinates[1],
300
+ {
301
+ color,
302
+ width: lineWidth,
303
+ lineDash,
304
+ shadow,
305
+ },
306
+ dataId
307
+ );
308
+ }
309
+
310
+ renderStatus = true;
311
+
312
+ return renderStatus;
313
+ };
314
+
315
+ private initializeViewportData = (viewportData, id) => {
316
+ viewportData.set(id, {
317
+ pointSetsToUse: [],
318
+ lineStartsWorld: [],
319
+ lineEndsWorld: [],
320
+ });
321
+
322
+ return viewportData.get(id);
323
+ };
324
+
325
+ private isPerpendicular = (
326
+ vec1: Types.Point3,
327
+ vec2: Types.Point3
328
+ ): boolean => {
329
+ const dot = vec3.dot(vec1, vec2);
330
+ return Math.abs(dot) < EPSILON;
331
+ };
332
+
333
+ private isParallel(vec1: Types.Point3, vec2: Types.Point3): boolean {
334
+ return Math.abs(vec3.dot(vec1, vec2)) > 1 - EPSILON;
335
+ }
336
+
337
+ private getImageIdNormal(imageId: string): vec3 {
338
+ const { imageOrientationPatient } = metaData.get(
339
+ 'imagePlaneModule',
340
+ imageId
341
+ );
342
+ const rowCosineVec = vec3.fromValues(
343
+ imageOrientationPatient[0],
344
+ imageOrientationPatient[1],
345
+ imageOrientationPatient[2]
346
+ );
347
+ const colCosineVec = vec3.fromValues(
348
+ imageOrientationPatient[3],
349
+ imageOrientationPatient[4],
350
+ imageOrientationPatient[5]
351
+ );
352
+ return vec3.cross(vec3.create(), rowCosineVec, colCosineVec);
353
+ }
354
+ }
355
+
356
+ OverlayGridTool.toolName = 'OverlayGrid';
357
+ export default OverlayGridTool;
@@ -11,7 +11,6 @@ import { addAnnotation } from '../stateManagement/annotation/annotationState';
11
11
  import { drawLine as drawLineSvg } from '../drawingSvg';
12
12
  import { filterViewportsWithToolEnabled } from '../utilities/viewportFilters';
13
13
  import triggerAnnotationRenderForViewportIds from '../utilities/triggerAnnotationRenderForViewportIds';
14
-
15
14
  import { PublicToolProps, ToolProps, SVGDrawingHelper } from '../types';
16
15
  import { ReferenceLineAnnotation } from '../types/ToolSpecificAnnotationTypes';
17
16
  import { StyleSpecifier } from '../types/AnnotationStyle';
@@ -43,6 +42,7 @@ class ReferenceLines extends AnnotationDisplayTool {
43
42
  supportedInteractionTypes: ['Mouse', 'Touch'],
44
43
  configuration: {
45
44
  sourceViewportId: '',
45
+ showFullDimension: false,
46
46
  },
47
47
  }
48
48
  ) {
@@ -177,7 +177,7 @@ class ReferenceLines extends AnnotationDisplayTool {
177
177
  const bottomLeft = annotation.data.handles.points[2];
178
178
  const bottomRight = annotation.data.handles.points[3];
179
179
 
180
- const { focalPoint, viewPlaneNormal } = targetViewport.getCamera();
180
+ const { focalPoint, viewPlaneNormal, viewUp } = targetViewport.getCamera();
181
181
  const { viewPlaneNormal: sourceViewPlaneNormal } =
182
182
  sourceViewport.getCamera();
183
183
 
@@ -239,10 +239,21 @@ class ReferenceLines extends AnnotationDisplayTool {
239
239
  const color = this.getStyle('color', styleSpecifier, annotation);
240
240
  const shadow = this.getStyle('shadow', styleSpecifier, annotation);
241
241
 
242
- const canvasCoordinates = [lineStartWorld, lineEndWorld].map((world) =>
242
+ let canvasCoordinates = [lineStartWorld, lineEndWorld].map((world) =>
243
243
  targetViewport.worldToCanvas(world)
244
244
  );
245
245
 
246
+ if (this.configuration.showFullDimension) {
247
+ canvasCoordinates = this.handleFullDimension(
248
+ targetViewport,
249
+ lineStartWorld,
250
+ viewPlaneNormal,
251
+ viewUp,
252
+ lineEndWorld,
253
+ canvasCoordinates
254
+ );
255
+ }
256
+
246
257
  const dataId = `${annotationUID}-line`;
247
258
  const lineUID = '1';
248
259
  drawLineSvg(
@@ -270,9 +281,126 @@ class ReferenceLines extends AnnotationDisplayTool {
270
281
  return Math.abs(dot) < EPSILON;
271
282
  };
272
283
 
284
+ private handleFullDimension(
285
+ targetViewport: Types.IStackViewport | Types.IVolumeViewport,
286
+ lineStartWorld: Types.Point3,
287
+ viewPlaneNormal: Types.Point3,
288
+ viewUp: Types.Point3,
289
+ lineEndWorld: Types.Point3,
290
+ canvasCoordinates: Types.Point2[]
291
+ ) {
292
+ const renderingEngine = targetViewport.getRenderingEngine();
293
+ const targetId = this.getTargetId(targetViewport);
294
+ const targetImage = this.getTargetIdImage(targetId, renderingEngine);
295
+
296
+ const referencedImageId = this.getReferencedImageId(
297
+ targetViewport,
298
+ lineStartWorld,
299
+ viewPlaneNormal,
300
+ viewUp
301
+ );
302
+
303
+ if (referencedImageId && targetImage) {
304
+ try {
305
+ const { imageData, dimensions } = targetImage;
306
+
307
+ // Calculate bound image coordinates
308
+ const [
309
+ topLeftImageCoord,
310
+ topRightImageCoord,
311
+ bottomRightImageCoord,
312
+ bottomLeftImageCoord,
313
+ ] = [
314
+ imageData.indexToWorld([0, 0, 0]) as Types.Point3,
315
+ imageData.indexToWorld([dimensions[0] - 1, 0, 0]) as Types.Point3,
316
+ imageData.indexToWorld([
317
+ dimensions[0] - 1,
318
+ dimensions[1] - 1,
319
+ 0,
320
+ ]) as Types.Point3,
321
+ imageData.indexToWorld([0, dimensions[1] - 1, 0]) as Types.Point3,
322
+ ].map((world) => csUtils.worldToImageCoords(referencedImageId, world));
323
+
324
+ // Calculate line start and end image coordinates
325
+ const [lineStartImageCoord, lineEndImageCoord] = [
326
+ lineStartWorld,
327
+ lineEndWorld,
328
+ ].map((world) => csUtils.worldToImageCoords(referencedImageId, world));
329
+
330
+ // Calculate intersection points between line and image bounds
331
+ canvasCoordinates = [
332
+ [topLeftImageCoord, topRightImageCoord],
333
+ [topRightImageCoord, bottomRightImageCoord],
334
+ [bottomLeftImageCoord, bottomRightImageCoord],
335
+ [topLeftImageCoord, bottomLeftImageCoord],
336
+ ]
337
+ .map(([start, end]) =>
338
+ this.intersectInfiniteLines(
339
+ start,
340
+ end,
341
+ lineStartImageCoord,
342
+ lineEndImageCoord
343
+ )
344
+ )
345
+ .filter((point) => point && this.isInBound(point, dimensions))
346
+ .map((point) => {
347
+ const world = csUtils.imageToWorldCoords(
348
+ referencedImageId,
349
+ point as Types.Point2
350
+ );
351
+ return targetViewport.worldToCanvas(world);
352
+ });
353
+ } catch (err) {
354
+ console.log(err);
355
+ }
356
+ }
357
+ return canvasCoordinates;
358
+ }
359
+
360
+ // get the intersection point between two infinite lines, not line segments
361
+ intersectInfiniteLines(
362
+ line1Start: Types.Point2,
363
+ line1End: Types.Point2,
364
+ line2Start: Types.Point2,
365
+ line2End: Types.Point2
366
+ ) {
367
+ const [x1, y1] = line1Start;
368
+ const [x2, y2] = line1End;
369
+ const [x3, y3] = line2Start;
370
+ const [x4, y4] = line2End;
371
+
372
+ // Compute a1, b1, c1, where line joining points 1 and 2 is "a1 x + b1 y + c1 = 0"
373
+ const a1 = y2 - y1;
374
+ const b1 = x1 - x2;
375
+ const c1 = x2 * y1 - x1 * y2;
376
+
377
+ // Compute a2, b2, c2
378
+ const a2 = y4 - y3;
379
+ const b2 = x3 - x4;
380
+ const c2 = x4 * y3 - x3 * y4;
381
+
382
+ if (Math.abs(a1 * b2 - a2 * b1) < EPSILON) {
383
+ return;
384
+ }
385
+
386
+ const x = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
387
+ const y = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
388
+
389
+ return [x, y];
390
+ }
391
+
273
392
  isParallel(vec1: Types.Point3, vec2: Types.Point3): boolean {
274
393
  return Math.abs(vec3.dot(vec1, vec2)) > 1 - EPSILON;
275
394
  }
395
+
396
+ isInBound(point: number[], dimensions: Types.Point3): boolean {
397
+ return (
398
+ point[0] >= 0 &&
399
+ point[0] <= dimensions[0] &&
400
+ point[1] >= 0 &&
401
+ point[1] <= dimensions[1]
402
+ );
403
+ }
276
404
  }
277
405
 
278
406
  ReferenceLines.toolName = 'ReferenceLines';
@@ -658,7 +658,10 @@ class AngleTool extends AnnotationTool {
658
658
  const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
659
659
 
660
660
  // WE HAVE TO CACHE STATS BEFORE FETCHING TEXT
661
- if (!data.cachedStats[targetId]) {
661
+ if (
662
+ !data.cachedStats[targetId] ||
663
+ data.cachedStats[targetId].angle == null
664
+ ) {
662
665
  data.cachedStats[targetId] = {
663
666
  angle: null,
664
667
  };
@@ -1073,7 +1073,7 @@ class BidirectionalTool extends AnnotationTool {
1073
1073
  // force to recalculate the stats from the points
1074
1074
  if (
1075
1075
  !data.cachedStats[targetId] ||
1076
- data.cachedStats[targetId].unit === undefined
1076
+ data.cachedStats[targetId].unit == null
1077
1077
  ) {
1078
1078
  data.cachedStats[targetId] = {
1079
1079
  length: null,
@@ -44,7 +44,6 @@ import {
44
44
  TextBoxHandle,
45
45
  PublicToolProps,
46
46
  ToolProps,
47
- InteractionTypes,
48
47
  SVGDrawingHelper,
49
48
  } from '../../types';
50
49
  import { CircleROIAnnotation } from '../../types/ToolSpecificAnnotationTypes';
@@ -52,8 +51,6 @@ import { CircleROIAnnotation } from '../../types/ToolSpecificAnnotationTypes';
52
51
  import {
53
52
  AnnotationCompletedEventDetail,
54
53
  AnnotationModifiedEventDetail,
55
- MouseDragEventType,
56
- MouseMoveEventType,
57
54
  } from '../../types/EventTypes';
58
55
  import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds';
59
56
  import { pointInShapeCallback } from '../../utilities';
@@ -678,21 +675,11 @@ class CircleROITool extends AnnotationTool {
678
675
 
679
676
  const { centerPointRadius } = this.configuration;
680
677
 
681
- const modalityUnitOptions = {
682
- isPreScaled: isViewportPreScaled(viewport, targetId),
683
-
684
- isSuvScaled: this.isSuvScaled(
685
- viewport,
686
- targetId,
687
- annotation.metadata.referencedImageId
688
- ),
689
- };
690
-
691
678
  // If cachedStats does not exist, or the unit is missing (as part of import/hydration etc.),
692
679
  // force to recalculate the stats from the points
693
680
  if (
694
681
  !data.cachedStats[targetId] ||
695
- data.cachedStats[targetId].areaUnit === undefined
682
+ data.cachedStats[targetId].areaUnit == null
696
683
  ) {
697
684
  data.cachedStats[targetId] = {
698
685
  Modality: null,
@@ -710,16 +697,14 @@ class CircleROITool extends AnnotationTool {
710
697
  annotation,
711
698
  viewport,
712
699
  renderingEngine,
713
- enabledElement,
714
- modalityUnitOptions
700
+ enabledElement
715
701
  );
716
702
  } else if (annotation.invalidated) {
717
703
  this._throttledCalculateCachedStats(
718
704
  annotation,
719
705
  viewport,
720
706
  renderingEngine,
721
- enabledElement,
722
- modalityUnitOptions
707
+ enabledElement
723
708
  );
724
709
  // If the invalidated data is as a result of volumeViewport manipulation
725
710
  // of the tools, we need to invalidate the related viewports data, so that
@@ -889,8 +874,7 @@ class CircleROITool extends AnnotationTool {
889
874
  annotation,
890
875
  viewport,
891
876
  renderingEngine,
892
- enabledElement,
893
- modalityUnitOptions: ModalityUnitOptions
877
+ enabledElement
894
878
  ) => {
895
879
  const data = annotation.data;
896
880
  const { viewportId, renderingEngineId } = enabledElement;
@@ -985,6 +969,15 @@ class CircleROITool extends AnnotationTool {
985
969
  (worldHeight / aspect / scale / 2)
986
970
  );
987
971
 
972
+ const modalityUnitOptions = {
973
+ isPreScaled: isViewportPreScaled(viewport, targetId),
974
+ isSuvScaled: this.isSuvScaled(
975
+ viewport,
976
+ targetId,
977
+ annotation.metadata.referencedImageId
978
+ ),
979
+ };
980
+
988
981
  const modalityUnit = getModalityUnit(
989
982
  metadata.Modality,
990
983
  annotation.metadata.referencedImageId,