inch = 25.4; diameter = (1+5/16)*inch; wallthickness = 2.5; piecethickness = 3/8*inch; numpieces = 4; minkr = wallthickness/2; height = numpieces*piecethickness; eps = 0.1; baseheight = 1/8*inch - wallthickness; slotwidth = 1/2*inch; boarddiam = (30+5/8)*inch; edgethickness = 9; railheight = 3/4*inch; $fa=.1; $fs=1; cutr=.2*inch; module edgething(){ hull(){ translate([(slotwidth+wallthickness)/2+cutr,0, (height-wallthickness+eps)/2-cutr]) rotate([90,0,0]) cylinder(h=diameter*1.2, r=cutr, center=true); translate([(slotwidth+wallthickness)/2+cutr,0, -(height-wallthickness+eps)/2]) rotate([90,0,0]) cylinder(h=diameter*1.2, r=cutr, center=true); } } module tube(shift) { translate([shift,0,0]) difference(){ cylinder(d=diameter+wallthickness+eps, h=height+baseheight-wallthickness); translate([0,0,baseheight+eps]) cylinder(d=diameter+wallthickness, h=height+eps); translate([0,0,(height-wallthickness)/2+eps+baseheight]) difference(){ cube([slotwidth+wallthickness+2*cutr,diameter*1.2,height-wallthickness+eps], center=true); edgething(); mirror([-1,0,0]) edgething(); } } } module tubemask(shift) { translate([shift,0,0]) cylinder(d=diameter+wallthickness+eps, h=3*height, center=true); } module rail(){ difference(){ circle(d=boarddiam+wallthickness, $fs=0.5); circle(d=boarddiam-2*edgethickness-wallthickness, $fs=0.5); } } module thing(){ tube(0); tube(-(diameter+wallthickness+eps)); tube((diameter+wallthickness+eps)); intersection(){ // This is the intersection mask for rails union(){ tubemask(0); tubemask(-(diameter+wallthickness+eps)); tubemask((diameter+wallthickness+eps)); } // Build rails as large circles translate([0, boarddiam/2, -railheight+eps]) linear_extrude(height=railheight){ difference(){ offset(r=eps) rail(); rail(); } } } } minkowski(){ thing(); sphere(d=wallthickness, $fn=16); }