lib3mf_core/writer/
mesh_writer.rs

1use crate::error::Result;
2use crate::model::mesh::Mesh;
3use crate::writer::beamlattice_writer::write_beam_lattice;
4use crate::writer::xml_writer::XmlWriter;
5use std::io::Write;
6
7/// Serializes a mesh (vertices and triangles) to XML inside a `<mesh>` element.
8pub fn write_mesh<W: Write>(writer: &mut XmlWriter<W>, mesh: &Mesh) -> Result<()> {
9    writer.start_element("mesh").write_start()?;
10
11    // Vertices
12    writer.start_element("vertices").write_start()?;
13    for v in &mesh.vertices {
14        writer
15            .start_element("vertex")
16            .attr("x", &v.x.to_string())
17            .attr("y", &v.y.to_string())
18            .attr("z", &v.z.to_string())
19            .write_empty()?;
20    }
21    writer.end_element("vertices")?;
22
23    // Triangles
24    writer.start_element("triangles").write_start()?;
25    for t in &mesh.triangles {
26        let mut builder = writer
27            .start_element("triangle")
28            .attr("v1", &t.v1.to_string())
29            .attr("v2", &t.v2.to_string())
30            .attr("v3", &t.v3.to_string());
31
32        if let Some(p1) = t.p1 {
33            builder = builder.attr("p1", &p1.to_string());
34        }
35        if let Some(p2) = t.p2 {
36            builder = builder.attr("p2", &p2.to_string());
37        }
38        if let Some(p3) = t.p3 {
39            builder = builder.attr("p3", &p3.to_string());
40        }
41        if let Some(pid) = t.pid {
42            builder = builder.attr("pid", &pid.to_string());
43        }
44
45        builder.write_empty()?;
46    }
47    writer.end_element("triangles")?;
48
49    // Write beam lattice if present
50    if let Some(lattice) = &mesh.beam_lattice {
51        write_beam_lattice(writer, lattice)?;
52    }
53
54    writer.end_element("mesh")?;
55    Ok(())
56}