diff --git a/libs/insight-viewer/src/Viewer/CircleDrawer/index.tsx b/libs/insight-viewer/src/Viewer/CircleDrawer/index.tsx index 680f152a8..6de580e67 100644 --- a/libs/insight-viewer/src/Viewer/CircleDrawer/index.tsx +++ b/libs/insight-viewer/src/Viewer/CircleDrawer/index.tsx @@ -1,5 +1,5 @@ import React, { ReactElement } from 'react' - +import useTextBox from '../../hooks/useTextBox' import { useOverlayContext } from '../../contexts' import { getCircleEndPoint } from '../../utils/common/getCircleEndPoint' @@ -7,8 +7,11 @@ import { getCircleRadiusByCenter } from '../../utils/common/getCircleRadius' import { getCircleTextPosition } from '../../utils/common/getCircleTextPosition' import { getCircleConnectingLine } from '../../utils/common/getCircleConnectingLine' import { calculateCircleArea } from '../../utils/common/calculateCircleArea' +import { modifyConnectingLine } from '../../utils/common/modifyConnectingLine' +import { stringifyPoints } from '../../utils/common/stringifyPoints' import { svgWrapperStyle, textStyle } from '../Viewer.styles' +import { HALF_OF_RULER_TEXT_BOX } from '../../const' import type { CircleDrawerProps } from './CircleDrawer.types' @@ -18,6 +21,7 @@ export function CircleDrawer({ setMeasurementEditMode, }: CircleDrawerProps): ReactElement | null { const { pixelToCanvas } = useOverlayContext() + const [textBox, ref] = useTextBox() const { centerPoint, radius, measuredValue, unit } = measurement const endPoint = getCircleEndPoint(centerPoint, radius) @@ -30,12 +34,17 @@ export function CircleDrawer({ ? pixelToCanvas(measurement.textPoint) : getCircleTextPosition(centerPointOnCanvas, drawingRadius) - const connectingLine = getCircleConnectingLine([centerPointOnCanvas, endPointOnCanvas], textPointOnCanvas) - .map((point) => `${point[0]}, ${point[1]}`) - .join(' ') - const area = calculateCircleArea(measuredValue) + const textCenterModifier = textBox ? textBox.height / 2 - HALF_OF_RULER_TEXT_BOX : 0 + + const connectingLineToTextBoxCenter = getCircleConnectingLine( + [centerPointOnCanvas, endPointOnCanvas], + textPointOnCanvas + ) + const connectingLineToTextBoxEdge = modifyConnectingLine({ textBox, connectingLineToTextBoxCenter }) + const connectingLine = stringifyPoints(connectingLineToTextBoxEdge) + return ( <> + setMeasurementEditMode('textMove')} - style={{ ...textStyle[isSelectedMode ? 'select' : 'default'] }} + style={{ + ...textStyle[isSelectedMode ? 'select' : 'default'], + visibility: textBox !== null ? 'visible' : 'hidden', + }} x={textPointOnCanvas[0]} - y={textPointOnCanvas[1]} + y={textPointOnCanvas[1] + textCenterModifier} > {`Area = ${area.toLocaleString(undefined, { minimumFractionDigits: 1, maximumFractionDigits: 1, })}${unit}2`} - ) } diff --git a/libs/insight-viewer/src/Viewer/CircleViewer/index.tsx b/libs/insight-viewer/src/Viewer/CircleViewer/index.tsx index b5070c7c8..06f2448f6 100644 --- a/libs/insight-viewer/src/Viewer/CircleViewer/index.tsx +++ b/libs/insight-viewer/src/Viewer/CircleViewer/index.tsx @@ -1,7 +1,5 @@ import React, { ReactElement } from 'react' - -import { textStyle, svgWrapperStyle } from '../Viewer.styles' - +import useTextBox from '../../hooks/useTextBox' import { useOverlayContext } from '../../contexts' import { calculateCircleArea } from '../../utils/common/calculateCircleArea' @@ -9,10 +7,16 @@ import { getCircleRadiusByCenter } from '../../utils/common/getCircleRadius' import { getCircleEndPoint } from '../../utils/common/getCircleEndPoint' import { getCircleConnectingLine } from '../../utils/common/getCircleConnectingLine' import { getCircleTextPosition } from '../../utils/common/getCircleTextPosition' +import { modifyConnectingLine } from '../../utils/common/modifyConnectingLine' +import { stringifyPoints } from '../../utils/common/stringifyPoints' + +import { textStyle, svgWrapperStyle } from '../Viewer.styles' +import { HALF_OF_RULER_TEXT_BOX } from '../../const' import type { CircleViewerProps } from './CircleViewer.types' export function CircleViewer({ measurement, hoveredMeasurement }: CircleViewerProps): ReactElement { + const [textBox, ref] = useTextBox() const { pixelToCanvas } = useOverlayContext() const { centerPoint, radius, measuredValue, unit } = measurement @@ -26,13 +30,17 @@ export function CircleViewer({ measurement, hoveredMeasurement }: CircleViewerPr ? pixelToCanvas(measurement.textPoint) : getCircleTextPosition(centerPointOnCanvas, drawingRadius) - const connectingLine = getCircleConnectingLine([centerPointOnCanvas, endPointOnCanvas], textPointOnCanvas) - .map((point) => `${point[0]}, ${point[1]}`) - .join(' ') - const area = calculateCircleArea(measuredValue) const isHoveredMeasurement = measurement === hoveredMeasurement + const textCenterModifier = textBox ? textBox.height / 2 - HALF_OF_RULER_TEXT_BOX : 0 + + const connectingLineToTextBoxCenter = getCircleConnectingLine( + [centerPointOnCanvas, endPointOnCanvas], + textPointOnCanvas + ) + const connectingLineToTextBoxEdge = modifyConnectingLine({ textBox, connectingLineToTextBoxCenter }) + const connectingLine = stringifyPoints(connectingLineToTextBoxEdge) return ( <> @@ -63,17 +71,22 @@ export function CircleViewer({ measurement, hoveredMeasurement }: CircleViewerPr cy={centerPointOnCanvas[1]} r={drawingRadius} /> + + {`Area = ${area.toLocaleString(undefined, { minimumFractionDigits: 1, maximumFractionDigits: 1, })}${unit}2`} - ) }