Skip to main content

lib3mf_core/parser/
visitor.rs

1use crate::error::Result;
2use crate::model::{
3    BaseMaterialsGroup, Beam, BuildItem, ColorGroup, DisplacementTriangle, ResourceId,
4};
5
6/// Trait for receiving callback events during streaming parsing of a 3MF model.
7/// This allows for processing massive files with constant memory usage.
8pub trait ModelVisitor {
9    /// Called when the model element starts.
10    fn on_start_model(&mut self) -> Result<()> {
11        Ok(())
12    }
13
14    /// Called when the model element ends.
15    fn on_end_model(&mut self) -> Result<()> {
16        Ok(())
17    }
18
19    /// Called upon encountering metadata.
20    fn on_metadata(&mut self, _name: &str, _value: &str) -> Result<()> {
21        Ok(())
22    }
23
24    /// Called when the resources container starts.
25    fn on_start_resources(&mut self) -> Result<()> {
26        Ok(())
27    }
28
29    /// Called when the resources container ends.
30    fn on_end_resources(&mut self) -> Result<()> {
31        Ok(())
32    }
33
34    // --- Resources ---
35
36    /// Called when a BaseMaterials group is fully parsed.
37    /// Since these are typically small, we pass the full object.
38    fn on_base_materials(&mut self, _id: ResourceId, _group: &BaseMaterialsGroup) -> Result<()> {
39        Ok(())
40    }
41
42    /// Called when a ColorGroup is fully parsed.
43    fn on_color_group(&mut self, _id: ResourceId, _group: &ColorGroup) -> Result<()> {
44        Ok(())
45    }
46
47    // --- Mesh (Streaming) ---
48
49    /// Called when a Mesh object starts.
50    fn on_start_mesh(&mut self, _id: ResourceId) -> Result<()> {
51        Ok(())
52    }
53
54    /// Called for each vertex in the current mesh.
55    fn on_vertex(&mut self, _x: f32, _y: f32, _z: f32) -> Result<()> {
56        Ok(())
57    }
58
59    /// Called for each triangle in the current mesh.
60    fn on_triangle(&mut self, _v1: u32, _v2: u32, _v3: u32) -> Result<()> {
61        Ok(())
62    }
63
64    /// Called when a Mesh object ends.
65    fn on_end_mesh(&mut self) -> Result<()> {
66        Ok(())
67    }
68
69    // --- Beam Lattice (Streaming) ---
70
71    /// Called when a beam lattice starts (inside a mesh object).
72    ///
73    /// The `object_id` identifies which mesh object contains this beam lattice.
74    /// Note: BeamSets are silently skipped in streaming mode since they reference
75    /// beams by index and require all beams to be known (violating streaming semantics).
76    /// Use DOM mode if BeamSet data is required.
77    fn on_start_beam_lattice(&mut self, _object_id: ResourceId) -> Result<()> {
78        Ok(())
79    }
80
81    /// Called for each beam in the current beam lattice.
82    fn on_beam(&mut self, _beam: &Beam) -> Result<()> {
83        Ok(())
84    }
85
86    /// Called when a beam lattice ends.
87    fn on_end_beam_lattice(&mut self) -> Result<()> {
88        Ok(())
89    }
90
91    // --- Displacement Mesh (Streaming) ---
92
93    /// Called when a displacement mesh object starts.
94    ///
95    /// The `id` identifies this displacement mesh resource.
96    /// Note: disp2dgroups (gradient vectors) are silently skipped in streaming mode.
97    /// Use DOM mode if gradient vector data is required.
98    fn on_start_displacement_mesh(&mut self, _id: ResourceId) -> Result<()> {
99        Ok(())
100    }
101
102    /// Called for each vertex in the displacement mesh.
103    fn on_displacement_vertex(&mut self, _x: f32, _y: f32, _z: f32) -> Result<()> {
104        Ok(())
105    }
106
107    /// Called for each triangle in the displacement mesh.
108    fn on_displacement_triangle(&mut self, _triangle: &DisplacementTriangle) -> Result<()> {
109        Ok(())
110    }
111
112    /// Called for each normal vector in the displacement mesh.
113    fn on_displacement_normal(&mut self, _nx: f32, _ny: f32, _nz: f32) -> Result<()> {
114        Ok(())
115    }
116
117    /// Called when a displacement mesh ends.
118    fn on_end_displacement_mesh(&mut self) -> Result<()> {
119        Ok(())
120    }
121
122    // --- Build ---
123
124    /// Called when the build container starts.
125    fn on_start_build(&mut self) -> Result<()> {
126        Ok(())
127    }
128
129    /// Called when the build container ends.
130    fn on_end_build(&mut self) -> Result<()> {
131        Ok(())
132    }
133
134    /// Called for each item in the build.
135    fn on_build_item(&mut self, _item: &BuildItem) -> Result<()> {
136        Ok(())
137    }
138}