ohif-viewer/Packages/ohif-measurements/client/lib/activateLesion.js

119 lines
5.1 KiB
JavaScript

import { $ } from 'meteor/jquery';
import { OHIF } from 'meteor/ohif:core';
/**
* Activates a set of lesions when lesion table row is clicked
*
* @param measurementId The unique key for a specific Measurement
*/
OHIF.measurements.activateLesion = (measurementId, templateData) => {
// Set background color of selected row
$(`tr[data-measurementid=${measurementId}]`).addClass('selectedRow')
.siblings().removeClass('selectedRow');
// Get the data for current measurement
const measurementData = Measurements.findOne(measurementId);
// If there is no measurement with this ID, stop here
if (!measurementData) {
OHIF.OHIF.log.warn('No Measurements entry associated to an ID in a lesion table row');
return;
}
// Create an empty array to store the ordered timepoint data for this measurement
const orderedTimepointEntries = [];
// Retrieve the Cursor for this patient's Timepoints in ascending order by studyDate
const sortedTimepoints = Timepoints.find({}, {
sort: {
latestDate: 1
}
});
// Loop through each timepoint and populate the orderTimepointEntries array with the
// measurement data at each timepoint. The most recent measurements will be first in the array.
sortedTimepoints.forEach(timepoint => {
const measurementDataAtTimepoint = measurementData.timepoints[timepoint.timepointId];
if (!measurementDataAtTimepoint) {
return;
}
orderedTimepointEntries.push(measurementDataAtTimepoint);
});
// If there is no timepoint data to display for this Measurement, stop here
if (!orderedTimepointEntries.length) {
return;
}
// Retrieve the list of available viewports
const $viewports = $('.imageViewerViewport').not('.empty');
// Remove earlier timepoint data entries
if (orderedTimepointEntries.length > $viewports.length) {
const difference = orderedTimepointEntries.length - $viewports.length;
orderedTimepointEntries.splice(0, difference);
}
// Loop through the viewports and display each timepoint
$viewports.each((viewportIndex, element) => {
// Stop if we run out of timepoints before viewports
if (viewportIndex >= orderedTimepointEntries.length) {
// Update the element anyway, to remove any other highlights that are present
OHIF.measurements.deactivateAllToolData(element, 'bidirectional');
OHIF.measurements.deactivateAllToolData(element, 'nonTarget');
OHIF.measurements.deactivateAllToolData(element, 'crTool');
OHIF.measurements.deactivateAllToolData(element, 'unTool');
OHIF.measurements.deactivateAllToolData(element, 'exTool');
return false;
}
// Find measurements related to the Nth timepoint
// TODO=Re-evaluate this approach to populating viewports with timepoints
// What is the desired behaviour here?
const measurementAtTimepoint = orderedTimepointEntries[viewportIndex];
// Find the image that is currently in this viewport
const enabledElement = cornerstone.getEnabledElement(element);
if (!enabledElement || !enabledElement.image) {
return;
}
// If there is no measurement data to display, stop here
if (!measurementAtTimepoint) {
// Update the element anyway, to remove any other highlights that are present
OHIF.measurements.deactivateAllToolData(element, 'bidirectional');
OHIF.measurements.deactivateAllToolData(element, 'nonTarget');
OHIF.measurements.deactivateAllToolData(element, 'crTool');
OHIF.measurements.deactivateAllToolData(element, 'unTool');
OHIF.measurements.deactivateAllToolData(element, 'exTool');
cornerstone.updateImage(element);
return;
}
// Check which study and series are required to display the measurement at this timepoint
const requiredSeriesData = {
seriesInstanceUid: measurementAtTimepoint.seriesInstanceUid,
studyInstanceUid: measurementAtTimepoint.studyInstanceUid
};
// Check if the study / series we need is already the one in the viewport
const currentSeriesData = OHIF.viewer.loadedSeriesData[viewportIndex];
const activateMeasurements = OHIF.measurements.activateMeasurements;
if (currentSeriesData.seriesInstanceUid === measurementAtTimepoint.seriesInstanceUid &&
currentSeriesData.studyInstanceUid === measurementAtTimepoint.studyInstanceUid) {
// If it is, activate the measurements in this viewport and stop here
activateMeasurements(element, measurementId, templateData, viewportIndex);
return;
}
// Otherwise, re-render the viewport with the required study/series, then
// add an onRendered callback to activate the measurements
window.layoutManager.rerenderViewportWithNewDisplaySet(element, requiredSeriesData, element => {
activateMeasurements(element, measurementId, templateData, viewportIndex);
});
});
};