thdmaker 0.0.4

A comprehensive 3D file format library supporting AMF, STL, 3MF and other 3D manufacturing formats
Documentation
use std::io::Write;
use quick_xml::events::{BytesEnd, BytesStart, Event};
use quick_xml::Writer;
use super::error::Result;
use super::define::slice::*;

impl SliceStack {
    pub fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        let mut elem = BytesStart::new("s:slicestack");
        elem.push_attribute(("id", self.id.to_string().as_str()));
        
        if let Some(z_bottom) = self.z_bottom {
            elem.push_attribute(("zbottom", z_bottom.to_string().as_str()));
        }

        writer.write_event(Event::Start(elem))?;

        match &self.content {
            SliceContent::Slices(slices) => {
                for slice in slices {
                    slice.write(writer)?;
                }
            }
            SliceContent::SliceRefs(slice_refs) => {
                for slice_ref in slice_refs {
                    slice_ref.write(writer)?;
                }
            }
        }

        writer.write_event(Event::End(BytesEnd::new("s:slicestack")))?;

        Ok(())
    }
}

impl SliceRef {
    fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        let mut elem = BytesStart::new("s:sliceref");
        elem.push_attribute(("slicestackid", self.slice_stack_id.to_string().as_str()));
        elem.push_attribute(("slicepath", self.slice_path.as_str()));
        writer.write_event(Event::Empty(elem))?;
        Ok(())
    }
}

impl Slice {
    fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        let mut elem = BytesStart::new("s:slice");
        elem.push_attribute(("ztop", self.z_top.to_string().as_str()));

        if self.vertices.vertices.is_empty() && self.polygons.is_empty() {
            writer.write_event(Event::Empty(elem))?;
        } else {
            writer.write_event(Event::Start(elem))?;

            self.vertices.write(writer)?;

            for polygon in &self.polygons {
                polygon.write(writer)?;
            }

            writer.write_event(Event::End(BytesEnd::new("s:slice")))?;
        }

        Ok(())
    }
}

impl Vertices2D {
    fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        if !self.vertices.is_empty() {
            let elem = BytesStart::new("s:vertices");
            writer.write_event(Event::Start(elem))?;
            for vertex in &self.vertices {
                vertex.write(writer)?;
            }
            writer.write_event(Event::End(BytesEnd::new("s:vertices")))?;
        }
        Ok(())
    }
}

impl Vertex2D {
    fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        let mut elem = BytesStart::new("s:vertex");
        elem.push_attribute(("x", self.x.to_string().as_str()));
        elem.push_attribute(("y", self.y.to_string().as_str()));
        writer.write_event(Event::Empty(elem))?;
        Ok(())
    }
}

impl Polygon {
    fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        let mut elem = BytesStart::new("s:polygon");
        elem.push_attribute(("startv", self.start_v.to_string().as_str()));

        if self.segments.is_empty() {
            writer.write_event(Event::Empty(elem))?;
        } else {
            writer.write_event(Event::Start(elem))?;
            for segment in &self.segments {
                segment.write(writer)?;
            }
            writer.write_event(Event::End(BytesEnd::new("s:polygon")))?;
        }

        Ok(())
    }
}

impl Segment {
    fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        let mut elem = BytesStart::new("s:segment");
        elem.push_attribute(("v2", self.v2.to_string().as_str()));

        if let Some(p1) = self.p1 {
            elem.push_attribute(("p1", p1.to_string().as_str()));
        }
        if let Some(p2) = self.p2 {
            elem.push_attribute(("p2", p2.to_string().as_str()));
        }
        if let Some(pid) = self.pid {
            elem.push_attribute(("pid", pid.to_string().as_str()));
        }

        writer.write_event(Event::Empty(elem))?;

        Ok(())
    }
}

impl SliceResources {
    pub fn write<W: Write>(&self, writer: &mut Writer<W>) -> Result<()> {
        for slice_stack in &self.slice_stacks {
            slice_stack.write(writer)?;
        }
        Ok(())
    }
}

impl SliceObject {
    pub fn write(&self, elem: &mut BytesStart) -> Result<()> {
        if let Some(id) = self.slice_stack_id {
            elem.push_attribute(("s:slicestackid", id.to_string().as_str()));
        }
        if let Some(res) = self.mesh_resolution {
            elem.push_attribute(("s:meshresolution", res.to_string().as_str()));
        }
        Ok(())
    }
}