@cornerstonejs/tools 0.12.1 → 0.14.1

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 (177) hide show
  1. package/dist/cjs/cursors/SVGMouseCursor.js +2 -2
  2. package/dist/cjs/cursors/SVGMouseCursor.js.map +1 -1
  3. package/dist/cjs/drawingSvg/drawArrow.js +0 -2
  4. package/dist/cjs/drawingSvg/drawArrow.js.map +1 -1
  5. package/dist/cjs/drawingSvg/drawTextBox.js +9 -0
  6. package/dist/cjs/drawingSvg/drawTextBox.js.map +1 -1
  7. package/dist/cjs/enums/ToolBindings.js.map +1 -1
  8. package/dist/cjs/index.d.ts +2 -2
  9. package/dist/cjs/index.js +4 -1
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/cjs/stateManagement/annotation/config/ToolStyle.d.ts +18 -0
  12. package/dist/cjs/stateManagement/annotation/config/ToolStyle.js +129 -0
  13. package/dist/cjs/stateManagement/annotation/config/ToolStyle.js.map +1 -0
  14. package/dist/cjs/stateManagement/annotation/config/getFont.d.ts +2 -2
  15. package/dist/cjs/stateManagement/annotation/config/getFont.js +4 -6
  16. package/dist/cjs/stateManagement/annotation/config/getFont.js.map +1 -1
  17. package/dist/cjs/stateManagement/annotation/config/helpers.d.ts +4 -0
  18. package/dist/cjs/stateManagement/annotation/config/helpers.js +26 -0
  19. package/dist/cjs/stateManagement/annotation/config/helpers.js.map +1 -0
  20. package/dist/cjs/stateManagement/annotation/config/index.d.ts +2 -5
  21. package/dist/cjs/stateManagement/annotation/config/index.js +3 -9
  22. package/dist/cjs/stateManagement/annotation/config/index.js.map +1 -1
  23. package/dist/cjs/stateManagement/index.d.ts +1 -4
  24. package/dist/cjs/stateManagement/index.js +1 -10
  25. package/dist/cjs/stateManagement/index.js.map +1 -1
  26. package/dist/cjs/tools/MagnifyTool.d.ts +24 -0
  27. package/dist/cjs/tools/MagnifyTool.js +169 -0
  28. package/dist/cjs/tools/MagnifyTool.js.map +1 -0
  29. package/dist/cjs/tools/annotation/AngleTool.d.ts +37 -0
  30. package/dist/cjs/tools/annotation/AngleTool.js +442 -0
  31. package/dist/cjs/tools/annotation/AngleTool.js.map +1 -0
  32. package/dist/cjs/tools/annotation/ArrowAnnotateTool.js +12 -7
  33. package/dist/cjs/tools/annotation/ArrowAnnotateTool.js.map +1 -1
  34. package/dist/cjs/tools/annotation/BidirectionalTool.js +11 -8
  35. package/dist/cjs/tools/annotation/BidirectionalTool.js.map +1 -1
  36. package/dist/cjs/tools/annotation/DragProbeTool.d.ts +23 -0
  37. package/dist/cjs/tools/annotation/DragProbeTool.js +109 -0
  38. package/dist/cjs/tools/annotation/DragProbeTool.js.map +1 -0
  39. package/dist/cjs/tools/annotation/EllipticalROITool.js +42 -30
  40. package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
  41. package/dist/cjs/tools/annotation/LengthTool.js +11 -8
  42. package/dist/cjs/tools/annotation/LengthTool.js.map +1 -1
  43. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js +0 -1
  44. package/dist/cjs/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  45. package/dist/cjs/tools/annotation/ProbeTool.js +8 -4
  46. package/dist/cjs/tools/annotation/ProbeTool.js.map +1 -1
  47. package/dist/cjs/tools/annotation/RectangleROITool.js +11 -8
  48. package/dist/cjs/tools/annotation/RectangleROITool.js.map +1 -1
  49. package/dist/cjs/tools/annotation/planarFreehandROITool/renderMethods.js +16 -10
  50. package/dist/cjs/tools/annotation/planarFreehandROITool/renderMethods.js.map +1 -1
  51. package/dist/cjs/tools/base/AnnotationTool.d.ts +3 -3
  52. package/dist/cjs/tools/base/AnnotationTool.js +10 -10
  53. package/dist/cjs/tools/base/AnnotationTool.js.map +1 -1
  54. package/dist/cjs/tools/index.d.ts +4 -1
  55. package/dist/cjs/tools/index.js +7 -1
  56. package/dist/cjs/tools/index.js.map +1 -1
  57. package/dist/cjs/tools/segmentation/RectangleROIStartEndThresholdTool.js +10 -7
  58. package/dist/cjs/tools/segmentation/RectangleROIStartEndThresholdTool.js.map +1 -1
  59. package/dist/cjs/tools/segmentation/RectangleROIThresholdTool.js +10 -7
  60. package/dist/cjs/tools/segmentation/RectangleROIThresholdTool.js.map +1 -1
  61. package/dist/cjs/tools/segmentation/RectangleScissorsTool.js +0 -3
  62. package/dist/cjs/tools/segmentation/RectangleScissorsTool.js.map +1 -1
  63. package/dist/cjs/types/AnnotationStyle.d.ts +29 -0
  64. package/dist/cjs/types/AnnotationStyle.js +3 -0
  65. package/dist/cjs/types/AnnotationStyle.js.map +1 -0
  66. package/dist/cjs/types/ToolSpecificAnnotationTypes.d.ts +24 -0
  67. package/dist/cjs/types/index.d.ts +2 -1
  68. package/dist/cjs/utilities/math/angle/angleBetweenLines.d.ts +4 -0
  69. package/dist/cjs/utilities/math/angle/angleBetweenLines.js +17 -0
  70. package/dist/cjs/utilities/math/angle/angleBetweenLines.js.map +1 -0
  71. package/dist/cjs/utilities/viewportFilters/filterViewportsWithToolEnabled.js +3 -0
  72. package/dist/cjs/utilities/viewportFilters/filterViewportsWithToolEnabled.js.map +1 -1
  73. package/dist/esm/cursors/SVGMouseCursor.js +2 -2
  74. package/dist/esm/cursors/SVGMouseCursor.js.map +1 -1
  75. package/dist/esm/drawingSvg/drawArrow.js +0 -2
  76. package/dist/esm/drawingSvg/drawArrow.js.map +1 -1
  77. package/dist/esm/drawingSvg/drawTextBox.js +9 -0
  78. package/dist/esm/drawingSvg/drawTextBox.js.map +1 -1
  79. package/dist/esm/enums/ToolBindings.js.map +1 -1
  80. package/dist/esm/index.d.ts +2 -2
  81. package/dist/esm/index.js +2 -2
  82. package/dist/esm/index.js.map +1 -1
  83. package/dist/esm/stateManagement/annotation/config/ToolStyle.d.ts +18 -0
  84. package/dist/esm/stateManagement/annotation/config/ToolStyle.js +136 -0
  85. package/dist/esm/stateManagement/annotation/config/ToolStyle.js.map +1 -0
  86. package/dist/esm/stateManagement/annotation/config/getFont.d.ts +2 -2
  87. package/dist/esm/stateManagement/annotation/config/getFont.js +4 -6
  88. package/dist/esm/stateManagement/annotation/config/getFont.js.map +1 -1
  89. package/dist/esm/stateManagement/annotation/config/helpers.d.ts +4 -0
  90. package/dist/esm/stateManagement/annotation/config/helpers.js +20 -0
  91. package/dist/esm/stateManagement/annotation/config/helpers.js.map +1 -0
  92. package/dist/esm/stateManagement/annotation/config/index.d.ts +2 -5
  93. package/dist/esm/stateManagement/annotation/config/index.js +2 -5
  94. package/dist/esm/stateManagement/annotation/config/index.js.map +1 -1
  95. package/dist/esm/stateManagement/index.d.ts +1 -4
  96. package/dist/esm/stateManagement/index.js +1 -4
  97. package/dist/esm/stateManagement/index.js.map +1 -1
  98. package/dist/esm/tools/MagnifyTool.d.ts +24 -0
  99. package/dist/esm/tools/MagnifyTool.js +163 -0
  100. package/dist/esm/tools/MagnifyTool.js.map +1 -0
  101. package/dist/esm/tools/annotation/AngleTool.d.ts +37 -0
  102. package/dist/esm/tools/annotation/AngleTool.js +417 -0
  103. package/dist/esm/tools/annotation/AngleTool.js.map +1 -0
  104. package/dist/esm/tools/annotation/ArrowAnnotateTool.js +13 -8
  105. package/dist/esm/tools/annotation/ArrowAnnotateTool.js.map +1 -1
  106. package/dist/esm/tools/annotation/BidirectionalTool.js +12 -9
  107. package/dist/esm/tools/annotation/BidirectionalTool.js.map +1 -1
  108. package/dist/esm/tools/annotation/DragProbeTool.d.ts +23 -0
  109. package/dist/esm/tools/annotation/DragProbeTool.js +103 -0
  110. package/dist/esm/tools/annotation/DragProbeTool.js.map +1 -0
  111. package/dist/esm/tools/annotation/EllipticalROITool.js +43 -31
  112. package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
  113. package/dist/esm/tools/annotation/LengthTool.js +12 -9
  114. package/dist/esm/tools/annotation/LengthTool.js.map +1 -1
  115. package/dist/esm/tools/annotation/PlanarFreehandROITool.js +1 -2
  116. package/dist/esm/tools/annotation/PlanarFreehandROITool.js.map +1 -1
  117. package/dist/esm/tools/annotation/ProbeTool.js +9 -5
  118. package/dist/esm/tools/annotation/ProbeTool.js.map +1 -1
  119. package/dist/esm/tools/annotation/RectangleROITool.js +12 -9
  120. package/dist/esm/tools/annotation/RectangleROITool.js.map +1 -1
  121. package/dist/esm/tools/annotation/planarFreehandROITool/renderMethods.js +16 -10
  122. package/dist/esm/tools/annotation/planarFreehandROITool/renderMethods.js.map +1 -1
  123. package/dist/esm/tools/base/AnnotationTool.d.ts +3 -3
  124. package/dist/esm/tools/base/AnnotationTool.js +10 -10
  125. package/dist/esm/tools/base/AnnotationTool.js.map +1 -1
  126. package/dist/esm/tools/index.d.ts +4 -1
  127. package/dist/esm/tools/index.js +4 -1
  128. package/dist/esm/tools/index.js.map +1 -1
  129. package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.js +11 -8
  130. package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.js.map +1 -1
  131. package/dist/esm/tools/segmentation/RectangleROIThresholdTool.js +11 -8
  132. package/dist/esm/tools/segmentation/RectangleROIThresholdTool.js.map +1 -1
  133. package/dist/esm/tools/segmentation/RectangleScissorsTool.js +1 -4
  134. package/dist/esm/tools/segmentation/RectangleScissorsTool.js.map +1 -1
  135. package/dist/esm/types/AnnotationStyle.d.ts +29 -0
  136. package/dist/esm/types/AnnotationStyle.js +2 -0
  137. package/dist/esm/types/AnnotationStyle.js.map +1 -0
  138. package/dist/esm/types/ToolSpecificAnnotationTypes.d.ts +24 -0
  139. package/dist/esm/types/index.d.ts +2 -1
  140. package/dist/esm/utilities/math/angle/angleBetweenLines.d.ts +4 -0
  141. package/dist/esm/utilities/math/angle/angleBetweenLines.js +14 -0
  142. package/dist/esm/utilities/math/angle/angleBetweenLines.js.map +1 -0
  143. package/dist/esm/utilities/viewportFilters/filterViewportsWithToolEnabled.js +3 -0
  144. package/dist/esm/utilities/viewportFilters/filterViewportsWithToolEnabled.js.map +1 -1
  145. package/dist/umd/index.js +1 -1
  146. package/dist/umd/index.js.map +1 -1
  147. package/package.json +6 -6
  148. package/dist/cjs/stateManagement/annotation/config/annotationStyle.d.ts +0 -5
  149. package/dist/cjs/stateManagement/annotation/config/annotationStyle.js +0 -74
  150. package/dist/cjs/stateManagement/annotation/config/annotationStyle.js.map +0 -1
  151. package/dist/cjs/stateManagement/annotation/config/getStyle.d.ts +0 -2
  152. package/dist/cjs/stateManagement/annotation/config/getStyle.js +0 -22
  153. package/dist/cjs/stateManagement/annotation/config/getStyle.js.map +0 -1
  154. package/dist/cjs/stateManagement/annotation/config/setAnnotationStyle.d.ts +0 -2
  155. package/dist/cjs/stateManagement/annotation/config/setAnnotationStyle.js +0 -17
  156. package/dist/cjs/stateManagement/annotation/config/setAnnotationStyle.js.map +0 -1
  157. package/dist/cjs/stateManagement/annotation/config/setGlobalStyle.d.ts +0 -1
  158. package/dist/cjs/stateManagement/annotation/config/setGlobalStyle.js +0 -8
  159. package/dist/cjs/stateManagement/annotation/config/setGlobalStyle.js.map +0 -1
  160. package/dist/cjs/stateManagement/annotation/config/setToolStyle.d.ts +0 -1
  161. package/dist/cjs/stateManagement/annotation/config/setToolStyle.js +0 -17
  162. package/dist/cjs/stateManagement/annotation/config/setToolStyle.js.map +0 -1
  163. package/dist/esm/stateManagement/annotation/config/annotationStyle.d.ts +0 -5
  164. package/dist/esm/stateManagement/annotation/config/annotationStyle.js +0 -70
  165. package/dist/esm/stateManagement/annotation/config/annotationStyle.js.map +0 -1
  166. package/dist/esm/stateManagement/annotation/config/getStyle.d.ts +0 -2
  167. package/dist/esm/stateManagement/annotation/config/getStyle.js +0 -16
  168. package/dist/esm/stateManagement/annotation/config/getStyle.js.map +0 -1
  169. package/dist/esm/stateManagement/annotation/config/setAnnotationStyle.d.ts +0 -2
  170. package/dist/esm/stateManagement/annotation/config/setAnnotationStyle.js +0 -12
  171. package/dist/esm/stateManagement/annotation/config/setAnnotationStyle.js.map +0 -1
  172. package/dist/esm/stateManagement/annotation/config/setGlobalStyle.d.ts +0 -1
  173. package/dist/esm/stateManagement/annotation/config/setGlobalStyle.js +0 -5
  174. package/dist/esm/stateManagement/annotation/config/setGlobalStyle.js.map +0 -1
  175. package/dist/esm/stateManagement/annotation/config/setToolStyle.d.ts +0 -1
  176. package/dist/esm/stateManagement/annotation/config/setToolStyle.js +0 -11
  177. package/dist/esm/stateManagement/annotation/config/setToolStyle.js.map +0 -1
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const base_1 = require("./base");
7
+ const enums_1 = require("../enums");
8
+ const core_1 = require("@cornerstonejs/core");
9
+ const viewportFilters_1 = require("../utilities/viewportFilters");
10
+ const triggerAnnotationRenderForViewportIds_1 = __importDefault(require("../utilities/triggerAnnotationRenderForViewportIds"));
11
+ const store_1 = require("../store");
12
+ const core_2 = require("@cornerstonejs/core");
13
+ const elementCursor_1 = require("../cursors/elementCursor");
14
+ const MAGNIFY_VIEWPORT_ID = 'maginify-viewport';
15
+ class MagnifyTool extends base_1.BaseTool {
16
+ constructor(toolProps = {}, defaultToolProps = {
17
+ supportedInteractionTypes: ['Mouse', 'Touch'],
18
+ configuration: {
19
+ magnifySize: 10,
20
+ magnifyWidth: 250,
21
+ magnifyHeight: 250,
22
+ },
23
+ }) {
24
+ super(toolProps, defaultToolProps);
25
+ this.preMouseDownCallback = (evt) => {
26
+ const eventDetail = evt.detail;
27
+ const { currentPoints, element } = eventDetail;
28
+ const enabledElement = (0, core_1.getEnabledElement)(element);
29
+ const { viewport, renderingEngine } = enabledElement;
30
+ if (!(viewport instanceof core_1.StackViewport)) {
31
+ throw new Error('MagnifyTool only works on StackViewports');
32
+ }
33
+ const referencedImageId = this._getReferencedImageId(viewport);
34
+ if (!referencedImageId) {
35
+ throw new Error('MagnifyTool: No referenced image id found, reconstructed planes not supported yet');
36
+ }
37
+ const viewportIdsToRender = (0, viewportFilters_1.getViewportIdsWithToolToRender)(element, this.getToolName());
38
+ this.editData = {
39
+ referencedImageId,
40
+ viewportIdsToRender,
41
+ enabledElement,
42
+ renderingEngine,
43
+ currentPoints,
44
+ };
45
+ this._createMagnificationViewport();
46
+ this._activateDraw(element);
47
+ (0, elementCursor_1.hideElementCursor)(element);
48
+ evt.preventDefault();
49
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
50
+ return true;
51
+ };
52
+ this._createMagnificationViewport = () => {
53
+ const { enabledElement, referencedImageId, viewportIdsToRender, renderingEngine, currentPoints, } = this.editData;
54
+ const { viewport } = enabledElement;
55
+ const { element } = viewport;
56
+ const { voiRange } = viewport.getProperties();
57
+ const { canvas: canvasPos, world: worldPos } = currentPoints;
58
+ let magnifyToolElement;
59
+ magnifyToolElement = element.querySelector('.magnifyTool');
60
+ if (magnifyToolElement === null) {
61
+ const magnifyElement = document.createElement('div');
62
+ magnifyElement.classList.add('magnifyTool');
63
+ magnifyElement.style.display = 'block';
64
+ magnifyElement.style.width = `${this.configuration.magnifyWidth}px`;
65
+ magnifyElement.style.height = `${this.configuration.magnifyHeight}px`;
66
+ magnifyElement.style.position = 'absolute';
67
+ magnifyToolElement = magnifyElement;
68
+ const viewportElement = element.querySelector('.viewport-element');
69
+ viewportElement.appendChild(magnifyElement);
70
+ const viewportInput = {
71
+ viewportId: MAGNIFY_VIEWPORT_ID,
72
+ type: core_2.Enums.ViewportType.STACK,
73
+ element: magnifyToolElement,
74
+ };
75
+ renderingEngine.enableElement(viewportInput);
76
+ }
77
+ magnifyToolElement.style.top = `${canvasPos[1] - this.configuration.magnifyHeight / 2}px`;
78
+ magnifyToolElement.style.left = `${canvasPos[0] - this.configuration.magnifyWidth / 2}px`;
79
+ const magnifyViewport = renderingEngine.getViewport(MAGNIFY_VIEWPORT_ID);
80
+ magnifyViewport.setStack([referencedImageId]).then(() => {
81
+ magnifyViewport.setProperties({ voiRange });
82
+ const { parallelScale } = viewport.getCamera();
83
+ const { focalPoint, position, viewPlaneNormal } = magnifyViewport.getCamera();
84
+ const distance = Math.sqrt(Math.pow(focalPoint[0] - position[0], 2) +
85
+ Math.pow(focalPoint[1] - position[1], 2) +
86
+ Math.pow(focalPoint[2] - position[2], 2));
87
+ const updatedFocalPoint = [
88
+ worldPos[0],
89
+ worldPos[1],
90
+ worldPos[2],
91
+ ];
92
+ const updatedPosition = [
93
+ updatedFocalPoint[0] + distance * viewPlaneNormal[0],
94
+ updatedFocalPoint[1] + distance * viewPlaneNormal[1],
95
+ updatedFocalPoint[2] + distance * viewPlaneNormal[2],
96
+ ];
97
+ magnifyViewport.setCamera({
98
+ parallelScale: parallelScale * (1 / this.configuration.magnifySize),
99
+ focalPoint: updatedFocalPoint,
100
+ position: updatedPosition,
101
+ });
102
+ magnifyViewport.render();
103
+ });
104
+ magnifyToolElement.style.display = 'block';
105
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
106
+ };
107
+ this._mouseDragCallback = (evt) => {
108
+ const eventDetail = evt.detail;
109
+ const { currentPoints, deltaPoints, element } = eventDetail;
110
+ const deltaPointsWorld = deltaPoints.world;
111
+ const canvasPos = currentPoints.canvas;
112
+ const enabledElement = (0, core_1.getEnabledElement)(element);
113
+ const { renderingEngine } = enabledElement;
114
+ const magnifyViewport = renderingEngine.getViewport(MAGNIFY_VIEWPORT_ID);
115
+ const magnifyElement = element.querySelector('.magnifyTool');
116
+ if (!magnifyElement) {
117
+ return;
118
+ }
119
+ magnifyElement.style.top = `${canvasPos[1] - this.configuration.magnifyHeight / 2}px`;
120
+ magnifyElement.style.left = `${canvasPos[0] - this.configuration.magnifyWidth / 2}px`;
121
+ const { focalPoint, position } = magnifyViewport.getCamera();
122
+ const updatedPosition = [
123
+ position[0] + deltaPointsWorld[0],
124
+ position[1] + deltaPointsWorld[1],
125
+ position[2] + deltaPointsWorld[2],
126
+ ];
127
+ const updatedFocalPoint = [
128
+ focalPoint[0] + deltaPointsWorld[0],
129
+ focalPoint[1] + deltaPointsWorld[1],
130
+ focalPoint[2] + deltaPointsWorld[2],
131
+ ];
132
+ magnifyViewport.setCamera({
133
+ focalPoint: updatedFocalPoint,
134
+ position: updatedPosition,
135
+ });
136
+ magnifyViewport.render();
137
+ };
138
+ this._mouseUpCallback = (evt) => {
139
+ const { element } = evt.detail;
140
+ const magnifyToolElement = element.querySelector('.magnifyTool');
141
+ magnifyToolElement.style.display = 'none';
142
+ this._deactivateDraw(element);
143
+ (0, elementCursor_1.resetElementCursor)(element);
144
+ };
145
+ this._activateDraw = (element) => {
146
+ store_1.state.isInteractingWithTool = true;
147
+ element.addEventListener(enums_1.Events.MOUSE_UP, this._mouseUpCallback);
148
+ element.addEventListener(enums_1.Events.MOUSE_DRAG, this._mouseDragCallback);
149
+ element.addEventListener(enums_1.Events.MOUSE_CLICK, this._mouseUpCallback);
150
+ };
151
+ this._deactivateDraw = (element) => {
152
+ store_1.state.isInteractingWithTool = false;
153
+ element.removeEventListener(enums_1.Events.MOUSE_UP, this._mouseUpCallback);
154
+ element.removeEventListener(enums_1.Events.MOUSE_DRAG, this._mouseDragCallback);
155
+ element.removeEventListener(enums_1.Events.MOUSE_CLICK, this._mouseUpCallback);
156
+ };
157
+ }
158
+ _getReferencedImageId(viewport) {
159
+ const targetId = this.getTargetId(viewport);
160
+ let referencedImageId;
161
+ if (viewport instanceof core_1.StackViewport) {
162
+ referencedImageId = targetId.split('imageId:')[1];
163
+ }
164
+ return referencedImageId;
165
+ }
166
+ }
167
+ exports.default = MagnifyTool;
168
+ MagnifyTool.toolName = 'Magnify';
169
+ //# sourceMappingURL=MagnifyTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MagnifyTool.js","sourceRoot":"","sources":["../../../src/tools/MagnifyTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Types } from '@cornerstonejs/core';
2
+ import { AnnotationTool } from '../base';
3
+ import { EventTypes, ToolHandle, PublicToolProps, ToolProps, InteractionTypes } from '../../types';
4
+ import { AngleAnnotation } from '../../types/ToolSpecificAnnotationTypes';
5
+ declare class AngleTool extends AnnotationTool {
6
+ static toolName: string;
7
+ touchDragCallback: any;
8
+ mouseDragCallback: any;
9
+ angleStartedNotYetCompleted: boolean;
10
+ _throttledCalculateCachedStats: any;
11
+ editData: {
12
+ annotation: any;
13
+ viewportIdsToRender: string[];
14
+ handleIndex?: number;
15
+ movingTextBox?: boolean;
16
+ newAnnotation?: boolean;
17
+ hasMoved?: boolean;
18
+ } | null;
19
+ isDrawing: boolean;
20
+ isHandleOutsideImage: boolean;
21
+ constructor(toolProps?: PublicToolProps, defaultToolProps?: ToolProps);
22
+ addNewAnnotation: (evt: EventTypes.MouseDownActivateEventType) => AngleAnnotation;
23
+ isPointNearTool: (element: HTMLDivElement, annotation: AngleAnnotation, canvasCoords: Types.Point2, proximity: number) => boolean;
24
+ toolSelectedCallback: (evt: EventTypes.MouseDownEventType, annotation: AngleAnnotation, interactionType: InteractionTypes) => void;
25
+ handleSelectedCallback(evt: EventTypes.MouseDownEventType, annotation: AngleAnnotation, handle: ToolHandle, interactionType?: string): void;
26
+ _mouseUpCallback: (evt: EventTypes.MouseUpEventType | EventTypes.MouseClickEventType) => void;
27
+ _mouseDragCallback: (evt: EventTypes.MouseDragEventType | EventTypes.MouseMoveEventType) => void;
28
+ cancel: (element: HTMLDivElement) => any;
29
+ _activateModify: (element: HTMLDivElement) => void;
30
+ _deactivateModify: (element: HTMLDivElement) => void;
31
+ _activateDraw: (element: HTMLDivElement) => void;
32
+ _deactivateDraw: (element: HTMLDivElement) => void;
33
+ renderAnnotation: (enabledElement: Types.IEnabledElement, svgDrawingHelper: any) => void;
34
+ _getTextLines(data: any, targetId: any): string[];
35
+ _calculateCachedStats(annotation: any, renderingEngine: any, enabledElement: any): any;
36
+ }
37
+ export default AngleTool;
@@ -0,0 +1,442 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ const enums_1 = require("../../enums");
26
+ const core_1 = require("@cornerstonejs/core");
27
+ const base_1 = require("../base");
28
+ const throttle_1 = __importDefault(require("../../utilities/throttle"));
29
+ const annotationState_1 = require("../../stateManagement/annotation/annotationState");
30
+ const annotationLocking_1 = require("../../stateManagement/annotation/annotationLocking");
31
+ const lineSegment = __importStar(require("../../utilities/math/line"));
32
+ const angleBetweenLines_1 = __importDefault(require("../../utilities/math/angle/angleBetweenLines"));
33
+ const drawingSvg_1 = require("../../drawingSvg");
34
+ const store_1 = require("../../store");
35
+ const viewportFilters_1 = require("../../utilities/viewportFilters");
36
+ const drawing_1 = require("../../utilities/drawing");
37
+ const triggerAnnotationRenderForViewportIds_1 = __importDefault(require("../../utilities/triggerAnnotationRenderForViewportIds"));
38
+ const elementCursor_1 = require("../../cursors/elementCursor");
39
+ class AngleTool extends base_1.AnnotationTool {
40
+ constructor(toolProps = {}, defaultToolProps = {
41
+ supportedInteractionTypes: ['Mouse', 'Touch'],
42
+ configuration: {
43
+ shadow: true,
44
+ preventHandleOutsideImage: false,
45
+ },
46
+ }) {
47
+ super(toolProps, defaultToolProps);
48
+ this.addNewAnnotation = (evt) => {
49
+ if (this.angleStartedNotYetCompleted) {
50
+ return;
51
+ }
52
+ this.angleStartedNotYetCompleted = true;
53
+ const eventDetail = evt.detail;
54
+ const { currentPoints, element } = eventDetail;
55
+ const worldPos = currentPoints.world;
56
+ const enabledElement = (0, core_1.getEnabledElement)(element);
57
+ const { viewport, renderingEngine } = enabledElement;
58
+ (0, elementCursor_1.hideElementCursor)(element);
59
+ this.isDrawing = true;
60
+ const camera = viewport.getCamera();
61
+ const { viewPlaneNormal, viewUp } = camera;
62
+ const referencedImageId = this.getReferencedImageId(viewport, worldPos, viewPlaneNormal, viewUp);
63
+ const annotation = {
64
+ highlighted: true,
65
+ invalidated: true,
66
+ metadata: {
67
+ toolName: this.getToolName(),
68
+ viewPlaneNormal: [...viewPlaneNormal],
69
+ viewUp: [...viewUp],
70
+ FrameOfReferenceUID: viewport.getFrameOfReferenceUID(),
71
+ referencedImageId,
72
+ },
73
+ data: {
74
+ handles: {
75
+ points: [[...worldPos], [...worldPos]],
76
+ activeHandleIndex: null,
77
+ textBox: {
78
+ hasMoved: false,
79
+ worldPosition: [0, 0, 0],
80
+ worldBoundingBox: {
81
+ topLeft: [0, 0, 0],
82
+ topRight: [0, 0, 0],
83
+ bottomLeft: [0, 0, 0],
84
+ bottomRight: [0, 0, 0],
85
+ },
86
+ },
87
+ },
88
+ label: '',
89
+ cachedStats: {},
90
+ },
91
+ };
92
+ (0, annotationState_1.addAnnotation)(element, annotation);
93
+ const viewportIdsToRender = (0, viewportFilters_1.getViewportIdsWithToolToRender)(element, this.getToolName());
94
+ this.editData = {
95
+ annotation,
96
+ viewportIdsToRender,
97
+ handleIndex: 1,
98
+ movingTextBox: false,
99
+ newAnnotation: true,
100
+ hasMoved: false,
101
+ };
102
+ this._activateDraw(element);
103
+ evt.preventDefault();
104
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
105
+ return annotation;
106
+ };
107
+ this.isPointNearTool = (element, annotation, canvasCoords, proximity) => {
108
+ const enabledElement = (0, core_1.getEnabledElement)(element);
109
+ const { viewport } = enabledElement;
110
+ const { data } = annotation;
111
+ const [point1, point2, point3] = data.handles.points;
112
+ const canvasPoint1 = viewport.worldToCanvas(point1);
113
+ const canvasPoint2 = viewport.worldToCanvas(point2);
114
+ const canvasPoint3 = viewport.worldToCanvas(point3);
115
+ const line1 = {
116
+ start: {
117
+ x: canvasPoint1[0],
118
+ y: canvasPoint1[1],
119
+ },
120
+ end: {
121
+ x: canvasPoint2[0],
122
+ y: canvasPoint2[1],
123
+ },
124
+ };
125
+ const line2 = {
126
+ start: {
127
+ x: canvasPoint2[0],
128
+ y: canvasPoint2[1],
129
+ },
130
+ end: {
131
+ x: canvasPoint3[0],
132
+ y: canvasPoint3[1],
133
+ },
134
+ };
135
+ const distanceToPoint = lineSegment.distanceToPoint([line1.start.x, line1.start.y], [line1.end.x, line1.end.y], [canvasCoords[0], canvasCoords[1]]);
136
+ const distanceToPoint2 = lineSegment.distanceToPoint([line2.start.x, line2.start.y], [line2.end.x, line2.end.y], [canvasCoords[0], canvasCoords[1]]);
137
+ if (distanceToPoint <= proximity || distanceToPoint2 <= proximity) {
138
+ return true;
139
+ }
140
+ return false;
141
+ };
142
+ this.toolSelectedCallback = (evt, annotation, interactionType) => {
143
+ const eventDetail = evt.detail;
144
+ const { element } = eventDetail;
145
+ annotation.highlighted = true;
146
+ const viewportIdsToRender = (0, viewportFilters_1.getViewportIdsWithToolToRender)(element, this.getToolName());
147
+ this.editData = {
148
+ annotation,
149
+ viewportIdsToRender,
150
+ movingTextBox: false,
151
+ };
152
+ this._activateModify(element);
153
+ (0, elementCursor_1.hideElementCursor)(element);
154
+ const enabledElement = (0, core_1.getEnabledElement)(element);
155
+ const { renderingEngine } = enabledElement;
156
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
157
+ evt.preventDefault();
158
+ };
159
+ this._mouseUpCallback = (evt) => {
160
+ const eventDetail = evt.detail;
161
+ const { element } = eventDetail;
162
+ const { annotation, viewportIdsToRender, newAnnotation, hasMoved } = this.editData;
163
+ const { data } = annotation;
164
+ if (newAnnotation && !hasMoved) {
165
+ return;
166
+ }
167
+ if (this.angleStartedNotYetCompleted && data.handles.points.length === 2) {
168
+ this.editData.handleIndex = 2;
169
+ return;
170
+ }
171
+ this.angleStartedNotYetCompleted = false;
172
+ annotation.highlighted = false;
173
+ data.handles.activeHandleIndex = null;
174
+ this._deactivateModify(element);
175
+ this._deactivateDraw(element);
176
+ (0, elementCursor_1.resetElementCursor)(element);
177
+ const enabledElement = (0, core_1.getEnabledElement)(element);
178
+ const { renderingEngine } = enabledElement;
179
+ if (this.isHandleOutsideImage &&
180
+ this.configuration.preventHandleOutsideImage) {
181
+ (0, annotationState_1.removeAnnotation)(annotation.annotationUID, element);
182
+ }
183
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
184
+ if (newAnnotation) {
185
+ const eventType = enums_1.Events.ANNOTATION_COMPLETED;
186
+ const eventDetail = {
187
+ annotation,
188
+ };
189
+ (0, core_1.triggerEvent)(core_1.eventTarget, eventType, eventDetail);
190
+ }
191
+ this.editData = null;
192
+ this.isDrawing = false;
193
+ };
194
+ this._mouseDragCallback = (evt) => {
195
+ this.isDrawing = true;
196
+ const eventDetail = evt.detail;
197
+ const { element } = eventDetail;
198
+ const { annotation, viewportIdsToRender, handleIndex, movingTextBox } = this.editData;
199
+ const { data } = annotation;
200
+ if (movingTextBox) {
201
+ const { deltaPoints } = eventDetail;
202
+ const worldPosDelta = deltaPoints.world;
203
+ const { textBox } = data.handles;
204
+ const { worldPosition } = textBox;
205
+ worldPosition[0] += worldPosDelta[0];
206
+ worldPosition[1] += worldPosDelta[1];
207
+ worldPosition[2] += worldPosDelta[2];
208
+ textBox.hasMoved = true;
209
+ }
210
+ else if (handleIndex === undefined) {
211
+ const { deltaPoints } = eventDetail;
212
+ const worldPosDelta = deltaPoints.world;
213
+ const points = data.handles.points;
214
+ points.forEach((point) => {
215
+ point[0] += worldPosDelta[0];
216
+ point[1] += worldPosDelta[1];
217
+ point[2] += worldPosDelta[2];
218
+ });
219
+ annotation.invalidated = true;
220
+ }
221
+ else {
222
+ const { currentPoints } = eventDetail;
223
+ const worldPos = currentPoints.world;
224
+ data.handles.points[handleIndex] = [...worldPos];
225
+ annotation.invalidated = true;
226
+ }
227
+ this.editData.hasMoved = true;
228
+ const enabledElement = (0, core_1.getEnabledElement)(element);
229
+ const { renderingEngine } = enabledElement;
230
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
231
+ };
232
+ this.cancel = (element) => {
233
+ if (this.isDrawing) {
234
+ this.isDrawing = false;
235
+ this._deactivateDraw(element);
236
+ this._deactivateModify(element);
237
+ (0, elementCursor_1.resetElementCursor)(element);
238
+ const { annotation, viewportIdsToRender, newAnnotation } = this.editData;
239
+ const { data } = annotation;
240
+ annotation.highlighted = false;
241
+ data.handles.activeHandleIndex = null;
242
+ const enabledElement = (0, core_1.getEnabledElement)(element);
243
+ const { renderingEngine } = enabledElement;
244
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
245
+ if (newAnnotation) {
246
+ const eventType = enums_1.Events.ANNOTATION_COMPLETED;
247
+ const eventDetail = {
248
+ annotation,
249
+ };
250
+ (0, core_1.triggerEvent)(core_1.eventTarget, eventType, eventDetail);
251
+ }
252
+ this.editData = null;
253
+ return annotation.annotationUID;
254
+ }
255
+ };
256
+ this._activateModify = (element) => {
257
+ store_1.state.isInteractingWithTool = true;
258
+ element.addEventListener(enums_1.Events.MOUSE_UP, this._mouseUpCallback);
259
+ element.addEventListener(enums_1.Events.MOUSE_DRAG, this._mouseDragCallback);
260
+ element.addEventListener(enums_1.Events.MOUSE_CLICK, this._mouseUpCallback);
261
+ };
262
+ this._deactivateModify = (element) => {
263
+ store_1.state.isInteractingWithTool = false;
264
+ element.removeEventListener(enums_1.Events.MOUSE_UP, this._mouseUpCallback);
265
+ element.removeEventListener(enums_1.Events.MOUSE_DRAG, this._mouseDragCallback);
266
+ element.removeEventListener(enums_1.Events.MOUSE_CLICK, this._mouseUpCallback);
267
+ };
268
+ this._activateDraw = (element) => {
269
+ store_1.state.isInteractingWithTool = true;
270
+ element.addEventListener(enums_1.Events.MOUSE_UP, this._mouseUpCallback);
271
+ element.addEventListener(enums_1.Events.MOUSE_DRAG, this._mouseDragCallback);
272
+ element.addEventListener(enums_1.Events.MOUSE_MOVE, this._mouseDragCallback);
273
+ element.addEventListener(enums_1.Events.MOUSE_CLICK, this._mouseUpCallback);
274
+ };
275
+ this._deactivateDraw = (element) => {
276
+ store_1.state.isInteractingWithTool = false;
277
+ element.removeEventListener(enums_1.Events.MOUSE_UP, this._mouseUpCallback);
278
+ element.removeEventListener(enums_1.Events.MOUSE_DRAG, this._mouseDragCallback);
279
+ element.removeEventListener(enums_1.Events.MOUSE_MOVE, this._mouseDragCallback);
280
+ element.removeEventListener(enums_1.Events.MOUSE_CLICK, this._mouseUpCallback);
281
+ };
282
+ this.renderAnnotation = (enabledElement, svgDrawingHelper) => {
283
+ var _a;
284
+ const { viewport } = enabledElement;
285
+ const { element } = viewport;
286
+ let annotations = (0, annotationState_1.getAnnotations)(element, this.getToolName());
287
+ if (!(annotations === null || annotations === void 0 ? void 0 : annotations.length)) {
288
+ return;
289
+ }
290
+ annotations = this.filterInteractableAnnotationsForElement(element, annotations);
291
+ if (!(annotations === null || annotations === void 0 ? void 0 : annotations.length)) {
292
+ return;
293
+ }
294
+ const targetId = this.getTargetId(viewport);
295
+ const renderingEngine = viewport.getRenderingEngine();
296
+ const styleSpecifier = {
297
+ toolGroupId: this.toolGroupId,
298
+ toolName: this.getToolName(),
299
+ viewportId: enabledElement.viewport.id,
300
+ };
301
+ for (let i = 0; i < annotations.length; i++) {
302
+ const annotation = annotations[i];
303
+ const { annotationUID, data } = annotation;
304
+ const { points, activeHandleIndex } = data.handles;
305
+ styleSpecifier.annotationUID = annotationUID;
306
+ const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
307
+ const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
308
+ const color = this.getStyle('color', styleSpecifier, annotation);
309
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
310
+ if (!data.cachedStats[targetId]) {
311
+ data.cachedStats[targetId] = {
312
+ angle: null,
313
+ };
314
+ this._calculateCachedStats(annotation, renderingEngine, enabledElement);
315
+ }
316
+ else if (annotation.invalidated) {
317
+ this._throttledCalculateCachedStats(annotation, renderingEngine, enabledElement);
318
+ }
319
+ let activeHandleCanvasCoords;
320
+ if (!(0, annotationLocking_1.isAnnotationLocked)(annotation) &&
321
+ !this.editData &&
322
+ activeHandleIndex !== null) {
323
+ activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
324
+ }
325
+ if (activeHandleCanvasCoords) {
326
+ const handleGroupUID = '0';
327
+ (0, drawingSvg_1.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {
328
+ color,
329
+ lineDash,
330
+ lineWidth,
331
+ });
332
+ }
333
+ let lineUID = '1';
334
+ (0, drawingSvg_1.drawLine)(svgDrawingHelper, annotationUID, lineUID, canvasCoordinates[0], canvasCoordinates[1], {
335
+ color,
336
+ width: lineWidth,
337
+ lineDash,
338
+ });
339
+ if (canvasCoordinates.length !== 3) {
340
+ return;
341
+ }
342
+ lineUID = '2';
343
+ (0, drawingSvg_1.drawLine)(svgDrawingHelper, annotationUID, lineUID, canvasCoordinates[1], canvasCoordinates[2], {
344
+ color,
345
+ width: lineWidth,
346
+ lineDash,
347
+ });
348
+ if (!viewport.getRenderingEngine()) {
349
+ console.warn('Rendering Engine has been destroyed');
350
+ return;
351
+ }
352
+ if (!((_a = data.cachedStats[targetId]) === null || _a === void 0 ? void 0 : _a.angle)) {
353
+ continue;
354
+ }
355
+ const textLines = this._getTextLines(data, targetId);
356
+ if (!data.handles.textBox.hasMoved) {
357
+ const canvasTextBoxCoords = (0, drawing_1.getTextBoxCoordsCanvas)(canvasCoordinates);
358
+ data.handles.textBox.worldPosition =
359
+ viewport.canvasToWorld(canvasTextBoxCoords);
360
+ }
361
+ const textBoxPosition = viewport.worldToCanvas(data.handles.textBox.worldPosition);
362
+ const textBoxUID = '1';
363
+ const boundingBox = (0, drawingSvg_1.drawLinkedTextBox)(svgDrawingHelper, annotationUID, textBoxUID, textLines, textBoxPosition, canvasCoordinates, {}, this.getLinkedTextBoxStyle(styleSpecifier, annotation));
364
+ const { x: left, y: top, width, height } = boundingBox;
365
+ data.handles.textBox.worldBoundingBox = {
366
+ topLeft: viewport.canvasToWorld([left, top]),
367
+ topRight: viewport.canvasToWorld([left + width, top]),
368
+ bottomLeft: viewport.canvasToWorld([left, top + height]),
369
+ bottomRight: viewport.canvasToWorld([left + width, top + height]),
370
+ };
371
+ }
372
+ };
373
+ this._throttledCalculateCachedStats = (0, throttle_1.default)(this._calculateCachedStats, 100, { trailing: true });
374
+ }
375
+ handleSelectedCallback(evt, annotation, handle, interactionType = 'mouse') {
376
+ const eventDetail = evt.detail;
377
+ const { element } = eventDetail;
378
+ const { data } = annotation;
379
+ annotation.highlighted = true;
380
+ let movingTextBox = false;
381
+ let handleIndex;
382
+ if (handle.worldPosition) {
383
+ movingTextBox = true;
384
+ }
385
+ else {
386
+ handleIndex = data.handles.points.findIndex((p) => p === handle);
387
+ }
388
+ const viewportIdsToRender = (0, viewportFilters_1.getViewportIdsWithToolToRender)(element, this.getToolName());
389
+ this.editData = {
390
+ annotation,
391
+ viewportIdsToRender,
392
+ handleIndex,
393
+ movingTextBox,
394
+ };
395
+ this._activateModify(element);
396
+ (0, elementCursor_1.hideElementCursor)(element);
397
+ const enabledElement = (0, core_1.getEnabledElement)(element);
398
+ const { renderingEngine } = enabledElement;
399
+ (0, triggerAnnotationRenderForViewportIds_1.default)(renderingEngine, viewportIdsToRender);
400
+ evt.preventDefault();
401
+ }
402
+ _getTextLines(data, targetId) {
403
+ const cachedVolumeStats = data.cachedStats[targetId];
404
+ const { angle } = cachedVolumeStats;
405
+ if (angle === undefined) {
406
+ return;
407
+ }
408
+ const textLines = [`${angle.toFixed(2)} ${String.fromCharCode(176)}`];
409
+ return textLines;
410
+ }
411
+ _calculateCachedStats(annotation, renderingEngine, enabledElement) {
412
+ const data = annotation.data;
413
+ const { viewportId, renderingEngineId } = enabledElement;
414
+ if (data.handles.points.length !== 3) {
415
+ return;
416
+ }
417
+ const worldPos1 = data.handles.points[0];
418
+ const worldPos2 = data.handles.points[1];
419
+ const worldPos3 = data.handles.points[2];
420
+ const { cachedStats } = data;
421
+ const targetIds = Object.keys(cachedStats);
422
+ for (let i = 0; i < targetIds.length; i++) {
423
+ const targetId = targetIds[i];
424
+ const angle = (0, angleBetweenLines_1.default)([worldPos1, worldPos2], [worldPos2, worldPos3]);
425
+ cachedStats[targetId] = {
426
+ angle,
427
+ };
428
+ }
429
+ annotation.invalidated = false;
430
+ const eventType = enums_1.Events.ANNOTATION_MODIFIED;
431
+ const eventDetail = {
432
+ annotation,
433
+ viewportId,
434
+ renderingEngineId,
435
+ };
436
+ (0, core_1.triggerEvent)(core_1.eventTarget, eventType, eventDetail);
437
+ return cachedStats;
438
+ }
439
+ }
440
+ AngleTool.toolName = 'Angle';
441
+ exports.default = AngleTool;
442
+ //# sourceMappingURL=AngleTool.js.map