dear_implot3d/plots/
line.rs1use super::{Plot3D, Plot3DError, validate_lengths, validate_nonempty};
2use crate::{Line3DFlags, Plot3DDataLayout, Plot3DDataOffset, 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 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 offset(mut self, offset: Plot3DDataOffset) -> Self {
48 self.layout = self.layout.with_offset(offset);
49 self
50 }
51}
52
53impl<'a> Plot3D for Line3D<'a> {
54 fn label(&self) -> &str {
55 self.label
56 }
57 fn try_plot(&self, ui: &Plot3DUi<'_>) -> Result<(), Plot3DError> {
58 if let (Some(x), Some(y), Some(z)) = (self.xs_f32, self.ys_f32, self.zs_f32) {
59 validate_nonempty(x)?;
60 validate_lengths(x, y, "x/y")?;
61 validate_lengths(y, z, "y/z")?;
62 unsafe {
63 ui.plot_line_f32_raw(self.label, x, y, z, self.flags, self.layout);
66 }
67 Ok(())
68 } else if let (Some(x), Some(y), Some(z)) = (self.xs_f64, self.ys_f64, self.zs_f64) {
69 validate_nonempty(x)?;
70 validate_lengths(x, y, "x/y")?;
71 validate_lengths(y, z, "y/z")?;
72 unsafe {
73 ui.plot_line_f64_raw(self.label, x, y, z, self.flags, self.layout);
76 }
77 Ok(())
78 } else {
79 Err(Plot3DError::EmptyData)
80 }
81 }
82}