@cornerstonejs/tools 1.23.3 → 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.
- package/dist/cjs/tools/displayTools/SegmentationDisplayTool.js.map +1 -1
- package/dist/cjs/utilities/getVOIMultipliers.d.ts +5 -0
- package/dist/cjs/utilities/getVOIMultipliers.js +23 -0
- package/dist/cjs/utilities/getVOIMultipliers.js.map +1 -0
- package/dist/cjs/utilities/index.d.ts +2 -1
- package/dist/cjs/utilities/index.js +3 -1
- package/dist/cjs/utilities/index.js.map +1 -1
- package/dist/cjs/utilities/math/vec3/interpolateVec3.d.ts +2 -0
- package/dist/cjs/utilities/math/vec3/interpolateVec3.js +13 -0
- package/dist/cjs/utilities/math/vec3/interpolateVec3.js.map +1 -0
- package/dist/cjs/utilities/viewport/isViewportPreScaled.js +2 -1
- package/dist/cjs/utilities/viewport/isViewportPreScaled.js.map +1 -1
- package/dist/cjs/utilities/voi/colorbar/Colorbar.d.ts +44 -0
- package/dist/cjs/utilities/voi/colorbar/Colorbar.js +249 -0
- package/dist/cjs/utilities/voi/colorbar/Colorbar.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.d.ts +29 -0
- package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.js +184 -0
- package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.d.ts +46 -0
- package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.js +286 -0
- package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.d.ts +23 -0
- package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.js +126 -0
- package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.d.ts +3 -0
- package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.js +9 -0
- package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.d.ts +3 -0
- package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.js +9 -0
- package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/common/index.d.ts +4 -0
- package/dist/cjs/utilities/voi/colorbar/common/index.js +12 -0
- package/dist/cjs/utilities/voi/colorbar/common/index.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.d.ts +3 -0
- package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.js +9 -0
- package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.d.ts +3 -0
- package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.js +14 -0
- package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.d.ts +3 -0
- package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.js +9 -0
- package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.d.ts +6 -0
- package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js +11 -0
- package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/enums/index.d.ts +1 -0
- package/dist/cjs/utilities/voi/colorbar/enums/index.js +6 -0
- package/dist/cjs/utilities/voi/colorbar/enums/index.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/index.d.ts +6 -0
- package/dist/cjs/utilities/voi/colorbar/index.js +33 -0
- package/dist/cjs/utilities/voi/colorbar/index.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.d.ts +12 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.d.ts +11 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.d.ts +4 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.d.ts +7 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.d.ts +4 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.d.ts +7 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.d.ts +8 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.d.ts +2 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.d.ts +5 -0
- package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.js.map +1 -0
- package/dist/cjs/utilities/voi/colorbar/types/index.d.ts +8 -0
- package/dist/cjs/utilities/voi/colorbar/types/index.js +3 -0
- package/dist/cjs/utilities/voi/colorbar/types/index.js.map +1 -0
- package/dist/cjs/utilities/voi/index.d.ts +2 -0
- package/dist/cjs/utilities/voi/index.js +29 -0
- package/dist/cjs/utilities/voi/index.js.map +1 -0
- package/dist/cjs/widgets/Widget.d.ts +17 -0
- package/dist/cjs/widgets/Widget.js +71 -0
- package/dist/cjs/widgets/Widget.js.map +1 -0
- package/dist/cjs/widgets/types/WidgetProps.d.ts +4 -0
- package/dist/cjs/widgets/types/WidgetProps.js +3 -0
- package/dist/cjs/widgets/types/WidgetProps.js.map +1 -0
- package/dist/cjs/widgets/types/WidgetSize.d.ts +4 -0
- package/dist/cjs/widgets/types/WidgetSize.js +3 -0
- package/dist/cjs/widgets/types/WidgetSize.js.map +1 -0
- package/dist/cjs/widgets/types/index.d.ts +2 -0
- package/dist/cjs/widgets/types/index.js +3 -0
- package/dist/cjs/widgets/types/index.js.map +1 -0
- package/dist/esm/tools/displayTools/SegmentationDisplayTool.js.map +1 -1
- package/dist/esm/utilities/getVOIMultipliers.d.ts +5 -0
- package/dist/esm/utilities/getVOIMultipliers.js +19 -0
- package/dist/esm/utilities/getVOIMultipliers.js.map +1 -0
- package/dist/esm/utilities/index.d.ts +2 -1
- package/dist/esm/utilities/index.js +2 -1
- package/dist/esm/utilities/index.js.map +1 -1
- package/dist/esm/utilities/math/vec3/interpolateVec3.d.ts +2 -0
- package/dist/esm/utilities/math/vec3/interpolateVec3.js +9 -0
- package/dist/esm/utilities/math/vec3/interpolateVec3.js.map +1 -0
- package/dist/esm/utilities/viewport/isViewportPreScaled.js +2 -1
- package/dist/esm/utilities/viewport/isViewportPreScaled.js.map +1 -1
- package/dist/esm/utilities/voi/colorbar/Colorbar.d.ts +44 -0
- package/dist/esm/utilities/voi/colorbar/Colorbar.js +241 -0
- package/dist/esm/utilities/voi/colorbar/Colorbar.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.d.ts +29 -0
- package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.js +177 -0
- package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/ColorbarTicks.d.ts +46 -0
- package/dist/esm/utilities/voi/colorbar/ColorbarTicks.js +281 -0
- package/dist/esm/utilities/voi/colorbar/ColorbarTicks.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/ViewportColorbar.d.ts +23 -0
- package/dist/esm/utilities/voi/colorbar/ViewportColorbar.js +122 -0
- package/dist/esm/utilities/voi/colorbar/ViewportColorbar.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.d.ts +3 -0
- package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.js +5 -0
- package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.d.ts +3 -0
- package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.js +5 -0
- package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/common/index.d.ts +4 -0
- package/dist/esm/utilities/voi/colorbar/common/index.js +5 -0
- package/dist/esm/utilities/voi/colorbar/common/index.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.d.ts +3 -0
- package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.js +5 -0
- package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.d.ts +3 -0
- package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.js +10 -0
- package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/common/isRangeValid.d.ts +3 -0
- package/dist/esm/utilities/voi/colorbar/common/isRangeValid.js +5 -0
- package/dist/esm/utilities/voi/colorbar/common/isRangeValid.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.d.ts +6 -0
- package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js +8 -0
- package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/enums/index.d.ts +1 -0
- package/dist/esm/utilities/voi/colorbar/enums/index.js +2 -0
- package/dist/esm/utilities/voi/colorbar/enums/index.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/index.d.ts +6 -0
- package/dist/esm/utilities/voi/colorbar/index.js +5 -0
- package/dist/esm/utilities/voi/colorbar/index.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.d.ts +12 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.d.ts +11 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.d.ts +4 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.d.ts +7 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.d.ts +4 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.d.ts +7 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.d.ts +8 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.d.ts +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.d.ts +5 -0
- package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.js.map +1 -0
- package/dist/esm/utilities/voi/colorbar/types/index.d.ts +8 -0
- package/dist/esm/utilities/voi/colorbar/types/index.js +2 -0
- package/dist/esm/utilities/voi/colorbar/types/index.js.map +1 -0
- package/dist/esm/utilities/voi/index.d.ts +2 -0
- package/dist/esm/utilities/voi/index.js +3 -0
- package/dist/esm/utilities/voi/index.js.map +1 -0
- package/dist/esm/widgets/Widget.d.ts +17 -0
- package/dist/esm/widgets/Widget.js +67 -0
- package/dist/esm/widgets/Widget.js.map +1 -0
- package/dist/esm/widgets/types/WidgetProps.d.ts +4 -0
- package/dist/esm/widgets/types/WidgetProps.js +2 -0
- package/dist/esm/widgets/types/WidgetProps.js.map +1 -0
- package/dist/esm/widgets/types/WidgetSize.d.ts +4 -0
- package/dist/esm/widgets/types/WidgetSize.js +2 -0
- package/dist/esm/widgets/types/WidgetSize.js.map +1 -0
- package/dist/esm/widgets/types/index.d.ts +2 -0
- package/dist/esm/widgets/types/index.js +2 -0
- package/dist/esm/widgets/types/index.js.map +1 -0
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +3 -3
- package/src/tools/displayTools/SegmentationDisplayTool.ts +1 -2
- package/src/utilities/getVOIMultipliers.ts +33 -0
- package/src/utilities/index.ts +2 -0
- package/src/utilities/math/vec3/interpolateVec3.ts +20 -0
- package/src/utilities/viewport/isViewportPreScaled.ts +3 -1
- package/src/utilities/voi/colorbar/Colorbar.ts +367 -0
- package/src/utilities/voi/colorbar/ColorbarCanvas.ts +287 -0
- package/src/utilities/voi/colorbar/ColorbarTicks.ts +500 -0
- package/src/utilities/voi/colorbar/ViewportColorbar.ts +194 -0
- package/src/utilities/voi/colorbar/common/areColorbarRangesEqual.ts +10 -0
- package/src/utilities/voi/colorbar/common/areColorbarSizesEqual.ts +7 -0
- package/src/utilities/voi/colorbar/common/index.ts +4 -0
- package/src/utilities/voi/colorbar/common/isColorbarSizeValid.ts +7 -0
- package/src/utilities/voi/colorbar/common/isRangeTextPositionValid.ts +16 -0
- package/src/utilities/voi/colorbar/common/isRangeValid.ts +7 -0
- package/src/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.ts +11 -0
- package/src/utilities/voi/colorbar/enums/index.ts +1 -0
- package/src/utilities/voi/colorbar/index.ts +8 -0
- package/src/utilities/voi/colorbar/types/ColorbarCanvasProps.ts +14 -0
- package/src/utilities/voi/colorbar/types/ColorbarCommonProps.ts +23 -0
- package/src/utilities/voi/colorbar/types/ColorbarImageRange.ts +4 -0
- package/src/utilities/voi/colorbar/types/ColorbarProps.ts +8 -0
- package/src/utilities/voi/colorbar/types/ColorbarSize.ts +4 -0
- package/src/utilities/voi/colorbar/types/ColorbarTicksProps.ts +8 -0
- package/src/utilities/voi/colorbar/types/ColorbarTicksStyle.ts +8 -0
- package/src/utilities/voi/colorbar/types/ColorbarVOIRange.ts +3 -0
- package/src/utilities/voi/colorbar/types/ViewportColorbarProps.ts +6 -0
- package/src/utilities/voi/colorbar/types/index.ts +8 -0
- package/src/utilities/voi/index.ts +3 -0
- package/src/widgets/Widget.ts +169 -0
- package/src/widgets/types/WidgetProps.ts +4 -0
- package/src/widgets/types/WidgetSize.ts +4 -0
- 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.
|
|
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.
|
|
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": "
|
|
55
|
+
"gitHead": "7db76a5a136c78e1532f0abe90f4c2f9613ac68f"
|
|
56
56
|
}
|
|
@@ -149,11 +149,10 @@ class SegmentationDisplayTool extends BaseTool {
|
|
|
149
149
|
[Representations.Labelmap]: labelmapDisplay,
|
|
150
150
|
[Representations.Contour]: contourDisplay,
|
|
151
151
|
[Representations.Surface]: surfaceDisplay,
|
|
152
|
-
}
|
|
152
|
+
};
|
|
153
153
|
|
|
154
154
|
const display = renderers[representation.type];
|
|
155
155
|
|
|
156
|
-
|
|
157
156
|
for (const viewport of toolGroupViewports) {
|
|
158
157
|
const renderedViewport = display.render(
|
|
159
158
|
viewport as Types.IVolumeViewport,
|
|
@@ -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 };
|
package/src/utilities/index.ts
CHANGED
|
@@ -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
|
|
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 };
|