/* mount options */ wt = 5; // wall thickness (min 5mm for m2 inserts) tb = 40; bpt = 7; /* fan size */ lf = 40; // length tf = 10; // thickness lhf = 34.8; // distance mounting holes lof = 28; // length of outlet wof = 8; // width of outlet rc = 2; // radius corners t= tb-bpt-tf; $fn= 100; module through(l=7, lh=3.3, lt=1, lb=1){ union(){ translate([0,0,l-lh])cylinder(h=lh+lt, d=5.6); translate([0,0,-lb])cylinder(h=l+lh+lb, d=3.5); } } module m3 (h=8, lt=1){ //translate([0,0,-lt])cylinder(h, d=2.5); // tapped M3 translate([0,0,-lt])cylinder(h, d=4); // rutex insert } module m2 (h=8, lt=1){ //translate([0,0,-lt])cylinder(h, d=1.5); // tapped M3 translate([0,0,-lt])cylinder(h, d=3.2); // rutex insert } module mount(){ translate([4,4,-18])difference(){ hull(){ translate([0,0,12])cylinder(h=6, d=8); translate([4,-4,0])cube([0.01,8,18]); } translate([0,0,18])mirror([0,0,1])through(l=10,lb=1,lt=10,lh=7); } } difference(){ union(){ hull(){ for(x=[rc, lf-rc]){ for(y=[rc, lf-rc]){ translate([x,y])cylinder(h=wt,r=rc); } } } translate([lf,5,wt+8])rotate([0,90,0])mount(); translate([lf,lf-5-8,wt+8])rotate([0,90,0])mount(); } for(x=[(lf-lhf)/2, (lf-lhf)/2+lhf]){ for(y=[(lf-lhf)/2, (lf-lhf)/2+lhf]){ translate([x,y])m2(); } } translate([8, 0,wt/2])rotate([-90,0,0])m2(); translate([lf-8, 0,wt/2])rotate([-90,0,0])m2(); }