mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2024-12-29 16:29:40 +00:00
Fixed some issues with internal threading.
Tightening code slightly for generic threaded rod Added figure showing flank angle
This commit is contained in:
parent
1f7d17eab6
commit
c4c9b6cd93
1 changed files with 60 additions and 31 deletions
|
@ -916,16 +916,15 @@ module generic_threaded_rod(
|
||||||
rmax = max(_r1,_r2)+pmax;
|
rmax = max(_r1,_r2)+pmax;
|
||||||
depth = pdepth * pitch;
|
depth = pdepth * pitch;
|
||||||
dummy1 = assert(_r1>depth && _r2>depth, "Screw profile deeper than rod radius");
|
dummy1 = assert(_r1>depth && _r2>depth, "Screw profile deeper than rod radius");
|
||||||
skew_mat = affine3d_skew(sxz=(_r2-_r1)/l);
|
map_threads = right((_r1 + _r2) / 2) // Shift profile out to thread radius
|
||||||
map3d_and_scale = affine3d_frame_map(x=[0,0,1], y=[1,0,0]) // Map profile to 3d, parallel to z axis
|
* affine3d_skew(sxz=(_r2-_r1)/l) // Skew correction for tapered threads
|
||||||
* scale(pitch); // scale profile by pitch
|
* affine3d_frame_map(x=[0,0,1], y=[1,0,0]) // Map profile to 3d, parallel to z axis
|
||||||
|
* scale(pitch); // scale profile by pitch
|
||||||
hig_table = [
|
hig_table = [
|
||||||
[-twist, 0],
|
[-twist/2-0.0001, 0],
|
||||||
[-twist/2-0.00001, 0],
|
|
||||||
[-twist/2+higang1, 1],
|
[-twist/2+higang1, 1],
|
||||||
[+twist/2-higang2, 1],
|
[ twist/2-higang2, 1],
|
||||||
[+twist/2+0.00001, 0],
|
[ twist/2+0.0001, 0],
|
||||||
[+twist, 0],
|
|
||||||
];
|
];
|
||||||
start_steps = sides / starts;
|
start_steps = sides / starts;
|
||||||
thread_verts = [
|
thread_verts = [
|
||||||
|
@ -934,10 +933,7 @@ module generic_threaded_rod(
|
||||||
for (step = [0:1:start_steps]) let(
|
for (step = [0:1:start_steps]) let(
|
||||||
ang = 360 * step/sides,
|
ang = 360 * step/sides,
|
||||||
dz = step / start_steps, // z offset for threads at this angle
|
dz = step / start_steps, // z offset for threads at this angle
|
||||||
rot_prof = zrot(ang*dir) // Rotate profile to correct angular location
|
rot_prof = zrot(ang*dir)*map_threads, // Rotate profile to correct angular location
|
||||||
* right((_r1 + _r2) / 2) // Shift profile out to thread radius
|
|
||||||
* skew_mat // Skew correction for tapered threads
|
|
||||||
* map3d_and_scale, // Map profile into 3d
|
|
||||||
full_profile = [ // profile for the entire rod
|
full_profile = [ // profile for the entire rod
|
||||||
for (thread = [-threads/2:1:threads/2-1]) let(
|
for (thread = [-threads/2:1:threads/2-1]) let(
|
||||||
tang = (thread/starts) * 360 + ang,
|
tang = (thread/starts) * 360 + ang,
|
||||||
|
@ -961,20 +957,21 @@ module generic_threaded_rod(
|
||||||
style = higang1>0 || higang2>0 ? "quincunx" : "min_edge";
|
style = higang1>0 || higang2>0 ? "quincunx" : "min_edge";
|
||||||
|
|
||||||
thread_vnfs = vnf_merge([
|
thread_vnfs = vnf_merge([
|
||||||
|
// Main thread faces
|
||||||
for (i=[0:1:starts-1])
|
for (i=[0:1:starts-1])
|
||||||
zrot(i*360/starts, p=vnf_vertex_array(thread_verts, reverse=left_handed, style=style)),
|
zrot(i*360/starts, p=vnf_vertex_array(thread_verts, reverse=left_handed, style=style)),
|
||||||
|
// Top closing face(s) of thread
|
||||||
for (i=[0:1:starts-1]) let(
|
for (i=[0:1:starts-1]) let(
|
||||||
rmat = zrot(i*360/starts),
|
rmat = zrot(i*360/starts),
|
||||||
pts = deduplicate(list_head(thread_verts[0], len(prof3d)+1)),
|
pts = deduplicate(list_head(thread_verts[0], len(prof3d)+1)),
|
||||||
faces = [for (i=idx(pts,e=-2)) [0, i+1, i]],
|
faces = [for (i=idx(pts,e=-2)) left_handed ? [0, i, i+1] : [0, i+1, i]]
|
||||||
rfaces = left_handed? [for (x=faces) reverse(x)] : faces
|
) [apply(rmat,pts), faces],
|
||||||
) [apply(rmat,pts), rfaces],
|
// Bottom closing face(s) of thread
|
||||||
for (i=[0:1:starts-1]) let(
|
for (i=[0:1:starts-1]) let(
|
||||||
rmat = zrot(i*360/starts),
|
rmat = zrot(i*360/starts),
|
||||||
pts = deduplicate(list_tail(last(thread_verts), -len(prof3d)-2)),
|
pts = deduplicate(list_tail(last(thread_verts), -len(prof3d)-2)),
|
||||||
faces = [for (i=idx(pts,e=-2)) [len(pts)-1, i, i+1]],
|
faces = [for (i=idx(pts,e=-2)) left_handed ? [len(pts)-1, i+1, i] : [len(pts)-1, i, i+1]]
|
||||||
rfaces = left_handed? [for (x=faces) reverse(x)] : faces
|
) [apply(rmat,pts), faces]
|
||||||
) [apply(rmat,pts), rfaces]
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
slope = (_r1-_r2)/l;
|
slope = (_r1-_r2)/l;
|
||||||
|
@ -986,35 +983,43 @@ module generic_threaded_rod(
|
||||||
|
|
||||||
// This method is faster but more complex code and it produces green tops
|
// This method is faster but more complex code and it produces green tops
|
||||||
difference() {
|
difference() {
|
||||||
//vnf_validate(vnf_quantize(thread_vnfs), size=0.1);
|
vnf_polyhedron(vnf_quantize(thread_vnfs),convexity=10);
|
||||||
vnf_polyhedron(vnf_quantize(thread_vnfs), convexity=10);
|
|
||||||
|
|
||||||
if (!internal){
|
if (!internal){
|
||||||
if (bevel1 || bevel2)
|
if (bevel1 || bevel2)
|
||||||
rotate_extrude(){
|
rotate_extrude(){
|
||||||
if (bevel2) polygon([[0,l/2], [_r2+pmax-depth, l/2], [_r2+pmax+slope*depth,l/2-depth], [rmax+1, l/2-depth], [rmax+1,l/2+maxlen], [0,l/2+maxlen]]);
|
if (bevel2) polygon([[ 0, l/2],
|
||||||
if (bevel1) polygon([[0,-l/2], [_r1+pmax-depth, -l/2], [_r1+pmax-slope*depth,-l/2+depth], [rmax+1, -l/2+depth], [rmax+1,-l/2-maxlen], [0,-l/2-maxlen]]);
|
[_r2+pmax-depth, l/2],
|
||||||
|
[_r2+pmax+slope*depth, l/2-depth],
|
||||||
|
[ rmax+1, l/2-depth],
|
||||||
|
[rmax+1, l/2+maxlen],
|
||||||
|
[ 0, l/2+maxlen]]);
|
||||||
|
if (bevel1) polygon([[ 0,-l/2],
|
||||||
|
[_r1+pmax-depth, -l/2],
|
||||||
|
[_r1+pmax-slope*depth, -l/2+depth],
|
||||||
|
[ rmax+1, -l/2+depth],
|
||||||
|
[rmax+1, -l/2-maxlen],
|
||||||
|
[ 0, -l/2-maxlen]]);
|
||||||
}
|
}
|
||||||
if (!bevel1)
|
|
||||||
down(l/2) cuboid([2*rmax+1,2*rmax+1, maxlen], anchor=TOP);
|
|
||||||
if (!bevel2)
|
|
||||||
up(l/2) cuboid([2*rmax+1,2*rmax+1, maxlen], anchor=BOTTOM);
|
|
||||||
}
|
}
|
||||||
|
if (!bevel1 || internal)
|
||||||
|
down(l/2) cuboid([2*rmax+1,2*rmax+1, maxlen], anchor=TOP);
|
||||||
|
if (!bevel2 || internal)
|
||||||
|
up(l/2) cuboid([2*rmax+1,2*rmax+1, maxlen], anchor=BOTTOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* intersection(){
|
/* intersection(){
|
||||||
//vnf_validate(vnf_quantize(thread_vnfs), size=0.1);
|
//vnf_validate(vnf_quantize(thread_vnfs), size=0.1);
|
||||||
vnf_polyhedron(vnf_quantize(thread_vnfs), convexity=10);
|
vnf_polyhedron(vnf_quantize(thread_vnfs), convexity=10);
|
||||||
cyl(l=l, r1=_r1+pmax, r2=_r2+pmax, chamfer1=bevel1?depth:undef, chamfer2=bevel2?depth:undef);
|
cyl(l=l, r1=_r1+pmax, r2=_r2+pmax, chamfer1=bevel1?depth:undef, chamfer2=bevel2?depth:undef);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
// Add bevel for internal threads
|
// Add bevel for internal thread mask
|
||||||
if (internal) {
|
if (internal) {
|
||||||
if (bevel1)
|
if (bevel1)
|
||||||
down(l/2)cyl(l=depth, r1=_r1+pmax, r2=_r1+pmax-slope*depth-depth,anchor=BOTTOM);
|
down(l/2+.001)cyl(l=depth, r1=_r1+pmax, r2=_r1+pmax-slope*depth-depth,anchor=BOTTOM);
|
||||||
if (bevel2)
|
if (bevel2)
|
||||||
up(l/2)cyl(l=depth, r2=_r2+pmax, r1=_r2+pmax+slope*depth-depth,anchor=TOP);
|
up(l/2+.001)cyl(l=depth, r2=_r2+pmax, r1=_r2+pmax+slope*depth-depth,anchor=TOP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
children();
|
children();
|
||||||
|
@ -1111,7 +1116,7 @@ module generic_threaded_nut(
|
||||||
// subtract any $slop for clearance.
|
// subtract any $slop for clearance.
|
||||||
// .
|
// .
|
||||||
// Higbee specifies tapering applied to the ends of the threads and is given as the linear distance
|
// Higbee specifies tapering applied to the ends of the threads and is given as the linear distance
|
||||||
// over which to taper.
|
// over which to taper. Tapering works on both internal and external threads.
|
||||||
// Arguments:
|
// Arguments:
|
||||||
// d = Inside base diameter of threads. Default: 10
|
// d = Inside base diameter of threads. Default: 10
|
||||||
// pitch = Distance between threads. Default: 2mm/thread
|
// pitch = Distance between threads. Default: 2mm/thread
|
||||||
|
@ -1141,6 +1146,30 @@ module generic_threaded_nut(
|
||||||
// [ 6/16, 0 ],
|
// [ 6/16, 0 ],
|
||||||
// ];
|
// ];
|
||||||
// stroke(profile, width=0.02);
|
// stroke(profile, width=0.02);
|
||||||
|
// Figure(2D,Med):
|
||||||
|
// pa_delta = tan(15)/4;
|
||||||
|
// rr1 = -1/2;
|
||||||
|
// z1 = 1/4-pa_delta;
|
||||||
|
// z2 = 1/4+pa_delta;
|
||||||
|
// profile = [
|
||||||
|
// [-z2, rr1],
|
||||||
|
// [-z1, 0],
|
||||||
|
// [ z1, 0],
|
||||||
|
// [ z2, rr1],
|
||||||
|
// ];
|
||||||
|
// fullprofile = 50*left(1/2,p=concat(profile, right(1, p=profile)));
|
||||||
|
// stroke(fullprofile,width=1);
|
||||||
|
// dir = fullprofile[2]-fullprofile[3];
|
||||||
|
// dir2 = fullprofile[5]-fullprofile[4];
|
||||||
|
// curve = arc(15,angle=[75,87],r=40 /*67.5*/);
|
||||||
|
// avgpt = mean([fullprofile[5]+.1*dir2, fullprofile[5]+.4*dir2]);
|
||||||
|
// color("red"){
|
||||||
|
// stroke([fullprofile[4]+[0,1], fullprofile[4]+[0,37]], width=1);
|
||||||
|
// stroke([fullprofile[5]+.1*dir2, fullprofile[5]+.4*dir2], width=1);
|
||||||
|
// stroke(move(-curve[0]+avgpt,p=curve), width=0.71,endcaps="arrow2");
|
||||||
|
// right(14)back(19)text("flank",size=4,halign="center");
|
||||||
|
// right(14)back(14)text("angle",size=4,halign="center");
|
||||||
|
// }
|
||||||
// Example:
|
// Example:
|
||||||
// thread_helix(d=10, pitch=2, thread_depth=0.75, flank_angle=15, twist=900, $fn=72);
|
// thread_helix(d=10, pitch=2, thread_depth=0.75, flank_angle=15, twist=900, $fn=72);
|
||||||
// thread_helix(d=10, pitch=2, thread_depth=0.75, flank_angle=15, twist=900, higbee=1, $fn=72);
|
// thread_helix(d=10, pitch=2, thread_depth=0.75, flank_angle=15, twist=900, higbee=1, $fn=72);
|
||||||
|
|
Loading…
Reference in a new issue