Skip to main content

runmat_meshing_core/contracts/
plc.rs

1use serde::{Deserialize, Serialize};
2
3use super::{StageEvidence, TopologyEntityId};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6pub struct ProtectedBoundaryComplex {
7    pub complex_id: String,
8    #[serde(default)]
9    pub nodes: Vec<PlcNode>,
10    #[serde(default)]
11    pub facets: Vec<PlcFacet>,
12    #[serde(default)]
13    pub protected_edges: Vec<PlcProtectedEdge>,
14    pub validation: PlcValidationSummary,
15    pub evidence: StageEvidence,
16}
17
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
19pub struct PlcNode {
20    pub node_id: TopologyEntityId,
21    pub coordinates_m: [f64; 3],
22}
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
25pub struct PlcFacet {
26    pub facet_id: TopologyEntityId,
27    pub node_ids: [TopologyEntityId; 3],
28    pub source_face_id: TopologyEntityId,
29    #[serde(default)]
30    pub material_interface_ids: Vec<String>,
31}
32
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34pub struct PlcProtectedEdge {
35    pub edge_id: TopologyEntityId,
36    pub node_ids: [TopologyEntityId; 2],
37    pub source_edge_id: TopologyEntityId,
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub cad_curve_boundary: Option<PlcProtectedEdgeCadCurveBoundary>,
40}
41
42#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
43pub struct PlcProtectedEdgeCadCurveBoundary {
44    pub cad_edge_id: String,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub imported_curve_id: Option<u64>,
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub evaluator_id: Option<String>,
49    #[serde(default)]
50    pub evaluator_supports_point_evaluation: bool,
51    #[serde(default)]
52    pub evaluator_supports_projection: bool,
53    #[serde(default)]
54    pub evaluator_supports_tangent: bool,
55    #[serde(default)]
56    pub evaluator_supports_curvature: bool,
57    #[serde(default)]
58    pub evaluator_sample_count: usize,
59    #[serde(default)]
60    pub live_query_backed: bool,
61    #[serde(default)]
62    pub live_query_sample_count: usize,
63    #[serde(default)]
64    pub rejected_evaluator_sample_count: usize,
65    #[serde(default)]
66    pub curvature_sample_count: usize,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub curvature_limited_target_size_m: Option<f64>,
69    pub boundary_segment_count: usize,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
73pub struct PlcValidationSummary {
74    pub watertight: bool,
75    pub manifold: bool,
76    pub shell_nesting_classified: bool,
77    pub material_interfaces_classified: bool,
78}
79
80impl PlcValidationSummary {
81    pub fn valid_for_volume_meshing(&self) -> bool {
82        self.watertight
83            && self.manifold
84            && self.shell_nesting_classified
85            && self.material_interfaces_classified
86    }
87}