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