@cornerstonejs/tools 4.22.13 → 5.0.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/esm/config.d.ts +4 -0
- package/dist/esm/drawingSvg/drawPath.d.ts +3 -0
- package/dist/esm/drawingSvg/drawPath.js +4 -1
- package/dist/esm/eventListeners/keyboard/keyDownListener.js +2 -2
- package/dist/esm/eventListeners/mouse/getMouseEventPoints.d.ts +1 -1
- package/dist/esm/eventListeners/mouse/getMouseEventPoints.js +19 -1
- package/dist/esm/eventListeners/mouse/mouseDoubleClickListener.js +8 -1
- package/dist/esm/eventListeners/mouse/mouseDownListener.js +37 -5
- package/dist/esm/eventListeners/mouse/mouseMoveListener.js +3 -0
- package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js +60 -92
- package/dist/esm/eventListeners/segmentation/labelmap/onLabelmapSegmentationDataModified.js +49 -21
- package/dist/esm/eventListeners/segmentation/labelmap/performStackLabelmapUpdate.js +7 -13
- package/dist/esm/eventListeners/segmentation/labelmap/performVolumeLabelmapUpdate.js +44 -18
- package/dist/esm/eventListeners/touch/getTouchEventPoints.js +27 -4
- package/dist/esm/eventListeners/touch/touchStartListener.js +27 -9
- package/dist/esm/eventListeners/wheel/wheelListener.js +5 -1
- package/dist/esm/init.js +2 -0
- package/dist/esm/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js +10 -4
- package/dist/esm/stateManagement/segmentation/SegmentationRenderingEngine.js +23 -20
- package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.d.ts +12 -0
- package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.js +7 -0
- package/dist/esm/stateManagement/segmentation/SegmentationStateManager.d.ts +1 -11
- package/dist/esm/stateManagement/segmentation/SegmentationStateManager.js +28 -166
- package/dist/esm/stateManagement/segmentation/addColorLUT.js +7 -1
- package/dist/esm/stateManagement/segmentation/getCurrentLabelmapImageIdForViewport.js +16 -1
- package/dist/esm/stateManagement/segmentation/helpers/clearSegmentValue.js +9 -7
- package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.d.ts +1 -1
- package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.js +3 -2
- package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.d.ts +5 -0
- package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.js +58 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.d.ts +52 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.js +246 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.d.ts +1 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.js +1 -0
- package/dist/esm/stateManagement/segmentation/helpers/normalizeSegmentationInput.js +11 -1
- package/dist/esm/stateManagement/segmentation/internalAddSegmentationRepresentation.js +3 -3
- package/dist/esm/stateManagement/segmentation/labelmapModel/index.d.ts +9 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/index.js +7 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.d.ts +54 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.js +224 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.d.ts +6 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.js +39 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.d.ts +23 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.js +269 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.d.ts +15 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.js +160 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.d.ts +4 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.js +42 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.d.ts +11 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.js +73 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.d.ts +17 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.js +75 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.d.ts +5 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.js +106 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentModel.d.ts +11 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentModel.js +19 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentationModel.d.ts +12 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentationModel.js +23 -0
- package/dist/esm/stateManagement/segmentation/removeSegmentationRepresentations.js +6 -10
- package/dist/esm/stateManagement/segmentation/segmentIndex.js +24 -0
- package/dist/esm/stateManagement/segmentation/segmentationEventManager.js +2 -9
- package/dist/esm/stateManagement/segmentation/segmentationState.d.ts +2 -1
- package/dist/esm/stateManagement/segmentation/segmentationState.js +4 -1
- package/dist/esm/store/state.js +2 -1
- package/dist/esm/synchronizers/callbacks/imageSliceSyncCallback.js +12 -3
- package/dist/esm/synchronizers/callbacks/presentationViewSyncCallback.js +5 -2
- package/dist/esm/synchronizers/callbacks/zoomPanSyncCallback.js +51 -3
- package/dist/esm/tools/AdvancedMagnifyTool.js +1 -1
- package/dist/esm/tools/CrosshairsTool.js +5 -5
- package/dist/esm/tools/OrientationControllerTool.js +1 -1
- package/dist/esm/tools/OrientationMarkerTool.js +4 -4
- package/dist/esm/tools/PanTool.js +26 -3
- package/dist/esm/tools/PlanarRotateTool.js +19 -4
- package/dist/esm/tools/ReferenceCursors.js +7 -1
- package/dist/esm/tools/SculptorTool/CircleSculptCursor.js +1 -1
- package/dist/esm/tools/TrackballRotateTool.js +3 -2
- package/dist/esm/tools/VolumeCroppingTool.js +3 -2
- package/dist/esm/tools/WindowLevelTool.d.ts +2 -1
- package/dist/esm/tools/WindowLevelTool.js +48 -4
- package/dist/esm/tools/ZoomTool.d.ts +8 -0
- package/dist/esm/tools/ZoomTool.js +92 -11
- package/dist/esm/tools/annotation/AngleTool.js +33 -31
- package/dist/esm/tools/annotation/ArrowAnnotateTool.js +30 -28
- package/dist/esm/tools/annotation/BidirectionalTool.js +51 -49
- package/dist/esm/tools/annotation/CircleROITool.js +49 -44
- package/dist/esm/tools/annotation/CobbAngleTool.js +1 -1
- package/dist/esm/tools/annotation/DragProbeTool.js +1 -1
- package/dist/esm/tools/annotation/ETDRSGridTool.js +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js +42 -37
- package/dist/esm/tools/annotation/HeightTool.js +1 -1
- package/dist/esm/tools/annotation/KeyImageTool.js +11 -11
- package/dist/esm/tools/annotation/LabelTool.js +37 -35
- package/dist/esm/tools/annotation/LengthTool.js +35 -33
- package/dist/esm/tools/annotation/LivewireContourSegmentationTool.js +6 -4
- package/dist/esm/tools/annotation/LivewireContourTool.js +1 -1
- package/dist/esm/tools/annotation/PlanarFreehandContourSegmentationTool.js +6 -4
- package/dist/esm/tools/annotation/PlanarFreehandROITool.js +1 -1
- package/dist/esm/tools/annotation/ProbeTool.js +51 -46
- package/dist/esm/tools/annotation/RectangleROITool.js +42 -37
- package/dist/esm/tools/annotation/RegionSegmentPlusTool.js +1 -1
- package/dist/esm/tools/annotation/RegionSegmentTool.js +1 -1
- package/dist/esm/tools/annotation/SplineContourSegmentationTool.js +1 -1
- package/dist/esm/tools/annotation/SplineROITool.js +51 -49
- package/dist/esm/tools/annotation/UltrasoundDirectionalTool.js +1 -1
- package/dist/esm/tools/annotation/UltrasoundPleuraBLineTool/UltrasoundPleuraBLineTool.js +57 -55
- package/dist/esm/tools/annotation/VideoRedactionTool.js +1 -1
- package/dist/esm/tools/base/AnnotationDisplayTool.js +9 -6
- package/dist/esm/tools/base/AnnotationTool.js +2 -1
- package/dist/esm/tools/base/BaseTool.js +16 -10
- package/dist/esm/tools/base/ContourSegmentationBaseTool.js +1 -1
- package/dist/esm/tools/base/GrowCutBaseTool.js +2 -2
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -4
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js +15 -85
- package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.d.ts +5 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.js +191 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.d.ts +4 -3
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +48 -209
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.d.ts +3 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.js +51 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.d.ts +4 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.js +3 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.d.ts +14 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.js +143 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.d.ts +40 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.js +79 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.d.ts +3 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.js +18 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.d.ts +9 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.js +56 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.d.ts +11 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.js +35 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.d.ts +48 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.js +0 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.d.ts +13 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.js +34 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.d.ts +2 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.js +1 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.d.ts +8 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.js +18 -0
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js +2 -5
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.d.ts +3 -0
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.js +16 -0
- package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.d.ts +2 -0
- package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.js +135 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.d.ts +16 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.js +267 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.d.ts +27 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.js +185 -0
- package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.d.ts +1 -0
- package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.js +16 -0
- package/dist/esm/tools/segmentation/BrushTool.d.ts +9 -2
- package/dist/esm/tools/segmentation/BrushTool.js +109 -25
- package/dist/esm/tools/segmentation/CircleScissorsTool.js +13 -6
- package/dist/esm/tools/segmentation/LabelmapBaseTool.d.ts +2 -3
- package/dist/esm/tools/segmentation/LabelmapBaseTool.js +77 -38
- package/dist/esm/tools/segmentation/LabelmapEditWithContour.js +3 -3
- package/dist/esm/tools/segmentation/PaintFillTool.js +11 -4
- package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.d.ts +2 -0
- package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.js +16 -8
- package/dist/esm/tools/segmentation/RectangleScissorsTool.js +13 -6
- package/dist/esm/tools/segmentation/SegmentBidirectionalTool.js +63 -61
- package/dist/esm/tools/segmentation/SegmentSelectTool.js +4 -4
- package/dist/esm/tools/segmentation/SphereScissorsTool.js +5 -1
- package/dist/esm/tools/segmentation/strategies/BrushStrategy.d.ts +7 -0
- package/dist/esm/tools/segmentation/strategies/BrushStrategy.js +47 -24
- package/dist/esm/tools/segmentation/strategies/compositions/circularCursor.js +49 -15
- package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js +2 -2
- package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js +5 -1
- package/dist/esm/tools/segmentation/strategies/compositions/islandRemovalComposition.js +2 -2
- package/dist/esm/tools/segmentation/strategies/compositions/preview.js +2 -2
- package/dist/esm/tools/segmentation/strategies/compositions/setValue.js +14 -6
- package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.d.ts +4 -0
- package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.js +23 -0
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/handleUseSegmentCenterIndex.js +12 -11
- package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.d.ts +4 -0
- package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.js +41 -0
- package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.d.ts +3 -0
- package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.js +31 -0
- package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.d.ts +3 -0
- package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.js +38 -0
- package/dist/esm/tools/segmentation/utils/LazyBrushEditController.d.ts +19 -0
- package/dist/esm/tools/segmentation/utils/LazyBrushEditController.js +55 -0
- package/dist/esm/tools/segmentation/utils/lazyBrushPreview.d.ts +3 -0
- package/dist/esm/tools/segmentation/utils/lazyBrushPreview.js +34 -0
- package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.d.ts +3 -0
- package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.js +42 -0
- package/dist/esm/types/LabelmapToolOperationData.d.ts +5 -0
- package/dist/esm/types/LabelmapTypes.d.ts +29 -6
- package/dist/esm/types/SegmentationStateTypes.d.ts +4 -0
- package/dist/esm/utilities/calibrateImageSpacing.js +17 -2
- package/dist/esm/utilities/contours/AnnotationToPointData.js +1 -1
- package/dist/esm/utilities/getSphereBoundsInfo.js +5 -1
- package/dist/esm/utilities/getViewportICamera.d.ts +4 -0
- package/dist/esm/utilities/getViewportICamera.js +23 -0
- package/dist/esm/utilities/getViewportsForAnnotation.js +5 -1
- package/dist/esm/utilities/math/basic/BasicStatsCalculator.js +9 -7
- package/dist/esm/utilities/pointInSurroundingSphereCallback.js +8 -1
- package/dist/esm/utilities/segmentation/InterpolationManager/InterpolationManager.js +121 -118
- package/dist/esm/utilities/segmentation/SegmentStatsCalculator.js +5 -4
- package/dist/esm/utilities/segmentation/VolumetricCalculator.js +1 -1
- package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -1
- package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentation.js +1 -1
- package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentationVolume.js +11 -2
- package/dist/esm/utilities/segmentation/getSegmentIndexAtLabelmapBorder.js +36 -17
- package/dist/esm/utilities/segmentation/getSegmentIndexAtWorldPoint.js +42 -25
- package/dist/esm/utilities/segmentation/getUniqueSegmentIndices.js +3 -30
- package/dist/esm/utilities/segmentation/index.d.ts +2 -1
- package/dist/esm/utilities/segmentation/index.js +2 -1
- package/dist/esm/utilities/segmentation/utilsForWorker.js +2 -2
- package/dist/esm/utilities/segmentation/validateLabelmap.js +1 -1
- package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +0 -1
- package/dist/esm/utilities/touch/index.js +3 -2
- package/dist/esm/utilities/viewportCapabilities.d.ts +16 -0
- package/dist/esm/utilities/viewportCapabilities.js +18 -0
- package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.d.ts +1 -1
- package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.js +12 -4
- package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.d.ts +1 -1
- package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.js +11 -4
- package/dist/esm/utilities/viewportFilters/getViewportIdsWithToolToRender.js +1 -1
- package/dist/esm/utilities/viewportPresentation.d.ts +3 -0
- package/dist/esm/utilities/viewportPresentation.js +26 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +10 -10
|
@@ -14,4 +14,5 @@ import { updateLabelmapSegmentationImageReferences } from './updateLabelmapSegme
|
|
|
14
14
|
import { getStackSegmentationImageIdsForViewport } from './getStackSegmentationImageIdsForViewport';
|
|
15
15
|
import { getSegmentationRepresentation, getSegmentationRepresentations, getSegmentationRepresentationsBySegmentationId } from './getSegmentationRepresentation';
|
|
16
16
|
declare function destroy(): void;
|
|
17
|
-
|
|
17
|
+
declare function getDefaultSegmentationStateManager(): import("./SegmentationStateManager").default;
|
|
18
|
+
export { getColorLUT, getCurrentLabelmapImageIdForViewport, getCurrentLabelmapImageIdsForViewport, getNextColorLUTIndex, getSegmentation, getSegmentations, getStackSegmentationImageIdsForViewport, getViewportIdsWithSegmentation, getSegmentationRepresentation, getSegmentationRepresentations, getViewportSegmentationRepresentations, removeColorLUT, getViewportSegmentations, removeSegmentation, removeLabelmapRepresentation, removeContourRepresentation, removeSurfaceRepresentation, removeSegmentationRepresentation, removeAllSegmentationRepresentations, removeAllSegmentations, addColorLUT, addSegmentations, updateLabelmapSegmentationImageReferences, getSegmentationRepresentationsBySegmentationId, destroy, getDefaultSegmentationStateManager, };
|
|
@@ -17,4 +17,7 @@ import { defaultSegmentationStateManager } from './SegmentationStateManager';
|
|
|
17
17
|
function destroy() {
|
|
18
18
|
defaultSegmentationStateManager.resetState();
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
function getDefaultSegmentationStateManager() {
|
|
21
|
+
return defaultSegmentationStateManager;
|
|
22
|
+
}
|
|
23
|
+
export { getColorLUT, getCurrentLabelmapImageIdForViewport, getCurrentLabelmapImageIdsForViewport, getNextColorLUTIndex, getSegmentation, getSegmentations, getStackSegmentationImageIdsForViewport, getViewportIdsWithSegmentation, getSegmentationRepresentation, getSegmentationRepresentations, getViewportSegmentationRepresentations, removeColorLUT, getViewportSegmentations, removeSegmentation, removeLabelmapRepresentation, removeContourRepresentation, removeSurfaceRepresentation, removeSegmentationRepresentation, removeAllSegmentationRepresentations, removeAllSegmentations, addColorLUT, addSegmentations, updateLabelmapSegmentationImageReferences, getSegmentationRepresentationsBySegmentationId, destroy, getDefaultSegmentationStateManager, };
|
package/dist/esm/store/state.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { utilities } from '@cornerstonejs/core';
|
|
1
2
|
import svgNodeCache, { resetSvgNodeCache } from './svgNodeCache';
|
|
2
3
|
const defaultState = {
|
|
3
4
|
isInteractingWithTool: false,
|
|
@@ -22,7 +23,7 @@ let state = {
|
|
|
22
23
|
function resetCornerstoneToolsState() {
|
|
23
24
|
resetSvgNodeCache();
|
|
24
25
|
state = {
|
|
25
|
-
...
|
|
26
|
+
...utilities.deepClone({
|
|
26
27
|
...defaultState,
|
|
27
28
|
svgNodeCache: {},
|
|
28
29
|
}),
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { vec3, mat4 } from 'gl-matrix';
|
|
2
|
-
import { getRenderingEngine, metaData, utilities, VolumeViewport, } from '@cornerstonejs/core';
|
|
2
|
+
import { ActorRenderMode, getRenderingEngine, metaData, utilities, VolumeViewport, } from '@cornerstonejs/core';
|
|
3
3
|
import areViewportsCoplanar from './areViewportsCoplanar';
|
|
4
4
|
const getSpatialRegistration = (targetId, sourceId) => utilities.spatialRegistrationMetadataProvider.get('spatialRegistrationModule', targetId, sourceId);
|
|
5
|
+
function isVolumeSliceViewport(viewport) {
|
|
6
|
+
if (viewport instanceof VolumeViewport) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
const getDefaultActor = viewport.getDefaultActor;
|
|
10
|
+
const renderMode = getDefaultActor?.call(viewport)?.actorMapper?.renderMode;
|
|
11
|
+
return (renderMode === ActorRenderMode.CPU_VOLUME ||
|
|
12
|
+
renderMode === ActorRenderMode.VTK_VOLUME_SLICE);
|
|
13
|
+
}
|
|
5
14
|
export default async function imageSliceSyncCallback(synchronizerInstance, sourceViewport, targetViewport) {
|
|
6
15
|
const renderingEngine = getRenderingEngine(targetViewport.renderingEngineId);
|
|
7
16
|
if (!renderingEngine) {
|
|
@@ -39,11 +48,11 @@ export default async function imageSliceSyncCallback(synchronizerInstance, sourc
|
|
|
39
48
|
const targetImagePositionPatientWithRegistrationMatrix = vec3.transformMat4(vec3.create(), sourceImagePositionPatient, registrationMatrixMat4);
|
|
40
49
|
const closestImageIdIndex2 = _getClosestImageIdIndex(targetImagePositionPatientWithRegistrationMatrix, targetImageIds);
|
|
41
50
|
let imageIndexToSet = closestImageIdIndex2.index;
|
|
42
|
-
if (tViewport
|
|
51
|
+
if (isVolumeSliceViewport(tViewport)) {
|
|
43
52
|
imageIndexToSet = targetImageIds.length - closestImageIdIndex2.index - 1;
|
|
44
53
|
}
|
|
45
54
|
if (closestImageIdIndex2.index !== -1 &&
|
|
46
|
-
tViewport.getCurrentImageIdIndex() !==
|
|
55
|
+
tViewport.getCurrentImageIdIndex() !== imageIndexToSet) {
|
|
47
56
|
await utilities.jumpToSlice(tViewport.element, {
|
|
48
57
|
imageIndex: imageIndexToSet,
|
|
49
58
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getRenderingEngine } from '@cornerstonejs/core';
|
|
2
|
+
import { applyViewportPresentation, getViewportPresentation, } from '../../utilities/viewportPresentation';
|
|
2
3
|
export default function presentationViewSyncCallback(_synchronizerInstance, sourceViewport, targetViewport, _sourceEvent, options) {
|
|
3
4
|
const renderingEngine = getRenderingEngine(targetViewport.renderingEngineId);
|
|
4
5
|
if (!renderingEngine) {
|
|
@@ -6,7 +7,9 @@ export default function presentationViewSyncCallback(_synchronizerInstance, sour
|
|
|
6
7
|
}
|
|
7
8
|
const tViewport = renderingEngine.getViewport(targetViewport.viewportId);
|
|
8
9
|
const sViewport = renderingEngine.getViewport(sourceViewport.viewportId);
|
|
9
|
-
const presentationView = sViewport
|
|
10
|
-
tViewport
|
|
10
|
+
const presentationView = getViewportPresentation(sViewport, options);
|
|
11
|
+
if (!applyViewportPresentation(tViewport, presentationView)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
11
14
|
tViewport.render();
|
|
12
15
|
}
|
|
@@ -1,4 +1,43 @@
|
|
|
1
|
-
import { getRenderingEngine } from '@cornerstonejs/core';
|
|
1
|
+
import { getRenderingEngine, viewportHasPan, viewportHasZoom, viewportProjection, } from '@cornerstonejs/core';
|
|
2
|
+
const zoomPanProjectionSelector = {
|
|
3
|
+
pan: true,
|
|
4
|
+
zoom: true,
|
|
5
|
+
};
|
|
6
|
+
function viewportHasViewStateSetter(viewport) {
|
|
7
|
+
return (Boolean(viewport) &&
|
|
8
|
+
typeof viewport === 'object' &&
|
|
9
|
+
'setViewState' in viewport &&
|
|
10
|
+
typeof viewport.setViewState === 'function');
|
|
11
|
+
}
|
|
12
|
+
function syncProjectionZoomPan(sourceViewport, targetViewport, options) {
|
|
13
|
+
if (!viewportHasViewStateSetter(targetViewport)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const sourcePresentation = viewportProjection.getPresentation(sourceViewport, {
|
|
17
|
+
selector: zoomPanProjectionSelector,
|
|
18
|
+
});
|
|
19
|
+
if (!sourcePresentation) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const presentationPatch = {};
|
|
23
|
+
if (options?.syncZoom !== false &&
|
|
24
|
+
typeof sourcePresentation.zoom === 'number') {
|
|
25
|
+
presentationPatch.zoom = sourcePresentation.zoom;
|
|
26
|
+
}
|
|
27
|
+
if (options?.syncPan !== false && sourcePresentation.pan) {
|
|
28
|
+
presentationPatch.pan = sourcePresentation.pan;
|
|
29
|
+
}
|
|
30
|
+
if (presentationPatch.zoom === undefined &&
|
|
31
|
+
presentationPatch.pan === undefined) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const nextViewState = viewportProjection.withPresentation(targetViewport, presentationPatch);
|
|
35
|
+
if (!nextViewState) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
targetViewport.setViewState(nextViewState);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
2
41
|
export default function zoomPanSyncCallback(synchronizerInstance, sourceViewport, targetViewport) {
|
|
3
42
|
const renderingEngine = getRenderingEngine(targetViewport.renderingEngineId);
|
|
4
43
|
if (!renderingEngine) {
|
|
@@ -7,11 +46,20 @@ export default function zoomPanSyncCallback(synchronizerInstance, sourceViewport
|
|
|
7
46
|
const options = synchronizerInstance.getOptions(targetViewport.viewportId);
|
|
8
47
|
const tViewport = renderingEngine.getViewport(targetViewport.viewportId);
|
|
9
48
|
const sViewport = renderingEngine.getViewport(sourceViewport.viewportId);
|
|
10
|
-
|
|
49
|
+
const syncedByProjection = syncProjectionZoomPan(sViewport, tViewport, options);
|
|
50
|
+
if (syncedByProjection) {
|
|
51
|
+
tViewport.render();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (options?.syncZoom !== false &&
|
|
55
|
+
viewportHasZoom(sViewport) &&
|
|
56
|
+
viewportHasZoom(tViewport)) {
|
|
11
57
|
const srcZoom = sViewport.getZoom();
|
|
12
58
|
tViewport.setZoom(srcZoom);
|
|
13
59
|
}
|
|
14
|
-
if (options?.syncPan !== false
|
|
60
|
+
if (options?.syncPan !== false &&
|
|
61
|
+
viewportHasPan(sViewport) &&
|
|
62
|
+
viewportHasPan(tViewport)) {
|
|
15
63
|
const srcPan = sViewport.getPan();
|
|
16
64
|
tViewport.setPan(srcPan);
|
|
17
65
|
}
|
|
@@ -27,7 +27,6 @@ var AdvancedMagnifyToolActions;
|
|
|
27
27
|
const ADVANCED_MAGNIFY_TOOL_NAME = 'AdvancedMagnify';
|
|
28
28
|
const PARALLEL_THRESHOLD = 1 - CONSTANTS.EPSILON;
|
|
29
29
|
class AdvancedMagnifyTool extends AnnotationTool {
|
|
30
|
-
static { this.Actions = AdvancedMagnifyToolActions; }
|
|
31
30
|
constructor(toolProps = {}, defaultToolProps = {
|
|
32
31
|
supportedInteractionTypes: ['Mouse', 'Touch'],
|
|
33
32
|
configuration: {
|
|
@@ -455,6 +454,7 @@ class AdvancedMagnifyTool extends AnnotationTool {
|
|
|
455
454
|
}
|
|
456
455
|
}
|
|
457
456
|
}
|
|
457
|
+
AdvancedMagnifyTool.Actions = AdvancedMagnifyToolActions;
|
|
458
458
|
class AdvancedMagnifyViewportManager {
|
|
459
459
|
constructor() {
|
|
460
460
|
this.createViewport = (annotation, viewportInfo) => {
|
|
@@ -34,11 +34,6 @@ const OPERATION = {
|
|
|
34
34
|
SLAB: 3,
|
|
35
35
|
};
|
|
36
36
|
class CrosshairsTool extends AnnotationTool {
|
|
37
|
-
static { this.minimalModeExamples = new Map([
|
|
38
|
-
['Default', { enabled: false, lineLengthInPx: 40 }],
|
|
39
|
-
['Minimal 40px', { enabled: true, lineLengthInPx: 40 }],
|
|
40
|
-
['Minimal 80px', { enabled: true, lineLengthInPx: 80 }],
|
|
41
|
-
]); }
|
|
42
37
|
constructor(toolProps = {}, defaultToolProps = {
|
|
43
38
|
supportedInteractionTypes: ['Mouse'],
|
|
44
39
|
configuration: {
|
|
@@ -1765,6 +1760,11 @@ class CrosshairsTool extends AnnotationTool {
|
|
|
1765
1760
|
return data.handles.activeOperation === OPERATION.DRAG ? true : false;
|
|
1766
1761
|
}
|
|
1767
1762
|
}
|
|
1763
|
+
CrosshairsTool.minimalModeExamples = new Map([
|
|
1764
|
+
['Default', { enabled: false, lineLengthInPx: 40 }],
|
|
1765
|
+
['Minimal 40px', { enabled: true, lineLengthInPx: 40 }],
|
|
1766
|
+
['Minimal 80px', { enabled: true, lineLengthInPx: 80 }],
|
|
1767
|
+
]);
|
|
1768
1768
|
function getMinimalCrosshairConfig(configuration) {
|
|
1769
1769
|
const minimal = configuration?.minimal;
|
|
1770
1770
|
if (!minimal?.enabled) {
|
|
@@ -65,7 +65,6 @@ const ANIMATE_RESET_CAMERA_OPTIONS = {
|
|
|
65
65
|
resetToCenter: true,
|
|
66
66
|
};
|
|
67
67
|
class OrientationControllerTool extends BaseTool {
|
|
68
|
-
static { this.toolName = 'OrientationControllerTool'; }
|
|
69
68
|
constructor(toolProps = {}, defaultToolProps = {
|
|
70
69
|
supportedInteractionTypes: ['Mouse'],
|
|
71
70
|
configuration: {
|
|
@@ -451,4 +450,5 @@ class OrientationControllerTool extends BaseTool {
|
|
|
451
450
|
this.animationFrameHandles.set(viewportId, handle);
|
|
452
451
|
}
|
|
453
452
|
}
|
|
453
|
+
OrientationControllerTool.toolName = 'OrientationControllerTool';
|
|
454
454
|
export default OrientationControllerTool;
|
|
@@ -17,10 +17,6 @@ var OverlayMarkerType;
|
|
|
17
17
|
OverlayMarkerType[OverlayMarkerType["CUSTOM"] = 3] = "CUSTOM";
|
|
18
18
|
})(OverlayMarkerType || (OverlayMarkerType = {}));
|
|
19
19
|
class OrientationMarkerTool extends BaseTool {
|
|
20
|
-
static { this.CUBE = 1; }
|
|
21
|
-
static { this.AXIS = 2; }
|
|
22
|
-
static { this.VTPFILE = 3; }
|
|
23
|
-
static { this.OVERLAY_MARKER_TYPES = OverlayMarkerType; }
|
|
24
20
|
constructor(toolProps = {}, defaultToolProps = {
|
|
25
21
|
configuration: {
|
|
26
22
|
orientationWidget: {
|
|
@@ -282,5 +278,9 @@ class OrientationMarkerTool extends BaseTool {
|
|
|
282
278
|
return axes;
|
|
283
279
|
}
|
|
284
280
|
}
|
|
281
|
+
OrientationMarkerTool.CUBE = 1;
|
|
282
|
+
OrientationMarkerTool.AXIS = 2;
|
|
283
|
+
OrientationMarkerTool.VTPFILE = 3;
|
|
284
|
+
OrientationMarkerTool.OVERLAY_MARKER_TYPES = OverlayMarkerType;
|
|
285
285
|
OrientationMarkerTool.toolName = 'OrientationMarker';
|
|
286
286
|
export default OrientationMarkerTool;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseTool } from './base';
|
|
2
|
-
import { getEnabledElement, utilities as csUtils } from '@cornerstonejs/core';
|
|
2
|
+
import { getEnabledElement, utilities as csUtils, viewportHasPan, } from '@cornerstonejs/core';
|
|
3
3
|
class PanTool extends BaseTool {
|
|
4
4
|
constructor(toolProps = {}, defaultToolProps = {
|
|
5
5
|
supportedInteractionTypes: ['Mouse', 'Touch'],
|
|
@@ -7,7 +7,7 @@ class PanTool extends BaseTool {
|
|
|
7
7
|
limitToViewport: false,
|
|
8
8
|
ignoreX: false,
|
|
9
9
|
ignoreY: false,
|
|
10
|
-
ignoreZ: false
|
|
10
|
+
ignoreZ: false,
|
|
11
11
|
},
|
|
12
12
|
}) {
|
|
13
13
|
super(toolProps, defaultToolProps);
|
|
@@ -92,7 +92,19 @@ class PanTool extends BaseTool {
|
|
|
92
92
|
deltaPointsWorld[2] = 0;
|
|
93
93
|
}
|
|
94
94
|
const viewport = enabledElement.viewport;
|
|
95
|
-
const camera = viewport
|
|
95
|
+
const camera = getLegacyCamera(viewport);
|
|
96
|
+
if (!hasLegacyCameraPosition(camera)) {
|
|
97
|
+
if (!viewportHasPan(viewport)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const pan = viewport.getPan();
|
|
101
|
+
viewport.setPan([
|
|
102
|
+
pan[0] + deltaPointsCanvas[0],
|
|
103
|
+
pan[1] + deltaPointsCanvas[1],
|
|
104
|
+
]);
|
|
105
|
+
viewport.render();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
96
108
|
const { focalPoint, position } = camera;
|
|
97
109
|
if (this.configuration.limitToViewport &&
|
|
98
110
|
!this._checkImageInViewport(viewport, deltaPointsCanvas)) {
|
|
@@ -115,5 +127,16 @@ class PanTool extends BaseTool {
|
|
|
115
127
|
viewport.render();
|
|
116
128
|
}
|
|
117
129
|
}
|
|
130
|
+
function getLegacyCamera(viewport) {
|
|
131
|
+
const maybeViewport = viewport;
|
|
132
|
+
return typeof maybeViewport.getCamera === 'function'
|
|
133
|
+
? maybeViewport.getCamera()
|
|
134
|
+
: undefined;
|
|
135
|
+
}
|
|
136
|
+
function hasLegacyCameraPosition(camera) {
|
|
137
|
+
return Boolean(camera &&
|
|
138
|
+
Array.isArray(camera.focalPoint) &&
|
|
139
|
+
Array.isArray(camera.position));
|
|
140
|
+
}
|
|
118
141
|
PanTool.toolName = 'Pan';
|
|
119
142
|
export default PanTool;
|
|
@@ -2,6 +2,8 @@ import { BaseVolumeViewport, getEnabledElement } from '@cornerstonejs/core';
|
|
|
2
2
|
import { mat4, vec3 } from 'gl-matrix';
|
|
3
3
|
import { BaseTool } from './base';
|
|
4
4
|
import angleBetweenLines from '../utilities/math/angle/angleBetweenLines';
|
|
5
|
+
import getViewportICamera from '../utilities/getViewportICamera';
|
|
6
|
+
import { applyViewportPresentation, getViewportPresentation, } from '../utilities/viewportPresentation';
|
|
5
7
|
class PlanarRotateTool extends BaseTool {
|
|
6
8
|
constructor(toolProps = {}, defaultToolProps = {
|
|
7
9
|
supportedInteractionTypes: ['Mouse', 'Touch'],
|
|
@@ -24,13 +26,16 @@ class PlanarRotateTool extends BaseTool {
|
|
|
24
26
|
const startPointWorld = startPoints.world;
|
|
25
27
|
const enabledElement = getEnabledElement(element);
|
|
26
28
|
const { viewport } = enabledElement;
|
|
27
|
-
const camera = viewport
|
|
29
|
+
const camera = getViewportICamera(viewport);
|
|
28
30
|
const width = element.clientWidth;
|
|
29
31
|
const height = element.clientHeight;
|
|
30
32
|
const centerCanvas = [width * 0.5, height * 0.5];
|
|
31
33
|
const centerWorld = viewport.canvasToWorld(centerCanvas);
|
|
32
34
|
let angle = angleBetweenLines([startPointWorld, centerWorld], [centerWorld, currentPointWorld]);
|
|
33
35
|
const { viewPlaneNormal } = camera;
|
|
36
|
+
if (!viewPlaneNormal) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
34
39
|
const v1 = vec3.sub(vec3.create(), centerWorld, startPointWorld);
|
|
35
40
|
const v2 = vec3.sub(vec3.create(), centerWorld, currentPointWorld);
|
|
36
41
|
const cross = vec3.cross(vec3.create(), v1, v2);
|
|
@@ -43,7 +48,10 @@ class PlanarRotateTool extends BaseTool {
|
|
|
43
48
|
this.setAngle(viewport, angle);
|
|
44
49
|
}
|
|
45
50
|
setAngle(viewport, angle) {
|
|
46
|
-
const { viewPlaneNormal, viewUp } = viewport
|
|
51
|
+
const { viewPlaneNormal, viewUp } = getViewportICamera(viewport);
|
|
52
|
+
if (!viewPlaneNormal || !viewUp) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
47
55
|
if (viewport instanceof BaseVolumeViewport) {
|
|
48
56
|
const rotAngle = (((angle + 360) % 360) * Math.PI) / 180;
|
|
49
57
|
const rotMat = mat4.identity(new Float32Array(16));
|
|
@@ -52,10 +60,17 @@ class PlanarRotateTool extends BaseTool {
|
|
|
52
60
|
viewport.setCamera({ viewUp: rotatedViewUp });
|
|
53
61
|
}
|
|
54
62
|
else {
|
|
55
|
-
const
|
|
56
|
-
|
|
63
|
+
const presentation = getViewportPresentation(viewport);
|
|
64
|
+
if (!presentation) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const { rotation = 0 } = presentation;
|
|
68
|
+
const didApply = applyViewportPresentation(viewport, {
|
|
57
69
|
rotation: (rotation + angle + 360) % 360,
|
|
58
70
|
});
|
|
71
|
+
if (!didApply) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
59
74
|
}
|
|
60
75
|
viewport.render();
|
|
61
76
|
}
|
|
@@ -96,7 +96,13 @@ class ReferenceCursors extends AnnotationDisplayTool {
|
|
|
96
96
|
};
|
|
97
97
|
this.onCameraModified = (evt) => {
|
|
98
98
|
const eventDetail = evt.detail;
|
|
99
|
-
const {
|
|
99
|
+
const { previousCamera, camera } = eventDetail;
|
|
100
|
+
const element = eventDetail.element ||
|
|
101
|
+
evt.currentTarget ||
|
|
102
|
+
evt.target;
|
|
103
|
+
if (!element || !previousCamera) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
100
106
|
const enabledElement = getEnabledElement(element);
|
|
101
107
|
const viewport = enabledElement.viewport;
|
|
102
108
|
if (element !== this._elementWithCursor) {
|
|
@@ -11,7 +11,6 @@ class CircleSculptCursor {
|
|
|
11
11
|
maxToolSize: null,
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
static { this.shapeName = 'Circle'; }
|
|
15
14
|
renderShape(svgDrawingHelper, canvasLocation, options) {
|
|
16
15
|
const circleUID = '0';
|
|
17
16
|
drawCircleSvg(svgDrawingHelper, 'SculptorTool', circleUID, canvasLocation, this.toolInfo.toolSize, options);
|
|
@@ -74,4 +73,5 @@ class CircleSculptCursor {
|
|
|
74
73
|
return vec3.distance(point, mousePoint) < this.toolInfo.radius;
|
|
75
74
|
}
|
|
76
75
|
}
|
|
76
|
+
CircleSculptCursor.shapeName = 'Circle';
|
|
77
77
|
export default CircleSculptCursor;
|
|
@@ -4,6 +4,7 @@ import { eventTarget, getEnabledElement, getEnabledElementByIds, } from '@corner
|
|
|
4
4
|
import { mat4, vec3 } from 'gl-matrix';
|
|
5
5
|
import { BaseTool } from './base';
|
|
6
6
|
import { getToolGroup } from '../store/ToolGroupManager';
|
|
7
|
+
import { applyViewportPresentation, getViewportPresentation, } from '../utilities/viewportPresentation';
|
|
7
8
|
class TrackballRotateTool extends BaseTool {
|
|
8
9
|
constructor(toolProps = {}, defaultToolProps = {
|
|
9
10
|
supportedInteractionTypes: ['Mouse', 'Touch'],
|
|
@@ -64,9 +65,9 @@ class TrackballRotateTool extends BaseTool {
|
|
|
64
65
|
return;
|
|
65
66
|
}
|
|
66
67
|
const { viewport } = element;
|
|
67
|
-
const viewPresentation = viewport
|
|
68
|
+
const viewPresentation = getViewportPresentation(viewport);
|
|
68
69
|
viewport.resetCamera();
|
|
69
|
-
viewport
|
|
70
|
+
applyViewportPresentation(viewport, viewPresentation);
|
|
70
71
|
viewport.render();
|
|
71
72
|
});
|
|
72
73
|
resizeObserver.observe(element);
|
|
@@ -12,6 +12,7 @@ import { Events } from '../enums';
|
|
|
12
12
|
import { PLANEINDEX, SPHEREINDEX, NUM_CLIPPING_PLANES, extractVolumeDirectionVectors, parseCornerKey, copyClippingPlanes, } from '../utilities/volumeCropping';
|
|
13
13
|
import { addLine3DBetweenPoints, calculateAdaptiveSphereRadius, } from '../utilities/draw3D';
|
|
14
14
|
import { isDragOwnedBy } from '../utilities/interactionDragCoordinator';
|
|
15
|
+
import { applyViewportPresentation, getViewportPresentation, } from '../utilities/viewportPresentation';
|
|
15
16
|
class VolumeCroppingTool extends BaseTool {
|
|
16
17
|
constructor(toolProps = {}, defaultToolProps = {
|
|
17
18
|
configuration: {
|
|
@@ -708,9 +709,9 @@ class VolumeCroppingTool extends BaseTool {
|
|
|
708
709
|
return;
|
|
709
710
|
}
|
|
710
711
|
const { viewport } = element;
|
|
711
|
-
const viewPresentation = viewport
|
|
712
|
+
const viewPresentation = getViewportPresentation(viewport);
|
|
712
713
|
viewport.resetCamera();
|
|
713
|
-
viewport
|
|
714
|
+
applyViewportPresentation(viewport, viewPresentation);
|
|
714
715
|
viewport.render();
|
|
715
716
|
});
|
|
716
717
|
resizeObserver.observe(element);
|
|
@@ -19,12 +19,13 @@ declare class WindowLevelTool extends BaseTool {
|
|
|
19
19
|
lower: any;
|
|
20
20
|
upper: any;
|
|
21
21
|
};
|
|
22
|
-
getNewRange({ viewport, deltaPointsCanvas, volumeId, lower, upper }: {
|
|
22
|
+
getNewRange({ viewport, deltaPointsCanvas, volumeId, lower, upper, voiLutFunction, }: {
|
|
23
23
|
viewport: any;
|
|
24
24
|
deltaPointsCanvas: any;
|
|
25
25
|
volumeId: any;
|
|
26
26
|
lower: any;
|
|
27
27
|
upper: any;
|
|
28
|
+
voiLutFunction: any;
|
|
28
29
|
}): {
|
|
29
30
|
lower: number;
|
|
30
31
|
upper: number;
|
|
@@ -45,7 +45,10 @@ class WindowLevelTool extends BaseTool {
|
|
|
45
45
|
const { viewport } = enabledElement;
|
|
46
46
|
let volumeId, lower, upper, modality, newRange, viewportsContainingVolumeUID;
|
|
47
47
|
let isPreScaled = false;
|
|
48
|
-
const properties = viewport
|
|
48
|
+
const properties = getViewportVOIProperties(viewport);
|
|
49
|
+
if (!properties?.voiRange) {
|
|
50
|
+
throw new Error('Viewport is not a valid type');
|
|
51
|
+
}
|
|
49
52
|
if (viewport instanceof VolumeViewport) {
|
|
50
53
|
volumeId = viewport.getVolumeId();
|
|
51
54
|
viewportsContainingVolumeUID =
|
|
@@ -86,12 +89,13 @@ class WindowLevelTool extends BaseTool {
|
|
|
86
89
|
volumeId,
|
|
87
90
|
lower,
|
|
88
91
|
upper,
|
|
92
|
+
voiLutFunction: properties.VOILUTFunction,
|
|
89
93
|
});
|
|
90
94
|
}
|
|
91
95
|
if (newRange.lower >= newRange.upper) {
|
|
92
96
|
return;
|
|
93
97
|
}
|
|
94
|
-
viewport
|
|
98
|
+
setViewportVOIProperties(viewport, {
|
|
95
99
|
voiRange: newRange,
|
|
96
100
|
});
|
|
97
101
|
viewport.render();
|
|
@@ -120,7 +124,7 @@ class WindowLevelTool extends BaseTool {
|
|
|
120
124
|
upper = isPreScaled ? Math.max(upper, 0.1) : upper;
|
|
121
125
|
return { lower, upper };
|
|
122
126
|
}
|
|
123
|
-
getNewRange({ viewport, deltaPointsCanvas, volumeId, lower, upper }) {
|
|
127
|
+
getNewRange({ viewport, deltaPointsCanvas, volumeId, lower, upper, voiLutFunction, }) {
|
|
124
128
|
const multiplier = this._getMultiplierFromDynamicRange(viewport, volumeId) ||
|
|
125
129
|
DEFAULT_MULTIPLIER;
|
|
126
130
|
const wwDelta = deltaPointsCanvas[0] * multiplier;
|
|
@@ -129,7 +133,6 @@ class WindowLevelTool extends BaseTool {
|
|
|
129
133
|
windowWidth += wwDelta;
|
|
130
134
|
windowCenter += wcDelta;
|
|
131
135
|
windowWidth = Math.max(windowWidth, 1);
|
|
132
|
-
const voiLutFunction = viewport.getProperties().VOILUTFunction;
|
|
133
136
|
return utilities.windowLevel.toLowHighRange(windowWidth, windowCenter, voiLutFunction);
|
|
134
137
|
}
|
|
135
138
|
_getMultiplierFromDynamicRange(viewport, volumeId) {
|
|
@@ -206,3 +209,44 @@ class WindowLevelTool extends BaseTool {
|
|
|
206
209
|
}
|
|
207
210
|
WindowLevelTool.toolName = 'WindowLevel';
|
|
208
211
|
export default WindowLevelTool;
|
|
212
|
+
function getViewportVOIProperties(viewport) {
|
|
213
|
+
const legacyViewport = viewport;
|
|
214
|
+
if (typeof legacyViewport.getProperties === 'function') {
|
|
215
|
+
return legacyViewport.getProperties();
|
|
216
|
+
}
|
|
217
|
+
const target = getDataPresentationTarget(viewport);
|
|
218
|
+
if (!target) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const dataPresentation = target.viewport.getDisplaySetPresentation?.(target.dataId);
|
|
222
|
+
const defaultVOIRange = target.viewport.getDefaultVOIRange?.(target.dataId);
|
|
223
|
+
return {
|
|
224
|
+
...(dataPresentation || {}),
|
|
225
|
+
voiRange: dataPresentation?.voiRange ?? defaultVOIRange,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function setViewportVOIProperties(viewport, props) {
|
|
229
|
+
const legacyViewport = viewport;
|
|
230
|
+
if (typeof legacyViewport.setProperties === 'function') {
|
|
231
|
+
legacyViewport.setProperties(props);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const target = getDataPresentationTarget(viewport);
|
|
235
|
+
if (!target) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
target.viewport.setDisplaySetPresentation?.(target.dataId, props);
|
|
239
|
+
}
|
|
240
|
+
function getDataPresentationTarget(viewport) {
|
|
241
|
+
const genericViewport = viewport;
|
|
242
|
+
const dataId = genericViewport.getSourceDataId?.();
|
|
243
|
+
if (!dataId ||
|
|
244
|
+
typeof genericViewport.getDisplaySetPresentation !== 'function' ||
|
|
245
|
+
typeof genericViewport.setDisplaySetPresentation !== 'function') {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
viewport: genericViewport,
|
|
250
|
+
dataId,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
@@ -17,5 +17,13 @@ declare class ZoomTool extends BaseTool {
|
|
|
17
17
|
_dragPerspectiveProjection: (evt: EventTypes.InteractionEventType, viewport: Types.IStackViewport | Types.IVolumeViewport, camera: Types.ICamera, pinch?: boolean) => void;
|
|
18
18
|
_zoom(evt: EventTypes.MouseWheelEventType): void;
|
|
19
19
|
_panCallback(evt: EventTypes.InteractionEventType): void;
|
|
20
|
+
_dragViewportZoom(evt: EventTypes.InteractionEventType, viewport: {
|
|
21
|
+
getZoom(): number;
|
|
22
|
+
setZoom(...args: unknown[]): void;
|
|
23
|
+
}): void;
|
|
24
|
+
_applyViewportZoomDelta(viewport: {
|
|
25
|
+
getZoom(): number;
|
|
26
|
+
setZoom(...args: unknown[]): void;
|
|
27
|
+
}, element: HTMLDivElement, deltaY: number, canvasPoint?: Types.Point2): void;
|
|
20
28
|
}
|
|
21
29
|
export default ZoomTool;
|