feat(export-CSV) Export measurements to CSV file (#209)

This commit is contained in:
Gustavo André Lelis 2018-07-31 10:02:47 -03:00 committed by Erik Ziegler
parent 26b14f1dab
commit ced47c765f
4 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,25 @@
import { OHIF } from 'meteor/ohif:core';
import { getCSVMeasurementData } from '../reports/reportMeasurementDataToCSV';
const downloadCSV = (csvData, args = {}) => {
let data, link;
const filename = args.filename || 'export.csv';
if (csvData == null) return;
if (!csvData.match(/^data:text\/csv/i)) {
csvData = 'data:text/csv;charset=utf-8,' + csvData;
}
data = encodeURI(csvData);
link = document.createElement('a');
link.setAttribute('href', data);
link.setAttribute('download', filename);
link.click();
};
OHIF.measurements.exportCSV = async (measurementApi, timepointApi) => {
const csvData = await getCSVMeasurementData(measurementApi, timepointApi);
downloadCSV(csvData);
};

View File

@ -3,6 +3,7 @@ import './activateMeasurements';
import './clearCornerstoneToolState';
import './deactivateAllToolData';
import './exportPdf';
import './exportToCsv';
import './findAndRenderDisplaySet';
import './getActiveTimepoint';
import './getImageDataUrl';

View File

@ -0,0 +1,58 @@
import { moment } from 'meteor/momentjs:moment';
import { OHIF } from 'meteor/ohif:core';
export const getExportMeasurementData = async (measurementApi, timepointApi) => {
const currentTimepoint = timepointApi.current();
const { timepointId } = currentTimepoint;
const study = OHIF.viewer.Studies.findBy({
studyInstanceUid: currentTimepoint.studyInstanceUids[0]
});
const { studyDescription, patientId, studyDate } = study;
const patientName = OHIF.viewerbase.helpers.formatPN(study.patientName);
// All headers
const measurementData = {
patientName,
mrn: patientId,
studyDate: moment(studyDate).format('MMM DD YYYY'),
studyDescription,
data: []
};
const addNewMeasurement = async (measurement) => {
const imageId = OHIF.viewerbase.getImageIdForImagePath(measurement.imagePath);
const { seriesDescription, seriesDate, modality, seriesInstanceUid } = cornerstone.metaData.get('series', imageId);
const meanStdDev = measurement.meanStdDev || {};
measurementData.data.push({
seriesModality: modality,
seriesDate: moment(seriesDate).format('MMM DD YYYY'),
seriesDescription,
seriesInstanceUid,
measurementTool: measurement.toolType,
measurementDescription: OHIF.measurements.getLocationLabel(measurement.location) || 'No description',
number: measurement.measurementNumber,
length: measurement.length || '-',
mean: meanStdDev.mean || '-',
stdDev: meanStdDev.stdDev || '-',
area: measurement.area || '-'
});
};
let allMeasurements = [];
Object.keys(measurementApi.toolGroups).forEach( toolGroup => {
let measurements = measurementApi.fetch(toolGroup, { timepointId });
allMeasurements = allMeasurements.concat(measurements);
});
const iterator = allMeasurements[Symbol.iterator]();
let measurement;
let current = iterator.next();
while (!current.done) {
measurement = current.value;
await addNewMeasurement(measurement);
current = iterator.next();
}
return measurementData;
};

View File

@ -0,0 +1,51 @@
import { getExportMeasurementData } from "./reportMeasurementData";
const columnDelimiter = ',';
const lineDelimiter = '\n';
const headers = {
patientName: 'Patient Name',
mrn: 'MRN',
studyDate: 'Study Date',
seriesModality: 'Series Modality',
seriesDate: 'Series Date',
seriesDescription: 'Series Description',
seriesInstanceUid: 'Series InstanceUid',
measurementTool: 'Measurement Tool',
measurementDescription: 'Measurement Description',
length: 'Length',
mean: 'Mean',
stdDev: 'stdDev',
area: 'area'
};
export const getCSVMeasurementData = async (measurementApi, timepointApi) => {
let lineData = [];
let csvData = '';
const dataObject = await getExportMeasurementData(measurementApi, timepointApi);
for(header in headers) {
lineData.push(headers[header]);
}
csvData += lineData.join(columnDelimiter) + lineDelimiter;
for(measurementLine of dataObject.data) {
lineData = [
dataObject.patientName,
dataObject.mrn,
dataObject.studyDate,
measurementLine.seriesModality,
measurementLine.seriesDate,
measurementLine.seriesDescription,
measurementLine.seriesInstanceUid,
measurementLine.measurementTool,
measurementLine.measurementDescription,
measurementLine.length,
measurementLine.mean,
measurementLine.stdDev,
measurementLine.area
];
csvData += lineData.join(columnDelimiter) + lineDelimiter;
}
return csvData;
};