@cornerstonejs/tools 1.34.0 → 1.35.0

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 (284) hide show
  1. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDown.js +4 -4
  2. package/dist/cjs/eventDispatchers/mouseEventHandlers/mouseDown.js.map +1 -1
  3. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js +3 -2
  4. package/dist/cjs/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -1
  5. package/dist/cjs/index.d.ts +2 -2
  6. package/dist/cjs/index.js +3 -2
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/tools/AdvancedMagnifyTool.d.ts +4 -0
  9. package/dist/cjs/tools/AdvancedMagnifyTool.js +8 -3
  10. package/dist/cjs/tools/AdvancedMagnifyTool.js.map +1 -1
  11. package/dist/cjs/tools/annotation/SplineROITool.d.ts +59 -0
  12. package/dist/cjs/tools/annotation/SplineROITool.js +709 -0
  13. package/dist/cjs/tools/annotation/SplineROITool.js.map +1 -0
  14. package/dist/cjs/tools/annotation/splines/BSpline.d.ts +5 -0
  15. package/dist/cjs/tools/annotation/splines/BSpline.js +14 -0
  16. package/dist/cjs/tools/annotation/splines/BSpline.js.map +1 -0
  17. package/dist/cjs/tools/annotation/splines/CardinalSpline.d.ts +12 -0
  18. package/dist/cjs/tools/annotation/splines/CardinalSpline.js +38 -0
  19. package/dist/cjs/tools/annotation/splines/CardinalSpline.js.map +1 -0
  20. package/dist/cjs/tools/annotation/splines/CatmullRomSpline.d.ts +5 -0
  21. package/dist/cjs/tools/annotation/splines/CatmullRomSpline.js +12 -0
  22. package/dist/cjs/tools/annotation/splines/CatmullRomSpline.js.map +1 -0
  23. package/dist/cjs/tools/annotation/splines/CubicSpline.d.ts +13 -0
  24. package/dist/cjs/tools/annotation/splines/CubicSpline.js +192 -0
  25. package/dist/cjs/tools/annotation/splines/CubicSpline.js.map +1 -0
  26. package/dist/cjs/tools/annotation/splines/LinearSpline.d.ts +5 -0
  27. package/dist/cjs/tools/annotation/splines/LinearSpline.js +12 -0
  28. package/dist/cjs/tools/annotation/splines/LinearSpline.js.map +1 -0
  29. package/dist/cjs/tools/annotation/splines/QuadraticBezier.d.ts +6 -0
  30. package/dist/cjs/tools/annotation/splines/QuadraticBezier.js +20 -0
  31. package/dist/cjs/tools/annotation/splines/QuadraticBezier.js.map +1 -0
  32. package/dist/cjs/tools/annotation/splines/QuadraticSpline.d.ts +9 -0
  33. package/dist/cjs/tools/annotation/splines/QuadraticSpline.js +18 -0
  34. package/dist/cjs/tools/annotation/splines/QuadraticSpline.js.map +1 -0
  35. package/dist/cjs/tools/annotation/splines/Spline.d.ts +49 -0
  36. package/dist/cjs/tools/annotation/splines/Spline.js +420 -0
  37. package/dist/cjs/tools/annotation/splines/Spline.js.map +1 -0
  38. package/dist/cjs/tools/index.d.ts +2 -1
  39. package/dist/cjs/tools/index.js +3 -1
  40. package/dist/cjs/tools/index.js.map +1 -1
  41. package/dist/cjs/types/CardinalSplineProps.d.ts +5 -0
  42. package/dist/cjs/types/CardinalSplineProps.js +3 -0
  43. package/dist/cjs/types/CardinalSplineProps.js.map +1 -0
  44. package/dist/cjs/types/ClosestControlPoint.d.ts +4 -0
  45. package/dist/cjs/types/ClosestControlPoint.js +3 -0
  46. package/dist/cjs/types/ClosestControlPoint.js.map +1 -0
  47. package/dist/cjs/types/ClosestPoint.d.ts +5 -0
  48. package/dist/cjs/types/ClosestPoint.js +3 -0
  49. package/dist/cjs/types/ClosestPoint.js.map +1 -0
  50. package/dist/cjs/types/ClosestSplinePoint.d.ts +4 -0
  51. package/dist/cjs/types/ClosestSplinePoint.js +3 -0
  52. package/dist/cjs/types/ClosestSplinePoint.js.map +1 -0
  53. package/dist/cjs/types/ControlPointInfo.d.ts +5 -0
  54. package/dist/cjs/types/ControlPointInfo.js +3 -0
  55. package/dist/cjs/types/ControlPointInfo.js.map +1 -0
  56. package/dist/cjs/types/ISpline.d.ts +29 -0
  57. package/dist/cjs/types/ISpline.js +3 -0
  58. package/dist/cjs/types/ISpline.js.map +1 -0
  59. package/dist/cjs/types/SplineCurveSegment.d.ts +14 -0
  60. package/dist/cjs/types/SplineCurveSegment.js +3 -0
  61. package/dist/cjs/types/SplineCurveSegment.js.map +1 -0
  62. package/dist/cjs/types/SplineLineSegment.d.ts +10 -0
  63. package/dist/cjs/types/SplineLineSegment.js +3 -0
  64. package/dist/cjs/types/SplineLineSegment.js.map +1 -0
  65. package/dist/cjs/types/SplineProps.d.ts +4 -0
  66. package/dist/cjs/types/SplineProps.js +3 -0
  67. package/dist/cjs/types/SplineProps.js.map +1 -0
  68. package/dist/cjs/types/ToolSpecificAnnotationTypes.d.ts +34 -0
  69. package/dist/cjs/types/index.d.ts +10 -1
  70. package/dist/cjs/utilities/index.d.ts +2 -3
  71. package/dist/cjs/utilities/index.js +5 -5
  72. package/dist/cjs/utilities/index.js.map +1 -1
  73. package/dist/cjs/utilities/math/aabb/distanceToPoint.d.ts +2 -0
  74. package/dist/cjs/utilities/math/aabb/distanceToPoint.js +11 -0
  75. package/dist/cjs/utilities/math/aabb/distanceToPoint.js.map +1 -0
  76. package/dist/cjs/utilities/math/aabb/distanceToPointSquared.d.ts +2 -0
  77. package/dist/cjs/utilities/math/aabb/distanceToPointSquared.js +24 -0
  78. package/dist/cjs/utilities/math/aabb/distanceToPointSquared.js.map +1 -0
  79. package/dist/cjs/utilities/math/aabb/index.d.ts +2 -0
  80. package/dist/cjs/utilities/math/aabb/index.js +11 -0
  81. package/dist/cjs/utilities/math/aabb/index.js.map +1 -0
  82. package/dist/cjs/utilities/math/index.d.ts +6 -5
  83. package/dist/cjs/utilities/math/index.js +11 -9
  84. package/dist/cjs/utilities/math/index.js.map +1 -1
  85. package/dist/cjs/utilities/math/line/distanceToPointSquared.js +5 -21
  86. package/dist/cjs/utilities/math/line/distanceToPointSquared.js.map +1 -1
  87. package/dist/cjs/utilities/math/line/distanceToPointSquaredInfo.d.ts +5 -0
  88. package/dist/cjs/utilities/math/line/distanceToPointSquaredInfo.js +56 -0
  89. package/dist/cjs/utilities/math/line/distanceToPointSquaredInfo.js.map +1 -0
  90. package/dist/cjs/utilities/math/line/index.d.ts +2 -1
  91. package/dist/cjs/utilities/math/line/index.js +3 -1
  92. package/dist/cjs/utilities/math/line/index.js.map +1 -1
  93. package/dist/cjs/utilities/math/point/distanceToPoint.js +5 -6
  94. package/dist/cjs/utilities/math/point/distanceToPoint.js.map +1 -1
  95. package/dist/cjs/utilities/math/point/distanceToPointSquared.d.ts +4 -0
  96. package/dist/cjs/utilities/math/point/distanceToPointSquared.js +12 -0
  97. package/dist/cjs/utilities/math/point/distanceToPointSquared.js.map +1 -0
  98. package/dist/cjs/utilities/math/point/index.d.ts +3 -2
  99. package/dist/cjs/utilities/math/point/index.js +7 -3
  100. package/dist/cjs/utilities/math/point/index.js.map +1 -1
  101. package/dist/cjs/utilities/math/point/mirror.d.ts +2 -0
  102. package/dist/cjs/utilities/math/point/mirror.js +11 -0
  103. package/dist/cjs/utilities/math/point/mirror.js.map +1 -0
  104. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDown.js +4 -4
  105. package/dist/esm/eventDispatchers/mouseEventHandlers/mouseDown.js.map +1 -1
  106. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js +2 -1
  107. package/dist/esm/eventDispatchers/shared/getToolsWithActionsForMouseEvent.js.map +1 -1
  108. package/dist/esm/index.js +2 -2
  109. package/dist/esm/index.js.map +1 -1
  110. package/dist/esm/tools/AdvancedMagnifyTool.js +8 -3
  111. package/dist/esm/tools/AdvancedMagnifyTool.js.map +1 -1
  112. package/dist/esm/tools/annotation/SplineROITool.js +703 -0
  113. package/dist/esm/tools/annotation/SplineROITool.js.map +1 -0
  114. package/dist/esm/tools/annotation/splines/BSpline.js +10 -0
  115. package/dist/esm/tools/annotation/splines/BSpline.js.map +1 -0
  116. package/dist/esm/tools/annotation/splines/CardinalSpline.js +33 -0
  117. package/dist/esm/tools/annotation/splines/CardinalSpline.js.map +1 -0
  118. package/dist/esm/tools/annotation/splines/CatmullRomSpline.js +8 -0
  119. package/dist/esm/tools/annotation/splines/CatmullRomSpline.js.map +1 -0
  120. package/dist/esm/tools/annotation/splines/CubicSpline.js +165 -0
  121. package/dist/esm/tools/annotation/splines/CubicSpline.js.map +1 -0
  122. package/dist/esm/tools/annotation/splines/LinearSpline.js +8 -0
  123. package/dist/esm/tools/annotation/splines/LinearSpline.js.map +1 -0
  124. package/dist/esm/tools/annotation/splines/QuadraticBezier.js +16 -0
  125. package/dist/esm/tools/annotation/splines/QuadraticBezier.js.map +1 -0
  126. package/dist/esm/tools/annotation/splines/QuadraticSpline.js +14 -0
  127. package/dist/esm/tools/annotation/splines/QuadraticSpline.js.map +1 -0
  128. package/dist/esm/tools/annotation/splines/Spline.js +392 -0
  129. package/dist/esm/tools/annotation/splines/Spline.js.map +1 -0
  130. package/dist/esm/tools/index.js +2 -1
  131. package/dist/esm/tools/index.js.map +1 -1
  132. package/dist/esm/types/CardinalSplineProps.js +2 -0
  133. package/dist/esm/types/CardinalSplineProps.js.map +1 -0
  134. package/dist/esm/types/ClosestControlPoint.js +2 -0
  135. package/dist/esm/types/ClosestControlPoint.js.map +1 -0
  136. package/dist/esm/types/ClosestPoint.js +2 -0
  137. package/dist/esm/types/ClosestPoint.js.map +1 -0
  138. package/dist/esm/types/ClosestSplinePoint.js +2 -0
  139. package/dist/esm/types/ClosestSplinePoint.js.map +1 -0
  140. package/dist/esm/types/ControlPointInfo.js +2 -0
  141. package/dist/esm/types/ControlPointInfo.js.map +1 -0
  142. package/dist/esm/types/ISpline.js +2 -0
  143. package/dist/esm/types/ISpline.js.map +1 -0
  144. package/dist/esm/types/SplineCurveSegment.js +2 -0
  145. package/dist/esm/types/SplineCurveSegment.js.map +1 -0
  146. package/dist/esm/types/SplineLineSegment.js +2 -0
  147. package/dist/esm/types/SplineLineSegment.js.map +1 -0
  148. package/dist/esm/types/SplineProps.js +2 -0
  149. package/dist/esm/types/SplineProps.js.map +1 -0
  150. package/dist/esm/utilities/index.js +2 -3
  151. package/dist/esm/utilities/index.js.map +1 -1
  152. package/dist/esm/utilities/math/aabb/distanceToPoint.js +5 -0
  153. package/dist/esm/utilities/math/aabb/distanceToPoint.js.map +1 -0
  154. package/dist/esm/utilities/math/aabb/distanceToPointSquared.js +21 -0
  155. package/dist/esm/utilities/math/aabb/distanceToPointSquared.js.map +1 -0
  156. package/dist/esm/utilities/math/aabb/index.js +3 -0
  157. package/dist/esm/utilities/math/aabb/index.js.map +1 -0
  158. package/dist/esm/utilities/math/index.js +6 -5
  159. package/dist/esm/utilities/math/index.js.map +1 -1
  160. package/dist/esm/utilities/math/line/distanceToPointSquared.js +2 -21
  161. package/dist/esm/utilities/math/line/distanceToPointSquared.js.map +1 -1
  162. package/dist/esm/utilities/math/line/distanceToPointSquaredInfo.js +30 -0
  163. package/dist/esm/utilities/math/line/distanceToPointSquaredInfo.js.map +1 -0
  164. package/dist/esm/utilities/math/line/index.js +2 -1
  165. package/dist/esm/utilities/math/line/index.js.map +1 -1
  166. package/dist/esm/utilities/math/point/distanceToPoint.js +2 -6
  167. package/dist/esm/utilities/math/point/distanceToPoint.js.map +1 -1
  168. package/dist/esm/utilities/math/point/distanceToPointSquared.js +9 -0
  169. package/dist/esm/utilities/math/point/distanceToPointSquared.js.map +1 -0
  170. package/dist/esm/utilities/math/point/index.js +3 -2
  171. package/dist/esm/utilities/math/point/index.js.map +1 -1
  172. package/dist/esm/utilities/math/point/mirror.js +8 -0
  173. package/dist/esm/utilities/math/point/mirror.js.map +1 -0
  174. package/dist/types/eventDispatchers/mouseEventHandlers/mouseDown.d.ts.map +1 -1
  175. package/dist/types/eventDispatchers/shared/getToolsWithActionsForMouseEvent.d.ts.map +1 -1
  176. package/dist/types/index.d.ts +2 -2
  177. package/dist/types/index.d.ts.map +1 -1
  178. package/dist/types/tools/AdvancedMagnifyTool.d.ts +4 -0
  179. package/dist/types/tools/AdvancedMagnifyTool.d.ts.map +1 -1
  180. package/dist/types/tools/annotation/SplineROITool.d.ts +60 -0
  181. package/dist/types/tools/annotation/SplineROITool.d.ts.map +1 -0
  182. package/dist/types/tools/annotation/splines/BSpline.d.ts +6 -0
  183. package/dist/types/tools/annotation/splines/BSpline.d.ts.map +1 -0
  184. package/dist/types/tools/annotation/splines/CardinalSpline.d.ts +13 -0
  185. package/dist/types/tools/annotation/splines/CardinalSpline.d.ts.map +1 -0
  186. package/dist/types/tools/annotation/splines/CatmullRomSpline.d.ts +6 -0
  187. package/dist/types/tools/annotation/splines/CatmullRomSpline.d.ts.map +1 -0
  188. package/dist/types/tools/annotation/splines/CubicSpline.d.ts +14 -0
  189. package/dist/types/tools/annotation/splines/CubicSpline.d.ts.map +1 -0
  190. package/dist/types/tools/annotation/splines/LinearSpline.d.ts +6 -0
  191. package/dist/types/tools/annotation/splines/LinearSpline.d.ts.map +1 -0
  192. package/dist/types/tools/annotation/splines/QuadraticBezier.d.ts +7 -0
  193. package/dist/types/tools/annotation/splines/QuadraticBezier.d.ts.map +1 -0
  194. package/dist/types/tools/annotation/splines/QuadraticSpline.d.ts +10 -0
  195. package/dist/types/tools/annotation/splines/QuadraticSpline.d.ts.map +1 -0
  196. package/dist/types/tools/annotation/splines/Spline.d.ts +50 -0
  197. package/dist/types/tools/annotation/splines/Spline.d.ts.map +1 -0
  198. package/dist/types/tools/index.d.ts +2 -1
  199. package/dist/types/tools/index.d.ts.map +1 -1
  200. package/dist/types/types/CardinalSplineProps.d.ts +6 -0
  201. package/dist/types/types/CardinalSplineProps.d.ts.map +1 -0
  202. package/dist/types/types/ClosestControlPoint.d.ts +5 -0
  203. package/dist/types/types/ClosestControlPoint.d.ts.map +1 -0
  204. package/dist/types/types/ClosestPoint.d.ts +6 -0
  205. package/dist/types/types/ClosestPoint.d.ts.map +1 -0
  206. package/dist/types/types/ClosestSplinePoint.d.ts +5 -0
  207. package/dist/types/types/ClosestSplinePoint.d.ts.map +1 -0
  208. package/dist/types/types/ControlPointInfo.d.ts +6 -0
  209. package/dist/types/types/ControlPointInfo.d.ts.map +1 -0
  210. package/dist/types/types/ISpline.d.ts +30 -0
  211. package/dist/types/types/ISpline.d.ts.map +1 -0
  212. package/dist/types/types/SplineCurveSegment.d.ts +15 -0
  213. package/dist/types/types/SplineCurveSegment.d.ts.map +1 -0
  214. package/dist/types/types/SplineLineSegment.d.ts +11 -0
  215. package/dist/types/types/SplineLineSegment.d.ts.map +1 -0
  216. package/dist/types/types/SplineProps.d.ts +5 -0
  217. package/dist/types/types/SplineProps.d.ts.map +1 -0
  218. package/dist/types/types/ToolSpecificAnnotationTypes.d.ts +34 -0
  219. package/dist/types/types/ToolSpecificAnnotationTypes.d.ts.map +1 -1
  220. package/dist/types/types/index.d.ts +10 -1
  221. package/dist/types/types/index.d.ts.map +1 -1
  222. package/dist/types/utilities/index.d.ts +2 -3
  223. package/dist/types/utilities/index.d.ts.map +1 -1
  224. package/dist/types/utilities/math/aabb/distanceToPoint.d.ts +3 -0
  225. package/dist/types/utilities/math/aabb/distanceToPoint.d.ts.map +1 -0
  226. package/dist/types/utilities/math/aabb/distanceToPointSquared.d.ts +3 -0
  227. package/dist/types/utilities/math/aabb/distanceToPointSquared.d.ts.map +1 -0
  228. package/dist/types/utilities/math/aabb/index.d.ts +3 -0
  229. package/dist/types/utilities/math/aabb/index.d.ts.map +1 -0
  230. package/dist/types/utilities/math/index.d.ts +6 -5
  231. package/dist/types/utilities/math/index.d.ts.map +1 -1
  232. package/dist/types/utilities/math/line/distanceToPointSquared.d.ts.map +1 -1
  233. package/dist/types/utilities/math/line/distanceToPointSquaredInfo.d.ts +6 -0
  234. package/dist/types/utilities/math/line/distanceToPointSquaredInfo.d.ts.map +1 -0
  235. package/dist/types/utilities/math/line/index.d.ts +2 -1
  236. package/dist/types/utilities/math/line/index.d.ts.map +1 -1
  237. package/dist/types/utilities/math/point/distanceToPoint.d.ts.map +1 -1
  238. package/dist/types/utilities/math/point/distanceToPointSquared.d.ts +5 -0
  239. package/dist/types/utilities/math/point/distanceToPointSquared.d.ts.map +1 -0
  240. package/dist/types/utilities/math/point/index.d.ts +3 -2
  241. package/dist/types/utilities/math/point/index.d.ts.map +1 -1
  242. package/dist/types/utilities/math/point/mirror.d.ts +3 -0
  243. package/dist/types/utilities/math/point/mirror.d.ts.map +1 -0
  244. package/dist/umd/index.js +2 -1
  245. package/dist/umd/index.js.LICENSE.txt +6 -0
  246. package/dist/umd/index.js.map +1 -1
  247. package/package.json +3 -3
  248. package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +8 -6
  249. package/src/eventDispatchers/shared/getToolsWithActionsForMouseEvent.ts +3 -2
  250. package/src/index.ts +2 -0
  251. package/src/tools/AdvancedMagnifyTool.ts +8 -3
  252. package/src/tools/annotation/SplineROITool.ts +1151 -0
  253. package/src/tools/annotation/splines/BSpline.ts +22 -0
  254. package/src/tools/annotation/splines/CardinalSpline.ts +45 -0
  255. package/src/tools/annotation/splines/CatmullRomSpline.ts +19 -0
  256. package/src/tools/annotation/splines/CubicSpline.ts +288 -0
  257. package/src/tools/annotation/splines/LinearSpline.ts +20 -0
  258. package/src/tools/annotation/splines/QuadraticBezier.ts +20 -0
  259. package/src/tools/annotation/splines/QuadraticSpline.ts +25 -0
  260. package/src/tools/annotation/splines/Spline.ts +729 -0
  261. package/src/tools/index.ts +2 -0
  262. package/src/types/CardinalSplineProps.ts +11 -0
  263. package/src/types/ClosestControlPoint.ts +6 -0
  264. package/src/types/ClosestPoint.ts +8 -0
  265. package/src/types/ClosestSplinePoint.ts +6 -0
  266. package/src/types/ControlPointInfo.ts +8 -0
  267. package/src/types/ISpline.ts +164 -0
  268. package/src/types/SplineCurveSegment.ts +28 -0
  269. package/src/types/SplineLineSegment.ts +20 -0
  270. package/src/types/SplineProps.ts +15 -0
  271. package/src/types/ToolSpecificAnnotationTypes.ts +35 -0
  272. package/src/types/index.ts +21 -0
  273. package/src/utilities/index.ts +6 -2
  274. package/src/utilities/math/aabb/distanceToPoint.ts +20 -0
  275. package/src/utilities/math/aabb/distanceToPointSquared.ts +47 -0
  276. package/src/utilities/math/aabb/index.ts +2 -0
  277. package/src/utilities/math/index.ts +10 -8
  278. package/src/utilities/math/line/distanceToPointSquared.ts +3 -29
  279. package/src/utilities/math/line/distanceToPointSquaredInfo.ts +54 -0
  280. package/src/utilities/math/line/index.ts +7 -1
  281. package/src/utilities/math/point/distanceToPoint.ts +2 -10
  282. package/src/utilities/math/point/distanceToPointSquared.ts +21 -0
  283. package/src/utilities/math/point/index.ts +3 -3
  284. package/src/utilities/math/point/mirror.ts +21 -0
@@ -0,0 +1,709 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_1 = require("../base");
4
+ const core_1 = require("@cornerstonejs/core");
5
+ const gl_matrix_1 = require("gl-matrix");
6
+ const annotationState_1 = require("../../stateManagement/annotation/annotationState");
7
+ const annotationLocking_1 = require("../../stateManagement/annotation/annotationLocking");
8
+ const annotationVisibility_1 = require("../../stateManagement/annotation/annotationVisibility");
9
+ const drawingSvg_1 = require("../../drawingSvg");
10
+ const store_1 = require("../../store");
11
+ const enums_1 = require("../../enums");
12
+ const elementCursor_1 = require("../../cursors/elementCursor");
13
+ const utilities_1 = require("../../utilities");
14
+ const CardinalSpline_1 = require("./splines/CardinalSpline");
15
+ const LinearSpline_1 = require("./splines/LinearSpline");
16
+ const CatmullRomSpline_1 = require("./splines/CatmullRomSpline");
17
+ const BSpline_1 = require("./splines/BSpline");
18
+ const { getViewportIdsWithToolToRender } = utilities_1.viewportFilters;
19
+ const { getTextBoxCoordsCanvas } = utilities_1.drawing;
20
+ const SPLINE_MIN_POINTS = 3;
21
+ const SPLINE_CLICK_CLOSE_CURVE_DIST = 10;
22
+ const DEFAULT_SPLINE_CONFIG = {
23
+ resolution: 20,
24
+ controlPointAdditionDistance: 6,
25
+ controlPointDeletionDistance: 6,
26
+ showControlPointsConnectors: false,
27
+ controlPointAdditionEnabled: true,
28
+ controlPointDeletionEnabled: true,
29
+ };
30
+ var SplineTypesEnum;
31
+ (function (SplineTypesEnum) {
32
+ SplineTypesEnum["Cardinal"] = "CARDINAL";
33
+ SplineTypesEnum["Linear"] = "LINEAR";
34
+ SplineTypesEnum["CatmullRom"] = "CATMULLROM";
35
+ SplineTypesEnum["BSpline"] = "BSPLINE";
36
+ })(SplineTypesEnum || (SplineTypesEnum = {}));
37
+ var SplineToolActions;
38
+ (function (SplineToolActions) {
39
+ SplineToolActions["AddControlPoint"] = "addControlPoint";
40
+ SplineToolActions["DeleteControlPoint"] = "deleteControlPoint";
41
+ })(SplineToolActions || (SplineToolActions = {}));
42
+ class SplineROITool extends base_1.AnnotationTool {
43
+ constructor(toolProps = {}, defaultToolProps = {
44
+ supportedInteractionTypes: ['Mouse', 'Touch'],
45
+ configuration: {
46
+ preventHandleOutsideImage: false,
47
+ calculateStats: true,
48
+ getTextLines: defaultGetTextLines,
49
+ spline: {
50
+ configuration: {
51
+ [SplineTypesEnum.Cardinal]: {
52
+ Class: CardinalSpline_1.CardinalSpline,
53
+ scale: 0.5,
54
+ },
55
+ [SplineTypesEnum.CatmullRom]: {
56
+ Class: CatmullRomSpline_1.CatmullRomSpline,
57
+ },
58
+ [SplineTypesEnum.Linear]: {
59
+ Class: LinearSpline_1.LinearSpline,
60
+ },
61
+ [SplineTypesEnum.BSpline]: {
62
+ Class: BSpline_1.BSpline,
63
+ controlPointAdditionEnabled: false,
64
+ controlPointDeletionEnabled: false,
65
+ showControlPointsConnectors: true,
66
+ },
67
+ },
68
+ type: SplineTypesEnum.CatmullRom,
69
+ drawPreviewEnabled: true,
70
+ lastControlPointDeletionKeys: ['Backspace', 'Delete'],
71
+ },
72
+ actions: {
73
+ [SplineToolActions.AddControlPoint]: {
74
+ method: 'addControlPointCallback',
75
+ bindings: [
76
+ {
77
+ mouseButton: enums_1.MouseBindings.Primary,
78
+ modifierKey: enums_1.KeyboardBindings.Shift,
79
+ },
80
+ ],
81
+ },
82
+ [SplineToolActions.DeleteControlPoint]: {
83
+ method: 'deleteControlPointCallback',
84
+ bindings: [
85
+ {
86
+ mouseButton: enums_1.MouseBindings.Primary,
87
+ modifierKey: enums_1.KeyboardBindings.Ctrl,
88
+ },
89
+ ],
90
+ },
91
+ },
92
+ },
93
+ }) {
94
+ super(toolProps, defaultToolProps);
95
+ this.isHandleOutsideImage = false;
96
+ this.addNewAnnotation = (evt) => {
97
+ const eventDetail = evt.detail;
98
+ const { currentPoints, element } = eventDetail;
99
+ const { world: worldPos, canvas: canvasPos } = currentPoints;
100
+ const enabledElement = (0, core_1.getEnabledElement)(element);
101
+ const { viewport, renderingEngine } = enabledElement;
102
+ this.isDrawing = true;
103
+ const camera = viewport.getCamera();
104
+ const { viewPlaneNormal, viewUp } = camera;
105
+ const { type: splineType } = this.configuration.spline;
106
+ const splineConfig = this._getSplineConfig(splineType);
107
+ const spline = new splineConfig.Class();
108
+ const referencedImageId = this.getReferencedImageId(viewport, worldPos, viewPlaneNormal, viewUp);
109
+ const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
110
+ const annotation = {
111
+ highlighted: true,
112
+ invalidated: true,
113
+ metadata: {
114
+ toolName: this.getToolName(),
115
+ viewPlaneNormal: [...viewPlaneNormal],
116
+ viewUp: [...viewUp],
117
+ FrameOfReferenceUID,
118
+ referencedImageId,
119
+ },
120
+ data: {
121
+ handles: {
122
+ textBox: {
123
+ hasMoved: false,
124
+ worldPosition: [0, 0, 0],
125
+ worldBoundingBox: {
126
+ topLeft: [0, 0, 0],
127
+ topRight: [0, 0, 0],
128
+ bottomLeft: [0, 0, 0],
129
+ bottomRight: [0, 0, 0],
130
+ },
131
+ },
132
+ points: [[...worldPos]],
133
+ activeHandleIndex: null,
134
+ },
135
+ spline: {
136
+ type: splineConfig.type,
137
+ instance: spline,
138
+ resolution: splineConfig.resolution,
139
+ closed: false,
140
+ polyline: [],
141
+ },
142
+ cachedStats: {},
143
+ },
144
+ };
145
+ (0, annotationState_1.addAnnotation)(annotation, element);
146
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
147
+ this.editData = {
148
+ annotation,
149
+ viewportIdsToRender,
150
+ movingTextBox: false,
151
+ newAnnotation: true,
152
+ hasMoved: false,
153
+ lastCanvasPoint: canvasPos,
154
+ };
155
+ this._activateDraw(element);
156
+ evt.preventDefault();
157
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
158
+ return annotation;
159
+ };
160
+ this.isPointNearTool = (element, annotation, canvasCoords, proximity) => {
161
+ const { instance: spline } = annotation.data.spline;
162
+ return spline.isPointNearCurve(canvasCoords, proximity);
163
+ };
164
+ this.toolSelectedCallback = (evt, annotation) => {
165
+ const eventDetail = evt.detail;
166
+ const { element } = eventDetail;
167
+ annotation.highlighted = true;
168
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
169
+ this.editData = {
170
+ annotation,
171
+ viewportIdsToRender,
172
+ movingTextBox: false,
173
+ };
174
+ const enabledElement = (0, core_1.getEnabledElement)(element);
175
+ const { renderingEngine } = enabledElement;
176
+ this._activateModify(element);
177
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
178
+ evt.preventDefault();
179
+ };
180
+ this.handleSelectedCallback = (evt, annotation, handle) => {
181
+ const eventDetail = evt.detail;
182
+ const { element } = eventDetail;
183
+ const { data } = annotation;
184
+ annotation.highlighted = true;
185
+ let movingTextBox = false;
186
+ let handleIndex;
187
+ if (handle.worldPosition) {
188
+ movingTextBox = true;
189
+ }
190
+ else {
191
+ const { points } = data.handles;
192
+ handleIndex = points.findIndex((p) => p === handle);
193
+ }
194
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
195
+ this.editData = {
196
+ annotation,
197
+ viewportIdsToRender,
198
+ handleIndex,
199
+ movingTextBox,
200
+ };
201
+ this._activateModify(element);
202
+ const enabledElement = (0, core_1.getEnabledElement)(element);
203
+ const { renderingEngine } = enabledElement;
204
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
205
+ evt.preventDefault();
206
+ };
207
+ this._endCallback = (evt) => {
208
+ const eventDetail = evt.detail;
209
+ const { element } = eventDetail;
210
+ const { annotation, viewportIdsToRender, newAnnotation } = this.editData;
211
+ const { data } = annotation;
212
+ data.handles.activeHandleIndex = null;
213
+ this._deactivateModify(element);
214
+ this._deactivateDraw(element);
215
+ (0, elementCursor_1.resetElementCursor)(element);
216
+ const enabledElement = (0, core_1.getEnabledElement)(element);
217
+ const { renderingEngine } = enabledElement;
218
+ if (this.isHandleOutsideImage &&
219
+ this.configuration.preventHandleOutsideImage) {
220
+ (0, annotationState_1.removeAnnotation)(annotation.annotationUID);
221
+ }
222
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
223
+ if (newAnnotation) {
224
+ const eventType = enums_1.Events.ANNOTATION_COMPLETED;
225
+ const eventDetail = {
226
+ annotation,
227
+ };
228
+ (0, core_1.triggerEvent)(core_1.eventTarget, eventType, eventDetail);
229
+ }
230
+ this.editData = null;
231
+ this.isDrawing = false;
232
+ };
233
+ this._keyDownCallback = (evt) => {
234
+ var _a;
235
+ const eventDetail = evt.detail;
236
+ const { element } = eventDetail;
237
+ const key = (_a = eventDetail.key) !== null && _a !== void 0 ? _a : '';
238
+ const { lastControlPointDeletionKeys } = this.configuration.spline;
239
+ const deleteLastPoint = lastControlPointDeletionKeys.includes(key);
240
+ if (!deleteLastPoint) {
241
+ return;
242
+ }
243
+ const { annotation } = this.editData;
244
+ const { data } = annotation;
245
+ if (data.handles.points.length === SPLINE_MIN_POINTS) {
246
+ this.cancel(element);
247
+ return;
248
+ }
249
+ else {
250
+ const controlPointIndex = data.handles.points.length - 1;
251
+ this._deleteControlPointByIndex(element, annotation, controlPointIndex);
252
+ }
253
+ evt.preventDefault();
254
+ };
255
+ this._mouseMoveCallback = (evt) => {
256
+ const { drawPreviewEnabled } = this.configuration.spline;
257
+ if (!drawPreviewEnabled) {
258
+ return;
259
+ }
260
+ const { element } = evt.detail;
261
+ const { renderingEngine } = (0, core_1.getEnabledElement)(element);
262
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
263
+ this.editData.lastCanvasPoint = evt.detail.currentPoints.canvas;
264
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
265
+ evt.preventDefault();
266
+ };
267
+ this._mouseDownCallback = (evt) => {
268
+ const doubleClick = evt.type === enums_1.Events.MOUSE_DOUBLE_CLICK;
269
+ const { annotation, viewportIdsToRender } = this.editData;
270
+ const { data } = annotation;
271
+ if (data.spline.closed) {
272
+ return;
273
+ }
274
+ const eventDetail = evt.detail;
275
+ const { element } = eventDetail;
276
+ const { currentPoints } = eventDetail;
277
+ const { canvas: canvasPoint, world: worldPoint } = currentPoints;
278
+ const enabledElement = (0, core_1.getEnabledElement)(element);
279
+ const { renderingEngine } = enabledElement;
280
+ let closeSpline = data.handles.points.length >= 2 && doubleClick;
281
+ let addNewPoint = true;
282
+ if (data.handles.points.length >= 3) {
283
+ const { instance: spline } = data.spline;
284
+ const closestControlPoint = spline.getClosestControlPointWithinDistance(canvasPoint, SPLINE_CLICK_CLOSE_CURVE_DIST);
285
+ if ((closestControlPoint === null || closestControlPoint === void 0 ? void 0 : closestControlPoint.index) === 0) {
286
+ addNewPoint = false;
287
+ closeSpline = true;
288
+ }
289
+ }
290
+ if (addNewPoint) {
291
+ data.handles.points.push(worldPoint);
292
+ }
293
+ data.spline.closed = data.spline.closed || closeSpline;
294
+ annotation.invalidated = true;
295
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
296
+ if (data.spline.closed) {
297
+ this._endCallback(evt);
298
+ }
299
+ evt.preventDefault();
300
+ };
301
+ this._dragCallback = (evt) => {
302
+ this.isDrawing = true;
303
+ const eventDetail = evt.detail;
304
+ const { element } = eventDetail;
305
+ const { annotation, viewportIdsToRender, handleIndex, movingTextBox } = this.editData;
306
+ const { data } = annotation;
307
+ if (movingTextBox) {
308
+ const { deltaPoints } = eventDetail;
309
+ const worldPosDelta = deltaPoints.world;
310
+ const { textBox } = data.handles;
311
+ const { worldPosition } = textBox;
312
+ worldPosition[0] += worldPosDelta[0];
313
+ worldPosition[1] += worldPosDelta[1];
314
+ worldPosition[2] += worldPosDelta[2];
315
+ textBox.hasMoved = true;
316
+ }
317
+ else if (handleIndex === undefined) {
318
+ const { deltaPoints } = eventDetail;
319
+ const worldPosDelta = deltaPoints.world;
320
+ const points = data.handles.points;
321
+ points.forEach((point) => {
322
+ point[0] += worldPosDelta[0];
323
+ point[1] += worldPosDelta[1];
324
+ point[2] += worldPosDelta[2];
325
+ });
326
+ annotation.invalidated = true;
327
+ }
328
+ else {
329
+ const { currentPoints } = eventDetail;
330
+ const worldPos = currentPoints.world;
331
+ data.handles.points[handleIndex] = [...worldPos];
332
+ annotation.invalidated = true;
333
+ }
334
+ this.editData.hasMoved = true;
335
+ const enabledElement = (0, core_1.getEnabledElement)(element);
336
+ const { renderingEngine } = enabledElement;
337
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
338
+ };
339
+ this.cancel = (element) => {
340
+ if (!this.isDrawing) {
341
+ return;
342
+ }
343
+ this.isDrawing = false;
344
+ this._deactivateDraw(element);
345
+ this._deactivateModify(element);
346
+ (0, elementCursor_1.resetElementCursor)(element);
347
+ const { annotation, viewportIdsToRender, newAnnotation } = this.editData;
348
+ if (newAnnotation) {
349
+ (0, annotationState_1.removeAnnotation)(annotation.annotationUID);
350
+ }
351
+ const enabledElement = (0, core_1.getEnabledElement)(element);
352
+ const { renderingEngine } = enabledElement;
353
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
354
+ this.editData = null;
355
+ return annotation.annotationUID;
356
+ };
357
+ this.triggerAnnotationModified = (annotation, enabledElement) => {
358
+ const { viewportId, renderingEngineId } = enabledElement;
359
+ const eventType = enums_1.Events.ANNOTATION_MODIFIED;
360
+ const eventDetail = {
361
+ annotation,
362
+ viewportId,
363
+ renderingEngineId,
364
+ };
365
+ (0, core_1.triggerEvent)(core_1.eventTarget, eventType, eventDetail);
366
+ };
367
+ this._activateModify = (element) => {
368
+ store_1.state.isInteractingWithTool = true;
369
+ element.addEventListener(enums_1.Events.MOUSE_UP, this._endCallback);
370
+ element.addEventListener(enums_1.Events.MOUSE_DRAG, this._dragCallback);
371
+ element.addEventListener(enums_1.Events.MOUSE_CLICK, this._endCallback);
372
+ element.addEventListener(enums_1.Events.TOUCH_END, this._endCallback);
373
+ element.addEventListener(enums_1.Events.TOUCH_DRAG, this._dragCallback);
374
+ element.addEventListener(enums_1.Events.TOUCH_TAP, this._endCallback);
375
+ };
376
+ this._deactivateModify = (element) => {
377
+ store_1.state.isInteractingWithTool = false;
378
+ element.removeEventListener(enums_1.Events.MOUSE_UP, this._endCallback);
379
+ element.removeEventListener(enums_1.Events.MOUSE_DRAG, this._dragCallback);
380
+ element.removeEventListener(enums_1.Events.MOUSE_CLICK, this._endCallback);
381
+ element.removeEventListener(enums_1.Events.TOUCH_END, this._endCallback);
382
+ element.removeEventListener(enums_1.Events.TOUCH_DRAG, this._dragCallback);
383
+ element.removeEventListener(enums_1.Events.TOUCH_TAP, this._endCallback);
384
+ };
385
+ this._activateDraw = (element) => {
386
+ store_1.state.isInteractingWithTool = true;
387
+ element.addEventListener(enums_1.Events.KEY_DOWN, this._keyDownCallback);
388
+ element.addEventListener(enums_1.Events.MOUSE_MOVE, this._mouseMoveCallback);
389
+ element.addEventListener(enums_1.Events.MOUSE_DOWN, this._mouseDownCallback);
390
+ element.addEventListener(enums_1.Events.MOUSE_DOUBLE_CLICK, this._mouseDownCallback);
391
+ element.addEventListener(enums_1.Events.TOUCH_TAP, this._mouseDownCallback);
392
+ };
393
+ this._deactivateDraw = (element) => {
394
+ store_1.state.isInteractingWithTool = false;
395
+ element.removeEventListener(enums_1.Events.KEY_DOWN, this._keyDownCallback);
396
+ element.removeEventListener(enums_1.Events.MOUSE_MOVE, this._mouseMoveCallback);
397
+ element.removeEventListener(enums_1.Events.MOUSE_DOWN, this._mouseDownCallback);
398
+ element.removeEventListener(enums_1.Events.MOUSE_DOUBLE_CLICK, this._mouseDownCallback);
399
+ element.removeEventListener(enums_1.Events.TOUCH_TAP, this._mouseDownCallback);
400
+ };
401
+ this.renderAnnotation = (enabledElement, svgDrawingHelper) => {
402
+ var _a, _b;
403
+ let renderStatus = false;
404
+ const { viewport } = enabledElement;
405
+ const { worldToCanvas } = viewport;
406
+ const { element } = viewport;
407
+ if (!viewport.getRenderingEngine()) {
408
+ console.warn('Rendering Engine has been destroyed');
409
+ return renderStatus;
410
+ }
411
+ let annotations = (0, annotationState_1.getAnnotations)(this.getToolName(), element);
412
+ if (!(annotations === null || annotations === void 0 ? void 0 : annotations.length)) {
413
+ return renderStatus;
414
+ }
415
+ annotations = this.filterInteractableAnnotationsForElement(element, annotations);
416
+ if (!(annotations === null || annotations === void 0 ? void 0 : annotations.length)) {
417
+ return renderStatus;
418
+ }
419
+ const targetId = this.getTargetId(viewport);
420
+ const newAnnotation = (_a = this.editData) === null || _a === void 0 ? void 0 : _a.newAnnotation;
421
+ const styleSpecifier = {
422
+ toolGroupId: this.toolGroupId,
423
+ toolName: this.getToolName(),
424
+ viewportId: enabledElement.viewport.id,
425
+ };
426
+ for (let i = 0; i < annotations.length; i++) {
427
+ const annotation = annotations[i];
428
+ const { annotationUID, data, highlighted } = annotation;
429
+ const { handles } = data;
430
+ const { points: controlPoints, activeHandleIndex } = handles;
431
+ styleSpecifier.annotationUID = annotationUID;
432
+ const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
433
+ const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
434
+ const color = this.getStyle('color', styleSpecifier, annotation);
435
+ const canvasCoordinates = controlPoints.map((p) => worldToCanvas(p));
436
+ const { drawPreviewEnabled } = this.configuration.spline;
437
+ const splineType = annotation.data.spline.type;
438
+ const splineConfig = this._getSplineConfig(splineType);
439
+ const spline = this._updateSplineInstance(element, annotation);
440
+ const splinePolylineCanvas = spline.getPolylinePoints();
441
+ const splinePolylineWorld = [];
442
+ for (let i = 0, len = splinePolylineCanvas.length; i < len; i++) {
443
+ splinePolylineWorld.push(viewport.canvasToWorld(splinePolylineCanvas[i]));
444
+ }
445
+ data.spline.polyline = splinePolylineWorld;
446
+ if (!data.cachedStats[targetId] ||
447
+ data.cachedStats[targetId].areaUnit == null) {
448
+ data.cachedStats[targetId] = {
449
+ Modality: null,
450
+ area: null,
451
+ areaUnit: null,
452
+ };
453
+ this._calculateCachedStats(annotation, element);
454
+ }
455
+ else if (annotation.invalidated) {
456
+ this._throttledCalculateCachedStats(annotation, element);
457
+ }
458
+ let activeHandleCanvasCoords;
459
+ if (!(0, annotationVisibility_1.isAnnotationVisible)(annotationUID)) {
460
+ continue;
461
+ }
462
+ if (!(0, annotationLocking_1.isAnnotationLocked)(annotation) &&
463
+ !this.editData &&
464
+ activeHandleIndex !== null) {
465
+ activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
466
+ }
467
+ if (activeHandleCanvasCoords || newAnnotation || highlighted) {
468
+ const handleGroupUID = '0';
469
+ (0, drawingSvg_1.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {
470
+ color,
471
+ lineDash,
472
+ lineWidth,
473
+ handleRadius: '3',
474
+ });
475
+ }
476
+ if (drawPreviewEnabled &&
477
+ spline.numControlPoints > 1 &&
478
+ ((_b = this.editData) === null || _b === void 0 ? void 0 : _b.lastCanvasPoint) &&
479
+ !spline.closed) {
480
+ const { lastCanvasPoint } = this.editData;
481
+ const previewPolylinePoints = spline.getPreviewPolylinePoints(lastCanvasPoint, SPLINE_CLICK_CLOSE_CURVE_DIST);
482
+ (0, drawingSvg_1.drawPolyline)(svgDrawingHelper, annotationUID, 'previewSplineChange', previewPolylinePoints, {
483
+ color: '#9EA0CA',
484
+ lineDash,
485
+ lineWidth,
486
+ });
487
+ }
488
+ if (splineConfig.showControlPointsConnectors) {
489
+ const controlPointsConnectors = [...canvasCoordinates];
490
+ if (spline.closed) {
491
+ controlPointsConnectors.push(canvasCoordinates[0]);
492
+ }
493
+ (0, drawingSvg_1.drawPolyline)(svgDrawingHelper, annotationUID, 'controlPointsConnectors', controlPointsConnectors, {
494
+ color: 'rgba(255, 255, 255, 0.5)',
495
+ lineDash,
496
+ lineWidth,
497
+ });
498
+ }
499
+ (0, drawingSvg_1.drawPolyline)(svgDrawingHelper, annotationUID, 'lineSegments', splinePolylineCanvas, {
500
+ color,
501
+ lineDash,
502
+ lineWidth,
503
+ });
504
+ this._renderStats(annotation, viewport, enabledElement, svgDrawingHelper);
505
+ renderStatus = true;
506
+ annotation.invalidated = false;
507
+ }
508
+ return renderStatus;
509
+ };
510
+ this._renderStats = (annotation, viewport, enabledElement, svgDrawingHelper) => {
511
+ var _a;
512
+ const data = annotation.data;
513
+ const targetId = this.getTargetId(viewport);
514
+ if (!data.spline.closed) {
515
+ return;
516
+ }
517
+ const styleSpecifier = {
518
+ toolGroupId: this.toolGroupId,
519
+ toolName: this.getToolName(),
520
+ viewportId: enabledElement.viewport.id,
521
+ };
522
+ const options = this.getLinkedTextBoxStyle(styleSpecifier, annotation);
523
+ if (!options.visibility) {
524
+ return;
525
+ }
526
+ const textLines = this.configuration.getTextLines(data, targetId);
527
+ if (!textLines || textLines.length === 0) {
528
+ return;
529
+ }
530
+ const canvasCoordinates = data.handles.points.map((p) => viewport.worldToCanvas(p));
531
+ if (!data.handles.textBox.hasMoved) {
532
+ const canvasTextBoxCoords = getTextBoxCoordsCanvas(canvasCoordinates);
533
+ data.handles.textBox.worldPosition =
534
+ viewport.canvasToWorld(canvasTextBoxCoords);
535
+ }
536
+ const textBoxPosition = viewport.worldToCanvas(data.handles.textBox.worldPosition);
537
+ const textBoxUID = 'textBox';
538
+ const boundingBox = (0, drawingSvg_1.drawLinkedTextBox)(svgDrawingHelper, (_a = annotation.annotationUID) !== null && _a !== void 0 ? _a : '', textBoxUID, textLines, textBoxPosition, canvasCoordinates, {}, options);
539
+ const { x: left, y: top, width, height } = boundingBox;
540
+ data.handles.textBox.worldBoundingBox = {
541
+ topLeft: viewport.canvasToWorld([left, top]),
542
+ topRight: viewport.canvasToWorld([left + width, top]),
543
+ bottomLeft: viewport.canvasToWorld([left, top + height]),
544
+ bottomRight: viewport.canvasToWorld([left + width, top + height]),
545
+ };
546
+ };
547
+ this.addControlPointCallback = (evt, annotation) => {
548
+ const { data } = annotation;
549
+ const splineType = data.spline.type;
550
+ const splineConfig = this._getSplineConfig(splineType);
551
+ const maxDist = splineConfig.controlPointAdditionDistance;
552
+ if (splineConfig.controlPointAdditionEnabled === false) {
553
+ return;
554
+ }
555
+ const eventDetail = evt.detail;
556
+ const { element } = eventDetail;
557
+ const enabledElement = (0, core_1.getEnabledElement)(element);
558
+ const { renderingEngine, viewport } = enabledElement;
559
+ const { canvasToWorld } = viewport;
560
+ const { instance: spline } = data.spline;
561
+ const canvasPos = evt.detail.currentPoints.canvas;
562
+ const closestPointInfo = spline.getClosestPoint(canvasPos);
563
+ if (closestPointInfo.distance > maxDist) {
564
+ return;
565
+ }
566
+ const { index, point: canvasPoint } = spline.addControlPointAtU(closestPointInfo.uValue);
567
+ data.handles.points.splice(index, 0, canvasToWorld(canvasPoint));
568
+ annotation.invalidated = true;
569
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
570
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
571
+ };
572
+ this.deleteControlPointCallback = (evt, annotation) => {
573
+ const splineType = annotation.data.spline.type;
574
+ const splineConfig = this._getSplineConfig(splineType);
575
+ const maxDist = splineConfig.controlPointDeletionDistance;
576
+ if (splineConfig.controlPointDeletionEnabled === false) {
577
+ return;
578
+ }
579
+ const eventDetail = evt.detail;
580
+ const { element, currentPoints } = eventDetail;
581
+ const { canvas: canvasPos } = currentPoints;
582
+ const { instance: spline } = annotation.data.spline;
583
+ const closestControlPoint = spline.getClosestControlPointWithinDistance(canvasPos, maxDist);
584
+ if (!closestControlPoint) {
585
+ return;
586
+ }
587
+ this._deleteControlPointByIndex(element, annotation, closestControlPoint.index);
588
+ };
589
+ this._calculateCachedStats = (annotation, element) => {
590
+ if (!this.configuration.calculateStats) {
591
+ return;
592
+ }
593
+ const data = annotation.data;
594
+ if (!data.spline.closed) {
595
+ return;
596
+ }
597
+ const enabledElement = (0, core_1.getEnabledElement)(element);
598
+ const { viewport, renderingEngine } = enabledElement;
599
+ const { cachedStats } = data;
600
+ const { polyline: points } = data.spline;
601
+ const targetIds = Object.keys(cachedStats);
602
+ for (let i = 0; i < targetIds.length; i++) {
603
+ const targetId = targetIds[i];
604
+ const image = this.getTargetIdImage(targetId, renderingEngine);
605
+ if (!image) {
606
+ continue;
607
+ }
608
+ const { metadata } = image;
609
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
610
+ const canvasPoint = canvasCoordinates[0];
611
+ const originalWorldPoint = viewport.canvasToWorld(canvasPoint);
612
+ const deltaXPoint = viewport.canvasToWorld([
613
+ canvasPoint[0] + 1,
614
+ canvasPoint[1],
615
+ ]);
616
+ const deltaYPoint = viewport.canvasToWorld([
617
+ canvasPoint[0],
618
+ canvasPoint[1] + 1,
619
+ ]);
620
+ const deltaInX = gl_matrix_1.vec3.distance(originalWorldPoint, deltaXPoint);
621
+ const deltaInY = gl_matrix_1.vec3.distance(originalWorldPoint, deltaYPoint);
622
+ const scale = (0, utilities_1.getCalibratedScale)(image);
623
+ let area = utilities_1.math.polyline.calculateAreaOfPoints(canvasCoordinates) / scale / scale;
624
+ area *= deltaInX * deltaInY;
625
+ cachedStats[targetId] = {
626
+ Modality: metadata.Modality,
627
+ area,
628
+ areaUnit: (0, utilities_1.getCalibratedAreaUnits)(null, image),
629
+ };
630
+ }
631
+ this.triggerAnnotationModified(annotation, enabledElement);
632
+ return cachedStats;
633
+ };
634
+ this._throttledCalculateCachedStats = (0, utilities_1.throttle)(this._calculateCachedStats, 100, { trailing: true });
635
+ }
636
+ _deleteControlPointByIndex(element, annotation, controlPointIndex) {
637
+ const enabledElement = (0, core_1.getEnabledElement)(element);
638
+ const { points: controlPoints } = annotation.data.handles;
639
+ if (controlPoints.length === 3) {
640
+ (0, annotationState_1.removeAnnotation)(annotation.annotationUID);
641
+ }
642
+ else {
643
+ controlPoints.splice(controlPointIndex, 1);
644
+ }
645
+ const { renderingEngine } = enabledElement;
646
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
647
+ annotation.invalidated = true;
648
+ (0, utilities_1.triggerAnnotationRenderForViewportIds)(renderingEngine, viewportIdsToRender);
649
+ }
650
+ _getSplineConfig(type) {
651
+ const { configuration: config } = this;
652
+ const splineConfigs = config.spline.configuration;
653
+ return Object.assign({ type }, DEFAULT_SPLINE_CONFIG, splineConfigs[type]);
654
+ }
655
+ _updateSplineScale(spline, annotation) {
656
+ const splineType = annotation.data.spline.type;
657
+ const splineConfig = this._getSplineConfig(splineType);
658
+ if (!(spline instanceof CardinalSpline_1.CardinalSpline) ||
659
+ spline.fixedScale ||
660
+ splineConfig.scale === undefined ||
661
+ spline.scale === splineConfig.scale) {
662
+ return;
663
+ }
664
+ spline.scale = splineConfig.scale;
665
+ annotation.invalidated = true;
666
+ }
667
+ _updateSplineInstance(element, annotation) {
668
+ var _a;
669
+ const enabledElement = (0, core_1.getEnabledElement)(element);
670
+ const { viewport } = enabledElement;
671
+ const { worldToCanvas } = viewport;
672
+ const { data } = annotation;
673
+ const { type: splineType, instance: spline } = annotation.data.spline;
674
+ const splineConfig = this._getSplineConfig(splineType);
675
+ const worldPoints = data.handles.points;
676
+ const canvasPoints = worldPoints.map(worldToCanvas);
677
+ spline.setControlPoints(canvasPoints);
678
+ spline.closed = !!((_a = data.spline) === null || _a === void 0 ? void 0 : _a.closed);
679
+ if (spline.resolution !== splineConfig.resolution) {
680
+ spline.resolution = parseInt(splineConfig.resolution);
681
+ annotation.invalidated = true;
682
+ }
683
+ if (spline instanceof CardinalSpline_1.CardinalSpline &&
684
+ !spline.fixedScale &&
685
+ splineConfig.scale !== undefined &&
686
+ spline.scale !== splineConfig.scale) {
687
+ spline.scale = splineConfig.scale;
688
+ annotation.invalidated = true;
689
+ }
690
+ return spline;
691
+ }
692
+ }
693
+ SplineROITool.SplineTypes = SplineTypesEnum;
694
+ SplineROITool.Actions = SplineToolActions;
695
+ function defaultGetTextLines(data, targetId) {
696
+ const cachedVolumeStats = data.cachedStats[targetId];
697
+ const { area, isEmptyArea, areaUnit } = cachedVolumeStats;
698
+ const textLines = [];
699
+ if (area) {
700
+ const areaLine = isEmptyArea
701
+ ? `Area: Oblique not supported`
702
+ : `Area: ${(0, utilities_1.roundNumber)(area)} ${areaUnit}`;
703
+ textLines.push(areaLine);
704
+ }
705
+ return textLines;
706
+ }
707
+ SplineROITool.toolName = 'SplineROI';
708
+ exports.default = SplineROITool;
709
+ //# sourceMappingURL=SplineROITool.js.map