Skip to main content

runmat_meshing_core/contracts/
surface.rs

1use serde::{Deserialize, Serialize};
2
3use super::{StageEvidence, TopologyEntityId};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6pub struct SurfaceMesh {
7    pub mesh_id: String,
8    #[serde(default)]
9    pub nodes: Vec<SurfaceMeshNode>,
10    #[serde(default)]
11    pub triangles: Vec<SurfaceMeshTriangle>,
12    #[serde(default, skip_serializing_if = "Option::is_none")]
13    pub curve_boundary_validation: Option<SurfaceCurveBoundaryValidation>,
14    #[serde(default, skip_serializing_if = "Option::is_none")]
15    pub loop_coverage: Option<SurfaceLoopCoverage>,
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub cad_curve_boundary_provenance: Option<SurfaceCadCurveBoundaryProvenance>,
18    pub evidence: StageEvidence,
19}
20
21#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
22pub struct SurfaceMeshNode {
23    pub node_id: TopologyEntityId,
24    pub coordinates_m: [f64; 3],
25    #[serde(default)]
26    pub source_edge_id: Option<TopologyEntityId>,
27    pub source_face_id: TopologyEntityId,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31pub struct SurfaceMeshTriangle {
32    pub triangle_id: TopologyEntityId,
33    pub source_face_id: TopologyEntityId,
34    #[serde(default)]
35    pub source_edge_ids: [Option<TopologyEntityId>; 3],
36    pub node_ids: [TopologyEntityId; 3],
37    #[serde(default)]
38    pub region_ids: Vec<String>,
39    #[serde(default)]
40    pub material_region_ids: Vec<String>,
41    #[serde(default)]
42    pub max_projection_error_m: f64,
43    pub area_m2: f64,
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
47pub struct SurfaceCurveBoundaryValidation {
48    pub source_edge_count: usize,
49    pub curve_node_count: usize,
50    pub curve_element_count: usize,
51    pub max_endpoint_error_m: f64,
52    pub max_projection_error_m: f64,
53    pub max_length_error_m: f64,
54    pub max_segment_length_m: f64,
55    pub max_parameter_gap: f64,
56    pub max_adjacent_length_ratio: f64,
57}
58
59#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
60pub struct SurfaceLoopCoverage {
61    pub source_face_count: usize,
62    pub recovered_face_count: usize,
63    pub boundary_loop_count: usize,
64    #[serde(default)]
65    pub hole_loop_count: usize,
66    #[serde(default)]
67    pub boundary_node_count: usize,
68    pub recovered_source_edge_count: usize,
69    pub boundary_segment_count: usize,
70    pub max_loops_per_face: usize,
71}
72
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
74pub struct SurfaceCadCurveBoundaryProvenance {
75    pub recovered_source_edge_count: usize,
76    pub boundary_segment_count: usize,
77    pub imported_curve_edge_count: usize,
78    pub evaluator_curve_edge_count: usize,
79    pub evaluator_sample_count: usize,
80    pub live_query_edge_count: usize,
81    pub live_query_sample_count: usize,
82    pub rejected_evaluator_sample_count: usize,
83    pub curvature_sized_edge_count: usize,
84    pub curvature_sample_count: usize,
85    #[serde(default)]
86    pub edges: Vec<SurfaceCadCurveBoundaryEdgeProvenance>,
87}
88
89#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
90pub struct SurfaceCadCurveBoundaryEdgeProvenance {
91    pub source_edge_id: TopologyEntityId,
92    pub cad_edge_id: String,
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub imported_curve_id: Option<u64>,
95    #[serde(default, skip_serializing_if = "Option::is_none")]
96    pub evaluator_id: Option<String>,
97    #[serde(default)]
98    pub evaluator_supports_point_evaluation: bool,
99    #[serde(default)]
100    pub evaluator_supports_projection: bool,
101    #[serde(default)]
102    pub evaluator_supports_tangent: bool,
103    #[serde(default)]
104    pub evaluator_supports_curvature: bool,
105    #[serde(default)]
106    pub evaluator_sample_count: usize,
107    #[serde(default)]
108    pub live_query_backed: bool,
109    #[serde(default)]
110    pub live_query_sample_count: usize,
111    #[serde(default)]
112    pub rejected_evaluator_sample_count: usize,
113    #[serde(default)]
114    pub curvature_sample_count: usize,
115    #[serde(default, skip_serializing_if = "Option::is_none")]
116    pub curvature_limited_target_size_m: Option<f64>,
117    pub boundary_segment_count: usize,
118}