/* * polyScrewThread.scad by aubenc @ Thingiverse * * This script contains the library modules that can be used to generate * threaded rods, screws and nuts. * * http://www.thingiverse.com/thing:8796 * * CC Public Domain */ module screw_thread(od,st,lf0,lt,rs,cs) { or=od/2; ir=or-st/2*cos(lf0)/sin(lf0); pf=2*PI*or; sn=floor(pf/rs); lfxy=360/sn; ttn=round(lt/st)+1; zt=st/sn; intersection() { if (cs >= -1) { # thread_shape(cs,lt,or,ir,sn,st); } full_thread(ttn,st,sn,zt,lfxy,or,ir); } } module hex_nut(df,hg,sth,clf,cod,crs) { difference() { hex_head(hg,df); hex_countersink_ends(sth/2,cod,clf,crs,hg); screw_thread(cod,sth,clf,hg,crs,-2); } } module hex_screw(od,st,lf0,lt,rs,cs,df,hg,ntl,ntd) { ntr=od/2-(st/2+0.1)*cos(lf0)/sin(lf0); union() { hex_head(hg,df); translate([0,0,hg]) if ( ntl == 0 ) { cylinder(h=0.01, r=ntr, center=true); } else { if ( ntd == -1 ) { cylinder(h=ntl+0.01, r=ntr, $fn=floor(od*PI/rs), center=false); } else if ( ntd == 0 ) { union() { cylinder(h=ntl-st/2, r=od/2, $fn=floor(od*PI/rs), center=false); translate([0,0,ntl-st/2]) cylinder(h=st/2, r1=od/2, r2=ntr, $fn=floor(od*PI/rs), center=false); } } else { cylinder(h=ntl, r=ntd/2, $fn=ntd*PI/rs, center=false); } } translate([0,0,ntl+hg]) screw_thread(od,st,lf0,lt,rs,cs); } } module thread_shape(cs,lt,or,ir,sn,st) { if ( cs == 0 ) { cylinder(h=lt, r=or, $fn=sn, center=false); } else { union() { translate([0,0,st/2]) cylinder(h=lt-st+0.005, r=or, $fn=sn, center=false); if ( cs == -1 || cs == 2 ) { cylinder(h=st/2, r1=ir, r2=or, $fn=sn, center=false); } else { cylinder(h=st/2, r=or, $fn=sn, center=false); } translate([0,0,lt-st/2]) if ( cs == 1 || cs == 2 ) { cylinder(h=st/2, r1=or, r2=ir, $fn=sn, center=false); } else { cylinder(h=st/2, r=or, $fn=sn, center=false); } } } } module full_thread(ttn,st,sn,zt,lfxy,or,ir) { for(i=[0:ttn-1]) { for(j=[0:sn-1]) { polyhedron( points=[ [0, 0, i*st-st ], [ir*cos((j+1)*lfxy), ir*sin((j+1)*lfxy), i*st+(j+1)*zt-st ], [ir*cos(j*lfxy), ir*sin(j*lfxy), i*st+j*zt-st ], [or*cos((j+1)*lfxy), or*sin((j+1)*lfxy), i*st+(j+1)*zt-st/2 ], [or*cos(j*lfxy), or*sin(j*lfxy), i*st+j*zt-st/2 ], [0, 0, i*st+st ], [ir*cos((j+1)*lfxy), ir*sin((j+1)*lfxy), i*st+(j+1)*zt ], [ir*cos(j*lfxy), ir*sin(j*lfxy), i*st+j*zt ] ], triangles=[ [0,1,2], [5,6,3],[5,3,0],[0,3,1], [3,4,1],[1,4,2], [3,6,4],[4,6,7], [0,2,4],[0,4,5],[5,4,7], [5,7,6] ], convexity=5); } } } module hex_head(hg,df) { cylinder(h=hg, r=df/2/sin(60), $fn=6, center=false); } module hex_countersink_ends(chg,cod,clf,crs,hg) { translate([0,0,-0.1]) cylinder(h=chg+0.01, r1=cod/2, r2=cod/2-(chg+0.1)*cos(clf)/sin(clf), $fn=floor(cod*PI/crs), center=false); translate([0,0,hg-chg+0.1]) cylinder(h=chg+0.01, r1=cod/2-(chg+0.1)*cos(clf)/sin(clf), r2=cod/2, $fn=floor(cod*PI/crs), center=false); }