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