-
Notifications
You must be signed in to change notification settings - Fork 61
/
processFiles.js
153 lines (142 loc) · 6.01 KB
/
processFiles.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import readImageFile from 'itk/readImageFile';
import readImageDICOMFileSeries from 'itk/readImageDICOMFileSeries';
import readMeshFile from 'itk/readMeshFile';
import readPolyDataFile from 'itk/readPolyDataFile';
import runPipelineBrowser from 'itk/runPipelineBrowser'
import IOTypes from 'itk/IOTypes'
import getFileExtension from 'itk/getFileExtension'
import extensionToMeshIO from 'itk/extensionToMeshIO'
import extensionToPolyDataIO from 'itk/extensionToPolyDataIO'
import vtk from 'vtk.js/Sources/vtk'
import vtkXMLPolyDataReader from 'vtk.js/Sources/IO/XML/XMLPolyDataReader'
import vtkXMLImageDataReader from 'vtk.js/Sources/IO/XML/XMLImageDataReader'
import PromiseFileReader from 'promise-file-reader'
import vtkITKHelper from 'vtk.js/Sources/Common/DataModel/ITKHelper';
import UserInterface from './UserInterface';
import createViewer from './createViewer';
function typedArrayForBuffer(typedArrayType, buffer) {
let typedArrayFunction = null
if(typeof window !== 'undefined') {
// browser
typedArrayFunction = window[typedArrayType]
} else {
typedArrayFunction = global[typedArrayType]
}
return new typedArrayFunction(buffer)
}
const processFiles = (container, { files, use2D }) => {
UserInterface.emptyContainer(container);
UserInterface.createLoadingProgress(container);
let readDICOMSeries = readImageDICOMFileSeries;
if (files.length < 2) {
readDICOMSeries = function() {
return Promise.reject('Skip DICOM series read attempt');
}
}
/* eslint-disable new-cap */
return new Promise((resolve, reject) => {
readDICOMSeries(null, files).then(({ image: itkImage, webWorker }) => {
webWorker.terminate()
const imageData = vtkITKHelper.convertItkToVtkImage(itkImage);
const is3D = itkImage.imageType.dimension === 3 && !use2D;
resolve(
createViewer(container, {
image: imageData,
use2D: !is3D,
})
);
}).catch((error) => {
const readers = Array.from(files).map((file) => {
const extension = getFileExtension(file.name)
if(extension === 'vti') {
return PromiseFileReader.readAsArrayBuffer(file)
.then(fileContents => {
const vtiReader = vtkXMLImageDataReader.newInstance()
vtiReader.parseAsArrayBuffer(fileContents)
return Promise.resolve({ is3D: true, data: vtiReader.getOutputData(0)})
})
}
else if(extensionToPolyDataIO.has(extension)) {
return readPolyDataFile(null, file).then(({ polyData, webWorker }) => {
webWorker.terminate()
const is3D = true
return Promise.resolve({ is3D, data: vtk(polyData) })
}).catch((error) => {
reject(error)
})
} else if(extensionToMeshIO.has(extension)) {
let is3D = true
const read0 = performance.now()
let convert0 = null
return readMeshFile(null, file).then(({ mesh: itkMesh, webWorker }) => {
const read1 = performance.now();
const duration = Number(read1 - read0).toFixed(1).toString()
console.log("Mesh reading took " + duration + " milliseconds.")
webWorker.terminate()
const pipelinePath = 'MeshToPolyData'
const args = ['mesh.json', 'polyData.json']
const desiredOutputs = [
{ path: args[1], type: IOTypes.vtkPolyData }
]
const inputs = [
{ path: args[0], type: IOTypes.Mesh, data: itkMesh }
]
is3D = itkMesh.meshType.dimension === 3
convert0 = performance.now()
return runPipelineBrowser(null, pipelinePath, args, desiredOutputs, inputs)
}).then(function ({ outputs, webWorker }) {
const convert1 = performance.now();
const duration = Number(convert1 - convert0).toFixed(1).toString()
console.log("Mesh conversion took " + duration + " milliseconds.")
webWorker.terminate()
return Promise.resolve({ is3D, data: vtk(outputs[0].data) })
}).catch((error) => {
return readImageFile(null, file).then(({ image: itkImage, webWorker }) => {
webWorker.terminate()
is3D = itkImage.imageType.dimension === 3 && !use2D;
const imageData = vtkITKHelper.convertItkToVtkImage(itkImage);
return Promise.resolve({ is3D, data: imageData})
}).catch((error) => {
reject(error)
})
})
}
return readImageFile(null, file).then(({ image: itkImage, webWorker }) => {
webWorker.terminate()
const is3D = itkImage.imageType.dimension === 3 && !use2D;
const imageData = vtkITKHelper.convertItkToVtkImage(itkImage);
return Promise.resolve({ is3D, data: imageData })
}).catch((error) => {
reject(error)
})
})
Promise.all(readers).then((dataSets) => {
const images = dataSets.filter(({ data }) => !!data && data.isA('vtkImageData')).map(({ data }) => data)
const image = images.length ? images[0] : null
const geometries = dataSets.filter(
({ data }) => {
return !!data &&
data.isA('vtkPolyData') &&
!!(data.getPolys().getNumberOfValues() || data.getLines().getNumberOfValues() || data.getStrips().getNumberOfValues())
}).map(({ data }) => data)
const pointSets = dataSets.filter(
({ data }) => {
return !!data &&
data.isA('vtkPolyData') &&
!!!(data.getPolys().getNumberOfValues() || data.getLines().getNumberOfValues() || data.getStrips().getNumberOfValues())
}).map(({ data }) => data)
const any3D = ! dataSets.map(({ is3D }) => is3D).every((is3D) => !is3D)
const is3D = any3D && !use2D;
resolve(
createViewer(container, {
image,
geometries,
pointSets,
use2D: !is3D,
})
);
})
})
});
};
export default processFiles;