@cornerstonejs/tools 0.56.1 → 0.56.3
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/CrosshairsTool.d.ts +1 -0
- package/dist/cjs/tools/CrosshairsTool.js +4 -1
- package/dist/cjs/tools/CrosshairsTool.js.map +1 -1
- package/dist/esm/tools/CrosshairsTool.d.ts +1 -0
- package/dist/esm/tools/CrosshairsTool.js +4 -1
- package/dist/esm/tools/CrosshairsTool.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +5 -4
- package/src/constants/COLOR_LUT.ts +262 -0
- package/src/constants/index.ts +3 -0
- package/src/cursors/ImageMouseCursor.ts +39 -0
- package/src/cursors/MouseCursor.ts +114 -0
- package/src/cursors/SVGCursorDescriptor.ts +462 -0
- package/src/cursors/SVGMouseCursor.ts +145 -0
- package/src/cursors/elementCursor.ts +69 -0
- package/src/cursors/index.ts +24 -0
- package/src/cursors/setCursorForElement.ts +33 -0
- package/src/drawingSvg/_getHash.ts +9 -0
- package/src/drawingSvg/_setAttributesIfNecessary.ts +13 -0
- package/src/drawingSvg/_setNewAttributesIfValid.ts +10 -0
- package/src/drawingSvg/clearByToolType.ts +26 -0
- package/src/drawingSvg/draw.ts +16 -0
- package/src/drawingSvg/drawArrow.ts +82 -0
- package/src/drawingSvg/drawCircle.ts +62 -0
- package/src/drawingSvg/drawEllipse.ts +71 -0
- package/src/drawingSvg/drawHandles.ts +87 -0
- package/src/drawingSvg/drawLine.ts +70 -0
- package/src/drawingSvg/drawLink.ts +76 -0
- package/src/drawingSvg/drawLinkedTextBox.ts +64 -0
- package/src/drawingSvg/drawPolyline.ts +80 -0
- package/src/drawingSvg/drawRect.ts +70 -0
- package/src/drawingSvg/drawTextBox.ts +213 -0
- package/src/drawingSvg/getSvgDrawingHelper.ts +98 -0
- package/src/drawingSvg/index.ts +23 -0
- package/src/enums/AnnotationStyleStates.ts +22 -0
- package/src/enums/Events.ts +242 -0
- package/src/enums/SegmentationRepresentations.ts +12 -0
- package/src/enums/ToolBindings.ts +37 -0
- package/src/enums/ToolModes.ts +31 -0
- package/src/enums/Touch.ts +8 -0
- package/src/enums/index.js +16 -0
- package/src/eventDispatchers/annotationModifiedEventDispatcher.ts +41 -0
- package/src/eventDispatchers/cameraModifiedEventDispatcher.ts +41 -0
- package/src/eventDispatchers/imageRenderedEventDispatcher.ts +37 -0
- package/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts +50 -0
- package/src/eventDispatchers/index.js +15 -0
- package/src/eventDispatchers/keyboardEventHandlers/index.js +4 -0
- package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +29 -0
- package/src/eventDispatchers/keyboardEventHandlers/keyUp.ts +33 -0
- package/src/eventDispatchers/keyboardToolEventDispatcher.ts +28 -0
- package/src/eventDispatchers/mouseEventHandlers/index.js +19 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseClick.ts +13 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDoubleClick.ts +13 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +196 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDownActivate.ts +35 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseDrag.ts +25 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseMove.ts +70 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseUp.ts +9 -0
- package/src/eventDispatchers/mouseEventHandlers/mouseWheel.ts +13 -0
- package/src/eventDispatchers/mouseToolEventDispatcher.ts +64 -0
- package/src/eventDispatchers/shared/customCallbackHandler.ts +73 -0
- package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +58 -0
- package/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts +61 -0
- package/src/eventDispatchers/shared/getActiveToolForTouchEvent.ts +64 -0
- package/src/eventDispatchers/shared/getMouseModifier.ts +30 -0
- package/src/eventDispatchers/shared/getToolsWithModesForMouseEvent.ts +56 -0
- package/src/eventDispatchers/shared/getToolsWithModesForTouchEvent.ts +54 -0
- package/src/eventDispatchers/touchEventHandlers/index.js +15 -0
- package/src/eventDispatchers/touchEventHandlers/touchDrag.ts +23 -0
- package/src/eventDispatchers/touchEventHandlers/touchEnd.ts +9 -0
- package/src/eventDispatchers/touchEventHandlers/touchPress.ts +13 -0
- package/src/eventDispatchers/touchEventHandlers/touchStart.ts +174 -0
- package/src/eventDispatchers/touchEventHandlers/touchStartActivate.ts +36 -0
- package/src/eventDispatchers/touchEventHandlers/touchTap.ts +9 -0
- package/src/eventDispatchers/touchToolEventDispatcher.ts +51 -0
- package/src/eventListeners/annotations/annotationModifiedListener.ts +22 -0
- package/src/eventListeners/annotations/annotationSelectionListener.ts +29 -0
- package/src/eventListeners/annotations/index.ts +4 -0
- package/src/eventListeners/index.ts +28 -0
- package/src/eventListeners/keyboard/index.ts +16 -0
- package/src/eventListeners/keyboard/keyDownListener.ts +99 -0
- package/src/eventListeners/mouse/getMouseEventPoints.ts +66 -0
- package/src/eventListeners/mouse/index.ts +55 -0
- package/src/eventListeners/mouse/mouseDoubleClickListener.ts +55 -0
- package/src/eventListeners/mouse/mouseDownListener.ts +519 -0
- package/src/eventListeners/mouse/mouseMoveListener.ts +33 -0
- package/src/eventListeners/segmentation/index.ts +11 -0
- package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +61 -0
- package/src/eventListeners/segmentation/segmentationModifiedEventListener.ts +32 -0
- package/src/eventListeners/segmentation/segmentationRepresentationModifiedEventListener.ts +15 -0
- package/src/eventListeners/segmentation/segmentationRepresentationRemovedEventListener.ts +16 -0
- package/src/eventListeners/touch/getTouchEventPoints.ts +75 -0
- package/src/eventListeners/touch/index.ts +37 -0
- package/src/eventListeners/touch/preventGhostClick.js +72 -0
- package/src/eventListeners/touch/touchStartListener.ts +499 -0
- package/src/eventListeners/wheel/index.ts +27 -0
- package/src/eventListeners/wheel/normalizeWheel.ts +69 -0
- package/src/eventListeners/wheel/wheelListener.ts +51 -0
- package/src/index.ts +133 -0
- package/src/init.ts +187 -0
- package/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +399 -0
- package/src/stateManagement/annotation/annotationLocking.ts +178 -0
- package/src/stateManagement/annotation/annotationSelection.ts +163 -0
- package/src/stateManagement/annotation/annotationState.ts +180 -0
- package/src/stateManagement/annotation/annotationVisibility.ts +156 -0
- package/src/stateManagement/annotation/config/ToolStyle.ts +265 -0
- package/src/stateManagement/annotation/config/getFont.ts +36 -0
- package/src/stateManagement/annotation/config/getState.ts +26 -0
- package/src/stateManagement/annotation/config/helpers.ts +55 -0
- package/src/stateManagement/annotation/config/index.ts +5 -0
- package/src/stateManagement/annotation/helpers/state.ts +83 -0
- package/src/stateManagement/annotation/index.ts +15 -0
- package/src/stateManagement/index.js +40 -0
- package/src/stateManagement/segmentation/SegmentationStateManager.ts +491 -0
- package/src/stateManagement/segmentation/activeSegmentation.ts +60 -0
- package/src/stateManagement/segmentation/addSegmentationRepresentations.ts +77 -0
- package/src/stateManagement/segmentation/addSegmentations.ts +27 -0
- package/src/stateManagement/segmentation/config/index.ts +29 -0
- package/src/stateManagement/segmentation/config/segmentationColor.ts +132 -0
- package/src/stateManagement/segmentation/config/segmentationConfig.ts +195 -0
- package/src/stateManagement/segmentation/config/segmentationVisibility.ts +171 -0
- package/src/stateManagement/segmentation/helpers/index.ts +3 -0
- package/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +35 -0
- package/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts +41 -0
- package/src/stateManagement/segmentation/index.ts +22 -0
- package/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts +85 -0
- package/src/stateManagement/segmentation/segmentIndex.ts +38 -0
- package/src/stateManagement/segmentation/segmentLocking.ts +72 -0
- package/src/stateManagement/segmentation/segmentationState.ts +429 -0
- package/src/stateManagement/segmentation/triggerSegmentationEvents.ts +157 -0
- package/src/store/SynchronizerManager/Synchronizer.ts +344 -0
- package/src/store/SynchronizerManager/createSynchronizer.ts +41 -0
- package/src/store/SynchronizerManager/destroy.ts +14 -0
- package/src/store/SynchronizerManager/destroySynchronizer.ts +25 -0
- package/src/store/SynchronizerManager/getAllSynchronizers.ts +12 -0
- package/src/store/SynchronizerManager/getSynchronizer.ts +13 -0
- package/src/store/SynchronizerManager/getSynchronizersForViewport.ts +44 -0
- package/src/store/SynchronizerManager/index.js +15 -0
- package/src/store/ToolGroupManager/ToolGroup.ts +679 -0
- package/src/store/ToolGroupManager/createToolGroup.ts +33 -0
- package/src/store/ToolGroupManager/destroy.ts +24 -0
- package/src/store/ToolGroupManager/destroyToolGroup.ts +26 -0
- package/src/store/ToolGroupManager/getAllToolGroups.ts +12 -0
- package/src/store/ToolGroupManager/getToolGroup.ts +14 -0
- package/src/store/ToolGroupManager/getToolGroupForViewport.ts +44 -0
- package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +33 -0
- package/src/store/ToolGroupManager/index.ts +17 -0
- package/src/store/addEnabledElement.ts +137 -0
- package/src/store/addTool.ts +56 -0
- package/src/store/cancelActiveManipulations.ts +30 -0
- package/src/store/filterMoveableAnnotationTools.ts +61 -0
- package/src/store/filterToolsWithAnnotationsForElement.ts +51 -0
- package/src/store/filterToolsWithMoveableHandles.ts +51 -0
- package/src/store/index.ts +29 -0
- package/src/store/removeEnabledElement.ts +132 -0
- package/src/store/state.ts +57 -0
- package/src/store/svgNodeCache.ts +7 -0
- package/src/synchronizers/callbacks/areViewportsCoplanar .ts +12 -0
- package/src/synchronizers/callbacks/cameraSyncCallback.ts +33 -0
- package/src/synchronizers/callbacks/stackImageSyncCallback.ts +157 -0
- package/src/synchronizers/callbacks/voiSyncCallback.ts +51 -0
- package/src/synchronizers/callbacks/zoomPanSyncCallback.ts +43 -0
- package/src/synchronizers/index.ts +11 -0
- package/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/createStackImageSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/createVOISynchronizer.ts +24 -0
- package/src/synchronizers/synchronizers/createZoomPanSynchronizer.ts +25 -0
- package/src/synchronizers/synchronizers/index.ts +11 -0
- package/src/tools/CrosshairsTool.ts +2693 -0
- package/src/tools/MIPJumpToClickTool.ts +99 -0
- package/src/tools/MagnifyTool.ts +319 -0
- package/src/tools/PanTool.ts +58 -0
- package/src/tools/PlanarRotateTool.ts +77 -0
- package/src/tools/ReferenceCursors.ts +466 -0
- package/src/tools/ReferenceLinesTool.ts +279 -0
- package/src/tools/ScaleOverlayTool.ts +685 -0
- package/src/tools/StackScrollTool.ts +97 -0
- package/src/tools/StackScrollToolMouseWheelTool.ts +58 -0
- package/src/tools/TrackballRotateTool.ts +141 -0
- package/src/tools/VolumeRotateMouseWheelTool.ts +86 -0
- package/src/tools/WindowLevelTool.ts +260 -0
- package/src/tools/ZoomTool.ts +293 -0
- package/src/tools/annotation/AngleTool.ts +835 -0
- package/src/tools/annotation/ArrowAnnotateTool.ts +820 -0
- package/src/tools/annotation/BidirectionalTool.ts +1350 -0
- package/src/tools/annotation/CircleROITool.ts +1070 -0
- package/src/tools/annotation/CobbAngleTool.ts +815 -0
- package/src/tools/annotation/DragProbeTool.ts +213 -0
- package/src/tools/annotation/EllipticalROITool.ts +1223 -0
- package/src/tools/annotation/LengthTool.ts +861 -0
- package/src/tools/annotation/PlanarFreehandROITool.ts +636 -0
- package/src/tools/annotation/ProbeTool.ts +681 -0
- package/src/tools/annotation/RectangleROITool.ts +1028 -0
- package/src/tools/annotation/planarFreehandROITool/closedContourEditLoop.ts +488 -0
- package/src/tools/annotation/planarFreehandROITool/drawLoop.ts +462 -0
- package/src/tools/annotation/planarFreehandROITool/editLoopCommon.ts +331 -0
- package/src/tools/annotation/planarFreehandROITool/findOpenUShapedContourVectorToPeak.ts +74 -0
- package/src/tools/annotation/planarFreehandROITool/openContourEditLoop.ts +612 -0
- package/src/tools/annotation/planarFreehandROITool/openContourEndEditLoop.ts +74 -0
- package/src/tools/annotation/planarFreehandROITool/renderMethods.ts +407 -0
- package/src/tools/base/AnnotationDisplayTool.ts +228 -0
- package/src/tools/base/AnnotationTool.ts +307 -0
- package/src/tools/base/BaseTool.ts +215 -0
- package/src/tools/base/index.ts +4 -0
- package/src/tools/displayTools/Contour/addContourToElement.ts +135 -0
- package/src/tools/displayTools/Contour/contourDisplay.ts +252 -0
- package/src/tools/displayTools/Contour/index.ts +3 -0
- package/src/tools/displayTools/Contour/removeContourFromElement.ts +35 -0
- package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +57 -0
- package/src/tools/displayTools/Labelmap/index.ts +4 -0
- package/src/tools/displayTools/Labelmap/labelmapConfig.ts +37 -0
- package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +461 -0
- package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +27 -0
- package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +30 -0
- package/src/tools/displayTools/SegmentationDisplayTool.ts +198 -0
- package/src/tools/index.ts +84 -0
- package/src/tools/segmentation/BrushTool.ts +474 -0
- package/src/tools/segmentation/CircleScissorsTool.ts +365 -0
- package/src/tools/segmentation/PaintFillTool.ts +370 -0
- package/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts +471 -0
- package/src/tools/segmentation/RectangleROIThresholdTool.ts +281 -0
- package/src/tools/segmentation/RectangleScissorsTool.ts +382 -0
- package/src/tools/segmentation/SphereScissorsTool.ts +368 -0
- package/src/tools/segmentation/strategies/eraseCircle.ts +30 -0
- package/src/tools/segmentation/strategies/eraseRectangle.ts +81 -0
- package/src/tools/segmentation/strategies/eraseSphere.ts +27 -0
- package/src/tools/segmentation/strategies/fillCircle.ts +185 -0
- package/src/tools/segmentation/strategies/fillRectangle.ts +110 -0
- package/src/tools/segmentation/strategies/fillSphere.ts +88 -0
- package/src/tools/segmentation/strategies/index.ts +9 -0
- package/src/types/AnnotationGroupSelector.ts +7 -0
- package/src/types/AnnotationStyle.ts +42 -0
- package/src/types/AnnotationTypes.ts +109 -0
- package/src/types/BoundsIJK.ts +5 -0
- package/src/types/CINETypes.ts +32 -0
- package/src/types/ContourTypes.ts +26 -0
- package/src/types/CursorTypes.ts +12 -0
- package/src/types/EventTypes.ts +657 -0
- package/src/types/FloodFillTypes.ts +19 -0
- package/src/types/IAnnotationManager.ts +89 -0
- package/src/types/IDistance.ts +16 -0
- package/src/types/IPoints.ts +18 -0
- package/src/types/ISetToolModeOptions.ts +29 -0
- package/src/types/ISynchronizerEventHandler.ts +11 -0
- package/src/types/IToolClassReference.ts +5 -0
- package/src/types/IToolGroup.ts +72 -0
- package/src/types/ITouchPoints.ts +14 -0
- package/src/types/InteractionTypes.ts +6 -0
- package/src/types/InternalToolTypes.ts +19 -0
- package/src/types/JumpToSliceOptions.ts +7 -0
- package/src/types/LabelmapTypes.ts +41 -0
- package/src/types/PlanarBoundingBox.ts +8 -0
- package/src/types/SVGDrawingHelper.ts +10 -0
- package/src/types/ScrollOptions.ts +9 -0
- package/src/types/SegmentationStateTypes.ts +248 -0
- package/src/types/ToolHandle.ts +26 -0
- package/src/types/ToolProps.ts +16 -0
- package/src/types/ToolSpecificAnnotationTypes.ts +311 -0
- package/src/types/index.ts +115 -0
- package/src/utilities/boundingBox/extend2DBoundingBoxInViewAxis.ts +29 -0
- package/src/utilities/boundingBox/getBoundingBoxAroundShape.ts +57 -0
- package/src/utilities/boundingBox/index.ts +4 -0
- package/src/utilities/calibrateImageSpacing.ts +46 -0
- package/src/utilities/cine/events.ts +9 -0
- package/src/utilities/cine/index.ts +5 -0
- package/src/utilities/cine/playClip.ts +435 -0
- package/src/utilities/cine/state.ts +18 -0
- package/src/utilities/clip.js +30 -0
- package/src/utilities/debounce.js +217 -0
- package/src/utilities/drawing/getTextBoxCoordsCanvas.ts +45 -0
- package/src/utilities/drawing/index.ts +3 -0
- package/src/utilities/dynamicVolume/getDataInTime.ts +110 -0
- package/src/utilities/dynamicVolume/index.ts +2 -0
- package/src/utilities/getAnnotationNearPoint.ts +130 -0
- package/src/utilities/getModalityUnit.ts +11 -0
- package/src/utilities/getToolsWithModesForElement.ts +52 -0
- package/src/utilities/index.ts +68 -0
- package/src/utilities/isObject.js +29 -0
- package/src/utilities/math/angle/angleBetweenLines.ts +29 -0
- package/src/utilities/math/circle/_types.ts +6 -0
- package/src/utilities/math/circle/getCanvasCircleCorners.ts +23 -0
- package/src/utilities/math/circle/getCanvasCircleRadius.ts +16 -0
- package/src/utilities/math/circle/index.ts +4 -0
- package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +26 -0
- package/src/utilities/math/ellipse/index.ts +4 -0
- package/src/utilities/math/ellipse/pointInEllipse.ts +38 -0
- package/src/utilities/math/ellipse/pointInEllipsoidWithConstraint.ts +35 -0
- package/src/utilities/math/index.ts +8 -0
- package/src/utilities/math/line/distanceToPoint.ts +24 -0
- package/src/utilities/math/line/distanceToPointSquared.ts +44 -0
- package/src/utilities/math/line/index.ts +5 -0
- package/src/utilities/math/line/intersectLine.ts +92 -0
- package/src/utilities/math/midPoint.ts +24 -0
- package/src/utilities/math/point/distanceToPoint.ts +22 -0
- package/src/utilities/math/point/index.ts +3 -0
- package/src/utilities/math/polyline/addCanvasPointsToArray.ts +62 -0
- package/src/utilities/math/polyline/calculateAreaOfPoints.ts +23 -0
- package/src/utilities/math/polyline/getIntersectionWithPolyline.ts +182 -0
- package/src/utilities/math/polyline/getSubPixelSpacingAndXYDirections.ts +99 -0
- package/src/utilities/math/polyline/index.ts +19 -0
- package/src/utilities/math/polyline/planarFreehandROIInternalTypes.ts +36 -0
- package/src/utilities/math/polyline/pointCanProjectOnLine.ts +57 -0
- package/src/utilities/math/polyline/pointsAreWithinCloseContourProximity.ts +15 -0
- package/src/utilities/math/rectangle/distanceToPoint.ts +82 -0
- package/src/utilities/math/rectangle/index.ts +3 -0
- package/src/utilities/math/sphere/index.ts +3 -0
- package/src/utilities/math/sphere/pointInSphere.ts +31 -0
- package/src/utilities/math/vec2/findClosestPoint.ts +40 -0
- package/src/utilities/math/vec2/index.ts +4 -0
- package/src/utilities/math/vec2/liangBarksyClip.ts +84 -0
- package/src/utilities/orientation/getOrientationStringLPS.ts +52 -0
- package/src/utilities/orientation/index.ts +4 -0
- package/src/utilities/orientation/invertOrientationStringLPS.ts +21 -0
- package/src/utilities/planar/filterAnnotationsForDisplay.ts +68 -0
- package/src/utilities/planar/filterAnnotationsWithinSlice.ts +85 -0
- package/src/utilities/planar/getPointInLineOfSightWithCriteria.ts +104 -0
- package/src/utilities/planar/getWorldWidthAndHeightFromCorners.ts +51 -0
- package/src/utilities/planar/getWorldWidthAndHeightFromTwoPoints.ts +51 -0
- package/src/utilities/planar/index.ts +18 -0
- package/src/utilities/planarFreehandROITool/index.ts +7 -0
- package/src/utilities/planarFreehandROITool/interpolateAnnotation.ts +87 -0
- package/src/utilities/planarFreehandROITool/interpolatePoints.ts +214 -0
- package/src/utilities/planarFreehandROITool/interpolation/algorithms/bspline.ts +55 -0
- package/src/utilities/planarFreehandROITool/interpolation/interpolateSegmentPoints.ts +90 -0
- package/src/utilities/pointInShapeCallback.ts +138 -0
- package/src/utilities/pointInSurroundingSphereCallback.ts +188 -0
- package/src/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.ts +76 -0
- package/src/utilities/rectangleROITool/index.ts +3 -0
- package/src/utilities/scroll.ts +62 -0
- package/src/utilities/segmentation/brushSizeForToolGroup.ts +72 -0
- package/src/utilities/segmentation/brushThresholdForToolGroup.ts +65 -0
- package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +74 -0
- package/src/utilities/segmentation/createMergedLabelmapForIndex.ts +65 -0
- package/src/utilities/segmentation/floodFill.ts +194 -0
- package/src/utilities/segmentation/getDefaultRepresentationConfig.ts +20 -0
- package/src/utilities/segmentation/index.ts +33 -0
- package/src/utilities/segmentation/isValidRepresentationConfig.ts +22 -0
- package/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts +91 -0
- package/src/utilities/segmentation/thresholdSegmentationByRange.ts +129 -0
- package/src/utilities/segmentation/thresholdVolumeByRange.ts +150 -0
- package/src/utilities/segmentation/triggerSegmentationRender.ts +206 -0
- package/src/utilities/segmentation/utilities.ts +116 -0
- package/src/utilities/stackPrefetch/index.ts +8 -0
- package/src/utilities/stackPrefetch/stackPrefetch.ts +405 -0
- package/src/utilities/stackPrefetch/state.ts +17 -0
- package/src/utilities/throttle.js +69 -0
- package/src/utilities/touch/index.ts +246 -0
- package/src/utilities/triggerAnnotationRender.ts +237 -0
- package/src/utilities/triggerAnnotationRenderForViewportIds.ts +18 -0
- package/src/utilities/viewport/index.ts +5 -0
- package/src/utilities/viewport/isViewportPreScaled.ts +24 -0
- package/src/utilities/viewport/jumpToSlice.ts +73 -0
- package/src/utilities/viewport/jumpToWorld.ts +58 -0
- package/src/utilities/viewportFilters/filterViewportsWithFrameOfReferenceUID.ts +28 -0
- package/src/utilities/viewportFilters/filterViewportsWithParallelNormals.ts +26 -0
- package/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts +15 -0
- package/src/utilities/viewportFilters/filterViewportsWithToolEnabled.ts +72 -0
- package/src/utilities/viewportFilters/getViewportIdsWithToolToRender.ts +45 -0
- package/src/utilities/viewportFilters/index.ts +11 -0
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getEnabledElement,
|
|
3
|
+
cache,
|
|
4
|
+
StackViewport,
|
|
5
|
+
metaData,
|
|
6
|
+
triggerEvent,
|
|
7
|
+
eventTarget,
|
|
8
|
+
utilities as csUtils,
|
|
9
|
+
} from '@cornerstonejs/core';
|
|
10
|
+
import type { Types } from '@cornerstonejs/core';
|
|
11
|
+
|
|
12
|
+
import { vec3 } from 'gl-matrix';
|
|
13
|
+
import { Events } from '../../enums';
|
|
14
|
+
import { addAnnotation, getAnnotations } from '../../stateManagement';
|
|
15
|
+
import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking';
|
|
16
|
+
import {
|
|
17
|
+
drawHandles as drawHandlesSvg,
|
|
18
|
+
drawRect as drawRectSvg,
|
|
19
|
+
} from '../../drawingSvg';
|
|
20
|
+
import { getViewportIdsWithToolToRender } from '../../utilities/viewportFilters';
|
|
21
|
+
import throttle from '../../utilities/throttle';
|
|
22
|
+
import { AnnotationModifiedEventDetail } from '../../types/EventTypes';
|
|
23
|
+
import { isAnnotationVisible } from '../../stateManagement/annotation/annotationVisibility';
|
|
24
|
+
import { hideElementCursor } from '../../cursors/elementCursor';
|
|
25
|
+
import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds';
|
|
26
|
+
|
|
27
|
+
import {
|
|
28
|
+
PublicToolProps,
|
|
29
|
+
ToolProps,
|
|
30
|
+
EventTypes,
|
|
31
|
+
SVGDrawingHelper,
|
|
32
|
+
} from '../../types';
|
|
33
|
+
import { RectangleROIStartEndThresholdAnnotation } from '../../types/ToolSpecificAnnotationTypes';
|
|
34
|
+
import RectangleROITool from '../annotation/RectangleROITool';
|
|
35
|
+
import { StyleSpecifier } from '../../types/AnnotationStyle';
|
|
36
|
+
|
|
37
|
+
const { transformWorldToIndex } = csUtils;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* This tool is similar to the RectangleROIThresholdTool which
|
|
41
|
+
* only draws a rectangle on the image, and by using utility functions
|
|
42
|
+
* such as thresholdByRange and thresholdByROIStat it can be used to
|
|
43
|
+
* create a segmentation. The only difference is that it only acts on the
|
|
44
|
+
* acquisition plane and not the 3D volume, and accepts a start and end
|
|
45
|
+
* slice, and renders a dashed rectangle on the image between the start and end
|
|
46
|
+
* but a solid rectangle on start and end slice. Utility functions should be used
|
|
47
|
+
* to modify the start and end slice.
|
|
48
|
+
* // Todo: right now only the first slice has grabbable handles, need to make
|
|
49
|
+
* // it so that the handles are grabbable on all slices.
|
|
50
|
+
*/
|
|
51
|
+
class RectangleROIStartEndThresholdTool extends RectangleROITool {
|
|
52
|
+
static toolName;
|
|
53
|
+
_throttledCalculateCachedStats: any;
|
|
54
|
+
editData: {
|
|
55
|
+
annotation: any;
|
|
56
|
+
viewportIdsToRender: string[];
|
|
57
|
+
handleIndex?: number;
|
|
58
|
+
newAnnotation?: boolean;
|
|
59
|
+
hasMoved?: boolean;
|
|
60
|
+
} | null;
|
|
61
|
+
isDrawing: boolean;
|
|
62
|
+
isHandleOutsideImage: boolean;
|
|
63
|
+
|
|
64
|
+
constructor(
|
|
65
|
+
toolProps: PublicToolProps = {},
|
|
66
|
+
defaultToolProps: ToolProps = {
|
|
67
|
+
configuration: {
|
|
68
|
+
numSlicesToPropagate: 10,
|
|
69
|
+
},
|
|
70
|
+
}
|
|
71
|
+
) {
|
|
72
|
+
super(toolProps, defaultToolProps);
|
|
73
|
+
|
|
74
|
+
this._throttledCalculateCachedStats = throttle(
|
|
75
|
+
this._calculateCachedStatsTool,
|
|
76
|
+
100,
|
|
77
|
+
{ trailing: true }
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Based on the current position of the mouse and the enabledElement it creates
|
|
83
|
+
* the edit data for the tool.
|
|
84
|
+
*
|
|
85
|
+
* @param evt - EventTypes.NormalizedMouseEventType
|
|
86
|
+
* @returns The annotation object.
|
|
87
|
+
*
|
|
88
|
+
*/
|
|
89
|
+
addNewAnnotation = (evt: EventTypes.InteractionEventType) => {
|
|
90
|
+
const eventDetail = evt.detail;
|
|
91
|
+
const { currentPoints, element } = eventDetail;
|
|
92
|
+
const worldPos = currentPoints.world;
|
|
93
|
+
|
|
94
|
+
const enabledElement = getEnabledElement(element);
|
|
95
|
+
const { viewport, renderingEngine } = enabledElement;
|
|
96
|
+
|
|
97
|
+
this.isDrawing = true;
|
|
98
|
+
|
|
99
|
+
const camera = viewport.getCamera();
|
|
100
|
+
const { viewPlaneNormal, viewUp } = camera;
|
|
101
|
+
|
|
102
|
+
let referencedImageId, imageVolume, volumeId;
|
|
103
|
+
if (viewport instanceof StackViewport) {
|
|
104
|
+
throw new Error('Stack Viewport Not implemented');
|
|
105
|
+
} else {
|
|
106
|
+
const targetId = this.getTargetId(viewport);
|
|
107
|
+
volumeId = targetId.split('volumeId:')[1];
|
|
108
|
+
imageVolume = cache.getVolume(volumeId);
|
|
109
|
+
referencedImageId = csUtils.getClosestImageId(
|
|
110
|
+
imageVolume,
|
|
111
|
+
worldPos,
|
|
112
|
+
viewPlaneNormal,
|
|
113
|
+
viewUp
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (!referencedImageId) {
|
|
118
|
+
throw new Error('This tool does not work on non-acquisition planes');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const startIndex = viewport.getCurrentImageIdIndex();
|
|
122
|
+
const spacingInNormal = csUtils.getSpacingInNormalDirection(
|
|
123
|
+
imageVolume,
|
|
124
|
+
viewPlaneNormal
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// We cannot simply add numSlicesToPropagate to startIndex because
|
|
128
|
+
// the order of imageIds can be from top to bottom or bottom to top and
|
|
129
|
+
// we want to make sure it is always propagated in the direction of the
|
|
130
|
+
// view and also to make sure we don't go out of bounds.
|
|
131
|
+
const endIndex = this._getEndSliceIndex(
|
|
132
|
+
imageVolume,
|
|
133
|
+
worldPos,
|
|
134
|
+
spacingInNormal,
|
|
135
|
+
viewPlaneNormal
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
|
|
139
|
+
|
|
140
|
+
const annotation = {
|
|
141
|
+
highlighted: true,
|
|
142
|
+
invalidated: true,
|
|
143
|
+
metadata: {
|
|
144
|
+
viewPlaneNormal: <Types.Point3>[...viewPlaneNormal],
|
|
145
|
+
enabledElement,
|
|
146
|
+
viewUp: <Types.Point3>[...viewUp],
|
|
147
|
+
FrameOfReferenceUID,
|
|
148
|
+
referencedImageId,
|
|
149
|
+
toolName: this.getToolName(),
|
|
150
|
+
volumeId,
|
|
151
|
+
spacingInNormal,
|
|
152
|
+
},
|
|
153
|
+
data: {
|
|
154
|
+
label: '',
|
|
155
|
+
startSlice: startIndex,
|
|
156
|
+
endSlice: endIndex,
|
|
157
|
+
cachedStats: {
|
|
158
|
+
projectionPoints: [],
|
|
159
|
+
projectionPointsImageIds: [referencedImageId],
|
|
160
|
+
},
|
|
161
|
+
handles: {
|
|
162
|
+
// No need a textBox
|
|
163
|
+
textBox: {
|
|
164
|
+
hasMoved: false,
|
|
165
|
+
worldPosition: null,
|
|
166
|
+
worldBoundingBox: null,
|
|
167
|
+
},
|
|
168
|
+
points: [
|
|
169
|
+
<Types.Point3>[...worldPos],
|
|
170
|
+
<Types.Point3>[...worldPos],
|
|
171
|
+
<Types.Point3>[...worldPos],
|
|
172
|
+
<Types.Point3>[...worldPos],
|
|
173
|
+
],
|
|
174
|
+
activeHandleIndex: null,
|
|
175
|
+
},
|
|
176
|
+
labelmapUID: null,
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// update the projection points in 3D space, since we are projecting
|
|
181
|
+
// the points to the slice plane, we need to make sure the points are
|
|
182
|
+
// computed for later export
|
|
183
|
+
this._computeProjectionPoints(annotation, imageVolume);
|
|
184
|
+
|
|
185
|
+
addAnnotation(annotation, element);
|
|
186
|
+
|
|
187
|
+
const viewportIdsToRender = getViewportIdsWithToolToRender(
|
|
188
|
+
element,
|
|
189
|
+
this.getToolName()
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
this.editData = {
|
|
193
|
+
annotation,
|
|
194
|
+
viewportIdsToRender,
|
|
195
|
+
handleIndex: 3,
|
|
196
|
+
newAnnotation: true,
|
|
197
|
+
hasMoved: false,
|
|
198
|
+
};
|
|
199
|
+
this._activateDraw(element);
|
|
200
|
+
|
|
201
|
+
hideElementCursor(element);
|
|
202
|
+
|
|
203
|
+
evt.preventDefault();
|
|
204
|
+
|
|
205
|
+
triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
|
|
206
|
+
|
|
207
|
+
return annotation;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// Todo: make it work for planes other than acquisition planes
|
|
211
|
+
_computeProjectionPoints(
|
|
212
|
+
annotation: RectangleROIStartEndThresholdAnnotation,
|
|
213
|
+
imageVolume: Types.IImageVolume
|
|
214
|
+
): void {
|
|
215
|
+
const { data, metadata } = annotation;
|
|
216
|
+
const { viewPlaneNormal, spacingInNormal } = metadata;
|
|
217
|
+
const { imageData } = imageVolume;
|
|
218
|
+
const { startSlice, endSlice } = data;
|
|
219
|
+
const { points } = data.handles;
|
|
220
|
+
|
|
221
|
+
const startIJK = transformWorldToIndex(imageData, points[0]);
|
|
222
|
+
|
|
223
|
+
if (startIJK[2] !== startSlice) {
|
|
224
|
+
throw new Error('Start slice does not match');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// substitute the end slice index 2 with startIJK index 2
|
|
228
|
+
const endIJK = vec3.fromValues(startIJK[0], startIJK[1], endSlice);
|
|
229
|
+
|
|
230
|
+
const startWorld = vec3.create();
|
|
231
|
+
imageData.indexToWorldVec3(startIJK, startWorld);
|
|
232
|
+
|
|
233
|
+
const endWorld = vec3.create();
|
|
234
|
+
imageData.indexToWorldVec3(endIJK, endWorld);
|
|
235
|
+
|
|
236
|
+
// distance between start and end slice in the world coordinate
|
|
237
|
+
const distance = vec3.distance(startWorld, endWorld);
|
|
238
|
+
|
|
239
|
+
// for each point inside points, navigate in the direction of the viewPlaneNormal
|
|
240
|
+
// with amount of spacingInNormal, and calculate the next slice until we reach the distance
|
|
241
|
+
const newProjectionPoints = [];
|
|
242
|
+
for (let dist = 0; dist < distance; dist += spacingInNormal) {
|
|
243
|
+
newProjectionPoints.push(
|
|
244
|
+
points.map((point) => {
|
|
245
|
+
const newPoint = vec3.create();
|
|
246
|
+
vec3.scaleAndAdd(newPoint, point, viewPlaneNormal, dist);
|
|
247
|
+
return Array.from(newPoint);
|
|
248
|
+
})
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
data.cachedStats.projectionPoints = newProjectionPoints;
|
|
253
|
+
|
|
254
|
+
// Find the imageIds for the projection points
|
|
255
|
+
const projectionPointsImageIds = [];
|
|
256
|
+
for (const RectanglePoints of newProjectionPoints) {
|
|
257
|
+
const imageId = csUtils.getClosestImageId(
|
|
258
|
+
imageVolume,
|
|
259
|
+
RectanglePoints[0],
|
|
260
|
+
viewPlaneNormal,
|
|
261
|
+
metadata.viewUp
|
|
262
|
+
);
|
|
263
|
+
projectionPointsImageIds.push(imageId);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
data.cachedStats.projectionPointsImageIds = projectionPointsImageIds;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
_calculateCachedStatsTool(annotation, enabledElement) {
|
|
270
|
+
const data = annotation.data;
|
|
271
|
+
const { viewportId, renderingEngineId, viewport } = enabledElement;
|
|
272
|
+
|
|
273
|
+
const { cachedStats } = data;
|
|
274
|
+
const volumeId = this.getTargetId(viewport);
|
|
275
|
+
const imageVolume = cache.getVolume(volumeId.split('volumeId:')[1]);
|
|
276
|
+
|
|
277
|
+
// Todo: this shouldn't be here, this is a performance issue
|
|
278
|
+
// Since we are extending the RectangleROI class, we need to
|
|
279
|
+
// bring the logic for handle to some cachedStats calculation
|
|
280
|
+
this._computeProjectionPoints(annotation, imageVolume);
|
|
281
|
+
|
|
282
|
+
annotation.invalidated = false;
|
|
283
|
+
|
|
284
|
+
// Dispatching annotation modified
|
|
285
|
+
const eventType = Events.ANNOTATION_MODIFIED;
|
|
286
|
+
|
|
287
|
+
const eventDetail: AnnotationModifiedEventDetail = {
|
|
288
|
+
annotation,
|
|
289
|
+
viewportId,
|
|
290
|
+
renderingEngineId,
|
|
291
|
+
};
|
|
292
|
+
triggerEvent(eventTarget, eventType, eventDetail);
|
|
293
|
+
|
|
294
|
+
return cachedStats;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* it is used to draw the rectangleROIStartEnd annotation in each
|
|
299
|
+
* request animation frame.
|
|
300
|
+
*
|
|
301
|
+
* @param enabledElement - The Cornerstone's enabledElement.
|
|
302
|
+
* @param svgDrawingHelper - The svgDrawingHelper providing the context for drawing.
|
|
303
|
+
*/
|
|
304
|
+
renderAnnotation = (
|
|
305
|
+
enabledElement: Types.IEnabledElement,
|
|
306
|
+
svgDrawingHelper: SVGDrawingHelper
|
|
307
|
+
): boolean => {
|
|
308
|
+
let renderStatus = false;
|
|
309
|
+
const { viewport } = enabledElement;
|
|
310
|
+
|
|
311
|
+
const annotations = getAnnotations(this.getToolName(), viewport.element);
|
|
312
|
+
|
|
313
|
+
if (!annotations?.length) {
|
|
314
|
+
return renderStatus;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const sliceIndex = viewport.getCurrentImageIdIndex();
|
|
318
|
+
|
|
319
|
+
const styleSpecifier: StyleSpecifier = {
|
|
320
|
+
toolGroupId: this.toolGroupId,
|
|
321
|
+
toolName: this.getToolName(),
|
|
322
|
+
viewportId: enabledElement.viewport.id,
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
for (let i = 0; i < annotations.length; i++) {
|
|
326
|
+
const annotation = annotations[
|
|
327
|
+
i
|
|
328
|
+
] as RectangleROIStartEndThresholdAnnotation;
|
|
329
|
+
const { annotationUID, data } = annotation;
|
|
330
|
+
const { startSlice, endSlice } = data;
|
|
331
|
+
const { points, activeHandleIndex } = data.handles;
|
|
332
|
+
|
|
333
|
+
const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
|
|
334
|
+
|
|
335
|
+
styleSpecifier.annotationUID = annotationUID;
|
|
336
|
+
|
|
337
|
+
const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
|
|
338
|
+
const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
|
|
339
|
+
const color = this.getStyle('color', styleSpecifier, annotation);
|
|
340
|
+
// range of slices to render based on the start and end slice, like
|
|
341
|
+
// np.arange
|
|
342
|
+
|
|
343
|
+
// if indexIJK is outside the start/end slice, we don't render
|
|
344
|
+
if (
|
|
345
|
+
sliceIndex < Math.min(startSlice, endSlice) ||
|
|
346
|
+
sliceIndex > Math.max(startSlice, endSlice)
|
|
347
|
+
) {
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// WE HAVE TO CACHE STATS BEFORE FETCHING TEXT
|
|
352
|
+
|
|
353
|
+
if (annotation.invalidated) {
|
|
354
|
+
this._throttledCalculateCachedStats(annotation, enabledElement);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// if it is inside the start/end slice, but not exactly the first or
|
|
358
|
+
// last slice, we render the line in dash, but not the handles
|
|
359
|
+
let firstOrLastSlice = false;
|
|
360
|
+
if (sliceIndex === startSlice || sliceIndex === endSlice) {
|
|
361
|
+
firstOrLastSlice = true;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// If rendering engine has been destroyed while rendering
|
|
365
|
+
if (!viewport.getRenderingEngine()) {
|
|
366
|
+
console.warn('Rendering Engine has been destroyed');
|
|
367
|
+
return renderStatus;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
let activeHandleCanvasCoords;
|
|
371
|
+
|
|
372
|
+
if (!isAnnotationVisible(annotationUID)) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (
|
|
377
|
+
!isAnnotationLocked(annotation) &&
|
|
378
|
+
!this.editData &&
|
|
379
|
+
activeHandleIndex !== null &&
|
|
380
|
+
firstOrLastSlice
|
|
381
|
+
) {
|
|
382
|
+
// Not locked or creating and hovering over handle, so render handle.
|
|
383
|
+
activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (activeHandleCanvasCoords) {
|
|
387
|
+
const handleGroupUID = '0';
|
|
388
|
+
|
|
389
|
+
drawHandlesSvg(
|
|
390
|
+
svgDrawingHelper,
|
|
391
|
+
annotationUID,
|
|
392
|
+
handleGroupUID,
|
|
393
|
+
activeHandleCanvasCoords,
|
|
394
|
+
{
|
|
395
|
+
color,
|
|
396
|
+
}
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
let lineDashToUse = lineDash;
|
|
401
|
+
|
|
402
|
+
if (!firstOrLastSlice) {
|
|
403
|
+
lineDashToUse = 2;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const rectangleUID = '0';
|
|
407
|
+
drawRectSvg(
|
|
408
|
+
svgDrawingHelper,
|
|
409
|
+
annotationUID,
|
|
410
|
+
rectangleUID,
|
|
411
|
+
canvasCoordinates[0],
|
|
412
|
+
canvasCoordinates[3],
|
|
413
|
+
{
|
|
414
|
+
color,
|
|
415
|
+
lineDash: lineDashToUse,
|
|
416
|
+
lineWidth,
|
|
417
|
+
}
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
renderStatus = true;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return renderStatus;
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
_getEndSliceIndex(
|
|
427
|
+
imageVolume: Types.IImageVolume,
|
|
428
|
+
worldPos: Types.Point3,
|
|
429
|
+
spacingInNormal: number,
|
|
430
|
+
viewPlaneNormal: Types.Point3
|
|
431
|
+
): number | undefined {
|
|
432
|
+
const numSlicesToPropagate = this.configuration.numSlicesToPropagate;
|
|
433
|
+
|
|
434
|
+
// get end position by moving from worldPos in the direction of viewplaneNormal
|
|
435
|
+
// with amount of numSlicesToPropagate * spacingInNormal
|
|
436
|
+
const endPos = vec3.create();
|
|
437
|
+
vec3.scaleAndAdd(
|
|
438
|
+
endPos,
|
|
439
|
+
worldPos,
|
|
440
|
+
viewPlaneNormal,
|
|
441
|
+
numSlicesToPropagate * spacingInNormal
|
|
442
|
+
);
|
|
443
|
+
|
|
444
|
+
const halfSpacingInNormalDirection = spacingInNormal / 2;
|
|
445
|
+
// Loop through imageIds of the imageVolume and find the one that is closest to endPos
|
|
446
|
+
const { imageIds } = imageVolume;
|
|
447
|
+
let imageIdIndex;
|
|
448
|
+
for (let i = 0; i < imageIds.length; i++) {
|
|
449
|
+
const imageId = imageIds[i];
|
|
450
|
+
|
|
451
|
+
const { imagePositionPatient } = metaData.get(
|
|
452
|
+
'imagePlaneModule',
|
|
453
|
+
imageId
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
const dir = vec3.create();
|
|
457
|
+
vec3.sub(dir, endPos, imagePositionPatient);
|
|
458
|
+
|
|
459
|
+
const dot = vec3.dot(dir, viewPlaneNormal);
|
|
460
|
+
|
|
461
|
+
if (Math.abs(dot) < halfSpacingInNormalDirection) {
|
|
462
|
+
imageIdIndex = i;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return imageIdIndex;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
RectangleROIStartEndThresholdTool.toolName = 'RectangleROIStartEndThreshold';
|
|
471
|
+
export default RectangleROIStartEndThresholdTool;
|