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
use crate::{Header, Points, Reader, Spacing};

/// Generator to read a TrackVis file, streamline per streamline.
///
/// Will never hold more than one streamline in memory.
pub struct VoxelSpaceReader {
    reader: Reader,
}

impl VoxelSpaceReader {
    /// Build a new `VoxelSpaceReader` object.
    ///
    /// * `path` - Path to TrackVis file
    /// * `spacing` - Spacing (pixel dimension `pixdim`) obtained from the `Header` or from a
    ///   reference image.
    pub fn new<P: AsRef<std::path::Path>>(path: P, spacing: Spacing) -> (Header, VoxelSpaceReader) {
        let mut reader = Reader::new(path).unwrap();
        reader.apply_transform_to_voxel_space(spacing);

        let header = reader.header.clone();
        (header, VoxelSpaceReader { reader })
    }
}

impl Iterator for VoxelSpaceReader {
    type Item = Points;

    fn next(&mut self) -> Option<Points> {
        if let Some((points, _, _)) = self.reader.next() {
            return Some(points);
        } else {
            return None;
        }
    }
}