Skip to main content

runmat_geometry_core/model/
source_geometry.rs

1use serde::{Deserialize, Serialize};
2
3use super::{AssemblyNode, MaterialEvidence};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6#[serde(rename_all = "snake_case")]
7pub enum SourceGeometryKind {
8    Mesh,
9    Cad,
10}
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
13pub struct SourceGeometry {
14    pub kind: SourceGeometryKind,
15    pub assembly: Option<AssemblyNode>,
16    pub material_evidence: Vec<MaterialEvidence>,
17    #[serde(default, skip_serializing_if = "Vec::is_empty")]
18    pub cad_evaluators: Vec<CadEvaluatorSet>,
19}
20
21#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
22#[serde(rename_all = "camelCase")]
23pub struct CadEvaluatorSet {
24    pub evaluator_id: String,
25    pub backend: String,
26    pub format_name: String,
27    pub requires_source_geometry: bool,
28    #[serde(default, skip_serializing_if = "Vec::is_empty")]
29    pub faces: Vec<CadFaceEvaluator>,
30    #[serde(default, skip_serializing_if = "Vec::is_empty")]
31    pub curves: Vec<CadCurveEvaluator>,
32}
33
34#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
35#[serde(rename_all = "camelCase")]
36pub struct CadFaceEvaluator {
37    pub evaluator_id: String,
38    pub imported_face_id: u64,
39    pub name: String,
40    pub supports_point_evaluation: bool,
41    pub supports_projection: bool,
42    pub supports_normal: bool,
43    pub supports_derivatives: bool,
44    pub supports_curvature: bool,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub reference_point_m: Option<[f64; 3]>,
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub reference_unit_normal: Option<[f64; 3]>,
49    #[serde(default, skip_serializing_if = "Vec::is_empty")]
50    pub evaluation_samples: Vec<CadFaceEvaluationSample>,
51}
52
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
54#[serde(rename_all = "camelCase")]
55pub struct CadCurveEvaluator {
56    pub evaluator_id: String,
57    pub imported_curve_id: u64,
58    pub name: String,
59    pub supports_point_evaluation: bool,
60    pub supports_projection: bool,
61    pub supports_tangent: bool,
62    pub supports_curvature: bool,
63    #[serde(default, skip_serializing_if = "Vec::is_empty")]
64    pub evaluation_samples: Vec<CadCurveEvaluationSample>,
65}
66
67#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
68#[serde(rename_all = "snake_case")]
69pub enum CadFaceEvaluationSampleSource {
70    BackendQuery,
71    TessellationEstimate,
72}
73
74#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
75#[serde(rename_all = "camelCase")]
76pub struct CadFaceEvaluationSample {
77    pub source: CadFaceEvaluationSampleSource,
78    pub point_m: [f64; 3],
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub uv: Option<[f64; 2]>,
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub projected_point_m: Option<[f64; 3]>,
83    #[serde(default, skip_serializing_if = "Option::is_none")]
84    pub unit_normal: Option<[f64; 3]>,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub projection_error_m: Option<f64>,
87}
88
89#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
90#[serde(rename_all = "snake_case")]
91pub enum CadCurveEvaluationSampleSource {
92    BackendQuery,
93    TessellationEstimate,
94}
95
96#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
97#[serde(rename_all = "camelCase")]
98pub struct CadCurveEvaluationSample {
99    pub source: CadCurveEvaluationSampleSource,
100    pub parameter: f64,
101    pub point_m: [f64; 3],
102    #[serde(default, skip_serializing_if = "Option::is_none")]
103    pub projected_point_m: Option<[f64; 3]>,
104    #[serde(default, skip_serializing_if = "Option::is_none")]
105    pub tangent_m: Option<[f64; 3]>,
106    #[serde(default, skip_serializing_if = "Option::is_none")]
107    pub curvature_1_per_m: Option<f64>,
108    #[serde(default, skip_serializing_if = "Option::is_none")]
109    pub projection_error_m: Option<f64>,
110}