2wallbox/
2wallbox.rs

1// examples/2wallbox.rs
2extern 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    // let start_point: Point3d = calc_start_point(print_area_x, print_area_y, boxlength, boxlength, init_layer_hight);
50    // file.write(move_xyz(start_point, false, move_feed_rate, None).as_bytes());
51    // let layers_z = gen_layer_heights(init_layer_hight, boxlength, layer_hight);
52    // let permim_points = gen_2_perimiters(start_point, nozzle_size, num_walls, boxlength, boxlength);
53    // let mut e_dest = 0.0;
54    // for p in permim_points {
55    //     e_dest += boxlength * extrude_per_travel;
56    //     file.write(move_xyz(p, true, print_feed_rate, Some(e_dest)).as_bytes());
57    // }
58
59}
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    // points.push(tmp_point);
72    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}