feat(export-CSV) Export measurements to CSV file (#209)
This commit is contained in:
parent
26b14f1dab
commit
ced47c765f
25
Packages/ohif-measurements/client/lib/exportToCsv.js
Normal file
25
Packages/ohif-measurements/client/lib/exportToCsv.js
Normal 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);
|
||||||
|
};
|
||||||
@ -3,6 +3,7 @@ import './activateMeasurements';
|
|||||||
import './clearCornerstoneToolState';
|
import './clearCornerstoneToolState';
|
||||||
import './deactivateAllToolData';
|
import './deactivateAllToolData';
|
||||||
import './exportPdf';
|
import './exportPdf';
|
||||||
|
import './exportToCsv';
|
||||||
import './findAndRenderDisplaySet';
|
import './findAndRenderDisplaySet';
|
||||||
import './getActiveTimepoint';
|
import './getActiveTimepoint';
|
||||||
import './getImageDataUrl';
|
import './getImageDataUrl';
|
||||||
|
|||||||
@ -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;
|
||||||
|
};
|
||||||
@ -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;
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue
Block a user