@cornerstonejs/tools 0.56.2 → 0.56.4
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/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,24 @@
|
|
|
1
|
+
import MouseCursor, { standardCursorNames } from './MouseCursor';
|
|
2
|
+
import ImageMouseCursor from './ImageMouseCursor';
|
|
3
|
+
import SVGMouseCursor from './SVGMouseCursor';
|
|
4
|
+
import * as elementCursor from './elementCursor';
|
|
5
|
+
import setCursorForElement from './setCursorForElement';
|
|
6
|
+
import {
|
|
7
|
+
registerCursor,
|
|
8
|
+
svgCursorNames,
|
|
9
|
+
CursorSVG,
|
|
10
|
+
} from './SVGCursorDescriptor';
|
|
11
|
+
|
|
12
|
+
// Todo: this should be enum
|
|
13
|
+
const CursorNames = [...svgCursorNames, ...standardCursorNames];
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
MouseCursor,
|
|
17
|
+
ImageMouseCursor,
|
|
18
|
+
SVGMouseCursor,
|
|
19
|
+
elementCursor,
|
|
20
|
+
registerCursor,
|
|
21
|
+
CursorNames,
|
|
22
|
+
CursorSVG,
|
|
23
|
+
setCursorForElement,
|
|
24
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { setElementCursor } from './elementCursor';
|
|
2
|
+
import MouseCursor from './MouseCursor';
|
|
3
|
+
import SVGMouseCursor from './SVGMouseCursor';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Set the cursor for an HTML element. cursorNames can be either
|
|
7
|
+
* cornerstone3DTools cursors or standard cursors.
|
|
8
|
+
*
|
|
9
|
+
* @param element - The element to set the cursor on.
|
|
10
|
+
* @param cursorName - The name of the cursor to set. This can be
|
|
11
|
+
* any cursor name either Cornerstone-specific cursor names or the standard
|
|
12
|
+
* CSS cursor names.
|
|
13
|
+
*/
|
|
14
|
+
function setCursorForElement(
|
|
15
|
+
element: HTMLDivElement,
|
|
16
|
+
cursorName: string
|
|
17
|
+
): void {
|
|
18
|
+
let cursor = SVGMouseCursor.getDefinedCursor(cursorName, true);
|
|
19
|
+
if (!cursor) {
|
|
20
|
+
cursor = MouseCursor.getDefinedCursor(cursorName);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!cursor) {
|
|
24
|
+
console.log(
|
|
25
|
+
`Cursor ${cursorName} is not defined either as SVG or as a standard cursor.`
|
|
26
|
+
);
|
|
27
|
+
cursor = MouseCursor.getDefinedCursor(cursorName);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
setElementCursor(element, cursor);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default setCursorForElement;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function _setAttributesIfNecessary(attributes, svgNode) {
|
|
2
|
+
Object.keys(attributes).forEach((key) => {
|
|
3
|
+
const currentValue = svgNode.getAttribute(key);
|
|
4
|
+
const newValue = attributes[key];
|
|
5
|
+
if (newValue === undefined || newValue === '') {
|
|
6
|
+
svgNode.removeAttribute(key);
|
|
7
|
+
} else if (currentValue !== newValue) {
|
|
8
|
+
svgNode.setAttribute(key, newValue);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default _setAttributesIfNecessary;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function _setNewAttributesIfValid(attributes, svgNode) {
|
|
2
|
+
Object.keys(attributes).forEach((key) => {
|
|
3
|
+
const newValue = attributes[key];
|
|
4
|
+
if (newValue !== undefined && newValue !== '') {
|
|
5
|
+
svgNode.setAttribute(key, newValue);
|
|
6
|
+
}
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default _setNewAttributesIfValid;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import getSvgDrawingHelper from './getSvgDrawingHelper';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* We are not using it anywhere yet.
|
|
5
|
+
* @param element
|
|
6
|
+
* @param toolType
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
function clearByToolType(element: HTMLDivElement, toolType: string): void {
|
|
10
|
+
const svgDrawingHelper = getSvgDrawingHelper(element);
|
|
11
|
+
const nodes = svgDrawingHelper.svgLayerElement.querySelectorAll(
|
|
12
|
+
'svg > *'
|
|
13
|
+
) as NodeListOf<SVGElement>;
|
|
14
|
+
|
|
15
|
+
// Todo: check variable namings when this function starts to get utilized
|
|
16
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
17
|
+
const node = nodes[i];
|
|
18
|
+
const toolUID = node.dataset.toolUid;
|
|
19
|
+
|
|
20
|
+
if (toolUID === toolType) {
|
|
21
|
+
svgDrawingHelper.svgLayerElement.removeChild(node);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default clearByToolType;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import getSvgDrawingHelper from './getSvgDrawingHelper';
|
|
2
|
+
|
|
3
|
+
function draw(
|
|
4
|
+
element: HTMLDivElement,
|
|
5
|
+
fn: (svgDrawingElement: any) => any
|
|
6
|
+
): void {
|
|
7
|
+
const svgDrawingHelper = getSvgDrawingHelper(element);
|
|
8
|
+
|
|
9
|
+
// Save...
|
|
10
|
+
fn(svgDrawingHelper);
|
|
11
|
+
// Restore...
|
|
12
|
+
|
|
13
|
+
svgDrawingHelper.clearUntouched();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default draw;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
import { SVGDrawingHelper } from '../types';
|
|
3
|
+
import drawLine from './drawLine';
|
|
4
|
+
|
|
5
|
+
export default function drawArrow(
|
|
6
|
+
svgDrawingHelper: SVGDrawingHelper,
|
|
7
|
+
annotationUID: string,
|
|
8
|
+
arrowUID: string,
|
|
9
|
+
start: Types.Point2,
|
|
10
|
+
end: Types.Point2,
|
|
11
|
+
options = {}
|
|
12
|
+
): void {
|
|
13
|
+
// if length is NaN return
|
|
14
|
+
if (isNaN(start[0]) || isNaN(start[1]) || isNaN(end[0]) || isNaN(end[1])) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { color, width, lineWidth, lineDash } = Object.assign(
|
|
19
|
+
{
|
|
20
|
+
color: 'dodgerblue',
|
|
21
|
+
width: '2',
|
|
22
|
+
lineWidth: undefined,
|
|
23
|
+
lineDash: undefined,
|
|
24
|
+
},
|
|
25
|
+
options
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// The line itself
|
|
29
|
+
drawLine(svgDrawingHelper, annotationUID, arrowUID, start, end, {
|
|
30
|
+
color,
|
|
31
|
+
width,
|
|
32
|
+
lineWidth,
|
|
33
|
+
lineDash,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Drawing the head arrow with two lines
|
|
37
|
+
// Variables to be used when creating the arrow
|
|
38
|
+
const headLength = 10;
|
|
39
|
+
const angle = Math.atan2(end[1] - start[1], end[0] - start[0]);
|
|
40
|
+
|
|
41
|
+
const firstLine = {
|
|
42
|
+
start: [
|
|
43
|
+
end[0] - headLength * Math.cos(angle - Math.PI / 7),
|
|
44
|
+
end[1] - headLength * Math.sin(angle - Math.PI / 7),
|
|
45
|
+
] as Types.Point2,
|
|
46
|
+
end: end,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const secondLine = {
|
|
50
|
+
start: [
|
|
51
|
+
end[0] - headLength * Math.cos(angle + Math.PI / 7),
|
|
52
|
+
end[1] - headLength * Math.sin(angle + Math.PI / 7),
|
|
53
|
+
] as Types.Point2,
|
|
54
|
+
end: end,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
drawLine(
|
|
58
|
+
svgDrawingHelper,
|
|
59
|
+
annotationUID,
|
|
60
|
+
'2',
|
|
61
|
+
firstLine.start,
|
|
62
|
+
firstLine.end,
|
|
63
|
+
{
|
|
64
|
+
color,
|
|
65
|
+
width,
|
|
66
|
+
lineWidth,
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
drawLine(
|
|
71
|
+
svgDrawingHelper,
|
|
72
|
+
annotationUID,
|
|
73
|
+
'3',
|
|
74
|
+
secondLine.start,
|
|
75
|
+
secondLine.end,
|
|
76
|
+
{
|
|
77
|
+
color,
|
|
78
|
+
width,
|
|
79
|
+
lineWidth,
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
import { SVGDrawingHelper } from '../types';
|
|
3
|
+
|
|
4
|
+
import _getHash from './_getHash';
|
|
5
|
+
|
|
6
|
+
import _setAttributesIfNecessary from './_setAttributesIfNecessary';
|
|
7
|
+
import _setNewAttributesIfValid from './_setNewAttributesIfValid';
|
|
8
|
+
|
|
9
|
+
function drawCircle(
|
|
10
|
+
svgDrawingHelper: SVGDrawingHelper,
|
|
11
|
+
annotationUID: string,
|
|
12
|
+
circleUID: string,
|
|
13
|
+
center: Types.Point2,
|
|
14
|
+
radius: number,
|
|
15
|
+
options = {},
|
|
16
|
+
dataId = ''
|
|
17
|
+
): void {
|
|
18
|
+
const { color, fill, width, lineWidth } = Object.assign(
|
|
19
|
+
{
|
|
20
|
+
color: 'dodgerblue',
|
|
21
|
+
fill: 'transparent',
|
|
22
|
+
width: '2',
|
|
23
|
+
lineWidth: undefined,
|
|
24
|
+
},
|
|
25
|
+
options
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// for supporting both lineWidth and width options
|
|
29
|
+
const strokeWidth = lineWidth || width;
|
|
30
|
+
|
|
31
|
+
// variable for the namespace
|
|
32
|
+
const svgns = 'http://www.w3.org/2000/svg';
|
|
33
|
+
const svgNodeHash = _getHash(annotationUID, 'circle', circleUID);
|
|
34
|
+
const existingCircleElement = svgDrawingHelper.getSvgNode(svgNodeHash);
|
|
35
|
+
|
|
36
|
+
const attributes = {
|
|
37
|
+
cx: `${center[0]}`,
|
|
38
|
+
cy: `${center[1]}`,
|
|
39
|
+
r: `${radius}`,
|
|
40
|
+
stroke: color,
|
|
41
|
+
fill,
|
|
42
|
+
'stroke-width': strokeWidth,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
if (existingCircleElement) {
|
|
46
|
+
_setAttributesIfNecessary(attributes, existingCircleElement);
|
|
47
|
+
|
|
48
|
+
svgDrawingHelper.setNodeTouched(svgNodeHash);
|
|
49
|
+
} else {
|
|
50
|
+
const newCircleElement = document.createElementNS(svgns, 'circle');
|
|
51
|
+
|
|
52
|
+
if (dataId !== '') {
|
|
53
|
+
newCircleElement.setAttribute('data-id', dataId);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
_setNewAttributesIfValid(attributes, newCircleElement);
|
|
57
|
+
|
|
58
|
+
svgDrawingHelper.appendNode(newCircleElement, svgNodeHash);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export default drawCircle;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
import { SVGDrawingHelper } from '../types';
|
|
3
|
+
|
|
4
|
+
import _getHash from './_getHash';
|
|
5
|
+
import _setAttributesIfNecessary from './_setAttributesIfNecessary';
|
|
6
|
+
import _setNewAttributesIfValid from './_setNewAttributesIfValid';
|
|
7
|
+
|
|
8
|
+
function drawEllipse(
|
|
9
|
+
svgDrawingHelper: SVGDrawingHelper,
|
|
10
|
+
annotationUID: string,
|
|
11
|
+
ellipseUID: string,
|
|
12
|
+
corner1: Types.Point2,
|
|
13
|
+
corner2: Types.Point2,
|
|
14
|
+
options = {},
|
|
15
|
+
dataId = ''
|
|
16
|
+
): void {
|
|
17
|
+
const { color, width, lineWidth, lineDash } = Object.assign(
|
|
18
|
+
{
|
|
19
|
+
color: 'dodgerblue',
|
|
20
|
+
width: '2',
|
|
21
|
+
lineWidth: undefined,
|
|
22
|
+
lineDash: undefined,
|
|
23
|
+
},
|
|
24
|
+
options
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
// for supporting both lineWidth and width options
|
|
28
|
+
const strokeWidth = lineWidth || width;
|
|
29
|
+
|
|
30
|
+
const svgns = 'http://www.w3.org/2000/svg';
|
|
31
|
+
const svgNodeHash = _getHash(annotationUID, 'ellipse', ellipseUID);
|
|
32
|
+
const existingEllipse = svgDrawingHelper.getSvgNode(svgNodeHash);
|
|
33
|
+
|
|
34
|
+
const w = Math.abs(corner1[0] - corner2[0]);
|
|
35
|
+
const h = Math.abs(corner1[1] - corner2[1]);
|
|
36
|
+
const xMin = Math.min(corner1[0], corner2[0]);
|
|
37
|
+
const yMin = Math.min(corner1[1], corner2[1]);
|
|
38
|
+
|
|
39
|
+
const center = [xMin + w / 2, yMin + h / 2];
|
|
40
|
+
const radiusX = w / 2;
|
|
41
|
+
const radiusY = h / 2;
|
|
42
|
+
|
|
43
|
+
const attributes = {
|
|
44
|
+
cx: `${center[0]}`,
|
|
45
|
+
cy: `${center[1]}`,
|
|
46
|
+
rx: `${radiusX}`,
|
|
47
|
+
ry: `${radiusY}`,
|
|
48
|
+
stroke: color,
|
|
49
|
+
fill: 'transparent',
|
|
50
|
+
'stroke-width': strokeWidth,
|
|
51
|
+
'stroke-dasharray': lineDash,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
if (existingEllipse) {
|
|
55
|
+
_setAttributesIfNecessary(attributes, existingEllipse);
|
|
56
|
+
|
|
57
|
+
svgDrawingHelper.setNodeTouched(svgNodeHash);
|
|
58
|
+
} else {
|
|
59
|
+
const svgEllipseElement = document.createElementNS(svgns, 'ellipse');
|
|
60
|
+
|
|
61
|
+
if (dataId !== '') {
|
|
62
|
+
svgEllipseElement.setAttribute('data-id', dataId);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
_setNewAttributesIfValid(attributes, svgEllipseElement);
|
|
66
|
+
|
|
67
|
+
svgDrawingHelper.appendNode(svgEllipseElement, svgNodeHash);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default drawEllipse;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
|
|
3
|
+
import _getHash from './_getHash';
|
|
4
|
+
import _setNewAttributesIfValid from './_setNewAttributesIfValid';
|
|
5
|
+
import _setAttributesIfNecessary from './_setAttributesIfNecessary';
|
|
6
|
+
import { SVGDrawingHelper } from '../types';
|
|
7
|
+
|
|
8
|
+
function drawHandles(
|
|
9
|
+
svgDrawingHelper: SVGDrawingHelper,
|
|
10
|
+
annotationUID: string,
|
|
11
|
+
handleGroupUID: string,
|
|
12
|
+
handlePoints: Array<Types.Point2>,
|
|
13
|
+
options = {}
|
|
14
|
+
): void {
|
|
15
|
+
const { color, handleRadius, width, lineWidth, fill, type } = Object.assign(
|
|
16
|
+
{
|
|
17
|
+
color: 'dodgerblue',
|
|
18
|
+
handleRadius: '6',
|
|
19
|
+
width: '2',
|
|
20
|
+
lineWidth: undefined,
|
|
21
|
+
fill: 'transparent',
|
|
22
|
+
type: 'circle',
|
|
23
|
+
},
|
|
24
|
+
options
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
// for supporting both lineWidth and width options
|
|
28
|
+
const strokeWidth = lineWidth || width;
|
|
29
|
+
|
|
30
|
+
for (let i = 0; i < handlePoints.length; i++) {
|
|
31
|
+
const handle = handlePoints[i];
|
|
32
|
+
|
|
33
|
+
// variable for the namespace
|
|
34
|
+
const svgns = 'http://www.w3.org/2000/svg';
|
|
35
|
+
const svgNodeHash = _getHash(
|
|
36
|
+
annotationUID,
|
|
37
|
+
'handle',
|
|
38
|
+
`hg-${handleGroupUID}-index-${i}`
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
let attributes;
|
|
42
|
+
if (type === 'circle') {
|
|
43
|
+
attributes = {
|
|
44
|
+
cx: `${handle[0]}`,
|
|
45
|
+
cy: `${handle[1]}`,
|
|
46
|
+
r: handleRadius,
|
|
47
|
+
stroke: color,
|
|
48
|
+
fill,
|
|
49
|
+
'stroke-width': strokeWidth,
|
|
50
|
+
};
|
|
51
|
+
} else if (type === 'rect') {
|
|
52
|
+
const handleRadiusFloat = parseFloat(handleRadius);
|
|
53
|
+
const side = handleRadiusFloat * 1.5;
|
|
54
|
+
const x = handle[0] - side * 0.5;
|
|
55
|
+
const y = handle[1] - side * 0.5;
|
|
56
|
+
|
|
57
|
+
attributes = {
|
|
58
|
+
x: `${x}`,
|
|
59
|
+
y: `${y}`,
|
|
60
|
+
width: `${side}`,
|
|
61
|
+
height: `${side}`,
|
|
62
|
+
stroke: color,
|
|
63
|
+
fill,
|
|
64
|
+
'stroke-width': strokeWidth,
|
|
65
|
+
rx: `${side * 0.1}`,
|
|
66
|
+
};
|
|
67
|
+
} else {
|
|
68
|
+
throw new Error(`Unsupported handle type: ${type}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const existingHandleElement = svgDrawingHelper.getSvgNode(svgNodeHash);
|
|
72
|
+
|
|
73
|
+
if (existingHandleElement) {
|
|
74
|
+
_setAttributesIfNecessary(attributes, existingHandleElement);
|
|
75
|
+
|
|
76
|
+
svgDrawingHelper.setNodeTouched(svgNodeHash);
|
|
77
|
+
} else {
|
|
78
|
+
const newHandleElement = document.createElementNS(svgns, type);
|
|
79
|
+
|
|
80
|
+
_setNewAttributesIfValid(attributes, newHandleElement);
|
|
81
|
+
|
|
82
|
+
svgDrawingHelper.appendNode(newHandleElement, svgNodeHash);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export default drawHandles;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
|
|
3
|
+
import _getHash from './_getHash';
|
|
4
|
+
import _setNewAttributesIfValid from './_setNewAttributesIfValid';
|
|
5
|
+
import _setAttributesIfNecessary from './_setAttributesIfNecessary';
|
|
6
|
+
import { SVGDrawingHelper } from '../types';
|
|
7
|
+
|
|
8
|
+
export default function drawLine(
|
|
9
|
+
svgDrawingHelper: SVGDrawingHelper,
|
|
10
|
+
annotationUID: string,
|
|
11
|
+
lineUID: string,
|
|
12
|
+
start: Types.Point2,
|
|
13
|
+
end: Types.Point2,
|
|
14
|
+
options = {},
|
|
15
|
+
dataId = ''
|
|
16
|
+
): void {
|
|
17
|
+
// if length is NaN return
|
|
18
|
+
if (isNaN(start[0]) || isNaN(start[1]) || isNaN(end[0]) || isNaN(end[1])) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const { color, width, lineWidth, lineDash, shadow } = Object.assign(
|
|
23
|
+
{
|
|
24
|
+
color: 'dodgerblue',
|
|
25
|
+
width: '2',
|
|
26
|
+
lineWidth: undefined,
|
|
27
|
+
lineDash: undefined,
|
|
28
|
+
shadow: undefined,
|
|
29
|
+
},
|
|
30
|
+
options
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
// for supporting both lineWidth and width options
|
|
34
|
+
const strokeWidth = lineWidth || width;
|
|
35
|
+
|
|
36
|
+
const svgns = 'http://www.w3.org/2000/svg';
|
|
37
|
+
const svgNodeHash = _getHash(annotationUID, 'line', lineUID);
|
|
38
|
+
const existingLine = svgDrawingHelper.getSvgNode(svgNodeHash);
|
|
39
|
+
const dropShadowStyle = shadow
|
|
40
|
+
? `filter:url(#shadow-${svgDrawingHelper.svgLayerElement.id});`
|
|
41
|
+
: '';
|
|
42
|
+
|
|
43
|
+
const attributes = {
|
|
44
|
+
x1: `${start[0]}`,
|
|
45
|
+
y1: `${start[1]}`,
|
|
46
|
+
x2: `${end[0]}`,
|
|
47
|
+
y2: `${end[1]}`,
|
|
48
|
+
stroke: color,
|
|
49
|
+
style: dropShadowStyle,
|
|
50
|
+
'stroke-width': strokeWidth,
|
|
51
|
+
'stroke-dasharray': lineDash,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
if (existingLine) {
|
|
55
|
+
// This is run to avoid re-rendering annotations that actually haven't changed
|
|
56
|
+
_setAttributesIfNecessary(attributes, existingLine);
|
|
57
|
+
|
|
58
|
+
svgDrawingHelper.setNodeTouched(svgNodeHash);
|
|
59
|
+
} else {
|
|
60
|
+
const newLine = document.createElementNS(svgns, 'line');
|
|
61
|
+
|
|
62
|
+
if (dataId !== '') {
|
|
63
|
+
newLine.setAttribute('data-id', dataId);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
_setNewAttributesIfValid(attributes, newLine);
|
|
67
|
+
|
|
68
|
+
svgDrawingHelper.appendNode(newLine, svgNodeHash);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
|
|
3
|
+
import drawLine from './drawLine';
|
|
4
|
+
import findClosestPoint from '../utilities/math/vec2/findClosestPoint';
|
|
5
|
+
import { PlanarBoundingBox, SVGDrawingHelper } from '../types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Draw a link between an annotation to a box.
|
|
9
|
+
*/
|
|
10
|
+
function drawLink(
|
|
11
|
+
svgDrawingHelper: SVGDrawingHelper,
|
|
12
|
+
annotationUID: string,
|
|
13
|
+
linkUID: string,
|
|
14
|
+
// Find closest point to approx. bounding box
|
|
15
|
+
annotationAnchorPoints: Array<Types.Point2>,
|
|
16
|
+
refPoint: Types.Point2,
|
|
17
|
+
// Find bounding box point that's closest to our identified
|
|
18
|
+
// start point
|
|
19
|
+
boundingBox: PlanarBoundingBox,
|
|
20
|
+
options = {}
|
|
21
|
+
): void {
|
|
22
|
+
// The closest anchor point (for the annotation) to the
|
|
23
|
+
// text box / bounding box
|
|
24
|
+
const start =
|
|
25
|
+
annotationAnchorPoints.length > 0
|
|
26
|
+
? findClosestPoint(annotationAnchorPoints, refPoint)
|
|
27
|
+
: refPoint;
|
|
28
|
+
|
|
29
|
+
// Calculate the midpoints of the bounding box
|
|
30
|
+
const boundingBoxPoints = _boundingBoxPoints(boundingBox);
|
|
31
|
+
// Find the closest textBox midpoint to the annotation's anchor/start point
|
|
32
|
+
const end = findClosestPoint(boundingBoxPoints, start);
|
|
33
|
+
|
|
34
|
+
// Finally we draw the dashed linking line
|
|
35
|
+
const mergedOptions = Object.assign(
|
|
36
|
+
{
|
|
37
|
+
color: 'rgb(255, 255, 0)',
|
|
38
|
+
lineWidth: '1',
|
|
39
|
+
lineDash: '2,3',
|
|
40
|
+
},
|
|
41
|
+
options
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
drawLine(
|
|
45
|
+
svgDrawingHelper,
|
|
46
|
+
annotationUID,
|
|
47
|
+
`link-${linkUID}`,
|
|
48
|
+
start,
|
|
49
|
+
end,
|
|
50
|
+
mergedOptions
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Find potential anchor points for a given bounding box. For example, it may
|
|
56
|
+
* look nicer to draw a line from the "middle left" of a bounding box to an
|
|
57
|
+
* annotation (instead of from a corner). This function calculates those points
|
|
58
|
+
*
|
|
59
|
+
* @param boundingBox
|
|
60
|
+
*/
|
|
61
|
+
function _boundingBoxPoints(
|
|
62
|
+
boundingBox: PlanarBoundingBox
|
|
63
|
+
): Array<Types.Point2> {
|
|
64
|
+
const { x: left, y: top, height, width } = boundingBox;
|
|
65
|
+
const halfWidth = width / 2;
|
|
66
|
+
const halfHeight = height / 2;
|
|
67
|
+
|
|
68
|
+
const topMiddle = [left + halfWidth, top] as Types.Point2;
|
|
69
|
+
const leftMiddle = [left, top + halfHeight] as Types.Point2;
|
|
70
|
+
const bottomMiddle = [left + halfWidth, top + height] as Types.Point2;
|
|
71
|
+
const rightMiddle = [left + width, top + halfHeight] as Types.Point2;
|
|
72
|
+
|
|
73
|
+
return [topMiddle, leftMiddle, bottomMiddle, rightMiddle];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default drawLink;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
2
|
+
|
|
3
|
+
import drawTextBox from './drawTextBox';
|
|
4
|
+
import drawLink from './drawLink';
|
|
5
|
+
import { SVGDrawingHelper } from '../types';
|
|
6
|
+
|
|
7
|
+
function drawLinkedTextBox(
|
|
8
|
+
svgDrawingHelper: SVGDrawingHelper,
|
|
9
|
+
annotationUID: string,
|
|
10
|
+
textBoxUID: string,
|
|
11
|
+
//
|
|
12
|
+
textLines: Array<string>,
|
|
13
|
+
textBoxPosition: Types.Point2,
|
|
14
|
+
annotationAnchorPoints: Array<Types.Point2>,
|
|
15
|
+
textBox: unknown,
|
|
16
|
+
options = {}
|
|
17
|
+
// TODO: yCenter as an option
|
|
18
|
+
): SVGRect {
|
|
19
|
+
const mergedOptions = Object.assign(
|
|
20
|
+
{
|
|
21
|
+
handleRadius: '6',
|
|
22
|
+
centering: {
|
|
23
|
+
x: false,
|
|
24
|
+
y: true, // yCenter,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
options
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// Draw the text box
|
|
31
|
+
const canvasBoundingBox = drawTextBox(
|
|
32
|
+
svgDrawingHelper,
|
|
33
|
+
annotationUID,
|
|
34
|
+
textBoxUID,
|
|
35
|
+
textLines,
|
|
36
|
+
textBoxPosition,
|
|
37
|
+
mergedOptions
|
|
38
|
+
);
|
|
39
|
+
// if (textBox.hasMoved) {
|
|
40
|
+
// // Draw dashed link line between tool and text
|
|
41
|
+
drawLink(
|
|
42
|
+
svgDrawingHelper,
|
|
43
|
+
annotationUID,
|
|
44
|
+
textBoxUID,
|
|
45
|
+
annotationAnchorPoints, // annotationAnchorPoints
|
|
46
|
+
textBoxPosition, // refPoint (text)
|
|
47
|
+
canvasBoundingBox, // textBoxBoundingBox
|
|
48
|
+
mergedOptions
|
|
49
|
+
);
|
|
50
|
+
// }
|
|
51
|
+
|
|
52
|
+
// const { top, left, width, height } = canvasBoundingBox
|
|
53
|
+
|
|
54
|
+
// textBox.worldBoundingBox = {
|
|
55
|
+
// topLeft: canvasToWorld([left, top]),
|
|
56
|
+
// topRight: canvasToWorld([left + width, top]),
|
|
57
|
+
// bottomLeft: canvasToWorld([left, top + height]),
|
|
58
|
+
// bottomRight: canvasToWorld([left + width, top + height]),
|
|
59
|
+
// }
|
|
60
|
+
|
|
61
|
+
return canvasBoundingBox;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default drawLinkedTextBox;
|