@cornerstonejs/tools 1.32.3 → 1.34.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/eventListeners/index.d.ts +2 -2
- package/dist/cjs/eventListeners/index.js +2 -1
- package/dist/cjs/eventListeners/index.js.map +1 -1
- package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.d.ts +5 -0
- package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.js +143 -0
- package/dist/cjs/eventListeners/segmentation/imageChangeEventListener.js.map +1 -0
- package/dist/cjs/eventListeners/segmentation/index.d.ts +2 -1
- package/dist/cjs/eventListeners/segmentation/index.js +3 -1
- package/dist/cjs/eventListeners/segmentation/index.js.map +1 -1
- package/dist/cjs/eventListeners/segmentation/segmentationDataModifiedEventListener.js +31 -5
- package/dist/cjs/eventListeners/segmentation/segmentationDataModifiedEventListener.js.map +1 -1
- package/dist/cjs/store/SynchronizerManager/Synchronizer.d.ts +1 -0
- package/dist/cjs/store/SynchronizerManager/Synchronizer.js +17 -1
- package/dist/cjs/store/SynchronizerManager/Synchronizer.js.map +1 -1
- package/dist/cjs/store/addEnabledElement.js +1 -0
- package/dist/cjs/store/addEnabledElement.js.map +1 -1
- package/dist/cjs/store/removeEnabledElement.js +2 -0
- package/dist/cjs/store/removeEnabledElement.js.map +1 -1
- package/dist/cjs/synchronizers/callbacks/areViewportsCoplanar .d.ts +1 -1
- package/dist/cjs/synchronizers/callbacks/areViewportsCoplanar .js.map +1 -1
- package/dist/cjs/synchronizers/callbacks/{stackImageSyncCallback.d.ts → imageSliceSyncCallback.d.ts} +1 -1
- package/dist/cjs/synchronizers/callbacks/{stackImageSyncCallback.js → imageSliceSyncCallback.js} +8 -4
- package/dist/cjs/synchronizers/callbacks/{stackImageSyncCallback.js.map → imageSliceSyncCallback.js.map} +1 -1
- package/dist/cjs/synchronizers/index.d.ts +3 -2
- package/dist/cjs/synchronizers/index.js +5 -3
- package/dist/cjs/synchronizers/index.js.map +1 -1
- package/dist/cjs/synchronizers/synchronizers/{createStackImageSynchronizer.d.ts → createImageSliceSynchronizer.d.ts} +1 -1
- package/dist/cjs/synchronizers/synchronizers/createImageSliceSynchronizer.js +17 -0
- package/dist/cjs/synchronizers/synchronizers/createImageSliceSynchronizer.js.map +1 -0
- package/dist/cjs/synchronizers/synchronizers/index.d.ts +3 -2
- package/dist/cjs/synchronizers/synchronizers/index.js +5 -3
- package/dist/cjs/synchronizers/synchronizers/index.js.map +1 -1
- package/dist/cjs/tools/annotation/CircleROITool.js +3 -1
- package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -1
- package/dist/cjs/tools/annotation/EllipticalROITool.js +1 -1
- package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -1
- package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.js +23 -10
- package/dist/cjs/tools/displayTools/Labelmap/addLabelmapToElement.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.d.ts +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js +36 -22
- package/dist/cjs/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
- package/dist/cjs/tools/displayTools/Labelmap/validateRepresentationData.js +6 -5
- package/dist/cjs/tools/displayTools/Labelmap/validateRepresentationData.js.map +1 -1
- package/dist/cjs/tools/segmentation/BrushTool.js +40 -45
- package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/CircleScissorsTool.d.ts +4 -2
- package/dist/cjs/tools/segmentation/CircleScissorsTool.js +18 -17
- package/dist/cjs/tools/segmentation/CircleScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/PaintFillTool.js +28 -5
- package/dist/cjs/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/RectangleScissorsTool.d.ts +3 -1
- package/dist/cjs/tools/segmentation/RectangleScissorsTool.js +15 -16
- package/dist/cjs/tools/segmentation/RectangleScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/SphereScissorsTool.d.ts +4 -2
- package/dist/cjs/tools/segmentation/SphereScissorsTool.js +20 -20
- package/dist/cjs/tools/segmentation/SphereScissorsTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseCircle.d.ts +2 -10
- package/dist/cjs/tools/segmentation/strategies/eraseCircle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseRectangle.d.ts +4 -8
- package/dist/cjs/tools/segmentation/strategies/eraseRectangle.js +4 -20
- package/dist/cjs/tools/segmentation/strategies/eraseRectangle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.d.ts +2 -10
- package/dist/cjs/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillCircle.d.ts +3 -11
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js +57 -32
- package/dist/cjs/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.d.ts +2 -7
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.js +16 -8
- package/dist/cjs/tools/segmentation/strategies/fillRectangle.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/fillSphere.d.ts +2 -10
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js +31 -17
- package/dist/cjs/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.d.ts +9 -0
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js +43 -0
- package/dist/cjs/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -0
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
- package/dist/cjs/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
- package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts +5 -0
- package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.js +13 -0
- package/dist/cjs/tools/segmentation/strategies/utils/stackVolumeCheck.js.map +1 -0
- package/dist/cjs/types/LabelmapToolOperationData.d.ts +14 -0
- package/dist/cjs/types/LabelmapToolOperationData.js +3 -0
- package/dist/cjs/types/LabelmapToolOperationData.js.map +1 -0
- package/dist/cjs/types/LabelmapTypes.d.ts +5 -1
- package/dist/cjs/types/index.d.ts +2 -1
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.d.ts +7 -9
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.js +19 -11
- package/dist/cjs/utilities/math/ellipse/pointInEllipse.js.map +1 -1
- package/dist/esm/eventListeners/index.js +2 -2
- package/dist/esm/eventListeners/index.js.map +1 -1
- package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js +115 -0
- package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js.map +1 -0
- package/dist/esm/eventListeners/segmentation/index.js +2 -1
- package/dist/esm/eventListeners/segmentation/index.js.map +1 -1
- package/dist/esm/eventListeners/segmentation/segmentationDataModifiedEventListener.js +32 -6
- package/dist/esm/eventListeners/segmentation/segmentationDataModifiedEventListener.js.map +1 -1
- package/dist/esm/store/SynchronizerManager/Synchronizer.js +17 -1
- package/dist/esm/store/SynchronizerManager/Synchronizer.js.map +1 -1
- package/dist/esm/store/addEnabledElement.js +2 -1
- package/dist/esm/store/addEnabledElement.js.map +1 -1
- package/dist/esm/store/removeEnabledElement.js +2 -0
- package/dist/esm/store/removeEnabledElement.js.map +1 -1
- package/dist/esm/synchronizers/callbacks/areViewportsCoplanar .js.map +1 -1
- package/dist/esm/synchronizers/callbacks/{stackImageSyncCallback.js → imageSliceSyncCallback.js} +8 -4
- package/dist/esm/synchronizers/callbacks/imageSliceSyncCallback.js.map +1 -0
- package/dist/esm/synchronizers/index.js +3 -2
- package/dist/esm/synchronizers/index.js.map +1 -1
- package/dist/esm/synchronizers/synchronizers/createImageSliceSynchronizer.js +11 -0
- package/dist/esm/synchronizers/synchronizers/createImageSliceSynchronizer.js.map +1 -0
- package/dist/esm/synchronizers/synchronizers/index.js +3 -2
- package/dist/esm/synchronizers/synchronizers/index.js.map +1 -1
- package/dist/esm/tools/annotation/CircleROITool.js +4 -2
- package/dist/esm/tools/annotation/CircleROITool.js.map +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js +24 -11
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +36 -22
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js.map +1 -1
- package/dist/esm/tools/displayTools/Labelmap/validateRepresentationData.js +6 -5
- package/dist/esm/tools/displayTools/Labelmap/validateRepresentationData.js.map +1 -1
- package/dist/esm/tools/segmentation/BrushTool.js +38 -29
- package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/esm/tools/segmentation/CircleScissorsTool.js +27 -15
- package/dist/esm/tools/segmentation/CircleScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/PaintFillTool.js +28 -5
- package/dist/esm/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/esm/tools/segmentation/RectangleScissorsTool.js +26 -17
- package/dist/esm/tools/segmentation/RectangleScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/SphereScissorsTool.js +28 -17
- package/dist/esm/tools/segmentation/SphereScissorsTool.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseCircle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseRectangle.js +4 -20
- package/dist/esm/tools/segmentation/strategies/eraseRectangle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/eraseSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillCircle.js +56 -31
- package/dist/esm/tools/segmentation/strategies/fillCircle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillRectangle.js +16 -8
- package/dist/esm/tools/segmentation/strategies/fillRectangle.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/fillSphere.js +32 -18
- package/dist/esm/tools/segmentation/strategies/fillSphere.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +40 -0
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js.map +1 -0
- package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js +2 -2
- package/dist/esm/tools/segmentation/strategies/utils/isWithinThreshold.js.map +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/stackVolumeCheck.js +9 -0
- package/dist/esm/tools/segmentation/strategies/utils/stackVolumeCheck.js.map +1 -0
- package/dist/esm/types/LabelmapToolOperationData.js +2 -0
- package/dist/esm/types/LabelmapToolOperationData.js.map +1 -0
- package/dist/esm/utilities/math/ellipse/pointInEllipse.js +19 -11
- package/dist/esm/utilities/math/ellipse/pointInEllipse.js.map +1 -1
- package/dist/types/eventListeners/index.d.ts +2 -2
- package/dist/types/eventListeners/index.d.ts.map +1 -1
- package/dist/types/eventListeners/segmentation/imageChangeEventListener.d.ts +6 -0
- package/dist/types/eventListeners/segmentation/imageChangeEventListener.d.ts.map +1 -0
- package/dist/types/eventListeners/segmentation/index.d.ts +2 -1
- package/dist/types/eventListeners/segmentation/index.d.ts.map +1 -1
- package/dist/types/eventListeners/segmentation/segmentationDataModifiedEventListener.d.ts.map +1 -1
- package/dist/types/store/SynchronizerManager/Synchronizer.d.ts +1 -0
- package/dist/types/store/SynchronizerManager/Synchronizer.d.ts.map +1 -1
- package/dist/types/store/addEnabledElement.d.ts.map +1 -1
- package/dist/types/store/removeEnabledElement.d.ts.map +1 -1
- package/dist/types/synchronizers/callbacks/areViewportsCoplanar .d.ts +1 -1
- package/dist/types/synchronizers/callbacks/areViewportsCoplanar .d.ts.map +1 -1
- package/dist/types/synchronizers/callbacks/{stackImageSyncCallback.d.ts → imageSliceSyncCallback.d.ts} +2 -2
- package/dist/types/synchronizers/callbacks/imageSliceSyncCallback.d.ts.map +1 -0
- package/dist/types/synchronizers/index.d.ts +3 -2
- package/dist/types/synchronizers/index.d.ts.map +1 -1
- package/dist/types/synchronizers/synchronizers/createImageSliceSynchronizer.d.ts +3 -0
- package/dist/types/synchronizers/synchronizers/createImageSliceSynchronizer.d.ts.map +1 -0
- package/dist/types/synchronizers/synchronizers/index.d.ts +3 -2
- package/dist/types/synchronizers/synchronizers/index.d.ts.map +1 -1
- package/dist/types/tools/annotation/CircleROITool.d.ts.map +1 -1
- package/dist/types/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -1
- package/dist/types/tools/displayTools/Labelmap/addLabelmapToElement.d.ts.map +1 -1
- package/dist/types/tools/displayTools/Labelmap/labelmapDisplay.d.ts +1 -1
- package/dist/types/tools/displayTools/Labelmap/labelmapDisplay.d.ts.map +1 -1
- package/dist/types/tools/displayTools/Labelmap/validateRepresentationData.d.ts.map +1 -1
- package/dist/types/tools/segmentation/BrushTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/CircleScissorsTool.d.ts +4 -2
- package/dist/types/tools/segmentation/CircleScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/PaintFillTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/RectangleScissorsTool.d.ts +3 -1
- package/dist/types/tools/segmentation/RectangleScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/SphereScissorsTool.d.ts +4 -2
- package/dist/types/tools/segmentation/SphereScissorsTool.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts +2 -10
- package/dist/types/tools/segmentation/strategies/eraseCircle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/eraseRectangle.d.ts +4 -8
- package/dist/types/tools/segmentation/strategies/eraseRectangle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts +2 -10
- package/dist/types/tools/segmentation/strategies/eraseSphere.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillCircle.d.ts +3 -11
- package/dist/types/tools/segmentation/strategies/fillCircle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts +2 -7
- package/dist/types/tools/segmentation/strategies/fillRectangle.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/fillSphere.d.ts +2 -10
- package/dist/types/tools/segmentation/strategies/fillSphere.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts +10 -0
- package/dist/types/tools/segmentation/strategies/utils/getStrategyData.d.ts.map +1 -0
- package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts +2 -2
- package/dist/types/tools/segmentation/strategies/utils/isWithinThreshold.d.ts.map +1 -1
- package/dist/types/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts +6 -0
- package/dist/types/tools/segmentation/strategies/utils/stackVolumeCheck.d.ts.map +1 -0
- package/dist/types/types/LabelmapToolOperationData.d.ts +15 -0
- package/dist/types/types/LabelmapToolOperationData.d.ts.map +1 -0
- package/dist/types/types/LabelmapTypes.d.ts +5 -1
- package/dist/types/types/LabelmapTypes.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +2 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts +7 -9
- package/dist/types/utilities/math/ellipse/pointInEllipse.d.ts.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +3 -3
- package/src/eventListeners/index.ts +2 -0
- package/src/eventListeners/segmentation/imageChangeEventListener.ts +215 -0
- package/src/eventListeners/segmentation/index.ts +2 -0
- package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +70 -9
- package/src/store/SynchronizerManager/Synchronizer.ts +28 -3
- package/src/store/addEnabledElement.ts +2 -0
- package/src/store/removeEnabledElement.ts +3 -0
- package/src/synchronizers/callbacks/areViewportsCoplanar .ts +2 -2
- package/src/synchronizers/callbacks/{stackImageSyncCallback.ts → imageSliceSyncCallback.ts} +16 -8
- package/src/synchronizers/index.ts +5 -1
- package/src/synchronizers/synchronizers/{createStackImageSynchronizer.ts → createImageSliceSynchronizer.ts} +8 -5
- package/src/synchronizers/synchronizers/index.ts +4 -1
- package/src/tools/annotation/CircleROITool.ts +5 -5
- package/src/tools/annotation/EllipticalROITool.ts +1 -1
- package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +51 -22
- package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +65 -35
- package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +17 -11
- package/src/tools/segmentation/BrushTool.ts +78 -39
- package/src/tools/segmentation/CircleScissorsTool.ts +46 -29
- package/src/tools/segmentation/PaintFillTool.ts +45 -8
- package/src/tools/segmentation/RectangleScissorsTool.ts +41 -31
- package/src/tools/segmentation/SphereScissorsTool.ts +46 -28
- package/src/tools/segmentation/strategies/eraseCircle.ts +3 -11
- package/src/tools/segmentation/strategies/eraseRectangle.ts +13 -42
- package/src/tools/segmentation/strategies/eraseSphere.ts +2 -10
- package/src/tools/segmentation/strategies/fillCircle.ts +93 -61
- package/src/tools/segmentation/strategies/fillRectangle.ts +31 -22
- package/src/tools/segmentation/strategies/fillSphere.ts +51 -41
- package/src/tools/segmentation/strategies/utils/getStrategyData.ts +58 -0
- package/src/tools/segmentation/strategies/utils/isWithinThreshold.ts +3 -2
- package/src/tools/segmentation/strategies/utils/stackVolumeCheck.ts +33 -0
- package/src/types/LabelmapToolOperationData.ts +27 -0
- package/src/types/LabelmapTypes.ts +16 -1
- package/src/types/index.ts +8 -0
- package/src/utilities/math/ellipse/pointInEllipse.ts +43 -22
- package/dist/cjs/synchronizers/synchronizers/createStackImageSynchronizer.js +0 -15
- package/dist/cjs/synchronizers/synchronizers/createStackImageSynchronizer.js.map +0 -1
- package/dist/esm/synchronizers/callbacks/stackImageSyncCallback.js.map +0 -1
- package/dist/esm/synchronizers/synchronizers/createStackImageSynchronizer.js +0 -9
- package/dist/esm/synchronizers/synchronizers/createStackImageSynchronizer.js.map +0 -1
- package/dist/types/synchronizers/callbacks/stackImageSyncCallback.d.ts.map +0 -1
- package/dist/types/synchronizers/synchronizers/createStackImageSynchronizer.d.ts +0 -3
- package/dist/types/synchronizers/synchronizers/createStackImageSynchronizer.d.ts.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/tools",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.34.0",
|
|
4
4
|
"description": "Cornerstone3D Tools",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"types": "dist/types/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.34.0",
|
|
33
33
|
"comlink": "^4.4.1",
|
|
34
34
|
"lodash.clonedeep": "4.5.0",
|
|
35
35
|
"lodash.get": "^4.4.2"
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"type": "individual",
|
|
54
54
|
"url": "https://ohif.org/donate"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "a1bdeb0d4083453272dbca7e8c5f445d30d1fd4c"
|
|
57
57
|
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
segmentationRepresentationModifiedEventListener,
|
|
8
8
|
segmentationRepresentationRemovedEventListener,
|
|
9
9
|
segmentationModifiedListener,
|
|
10
|
+
imageChangeEventListener,
|
|
10
11
|
} from './segmentation';
|
|
11
12
|
import {
|
|
12
13
|
annotationSelectionListener,
|
|
@@ -23,6 +24,7 @@ export {
|
|
|
23
24
|
segmentationModifiedListener,
|
|
24
25
|
segmentationRepresentationRemovedEventListener,
|
|
25
26
|
segmentationDataModifiedEventListener,
|
|
27
|
+
imageChangeEventListener,
|
|
26
28
|
annotationSelectionListener,
|
|
27
29
|
annotationModifiedListener,
|
|
28
30
|
};
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import {
|
|
2
|
+
StackViewport,
|
|
3
|
+
getEnabledElement,
|
|
4
|
+
Enums,
|
|
5
|
+
getEnabledElementByIds,
|
|
6
|
+
cache,
|
|
7
|
+
utilities,
|
|
8
|
+
Types,
|
|
9
|
+
metaData,
|
|
10
|
+
} from '@cornerstonejs/core';
|
|
11
|
+
import { getToolGroupForViewport } from '../../store/ToolGroupManager';
|
|
12
|
+
import Representations from '../../enums/SegmentationRepresentations';
|
|
13
|
+
import * as SegmentationState from '../../stateManagement/segmentation/segmentationState';
|
|
14
|
+
import { LabelmapSegmentationDataStack } from '../../types/LabelmapTypes';
|
|
15
|
+
import { isVolumeSegmentation } from '../../tools/segmentation/strategies/utils/stackVolumeCheck';
|
|
16
|
+
import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
|
|
17
|
+
import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
|
|
18
|
+
import triggerSegmentationRender from '../../utilities/segmentation/triggerSegmentationRender';
|
|
19
|
+
|
|
20
|
+
const enable = function (element: HTMLDivElement): void {
|
|
21
|
+
const { viewport } = getEnabledElement(element);
|
|
22
|
+
|
|
23
|
+
if (!(viewport instanceof StackViewport)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
element.addEventListener(
|
|
28
|
+
Enums.Events.STACK_NEW_IMAGE,
|
|
29
|
+
_imageChangeEventListener as EventListener
|
|
30
|
+
);
|
|
31
|
+
// this listener handles the segmentation modifications
|
|
32
|
+
element.addEventListener(
|
|
33
|
+
Enums.Events.IMAGE_RENDERED,
|
|
34
|
+
_imageChangeEventListener as EventListener
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const disable = function (element: HTMLDivElement): void {
|
|
39
|
+
const { viewport } = getEnabledElement(element);
|
|
40
|
+
|
|
41
|
+
if (!(viewport instanceof StackViewport)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
element.removeEventListener(
|
|
46
|
+
Enums.Events.STACK_NEW_IMAGE,
|
|
47
|
+
_imageChangeEventListener as EventListener
|
|
48
|
+
);
|
|
49
|
+
element.removeEventListener(
|
|
50
|
+
Enums.Events.IMAGE_RENDERED,
|
|
51
|
+
_imageChangeEventListener as EventListener
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* When the image is rendered, check what tools can be rendered for this element.
|
|
57
|
+
*
|
|
58
|
+
* - First we get all tools which are active, passive or enabled on the element.
|
|
59
|
+
* - If any of these tools have a `renderAnnotation` method, then we render them.
|
|
60
|
+
* - Note that these tools don't necessarily have to be instances of `AnnotationTool`,
|
|
61
|
+
* Any tool may register a `renderAnnotation` method (e.g. a tool that displays an overlay).
|
|
62
|
+
*
|
|
63
|
+
* @param evt - The normalized IMAGE_RENDERED event.
|
|
64
|
+
*/
|
|
65
|
+
function _imageChangeEventListener(evt) {
|
|
66
|
+
const eventData = evt.detail;
|
|
67
|
+
const { viewportId, renderingEngineId } = eventData;
|
|
68
|
+
const { viewport } = getEnabledElementByIds(
|
|
69
|
+
viewportId,
|
|
70
|
+
renderingEngineId
|
|
71
|
+
) as { viewport: Types.IStackViewport };
|
|
72
|
+
|
|
73
|
+
const toolGroup = getToolGroupForViewport(viewportId, renderingEngineId);
|
|
74
|
+
let toolGroupSegmentationRepresentations =
|
|
75
|
+
SegmentationState.getSegmentationRepresentations(toolGroup.id) || [];
|
|
76
|
+
|
|
77
|
+
toolGroupSegmentationRepresentations =
|
|
78
|
+
toolGroupSegmentationRepresentations.filter(
|
|
79
|
+
(representation) => representation.type === Representations.Labelmap
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
if (!toolGroupSegmentationRepresentations?.length) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const segmentationRepresentations = {};
|
|
87
|
+
toolGroupSegmentationRepresentations.forEach((representation) => {
|
|
88
|
+
const segmentation = SegmentationState.getSegmentation(
|
|
89
|
+
representation.segmentationId
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
if (!segmentation) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const labelmapData =
|
|
97
|
+
segmentation.representationData[Representations.Labelmap];
|
|
98
|
+
|
|
99
|
+
if (isVolumeSegmentation(labelmapData)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const { imageIdReferenceMap } =
|
|
104
|
+
labelmapData as LabelmapSegmentationDataStack;
|
|
105
|
+
|
|
106
|
+
segmentationRepresentations[representation.segmentationRepresentationUID] =
|
|
107
|
+
{
|
|
108
|
+
imageIdReferenceMap,
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const representationList = Object.keys(segmentationRepresentations);
|
|
113
|
+
const currentImageId = viewport.getCurrentImageId();
|
|
114
|
+
const actors = viewport.getActors();
|
|
115
|
+
|
|
116
|
+
actors.forEach((actor) => {
|
|
117
|
+
if (!representationList.includes(actor.uid)) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const segmentationActor = actor.actor;
|
|
121
|
+
|
|
122
|
+
const { imageIdReferenceMap } = segmentationRepresentations[actor.uid];
|
|
123
|
+
|
|
124
|
+
const derivedImageId = imageIdReferenceMap.get(currentImageId);
|
|
125
|
+
|
|
126
|
+
const segmentationImageData = segmentationActor.getMapper().getInputData();
|
|
127
|
+
|
|
128
|
+
if (!derivedImageId) {
|
|
129
|
+
// this means that this slice doesn't have a segmentation for this representation
|
|
130
|
+
// this can be a case where the segmentation was added to certain slices only
|
|
131
|
+
// so we can keep the actor but empty out the imageData
|
|
132
|
+
const scalarArray = vtkDataArray.newInstance({
|
|
133
|
+
name: 'Pixels',
|
|
134
|
+
numberOfComponents: 1,
|
|
135
|
+
values: new Uint8Array(segmentationImageData.getNumberOfPoints()),
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const imageData = vtkImageData.newInstance();
|
|
139
|
+
imageData.getPointData().setScalars(scalarArray);
|
|
140
|
+
segmentationActor.getMapper().setInputData(imageData);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const derivedImage = cache.getImage(derivedImageId);
|
|
145
|
+
|
|
146
|
+
const { origin, dimensions, spacing, direction } =
|
|
147
|
+
viewport.getImageDataMetadata(derivedImage);
|
|
148
|
+
|
|
149
|
+
segmentationImageData.setOrigin(origin);
|
|
150
|
+
segmentationImageData.modified();
|
|
151
|
+
|
|
152
|
+
if (
|
|
153
|
+
segmentationImageData.getDimensions()[0] !== dimensions[0] ||
|
|
154
|
+
segmentationImageData.getDimensions()[1] !== dimensions[1]
|
|
155
|
+
) {
|
|
156
|
+
// IMPORTANT: Not sure why we can't just update the dimensions
|
|
157
|
+
// and the orientation of the image data and then call modified
|
|
158
|
+
// I tried calling modified on everything, but seems like we should remove
|
|
159
|
+
// and add the actor again below
|
|
160
|
+
viewport.removeActors([actor.uid]);
|
|
161
|
+
viewport.addImages(
|
|
162
|
+
[
|
|
163
|
+
{
|
|
164
|
+
imageId: derivedImageId,
|
|
165
|
+
actorUID: actor.uid,
|
|
166
|
+
callback: ({ imageActor }) => {
|
|
167
|
+
const scalarArray = vtkDataArray.newInstance({
|
|
168
|
+
name: 'Pixels',
|
|
169
|
+
numberOfComponents: 1,
|
|
170
|
+
values: [...derivedImage.getPixelData()],
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const imageData = vtkImageData.newInstance();
|
|
174
|
+
|
|
175
|
+
imageData.setDimensions(dimensions[0], dimensions[1], 1);
|
|
176
|
+
imageData.setSpacing(spacing);
|
|
177
|
+
imageData.setDirection(direction);
|
|
178
|
+
imageData.setOrigin(origin);
|
|
179
|
+
imageData.getPointData().setScalars(scalarArray);
|
|
180
|
+
|
|
181
|
+
imageActor.getMapper().setInputData(imageData);
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
true,
|
|
186
|
+
false
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
triggerSegmentationRender(toolGroup.id);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
utilities.updateVTKImageDataWithCornerstoneImage(
|
|
194
|
+
segmentationImageData,
|
|
195
|
+
derivedImage
|
|
196
|
+
);
|
|
197
|
+
viewport.render();
|
|
198
|
+
|
|
199
|
+
// This is put here to make sure that the segmentation is rendered
|
|
200
|
+
// for the initial image as well after that we don't need it since
|
|
201
|
+
// stack new image is called when changing slices
|
|
202
|
+
if (evt.type === Enums.Events.IMAGE_RENDERED) {
|
|
203
|
+
// unsubscribe after the initial render
|
|
204
|
+
viewport.element.removeEventListener(
|
|
205
|
+
Enums.Events.IMAGE_RENDERED,
|
|
206
|
+
_imageChangeEventListener as EventListener
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export default {
|
|
213
|
+
enable,
|
|
214
|
+
disable,
|
|
215
|
+
};
|
|
@@ -2,10 +2,12 @@ import segmentationRepresentationModifiedEventListener from './segmentationRepre
|
|
|
2
2
|
import segmentationDataModifiedEventListener from './segmentationDataModifiedEventListener';
|
|
3
3
|
import segmentationRepresentationRemovedEventListener from './segmentationRepresentationRemovedEventListener';
|
|
4
4
|
import segmentationModifiedListener from './segmentationModifiedEventListener';
|
|
5
|
+
import imageChangeEventListener from './imageChangeEventListener';
|
|
5
6
|
|
|
6
7
|
export {
|
|
7
8
|
segmentationRepresentationModifiedEventListener,
|
|
8
9
|
segmentationDataModifiedEventListener,
|
|
9
10
|
segmentationRepresentationRemovedEventListener,
|
|
10
11
|
segmentationModifiedListener,
|
|
12
|
+
imageChangeEventListener,
|
|
11
13
|
};
|
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
cache,
|
|
3
|
+
getEnabledElementByIds,
|
|
4
|
+
utilities as csUtils,
|
|
5
|
+
} from '@cornerstonejs/core';
|
|
2
6
|
|
|
3
7
|
import triggerSegmentationRender from '../../utilities/segmentation/triggerSegmentationRender';
|
|
4
8
|
import SegmentationRepresentations from '../../enums/SegmentationRepresentations';
|
|
5
9
|
import * as SegmentationState from '../../stateManagement/segmentation/segmentationState';
|
|
6
10
|
import { SegmentationDataModifiedEventType } from '../../types/EventTypes';
|
|
11
|
+
import {
|
|
12
|
+
LabelmapSegmentationDataStack,
|
|
13
|
+
LabelmapSegmentationDataVolume,
|
|
14
|
+
} from '../../types/LabelmapTypes';
|
|
15
|
+
import { isVolumeSegmentation } from '../../tools/segmentation/strategies/utils/stackVolumeCheck';
|
|
16
|
+
import { getToolGroup } from '../../store/ToolGroupManager';
|
|
7
17
|
|
|
8
18
|
/** A callback function that is called when the segmentation data is modified which
|
|
9
19
|
* often is as a result of tool interactions e.g., scissors, eraser, etc.
|
|
@@ -16,11 +26,19 @@ const onSegmentationDataModified = function (
|
|
|
16
26
|
const { representationData, type } =
|
|
17
27
|
SegmentationState.getSegmentation(segmentationId);
|
|
18
28
|
|
|
19
|
-
|
|
20
|
-
|
|
29
|
+
const toolGroupIds =
|
|
30
|
+
SegmentationState.getToolGroupIdsWithSegmentation(segmentationId);
|
|
31
|
+
|
|
32
|
+
if (type !== SegmentationRepresentations.Labelmap) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
`onSegmentationDataModified: representationType ${type} not supported yet`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (isVolumeSegmentation(representationData[type])) {
|
|
21
39
|
// get the volume from cache, we need the openGLTexture to be updated to GPU
|
|
22
40
|
const segmentationVolume = cache.getVolume(
|
|
23
|
-
representationData[type].volumeId
|
|
41
|
+
(representationData[type] as LabelmapSegmentationDataVolume).volumeId
|
|
24
42
|
);
|
|
25
43
|
|
|
26
44
|
if (!segmentationVolume) {
|
|
@@ -45,12 +63,55 @@ const onSegmentationDataModified = function (
|
|
|
45
63
|
|
|
46
64
|
// Trigger modified on the imageData to update the image
|
|
47
65
|
imageData.modified();
|
|
48
|
-
toolGroupIds =
|
|
49
|
-
SegmentationState.getToolGroupIdsWithSegmentation(segmentationId);
|
|
50
66
|
} else {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
67
|
+
toolGroupIds.forEach((toolGroupId) => {
|
|
68
|
+
const toolGroupSegmentationRepresentations =
|
|
69
|
+
SegmentationState.getSegmentationRepresentations(toolGroupId);
|
|
70
|
+
|
|
71
|
+
const toolGroup = getToolGroup(toolGroupId);
|
|
72
|
+
const viewportsInfo = toolGroup.getViewportsInfo();
|
|
73
|
+
|
|
74
|
+
toolGroupSegmentationRepresentations.forEach((representation) => {
|
|
75
|
+
if (representation.segmentationId !== segmentationId) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
viewportsInfo.forEach(({ viewportId, renderingEngineId }) => {
|
|
80
|
+
const viewport = getEnabledElementByIds(
|
|
81
|
+
viewportId,
|
|
82
|
+
renderingEngineId
|
|
83
|
+
).viewport;
|
|
84
|
+
|
|
85
|
+
const actorEntry = viewport.getActor(
|
|
86
|
+
representation.segmentationRepresentationUID
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
if (!actorEntry) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const currentImageId = viewport.getCurrentImageId();
|
|
94
|
+
|
|
95
|
+
const segImageData = actorEntry.actor.getMapper().getInputData();
|
|
96
|
+
|
|
97
|
+
const { imageIdReferenceMap } = representationData[
|
|
98
|
+
type
|
|
99
|
+
] as LabelmapSegmentationDataStack;
|
|
100
|
+
|
|
101
|
+
const currentSegmentationImageId =
|
|
102
|
+
imageIdReferenceMap.get(currentImageId);
|
|
103
|
+
|
|
104
|
+
const segmentationImage = cache.getImage(currentSegmentationImageId);
|
|
105
|
+
segImageData.modified();
|
|
106
|
+
|
|
107
|
+
// update the cache with the new image data
|
|
108
|
+
csUtils.updateVTKImageDataWithCornerstoneImage(
|
|
109
|
+
segImageData,
|
|
110
|
+
segmentationImage
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
54
115
|
}
|
|
55
116
|
|
|
56
117
|
toolGroupIds.forEach((toolGroupId) => {
|
|
@@ -17,6 +17,7 @@ class Synchronizer {
|
|
|
17
17
|
//
|
|
18
18
|
private _enabled: boolean;
|
|
19
19
|
private _eventName: string;
|
|
20
|
+
private _auxiliaryEventNames: string[];
|
|
20
21
|
private _eventHandler: ISynchronizerEventHandler;
|
|
21
22
|
private _ignoreFiredEvents: boolean;
|
|
22
23
|
private _sourceViewports: Array<Types.IViewportId>;
|
|
@@ -38,6 +39,7 @@ class Synchronizer {
|
|
|
38
39
|
this._sourceViewports = [];
|
|
39
40
|
this._targetViewports = [];
|
|
40
41
|
this._options = options || {};
|
|
42
|
+
this._auxiliaryEventNames = this._options.auxiliaryEventNames || [];
|
|
41
43
|
|
|
42
44
|
//
|
|
43
45
|
this.id = synchronizerId;
|
|
@@ -89,11 +91,26 @@ class Synchronizer {
|
|
|
89
91
|
|
|
90
92
|
const { renderingEngineId, viewportId } = viewportInfo;
|
|
91
93
|
|
|
92
|
-
const
|
|
94
|
+
const viewport =
|
|
93
95
|
getRenderingEngine(renderingEngineId).getViewport(viewportId);
|
|
94
96
|
|
|
95
|
-
|
|
97
|
+
if (!viewport) {
|
|
98
|
+
console.warn(
|
|
99
|
+
`Synchronizer.addSource: No viewport for ${renderingEngineId} ${viewportId}`
|
|
100
|
+
);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const element = viewport.element;
|
|
105
|
+
|
|
96
106
|
element.addEventListener(this._eventName, this._onEvent.bind(this));
|
|
107
|
+
|
|
108
|
+
if (this._auxiliaryEventNames.length) {
|
|
109
|
+
this._auxiliaryEventNames.forEach((eventName) => {
|
|
110
|
+
element.addEventListener(eventName, this._onEvent.bind(this));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
97
114
|
this._updateDisableHandlers();
|
|
98
115
|
|
|
99
116
|
this._sourceViewports.push(viewportInfo);
|
|
@@ -157,8 +174,16 @@ class Synchronizer {
|
|
|
157
174
|
const element = _getViewportElement(viewportInfo);
|
|
158
175
|
|
|
159
176
|
this._sourceViewports.splice(index, 1);
|
|
160
|
-
|
|
177
|
+
|
|
178
|
+
//@ts-ignore
|
|
161
179
|
element.removeEventListener(this._eventName, this._eventHandler);
|
|
180
|
+
|
|
181
|
+
if (this._auxiliaryEventNames) {
|
|
182
|
+
this._auxiliaryEventNames.forEach((eventName) => {
|
|
183
|
+
//@ts-ignore
|
|
184
|
+
element.removeEventListener(eventName, this._eventHandler);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
162
187
|
this._updateDisableHandlers();
|
|
163
188
|
}
|
|
164
189
|
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
wheelEventListener,
|
|
5
5
|
touchEventListeners,
|
|
6
6
|
keyEventListener,
|
|
7
|
+
imageChangeEventListener,
|
|
7
8
|
} from '../eventListeners';
|
|
8
9
|
import {
|
|
9
10
|
imageRenderedEventDispatcher,
|
|
@@ -41,6 +42,7 @@ export default function addEnabledElement(
|
|
|
41
42
|
wheelEventListener.enable(element);
|
|
42
43
|
touchEventListeners.enable(element);
|
|
43
44
|
keyEventListener.enable(element);
|
|
45
|
+
imageChangeEventListener.enable(element);
|
|
44
46
|
|
|
45
47
|
// Dispatchers: renderer
|
|
46
48
|
imageRenderedEventDispatcher.enable(element);
|
|
@@ -23,6 +23,7 @@ import { removeAnnotation } from '../stateManagement';
|
|
|
23
23
|
import getSynchronizersForViewport from './SynchronizerManager/getSynchronizersForViewport';
|
|
24
24
|
import getToolGroupForViewport from './ToolGroupManager/getToolGroupForViewport';
|
|
25
25
|
import { annotationRenderingEngine } from '../utilities/triggerAnnotationRender';
|
|
26
|
+
import imageChangeEventListener from '../eventListeners/segmentation/imageChangeEventListener';
|
|
26
27
|
|
|
27
28
|
const VIEWPORT_ELEMENT = 'viewport-element';
|
|
28
29
|
|
|
@@ -43,7 +44,9 @@ function removeEnabledElement(
|
|
|
43
44
|
wheelEventListener.disable(element);
|
|
44
45
|
touchEventListeners.disable(element);
|
|
45
46
|
keyEventListener.disable(element);
|
|
47
|
+
|
|
46
48
|
// labelmap
|
|
49
|
+
imageChangeEventListener.disable(element);
|
|
47
50
|
|
|
48
51
|
// Dispatchers: renderer
|
|
49
52
|
imageRenderedEventDispatcher.disable(element);
|
|
@@ -2,8 +2,8 @@ import { vec3 } from 'gl-matrix';
|
|
|
2
2
|
import { Types } from '@cornerstonejs/core';
|
|
3
3
|
|
|
4
4
|
export default function areViewportsCoplanar(
|
|
5
|
-
viewport1: Types.IStackViewport,
|
|
6
|
-
viewport2: Types.IStackViewport
|
|
5
|
+
viewport1: Types.IStackViewport | Types.IVolumeViewport,
|
|
6
|
+
viewport2: Types.IStackViewport | Types.IVolumeViewport
|
|
7
7
|
): boolean {
|
|
8
8
|
const { viewPlaneNormal: viewPlaneNormal1 } = viewport1.getCamera();
|
|
9
9
|
const { viewPlaneNormal: viewPlaneNormal2 } = viewport2.getCamera();
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
Types,
|
|
5
5
|
metaData,
|
|
6
6
|
utilities,
|
|
7
|
+
VolumeViewport,
|
|
7
8
|
} from '@cornerstonejs/core';
|
|
8
9
|
import { Synchronizer } from '../../store';
|
|
9
10
|
import { jumpToSlice } from '../../utilities';
|
|
@@ -37,7 +38,7 @@ const getSpatialRegistration = (targetId, sourceId) =>
|
|
|
37
38
|
* the same as sourceViewport.
|
|
38
39
|
* @param cameraModifiedEvent - The CAMERA_MODIFIED event.
|
|
39
40
|
*/
|
|
40
|
-
export default async function
|
|
41
|
+
export default async function imageSliceSyncCallback(
|
|
41
42
|
synchronizerInstance: Synchronizer,
|
|
42
43
|
sourceViewport: Types.IViewportId,
|
|
43
44
|
targetViewport: Types.IViewportId
|
|
@@ -49,9 +50,9 @@ export default async function stackImageSyncCallback(
|
|
|
49
50
|
);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
const sViewport = renderingEngine.getViewport(
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
const sViewport = renderingEngine.getViewport(sourceViewport.viewportId) as
|
|
54
|
+
| Types.IVolumeViewport
|
|
55
|
+
| Types.IStackViewport;
|
|
55
56
|
|
|
56
57
|
const options = synchronizerInstance.getOptions(targetViewport.viewportId);
|
|
57
58
|
|
|
@@ -59,9 +60,9 @@ export default async function stackImageSyncCallback(
|
|
|
59
60
|
return;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
const tViewport = renderingEngine.getViewport(
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
const tViewport = renderingEngine.getViewport(targetViewport.viewportId) as
|
|
64
|
+
| Types.IVolumeViewport
|
|
65
|
+
| Types.IStackViewport;
|
|
65
66
|
|
|
66
67
|
const imageId1 = sViewport.getCurrentImageId();
|
|
67
68
|
const imagePlaneModule1 = metaData.get('imagePlaneModule', imageId1);
|
|
@@ -116,12 +117,19 @@ export default async function stackImageSyncCallback(
|
|
|
116
117
|
targetImageIds
|
|
117
118
|
);
|
|
118
119
|
|
|
120
|
+
let imageIndexToSet = closestImageIdIndex2.index;
|
|
121
|
+
if (tViewport instanceof VolumeViewport) {
|
|
122
|
+
// since in case of volume viewport our stack is reversed, we should
|
|
123
|
+
// reverse the index as well
|
|
124
|
+
imageIndexToSet = targetImageIds.length - closestImageIdIndex2.index - 1;
|
|
125
|
+
}
|
|
126
|
+
|
|
119
127
|
if (
|
|
120
128
|
closestImageIdIndex2.index !== -1 &&
|
|
121
129
|
tViewport.getCurrentImageIdIndex() !== closestImageIdIndex2.index
|
|
122
130
|
) {
|
|
123
131
|
await jumpToSlice(tViewport.element, {
|
|
124
|
-
imageIndex:
|
|
132
|
+
imageIndex: imageIndexToSet,
|
|
125
133
|
});
|
|
126
134
|
}
|
|
127
135
|
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import createCameraPositionSynchronizer from './synchronizers/createCameraPositionSynchronizer';
|
|
2
2
|
import createVOISynchronizer from './synchronizers/createVOISynchronizer';
|
|
3
3
|
import createZoomPanSynchronizer from './synchronizers/createZoomPanSynchronizer';
|
|
4
|
-
import
|
|
4
|
+
import createImageSliceSynchronizer from './synchronizers/createImageSliceSynchronizer';
|
|
5
|
+
|
|
6
|
+
// for backward compatibility
|
|
7
|
+
const createStackImageSynchronizer = createImageSliceSynchronizer;
|
|
5
8
|
|
|
6
9
|
export {
|
|
7
10
|
createCameraPositionSynchronizer,
|
|
8
11
|
createVOISynchronizer,
|
|
9
12
|
createZoomPanSynchronizer,
|
|
13
|
+
createImageSliceSynchronizer,
|
|
10
14
|
createStackImageSynchronizer,
|
|
11
15
|
};
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
import { createSynchronizer } from '../../store/SynchronizerManager';
|
|
2
2
|
import { Enums } from '@cornerstonejs/core';
|
|
3
|
-
import
|
|
3
|
+
import imageSliceSyncCallback from '../callbacks/imageSliceSyncCallback';
|
|
4
4
|
import Synchronizer from '../../store/SynchronizerManager/Synchronizer';
|
|
5
5
|
|
|
6
|
-
const { STACK_NEW_IMAGE } = Enums.Events;
|
|
6
|
+
const { STACK_NEW_IMAGE, VOLUME_NEW_IMAGE } = Enums.Events;
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* A helper that creates a new `Synchronizer` which listens to the `STACK_NEW_IMAGE`
|
|
10
|
-
* rendering event and calls the `
|
|
10
|
+
* rendering event and calls the `ImageSliceSyncCallback`.
|
|
11
11
|
*
|
|
12
12
|
* @param synchronizerName - The name of the synchronizer.
|
|
13
13
|
* @returns A new `Synchronizer` instance.
|
|
14
14
|
*/
|
|
15
|
-
export default function
|
|
15
|
+
export default function createImageSliceSynchronizer(
|
|
16
16
|
synchronizerName: string
|
|
17
17
|
): Synchronizer {
|
|
18
18
|
const stackImageSynchronizer = createSynchronizer(
|
|
19
19
|
synchronizerName,
|
|
20
20
|
STACK_NEW_IMAGE,
|
|
21
|
-
|
|
21
|
+
imageSliceSyncCallback,
|
|
22
|
+
{
|
|
23
|
+
auxiliaryEventNames: [VOLUME_NEW_IMAGE],
|
|
24
|
+
}
|
|
22
25
|
);
|
|
23
26
|
|
|
24
27
|
return stackImageSynchronizer;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import createCameraPositionSynchronizer from './createCameraPositionSynchronizer';
|
|
2
2
|
import createVOISynchronizer from './createVOISynchronizer';
|
|
3
3
|
import createZoomPanSynchronizer from './createZoomPanSynchronizer';
|
|
4
|
-
import
|
|
4
|
+
import createImageSliceSynchronizer from './createImageSliceSynchronizer';
|
|
5
5
|
|
|
6
|
+
// for backward compatibility
|
|
7
|
+
const createStackImageSynchronizer = createImageSliceSynchronizer;
|
|
6
8
|
export {
|
|
7
9
|
createCameraPositionSynchronizer,
|
|
8
10
|
createVOISynchronizer,
|
|
9
11
|
createZoomPanSynchronizer,
|
|
12
|
+
createImageSliceSynchronizer,
|
|
10
13
|
createStackImageSynchronizer,
|
|
11
14
|
};
|
|
@@ -55,10 +55,7 @@ import {
|
|
|
55
55
|
import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds';
|
|
56
56
|
import { pointInShapeCallback } from '../../utilities';
|
|
57
57
|
import { StyleSpecifier } from '../../types/AnnotationStyle';
|
|
58
|
-
import {
|
|
59
|
-
ModalityUnitOptions,
|
|
60
|
-
getModalityUnit,
|
|
61
|
-
} from '../../utilities/getModalityUnit';
|
|
58
|
+
import { getModalityUnit } from '../../utilities/getModalityUnit';
|
|
62
59
|
import { isViewportPreScaled } from '../../utilities/viewport/isViewportPreScaled';
|
|
63
60
|
import {
|
|
64
61
|
getCanvasCircleCorners,
|
|
@@ -986,7 +983,10 @@ class CircleROITool extends AnnotationTool {
|
|
|
986
983
|
|
|
987
984
|
const pointsInShape = pointInShapeCallback(
|
|
988
985
|
imageData,
|
|
989
|
-
(pointLPS
|
|
986
|
+
(pointLPS) =>
|
|
987
|
+
pointInEllipse(ellipseObj, pointLPS, {
|
|
988
|
+
fast: true,
|
|
989
|
+
}),
|
|
990
990
|
this.configuration.statsCalculator.statsCallback,
|
|
991
991
|
boundsIJK
|
|
992
992
|
);
|
|
@@ -1114,7 +1114,7 @@ class EllipticalROITool extends AnnotationTool {
|
|
|
1114
1114
|
|
|
1115
1115
|
const pointsInShape = pointInShapeCallback(
|
|
1116
1116
|
imageData,
|
|
1117
|
-
(pointLPS
|
|
1117
|
+
(pointLPS) => pointInEllipse(ellipseObj, pointLPS, { fast: true }),
|
|
1118
1118
|
this.configuration.statsCalculator.statsCallback,
|
|
1119
1119
|
boundsIJK
|
|
1120
1120
|
);
|