use std::fmt::Write as FmtWrite;
use crate::gerber::apertures::ApertureDictionary;
use crate::gerber::coordinates::Coord;
pub struct GerberWriter {
buffer: String,
current_aperture: Option<u32>,
}
impl GerberWriter {
pub fn new(title: &str, file_function: &str, polarity_dark: bool) -> Self {
let mut buffer = String::with_capacity(8192);
let _ = writeln!(buffer, "G04 =========================================*");
let _ = writeln!(buffer, "G04 Fusible Pure-Rust Gerber Generator *");
let _ = writeln!(buffer, "G04 Layer: {title:<33} *");
let _ = writeln!(buffer, "G04 =========================================*");
let _ = writeln!(buffer, "%FSLAX46Y46*%");
let _ = writeln!(buffer, "%MOMM*%");
let _ = writeln!(
buffer,
"{}",
if polarity_dark { "%LPD*%" } else { "%LPC*%" }
);
let _ = writeln!(buffer, "%TF.GenerationSoftware,Fusible,0.3.1*%");
let _ = writeln!(buffer, "%TF.FileFunction,{file_function}*%");
let _ = writeln!(buffer, "%TF.FilePolarity,Positive*%");
Self {
buffer,
current_aperture: None,
}
}
pub fn write_apertures(&mut self, apertures: &ApertureDictionary) {
apertures.write_definitions(&mut self.buffer);
}
pub fn select_aperture(&mut self, id: u32) {
if self.current_aperture != Some(id) {
let _ = writeln!(self.buffer, "D{id}*");
self.current_aperture = Some(id);
}
}
pub fn move_to(&mut self, x: Coord, y: Coord) {
let _ = writeln!(
self.buffer,
"X{}Y{}D02*",
x.format_gerber(),
y.format_gerber()
);
}
pub fn draw_to(&mut self, x: Coord, y: Coord) {
let _ = writeln!(
self.buffer,
"X{}Y{}D01*",
x.format_gerber(),
y.format_gerber()
);
}
pub fn flash(&mut self, x: Coord, y: Coord) {
let _ = writeln!(
self.buffer,
"X{}Y{}D03*",
x.format_gerber(),
y.format_gerber()
);
}
pub fn finish(mut self) -> String {
let _ = writeln!(self.buffer, "M02*");
self.buffer
}
}