runmat_meshing_core/contracts/
surface.rs1use 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}