Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
scatter3d_parser.rs

1use super::until::{Color, Map, must_translate};
2use crate::{translate, translate_enum};
3use anyhow::Result;
4use plotly::Scatter3D;
5
6pub fn parse_scatter3d_data(
7    s3_obj: &mut serde_json::Value,
8    map: &Map,
9) -> Result<Box<Scatter3D<f64, f64, f64>>> {
10    let x: Vec<f64> = must_translate(s3_obj, map, "x")?;
11    let y: Vec<f64> = must_translate(s3_obj, map, "y")?;
12    let z: Vec<f64> = must_translate(s3_obj, map, "z")?;
13    let s3 = Scatter3D::new(x, y, z);
14
15    let s3 = translate! {
16        s3,
17        s3_obj,
18        map,
19        (name, String),
20        (opacity, f64),
21        (ids, Vec<String>),
22        (text, String),
23        (text_array, Vec<String>),
24        (text_template, String),
25        (text_template_array, Vec<String>),
26        (hover_text, String),
27        (hover_text_array, Vec<String>),
28        (hover_template, String),
29        (hover_template_array, Vec<String>),
30        (show_legend, bool),
31        (legend_group, String),
32        (legend_rank, usize),
33        (surface_color, Color),
34        (connect_gaps, bool),
35        (scene, String),
36        (meta, String),
37    }?;
38
39    use plotly::common::{HoverInfo, Mode, Position};
40    let s3 = translate_enum! {
41        s3,
42        s3_obj,
43        map,
44        (mode, {
45            "lines" =>          Mode::Lines,
46            "markers" =>        Mode::Markers,
47            "text" =>           Mode::Text,
48            "linesmarkers" =>   Mode::LinesMarkers,
49            "linestext" =>      Mode::LinesText,
50            "markerstext" =>    Mode::MarkersText,
51            "linemarkerstext" =>Mode::LinesMarkersText,
52            "none" =>           Mode::None,
53        }),
54        (hover_info, {
55            "all" => HoverInfo::All,
56            "x" => HoverInfo::X,
57            "y" => HoverInfo::Y,
58            "z" => HoverInfo::Z,
59            "x+y" => HoverInfo::XAndY,
60            "x+z" => HoverInfo::XAndZ,
61            "y+z" => HoverInfo::YAndZ,
62            "x+y+z" => HoverInfo::XAndYAndZ,
63            "text" => HoverInfo::Text,
64            "name" => HoverInfo::Name,
65            "none" => HoverInfo::None,
66            "skip" => HoverInfo::Skip,
67        }),
68        (text_position, {
69            "top left" =>       Position::TopLeft,
70            "top center" =>     Position::TopCenter,
71            "top right" =>      Position::TopRight,
72            "middle left" =>    Position::MiddleLeft,
73            "middle center" =>  Position::MiddleCenter,
74            "middle right" =>   Position::MiddleRight,
75            "bottom left" =>    Position::BottomLeft,
76            "bottom center" =>  Position::BottomCenter,
77            "bottom right" =>   Position::BottomRight,
78        }),
79    }?;
80
81    use plotly::traces::scatter3d::SurfaceAxis;
82    let s3 = translate_enum! {
83        s3,
84        s3_obj,
85        map,
86        (surface_axis, {
87            "-1" => SurfaceAxis::MinusOne,
88            "0" =>  SurfaceAxis::Zero,
89            "1" =>  SurfaceAxis::One,
90            "2" =>  SurfaceAxis::Two,
91        }),
92    }?;
93
94    let s3 = if let Some(marker_obj) = s3_obj.get_mut("marker")
95        && marker_obj.is_object()
96    {
97        let marker = plotly::common::Marker::new();
98        let marker = translate! {
99            marker,
100            marker_obj,
101            map,
102            (color, Color),
103            (opacity, f64),
104            (size, usize),
105            (size_array, Vec<usize>),
106            (max_displayed, usize),
107            (size_ref, usize),
108            (size_min, usize),
109            (cauto, bool),
110            (cmax, f64),
111            (cmin, f64),
112            (cmid, f64),
113            (auto_color_scale, bool),
114            (reverse_scale, bool),
115            (show_scale, bool),
116            (outlier_color, Color),
117        }?;
118
119        use plotly::common::{MarkerSymbol, SizeMode};
120        let marker = translate_enum! {
121            marker,
122            marker_obj,
123            map,
124            (symbol, {
125                "circle" =>         MarkerSymbol::Circle,
126                "square" =>         MarkerSymbol::Square,
127                "diamond" =>        MarkerSymbol::Diamond,
128                "cross" =>          MarkerSymbol::Cross,
129                "x" =>              MarkerSymbol::X,
130                "triangle-up" =>    MarkerSymbol::TriangleUp,
131                "triangle-down" =>  MarkerSymbol::TriangleDown,
132                "triangle-left" =>  MarkerSymbol::TriangleLeft,
133                "triangle-right" => MarkerSymbol::TriangleRight,
134                "pentagon" =>       MarkerSymbol::Pentagon,
135                "hexagon" =>        MarkerSymbol::Hexagon,
136            }),
137            (size_mode, {
138                "area" => SizeMode::Area,
139                "diameter" => SizeMode::Diameter,
140            }),
141        }?;
142        s3.marker(marker)
143    } else {
144        s3
145    };
146
147    let s3 = if let Some(line_obj) = s3_obj.get_mut("line")
148        && line_obj.is_object()
149    {
150        use plotly::common::Line;
151        let line = translate! {
152            Line::new(),
153            line_obj,
154            map,
155            (color, Color),
156            (width, f64),
157        }?;
158        use plotly::common::DashType;
159        let line = translate_enum! {
160            line,
161            line_obj,
162            map,
163            (dash, {
164                "solid" => DashType::Solid,
165                "dot" => DashType::Dot,
166                "dash" => DashType::Dash,
167                "longdash" => DashType::LongDash,
168                "dashdot" => DashType::DashDot,
169                "longdashdot" => DashType::LongDashDot,
170            }),
171        }?;
172        s3.line(line)
173    } else {
174        s3
175    };
176
177    Ok(s3)
178}