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}