164 lines
4.6 KiB
Plaintext
164 lines
4.6 KiB
Plaintext
/* eslint no-loop-func: 0 */ // --> OFF
|
|
import * as cornerstoneTools from 'cornerstone-tools'
|
|
const getPixelSpacing = cornerstoneTools.import('util/getPixelSpacing')
|
|
import updatePerpendicularLineHandles from './updatePerpendicularLineHandles'
|
|
const getModule = cornerstoneTools.getModule
|
|
const getToolState = cornerstoneTools.getToolState
|
|
const toolStyle = cornerstoneTools.toolStyle
|
|
const toolColors = cornerstoneTools.toolColors
|
|
const getNewContext = cornerstoneTools.import('drawing/getNewContext')
|
|
const draw = cornerstoneTools.import('drawing/draw')
|
|
const setShadow = cornerstoneTools.import('drawing/setShadow')
|
|
const drawLine = cornerstoneTools.import('drawing/drawLine')
|
|
const drawLinkedTextBox = cornerstoneTools.import('drawing/drawLinkedTextBox')
|
|
const drawHandles = cornerstoneTools.import('drawing/drawHandles')
|
|
|
|
export default function(evt) {
|
|
const eventData = evt.detail
|
|
const { element, canvasContext, image } = eventData
|
|
const {
|
|
handleRadius,
|
|
drawHandlesOnHover,
|
|
hideHandlesIfMoving,
|
|
renderDashed
|
|
} = this.configuration
|
|
|
|
const lineDash = getModule('globalConfiguration').configuration.lineDash
|
|
|
|
// If we have no toolData for this element, return immediately as there is nothing to do
|
|
const toolData = getToolState(element, this.name)
|
|
|
|
if (!toolData) {
|
|
return
|
|
}
|
|
|
|
const { rowPixelSpacing, colPixelSpacing } = getPixelSpacing(image)
|
|
|
|
// LT-29 Disable Target Measurements when pixel spacing is not available
|
|
if (!rowPixelSpacing || !colPixelSpacing) {
|
|
return
|
|
}
|
|
|
|
// We have tool data for this element - iterate over each one and draw it
|
|
const context = getNewContext(canvasContext.canvas)
|
|
|
|
let color
|
|
const lineWidth = toolStyle.getToolWidth()
|
|
|
|
for (let i = 0; i < toolData.data.length; i++) {
|
|
const data = toolData.data[i]
|
|
|
|
if (data.visible === false) {
|
|
continue
|
|
}
|
|
|
|
color = toolColors.getColorIfActive(data)
|
|
|
|
// Calculate the data measurements
|
|
if (data.invalidated === true) {
|
|
if (data.longestDiameter && data.shortestDiameter) {
|
|
this.throttledUpdateCachedStats(image, element, data)
|
|
} else {
|
|
this.updateCachedStats(image, element, data)
|
|
}
|
|
}
|
|
|
|
draw(context, context => {
|
|
// Configurable shadow
|
|
setShadow(context, this.configuration)
|
|
|
|
const {
|
|
start,
|
|
end,
|
|
perpendicularStart,
|
|
perpendicularEnd,
|
|
textBox
|
|
} = data.handles
|
|
|
|
const lineOptions = { color }
|
|
const perpendicularLineOptions = { color, strokeWidth }
|
|
|
|
if (renderDashed) {
|
|
lineOptions.lineDash = lineDash
|
|
perpendicularLineOptions.lineDash = lineDash
|
|
}
|
|
|
|
// Draw the measurement line
|
|
drawLine(context, element, start, end, lineOptions)
|
|
|
|
// Draw perpendicular line
|
|
const strokeWidth = lineWidth
|
|
|
|
updatePerpendicularLineHandles(eventData, data)
|
|
|
|
drawLine(
|
|
context,
|
|
element,
|
|
perpendicularStart,
|
|
perpendicularEnd,
|
|
perpendicularLineOptions
|
|
)
|
|
|
|
// Draw the handles
|
|
const handleOptions = {
|
|
color,
|
|
handleRadius,
|
|
drawHandlesIfActive: drawHandlesOnHover,
|
|
hideHandlesIfMoving
|
|
}
|
|
|
|
// Draw the handles
|
|
if (this.configuration.drawHandles) {
|
|
drawHandles(context, eventData, data.handles, handleOptions)
|
|
}
|
|
|
|
// Draw the textbox
|
|
// Move the textbox slightly to the right and upwards
|
|
// So that it sits beside the length tool handle
|
|
const xOffset = 10
|
|
const textBoxAnchorPoints = handles => [
|
|
handles.start,
|
|
handles.end,
|
|
handles.perpendicularStart,
|
|
handles.perpendicularEnd
|
|
]
|
|
|
|
const textLines = getTextBoxText(data, rowPixelSpacing, colPixelSpacing)
|
|
if (data.hasOwnProperty('remark')) {
|
|
textLines.unshift(data.remark)
|
|
}
|
|
drawLinkedTextBox(
|
|
context,
|
|
element,
|
|
textBox,
|
|
textLines,
|
|
data.handles,
|
|
textBoxAnchorPoints,
|
|
color,
|
|
lineWidth,
|
|
xOffset,
|
|
true
|
|
)
|
|
})
|
|
}
|
|
}
|
|
|
|
const getTextBoxText = (data, rowPixelSpacing, colPixelSpacing) => {
|
|
let suffix = ' mm'
|
|
|
|
if (!rowPixelSpacing || !colPixelSpacing) {
|
|
suffix = ' pixels'
|
|
}
|
|
|
|
const lengthText = ` L ${data.longestDiameter}${suffix}`
|
|
const widthText = ` W ${data.shortestDiameter}${suffix}`
|
|
|
|
const { labels } = data
|
|
|
|
if (labels && Array.isArray(labels)) {
|
|
return [...labels, lengthText, widthText]
|
|
}
|
|
|
|
return [lengthText, widthText]
|
|
}
|