lib3mf_core/writer/
mesh_writer.rs1use 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
7pub fn write_mesh<W: Write>(writer: &mut XmlWriter<W>, mesh: &Mesh) -> Result<()> {
8 writer.start_element("mesh").write_start()?;
9
10 writer.start_element("vertices").write_start()?;
12 for v in &mesh.vertices {
13 writer
14 .start_element("vertex")
15 .attr("x", &v.x.to_string())
16 .attr("y", &v.y.to_string())
17 .attr("z", &v.z.to_string())
18 .write_empty()?;
19 }
20 writer.end_element("vertices")?;
21
22 writer.start_element("triangles").write_start()?;
24 for t in &mesh.triangles {
25 let mut builder = writer
26 .start_element("triangle")
27 .attr("v1", &t.v1.to_string())
28 .attr("v2", &t.v2.to_string())
29 .attr("v3", &t.v3.to_string());
30
31 if let Some(p1) = t.p1 {
32 builder = builder.attr("p1", &p1.to_string());
33 }
34 if let Some(p2) = t.p2 {
35 builder = builder.attr("p2", &p2.to_string());
36 }
37 if let Some(p3) = t.p3 {
38 builder = builder.attr("p3", &p3.to_string());
39 }
40 if let Some(pid) = t.pid {
41 builder = builder.attr("pid", &pid.to_string());
42 }
43
44 builder.write_empty()?;
45 }
46 writer.end_element("triangles")?;
47
48 if let Some(lattice) = &mesh.beam_lattice {
50 write_beam_lattice(writer, lattice)?;
51 }
52
53 writer.end_element("mesh")?;
54 Ok(())
55}