layer_height=0.2; extrusion_width=0.4; epsilon=0.01; $fs=0.125; draft=true; use ; module pushfit_thread(h=10) { thr = 3/8 + .5/25.4; slit = 25.4*thr/2 + 0.2; if(draft) cylinder(d=thr*25.4,h=h); else english_thread(diameter=thr,threads_per_inch=28,length=h/25.4,internal=true); translate([-2,-slit,0]) cube([4,2*slit,h]); } module the_mixer( pushfit_d = 10, pushfit_h = 10, liner_d = 4, liner_id = 2, filament_d = 1.75, join_angle = 30, interpushfit = 2*extrusion_width, // space between two pushfit's threads pushfit_s = 2, // shell around pushfit threads output_l = 4, // length of output after before pushfit outer_r = 3, // outer radius liner_d_tolerance = .2, ) { module liner(l,in) { inh=ld-liner_id; union() { translate([0,0,inh]) cylinder(d=ld,h=l-inh,$fn=ld*PI*2); translate([0,0,-epsilon]) cylinder(d1=ld+epsilon,d2=liner_id-epsilon,h=inh+2*epsilon); } } ld = liner_d+liner_d_tolerance; linero = ld/2/tan(join_angle/2); // liner offset pfrx = interpushfit/2/cos(join_angle/2); // radial margin pfR = pushfit_d/2+pfrx; // radius of pushfit with margin pfo = pfR/tan(join_angle/2); // pushfit thread ofset h = pushfit_d+pushfit_s*2; difference() { hull() { for(s=[-1,1]) { rotate([0,0,s*join_angle/2]) for(ss=[-1,1]) translate([ss*pushfit_d/2,pfo+pushfit_h-outer_r-epsilon]) cylinder(r=outer_r,h=h,center=true,$fn=outer_r*PI*4); translate([s*pushfit_d/2,-output_l-pushfit_h+outer_r+epsilon,0]) cylinder(r=outer_r,h=h,center=true,$fn=outer_r*PI*4); } } for(s=[-1,1]) rotate([0,0,s*join_angle/2]) { translate([0,linero,0]) rotate([-90,0,0]) liner(l=pfo-linero+1,in="bottom"); //cylinder(d=ld,h=pfo-linero+1,$fn=ld*PI*4); translate([0,pfo,0]) rotate([-90,0,0]) pushfit_thread(h=pushfit_h); } rotate([90,0,0]) { liner(l=output_l+1,in="top"); //cylinder(d=ld,h=output_l+1,$fn=ld*PI*4); translate([0,0,output_l]) pushfit_thread(h=pushfit_h); } hull() { for(s=[-1,1]) rotate([0,0,s*join_angle/2]) { rotate([-90,0,0]) translate([0,0,linero]) cylinder(d=ld,h=epsilon,$fn=ld*PI*4); } rotate([90,0,0]) cylinder(d=ld,h=epsilon,$fn=ld*PI*4); } } } if(false) { difference() { the_mixer(); cylinder(d=100,h=100); } }else the_mixer();