two_boxes/
two-boxes.rs

1//! Example from Gerber Specification
2//! 2025.05 - 2.11.1 "Example: Two Square Boxes"
3
4use std::io::stdout;
5
6use gerber_types::{
7    Aperture, ApertureDefinition, Circle, Command, CommentContent, CoordinateFormat, Coordinates,
8    DCode, ExtendedCode, FileAttribute, FunctionCode, GCode, GenerationSoftware, GerberCode,
9    InterpolationMode, MCode, Operation, Part, Polarity, Unit,
10};
11
12const VERSION: &'static str = env!("CARGO_PKG_VERSION");
13
14fn main() {
15    let cf = CoordinateFormat::new(2, 6);
16    let commands: Vec<Command> = vec![
17        FunctionCode::GCode(GCode::Comment(CommentContent::String(
18            "Ucamco ex. 1: Two square boxes".to_string(),
19        )))
20        .into(),
21        ExtendedCode::Unit(Unit::Millimeters).into(),
22        ExtendedCode::CoordinateFormat(cf).into(),
23        ExtendedCode::FileAttribute(FileAttribute::GenerationSoftware(GenerationSoftware::new(
24            "MakerPnP",
25            "gerber-types",
26            Some(VERSION),
27        )))
28        .into(),
29        ExtendedCode::FileAttribute(FileAttribute::Part(Part::Other("example".to_string()))).into(),
30        ExtendedCode::LoadPolarity(Polarity::Dark).into(),
31        ExtendedCode::ApertureDefinition(ApertureDefinition {
32            code: 10,
33            aperture: Aperture::Circle(Circle {
34                diameter: 0.01,
35                hole_diameter: None,
36            }),
37        })
38        .into(),
39        FunctionCode::DCode(DCode::SelectAperture(10)).into(),
40        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::new(
41            0, 0, cf,
42        )))))
43        .into(),
44        FunctionCode::GCode(GCode::InterpolationMode(InterpolationMode::Linear)).into(),
45        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
46            Some(Coordinates::new(5, 0, cf)),
47            None,
48        )))
49        .into(),
50        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
51            Some(Coordinates::at_y(5, cf)),
52            None,
53        )))
54        .into(),
55        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
56            Some(Coordinates::at_x(0, cf)),
57            None,
58        )))
59        .into(),
60        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
61            Some(Coordinates::at_y(0, cf)),
62            None,
63        )))
64        .into(),
65        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::at_x(
66            6, cf,
67        )))))
68        .into(),
69        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
70            Some(Coordinates::at_x(11, cf)),
71            None,
72        )))
73        .into(),
74        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
75            Some(Coordinates::at_y(5, cf)),
76            None,
77        )))
78        .into(),
79        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
80            Some(Coordinates::at_x(6, cf)),
81            None,
82        )))
83        .into(),
84        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
85            Some(Coordinates::at_y(0, cf)),
86            None,
87        )))
88        .into(),
89        FunctionCode::MCode(MCode::EndOfFile).into(),
90    ];
91    let mut stdout = stdout();
92    commands.serialize(&mut stdout).unwrap();
93}