layer_height=0.3; od = 29; odx = 1; oh = 10; id = 20; t = 3; rd = 50; fn_rd = 10; p = layer_height*4; ps = 1.5; t2 = 6; snap_size = [(id+od-id)/2,5,2]; module ring(size){ translate([0,0,-1]) difference(){ cylinder(r1=size.x,r2=size.x,h=size.y); translate([0,0,-1]) cylinder(r=size.x-size.z,h=size.y+2); } } seal_d = 14; twist_id = od-2; twist_od = od+1; twist_h = 3; twist_s = 1; twist_c = 3; module twist(){ difference(){ cylinder(r=twist_od/2,h=twist_h); difference(){ union(){ translate([twist_c,-twist_od/2-1,0]) cube([twist_od,twist_od+2,twist_s]); translate([-twist_od-twist_c,-twist_od/2-1,0]) cube([twist_od,twist_od+2,twist_s]); } translate([0,0,-1]) cylinder(r=twist_id/2,h=twist_h+2); } translate([0,0,-1]) cylinder(r=twist_id/2-2,h=twist_h+2); } } module top(){ difference(){ union(){ translate([0,0,t]) cylinder(r1=od/2+odx,r2=od/2-odx,h=oh); cylinder(r=rd/2,h=t,$fn=fn_rd); } translate([0,0,-1]) cylinder(r=id/2,h=oh+2+t); translate([0,0,-0.01]) twist(); } difference(){ cylinder(r=id/2-ps,h=p); translate([0,0,-1]) cylinder(r=id/2-ps*2,h=p+2); } for(i=[0:6]) rotate([0,0,i*360/6]) translate([id/2-ps*1.5,-ps/2,0]) cube([ps*2,ps,p]); } module bottom(){ difference(){ union(){ translate([0,0,t2]) cylinder(r=rd/2,h=t,$fn=fn_rd); for(i=[0:fn_rd/2]) rotate([0,0,i*360/fn_rd]) translate([0,0,t2/2]) intersection() {cube([rd,3,t2],center=true); cylinder(r=rd/2,h=t2,$fn=fn_rd,center=true);} } translate([0,0,t2/2]) cylinder(r=seal_d/2,h=t2+t+2,$fn=fn_rd); translate([0,0,t2+t/2]) cylinder(r=twist_id/2-1.75,h=t2+t+2); } color([1,0,0]) translate([0,0,t+t2]){ difference(){ cylinder(r=twist_od/2-1.75,h=2.6); translate([0,0,-1]) cylinder(r=twist_id/2-1.75,h=10); } difference(){ union(){ translate([0,twist_od/2,2.6]) rotate([90,0,0]) cylinder(r=1.6,h=3,$fn=4); translate([0,-twist_od/2,2.6]) rotate([-90,0,0]) cylinder(r=1.6,h=3,$fn=4); } translate([0,0,2.6]) cylinder(r=100,h=10); } } } for(i=[0:0]) rotate([180*i,0,0]) translate([0,(rd+2)*i,-(t+t2)*i]) union(){ bottom(); translate([rd+2,0,0]) top(); }