use crate::ids::{
BodyId, CoedgeId, CurveId, EdgeId, FaceId, LoopId, PcurveId, PointId, RegionId, ShellId,
SurfaceId, VertexId,
};
use crate::math::Point3;
use crate::transform::Transform;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Color {
pub r: f32,
pub g: f32,
pub b: f32,
pub a: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Sense {
Forward,
Reversed,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BodyKind {
#[default]
Solid,
Sheet,
Wire,
General,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Body {
pub id: BodyId,
#[serde(default)]
pub kind: BodyKind,
pub regions: Vec<RegionId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub transform: Option<Transform>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub color: Option<Color>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub visible: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Region {
pub id: RegionId,
pub body: BodyId,
pub shells: Vec<ShellId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Shell {
pub id: ShellId,
pub region: RegionId,
pub faces: Vec<FaceId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub wire_edges: Vec<EdgeId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub free_vertices: Vec<VertexId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Face {
pub id: FaceId,
pub shell: ShellId,
pub surface: SurfaceId,
pub sense: Sense,
pub loops: Vec<LoopId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub color: Option<Color>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tolerance: Option<f64>,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum LoopBoundaryRole {
#[default]
Unspecified,
Outer,
Inner,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Loop {
pub id: LoopId,
pub face: FaceId,
#[serde(default)]
pub boundary_role: LoopBoundaryRole,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub coedges: Vec<CoedgeId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub vertex_uses: Vec<VertexUse>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct PcurveUse {
pub pcurve: PcurveId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub isoparametric: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parameter_range: Option<[f64; 2]>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct VertexUse {
pub vertex: VertexId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub after: Option<CoedgeId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub pcurves: Vec<PcurveUse>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Coedge {
pub id: CoedgeId,
pub owner_loop: LoopId,
pub edge: EdgeId,
pub next: CoedgeId,
pub previous: CoedgeId,
pub radial_next: CoedgeId,
pub sense: Sense,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub pcurves: Vec<PcurveUse>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub use_curve: Option<CurveId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub use_curve_parameter_range: Option<[f64; 2]>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Edge {
pub id: EdgeId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub curve: Option<CurveId>,
pub start: VertexId,
pub end: VertexId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub param_range: Option<[f64; 2]>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tolerance: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Vertex {
pub id: VertexId,
pub point: PointId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tolerance: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Point {
pub id: PointId,
pub position: Point3,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_object: Option<crate::provenance::SourceObjectAssociation>,
}