runmat-meshing-core 0.6.0

Deterministic meshing preparation contracts for RunMat
Documentation
use serde::{Deserialize, Serialize};

use super::{StageEvidence, TopologyEntityId};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProtectedBoundaryComplex {
    pub complex_id: String,
    #[serde(default)]
    pub nodes: Vec<PlcNode>,
    #[serde(default)]
    pub facets: Vec<PlcFacet>,
    #[serde(default)]
    pub protected_edges: Vec<PlcProtectedEdge>,
    pub validation: PlcValidationSummary,
    pub evidence: StageEvidence,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PlcNode {
    pub node_id: TopologyEntityId,
    pub coordinates_m: [f64; 3],
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PlcFacet {
    pub facet_id: TopologyEntityId,
    pub node_ids: [TopologyEntityId; 3],
    pub source_face_id: TopologyEntityId,
    #[serde(default)]
    pub material_interface_ids: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PlcProtectedEdge {
    pub edge_id: TopologyEntityId,
    pub node_ids: [TopologyEntityId; 2],
    pub source_edge_id: TopologyEntityId,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub cad_curve_boundary: Option<PlcProtectedEdgeCadCurveBoundary>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PlcProtectedEdgeCadCurveBoundary {
    pub cad_edge_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub imported_curve_id: Option<u64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub evaluator_id: Option<String>,
    #[serde(default)]
    pub evaluator_supports_point_evaluation: bool,
    #[serde(default)]
    pub evaluator_supports_projection: bool,
    #[serde(default)]
    pub evaluator_supports_tangent: bool,
    #[serde(default)]
    pub evaluator_supports_curvature: bool,
    #[serde(default)]
    pub evaluator_sample_count: usize,
    #[serde(default)]
    pub live_query_backed: bool,
    #[serde(default)]
    pub live_query_sample_count: usize,
    #[serde(default)]
    pub rejected_evaluator_sample_count: usize,
    #[serde(default)]
    pub curvature_sample_count: usize,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub curvature_limited_target_size_m: Option<f64>,
    pub boundary_segment_count: usize,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct PlcValidationSummary {
    pub watertight: bool,
    pub manifold: bool,
    pub shell_nesting_classified: bool,
    pub material_interfaces_classified: bool,
}

impl PlcValidationSummary {
    pub fn valid_for_volume_meshing(&self) -> bool {
        self.watertight
            && self.manifold
            && self.shell_nesting_classified
            && self.material_interfaces_classified
    }
}