polarities_apertures/
polarities-apertures.rs

1//! Example from an older version of the Gerber Specification
2//! chapter 2.12.2
3use std::io::stdout;
4
5use std::convert::TryFrom;
6
7use gerber_types::*;
8
9const VERSION: &'static str = env!("CARGO_PKG_VERSION");
10
11fn main() {
12    let cf = CoordinateFormat::new(ZeroOmission::Leading, CoordinateMode::Absolute, 2, 6);
13    let commands: Vec<Command> = vec![
14        FunctionCode::GCode(GCode::Comment(CommentContent::String(
15            "Ucamco ex. 2: Shapes".to_string(),
16        )))
17        .into(),
18        ExtendedCode::CoordinateFormat(cf).into(),
19        ExtendedCode::Unit(Unit::Inches).into(),
20        ExtendedCode::FileAttribute(FileAttribute::GenerationSoftware(GenerationSoftware::new(
21            "Rust Gerber",
22            "gerber-types",
23            Some(VERSION),
24        )))
25        .into(),
26        ExtendedCode::FileAttribute(FileAttribute::Part(Part::Other(
27            "Only an example".to_string(),
28        )))
29        .into(),
30        ExtendedCode::LoadPolarity(Polarity::Dark).into(),
31        FunctionCode::GCode(GCode::Comment(CommentContent::String(
32            "Define Apertures".to_string(),
33        )))
34        .into(),
35        ExtendedCode::ApertureMacro(ApertureMacro::new("TARGET125").add_content(MoirePrimitive {
36            center: (0.0.into(), 0.0.into()),
37            diameter: 0.125.into(),
38            ring_thickness: 0.01.into(),
39            gap: 0.01.into(),
40            max_rings: 3,
41            cross_hair_thickness: 0.003.into(),
42            cross_hair_length: 0.150.into(),
43            angle: 0.0.into(),
44        }))
45        .into(),
46        ExtendedCode::ApertureMacro(ApertureMacro::new("THERMAL80").add_content(
47            ThermalPrimitive {
48                center: (0.0.into(), 0.0.into()),
49                outer_diameter: 0.08.into(),
50                inner_diameter: 0.055.into(),
51                gap: 0.0125.into(),
52                angle: 45.0.into(),
53            },
54        ))
55        .into(),
56        ExtendedCode::ApertureDefinition(ApertureDefinition {
57            code: 10,
58            aperture: Aperture::Circle(Circle {
59                diameter: 0.01,
60                hole_diameter: None,
61            }),
62        })
63        .into(),
64        ExtendedCode::ApertureDefinition(ApertureDefinition {
65            code: 11,
66            aperture: Aperture::Circle(Circle {
67                diameter: 0.06,
68                hole_diameter: None,
69            }),
70        })
71        .into(),
72        ExtendedCode::ApertureDefinition(ApertureDefinition {
73            code: 12,
74            aperture: Aperture::Rectangle(Rectangular {
75                x: 0.06,
76                y: 0.06,
77                hole_diameter: None,
78            }),
79        })
80        .into(),
81        ExtendedCode::ApertureDefinition(ApertureDefinition {
82            code: 13,
83            aperture: Aperture::Rectangle(Rectangular {
84                x: 0.04,
85                y: 0.1,
86                hole_diameter: None,
87            }),
88        })
89        .into(),
90        ExtendedCode::ApertureDefinition(ApertureDefinition {
91            code: 14,
92            aperture: Aperture::Rectangle(Rectangular {
93                x: 0.1,
94                y: 0.04,
95                hole_diameter: None,
96            }),
97        })
98        .into(),
99        ExtendedCode::ApertureDefinition(ApertureDefinition {
100            code: 15,
101            aperture: Aperture::Obround(Rectangular {
102                x: 0.04,
103                y: 0.1,
104                hole_diameter: None,
105            }),
106        })
107        .into(),
108        ExtendedCode::ApertureDefinition(ApertureDefinition {
109            code: 16,
110            aperture: Aperture::Polygon(Polygon {
111                diameter: 0.1,
112                vertices: 3,
113                rotation: None,
114                hole_diameter: None,
115            }),
116        })
117        .into(),
118        ExtendedCode::ApertureDefinition(ApertureDefinition {
119            code: 18,
120            aperture: Aperture::Macro("TARGET125".to_string(), None),
121        })
122        .into(),
123        ExtendedCode::ApertureDefinition(ApertureDefinition {
124            code: 19,
125            aperture: Aperture::Macro("THERMAL80".to_string(), None),
126        })
127        .into(),
128        FunctionCode::GCode(GCode::Comment(CommentContent::String(
129            "Start image generation".to_string(),
130        )))
131        .into(),
132        FunctionCode::DCode(DCode::SelectAperture(10)).into(),
133        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::new(
134            0,
135            CoordinateNumber::try_from(0.25).unwrap(),
136            cf,
137        )))))
138        .into(),
139        FunctionCode::GCode(GCode::InterpolationMode(InterpolationMode::Linear)).into(),
140        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
141            Some(Coordinates::new(0, 0, cf)),
142            None,
143        )))
144        .into(),
145        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
146            Some(Coordinates::new(
147                CoordinateNumber::try_from(0.25).unwrap(),
148                0,
149                cf,
150            )),
151            None,
152        )))
153        .into(),
154        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::new(
155            1, 1, cf,
156        )))))
157        .into(),
158        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
159            Some(Coordinates::at_x(
160                CoordinateNumber::try_from(1.5).unwrap(),
161                cf,
162            )),
163            None,
164        )))
165        .into(),
166        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
167            Some(Coordinates::new(
168                2,
169                CoordinateNumber::try_from(1.5).unwrap(),
170                cf,
171            )),
172            None,
173        )))
174        .into(),
175        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::at_x(
176            CoordinateNumber::try_from(2.5).unwrap(),
177            cf,
178        )))))
179        .into(),
180        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
181            Some(Coordinates::at_y(1, cf)),
182            None,
183        )))
184        .into(),
185        FunctionCode::DCode(DCode::SelectAperture(11)).into(),
186        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
187            1, 1, cf,
188        )))))
189        .into(),
190        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
191            2, 1, cf,
192        )))))
193        .into(),
194        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
195            CoordinateNumber::try_from(2.5).unwrap(),
196            1,
197            cf,
198        )))))
199        .into(),
200        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
201            CoordinateNumber::try_from(2.5).unwrap(),
202            CoordinateNumber::try_from(1.5).unwrap(),
203            cf,
204        )))))
205        .into(),
206        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
207            2,
208            CoordinateNumber::try_from(1.5).unwrap(),
209            cf,
210        )))))
211        .into(),
212        FunctionCode::DCode(DCode::SelectAperture(12)).into(),
213        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
214            1,
215            CoordinateNumber::try_from(1.5).unwrap(),
216            cf,
217        )))))
218        .into(),
219        FunctionCode::DCode(DCode::SelectAperture(13)).into(),
220        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
221            3,
222            CoordinateNumber::try_from(1.5).unwrap(),
223            cf,
224        )))))
225        .into(),
226        FunctionCode::DCode(DCode::SelectAperture(14)).into(),
227        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
228            3,
229            CoordinateNumber::try_from(1.25).unwrap(),
230            cf,
231        )))))
232        .into(),
233        FunctionCode::DCode(DCode::SelectAperture(15)).into(),
234        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
235            3, 1, cf,
236        )))))
237        .into(),
238        FunctionCode::DCode(DCode::SelectAperture(10)).into(),
239        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::new(
240            CoordinateNumber::try_from(3.75).unwrap(),
241            1,
242            cf,
243        )))))
244        .into(),
245        FunctionCode::GCode(GCode::QuadrantMode(QuadrantMode::Multi)).into(),
246        FunctionCode::GCode(GCode::InterpolationMode(
247            InterpolationMode::CounterclockwiseCircular,
248        ))
249        .into(),
250        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
251            Some(Coordinates::new(
252                CoordinateNumber::try_from(3.75).unwrap(),
253                1,
254                cf,
255            )),
256            Some(CoordinateOffset::new(
257                CoordinateNumber::try_from(0.25).unwrap(),
258                0,
259                cf,
260            )),
261        )))
262        .into(),
263        FunctionCode::DCode(DCode::SelectAperture(16)).into(),
264        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
265            CoordinateNumber::try_from(3.4).unwrap(),
266            1,
267            cf,
268        )))))
269        .into(),
270        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
271            CoordinateNumber::try_from(3.5).unwrap(),
272            CoordinateNumber::try_from(0.9).unwrap(),
273            cf,
274        )))))
275        .into(),
276        FunctionCode::DCode(DCode::SelectAperture(10)).into(),
277        FunctionCode::GCode(GCode::RegionMode(true)).into(),
278        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::new(
279            CoordinateNumber::try_from(0.5).unwrap(),
280            2,
281            cf,
282        )))))
283        .into(),
284        FunctionCode::GCode(GCode::InterpolationMode(InterpolationMode::Linear)).into(),
285        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
286            Some(Coordinates::at_y(
287                CoordinateNumber::try_from(3.75).unwrap(),
288                cf,
289            )),
290            None,
291        )))
292        .into(),
293        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
294            Some(Coordinates::at_x(
295                CoordinateNumber::try_from(3.75).unwrap(),
296                cf,
297            )),
298            None,
299        )))
300        .into(),
301        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
302            Some(Coordinates::at_y(2, cf)),
303            None,
304        )))
305        .into(),
306        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
307            Some(Coordinates::at_x(
308                CoordinateNumber::try_from(0.5).unwrap(),
309                cf,
310            )),
311            None,
312        )))
313        .into(),
314        FunctionCode::GCode(GCode::RegionMode(false)).into(),
315        FunctionCode::DCode(DCode::SelectAperture(18)).into(),
316        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
317            0,
318            CoordinateNumber::try_from(3.875).unwrap(),
319            cf,
320        )))))
321        .into(),
322        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
323            CoordinateNumber::try_from(3.875).unwrap(),
324            CoordinateNumber::try_from(3.875).unwrap(),
325            cf,
326        )))))
327        .into(),
328        ExtendedCode::LoadPolarity(Polarity::Clear).into(),
329        FunctionCode::GCode(GCode::RegionMode(true)).into(),
330        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::new(
331            1,
332            CoordinateNumber::try_from(2.5).unwrap(),
333            cf,
334        )))))
335        .into(),
336        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
337            Some(Coordinates::at_y(3, cf)),
338            None,
339        )))
340        .into(),
341        FunctionCode::GCode(GCode::QuadrantMode(QuadrantMode::Single)).into(),
342        FunctionCode::GCode(GCode::InterpolationMode(
343            InterpolationMode::ClockwiseCircular,
344        ))
345        .into(),
346        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
347            Some(Coordinates::new(
348                CoordinateNumber::try_from(1.25).unwrap(),
349                CoordinateNumber::try_from(3.25).unwrap(),
350                cf,
351            )),
352            Some(CoordinateOffset::new(
353                CoordinateNumber::try_from(0.25).unwrap(),
354                0,
355                cf,
356            )),
357        )))
358        .into(),
359        FunctionCode::GCode(GCode::InterpolationMode(InterpolationMode::Linear)).into(),
360        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
361            Some(Coordinates::at_x(3, cf)),
362            None,
363        )))
364        .into(),
365        FunctionCode::GCode(GCode::QuadrantMode(QuadrantMode::Multi)).into(),
366        FunctionCode::GCode(GCode::InterpolationMode(
367            InterpolationMode::ClockwiseCircular,
368        ))
369        .into(),
370        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
371            Some(Coordinates::new(
372                3,
373                CoordinateNumber::try_from(2.5).unwrap(),
374                cf,
375            )),
376            Some(CoordinateOffset::new(
377                0,
378                CoordinateNumber::try_from(0.375).unwrap(),
379                cf,
380            )),
381        )))
382        .into(),
383        FunctionCode::GCode(GCode::InterpolationMode(InterpolationMode::Linear)).into(),
384        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
385            Some(Coordinates::at_x(1, cf)),
386            None,
387        )))
388        .into(),
389        FunctionCode::GCode(GCode::RegionMode(false)).into(),
390        ExtendedCode::LoadPolarity(Polarity::Dark).into(),
391        FunctionCode::DCode(DCode::SelectAperture(10)).into(),
392        FunctionCode::DCode(DCode::Operation(Operation::Move(Some(Coordinates::new(
393            CoordinateNumber::try_from(1.5).unwrap(),
394            CoordinateNumber::try_from(2.875).unwrap(),
395            cf,
396        )))))
397        .into(),
398        FunctionCode::DCode(DCode::Operation(Operation::Interpolate(
399            Some(Coordinates::at_x(2, cf)),
400            None,
401        )))
402        .into(),
403        FunctionCode::DCode(DCode::SelectAperture(11)).into(),
404        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
405            CoordinateNumber::try_from(1.5).unwrap(),
406            CoordinateNumber::try_from(2.875).unwrap(),
407            cf,
408        )))))
409        .into(),
410        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::at_x(
411            2, cf,
412        )))))
413        .into(),
414        FunctionCode::DCode(DCode::SelectAperture(19)).into(),
415        FunctionCode::DCode(DCode::Operation(Operation::Flash(Some(Coordinates::new(
416            CoordinateNumber::try_from(2.875).unwrap(),
417            CoordinateNumber::try_from(2.875).unwrap(),
418            cf,
419        )))))
420        .into(),
421        ExtendedCode::FileAttribute(FileAttribute::Md5(
422            "6ab9e892830469cdff7e3e346331d404".to_string(),
423        ))
424        .into(),
425        FunctionCode::MCode(MCode::EndOfFile).into(),
426    ];
427    let mut stdout = stdout();
428    commands.serialize(&mut stdout).unwrap();
429}