173 lines
4.3 KiB
OpenSCAD
173 lines
4.3 KiB
OpenSCAD
|
/*
|
||
|
* 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);
|
||
|
}
|
||
|
|