Skip to main content

dear_implot3d/plots/
line.rs

1use super::{Plot3D, Plot3DError, validate_lengths, validate_nonempty};
2use crate::{Line3DFlags, Plot3DDataLayout, Plot3DDataOffset, Plot3DDataStride, Plot3DUi};
3
4pub struct Line3D<'a> {
5    pub label: &'a str,
6    pub xs_f32: Option<&'a [f32]>,
7    pub ys_f32: Option<&'a [f32]>,
8    pub zs_f32: Option<&'a [f32]>,
9    pub xs_f64: Option<&'a [f64]>,
10    pub ys_f64: Option<&'a [f64]>,
11    pub zs_f64: Option<&'a [f64]>,
12    pub flags: Line3DFlags,
13    pub layout: Plot3DDataLayout,
14}
15
16impl<'a> Line3D<'a> {
17    pub fn f32(label: &'a str, xs: &'a [f32], ys: &'a [f32], zs: &'a [f32]) -> Self {
18        Self {
19            label,
20            xs_f32: Some(xs),
21            ys_f32: Some(ys),
22            zs_f32: Some(zs),
23            xs_f64: None,
24            ys_f64: None,
25            zs_f64: None,
26            flags: Line3DFlags::NONE,
27            layout: Plot3DDataLayout::DEFAULT,
28        }
29    }
30    pub fn f64(label: &'a str, xs: &'a [f64], ys: &'a [f64], zs: &'a [f64]) -> Self {
31        Self {
32            label,
33            xs_f32: None,
34            ys_f32: None,
35            zs_f32: None,
36            xs_f64: Some(xs),
37            ys_f64: Some(ys),
38            zs_f64: Some(zs),
39            flags: Line3DFlags::NONE,
40            layout: Plot3DDataLayout::DEFAULT,
41        }
42    }
43    pub fn flags(mut self, flags: Line3DFlags) -> Self {
44        self.flags = flags;
45        self
46    }
47    pub fn data_layout(mut self, layout: Plot3DDataLayout) -> Self {
48        self.layout = layout;
49        self
50    }
51    pub fn offset(mut self, offset: Plot3DDataOffset) -> Self {
52        self.layout = self.layout.with_offset(offset);
53        self
54    }
55    pub fn stride(mut self, stride: Plot3DDataStride) -> Self {
56        self.layout = self.layout.with_stride(stride);
57        self
58    }
59}
60
61impl<'a> Plot3D for Line3D<'a> {
62    fn label(&self) -> &str {
63        self.label
64    }
65    fn try_plot(&self, ui: &Plot3DUi<'_>) -> Result<(), Plot3DError> {
66        if let (Some(x), Some(y), Some(z)) = (self.xs_f32, self.ys_f32, self.zs_f32) {
67            validate_nonempty(x)?;
68            validate_lengths(x, y, "x/y")?;
69            validate_lengths(y, z, "y/z")?;
70            ui.plot_line_f32_raw(self.label, x, y, z, self.flags, self.layout);
71            Ok(())
72        } else if let (Some(x), Some(y), Some(z)) = (self.xs_f64, self.ys_f64, self.zs_f64) {
73            validate_nonempty(x)?;
74            validate_lengths(x, y, "x/y")?;
75            validate_lengths(y, z, "y/z")?;
76            ui.plot_line_f64_raw(self.label, x, y, z, self.flags, self.layout);
77            Ok(())
78        } else {
79            Err(Plot3DError::EmptyData)
80        }
81    }
82}