lib3mf_core/writer/
mesh_writer.rs

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