1extern crate gen_gcode;
3
4use gen_gcode::*;
5use std::fs::File;
6use std::io::prelude::*;
7
8fn main() {
9 let print_area_x = 220;
10 let print_area_y = 220;
11 let print_area_z = 250;
12 let nozzle_temp = 210;
13 let bed_temp = 80;
14 let nozzle_size = 0.4;
15 let layer_hight = 0.2;
16 let boxlength = 40.0;
17 let wall_thickness = 0.8;
18 let num_walls = &wall_thickness/&nozzle_size;
19 let bottom_thickness = 0.8;
20 let num_bottom_layers = &bottom_thickness/&layer_hight;
21 let top_thickness = 0.4;
22 let num_top_layers = &top_thickness/&layer_hight;
23 let init_layer_hight = 0.17;
24 let extrude_per_travel = 0.024;
25
26 let move_feed_rate = Some(3000);
27 let print_feed_rate = Some(300);
28
29 let mut file = File::create("foo.gcode").unwrap();
30 file.write(wait_bed_temp(bed_temp).as_bytes());
31 file.write(wait_hotend_temp(nozzle_temp, None).as_bytes());
32 file.write(absolute_extrution().as_bytes());
33 file.write(auto_home().as_bytes());
34 file.write(reset_extruder(0.0).as_bytes());
35 file.write(move_xyz(Point3d { x: 0.0, y: 0.0, z: 2.0 }, false, move_feed_rate, None).as_bytes());
36
37 let layers_z = gen_layer_heights(init_layer_hight, boxlength, layer_hight);
38
39 for l in layers_z {
40 let start_point: Point3d = calc_start_point(print_area_x, print_area_y, boxlength, boxlength, l);
41 file.write(move_xyz(start_point, false, move_feed_rate, None).as_bytes());
42 let permim_points = gen_2_perimiters(start_point, nozzle_size, num_walls, boxlength, boxlength);
43 let mut e_dest = 0.0;
44 for p in permim_points {
45 e_dest += boxlength * extrude_per_travel;
46 file.write(move_xyz(p, true, print_feed_rate, Some(e_dest)).as_bytes());
47 }
48 }
49 }
60
61fn calc_start_point(bed_x: u8, bed_y: u8, print_x: f32, print_y: f32, first_layer_z: f32) -> Point3d {
62 let init_x = (bed_x as f32/2.0) - (print_x/2.0);
63 let init_y = (bed_y as f32/2.0) - (print_y/2.0);
64 return Point3d { x: init_x as f32, y: init_y as f32, z: first_layer_z}
65}
66
67fn gen_2_perimiters(start_point: Point3d, nozzle_size: f32, num_walls: f32, x_dim: f32, y_dim: f32) -> Vec<Point3d> {
68 let mut points: Vec<Point3d> = Vec::new();
69
70 let mut tmp_point = Point3d { x: start_point.x, y: start_point.y, z: start_point.z };
71 for n in 0..num_walls as u8 {
73 let offset = n as f32 * nozzle_size;
74 println!("Offset: {:#?}", offset);
75 println!("x-left: {:#?}", start_point.x+offset);
76 println!("x-right: {:#?}", start_point.x+x_dim-offset);
77 println!("y-top: {:#?}", start_point.y+y_dim-offset);
78 println!("y-bottem: {:#?}", start_point.y+offset);
79 tmp_point = Point3d { x: tmp_point.x, y: start_point.y+y_dim-offset, z: tmp_point.z };
80 points.push(tmp_point);
81 tmp_point = Point3d { x: start_point.x+x_dim-offset, y: tmp_point.y, z: tmp_point.z };
82 points.push(tmp_point);
83 tmp_point = Point3d { x: tmp_point.x, y: start_point.y+offset, z: tmp_point.z };
84 points.push(tmp_point);
85 tmp_point = Point3d { x: start_point.x+offset, y: tmp_point.y, z: tmp_point.z };
86 points.push(tmp_point);
87 }
88
89 return points
90}
91
92fn gen_layer_heights(first_layer_z: f32, last_layer_z: f32, z_height: f32) -> Vec<f32> {
93 let mut z_heights: Vec<f32> = Vec::new();
94
95 let first_layer_z_micron = (first_layer_z * 1000.0) as u32;
96 let last_layer_z_micron = (last_layer_z * 1000.0) as u32;
97 let z_height_micron = (z_height * 1000.0) as usize;
98 for x in (first_layer_z_micron..last_layer_z_micron).step_by(z_height_micron) {
99 z_heights.push(x as f32 / 1000.0);
100 }
101 return z_heights
102}
103
104fn layer_change(cur_layer_end: Point3d, new_layer_start: Point3d, layer_hight: f32) -> Vec<String> {
105 let mut layer_change_gcode: Vec<String> = Vec::new();
106
107 layer_change_gcode.push(move_z(cur_layer_end.z + layer_hight * 1.25));
108 layer_change_gcode.push(move_xy(Point2d { x: new_layer_start.x, y: new_layer_start.y }, false, None, None));
109 layer_change_gcode.push(move_z(new_layer_start.z));
110
111 return layer_change_gcode
112}