use serde::{Deserialize, Serialize};
pub const ROUGH_PLAN_FORMAT: &str = "indicatrix-rough-plan";
pub const CURRENT_SCHEMA_VERSION: u32 = 3;
pub const MESH_SCHEMA_VERSION: u32 = 2;
pub const INCLUSION_SCHEMA_VERSION: u32 = 3;
pub const BASE_SCHEMA_VERSION: u32 = 1;
pub const MAX_PAYLOAD_BYTES: usize = 16 * 1024 * 1024;
pub const MAX_LAYOUTS: usize = 10;
pub const MAX_NAME_CHARS: usize = 200;
pub const MAX_STONES_PER_LAYOUT: usize = 99;
pub const MAX_DESIGNS: usize = MAX_LAYOUTS * MAX_STONES_PER_LAYOUT;
pub const MAX_SAW_ITEMS: usize = 99;
pub const MAX_LOSS_MM: f64 = 50.0;
pub const MAX_MIN_WIDTH_MM: f64 = 1000.0;
#[derive(Debug, Default, Deserialize)]
pub struct HeaderDto {
#[serde(default)]
pub format: Option<String>,
#[serde(default)]
pub version: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SavedPlanDto {
pub format: String,
pub version: u32,
pub name: String,
pub created_at: i64,
#[serde(default)]
pub library_id: Option<u32>,
pub rough: RoughDto,
pub settings: SettingsDto,
#[serde(default)]
pub designs: Vec<SavedDesignDto>,
#[serde(default)]
pub layouts: Vec<SavedLayoutDto>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RoughDto {
pub base: String,
#[serde(default)]
pub x_mm: Option<f64>,
#[serde(default)]
pub y_mm: Option<f64>,
#[serde(default)]
pub z_mm: Option<f64>,
#[serde(default)]
pub diameter_mm: Option<f64>,
#[serde(default)]
pub length_mm: Option<f64>,
#[serde(default)]
pub axis: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub hull: Vec<[f64; 3]>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mesh: Option<MeshDto>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub inclusions: Vec<MeshDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_frame: Option<SourceFrameDto>,
pub material: String,
pub specific_gravity: f64,
#[serde(default)]
pub weighed_ct: Option<f64>,
#[serde(default)]
pub cuts: Vec<CutDto>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MeshDto {
pub vertices: Vec<[f64; 3]>,
pub triangles: Vec<[u32; 3]>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct SourceFrameDto {
pub scale: f64,
pub offset_mm: [f64; 3],
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CutDto {
pub kind: String,
#[serde(default)]
pub faces: Option<Vec<String>>,
#[serde(default)]
pub setbacks_mm: Option<Vec<f64>>,
#[serde(default)]
pub normal: Option<[f64; 3]>,
#[serde(default)]
pub depth_mm: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SettingsDto {
pub count: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_count: Option<i64>,
pub kerf_mm: f64,
pub allowance_mm: f64,
pub skin_mm: f64,
pub min_width_mm: f64,
#[serde(default)]
pub candidate_source: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SavedDesignDto {
pub entry_id: i64,
pub title: String,
pub fingerprint: [f64; 3],
#[serde(default)]
pub width_caliper: Option<f64>,
#[serde(default)]
pub extents_version: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct DesignShape {
pub fingerprint: [f64; 3],
pub width_caliper: Option<f64>,
pub extents_version: u32,
}
impl SavedDesignDto {
#[must_use]
pub const fn shape(&self) -> DesignShape {
DesignShape {
fingerprint: self.fingerprint,
width_caliper: self.width_caliper,
extents_version: self.extents_version,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SavedLayoutDto {
pub rank: i64,
pub cut_order: String,
pub total_carat: f64,
pub total_volume_mm3: f64,
pub yield_fraction: f64,
#[serde(default)]
pub slabs: Vec<SlabDto>,
#[serde(default)]
pub stones: Vec<StoneDto>,
#[serde(default)]
pub exact_fit: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SlabDto {
pub thickness_mm: f64,
#[serde(default)]
pub bars: Vec<BarDto>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BarDto {
pub width_mm: f64,
#[serde(default)]
pub pieces_mm: Vec<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StoneDto {
pub entry_id: i64,
pub piece_origin_mm: [f64; 3],
pub piece_size_mm: [f64; 3],
pub stone_size_mm: [f64; 3],
pub table_axis: String,
pub carat: f64,
pub volume_mm3: f64,
pub center_mm: [f64; 3],
pub axes: [[f64; 3]; 3],
pub mm_per_unit: f64,
}
#[derive(Debug, Deserialize)]
pub struct SummaryDto {
pub rough: SummaryRoughDto,
#[serde(default)]
pub layouts: Vec<serde::de::IgnoredAny>,
}
#[derive(Debug, Deserialize)]
pub struct SummaryRoughDto {
pub base: String,
pub material: String,
}