@cornerstonejs/tools 1.23.4 → 1.24.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 (225) hide show
  1. package/dist/cjs/utilities/getVOIMultipliers.d.ts +5 -0
  2. package/dist/cjs/utilities/getVOIMultipliers.js +23 -0
  3. package/dist/cjs/utilities/getVOIMultipliers.js.map +1 -0
  4. package/dist/cjs/utilities/index.d.ts +2 -1
  5. package/dist/cjs/utilities/index.js +3 -1
  6. package/dist/cjs/utilities/index.js.map +1 -1
  7. package/dist/cjs/utilities/math/vec3/interpolateVec3.d.ts +2 -0
  8. package/dist/cjs/utilities/math/vec3/interpolateVec3.js +13 -0
  9. package/dist/cjs/utilities/math/vec3/interpolateVec3.js.map +1 -0
  10. package/dist/cjs/utilities/viewport/isViewportPreScaled.js +2 -1
  11. package/dist/cjs/utilities/viewport/isViewportPreScaled.js.map +1 -1
  12. package/dist/cjs/utilities/voi/colorbar/Colorbar.d.ts +44 -0
  13. package/dist/cjs/utilities/voi/colorbar/Colorbar.js +249 -0
  14. package/dist/cjs/utilities/voi/colorbar/Colorbar.js.map +1 -0
  15. package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.d.ts +29 -0
  16. package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.js +184 -0
  17. package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.js.map +1 -0
  18. package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.d.ts +46 -0
  19. package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.js +286 -0
  20. package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.js.map +1 -0
  21. package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.d.ts +23 -0
  22. package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.js +126 -0
  23. package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.js.map +1 -0
  24. package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.d.ts +3 -0
  25. package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.js +9 -0
  26. package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.js.map +1 -0
  27. package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.d.ts +3 -0
  28. package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.js +9 -0
  29. package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.js.map +1 -0
  30. package/dist/cjs/utilities/voi/colorbar/common/index.d.ts +4 -0
  31. package/dist/cjs/utilities/voi/colorbar/common/index.js +12 -0
  32. package/dist/cjs/utilities/voi/colorbar/common/index.js.map +1 -0
  33. package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.d.ts +3 -0
  34. package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.js +9 -0
  35. package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.js.map +1 -0
  36. package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.d.ts +3 -0
  37. package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.js +14 -0
  38. package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.js.map +1 -0
  39. package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.d.ts +3 -0
  40. package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.js +9 -0
  41. package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.js.map +1 -0
  42. package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.d.ts +6 -0
  43. package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js +11 -0
  44. package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js.map +1 -0
  45. package/dist/cjs/utilities/voi/colorbar/enums/index.d.ts +1 -0
  46. package/dist/cjs/utilities/voi/colorbar/enums/index.js +6 -0
  47. package/dist/cjs/utilities/voi/colorbar/enums/index.js.map +1 -0
  48. package/dist/cjs/utilities/voi/colorbar/index.d.ts +6 -0
  49. package/dist/cjs/utilities/voi/colorbar/index.js +33 -0
  50. package/dist/cjs/utilities/voi/colorbar/index.js.map +1 -0
  51. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.d.ts +12 -0
  52. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.js +3 -0
  53. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.js.map +1 -0
  54. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.d.ts +11 -0
  55. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.js +3 -0
  56. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.js.map +1 -0
  57. package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.d.ts +4 -0
  58. package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.js +3 -0
  59. package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.js.map +1 -0
  60. package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.d.ts +7 -0
  61. package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.js +3 -0
  62. package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.js.map +1 -0
  63. package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.d.ts +4 -0
  64. package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.js +3 -0
  65. package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.js.map +1 -0
  66. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.d.ts +7 -0
  67. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.js +3 -0
  68. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.js.map +1 -0
  69. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.d.ts +8 -0
  70. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.js +3 -0
  71. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.js.map +1 -0
  72. package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.d.ts +2 -0
  73. package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.js +3 -0
  74. package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.js.map +1 -0
  75. package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.d.ts +5 -0
  76. package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.js +3 -0
  77. package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.js.map +1 -0
  78. package/dist/cjs/utilities/voi/colorbar/types/index.d.ts +8 -0
  79. package/dist/cjs/utilities/voi/colorbar/types/index.js +3 -0
  80. package/dist/cjs/utilities/voi/colorbar/types/index.js.map +1 -0
  81. package/dist/cjs/utilities/voi/index.d.ts +2 -0
  82. package/dist/cjs/utilities/voi/index.js +29 -0
  83. package/dist/cjs/utilities/voi/index.js.map +1 -0
  84. package/dist/cjs/widgets/Widget.d.ts +17 -0
  85. package/dist/cjs/widgets/Widget.js +71 -0
  86. package/dist/cjs/widgets/Widget.js.map +1 -0
  87. package/dist/cjs/widgets/types/WidgetProps.d.ts +4 -0
  88. package/dist/cjs/widgets/types/WidgetProps.js +3 -0
  89. package/dist/cjs/widgets/types/WidgetProps.js.map +1 -0
  90. package/dist/cjs/widgets/types/WidgetSize.d.ts +4 -0
  91. package/dist/cjs/widgets/types/WidgetSize.js +3 -0
  92. package/dist/cjs/widgets/types/WidgetSize.js.map +1 -0
  93. package/dist/cjs/widgets/types/index.d.ts +2 -0
  94. package/dist/cjs/widgets/types/index.js +3 -0
  95. package/dist/cjs/widgets/types/index.js.map +1 -0
  96. package/dist/esm/utilities/getVOIMultipliers.d.ts +5 -0
  97. package/dist/esm/utilities/getVOIMultipliers.js +19 -0
  98. package/dist/esm/utilities/getVOIMultipliers.js.map +1 -0
  99. package/dist/esm/utilities/index.d.ts +2 -1
  100. package/dist/esm/utilities/index.js +2 -1
  101. package/dist/esm/utilities/index.js.map +1 -1
  102. package/dist/esm/utilities/math/vec3/interpolateVec3.d.ts +2 -0
  103. package/dist/esm/utilities/math/vec3/interpolateVec3.js +9 -0
  104. package/dist/esm/utilities/math/vec3/interpolateVec3.js.map +1 -0
  105. package/dist/esm/utilities/viewport/isViewportPreScaled.js +2 -1
  106. package/dist/esm/utilities/viewport/isViewportPreScaled.js.map +1 -1
  107. package/dist/esm/utilities/voi/colorbar/Colorbar.d.ts +44 -0
  108. package/dist/esm/utilities/voi/colorbar/Colorbar.js +241 -0
  109. package/dist/esm/utilities/voi/colorbar/Colorbar.js.map +1 -0
  110. package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.d.ts +29 -0
  111. package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.js +177 -0
  112. package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.js.map +1 -0
  113. package/dist/esm/utilities/voi/colorbar/ColorbarTicks.d.ts +46 -0
  114. package/dist/esm/utilities/voi/colorbar/ColorbarTicks.js +281 -0
  115. package/dist/esm/utilities/voi/colorbar/ColorbarTicks.js.map +1 -0
  116. package/dist/esm/utilities/voi/colorbar/ViewportColorbar.d.ts +23 -0
  117. package/dist/esm/utilities/voi/colorbar/ViewportColorbar.js +122 -0
  118. package/dist/esm/utilities/voi/colorbar/ViewportColorbar.js.map +1 -0
  119. package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.d.ts +3 -0
  120. package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.js +5 -0
  121. package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.js.map +1 -0
  122. package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.d.ts +3 -0
  123. package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.js +5 -0
  124. package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.js.map +1 -0
  125. package/dist/esm/utilities/voi/colorbar/common/index.d.ts +4 -0
  126. package/dist/esm/utilities/voi/colorbar/common/index.js +5 -0
  127. package/dist/esm/utilities/voi/colorbar/common/index.js.map +1 -0
  128. package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.d.ts +3 -0
  129. package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.js +5 -0
  130. package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.js.map +1 -0
  131. package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.d.ts +3 -0
  132. package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.js +10 -0
  133. package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.js.map +1 -0
  134. package/dist/esm/utilities/voi/colorbar/common/isRangeValid.d.ts +3 -0
  135. package/dist/esm/utilities/voi/colorbar/common/isRangeValid.js +5 -0
  136. package/dist/esm/utilities/voi/colorbar/common/isRangeValid.js.map +1 -0
  137. package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.d.ts +6 -0
  138. package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js +8 -0
  139. package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js.map +1 -0
  140. package/dist/esm/utilities/voi/colorbar/enums/index.d.ts +1 -0
  141. package/dist/esm/utilities/voi/colorbar/enums/index.js +2 -0
  142. package/dist/esm/utilities/voi/colorbar/enums/index.js.map +1 -0
  143. package/dist/esm/utilities/voi/colorbar/index.d.ts +6 -0
  144. package/dist/esm/utilities/voi/colorbar/index.js +5 -0
  145. package/dist/esm/utilities/voi/colorbar/index.js.map +1 -0
  146. package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.d.ts +12 -0
  147. package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.js +2 -0
  148. package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.js.map +1 -0
  149. package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.d.ts +11 -0
  150. package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.js +2 -0
  151. package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.js.map +1 -0
  152. package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.d.ts +4 -0
  153. package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.js +2 -0
  154. package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.js.map +1 -0
  155. package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.d.ts +7 -0
  156. package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.js +2 -0
  157. package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.js.map +1 -0
  158. package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.d.ts +4 -0
  159. package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.js +2 -0
  160. package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.js.map +1 -0
  161. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.d.ts +7 -0
  162. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.js +2 -0
  163. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.js.map +1 -0
  164. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.d.ts +8 -0
  165. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.js +2 -0
  166. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.js.map +1 -0
  167. package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.d.ts +2 -0
  168. package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.js +2 -0
  169. package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.js.map +1 -0
  170. package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.d.ts +5 -0
  171. package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.js +2 -0
  172. package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.js.map +1 -0
  173. package/dist/esm/utilities/voi/colorbar/types/index.d.ts +8 -0
  174. package/dist/esm/utilities/voi/colorbar/types/index.js +2 -0
  175. package/dist/esm/utilities/voi/colorbar/types/index.js.map +1 -0
  176. package/dist/esm/utilities/voi/index.d.ts +2 -0
  177. package/dist/esm/utilities/voi/index.js +3 -0
  178. package/dist/esm/utilities/voi/index.js.map +1 -0
  179. package/dist/esm/widgets/Widget.d.ts +17 -0
  180. package/dist/esm/widgets/Widget.js +67 -0
  181. package/dist/esm/widgets/Widget.js.map +1 -0
  182. package/dist/esm/widgets/types/WidgetProps.d.ts +4 -0
  183. package/dist/esm/widgets/types/WidgetProps.js +2 -0
  184. package/dist/esm/widgets/types/WidgetProps.js.map +1 -0
  185. package/dist/esm/widgets/types/WidgetSize.d.ts +4 -0
  186. package/dist/esm/widgets/types/WidgetSize.js +2 -0
  187. package/dist/esm/widgets/types/WidgetSize.js.map +1 -0
  188. package/dist/esm/widgets/types/index.d.ts +2 -0
  189. package/dist/esm/widgets/types/index.js +2 -0
  190. package/dist/esm/widgets/types/index.js.map +1 -0
  191. package/dist/umd/index.js +1 -1
  192. package/dist/umd/index.js.map +1 -1
  193. package/package.json +3 -3
  194. package/src/utilities/getVOIMultipliers.ts +33 -0
  195. package/src/utilities/index.ts +2 -0
  196. package/src/utilities/math/vec3/interpolateVec3.ts +20 -0
  197. package/src/utilities/viewport/isViewportPreScaled.ts +3 -1
  198. package/src/utilities/voi/colorbar/Colorbar.ts +367 -0
  199. package/src/utilities/voi/colorbar/ColorbarCanvas.ts +287 -0
  200. package/src/utilities/voi/colorbar/ColorbarTicks.ts +500 -0
  201. package/src/utilities/voi/colorbar/ViewportColorbar.ts +194 -0
  202. package/src/utilities/voi/colorbar/common/areColorbarRangesEqual.ts +10 -0
  203. package/src/utilities/voi/colorbar/common/areColorbarSizesEqual.ts +7 -0
  204. package/src/utilities/voi/colorbar/common/index.ts +4 -0
  205. package/src/utilities/voi/colorbar/common/isColorbarSizeValid.ts +7 -0
  206. package/src/utilities/voi/colorbar/common/isRangeTextPositionValid.ts +16 -0
  207. package/src/utilities/voi/colorbar/common/isRangeValid.ts +7 -0
  208. package/src/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.ts +11 -0
  209. package/src/utilities/voi/colorbar/enums/index.ts +1 -0
  210. package/src/utilities/voi/colorbar/index.ts +8 -0
  211. package/src/utilities/voi/colorbar/types/ColorbarCanvasProps.ts +14 -0
  212. package/src/utilities/voi/colorbar/types/ColorbarCommonProps.ts +23 -0
  213. package/src/utilities/voi/colorbar/types/ColorbarImageRange.ts +4 -0
  214. package/src/utilities/voi/colorbar/types/ColorbarProps.ts +8 -0
  215. package/src/utilities/voi/colorbar/types/ColorbarSize.ts +4 -0
  216. package/src/utilities/voi/colorbar/types/ColorbarTicksProps.ts +8 -0
  217. package/src/utilities/voi/colorbar/types/ColorbarTicksStyle.ts +8 -0
  218. package/src/utilities/voi/colorbar/types/ColorbarVOIRange.ts +3 -0
  219. package/src/utilities/voi/colorbar/types/ViewportColorbarProps.ts +6 -0
  220. package/src/utilities/voi/colorbar/types/index.ts +8 -0
  221. package/src/utilities/voi/index.ts +3 -0
  222. package/src/widgets/Widget.ts +169 -0
  223. package/src/widgets/types/WidgetProps.ts +4 -0
  224. package/src/widgets/types/WidgetSize.ts +4 -0
  225. package/src/widgets/types/index.ts +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/tools",
3
- "version": "1.23.4",
3
+ "version": "1.24.0",
4
4
  "description": "Cornerstone3D Tools",
5
5
  "main": "src/index.ts",
6
6
  "types": "dist/esm/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "webpack:watch": "webpack --mode development --progress --watch --config ./.webpack/webpack.dev.js"
30
30
  },
31
31
  "dependencies": {
32
- "@cornerstonejs/core": "^1.23.4",
32
+ "@cornerstonejs/core": "^1.24.0",
33
33
  "lodash.clonedeep": "4.5.0",
34
34
  "lodash.get": "^4.4.2"
35
35
  },
@@ -52,5 +52,5 @@
52
52
  "type": "individual",
53
53
  "url": "https://ohif.org/donate"
54
54
  },
55
- "gitHead": "fbd7662554d78d9db96d83e3d29369db6024b70b"
55
+ "gitHead": "7db76a5a136c78e1532f0abe90f4c2f9613ac68f"
56
56
  }
@@ -0,0 +1,33 @@
1
+ import { Types, utilities as csUtils } from '@cornerstonejs/core';
2
+ import { isViewportPreScaled } from './viewport';
3
+
4
+ const DEFAULT_MULTIPLIER = 4;
5
+
6
+ function getVOIMultipliers(
7
+ viewport: Types.IStackViewport | Types.IVolumeViewport,
8
+ volumeId?: string,
9
+ options?: {
10
+ fixedPTWindowWidth?: boolean;
11
+ }
12
+ ): [number, number] {
13
+ const modality = csUtils.getViewportModality(viewport, volumeId);
14
+
15
+ if (modality === 'PT') {
16
+ const { clientWidth, clientHeight } = viewport.element;
17
+ const ptMultiplier = 5 / Math.max(clientWidth, clientHeight);
18
+ const isPreScaled = isViewportPreScaled(viewport, volumeId);
19
+ const { fixedPTWindowWidth = true } = options ?? {};
20
+
21
+ // Set the "X" multiplier equal to zero in order to do not allow
22
+ // any change to the window width (0 * cursorDeltaX = 0)
23
+ const xMultiplier = fixedPTWindowWidth ? 0 : ptMultiplier;
24
+
25
+ return isPreScaled
26
+ ? [xMultiplier, ptMultiplier]
27
+ : [xMultiplier, DEFAULT_MULTIPLIER];
28
+ }
29
+
30
+ return [DEFAULT_MULTIPLIER, DEFAULT_MULTIPLIER];
31
+ }
32
+
33
+ export { getVOIMultipliers as default, getVOIMultipliers };
@@ -35,6 +35,7 @@ import * as viewport from './viewport';
35
35
  import * as touch from './touch';
36
36
  import * as dynamicVolume from './dynamicVolume';
37
37
  import * as polyDataUtils from './polyData/utils';
38
+ import * as voi from './voi';
38
39
 
39
40
  // Events
40
41
  import { triggerEvent } from '@cornerstonejs/core';
@@ -72,4 +73,5 @@ export {
72
73
  roundNumber,
73
74
  pointToString,
74
75
  polyDataUtils,
76
+ voi,
75
77
  };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Linear interpolation between two vec3.
3
+ * Can be used, for example, to interpolate between two RGB colors.
4
+ * @param a - First vec3
5
+ * @param b - Second vec3
6
+ * @param t - Time "t".
7
+ * - Vector A is returned for values smaller than or equel to 0.
8
+ * - Vector B is returned for values greater than or equal to 1.
9
+ * - An interpolation between vectors A and B is returned otherwise.
10
+ * @returns
11
+ */
12
+ const interpolateVec3 = (a, b, t) => {
13
+ return [
14
+ a[0] * (1 - t) + b[0] * t,
15
+ a[1] * (1 - t) + b[1] * t,
16
+ a[2] * (1 - t) + b[2] * t,
17
+ ];
18
+ };
19
+
20
+ export { interpolateVec3 as default, interpolateVec3 };
@@ -10,7 +10,9 @@ function isViewportPreScaled(
10
10
  targetId: string
11
11
  ): boolean {
12
12
  if (viewport instanceof BaseVolumeViewport) {
13
- const volumeId = targetId.split('volumeId:')[1];
13
+ const targetIdTokens = targetId.split('volumeId:');
14
+ const volumeId =
15
+ targetIdTokens.length > 1 ? targetIdTokens[1] : targetIdTokens[0];
14
16
  const volume = cache.getVolume(volumeId);
15
17
  return !!volume?.scaling && Object.keys(volume.scaling).length > 0;
16
18
  } else if (viewport instanceof StackViewport) {
@@ -0,0 +1,367 @@
1
+ import { IColorMapPreset } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';
2
+ import { vec2 } from 'gl-matrix';
3
+ import { utilities as csUtils, Types } from '@cornerstonejs/core';
4
+ import type { ColorbarProps, ColorbarVOIRange } from './types';
5
+ import { isRangeValid, areColorbarRangesEqual } from './common';
6
+ import { ColorbarRangeTextPosition } from './enums/ColorbarRangeTextPosition';
7
+ import { ColorbarCanvas } from './ColorbarCanvas';
8
+ import { ColorbarTicks } from './ColorbarTicks';
9
+ import isRangeTextPositionValid from './common/isRangeTextPositionValid';
10
+ import Widget from '../../../widgets/Widget';
11
+
12
+ const DEFAULTS = {
13
+ MULTIPLIER: 1,
14
+ RANGE_TEXT_POSITION: ColorbarRangeTextPosition.Right,
15
+ TICKS_BAR_SIZE: 50,
16
+ };
17
+
18
+ type ColorbarPoints = {
19
+ page: Types.Point2;
20
+ client: Types.Point2;
21
+ local: Types.Point2;
22
+ };
23
+
24
+ /**
25
+ * A base colorbar class that is not associated with any viewport. It is
26
+ * possible to click and drag to change the VOI range, shows the ticks during
27
+ * interaction and it can show full image range or VOI range.
28
+ */
29
+ class Colorbar extends Widget {
30
+ private _colormaps: Map<string, IColorMapPreset>;
31
+ private _activeColormapName: string;
32
+ private _eventListenersManager: csUtils.eventListener.MultiTargetEventListenerManager;
33
+ private _canvas: ColorbarCanvas;
34
+ private _ticksBar: ColorbarTicks;
35
+ private _rangeTextPosition: ColorbarRangeTextPosition;
36
+
37
+ private _isMouseOver = false;
38
+ private _isInteracting = false;
39
+
40
+ constructor(props: ColorbarProps) {
41
+ super(props);
42
+
43
+ this._eventListenersManager =
44
+ new csUtils.eventListener.MultiTargetEventListenerManager();
45
+ this._colormaps = Colorbar.getColormapsMap(props);
46
+ this._activeColormapName = Colorbar.getInitialColormapName(props);
47
+ this._canvas = this._createCanvas(props);
48
+ this._ticksBar = this._createTicksBar(props);
49
+ this._rangeTextPosition =
50
+ props.ticks?.position ?? DEFAULTS.RANGE_TEXT_POSITION;
51
+
52
+ this._canvas.appendTo(this.rootElement);
53
+ this._ticksBar.appendTo(document.body);
54
+
55
+ this._addRootElementEventListeners();
56
+ }
57
+
58
+ /**
59
+ * Returns the active LUT name
60
+ */
61
+ public get activeColormapName() {
62
+ return this._activeColormapName;
63
+ }
64
+
65
+ /**
66
+ * Set the current active LUT name and re-renders the color bar
67
+ */
68
+ public set activeColormapName(colormapName: string) {
69
+ if (colormapName === this._activeColormapName) {
70
+ return;
71
+ }
72
+
73
+ const colormap = this._colormaps.get(colormapName);
74
+
75
+ if (!colormap) {
76
+ console.warn(`Invalid colormap name (${colormapName})`);
77
+ return;
78
+ }
79
+
80
+ this._activeColormapName = colormapName;
81
+ this._canvas.colormap = colormap;
82
+ }
83
+
84
+ public get imageRange() {
85
+ return this._canvas.imageRange;
86
+ }
87
+
88
+ public set imageRange(imageRange: ColorbarVOIRange) {
89
+ this._canvas.imageRange = imageRange;
90
+ this._ticksBar.imageRange = imageRange;
91
+ }
92
+
93
+ public get voiRange() {
94
+ return this._canvas.voiRange;
95
+ }
96
+
97
+ public set voiRange(voiRange: ColorbarVOIRange) {
98
+ const { voiRange: currentVoiRange } = this._canvas;
99
+
100
+ if (
101
+ !isRangeValid(voiRange) ||
102
+ areColorbarRangesEqual(voiRange, currentVoiRange)
103
+ ) {
104
+ return;
105
+ }
106
+
107
+ this._canvas.voiRange = voiRange;
108
+ this._ticksBar.voiRange = voiRange;
109
+ this.onVoiChange(voiRange);
110
+ }
111
+
112
+ public get showFullImageRange() {
113
+ return this._canvas.showFullImageRange;
114
+ }
115
+
116
+ public set showFullImageRange(value: boolean) {
117
+ this._canvas.showFullImageRange = value;
118
+ this._ticksBar.showFullPixelValueRange = value;
119
+ }
120
+
121
+ public destroy() {
122
+ super.destroy();
123
+ this._eventListenersManager.reset();
124
+ }
125
+
126
+ protected createRootElement(): HTMLElement {
127
+ const rootElement = document.createElement('div');
128
+
129
+ Object.assign(rootElement.style, {
130
+ width: '100%',
131
+ height: '100%',
132
+ });
133
+
134
+ return rootElement;
135
+ }
136
+
137
+ protected onContainerResize() {
138
+ super.onContainerResize();
139
+ this._canvas.size = this.containerSize;
140
+ }
141
+
142
+ protected getVOIMultipliers(): [number, number] {
143
+ return [DEFAULTS.MULTIPLIER, DEFAULTS.MULTIPLIER];
144
+ }
145
+
146
+ protected onVoiChange(voiRange: ColorbarVOIRange) {
147
+ // no-op
148
+ }
149
+
150
+ protected showTicks() {
151
+ this.updateTicksBar();
152
+ this._ticksBar.visible = true;
153
+ }
154
+
155
+ protected hideTicks() {
156
+ if (this._isInteracting || this._isMouseOver) {
157
+ return;
158
+ }
159
+
160
+ this._ticksBar.visible = false;
161
+ }
162
+
163
+ private static getColormapsMap(props: ColorbarProps) {
164
+ const { colormaps } = props;
165
+
166
+ return colormaps.reduce(
167
+ (items, item) => items.set(item.Name, item),
168
+ new Map<string, IColorMapPreset>()
169
+ );
170
+ }
171
+
172
+ private static getInitialColormapName(props: ColorbarProps) {
173
+ const { activeColormapName, colormaps } = props;
174
+ const colormapExists =
175
+ !!activeColormapName &&
176
+ colormaps.some((cm) => cm.Name === activeColormapName);
177
+
178
+ return colormapExists ? activeColormapName : colormaps[0].Name;
179
+ }
180
+
181
+ private _createCanvas(props: ColorbarProps) {
182
+ const { imageRange, voiRange, showFullPixelValueRange } = props;
183
+ const colormap = this._colormaps.get(this._activeColormapName);
184
+
185
+ return new ColorbarCanvas({
186
+ colormap,
187
+ imageRange,
188
+ voiRange: voiRange,
189
+ showFullPixelValueRange,
190
+ });
191
+ }
192
+
193
+ public _createTicksBar(props: ColorbarProps): ColorbarTicks {
194
+ const ticksProps = props.ticks;
195
+
196
+ return new ColorbarTicks({
197
+ imageRange: props.imageRange,
198
+ voiRange: props.voiRange,
199
+ ticks: ticksProps,
200
+ showFullPixelValueRange: props.showFullPixelValueRange,
201
+ });
202
+ }
203
+
204
+ private _getPointsFromMouseEvent(evt: MouseEvent): ColorbarPoints {
205
+ const { rootElement: element } = this;
206
+ const clientPoint: Types.Point2 = [evt.clientX, evt.clientY];
207
+ const pagePoint: Types.Point2 = [evt.pageX, evt.pageY];
208
+ const rect = element.getBoundingClientRect();
209
+ const localPoints: Types.Point2 = [
210
+ pagePoint[0] - rect.left - window.pageXOffset,
211
+ pagePoint[1] - rect.top - window.pageYOffset,
212
+ ];
213
+
214
+ return { client: clientPoint, page: pagePoint, local: localPoints };
215
+ }
216
+
217
+ private updateTicksBar() {
218
+ const { width: containerWidth, height: containerHeight } =
219
+ this.containerSize;
220
+
221
+ // ResizeObserver have not triggered any event when this happen
222
+ if (containerWidth === 0 && containerHeight === 0) {
223
+ return;
224
+ }
225
+
226
+ const { _ticksBar: ticksBar, _rangeTextPosition: rangeTextPosition } = this;
227
+ const { top: containerTop, left: containerLeft } =
228
+ this.rootElement.getBoundingClientRect();
229
+ const isHorizontal = containerWidth >= containerHeight;
230
+ const width = isHorizontal ? containerWidth : DEFAULTS.TICKS_BAR_SIZE;
231
+ const height = isHorizontal ? DEFAULTS.TICKS_BAR_SIZE : containerHeight;
232
+
233
+ if (
234
+ !isRangeTextPositionValid(
235
+ containerWidth,
236
+ containerHeight,
237
+ rangeTextPosition
238
+ )
239
+ ) {
240
+ throw new Error(
241
+ 'Invalid rangeTextPosition value for the current colobar orientation'
242
+ );
243
+ }
244
+
245
+ let ticksBarTop;
246
+ let ticksBarLeft;
247
+
248
+ ticksBar.size = { width, height };
249
+
250
+ if (isHorizontal) {
251
+ ticksBarTop =
252
+ rangeTextPosition === ColorbarRangeTextPosition.Top
253
+ ? containerTop - height
254
+ : containerTop + containerHeight;
255
+
256
+ ticksBarLeft = containerLeft;
257
+ } else {
258
+ ticksBarTop = containerTop;
259
+
260
+ ticksBarLeft =
261
+ rangeTextPosition === ColorbarRangeTextPosition.Left
262
+ ? containerLeft - width
263
+ : containerLeft + containerWidth;
264
+ }
265
+
266
+ ticksBar.top = ticksBarTop;
267
+ ticksBar.left = ticksBarLeft;
268
+ }
269
+
270
+ private _mouseOverCallback = (evt) => {
271
+ this._isMouseOver = true;
272
+ this.showTicks();
273
+ evt.stopPropagation();
274
+ };
275
+
276
+ private _mouseOutCallback = (evt) => {
277
+ this._isMouseOver = false;
278
+ this.hideTicks();
279
+ evt.stopPropagation();
280
+ };
281
+
282
+ private _mouseDownCallback = (evt: MouseEvent) => {
283
+ this._isInteracting = true;
284
+ this.showTicks();
285
+ this._addVOIEventListeners(evt);
286
+ evt.stopPropagation();
287
+ };
288
+
289
+ private _mouseDragCallback = (evt, initialState) => {
290
+ const multipliers = this.getVOIMultipliers();
291
+ const currentPoints = this._getPointsFromMouseEvent(evt);
292
+ const { points: startPoints, voiRange: startVOIRange } = initialState;
293
+ const canvasDelta = vec2.sub(
294
+ vec2.create(),
295
+ currentPoints.local,
296
+ startPoints.local
297
+ );
298
+
299
+ const wwDelta = canvasDelta[0] * multipliers[0];
300
+ const wcDelta = canvasDelta[1] * multipliers[1];
301
+
302
+ if (!wwDelta && !wcDelta) {
303
+ return;
304
+ }
305
+
306
+ const { lower: voiLower, upper: voiUpper } = startVOIRange;
307
+ let { windowWidth, windowCenter } = csUtils.windowLevel.toWindowLevel(
308
+ voiLower,
309
+ voiUpper
310
+ );
311
+
312
+ windowWidth = Math.max(windowWidth + wwDelta, 1);
313
+ windowCenter += wcDelta;
314
+
315
+ const newVoiRange = csUtils.windowLevel.toLowHighRange(
316
+ windowWidth,
317
+ windowCenter
318
+ );
319
+
320
+ this.voiRange = newVoiRange;
321
+ evt.stopPropagation();
322
+ evt.preventDefault();
323
+ };
324
+
325
+ private _mouseUpCallback = (evt) => {
326
+ this._isInteracting = false;
327
+ this.hideTicks();
328
+ this._removeVOIEventListeners();
329
+ evt.stopPropagation();
330
+ };
331
+
332
+ private _addRootElementEventListeners() {
333
+ const { _eventListenersManager: manager } = this;
334
+ const { rootElement: element } = this;
335
+
336
+ manager.addEventListener(element, 'mouseover', this._mouseOverCallback);
337
+ manager.addEventListener(element, 'mouseout', this._mouseOutCallback);
338
+ manager.addEventListener(
339
+ element,
340
+ 'mousedown',
341
+ this._mouseDownCallback as EventListener
342
+ );
343
+ }
344
+
345
+ private _addVOIEventListeners(evt: MouseEvent) {
346
+ const { _eventListenersManager: manager } = this;
347
+ const points = this._getPointsFromMouseEvent(evt);
348
+ const voiRange = { ...this._canvas.voiRange };
349
+ const initialDragState = { points, voiRange };
350
+
351
+ this._removeVOIEventListeners();
352
+
353
+ manager.addEventListener(document, 'voi.mouseup', this._mouseUpCallback);
354
+ manager.addEventListener(document, 'voi.mousemove', (evt) =>
355
+ this._mouseDragCallback(evt, initialDragState)
356
+ );
357
+ }
358
+
359
+ private _removeVOIEventListeners() {
360
+ const { _eventListenersManager: manager } = this;
361
+
362
+ manager.removeEventListener(document, 'voi.mouseup');
363
+ manager.removeEventListener(document, 'voi.mousemove');
364
+ }
365
+ }
366
+
367
+ export { Colorbar as default, Colorbar };