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