use indicatrix_cut_core::rough_plan::locate::Rigid;
use serde::{Deserialize, Serialize};
use super::marks::MarkSet;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LocatedRecord {
pub rig_name: String,
pub marks: MarkSet,
pub alignment: Rigid,
pub position_mm: [f64; 3],
pub radius_mm: f64,
pub margin_mm: f64,
pub rms_mm: f64,
}
impl LocatedRecord {
#[must_use]
pub fn row_text(&self, number: usize) -> String {
let [x, y, z] = self.position_mm;
format!(
"{number}. ({x:.2}, {y:.2}, {z:.2}) mm, radius {:.2} mm, margin {:.2} mm, {} views, rig {}",
self.radius_mm,
self.margin_mm,
self.marks.marked_views(),
self.rig_name
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::locate_io::marks::{ClickMode, MarkKind};
fn record() -> LocatedRecord {
let mut marks = MarkSet::new(3);
for view in [0, 2] {
marks.click(view, ClickMode::Mark(MarkKind::Point), [10.0, 20.0]);
}
LocatedRecord {
rig_name: "Bench".to_owned(),
marks,
alignment: Rigid::IDENTITY,
position_mm: [1.0, 2.5, 3.0],
radius_mm: 0.5,
margin_mm: 0.3,
rms_mm: 0.05,
}
}
#[test]
fn the_row_names_the_place_the_size_the_views_and_the_rig() {
assert_eq!(
record().row_text(2),
"2. (1.00, 2.50, 3.00) mm, radius 0.50 mm, margin 0.30 mm, 2 views, rig Bench"
);
}
#[test]
fn a_record_round_trips_through_json_so_it_can_be_solved_again() {
let text = serde_json::to_string(&record()).expect("serialize");
let back: LocatedRecord = serde_json::from_str(&text).expect("deserialize");
assert_eq!(back, record());
}
}