163 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
import * as cornerstoneTools from 'cornerstone-tools'
 | 
						|
const external = cornerstoneTools.external
 | 
						|
import getOrientationString from './getOrientationString'
 | 
						|
import invertOrientationString from './invertOrientationString'
 | 
						|
// const getOrientationString = cornerstoneTools.import('orientation/getOrientationString')
 | 
						|
// const invertOrientationString = cornerstoneTools.import('orientation/invertOrientationString')
 | 
						|
const getNewContext = cornerstoneTools.import('drawing/getNewContext')
 | 
						|
const drawTextBox = cornerstoneTools.import('drawing/drawTextBox')
 | 
						|
const textBoxWidth = cornerstoneTools.import('drawing/textBoxWidth')
 | 
						|
const toolColors = cornerstoneTools.toolColors
 | 
						|
 | 
						|
/**
 | 
						|
 * @public
 | 
						|
 * @class OrientationMarkersTool
 | 
						|
 * @memberof Tools
 | 
						|
 *
 | 
						|
 * @classdesc Tool for displaying orientation markers on the image.
 | 
						|
 * @extends Tools.Base.BaseTool
 | 
						|
 */
 | 
						|
export default class OrientationMarkersTool extends cornerstoneTools.OrientationMarkersTool {
 | 
						|
  constructor(props = {}) {
 | 
						|
    const defaultProps = {
 | 
						|
      name: 'OrientationMarkers',
 | 
						|
      configuration: {
 | 
						|
        drawAllMarkers: true
 | 
						|
      },
 | 
						|
      mixins: ['enabledOrDisabledBinaryTool']
 | 
						|
    }
 | 
						|
 | 
						|
    super(props, defaultProps)
 | 
						|
  }
 | 
						|
 | 
						|
  enabledCallback(element) {
 | 
						|
    this.forceImageUpdate(element)
 | 
						|
  }
 | 
						|
 | 
						|
  disabledCallback(element) {
 | 
						|
    this.forceImageUpdate(element)
 | 
						|
  }
 | 
						|
 | 
						|
  forceImageUpdate(element) {
 | 
						|
    const cornerstone = external.cornerstone
 | 
						|
    const enabledElement = cornerstone.getEnabledElement(element)
 | 
						|
 | 
						|
    if (enabledElement.image) {
 | 
						|
      cornerstone.updateImage(element)
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  renderToolData(evt) {
 | 
						|
    const eventData = evt.detail
 | 
						|
    const context = getNewContext(eventData.canvasContext.canvas)
 | 
						|
    const element = eventData.element
 | 
						|
    const markers = getOrientationMarkers(element)
 | 
						|
 | 
						|
    if (!markers) {
 | 
						|
      return
 | 
						|
    }
 | 
						|
 | 
						|
    const coords = getOrientationMarkerPositions(element, markers)
 | 
						|
 | 
						|
    const color = toolColors.getToolColor()
 | 
						|
 | 
						|
    const textWidths = {
 | 
						|
      top: textBoxWidth(context, markers.top, 0),
 | 
						|
      left: textBoxWidth(context, markers.left, 0),
 | 
						|
      right: textBoxWidth(context, markers.right, 0),
 | 
						|
      bottom: textBoxWidth(context, markers.bottom, 0),
 | 
						|
      height: textBoxWidth(context, 'M', 0) // Trick to get an approximation of the height of the text
 | 
						|
    }
 | 
						|
 | 
						|
    drawTopLeftText(context, markers, coords, textWidths, color)
 | 
						|
    if (this.configuration.drawAllMarkers) {
 | 
						|
      drawBottomRightText(context, markers, coords, textWidths, color)
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const drawTopLeftText = (context, markers, coords, textWidths, color) => {
 | 
						|
  drawTextBox(
 | 
						|
    context,
 | 
						|
    markers.top,
 | 
						|
    coords.top.x - textWidths.top / 2,
 | 
						|
    coords.top.y,
 | 
						|
    color
 | 
						|
  )
 | 
						|
  drawTextBox(
 | 
						|
    context,
 | 
						|
    markers.left,
 | 
						|
    coords.left.x - textWidths.left / 2,
 | 
						|
    coords.left.y,
 | 
						|
    color
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
const drawBottomRightText = (context, markers, coords, textWidths, color) => {
 | 
						|
  drawTextBox(
 | 
						|
    context,
 | 
						|
    markers.right,
 | 
						|
    coords.right.x - textWidths.right,
 | 
						|
    coords.right.y,
 | 
						|
    color
 | 
						|
  )
 | 
						|
  drawTextBox(
 | 
						|
    context,
 | 
						|
    markers.bottom,
 | 
						|
    coords.bottom.x - textWidths.bottom / 2,
 | 
						|
    coords.bottom.y - textWidths.height,
 | 
						|
    color
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
const getOrientationMarkers = element => {
 | 
						|
  const cornerstone = external.cornerstone
 | 
						|
  const enabledElement = cornerstone.getEnabledElement(element)
 | 
						|
  const imagePlane = cornerstone.metaData.get(
 | 
						|
    'imagePlaneModule',
 | 
						|
    enabledElement.image.imageId
 | 
						|
  )
 | 
						|
 | 
						|
  if (!imagePlane || !imagePlane.rowCosines || !imagePlane.columnCosines) {
 | 
						|
    return
 | 
						|
  }
 | 
						|
  const row = getOrientationString(imagePlane.rowCosines)
 | 
						|
  const column = getOrientationString(imagePlane.columnCosines)
 | 
						|
  const oppositeRow = invertOrientationString(row)
 | 
						|
  const oppositeColumn = invertOrientationString(column)
 | 
						|
 | 
						|
  return {
 | 
						|
    top: oppositeColumn,
 | 
						|
    bottom: column,
 | 
						|
    left: oppositeRow,
 | 
						|
    right: row
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const getOrientationMarkerPositions = element => {
 | 
						|
  const enabledElement = external.cornerstone.getEnabledElement(element)
 | 
						|
  const top = external.cornerstone.pixelToCanvas(element, {
 | 
						|
    x: enabledElement.image.width / 2,
 | 
						|
    y: 5
 | 
						|
  })
 | 
						|
  const bottom = external.cornerstone.pixelToCanvas(element, {
 | 
						|
    x: enabledElement.image.width / 2,
 | 
						|
    y: enabledElement.image.height - 15
 | 
						|
  })
 | 
						|
  const left = external.cornerstone.pixelToCanvas(element, {
 | 
						|
    x: 5,
 | 
						|
    y: enabledElement.image.height / 2
 | 
						|
  })
 | 
						|
  const right = external.cornerstone.pixelToCanvas(element, {
 | 
						|
    x: enabledElement.image.width - 10,
 | 
						|
    y: enabledElement.image.height / 2
 | 
						|
  })
 | 
						|
 | 
						|
  return {
 | 
						|
    top,
 | 
						|
    bottom,
 | 
						|
    left,
 | 
						|
    right
 | 
						|
  }
 | 
						|
}
 |