// -*- C -*- arch_height = 24; arch_width = 75; end_width = 25; arch_thick = 5; arch_breadth = 25; hole_dia = 3 + 0.5; // computed arch_alpha = atan(arch_height / (arch_width/2)); arch_beta = 2*arch_alpha; echo(arch_alpha,arch_beta); arch_in_rad = arch_width/2 / sin(arch_beta); arch_to_chord = arch_in_rad * cos(arch_beta); end_thick = arch_thick; holes = [[[ 5 , 5 ], [16 , 21]], // left [[ 18.5, 4.5], [ 4.5, 22]]]; // right module ArchProfile(){ intersection(){ translate([-200,0]) square([400,200]); union(){ translate([0,-arch_to_chord]){ difference(){ circle(arch_in_rad + arch_thick, $fa=0.1); circle(arch_in_rad, $fa=0.1); } } for (m=[0,1]) mirror([m,0]) translate([arch_width/2,0]) square([end_width, end_thick]); } } } module Holes(){ for (m=[0,1]) { mirror([1-m,0]) translate([arch_width/2, 50, 0]) rotate([90,0,0]) for (h=holes[m]) { translate(h) cylinder(r=hole_dia/2, h=100, $fn=20); } } } module Arch(){ difference(){ rotate([0,0,180]) linear_extrude(height=arch_breadth) ArchProfile(); Holes(); } } Arch();