1use 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}