dicom-microscopy-viewer-changed
Version:
Interactive web-based viewer for DICOM Microscopy Images
95 lines (90 loc) • 2.56 kB
JavaScript
import Enums from '../../enums'
import { _getUnitSuffix } from '../../utils'
import {
_getFeatureArea,
_getFeatureLength
} from '../../scoord3dUtils.js'
/**
* Format measure output.
*
* @param {Feature} feature feature
* @param {string} units units
*
* @return {string} The formatted measure of this feature
*
* @private
*/
export const _format = (feature, units, pyramid, affine) => {
const area = _getFeatureArea(feature, pyramid, affine)
const length = _getFeatureLength(feature, pyramid, affine)
const value = length || area || 0
return length
? `${value.toFixed(2)} ${units}`
: `${value.toFixed(2)} ${units}²`
}
/**
* Checks if feature has measurement markup properties.
*
* @param {object} feature
*
* @returns {boolean} true if feature has measurement markup properties
*
* @private
*/
const _isMeasurement = (feature) =>
Enums.Markup.Measurement === feature.get(Enums.InternalProperties.Markup)
/**
* Measurement markup definition.
*
* @param {object} dependencies - Shared dependencies
* @param {object} dependencies.map - Viewer's map instance
* @param {object} dependencies.pyramid - Pyramid metadata
* @param {number[][]} dependencies.affine - 3x3 affine transformation matrix
* @param {object} dependencies.markupManager - MarkupManager shared instance
*
* @private
*/
const MeasurementMarkup = ({ map, pyramid, affine, markupManager }) => {
return {
onAdd: (feature) => {
if (_isMeasurement(feature)) {
const view = map.getView()
const unitSuffix = _getUnitSuffix(view)
markupManager.create({
feature,
value: _format(feature, unitSuffix, pyramid, affine)
})
}
},
onFailure: (uid) => {
if (uid) {
markupManager.remove(uid)
}
},
onRemove: (feature) => {
if (_isMeasurement(feature)) {
const featureId = feature.getId()
markupManager.remove(featureId)
}
},
onDrawStart: ({ feature }) => {
if (_isMeasurement(feature)) {
markupManager.create({ feature })
}
},
onUpdate: (feature) => {
const view = map.getView()
const unitSuffix = _getUnitSuffix(view)
const id = feature.getId()
const markup = markupManager.get(id)
markupManager.update({
feature,
value: _format(feature, unitSuffix, pyramid, affine),
coordinate: markup.overlay.getPosition()
})
},
onDrawEnd: ({ feature }) => {},
onDrawAbort: ({ feature }) => {}
}
}
export default MeasurementMarkup