|
|
@@ -6,6 +6,9 @@ module angler_object() {
|
|
|
width = angler_width;
|
|
|
thickness = angler_thickness;
|
|
|
rounding = thickness / 2;
|
|
|
+ hole = angler_hole;
|
|
|
+ holes_count = angler_holes_count;
|
|
|
+ hole_margin = angler_hole_margin;
|
|
|
|
|
|
module outside_shape() {
|
|
|
move_x = angler_depth / 2 - rounding;
|
|
|
@@ -83,5 +86,48 @@ module angler_object() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- base_object();
|
|
|
+ module holes_object() {
|
|
|
+ move_x_top = thickness - hole / 2 + hole_margin - depth / 2;
|
|
|
+ move_x_bottom = depth / 2 - hole / 2 - hole_margin;
|
|
|
+ move_z_top = height / 2 - thickness - hole / 2 - hole_margin;
|
|
|
+ move_z_bottom = hole / 2 + hole_margin - height / 2;
|
|
|
+ normal_width = width - thickness * 2 - hole - hole_margin * 2;
|
|
|
+ move_y = normal_width / 2;
|
|
|
+ space = normal_width / (holes_count - 1);
|
|
|
+
|
|
|
+ for (count = [-move_y : space : move_y]) {
|
|
|
+ translate([move_x_top, count, 0]) {
|
|
|
+ cylinder(r = hole / 2, h = height, center = true);
|
|
|
+ }
|
|
|
+
|
|
|
+ translate([move_x_bottom, count, 0]) {
|
|
|
+ cylinder(r = hole / 2, h = height, center = true);
|
|
|
+ }
|
|
|
+
|
|
|
+ translate([0, count, move_z_top]) {
|
|
|
+ rotate([0, 90, 0]) {
|
|
|
+ cylinder(r = hole / 2, h = height, center = true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ translate([0, count, move_z_bottom]) {
|
|
|
+ rotate([0, 90, 0]) {
|
|
|
+ cylinder(r = hole / 2, h = height, center = true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ module final_object() {
|
|
|
+ render() {
|
|
|
+ difference() {
|
|
|
+ base_object();
|
|
|
+ holes_object();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ color("#005500") {
|
|
|
+ final_object();
|
|
|
+ }
|
|
|
}
|