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}